@ledgerhq/coin-tester-bitcoin 1.1.0-nightly.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/.env.example +7 -0
  2. package/.eslintrc.js +23 -0
  3. package/.turbo/turbo-build.log +4 -0
  4. package/.unimportedrc.json +8 -0
  5. package/CHANGELOG.md +18 -0
  6. package/LICENSE.txt +21 -0
  7. package/README.md +30 -0
  8. package/jest.config.ts +19 -0
  9. package/lib/src/assert.d.ts +6 -0
  10. package/lib/src/assert.d.ts.map +1 -0
  11. package/lib/src/assert.js +29 -0
  12. package/lib/src/assert.js.map +1 -0
  13. package/lib/src/atlas.d.ts +3 -0
  14. package/lib/src/atlas.d.ts.map +1 -0
  15. package/lib/src/atlas.js +84 -0
  16. package/lib/src/atlas.js.map +1 -0
  17. package/lib/src/constants.d.ts +5 -0
  18. package/lib/src/constants.d.ts.map +1 -0
  19. package/lib/src/constants.js +5 -0
  20. package/lib/src/constants.js.map +1 -0
  21. package/lib/src/fixtures.d.ts +5 -0
  22. package/lib/src/fixtures.d.ts.map +1 -0
  23. package/lib/src/fixtures.js +61 -0
  24. package/lib/src/fixtures.js.map +1 -0
  25. package/lib/src/helpers.d.ts +11 -0
  26. package/lib/src/helpers.d.ts.map +1 -0
  27. package/lib/src/helpers.js +339 -0
  28. package/lib/src/helpers.js.map +1 -0
  29. package/lib/src/scenarii/bitcoin.d.ts +4 -0
  30. package/lib/src/scenarii/bitcoin.d.ts.map +1 -0
  31. package/lib/src/scenarii/bitcoin.js +258 -0
  32. package/lib/src/scenarii/bitcoin.js.map +1 -0
  33. package/lib/src/utils.d.ts +5 -0
  34. package/lib/src/utils.d.ts.map +1 -0
  35. package/lib/src/utils.js +48 -0
  36. package/lib/src/utils.js.map +1 -0
  37. package/lib/tsconfig.tsbuildinfo +1 -0
  38. package/lib-es/src/assert.d.ts +6 -0
  39. package/lib-es/src/assert.d.ts.map +1 -0
  40. package/lib-es/src/assert.js +23 -0
  41. package/lib-es/src/assert.js.map +1 -0
  42. package/lib-es/src/atlas.d.ts +3 -0
  43. package/lib-es/src/atlas.d.ts.map +1 -0
  44. package/lib-es/src/atlas.js +43 -0
  45. package/lib-es/src/atlas.js.map +1 -0
  46. package/lib-es/src/constants.d.ts +5 -0
  47. package/lib-es/src/constants.d.ts.map +1 -0
  48. package/lib-es/src/constants.js +2 -0
  49. package/lib-es/src/constants.js.map +1 -0
  50. package/lib-es/src/fixtures.d.ts +5 -0
  51. package/lib-es/src/fixtures.d.ts.map +1 -0
  52. package/lib-es/src/fixtures.js +54 -0
  53. package/lib-es/src/fixtures.js.map +1 -0
  54. package/lib-es/src/helpers.d.ts +11 -0
  55. package/lib-es/src/helpers.d.ts.map +1 -0
  56. package/lib-es/src/helpers.js +323 -0
  57. package/lib-es/src/helpers.js.map +1 -0
  58. package/lib-es/src/scenarii/bitcoin.d.ts +4 -0
  59. package/lib-es/src/scenarii/bitcoin.d.ts.map +1 -0
  60. package/lib-es/src/scenarii/bitcoin.js +252 -0
  61. package/lib-es/src/scenarii/bitcoin.js.map +1 -0
  62. package/lib-es/src/utils.d.ts +5 -0
  63. package/lib-es/src/utils.d.ts.map +1 -0
  64. package/lib-es/src/utils.js +40 -0
  65. package/lib-es/src/utils.js.map +1 -0
  66. package/lib-es/tsconfig.tsbuildinfo +1 -0
  67. package/package.json +83 -0
  68. package/src/assert.ts +34 -0
  69. package/src/atlas.ts +52 -0
  70. package/src/constants.ts +1 -0
  71. package/src/docker/atlas/bitcoin.conf +56 -0
  72. package/src/docker/atlas/pending.conf +36 -0
  73. package/src/docker/docker-compose.yml +76 -0
  74. package/src/docker/nginx/default.conf +31 -0
  75. package/src/docker/postgres/create-db.sh +9 -0
  76. package/src/fixtures.ts +66 -0
  77. package/src/helpers.ts +372 -0
  78. package/src/scenarii/bitcoin.ts +306 -0
  79. package/src/scenarii.test.ts +27 -0
  80. package/src/utils.ts +52 -0
  81. package/tsconfig.json +14 -0
@@ -0,0 +1,323 @@
1
+ import Client from "bitcoin-core";
2
+ // fetched from bitcoin.conf
3
+ const client = new Client({
4
+ version: "0.24.1",
5
+ username: "user",
6
+ password: "pass",
7
+ host: "http://localhost:18443",
8
+ });
9
+ export async function loadWallet(name) {
10
+ try {
11
+ // Try creating and loading the wallet
12
+ const res = await client.command("createwallet", name);
13
+ console.log(`✅ Wallet "${name}" created and loaded:`, res);
14
+ // Optionally verify that the wallet is accessible
15
+ await client.getBalance({ minconf: 0 });
16
+ return;
17
+ }
18
+ catch (error) {
19
+ const message = error?.message || "Unknown error";
20
+ // Wallet already exists → try loading it
21
+ if (message.includes("already exists")) {
22
+ console.log(`ℹ️ Wallet "${name}" already exists. Attempting to load...`);
23
+ return loadExistingWallet(name);
24
+ }
25
+ console.error(`❌ Failed to create wallet "${name}":`, message);
26
+ }
27
+ }
28
+ /**
29
+ * Attempt to load an existing wallet, handling "already loaded" gracefully.
30
+ */
31
+ async function loadExistingWallet(name) {
32
+ try {
33
+ await client.command("loadwallet", name);
34
+ console.log(`✅ Wallet "${name}" loaded successfully.`);
35
+ }
36
+ catch (error) {
37
+ const message = error?.message || "Unknown error";
38
+ if (message.includes("already loaded")) {
39
+ console.log(`ℹ️ Wallet "${name}" is already loaded.`);
40
+ }
41
+ else {
42
+ console.error(`❌ Failed to load existing wallet "${name}":`, message);
43
+ }
44
+ }
45
+ }
46
+ export async function mineToWalletAddress(param) {
47
+ const address = await client.getNewAddress();
48
+ const nbBlocks = parseInt(param);
49
+ await client.generateToAddress({
50
+ nblocks: nbBlocks,
51
+ address,
52
+ });
53
+ console.log(`Mined ${nbBlocks} blocks to: ${address}`);
54
+ }
55
+ const FEES = 0.0001;
56
+ export const mineBlock = async (address) => {
57
+ await client.generateToAddress({
58
+ nblocks: 1,
59
+ address,
60
+ });
61
+ };
62
+ export const getCurrentBlock = async () => {
63
+ return await client.command("getblockcount");
64
+ };
65
+ /*
66
+ * Note that it sets the input sequence to 4294967293, <=0xFFFFFFFD — Replace By Fee (RBF).
67
+ */
68
+ export const sendTo = async (recipientAddress, amount) => {
69
+ await client.getBalance({ minconf: 0 });
70
+ if (!recipientAddress || amount <= 0) {
71
+ console.error("Invalid parameters: Provide a valid recipient address and positive amount.");
72
+ return;
73
+ }
74
+ console.log(`Sending ${amount} BTC to ${recipientAddress}...`);
75
+ try {
76
+ // Step 1: Send the specified amount to the recipient address
77
+ const txSendToAddress = await client
78
+ .sendToAddress({
79
+ address: recipientAddress,
80
+ amount: amount,
81
+ })
82
+ .then((txid) => txid);
83
+ // Step 2: Fetch transaction details
84
+ await client.getTransaction({
85
+ txid: txSendToAddress,
86
+ verbose: true,
87
+ });
88
+ // Step 4: Fetch updated transaction details after confirmation
89
+ await client.getTransaction({
90
+ txid: txSendToAddress,
91
+ verbose: true,
92
+ });
93
+ }
94
+ catch (error) {
95
+ console.error("Error in sendToAddress:", error.message);
96
+ }
97
+ };
98
+ export const sendToMany = async (recipientAddress, amount, times) => {
99
+ // calls sendTo times times
100
+ for (let i = 0; i < times; i++) {
101
+ await sendTo(recipientAddress, amount);
102
+ }
103
+ };
104
+ export const sendAutomatedRaw = async (destinationAddress, amount) => {
105
+ if (!destinationAddress || amount <= 0) {
106
+ console.error("Invalid parameters: Provide a valid address and positive amount.");
107
+ return;
108
+ }
109
+ try {
110
+ // Step 1: Create an unfinished raw transaction (no inputs, outputs only)
111
+ const unfinishedTx = await client.createRawTransaction({
112
+ inputs: [],
113
+ outputs: {
114
+ [destinationAddress]: amount,
115
+ },
116
+ });
117
+ // Step 2: Fund the transaction (Bitcoin Core automatically selects UTXOs)
118
+ const fundedTx = await client.fundRawTransaction({
119
+ hexstring: unfinishedTx,
120
+ options: { replaceable: true }, // Set to true if RBF is needed
121
+ // if replaceable: false, sequence of vin set to 4294967294 (0xFFFFFFFE) // Locktime BUT non-rbf
122
+ // else, sets to: 4294967293 // Locktime & RBF
123
+ });
124
+ // Step 3: Decode the transaction for debugging
125
+ await client.decodeRawTransaction({
126
+ hexstring: fundedTx.hex,
127
+ });
128
+ // Step 4: Sign the transaction
129
+ const signedTxHex = await client.signRawTransactionWithWallet({
130
+ hexstring: fundedTx.hex,
131
+ });
132
+ // Step 5: Broadcast the transaction to the network
133
+ const transactionId = await client.sendRawTransaction({
134
+ hexstring: signedTxHex.hex,
135
+ });
136
+ console.log(`Transaction Broadcasted! TXID: ${transactionId}`);
137
+ }
138
+ catch (error) {
139
+ console.error("Error sending transaction:", error.message);
140
+ }
141
+ };
142
+ /*
143
+ * https://learnmeabitcoin.com/technical/transaction/input/sequence/
144
+ * NOTE: You only need to set one of the sequence fields to enable locktime or RBF
145
+ * (even if you have multiple inputs and sequence fields in one transaction)
146
+ * However, relative locktime settings are specific to each input.
147
+ *
148
+ * If set to 0xFFFFFFFE (4294967294) → Locktime / Non-RBF
149
+ * If set to a number ≤ 0x0000FFFF (65535) → Blocks-based timelock.
150
+ * Sequence Effect
151
+ * 0xFFFFFFFE (4294967294) Default (Non-RBF): Cannot be replaced
152
+ * 0xFFFFFFFD (4294967293) Opt-in RBF: Can be replaced by a higher fee transaction
153
+ *
154
+ *
155
+ * Called like this as you've got more control over all the inputs
156
+ */
157
+ export const sendRaw = async (recipientAddress, amount, sequence = 4294967294) => {
158
+ if (!recipientAddress || amount <= 0) {
159
+ console.error("Invalid parameters: Provide a valid address and positive amount.");
160
+ return;
161
+ }
162
+ console.log(`Creating raw transaction: Sending ${amount} BTC to ${recipientAddress} with sequence=${sequence}...`);
163
+ try {
164
+ // Step 2: Get new addresses
165
+ const newAddress = await client.getNewAddress({ address_type: "legacy" });
166
+ const changeAddress = await client.getRawChangeAddress({
167
+ address_type: "legacy",
168
+ });
169
+ // Step 3: Get UTXO for spending
170
+ const unspents = await client.listUnspent({});
171
+ let id = 0;
172
+ let unspent = unspents[id];
173
+ while (unspent.amount < amount) {
174
+ console.warn("Insufficient funds. Picking another UTXO.");
175
+ id++;
176
+ unspent = unspents[id];
177
+ }
178
+ // Step 4: Calculate change
179
+ const changeAmountStr = Number(unspent.amount - amount - FEES).toFixed(6);
180
+ const changeAmount = Number(changeAmountStr);
181
+ if (changeAmount < 0) {
182
+ console.warn("Insufficient funds after fees.");
183
+ return;
184
+ }
185
+ // Step 5: Create raw transaction
186
+ const rawTxHex = await client.createRawTransaction({
187
+ inputs: [
188
+ {
189
+ txid: unspent.txid,
190
+ vout: unspent.vout,
191
+ sequence: sequence,
192
+ },
193
+ ],
194
+ outputs: {
195
+ [recipientAddress]: amount,
196
+ [changeAddress]: changeAmount,
197
+ },
198
+ });
199
+ await client.decodeRawTransaction({
200
+ hexstring: rawTxHex,
201
+ });
202
+ // Step 6: Sign the transaction
203
+ const signedTxHex = await client.signRawTransactionWithWallet({
204
+ hexstring: rawTxHex,
205
+ });
206
+ // Step 7: Broadcast the transaction
207
+ const txId = await client.sendRawTransaction({
208
+ hexstring: signedTxHex.hex,
209
+ });
210
+ // Step 8: Fetch transaction details
211
+ await client.getTransaction({ txid: txId, verbose: true });
212
+ // Step 9: Mine a block to confirm the transaction
213
+ await mineBlock(newAddress);
214
+ }
215
+ catch (error) {
216
+ console.error("Error in sendRaw:", error.message);
217
+ console.error({ error });
218
+ }
219
+ };
220
+ export const sendToReplaceCurrentTx = async (recipientAddress, amount) => {
221
+ if (!recipientAddress || amount <= 0) {
222
+ console.error("Invalid parameters: Provide a valid address and positive amount.");
223
+ return;
224
+ }
225
+ console.log(`Sending replaceable transaction to ${recipientAddress} with amount ${amount} BTC...`);
226
+ try {
227
+ // Step 1: Get an unspent UTXO
228
+ const unspent = await client.listUnspent({
229
+ query_options: { minimumSumAmount: amount },
230
+ });
231
+ if (!unspent.length) {
232
+ console.error("No suitable UTXOs available.");
233
+ return;
234
+ }
235
+ const utxo = unspent[0];
236
+ // Step 2: Create the replaceable transaction (RBF enabled)
237
+ const rawTx1 = await client.createRawTransaction({
238
+ inputs: [
239
+ {
240
+ txid: utxo.txid,
241
+ vout: utxo.vout,
242
+ sequence: 4294967293, // RBF enabled
243
+ },
244
+ ],
245
+ outputs: {
246
+ [recipientAddress]: amount,
247
+ },
248
+ });
249
+ // Step 3: Fund & Sign the transaction
250
+ const fundedTx1 = await client.fundRawTransaction({
251
+ hexstring: rawTx1,
252
+ options: { feeRate: 0.0004 }, // Increase fee rate
253
+ });
254
+ const signedTx1 = await client.signRawTransactionWithWallet({
255
+ hexstring: fundedTx1.hex,
256
+ });
257
+ // Step 4: Broadcast the transaction
258
+ const txId1 = await client.sendRawTransaction({ hexstring: signedTx1.hex });
259
+ console.log(`Transaction sent (TXID: ${txId1}), waiting before replacing...`);
260
+ console.log(`If you need to, make a tx that sends funds to ${recipientAddress}`);
261
+ }
262
+ catch (error) {
263
+ console.error("Error in sendReplaceableTransaction:", error.message);
264
+ }
265
+ };
266
+ export const sendReplaceableTransaction = async (recipientAddress, amount) => {
267
+ if (!recipientAddress || amount <= 0) {
268
+ console.error("Invalid parameters: Provide a valid address and positive amount.");
269
+ return;
270
+ }
271
+ console.log(`Sending replaceable transaction to ${recipientAddress} with amount ${amount} BTC...`);
272
+ try {
273
+ // Step 1: Get an unspent UTXO
274
+ const unspent = await client.listUnspent({
275
+ query_options: { minimumSumAmount: amount },
276
+ });
277
+ if (!unspent.length) {
278
+ console.error("No suitable UTXOs available.");
279
+ return;
280
+ }
281
+ const utxo = unspent[0];
282
+ // Step 2: Create the first replaceable transaction (RBF enabled)
283
+ const rawTx1 = await client.createRawTransaction({
284
+ inputs: [
285
+ {
286
+ txid: utxo.txid,
287
+ vout: utxo.vout,
288
+ sequence: 4294967293, // RBF enabled
289
+ },
290
+ ],
291
+ outputs: {
292
+ [recipientAddress]: amount,
293
+ },
294
+ });
295
+ // Step 3: Fund & Sign the first transaction
296
+ const fundedTx1 = await client.fundRawTransaction({
297
+ hexstring: rawTx1,
298
+ options: { feeRate: 0.0002 }, // Increase fee rate
299
+ });
300
+ const signedTx1 = await client.signRawTransactionWithWallet({
301
+ hexstring: fundedTx1.hex,
302
+ });
303
+ // Step 4: Broadcast the first transaction
304
+ const txId1 = await client.sendRawTransaction({ hexstring: signedTx1.hex });
305
+ console.log(`First transaction sent (TXID: ${txId1}), waiting before replacing...`);
306
+ }
307
+ catch (error) {
308
+ console.error("Error in sendReplaceableTransaction:", error.message);
309
+ }
310
+ };
311
+ /*Available commands:
312
+ mineBlock <address> - Mine a block to the address
313
+ sendTo <address> <amount> - Send a transaction to an address
314
+ sendToMany <address> <amount> <times> - Send a transaction to an address
315
+ replaceTx <address> <amount> - Send a transaction and replace it using RBF
316
+ sendAutomatedRaw <address> <amount> - Send a raw transaction, automatically funded
317
+ sendRaw <address> <amount> [sequence] - Send a raw transaction with a custom sequence
318
+ sendRawTwoOutputs <address1> <address2> <amount> [sequence] - Send a raw transaction with a custom sequence to 2 addresses
319
+ # doubleSpend <address> - Attempt a double-spend attack
320
+ # dustTransaction <address> - Create a dust transaction
321
+ # multisig <address> - Test a multisig transaction`;
322
+ */
323
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Scenario } from "@ledgerhq/coin-tester/main";
2
+ import { BitcoinAccount, Transaction as BtcTransaction } from "@ledgerhq/coin-bitcoin/types";
3
+ export declare const scenarioBitcoin: Scenario<BtcTransaction, BitcoinAccount>;
4
+ //# sourceMappingURL=bitcoin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitcoin.d.ts","sourceRoot":"","sources":["../../../src/scenarii/bitcoin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAuB,MAAM,4BAA4B,CAAC;AAG3E,OAAO,EAAE,cAAc,EAAE,WAAW,IAAI,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAoN7F,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,cAAc,EAAE,cAAc,CA0FpE,CAAC"}
@@ -0,0 +1,252 @@
1
+ import { killSpeculos, spawnSpeculos } from "@ledgerhq/coin-tester/signers/speculos";
2
+ import Btc from "@ledgerhq/hw-app-btc";
3
+ import { createBridges } from "@ledgerhq/coin-bitcoin/bridge/js";
4
+ import { getCryptoCurrencyById } from "@ledgerhq/cryptoassets/currencies";
5
+ import resolver from "@ledgerhq/coin-bitcoin/hw-getAddress";
6
+ import { LiveConfig } from "@ledgerhq/live-config/LiveConfig";
7
+ import { setCoinConfig } from "@ledgerhq/coin-bitcoin/config";
8
+ import { BigNumber } from "bignumber.js";
9
+ import { defaultNanoApp } from "../constants";
10
+ import { loadWallet, mineToWalletAddress, sendTo } from "../helpers";
11
+ import { makeAccount } from "../fixtures";
12
+ import { killAtlas, spawnAtlas } from "../atlas";
13
+ import { findNewUtxo, waitForExplorerSync } from "../utils";
14
+ import { assertCommonTxProperties, assertUtxoExcluded, assertUtxoSpent, getNewChangeUtxos, } from "../assert";
15
+ let firstUtxoHash = "";
16
+ let firstUtxoOutputIndex = 0;
17
+ let secondUtxoHash = "";
18
+ let secondUtxoOutputIndex = 0;
19
+ const makeScenarioTransactions = () => {
20
+ const scenarioExcludeTwoUtxos = {
21
+ name: "Send BTC excluding two UTXOs",
22
+ rbf: true,
23
+ utxoStrategy: {
24
+ strategy: 1, // Optimize size, for exemple
25
+ excludeUTXOs: [
26
+ { hash: firstUtxoHash, outputIndex: firstUtxoOutputIndex },
27
+ { hash: secondUtxoHash, outputIndex: secondUtxoOutputIndex },
28
+ ],
29
+ },
30
+ amount: new BigNumber(1e8),
31
+ recipient: "bcrt1qajglhjtctn88f5l6rajzz52fy78fhxspjajjwz",
32
+ expect: (previousAccount, currentAccount) => {
33
+ assertCommonTxProperties(previousAccount, currentAccount);
34
+ assertUtxoExcluded(currentAccount, firstUtxoHash, firstUtxoOutputIndex);
35
+ assertUtxoExcluded(currentAccount, secondUtxoHash, secondUtxoOutputIndex);
36
+ const newChangeUtxo = findNewUtxo(previousAccount, currentAccount);
37
+ expect(newChangeUtxo).toBeDefined();
38
+ },
39
+ };
40
+ const scenarioExcludeOneUtxo = {
41
+ name: "Send BTC excluding second UTXO",
42
+ rbf: true,
43
+ utxoStrategy: {
44
+ strategy: 1,
45
+ excludeUTXOs: [{ hash: secondUtxoHash, outputIndex: secondUtxoOutputIndex }],
46
+ },
47
+ useAllAmount: true,
48
+ recipient: "bcrt1qajglhjtctn88f5l6rajzz52fy78fhxspjajjwz",
49
+ expect: (previousAccount, currentAccount) => {
50
+ const latestOperation = assertCommonTxProperties(previousAccount, currentAccount);
51
+ // Excluded UTXO must still be there
52
+ assertUtxoExcluded(currentAccount, secondUtxoHash, secondUtxoOutputIndex);
53
+ // First UTXO must be spent
54
+ assertUtxoSpent(previousAccount, currentAccount, firstUtxoHash, firstUtxoOutputIndex);
55
+ // No change expected when using all amount
56
+ const changeUtxos = getNewChangeUtxos(previousAccount, currentAccount);
57
+ expect(changeUtxos.length).toBe(0);
58
+ const spentUtxos = previousAccount.bitcoinResources.utxos.filter(utxo => !(utxo.hash === secondUtxoHash && utxo.outputIndex === secondUtxoOutputIndex));
59
+ const totalSpent = spentUtxos.reduce((sum, utxo) => sum.plus(utxo.value), new BigNumber(0));
60
+ const totalChange = changeUtxos.reduce((sum, utxo) => sum.plus(utxo.value), new BigNumber(0));
61
+ const expectedChange = totalSpent.minus(latestOperation.value);
62
+ expect(totalChange.toFixed()).toBe(expectedChange.toFixed());
63
+ },
64
+ };
65
+ const scenarioSendBtcTransaction = {
66
+ name: "Send 1 BTC",
67
+ rbf: false,
68
+ amount: new BigNumber(1e8),
69
+ recipient: "bcrt1qajglhjtctn88f5l6rajzz52fy78fhxspjajjwz",
70
+ expect: (previousAccount, currentAccount) => {
71
+ const [latestOperation] = currentAccount.operations;
72
+ expect(currentAccount.operations.length - previousAccount.operations.length).toBe(1);
73
+ expect(latestOperation.type).toBe("OUT");
74
+ expect(latestOperation.value.toFixed()).toBe(latestOperation.fee.plus(1e8).toFixed());
75
+ expect(currentAccount.balance.toFixed()).toBe(previousAccount.balance.minus(latestOperation.value).toFixed());
76
+ },
77
+ };
78
+ const scenarioSendFastFeesStrategyBtcTransaction = {
79
+ name: "Send Fast Fees Strategy BTC",
80
+ rbf: false,
81
+ feesStrategy: "fast",
82
+ amount: new BigNumber(1e6),
83
+ recipient: "bcrt1qajglhjtctn88f5l6rajzz52fy78fhxspjajjwz",
84
+ expect: (previousAccount, currentAccount) => {
85
+ const [latestOperation] = currentAccount.operations;
86
+ expect(currentAccount.operations.length - previousAccount.operations.length).toBe(1);
87
+ expect(latestOperation.type).toBe("OUT");
88
+ expect(currentAccount.balance.toFixed()).toBe(previousAccount.balance.minus(latestOperation.value).toFixed());
89
+ },
90
+ };
91
+ const scenarioSendSlowFeesStrategyBtcTransaction = {
92
+ name: "Send Slow Fees Strategy BTC",
93
+ rbf: false,
94
+ feesStrategy: "slow",
95
+ amount: new BigNumber(1e6),
96
+ recipient: "bcrt1qajglhjtctn88f5l6rajzz52fy78fhxspjajjwz",
97
+ expect: (previousAccount, currentAccount) => {
98
+ const [latestOperation] = currentAccount.operations;
99
+ expect(currentAccount.operations.length - previousAccount.operations.length).toBe(1);
100
+ expect(latestOperation.type).toBe("OUT");
101
+ expect(currentAccount.balance.toFixed()).toBe(previousAccount.balance.minus(latestOperation.value).toFixed());
102
+ },
103
+ };
104
+ const scenarioSendFIFOBtcTransaction = {
105
+ name: "Send FIFO BTC",
106
+ rbf: true,
107
+ utxoStrategy: { strategy: 0, excludeUTXOs: [] },
108
+ amount: new BigNumber(1e6),
109
+ recipient: "bcrt1qajglhjtctn88f5l6rajzz52fy78fhxspjajjwz",
110
+ expect: (previousAccount, currentAccount) => {
111
+ const [latestOperation] = currentAccount.operations;
112
+ expect(currentAccount.operations.length - previousAccount.operations.length).toBe(1);
113
+ expect(latestOperation.type).toBe("OUT");
114
+ expect(currentAccount.balance.toFixed()).toBe(previousAccount.balance.minus(latestOperation.value).toFixed());
115
+ },
116
+ };
117
+ const scenarioSendOptimizeSizeBtcTransaction = {
118
+ name: "Send Optimize Size BTC",
119
+ rbf: true,
120
+ utxoStrategy: {
121
+ strategy: 1,
122
+ excludeUTXOs: [],
123
+ },
124
+ amount: new BigNumber(1e6),
125
+ recipient: "bcrt1qajglhjtctn88f5l6rajzz52fy78fhxspjajjwz",
126
+ expect: (previousAccount, currentAccount) => {
127
+ const [latestOperation] = currentAccount.operations;
128
+ expect(currentAccount.operations.length - previousAccount.operations.length).toBe(1);
129
+ expect(latestOperation.type).toBe("OUT");
130
+ expect(currentAccount.balance.toFixed()).toBe(previousAccount.balance.minus(latestOperation.value).toFixed());
131
+ },
132
+ };
133
+ const scenarioSendMergeCoinsBtcTransaction = {
134
+ name: "Send Merge Coins BTC",
135
+ rbf: true,
136
+ utxoStrategy: { strategy: 2, excludeUTXOs: [] },
137
+ amount: new BigNumber(1e6),
138
+ recipient: "bcrt1qajglhjtctn88f5l6rajzz52fy78fhxspjajjwz",
139
+ expect: (previousAccount, currentAccount) => {
140
+ const [latestOperation] = currentAccount.operations;
141
+ expect(currentAccount.operations.length - previousAccount.operations.length).toBe(1);
142
+ expect(latestOperation.type).toBe("OUT");
143
+ expect(currentAccount.balance.toFixed()).toBe(previousAccount.balance.minus(latestOperation.value).toFixed());
144
+ },
145
+ };
146
+ const scenarioSendMaxBtcTransaction = {
147
+ name: "Send Max BTC",
148
+ rbf: false,
149
+ useAllAmount: true,
150
+ recipient: "bcrt1qajglhjtctn88f5l6rajzz52fy78fhxspjajjwz",
151
+ expect: (previousAccount, currentAccount) => {
152
+ const [latestOperation] = currentAccount.operations;
153
+ expect(currentAccount.operations.length - previousAccount.operations.length).toBe(1);
154
+ expect(latestOperation.type).toBe("OUT");
155
+ expect(currentAccount.balance.toFixed()).toBe(previousAccount.balance.minus(latestOperation.value).toFixed());
156
+ },
157
+ };
158
+ return [
159
+ scenarioExcludeTwoUtxos,
160
+ scenarioExcludeOneUtxo,
161
+ scenarioSendBtcTransaction,
162
+ scenarioSendFIFOBtcTransaction,
163
+ scenarioSendOptimizeSizeBtcTransaction,
164
+ scenarioSendMergeCoinsBtcTransaction,
165
+ scenarioSendFastFeesStrategyBtcTransaction,
166
+ scenarioSendSlowFeesStrategyBtcTransaction,
167
+ scenarioSendMaxBtcTransaction,
168
+ ];
169
+ };
170
+ export const scenarioBitcoin = {
171
+ name: "Ledger Live Basic Bitcoin Transactions",
172
+ setup: async () => {
173
+ const [{ getOnSpeculosConfirmation, transport }] = await Promise.all([
174
+ spawnSpeculos(`/${defaultNanoApp.firmware}/BitcoinTest/app_${defaultNanoApp.version}.elf`),
175
+ spawnAtlas(),
176
+ ]);
177
+ const signerContext = (_, crypto, fn) => fn(new Btc({ transport, currency: BITCOIN.id }));
178
+ const coinConfig = {
179
+ info: {
180
+ status: {
181
+ type: "active",
182
+ },
183
+ },
184
+ };
185
+ setCoinConfig(() => ({ ...coinConfig }));
186
+ LiveConfig.setConfig({
187
+ config_currency_bitcoin_regtest: {
188
+ type: "object",
189
+ default: {
190
+ status: {
191
+ type: "active",
192
+ },
193
+ },
194
+ },
195
+ });
196
+ const onSignerConfirmation = getOnSpeculosConfirmation("Sign transaction");
197
+ const { accountBridge, currencyBridge } = createBridges(signerContext, () => coinConfig);
198
+ await currencyBridge.preload();
199
+ const BITCOIN = getCryptoCurrencyById("bitcoin_regtest");
200
+ const getAddress = resolver(signerContext);
201
+ // Can also test LEGACY here
202
+ const { address, publicKey } = await getAddress("", {
203
+ path: "49'/1'/0'/0/0",
204
+ currency: BITCOIN,
205
+ derivationMode: "segwit",
206
+ });
207
+ const { bitcoinLikeInfo } = BITCOIN;
208
+ const { XPUBVersion: xpubVersion } = bitcoinLikeInfo;
209
+ const xpub = await signerContext("", BITCOIN, signer => signer.getWalletXpub({
210
+ path: "49'/1'/0'",
211
+ xpubVersion,
212
+ }));
213
+ const scenarioAccount = makeAccount(xpub, publicKey, address, BITCOIN, "segwit");
214
+ await loadWallet("coinTester");
215
+ // Need to wait 100 blocks to be able to spend coinbase UTXOs
216
+ await mineToWalletAddress("101");
217
+ // Fund it with 7 BTC in three send to have 3 UTXOs
218
+ await sendTo(address, 2);
219
+ await sendTo(address, 3);
220
+ await sendTo(address, 2);
221
+ return {
222
+ accountBridge,
223
+ currencyBridge,
224
+ account: scenarioAccount,
225
+ onSignerConfirmation,
226
+ retryLimit: 0,
227
+ };
228
+ },
229
+ getTransactions: () => makeScenarioTransactions(),
230
+ beforeAll: async (account) => {
231
+ firstUtxoHash = account.bitcoinResources.utxos[0].hash;
232
+ firstUtxoOutputIndex = account.bitcoinResources.utxos[0].outputIndex;
233
+ secondUtxoHash = account.bitcoinResources.utxos[1].hash;
234
+ secondUtxoOutputIndex = account.bitcoinResources.utxos[1].outputIndex;
235
+ },
236
+ afterEach: async () => {
237
+ // Mine 2 blocks after each transaction to confirm it
238
+ await mineToWalletAddress("2");
239
+ },
240
+ beforeEach: async () => {
241
+ // Make sure explorer is in sync before each transaction
242
+ await waitForExplorerSync();
243
+ },
244
+ beforeSync: async () => {
245
+ // Make sure explorer is in sync before sync
246
+ await waitForExplorerSync();
247
+ },
248
+ teardown: async () => {
249
+ await Promise.all([killSpeculos(), killAtlas()]);
250
+ },
251
+ };
252
+ //# sourceMappingURL=bitcoin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitcoin.js","sourceRoot":"","sources":["../../../src/scenarii/bitcoin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { BitcoinAccount } from "@ledgerhq/coin-bitcoin/lib/types";
2
+ export declare function waitForExplorerSync(url?: string, pollInterval?: number): Promise<void>;
3
+ export declare function findUtxo(account: BitcoinAccount, hash: string, index: number): import("@ledgerhq/coin-bitcoin/lib/types").BitcoinOutput | undefined;
4
+ export declare function findNewUtxo(previous: BitcoinAccount, current: BitcoinAccount): import("@ledgerhq/coin-bitcoin/lib/types").BitcoinOutput | undefined;
5
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAQlE,wBAAsB,mBAAmB,CACvC,GAAG,GAAE,MAAwE,EAC7E,YAAY,GAAE,MAAa,GAC1B,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,wEAI5E;AAGD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc,wEAG5E"}