Changeset View
Changeset View
Standalone View
Standalone View
web/cashtab/src/hooks/useBCH.js
Show First 20 Lines • Show All 137 Lines • ▼ Show 20 Lines | ) => { | ||||
slpBalancesAndUtxos.nonSlpUtxos.length === 0 | slpBalancesAndUtxos.nonSlpUtxos.length === 0 | ||||
) { | ) { | ||||
throw new Error( | throw new Error( | ||||
`You need some ${currency.ticker} to send ${currency.tokenTicker}`, | `You need some ${currency.ticker} to send ${currency.tokenTicker}`, | ||||
); | ); | ||||
} | } | ||||
// instance of transaction builder | // instance of transaction builder | ||||
let txBuilder = new BCH.TransactionBuilder(); | let txBuilder = new TransactionBuilder(); | ||||
// for temporary comparison | |||||
let localTxBuilder = new TransactionBuilder(); | |||||
let tokenTxInputObj = generateTokenTxInput( | let tokenTxInputObj = generateTokenTxInput( | ||||
BCH, | BCH, | ||||
'SEND', | 'SEND', | ||||
xecUtxos, | xecUtxos, | ||||
tokenUtxos, | tokenUtxos, | ||||
tokenId, | tokenId, | ||||
amount, | amount, | ||||
currency.defaultFee, | currency.defaultFee, | ||||
txBuilder, | txBuilder, | ||||
); | ); | ||||
// update txBuilder object with inputs | // update txBuilder object with inputs | ||||
txBuilder = tokenTxInputObj.txBuilder; | txBuilder = tokenTxInputObj.txBuilder; | ||||
// for temporary comparison | |||||
let localTokenTxInputObj = generateTokenTxInput( | |||||
BCH, | |||||
'SEND', | |||||
xecUtxos, | |||||
tokenUtxos, | |||||
tokenId, | |||||
amount, | |||||
currency.defaultFee, | |||||
localTxBuilder, | |||||
); | |||||
localTxBuilder = localTokenTxInputObj.txBuilder; | |||||
if (JSON.stringify(txBuilder) === JSON.stringify(localTxBuilder)) { | |||||
console.log('post-generateTokenTxInput() output matches'); | |||||
} | |||||
let tokenTxOutputObj = generateTokenTxOutput( | let tokenTxOutputObj = generateTokenTxOutput( | ||||
BCH, | BCH, | ||||
txBuilder, | txBuilder, | ||||
'SEND', | 'SEND', | ||||
CREATION_ADDR, | CREATION_ADDR, | ||||
tokenTxInputObj.inputTokenUtxos, | tokenTxInputObj.inputTokenUtxos, | ||||
tokenTxInputObj.remainderXecValue, | tokenTxInputObj.remainderXecValue, | ||||
null, // token config object - for GENESIS tx only | null, // token config object - for GENESIS tx only | ||||
tokenReceiverAddress, | tokenReceiverAddress, | ||||
amount, | amount, | ||||
); | ); | ||||
// update txBuilder object with outputs | // update txBuilder object with outputs | ||||
txBuilder = tokenTxOutputObj; | txBuilder = tokenTxOutputObj; | ||||
// for temporary comparison | |||||
let localTokenTxOutputObj = generateTokenTxOutput( | |||||
BCH, | |||||
localTxBuilder, | |||||
'SEND', | |||||
CREATION_ADDR, | |||||
localTokenTxInputObj.inputTokenUtxos, | |||||
localTokenTxInputObj.remainderXecValue, | |||||
null, // token config object - for GENESIS tx only | |||||
tokenReceiverAddress, | |||||
amount, | |||||
); | |||||
localTxBuilder = localTokenTxOutputObj; | |||||
if (JSON.stringify(txBuilder) === JSON.stringify(localTxBuilder)) { | |||||
console.log('post-generateTokenTxOutput() output matches'); | |||||
} | |||||
// append the token input UTXOs to the array of XEC input UTXOs for signing | // append the token input UTXOs to the array of XEC input UTXOs for signing | ||||
const combinedInputUtxos = tokenTxInputObj.inputXecUtxos.concat( | const combinedInputUtxos = tokenTxInputObj.inputXecUtxos.concat( | ||||
tokenTxInputObj.inputTokenUtxos, | tokenTxInputObj.inputTokenUtxos, | ||||
); | ); | ||||
// sign the collated inputUtxos and build the raw tx hex | // sign the collated inputUtxos and build the raw tx hex | ||||
// returns the raw tx hex string | // returns the raw tx hex string | ||||
const rawTxHex = signAndBuildTx( | const rawTxHex = signAndBuildTx( | ||||
BCH, | BCH, | ||||
combinedInputUtxos, | combinedInputUtxos, | ||||
txBuilder, | txBuilder, | ||||
wallet, | wallet, | ||||
); | ); | ||||
// for temporary comparison | |||||
const localCombinedInputUtxos = | |||||
localTokenTxInputObj.inputXecUtxos.concat( | |||||
localTokenTxInputObj.inputTokenUtxos, | |||||
); | |||||
const localRawTxHex = signAndBuildTx( | |||||
BCH, | |||||
localCombinedInputUtxos, | |||||
localTxBuilder, | |||||
wallet, | |||||
); | |||||
if (JSON.stringify(rawTxHex) === JSON.stringify(localRawTxHex)) { | |||||
console.log('post-signAndBuildTx() output matches'); | |||||
} | |||||
// Broadcast transaction to the network via the chronik client | // Broadcast transaction to the network via the chronik client | ||||
// sample chronik.broadcastTx() response: | // sample chronik.broadcastTx() response: | ||||
// {"txid":"0075130c9ecb342b5162bb1a8a870e69c935ea0c9b2353a967cda404401acf19"} | // {"txid":"0075130c9ecb342b5162bb1a8a870e69c935ea0c9b2353a967cda404401acf19"} | ||||
let broadcastResponse; | let broadcastResponse; | ||||
try { | try { | ||||
broadcastResponse = await chronik.broadcastTx( | broadcastResponse = await chronik.broadcastTx( | ||||
rawTxHex, | rawTxHex, | ||||
true, // skipSlpCheck to bypass chronik safety mechanism in place to avoid accidental burns | true, // skipSlpCheck to bypass chronik safety mechanism in place to avoid accidental burns | ||||
▲ Show 20 Lines • Show All 360 Lines • Show Last 20 Lines |