From bd3fd3e218de33fdaa4469fd37d243799a18d03d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Oliveira?= Date: Tue, 3 Aug 2021 18:58:19 +0100 Subject: [PATCH] feat: lamassu eth recovery script --- bin/lamassu-eth-recovery.js | 54 +++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 bin/lamassu-eth-recovery.js diff --git a/bin/lamassu-eth-recovery.js b/bin/lamassu-eth-recovery.js new file mode 100644 index 00000000..4431db2a --- /dev/null +++ b/bin/lamassu-eth-recovery.js @@ -0,0 +1,54 @@ +const hdkey = require('ethereumjs-wallet/hdkey') +const hkdf = require('futoin-hkdf') +const db = require('../lib/db') +const mnemonicHelpers = require('../lib/mnemonic-helpers') + +const pify = require('pify') +const fs = pify(require('fs')) + +const options = require('../lib/options') + +const paymentPrefixPath = "m/44'/60'/0'/0'" +const defaultPrefixPath = "m/44'/60'/1'/0'" + +const address = process.argv[2] + +function run (address) { + Promise.all([fetchMnemonic(), searchForHdIndex(address)]) + .then(([mnemonic, hdIndex]) => { + if (!mnemonic || !hdIndex) { + console.log(`Error while retrieving private key!`) + return + } + console.log(`Private key: `, paymentHdNode(mnemonic).deriveChild(hdIndex).getWallet().getPrivateKeyString()) + }) +} + +function searchForHdIndex (address) { + const sql = `SELECT hd_index FROM cash_out_txs WHERE to_address = $1` + return db.oneOrNone(sql, [address]) +} + +function fetchMnemonic () { + return fs.readFile(options.mnemonicPath, 'utf8') + .then(mnemonic => computeSeed(mnemonic)) +} + +function computeSeed (seed) { + const masterSeed = mnemonicHelpers.toEntropyBuffer(seed) + return hkdf(masterSeed, 32, { salt: 'lamassu-server-salt', info: 'wallet-seed' }) +} + +function paymentHdNode (masterSeed) { + if (!masterSeed) throw new Error('No master seed!') + const key = hdkey.fromMasterSeed(masterSeed) + return key.derivePath(paymentPrefixPath) +} + +function defaultHdNode (masterSeed) { + if (!masterSeed) throw new Error('No master seed!') + const key = hdkey.fromMasterSeed(masterSeed) + return key.derivePath(defaultPrefixPath) +} + +run(address)