scpx-wallet
Version:
Scoop Core Wallet: dual-signature timelock crypto wallet - multi-asset, cross-platform and open-source
122 lines (112 loc) • 5.44 kB
JavaScript
// Distributed under AGPLv3 license: see /LICENSE for terms. Copyright 2019-2021 Dominic Morris.
const actionsWallet = require('.')
const utilsWallet = require('../utils')
module.exports = {
createTxHex_Account: async ({ asset, params, privateKey }) => {
//utilsWallet.debug(`*** createTxHex_Account ${asset.symbol}...`, params)
switch (asset.symbol) {
case 'ETH':
case 'ETH_TEST':
return await createTxHex_Eth(asset, params, privateKey)
default:
return await createTxHex_erc20(asset, params, privateKey)
}
},
estimateTxGas_Account: async ({ asset, params }) => {
//utilsWallet.debug(`*** estimateTxGas_Account ${asset.symbol}...`, params)
const op = new Promise((resolve, reject) => {
const appWorker = utilsWallet.getAppWorker()
const listener = function(event) {
const input = utilsWallet.unpackWorkerResponse(event)
if (input) {
if (input.msg === 'GET_ETH_ESTIMATE_TX_GAS_DONE') {
const assetSymbol = input.data.assetSymbol
if (assetSymbol === asset.symbol) {
utilsWallet.log(`GET_ETH_ESTIMATE_TX_GAS_DONE, input.data=`, input.data)
resolve(input.data.fees)
appWorker.removeEventListener('message', listener)
}
}
}
}
appWorker.addEventListener('message', listener)
appWorker.postMessageWrapped({ msg: 'GET_ETH_ESTIMATE_TX_GAS', data: { asset, params } })
})
return await op
},
pushRawTransaction_Account: (store, asset, payTo, txHex, callback) => {
const appWorker = utilsWallet.getAppWorker()
const listener = function(event) {
const input = utilsWallet.unpackWorkerResponse(event)
if (input) {
if (input.msg === 'PUSH_TX_WEB3_DONE') {
if (input.data.assetSymbol === asset.symbol) {
appWorker.removeEventListener('message', listener)
// notify caller
const res = input.data.res
const err = input.data.err
if (res && res.tx) {
callback({ tx: res.tx }, null)
}
else {
callback(null, err)
}
// push local eth fee tx for an erc20 push
if (res && res.erc20_ethFeeTx) {
store.dispatch({ type: actionsWallet.WCORE_PUSH_LOCAL_TX,
payload: {
symbol: asset.symbol === 'ETH_TEST' || asset.isErc20_Ropsten
? 'ETH_TEST' : 'ETH',
tx: res.erc20_ethFeeTx }
})
}
}
}
}
}
appWorker.addEventListener('message', listener)
appWorker.postMessageWrapped({ msg: 'PUSH_TX_WEB3', data: { payTo, asset, txHex } })
},
}
function createTxHex_Eth(asset, params, privateKey) {
return new Promise((resolve, reject) => {
const appWorker = utilsWallet.getAppWorker()
const listener = function(event) {
const input = utilsWallet.unpackWorkerResponse(event)
if (input) {
if (input.msg === 'GET_ETH_TX_HEX_WEB3_DONE') {
const assetSymbol = input.data.assetSymbol
const txHex = input.data.txHex
if (assetSymbol === asset.symbol) {
utilsWallet.log(`GET_ETH_TX_HEX_WEB3_DONE, input.data=`, input.data)
resolve(txHex)
appWorker.removeEventListener('message', listener)
}
}
}
}
appWorker.addEventListener('message', listener)
appWorker.postMessageWrapped({ msg: 'GET_ETH_TX_HEX_WEB3', data: { asset, params, privateKey } })
})
}
function createTxHex_erc20(asset, params, privateKey) {
return new Promise((resolve, reject) => {
const appWorker = utilsWallet.getAppWorker()
const listener = function(event) {
const input = utilsWallet.unpackWorkerResponse(event)
if (input) {
if (input.msg === 'GET_ERC20_TX_HEX_WEB3_DONE') {
const assetSymbol = input.data.assetSymbol
const txHex = input.data.txHex
if (assetSymbol === asset.symbol) {
utilsWallet.log(`GET_ERC20_TX_HEX_WEB3_DONE, input.data=`, input.data)
resolve(txHex)
appWorker.removeEventListener('message', listener)
}
}
}
}
appWorker.addEventListener('message', listener)
appWorker.postMessageWrapped({ msg: 'GET_ERC20_TX_HEX_WEB3', data: { asset, params, privateKey } })
})
}