@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,540 +0,0 @@
|
|
|
1
|
-
import { expand, networks } from "@bitcoinerlab/descriptors-scure";
|
|
2
|
-
import { equalBytes } from "@scure/btc-signer/utils.js";
|
|
3
|
-
import { hex } from "@scure/base";
|
|
4
|
-
import { isMainnetDescriptor } from "../identity/descriptor.js";
|
|
5
|
-
import { isHDCapableIdentity } from "../identity/hdCapableIdentity.js";
|
|
6
|
-
import { DefaultVtxo } from "../script/default.js";
|
|
7
|
-
import { DelegateVtxo } from "../script/delegate.js";
|
|
8
|
-
import { timelockToSequence } from "../utils/timelock.js";
|
|
9
|
-
import { HDDescriptorProvider } from "./hdDescriptorProvider.js";
|
|
10
|
-
/** Type guard: does this provider implement {@link ReceiveRotatorFactory}? */
|
|
11
|
-
export function hasReceiveRotatorFactory(provider) {
|
|
12
|
-
return (typeof provider
|
|
13
|
-
.createReceiveRotator === "function");
|
|
14
|
-
}
|
|
15
|
-
function hasPeekableDescriptor(provider) {
|
|
16
|
-
return (typeof provider
|
|
17
|
-
.getCurrentSigningDescriptor === "function");
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Sentinel value stored in `contract.metadata.source` to identify the
|
|
21
|
-
* wallet's current display contract. Borrowed from btcpay-arkade's
|
|
22
|
-
* source-tagging pattern: every contract records "where and why it was
|
|
23
|
-
* generated", and the wallet only cares about the ones it generated for
|
|
24
|
-
* its own receive address.
|
|
25
|
-
*
|
|
26
|
-
* Tagging makes the boot lookup unambiguous — the rotator filters on
|
|
27
|
-
* `metadata.source === WALLET_RECEIVE_SOURCE` rather than on "any active
|
|
28
|
-
* default contract", so a contract repo that also holds default contracts
|
|
29
|
-
* created for other reasons (legacy timelock variants, external
|
|
30
|
-
* integrations) doesn't confuse the wallet's display state.
|
|
31
|
-
*/
|
|
32
|
-
export const WALLET_RECEIVE_SOURCE = "wallet-receive";
|
|
33
|
-
/**
|
|
34
|
-
* Thrown when a descriptor expected to be rangeable (have a wildcard
|
|
35
|
-
* leaf) cannot produce a leaf pubkey. Surfaces from the rotator's
|
|
36
|
-
* `defaultBoot` path so `resolveBoot` can distinguish a legitimate
|
|
37
|
-
* incompatibility (silent fallback under `walletMode: 'auto'`) from
|
|
38
|
-
* any other runtime failure.
|
|
39
|
-
*/
|
|
40
|
-
export class NonRangeableDescriptorError extends Error {
|
|
41
|
-
constructor(message, options) {
|
|
42
|
-
super(message, options);
|
|
43
|
-
this.name = "NonRangeableDescriptorError";
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Cap on the exponential backoff applied to repeated rotation
|
|
48
|
-
* failures. After this delay, every fresh `vtxo_received` event
|
|
49
|
-
* re-attempts a rotation at this rate until one succeeds (which
|
|
50
|
-
* resets the counter) or the wallet is disposed.
|
|
51
|
-
*/
|
|
52
|
-
export const ROTATION_MAX_BACKOFF_MS = 60000;
|
|
53
|
-
/**
|
|
54
|
-
* Owns the wallet's HD receive-rotation lifecycle.
|
|
55
|
-
*
|
|
56
|
-
* The rotator is constructed only when the wallet's `walletMode`
|
|
57
|
-
* resolves to a {@link DescriptorProvider}; static wallets and
|
|
58
|
-
* non-HD-capable wallets under `'auto'` never see one.
|
|
59
|
-
*
|
|
60
|
-
* Lifecycle:
|
|
61
|
-
* 1. `resolveBoot()` — pre-Wallet-construction. Resolves the provider
|
|
62
|
-
* from `walletMode`, then either reuses the existing display
|
|
63
|
-
* contract's pubkey (if any) or allocates the first descriptor.
|
|
64
|
-
* Returns the rotator paired with the boot pubkey.
|
|
65
|
-
* 2. `install(wallet)` — post-`getVtxoManager()`. Subscribes to
|
|
66
|
-
* `vtxo_received` on the contract manager and routes matching events
|
|
67
|
-
* through the rotation chain.
|
|
68
|
-
* 3. `dispose()` — tears down the subscription and drains any in-flight
|
|
69
|
-
* rotation so the contract manager can be disposed cleanly.
|
|
70
|
-
*
|
|
71
|
-
* This class follows the dotnet-sdk's split of responsibilities: the
|
|
72
|
-
* provider is a pure rotating allocator; "what address am I currently
|
|
73
|
-
* bound to?" is answered by querying the contract repository, not by
|
|
74
|
-
* asking the provider.
|
|
75
|
-
*/
|
|
76
|
-
export class WalletReceiveRotator {
|
|
77
|
-
constructor(provider, priorTaggedScript, logger) {
|
|
78
|
-
this.provider = provider;
|
|
79
|
-
this.chain = Promise.resolve();
|
|
80
|
-
/**
|
|
81
|
-
* Consecutive rotation failures since the last successful rotate.
|
|
82
|
-
* Drives an exponential backoff (capped at
|
|
83
|
-
* {@link ROTATION_MAX_BACKOFF_MS}) so a broken provider can't make
|
|
84
|
-
* the rotator hammer `getNextSigningDescriptor` + `createContract`
|
|
85
|
-
* on every inbound VTXO. Reset to zero on a successful rotate.
|
|
86
|
-
*/
|
|
87
|
-
this.consecutiveFailures = 0;
|
|
88
|
-
/**
|
|
89
|
-
* Unix-ms timestamp before which incoming `vtxo_received` events
|
|
90
|
-
* skip the rotation attempt entirely. Zero means "no backoff
|
|
91
|
-
* active" — the next event can rotate immediately.
|
|
92
|
-
*/
|
|
93
|
-
this.nextRotationAllowedAt = 0;
|
|
94
|
-
this.currentTaggedScript = priorTaggedScript;
|
|
95
|
-
this.logger = logger ?? console;
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Phase 1 — pre-Wallet-construction. Resolves `walletMode` to a
|
|
99
|
-
* {@link DescriptorProvider}, then asks that provider to construct
|
|
100
|
-
* the rotator (delegated through
|
|
101
|
-
* {@link DescriptorProvider.createReceiveRotator}, which falls back
|
|
102
|
-
* to {@link defaultBoot} when the provider doesn't override it).
|
|
103
|
-
*
|
|
104
|
-
* Returns the rotator paired with the offchain tapscript the wallet
|
|
105
|
-
* should actually install (rebuilt to the resolved receive pubkey
|
|
106
|
-
* when it differs from the identity's static pubkey), or
|
|
107
|
-
* `undefined` when the wallet should stay on the static path.
|
|
108
|
-
*
|
|
109
|
-
* Errors during pubkey resolution propagate when:
|
|
110
|
-
* - `walletMode === 'hd'` (caller asked for HD; loud failure expected).
|
|
111
|
-
* - `walletMode` is a {@link DescriptorProvider} (caller supplied an
|
|
112
|
-
* explicit allocator; silently degrading would hide misconfig).
|
|
113
|
-
*
|
|
114
|
-
* Errors are silently swallowed (returning `undefined`) only under
|
|
115
|
-
* `walletMode: 'auto'` with the built-in HD provider, to preserve
|
|
116
|
-
* backwards compatibility with wallets whose identity descriptor
|
|
117
|
-
* isn't actually rangeable.
|
|
118
|
-
*/
|
|
119
|
-
static async resolveBoot(config, setup) {
|
|
120
|
-
const provider = await resolveDescriptorProvider(config, setup.walletRepository);
|
|
121
|
-
if (!provider)
|
|
122
|
-
return undefined;
|
|
123
|
-
const allowSilentFallback = (config.walletMode ?? "auto") === "auto";
|
|
124
|
-
const expectedContractType = setup.offchainTapscript instanceof DelegateVtxo.Script
|
|
125
|
-
? "delegate"
|
|
126
|
-
: "default";
|
|
127
|
-
const factoryOpts = {
|
|
128
|
-
walletRepository: setup.walletRepository,
|
|
129
|
-
contractRepository: setup.contractRepository,
|
|
130
|
-
serverPubKey: setup.serverPubKey,
|
|
131
|
-
expectedContractType,
|
|
132
|
-
};
|
|
133
|
-
let boot;
|
|
134
|
-
try {
|
|
135
|
-
boot = hasReceiveRotatorFactory(provider)
|
|
136
|
-
? await provider.createReceiveRotator(factoryOpts)
|
|
137
|
-
: await WalletReceiveRotator.defaultBoot(provider, factoryOpts);
|
|
138
|
-
}
|
|
139
|
-
catch (e) {
|
|
140
|
-
// Only swallow non-rangeable-descriptor errors, and only
|
|
141
|
-
// under `walletMode: 'auto'`. Explicit HD/`DescriptorProvider`
|
|
142
|
-
// callers always see the failure.
|
|
143
|
-
if (allowSilentFallback &&
|
|
144
|
-
e instanceof NonRangeableDescriptorError) {
|
|
145
|
-
return undefined;
|
|
146
|
-
}
|
|
147
|
-
throw e;
|
|
148
|
-
}
|
|
149
|
-
if (!boot)
|
|
150
|
-
return undefined;
|
|
151
|
-
// Rebuild the offchain tapscript with the resolved receive
|
|
152
|
-
// pubkey. Skipping the rebuild when pubkeys already match keeps
|
|
153
|
-
// the tapscript instance stable for static / first-boot paths
|
|
154
|
-
// (no allocation churn, no observable change for callers
|
|
155
|
-
// that retain the reference across `Wallet.create`).
|
|
156
|
-
const offchainTapscript = equalBytes(boot.receivePubkey, setup.offchainTapscript.options.pubKey)
|
|
157
|
-
? setup.offchainTapscript
|
|
158
|
-
: rebuildTapscript(setup.offchainTapscript, boot.receivePubkey);
|
|
159
|
-
return { rotator: boot.rotator, offchainTapscript, provider };
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* Default factory-shaped boot any
|
|
163
|
-
* {@link ReceiveRotatorFactory.createReceiveRotator} implementation
|
|
164
|
-
* can delegate to. Pulls the wallet's current display contract from
|
|
165
|
-
* the contract repository (or allocates a fresh receive descriptor
|
|
166
|
-
* via the provider when no tagged display contract exists), and
|
|
167
|
-
* returns the rotator paired with the resolved receive pubkey.
|
|
168
|
-
*
|
|
169
|
-
* Used internally by `resolveBoot` when the provider doesn't
|
|
170
|
-
* implement {@link ReceiveRotatorFactory}. Exported so providers
|
|
171
|
-
* that *do* override can still invoke the default work for the
|
|
172
|
-
* parts of the boot path they don't want to customise. Tapscript
|
|
173
|
-
* construction is intentionally NOT in here — that's the
|
|
174
|
-
* orchestrator's job.
|
|
175
|
-
*/
|
|
176
|
-
static async defaultBoot(provider, opts) {
|
|
177
|
-
const existing = await pickActiveReceive(opts.contractRepository, opts.serverPubKey, opts.expectedContractType);
|
|
178
|
-
if (existing) {
|
|
179
|
-
return {
|
|
180
|
-
rotator: new WalletReceiveRotator(provider, existing.script, opts.logger),
|
|
181
|
-
receivePubkey: existing.pubKey,
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
|
-
// No tagged display contract on this repo. Avoid burning a
|
|
185
|
-
// fresh HD index per restart: re-derive the descriptor at the
|
|
186
|
-
// most recently allocated index when the provider supports it
|
|
187
|
-
// (HD-style allocators do; static / one-shot providers don't
|
|
188
|
-
// and fall through to a regular allocation, which is a no-op
|
|
189
|
-
// for them anyway).
|
|
190
|
-
let descriptor;
|
|
191
|
-
if (hasPeekableDescriptor(provider)) {
|
|
192
|
-
descriptor = await provider.getCurrentSigningDescriptor();
|
|
193
|
-
}
|
|
194
|
-
descriptor ?? (descriptor = await provider.getNextSigningDescriptor());
|
|
195
|
-
return {
|
|
196
|
-
rotator: new WalletReceiveRotator(provider, undefined, opts.logger),
|
|
197
|
-
receivePubkey: deriveLeafPubkey(descriptor),
|
|
198
|
-
};
|
|
199
|
-
}
|
|
200
|
-
/**
|
|
201
|
-
* Phase 2 — post-`getVtxoManager()`. Subscribe to `vtxo_received`
|
|
202
|
-
* and trigger a rotation whenever the currently-active display
|
|
203
|
-
* contract receives funds. Old display contracts remain `active`
|
|
204
|
-
* in the repo so earlier shared addresses keep crediting this
|
|
205
|
-
* wallet.
|
|
206
|
-
*/
|
|
207
|
-
async install(wallet) {
|
|
208
|
-
const manager = await wallet.getContractManager();
|
|
209
|
-
this.unsubscribe = manager.onContractEvent((event) => {
|
|
210
|
-
if (event.type !== "vtxo_received")
|
|
211
|
-
return;
|
|
212
|
-
if (event.contractScript !== wallet.defaultContractScript)
|
|
213
|
-
return;
|
|
214
|
-
// Serialise rotations: each `vtxo_received` event is its
|
|
215
|
-
// own rotation trigger (BIP-44-style: one receive ⇒ one
|
|
216
|
-
// fresh address), so two rapid events on the same script
|
|
217
|
-
// are *expected* to burn two consecutive HD indices. The
|
|
218
|
-
// chain here only prevents the rotate → rebuild →
|
|
219
|
-
// createContract sequences from interleaving; it does not
|
|
220
|
-
// — and intentionally does not — dedupe events on the same
|
|
221
|
-
// script. `runRotateWithBackoff` owns the failure handling
|
|
222
|
-
// — it logs, increments the consecutive-failure counter,
|
|
223
|
-
// and gates future attempts behind exponential backoff so
|
|
224
|
-
// a broken provider can't make the rotator hammer
|
|
225
|
-
// `createContract` on every event.
|
|
226
|
-
this.chain = this.chain
|
|
227
|
-
.catch(() => undefined)
|
|
228
|
-
.then(() => this.runRotateWithBackoff(wallet));
|
|
229
|
-
});
|
|
230
|
-
}
|
|
231
|
-
/**
|
|
232
|
-
* Run a single rotation attempt, applying exponential backoff on
|
|
233
|
-
* failure. Public-shaped behavior:
|
|
234
|
-
* - During a backoff window: log + skip (no `rotate()` call).
|
|
235
|
-
* - On success: reset failure count and backoff.
|
|
236
|
-
* - On failure: increment counter, schedule next attempt at
|
|
237
|
-
* `min(2^consecutiveFailures * 1s, ROTATION_MAX_BACKOFF_MS)`.
|
|
238
|
-
*
|
|
239
|
-
* Errors are deliberately swallowed (logged, not rethrown) so the
|
|
240
|
-
* surrounding `chain` Promise never settles to rejected — the next
|
|
241
|
-
* `vtxo_received` event must still get a chance to run.
|
|
242
|
-
*/
|
|
243
|
-
async runRotateWithBackoff(wallet) {
|
|
244
|
-
const now = Date.now();
|
|
245
|
-
if (now < this.nextRotationAllowedAt) {
|
|
246
|
-
this.logger.error("WalletReceiveRotator: skipping rotation (in backoff)", {
|
|
247
|
-
consecutiveFailures: this.consecutiveFailures,
|
|
248
|
-
retryInMs: this.nextRotationAllowedAt - now,
|
|
249
|
-
});
|
|
250
|
-
return;
|
|
251
|
-
}
|
|
252
|
-
try {
|
|
253
|
-
await this.rotate(wallet);
|
|
254
|
-
this.consecutiveFailures = 0;
|
|
255
|
-
this.nextRotationAllowedAt = 0;
|
|
256
|
-
}
|
|
257
|
-
catch (err) {
|
|
258
|
-
this.consecutiveFailures += 1;
|
|
259
|
-
// 2^1=2s, 2^2=4s, … capped at ROTATION_MAX_BACKOFF_MS (60s).
|
|
260
|
-
// `Math.min` on the exponent prevents `2 ** 1024` overflow
|
|
261
|
-
// for pathologically long failure streaks.
|
|
262
|
-
const exponent = Math.min(this.consecutiveFailures, 16);
|
|
263
|
-
const backoffMs = Math.min(2 ** exponent * 1000, ROTATION_MAX_BACKOFF_MS);
|
|
264
|
-
this.nextRotationAllowedAt = Date.now() + backoffMs;
|
|
265
|
-
this.logger.error("WalletReceiveRotator: rotation failed", err, {
|
|
266
|
-
consecutiveFailures: this.consecutiveFailures,
|
|
267
|
-
nextAttemptInMs: backoffMs,
|
|
268
|
-
});
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
/**
|
|
272
|
-
* Wait for any in-flight rotation to complete. Useful in tests
|
|
273
|
-
* that need to observe the post-rotation state after dispatching
|
|
274
|
-
* a `vtxo_received` event synchronously; production code rarely
|
|
275
|
-
* needs to call this directly.
|
|
276
|
-
*/
|
|
277
|
-
async drain() {
|
|
278
|
-
await this.chain.catch(() => undefined);
|
|
279
|
-
}
|
|
280
|
-
/**
|
|
281
|
-
* Tear down the subscription first so no late `vtxo_received` event
|
|
282
|
-
* can queue work on a disposing wallet, then drain any in-flight
|
|
283
|
-
* rotation so its `createContract` finishes before the contract
|
|
284
|
-
* manager itself disposes.
|
|
285
|
-
*/
|
|
286
|
-
async dispose() {
|
|
287
|
-
if (this.unsubscribe) {
|
|
288
|
-
try {
|
|
289
|
-
this.unsubscribe();
|
|
290
|
-
}
|
|
291
|
-
catch {
|
|
292
|
-
// best-effort teardown
|
|
293
|
-
}
|
|
294
|
-
finally {
|
|
295
|
-
this.unsubscribe = undefined;
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
await this.chain.catch(() => undefined);
|
|
299
|
-
}
|
|
300
|
-
/**
|
|
301
|
-
* Allocate the next descriptor, swap it into the wallet's active
|
|
302
|
-
* offchain tapscript, register the new tagged contract, and retire
|
|
303
|
-
* the previous tagged contract (if any) by setting its state to
|
|
304
|
-
* `inactive`. The contract watcher keeps watching inactive
|
|
305
|
-
* contracts until their VTXOs are spent, so funds in flight at the
|
|
306
|
-
* old display address are not lost — only the address stops being
|
|
307
|
-
* advertised.
|
|
308
|
-
*
|
|
309
|
-
* Contract type matches the wallet's tapscript shape: a default
|
|
310
|
-
* wallet rotates to a new `default` contract, a delegate wallet to
|
|
311
|
-
* a new `delegate` contract.
|
|
312
|
-
*
|
|
313
|
-
* The first rotation on a fresh wallet does NOT deactivate
|
|
314
|
-
* anything: `currentTaggedScript` is `undefined` because the wallet
|
|
315
|
-
* was displaying the untagged index-0 baseline, which must stay
|
|
316
|
-
* active forever.
|
|
317
|
-
*/
|
|
318
|
-
async rotate(wallet) {
|
|
319
|
-
// Build the new tapscript + derived strings entirely locally,
|
|
320
|
-
// so the wallet's visible state (`offchainTapscript`,
|
|
321
|
-
// `defaultContractScript`, `getAddress()`) doesn't change
|
|
322
|
-
// until the contract registration has succeeded. If
|
|
323
|
-
// `createContract` throws partway, the wallet is still
|
|
324
|
-
// displaying the OLD (registered) address — no
|
|
325
|
-
// unwatched-display-window.
|
|
326
|
-
const descriptor = await this.provider.getNextSigningDescriptor();
|
|
327
|
-
const pubKey = deriveLeafPubkey(descriptor);
|
|
328
|
-
const newTapscript = rebuildTapscript(wallet.offchainTapscript, pubKey);
|
|
329
|
-
const newScript = hex.encode(newTapscript.pkScript);
|
|
330
|
-
const newAddress = newTapscript
|
|
331
|
-
.address(wallet.network.hrp, wallet.arkServerPublicKey)
|
|
332
|
-
.encode();
|
|
333
|
-
const manager = await wallet.getContractManager();
|
|
334
|
-
const csvTimelock = newTapscript.options.csvTimelock ??
|
|
335
|
-
DefaultVtxo.Script.DEFAULT_TIMELOCK;
|
|
336
|
-
const csvTimelockStr = timelockToSequence(csvTimelock).toString();
|
|
337
|
-
const serverPubKeyHex = hex.encode(newTapscript.options.serverPubKey);
|
|
338
|
-
const baseParams = {
|
|
339
|
-
script: newScript,
|
|
340
|
-
address: newAddress,
|
|
341
|
-
state: "active",
|
|
342
|
-
// Persist the materialized signing descriptor alongside the
|
|
343
|
-
// source tag. The wallet's spending paths read this at sign
|
|
344
|
-
// time to route inputs locked by a rotated pubkey through
|
|
345
|
-
// `DescriptorProvider.signWithDescriptor` instead of the
|
|
346
|
-
// identity's index-0 key. Without it, post-rotation sends
|
|
347
|
-
// produce unsigned PSBTs that the server rejects with
|
|
348
|
-
// `INVALID_PSBT_INPUT (5): missing tapscript spend sig`.
|
|
349
|
-
metadata: {
|
|
350
|
-
source: WALLET_RECEIVE_SOURCE,
|
|
351
|
-
signingDescriptor: descriptor,
|
|
352
|
-
},
|
|
353
|
-
};
|
|
354
|
-
if (newTapscript instanceof DelegateVtxo.Script) {
|
|
355
|
-
await manager.createContract({
|
|
356
|
-
...baseParams,
|
|
357
|
-
type: "delegate",
|
|
358
|
-
params: {
|
|
359
|
-
pubKey: hex.encode(pubKey),
|
|
360
|
-
serverPubKey: serverPubKeyHex,
|
|
361
|
-
delegatePubKey: hex.encode(newTapscript.options.delegatePubKey),
|
|
362
|
-
csvTimelock: csvTimelockStr,
|
|
363
|
-
},
|
|
364
|
-
});
|
|
365
|
-
}
|
|
366
|
-
else {
|
|
367
|
-
await manager.createContract({
|
|
368
|
-
...baseParams,
|
|
369
|
-
type: "default",
|
|
370
|
-
params: {
|
|
371
|
-
pubKey: hex.encode(pubKey),
|
|
372
|
-
serverPubKey: serverPubKeyHex,
|
|
373
|
-
csvTimelock: csvTimelockStr,
|
|
374
|
-
},
|
|
375
|
-
});
|
|
376
|
-
}
|
|
377
|
-
// Persistence succeeded — commit the new tapscript to the
|
|
378
|
-
// wallet's visible state. From this point onward
|
|
379
|
-
// `wallet.defaultContractScript` and `getAddress()` reflect
|
|
380
|
-
// the rotated identity. `setOffchainTapscriptForRotation` is
|
|
381
|
-
// the only write path; the field is read-only otherwise.
|
|
382
|
-
wallet.setOffchainTapscriptForRotation(newTapscript);
|
|
383
|
-
// Retire the previous tagged contract (if any). The order
|
|
384
|
-
// matters: deactivate FIRST, then update `currentTaggedScript`,
|
|
385
|
-
// so that if `setContractState` throws the next rotation will
|
|
386
|
-
// retry deactivating the same orphaned contract instead of
|
|
387
|
-
// racing forward and orphaning the new one.
|
|
388
|
-
const previousTagged = this.currentTaggedScript;
|
|
389
|
-
if (previousTagged !== undefined && previousTagged !== newScript) {
|
|
390
|
-
await manager.setContractState(previousTagged, "inactive");
|
|
391
|
-
}
|
|
392
|
-
this.currentTaggedScript = newScript;
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
/**
|
|
396
|
-
* Extract the x-only (32-byte) pubkey from a materialized HD descriptor.
|
|
397
|
-
*
|
|
398
|
-
* `expand()` populates `@0.pubkey` for non-ranged descriptors (including
|
|
399
|
-
* HD ones where a concrete child index has been substituted for the
|
|
400
|
-
* wildcard). This sidesteps `extractPubKey`, which intentionally rejects
|
|
401
|
-
* any descriptor carrying a `bip32` key because it was designed for
|
|
402
|
-
* static `tr(pubkey)` inputs.
|
|
403
|
-
*/
|
|
404
|
-
function deriveLeafPubkey(descriptor) {
|
|
405
|
-
const network = isMainnetDescriptor(descriptor)
|
|
406
|
-
? networks.bitcoin
|
|
407
|
-
: networks.testnet;
|
|
408
|
-
// `expand` raises when the descriptor still carries a wildcard or
|
|
409
|
-
// is otherwise non-rangeable. Wrap so callers (most importantly
|
|
410
|
-
// `resolveBoot`'s silent-fallback path) can branch on a typed
|
|
411
|
-
// error class instead of grepping `err.message`.
|
|
412
|
-
let expansion;
|
|
413
|
-
try {
|
|
414
|
-
expansion = expand({ descriptor, network });
|
|
415
|
-
}
|
|
416
|
-
catch (e) {
|
|
417
|
-
throw new NonRangeableDescriptorError(`Cannot derive leaf pubkey from descriptor (length=${descriptor.length}): ` +
|
|
418
|
-
`ensure the descriptor is materialized (no wildcard) and parsable.`, { cause: e });
|
|
419
|
-
}
|
|
420
|
-
const key = expansion.expansionMap?.["@0"];
|
|
421
|
-
if (!key?.pubkey) {
|
|
422
|
-
// Avoid interpolating the descriptor itself: it normally
|
|
423
|
-
// contains an xpub, but a misconfigured caller could pass an
|
|
424
|
-
// xprv, and error messages surface in logs / crash reporters /
|
|
425
|
-
// Sentry. The length is enough context for debugging.
|
|
426
|
-
throw new NonRangeableDescriptorError(`Cannot derive leaf pubkey from descriptor (length=${descriptor.length}): ` +
|
|
427
|
-
`descriptor parsed but no '@0' pubkey was found in the expansion map. ` +
|
|
428
|
-
`The rotator expects a materialized tr(xpub/.../*) shape; ensure the ` +
|
|
429
|
-
`descriptor has no wildcard and that its key resolves into the '@0' slot.`);
|
|
430
|
-
}
|
|
431
|
-
return key.pubkey;
|
|
432
|
-
}
|
|
433
|
-
/**
|
|
434
|
-
* Rebuild the given offchain tapscript with a different owner pubkey,
|
|
435
|
-
* preserving its {@link DelegateVtxo.Script} vs {@link DefaultVtxo.Script}
|
|
436
|
-
* shape and all other options.
|
|
437
|
-
*
|
|
438
|
-
* Exported because the wallet's boot path also needs to rebuild the
|
|
439
|
-
* initial tapscript when the resolved boot pubkey differs from the
|
|
440
|
-
* identity's default pubkey.
|
|
441
|
-
*/
|
|
442
|
-
export function rebuildTapscript(current, pubKey) {
|
|
443
|
-
if (current instanceof DelegateVtxo.Script) {
|
|
444
|
-
return new DelegateVtxo.Script({ ...current.options, pubKey });
|
|
445
|
-
}
|
|
446
|
-
return new DefaultVtxo.Script({ ...current.options, pubKey });
|
|
447
|
-
}
|
|
448
|
-
/**
|
|
449
|
-
* Look up the most-recently-created active tagged display contract that
|
|
450
|
-
* this wallet itself generated. Returns the contract's pubkey + script,
|
|
451
|
-
* or `undefined` when no such contract exists — the caller should treat
|
|
452
|
-
* that as "fresh wallet (or static-only history) on this repo" and
|
|
453
|
-
* allocate a new descriptor.
|
|
454
|
-
*
|
|
455
|
-
* Filters by `serverPubKey` so a contract repo seeded against a different
|
|
456
|
-
* server doesn't accidentally resurrect an unrelated pubkey, and by the
|
|
457
|
-
* `metadata.source` sentinel so untagged baseline contracts (and
|
|
458
|
-
* contracts created by other code paths — legacy timelock registrations,
|
|
459
|
-
* external integrations) are not mistaken for the wallet's display
|
|
460
|
-
* address.
|
|
461
|
-
*
|
|
462
|
-
* When `expectedType` is provided, only contracts of that type are considered,
|
|
463
|
-
* preventing a "default" wallet from accidentally picking up a "delegate" contract
|
|
464
|
-
* or vice versa.
|
|
465
|
-
*/
|
|
466
|
-
async function pickActiveReceive(contractRepository, serverPubKey, expectedType) {
|
|
467
|
-
// Both `default` and `delegate` contract types can be the wallet's
|
|
468
|
-
// display address (delegate wallets use the delegate variant). The
|
|
469
|
-
// `metadata.source` tag is the discriminator that says "this is the
|
|
470
|
-
// one I generated for myself."
|
|
471
|
-
const candidates = await contractRepository.getContracts({
|
|
472
|
-
type: expectedType ? [expectedType] : ["default", "delegate"],
|
|
473
|
-
state: "active",
|
|
474
|
-
});
|
|
475
|
-
const serverPubKeyHex = hex.encode(serverPubKey);
|
|
476
|
-
const matching = candidates
|
|
477
|
-
.filter((c) => c.params.serverPubKey === serverPubKeyHex &&
|
|
478
|
-
c.metadata?.source === WALLET_RECEIVE_SOURCE)
|
|
479
|
-
.sort((a, b) => b.createdAt - a.createdAt);
|
|
480
|
-
const newest = matching[0];
|
|
481
|
-
if (!newest?.params.pubKey)
|
|
482
|
-
return undefined;
|
|
483
|
-
try {
|
|
484
|
-
return {
|
|
485
|
-
pubKey: hex.decode(newest.params.pubKey),
|
|
486
|
-
script: newest.script,
|
|
487
|
-
};
|
|
488
|
-
}
|
|
489
|
-
catch {
|
|
490
|
-
return undefined;
|
|
491
|
-
}
|
|
492
|
-
}
|
|
493
|
-
/**
|
|
494
|
-
* Resolve the polymorphic `walletMode` config field into a concrete
|
|
495
|
-
* {@link DescriptorProvider} (or `undefined` for the static path).
|
|
496
|
-
*
|
|
497
|
-
* - `'auto'` *(default)*: **short-term**, behaves like `'static'` — no
|
|
498
|
-
* HD rotation. See the `TODO` below for the criteria to flip this
|
|
499
|
-
* back to the identity-probing behaviour.
|
|
500
|
-
* - `'static'`: returns `undefined`.
|
|
501
|
-
* - A {@link DescriptorProvider} instance: returns it as-is.
|
|
502
|
-
* - `'hd'`: builds the built-in HD provider from the identity. Throws
|
|
503
|
-
* if the identity isn't HD-capable or the descriptor isn't rangeable —
|
|
504
|
-
* no silent fallback.
|
|
505
|
-
*/
|
|
506
|
-
async function resolveDescriptorProvider(config, walletRepository) {
|
|
507
|
-
const mode = config.walletMode ?? "auto";
|
|
508
|
-
// TODO(hd-maturation): TEMPORARY — collapse `'auto'` into `'static'`
|
|
509
|
-
// until the HD receive-rotation pipeline has soaked in the field.
|
|
510
|
-
// Flip `'auto'` back to its identity-probing behaviour once:
|
|
511
|
-
// 1. At least one consumer (btcpay-arkade, arkade-os/wallet,
|
|
512
|
-
// Fulmine) has been running with `walletMode: 'hd'` against
|
|
513
|
-
// mainnet for ≥ 1 month with no rotation-induced fund-loss
|
|
514
|
-
// or address-drift reports.
|
|
515
|
-
// 2. The test `default ('auto') currently behaves like 'static'`
|
|
516
|
-
// in `test/walletHdRotation.test.ts` is flipped in the same
|
|
517
|
-
// commit (it's the explicit gate — flipping the default
|
|
518
|
-
// MUST flip the test).
|
|
519
|
-
// 3. The `WalletMode` docstring in `src/wallet/index.ts` is
|
|
520
|
-
// updated to drop the "behaves like 'static' for now" notice.
|
|
521
|
-
if (mode === "static" || mode === "auto")
|
|
522
|
-
return undefined;
|
|
523
|
-
if (typeof mode !== "string") {
|
|
524
|
-
// Caller supplied a DescriptorProvider directly.
|
|
525
|
-
return mode;
|
|
526
|
-
}
|
|
527
|
-
// mode === 'hd'
|
|
528
|
-
if (!isHDCapableIdentity(config.identity)) {
|
|
529
|
-
throw new Error("walletMode 'hd' requires an HD-capable identity " +
|
|
530
|
-
"(SeedIdentity / MnemonicIdentity with a rangeable BIP-32 " +
|
|
531
|
-
"descriptor) or an explicit DescriptorProvider.");
|
|
532
|
-
}
|
|
533
|
-
try {
|
|
534
|
-
return await HDDescriptorProvider.create(config.identity, walletRepository);
|
|
535
|
-
}
|
|
536
|
-
catch (e) {
|
|
537
|
-
throw new Error("walletMode 'hd' failed to initialize: " +
|
|
538
|
-
(e instanceof Error ? e.message : String(e)), { cause: e });
|
|
539
|
-
}
|
|
540
|
-
}
|