@bsv/wallet-toolbox 2.4.4 → 2.4.20
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 +43 -0
- package/LICENSE.txt +58 -0
- package/README.md +98 -36
- package/docs/action-batch-planning.md +117 -14
- package/docs/client.md +1535 -4125
- package/docs/monitor.md +34 -137
- package/docs/services.md +296 -602
- package/docs/setup.md +48 -28
- package/docs/storage.md +358 -1901
- package/docs/wallet.md +10316 -5665
- package/out/src/CWIStyleWalletManager.d.ts +11 -2
- package/out/src/CWIStyleWalletManager.d.ts.map +1 -1
- package/out/src/CWIStyleWalletManager.js +118 -87
- package/out/src/CWIStyleWalletManager.js.map +1 -1
- package/out/src/Setup.d.ts +7 -0
- package/out/src/Setup.d.ts.map +1 -1
- package/out/src/Setup.js +10 -11
- package/out/src/Setup.js.map +1 -1
- package/out/src/SetupClient.d.ts +2 -0
- package/out/src/SetupClient.d.ts.map +1 -1
- package/out/src/SetupClient.js +8 -9
- package/out/src/SetupClient.js.map +1 -1
- package/out/src/SetupWallet.d.ts +6 -0
- package/out/src/SetupWallet.d.ts.map +1 -1
- package/out/src/ShamirWalletManager.d.ts.map +1 -1
- package/out/src/ShamirWalletManager.js.map +1 -1
- package/out/src/SimpleWalletManager.d.ts.map +1 -1
- package/out/src/SimpleWalletManager.js +2 -5
- package/out/src/SimpleWalletManager.js.map +1 -1
- package/out/src/Wallet.d.ts +28 -10
- package/out/src/Wallet.d.ts.map +1 -1
- package/out/src/Wallet.js +146 -125
- package/out/src/Wallet.js.map +1 -1
- package/out/src/WalletAuthenticationManager.d.ts +11 -1
- package/out/src/WalletAuthenticationManager.d.ts.map +1 -1
- package/out/src/WalletAuthenticationManager.js +7 -6
- package/out/src/WalletAuthenticationManager.js.map +1 -1
- package/out/src/WalletLogger.d.ts.map +1 -1
- package/out/src/WalletLogger.js +33 -30
- package/out/src/WalletLogger.js.map +1 -1
- package/out/src/WalletPermissionsManager.d.ts +22 -1
- package/out/src/WalletPermissionsManager.d.ts.map +1 -1
- package/out/src/WalletPermissionsManager.js +392 -267
- package/out/src/WalletPermissionsManager.js.map +1 -1
- package/out/src/WalletSettingsManager.d.ts.map +1 -1
- package/out/src/WalletSettingsManager.js.map +1 -1
- package/out/src/entropy/EntropyCollector.d.ts.map +1 -1
- package/out/src/entropy/EntropyCollector.js +6 -8
- package/out/src/entropy/EntropyCollector.js.map +1 -1
- package/out/src/fundWalletP2PKH.js.map +1 -1
- package/out/src/index.all.js.map +1 -1
- package/out/src/index.client.js.map +1 -1
- package/out/src/index.mobile.d.ts +1 -0
- package/out/src/index.mobile.d.ts.map +1 -1
- package/out/src/index.mobile.js +1 -0
- package/out/src/index.mobile.js.map +1 -1
- package/out/src/mockchain/MockChainMigrations.d.ts.map +1 -1
- package/out/src/mockchain/MockChainMigrations.js.map +1 -1
- package/out/src/mockchain/MockChainStorage.d.ts.map +1 -1
- package/out/src/mockchain/MockChainStorage.js.map +1 -1
- package/out/src/mockchain/MockChainTracker.d.ts.map +1 -1
- package/out/src/mockchain/MockChainTracker.js.map +1 -1
- package/out/src/mockchain/MockMiner.d.ts.map +1 -1
- package/out/src/mockchain/MockMiner.js.map +1 -1
- package/out/src/mockchain/MockServices.d.ts +4 -0
- package/out/src/mockchain/MockServices.d.ts.map +1 -1
- package/out/src/mockchain/MockServices.js +69 -74
- package/out/src/mockchain/MockServices.js.map +1 -1
- package/out/src/mockchain/merkleTree.d.ts.map +1 -1
- package/out/src/mockchain/merkleTree.js +51 -56
- package/out/src/mockchain/merkleTree.js.map +1 -1
- package/out/src/monitor/Monitor.d.ts +4 -0
- package/out/src/monitor/Monitor.d.ts.map +1 -1
- package/out/src/monitor/Monitor.js +56 -54
- package/out/src/monitor/Monitor.js.map +1 -1
- package/out/src/monitor/MonitorDaemon.d.ts +3 -0
- package/out/src/monitor/MonitorDaemon.d.ts.map +1 -1
- package/out/src/monitor/MonitorDaemon.js +65 -56
- package/out/src/monitor/MonitorDaemon.js.map +1 -1
- package/out/src/monitor/index.all.js.map +1 -1
- package/out/src/monitor/tasks/TaskArcSSE.d.ts +5 -0
- package/out/src/monitor/tasks/TaskArcSSE.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskArcSSE.js +86 -77
- package/out/src/monitor/tasks/TaskArcSSE.js.map +1 -1
- package/out/src/monitor/tasks/TaskCheckForProofs.d.ts +4 -2
- package/out/src/monitor/tasks/TaskCheckForProofs.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskCheckForProofs.js +132 -131
- package/out/src/monitor/tasks/TaskCheckForProofs.js.map +1 -1
- package/out/src/monitor/tasks/TaskCheckNoSends.d.ts +3 -1
- package/out/src/monitor/tasks/TaskCheckNoSends.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskCheckNoSends.js +3 -1
- package/out/src/monitor/tasks/TaskCheckNoSends.js.map +1 -1
- package/out/src/monitor/tasks/TaskCleanupActionBatches.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskCleanupActionBatches.js.map +1 -1
- package/out/src/monitor/tasks/TaskClock.d.ts +1 -1
- package/out/src/monitor/tasks/TaskClock.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskClock.js +1 -1
- package/out/src/monitor/tasks/TaskClock.js.map +1 -1
- package/out/src/monitor/tasks/TaskFailAbandoned.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskFailAbandoned.js.map +1 -1
- package/out/src/monitor/tasks/TaskMineBlock.d.ts +3 -1
- package/out/src/monitor/tasks/TaskMineBlock.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskMineBlock.js +3 -1
- package/out/src/monitor/tasks/TaskMineBlock.js.map +1 -1
- package/out/src/monitor/tasks/TaskMonitorCallHistory.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskMonitorCallHistory.js.map +1 -1
- package/out/src/monitor/tasks/TaskNewHeader.d.ts +4 -3
- package/out/src/monitor/tasks/TaskNewHeader.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskNewHeader.js +4 -3
- package/out/src/monitor/tasks/TaskNewHeader.js.map +1 -1
- package/out/src/monitor/tasks/TaskPurge.d.ts +3 -1
- package/out/src/monitor/tasks/TaskPurge.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskPurge.js +3 -1
- package/out/src/monitor/tasks/TaskPurge.js.map +1 -1
- package/out/src/monitor/tasks/TaskReorg.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskReorg.js.map +1 -1
- package/out/src/monitor/tasks/TaskReviewDoubleSpends.d.ts +3 -1
- package/out/src/monitor/tasks/TaskReviewDoubleSpends.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskReviewDoubleSpends.js +3 -1
- package/out/src/monitor/tasks/TaskReviewDoubleSpends.js.map +1 -1
- package/out/src/monitor/tasks/TaskReviewProvenTxs.d.ts +3 -1
- package/out/src/monitor/tasks/TaskReviewProvenTxs.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskReviewProvenTxs.js +3 -1
- package/out/src/monitor/tasks/TaskReviewProvenTxs.js.map +1 -1
- package/out/src/monitor/tasks/TaskReviewStatus.d.ts +3 -1
- package/out/src/monitor/tasks/TaskReviewStatus.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskReviewStatus.js +3 -1
- package/out/src/monitor/tasks/TaskReviewStatus.js.map +1 -1
- package/out/src/monitor/tasks/TaskReviewUtxos.d.ts +3 -1
- package/out/src/monitor/tasks/TaskReviewUtxos.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskReviewUtxos.js +3 -1
- package/out/src/monitor/tasks/TaskReviewUtxos.js.map +1 -1
- package/out/src/monitor/tasks/TaskSendWaiting.d.ts +3 -0
- package/out/src/monitor/tasks/TaskSendWaiting.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskSendWaiting.js +53 -46
- package/out/src/monitor/tasks/TaskSendWaiting.js.map +1 -1
- package/out/src/monitor/tasks/TaskSyncWhenIdle.d.ts +1 -1
- package/out/src/monitor/tasks/TaskSyncWhenIdle.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskSyncWhenIdle.js +1 -1
- package/out/src/monitor/tasks/TaskSyncWhenIdle.js.map +1 -1
- package/out/src/monitor/tasks/TaskUnFail.d.ts +3 -1
- package/out/src/monitor/tasks/TaskUnFail.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskUnFail.js +3 -1
- package/out/src/monitor/tasks/TaskUnFail.js.map +1 -1
- package/out/src/monitor/tasks/WalletMonitorTask.d.ts.map +1 -1
- package/out/src/monitor/tasks/WalletMonitorTask.js.map +1 -1
- package/out/src/sdk/ActionBatch.interfaces.d.ts +56 -2
- package/out/src/sdk/ActionBatch.interfaces.d.ts.map +1 -1
- package/out/src/sdk/PrivilegedKeyManager.d.ts.map +1 -1
- package/out/src/sdk/PrivilegedKeyManager.js +3 -3
- package/out/src/sdk/PrivilegedKeyManager.js.map +1 -1
- package/out/src/sdk/WERR_errors.d.ts +1 -1
- package/out/src/sdk/WERR_errors.d.ts.map +1 -1
- package/out/src/sdk/WERR_errors.js +2 -2
- package/out/src/sdk/WERR_errors.js.map +1 -1
- package/out/src/sdk/WalletError.d.ts +3 -0
- package/out/src/sdk/WalletError.d.ts.map +1 -1
- package/out/src/sdk/WalletError.js +53 -56
- package/out/src/sdk/WalletError.js.map +1 -1
- package/out/src/sdk/WalletErrorFromJson.js.map +1 -1
- package/out/src/sdk/WalletServices.interfaces.d.ts +3 -1
- package/out/src/sdk/WalletServices.interfaces.d.ts.map +1 -1
- package/out/src/sdk/WalletStorage.interfaces.d.ts +5 -1
- package/out/src/sdk/WalletStorage.interfaces.d.ts.map +1 -1
- package/out/src/sdk/types.js.map +1 -1
- package/out/src/services/ServiceCollection.d.ts.map +1 -1
- package/out/src/services/ServiceCollection.js.map +1 -1
- package/out/src/services/Services.d.ts +8 -2
- package/out/src/services/Services.d.ts.map +1 -1
- package/out/src/services/Services.js +86 -44
- package/out/src/services/Services.js.map +1 -1
- package/out/src/services/chaintracker/BHServiceClient.d.ts +7 -7
- package/out/src/services/chaintracker/BHServiceClient.d.ts.map +1 -1
- package/out/src/services/chaintracker/BHServiceClient.js +9 -9
- package/out/src/services/chaintracker/BHServiceClient.js.map +1 -1
- package/out/src/services/chaintracker/ChaintracksChainTracker.d.ts +4 -1
- package/out/src/services/chaintracker/ChaintracksChainTracker.d.ts.map +1 -1
- package/out/src/services/chaintracker/ChaintracksChainTracker.js +42 -6
- package/out/src/services/chaintracker/ChaintracksChainTracker.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Api/BlockHeaderApi.d.ts +4 -4
- package/out/src/services/chaintracker/chaintracks/Api/BlockHeaderApi.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Api/BlockHeaderApi.js +1 -1
- package/out/src/services/chaintracker/chaintracks/Api/BlockHeaderApi.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Chaintracks.d.ts +3 -0
- package/out/src/services/chaintracker/chaintracks/Chaintracks.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Chaintracks.js +45 -40
- package/out/src/services/chaintracker/chaintracks/Chaintracks.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/ChaintracksService.d.ts +5 -0
- package/out/src/services/chaintracker/chaintracks/ChaintracksService.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/ChaintracksService.js +25 -18
- package/out/src/services/chaintracker/chaintracks/ChaintracksService.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/ChaintracksServiceClient.d.ts +3 -3
- package/out/src/services/chaintracker/chaintracks/ChaintracksServiceClient.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/ChaintracksServiceClient.js +6 -7
- package/out/src/services/chaintracker/chaintracks/ChaintracksServiceClient.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/GoChaintracksServiceClient.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/GoChaintracksServiceClient.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorBase.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorBase.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDN.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDN.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDNBabbage.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDNBabbage.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.js +0 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainWs.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainWs.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorBase.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorBase.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorChaintracksSSE.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorChaintracksSSE.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorTeranodeP2P.d.ts +2 -2
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorTeranodeP2P.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorTeranodeP2P.js +2 -2
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorTeranodeP2P.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainWs.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainWs.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.d.ts +12 -2
- package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.js +110 -103
- package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainServices.d.ts +8 -0
- package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainServices.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainServices.js +58 -48
- package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainServices.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/BulkStorageBase.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/BulkStorageBase.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksKnexMigrations.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksKnexMigrations.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.d.ts +3 -0
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.js +55 -54
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.d.ts +4 -0
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.js +97 -72
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.d.ts +5 -0
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.js +145 -136
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.d.ts +4 -0
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.js +92 -68
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/configureChaintracksIngestors.d.ts +43 -0
- package/out/src/services/chaintracker/chaintracks/configureChaintracksIngestors.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/configureChaintracksIngestors.js +76 -0
- package/out/src/services/chaintracker/chaintracks/configureChaintracksIngestors.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/configureKnexChaintracks.d.ts +18 -0
- package/out/src/services/chaintracker/chaintracks/configureKnexChaintracks.d.ts.map +1 -0
- package/out/src/services/chaintracker/chaintracks/configureKnexChaintracks.js +24 -0
- package/out/src/services/chaintracker/chaintracks/configureKnexChaintracks.js.map +1 -0
- package/out/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.d.ts +2 -3
- package/out/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.js +4 -22
- package/out/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.d.ts +2 -4
- package/out/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.js +12 -25
- package/out/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.d.ts +2 -3
- package/out/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.js +4 -22
- package/out/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/createIdbChaintracks.d.ts +2 -1
- package/out/src/services/chaintracker/chaintracks/createIdbChaintracks.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/createIdbChaintracks.js +3 -15
- package/out/src/services/chaintracker/chaintracks/createIdbChaintracks.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/createKnexChaintracks.d.ts +2 -2
- package/out/src/services/chaintracker/chaintracks/createKnexChaintracks.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/createKnexChaintracks.js +3 -15
- package/out/src/services/chaintracker/chaintracks/createKnexChaintracks.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.d.ts +2 -1
- package/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.js +3 -15
- package/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/index.mobile.d.ts +1 -1
- package/out/src/services/chaintracker/chaintracks/index.mobile.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/index.mobile.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.d.ts +2 -0
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.js +64 -61
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataReader.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataReader.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/BulkFilesReader.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/BulkFilesReader.js +4 -3
- package/out/src/services/chaintracker/chaintracks/util/BulkFilesReader.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/BulkHeaderFile.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/BulkHeaderFile.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/ChaintracksFs.d.ts +8 -10
- package/out/src/services/chaintracker/chaintracks/util/ChaintracksFs.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/ChaintracksFs.js +14 -24
- package/out/src/services/chaintracker/chaintracks/util/ChaintracksFs.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/HeightRange.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/HeightRange.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/SingleWriterMultiReaderLock.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/SingleWriterMultiReaderLock.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.d.ts +1 -11
- package/out/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.js +20 -49
- package/out/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/dirtyHashes.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/dirtyHashes.js +4 -2
- package/out/src/services/chaintracker/chaintracks/util/dirtyHashes.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.js.map +1 -1
- package/out/src/services/createDefaultWalletServicesOptions.d.ts +23 -14
- package/out/src/services/createDefaultWalletServicesOptions.d.ts.map +1 -1
- package/out/src/services/createDefaultWalletServicesOptions.js +1 -14
- package/out/src/services/createDefaultWalletServicesOptions.js.map +1 -1
- package/out/src/services/networkConfig.js.map +1 -1
- package/out/src/services/providers/ARC.d.ts +4 -0
- package/out/src/services/providers/ARC.d.ts.map +1 -1
- package/out/src/services/providers/ARC.js +96 -83
- package/out/src/services/providers/ARC.js.map +1 -1
- package/out/src/services/providers/ArcSSEClient.d.ts.map +1 -1
- package/out/src/services/providers/ArcSSEClient.js.map +1 -1
- package/out/src/services/providers/Arcade.d.ts +4 -0
- package/out/src/services/providers/Arcade.d.ts.map +1 -1
- package/out/src/services/providers/Arcade.js +118 -92
- package/out/src/services/providers/Arcade.js.map +1 -1
- package/out/src/services/providers/Bitails.d.ts.map +1 -1
- package/out/src/services/providers/Bitails.js +107 -86
- package/out/src/services/providers/Bitails.js.map +1 -1
- package/out/src/services/providers/SdkWhatsOnChain.d.ts.map +1 -1
- package/out/src/services/providers/SdkWhatsOnChain.js.map +1 -1
- package/out/src/services/providers/WhatsOnChain.d.ts.map +1 -1
- package/out/src/services/providers/WhatsOnChain.js +19 -6
- package/out/src/services/providers/WhatsOnChain.js.map +1 -1
- package/out/src/services/providers/exchangeRates.js +1 -1
- package/out/src/services/providers/exchangeRates.js.map +1 -1
- package/out/src/services/providers/getBeefForTxid.js.map +1 -1
- package/out/src/services/providers/whatsOnChainHelpers.js.map +1 -1
- package/out/src/signer/WalletSigner.d.ts.map +1 -1
- package/out/src/signer/WalletSigner.js.map +1 -1
- package/out/src/signer/actionBatch/ActionBatchPlanner.d.ts +3 -2
- package/out/src/signer/actionBatch/ActionBatchPlanner.d.ts.map +1 -1
- package/out/src/signer/actionBatch/ActionBatchPlanner.js +68 -35
- package/out/src/signer/actionBatch/ActionBatchPlanner.js.map +1 -1
- package/out/src/signer/actionBatch/ActionBatchWorkspace.d.ts.map +1 -1
- package/out/src/signer/actionBatch/ActionBatchWorkspace.js +217 -41
- package/out/src/signer/actionBatch/ActionBatchWorkspace.js.map +1 -1
- package/out/src/signer/actionBatch/actionBatchBootstrap.d.ts +11 -0
- package/out/src/signer/actionBatch/actionBatchBootstrap.d.ts.map +1 -0
- package/out/src/signer/actionBatch/actionBatchBootstrap.js +38 -0
- package/out/src/signer/actionBatch/actionBatchBootstrap.js.map +1 -0
- package/out/src/signer/methods/acquireDirectCertificate.js.map +1 -1
- package/out/src/signer/methods/buildSignableTransaction.d.ts.map +1 -1
- package/out/src/signer/methods/buildSignableTransaction.js +95 -106
- package/out/src/signer/methods/buildSignableTransaction.js.map +1 -1
- package/out/src/signer/methods/completeSignedTransaction.d.ts +3 -7
- package/out/src/signer/methods/completeSignedTransaction.d.ts.map +1 -1
- package/out/src/signer/methods/completeSignedTransaction.js +14 -57
- package/out/src/signer/methods/completeSignedTransaction.js.map +1 -1
- package/out/src/signer/methods/createAction.d.ts.map +1 -1
- package/out/src/signer/methods/createAction.js +47 -20
- package/out/src/signer/methods/createAction.js.map +1 -1
- package/out/src/signer/methods/internalizeAction.d.ts.map +1 -1
- package/out/src/signer/methods/internalizeAction.js +4 -4
- package/out/src/signer/methods/internalizeAction.js.map +1 -1
- package/out/src/signer/methods/proveCertificate.js.map +1 -1
- package/out/src/signer/methods/resultBeef.js.map +1 -1
- package/out/src/signer/methods/signAction.d.ts.map +1 -1
- package/out/src/signer/methods/signAction.js +29 -4
- package/out/src/signer/methods/signAction.js.map +1 -1
- package/out/src/signer/methods/verifyUnlockScripts.d.ts +17 -0
- package/out/src/signer/methods/verifyUnlockScripts.d.ts.map +1 -0
- package/out/src/signer/methods/verifyUnlockScripts.js +137 -0
- package/out/src/signer/methods/verifyUnlockScripts.js.map +1 -0
- package/out/src/storage/StorageIdb.d.ts +5 -3
- package/out/src/storage/StorageIdb.d.ts.map +1 -1
- package/out/src/storage/StorageIdb.js +80 -27
- package/out/src/storage/StorageIdb.js.map +1 -1
- package/out/src/storage/StorageKnex.d.ts +10 -1
- package/out/src/storage/StorageKnex.d.ts.map +1 -1
- package/out/src/storage/StorageKnex.js +118 -9
- package/out/src/storage/StorageKnex.js.map +1 -1
- package/out/src/storage/StorageProvider.d.ts +41 -13
- package/out/src/storage/StorageProvider.d.ts.map +1 -1
- package/out/src/storage/StorageProvider.js +241 -158
- package/out/src/storage/StorageProvider.js.map +1 -1
- package/out/src/storage/StorageReader.d.ts +13 -5
- package/out/src/storage/StorageReader.d.ts.map +1 -1
- package/out/src/storage/StorageReader.js +3 -0
- package/out/src/storage/StorageReader.js.map +1 -1
- package/out/src/storage/StorageReaderWriter.d.ts.map +1 -1
- package/out/src/storage/StorageReaderWriter.js.map +1 -1
- package/out/src/storage/StorageSyncReader.d.ts.map +1 -1
- package/out/src/storage/StorageSyncReader.js.map +1 -1
- package/out/src/storage/WalletStorageManager.d.ts +2 -0
- package/out/src/storage/WalletStorageManager.d.ts.map +1 -1
- package/out/src/storage/WalletStorageManager.js +25 -6
- package/out/src/storage/WalletStorageManager.js.map +1 -1
- package/out/src/storage/adminServer/adminServer.d.ts +79 -0
- package/out/src/storage/adminServer/adminServer.d.ts.map +1 -1
- package/out/src/storage/adminServer/adminServer.js +47 -16
- package/out/src/storage/adminServer/adminServer.js.map +1 -1
- package/out/src/storage/adminServer/adminUi.js.map +1 -1
- package/out/src/storage/idbHelpers.js.map +1 -1
- package/out/src/storage/index.all.js.map +1 -1
- package/out/src/storage/methods/ListActionsSpecOp.d.ts.map +1 -1
- package/out/src/storage/methods/ListActionsSpecOp.js +48 -71
- package/out/src/storage/methods/ListActionsSpecOp.js.map +1 -1
- package/out/src/storage/methods/ListOutputsSpecOp.d.ts.map +1 -1
- package/out/src/storage/methods/ListOutputsSpecOp.js +29 -27
- package/out/src/storage/methods/ListOutputsSpecOp.js.map +1 -1
- package/out/src/storage/methods/actionBatch.d.ts +2 -1
- package/out/src/storage/methods/actionBatch.d.ts.map +1 -1
- package/out/src/storage/methods/actionBatch.js +143 -50
- package/out/src/storage/methods/actionBatch.js.map +1 -1
- package/out/src/storage/methods/actionBatchBlobs.d.ts +6 -3
- package/out/src/storage/methods/actionBatchBlobs.d.ts.map +1 -1
- package/out/src/storage/methods/actionBatchBlobs.js +77 -14
- package/out/src/storage/methods/actionBatchBlobs.js.map +1 -1
- package/out/src/storage/methods/actionBatchValidation.d.ts +6 -4
- package/out/src/storage/methods/actionBatchValidation.d.ts.map +1 -1
- package/out/src/storage/methods/actionBatchValidation.js +261 -155
- package/out/src/storage/methods/actionBatchValidation.js.map +1 -1
- package/out/src/storage/methods/actionPlanning.js.map +1 -1
- package/out/src/storage/methods/attemptToPostReqsToNetwork.d.ts +0 -21
- package/out/src/storage/methods/attemptToPostReqsToNetwork.d.ts.map +1 -1
- package/out/src/storage/methods/attemptToPostReqsToNetwork.js +43 -51
- package/out/src/storage/methods/attemptToPostReqsToNetwork.js.map +1 -1
- package/out/src/storage/methods/createAction.d.ts +1 -1
- package/out/src/storage/methods/createAction.d.ts.map +1 -1
- package/out/src/storage/methods/createAction.js +57 -38
- package/out/src/storage/methods/createAction.js.map +1 -1
- package/out/src/storage/methods/generateChange.d.ts +2 -2
- package/out/src/storage/methods/generateChange.d.ts.map +1 -1
- package/out/src/storage/methods/generateChange.js +66 -38
- package/out/src/storage/methods/generateChange.js.map +1 -1
- package/out/src/storage/methods/getBeefForTransaction.d.ts.map +1 -1
- package/out/src/storage/methods/getBeefForTransaction.js +48 -42
- package/out/src/storage/methods/getBeefForTransaction.js.map +1 -1
- package/out/src/storage/methods/getSyncChunk.d.ts.map +1 -1
- package/out/src/storage/methods/getSyncChunk.js +8 -6
- package/out/src/storage/methods/getSyncChunk.js.map +1 -1
- package/out/src/storage/methods/internalizeAction.js +145 -121
- package/out/src/storage/methods/internalizeAction.js.map +1 -1
- package/out/src/storage/methods/listActionsIdb.js.map +1 -1
- package/out/src/storage/methods/listActionsKnex.js +1 -1
- package/out/src/storage/methods/listActionsKnex.js.map +1 -1
- package/out/src/storage/methods/listCertificates.d.ts +1 -1
- package/out/src/storage/methods/listCertificates.d.ts.map +1 -1
- package/out/src/storage/methods/listCertificates.js +1 -1
- package/out/src/storage/methods/listCertificates.js.map +1 -1
- package/out/src/storage/methods/listOutputsIdb.d.ts +1 -1
- package/out/src/storage/methods/listOutputsIdb.d.ts.map +1 -1
- package/out/src/storage/methods/listOutputsIdb.js +133 -152
- package/out/src/storage/methods/listOutputsIdb.js.map +1 -1
- package/out/src/storage/methods/listOutputsKnex.d.ts +1 -1
- package/out/src/storage/methods/listOutputsKnex.d.ts.map +1 -1
- package/out/src/storage/methods/listOutputsKnex.js +213 -254
- package/out/src/storage/methods/listOutputsKnex.js.map +1 -1
- package/out/src/storage/methods/managedChange.d.ts +3 -3
- package/out/src/storage/methods/managedChange.d.ts.map +1 -1
- package/out/src/storage/methods/managedChange.js +1 -2
- package/out/src/storage/methods/managedChange.js.map +1 -1
- package/out/src/storage/methods/offsetKey.d.ts.map +1 -1
- package/out/src/storage/methods/offsetKey.js +0 -1
- package/out/src/storage/methods/offsetKey.js.map +1 -1
- package/out/src/storage/methods/processAction.d.ts +2 -0
- package/out/src/storage/methods/processAction.d.ts.map +1 -1
- package/out/src/storage/methods/processAction.js +8 -8
- package/out/src/storage/methods/processAction.js.map +1 -1
- package/out/src/storage/methods/purgeData.d.ts.map +1 -1
- package/out/src/storage/methods/purgeData.js +157 -179
- package/out/src/storage/methods/purgeData.js.map +1 -1
- package/out/src/storage/methods/purgeDataIdb.d.ts +1 -1
- package/out/src/storage/methods/purgeDataIdb.d.ts.map +1 -1
- package/out/src/storage/methods/purgeDataIdb.js +1 -1
- package/out/src/storage/methods/purgeDataIdb.js.map +1 -1
- package/out/src/storage/methods/reviewStatus.js +6 -6
- package/out/src/storage/methods/reviewStatus.js.map +1 -1
- package/out/src/storage/methods/reviewStatusIdb.js.map +1 -1
- package/out/src/storage/methods/utils.Buffer.js.map +1 -1
- package/out/src/storage/methods/utils.js.map +1 -1
- package/out/src/storage/portable/index.js +2 -2
- package/out/src/storage/portable/index.js.map +1 -1
- package/out/src/storage/remoting/BinaryJson.d.ts.map +1 -1
- package/out/src/storage/remoting/BinaryJson.js +84 -38
- package/out/src/storage/remoting/BinaryJson.js.map +1 -1
- package/out/src/storage/remoting/KnexSessionManager.d.ts.map +1 -1
- package/out/src/storage/remoting/KnexSessionManager.js.map +1 -1
- package/out/src/storage/remoting/RateLimitPolicy.d.ts +10 -0
- package/out/src/storage/remoting/RateLimitPolicy.d.ts.map +1 -0
- package/out/src/storage/remoting/RateLimitPolicy.js +37 -0
- package/out/src/storage/remoting/RateLimitPolicy.js.map +1 -0
- package/out/src/storage/remoting/StorageClient.d.ts +2 -0
- package/out/src/storage/remoting/StorageClient.d.ts.map +1 -1
- package/out/src/storage/remoting/StorageClient.js +82 -50
- package/out/src/storage/remoting/StorageClient.js.map +1 -1
- package/out/src/storage/remoting/StorageClientBase.d.ts +15 -5
- package/out/src/storage/remoting/StorageClientBase.d.ts.map +1 -1
- package/out/src/storage/remoting/StorageClientBase.js +61 -3
- package/out/src/storage/remoting/StorageClientBase.js.map +1 -1
- package/out/src/storage/remoting/StorageMobile.d.ts.map +1 -1
- package/out/src/storage/remoting/StorageMobile.js +34 -22
- package/out/src/storage/remoting/StorageMobile.js.map +1 -1
- package/out/src/storage/remoting/StorageServer.d.ts +52 -1
- package/out/src/storage/remoting/StorageServer.d.ts.map +1 -1
- package/out/src/storage/remoting/StorageServer.js +340 -201
- package/out/src/storage/remoting/StorageServer.js.map +1 -1
- package/out/src/storage/remoting/edgePolicy.d.ts +57 -0
- package/out/src/storage/remoting/edgePolicy.d.ts.map +1 -0
- package/out/src/storage/remoting/edgePolicy.js +387 -0
- package/out/src/storage/remoting/edgePolicy.js.map +1 -0
- package/out/src/storage/remoting/entityValidationHelpers.d.ts.map +1 -1
- package/out/src/storage/remoting/entityValidationHelpers.js +22 -5
- package/out/src/storage/remoting/entityValidationHelpers.js.map +1 -1
- package/out/src/storage/schema/KnexMigrations.d.ts.map +1 -1
- package/out/src/storage/schema/KnexMigrations.js +12 -0
- package/out/src/storage/schema/KnexMigrations.js.map +1 -1
- package/out/src/storage/schema/entities/EntityBase.d.ts.map +1 -1
- package/out/src/storage/schema/entities/EntityBase.js.map +1 -1
- package/out/src/storage/schema/entities/EntityCertificate.d.ts.map +1 -1
- package/out/src/storage/schema/entities/EntityCertificate.js.map +1 -1
- package/out/src/storage/schema/entities/EntityCertificateField.d.ts.map +1 -1
- package/out/src/storage/schema/entities/EntityCertificateField.js.map +1 -1
- package/out/src/storage/schema/entities/EntityCommission.d.ts.map +1 -1
- package/out/src/storage/schema/entities/EntityCommission.js.map +1 -1
- package/out/src/storage/schema/entities/EntityOutput.d.ts.map +1 -1
- package/out/src/storage/schema/entities/EntityOutput.js.map +1 -1
- package/out/src/storage/schema/entities/EntityOutputBasket.d.ts.map +1 -1
- package/out/src/storage/schema/entities/EntityOutputBasket.js.map +1 -1
- package/out/src/storage/schema/entities/EntityOutputTag.d.ts.map +1 -1
- package/out/src/storage/schema/entities/EntityOutputTag.js.map +1 -1
- package/out/src/storage/schema/entities/EntityOutputTagMap.d.ts.map +1 -1
- package/out/src/storage/schema/entities/EntityOutputTagMap.js.map +1 -1
- package/out/src/storage/schema/entities/EntityProvenTx.d.ts +3 -0
- package/out/src/storage/schema/entities/EntityProvenTx.d.ts.map +1 -1
- package/out/src/storage/schema/entities/EntityProvenTx.js +46 -36
- package/out/src/storage/schema/entities/EntityProvenTx.js.map +1 -1
- package/out/src/storage/schema/entities/EntityProvenTxReq.d.ts +2 -2
- package/out/src/storage/schema/entities/EntityProvenTxReq.d.ts.map +1 -1
- package/out/src/storage/schema/entities/EntityProvenTxReq.js +12 -10
- package/out/src/storage/schema/entities/EntityProvenTxReq.js.map +1 -1
- package/out/src/storage/schema/entities/EntitySyncState.d.ts.map +1 -1
- package/out/src/storage/schema/entities/EntitySyncState.js +25 -34
- package/out/src/storage/schema/entities/EntitySyncState.js.map +1 -1
- package/out/src/storage/schema/entities/EntityTransaction.d.ts.map +1 -1
- package/out/src/storage/schema/entities/EntityTransaction.js.map +1 -1
- package/out/src/storage/schema/entities/EntityTxLabel.d.ts.map +1 -1
- package/out/src/storage/schema/entities/EntityTxLabel.js.map +1 -1
- package/out/src/storage/schema/entities/EntityTxLabelMap.d.ts.map +1 -1
- package/out/src/storage/schema/entities/EntityTxLabelMap.js.map +1 -1
- package/out/src/storage/schema/entities/EntityUser.d.ts.map +1 -1
- package/out/src/storage/schema/entities/EntityUser.js.map +1 -1
- package/out/src/storage/schema/entities/MergeEntity.d.ts.map +1 -1
- package/out/src/storage/schema/entities/MergeEntity.js +9 -14
- package/out/src/storage/schema/entities/MergeEntity.js.map +1 -1
- package/out/src/storage/schema/tables/TableActionBatch.d.ts +3 -1
- package/out/src/storage/schema/tables/TableActionBatch.d.ts.map +1 -1
- package/out/src/storage/schema/tables/TableAuthSession.js.map +1 -1
- package/out/src/storage/storageProviderHelpers.js.map +1 -1
- package/out/src/storage/sync/StorageMySQLDojoReader.d.ts +3 -0
- package/out/src/storage/sync/StorageMySQLDojoReader.d.ts.map +1 -1
- package/out/src/storage/sync/StorageMySQLDojoReader.js +30 -16
- package/out/src/storage/sync/StorageMySQLDojoReader.js.map +1 -1
- package/out/src/utility/Format.d.ts.map +1 -1
- package/out/src/utility/Format.js +2 -2
- package/out/src/utility/Format.js.map +1 -1
- package/out/src/utility/ScriptTemplateBRC29.d.ts.map +1 -1
- package/out/src/utility/ScriptTemplateBRC29.js.map +1 -1
- package/out/src/utility/actionBatchDigest.d.ts.map +1 -1
- package/out/src/utility/actionBatchDigest.js +41 -3
- package/out/src/utility/actionBatchDigest.js.map +1 -1
- package/out/src/utility/actionBatchPack.d.ts +16 -0
- package/out/src/utility/actionBatchPack.d.ts.map +1 -0
- package/out/src/utility/actionBatchPack.js +220 -0
- package/out/src/utility/actionBatchPack.js.map +1 -0
- package/out/src/utility/aggregateResults.d.ts.map +1 -1
- package/out/src/utility/aggregateResults.js.map +1 -1
- package/out/src/utility/beefForTxids.js.map +1 -1
- package/out/src/utility/brc114ActionTimeLabels.d.ts.map +1 -1
- package/out/src/utility/brc114ActionTimeLabels.js +26 -30
- package/out/src/utility/brc114ActionTimeLabels.js.map +1 -1
- package/out/src/utility/formatUnknown.d.ts +6 -0
- package/out/src/utility/formatUnknown.d.ts.map +1 -0
- package/out/src/utility/formatUnknown.js +39 -0
- package/out/src/utility/formatUnknown.js.map +1 -0
- package/out/src/utility/hashWasm.d.ts +5 -0
- package/out/src/utility/hashWasm.d.ts.map +1 -0
- package/out/src/utility/hashWasm.js +15 -0
- package/out/src/utility/hashWasm.js.map +1 -0
- package/out/src/utility/identityUtils.d.ts.map +1 -1
- package/out/src/utility/identityUtils.js +2 -4
- package/out/src/utility/identityUtils.js.map +1 -1
- package/out/src/utility/parseTxScriptOffsets.d.ts +1 -1
- package/out/src/utility/parseTxScriptOffsets.d.ts.map +1 -1
- package/out/src/utility/parseTxScriptOffsets.js +1 -1
- package/out/src/utility/parseTxScriptOffsets.js.map +1 -1
- package/out/src/utility/stampLog.d.ts.map +1 -1
- package/out/src/utility/stampLog.js +49 -42
- package/out/src/utility/stampLog.js.map +1 -1
- package/out/src/utility/traceContext.d.ts +13 -0
- package/out/src/utility/traceContext.d.ts.map +1 -0
- package/out/src/utility/traceContext.js +34 -0
- package/out/src/utility/traceContext.js.map +1 -0
- package/out/src/utility/tscProofToMerklePath.d.ts.map +1 -1
- package/out/src/utility/tscProofToMerklePath.js +1 -1
- package/out/src/utility/tscProofToMerklePath.js.map +1 -1
- package/out/src/utility/utilityHelpers.buffer.js.map +1 -1
- package/out/src/utility/utilityHelpers.d.ts +2 -2
- package/out/src/utility/utilityHelpers.d.ts.map +1 -1
- package/out/src/utility/utilityHelpers.js +8 -4
- package/out/src/utility/utilityHelpers.js.map +1 -1
- package/out/src/utility/utilityHelpers.noBuffer.d.ts.map +1 -1
- package/out/src/utility/utilityHelpers.noBuffer.js +1 -2
- package/out/src/utility/utilityHelpers.noBuffer.js.map +1 -1
- package/out/src/wab-client/WABClient.d.ts.map +1 -1
- package/out/src/wab-client/WABClient.js +1 -1
- package/out/src/wab-client/WABClient.js.map +1 -1
- package/out/src/wab-client/WABTransport.d.ts +33 -5
- package/out/src/wab-client/WABTransport.d.ts.map +1 -1
- package/out/src/wab-client/WABTransport.js +240 -120
- package/out/src/wab-client/WABTransport.js.map +1 -1
- package/out/src/wab-client/auth-method-interactors/AuthMethodInteractor.d.ts.map +1 -1
- package/out/src/wab-client/auth-method-interactors/AuthMethodInteractor.js.map +1 -1
- package/out/src/wab-client/auth-method-interactors/DevConsoleInteractor.js.map +1 -1
- package/out/src/wab-client/auth-method-interactors/PersonaIDInteractor.js.map +1 -1
- package/out/src/wab-client/auth-method-interactors/TwilioPhoneInteractor.d.ts.map +1 -1
- package/out/src/wab-client/auth-method-interactors/TwilioPhoneInteractor.js +1 -1
- package/out/src/wab-client/auth-method-interactors/TwilioPhoneInteractor.js.map +1 -1
- package/package.json +57 -21
- package/license.md +0 -28
|
@@ -3,9 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.WalletPermissionsManager = void 0;
|
|
4
4
|
const sdk_1 = require("@bsv/sdk");
|
|
5
5
|
const brc114ActionTimeLabels_1 = require("./utility/brc114ActionTimeLabels");
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
// Security invariant: only the configured admin originator bypasses permission
|
|
7
|
+
// prompts. Admin-reserved protocols, baskets, and labels are rejected for all
|
|
8
|
+
// other originators; counterparty bypasses require an explicit configuration
|
|
9
|
+
// allowlist.
|
|
9
10
|
function deepEqual(object1, object2) {
|
|
10
11
|
if (object1 === null || object1 === undefined || object2 === null || object2 === undefined) {
|
|
11
12
|
return object1 === object2;
|
|
@@ -126,6 +127,7 @@ class WalletPermissionsManager {
|
|
|
126
127
|
* Configuration that determines whether to skip or apply various checks and encryption.
|
|
127
128
|
*/
|
|
128
129
|
config;
|
|
130
|
+
telemetry;
|
|
129
131
|
/**
|
|
130
132
|
* Constructs a new Permissions Manager instance.
|
|
131
133
|
*
|
|
@@ -136,6 +138,7 @@ class WalletPermissionsManager {
|
|
|
136
138
|
constructor(underlyingWallet, adminOriginator, config = {}) {
|
|
137
139
|
this.underlying = underlyingWallet;
|
|
138
140
|
this.adminOriginator = this.normalizeOriginator(adminOriginator) || adminOriginator;
|
|
141
|
+
this.telemetry = new sdk_1.Telemetry(config.telemetry);
|
|
139
142
|
// Default all config options to true unless specified
|
|
140
143
|
this.config = {
|
|
141
144
|
seekProtocolPermissionsForSigning: true,
|
|
@@ -363,12 +366,24 @@ class WalletPermissionsManager {
|
|
|
363
366
|
*/
|
|
364
367
|
async callEvent(eventName, param) {
|
|
365
368
|
const arr = this.callbacks[eventName] || [];
|
|
366
|
-
for (const cb of arr) {
|
|
369
|
+
for (const [callbackIndex, cb] of arr.entries()) {
|
|
367
370
|
if (typeof cb === 'function') {
|
|
368
371
|
try {
|
|
369
|
-
|
|
372
|
+
if (this.telemetry.enabled && typeof param === 'object' && param != null) {
|
|
373
|
+
await this.telemetry.withSpan('wallet.permission.callback', {
|
|
374
|
+
component: 'wallet-permissions',
|
|
375
|
+
carrier: param,
|
|
376
|
+
attributes: {
|
|
377
|
+
'permission.callback': eventName,
|
|
378
|
+
'permission.callback_index': callbackIndex
|
|
379
|
+
}
|
|
380
|
+
}, async () => await cb(param));
|
|
381
|
+
}
|
|
382
|
+
else {
|
|
383
|
+
await cb(param);
|
|
384
|
+
}
|
|
370
385
|
}
|
|
371
|
-
catch
|
|
386
|
+
catch {
|
|
372
387
|
// Intentionally swallow errors from user-provided callbacks to prevent
|
|
373
388
|
// a misbehaving callback from disrupting the event dispatch loop.
|
|
374
389
|
}
|
|
@@ -568,16 +583,16 @@ class WalletPermissionsManager {
|
|
|
568
583
|
* Throws an error on the first mismatch.
|
|
569
584
|
*/
|
|
570
585
|
validateGrantedPermissionsSubset(granted, requested) {
|
|
571
|
-
if (
|
|
586
|
+
if (granted.spendingAuthorization != null && requested.spendingAuthorization == null) {
|
|
572
587
|
throw new Error('Granted spending authorization was not part of the original request.');
|
|
573
588
|
}
|
|
574
|
-
if (granted.protocolPermissions?.some(g =>
|
|
589
|
+
if (granted.protocolPermissions?.some(g => requested.protocolPermissions?.find(r => deepEqual(r, g)) == null)) {
|
|
575
590
|
throw new Error('Granted protocol permissions are not a subset of the original request.');
|
|
576
591
|
}
|
|
577
|
-
if (granted.basketAccess?.some(g =>
|
|
592
|
+
if (granted.basketAccess?.some(g => requested.basketAccess?.find(r => deepEqual(r, g)) == null)) {
|
|
578
593
|
throw new Error('Granted basket access permissions are not a subset of the original request.');
|
|
579
594
|
}
|
|
580
|
-
if (granted.certificateAccess?.some(g =>
|
|
595
|
+
if (granted.certificateAccess?.some(g => requested.certificateAccess?.find(r => deepEqual(r, g)) == null)) {
|
|
581
596
|
throw new Error('Granted certificate access permissions are not a subset of the original request.');
|
|
582
597
|
}
|
|
583
598
|
}
|
|
@@ -707,13 +722,21 @@ class WalletPermissionsManager {
|
|
|
707
722
|
if (await this.hasRecentOrPendingGrant(cacheKey))
|
|
708
723
|
return true;
|
|
709
724
|
// 4) Attempt to find a valid token in the internal basket
|
|
710
|
-
const token = await this.findProtocolToken(originator, privileged, protocolID, counterparty,
|
|
725
|
+
const token = await this.findProtocolToken(originator, privileged, protocolID, counterparty,
|
|
726
|
+
/* includeExpired= */ true, lookupValues);
|
|
711
727
|
if (token == null) {
|
|
712
728
|
// No token found => request a new one if allowed
|
|
713
729
|
if (!seekPermission)
|
|
714
730
|
throw new Error('No protocol permission token found (seekPermission=false).');
|
|
715
731
|
return await this.requestPermissionFlow({
|
|
716
|
-
type: 'protocol',
|
|
732
|
+
type: 'protocol',
|
|
733
|
+
originator,
|
|
734
|
+
privileged,
|
|
735
|
+
protocolID,
|
|
736
|
+
counterparty,
|
|
737
|
+
usageType,
|
|
738
|
+
reason,
|
|
739
|
+
renewal: false
|
|
717
740
|
});
|
|
718
741
|
}
|
|
719
742
|
if (this.isTokenExpired(token.expiry)) {
|
|
@@ -722,8 +745,15 @@ class WalletPermissionsManager {
|
|
|
722
745
|
throw new Error('Protocol permission expired and no further user consent allowed (seekPermission=false).');
|
|
723
746
|
}
|
|
724
747
|
return await this.requestPermissionFlow({
|
|
725
|
-
type: 'protocol',
|
|
726
|
-
|
|
748
|
+
type: 'protocol',
|
|
749
|
+
originator,
|
|
750
|
+
privileged,
|
|
751
|
+
protocolID,
|
|
752
|
+
counterparty,
|
|
753
|
+
usageType,
|
|
754
|
+
reason,
|
|
755
|
+
renewal: true,
|
|
756
|
+
previousToken: token
|
|
727
757
|
});
|
|
728
758
|
}
|
|
729
759
|
// valid and unexpired
|
|
@@ -756,7 +786,13 @@ class WalletPermissionsManager {
|
|
|
756
786
|
if (!seekPermission)
|
|
757
787
|
throw new Error('Basket permission expired (seekPermission=false).');
|
|
758
788
|
return await this.requestPermissionFlow({
|
|
759
|
-
type: 'basket',
|
|
789
|
+
type: 'basket',
|
|
790
|
+
originator,
|
|
791
|
+
basket,
|
|
792
|
+
usageType,
|
|
793
|
+
reason,
|
|
794
|
+
renewal: true,
|
|
795
|
+
previousToken: token
|
|
760
796
|
});
|
|
761
797
|
}
|
|
762
798
|
this.cachePermission(cacheKey, token.expiry);
|
|
@@ -999,7 +1035,7 @@ class WalletPermissionsManager {
|
|
|
999
1035
|
}
|
|
1000
1036
|
async fetchManifestPermissions(originator) {
|
|
1001
1037
|
const cached = this.manifestCache.get(originator);
|
|
1002
|
-
if (
|
|
1038
|
+
if (cached != null && Date.now() - cached.fetchedAt < WalletPermissionsManager.MANIFEST_CACHE_TTL_MS) {
|
|
1003
1039
|
return {
|
|
1004
1040
|
groupPermissions: cached.groupPermissions,
|
|
1005
1041
|
counterpartyPermissions: cached.counterpartyPermissions
|
|
@@ -1026,7 +1062,7 @@ class WalletPermissionsManager {
|
|
|
1026
1062
|
return { groupPermissions, counterpartyPermissions: counterpartyPermissionsDeclared };
|
|
1027
1063
|
}
|
|
1028
1064
|
}
|
|
1029
|
-
catch
|
|
1065
|
+
catch {
|
|
1030
1066
|
// Manifest fetch or parse failed — fall through to return null/null defaults below
|
|
1031
1067
|
}
|
|
1032
1068
|
const result = { groupPermissions: null, counterpartyPermissions: null };
|
|
@@ -1482,12 +1518,36 @@ class WalletPermissionsManager {
|
|
|
1482
1518
|
* and return a promise that resolves once permission is granted or rejects if denied.
|
|
1483
1519
|
*/
|
|
1484
1520
|
async requestPermissionFlow(r) {
|
|
1521
|
+
if (!this.telemetry.enabled)
|
|
1522
|
+
return await this.requestPermissionFlowCore(r);
|
|
1523
|
+
return await this.telemetry.withSpan('wallet.permission.request', {
|
|
1524
|
+
component: 'wallet-permissions',
|
|
1525
|
+
carrier: r,
|
|
1526
|
+
attributes: {
|
|
1527
|
+
'permission.type': r.type,
|
|
1528
|
+
'permission.renewal': r.renewal === true
|
|
1529
|
+
}
|
|
1530
|
+
}, async (span) => {
|
|
1531
|
+
const result = await this.requestPermissionFlowCore(r, span.context);
|
|
1532
|
+
span.end({
|
|
1533
|
+
attributes: {
|
|
1534
|
+
'permission.granted': result
|
|
1535
|
+
}
|
|
1536
|
+
});
|
|
1537
|
+
return result;
|
|
1538
|
+
});
|
|
1539
|
+
}
|
|
1540
|
+
async requestPermissionFlowCore(r, context) {
|
|
1541
|
+
if (context != null)
|
|
1542
|
+
this.telemetry.bindContext(r, context);
|
|
1485
1543
|
const normalizedOriginator = this.normalizeOriginator(r.originator) || r.originator;
|
|
1486
1544
|
const preparedRequest = {
|
|
1487
1545
|
...r,
|
|
1488
1546
|
originator: normalizedOriginator,
|
|
1489
1547
|
displayOriginator: r.displayOriginator ?? r.previousToken?.rawOriginator ?? r.originator
|
|
1490
1548
|
};
|
|
1549
|
+
if (context != null)
|
|
1550
|
+
this.telemetry.bindContext(preparedRequest, context);
|
|
1491
1551
|
if (preparedRequest.type === 'protocol' && preparedRequest.protocolID?.[0] === 1) {
|
|
1492
1552
|
preparedRequest.counterparty = '';
|
|
1493
1553
|
}
|
|
@@ -1513,7 +1573,7 @@ class WalletPermissionsManager {
|
|
|
1513
1573
|
/** Returns true when an active-request queue already has pending waiters for this key. */
|
|
1514
1574
|
isPiggybacking(key) {
|
|
1515
1575
|
const q = this.activeRequests.get(key);
|
|
1516
|
-
return
|
|
1576
|
+
return q != null && q.pending.length > 0;
|
|
1517
1577
|
}
|
|
1518
1578
|
/** Appends to an existing request queue and waits for resolution. */
|
|
1519
1579
|
async piggybackOnExistingQueue(key) {
|
|
@@ -1523,7 +1583,7 @@ class WalletPermissionsManager {
|
|
|
1523
1583
|
});
|
|
1524
1584
|
}
|
|
1525
1585
|
/** Runs the grouped-permission flow (with or without a lock) and checks post-group satisfaction. */
|
|
1526
|
-
async resolveGroupedFlow(preparedRequest,
|
|
1586
|
+
async resolveGroupedFlow(preparedRequest, _key) {
|
|
1527
1587
|
const hadPendingGroupedFlowBefore = this.config.seekGroupedPermission && this.groupedPermissionFlowTail.has(preparedRequest.originator);
|
|
1528
1588
|
let groupResult;
|
|
1529
1589
|
if (this.config.seekGroupedPermission) {
|
|
@@ -1565,23 +1625,27 @@ class WalletPermissionsManager {
|
|
|
1565
1625
|
async firePermissionRequestEvent(request, key) {
|
|
1566
1626
|
switch (request.type) {
|
|
1567
1627
|
case 'protocol':
|
|
1568
|
-
await this.
|
|
1628
|
+
await this.callPermissionEvent(request, 'onProtocolPermissionRequested', {
|
|
1569
1629
|
...request,
|
|
1570
1630
|
counterparty: request.protocolID?.[0] === 1 ? undefined : request.counterparty,
|
|
1571
1631
|
requestID: key
|
|
1572
1632
|
});
|
|
1573
1633
|
break;
|
|
1574
1634
|
case 'basket':
|
|
1575
|
-
await this.
|
|
1635
|
+
await this.callPermissionEvent(request, 'onBasketAccessRequested', { ...request, requestID: key });
|
|
1576
1636
|
break;
|
|
1577
1637
|
case 'certificate':
|
|
1578
|
-
await this.
|
|
1638
|
+
await this.callPermissionEvent(request, 'onCertificateAccessRequested', { ...request, requestID: key });
|
|
1579
1639
|
break;
|
|
1580
1640
|
case 'spending':
|
|
1581
|
-
await this.
|
|
1641
|
+
await this.callPermissionEvent(request, 'onSpendingAuthorizationRequested', { ...request, requestID: key });
|
|
1582
1642
|
break;
|
|
1583
1643
|
}
|
|
1584
1644
|
}
|
|
1645
|
+
async callPermissionEvent(request, eventName, param) {
|
|
1646
|
+
this.telemetry.linkContext(request, param);
|
|
1647
|
+
await this.callEvent(eventName, param);
|
|
1648
|
+
}
|
|
1585
1649
|
/* ---------------------------------------------------------------------
|
|
1586
1650
|
* 4) SEARCH / DECODE / DECRYPT ON-CHAIN TOKENS (PushDrop Scripts)
|
|
1587
1651
|
* --------------------------------------------------------------------- */
|
|
@@ -1660,7 +1724,7 @@ class WalletPermissionsManager {
|
|
|
1660
1724
|
}, this.adminOriginator);
|
|
1661
1725
|
return plaintext;
|
|
1662
1726
|
}
|
|
1663
|
-
catch
|
|
1727
|
+
catch {
|
|
1664
1728
|
// Decryption failed (e.g. wrong key, unencrypted legacy value) — return the raw bytes unchanged
|
|
1665
1729
|
return ciphertext;
|
|
1666
1730
|
}
|
|
@@ -1695,7 +1759,7 @@ class WalletPermissionsManager {
|
|
|
1695
1759
|
}, this.adminOriginator);
|
|
1696
1760
|
return sdk_1.Utils.toUTF8(plaintext);
|
|
1697
1761
|
}
|
|
1698
|
-
catch
|
|
1762
|
+
catch {
|
|
1699
1763
|
// Decryption failed (e.g. wrong key, unencrypted legacy value) — return original string unchanged
|
|
1700
1764
|
return ciphertext;
|
|
1701
1765
|
}
|
|
@@ -1715,6 +1779,108 @@ class WalletPermissionsManager {
|
|
|
1715
1779
|
const cptyDecoded = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(fields[5]));
|
|
1716
1780
|
return { domainDecoded, expiryDecoded, privDecoded, secLevelDecoded, protoNameDecoded, cptyDecoded };
|
|
1717
1781
|
}
|
|
1782
|
+
protocolTokenTags(originator, privileged, securityLevel, protocolName, counterparty) {
|
|
1783
|
+
const tags = [
|
|
1784
|
+
`originator ${originator}`,
|
|
1785
|
+
`privileged ${!!privileged}`,
|
|
1786
|
+
`protocolName ${protocolName}`,
|
|
1787
|
+
`protocolSecurityLevel ${securityLevel}`
|
|
1788
|
+
];
|
|
1789
|
+
if (securityLevel === 2)
|
|
1790
|
+
tags.push(`counterparty ${counterparty}`);
|
|
1791
|
+
return tags;
|
|
1792
|
+
}
|
|
1793
|
+
async parseProtocolTokenOutput(result, output, expected) {
|
|
1794
|
+
const [txid, outputIndex] = this.parseOutpoint(output.outpoint);
|
|
1795
|
+
const tx = this.transactionFromResultBeef(result, txid);
|
|
1796
|
+
const decoded = sdk_1.PushDrop.decode(tx.outputs[outputIndex].lockingScript);
|
|
1797
|
+
if (decoded?.fields == null || decoded.fields.length < 6)
|
|
1798
|
+
return undefined;
|
|
1799
|
+
const fields = await this.decryptProtocolTokenFields(decoded.fields);
|
|
1800
|
+
if (this.normalizeOriginator(fields.domainDecoded) !== expected.originator)
|
|
1801
|
+
return undefined;
|
|
1802
|
+
const matches = fields.privDecoded === !!expected.privileged &&
|
|
1803
|
+
fields.secLevelDecoded === expected.securityLevel &&
|
|
1804
|
+
fields.protoNameDecoded === expected.protocolName &&
|
|
1805
|
+
(fields.secLevelDecoded !== 2 || fields.cptyDecoded === expected.counterparty);
|
|
1806
|
+
if (!matches)
|
|
1807
|
+
return undefined;
|
|
1808
|
+
return {
|
|
1809
|
+
tx: tx.toBEEF(),
|
|
1810
|
+
txid,
|
|
1811
|
+
outputIndex,
|
|
1812
|
+
outputScript: tx.outputs[outputIndex].lockingScript.toHex(),
|
|
1813
|
+
satoshis: output.satoshis,
|
|
1814
|
+
originator: expected.originator,
|
|
1815
|
+
rawOriginator: fields.domainDecoded,
|
|
1816
|
+
privileged: expected.privileged,
|
|
1817
|
+
protocol: expected.protocolName,
|
|
1818
|
+
securityLevel: expected.securityLevel,
|
|
1819
|
+
expiry: fields.expiryDecoded,
|
|
1820
|
+
counterparty: fields.cptyDecoded
|
|
1821
|
+
};
|
|
1822
|
+
}
|
|
1823
|
+
async parseBasketTokenOutput(result, output, originator, basket) {
|
|
1824
|
+
const [txid, outputIndex] = this.parseOutpoint(output.outpoint);
|
|
1825
|
+
const tx = this.transactionFromResultBeef(result, txid);
|
|
1826
|
+
const decoded = sdk_1.PushDrop.decode(tx.outputs[outputIndex].lockingScript);
|
|
1827
|
+
if (decoded?.fields == null || decoded.fields.length < 3)
|
|
1828
|
+
return undefined;
|
|
1829
|
+
const domainDecoded = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(decoded.fields[0]));
|
|
1830
|
+
if (this.normalizeOriginator(domainDecoded) !== originator)
|
|
1831
|
+
return undefined;
|
|
1832
|
+
const expiryDecoded = Number.parseInt(sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(decoded.fields[1])), 10);
|
|
1833
|
+
const basketDecoded = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(decoded.fields[2]));
|
|
1834
|
+
if (basketDecoded !== basket)
|
|
1835
|
+
return undefined;
|
|
1836
|
+
return {
|
|
1837
|
+
tx: tx.toBEEF(),
|
|
1838
|
+
txid,
|
|
1839
|
+
outputIndex,
|
|
1840
|
+
outputScript: tx.outputs[outputIndex].lockingScript.toHex(),
|
|
1841
|
+
satoshis: output.satoshis,
|
|
1842
|
+
originator,
|
|
1843
|
+
rawOriginator: domainDecoded,
|
|
1844
|
+
basketName: basketDecoded,
|
|
1845
|
+
expiry: expiryDecoded
|
|
1846
|
+
};
|
|
1847
|
+
}
|
|
1848
|
+
async parseCertificateTokenOutput(result, output, expected) {
|
|
1849
|
+
const [txid, outputIndex] = this.parseOutpoint(output.outpoint);
|
|
1850
|
+
const tx = this.transactionFromResultBeef(result, txid);
|
|
1851
|
+
const decoded = sdk_1.PushDrop.decode(tx.outputs[outputIndex].lockingScript);
|
|
1852
|
+
if (decoded?.fields == null || decoded.fields.length < 6)
|
|
1853
|
+
return undefined;
|
|
1854
|
+
const [domainRaw, expiryRaw, privRaw, typeRaw, fieldsRaw, verifierRaw] = decoded.fields;
|
|
1855
|
+
const domainDecoded = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(domainRaw));
|
|
1856
|
+
if (this.normalizeOriginator(domainDecoded) !== expected.originator)
|
|
1857
|
+
return undefined;
|
|
1858
|
+
const expiryDecoded = Number.parseInt(sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(expiryRaw)), 10);
|
|
1859
|
+
const privileged = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(privRaw)) === 'true';
|
|
1860
|
+
const certType = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(typeRaw));
|
|
1861
|
+
const verifier = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(verifierRaw));
|
|
1862
|
+
const allFields = JSON.parse(sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(fieldsRaw)));
|
|
1863
|
+
const metadataMatches = privileged === !!expected.privileged && certType === expected.certType && verifier === expected.verifier;
|
|
1864
|
+
if (!metadataMatches)
|
|
1865
|
+
return undefined;
|
|
1866
|
+
const availableFields = new Set(allFields);
|
|
1867
|
+
if (expected.fields.some(field => !availableFields.has(field)))
|
|
1868
|
+
return undefined;
|
|
1869
|
+
return {
|
|
1870
|
+
tx: tx.toBEEF(),
|
|
1871
|
+
txid,
|
|
1872
|
+
outputIndex,
|
|
1873
|
+
outputScript: tx.outputs[outputIndex].lockingScript.toHex(),
|
|
1874
|
+
satoshis: output.satoshis,
|
|
1875
|
+
originator: expected.originator,
|
|
1876
|
+
rawOriginator: domainDecoded,
|
|
1877
|
+
privileged: expected.privileged,
|
|
1878
|
+
verifier,
|
|
1879
|
+
certType,
|
|
1880
|
+
certFields: allFields,
|
|
1881
|
+
expiry: expiryDecoded
|
|
1882
|
+
};
|
|
1883
|
+
}
|
|
1718
1884
|
/** Parses outpoint string "txid.vout" into [txid, outputIndex]. */
|
|
1719
1885
|
parseOutpoint(outpoint) {
|
|
1720
1886
|
const [txid, indexStr] = outpoint.split('.');
|
|
@@ -1730,7 +1896,7 @@ class WalletPermissionsManager {
|
|
|
1730
1896
|
if (!/^[0-9a-f]{64}$/.test(hex))
|
|
1731
1897
|
return hex;
|
|
1732
1898
|
const bytes = hex.match(/../g);
|
|
1733
|
-
return
|
|
1899
|
+
return bytes != null ? bytes.reverse().join('') : hex;
|
|
1734
1900
|
}
|
|
1735
1901
|
/**
|
|
1736
1902
|
* Returns true when an outpoint string (e.g. "txid.vout" or "txid:vout") refers to `token`.
|
|
@@ -1778,52 +1944,25 @@ class WalletPermissionsManager {
|
|
|
1778
1944
|
const [secLevel, protoName] = protocolID;
|
|
1779
1945
|
const originsToTry = originatorLookupValues?.length ? originatorLookupValues : [originator];
|
|
1780
1946
|
for (const originTag of originsToTry) {
|
|
1781
|
-
const tags = [
|
|
1782
|
-
`originator ${originTag}`,
|
|
1783
|
-
`privileged ${!!privileged}`,
|
|
1784
|
-
`protocolName ${protoName}`,
|
|
1785
|
-
`protocolSecurityLevel ${secLevel}`
|
|
1786
|
-
];
|
|
1787
|
-
if (secLevel === 2) {
|
|
1788
|
-
tags.push(`counterparty ${counterparty}`);
|
|
1789
|
-
}
|
|
1790
1947
|
const result = await this.underlying.listOutputs({
|
|
1791
1948
|
basket: BASKET_MAP.protocol,
|
|
1792
|
-
tags,
|
|
1949
|
+
tags: this.protocolTokenTags(originTag, privileged, secLevel, protoName, counterparty),
|
|
1793
1950
|
tagQueryMode: 'all',
|
|
1794
1951
|
include: 'entire transactions'
|
|
1795
1952
|
}, this.adminOriginator);
|
|
1796
1953
|
for (const out of result.outputs) {
|
|
1797
|
-
const
|
|
1798
|
-
const tx = this.transactionFromResultBeef(result, txid);
|
|
1799
|
-
const dec = sdk_1.PushDrop.decode(tx.outputs[outputIndex].lockingScript);
|
|
1800
|
-
if (dec?.fields == null || dec.fields.length < 6)
|
|
1801
|
-
continue;
|
|
1802
|
-
const f = await this.decryptProtocolTokenFields(dec.fields);
|
|
1803
|
-
if (this.normalizeOriginator(f.domainDecoded) !== originator)
|
|
1804
|
-
continue;
|
|
1805
|
-
if (f.privDecoded !== !!privileged ||
|
|
1806
|
-
f.secLevelDecoded !== secLevel ||
|
|
1807
|
-
f.protoNameDecoded !== protoName ||
|
|
1808
|
-
(f.secLevelDecoded === 2 && f.cptyDecoded !== counterparty)) {
|
|
1809
|
-
continue;
|
|
1810
|
-
}
|
|
1811
|
-
if (!includeExpired && this.isTokenExpired(f.expiryDecoded))
|
|
1812
|
-
continue;
|
|
1813
|
-
return {
|
|
1814
|
-
tx: tx.toBEEF(),
|
|
1815
|
-
txid,
|
|
1816
|
-
outputIndex,
|
|
1817
|
-
outputScript: tx.outputs[outputIndex].lockingScript.toHex(),
|
|
1818
|
-
satoshis: out.satoshis,
|
|
1954
|
+
const token = await this.parseProtocolTokenOutput(result, out, {
|
|
1819
1955
|
originator,
|
|
1820
|
-
rawOriginator: f.domainDecoded,
|
|
1821
1956
|
privileged,
|
|
1822
|
-
protocol: protoName,
|
|
1823
1957
|
securityLevel: secLevel,
|
|
1824
|
-
|
|
1825
|
-
counterparty
|
|
1826
|
-
};
|
|
1958
|
+
protocolName: protoName,
|
|
1959
|
+
counterparty
|
|
1960
|
+
});
|
|
1961
|
+
if (token == null)
|
|
1962
|
+
continue;
|
|
1963
|
+
if (!includeExpired && this.isTokenExpired(token.expiry))
|
|
1964
|
+
continue;
|
|
1965
|
+
return token;
|
|
1827
1966
|
}
|
|
1828
1967
|
}
|
|
1829
1968
|
return undefined;
|
|
@@ -1835,53 +1974,26 @@ class WalletPermissionsManager {
|
|
|
1835
1974
|
const matches = [];
|
|
1836
1975
|
const seen = new Set();
|
|
1837
1976
|
for (const originTag of originsToTry) {
|
|
1838
|
-
const tags = [
|
|
1839
|
-
`originator ${originTag}`,
|
|
1840
|
-
`privileged ${!!privileged}`,
|
|
1841
|
-
`protocolName ${protoName}`,
|
|
1842
|
-
`protocolSecurityLevel ${secLevel}`
|
|
1843
|
-
];
|
|
1844
|
-
if (secLevel === 2) {
|
|
1845
|
-
tags.push(`counterparty ${counterparty}`);
|
|
1846
|
-
}
|
|
1847
1977
|
const result = await this.underlying.listOutputs({
|
|
1848
1978
|
basket: BASKET_MAP.protocol,
|
|
1849
|
-
tags,
|
|
1979
|
+
tags: this.protocolTokenTags(originTag, privileged, secLevel, protoName, counterparty),
|
|
1850
1980
|
tagQueryMode: 'all',
|
|
1851
1981
|
include: 'entire transactions'
|
|
1852
1982
|
}, this.adminOriginator);
|
|
1853
1983
|
for (const out of result.outputs) {
|
|
1854
1984
|
if (seen.has(out.outpoint))
|
|
1855
1985
|
continue;
|
|
1856
|
-
const
|
|
1857
|
-
const tx = this.transactionFromResultBeef(result, txid);
|
|
1858
|
-
const dec = sdk_1.PushDrop.decode(tx.outputs[vout].lockingScript);
|
|
1859
|
-
if (dec?.fields == null || dec.fields.length < 6)
|
|
1860
|
-
continue;
|
|
1861
|
-
const f = await this.decryptProtocolTokenFields(dec.fields);
|
|
1862
|
-
if (this.normalizeOriginator(f.domainDecoded) !== originator)
|
|
1863
|
-
continue;
|
|
1864
|
-
if (f.privDecoded !== !!privileged ||
|
|
1865
|
-
f.secLevelDecoded !== secLevel ||
|
|
1866
|
-
f.protoNameDecoded !== protoName ||
|
|
1867
|
-
(f.secLevelDecoded === 2 && f.cptyDecoded !== counterparty)) {
|
|
1868
|
-
continue;
|
|
1869
|
-
}
|
|
1870
|
-
seen.add(out.outpoint);
|
|
1871
|
-
matches.push({
|
|
1872
|
-
tx: tx.toBEEF(),
|
|
1873
|
-
txid,
|
|
1874
|
-
outputIndex: vout,
|
|
1875
|
-
outputScript: tx.outputs[vout].lockingScript.toHex(),
|
|
1876
|
-
satoshis: out.satoshis,
|
|
1986
|
+
const token = await this.parseProtocolTokenOutput(result, out, {
|
|
1877
1987
|
originator,
|
|
1878
|
-
rawOriginator: f.domainDecoded,
|
|
1879
1988
|
privileged,
|
|
1880
|
-
protocol: protoName,
|
|
1881
1989
|
securityLevel: secLevel,
|
|
1882
|
-
|
|
1883
|
-
counterparty
|
|
1990
|
+
protocolName: protoName,
|
|
1991
|
+
counterparty
|
|
1884
1992
|
});
|
|
1993
|
+
if (token == null)
|
|
1994
|
+
continue;
|
|
1995
|
+
seen.add(out.outpoint);
|
|
1996
|
+
matches.push(token);
|
|
1885
1997
|
}
|
|
1886
1998
|
}
|
|
1887
1999
|
return matches;
|
|
@@ -1897,31 +2009,12 @@ class WalletPermissionsManager {
|
|
|
1897
2009
|
include: 'entire transactions'
|
|
1898
2010
|
}, this.adminOriginator);
|
|
1899
2011
|
for (const out of result.outputs) {
|
|
1900
|
-
const
|
|
1901
|
-
|
|
1902
|
-
const dec = sdk_1.PushDrop.decode(tx.outputs[outputIndex].lockingScript);
|
|
1903
|
-
if (!dec?.fields || dec.fields.length < 3)
|
|
2012
|
+
const token = await this.parseBasketTokenOutput(result, out, originator, basket);
|
|
2013
|
+
if (token == null)
|
|
1904
2014
|
continue;
|
|
1905
|
-
|
|
1906
|
-
if (this.normalizeOriginator(domainDecoded) !== originator)
|
|
2015
|
+
if (!includeExpired && this.isTokenExpired(token.expiry))
|
|
1907
2016
|
continue;
|
|
1908
|
-
|
|
1909
|
-
const basketDecoded = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(dec.fields[2]));
|
|
1910
|
-
if (basketDecoded !== basket)
|
|
1911
|
-
continue;
|
|
1912
|
-
if (!includeExpired && this.isTokenExpired(expiryDecoded))
|
|
1913
|
-
continue;
|
|
1914
|
-
return {
|
|
1915
|
-
tx: tx.toBEEF(),
|
|
1916
|
-
txid,
|
|
1917
|
-
outputIndex,
|
|
1918
|
-
outputScript: tx.outputs[outputIndex].lockingScript.toHex(),
|
|
1919
|
-
satoshis: out.satoshis,
|
|
1920
|
-
originator,
|
|
1921
|
-
rawOriginator: domainDecoded,
|
|
1922
|
-
basketName: basketDecoded,
|
|
1923
|
-
expiry: expiryDecoded
|
|
1924
|
-
};
|
|
2017
|
+
return token;
|
|
1925
2018
|
}
|
|
1926
2019
|
}
|
|
1927
2020
|
return undefined;
|
|
@@ -1937,42 +2030,18 @@ class WalletPermissionsManager {
|
|
|
1937
2030
|
include: 'entire transactions'
|
|
1938
2031
|
}, this.adminOriginator);
|
|
1939
2032
|
for (const out of result.outputs) {
|
|
1940
|
-
const
|
|
1941
|
-
const tx = this.transactionFromResultBeef(result, txid);
|
|
1942
|
-
const dec = sdk_1.PushDrop.decode(tx.outputs[outputIndex].lockingScript);
|
|
1943
|
-
if (!dec?.fields || dec.fields.length < 6)
|
|
1944
|
-
continue;
|
|
1945
|
-
const [domainRaw, expiryRaw, privRaw, typeRaw, fieldsRaw, verifierRaw] = dec.fields;
|
|
1946
|
-
const domainDecoded = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(domainRaw));
|
|
1947
|
-
if (this.normalizeOriginator(domainDecoded) !== originator)
|
|
1948
|
-
continue;
|
|
1949
|
-
const expiryDecoded = Number.parseInt(sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(expiryRaw)), 10);
|
|
1950
|
-
const privDecoded = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(privRaw)) === 'true';
|
|
1951
|
-
const typeDecoded = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(typeRaw));
|
|
1952
|
-
const verifierDec = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(verifierRaw));
|
|
1953
|
-
const allFields = JSON.parse(sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(fieldsRaw)));
|
|
1954
|
-
if (privDecoded !== !!privileged || typeDecoded !== certType || verifierDec !== verifier)
|
|
1955
|
-
continue;
|
|
1956
|
-
// Check if 'fields' is a subset of 'allFields'
|
|
1957
|
-
const setAll = new Set(allFields);
|
|
1958
|
-
if (fields.some(f => !setAll.has(f)))
|
|
1959
|
-
continue;
|
|
1960
|
-
if (!includeExpired && this.isTokenExpired(expiryDecoded))
|
|
1961
|
-
continue;
|
|
1962
|
-
return {
|
|
1963
|
-
tx: tx.toBEEF(),
|
|
1964
|
-
txid,
|
|
1965
|
-
outputIndex,
|
|
1966
|
-
outputScript: tx.outputs[outputIndex].lockingScript.toHex(),
|
|
1967
|
-
satoshis: out.satoshis,
|
|
2033
|
+
const token = await this.parseCertificateTokenOutput(result, out, {
|
|
1968
2034
|
originator,
|
|
1969
|
-
rawOriginator: domainDecoded,
|
|
1970
2035
|
privileged,
|
|
1971
|
-
verifier
|
|
1972
|
-
certType
|
|
1973
|
-
|
|
1974
|
-
|
|
1975
|
-
|
|
2036
|
+
verifier,
|
|
2037
|
+
certType,
|
|
2038
|
+
fields
|
|
2039
|
+
});
|
|
2040
|
+
if (token == null)
|
|
2041
|
+
continue;
|
|
2042
|
+
if (!includeExpired && this.isTokenExpired(token.expiry))
|
|
2043
|
+
continue;
|
|
2044
|
+
return token;
|
|
1976
2045
|
}
|
|
1977
2046
|
}
|
|
1978
2047
|
return undefined;
|
|
@@ -2088,7 +2157,7 @@ class WalletPermissionsManager {
|
|
|
2088
2157
|
async mapWithConcurrency(items, concurrency, fn) {
|
|
2089
2158
|
if (items.length === 0)
|
|
2090
2159
|
return [];
|
|
2091
|
-
const results =
|
|
2160
|
+
const results = Array.from({ length: items.length });
|
|
2092
2161
|
let i = 0;
|
|
2093
2162
|
const worker = async () => {
|
|
2094
2163
|
while (true) {
|
|
@@ -2228,7 +2297,7 @@ class WalletPermissionsManager {
|
|
|
2228
2297
|
satoshis: 1,
|
|
2229
2298
|
outputDescription: 'Renewed permission token',
|
|
2230
2299
|
...(opts?.basket ? { basket: opts.basket } : {}),
|
|
2231
|
-
...(
|
|
2300
|
+
...(opts?.tags == null ? {} : { tags: opts.tags })
|
|
2232
2301
|
}
|
|
2233
2302
|
],
|
|
2234
2303
|
options: {
|
|
@@ -2417,7 +2486,7 @@ class WalletPermissionsManager {
|
|
|
2417
2486
|
async listProtocolPermissions({ originator, privileged, protocolName, protocolSecurityLevel, counterparty } = {}) {
|
|
2418
2487
|
const baseTags = this.buildProtocolFilterTags({ privileged, protocolName, protocolSecurityLevel, counterparty });
|
|
2419
2488
|
const originFilter = originator ? this.prepareOriginator(originator) : undefined;
|
|
2420
|
-
const originVariants =
|
|
2489
|
+
const originVariants = originFilter == null ? [undefined] : originFilter.lookupValues;
|
|
2421
2490
|
const seen = new Set();
|
|
2422
2491
|
const tokens = [];
|
|
2423
2492
|
for (const originTag of originVariants) {
|
|
@@ -2452,15 +2521,22 @@ class WalletPermissionsManager {
|
|
|
2452
2521
|
continue;
|
|
2453
2522
|
const f = await this.decryptProtocolTokenFields(dec.fields);
|
|
2454
2523
|
const normalizedDomain = this.normalizeOriginator(f.domainDecoded);
|
|
2455
|
-
if (
|
|
2524
|
+
if (originFilter != null && normalizedDomain !== originFilter.normalized)
|
|
2456
2525
|
continue;
|
|
2457
2526
|
seen.add(out.outpoint);
|
|
2458
2527
|
tokens.push({
|
|
2459
|
-
tx: tx.toBEEF(),
|
|
2528
|
+
tx: tx.toBEEF(),
|
|
2529
|
+
txid,
|
|
2530
|
+
outputIndex,
|
|
2460
2531
|
outputScript: tx.outputs[outputIndex].lockingScript.toHex(),
|
|
2461
|
-
satoshis: out.satoshis,
|
|
2462
|
-
|
|
2463
|
-
|
|
2532
|
+
satoshis: out.satoshis,
|
|
2533
|
+
originator: normalizedDomain,
|
|
2534
|
+
rawOriginator: f.domainDecoded,
|
|
2535
|
+
expiry: f.expiryDecoded,
|
|
2536
|
+
privileged: f.privDecoded,
|
|
2537
|
+
securityLevel: f.secLevelDecoded,
|
|
2538
|
+
protocol: f.protoNameDecoded,
|
|
2539
|
+
counterparty: f.cptyDecoded
|
|
2464
2540
|
});
|
|
2465
2541
|
}
|
|
2466
2542
|
}
|
|
@@ -2495,7 +2571,7 @@ class WalletPermissionsManager {
|
|
|
2495
2571
|
baseTags.push(`basket ${params.basket}`);
|
|
2496
2572
|
}
|
|
2497
2573
|
const originFilter = params.originator ? this.prepareOriginator(params.originator) : undefined;
|
|
2498
|
-
const originVariants =
|
|
2574
|
+
const originVariants = originFilter == null ? [undefined] : originFilter.lookupValues;
|
|
2499
2575
|
const seen = new Set();
|
|
2500
2576
|
const tokens = [];
|
|
2501
2577
|
for (const originTag of originVariants) {
|
|
@@ -2510,37 +2586,41 @@ class WalletPermissionsManager {
|
|
|
2510
2586
|
include: 'entire transactions',
|
|
2511
2587
|
limit: 10000
|
|
2512
2588
|
}, this.adminOriginator);
|
|
2513
|
-
|
|
2514
|
-
if (seen.has(out.outpoint))
|
|
2515
|
-
continue;
|
|
2516
|
-
const [txid, outputIndex] = this.parseOutpoint(out.outpoint);
|
|
2517
|
-
const tx = this.transactionFromResultBeef(result, txid);
|
|
2518
|
-
const dec = sdk_1.PushDrop.decode(tx.outputs[outputIndex].lockingScript);
|
|
2519
|
-
if (!dec?.fields || dec.fields.length < 3)
|
|
2520
|
-
continue;
|
|
2521
|
-
const [domainRaw, expiryRaw, basketRaw] = dec.fields;
|
|
2522
|
-
const domainDecoded = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(domainRaw));
|
|
2523
|
-
const normalizedDomain = this.normalizeOriginator(domainDecoded);
|
|
2524
|
-
if ((originFilter != null) && normalizedDomain !== originFilter.normalized)
|
|
2525
|
-
continue;
|
|
2526
|
-
const expiryDecoded = Number.parseInt(sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(expiryRaw)), 10);
|
|
2527
|
-
const basketDecoded = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(basketRaw));
|
|
2528
|
-
seen.add(out.outpoint);
|
|
2529
|
-
tokens.push({
|
|
2530
|
-
tx: tx.toBEEF(),
|
|
2531
|
-
txid,
|
|
2532
|
-
outputIndex,
|
|
2533
|
-
satoshis: out.satoshis,
|
|
2534
|
-
outputScript: tx.outputs[outputIndex].lockingScript.toHex(),
|
|
2535
|
-
originator: normalizedDomain,
|
|
2536
|
-
rawOriginator: domainDecoded,
|
|
2537
|
-
basketName: basketDecoded,
|
|
2538
|
-
expiry: expiryDecoded
|
|
2539
|
-
});
|
|
2540
|
-
}
|
|
2589
|
+
await this.collectBasketTokens(result, originFilter, seen, tokens);
|
|
2541
2590
|
}
|
|
2542
2591
|
return tokens;
|
|
2543
2592
|
}
|
|
2593
|
+
/** Decodes and appends basket permission tokens from a listOutputs result. */
|
|
2594
|
+
async collectBasketTokens(result, originFilter, seen, tokens) {
|
|
2595
|
+
for (const out of result.outputs) {
|
|
2596
|
+
if (seen.has(out.outpoint))
|
|
2597
|
+
continue;
|
|
2598
|
+
const [txid, outputIndex] = this.parseOutpoint(out.outpoint);
|
|
2599
|
+
const tx = this.transactionFromResultBeef(result, txid);
|
|
2600
|
+
const dec = sdk_1.PushDrop.decode(tx.outputs[outputIndex].lockingScript);
|
|
2601
|
+
if (!dec?.fields || dec.fields.length < 3)
|
|
2602
|
+
continue;
|
|
2603
|
+
const [domainRaw, expiryRaw, basketRaw] = dec.fields;
|
|
2604
|
+
const domainDecoded = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(domainRaw));
|
|
2605
|
+
const normalizedDomain = this.normalizeOriginator(domainDecoded);
|
|
2606
|
+
if (originFilter != null && normalizedDomain !== originFilter.normalized)
|
|
2607
|
+
continue;
|
|
2608
|
+
const expiryDecoded = Number.parseInt(sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(expiryRaw)), 10);
|
|
2609
|
+
const basketDecoded = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(basketRaw));
|
|
2610
|
+
seen.add(out.outpoint);
|
|
2611
|
+
tokens.push({
|
|
2612
|
+
tx: tx.toBEEF(),
|
|
2613
|
+
txid,
|
|
2614
|
+
outputIndex,
|
|
2615
|
+
satoshis: out.satoshis,
|
|
2616
|
+
outputScript: tx.outputs[outputIndex].lockingScript.toHex(),
|
|
2617
|
+
originator: normalizedDomain,
|
|
2618
|
+
rawOriginator: domainDecoded,
|
|
2619
|
+
basketName: basketDecoded,
|
|
2620
|
+
expiry: expiryDecoded
|
|
2621
|
+
});
|
|
2622
|
+
}
|
|
2623
|
+
}
|
|
2544
2624
|
/**
|
|
2545
2625
|
* Returns `true` if the originator already holds a valid unexpired basket permission for `basket`.
|
|
2546
2626
|
*/
|
|
@@ -2632,7 +2712,7 @@ class WalletPermissionsManager {
|
|
|
2632
2712
|
if (params.verifier)
|
|
2633
2713
|
baseTags.push(`verifier ${params.verifier}`);
|
|
2634
2714
|
const originFilter = params.originator ? this.prepareOriginator(params.originator) : undefined;
|
|
2635
|
-
const originVariants =
|
|
2715
|
+
const originVariants = originFilter == null ? [undefined] : originFilter.lookupValues;
|
|
2636
2716
|
const seen = new Set();
|
|
2637
2717
|
const tokens = [];
|
|
2638
2718
|
for (const originTag of originVariants) {
|
|
@@ -2655,7 +2735,7 @@ class WalletPermissionsManager {
|
|
|
2655
2735
|
const [domainRaw, expiryRaw, privRaw, typeRaw, fieldsRaw, verifierRaw] = dec.fields;
|
|
2656
2736
|
const domainDecoded = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(domainRaw));
|
|
2657
2737
|
const normalizedDomain = this.normalizeOriginator(domainDecoded);
|
|
2658
|
-
if (
|
|
2738
|
+
if (originFilter != null && normalizedDomain !== originFilter.normalized)
|
|
2659
2739
|
continue;
|
|
2660
2740
|
const expiryDecoded = Number.parseInt(sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(expiryRaw)), 10);
|
|
2661
2741
|
const privDecoded = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(privRaw)) === 'true';
|
|
@@ -2664,11 +2744,18 @@ class WalletPermissionsManager {
|
|
|
2664
2744
|
const allFields = JSON.parse(sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(fieldsRaw)));
|
|
2665
2745
|
seen.add(out.outpoint);
|
|
2666
2746
|
tokens.push({
|
|
2667
|
-
tx: tx.toBEEF(),
|
|
2747
|
+
tx: tx.toBEEF(),
|
|
2748
|
+
txid,
|
|
2749
|
+
outputIndex,
|
|
2750
|
+
satoshis: out.satoshis,
|
|
2668
2751
|
outputScript: tx.outputs[outputIndex].lockingScript.toHex(),
|
|
2669
|
-
originator: normalizedDomain,
|
|
2670
|
-
|
|
2671
|
-
|
|
2752
|
+
originator: normalizedDomain,
|
|
2753
|
+
rawOriginator: domainDecoded,
|
|
2754
|
+
privileged: privDecoded,
|
|
2755
|
+
certType: typeDecoded,
|
|
2756
|
+
certFields: allFields,
|
|
2757
|
+
verifier: verifierDec,
|
|
2758
|
+
expiry: expiryDecoded
|
|
2672
2759
|
});
|
|
2673
2760
|
}
|
|
2674
2761
|
}
|
|
@@ -2713,7 +2800,7 @@ class WalletPermissionsManager {
|
|
|
2713
2800
|
? this.listSpendingAuthorizations({ originator: preparedOriginator.normalized })
|
|
2714
2801
|
: Promise.resolve([])
|
|
2715
2802
|
]);
|
|
2716
|
-
const spendingTokenList =
|
|
2803
|
+
const spendingTokenList = spendingTokens.length > 0 ? [spendingTokens[0]] : [];
|
|
2717
2804
|
const allTokens = [...protocolTokens, ...basketTokens, ...certificateTokens, ...spendingTokenList];
|
|
2718
2805
|
const seen = new Set();
|
|
2719
2806
|
const deduped = allTokens.filter(t => {
|
|
@@ -2833,11 +2920,21 @@ class WalletPermissionsManager {
|
|
|
2833
2920
|
const nonPLabels = this.splitLabelsByPermissionModule(args.labels, pModulesByScheme);
|
|
2834
2921
|
// 2) Check permissions for non-P baskets
|
|
2835
2922
|
for (const basket of nonPBaskets) {
|
|
2836
|
-
await this.ensureBasketAccess({
|
|
2923
|
+
await this.ensureBasketAccess({
|
|
2924
|
+
originator: originator,
|
|
2925
|
+
basket,
|
|
2926
|
+
reason: args.description,
|
|
2927
|
+
usageType: 'insertion'
|
|
2928
|
+
});
|
|
2837
2929
|
}
|
|
2838
2930
|
// 3) Check permissions for non-P labels
|
|
2839
2931
|
for (const lbl of nonPLabels) {
|
|
2840
|
-
await this.ensureLabelAccess({
|
|
2932
|
+
await this.ensureLabelAccess({
|
|
2933
|
+
originator: originator,
|
|
2934
|
+
label: lbl,
|
|
2935
|
+
reason: args.description,
|
|
2936
|
+
usageType: 'apply'
|
|
2937
|
+
});
|
|
2841
2938
|
}
|
|
2842
2939
|
// 4) Force signAndProcess=false unless the originator is admin and explicitly sets it to true.
|
|
2843
2940
|
const modifiedOptions = this.enforceSignAndProcess(args.options, originator);
|
|
@@ -2875,7 +2972,12 @@ class WalletPermissionsManager {
|
|
|
2875
2972
|
// 8) If netSpent > 0, require spending authorization. Abort if denied.
|
|
2876
2973
|
if (netSpent > 0) {
|
|
2877
2974
|
try {
|
|
2878
|
-
await this.ensureSpendingAuthorization({
|
|
2975
|
+
await this.ensureSpendingAuthorization({
|
|
2976
|
+
originator: originator,
|
|
2977
|
+
satoshis: netSpent,
|
|
2978
|
+
lineItems,
|
|
2979
|
+
reason: originalDescription
|
|
2980
|
+
});
|
|
2879
2981
|
}
|
|
2880
2982
|
catch (err) {
|
|
2881
2983
|
await this.underlying.abortAction({ reference });
|
|
@@ -2937,7 +3039,9 @@ class WalletPermissionsManager {
|
|
|
2937
3039
|
}
|
|
2938
3040
|
});
|
|
2939
3041
|
await Promise.all([
|
|
2940
|
-
(async () => {
|
|
3042
|
+
(async () => {
|
|
3043
|
+
args.description = await this.maybeEncryptMetadata(args.description);
|
|
3044
|
+
})(),
|
|
2941
3045
|
...inputEncryptionTasks,
|
|
2942
3046
|
...outputEncryptionTasks
|
|
2943
3047
|
]);
|
|
@@ -2950,7 +3054,11 @@ class WalletPermissionsManager {
|
|
|
2950
3054
|
const pModules = Array.from(pModulesByScheme.values());
|
|
2951
3055
|
let transformedArgs = finalArgs;
|
|
2952
3056
|
for (const module of pModules) {
|
|
2953
|
-
const transformed = await module.onRequest({
|
|
3057
|
+
const transformed = await module.onRequest({
|
|
3058
|
+
method: 'createAction',
|
|
3059
|
+
args: transformedArgs,
|
|
3060
|
+
originator: originator
|
|
3061
|
+
});
|
|
2954
3062
|
transformedArgs = transformed.args;
|
|
2955
3063
|
}
|
|
2956
3064
|
let createResult = await this.underlying.createAction(transformedArgs, originator);
|
|
@@ -3094,85 +3202,86 @@ class WalletPermissionsManager {
|
|
|
3094
3202
|
// 4) Transparently decrypt transaction metadata, if configured to do so.
|
|
3095
3203
|
return await this.decryptListActionsMetadata(results);
|
|
3096
3204
|
}
|
|
3097
|
-
|
|
3098
|
-
const
|
|
3099
|
-
// 1) Identify unique P-modules involved (one per schemeID) from both baskets and labels
|
|
3100
|
-
const pModulesByScheme = new Map();
|
|
3101
|
-
const nonPBaskets = [];
|
|
3102
|
-
// Check baskets for p modules
|
|
3205
|
+
collectInternalizeActionBaskets(requestArgs, pModulesByScheme) {
|
|
3206
|
+
const nonPModuleBaskets = [];
|
|
3103
3207
|
for (const outIndex in requestArgs.outputs) {
|
|
3104
|
-
const
|
|
3105
|
-
if (
|
|
3106
|
-
|
|
3107
|
-
|
|
3108
|
-
|
|
3109
|
-
|
|
3110
|
-
|
|
3111
|
-
|
|
3112
|
-
|
|
3113
|
-
nonPBaskets.push({
|
|
3114
|
-
outIndex,
|
|
3115
|
-
basket,
|
|
3116
|
-
customInstructions: out.insertionRemittance.customInstructions
|
|
3117
|
-
});
|
|
3118
|
-
}
|
|
3208
|
+
const output = requestArgs.outputs[outIndex];
|
|
3209
|
+
if (output.protocol !== 'basket insertion')
|
|
3210
|
+
continue;
|
|
3211
|
+
const { basket, customInstructions } = output.insertionRemittance;
|
|
3212
|
+
if (basket.startsWith('p ')) {
|
|
3213
|
+
this.addPModuleByScheme(basket.split(' ')[1], 'basket', pModulesByScheme);
|
|
3214
|
+
}
|
|
3215
|
+
else {
|
|
3216
|
+
nonPModuleBaskets.push({ outIndex, basket, customInstructions });
|
|
3119
3217
|
}
|
|
3120
3218
|
}
|
|
3121
|
-
|
|
3122
|
-
|
|
3123
|
-
|
|
3124
|
-
for (const { outIndex, basket, customInstructions } of
|
|
3219
|
+
return nonPModuleBaskets;
|
|
3220
|
+
}
|
|
3221
|
+
async authorizeInternalizeActionBaskets(requestArgs, originator, baskets) {
|
|
3222
|
+
for (const { outIndex, basket, customInstructions } of baskets) {
|
|
3125
3223
|
await this.ensureBasketAccess({
|
|
3126
|
-
originator
|
|
3224
|
+
originator,
|
|
3127
3225
|
basket,
|
|
3128
3226
|
reason: requestArgs.description,
|
|
3129
3227
|
usageType: 'insertion'
|
|
3130
3228
|
});
|
|
3131
|
-
if (customInstructions)
|
|
3132
|
-
|
|
3133
|
-
|
|
3134
|
-
|
|
3229
|
+
if (customInstructions == null || customInstructions === '')
|
|
3230
|
+
continue;
|
|
3231
|
+
requestArgs.outputs[outIndex].insertionRemittance.customInstructions =
|
|
3232
|
+
await this.maybeEncryptMetadata(customInstructions);
|
|
3135
3233
|
}
|
|
3136
|
-
|
|
3137
|
-
|
|
3234
|
+
}
|
|
3235
|
+
async authorizeInternalizeActionLabels(requestArgs, originator, labels) {
|
|
3236
|
+
for (const label of labels) {
|
|
3138
3237
|
await this.ensureLabelAccess({
|
|
3139
|
-
originator
|
|
3140
|
-
label
|
|
3238
|
+
originator,
|
|
3239
|
+
label,
|
|
3141
3240
|
reason: requestArgs.description,
|
|
3142
3241
|
usageType: 'apply'
|
|
3143
3242
|
});
|
|
3144
3243
|
}
|
|
3244
|
+
}
|
|
3245
|
+
async encryptInternalizeActionModuleMetadata(requestArgs) {
|
|
3246
|
+
for (const outIndex in requestArgs.outputs) {
|
|
3247
|
+
const output = requestArgs.outputs[outIndex];
|
|
3248
|
+
const customInstructions = output.insertionRemittance?.customInstructions;
|
|
3249
|
+
if (output.protocol !== 'basket insertion' || !customInstructions)
|
|
3250
|
+
continue;
|
|
3251
|
+
output.insertionRemittance.customInstructions = await this.maybeEncryptMetadata(customInstructions);
|
|
3252
|
+
}
|
|
3253
|
+
}
|
|
3254
|
+
async runInternalizeActionModules(requestArgs, originator, modules) {
|
|
3255
|
+
let transformedArgs = requestArgs;
|
|
3256
|
+
for (const module of modules) {
|
|
3257
|
+
const transformed = await module.onRequest({
|
|
3258
|
+
method: 'internalizeAction',
|
|
3259
|
+
args: transformedArgs,
|
|
3260
|
+
originator
|
|
3261
|
+
});
|
|
3262
|
+
transformedArgs = transformed.args;
|
|
3263
|
+
}
|
|
3264
|
+
await this.encryptInternalizeActionModuleMetadata(transformedArgs);
|
|
3265
|
+
let result = await this.underlying.internalizeAction(transformedArgs, originator);
|
|
3266
|
+
for (let index = modules.length - 1; index >= 0; index--) {
|
|
3267
|
+
result = await modules[index].onResponse(result, {
|
|
3268
|
+
method: 'internalizeAction',
|
|
3269
|
+
originator
|
|
3270
|
+
});
|
|
3271
|
+
}
|
|
3272
|
+
return result;
|
|
3273
|
+
}
|
|
3274
|
+
async internalizeAction(...args) {
|
|
3275
|
+
const [requestArgs, originator] = args;
|
|
3276
|
+
// 1) Identify unique P-modules involved (one per schemeID) from both baskets and labels
|
|
3277
|
+
const pModulesByScheme = new Map();
|
|
3278
|
+
const nonPBaskets = this.collectInternalizeActionBaskets(requestArgs, pModulesByScheme);
|
|
3279
|
+
const nonPLabels = this.splitLabelsByPermissionModule(requestArgs.labels, pModulesByScheme);
|
|
3280
|
+
await this.authorizeInternalizeActionBaskets(requestArgs, originator, nonPBaskets);
|
|
3281
|
+
await this.authorizeInternalizeActionLabels(requestArgs, originator, nonPLabels);
|
|
3145
3282
|
// 4) Call underlying wallet, with P-module transformations if needed
|
|
3146
3283
|
if (pModulesByScheme.size > 0) {
|
|
3147
|
-
|
|
3148
|
-
const pModules = Array.from(pModulesByScheme.values());
|
|
3149
|
-
// Chain onRequest calls through all modules in order
|
|
3150
|
-
let transformedArgs = requestArgs;
|
|
3151
|
-
for (const module of pModules) {
|
|
3152
|
-
const transformed = await module.onRequest({
|
|
3153
|
-
method: 'internalizeAction',
|
|
3154
|
-
args: transformedArgs,
|
|
3155
|
-
originator: originator
|
|
3156
|
-
});
|
|
3157
|
-
transformedArgs = transformed.args;
|
|
3158
|
-
}
|
|
3159
|
-
// Encrypt custom instructions for p basket outputs
|
|
3160
|
-
for (const outIndex in transformedArgs.outputs) {
|
|
3161
|
-
const out = transformedArgs.outputs[outIndex];
|
|
3162
|
-
if (out.protocol === 'basket insertion' && out.insertionRemittance?.customInstructions) {
|
|
3163
|
-
out.insertionRemittance.customInstructions = await this.maybeEncryptMetadata(out.insertionRemittance.customInstructions);
|
|
3164
|
-
}
|
|
3165
|
-
}
|
|
3166
|
-
// Call underlying wallet with transformed args
|
|
3167
|
-
let results = await this.underlying.internalizeAction(transformedArgs, originator);
|
|
3168
|
-
// Chain onResponse calls in reverse order
|
|
3169
|
-
for (let i = pModules.length - 1; i >= 0; i--) {
|
|
3170
|
-
results = await pModules[i].onResponse(results, {
|
|
3171
|
-
method: 'internalizeAction',
|
|
3172
|
-
originator: originator
|
|
3173
|
-
});
|
|
3174
|
-
}
|
|
3175
|
-
return results;
|
|
3284
|
+
return await this.runInternalizeActionModules(requestArgs, originator, Array.from(pModulesByScheme.values()));
|
|
3176
3285
|
}
|
|
3177
3286
|
// No P-modules - call underlying wallet directly
|
|
3178
3287
|
return await this.underlying.internalizeAction(...args);
|
|
@@ -3593,6 +3702,22 @@ class WalletPermissionsManager {
|
|
|
3593
3702
|
* user a duplicate prompt for a grant they already made moments ago.
|
|
3594
3703
|
*/
|
|
3595
3704
|
async hasRecentOrPendingGrant(cacheKey) {
|
|
3705
|
+
if (!this.telemetry.enabled)
|
|
3706
|
+
return await this.hasRecentOrPendingGrantCore(cacheKey);
|
|
3707
|
+
return await this.telemetry.withSpan('wallet.permission.cache_check', {
|
|
3708
|
+
component: 'wallet-permissions'
|
|
3709
|
+
}, async (span) => {
|
|
3710
|
+
const result = await this.hasRecentOrPendingGrantCore(cacheKey);
|
|
3711
|
+
span.end({
|
|
3712
|
+
attributes: {
|
|
3713
|
+
'permission.cache_hit': result,
|
|
3714
|
+
'permission.mint_in_flight': this.mintsInFlight.has(cacheKey)
|
|
3715
|
+
}
|
|
3716
|
+
});
|
|
3717
|
+
return result;
|
|
3718
|
+
});
|
|
3719
|
+
}
|
|
3720
|
+
async hasRecentOrPendingGrantCore(cacheKey) {
|
|
3596
3721
|
if (this.isPermissionCached(cacheKey) || this.isRecentlyGranted(cacheKey))
|
|
3597
3722
|
return true;
|
|
3598
3723
|
const inFlight = this.mintsInFlight.get(cacheKey);
|