UNPKG

@bsv/wallet-toolbox

Version:

BRC100 conforming wallet, wallet storage and wallet signer components

191 lines 12 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const TestUtilsWalletStorage_1 = require("../../../../test/utils/TestUtilsWalletStorage"); const WhatsOnChain_1 = require("../WhatsOnChain"); const Services_1 = require("../../Services"); const Setup_1 = require("../../../Setup"); const utilityHelpers_1 = require("../../../utility/utilityHelpers"); const WalletError_1 = require("../../../sdk/WalletError"); const StorageClient_1 = require("../../../storage/remoting/StorageClient"); describe('whatsonchain tests', () => { jest.setTimeout(99999999); test('00', () => { }); if (TestUtilsWalletStorage_1._tu.noTestEnv('test')) return; const envTest = TestUtilsWalletStorage_1._tu.getEnv('test'); const wocTest = new WhatsOnChain_1.WhatsOnChain(envTest.chain, { apiKey: envTest.taalApiKey }); const envMain = TestUtilsWalletStorage_1._tu.getEnv('main'); const wocMain = new WhatsOnChain_1.WhatsOnChain(envMain.chain, { apiKey: envMain.taalApiKey }); test('0 getRawTx testnet', async () => { const rawTx = await wocTest.getRawTx('7e5b797b86abd31a654bf296900d6cb14d04ef0811568ff4675494af2d92166b'); expect(rawTx === '010000000158EED5DBBB7E2F7D70C79A11B9B61AABEECFA5A7CEC679BEDD00F42C48A4BD45010000006B483045022100AE8BB45498A40E2AC797775C405C108168804CD84E8C09A9D42D280D18EDDB6D022024863BFAAC5FF3C24CA65E2F3677EDA092BC3CC5D2EFABA73264B8FF55CF416B412102094AAF520E14E1C4D68496822800BCC7D3B3B26CA368E004A2CB70B398D82FACFFFFFFFF0203000000000000007421020A624B72B34BC192851C5D8890926BBB70B31BC10FDD4E3BC6534E41B1C81B93AC03010203030405064630440220013B4984F4054C2FBCD2F448AB896CCA5C4E234BF765B0C7FB27EDE572A7F7DA02201A5C8D0D023F94C209046B9A2B96B2882C5E43B72D8115561DF8C07442010EEA6D7592090000000000001976A9146511FCE2F7EF785A2102142FBF381AD1291C918688AC00000000'); expect(await wocTest.getRawTx('1'.repeat(64))).toBeUndefined(); }); test('1 getRawTx mainnet', async () => { const rawTx = await wocMain.getRawTx('d9978ffc6676523208f7b33bebf1b176388bbeace2c7ef67ce35c2eababa1805'); expect(rawTx === '0100000001026A66A5F724EB490A55E0E08553286F08AD57E92C4BF34B5C44EA6BC0A49828020000006B483045022100C3D9A5ACA30C1F2E1A54532162E7AFE5AA69150E4C06D760414A16D1EA1BABD602205E0D9191838B0911A1E7328554A2B22EFAA80CF52B15FBA37C3046A0996C7AAD412103FA3CF488CA98D9F2DB91843F36BAF6BE39F6C947976C02394602D09FBC5F4CF4FFFFFFFF0210270000000000001976A91444C04354E88975C4BEF30CFE89D300CC7659F7E588AC96BC0000000000001976A9149A53E5CF5F1876924D98A8B35CA0BC693618682488AC00000000'); expect(await wocMain.getRawTx('1'.repeat(64))).toBeUndefined(); }); test('2 getMerklePath testnet', async () => { const services = new Services_1.Services(envTest.chain); { const r = await wocTest.getMerklePath('7e5b797b86abd31a654bf296900d6cb14d04ef0811568ff4675494af2d92166b', services); const s = JSON.parse('{"name":"WoCTsc","notes":[{"what":"getMerklePathSuccess","name":"WoCTsc","status":200,"statusText":"OK"}],"merklePath":{"blockHeight":1661398,"path":[[{"offset":6,"hash":"7e5b797b86abd31a654bf296900d6cb14d04ef0811568ff4675494af2d92166b","txid":true},{"offset":7,"hash":"97dd9d9080394d52338588732d9f84e1debca93f171f674ac3beac1e75495568"}],[{"offset":2,"hash":"81beedcd219d9e03255bde2ee479db34b9fed04d30373ba8bc264a64af2515b9"}],[{"offset":0,"hash":"9965f9aaeea33f6878335e6f7e6bdb544c3a8550c84e2f0daca54e9cd912111c"}]]},"header":{"version":536870912,"previousHash":"000000000688340a14b77e49bb0fca5ac7b624f7f79a5517583d1aae61c4e658","merkleRoot":"edbc07082ca0a31d5ec89d1f503a9cd41112c0d8f3221a96acfb8a9d16f8e82b","time":1739624725,"bits":486604799,"nonce":1437884974,"height":1661398,"hash":"00000000d8a73bf9a37272a71886ea92a25376bed1c1916f2b5cfbec4d6f6a25"}}'); expect(r).toEqual(s); } { const r = await wocTest.getMerklePath('1'.repeat(64), services); const s = JSON.parse('{"name":"WoCTsc","notes":[{"what":"getMerklePathNoData","name":"WoCTsc","status":200,"statusText":"OK"}]}'); expect(r).toEqual(s); } }); test('3 getMerklePath mainnet', async () => { const services = new Services_1.Services(envMain.chain); { const r = await wocMain.getMerklePath('d9978ffc6676523208f7b33bebf1b176388bbeace2c7ef67ce35c2eababa1805', services); const s = JSON.parse('{"name":"WoCTsc","notes":[{"what":"getMerklePathSuccess","name":"WoCTsc","status":200,"statusText":"OK"}],"merklePath":{"blockHeight":883637,"path":[[{"offset":46,"hash":"d9978ffc6676523208f7b33bebf1b176388bbeace2c7ef67ce35c2eababa1805","txid":true},{"offset":47,"hash":"066f6fa6fa988f2e3a9d6fe35fa0d3666c652dac35cabaeebff3738a4e67f68f"}],[{"offset":22,"hash":"232089a6f77c566151bc4701fda394b5cc5bf17073140d46a73c4c3ed0a7b911"}],[{"offset":10,"hash":"c639b3a6ce127f67dbd01c7331a6fca62a4b429830387bd68ac6ac05e162116d"}],[{"offset":4,"hash":"730cec44be97881530947d782bb328d25f1122fdae206296937fffb03e936d48"}],[{"offset":3,"hash":"28b681f8ab8db0fa4d5d20cb1532b95184a155346b0b8447bde580b2406d51e6"}],[{"offset":0,"hash":"c49a18028e230dd1439b26794c08c339506f24a450f067c4facd4e0d5a346490"}],[{"offset":1,"hash":"0ba57d1b1fad6874de3640c01088e3dedad3507e5b3a3102b9a8a8055f3df88b"}],[{"offset":1,"hash":"c830edebe5565c19ba584ec73d49129344d17539f322509b7c314ae641c2fcdb"}],[{"offset":1,"hash":"ff62d5ed2a94eb93a2b7d084b8f15b12083573896b6a58cf871507e3352c75f5"}]]},"header":{"version":1040187392,"previousHash":"00000000000000000d9f6889dd6743500adee204ea25d8a57225ecd48b111769","merkleRoot":"59c1efd79fae0d9c29dd8da63f8eeec0aadde048f4491c6bfa324fcfd537156d","time":1739329877,"bits":403818359,"nonce":596827153,"height":883637,"hash":"0000000000000000060ac8d63b78d41f58c9aba0b09f81db7d51fa4905a47263"}}'); expect(r).toEqual(s); } { const r = await wocMain.getMerklePath('1'.repeat(64), services); const s = JSON.parse('{"name":"WoCTsc","notes":[{"what":"getMerklePathNoData","name":"WoCTsc","status":200,"statusText":"OK"}]}'); expect(r).toEqual(s); } }); test('4 updateBsvExchangeRate', async () => { { const r = await wocMain.updateBsvExchangeRate(); expect(r.base).toBe('USD'); expect(r.rate).toBeGreaterThan(0); expect(r.timestamp).toBeTruthy(); } }); test('5 getTxPropagation testnet', async () => { return; // throwing internal server error 500 when tested. const count = await wocTest.getTxPropagation('7e5b797b86abd31a654bf296900d6cb14d04ef0811568ff4675494af2d92166b'); expect(count > 0); expect((await wocTest.getTxPropagation('1'.repeat(64))) === 0); }); test('6 getTxPropagation mainnet', async () => { }); test.skip('7 postRawTx testnet', async () => { if (Setup_1.Setup.noEnv('test')) return; const woc = wocTest; const c = await TestUtilsWalletStorage_1._tu.createNoSendTxPair('test'); const rawTxDo = c.beef.findTxid(c.txidDo).tx.toHex(); const rawTxUndo = c.beef.findTxid(c.txidUndo).tx.toHex(); const txidDo = await woc.postRawTx(rawTxDo); expect(txidDo).toBe(c.txidDo); await (0, utilityHelpers_1.wait)(1000); const txidUndo = await woc.postRawTx(rawTxUndo); expect(txidUndo).toBe(c.txidUndo); }); test.skip('7a nosend cleanup testnet', async () => { const c = await TestUtilsWalletStorage_1._tu.createWalletSetupEnv('test'); const actions = await c.wallet.listActions({ labels: [], limit: 1000 }); const nosends = actions.actions.filter(a => a.status === 'nosend'); const refs = ['yUfgNVaFcBNyP2Xv']; for (const ref of refs) { try { await c.wallet.abortAction({ reference: ref }); } catch (eu) { const e = WalletError_1.WalletError.fromUnknown(eu); } } }); test.skip('8 postRawTx mainnet', async () => { if (Setup_1.Setup.noEnv('main')) return; const woc = wocMain; const c = await TestUtilsWalletStorage_1._tu.createNoSendTxPair('main'); const rawTxDo = c.beef.findTxid(c.txidDo).tx.toHex(); const rawTxUndo = c.beef.findTxid(c.txidUndo).tx.toHex(); const txidDo = await woc.postRawTx(rawTxDo); expect(txidDo).toBe(c.txidDo); /* try { // This method is broken as of 2025-02-16 const count = await woc.getTxPropagation(txidDo) } catch {} // getRawTx returns undefined for unmined transactions, sometimes. let rawTx = await woc.getRawTx(txidDo) let i = 0 while (!rawTx) { console.log(`${i++} waiting for WhatsOnChain to acknowledge new transaction exists.`) await wait(5000) rawTx = await woc.getRawTx(txidDo) } expect(rawTx).toBe(rawTxDo) */ // allow for propagation... await (0, utilityHelpers_1.wait)(1000); const txidUndo = await woc.postRawTx(rawTxUndo); expect(txidUndo).toBe(c.txidUndo); await (0, utilityHelpers_1.wait)(1000); // Confirm double spend detection. // 'The rawTx parameter must be valid. unexpected response code 500: 258: txn-mempool-conflict' // 'The rawTx parameter must be valid. unexpected response code 500: Missing inputs' try { await woc.postRawTx(c.doubleSpendTx.toHex()); expect(false); } catch (eu) { const e = WalletError_1.WalletError.fromUnknown(eu); expect(e.message === 'The rawTx parameter must be valid. unexpected response code 500: 258: txn-mempool-conflict' || 'The rawTx parameter must be valid. unexpected response code 500: Missing inputs'); } }); test.skip('8a nosend cleanup mainnet', async () => { const c = await TestUtilsWalletStorage_1._tu.createWalletSetupEnv('main'); const actions = await c.wallet.listActions({ labels: [], limit: 1000 }); const nosends = actions.actions.filter(a => a.status === 'nosend'); // No way to get from actions to reference string values for use with abortAction... if (c['activeStorage']) { const s = c['activeStorage']; const userId = c['userId']; const txs = await s.findTransactions({ partial: { userId, status: 'nosend' } }); const refs = txs.map(tx => tx.reference); for (const ref of refs) { try { await c.wallet.abortAction({ reference: ref }); } catch (eu) { const e = WalletError_1.WalletError.fromUnknown(eu); } } } await c.wallet.destroy(); }); test.skip('8b run monitor mainnet', async () => { if (Setup_1.Setup.noEnv('main')) return; if (!Setup_1.Setup.getEnv('main').filePath) return; // Only run if `Setup` style .env is present with a sqlite filePath... const c = await TestUtilsWalletStorage_1._tu.createWalletSetupEnv('main'); await c.monitor.runOnce(); await c.wallet.destroy(); }); test.skip('8c backup to cloud', async () => { if (Setup_1.Setup.noEnv('main')) return; if (!Setup_1.Setup.getEnv('main').filePath) return; const c = await TestUtilsWalletStorage_1._tu.createWalletSetupEnv('main'); const client = new StorageClient_1.StorageClient(c.wallet, 'https://storage.babbage.systems'); await c.storage.addWalletStorageProvider(client); await c.storage.updateBackups(); await c.wallet.destroy(); }); }); //# sourceMappingURL=WhatsOnChain.test.js.map