UNPKG

@bsv/wallet-toolbox

Version:

BRC100 conforming wallet, wallet storage and wallet signer components

105 lines (91 loc) 6.24 kB
import { Beef, BeefTx } from '@bsv/sdk' import { Services } from '../../index.client' import { _tu, logger } from '../../../test/utils/TestUtilsWalletStorage' import { sdk, Setup } from '../../index.all' describe('postBeef service tests', () => { jest.setTimeout(99999999) test('0 postBeef mainnet', async () => { if (Setup.noEnv('main')) return const services = createServices('main') await postBeefTest(services) }) test('1 postBeef testnet', async () => { if (Setup.noEnv('test')) return const services = createServices('test') await postBeefTest(services) }) /** * Test to verify deprioritization of a postBeef service that times out. */ test.skip('2 postBeef mainnet timeout', async () => { if (Setup.noEnv('main')) return const services = createServices('main') const beef = Beef.fromString(beefTimeout) const txid = beef.txs.slice(-1)[0].txid const svcs0 = [...services.postBeefServices.services] const r = await services.postBeef(beef, [txid]) const svcs1 = [...services.postBeefServices.services] expect(svcs0[1].name).toBe('TaalArcBeef') expect(svcs1.slice(-1)[0].name).toBe('TaalArcBeef') }) }) const beefTimeout = '0100beef01fe9fd10d000d02fdfe0300724e96684b24c87532f99023087423b97ffdff2d2f5ef0297a7d6ea954e48964fdff03026bafadb339fe2bf651958e94235251d68ca0784e45209265a0b2f1928e6f48ef01fdfe0100202bf5ecef0fb931ce451e514443c2026f58889c5a630a5d87c02f3eaca080e601fdfe000008ef522990bf4cb377cd013214b50689424b2031bd2c8fb758668aba3a007011017e0016924511d5773ce8030fc54595e4a1028fc9c071e5624205cb53faa5fb286680013e004c3dfbf8f8dd000521fc7121cc03c2cd2007a4424d8d3018671bc0fc32f5e1ba011e007c676e284227ecf36dac58506ebb0fc5833212860832d4d826803bffd74a2b21010e000b0f8c43e4beab689c14cb59b3f1cf93efe33905c22f40a9579c6b6e46cbd573010600f7734085b02e93f104d66d3fa5d864f4a1cc26cdb95fdfc450e34a3d8f13b5f201020041fe0c3fd297e1d83da186868cd92d374ddb3902d7d1054705df5165c0c93e8a0100007ed98d26a6f0d8d2043301cc9bfb255497c22566a59b83dade97240fa406a525010100a0561fe617c0ae0f34ee659a0d714c5b0a97e8c7cf1198edd56bfe8e8b15b7540101007bf537219f147fdedb4a5b8e0bb8a9b9c61a7bca3d05fe4ec84f85b11e21098d0101000198f7ae218e00137045252fb5f0d02c0c1a77e1ef686035dc22329b85f3e5c5020100000001b5db5dbd327c692ca8c9d5fdf7cc967f46769bfc0f481ea594a07fc60b8e9246010000006a4730440220537dcf526cf749d95c322e5daaf4479c15dbbbffa008a25560cbf833e6713fb902203f114c021d768ce9c5ea2094de296593b00926b59f64e37a6a39159607e4d05e412103852907f4bce12316784ea0ef7ac2b6a9d853a066d005ea5961750902025982a4ffffffff0214000000000000001976a914226cdae741a5e1258272bf2532669b54e7a813f988ac0100000000000000fdc5012102e01ef1e893d1164d05595f3979721d09e7dc8b971172df4bbceb56e72b7ed544ac3e314fc657a97ff276becda888ede531346172571a61491128c34c7df7ed5856e83db22843c1501de00fe93cddb47403e532f2492d4551bd974f0c7136ea533adb8d21e38f01080ce0c3fdbcbbb243b73ec0856836a423d368d100f97dafc690c0aa55534a632c612a1a0023886ac8dd2ba704d396b60894a11835eb13a01199d83bc1d19780186959f04d5408849d997fc07d99a58f9f0110b1e5ee52fe87606578c0cc33886597cca074d19b777de331fac609dea2b4108e5b95ec5b58529e5736101e54b537dc76eb3e5c9bfc4d793af8e8caa0550ce2b6ca9c1c10cedfe8f8e63c109f26aab8f9cb5f9e3456d9351d33fadd57e6a5a8973ad0ec148c27a0d1fecc720d222cedb8fbbd30af317298fd8347f7845f3edc4883ddfcd2a0c93665cff964a816f1c3a89b1c5dca7d6eb22326c023f316534299b93e836a49569a885c7ebe416fad632a1a0a4d506806d11c133bc2e8364730450221008975ecf19934195f972fbe7b4d1e6993d2186985aee919810bfaaf439ddf6cb802201946afd710f044e36932bb6d59d6191daaf044905e4b24a9f9ded193c4ac6d236d6d6d7500000000010001000000016bafadb339fe2bf651958e94235251d68ca0784e45209265a0b2f1928e6f48ef000000006b48304502210082b15b0e46da56060c3e508dbbe20c53a6282cc2c3ef2c8f7bd90c9e1748a86a02200e052abe131fb1aea3fdccf2f9ddbb59230aa99ebd7b55655388dbc6710fd15541210349c86999cb3a992c78e3cf72835071e3ca49d16c41e7c0a89d678c1a3cdc8bc8ffffffff0201000000000000001976a914554a6bf9c0203d0c2c75264786d7e8b05f143e0888ac12000000000000001976a914365fb266360071280a82ed90e6a9a85d8d35f74888ac0000000000' function createServices(chain: sdk.Chain): Services { const env = _tu.getEnv(chain) const options = Services.createDefaultOptions(chain) if (env.taalApiKey) { options.taalApiKey = env.taalApiKey options.arcConfig.apiKey = env.taalApiKey } if (env.whatsonchainApiKey) options.whatsOnChainApiKey = env.whatsonchainApiKey if (env.bitailsApiKey) options.bitailsApiKey = env.bitailsApiKey logger(` API Keys: TAAL ${options.taalApiKey!.slice(0, 20)} WHATSONCHAIN ${options.whatsOnChainApiKey!.slice(0, 20)} BITAILS ${options.bitailsApiKey!.slice(0, 20)} `) const services = new Services(options) return services } async function postBeefTest(services: Services) { const chain = services.chain if (Setup.noEnv(chain)) return const c = await _tu.createNoSendTxPair(chain) const txids = [c.txidDo, c.txidUndo] const rs = await services.postBeef(c.beef, txids) for (const r of rs) { const log = r.status === 'success' ? logger : console.log log(`r.notes = ${JSON.stringify(r.notes)}`) log(`r.txidResults = ${JSON.stringify(r.txidResults)}`) 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] = BeefTx.fromTx(c.doubleSpendTx) const txids2 = [c.txidDo, c.doubleSpendTx.id('hex')] const r2s = await services.postBeef(beef2, txids2) for (const r2 of r2s) { const log = r2.status === 'error' ? logger : console.log log(`r2.notes = ${JSON.stringify(r2.notes)}`) log(`r2.txidResults = ${JSON.stringify(r2.txidResults)}`) 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) if (tr!.competingTxs !== undefined) expect(tr!.competingTxs).toEqual([c.txidUndo]) } } } }