@bsv/wallet-toolbox 1.3.2 → 1.3.4
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/CHANGELOG.md +6 -0
- package/docs/client.md +97 -28
- package/docs/services.md +2 -1
- package/docs/setup.md +404 -14
- package/docs/storage.md +720 -42
- package/docs/wallet.md +97 -28
- package/out/src/CWIStyleWalletManager.d.ts.map +1 -1
- package/out/src/CWIStyleWalletManager.js +12 -5
- package/out/src/CWIStyleWalletManager.js.map +1 -1
- package/out/src/Setup.d.ts +2 -69
- package/out/src/Setup.d.ts.map +1 -1
- package/out/src/Setup.js.map +1 -1
- package/out/src/SetupClient.d.ts +126 -0
- package/out/src/SetupClient.d.ts.map +1 -0
- package/out/src/SetupClient.js +220 -0
- package/out/src/SetupClient.js.map +1 -0
- package/out/src/SetupWallet.d.ts +100 -0
- package/out/src/SetupWallet.d.ts.map +1 -0
- package/out/src/{storage/schema/tables/Certificate.js → SetupWallet.js} +1 -1
- package/out/src/SetupWallet.js.map +1 -0
- package/out/src/index.all.d.ts +2 -0
- package/out/src/index.all.d.ts.map +1 -1
- package/out/src/index.all.js +2 -0
- package/out/src/index.all.js.map +1 -1
- package/out/src/index.client.d.ts +1 -0
- package/out/src/index.client.d.ts.map +1 -1
- package/out/src/index.client.js +1 -0
- package/out/src/index.client.js.map +1 -1
- package/out/src/monitor/Monitor.d.ts.map +1 -1
- package/out/src/monitor/Monitor.js +4 -0
- package/out/src/monitor/Monitor.js.map +1 -1
- package/out/src/monitor/MonitorDaemon.d.ts.map +1 -1
- package/out/src/monitor/MonitorDaemon.js +0 -3
- package/out/src/monitor/MonitorDaemon.js.map +1 -1
- package/out/src/monitor/tasks/TaskUnFail.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskUnFail.js +1 -2
- package/out/src/monitor/tasks/TaskUnFail.js.map +1 -1
- package/out/src/sdk/WalletServices.interfaces.d.ts +9 -0
- package/out/src/sdk/WalletServices.interfaces.d.ts.map +1 -1
- package/out/src/services/Services.d.ts +2 -1
- package/out/src/services/Services.d.ts.map +1 -1
- package/out/src/services/Services.js +8 -0
- package/out/src/services/Services.js.map +1 -1
- package/out/src/services/__tests/postBeef.test.js +1 -1
- package/out/src/services/__tests/postBeef.test.js.map +1 -1
- package/out/src/storage/StorageIdb.d.ts +203 -0
- package/out/src/storage/StorageIdb.d.ts.map +1 -0
- package/out/src/storage/StorageIdb.js +2289 -0
- package/out/src/storage/StorageIdb.js.map +1 -0
- package/out/src/storage/StorageKnex.d.ts +6 -6
- package/out/src/storage/StorageKnex.d.ts.map +1 -1
- package/out/src/storage/StorageKnex.js +9 -29
- package/out/src/storage/StorageKnex.js.map +1 -1
- package/out/src/storage/StorageProvider.d.ts +3 -1
- package/out/src/storage/StorageProvider.d.ts.map +1 -1
- package/out/src/storage/StorageProvider.js +22 -0
- package/out/src/storage/StorageProvider.js.map +1 -1
- package/out/src/storage/StorageReader.d.ts +1 -1
- package/out/src/storage/StorageReader.d.ts.map +1 -1
- package/out/src/storage/StorageReader.js +5 -0
- package/out/src/storage/StorageReader.js.map +1 -1
- package/out/src/storage/__test/StorageIdb.test.d.ts +2 -0
- package/out/src/storage/__test/StorageIdb.test.d.ts.map +1 -0
- package/out/src/storage/__test/StorageIdb.test.js +16 -0
- package/out/src/storage/__test/StorageIdb.test.js.map +1 -0
- package/out/src/storage/methods/ListActionsSpecOp.d.ts +16 -0
- package/out/src/storage/methods/ListActionsSpecOp.d.ts.map +1 -0
- package/out/src/storage/methods/ListActionsSpecOp.js +40 -0
- package/out/src/storage/methods/ListActionsSpecOp.js.map +1 -0
- package/out/src/storage/methods/ListOutputsSpecOp.d.ts +26 -0
- package/out/src/storage/methods/ListOutputsSpecOp.d.ts.map +1 -0
- package/out/src/storage/methods/ListOutputsSpecOp.js +71 -0
- package/out/src/storage/methods/ListOutputsSpecOp.js.map +1 -0
- package/out/src/storage/methods/listActionsIdb.d.ts +5 -0
- package/out/src/storage/methods/listActionsIdb.d.ts.map +1 -0
- package/out/src/storage/methods/listActionsIdb.js +155 -0
- package/out/src/storage/methods/listActionsIdb.js.map +1 -0
- package/out/src/storage/methods/{listActions.d.ts → listActionsKnex.d.ts} +1 -1
- package/out/src/storage/methods/listActionsKnex.d.ts.map +1 -0
- package/out/src/storage/methods/{listActions.js → listActionsKnex.js} +3 -34
- package/out/src/storage/methods/listActionsKnex.js.map +1 -0
- package/out/src/storage/methods/listOutputsIdb.d.ts +5 -0
- package/out/src/storage/methods/listOutputsIdb.d.ts.map +1 -0
- package/out/src/storage/methods/listOutputsIdb.js +181 -0
- package/out/src/storage/methods/listOutputsIdb.js.map +1 -0
- package/out/src/storage/methods/{listOutputs.d.ts → listOutputsKnex.d.ts} +1 -1
- package/out/src/storage/methods/listOutputsKnex.d.ts.map +1 -0
- package/out/src/storage/methods/{listOutputs.js → listOutputsKnex.js} +7 -76
- package/out/src/storage/methods/listOutputsKnex.js.map +1 -0
- package/out/src/storage/methods/purgeDataIdb.d.ts +4 -0
- package/out/src/storage/methods/purgeDataIdb.d.ts.map +1 -0
- package/out/src/storage/methods/purgeDataIdb.js +9 -0
- package/out/src/storage/methods/purgeDataIdb.js.map +1 -0
- package/out/src/storage/methods/reviewStatus.d.ts +11 -0
- package/out/src/storage/methods/reviewStatus.d.ts.map +1 -1
- package/out/src/storage/methods/reviewStatus.js +11 -0
- package/out/src/storage/methods/reviewStatus.js.map +1 -1
- package/out/src/storage/methods/reviewStatusIdb.d.ts +20 -0
- package/out/src/storage/methods/reviewStatusIdb.d.ts.map +1 -0
- package/out/src/storage/methods/reviewStatusIdb.js +35 -0
- package/out/src/storage/methods/reviewStatusIdb.js.map +1 -0
- package/out/src/storage/schema/StorageIdbSchema.d.ts +133 -0
- package/out/src/storage/schema/StorageIdbSchema.d.ts.map +1 -0
- package/out/src/storage/schema/{tables/CertificateField.js → StorageIdbSchema.js} +1 -1
- package/out/src/storage/schema/StorageIdbSchema.js.map +1 -0
- package/out/src/storage/schema/entities/__tests/ProvenTxTests.test.js +1 -0
- package/out/src/storage/schema/entities/__tests/ProvenTxTests.test.js.map +1 -1
- package/out/src/storage/schema/tables/{Certificate.d.ts → TableCertificate.d.ts} +1 -1
- package/out/src/storage/schema/tables/TableCertificate.d.ts.map +1 -0
- package/out/src/storage/schema/tables/TableCertificate.js +3 -0
- package/out/src/storage/schema/tables/TableCertificate.js.map +1 -0
- package/out/src/storage/schema/tables/{CertificateField.d.ts → TableCertificateField.d.ts} +1 -1
- package/out/src/storage/schema/tables/TableCertificateField.d.ts.map +1 -0
- package/out/src/storage/schema/tables/TableCertificateField.js +3 -0
- package/out/src/storage/schema/tables/TableCertificateField.js.map +1 -0
- package/out/src/storage/schema/tables/{Commission.d.ts → TableCommission.d.ts} +1 -1
- package/out/src/storage/schema/tables/TableCommission.d.ts.map +1 -0
- package/out/src/storage/schema/tables/TableCommission.js +3 -0
- package/out/src/storage/schema/tables/TableCommission.js.map +1 -0
- package/out/src/storage/schema/tables/{MonitorEvent.d.ts → TableMonitorEvent.d.ts} +1 -1
- package/out/src/storage/schema/tables/TableMonitorEvent.d.ts.map +1 -0
- package/out/src/storage/schema/tables/TableMonitorEvent.js +3 -0
- package/out/src/storage/schema/tables/TableMonitorEvent.js.map +1 -0
- package/out/src/storage/schema/tables/{Output.d.ts → TableOutput.d.ts} +1 -1
- package/out/src/storage/schema/tables/TableOutput.d.ts.map +1 -0
- package/out/src/storage/schema/tables/{Output.js → TableOutput.js} +1 -1
- package/out/src/storage/schema/tables/TableOutput.js.map +1 -0
- package/out/src/storage/schema/tables/{OutputBasket.d.ts → TableOutputBasket.d.ts} +1 -1
- package/out/src/storage/schema/tables/TableOutputBasket.d.ts.map +1 -0
- package/out/src/storage/schema/tables/TableOutputBasket.js +3 -0
- package/out/src/storage/schema/tables/TableOutputBasket.js.map +1 -0
- package/out/src/storage/schema/tables/{OutputTag.d.ts → TableOutputTag.d.ts} +1 -1
- package/out/src/storage/schema/tables/TableOutputTag.d.ts.map +1 -0
- package/out/src/storage/schema/tables/{MonitorEvent.js → TableOutputTag.js} +1 -1
- package/out/src/storage/schema/tables/TableOutputTag.js.map +1 -0
- package/out/src/storage/schema/tables/{OutputTagMap.d.ts → TableOutputTagMap.d.ts} +1 -1
- package/out/src/storage/schema/tables/TableOutputTagMap.d.ts.map +1 -0
- package/out/src/storage/schema/tables/TableOutputTagMap.js +3 -0
- package/out/src/storage/schema/tables/TableOutputTagMap.js.map +1 -0
- package/out/src/storage/schema/tables/{ProvenTx.d.ts → TableProvenTx.d.ts} +1 -1
- package/out/src/storage/schema/tables/TableProvenTx.d.ts.map +1 -0
- package/out/src/storage/schema/tables/{Commission.js → TableProvenTx.js} +1 -1
- package/out/src/storage/schema/tables/TableProvenTx.js.map +1 -0
- package/out/src/storage/schema/tables/{ProvenTxReq.d.ts → TableProvenTxReq.d.ts} +1 -1
- package/out/src/storage/schema/tables/TableProvenTxReq.d.ts.map +1 -0
- package/out/src/storage/schema/tables/TableProvenTxReq.js +3 -0
- package/out/src/storage/schema/tables/TableProvenTxReq.js.map +1 -0
- package/out/src/storage/schema/tables/TableSettings.d.ts +1 -1
- package/out/src/storage/schema/tables/TableSettings.d.ts.map +1 -1
- package/out/src/storage/schema/tables/{SyncState.d.ts → TableSyncState.d.ts} +1 -1
- package/out/src/storage/schema/tables/TableSyncState.d.ts.map +1 -0
- package/out/src/storage/schema/tables/TableSyncState.js +3 -0
- package/out/src/storage/schema/tables/TableSyncState.js.map +1 -0
- package/out/src/storage/schema/tables/{Transaction.d.ts → TableTransaction.d.ts} +1 -1
- package/out/src/storage/schema/tables/TableTransaction.d.ts.map +1 -0
- package/out/src/storage/schema/tables/{Transaction.js → TableTransaction.js} +1 -1
- package/out/src/storage/schema/tables/TableTransaction.js.map +1 -0
- package/out/src/storage/schema/tables/{TxLabel.d.ts → TableTxLabel.d.ts} +1 -1
- package/out/src/storage/schema/tables/TableTxLabel.d.ts.map +1 -0
- package/out/src/storage/schema/tables/{OutputBasket.js → TableTxLabel.js} +1 -1
- package/out/src/storage/schema/tables/TableTxLabel.js.map +1 -0
- package/out/src/storage/schema/tables/{TxLabelMap.d.ts → TableTxLabelMap.d.ts} +1 -1
- package/out/src/storage/schema/tables/TableTxLabelMap.d.ts.map +1 -0
- package/out/src/storage/schema/tables/TableTxLabelMap.js +3 -0
- package/out/src/storage/schema/tables/TableTxLabelMap.js.map +1 -0
- package/out/src/storage/schema/tables/{User.d.ts → TableUser.d.ts} +1 -1
- package/out/src/storage/schema/tables/TableUser.d.ts.map +1 -0
- package/out/src/storage/schema/tables/{SyncState.js → TableUser.js} +1 -1
- package/out/src/storage/schema/tables/TableUser.js.map +1 -0
- package/out/src/storage/schema/tables/index.d.ts +15 -15
- package/out/src/storage/schema/tables/index.d.ts.map +1 -1
- package/out/src/storage/schema/tables/index.js +15 -15
- package/out/src/storage/schema/tables/index.js.map +1 -1
- package/out/test/Wallet/local/localWallet2.man.test.js +4 -0
- package/out/test/Wallet/local/localWallet2.man.test.js.map +1 -1
- package/out/test/Wallet/support/operations.man.test.d.ts +2 -0
- package/out/test/Wallet/support/operations.man.test.d.ts.map +1 -0
- package/out/test/Wallet/support/{opers1.man.test.js → operations.man.test.js} +41 -6
- package/out/test/Wallet/support/operations.man.test.js.map +1 -0
- package/out/test/storage/find.test.js +1 -1
- package/out/test/storage/find.test.js.map +1 -1
- package/out/test/storage/idb/allocateChange.test.d.ts +2 -0
- package/out/test/storage/idb/allocateChange.test.d.ts.map +1 -0
- package/out/test/storage/idb/allocateChange.test.js +110 -0
- package/out/test/storage/idb/allocateChange.test.js.map +1 -0
- package/out/test/storage/idb/count.test.d.ts +2 -0
- package/out/test/storage/idb/count.test.d.ts.map +1 -0
- package/out/test/storage/idb/count.test.js +129 -0
- package/out/test/storage/idb/count.test.js.map +1 -0
- package/out/test/storage/idb/find.test.d.ts +2 -0
- package/out/test/storage/idb/find.test.d.ts.map +1 -0
- package/out/test/storage/idb/find.test.js +131 -0
- package/out/test/storage/idb/find.test.js.map +1 -0
- package/out/test/storage/idb/idbSpeed.test.d.ts +2 -0
- package/out/test/storage/idb/idbSpeed.test.d.ts.map +1 -0
- package/out/test/storage/idb/idbSpeed.test.js +29 -0
- package/out/test/storage/idb/idbSpeed.test.js.map +1 -0
- package/out/test/storage/idb/insert.test.d.ts +2 -0
- package/out/test/storage/idb/insert.test.d.ts.map +1 -0
- package/out/test/storage/idb/insert.test.js +242 -0
- package/out/test/storage/idb/insert.test.js.map +1 -0
- package/out/test/storage/idb/transactionAbort.test.d.ts +2 -0
- package/out/test/storage/idb/transactionAbort.test.d.ts.map +1 -0
- package/out/test/storage/idb/transactionAbort.test.js +97 -0
- package/out/test/storage/idb/transactionAbort.test.js.map +1 -0
- package/out/test/storage/idb/update.test.d.ts +2 -0
- package/out/test/storage/idb/update.test.d.ts.map +1 -0
- package/out/test/storage/idb/update.test.js +902 -0
- package/out/test/storage/idb/update.test.js.map +1 -0
- package/out/test/storage/update.test.js +2 -2
- package/out/test/storage/update.test.js.map +1 -1
- package/out/test/utils/TestUtilsWalletStorage.d.ts +24 -1
- package/out/test/utils/TestUtilsWalletStorage.d.ts.map +1 -1
- package/out/test/utils/TestUtilsWalletStorage.js +147 -3
- package/out/test/utils/TestUtilsWalletStorage.js.map +1 -1
- package/out/test/wallet/list/listActions.test.d.ts +1 -1
- package/out/test/wallet/list/listActions.test.d.ts.map +1 -1
- package/out/test/wallet/list/listActions.test.js +9 -3
- package/out/test/wallet/list/listActions.test.js.map +1 -1
- package/out/test/wallet/list/listOutputs.test.d.ts +1 -1
- package/out/test/wallet/list/listOutputs.test.d.ts.map +1 -1
- package/out/test/wallet/list/listOutputs.test.js +34 -219
- package/out/test/wallet/list/listOutputs.test.js.map +1 -1
- package/out/tsconfig.all.tsbuildinfo +1 -1
- package/package.json +3 -1
- package/src/CWIStyleWalletManager.ts +12 -5
- package/src/Setup.ts +1 -71
- package/src/SetupClient.ts +312 -0
- package/src/SetupWallet.ts +105 -0
- package/src/index.all.ts +2 -0
- package/src/index.client.ts +1 -0
- package/src/monitor/Monitor.ts +4 -0
- package/src/monitor/MonitorDaemon.ts +0 -1
- package/src/monitor/tasks/TaskUnFail.ts +3 -4
- package/src/sdk/WalletServices.interfaces.ts +10 -0
- package/src/services/Services.ts +13 -1
- package/src/services/__tests/postBeef.test.ts +1 -1
- package/src/storage/StorageIdb.ts +2298 -0
- package/src/storage/StorageKnex.ts +7 -32
- package/src/storage/StorageProvider.ts +28 -0
- package/src/storage/StorageReader.ts +5 -1
- package/src/storage/__test/StorageIdb.test.ts +15 -0
- package/src/storage/methods/ListActionsSpecOp.ts +68 -0
- package/src/storage/methods/ListOutputsSpecOp.ts +125 -0
- package/src/storage/methods/listActionsIdb.ts +181 -0
- package/src/storage/methods/{listActions.ts → listActionsKnex.ts} +2 -64
- package/src/storage/methods/listOutputsIdb.ts +199 -0
- package/src/storage/methods/{listOutputs.ts → listOutputsKnex.ts} +9 -133
- package/src/storage/methods/purgeDataIdb.ts +15 -0
- package/src/storage/methods/reviewStatus.ts +11 -0
- package/src/storage/methods/reviewStatusIdb.ts +43 -0
- package/src/storage/schema/StorageIdbSchema.ts +150 -0
- package/src/storage/schema/entities/__tests/ProvenTxTests.test.ts +2 -0
- package/src/storage/schema/tables/TableSettings.ts +1 -1
- package/src/storage/schema/tables/index.ts +15 -15
- package/test/Wallet/local/localWallet2.man.test.ts +5 -0
- package/test/Wallet/support/{opers1.man.test.ts → operations.man.test.ts} +43 -14
- package/test/storage/find.test.ts +1 -1
- package/test/storage/idb/allocateChange.test.ts +251 -0
- package/test/storage/idb/count.test.ts +158 -0
- package/test/storage/idb/find.test.ts +177 -0
- package/test/storage/idb/idbSpeed.test.ts +34 -0
- package/test/storage/idb/insert.test.ts +268 -0
- package/test/storage/idb/transactionAbort.test.ts +108 -0
- package/test/storage/idb/update.test.ts +1000 -0
- package/test/storage/update.test.ts +2 -2
- package/test/utils/TestUtilsWalletStorage.ts +188 -4
- package/test/wallet/list/listActions.test.ts +15 -5
- package/test/wallet/list/listOutputs.test.ts +29 -214
- package/out/src/storage/methods/listActions.d.ts.map +0 -1
- package/out/src/storage/methods/listActions.js.map +0 -1
- package/out/src/storage/methods/listOutputs.d.ts.map +0 -1
- package/out/src/storage/methods/listOutputs.js.map +0 -1
- package/out/src/storage/schema/tables/Certificate.d.ts.map +0 -1
- package/out/src/storage/schema/tables/Certificate.js.map +0 -1
- package/out/src/storage/schema/tables/CertificateField.d.ts.map +0 -1
- package/out/src/storage/schema/tables/CertificateField.js.map +0 -1
- package/out/src/storage/schema/tables/Commission.d.ts.map +0 -1
- package/out/src/storage/schema/tables/Commission.js.map +0 -1
- package/out/src/storage/schema/tables/MonitorEvent.d.ts.map +0 -1
- package/out/src/storage/schema/tables/MonitorEvent.js.map +0 -1
- package/out/src/storage/schema/tables/Output.d.ts.map +0 -1
- package/out/src/storage/schema/tables/Output.js.map +0 -1
- package/out/src/storage/schema/tables/OutputBasket.d.ts.map +0 -1
- package/out/src/storage/schema/tables/OutputBasket.js.map +0 -1
- package/out/src/storage/schema/tables/OutputTag.d.ts.map +0 -1
- package/out/src/storage/schema/tables/OutputTag.js +0 -3
- package/out/src/storage/schema/tables/OutputTag.js.map +0 -1
- package/out/src/storage/schema/tables/OutputTagMap.d.ts.map +0 -1
- package/out/src/storage/schema/tables/OutputTagMap.js +0 -3
- package/out/src/storage/schema/tables/OutputTagMap.js.map +0 -1
- package/out/src/storage/schema/tables/ProvenTx.d.ts.map +0 -1
- package/out/src/storage/schema/tables/ProvenTx.js +0 -3
- package/out/src/storage/schema/tables/ProvenTx.js.map +0 -1
- package/out/src/storage/schema/tables/ProvenTxReq.d.ts.map +0 -1
- package/out/src/storage/schema/tables/ProvenTxReq.js +0 -3
- package/out/src/storage/schema/tables/ProvenTxReq.js.map +0 -1
- package/out/src/storage/schema/tables/SyncState.d.ts.map +0 -1
- package/out/src/storage/schema/tables/SyncState.js.map +0 -1
- package/out/src/storage/schema/tables/Transaction.d.ts.map +0 -1
- package/out/src/storage/schema/tables/Transaction.js.map +0 -1
- package/out/src/storage/schema/tables/TxLabel.d.ts.map +0 -1
- package/out/src/storage/schema/tables/TxLabel.js +0 -3
- package/out/src/storage/schema/tables/TxLabel.js.map +0 -1
- package/out/src/storage/schema/tables/TxLabelMap.d.ts.map +0 -1
- package/out/src/storage/schema/tables/TxLabelMap.js +0 -3
- package/out/src/storage/schema/tables/TxLabelMap.js.map +0 -1
- package/out/src/storage/schema/tables/User.d.ts.map +0 -1
- package/out/src/storage/schema/tables/User.js +0 -3
- package/out/src/storage/schema/tables/User.js.map +0 -1
- package/out/test/Wallet/support/opers1.man.test.d.ts +0 -2
- package/out/test/Wallet/support/opers1.man.test.d.ts.map +0 -1
- package/out/test/Wallet/support/opers1.man.test.js.map +0 -1
- package/unlock-migrations.sh +0 -41
- /package/src/storage/schema/tables/{Certificate.ts → TableCertificate.ts} +0 -0
- /package/src/storage/schema/tables/{CertificateField.ts → TableCertificateField.ts} +0 -0
- /package/src/storage/schema/tables/{Commission.ts → TableCommission.ts} +0 -0
- /package/src/storage/schema/tables/{MonitorEvent.ts → TableMonitorEvent.ts} +0 -0
- /package/src/storage/schema/tables/{Output.ts → TableOutput.ts} +0 -0
- /package/src/storage/schema/tables/{OutputBasket.ts → TableOutputBasket.ts} +0 -0
- /package/src/storage/schema/tables/{OutputTag.ts → TableOutputTag.ts} +0 -0
- /package/src/storage/schema/tables/{OutputTagMap.ts → TableOutputTagMap.ts} +0 -0
- /package/src/storage/schema/tables/{ProvenTx.ts → TableProvenTx.ts} +0 -0
- /package/src/storage/schema/tables/{ProvenTxReq.ts → TableProvenTxReq.ts} +0 -0
- /package/src/storage/schema/tables/{SyncState.ts → TableSyncState.ts} +0 -0
- /package/src/storage/schema/tables/{Transaction.ts → TableTransaction.ts} +0 -0
- /package/src/storage/schema/tables/{TxLabel.ts → TableTxLabel.ts} +0 -0
- /package/src/storage/schema/tables/{TxLabelMap.ts → TableTxLabelMap.ts} +0 -0
- /package/src/storage/schema/tables/{User.ts → TableUser.ts} +0 -0
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { Beef, ListOutputsResult, OriginatorDomainNameStringUnder250Bytes, WalletOutput } from '@bsv/sdk'
|
|
2
|
+
import { TableOutput, TableOutputBasket, TableOutputTag } from '../index.client'
|
|
3
|
+
import { asString, sdk, verifyId, verifyOne } from '../../index.client'
|
|
4
|
+
import { getBasketToSpecOp, ListOutputsSpecOp } from './ListOutputsSpecOp'
|
|
5
|
+
import { StorageIdb } from '../StorageIdb'
|
|
6
|
+
import { TransactionStatus } from '../../sdk'
|
|
7
|
+
|
|
8
|
+
export async function listOutputsIdb(
|
|
9
|
+
storage: StorageIdb,
|
|
10
|
+
auth: sdk.AuthId,
|
|
11
|
+
vargs: sdk.ValidListOutputsArgs,
|
|
12
|
+
originator?: OriginatorDomainNameStringUnder250Bytes
|
|
13
|
+
): Promise<ListOutputsResult> {
|
|
14
|
+
const userId = verifyId(auth.userId)
|
|
15
|
+
const limit = vargs.limit
|
|
16
|
+
const offset = vargs.offset
|
|
17
|
+
|
|
18
|
+
const r: ListOutputsResult = {
|
|
19
|
+
totalOutputs: 0,
|
|
20
|
+
outputs: []
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/*
|
|
24
|
+
ListOutputsArgs {
|
|
25
|
+
basket: BasketStringUnder300Bytes
|
|
26
|
+
|
|
27
|
+
tags?: OutputTagStringUnder300Bytes[]
|
|
28
|
+
tagQueryMode?: 'all' | 'any' // default any
|
|
29
|
+
|
|
30
|
+
limit?: PositiveIntegerDefault10Max10000
|
|
31
|
+
offset?: PositiveIntegerOrZero
|
|
32
|
+
}
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
let specOp: ListOutputsSpecOp | undefined = undefined
|
|
36
|
+
let basketId: number | undefined = undefined
|
|
37
|
+
const basketsById: Record<number, TableOutputBasket> = {}
|
|
38
|
+
if (vargs.basket) {
|
|
39
|
+
let b = vargs.basket
|
|
40
|
+
specOp = getBasketToSpecOp()[b]
|
|
41
|
+
b = specOp ? (specOp.useBasket ? specOp.useBasket : '') : b
|
|
42
|
+
if (b) {
|
|
43
|
+
const baskets = await storage.findOutputBaskets({
|
|
44
|
+
partial: { userId, name: b }
|
|
45
|
+
})
|
|
46
|
+
if (baskets.length !== 1) {
|
|
47
|
+
// If basket does not exist, result is no outputs.
|
|
48
|
+
return r
|
|
49
|
+
}
|
|
50
|
+
const basket = baskets[0]
|
|
51
|
+
basketId = basket.basketId!
|
|
52
|
+
basketsById[basketId!] = basket
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
let tags = [...vargs.tags]
|
|
57
|
+
const specOpTags: string[] = []
|
|
58
|
+
if (specOp && specOp.tagsParamsCount) {
|
|
59
|
+
specOpTags.push(...tags.splice(0, Math.min(tags.length, specOp.tagsParamsCount)))
|
|
60
|
+
}
|
|
61
|
+
if (specOp && specOp.tagsToIntercept) {
|
|
62
|
+
// Pull out tags used by current specOp
|
|
63
|
+
const ts = tags
|
|
64
|
+
tags = []
|
|
65
|
+
for (const t of ts) {
|
|
66
|
+
if (specOp.tagsToIntercept.length === 0 || specOp.tagsToIntercept.indexOf(t) >= 0) {
|
|
67
|
+
specOpTags.push(t)
|
|
68
|
+
if (t === 'all') {
|
|
69
|
+
basketId = undefined
|
|
70
|
+
}
|
|
71
|
+
} else {
|
|
72
|
+
tags.push(t)
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (specOp && specOp.resultFromTags) {
|
|
78
|
+
const r = await specOp.resultFromTags(storage, auth, vargs, specOpTags)
|
|
79
|
+
return r
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
let tagIds: number[] = []
|
|
83
|
+
if (tags && tags.length > 0) {
|
|
84
|
+
await storage.filterOutputTags({ partial: { userId, isDeleted: false } }, ot => {
|
|
85
|
+
if (tags.includes(ot.tag)) {
|
|
86
|
+
tagIds.push(ot.outputTagId)
|
|
87
|
+
}
|
|
88
|
+
})
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const isQueryModeAll = vargs.tagQueryMode === 'all'
|
|
92
|
+
if (isQueryModeAll && tagIds.length < tags.length)
|
|
93
|
+
// all the required tags don't exist, impossible to satisfy.
|
|
94
|
+
return r
|
|
95
|
+
|
|
96
|
+
if (!isQueryModeAll && tagIds.length === 0 && tags.length > 0)
|
|
97
|
+
// any and only non-existing labels, impossible to satisfy.
|
|
98
|
+
return r
|
|
99
|
+
|
|
100
|
+
const noTags = tagIds.length === 0
|
|
101
|
+
const includeSpent = false
|
|
102
|
+
|
|
103
|
+
const stati: TransactionStatus[] = ['completed', 'unproven', 'nosend']
|
|
104
|
+
|
|
105
|
+
const args: sdk.FindOutputsArgs = {
|
|
106
|
+
partial: {
|
|
107
|
+
userId,
|
|
108
|
+
basketId,
|
|
109
|
+
spendable: !includeSpent ? true : undefined
|
|
110
|
+
},
|
|
111
|
+
txStatus: stati,
|
|
112
|
+
noScript: true
|
|
113
|
+
}
|
|
114
|
+
if (!specOp || !specOp.ignoreLimit) args.paged = { limit, offset }
|
|
115
|
+
|
|
116
|
+
let outputs = await storage.findOutputs(args, tagIds, isQueryModeAll)
|
|
117
|
+
if (outputs.length === vargs.limit) {
|
|
118
|
+
args.paged = undefined
|
|
119
|
+
r.totalOutputs = await storage.countOutputs(args, tagIds, isQueryModeAll)
|
|
120
|
+
} else {
|
|
121
|
+
r.totalOutputs = outputs.length
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (specOp) {
|
|
125
|
+
if (specOp.filterOutputs) outputs = await specOp.filterOutputs(storage, auth, vargs, specOpTags, outputs)
|
|
126
|
+
if (specOp.resultFromOutputs) {
|
|
127
|
+
const r = await specOp.resultFromOutputs(storage, auth, vargs, specOpTags, outputs)
|
|
128
|
+
return r
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/*
|
|
133
|
+
ListOutputsArgs {
|
|
134
|
+
include?: 'locking scripts' | 'entire transactions'
|
|
135
|
+
includeCustomInstructions?: BooleanDefaultFalse
|
|
136
|
+
includeTags?: BooleanDefaultFalse
|
|
137
|
+
includeLabels?: BooleanDefaultFalse
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
ListOutputsResult {
|
|
141
|
+
totalOutputs: PositiveIntegerOrZero
|
|
142
|
+
BEEF?: BEEF
|
|
143
|
+
outputs: Array<WalletOutput>
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
WalletOutput {
|
|
147
|
+
satoshis: SatoshiValue
|
|
148
|
+
spendable: boolean
|
|
149
|
+
outpoint: OutpointString
|
|
150
|
+
|
|
151
|
+
customInstructions?: string
|
|
152
|
+
lockingScript?: HexString
|
|
153
|
+
tags?: OutputTagStringUnder300Bytes[]
|
|
154
|
+
labels?: LabelStringUnder300Bytes[]
|
|
155
|
+
}
|
|
156
|
+
*/
|
|
157
|
+
|
|
158
|
+
const labelsByTxid: Record<string, string[]> = {}
|
|
159
|
+
|
|
160
|
+
const beef = new Beef()
|
|
161
|
+
|
|
162
|
+
for (const o of outputs) {
|
|
163
|
+
const wo: WalletOutput = {
|
|
164
|
+
satoshis: Number(o.satoshis),
|
|
165
|
+
spendable: !!o.spendable,
|
|
166
|
+
outpoint: `${o.txid}.${o.vout}`
|
|
167
|
+
}
|
|
168
|
+
r.outputs.push(wo)
|
|
169
|
+
//if (vargs.includeBasket && o.basketId) {
|
|
170
|
+
// if (!basketsById[o.basketId]) {
|
|
171
|
+
// basketsById[o.basketId] = verifyTruthy(await dsk.findOutputBasketId(o.basketId!, trx))
|
|
172
|
+
// }
|
|
173
|
+
// wo.basket = basketsById[o.basketId].name
|
|
174
|
+
//}
|
|
175
|
+
if (vargs.includeCustomInstructions && o.customInstructions) wo.customInstructions = o.customInstructions
|
|
176
|
+
if (vargs.includeLabels && o.txid) {
|
|
177
|
+
if (labelsByTxid[o.txid] === undefined) {
|
|
178
|
+
labelsByTxid[o.txid] = (await storage.getLabelsForTransactionId(o.transactionId)).map(l => l.label)
|
|
179
|
+
}
|
|
180
|
+
wo.labels = labelsByTxid[o.txid]
|
|
181
|
+
}
|
|
182
|
+
if (vargs.includeTags) {
|
|
183
|
+
wo.tags = (await storage.getTagsForOutputId(o.outputId)).map(t => t.tag)
|
|
184
|
+
}
|
|
185
|
+
if (vargs.includeLockingScripts) {
|
|
186
|
+
await storage.validateOutputScript(o)
|
|
187
|
+
if (o.lockingScript) wo.lockingScript = asString(o.lockingScript)
|
|
188
|
+
}
|
|
189
|
+
if (vargs.includeTransactions && !beef.findTxid(o.txid!)) {
|
|
190
|
+
await storage.getValidBeefForKnownTxid(o.txid!, beef, undefined, vargs.knownTxids)
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
if (vargs.includeTransactions) {
|
|
195
|
+
r.BEEF = beef.toBinary()
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
return r
|
|
199
|
+
}
|
|
@@ -2,137 +2,7 @@ import { Beef, ListOutputsResult, OriginatorDomainNameStringUnder250Bytes, Walle
|
|
|
2
2
|
import { TableOutput, TableOutputBasket, TableOutputTag } from '../index.client'
|
|
3
3
|
import { asString, sdk, verifyId, verifyInteger, verifyOne } from '../../index.client'
|
|
4
4
|
import { StorageKnex } from '../StorageKnex'
|
|
5
|
-
import {
|
|
6
|
-
import { spec } from 'node:test/reporters'
|
|
7
|
-
|
|
8
|
-
interface ListOutputsSpecOp {
|
|
9
|
-
name: string
|
|
10
|
-
useBasket?: string
|
|
11
|
-
ignoreLimit?: boolean
|
|
12
|
-
includeSpent?: boolean
|
|
13
|
-
includeOutputScripts?: boolean
|
|
14
|
-
resultFromTags?: (
|
|
15
|
-
s: StorageKnex,
|
|
16
|
-
auth: sdk.AuthId,
|
|
17
|
-
vargs: ValidListOutputsArgs,
|
|
18
|
-
specOpTags: string[]
|
|
19
|
-
) => Promise<ListOutputsResult>
|
|
20
|
-
resultFromOutputs?: (
|
|
21
|
-
s: StorageKnex,
|
|
22
|
-
auth: sdk.AuthId,
|
|
23
|
-
vargs: ValidListOutputsArgs,
|
|
24
|
-
specOpTags: string[],
|
|
25
|
-
outputs: TableOutput[]
|
|
26
|
-
) => Promise<ListOutputsResult>
|
|
27
|
-
filterOutputs?: (
|
|
28
|
-
s: StorageKnex,
|
|
29
|
-
auth: sdk.AuthId,
|
|
30
|
-
vargs: ValidListOutputsArgs,
|
|
31
|
-
specOpTags: string[],
|
|
32
|
-
outputs: TableOutput[]
|
|
33
|
-
) => Promise<TableOutput[]>
|
|
34
|
-
/**
|
|
35
|
-
* undefined to intercept no tags from vargs,
|
|
36
|
-
* empty array to intercept all tags,
|
|
37
|
-
* or an explicit array of tags to intercept.
|
|
38
|
-
*/
|
|
39
|
-
tagsToIntercept?: string[]
|
|
40
|
-
/**
|
|
41
|
-
* How many positional tags to intercept.
|
|
42
|
-
*/
|
|
43
|
-
tagsParamsCount?: number
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
const basketToSpecOp: Record<string, ListOutputsSpecOp> = {
|
|
47
|
-
[sdk.specOpWalletBalance]: {
|
|
48
|
-
name: 'totalOutputsIsWalletBalance',
|
|
49
|
-
useBasket: 'default',
|
|
50
|
-
ignoreLimit: true,
|
|
51
|
-
resultFromOutputs: async (
|
|
52
|
-
s: StorageKnex,
|
|
53
|
-
auth: sdk.AuthId,
|
|
54
|
-
vargs: ValidListOutputsArgs,
|
|
55
|
-
specOpTags: string[],
|
|
56
|
-
outputs: TableOutput[]
|
|
57
|
-
): Promise<ListOutputsResult> => {
|
|
58
|
-
let totalOutputs = 0
|
|
59
|
-
for (const o of outputs) totalOutputs += o.satoshis
|
|
60
|
-
return { totalOutputs, outputs: [] }
|
|
61
|
-
}
|
|
62
|
-
},
|
|
63
|
-
[sdk.specOpInvalidChange]: {
|
|
64
|
-
name: 'invalidChangeOutputs',
|
|
65
|
-
useBasket: 'default',
|
|
66
|
-
ignoreLimit: true,
|
|
67
|
-
includeSpent: false,
|
|
68
|
-
includeOutputScripts: true,
|
|
69
|
-
tagsToIntercept: ['release', 'all'],
|
|
70
|
-
filterOutputs: async (
|
|
71
|
-
s: StorageKnex,
|
|
72
|
-
auth: sdk.AuthId,
|
|
73
|
-
vargs: ValidListOutputsArgs,
|
|
74
|
-
specOpTags: string[],
|
|
75
|
-
outputs: TableOutput[]
|
|
76
|
-
): Promise<TableOutput[]> => {
|
|
77
|
-
const updateToSpent: TableOutput[] = []
|
|
78
|
-
const updateToSpendable: TableOutput[] = []
|
|
79
|
-
const services = s.getServices()
|
|
80
|
-
for (const o of outputs) {
|
|
81
|
-
await s.validateOutputScript(o)
|
|
82
|
-
let ok: boolean | undefined = false
|
|
83
|
-
let r: sdk.GetUtxoStatusResult
|
|
84
|
-
if (o.lockingScript && o.lockingScript.length > 0) {
|
|
85
|
-
const hash = services.hashOutputScript(asString(o.lockingScript))
|
|
86
|
-
r = await services.getUtxoStatus(hash, undefined, `${o.txid}.${o.vout}`)
|
|
87
|
-
ok = r.isUtxo
|
|
88
|
-
} else {
|
|
89
|
-
ok = undefined
|
|
90
|
-
}
|
|
91
|
-
if (ok === false && o.spendable) {
|
|
92
|
-
updateToSpent.push(o)
|
|
93
|
-
} else if (ok === true && !o.spendable) {
|
|
94
|
-
updateToSpendable.push(o)
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
if (specOpTags.indexOf('release') >= 0) {
|
|
98
|
-
for (const o of updateToSpent) {
|
|
99
|
-
await s.updateOutput(o.outputId, { spendable: false })
|
|
100
|
-
o.spendable = false
|
|
101
|
-
}
|
|
102
|
-
for (const o of updateToSpendable) {
|
|
103
|
-
await s.updateOutput(o.outputId, { spendable: true })
|
|
104
|
-
o.spendable = true
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
return updateToSpent.concat(updateToSpendable)
|
|
108
|
-
}
|
|
109
|
-
},
|
|
110
|
-
[sdk.specOpSetWalletChangeParams]: {
|
|
111
|
-
name: 'setWalletChangeParams',
|
|
112
|
-
tagsParamsCount: 2,
|
|
113
|
-
resultFromTags: async (
|
|
114
|
-
s: StorageKnex,
|
|
115
|
-
auth: sdk.AuthId,
|
|
116
|
-
vargs: ValidListOutputsArgs,
|
|
117
|
-
specOpTags: string[]
|
|
118
|
-
): Promise<ListOutputsResult> => {
|
|
119
|
-
if (specOpTags.length !== 2)
|
|
120
|
-
throw new sdk.WERR_INVALID_PARAMETER('numberOfDesiredUTXOs and minimumDesiredUTXOValue', 'valid')
|
|
121
|
-
const numberOfDesiredUTXOs: number = verifyInteger(Number(specOpTags[0]))
|
|
122
|
-
const minimumDesiredUTXOValue: number = verifyInteger(Number(specOpTags[1]))
|
|
123
|
-
const basket = verifyOne(
|
|
124
|
-
await s.findOutputBaskets({
|
|
125
|
-
partial: { userId: verifyId(auth.userId), name: 'default' }
|
|
126
|
-
})
|
|
127
|
-
)
|
|
128
|
-
await s.updateOutputBasket(basket.basketId, {
|
|
129
|
-
numberOfDesiredUTXOs,
|
|
130
|
-
minimumDesiredUTXOValue
|
|
131
|
-
})
|
|
132
|
-
return { totalOutputs: 0, outputs: [] }
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
5
|
+
import { getBasketToSpecOp, ListOutputsSpecOp } from './ListOutputsSpecOp'
|
|
136
6
|
|
|
137
7
|
export async function listOutputs(
|
|
138
8
|
dsk: StorageKnex,
|
|
@@ -169,7 +39,7 @@ export async function listOutputs(
|
|
|
169
39
|
const basketsById: Record<number, TableOutputBasket> = {}
|
|
170
40
|
if (vargs.basket) {
|
|
171
41
|
let b = vargs.basket
|
|
172
|
-
specOp =
|
|
42
|
+
specOp = getBasketToSpecOp()[b]
|
|
173
43
|
b = specOp ? (specOp.useBasket ? specOp.useBasket : '') : b
|
|
174
44
|
if (b) {
|
|
175
45
|
const baskets = await dsk.findOutputBaskets({
|
|
@@ -227,7 +97,13 @@ export async function listOutputs(
|
|
|
227
97
|
}
|
|
228
98
|
|
|
229
99
|
const isQueryModeAll = vargs.tagQueryMode === 'all'
|
|
230
|
-
if (isQueryModeAll && tagIds.length < tags.length)
|
|
100
|
+
if (isQueryModeAll && tagIds.length < tags.length)
|
|
101
|
+
// all the required tags don't exist, impossible to satisfy.
|
|
102
|
+
return r
|
|
103
|
+
|
|
104
|
+
if (!isQueryModeAll && tagIds.length === 0 && tags.length > 0)
|
|
105
|
+
// any and only non-existing labels, impossible to satisfy.
|
|
106
|
+
return r
|
|
231
107
|
|
|
232
108
|
const columns: string[] = [
|
|
233
109
|
'outputId',
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Beef } from '@bsv/sdk'
|
|
2
|
+
import { Knex } from 'knex'
|
|
3
|
+
import { TableCommission, TableOutput, TableOutputTagMap, TableTransaction, TableTxLabelMap } from '../index.client'
|
|
4
|
+
import { sdk } from '../../index.client'
|
|
5
|
+
import { StorageIdb } from '../StorageIdb'
|
|
6
|
+
|
|
7
|
+
export async function purgeDataIdb(
|
|
8
|
+
storage: StorageIdb,
|
|
9
|
+
params: sdk.PurgeParams,
|
|
10
|
+
trx?: sdk.TrxToken
|
|
11
|
+
): Promise<sdk.PurgeResults> {
|
|
12
|
+
const r: sdk.PurgeResults = { count: 0, log: '' }
|
|
13
|
+
// TODO: implement purgeDataIdb
|
|
14
|
+
return r
|
|
15
|
+
}
|
|
@@ -4,6 +4,17 @@ import { TableOutput, TableTransaction } from '../index.client'
|
|
|
4
4
|
import { sdk } from '../../index.client'
|
|
5
5
|
import { StorageKnex } from '../StorageKnex'
|
|
6
6
|
|
|
7
|
+
/**
|
|
8
|
+
* Looks for unpropagated state:
|
|
9
|
+
*
|
|
10
|
+
* 1. set transactions to 'failed' if not already failed and provenTxReq with matching txid has status of 'invalid'.
|
|
11
|
+
* 2. sets outputs to spendable true, spentBy undefined if spentBy is a transaction with status 'failed'.
|
|
12
|
+
* 3. sets transactions to 'completed' if provenTx with matching txid exists and current provenTxId is null.
|
|
13
|
+
*
|
|
14
|
+
* @param storage
|
|
15
|
+
* @param args
|
|
16
|
+
* @returns
|
|
17
|
+
*/
|
|
7
18
|
export async function reviewStatus(
|
|
8
19
|
storage: StorageKnex,
|
|
9
20
|
args: { agedLimit: Date; trx?: sdk.TrxToken }
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Beef } from '@bsv/sdk'
|
|
2
|
+
import { Knex } from 'knex'
|
|
3
|
+
import { TableOutput, TableTransaction } from '../index.client'
|
|
4
|
+
import { sdk } from '../../index.client'
|
|
5
|
+
import { StorageIdb } from '../StorageIdb'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Looks for unpropagated state:
|
|
9
|
+
*
|
|
10
|
+
* 1. set transactions to 'failed' if not already failed and provenTxReq with matching txid has status of 'invalid'.
|
|
11
|
+
* 2. sets transactions to 'completed' if provenTx with matching txid exists and current provenTxId is null.
|
|
12
|
+
* 3. sets outputs to spendable true, spentBy undefined if spentBy is a transaction with status 'failed'.
|
|
13
|
+
*
|
|
14
|
+
* @param storage
|
|
15
|
+
* @param args
|
|
16
|
+
* @returns
|
|
17
|
+
*/
|
|
18
|
+
export async function reviewStatusIdb(
|
|
19
|
+
storage: StorageIdb,
|
|
20
|
+
args: { agedLimit: Date; trx?: sdk.TrxToken }
|
|
21
|
+
): Promise<{ log: string }> {
|
|
22
|
+
const r: { log: string } = { log: '' }
|
|
23
|
+
|
|
24
|
+
// 1. set transactions to 'failed' if not already failed and provenTxReq with matching txid has status of 'invalid'.
|
|
25
|
+
const invalidTxids: string[] = []
|
|
26
|
+
await storage.filterProvenTxReqs({ partial: { status: 'invalid' } }, txReq => {
|
|
27
|
+
invalidTxids.push(txReq.txid)
|
|
28
|
+
})
|
|
29
|
+
for (const txid of invalidTxids) {
|
|
30
|
+
const txs = await storage.findTransactions({ partial: { txid } })
|
|
31
|
+
for (const tx of txs) {
|
|
32
|
+
if (tx.status !== 'failed') {
|
|
33
|
+
r.log += `transaction ${tx.transactionId} updated to status of 'failed' was ${tx.status}\n`
|
|
34
|
+
await storage.updateTransactionStatus('failed', tx.transactionId)
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// 2. sets transactions to 'completed' if provenTx with matching txid exists and current provenTxId is null.
|
|
40
|
+
// 3. sets outputs to spendable true, spentBy undefined if spentBy is a transaction with status 'failed'.
|
|
41
|
+
|
|
42
|
+
return r
|
|
43
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { Base64String, PubKeyHex, HexString } from '@bsv/sdk'
|
|
2
|
+
import { ProvenTxReqStatus, SyncStatus, TransactionStatus } from '../../sdk'
|
|
3
|
+
import {
|
|
4
|
+
TableCertificate,
|
|
5
|
+
TableCertificateField,
|
|
6
|
+
TableCommission,
|
|
7
|
+
TableMonitorEvent,
|
|
8
|
+
TableOutput,
|
|
9
|
+
TableOutputBasket,
|
|
10
|
+
TableOutputTag,
|
|
11
|
+
TableOutputTagMap,
|
|
12
|
+
TableProvenTx,
|
|
13
|
+
TableProvenTxReq,
|
|
14
|
+
TableSyncState,
|
|
15
|
+
TableSettings,
|
|
16
|
+
TableTransaction,
|
|
17
|
+
TableTxLabel,
|
|
18
|
+
TableTxLabelMap,
|
|
19
|
+
TableUser
|
|
20
|
+
} from '../index.client'
|
|
21
|
+
|
|
22
|
+
export interface StorageIdbSchema {
|
|
23
|
+
certificates: {
|
|
24
|
+
key: number
|
|
25
|
+
value: TableCertificate
|
|
26
|
+
indexes: {
|
|
27
|
+
userId: number
|
|
28
|
+
userId_type_certifier_serialNumber: [number, Base64String, PubKeyHex, Base64String]
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
certificateFields: {
|
|
32
|
+
key: number
|
|
33
|
+
value: TableCertificateField
|
|
34
|
+
indexes: {
|
|
35
|
+
userId: number
|
|
36
|
+
certificateId: number
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
commissions: {
|
|
40
|
+
key: number
|
|
41
|
+
value: TableCommission
|
|
42
|
+
indexes: {
|
|
43
|
+
userId: number
|
|
44
|
+
transactionId: number
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
monitorEvents: {
|
|
48
|
+
key: number
|
|
49
|
+
value: TableMonitorEvent
|
|
50
|
+
}
|
|
51
|
+
outputs: {
|
|
52
|
+
key: number
|
|
53
|
+
value: TableOutput
|
|
54
|
+
indexes: {
|
|
55
|
+
userId: number
|
|
56
|
+
transactionId: number
|
|
57
|
+
basketId: number
|
|
58
|
+
spentBy: string
|
|
59
|
+
transactionId_vout_userId: [number, number, number]
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
outputBaskets: {
|
|
63
|
+
key: number
|
|
64
|
+
value: TableOutputBasket
|
|
65
|
+
indexes: {
|
|
66
|
+
userId: number
|
|
67
|
+
name_userId: [string, number]
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
outputTags: {
|
|
71
|
+
key: number
|
|
72
|
+
value: TableOutputTag
|
|
73
|
+
indexes: {
|
|
74
|
+
userId: number
|
|
75
|
+
tag_userId: [string, number]
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
outputTagMaps: {
|
|
79
|
+
key: number
|
|
80
|
+
value: TableOutputTagMap
|
|
81
|
+
indexes: {
|
|
82
|
+
outputTagId: number
|
|
83
|
+
outputId: number
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
provenTxs: {
|
|
87
|
+
key: number
|
|
88
|
+
value: TableProvenTx
|
|
89
|
+
indexes: {
|
|
90
|
+
txid: HexString
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
provenTxReqs: {
|
|
94
|
+
key: number
|
|
95
|
+
value: TableProvenTxReq
|
|
96
|
+
indexes: {
|
|
97
|
+
provenTxId: number
|
|
98
|
+
txid: HexString
|
|
99
|
+
status: ProvenTxReqStatus
|
|
100
|
+
batch: string
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
syncStates: {
|
|
104
|
+
key: number
|
|
105
|
+
value: TableSyncState
|
|
106
|
+
indexes: {
|
|
107
|
+
userId: number
|
|
108
|
+
refNum: string
|
|
109
|
+
status: SyncStatus
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
settings: {
|
|
113
|
+
key: number
|
|
114
|
+
value: TableSettings
|
|
115
|
+
indexes: Record<string, never>
|
|
116
|
+
}
|
|
117
|
+
transactions: {
|
|
118
|
+
key: number
|
|
119
|
+
value: TableTransaction
|
|
120
|
+
indexes: {
|
|
121
|
+
userId: number
|
|
122
|
+
provenTxId: number
|
|
123
|
+
reference: string
|
|
124
|
+
status: TransactionStatus
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
txLabels: {
|
|
128
|
+
key: number
|
|
129
|
+
value: TableTxLabel
|
|
130
|
+
indexes: {
|
|
131
|
+
userId: number
|
|
132
|
+
label_userId: [string, number]
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
txLabelMaps: {
|
|
136
|
+
key: number
|
|
137
|
+
value: TableTxLabelMap
|
|
138
|
+
indexes: {
|
|
139
|
+
transactionId: number
|
|
140
|
+
txLabelId: number
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
users: {
|
|
144
|
+
key: number
|
|
145
|
+
value: TableUser
|
|
146
|
+
indexes: {
|
|
147
|
+
identityKey: string
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
export * from './TableSettings'
|
|
2
|
-
export * from './
|
|
3
|
-
export * from './
|
|
4
|
-
export * from './
|
|
5
|
-
export * from './
|
|
6
|
-
export * from './
|
|
7
|
-
export * from './
|
|
8
|
-
export * from './
|
|
9
|
-
export * from './
|
|
10
|
-
export * from './
|
|
11
|
-
export * from './
|
|
12
|
-
export * from './
|
|
13
|
-
export * from './
|
|
14
|
-
export * from './
|
|
15
|
-
export * from './
|
|
16
|
-
export * from './
|
|
2
|
+
export * from './TableProvenTx'
|
|
3
|
+
export * from './TableProvenTxReq'
|
|
4
|
+
export * from './TableUser'
|
|
5
|
+
export * from './TableCertificate'
|
|
6
|
+
export * from './TableCertificateField'
|
|
7
|
+
export * from './TableOutputBasket'
|
|
8
|
+
export * from './TableTransaction'
|
|
9
|
+
export * from './TableCommission'
|
|
10
|
+
export * from './TableOutput'
|
|
11
|
+
export * from './TableOutputTag'
|
|
12
|
+
export * from './TableOutputTagMap'
|
|
13
|
+
export * from './TableTxLabel'
|
|
14
|
+
export * from './TableTxLabelMap'
|
|
15
|
+
export * from './TableMonitorEvent'
|
|
16
|
+
export * from './TableSyncState'
|
|
@@ -28,6 +28,8 @@ describe('localWallet2 tests', () => {
|
|
|
28
28
|
|
|
29
29
|
test('0 monitor runOnce', async () => {
|
|
30
30
|
const setup = await createSetup(chain, options)
|
|
31
|
+
const log = await setup.monitor.runTask('UnFail')
|
|
32
|
+
if (log) console.log(log)
|
|
31
33
|
await setup.monitor.runOnce()
|
|
32
34
|
await setup.wallet.destroy()
|
|
33
35
|
})
|
|
@@ -244,3 +246,6 @@ const beefJackie = [
|
|
|
244
246
|
154, 94, 189, 29, 53, 41, 220, 136, 142, 80, 136, 172, 208, 140, 0, 0, 0, 0, 0, 0, 25, 118, 169, 20, 217, 48, 110,
|
|
245
247
|
108, 236, 100, 116, 90, 181, 114, 45, 176, 198, 216, 150, 134, 16, 251, 10, 177, 136, 172, 0, 0, 0, 0
|
|
246
248
|
]
|
|
249
|
+
|
|
250
|
+
const brayden1 =
|
|
251
|
+
'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'
|