@bsv/wallet-toolbox 1.5.8 → 1.5.10

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 (47) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/docs/client.md +10 -0
  3. package/docs/services.md +10 -0
  4. package/docs/wallet.md +10 -0
  5. package/mobile/out/src/services/ServiceCollection.d.ts +5 -0
  6. package/mobile/out/src/services/ServiceCollection.d.ts.map +1 -1
  7. package/mobile/out/src/services/ServiceCollection.js +11 -0
  8. package/mobile/out/src/services/ServiceCollection.js.map +1 -1
  9. package/mobile/out/src/services/Services.d.ts.map +1 -1
  10. package/mobile/out/src/services/Services.js +4 -0
  11. package/mobile/out/src/services/Services.js.map +1 -1
  12. package/mobile/out/src/services/providers/ARC.d.ts.map +1 -1
  13. package/mobile/out/src/services/providers/ARC.js +2 -0
  14. package/mobile/out/src/services/providers/ARC.js.map +1 -1
  15. package/mobile/package-lock.json +6 -6
  16. package/mobile/package.json +2 -2
  17. package/out/src/services/ServiceCollection.d.ts +5 -0
  18. package/out/src/services/ServiceCollection.d.ts.map +1 -1
  19. package/out/src/services/ServiceCollection.js +11 -0
  20. package/out/src/services/ServiceCollection.js.map +1 -1
  21. package/out/src/services/Services.d.ts.map +1 -1
  22. package/out/src/services/Services.js +4 -0
  23. package/out/src/services/Services.js.map +1 -1
  24. package/out/src/services/__tests/ARC.timeout.man.test.d.ts +2 -0
  25. package/out/src/services/__tests/ARC.timeout.man.test.d.ts.map +1 -0
  26. package/out/src/services/__tests/ARC.timeout.man.test.js +33 -0
  27. package/out/src/services/__tests/ARC.timeout.man.test.js.map +1 -0
  28. package/out/src/services/__tests/postBeef.test.js +16 -0
  29. package/out/src/services/__tests/postBeef.test.js.map +1 -1
  30. package/out/src/services/__tests/verifyBeef.test.js +20 -1
  31. package/out/src/services/__tests/verifyBeef.test.js.map +1 -1
  32. package/out/src/services/providers/ARC.d.ts.map +1 -1
  33. package/out/src/services/providers/ARC.js +2 -0
  34. package/out/src/services/providers/ARC.js.map +1 -1
  35. package/out/src/storage/__test/adminStats.man.test.js.map +1 -1
  36. package/out/test/utils/TestUtilsWalletStorage.js +1 -1
  37. package/out/test/utils/TestUtilsWalletStorage.js.map +1 -1
  38. package/out/tsconfig.all.tsbuildinfo +1 -1
  39. package/package.json +2 -2
  40. package/src/services/ServiceCollection.ts +12 -0
  41. package/src/services/Services.ts +4 -0
  42. package/src/services/__tests/ARC.timeout.man.test.ts +36 -0
  43. package/src/services/__tests/postBeef.test.ts +19 -1
  44. package/src/services/__tests/verifyBeef.test.ts +24 -2
  45. package/src/services/providers/ARC.ts +2 -0
  46. package/src/storage/__test/adminStats.man.test.ts +2 -3
  47. package/test/utils/TestUtilsWalletStorage.ts +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bsv/wallet-toolbox",
3
- "version": "1.5.8",
3
+ "version": "1.5.10",
4
4
  "description": "BRC100 conforming wallet, wallet storage and wallet signer components",
5
5
  "main": "./out/src/index.js",
6
6
  "types": "./out/src/index.d.ts",
@@ -32,7 +32,7 @@
32
32
  "dependencies": {
33
33
  "@bsv/auth-express-middleware": "^1.2.0",
34
34
  "@bsv/payment-express-middleware": "^1.2.1",
35
- "@bsv/sdk": "^1.6.11",
35
+ "@bsv/sdk": "^1.6.12",
36
36
  "express": "^4.21.2",
37
37
  "idb": "^8.0.2",
38
38
  "knex": "^3.1.0",
@@ -59,6 +59,18 @@ export class ServiceCollection<T> {
59
59
  return all
60
60
  }
61
61
 
62
+ /**
63
+ * Used to de-prioritize a service call by moving it to the end of the list.
64
+ * @param stc
65
+ */
66
+ moveServiceToLast(stc: ServiceToCall<T>) {
67
+ const index = this.services.findIndex(s => s.name === stc.providerName)
68
+ if (index !== -1) {
69
+ const [service] = this.services.splice(index, 1)
70
+ this.services.push(service)
71
+ }
72
+ }
73
+
62
74
  get allServices() {
63
75
  return this.services.map(x => x.service)
64
76
  }
@@ -280,6 +280,10 @@ export class Services implements sdk.WalletServices {
280
280
  const r = await callService(stc)
281
281
  rs.push(r)
282
282
  if (r.status === 'success') break
283
+ if (r.txidResults && r.txidResults.every(txr => txr.serviceError)) {
284
+ // move this service to the end of the list
285
+ this.postBeefServices.moveServiceToLast(stc)
286
+ }
283
287
  }
284
288
  }
285
289
  break
@@ -0,0 +1,36 @@
1
+ import { _tu } from '../../../test/utils/TestUtilsWalletStorage'
2
+ import { defaultHttpClient, HttpClientRequestOptions } from '@bsv/sdk'
3
+
4
+ describe('ARC tests', () => {
5
+ jest.setTimeout(99999999)
6
+
7
+ const envMain = _tu.getEnv('main')
8
+ test('11 post to TAAL for timeout', async () => {
9
+ const httpClient = defaultHttpClient()
10
+ const url = `https://arc.taal.com/v1/tx`
11
+
12
+ const headers: Record<string, string> = {
13
+ 'Content-Type': 'application/json',
14
+ 'XDeployment-ID': 'wallet-toolbox-test11',
15
+ Authorization: `Bearer ${envMain.taalApiKey}`
16
+ }
17
+ const requestOptions: HttpClientRequestOptions = {
18
+ method: 'POST',
19
+ headers,
20
+ data: { rawTx: beef905631 }
21
+ }
22
+
23
+ requestOptions['signal'] = AbortSignal.timeout(5000)
24
+
25
+ try {
26
+ const response = await httpClient.request(url, requestOptions)
27
+ expect(response.status).toBe(200)
28
+ } catch (error: any) {
29
+ console.log('Error posting to TAAL:', error.message)
30
+ expect(error.code).toBe('ABORT_ERR')
31
+ }
32
+ })
33
+ })
34
+
35
+ const beef905631 =
36
+ '0100beef01fe9fd10d000d02fdfe0300724e96684b24c87532f99023087423b97ffdff2d2f5ef0297a7d6ea954e48964fdff03026bafadb339fe2bf651958e94235251d68ca0784e45209265a0b2f1928e6f48ef01fdfe0100202bf5ecef0fb931ce451e514443c2026f58889c5a630a5d87c02f3eaca080e601fdfe000008ef522990bf4cb377cd013214b50689424b2031bd2c8fb758668aba3a007011017e0016924511d5773ce8030fc54595e4a1028fc9c071e5624205cb53faa5fb286680013e004c3dfbf8f8dd000521fc7121cc03c2cd2007a4424d8d3018671bc0fc32f5e1ba011e007c676e284227ecf36dac58506ebb0fc5833212860832d4d826803bffd74a2b21010e000b0f8c43e4beab689c14cb59b3f1cf93efe33905c22f40a9579c6b6e46cbd573010600f7734085b02e93f104d66d3fa5d864f4a1cc26cdb95fdfc450e34a3d8f13b5f201020041fe0c3fd297e1d83da186868cd92d374ddb3902d7d1054705df5165c0c93e8a0100007ed98d26a6f0d8d2043301cc9bfb255497c22566a59b83dade97240fa406a525010100a0561fe617c0ae0f34ee659a0d714c5b0a97e8c7cf1198edd56bfe8e8b15b7540101007bf537219f147fdedb4a5b8e0bb8a9b9c61a7bca3d05fe4ec84f85b11e21098d0101000198f7ae218e00137045252fb5f0d02c0c1a77e1ef686035dc22329b85f3e5c5020100000001b5db5dbd327c692ca8c9d5fdf7cc967f46769bfc0f481ea594a07fc60b8e9246010000006a4730440220537dcf526cf749d95c322e5daaf4479c15dbbbffa008a25560cbf833e6713fb902203f114c021d768ce9c5ea2094de296593b00926b59f64e37a6a39159607e4d05e412103852907f4bce12316784ea0ef7ac2b6a9d853a066d005ea5961750902025982a4ffffffff0214000000000000001976a914226cdae741a5e1258272bf2532669b54e7a813f988ac0100000000000000fdc5012102e01ef1e893d1164d05595f3979721d09e7dc8b971172df4bbceb56e72b7ed544ac3e314fc657a97ff276becda888ede531346172571a61491128c34c7df7ed5856e83db22843c1501de00fe93cddb47403e532f2492d4551bd974f0c7136ea533adb8d21e38f01080ce0c3fdbcbbb243b73ec0856836a423d368d100f97dafc690c0aa55534a632c612a1a0023886ac8dd2ba704d396b60894a11835eb13a01199d83bc1d19780186959f04d5408849d997fc07d99a58f9f0110b1e5ee52fe87606578c0cc33886597cca074d19b777de331fac609dea2b4108e5b95ec5b58529e5736101e54b537dc76eb3e5c9bfc4d793af8e8caa0550ce2b6ca9c1c10cedfe8f8e63c109f26aab8f9cb5f9e3456d9351d33fadd57e6a5a8973ad0ec148c27a0d1fecc720d222cedb8fbbd30af317298fd8347f7845f3edc4883ddfcd2a0c93665cff964a816f1c3a89b1c5dca7d6eb22326c023f316534299b93e836a49569a885c7ebe416fad632a1a0a4d506806d11c133bc2e8364730450221008975ecf19934195f972fbe7b4d1e6993d2186985aee919810bfaaf439ddf6cb802201946afd710f044e36932bb6d59d6191daaf044905e4b24a9f9ded193c4ac6d236d6d6d7500000000010001000000016bafadb339fe2bf651958e94235251d68ca0784e45209265a0b2f1928e6f48ef000000006b48304502210082b15b0e46da56060c3e508dbbe20c53a6282cc2c3ef2c8f7bd90c9e1748a86a02200e052abe131fb1aea3fdccf2f9ddbb59230aa99ebd7b55655388dbc6710fd15541210349c86999cb3a992c78e3cf72835071e3ca49d16c41e7c0a89d678c1a3cdc8bc8ffffffff0201000000000000001976a914554a6bf9c0203d0c2c75264786d7e8b05f143e0888ac12000000000000001976a914365fb266360071280a82ed90e6a9a85d8d35f74888ac0000000000'
@@ -1,4 +1,4 @@
1
- import { BeefTx } from '@bsv/sdk'
1
+ import { Beef, BeefTx } from '@bsv/sdk'
2
2
  import { Services } from '../../index.client'
3
3
  import { _tu, logger } from '../../../test/utils/TestUtilsWalletStorage'
4
4
  import { sdk, Setup } from '../../index.all'
@@ -17,8 +17,26 @@ describe('postBeef service tests', () => {
17
17
  const services = createServices('test')
18
18
  await postBeefTest(services)
19
19
  })
20
+
21
+ /**
22
+ * Test to verify deprioritization of a postBeef service that times out.
23
+ */
24
+ test.skip('2 postBeef mainnet timeout', async () => {
25
+ if (Setup.noEnv('main')) return
26
+ const services = createServices('main')
27
+ const beef = Beef.fromString(beefTimeout)
28
+ const txid = beef.txs.slice(-1)[0].txid
29
+ const svcs0 = [...services.postBeefServices.services]
30
+ const r = await services.postBeef(beef, [txid])
31
+ const svcs1 = [...services.postBeefServices.services]
32
+ expect(svcs0[1].name).toBe('TaalArcBeef')
33
+ expect(svcs1.slice(-1)[0].name).toBe('TaalArcBeef')
34
+ })
20
35
  })
21
36
 
37
+ const beefTimeout =
38
+ '0100beef01fe9fd10d000d02fdfe0300724e96684b24c87532f99023087423b97ffdff2d2f5ef0297a7d6ea954e48964fdff03026bafadb339fe2bf651958e94235251d68ca0784e45209265a0b2f1928e6f48ef01fdfe0100202bf5ecef0fb931ce451e514443c2026f58889c5a630a5d87c02f3eaca080e601fdfe000008ef522990bf4cb377cd013214b50689424b2031bd2c8fb758668aba3a007011017e0016924511d5773ce8030fc54595e4a1028fc9c071e5624205cb53faa5fb286680013e004c3dfbf8f8dd000521fc7121cc03c2cd2007a4424d8d3018671bc0fc32f5e1ba011e007c676e284227ecf36dac58506ebb0fc5833212860832d4d826803bffd74a2b21010e000b0f8c43e4beab689c14cb59b3f1cf93efe33905c22f40a9579c6b6e46cbd573010600f7734085b02e93f104d66d3fa5d864f4a1cc26cdb95fdfc450e34a3d8f13b5f201020041fe0c3fd297e1d83da186868cd92d374ddb3902d7d1054705df5165c0c93e8a0100007ed98d26a6f0d8d2043301cc9bfb255497c22566a59b83dade97240fa406a525010100a0561fe617c0ae0f34ee659a0d714c5b0a97e8c7cf1198edd56bfe8e8b15b7540101007bf537219f147fdedb4a5b8e0bb8a9b9c61a7bca3d05fe4ec84f85b11e21098d0101000198f7ae218e00137045252fb5f0d02c0c1a77e1ef686035dc22329b85f3e5c5020100000001b5db5dbd327c692ca8c9d5fdf7cc967f46769bfc0f481ea594a07fc60b8e9246010000006a4730440220537dcf526cf749d95c322e5daaf4479c15dbbbffa008a25560cbf833e6713fb902203f114c021d768ce9c5ea2094de296593b00926b59f64e37a6a39159607e4d05e412103852907f4bce12316784ea0ef7ac2b6a9d853a066d005ea5961750902025982a4ffffffff0214000000000000001976a914226cdae741a5e1258272bf2532669b54e7a813f988ac0100000000000000fdc5012102e01ef1e893d1164d05595f3979721d09e7dc8b971172df4bbceb56e72b7ed544ac3e314fc657a97ff276becda888ede531346172571a61491128c34c7df7ed5856e83db22843c1501de00fe93cddb47403e532f2492d4551bd974f0c7136ea533adb8d21e38f01080ce0c3fdbcbbb243b73ec0856836a423d368d100f97dafc690c0aa55534a632c612a1a0023886ac8dd2ba704d396b60894a11835eb13a01199d83bc1d19780186959f04d5408849d997fc07d99a58f9f0110b1e5ee52fe87606578c0cc33886597cca074d19b777de331fac609dea2b4108e5b95ec5b58529e5736101e54b537dc76eb3e5c9bfc4d793af8e8caa0550ce2b6ca9c1c10cedfe8f8e63c109f26aab8f9cb5f9e3456d9351d33fadd57e6a5a8973ad0ec148c27a0d1fecc720d222cedb8fbbd30af317298fd8347f7845f3edc4883ddfcd2a0c93665cff964a816f1c3a89b1c5dca7d6eb22326c023f316534299b93e836a49569a885c7ebe416fad632a1a0a4d506806d11c133bc2e8364730450221008975ecf19934195f972fbe7b4d1e6993d2186985aee919810bfaaf439ddf6cb802201946afd710f044e36932bb6d59d6191daaf044905e4b24a9f9ded193c4ac6d236d6d6d7500000000010001000000016bafadb339fe2bf651958e94235251d68ca0784e45209265a0b2f1928e6f48ef000000006b48304502210082b15b0e46da56060c3e508dbbe20c53a6282cc2c3ef2c8f7bd90c9e1748a86a02200e052abe131fb1aea3fdccf2f9ddbb59230aa99ebd7b55655388dbc6710fd15541210349c86999cb3a992c78e3cf72835071e3ca49d16c41e7c0a89d678c1a3cdc8bc8ffffffff0201000000000000001976a914554a6bf9c0203d0c2c75264786d7e8b05f143e0888ac12000000000000001976a914365fb266360071280a82ed90e6a9a85d8d35f74888ac0000000000'
39
+
22
40
  function createServices(chain: sdk.Chain): Services {
23
41
  const env = _tu.getEnv(chain)
24
42
  const options = Services.createDefaultOptions(chain)
@@ -1,6 +1,7 @@
1
1
  import { Beef } from '@bsv/sdk'
2
2
  import { Services } from '../Services'
3
- import { logger } from '../../../test/utils/TestUtilsWalletStorage'
3
+ import { _tu, logger } from '../../../test/utils/TestUtilsWalletStorage'
4
+ import { verifyTruthy } from '../../utility/utilityHelpers'
4
5
 
5
6
  describe('verifyBeef tests', () => {
6
7
  jest.setTimeout(99999999)
@@ -14,6 +15,27 @@ describe('verifyBeef tests', () => {
14
15
  logger(beef.toLogString())
15
16
 
16
17
  const ok = await beef.verify(chaintracker, true)
17
- expect(ok)
18
+ expect(ok).toBe(true)
19
+ })
20
+
21
+ test('1_', async () => {
22
+ if (_tu.noEnv('main')) return
23
+ const { env, storage, services } = await _tu.createMainReviewSetup()
24
+
25
+ const getBeefForTxid = '4d9a1eff26bac99c7524cb7b2e808b77935d3d890562db2fefc6cb8cb92a6b16'
26
+ {
27
+ const beef = await services.getBeefForTxid(getBeefForTxid)
28
+ const chaintracker = await services.getChainTracker()
29
+ const ok = await beef.verify(chaintracker, true)
30
+ expect(ok).toBe(true)
31
+ }
32
+ {
33
+ const beef = verifyTruthy(
34
+ await storage.getValidBeefForTxid(getBeefForTxid, undefined, undefined, undefined, undefined, 1)
35
+ )
36
+ const chaintracker = await services.getChainTracker()
37
+ const ok = await beef.verify(chaintracker, true)
38
+ expect(ok).toBe(true)
39
+ }
18
40
  })
19
41
  })
@@ -143,6 +143,8 @@ export class ARC {
143
143
  status: 'success',
144
144
  notes: []
145
145
  }
146
+ // Set a timeout on the request
147
+ requestOptions['signal'] = AbortSignal.timeout(1000 * 30) // 30 seconds timeout, error.code will be 'ABORT_ERR'
146
148
 
147
149
  const url = `${this.URL}/v1/tx`
148
150
  const nn = () => ({ name: this.name, when: new Date().toISOString() })
@@ -1,9 +1,8 @@
1
- import { before } from 'node:test'
2
1
  import { _tu, TestWalletOnly } from '../../../test/utils/TestUtilsWalletStorage'
3
2
  import { Setup } from '../../Setup'
4
3
  import { StorageKnex } from '../StorageKnex'
5
- import { AuthFetch, WalletInterface } from '@bsv/sdk'
6
- import { StorageAdminStats, StorageClient } from '../index.client'
4
+ import { AuthFetch } from '@bsv/sdk'
5
+ import { StorageAdminStats } from '../index.client'
7
6
  import { Format } from '../../utility/Format'
8
7
 
9
8
  describe('storage adminStats tests', () => {
@@ -169,7 +169,7 @@ export abstract class TestUtilsWalletStorage {
169
169
  services: Services
170
170
  }> {
171
171
  const env = _tu.getEnv('main')
172
- if (!env.cloudMySQLConnection) throw new sdk.WERR_INVALID_PARAMETER('env.cloundMySQLConnection', 'valid')
172
+ if (!env.cloudMySQLConnection) throw new sdk.WERR_INVALID_PARAMETER('env.cloudMySQLConnection', 'valid')
173
173
  const knex = Setup.createMySQLKnex(env.cloudMySQLConnection)
174
174
  const storage = new StorageKnex({
175
175
  chain: env.chain,