diff --git a/web/cashtab/src/components/Send/Send.js b/web/cashtab/src/components/Send/Send.js --- a/web/cashtab/src/components/Send/Send.js +++ b/web/cashtab/src/components/Send/Send.js @@ -221,6 +221,7 @@ addresses: [filledAddress || cleanAddress], values: [bchValue], }, + currency.defaultFee, callbackTxId, ); diff --git a/web/cashtab/src/hooks/__mocks__/sendBCH.js b/web/cashtab/src/hooks/__mocks__/sendBCH.js --- a/web/cashtab/src/hooks/__mocks__/sendBCH.js +++ b/web/cashtab/src/hooks/__mocks__/sendBCH.js @@ -32,13 +32,4 @@ expectedHex: [ '02000000016fbde3a1a13bb90e1d939a214d6eb845396e6a07e2c4406c5ba8b554bfb4836e010000006b483045022100d52237ac2c000c0be195bb27d5488b378559cf4a7958c9a1b1ce7a6850773a2b02202e3c148450c6efdb11f199a9398332b313b54686ff98cf74b254f9ae144b0c7d4121032d9ea429b4782e9a2c18a383362c23a44efa2f6d6641d63f53788b4bf45c1decffffffff0222020000000000001976a914d530980e14ee1f2037eaf00164d9c7ccfbddcd3288ac62ff0100000000001976a914c5c649ec64e02a16a5bd7a6c8f1fa5aaa7e488eb88ac00000000', ], - expectedHexThreeSatPerByteFee: [ - '02000000016fbde3a1a13bb90e1d939a214d6eb845396e6a07e2c4406c5ba8b554bfb4836e010000006b483045022100ea9661be764a02a74c8f5511becd65436bc358cbfe84e9c9be25e359747cecc102204d757b9a1175eb958cc93dc83a29c2c1fc46f95afb58674b9d677776ab7c18d94121032d9ea429b4782e9a2c18a383362c23a44efa2f6d6641d63f53788b4bf45c1decffffffff0222020000000000001976a914d530980e14ee1f2037eaf00164d9c7ccfbddcd3288ac9efd0100000000001976a914c5c649ec64e02a16a5bd7a6c8f1fa5aaa7e488eb88ac00000000', - ], - expectedHexFiveSatPerByteFee: [ - '02000000016fbde3a1a13bb90e1d939a214d6eb845396e6a07e2c4406c5ba8b554bfb4836e010000006a473044022048f8a04db2fb6d83de621c5d77243e14f94be62b9f97d5fb391a1587f04cee2b02204a406baa3f08256591eca9bb24434946effaec33214298cf6a41638985f6515d4121032d9ea429b4782e9a2c18a383362c23a44efa2f6d6641d63f53788b4bf45c1decffffffff0222020000000000001976a914d530980e14ee1f2037eaf00164d9c7ccfbddcd3288acdafb0100000000001976a914c5c649ec64e02a16a5bd7a6c8f1fa5aaa7e488eb88ac00000000', - ], - expectedHexEightyThreeSatPerByteFee: [ - '02000000016fbde3a1a13bb90e1d939a214d6eb845396e6a07e2c4406c5ba8b554bfb4836e010000006b483045022100b71662c5187dfc0df8ee0e16bb06aedae38714dbe8855abd83c96228e49fe8ca0220032313e0481141eac90e382c6f780b8bb0c44e9ceaa977eb3adee933cbfb28034121032d9ea429b4782e9a2c18a383362c23a44efa2f6d6641d63f53788b4bf45c1decffffffff0222020000000000001976a914d530980e14ee1f2037eaf00164d9c7ccfbddcd3288acbdb60100000000001976a914c5c649ec64e02a16a5bd7a6c8f1fa5aaa7e488eb88ac00000000', - ], }; diff --git a/web/cashtab/src/hooks/__tests__/useBCH.test.js b/web/cashtab/src/hooks/__tests__/useBCH.test.js --- a/web/cashtab/src/hooks/__tests__/useBCH.test.js +++ b/web/cashtab/src/hooks/__tests__/useBCH.test.js @@ -42,16 +42,8 @@ const { calcFee } = useBCH(); const BCH = new BCHJS(); const utxosMock = [{}, {}]; - // For 1.01 sat/byte fee - let expectedTxFee = 378; - if (currency.defaultFee === 3.01) { - expectedTxFee = 1126; - } else if (currency.defaultFee === 5.01) { - expectedTxFee = 1874; - } else if ((currency.defaultFee = 83.3)) { - expectedTxFee = 31155; - } - expect(calcFee(BCH, utxosMock)).toBe(expectedTxFee); + + expect(calcFee(BCH, utxosMock, 2, 1.01)).toBe(378); }); it('gets SLP and BCH balances and utxos from hydrated utxo details', async () => { @@ -75,22 +67,15 @@ addresses, values, } = sendBCHMock; - let expectedHexByFee = expectedHex; - if (currency.defaultFee === 3.01) { - expectedHexByFee = sendBCHMock.expectedHexThreeSatPerByteFee; - } else if (currency.defaultFee === 5.01) { - expectedHexByFee = sendBCHMock.expectedHexFiveSatPerByteFee; - } else if (currency.defaultFee === 83.3) { - expectedHexByFee = sendBCHMock.expectedHexEightyThreeSatPerByteFee; - } + BCH.RawTransactions.sendRawTransaction = jest .fn() .mockResolvedValue(expectedTxId); - expect(await sendBch(BCH, wallet, utxos, { addresses, values })).toBe( - `${currency.blockExplorerUrl}/tx/${expectedTxId}`, - ); + expect( + await sendBch(BCH, wallet, utxos, { addresses, values }, 1.01), + ).toBe(`${currency.blockExplorerUrl}/tx/${expectedTxId}`); expect(BCH.RawTransactions.sendRawTransaction).toHaveBeenCalledWith( - expectedHexByFee, + expectedHex, ); }); @@ -106,22 +91,22 @@ addresses, values, } = sendBCHMock; - let expectedHexByFee = expectedHex; - if (currency.defaultFee === 3.01) { - expectedHexByFee = sendBCHMock.expectedHexThreeSatPerByteFee; - } else if (currency.defaultFee === 5.01) { - expectedHexByFee = sendBCHMock.expectedHexFiveSatPerByteFee; - } else if (currency.defaultFee === 83.3) { - expectedHexByFee = sendBCHMock.expectedHexEightyThreeSatPerByteFee; - } + BCH.RawTransactions.sendRawTransaction = jest .fn() .mockResolvedValue(expectedTxId); expect( - await sendBch(BCH, wallet, utxos, { addresses, values }, callback), + await sendBch( + BCH, + wallet, + utxos, + { addresses, values }, + 1.01, + callback, + ), ).toBe(`${currency.blockExplorerUrl}/tx/${expectedTxId}`); expect(BCH.RawTransactions.sendRawTransaction).toHaveBeenCalledWith( - expectedHexByFee, + expectedHex, ); expect(callback).toHaveBeenCalledWith(expectedTxId); }); @@ -139,15 +124,27 @@ BCH.RawTransactions.sendRawTransaction = jest .fn() .mockResolvedValue(expectedTxId); - const failedSendBch = sendBch(BCH, wallet, utxos, { - addresses, - values: [1], - }); + const failedSendBch = sendBch( + BCH, + wallet, + utxos, + { + addresses, + values: [1], + }, + 1.01, + ); expect(failedSendBch).rejects.toThrow(new Error('Insufficient funds')); - const nullValuesSendBch = await sendBch(BCH, wallet, utxos, { - addresses, - values: null, - }); + const nullValuesSendBch = await sendBch( + BCH, + wallet, + utxos, + { + addresses, + values: null, + }, + 1.01, + ); expect(nullValuesSendBch).toBe(null); }); @@ -158,19 +155,31 @@ BCH.RawTransactions.sendRawTransaction = jest .fn() .mockResolvedValue(expectedTxId); - const failedSendBch = sendBch(BCH, wallet, utxos, { - addresses, - values: [ - new BigNumber(currency.dust) - .minus(new BigNumber('0.00000001')) - .toString(), - ], - }); + const failedSendBch = sendBch( + BCH, + wallet, + utxos, + { + addresses, + values: [ + new BigNumber(currency.dust) + .minus(new BigNumber('0.00000001')) + .toString(), + ], + }, + 1.01, + ); expect(failedSendBch).rejects.toThrow(new Error('dust')); - const nullValuesSendBch = await sendBch(BCH, wallet, utxos, { - addresses, - values: null, - }); + const nullValuesSendBch = await sendBch( + BCH, + wallet, + utxos, + { + addresses, + values: null, + }, + 1.01, + ); expect(nullValuesSendBch).toBe(null); }); @@ -183,10 +192,16 @@ .mockImplementation(async () => { throw new Error('insufficient priority (code 66)'); }); - const insufficientPriority = sendBch(BCH, wallet, utxos, { - addresses, - values, - }); + const insufficientPriority = sendBch( + BCH, + wallet, + utxos, + { + addresses, + values, + }, + 1.01, + ); await expect(insufficientPriority).rejects.toThrow( new Error('insufficient priority (code 66)'), ); @@ -196,10 +211,16 @@ .mockImplementation(async () => { throw new Error('txn-mempool-conflict (code 18)'); }); - const txnMempoolConflict = sendBch(BCH, wallet, utxos, { - addresses, - values, - }); + const txnMempoolConflict = sendBch( + BCH, + wallet, + utxos, + { + addresses, + values, + }, + 1.01, + ); await expect(txnMempoolConflict).rejects.toThrow( new Error('txn-mempool-conflict (code 18)'), ); @@ -209,7 +230,13 @@ .mockImplementation(async () => { throw new Error('Network Error'); }); - const networkError = sendBch(BCH, wallet, utxos, { addresses, values }); + const networkError = sendBch( + BCH, + wallet, + utxos, + { addresses, values }, + 1.01, + ); await expect(networkError).rejects.toThrow(new Error('Network Error')); BCH.RawTransactions.sendRawTransaction = jest @@ -221,10 +248,16 @@ throw err; }); - const tooManyAncestorsMempool = sendBch(BCH, wallet, utxos, { - addresses, - values, - }); + const tooManyAncestorsMempool = sendBch( + BCH, + wallet, + utxos, + { + addresses, + values, + }, + 1.01, + ); await expect(tooManyAncestorsMempool).rejects.toThrow( new Error( 'too-long-mempool-chain, too many unconfirmed ancestors [limit: 25] (code 64)', diff --git a/web/cashtab/src/hooks/useBCH.js b/web/cashtab/src/hooks/useBCH.js --- a/web/cashtab/src/hooks/useBCH.js +++ b/web/cashtab/src/hooks/useBCH.js @@ -412,6 +412,7 @@ wallet, utxos, { addresses, values, encodedOpReturn }, + feeInSatsPerByte, callbackTxId, ) => { // Note: callbackTxId is a callback function that accepts a txid as its only parameter @@ -453,8 +454,18 @@ inputUtxos.push(utxo); txFee = encodedOpReturn - ? calcFee(BCH, inputUtxos, addresses.length + 2) - : calcFee(BCH, inputUtxos, addresses.length + 1); + ? calcFee( + BCH, + inputUtxos, + addresses.length + 2, + feeInSatsPerByte, + ) + : calcFee( + BCH, + inputUtxos, + addresses.length + 1, + feeInSatsPerByte, + ); if (originalAmount.minus(satoshisToSend).minus(txFee).gte(0)) { break;