From 1a028d178fd03968f3a04a65816ad38c6c3b2386 Mon Sep 17 00:00:00 2001 From: Henry Tsai <17891086+thehenrytsai@users.noreply.github.com> Date: Tue, 23 Mar 2021 13:05:52 -0700 Subject: [PATCH] fix(ref-imp): updated bitcoin listunspent RPC call to include unconfirmed transactions --- lib/bitcoin/BitcoinClient.ts | 7 ++++++- tests/bitcoin/BitcoinClient.spec.ts | 6 ++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/bitcoin/BitcoinClient.ts b/lib/bitcoin/BitcoinClient.ts index 34797ab83..7c5fa44f9 100644 --- a/lib/bitcoin/BitcoinClient.ts +++ b/lib/bitcoin/BitcoinClient.ts @@ -745,10 +745,15 @@ export default class BitcoinClient { const addressToSearch = address.toString(); Logger.info(`Getting unspent coins for ${addressToSearch}`); + + // We are setting minimum required confirmations when fetching unspent transactions to 0 + // so that transaction(s) waiting to be confirmed are included. This allows: + // 1. Accurate calculation of wallet balance (otherwise no transaction returned by the `listunspent` call yields balance of 0). + // 2. Both lock monitor and core to write a transaction using the UTXO in the unconfirmed transaction generated by each other. const request = { method: 'listunspent', params: [ - null, + 0, // Minimum required confirmation. null, [addressToSearch] ] diff --git a/tests/bitcoin/BitcoinClient.spec.ts b/tests/bitcoin/BitcoinClient.spec.ts index 0d2f085dc..333f11eb7 100644 --- a/tests/bitcoin/BitcoinClient.spec.ts +++ b/tests/bitcoin/BitcoinClient.spec.ts @@ -622,7 +622,8 @@ describe('BitcoinClient', async () => { it('should query for unspent output coins given an address', async (done) => { const coin = BitcoinDataGenerator.generateUnspentCoin(bitcoinWalletImportString, 1); - const coinSpy = mockRpcCall('listunspent', [null, null, [walletAddressFromBitcoinClient.toString()]], [ + const minimumConfirmations = 0; + const coinSpy = mockRpcCall('listunspent', [minimumConfirmations, null, [walletAddressFromBitcoinClient.toString()]], [ { txId: coin.txId, outputIndex: coin.outputIndex, @@ -638,7 +639,8 @@ describe('BitcoinClient', async () => { }); it('should return empty if no coins were found', async (done) => { - const coinSpy = mockRpcCall('listunspent', [null, null, [walletAddressFromBitcoinClient.toString()]], []); + const minimumConfirmations = 0; + const coinSpy = mockRpcCall('listunspent', [minimumConfirmations, null, [walletAddressFromBitcoinClient.toString()]], []); const actual = await bitcoinClient['getUnspentOutputs'](walletAddressFromBitcoinClient); expect(coinSpy).toHaveBeenCalled(); expect(actual).toEqual([]);