@arkade-os/sdk 0.4.27 → 0.4.28
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/README.md +31 -100
- package/dist/adapters/asyncStorage.cjs +48 -0
- package/dist/adapters/asyncStorage.cjs.map +1 -0
- package/dist/adapters/asyncStorage.d.cts +16 -0
- package/dist/{types/storage → adapters}/asyncStorage.d.ts +5 -2
- package/dist/adapters/asyncStorage.js +46 -0
- package/dist/adapters/asyncStorage.js.map +1 -0
- package/dist/adapters/expo.cjs +19 -0
- package/dist/adapters/expo.cjs.map +1 -0
- package/dist/adapters/expo.d.cts +48 -0
- package/dist/adapters/expo.d.ts +48 -0
- package/dist/adapters/expo.js +6 -0
- package/dist/adapters/expo.js.map +1 -0
- package/dist/adapters/fileSystem.cjs +116 -0
- package/dist/adapters/fileSystem.cjs.map +1 -0
- package/dist/adapters/fileSystem.d.cts +17 -0
- package/dist/{types/storage → adapters}/fileSystem.d.ts +5 -2
- package/dist/adapters/fileSystem.js +93 -0
- package/dist/adapters/fileSystem.js.map +1 -0
- package/dist/adapters/indexedDB.cjs +103 -0
- package/dist/adapters/indexedDB.cjs.map +1 -0
- package/dist/adapters/indexedDB.d.cts +18 -0
- package/dist/{types/storage → adapters}/indexedDB.d.ts +5 -2
- package/dist/adapters/indexedDB.js +101 -0
- package/dist/adapters/indexedDB.js.map +1 -0
- package/dist/adapters/localStorage.cjs +50 -0
- package/dist/adapters/localStorage.cjs.map +1 -0
- package/dist/{types/storage/inMemory.d.ts → adapters/localStorage.d.cts} +6 -3
- package/dist/{types/storage → adapters}/localStorage.d.ts +5 -2
- package/dist/adapters/localStorage.js +48 -0
- package/dist/adapters/localStorage.js.map +1 -0
- package/dist/ark-TZ1gXAXU.d.cts +3880 -0
- package/dist/ark-TZ1gXAXU.d.ts +3880 -0
- package/dist/{types/worker/expo/asyncStorageTaskQueue.d.ts → asyncStorageTaskQueue-Cb1F_Z9s.d.ts} +6 -3
- package/dist/asyncStorageTaskQueue-EFqSmYTg.d.cts +49 -0
- package/dist/chunk-5BLDMQED.cjs +18 -0
- package/dist/chunk-5BLDMQED.cjs.map +1 -0
- package/dist/chunk-5PG7DV7A.cjs +805 -0
- package/dist/chunk-5PG7DV7A.cjs.map +1 -0
- package/dist/chunk-A3EMF7RN.js +95 -0
- package/dist/chunk-A3EMF7RN.js.map +1 -0
- package/dist/chunk-ADV27S4N.cjs +2701 -0
- package/dist/chunk-ADV27S4N.cjs.map +1 -0
- package/dist/chunk-BQLHADL7.js +13805 -0
- package/dist/chunk-BQLHADL7.js.map +1 -0
- package/dist/chunk-CFZMTDWI.js +209 -0
- package/dist/chunk-CFZMTDWI.js.map +1 -0
- package/dist/chunk-FG5ACJJW.cjs +212 -0
- package/dist/chunk-FG5ACJJW.cjs.map +1 -0
- package/dist/chunk-HW3JJ323.js +768 -0
- package/dist/chunk-HW3JJ323.js.map +1 -0
- package/dist/chunk-I3DGUUCT.cjs +838 -0
- package/dist/chunk-I3DGUUCT.cjs.map +1 -0
- package/dist/chunk-IPX2R7FR.cjs +100 -0
- package/dist/chunk-IPX2R7FR.cjs.map +1 -0
- package/dist/chunk-NSBPE2FW.js +15 -0
- package/dist/chunk-NSBPE2FW.js.map +1 -0
- package/dist/chunk-T64LAI7L.js +829 -0
- package/dist/chunk-T64LAI7L.js.map +1 -0
- package/dist/chunk-ZBUDLTBO.js +2671 -0
- package/dist/chunk-ZBUDLTBO.js.map +1 -0
- package/dist/chunk-ZLO6NETT.cjs +13910 -0
- package/dist/chunk-ZLO6NETT.cjs.map +1 -0
- package/dist/contracts/handlers/index.cjs +26 -0
- package/dist/contracts/handlers/index.cjs.map +1 -0
- package/dist/contracts/handlers/index.d.cts +7 -0
- package/dist/contracts/handlers/index.d.ts +7 -0
- package/dist/contracts/handlers/index.js +5 -0
- package/dist/contracts/handlers/index.js.map +1 -0
- package/dist/delegate-BFZs69hp.d.cts +84 -0
- package/dist/delegate-aaVGfWsV.d.ts +84 -0
- package/dist/index-B22cA64m.d.cts +199 -0
- package/dist/{types/storage/index.d.ts → index-C0IanN1m.d.cts} +3 -1
- package/dist/index-C0IanN1m.d.ts +11 -0
- package/dist/index-NDla_UoJ.d.ts +199 -0
- package/dist/index.cjs +480 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +3343 -0
- package/dist/index.d.ts +3343 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/repositories/realm/index.cjs +513 -0
- package/dist/repositories/realm/index.cjs.map +1 -0
- package/dist/repositories/realm/index.d.cts +217 -0
- package/dist/{types/repositories/realm/schemas.d.ts → repositories/realm/index.d.ts} +80 -112
- package/dist/repositories/realm/index.js +507 -0
- package/dist/repositories/realm/index.js.map +1 -0
- package/dist/repositories/sqlite/index.cjs +588 -0
- package/dist/repositories/sqlite/index.cjs.map +1 -0
- package/dist/repositories/sqlite/index.d.cts +118 -0
- package/dist/{types/repositories/sqlite/walletRepository.d.ts → repositories/sqlite/index.d.ts} +58 -5
- package/dist/repositories/sqlite/index.js +585 -0
- package/dist/repositories/sqlite/index.js.map +1 -0
- package/dist/taskRunner-C6Ff4OaU.d.cts +114 -0
- package/dist/taskRunner-yvPN8Z0K.d.ts +114 -0
- package/dist/wallet/expo/background.cjs +93 -0
- package/dist/wallet/expo/background.cjs.map +1 -0
- package/dist/wallet/expo/background.d.cts +84 -0
- package/dist/wallet/expo/background.d.ts +84 -0
- package/dist/wallet/expo/background.js +68 -0
- package/dist/wallet/expo/background.js.map +1 -0
- package/dist/wallet/expo/index.cjs +171 -0
- package/dist/wallet/expo/index.cjs.map +1 -0
- package/dist/wallet/expo/index.d.cts +122 -0
- package/dist/{types/wallet/expo/wallet.d.ts → wallet/expo/index.d.ts} +45 -22
- package/dist/wallet/expo/index.js +169 -0
- package/dist/wallet/expo/index.js.map +1 -0
- package/dist/wallet-AF-p-OWj.d.cts +774 -0
- package/dist/wallet-D9NBRqvC.d.ts +774 -0
- package/dist/worker/expo/index.cjs +140 -0
- package/dist/worker/expo/index.cjs.map +1 -0
- package/dist/worker/expo/index.d.cts +29 -0
- package/dist/worker/expo/index.d.ts +29 -0
- package/dist/worker/expo/index.js +121 -0
- package/dist/worker/expo/index.js.map +1 -0
- package/package.json +110 -76
- package/dist/cjs/adapters/asyncStorage.js +0 -5
- package/dist/cjs/adapters/expo.js +0 -8
- package/dist/cjs/adapters/fileSystem.js +0 -5
- package/dist/cjs/adapters/indexedDB.js +0 -5
- package/dist/cjs/adapters/localStorage.js +0 -5
- package/dist/cjs/arkfee/celenv.js +0 -43
- package/dist/cjs/arkfee/estimator.js +0 -143
- package/dist/cjs/arkfee/index.js +0 -5
- package/dist/cjs/arkfee/types.js +0 -26
- package/dist/cjs/arknote/index.js +0 -128
- package/dist/cjs/bip322/index.js +0 -270
- package/dist/cjs/contracts/arkcontract.js +0 -147
- package/dist/cjs/contracts/contractManager.js +0 -649
- package/dist/cjs/contracts/contractWatcher.js +0 -598
- package/dist/cjs/contracts/handlers/default.js +0 -93
- package/dist/cjs/contracts/handlers/delegate.js +0 -90
- package/dist/cjs/contracts/handlers/helpers.js +0 -115
- package/dist/cjs/contracts/handlers/index.js +0 -19
- package/dist/cjs/contracts/handlers/registry.js +0 -89
- package/dist/cjs/contracts/handlers/vhtlc.js +0 -194
- package/dist/cjs/contracts/index.js +0 -41
- package/dist/cjs/contracts/types.js +0 -2
- package/dist/cjs/contracts/vtxoOwnership.js +0 -78
- package/dist/cjs/extension/asset/assetGroup.js +0 -228
- package/dist/cjs/extension/asset/assetId.js +0 -152
- package/dist/cjs/extension/asset/assetInput.js +0 -222
- package/dist/cjs/extension/asset/assetOutput.js +0 -174
- package/dist/cjs/extension/asset/assetRef.js +0 -148
- package/dist/cjs/extension/asset/index.js +0 -23
- package/dist/cjs/extension/asset/metadata.js +0 -187
- package/dist/cjs/extension/asset/packet.js +0 -114
- package/dist/cjs/extension/asset/types.js +0 -22
- package/dist/cjs/extension/asset/utils.js +0 -105
- package/dist/cjs/extension/index.js +0 -254
- package/dist/cjs/extension/packet.js +0 -20
- package/dist/cjs/forfeit.js +0 -45
- package/dist/cjs/identity/descriptor.js +0 -169
- package/dist/cjs/identity/descriptorProvider.js +0 -2
- package/dist/cjs/identity/hdCapableIdentity.js +0 -20
- package/dist/cjs/identity/index.js +0 -40
- package/dist/cjs/identity/seedIdentity.js +0 -477
- package/dist/cjs/identity/serialize.js +0 -171
- package/dist/cjs/identity/singleKey.js +0 -126
- package/dist/cjs/identity/staticDescriptorProvider.js +0 -65
- package/dist/cjs/index.js +0 -202
- package/dist/cjs/intent/index.js +0 -259
- package/dist/cjs/musig2/index.js +0 -11
- package/dist/cjs/musig2/keys.js +0 -57
- package/dist/cjs/musig2/nonces.js +0 -48
- package/dist/cjs/musig2/sign.js +0 -102
- package/dist/cjs/networks.js +0 -26
- package/dist/cjs/package.json +0 -3
- package/dist/cjs/providers/ark.js +0 -577
- package/dist/cjs/providers/delegator.js +0 -85
- package/dist/cjs/providers/electrum.js +0 -869
- package/dist/cjs/providers/errors.js +0 -59
- package/dist/cjs/providers/expoArk.js +0 -82
- package/dist/cjs/providers/expoIndexer.js +0 -111
- package/dist/cjs/providers/expoUtils.js +0 -124
- package/dist/cjs/providers/indexer.js +0 -630
- package/dist/cjs/providers/onchain.js +0 -262
- package/dist/cjs/providers/utils.js +0 -121
- package/dist/cjs/repositories/contractRepository.js +0 -2
- package/dist/cjs/repositories/inMemory/contractRepository.js +0 -55
- package/dist/cjs/repositories/inMemory/walletRepository.js +0 -115
- package/dist/cjs/repositories/index.js +0 -34
- package/dist/cjs/repositories/indexedDB/contractRepository.js +0 -187
- package/dist/cjs/repositories/indexedDB/db.js +0 -19
- package/dist/cjs/repositories/indexedDB/manager.js +0 -100
- package/dist/cjs/repositories/indexedDB/schema.js +0 -204
- package/dist/cjs/repositories/indexedDB/walletRepository.js +0 -474
- package/dist/cjs/repositories/indexedDB/websqlAdapter.js +0 -144
- package/dist/cjs/repositories/migrations/contractRepositoryImpl.js +0 -127
- package/dist/cjs/repositories/migrations/fromStorageAdapter.js +0 -66
- package/dist/cjs/repositories/migrations/walletRepositoryImpl.js +0 -184
- package/dist/cjs/repositories/realm/contractRepository.js +0 -116
- package/dist/cjs/repositories/realm/index.js +0 -11
- package/dist/cjs/repositories/realm/schemas.js +0 -157
- package/dist/cjs/repositories/realm/types.js +0 -7
- package/dist/cjs/repositories/realm/walletRepository.js +0 -305
- package/dist/cjs/repositories/scriptFromAddress.js +0 -16
- package/dist/cjs/repositories/serialization.js +0 -82
- package/dist/cjs/repositories/sqlite/contractRepository.js +0 -135
- package/dist/cjs/repositories/sqlite/index.js +0 -7
- package/dist/cjs/repositories/sqlite/types.js +0 -2
- package/dist/cjs/repositories/sqlite/walletRepository.js +0 -441
- package/dist/cjs/repositories/walletRepository.js +0 -2
- package/dist/cjs/script/address.js +0 -108
- package/dist/cjs/script/base.js +0 -185
- package/dist/cjs/script/default.js +0 -57
- package/dist/cjs/script/delegate.js +0 -53
- package/dist/cjs/script/tapscript.js +0 -619
- package/dist/cjs/script/vhtlc.js +0 -170
- package/dist/cjs/storage/asyncStorage.js +0 -50
- package/dist/cjs/storage/fileSystem.js +0 -141
- package/dist/cjs/storage/inMemory.js +0 -24
- package/dist/cjs/storage/index.js +0 -2
- package/dist/cjs/storage/indexedDB.js +0 -101
- package/dist/cjs/storage/localStorage.js +0 -51
- package/dist/cjs/tree/signingSession.js +0 -229
- package/dist/cjs/tree/txTree.js +0 -192
- package/dist/cjs/tree/validation.js +0 -107
- package/dist/cjs/utils/anchor.js +0 -35
- package/dist/cjs/utils/arkTransaction.js +0 -271
- package/dist/cjs/utils/bip21.js +0 -127
- package/dist/cjs/utils/syncCursors.js +0 -128
- package/dist/cjs/utils/timelock.js +0 -59
- package/dist/cjs/utils/transaction.js +0 -28
- package/dist/cjs/utils/transactionHistory.js +0 -183
- package/dist/cjs/utils/txSizeEstimator.js +0 -132
- package/dist/cjs/utils/unknownFields.js +0 -174
- package/dist/cjs/wallet/asset-manager.js +0 -330
- package/dist/cjs/wallet/asset.js +0 -119
- package/dist/cjs/wallet/batch.js +0 -183
- package/dist/cjs/wallet/delegator.js +0 -308
- package/dist/cjs/wallet/expo/background.js +0 -116
- package/dist/cjs/wallet/expo/index.js +0 -9
- package/dist/cjs/wallet/expo/wallet.js +0 -230
- package/dist/cjs/wallet/hdDescriptorProvider.js +0 -188
- package/dist/cjs/wallet/index.js +0 -82
- package/dist/cjs/wallet/inputSignerRouter.js +0 -98
- package/dist/cjs/wallet/onchain.js +0 -290
- package/dist/cjs/wallet/ramps.js +0 -216
- package/dist/cjs/wallet/serviceWorker/wallet-message-handler.js +0 -953
- package/dist/cjs/wallet/serviceWorker/wallet.js +0 -1174
- package/dist/cjs/wallet/signingErrors.js +0 -32
- package/dist/cjs/wallet/unroll.js +0 -293
- package/dist/cjs/wallet/utils.js +0 -111
- package/dist/cjs/wallet/validation.js +0 -154
- package/dist/cjs/wallet/vtxo-manager.js +0 -1142
- package/dist/cjs/wallet/wallet.js +0 -2195
- package/dist/cjs/wallet/walletReceiveRotator.js +0 -547
- package/dist/cjs/worker/browser/service-worker-manager.js +0 -183
- package/dist/cjs/worker/browser/utils.js +0 -67
- package/dist/cjs/worker/errors.js +0 -16
- package/dist/cjs/worker/expo/asyncStorageTaskQueue.js +0 -78
- package/dist/cjs/worker/expo/index.js +0 -13
- package/dist/cjs/worker/expo/processors/contractPollProcessor.js +0 -62
- package/dist/cjs/worker/expo/processors/index.js +0 -6
- package/dist/cjs/worker/expo/taskQueue.js +0 -41
- package/dist/cjs/worker/expo/taskRunner.js +0 -73
- package/dist/cjs/worker/messageBus.js +0 -474
- package/dist/esm/adapters/asyncStorage.js +0 -1
- package/dist/esm/adapters/expo.js +0 -3
- package/dist/esm/adapters/fileSystem.js +0 -1
- package/dist/esm/adapters/indexedDB.js +0 -1
- package/dist/esm/adapters/localStorage.js +0 -1
- package/dist/esm/arkfee/celenv.js +0 -40
- package/dist/esm/arkfee/estimator.js +0 -139
- package/dist/esm/arkfee/index.js +0 -1
- package/dist/esm/arkfee/types.js +0 -22
- package/dist/esm/arknote/index.js +0 -124
- package/dist/esm/bip322/index.js +0 -267
- package/dist/esm/contracts/arkcontract.js +0 -140
- package/dist/esm/contracts/contractManager.js +0 -645
- package/dist/esm/contracts/contractWatcher.js +0 -594
- package/dist/esm/contracts/handlers/default.js +0 -90
- package/dist/esm/contracts/handlers/delegate.js +0 -87
- package/dist/esm/contracts/handlers/helpers.js +0 -110
- package/dist/esm/contracts/handlers/index.js +0 -12
- package/dist/esm/contracts/handlers/registry.js +0 -86
- package/dist/esm/contracts/handlers/vhtlc.js +0 -191
- package/dist/esm/contracts/index.js +0 -13
- package/dist/esm/contracts/types.js +0 -1
- package/dist/esm/contracts/vtxoOwnership.js +0 -69
- package/dist/esm/extension/asset/assetGroup.js +0 -224
- package/dist/esm/extension/asset/assetId.js +0 -148
- package/dist/esm/extension/asset/assetInput.js +0 -217
- package/dist/esm/extension/asset/assetOutput.js +0 -169
- package/dist/esm/extension/asset/assetRef.js +0 -144
- package/dist/esm/extension/asset/index.js +0 -8
- package/dist/esm/extension/asset/metadata.js +0 -182
- package/dist/esm/extension/asset/packet.js +0 -110
- package/dist/esm/extension/asset/types.js +0 -19
- package/dist/esm/extension/asset/utils.js +0 -99
- package/dist/esm/extension/index.js +0 -248
- package/dist/esm/extension/packet.js +0 -16
- package/dist/esm/forfeit.js +0 -41
- package/dist/esm/identity/descriptor.js +0 -161
- package/dist/esm/identity/descriptorProvider.js +0 -1
- package/dist/esm/identity/hdCapableIdentity.js +0 -17
- package/dist/esm/identity/index.js +0 -13
- package/dist/esm/identity/seedIdentity.js +0 -469
- package/dist/esm/identity/serialize.js +0 -164
- package/dist/esm/identity/singleKey.js +0 -121
- package/dist/esm/identity/staticDescriptorProvider.js +0 -61
- package/dist/esm/index.js +0 -87
- package/dist/esm/intent/index.js +0 -255
- package/dist/esm/musig2/index.js +0 -3
- package/dist/esm/musig2/keys.js +0 -21
- package/dist/esm/musig2/nonces.js +0 -11
- package/dist/esm/musig2/sign.js +0 -63
- package/dist/esm/networks.js +0 -22
- package/dist/esm/package.json +0 -3
- package/dist/esm/providers/ark.js +0 -572
- package/dist/esm/providers/delegator.js +0 -81
- package/dist/esm/providers/electrum.js +0 -864
- package/dist/esm/providers/errors.js +0 -54
- package/dist/esm/providers/expoArk.js +0 -78
- package/dist/esm/providers/expoIndexer.js +0 -107
- package/dist/esm/providers/expoUtils.js +0 -87
- package/dist/esm/providers/indexer.js +0 -626
- package/dist/esm/providers/onchain.js +0 -258
- package/dist/esm/providers/utils.js +0 -117
- package/dist/esm/repositories/contractRepository.js +0 -1
- package/dist/esm/repositories/inMemory/contractRepository.js +0 -51
- package/dist/esm/repositories/inMemory/walletRepository.js +0 -111
- package/dist/esm/repositories/index.js +0 -10
- package/dist/esm/repositories/indexedDB/contractRepository.js +0 -183
- package/dist/esm/repositories/indexedDB/db.js +0 -4
- package/dist/esm/repositories/indexedDB/manager.js +0 -95
- package/dist/esm/repositories/indexedDB/schema.js +0 -199
- package/dist/esm/repositories/indexedDB/walletRepository.js +0 -470
- package/dist/esm/repositories/indexedDB/websqlAdapter.js +0 -138
- package/dist/esm/repositories/migrations/contractRepositoryImpl.js +0 -121
- package/dist/esm/repositories/migrations/fromStorageAdapter.js +0 -58
- package/dist/esm/repositories/migrations/walletRepositoryImpl.js +0 -180
- package/dist/esm/repositories/realm/contractRepository.js +0 -112
- package/dist/esm/repositories/realm/index.js +0 -3
- package/dist/esm/repositories/realm/schemas.js +0 -153
- package/dist/esm/repositories/realm/types.js +0 -6
- package/dist/esm/repositories/realm/walletRepository.js +0 -301
- package/dist/esm/repositories/scriptFromAddress.js +0 -13
- package/dist/esm/repositories/serialization.js +0 -67
- package/dist/esm/repositories/sqlite/contractRepository.js +0 -131
- package/dist/esm/repositories/sqlite/index.js +0 -2
- package/dist/esm/repositories/sqlite/types.js +0 -1
- package/dist/esm/repositories/sqlite/walletRepository.js +0 -437
- package/dist/esm/repositories/walletRepository.js +0 -1
- package/dist/esm/script/address.js +0 -104
- package/dist/esm/script/base.js +0 -179
- package/dist/esm/script/default.js +0 -54
- package/dist/esm/script/delegate.js +0 -50
- package/dist/esm/script/tapscript.js +0 -615
- package/dist/esm/script/vhtlc.js +0 -167
- package/dist/esm/storage/asyncStorage.js +0 -46
- package/dist/esm/storage/fileSystem.js +0 -104
- package/dist/esm/storage/inMemory.js +0 -20
- package/dist/esm/storage/index.js +0 -1
- package/dist/esm/storage/indexedDB.js +0 -97
- package/dist/esm/storage/localStorage.js +0 -47
- package/dist/esm/tree/signingSession.js +0 -191
- package/dist/esm/tree/txTree.js +0 -188
- package/dist/esm/tree/validation.js +0 -101
- package/dist/esm/utils/anchor.js +0 -31
- package/dist/esm/utils/arkTransaction.js +0 -264
- package/dist/esm/utils/bip21.js +0 -123
- package/dist/esm/utils/syncCursors.js +0 -119
- package/dist/esm/utils/timelock.js +0 -22
- package/dist/esm/utils/transaction.js +0 -24
- package/dist/esm/utils/transactionHistory.js +0 -180
- package/dist/esm/utils/txSizeEstimator.js +0 -128
- package/dist/esm/utils/unknownFields.js +0 -169
- package/dist/esm/wallet/asset-manager.js +0 -325
- package/dist/esm/wallet/asset.js +0 -113
- package/dist/esm/wallet/batch.js +0 -180
- package/dist/esm/wallet/delegator.js +0 -303
- package/dist/esm/wallet/expo/background.js +0 -111
- package/dist/esm/wallet/expo/index.js +0 -2
- package/dist/esm/wallet/expo/wallet.js +0 -193
- package/dist/esm/wallet/hdDescriptorProvider.js +0 -184
- package/dist/esm/wallet/index.js +0 -75
- package/dist/esm/wallet/inputSignerRouter.js +0 -94
- package/dist/esm/wallet/onchain.js +0 -285
- package/dist/esm/wallet/ramps.js +0 -212
- package/dist/esm/wallet/serviceWorker/wallet-message-handler.js +0 -946
- package/dist/esm/wallet/serviceWorker/wallet.js +0 -1169
- package/dist/esm/wallet/signingErrors.js +0 -27
- package/dist/esm/wallet/unroll.js +0 -289
- package/dist/esm/wallet/utils.js +0 -103
- package/dist/esm/wallet/validation.js +0 -142
- package/dist/esm/wallet/vtxo-manager.js +0 -1136
- package/dist/esm/wallet/wallet.js +0 -2186
- package/dist/esm/wallet/walletReceiveRotator.js +0 -540
- package/dist/esm/worker/browser/service-worker-manager.js +0 -177
- package/dist/esm/worker/browser/utils.js +0 -63
- package/dist/esm/worker/errors.js +0 -11
- package/dist/esm/worker/expo/asyncStorageTaskQueue.js +0 -74
- package/dist/esm/worker/expo/index.js +0 -4
- package/dist/esm/worker/expo/processors/contractPollProcessor.js +0 -59
- package/dist/esm/worker/expo/processors/index.js +0 -1
- package/dist/esm/worker/expo/taskQueue.js +0 -37
- package/dist/esm/worker/expo/taskRunner.js +0 -69
- package/dist/esm/worker/messageBus.js +0 -470
- package/dist/types/adapters/asyncStorage.d.ts +0 -2
- package/dist/types/adapters/expo.d.ts +0 -4
- package/dist/types/adapters/fileSystem.d.ts +0 -2
- package/dist/types/adapters/indexedDB.d.ts +0 -2
- package/dist/types/adapters/localStorage.d.ts +0 -2
- package/dist/types/arkfee/celenv.d.ts +0 -25
- package/dist/types/arkfee/estimator.d.ts +0 -49
- package/dist/types/arkfee/index.d.ts +0 -2
- package/dist/types/arkfee/types.d.ts +0 -38
- package/dist/types/arknote/index.d.ts +0 -84
- package/dist/types/bip322/index.d.ts +0 -55
- package/dist/types/contracts/arkcontract.d.ts +0 -99
- package/dist/types/contracts/contractManager.d.ts +0 -411
- package/dist/types/contracts/contractWatcher.d.ts +0 -217
- package/dist/types/contracts/handlers/default.d.ts +0 -19
- package/dist/types/contracts/handlers/delegate.d.ts +0 -21
- package/dist/types/contracts/handlers/helpers.d.ts +0 -19
- package/dist/types/contracts/handlers/index.d.ts +0 -7
- package/dist/types/contracts/handlers/registry.d.ts +0 -65
- package/dist/types/contracts/handlers/vhtlc.d.ts +0 -32
- package/dist/types/contracts/index.d.ts +0 -14
- package/dist/types/contracts/types.d.ts +0 -250
- package/dist/types/contracts/vtxoOwnership.d.ts +0 -33
- package/dist/types/extension/asset/assetGroup.d.ts +0 -119
- package/dist/types/extension/asset/assetId.d.ts +0 -83
- package/dist/types/extension/asset/assetInput.d.ts +0 -64
- package/dist/types/extension/asset/assetOutput.d.ts +0 -54
- package/dist/types/extension/asset/assetRef.d.ts +0 -91
- package/dist/types/extension/asset/index.d.ts +0 -8
- package/dist/types/extension/asset/metadata.d.ts +0 -52
- package/dist/types/extension/asset/packet.d.ts +0 -41
- package/dist/types/extension/asset/types.d.ts +0 -16
- package/dist/types/extension/asset/utils.d.ts +0 -21
- package/dist/types/extension/index.d.ts +0 -56
- package/dist/types/extension/packet.d.ts +0 -21
- package/dist/types/forfeit.d.ts +0 -18
- package/dist/types/identity/descriptor.d.ts +0 -61
- package/dist/types/identity/descriptorProvider.d.ts +0 -42
- package/dist/types/identity/hdCapableIdentity.d.ts +0 -71
- package/dist/types/identity/index.d.ts +0 -57
- package/dist/types/identity/seedIdentity.d.ts +0 -270
- package/dist/types/identity/serialize.d.ts +0 -96
- package/dist/types/identity/singleKey.d.ts +0 -62
- package/dist/types/identity/staticDescriptorProvider.d.ts +0 -18
- package/dist/types/index.d.ts +0 -59
- package/dist/types/intent/index.d.ts +0 -86
- package/dist/types/musig2/index.d.ts +0 -4
- package/dist/types/musig2/keys.d.ts +0 -9
- package/dist/types/musig2/nonces.d.ts +0 -14
- package/dist/types/musig2/sign.d.ts +0 -27
- package/dist/types/networks.d.ts +0 -16
- package/dist/types/providers/ark.d.ts +0 -369
- package/dist/types/providers/delegator.d.ts +0 -82
- package/dist/types/providers/electrum.d.ts +0 -312
- package/dist/types/providers/errors.d.ts +0 -13
- package/dist/types/providers/expoArk.d.ts +0 -22
- package/dist/types/providers/expoIndexer.d.ts +0 -18
- package/dist/types/providers/expoUtils.d.ts +0 -18
- package/dist/types/providers/indexer.d.ts +0 -301
- package/dist/types/providers/onchain.d.ts +0 -148
- package/dist/types/providers/utils.d.ts +0 -12
- package/dist/types/repositories/contractRepository.d.ts +0 -32
- package/dist/types/repositories/inMemory/contractRepository.d.ts +0 -17
- package/dist/types/repositories/inMemory/walletRepository.d.ts +0 -29
- package/dist/types/repositories/index.d.ts +0 -9
- package/dist/types/repositories/indexedDB/contractRepository.d.ts +0 -21
- package/dist/types/repositories/indexedDB/db.d.ts +0 -4
- package/dist/types/repositories/indexedDB/manager.d.ts +0 -25
- package/dist/types/repositories/indexedDB/schema.d.ts +0 -9
- package/dist/types/repositories/indexedDB/walletRepository.d.ts +0 -28
- package/dist/types/repositories/indexedDB/websqlAdapter.d.ts +0 -49
- package/dist/types/repositories/migrations/contractRepositoryImpl.d.ts +0 -24
- package/dist/types/repositories/migrations/fromStorageAdapter.d.ts +0 -19
- package/dist/types/repositories/migrations/walletRepositoryImpl.d.ts +0 -27
- package/dist/types/repositories/realm/contractRepository.d.ts +0 -24
- package/dist/types/repositories/realm/index.d.ts +0 -4
- package/dist/types/repositories/realm/types.d.ts +0 -16
- package/dist/types/repositories/realm/walletRepository.d.ts +0 -34
- package/dist/types/repositories/scriptFromAddress.d.ts +0 -9
- package/dist/types/repositories/serialization.d.ts +0 -65
- package/dist/types/repositories/sqlite/contractRepository.d.ts +0 -33
- package/dist/types/repositories/sqlite/index.d.ts +0 -3
- package/dist/types/repositories/sqlite/types.d.ts +0 -18
- package/dist/types/repositories/walletRepository.d.ts +0 -72
- package/dist/types/script/address.d.ts +0 -67
- package/dist/types/script/base.d.ts +0 -105
- package/dist/types/script/default.d.ts +0 -44
- package/dist/types/script/delegate.d.ts +0 -40
- package/dist/types/script/tapscript.d.ts +0 -169
- package/dist/types/script/vhtlc.d.ts +0 -66
- package/dist/types/tree/signingSession.d.ts +0 -37
- package/dist/types/tree/txTree.d.ts +0 -28
- package/dist/types/tree/validation.d.ts +0 -15
- package/dist/types/utils/anchor.d.ts +0 -19
- package/dist/types/utils/arkTransaction.d.ts +0 -49
- package/dist/types/utils/bip21.d.ts +0 -38
- package/dist/types/utils/syncCursors.d.ts +0 -60
- package/dist/types/utils/timelock.d.ts +0 -9
- package/dist/types/utils/transaction.d.ts +0 -13
- package/dist/types/utils/transactionHistory.d.ts +0 -15
- package/dist/types/utils/txSizeEstimator.d.ts +0 -40
- package/dist/types/utils/unknownFields.d.ts +0 -83
- package/dist/types/wallet/asset-manager.d.ts +0 -69
- package/dist/types/wallet/asset.d.ts +0 -21
- package/dist/types/wallet/batch.d.ts +0 -107
- package/dist/types/wallet/delegator.d.ts +0 -48
- package/dist/types/wallet/expo/background.d.ts +0 -66
- package/dist/types/wallet/expo/index.d.ts +0 -4
- package/dist/types/wallet/hdDescriptorProvider.d.ts +0 -114
- package/dist/types/wallet/index.d.ts +0 -789
- package/dist/types/wallet/inputSignerRouter.d.ts +0 -35
- package/dist/types/wallet/onchain.d.ts +0 -109
- package/dist/types/wallet/ramps.d.ts +0 -64
- package/dist/types/wallet/serviceWorker/wallet-message-handler.d.ts +0 -543
- package/dist/types/wallet/serviceWorker/wallet.d.ts +0 -248
- package/dist/types/wallet/signingErrors.d.ts +0 -19
- package/dist/types/wallet/unroll.d.ts +0 -114
- package/dist/types/wallet/utils.d.ts +0 -36
- package/dist/types/wallet/validation.d.ts +0 -24
- package/dist/types/wallet/vtxo-manager.d.ts +0 -476
- package/dist/types/wallet/wallet.d.ts +0 -409
- package/dist/types/wallet/walletReceiveRotator.d.ts +0 -306
- package/dist/types/worker/browser/service-worker-manager.d.ts +0 -32
- package/dist/types/worker/browser/utils.d.ts +0 -17
- package/dist/types/worker/errors.d.ts +0 -7
- package/dist/types/worker/expo/index.d.ts +0 -7
- package/dist/types/worker/expo/processors/contractPollProcessor.d.ts +0 -19
- package/dist/types/worker/expo/processors/index.d.ts +0 -1
- package/dist/types/worker/expo/taskQueue.d.ts +0 -50
- package/dist/types/worker/expo/taskRunner.d.ts +0 -66
- package/dist/types/worker/messageBus.d.ts +0 -189
|
@@ -1,598 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ContractWatcher = void 0;
|
|
4
|
-
const utils_1 = require("../wallet/utils");
|
|
5
|
-
const utils_2 = require("../providers/utils");
|
|
6
|
-
const vtxoOwnership_1 = require("./vtxoOwnership");
|
|
7
|
-
/**
|
|
8
|
-
* Watches multiple contracts for virtual output state changes with resilient connection handling.
|
|
9
|
-
*
|
|
10
|
-
* Features:
|
|
11
|
-
* - Automatic reconnection with exponential backoff
|
|
12
|
-
* - Failsafe polling to catch missed events
|
|
13
|
-
* - Polls immediately after (re)connection to sync state
|
|
14
|
-
* - Graceful handling of subscription failures
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```typescript
|
|
18
|
-
* const watcher = new ContractWatcher({
|
|
19
|
-
* indexerProvider: wallet.indexerProvider,
|
|
20
|
-
* });
|
|
21
|
-
*
|
|
22
|
-
* // Add the wallet's default contract
|
|
23
|
-
* await watcher.addContract(defaultContract);
|
|
24
|
-
*
|
|
25
|
-
* // Add additional contracts (swaps, etc.)
|
|
26
|
-
* await watcher.addContract(swapContract);
|
|
27
|
-
*
|
|
28
|
-
* // Start watching for events
|
|
29
|
-
* const stop = await watcher.startWatching((event) => {
|
|
30
|
-
* console.log(`${event.type} on contract ${event.contractScript}`);
|
|
31
|
-
* });
|
|
32
|
-
*
|
|
33
|
-
* // Later: stop watching
|
|
34
|
-
* stop();
|
|
35
|
-
* ```
|
|
36
|
-
*/
|
|
37
|
-
class ContractWatcher {
|
|
38
|
-
/**
|
|
39
|
-
* Create a contract watcher with the given providers and polling settings.
|
|
40
|
-
*
|
|
41
|
-
* @param config - Contract watcher configuration
|
|
42
|
-
* @see ContractWatcherConfig
|
|
43
|
-
*/
|
|
44
|
-
constructor(config) {
|
|
45
|
-
this.contracts = new Map();
|
|
46
|
-
this.isWatching = false;
|
|
47
|
-
this.connectionState = "disconnected";
|
|
48
|
-
this.reconnectAttempts = 0;
|
|
49
|
-
this.config = {
|
|
50
|
-
failsafePollIntervalMs: 60000, // 1 minute
|
|
51
|
-
reconnectDelayMs: 1000, // 1 second
|
|
52
|
-
maxReconnectDelayMs: 30000, // 30 seconds
|
|
53
|
-
maxReconnectAttempts: 0, // unlimited
|
|
54
|
-
...config,
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Add a contract to be watched.
|
|
59
|
-
*
|
|
60
|
-
* Active contracts are immediately subscribed.
|
|
61
|
-
*
|
|
62
|
-
* All contracts are polled to discover any existing virtual outputs
|
|
63
|
-
* (which may cause them to be watched even if inactive).
|
|
64
|
-
*/
|
|
65
|
-
async addContract(contract) {
|
|
66
|
-
const state = {
|
|
67
|
-
contract,
|
|
68
|
-
lastKnownVtxos: new Map(),
|
|
69
|
-
};
|
|
70
|
-
this.contracts.set(contract.script, state);
|
|
71
|
-
// Seed the baseline from the repository BEFORE any poll or event
|
|
72
|
-
// emits. Without this, the first poll after (re)start treats every
|
|
73
|
-
// persisted vtxo as "new" and emits `vtxo_received` for each —
|
|
74
|
-
// which downstream triggers a redundant per-vtxo sync on every
|
|
75
|
-
// app launch and can confuse consumers that react to the event.
|
|
76
|
-
await this.seedLastKnownVtxos(state);
|
|
77
|
-
// If we're already watching, poll to discover virtual outputs and update subscription
|
|
78
|
-
if (this.isWatching) {
|
|
79
|
-
// Poll first to discover virtual outputs (may affect whether we watch this contract).
|
|
80
|
-
await this.pollContracts([contract.script]);
|
|
81
|
-
// Update subscription based on active state and virtual outputs.
|
|
82
|
-
await this.tryUpdateSubscription();
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Pre-populate `lastKnownVtxos` from the wallet repository.
|
|
87
|
-
*
|
|
88
|
-
* Runs on add (and can be re-run after reconnect) so polling always
|
|
89
|
-
* compares the indexer's view against what is already persisted,
|
|
90
|
-
* emitting only genuine deltas.
|
|
91
|
-
*/
|
|
92
|
-
async seedLastKnownVtxos(state) {
|
|
93
|
-
try {
|
|
94
|
-
// Apply the same script gate used by getContractVtxos so a legacy
|
|
95
|
-
// wrong-script row in the address bucket can't seed the baseline
|
|
96
|
-
// and then look "spent" on the first poll.
|
|
97
|
-
const cached = await (0, vtxoOwnership_1.getVtxosForContract)(this.config.walletRepository, state.contract);
|
|
98
|
-
for (const vtxo of cached) {
|
|
99
|
-
if (vtxo.isSpent)
|
|
100
|
-
continue;
|
|
101
|
-
const key = `${vtxo.txid}:${vtxo.vout}`;
|
|
102
|
-
state.lastKnownVtxos.set(key, vtxo);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
catch (error) {
|
|
106
|
-
// Don't throw — the watcher can still recover via poll and
|
|
107
|
-
// subscription events. A failed seed just means the first poll
|
|
108
|
-
// may emit some redundant `vtxo_received` events for already
|
|
109
|
-
// known vtxos.
|
|
110
|
-
console.error(`ContractWatcher: failed to seed lastKnownVtxos for ${state.contract.script}`, error);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Update an existing contract.
|
|
115
|
-
*/
|
|
116
|
-
async updateContract(contract) {
|
|
117
|
-
const existing = this.contracts.get(contract.script);
|
|
118
|
-
if (!existing) {
|
|
119
|
-
throw new Error(`Contract ${contract.script} not found`);
|
|
120
|
-
}
|
|
121
|
-
existing.contract = contract;
|
|
122
|
-
if (this.isWatching) {
|
|
123
|
-
await this.tryUpdateSubscription();
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Remove a contract from watching.
|
|
128
|
-
*/
|
|
129
|
-
async removeContract(contractScript) {
|
|
130
|
-
const state = this.contracts.get(contractScript);
|
|
131
|
-
if (state) {
|
|
132
|
-
this.contracts.delete(contractScript);
|
|
133
|
-
if (this.isWatching) {
|
|
134
|
-
await this.tryUpdateSubscription();
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Get all in-memory contracts.
|
|
140
|
-
*/
|
|
141
|
-
getAllContracts() {
|
|
142
|
-
return Array.from(this.contracts.values()).map((s) => s.contract);
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Contracts the watcher is actually tracking:
|
|
146
|
-
* - all active contracts, plus
|
|
147
|
-
* - inactive contracts that still hold known virtual outputs
|
|
148
|
-
* (the subscription keeps watching them so `vtxo_spent` events for
|
|
149
|
-
* those unspent outputs are still observed).
|
|
150
|
-
*
|
|
151
|
-
* This is the single source of truth for "contracts whose VTXO state
|
|
152
|
-
* we still care about" — callers and the subscription itself fan out
|
|
153
|
-
* over the same set so nothing is reconciled that isn't also watched.
|
|
154
|
-
*/
|
|
155
|
-
getWatchedContracts() {
|
|
156
|
-
return Array.from(this.contracts.values())
|
|
157
|
-
.filter((s) => s.contract.state === "active" || s.lastKnownVtxos.size > 0)
|
|
158
|
-
.map((s) => s.contract);
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
* Get virtual outputs for contracts, grouped by contract script.
|
|
162
|
-
* @see WalletRepository for `repo`
|
|
163
|
-
*/
|
|
164
|
-
async getContractVtxos(options) {
|
|
165
|
-
const { contractScripts, includeSpent } = options;
|
|
166
|
-
const repo = this.config.walletRepository;
|
|
167
|
-
const contractsToQuery = Array.from(this.contracts.values());
|
|
168
|
-
const asyncResults = contractsToQuery
|
|
169
|
-
.filter((_) => {
|
|
170
|
-
if (contractScripts &&
|
|
171
|
-
!contractScripts.includes(_.contract.script))
|
|
172
|
-
return false;
|
|
173
|
-
return true;
|
|
174
|
-
})
|
|
175
|
-
.map(async (state) => {
|
|
176
|
-
// Use contract address as cache key. Legacy address buckets
|
|
177
|
-
// can contain rows from other contracts; gate by script before
|
|
178
|
-
// converting so a wrong-script row never reaches the watcher.
|
|
179
|
-
const cached = await (0, vtxoOwnership_1.getVtxosForContract)(repo, state.contract);
|
|
180
|
-
if (cached.length > 0) {
|
|
181
|
-
// Convert to ContractVtxo with contractScript
|
|
182
|
-
const contractVtxos = cached.map((v) => ({
|
|
183
|
-
...v,
|
|
184
|
-
contractScript: state.contract.script,
|
|
185
|
-
}));
|
|
186
|
-
const filtered = includeSpent
|
|
187
|
-
? contractVtxos
|
|
188
|
-
: contractVtxos.filter((v) => !v.isSpent);
|
|
189
|
-
return [[state.contract.script, filtered]];
|
|
190
|
-
}
|
|
191
|
-
return [];
|
|
192
|
-
});
|
|
193
|
-
const results = await Promise.all(asyncResults);
|
|
194
|
-
return new Map(results.flat(1));
|
|
195
|
-
}
|
|
196
|
-
/**
|
|
197
|
-
* Start watching for virtual output events across all active contracts.
|
|
198
|
-
*/
|
|
199
|
-
async startWatching(callback) {
|
|
200
|
-
if (this.isWatching) {
|
|
201
|
-
throw new Error("Already watching");
|
|
202
|
-
}
|
|
203
|
-
this.eventCallback = callback;
|
|
204
|
-
this.isWatching = true;
|
|
205
|
-
this.abortController = new AbortController();
|
|
206
|
-
this.reconnectAttempts = 0;
|
|
207
|
-
// Start connection
|
|
208
|
-
await this.connect();
|
|
209
|
-
// Start failsafe polling
|
|
210
|
-
this.startFailsafePolling();
|
|
211
|
-
return () => this.stopWatching();
|
|
212
|
-
}
|
|
213
|
-
/**
|
|
214
|
-
* Stop watching for events.
|
|
215
|
-
*/
|
|
216
|
-
async stopWatching() {
|
|
217
|
-
this.isWatching = false;
|
|
218
|
-
this.connectionState = "disconnected";
|
|
219
|
-
this.abortController?.abort();
|
|
220
|
-
// Clear timers
|
|
221
|
-
if (this.reconnectTimeoutId) {
|
|
222
|
-
clearTimeout(this.reconnectTimeoutId);
|
|
223
|
-
this.reconnectTimeoutId = undefined;
|
|
224
|
-
}
|
|
225
|
-
if (this.failsafePollIntervalId) {
|
|
226
|
-
clearInterval(this.failsafePollIntervalId);
|
|
227
|
-
this.failsafePollIntervalId = undefined;
|
|
228
|
-
}
|
|
229
|
-
// Unsubscribe
|
|
230
|
-
if (this.subscriptionId) {
|
|
231
|
-
try {
|
|
232
|
-
await this.config.indexerProvider.unsubscribeForScripts(this.subscriptionId);
|
|
233
|
-
}
|
|
234
|
-
catch {
|
|
235
|
-
// Ignore unsubscribe errors
|
|
236
|
-
}
|
|
237
|
-
this.subscriptionId = undefined;
|
|
238
|
-
}
|
|
239
|
-
this.eventCallback = undefined;
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* Check if currently watching.
|
|
243
|
-
*/
|
|
244
|
-
isCurrentlyWatching() {
|
|
245
|
-
return this.isWatching;
|
|
246
|
-
}
|
|
247
|
-
/**
|
|
248
|
-
* Get current connection state.
|
|
249
|
-
*/
|
|
250
|
-
getConnectionState() {
|
|
251
|
-
return this.connectionState;
|
|
252
|
-
}
|
|
253
|
-
/**
|
|
254
|
-
* Force a poll of all active contracts.
|
|
255
|
-
* Useful for manual refresh or after app resume.
|
|
256
|
-
*/
|
|
257
|
-
async forcePoll() {
|
|
258
|
-
if (!this.isWatching)
|
|
259
|
-
return;
|
|
260
|
-
await this.pollAllContracts();
|
|
261
|
-
}
|
|
262
|
-
/**
|
|
263
|
-
* Connect to the subscription.
|
|
264
|
-
*
|
|
265
|
-
* @param skipUpdate - Skip the leading `updateSubscription` call when
|
|
266
|
-
* the caller has already established `subscriptionId`.
|
|
267
|
-
*/
|
|
268
|
-
async connect(skipUpdate = false) {
|
|
269
|
-
if (!this.isWatching)
|
|
270
|
-
return;
|
|
271
|
-
this.connectionState = "connecting";
|
|
272
|
-
try {
|
|
273
|
-
if (!skipUpdate) {
|
|
274
|
-
await this.updateSubscription();
|
|
275
|
-
}
|
|
276
|
-
// Poll immediately after connection to sync state
|
|
277
|
-
await this.pollAllContracts();
|
|
278
|
-
this.connectionState = "connected";
|
|
279
|
-
this.reconnectAttempts = 0;
|
|
280
|
-
// Start listening
|
|
281
|
-
this.listenLoop().catch((e) => {
|
|
282
|
-
// This is handled asynchronously otherwise `connect()` would hang
|
|
283
|
-
// indefinitely and block the caller.
|
|
284
|
-
// Error management must be implemented to ensure the connection
|
|
285
|
-
// is restored and events are fired.
|
|
286
|
-
if ((0, utils_2.isEventSourceError)(e)) {
|
|
287
|
-
console.debug("ContractWatcher subscription disconnected; reconnecting");
|
|
288
|
-
}
|
|
289
|
-
else {
|
|
290
|
-
console.error(e);
|
|
291
|
-
}
|
|
292
|
-
this.connectionState = "disconnected";
|
|
293
|
-
this.eventCallback?.({
|
|
294
|
-
type: "connection_reset",
|
|
295
|
-
timestamp: Date.now(),
|
|
296
|
-
});
|
|
297
|
-
this.scheduleReconnect();
|
|
298
|
-
});
|
|
299
|
-
}
|
|
300
|
-
catch (error) {
|
|
301
|
-
console.error("ContractWatcher connection failed:", error);
|
|
302
|
-
this.connectionState = "disconnected";
|
|
303
|
-
this.eventCallback?.({
|
|
304
|
-
type: "connection_reset",
|
|
305
|
-
timestamp: Date.now(),
|
|
306
|
-
});
|
|
307
|
-
this.scheduleReconnect();
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
/**
|
|
311
|
-
* Schedule a reconnection attempt.
|
|
312
|
-
*/
|
|
313
|
-
scheduleReconnect() {
|
|
314
|
-
if (!this.isWatching)
|
|
315
|
-
return;
|
|
316
|
-
// Check max attempts
|
|
317
|
-
if (this.config.maxReconnectAttempts > 0 &&
|
|
318
|
-
this.reconnectAttempts >= this.config.maxReconnectAttempts) {
|
|
319
|
-
console.error(`ContractWatcher: Max reconnection attempts (${this.config.maxReconnectAttempts}) reached`);
|
|
320
|
-
return;
|
|
321
|
-
}
|
|
322
|
-
this.connectionState = "reconnecting";
|
|
323
|
-
this.reconnectAttempts++;
|
|
324
|
-
// Calculate delay with exponential backoff
|
|
325
|
-
const delay = Math.min(this.config.reconnectDelayMs *
|
|
326
|
-
Math.pow(2, this.reconnectAttempts - 1), this.config.maxReconnectDelayMs);
|
|
327
|
-
this.reconnectTimeoutId = setTimeout(() => {
|
|
328
|
-
this.reconnectTimeoutId = undefined;
|
|
329
|
-
this.connect();
|
|
330
|
-
}, delay);
|
|
331
|
-
}
|
|
332
|
-
/**
|
|
333
|
-
* Start the failsafe polling interval.
|
|
334
|
-
*/
|
|
335
|
-
startFailsafePolling() {
|
|
336
|
-
if (this.failsafePollIntervalId) {
|
|
337
|
-
clearInterval(this.failsafePollIntervalId);
|
|
338
|
-
}
|
|
339
|
-
this.failsafePollIntervalId = setInterval(() => {
|
|
340
|
-
if (this.isWatching) {
|
|
341
|
-
this.pollAllContracts().catch((error) => {
|
|
342
|
-
console.error("ContractWatcher failsafe poll failed:", error);
|
|
343
|
-
});
|
|
344
|
-
}
|
|
345
|
-
}, this.config.failsafePollIntervalMs);
|
|
346
|
-
}
|
|
347
|
-
async pollAllContracts() {
|
|
348
|
-
const scripts = this.getWatchedContracts().map((c) => c.script);
|
|
349
|
-
if (scripts.length === 0)
|
|
350
|
-
return;
|
|
351
|
-
await this.pollContracts(scripts);
|
|
352
|
-
}
|
|
353
|
-
/**
|
|
354
|
-
* Poll specific contracts and emit events for changes.
|
|
355
|
-
*/
|
|
356
|
-
async pollContracts(contractScripts) {
|
|
357
|
-
if (!this.eventCallback)
|
|
358
|
-
return;
|
|
359
|
-
const now = Date.now();
|
|
360
|
-
try {
|
|
361
|
-
// Load all the virtual outputs for these contracts, from DB
|
|
362
|
-
const vtxosMap = await this.getContractVtxos({
|
|
363
|
-
contractScripts,
|
|
364
|
-
includeSpent: false, // only spendable ones!
|
|
365
|
-
});
|
|
366
|
-
for (const contractScript of contractScripts) {
|
|
367
|
-
const state = this.contracts.get(contractScript);
|
|
368
|
-
if (!state)
|
|
369
|
-
continue;
|
|
370
|
-
const currentVtxos = vtxosMap.get(contractScript) || [];
|
|
371
|
-
const currentKeys = new Set(currentVtxos.map((v) => `${v.txid}:${v.vout}`));
|
|
372
|
-
// Find new virtual outputs and add them to the contract's state
|
|
373
|
-
const newVtxos = [];
|
|
374
|
-
for (const vtxo of currentVtxos) {
|
|
375
|
-
const key = `${vtxo.txid}:${vtxo.vout}`;
|
|
376
|
-
if (!state.lastKnownVtxos.has(key)) {
|
|
377
|
-
newVtxos.push(vtxo);
|
|
378
|
-
state.lastKnownVtxos.set(key, vtxo);
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
// Find spent virtual outputs and remove them from the contract's state
|
|
382
|
-
const spentVtxos = [];
|
|
383
|
-
for (const [key, vtxo] of state.lastKnownVtxos) {
|
|
384
|
-
if (!currentKeys.has(key)) {
|
|
385
|
-
spentVtxos.push(vtxo);
|
|
386
|
-
state.lastKnownVtxos.delete(key);
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
// Emit events
|
|
390
|
-
if (newVtxos.length > 0) {
|
|
391
|
-
this.emitVtxoEvent(contractScript, newVtxos, "vtxo_received", now);
|
|
392
|
-
}
|
|
393
|
-
if (spentVtxos.length > 0) {
|
|
394
|
-
// Note: We can't distinguish spent vs swept from polling alone
|
|
395
|
-
// The subscription provides more accurate event types
|
|
396
|
-
this.emitVtxoEvent(contractScript, spentVtxos, "vtxo_spent", now);
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
catch (error) {
|
|
401
|
-
console.error("ContractWatcher poll failed:", error);
|
|
402
|
-
// Don't throw - polling failures shouldn't crash the watcher
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
async tryUpdateSubscription() {
|
|
406
|
-
const hadSubscription = this.subscriptionId !== undefined;
|
|
407
|
-
try {
|
|
408
|
-
await this.updateSubscription();
|
|
409
|
-
}
|
|
410
|
-
catch (error) {
|
|
411
|
-
// nothing, the connection will be retried later
|
|
412
|
-
return;
|
|
413
|
-
}
|
|
414
|
-
// Cold start: `startWatching` may have run with zero scripts,
|
|
415
|
-
// leaving `listenLoop` parked behind the reconnect timer. Kick
|
|
416
|
-
// `connect` now so streaming resumes without waiting on the
|
|
417
|
-
// backoff. `skipUpdate` avoids re-issuing `subscribeForScripts`.
|
|
418
|
-
const justGotSubscription = !hadSubscription && this.subscriptionId !== undefined;
|
|
419
|
-
const listenerParked = this.connectionState === "disconnected" ||
|
|
420
|
-
this.connectionState === "reconnecting";
|
|
421
|
-
if (this.isWatching && justGotSubscription && listenerParked) {
|
|
422
|
-
if (this.reconnectTimeoutId) {
|
|
423
|
-
clearTimeout(this.reconnectTimeoutId);
|
|
424
|
-
this.reconnectTimeoutId = undefined;
|
|
425
|
-
}
|
|
426
|
-
this.reconnectAttempts = 0;
|
|
427
|
-
this.connect(true).catch((error) => {
|
|
428
|
-
console.warn("ContractWatcher cold-start connect failed:", error);
|
|
429
|
-
});
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
/**
|
|
433
|
-
* Update the subscription with scripts that should be watched.
|
|
434
|
-
*
|
|
435
|
-
* Watches both active contracts and contracts with virtual outputs.
|
|
436
|
-
*/
|
|
437
|
-
async updateSubscription() {
|
|
438
|
-
const scriptsToWatch = this.getWatchedContracts().map((c) => c.script);
|
|
439
|
-
if (scriptsToWatch.length === 0) {
|
|
440
|
-
if (this.subscriptionId) {
|
|
441
|
-
try {
|
|
442
|
-
await this.config.indexerProvider.unsubscribeForScripts(this.subscriptionId);
|
|
443
|
-
}
|
|
444
|
-
catch {
|
|
445
|
-
// Ignore
|
|
446
|
-
}
|
|
447
|
-
this.subscriptionId = undefined;
|
|
448
|
-
}
|
|
449
|
-
return;
|
|
450
|
-
}
|
|
451
|
-
try {
|
|
452
|
-
this.subscriptionId =
|
|
453
|
-
await this.config.indexerProvider.subscribeForScripts(scriptsToWatch, this.subscriptionId);
|
|
454
|
-
}
|
|
455
|
-
catch (error) {
|
|
456
|
-
// If we sent a stale subscription ID that the server no longer
|
|
457
|
-
// recognises, clear it and retry to create a fresh subscription.
|
|
458
|
-
// The server currently returns HTTP 500 with a JSON body whose
|
|
459
|
-
// message field looks like "subscription <uuid> not found".
|
|
460
|
-
// All other errors (network failures, parse errors, etc.) are rethrown.
|
|
461
|
-
const isStale = error instanceof Error &&
|
|
462
|
-
/subscription\s+\S+\s+not\s+found/i.test(error.message);
|
|
463
|
-
if (this.subscriptionId && isStale) {
|
|
464
|
-
this.subscriptionId = undefined;
|
|
465
|
-
this.subscriptionId =
|
|
466
|
-
await this.config.indexerProvider.subscribeForScripts(scriptsToWatch);
|
|
467
|
-
}
|
|
468
|
-
else {
|
|
469
|
-
throw error;
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
/**
|
|
474
|
-
* Main listening loop for subscription events.
|
|
475
|
-
*/
|
|
476
|
-
async listenLoop() {
|
|
477
|
-
if (!this.subscriptionId || !this.abortController || !this.isWatching) {
|
|
478
|
-
if (this.isWatching) {
|
|
479
|
-
this.connectionState = "disconnected";
|
|
480
|
-
this.scheduleReconnect();
|
|
481
|
-
}
|
|
482
|
-
return;
|
|
483
|
-
}
|
|
484
|
-
const subscription = this.config.indexerProvider.getSubscription(this.subscriptionId, this.abortController.signal);
|
|
485
|
-
for await (const update of subscription) {
|
|
486
|
-
if (!this.isWatching)
|
|
487
|
-
break;
|
|
488
|
-
this.handleSubscriptionUpdate(update);
|
|
489
|
-
}
|
|
490
|
-
// Stream ended normally - reconnect if still watching
|
|
491
|
-
if (this.isWatching) {
|
|
492
|
-
this.connectionState = "disconnected";
|
|
493
|
-
this.scheduleReconnect();
|
|
494
|
-
}
|
|
495
|
-
}
|
|
496
|
-
/**
|
|
497
|
-
* Handle a subscription update.
|
|
498
|
-
*/
|
|
499
|
-
handleSubscriptionUpdate(update) {
|
|
500
|
-
if (!this.eventCallback)
|
|
501
|
-
return;
|
|
502
|
-
const timestamp = Date.now();
|
|
503
|
-
if (update.newVtxos?.length) {
|
|
504
|
-
this.processSubscriptionVtxos(update.newVtxos, "vtxo_received", timestamp);
|
|
505
|
-
}
|
|
506
|
-
if (update.spentVtxos?.length) {
|
|
507
|
-
this.processSubscriptionVtxos(update.spentVtxos, "vtxo_spent", timestamp);
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
|
-
/**
|
|
511
|
-
* Process virtual outputs from subscription and route each VTXO to the
|
|
512
|
-
* single contract that actually locks it via `vtxo.script`. If the script
|
|
513
|
-
* doesn't match any watched contract, skip the VTXO rather than fan it
|
|
514
|
-
* out to every matching contract — fan-out produced phantom state in
|
|
515
|
-
* non-owning contracts that then never reconciled.
|
|
516
|
-
*/
|
|
517
|
-
processSubscriptionVtxos(vtxos, eventType, timestamp) {
|
|
518
|
-
const byContract = new Map();
|
|
519
|
-
let unknownScript = 0;
|
|
520
|
-
for (const vtxo of vtxos) {
|
|
521
|
-
if (!this.contracts.has(vtxo.script)) {
|
|
522
|
-
unknownScript++;
|
|
523
|
-
continue;
|
|
524
|
-
}
|
|
525
|
-
let bucket = byContract.get(vtxo.script);
|
|
526
|
-
if (!bucket) {
|
|
527
|
-
bucket = [];
|
|
528
|
-
byContract.set(vtxo.script, bucket);
|
|
529
|
-
}
|
|
530
|
-
bucket.push(vtxo);
|
|
531
|
-
}
|
|
532
|
-
if (unknownScript > 0) {
|
|
533
|
-
// The failsafe poll is the backstop for these; log at debug so we
|
|
534
|
-
// can correlate "VTXO state drift" reports with subscription
|
|
535
|
-
// drops rather than chase phantom bugs.
|
|
536
|
-
console.debug(`ContractWatcher.processSubscriptionVtxos[${eventType}]: dropped ${unknownScript} unknown-script VTXOs (${vtxos.length} total)`);
|
|
537
|
-
}
|
|
538
|
-
for (const [contractScript, bucketVtxos] of byContract) {
|
|
539
|
-
const state = this.contracts.get(contractScript);
|
|
540
|
-
if (state) {
|
|
541
|
-
for (const vtxo of bucketVtxos) {
|
|
542
|
-
const key = `${vtxo.txid}:${vtxo.vout}`;
|
|
543
|
-
if (eventType === "vtxo_received") {
|
|
544
|
-
state.lastKnownVtxos.set(key, vtxo);
|
|
545
|
-
}
|
|
546
|
-
else if (eventType === "vtxo_spent") {
|
|
547
|
-
state.lastKnownVtxos.delete(key);
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
}
|
|
551
|
-
this.emitVtxoEvent(contractScript, bucketVtxos, eventType, timestamp);
|
|
552
|
-
}
|
|
553
|
-
}
|
|
554
|
-
/**
|
|
555
|
-
* Emit a virtual output event for a contract.
|
|
556
|
-
*/
|
|
557
|
-
emitVtxoEvent(contractScript, vtxos, eventType, timestamp) {
|
|
558
|
-
if (!this.eventCallback)
|
|
559
|
-
return;
|
|
560
|
-
const state = this.contracts.get(contractScript);
|
|
561
|
-
if (!state)
|
|
562
|
-
return;
|
|
563
|
-
const extended = [];
|
|
564
|
-
for (const v of vtxos) {
|
|
565
|
-
try {
|
|
566
|
-
const extendedVtxo = (0, utils_1.extendVirtualCoinForContract)(v, state.contract);
|
|
567
|
-
extended.push({ ...extendedVtxo, contractScript });
|
|
568
|
-
}
|
|
569
|
-
catch (err) {
|
|
570
|
-
console.warn(`failed to extend vtxo ${v.txid}:${v.vout}`, err);
|
|
571
|
-
extended.push({ ...v, contractScript });
|
|
572
|
-
}
|
|
573
|
-
}
|
|
574
|
-
switch (eventType) {
|
|
575
|
-
case "vtxo_received":
|
|
576
|
-
this.eventCallback({
|
|
577
|
-
type: "vtxo_received",
|
|
578
|
-
vtxos: extended,
|
|
579
|
-
contractScript,
|
|
580
|
-
contract: state.contract,
|
|
581
|
-
timestamp,
|
|
582
|
-
});
|
|
583
|
-
return;
|
|
584
|
-
case "vtxo_spent":
|
|
585
|
-
this.eventCallback({
|
|
586
|
-
type: "vtxo_spent",
|
|
587
|
-
vtxos: extended,
|
|
588
|
-
contractScript,
|
|
589
|
-
contract: state.contract,
|
|
590
|
-
timestamp,
|
|
591
|
-
});
|
|
592
|
-
return;
|
|
593
|
-
default:
|
|
594
|
-
return;
|
|
595
|
-
}
|
|
596
|
-
}
|
|
597
|
-
}
|
|
598
|
-
exports.ContractWatcher = ContractWatcher;
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DefaultContractHandler = void 0;
|
|
4
|
-
const base_1 = require("@scure/base");
|
|
5
|
-
const default_1 = require("../../script/default");
|
|
6
|
-
const helpers_1 = require("./helpers");
|
|
7
|
-
const timelock_1 = require("../../utils/timelock");
|
|
8
|
-
const descriptor_1 = require("../../identity/descriptor");
|
|
9
|
-
/**
|
|
10
|
-
* Extract pubkey bytes from a descriptor or hex string.
|
|
11
|
-
*/
|
|
12
|
-
function extractPubKeyBytes(value) {
|
|
13
|
-
return base_1.hex.decode((0, descriptor_1.extractPubKey)((0, descriptor_1.normalizeToDescriptor)(value)));
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Handler for default wallet VTXOs.
|
|
17
|
-
*
|
|
18
|
-
* Default contracts use the standard forfeit + exit tapscript:
|
|
19
|
-
* - forfeit: (Alice + Server) multisig for collaborative spending
|
|
20
|
-
* - exit: (Alice) + CSV timelock for unilateral exit
|
|
21
|
-
*/
|
|
22
|
-
exports.DefaultContractHandler = {
|
|
23
|
-
type: "default",
|
|
24
|
-
createScript(params) {
|
|
25
|
-
const typed = this.deserializeParams(params);
|
|
26
|
-
return new default_1.DefaultVtxo.Script(typed);
|
|
27
|
-
},
|
|
28
|
-
serializeParams(params) {
|
|
29
|
-
return {
|
|
30
|
-
pubKey: base_1.hex.encode(params.pubKey),
|
|
31
|
-
serverPubKey: base_1.hex.encode(params.serverPubKey),
|
|
32
|
-
csvTimelock: (0, timelock_1.timelockToSequence)(params.csvTimelock).toString(),
|
|
33
|
-
};
|
|
34
|
-
},
|
|
35
|
-
deserializeParams(params) {
|
|
36
|
-
const csvTimelock = params.csvTimelock
|
|
37
|
-
? (0, timelock_1.sequenceToTimelock)(Number(params.csvTimelock))
|
|
38
|
-
: default_1.DefaultVtxo.Script.DEFAULT_TIMELOCK;
|
|
39
|
-
return {
|
|
40
|
-
pubKey: extractPubKeyBytes(params.pubKey),
|
|
41
|
-
serverPubKey: extractPubKeyBytes(params.serverPubKey),
|
|
42
|
-
csvTimelock,
|
|
43
|
-
};
|
|
44
|
-
},
|
|
45
|
-
selectPath(script, contract, context) {
|
|
46
|
-
if (context.collaborative) {
|
|
47
|
-
// Use forfeit path for collaborative spending
|
|
48
|
-
return { leaf: script.forfeit() };
|
|
49
|
-
}
|
|
50
|
-
// Use exit path for unilateral exit (only if CSV is satisfied)
|
|
51
|
-
const sequence = contract.params.csvTimelock
|
|
52
|
-
? Number(contract.params.csvTimelock)
|
|
53
|
-
: undefined;
|
|
54
|
-
if (!(0, helpers_1.isCsvSpendable)(context, sequence)) {
|
|
55
|
-
return null;
|
|
56
|
-
}
|
|
57
|
-
return {
|
|
58
|
-
leaf: script.exit(),
|
|
59
|
-
sequence,
|
|
60
|
-
};
|
|
61
|
-
},
|
|
62
|
-
getAllSpendingPaths(script, contract, context) {
|
|
63
|
-
const paths = [];
|
|
64
|
-
// Forfeit path available with server cooperation
|
|
65
|
-
if (context.collaborative) {
|
|
66
|
-
paths.push({ leaf: script.forfeit() });
|
|
67
|
-
}
|
|
68
|
-
// Exit path always possible (CSV checked at tx time)
|
|
69
|
-
const exitPath = { leaf: script.exit() };
|
|
70
|
-
if (contract.params.csvTimelock) {
|
|
71
|
-
exitPath.sequence = Number(contract.params.csvTimelock);
|
|
72
|
-
}
|
|
73
|
-
paths.push(exitPath);
|
|
74
|
-
return paths;
|
|
75
|
-
},
|
|
76
|
-
getSpendablePaths(script, contract, context) {
|
|
77
|
-
const paths = [];
|
|
78
|
-
if (context.collaborative) {
|
|
79
|
-
paths.push({ leaf: script.forfeit() });
|
|
80
|
-
}
|
|
81
|
-
const exitSequence = contract.params.csvTimelock
|
|
82
|
-
? Number(contract.params.csvTimelock)
|
|
83
|
-
: undefined;
|
|
84
|
-
if ((0, helpers_1.isCsvSpendable)(context, exitSequence)) {
|
|
85
|
-
const exitPath = { leaf: script.exit() };
|
|
86
|
-
if (exitSequence !== undefined) {
|
|
87
|
-
exitPath.sequence = exitSequence;
|
|
88
|
-
}
|
|
89
|
-
paths.push(exitPath);
|
|
90
|
-
}
|
|
91
|
-
return paths;
|
|
92
|
-
},
|
|
93
|
-
};
|