@bsv/wallet-toolbox 1.3.6 → 1.3.9
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.
- package/docs/client.md +1360 -133
- package/docs/storage.md +14 -10
- package/docs/wallet.md +1346 -119
- package/out/src/Wallet.d.ts +2 -2
- package/out/src/Wallet.d.ts.map +1 -1
- package/out/src/Wallet.js +15 -8
- package/out/src/Wallet.js.map +1 -1
- package/out/src/index.client.d.ts +2 -0
- package/out/src/index.client.d.ts.map +1 -1
- package/out/src/index.client.js +2 -0
- package/out/src/index.client.js.map +1 -1
- package/out/src/sdk/WalletStorage.interfaces.d.ts +14 -0
- package/out/src/sdk/WalletStorage.interfaces.d.ts.map +1 -1
- package/out/src/storage/StorageIdb.d.ts +5 -1
- package/out/src/storage/StorageIdb.d.ts.map +1 -1
- package/out/src/storage/StorageIdb.js +7 -3
- package/out/src/storage/StorageIdb.js.map +1 -1
- package/out/src/storage/StorageKnex.js +8 -8
- package/out/src/storage/StorageKnex.js.map +1 -1
- package/out/src/storage/WalletStorageManager.d.ts +1 -0
- package/out/src/storage/WalletStorageManager.d.ts.map +1 -1
- package/out/src/storage/WalletStorageManager.js +40 -0
- package/out/src/storage/WalletStorageManager.js.map +1 -1
- package/out/src/storage/__test/adminStats.man.test.js +45 -1
- package/out/src/storage/__test/adminStats.man.test.js.map +1 -1
- package/out/src/storage/index.all.d.ts +1 -0
- package/out/src/storage/index.all.d.ts.map +1 -1
- package/out/src/storage/index.all.js +1 -0
- package/out/src/storage/index.all.js.map +1 -1
- package/out/src/storage/index.client.d.ts +1 -0
- package/out/src/storage/index.client.d.ts.map +1 -1
- package/out/src/storage/index.client.js +1 -0
- package/out/src/storage/index.client.js.map +1 -1
- package/out/test/Wallet/local/localWallet2.man.test.js +58 -37
- package/out/test/Wallet/local/localWallet2.man.test.js.map +1 -1
- package/out/test/Wallet/support/operations.man.test.js +5 -3
- package/out/test/Wallet/support/operations.man.test.js.map +1 -1
- package/out/test/utils/localWalletMethods.d.ts +7 -2
- package/out/test/utils/localWalletMethods.d.ts.map +1 -1
- package/out/test/utils/localWalletMethods.js +19 -0
- package/out/test/utils/localWalletMethods.js.map +1 -1
- package/out/tsconfig.all.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/Wallet.ts +10 -7
- package/src/index.client.ts +2 -0
- package/src/sdk/WalletStorage.interfaces.ts +16 -0
- package/src/storage/StorageIdb.ts +8 -4
- package/src/storage/StorageKnex.ts +8 -8
- package/src/storage/WalletStorageManager.ts +41 -0
- package/src/storage/__test/adminStats.man.test.ts +56 -2
- package/src/storage/index.all.ts +1 -0
- package/src/storage/index.client.ts +1 -0
- package/test/Wallet/local/localWallet2.man.test.ts +66 -40
- package/test/Wallet/support/operations.man.test.ts +5 -3
- package/test/utils/localWalletMethods.ts +34 -2
package/package.json
CHANGED
package/src/Wallet.ts
CHANGED
|
@@ -635,26 +635,28 @@ export class Wallet implements WalletInterface, ProtoWallet {
|
|
|
635
635
|
return transformVerifiableCertificatesWithTrust(trustSettings, results)
|
|
636
636
|
}
|
|
637
637
|
|
|
638
|
-
verifyReturnedTxidOnly(beef: Beef): Beef {
|
|
638
|
+
verifyReturnedTxidOnly(beef: Beef, knownTxids?: string[]): Beef {
|
|
639
639
|
if (this.returnTxidOnly) return beef
|
|
640
640
|
const onlyTxids = beef.txs.filter(btx => btx.isTxidOnly).map(btx => btx.txid)
|
|
641
641
|
for (const txid of onlyTxids) {
|
|
642
|
+
if (knownTxids && knownTxids.indexOf(txid) >= 0) continue
|
|
642
643
|
const btx = beef.findTxid(txid)
|
|
643
644
|
const tx = this.beef.findAtomicTransaction(txid)
|
|
644
|
-
if (!tx) throw new sdk.WERR_INTERNAL()
|
|
645
|
+
if (!tx) throw new sdk.WERR_INTERNAL(`unable to merge txid ${txid} into beef`)
|
|
645
646
|
beef.mergeTransaction(tx)
|
|
646
647
|
}
|
|
647
648
|
for (const btx of beef.txs) {
|
|
648
|
-
if (btx.
|
|
649
|
+
if (knownTxids && knownTxids.indexOf(btx.txid) >= 0) continue
|
|
650
|
+
if (btx.isTxidOnly) throw new sdk.WERR_INTERNAL(`remaining txidOnly ${btx.txid} is not known`)
|
|
649
651
|
}
|
|
650
652
|
return beef
|
|
651
653
|
}
|
|
652
654
|
|
|
653
|
-
verifyReturnedTxidOnlyAtomicBEEF(beef: AtomicBEEF): AtomicBEEF {
|
|
655
|
+
verifyReturnedTxidOnlyAtomicBEEF(beef: AtomicBEEF, knownTxids?: string[]): AtomicBEEF {
|
|
654
656
|
if (this.returnTxidOnly) return beef
|
|
655
657
|
const b = Beef.fromBinary(beef)
|
|
656
658
|
if (!b.atomicTxid) throw new sdk.WERR_INTERNAL()
|
|
657
|
-
return this.verifyReturnedTxidOnly(b).toBinaryAtomic(b.atomicTxid!)
|
|
659
|
+
return this.verifyReturnedTxidOnly(b, knownTxids).toBinaryAtomic(b.atomicTxid!)
|
|
658
660
|
}
|
|
659
661
|
|
|
660
662
|
verifyReturnedTxidOnlyBEEF(beef: BEEF): BEEF {
|
|
@@ -694,7 +696,7 @@ export class Wallet implements WalletInterface, ProtoWallet {
|
|
|
694
696
|
this.beef.mergeBeefFromParty(this.storageParty, r.tx)
|
|
695
697
|
}
|
|
696
698
|
|
|
697
|
-
if (r.tx) r.tx = this.verifyReturnedTxidOnlyAtomicBEEF(r.tx)
|
|
699
|
+
if (r.tx) r.tx = this.verifyReturnedTxidOnlyAtomicBEEF(r.tx, args.options?.knownTxids)
|
|
698
700
|
|
|
699
701
|
if (!vargs.isDelayed) throwIfAnyUnsuccessfulCreateActions(r)
|
|
700
702
|
|
|
@@ -713,7 +715,8 @@ export class Wallet implements WalletInterface, ProtoWallet {
|
|
|
713
715
|
|
|
714
716
|
if (!vargs.isDelayed) throwIfAnyUnsuccessfulSignActions(r)
|
|
715
717
|
|
|
716
|
-
|
|
718
|
+
const prior = this.pendingSignActions[args.reference]
|
|
719
|
+
if (r.tx) r.tx = this.verifyReturnedTxidOnlyAtomicBEEF(r.tx, prior.args.options?.knownTxids)
|
|
717
720
|
|
|
718
721
|
return r
|
|
719
722
|
}
|
package/src/index.client.ts
CHANGED
|
@@ -88,6 +88,22 @@ export interface WalletStorage {
|
|
|
88
88
|
|
|
89
89
|
relinquishCertificate(args: RelinquishCertificateArgs): Promise<number>
|
|
90
90
|
relinquishOutput(args: RelinquishOutputArgs): Promise<number>
|
|
91
|
+
|
|
92
|
+
getStores(): WalletStorageInfo[]
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Snapshot of the current state of a storage provider configured for an `WalletStorageManager`.
|
|
97
|
+
*/
|
|
98
|
+
export interface WalletStorageInfo {
|
|
99
|
+
isActive: boolean
|
|
100
|
+
isEnabled: boolean
|
|
101
|
+
isBackup: boolean
|
|
102
|
+
isConflicting: boolean
|
|
103
|
+
userId: number
|
|
104
|
+
storageIdentityKey: string
|
|
105
|
+
storageName: string
|
|
106
|
+
storageClass: string
|
|
91
107
|
}
|
|
92
108
|
|
|
93
109
|
/**
|
|
@@ -33,6 +33,10 @@ import { purgeDataIdb } from './methods/purgeDataIdb'
|
|
|
33
33
|
|
|
34
34
|
export interface StorageIdbOptions extends StorageProviderOptions {}
|
|
35
35
|
|
|
36
|
+
/**
|
|
37
|
+
* This class implements the `StorageProvider` interface using IndexedDB,
|
|
38
|
+
* via the promises wrapper package `idb`.
|
|
39
|
+
*/
|
|
36
40
|
export class StorageIdb extends StorageProvider implements sdk.WalletStorageProvider {
|
|
37
41
|
dbName: string
|
|
38
42
|
db?: IDBPDatabase<StorageIdbSchema>
|
|
@@ -42,10 +46,6 @@ export class StorageIdb extends StorageProvider implements sdk.WalletStorageProv
|
|
|
42
46
|
this.dbName = `wallet-toolbox-${this.chain}net`
|
|
43
47
|
}
|
|
44
48
|
|
|
45
|
-
override adminStats(adminIdentityKey: string): Promise<StorageAdminStats> {
|
|
46
|
-
throw new Error('Method not implemented.')
|
|
47
|
-
}
|
|
48
|
-
|
|
49
49
|
/**
|
|
50
50
|
* This method must be called at least once before any other method accesses the database,
|
|
51
51
|
* and each time the schema may have updated.
|
|
@@ -2299,4 +2299,8 @@ export class StorageIdb extends StorageProvider implements sdk.WalletStorageProv
|
|
|
2299
2299
|
if (!rawTx) return
|
|
2300
2300
|
t.rawTx = rawTx
|
|
2301
2301
|
}
|
|
2302
|
+
|
|
2303
|
+
async adminStats(adminIdentityKey: string): Promise<StorageAdminStats> {
|
|
2304
|
+
throw new Error('Method intentionally not implemented for personal storage.')
|
|
2305
|
+
}
|
|
2302
2306
|
}
|
|
@@ -1317,14 +1317,14 @@ select
|
|
|
1317
1317
|
txUnfailWeek,
|
|
1318
1318
|
txUnfailMonth,
|
|
1319
1319
|
txUnfailTotal,
|
|
1320
|
-
satoshisDefaultDay,
|
|
1321
|
-
satoshisDefaultWeek,
|
|
1322
|
-
satoshisDefaultMonth,
|
|
1323
|
-
satoshisDefaultTotal,
|
|
1324
|
-
satoshisOtherDay,
|
|
1325
|
-
satoshisOtherWeek,
|
|
1326
|
-
satoshisOtherMonth,
|
|
1327
|
-
satoshisOtherTotal,
|
|
1320
|
+
satoshisDefaultDay: Number(satoshisDefaultDay),
|
|
1321
|
+
satoshisDefaultWeek: Number(satoshisDefaultWeek),
|
|
1322
|
+
satoshisDefaultMonth: Number(satoshisDefaultMonth),
|
|
1323
|
+
satoshisDefaultTotal: Number(satoshisDefaultTotal),
|
|
1324
|
+
satoshisOtherDay: Number(satoshisOtherDay),
|
|
1325
|
+
satoshisOtherWeek: Number(satoshisOtherWeek),
|
|
1326
|
+
satoshisOtherMonth: Number(satoshisOtherMonth),
|
|
1327
|
+
satoshisOtherTotal: Number(satoshisOtherTotal),
|
|
1328
1328
|
basketsDay,
|
|
1329
1329
|
basketsWeek,
|
|
1330
1330
|
basketsMonth,
|
|
@@ -703,4 +703,45 @@ export class WalletStorageManager implements sdk.WalletStorage {
|
|
|
703
703
|
|
|
704
704
|
return log
|
|
705
705
|
}
|
|
706
|
+
|
|
707
|
+
getStores(): sdk.WalletStorageInfo[] {
|
|
708
|
+
const stores: sdk.WalletStorageInfo[] = []
|
|
709
|
+
if (this._active) {
|
|
710
|
+
stores.push({
|
|
711
|
+
isActive: true,
|
|
712
|
+
isEnabled: this.isActiveEnabled,
|
|
713
|
+
isBackup: false,
|
|
714
|
+
isConflicting: false,
|
|
715
|
+
userId: this._active.user!.userId,
|
|
716
|
+
storageIdentityKey: this._active.settings!.storageIdentityKey,
|
|
717
|
+
storageName: this._active.settings!.storageName,
|
|
718
|
+
storageClass: this._active.storage.constructor.name
|
|
719
|
+
})
|
|
720
|
+
}
|
|
721
|
+
for (const store of this._conflictingActives || []) {
|
|
722
|
+
stores.push({
|
|
723
|
+
isActive: true,
|
|
724
|
+
isEnabled: false,
|
|
725
|
+
isBackup: false,
|
|
726
|
+
isConflicting: true,
|
|
727
|
+
userId: store.user!.userId,
|
|
728
|
+
storageIdentityKey: store.settings!.storageIdentityKey,
|
|
729
|
+
storageName: store.settings!.storageName,
|
|
730
|
+
storageClass: store.storage.constructor.name
|
|
731
|
+
})
|
|
732
|
+
}
|
|
733
|
+
for (const store of this._backups || []) {
|
|
734
|
+
stores.push({
|
|
735
|
+
isActive: false,
|
|
736
|
+
isEnabled: false,
|
|
737
|
+
isBackup: true,
|
|
738
|
+
isConflicting: false,
|
|
739
|
+
userId: store.user!.userId,
|
|
740
|
+
storageIdentityKey: store.settings!.storageIdentityKey,
|
|
741
|
+
storageName: store.settings!.storageName,
|
|
742
|
+
storageClass: store.storage.constructor.name
|
|
743
|
+
})
|
|
744
|
+
}
|
|
745
|
+
return stores
|
|
746
|
+
}
|
|
706
747
|
}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { before } from 'node:test'
|
|
2
|
-
import { _tu } from '../../../test/utils/TestUtilsWalletStorage'
|
|
2
|
+
import { _tu, TestWalletOnly } from '../../../test/utils/TestUtilsWalletStorage'
|
|
3
3
|
import { Setup } from '../../Setup'
|
|
4
4
|
import { StorageKnex } from '../StorageKnex'
|
|
5
|
+
import { AuthFetch, WalletInterface } from '@bsv/sdk'
|
|
6
|
+
import { StorageAdminStats, StorageClient } from '../index.client'
|
|
5
7
|
|
|
6
8
|
describe('storage adminStats tests', () => {
|
|
7
9
|
jest.setTimeout(99999999)
|
|
@@ -16,16 +18,68 @@ describe('storage adminStats tests', () => {
|
|
|
16
18
|
feeModel: { model: 'sat/kb', value: 1 }
|
|
17
19
|
})
|
|
18
20
|
|
|
21
|
+
let setup: TestWalletOnly
|
|
22
|
+
let nextId = 0
|
|
23
|
+
|
|
19
24
|
beforeAll(async () => {
|
|
20
25
|
await storage.makeAvailable()
|
|
26
|
+
|
|
27
|
+
setup = await _tu.createTestWalletWithStorageClient({
|
|
28
|
+
chain: 'main',
|
|
29
|
+
rootKeyHex: env.devKeys[env.identityKey]
|
|
30
|
+
})
|
|
21
31
|
})
|
|
22
32
|
afterAll(async () => {
|
|
23
33
|
await storage.destroy()
|
|
34
|
+
await setup.wallet.destroy()
|
|
24
35
|
})
|
|
25
36
|
|
|
26
|
-
test('0 adminStats', async () => {
|
|
37
|
+
test('0 adminStats StorageKnex', async () => {
|
|
27
38
|
const r = await storage.adminStats(env.identityKey)
|
|
28
39
|
expect(r.requestedBy).toBe(env.identityKey)
|
|
29
40
|
expect(r.usersTotal).toBeGreaterThan(0)
|
|
30
41
|
})
|
|
42
|
+
|
|
43
|
+
test('1 adminStats StorageServer via RPC', async () => {
|
|
44
|
+
const authFetch = new AuthFetch(setup.wallet)
|
|
45
|
+
const endpointUrl =
|
|
46
|
+
setup.chain === 'main' ? 'https://storage.babbage.systems' : 'https://staging-storage.babbage.systems'
|
|
47
|
+
|
|
48
|
+
const id = nextId++
|
|
49
|
+
const body = {
|
|
50
|
+
jsonrpc: '2.0',
|
|
51
|
+
method: 'adminStats',
|
|
52
|
+
params: [env.identityKey],
|
|
53
|
+
id
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
let response: Response
|
|
57
|
+
try {
|
|
58
|
+
response = await authFetch.fetch(endpointUrl, {
|
|
59
|
+
method: 'POST',
|
|
60
|
+
headers: { 'Content-Type': 'application/json' },
|
|
61
|
+
body: JSON.stringify(body)
|
|
62
|
+
})
|
|
63
|
+
} catch (eu: unknown) {
|
|
64
|
+
throw eu
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (!response.ok) {
|
|
68
|
+
throw new Error(`WalletStorageClient rpcCall: network error ${response.status} ${response.statusText}`)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const json = await response.json()
|
|
72
|
+
if (json.error) {
|
|
73
|
+
const { code, message, data } = json.error
|
|
74
|
+
const err = new Error(`RPC Error: ${message}`)
|
|
75
|
+
// You could attach more info here if you like:
|
|
76
|
+
;(err as any).code = code
|
|
77
|
+
;(err as any).data = data
|
|
78
|
+
throw err
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const r = json.result as StorageAdminStats
|
|
82
|
+
expect(r.requestedBy).toBe(env.identityKey)
|
|
83
|
+
expect(r.usersTotal).toBeGreaterThan(0)
|
|
84
|
+
})
|
|
31
85
|
})
|
package/src/storage/index.all.ts
CHANGED
|
@@ -5,6 +5,7 @@ export * from './remoting/StorageClient'
|
|
|
5
5
|
export * from './remoting/StorageServer'
|
|
6
6
|
export * from './schema/KnexMigrations'
|
|
7
7
|
export * from './StorageKnex'
|
|
8
|
+
export * from './StorageIdb'
|
|
8
9
|
export * from './schema/tables/index'
|
|
9
10
|
export * from './schema/entities/index'
|
|
10
11
|
export * as sync from './sync'
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { Beef, WalletOutput } from '@bsv/sdk'
|
|
1
|
+
import { Beef, PrivateKey, SignActionArgs, WalletOutput } from '@bsv/sdk'
|
|
2
2
|
import { sdk, Services, Setup, StorageKnex, TableUser } from '../../../src'
|
|
3
3
|
import { _tu, TuEnv } from '../../utils/TestUtilsWalletStorage'
|
|
4
4
|
import { specOpInvalidChange, ValidListOutputsArgs, WERR_REVIEW_ACTIONS } from '../../../src/sdk'
|
|
5
5
|
import {
|
|
6
6
|
burnOneSatTestOutput,
|
|
7
|
+
createMainReviewSetup,
|
|
7
8
|
createOneSatTestOutput,
|
|
8
9
|
createSetup,
|
|
9
10
|
doubleSpendOldChange,
|
|
@@ -203,49 +204,74 @@ describe('localWallet2 tests', () => {
|
|
|
203
204
|
await storage.destroy()
|
|
204
205
|
})
|
|
205
206
|
|
|
206
|
-
test('8
|
|
207
|
+
test('8 Beef verifier', async () => {
|
|
207
208
|
const setup = await createSetup(chain, options)
|
|
208
|
-
|
|
209
|
+
// replace bb with beef to test
|
|
210
|
+
const bb = new Beef().toBinary()
|
|
211
|
+
const beef = Beef.fromBinary(bb)
|
|
209
212
|
console.log(beef.toLogString())
|
|
210
213
|
const ok = await beef.verify(await setup.services.getChainTracker())
|
|
211
214
|
await setup.wallet.destroy()
|
|
212
215
|
})
|
|
213
|
-
})
|
|
214
216
|
|
|
215
|
-
async
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
217
|
+
test.skip('9 received payment from wif and outpoint', async () => {
|
|
218
|
+
const setup = await createSetup(chain, options)
|
|
219
|
+
console.log(`active store ${setup.wallet.storage.getActiveStore()}`)
|
|
220
|
+
if (!setup.wallet.storage.isActiveEnabled) throw new Error('Active storage is not enabled.')
|
|
221
|
+
|
|
222
|
+
const pk = PrivateKey.fromWif('L4ZRWA...Nw4Brt8rvJLRZegPF2oiBKJaxUgr4e')
|
|
223
|
+
const outpoint = { txid: '5e2965a50618425af21bebddb9aa60c3e12f64c8e1eb44b6589273455a9760e9', vout: 0 }
|
|
224
|
+
const address = pk.toAddress()
|
|
225
|
+
console.log(`address: ${address.toString()}`)
|
|
226
|
+
|
|
227
|
+
const inputBEEF = await setup.activeStorage.getBeefForTransaction(outpoint.txid, { ignoreStorage: true })
|
|
228
|
+
const btx = inputBEEF.findTxid(outpoint.txid)
|
|
229
|
+
const satoshis = btx!.tx!.outputs[0]!.satoshis!
|
|
230
|
+
|
|
231
|
+
const unlock = Setup.getUnlockP2PKH(pk, satoshis)
|
|
232
|
+
|
|
233
|
+
const label = 'inputBrayden257'
|
|
234
|
+
|
|
235
|
+
const car = await setup.wallet.createAction({
|
|
236
|
+
inputBEEF: inputBEEF.toBinary(),
|
|
237
|
+
inputs: [
|
|
238
|
+
{
|
|
239
|
+
outpoint: `${outpoint.txid}.${outpoint.vout}`,
|
|
240
|
+
unlockingScriptLength: 108,
|
|
241
|
+
inputDescription: label
|
|
242
|
+
}
|
|
243
|
+
],
|
|
244
|
+
labels: [label],
|
|
245
|
+
description: label
|
|
246
|
+
})
|
|
236
247
|
|
|
237
|
-
const
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
248
|
+
const st = car.signableTransaction!
|
|
249
|
+
const beef = Beef.fromBinary(st.tx)
|
|
250
|
+
const tx = beef.findAtomicTransaction(beef.txs.slice(-1)[0].txid)!
|
|
251
|
+
tx.inputs[0].unlockingScriptTemplate = unlock
|
|
252
|
+
await tx.sign()
|
|
253
|
+
const unlockingScript = tx.inputs[0].unlockingScript!.toHex()
|
|
254
|
+
|
|
255
|
+
const signArgs: SignActionArgs = {
|
|
256
|
+
reference: st.reference,
|
|
257
|
+
spends: { 0: { unlockingScript } },
|
|
258
|
+
options: {
|
|
259
|
+
acceptDelayedBroadcast: false
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
const sar = await setup.wallet.signAction(signArgs)
|
|
264
|
+
|
|
265
|
+
{
|
|
266
|
+
const beef = Beef.fromBinary(sar.tx!)
|
|
267
|
+
const txid = sar.txid!
|
|
268
|
+
|
|
269
|
+
console.log(`
|
|
270
|
+
BEEF
|
|
271
|
+
${beef.toHex()}
|
|
272
|
+
${beef.toLogString()}
|
|
273
|
+
`)
|
|
274
|
+
}
|
|
275
|
+
await setup.wallet.destroy()
|
|
276
|
+
})
|
|
277
|
+
})
|
|
@@ -44,10 +44,12 @@ describe('operations.man tests', () => {
|
|
|
44
44
|
let r = await storage.listOutputs(auth, vargs)
|
|
45
45
|
if (r.totalOutputs > 0) {
|
|
46
46
|
const total: number = r.outputs.reduce((s, o) => (s += o.satoshis), 0)
|
|
47
|
-
|
|
47
|
+
let l = `userId ${userId}: ${r.totalOutputs} utxos updated, total ${total}, ${user.identityKey}\n`
|
|
48
48
|
for (const o of r.outputs) {
|
|
49
|
-
|
|
49
|
+
l += ` ${o.outpoint} ${o.satoshis} now ${o.spendable ? 'spendable' : 'spent'}\n`
|
|
50
50
|
}
|
|
51
|
+
console.log(l)
|
|
52
|
+
log += l
|
|
51
53
|
withInvalid[userId] = { user, outputs: r.outputs, total }
|
|
52
54
|
}
|
|
53
55
|
}
|
|
@@ -120,7 +122,7 @@ describe('operations.man tests', () => {
|
|
|
120
122
|
|
|
121
123
|
test('2 review and unfail false invalids', async () => {
|
|
122
124
|
const { env, storage, services } = await createMainReviewSetup()
|
|
123
|
-
let offset =
|
|
125
|
+
let offset = 700
|
|
124
126
|
const limit = 100
|
|
125
127
|
let allUnfails: number[] = []
|
|
126
128
|
for (;;) {
|
|
@@ -11,8 +11,18 @@ import {
|
|
|
11
11
|
SignActionOptions,
|
|
12
12
|
SignActionResult
|
|
13
13
|
} from '@bsv/sdk'
|
|
14
|
-
import {
|
|
15
|
-
|
|
14
|
+
import {
|
|
15
|
+
EntityProvenTxReq,
|
|
16
|
+
ScriptTemplateBRC29,
|
|
17
|
+
sdk,
|
|
18
|
+
Services,
|
|
19
|
+
Setup,
|
|
20
|
+
StorageKnex,
|
|
21
|
+
verifyOne,
|
|
22
|
+
verifyTruthy,
|
|
23
|
+
wait
|
|
24
|
+
} from '../../src'
|
|
25
|
+
import { _tu, logger, TestWalletNoSetup, TuEnv } from './TestUtilsWalletStorage'
|
|
16
26
|
import { validateCreateActionArgs, ValidCreateActionArgs } from '../../src/sdk'
|
|
17
27
|
import { setDisableDoubleSpendCheckForTest } from '../../src/storage/methods/createAction'
|
|
18
28
|
|
|
@@ -329,3 +339,25 @@ export async function doubleSpendOldChange(
|
|
|
329
339
|
const sar = await setup.wallet.signAction(signArgs)
|
|
330
340
|
return sar
|
|
331
341
|
}
|
|
342
|
+
|
|
343
|
+
export async function createMainReviewSetup(): Promise<{
|
|
344
|
+
env: TuEnv
|
|
345
|
+
storage: StorageKnex
|
|
346
|
+
services: Services
|
|
347
|
+
}> {
|
|
348
|
+
const env = _tu.getEnv('main')
|
|
349
|
+
const knex = Setup.createMySQLKnex(process.env.MAIN_CLOUD_MYSQL_CONNECTION!)
|
|
350
|
+
const storage = new StorageKnex({
|
|
351
|
+
chain: env.chain,
|
|
352
|
+
knex: knex,
|
|
353
|
+
commissionSatoshis: 0,
|
|
354
|
+
commissionPubKeyHex: undefined,
|
|
355
|
+
feeModel: { model: 'sat/kb', value: 1 }
|
|
356
|
+
})
|
|
357
|
+
const servicesOptions = Services.createDefaultOptions(env.chain)
|
|
358
|
+
if (env.whatsonchainApiKey) servicesOptions.whatsOnChainApiKey = env.whatsonchainApiKey
|
|
359
|
+
const services = new Services(servicesOptions)
|
|
360
|
+
storage.setServices(services)
|
|
361
|
+
await storage.makeAvailable()
|
|
362
|
+
return { env, storage, services }
|
|
363
|
+
}
|