UNPKG

@bsv/wallet-toolbox

Version:

BRC100 conforming wallet, wallet storage and wallet signer components

104 lines 5.54 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const TestUtilsWalletStorage_1 = require("../../../test/utils/TestUtilsWalletStorage"); const index_client_1 = require("../../index.client"); const ARC_1 = require("../providers/ARC"); const sdk_1 = require("@bsv/sdk"); const createDefaultWalletServicesOptions_1 = require("../createDefaultWalletServicesOptions"); const index_all_1 = require("../../index.all"); describe('ARC tests', () => { jest.setTimeout(99999999); const envTest = TestUtilsWalletStorage_1._tu.getEnv('test'); const arcTest = new ARC_1.ARC((0, createDefaultWalletServicesOptions_1.arcDefaultUrl)(envTest.chain), { apiKey: envTest.taalApiKey }); const envMain = TestUtilsWalletStorage_1._tu.getEnv('main'); const arcMain = new ARC_1.ARC((0, createDefaultWalletServicesOptions_1.arcDefaultUrl)(envMain.chain), { apiKey: envMain.taalApiKey }); test.skip('0 double spend', async () => { const arc = arcTest; const beef = sdk_1.Beef.fromString(testnetDoubleSpendBeef); const txids = [beef.txs.slice(-1)[0].txid]; const r = await arc.postBeef(beef, txids); expect(r.status === 'error').toBe(true); expect(r.txidResults[0].doubleSpend).toBe(true); }); test.skip('7 postRawTx testnet', async () => { await postRawTxTest('test', arcTest); }); test.skip('8 postRawTx mainnet', async () => { await postRawTxTest('main', arcMain); }); test.skip('9 postBeef testnet', async () => { const r = await postBeefTest('test', arcTest); console.log(`9 postBeef testnet done ${r}`); }); test.skip('10 postBeef mainnet', async () => { const r = await postBeefTest('main', arcMain); console.log(`10 postBeef mainnet done ${r}`); }); }); async function postBeefTest(chain, arc) { if (index_all_1.Setup.noEnv(chain)) return 'skipped'; const c = await TestUtilsWalletStorage_1._tu.createNoSendTxPair(chain); const txids = [c.txidDo, c.txidUndo]; const r = await arc.postBeef(c.beef, txids); expect(r.status).toBe('success'); for (const txid of txids) { const tr = r.txidResults.find(tx => tx.txid === txid); expect(tr).not.toBeUndefined(); expect(tr.status).toBe('success'); } // replace Undo transaction with double spend transaction and send again. const beef2 = c.beef.clone(); beef2.txs[beef2.txs.length - 1] = sdk_1.BeefTx.fromTx(c.doubleSpendTx); const txids2 = [c.txidDo, c.doubleSpendTx.id('hex')]; const r2 = await arc.postBeef(beef2, txids2); expect(r2.status).toBe('error'); for (const txid of txids2) { const tr = r2.txidResults.find(tx => tx.txid === txid); expect(tr).not.toBeUndefined(); if (txid === c.txidDo) { expect(tr.status).toBe('success'); } else { expect(tr.status).toBe('error'); expect(tr.doubleSpend).toBe(true); expect(tr.competingTxs).toEqual([c.txidUndo]); } } return 'passed'; } async function postRawTxTest(chain, arc) { if (index_all_1.Setup.noEnv(chain)) return; const c = await TestUtilsWalletStorage_1._tu.createNoSendTxPair(chain); const rawTxDo = c.beef.findTxid(c.txidDo).tx.toHex(); const rawTxUndo = c.beef.findTxid(c.txidUndo).tx.toHex(); const rDo = await arc.postRawTx(rawTxDo); expect(rDo.status).toBe('success'); expect(rDo.txid).toBe(c.txidDo); await (0, index_client_1.wait)(1000); const rUndo = await arc.postRawTx(rawTxUndo); expect(rUndo.status).toBe('success'); expect(rUndo.txid).toBe(c.txidUndo); expect(rUndo.doubleSpend).not.toBe(true); await (0, index_client_1.wait)(1000); { // Send same transaction again... const rUndo = await arc.postRawTx(rawTxUndo); expect(rUndo.status).toBe('success'); expect(rUndo.txid).toBe(c.txidUndo); expect(rUndo.doubleSpend).not.toBe(true); } await (0, index_client_1.wait)(1000); // Confirm double spend detection. const rDouble = await arc.postRawTx(c.doubleSpendTx.toHex()); expect(rDouble.status).toBe('error'); expect(rDouble.doubleSpend).toBe(true); expect(rDouble.competingTxs[0]).toBe(c.txidUndo); } const testnetDoubleSpendBeef = '0100beef01fe65631900020200009df812619ae232d2363d91516ab3e811211192933526bbc2aee71b54ccb236d10102462876eec65d9aa26d957421c5cc8dd9119b61177242b9dd814fb190fd0a361801010076a3297928f6841bcb656e91225540e87c65f67d8ec12bc768d7656eb7561b3d02010000000159617a9d17562f7c9765e5dfa6a9a393aa2809ca6166a3d7a31c09efcc5070141f0000006a47304402200a528145a67ba1879b88a093cb711f79f04413a81d5678f314302e36a7f59e43022010bc4bb3c2574052c50bbdc8a05c31fb39e69280656b34f5dc22e2ceadc3bb4a412102fd4200bf389d16479b3d06f97fee0752f2c3b9dc29fb3ddce2b327d851b8902bffffffff0204000000000000001976a9140df1a69c834bb7d9bb5b2b7d6a34e5a401db3e1688ac01000000000000001976a91423f2562a8092ed24eddc77c74387b44c561692a188ac0000000001000100000001462876eec65d9aa26d957421c5cc8dd9119b61177242b9dd814fb190fd0a3618000000006a47304402204183bbfdcf11d50907b91f5e70ea8f81228501ce84e24af75c8d984682d094dc022029caa8f7e5acb4990bbeafee523a3c4a99b78e98b9e5c41349147b099679d4ae412103b76389eea6494c2c30443cba9d59b9dba05fb04e467bc94272629615b87a429fffffffff0202000000000000001976a91476d851e59fcb4ee0ebe6947496db3a393b08e49c88ac01000000000000001976a91423f2562a8092ed24eddc77c74387b44c561692a188ac0000000000'; //# sourceMappingURL=ARC.man.test.js.map