@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
|
@@ -0,0 +1,2701 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunk5PG7DV7A_cjs = require('./chunk-5PG7DV7A.cjs');
|
|
4
|
+
var chunk5BLDMQED_cjs = require('./chunk-5BLDMQED.cjs');
|
|
5
|
+
var btcSigner = require('@scure/btc-signer');
|
|
6
|
+
var base = require('@scure/base');
|
|
7
|
+
var secp256k1_js = require('@noble/curves/secp256k1.js');
|
|
8
|
+
var utils_js = require('@scure/btc-signer/utils.js');
|
|
9
|
+
|
|
10
|
+
var Transaction = class extends btcSigner.Transaction {
|
|
11
|
+
static ARK_TX_OPTS = {
|
|
12
|
+
allowUnknown: true,
|
|
13
|
+
allowUnknownOutputs: true,
|
|
14
|
+
allowUnknownInputs: true
|
|
15
|
+
};
|
|
16
|
+
constructor(opts) {
|
|
17
|
+
super(withArkOpts(opts));
|
|
18
|
+
}
|
|
19
|
+
static fromPSBT(psbt_, opts) {
|
|
20
|
+
return btcSigner.Transaction.fromPSBT(psbt_, withArkOpts(opts));
|
|
21
|
+
}
|
|
22
|
+
static fromRaw(raw, opts) {
|
|
23
|
+
return btcSigner.Transaction.fromRaw(raw, withArkOpts(opts));
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
function withArkOpts(opts) {
|
|
27
|
+
return { ...Transaction.ARK_TX_OPTS, ...opts };
|
|
28
|
+
}
|
|
29
|
+
var ArkPsbtFieldKey = /* @__PURE__ */ ((ArkPsbtFieldKey2) => {
|
|
30
|
+
ArkPsbtFieldKey2["VtxoTaprootTree"] = "taptree";
|
|
31
|
+
ArkPsbtFieldKey2["VtxoTreeExpiry"] = "expiry";
|
|
32
|
+
ArkPsbtFieldKey2["Cosigner"] = "cosigner";
|
|
33
|
+
ArkPsbtFieldKey2["ConditionWitness"] = "condition";
|
|
34
|
+
return ArkPsbtFieldKey2;
|
|
35
|
+
})(ArkPsbtFieldKey || {});
|
|
36
|
+
var ArkPsbtFieldKeyType = 222;
|
|
37
|
+
function setArkPsbtField(tx, inputIndex, coder, value) {
|
|
38
|
+
tx.updateInput(inputIndex, {
|
|
39
|
+
unknown: [...tx.getInput(inputIndex)?.unknown ?? [], coder.encode(value)]
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function getArkPsbtFields(tx, inputIndex, coder) {
|
|
43
|
+
const unknown = tx.getInput(inputIndex)?.unknown ?? [];
|
|
44
|
+
const fields = [];
|
|
45
|
+
for (const u of unknown) {
|
|
46
|
+
const v = coder.decode(u);
|
|
47
|
+
if (v) fields.push(v);
|
|
48
|
+
}
|
|
49
|
+
return fields;
|
|
50
|
+
}
|
|
51
|
+
var VtxoTaprootTree = {
|
|
52
|
+
key: "taptree" /* VtxoTaprootTree */,
|
|
53
|
+
encode: (value) => [
|
|
54
|
+
{
|
|
55
|
+
type: ArkPsbtFieldKeyType,
|
|
56
|
+
key: encodedPsbtFieldKey["taptree" /* VtxoTaprootTree */]
|
|
57
|
+
},
|
|
58
|
+
value
|
|
59
|
+
],
|
|
60
|
+
decode: (value) => nullIfCatch(() => {
|
|
61
|
+
if (!checkKeyIncludes(value[0], "taptree" /* VtxoTaprootTree */)) return null;
|
|
62
|
+
return value[1];
|
|
63
|
+
})
|
|
64
|
+
};
|
|
65
|
+
var ConditionWitness = {
|
|
66
|
+
key: "condition" /* ConditionWitness */,
|
|
67
|
+
encode: (value) => [
|
|
68
|
+
{
|
|
69
|
+
type: ArkPsbtFieldKeyType,
|
|
70
|
+
key: encodedPsbtFieldKey["condition" /* ConditionWitness */]
|
|
71
|
+
},
|
|
72
|
+
btcSigner.RawWitness.encode(value)
|
|
73
|
+
],
|
|
74
|
+
decode: (value) => nullIfCatch(() => {
|
|
75
|
+
if (!checkKeyIncludes(value[0], "condition" /* ConditionWitness */)) return null;
|
|
76
|
+
return btcSigner.RawWitness.decode(value[1]);
|
|
77
|
+
})
|
|
78
|
+
};
|
|
79
|
+
var CosignerPublicKey = {
|
|
80
|
+
key: "cosigner" /* Cosigner */,
|
|
81
|
+
encode: (value) => [
|
|
82
|
+
{
|
|
83
|
+
type: ArkPsbtFieldKeyType,
|
|
84
|
+
key: new Uint8Array([...encodedPsbtFieldKey["cosigner" /* Cosigner */], value.index])
|
|
85
|
+
},
|
|
86
|
+
value.key
|
|
87
|
+
],
|
|
88
|
+
decode: (unknown) => nullIfCatch(() => {
|
|
89
|
+
if (!checkKeyIncludes(unknown[0], "cosigner" /* Cosigner */)) return null;
|
|
90
|
+
return {
|
|
91
|
+
index: unknown[0].key[unknown[0].key.length - 1],
|
|
92
|
+
key: unknown[1]
|
|
93
|
+
};
|
|
94
|
+
})
|
|
95
|
+
};
|
|
96
|
+
var VtxoTreeExpiry = {
|
|
97
|
+
key: "expiry" /* VtxoTreeExpiry */,
|
|
98
|
+
encode: (value) => [
|
|
99
|
+
{
|
|
100
|
+
type: ArkPsbtFieldKeyType,
|
|
101
|
+
key: encodedPsbtFieldKey["expiry" /* VtxoTreeExpiry */]
|
|
102
|
+
},
|
|
103
|
+
btcSigner.ScriptNum(6, true).encode(value.value === 0n ? 0n : value.value)
|
|
104
|
+
],
|
|
105
|
+
decode: (unknown) => nullIfCatch(() => {
|
|
106
|
+
if (!checkKeyIncludes(unknown[0], "expiry" /* VtxoTreeExpiry */)) return null;
|
|
107
|
+
const v = btcSigner.ScriptNum(6, true).decode(unknown[1]);
|
|
108
|
+
if (!v) return null;
|
|
109
|
+
return chunk5PG7DV7A_cjs.sequenceToTimelock(Number(v));
|
|
110
|
+
})
|
|
111
|
+
};
|
|
112
|
+
var encodedPsbtFieldKey = Object.fromEntries(
|
|
113
|
+
Object.values(ArkPsbtFieldKey).map((key) => [key, new TextEncoder().encode(key)])
|
|
114
|
+
);
|
|
115
|
+
var nullIfCatch = (fn) => {
|
|
116
|
+
try {
|
|
117
|
+
return fn();
|
|
118
|
+
} catch (err) {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
function checkKeyIncludes(key, arkPsbtFieldKey) {
|
|
123
|
+
const expected = base.hex.encode(encodedPsbtFieldKey[arkPsbtFieldKey]);
|
|
124
|
+
return base.hex.encode(new Uint8Array([key.type, ...key.key])).includes(expected);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// src/providers/errors.ts
|
|
128
|
+
var ArkError = class extends Error {
|
|
129
|
+
constructor(code, message, name, metadata) {
|
|
130
|
+
super(message);
|
|
131
|
+
this.code = code;
|
|
132
|
+
this.message = message;
|
|
133
|
+
this.name = name;
|
|
134
|
+
this.metadata = metadata;
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
function maybeArkError(error) {
|
|
138
|
+
try {
|
|
139
|
+
if (!(error instanceof Error)) return void 0;
|
|
140
|
+
const decoded = JSON.parse(error.message);
|
|
141
|
+
if (!("details" in decoded)) return void 0;
|
|
142
|
+
if (!Array.isArray(decoded.details)) return void 0;
|
|
143
|
+
for (const details of decoded.details) {
|
|
144
|
+
if (!("@type" in details)) continue;
|
|
145
|
+
const type = details["@type"];
|
|
146
|
+
if (type !== "type.googleapis.com/ark.v1.ErrorDetails") continue;
|
|
147
|
+
if (!("code" in details)) continue;
|
|
148
|
+
const code = details.code;
|
|
149
|
+
if (!("message" in details)) continue;
|
|
150
|
+
const message = details.message;
|
|
151
|
+
if (!("name" in details)) continue;
|
|
152
|
+
const name = details.name;
|
|
153
|
+
let metadata;
|
|
154
|
+
if ("metadata" in details && isMetadata(details.metadata)) {
|
|
155
|
+
metadata = details.metadata;
|
|
156
|
+
}
|
|
157
|
+
return new ArkError(code, message, name, metadata);
|
|
158
|
+
}
|
|
159
|
+
return void 0;
|
|
160
|
+
} catch (e) {
|
|
161
|
+
return void 0;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
function isMetadata(value) {
|
|
165
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
166
|
+
}
|
|
167
|
+
exports.Intent = void 0;
|
|
168
|
+
((Intent2) => {
|
|
169
|
+
function create(message, ins, outputs = []) {
|
|
170
|
+
if (typeof message !== "string") {
|
|
171
|
+
message = encodeMessage(message);
|
|
172
|
+
}
|
|
173
|
+
if (ins.length == 0) throw new Error("intent proof requires at least one input");
|
|
174
|
+
const inputs = ins.map(prepareCoinAsIntentProofInput);
|
|
175
|
+
if (!validateInputs(inputs)) ;
|
|
176
|
+
if (!validateOutputs(outputs)) ;
|
|
177
|
+
const toSpend = craftToSpendTx(message, inputs[0].witnessUtxo.script);
|
|
178
|
+
return craftToSignTx(toSpend, inputs, outputs);
|
|
179
|
+
}
|
|
180
|
+
Intent2.create = create;
|
|
181
|
+
function fee(proof) {
|
|
182
|
+
let sumOfInputs = 0n;
|
|
183
|
+
for (let i = 0; i < proof.inputsLength; i++) {
|
|
184
|
+
const input = proof.getInput(i);
|
|
185
|
+
if (input.witnessUtxo === void 0)
|
|
186
|
+
throw new Error("intent proof input requires witness utxo");
|
|
187
|
+
sumOfInputs += input.witnessUtxo.amount;
|
|
188
|
+
}
|
|
189
|
+
let sumOfOutputs = 0n;
|
|
190
|
+
for (let i = 0; i < proof.outputsLength; i++) {
|
|
191
|
+
const output = proof.getOutput(i);
|
|
192
|
+
if (output.amount === void 0) throw new Error("intent proof output requires amount");
|
|
193
|
+
sumOfOutputs += output.amount;
|
|
194
|
+
}
|
|
195
|
+
if (sumOfOutputs > sumOfInputs) {
|
|
196
|
+
throw new Error(
|
|
197
|
+
`intent proof output amount is greater than input amount: ${sumOfOutputs} > ${sumOfInputs}`
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
return Number(sumOfInputs - sumOfOutputs);
|
|
201
|
+
}
|
|
202
|
+
Intent2.fee = fee;
|
|
203
|
+
function encodeMessage(message) {
|
|
204
|
+
switch (message.type) {
|
|
205
|
+
case "register":
|
|
206
|
+
return JSON.stringify({
|
|
207
|
+
type: "register",
|
|
208
|
+
onchain_output_indexes: message.onchain_output_indexes,
|
|
209
|
+
valid_at: message.valid_at,
|
|
210
|
+
expire_at: message.expire_at,
|
|
211
|
+
cosigners_public_keys: message.cosigners_public_keys
|
|
212
|
+
});
|
|
213
|
+
case "delete":
|
|
214
|
+
return JSON.stringify({
|
|
215
|
+
type: "delete",
|
|
216
|
+
expire_at: message.expire_at
|
|
217
|
+
});
|
|
218
|
+
case "get-pending-tx":
|
|
219
|
+
return JSON.stringify({
|
|
220
|
+
type: "get-pending-tx",
|
|
221
|
+
expire_at: message.expire_at
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
Intent2.encodeMessage = encodeMessage;
|
|
226
|
+
})(exports.Intent || (exports.Intent = {}));
|
|
227
|
+
var OP_RETURN_EMPTY_PKSCRIPT = new Uint8Array([btcSigner.OP.RETURN]);
|
|
228
|
+
var ZERO_32 = new Uint8Array(32).fill(0);
|
|
229
|
+
var MAX_INDEX = 4294967295;
|
|
230
|
+
var TAG_INTENT_PROOF = "ark-intent-proof-message";
|
|
231
|
+
function validateInput(input) {
|
|
232
|
+
if (input.index === void 0) throw new Error("intent proof input requires index");
|
|
233
|
+
if (input.txid === void 0) throw new Error("intent proof input requires txid");
|
|
234
|
+
if (input.witnessUtxo === void 0)
|
|
235
|
+
throw new Error("intent proof input requires witness utxo");
|
|
236
|
+
return true;
|
|
237
|
+
}
|
|
238
|
+
function validateInputs(inputs) {
|
|
239
|
+
inputs.forEach(validateInput);
|
|
240
|
+
return true;
|
|
241
|
+
}
|
|
242
|
+
function validateOutput(output) {
|
|
243
|
+
if (output.amount === void 0) throw new Error("intent proof output requires amount");
|
|
244
|
+
if (output.script === void 0) throw new Error("intent proof output requires script");
|
|
245
|
+
return true;
|
|
246
|
+
}
|
|
247
|
+
function validateOutputs(outputs) {
|
|
248
|
+
outputs.forEach(validateOutput);
|
|
249
|
+
return true;
|
|
250
|
+
}
|
|
251
|
+
function craftToSpendTx(message, pkScript, tag = TAG_INTENT_PROOF) {
|
|
252
|
+
const messageHash = hashMessage(message, tag);
|
|
253
|
+
const tx = new Transaction({
|
|
254
|
+
version: 0
|
|
255
|
+
});
|
|
256
|
+
tx.addInput({
|
|
257
|
+
txid: ZERO_32,
|
|
258
|
+
// zero hash
|
|
259
|
+
index: MAX_INDEX,
|
|
260
|
+
sequence: 0
|
|
261
|
+
});
|
|
262
|
+
tx.addOutput({
|
|
263
|
+
amount: 0n,
|
|
264
|
+
script: pkScript
|
|
265
|
+
});
|
|
266
|
+
tx.updateInput(0, {
|
|
267
|
+
finalScriptSig: btcSigner.Script.encode(["OP_0", messageHash])
|
|
268
|
+
});
|
|
269
|
+
return tx;
|
|
270
|
+
}
|
|
271
|
+
function craftToSignTx(toSpend, inputs, outputs) {
|
|
272
|
+
const firstInput = inputs[0];
|
|
273
|
+
const tx = new Transaction({
|
|
274
|
+
version: 2,
|
|
275
|
+
lockTime: 0
|
|
276
|
+
});
|
|
277
|
+
tx.addInput({
|
|
278
|
+
...firstInput,
|
|
279
|
+
txid: toSpend.id,
|
|
280
|
+
index: 0,
|
|
281
|
+
witnessUtxo: {
|
|
282
|
+
script: firstInput.witnessUtxo.script,
|
|
283
|
+
amount: 0n
|
|
284
|
+
},
|
|
285
|
+
sighashType: btcSigner.SigHash.ALL
|
|
286
|
+
});
|
|
287
|
+
for (const [i, input] of inputs.entries()) {
|
|
288
|
+
tx.addInput({
|
|
289
|
+
...input,
|
|
290
|
+
sighashType: btcSigner.SigHash.ALL
|
|
291
|
+
});
|
|
292
|
+
if (input.unknown?.length) {
|
|
293
|
+
tx.updateInput(i + 1, {
|
|
294
|
+
unknown: input.unknown
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
if (outputs.length === 0) {
|
|
299
|
+
outputs = [
|
|
300
|
+
{
|
|
301
|
+
amount: 0n,
|
|
302
|
+
script: OP_RETURN_EMPTY_PKSCRIPT
|
|
303
|
+
}
|
|
304
|
+
];
|
|
305
|
+
}
|
|
306
|
+
for (const output of outputs) {
|
|
307
|
+
tx.addOutput({
|
|
308
|
+
amount: output.amount,
|
|
309
|
+
script: output.script
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
return tx;
|
|
313
|
+
}
|
|
314
|
+
function hashMessage(message, tag = TAG_INTENT_PROOF) {
|
|
315
|
+
return secp256k1_js.schnorr.utils.taggedHash(tag, new TextEncoder().encode(message));
|
|
316
|
+
}
|
|
317
|
+
function prepareCoinAsIntentProofInput(coin) {
|
|
318
|
+
if (!("tapTree" in coin)) {
|
|
319
|
+
return coin;
|
|
320
|
+
}
|
|
321
|
+
const vtxoScript = chunk5PG7DV7A_cjs.VtxoScript.decode(coin.tapTree);
|
|
322
|
+
const sequence = chunk5PG7DV7A_cjs.getSequence(coin.intentTapLeafScript);
|
|
323
|
+
const unknown = [VtxoTaprootTree.encode(coin.tapTree)];
|
|
324
|
+
if (coin.extraWitness) {
|
|
325
|
+
unknown.push(ConditionWitness.encode(coin.extraWitness));
|
|
326
|
+
}
|
|
327
|
+
return {
|
|
328
|
+
txid: base.hex.decode(coin.txid),
|
|
329
|
+
index: coin.vout,
|
|
330
|
+
witnessUtxo: {
|
|
331
|
+
amount: BigInt(coin.value),
|
|
332
|
+
script: vtxoScript.pkScript
|
|
333
|
+
},
|
|
334
|
+
sequence,
|
|
335
|
+
tapLeafScript: [coin.intentTapLeafScript],
|
|
336
|
+
unknown
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
// src/providers/utils.ts
|
|
341
|
+
function createAbortError() {
|
|
342
|
+
const error = new Error("EventSource closed");
|
|
343
|
+
error.name = "AbortError";
|
|
344
|
+
return error;
|
|
345
|
+
}
|
|
346
|
+
function eventSourceIterator(eventSource) {
|
|
347
|
+
const messageQueue = [];
|
|
348
|
+
const errorQueue = [];
|
|
349
|
+
let messageResolve = null;
|
|
350
|
+
let errorResolve = null;
|
|
351
|
+
let closed = false;
|
|
352
|
+
let cleanedUp = false;
|
|
353
|
+
const cleanup = () => {
|
|
354
|
+
if (cleanedUp) return;
|
|
355
|
+
cleanedUp = true;
|
|
356
|
+
eventSource.removeEventListener("message", messageHandler);
|
|
357
|
+
eventSource.removeEventListener("error", errorHandler);
|
|
358
|
+
};
|
|
359
|
+
const close = () => {
|
|
360
|
+
if (closed) return;
|
|
361
|
+
closed = true;
|
|
362
|
+
messageQueue.length = 0;
|
|
363
|
+
errorQueue.length = 0;
|
|
364
|
+
eventSource.close();
|
|
365
|
+
cleanup();
|
|
366
|
+
if (errorResolve) {
|
|
367
|
+
const reject = errorResolve;
|
|
368
|
+
messageResolve = null;
|
|
369
|
+
errorResolve = null;
|
|
370
|
+
reject(createAbortError());
|
|
371
|
+
}
|
|
372
|
+
};
|
|
373
|
+
const messageHandler = (event) => {
|
|
374
|
+
if (closed) return;
|
|
375
|
+
if (messageResolve) {
|
|
376
|
+
const resolve = messageResolve;
|
|
377
|
+
messageResolve = null;
|
|
378
|
+
errorResolve = null;
|
|
379
|
+
resolve(event);
|
|
380
|
+
} else {
|
|
381
|
+
messageQueue.push(event);
|
|
382
|
+
}
|
|
383
|
+
};
|
|
384
|
+
const errorHandler = () => {
|
|
385
|
+
if (closed) return;
|
|
386
|
+
const error = new Error("EventSource error");
|
|
387
|
+
error.name = "EventSourceError";
|
|
388
|
+
if (errorResolve) {
|
|
389
|
+
const reject = errorResolve;
|
|
390
|
+
messageResolve = null;
|
|
391
|
+
errorResolve = null;
|
|
392
|
+
reject(error);
|
|
393
|
+
} else {
|
|
394
|
+
errorQueue.push(error);
|
|
395
|
+
}
|
|
396
|
+
};
|
|
397
|
+
eventSource.addEventListener("message", messageHandler);
|
|
398
|
+
eventSource.addEventListener("error", errorHandler);
|
|
399
|
+
const gen = (async function* () {
|
|
400
|
+
try {
|
|
401
|
+
while (!closed) {
|
|
402
|
+
if (messageQueue.length > 0) {
|
|
403
|
+
yield messageQueue.shift();
|
|
404
|
+
continue;
|
|
405
|
+
}
|
|
406
|
+
if (errorQueue.length > 0) {
|
|
407
|
+
const error = errorQueue.shift();
|
|
408
|
+
throw error;
|
|
409
|
+
}
|
|
410
|
+
const result = await new Promise((resolve, reject) => {
|
|
411
|
+
messageResolve = resolve;
|
|
412
|
+
errorResolve = reject;
|
|
413
|
+
}).finally(() => {
|
|
414
|
+
messageResolve = null;
|
|
415
|
+
errorResolve = null;
|
|
416
|
+
});
|
|
417
|
+
if (!closed && result) {
|
|
418
|
+
yield result;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
} finally {
|
|
422
|
+
closed = true;
|
|
423
|
+
cleanup();
|
|
424
|
+
eventSource.close();
|
|
425
|
+
}
|
|
426
|
+
})();
|
|
427
|
+
const origReturn = gen.return.bind(gen);
|
|
428
|
+
const managed = gen;
|
|
429
|
+
managed.close = close;
|
|
430
|
+
managed.return = (value) => {
|
|
431
|
+
close();
|
|
432
|
+
return origReturn(value);
|
|
433
|
+
};
|
|
434
|
+
return managed;
|
|
435
|
+
}
|
|
436
|
+
function isEventSourceError(error) {
|
|
437
|
+
return error instanceof Error && error.name === "EventSourceError";
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
// src/providers/ark.ts
|
|
441
|
+
var SettlementEventType = /* @__PURE__ */ ((SettlementEventType2) => {
|
|
442
|
+
SettlementEventType2["BatchStarted"] = "batch_started";
|
|
443
|
+
SettlementEventType2["BatchFinalization"] = "batch_finalization";
|
|
444
|
+
SettlementEventType2["BatchFinalized"] = "batch_finalized";
|
|
445
|
+
SettlementEventType2["BatchFailed"] = "batch_failed";
|
|
446
|
+
SettlementEventType2["TreeSigningStarted"] = "tree_signing_started";
|
|
447
|
+
SettlementEventType2["TreeNonces"] = "tree_nonces";
|
|
448
|
+
SettlementEventType2["TreeTx"] = "tree_tx";
|
|
449
|
+
SettlementEventType2["TreeSignature"] = "tree_signature";
|
|
450
|
+
SettlementEventType2["StreamStarted"] = "stream_started";
|
|
451
|
+
return SettlementEventType2;
|
|
452
|
+
})(SettlementEventType || {});
|
|
453
|
+
var RestArkProvider = class {
|
|
454
|
+
constructor(serverUrl) {
|
|
455
|
+
this.serverUrl = serverUrl;
|
|
456
|
+
}
|
|
457
|
+
async getInfo() {
|
|
458
|
+
const url = `${this.serverUrl}/v1/info`;
|
|
459
|
+
const response = await fetch(url);
|
|
460
|
+
if (!response.ok) {
|
|
461
|
+
const errorText = await response.text();
|
|
462
|
+
handleError(errorText, `Failed to get server info: ${response.statusText}`);
|
|
463
|
+
}
|
|
464
|
+
const fromServer = await response.json();
|
|
465
|
+
return {
|
|
466
|
+
boardingExitDelay: BigInt(fromServer.boardingExitDelay ?? 0),
|
|
467
|
+
checkpointTapscript: fromServer.checkpointTapscript ?? "",
|
|
468
|
+
deprecatedSigners: fromServer.deprecatedSigners?.map((signer) => ({
|
|
469
|
+
cutoffDate: BigInt(signer.cutoffDate ?? 0),
|
|
470
|
+
pubkey: signer.pubkey ?? ""
|
|
471
|
+
})) ?? [],
|
|
472
|
+
digest: fromServer.digest ?? "",
|
|
473
|
+
dust: BigInt(fromServer.dust ?? 0),
|
|
474
|
+
fees: {
|
|
475
|
+
intentFee: fromServer.fees?.intentFee ?? {},
|
|
476
|
+
txFeeRate: fromServer?.fees?.txFeeRate ?? ""
|
|
477
|
+
},
|
|
478
|
+
forfeitAddress: fromServer.forfeitAddress ?? "",
|
|
479
|
+
forfeitPubkey: fromServer.forfeitPubkey ?? "",
|
|
480
|
+
network: fromServer.network ?? "",
|
|
481
|
+
scheduledSession: "scheduledSession" in fromServer && fromServer.scheduledSession != null ? {
|
|
482
|
+
duration: BigInt(fromServer.scheduledSession.duration ?? 0),
|
|
483
|
+
nextStartTime: BigInt(fromServer.scheduledSession.nextStartTime ?? 0),
|
|
484
|
+
nextEndTime: BigInt(fromServer.scheduledSession.nextEndTime ?? 0),
|
|
485
|
+
period: BigInt(fromServer.scheduledSession.period ?? 0),
|
|
486
|
+
fees: fromServer.scheduledSession.fees ?? {}
|
|
487
|
+
} : void 0,
|
|
488
|
+
serviceStatus: fromServer.serviceStatus ?? {},
|
|
489
|
+
sessionDuration: BigInt(fromServer.sessionDuration ?? 0),
|
|
490
|
+
signerPubkey: fromServer.signerPubkey ?? "",
|
|
491
|
+
unilateralExitDelay: BigInt(fromServer.unilateralExitDelay ?? 0),
|
|
492
|
+
utxoMaxAmount: BigInt(fromServer.utxoMaxAmount ?? -1),
|
|
493
|
+
utxoMinAmount: BigInt(fromServer.utxoMinAmount ?? 0),
|
|
494
|
+
version: fromServer.version ?? "",
|
|
495
|
+
vtxoMaxAmount: BigInt(fromServer.vtxoMaxAmount ?? -1),
|
|
496
|
+
vtxoMinAmount: BigInt(fromServer.vtxoMinAmount ?? 0)
|
|
497
|
+
};
|
|
498
|
+
}
|
|
499
|
+
async submitTx(signedArkTx, checkpointTxs) {
|
|
500
|
+
const url = `${this.serverUrl}/v1/tx/submit`;
|
|
501
|
+
const response = await fetch(url, {
|
|
502
|
+
method: "POST",
|
|
503
|
+
headers: {
|
|
504
|
+
"Content-Type": "application/json"
|
|
505
|
+
},
|
|
506
|
+
body: JSON.stringify({
|
|
507
|
+
signedArkTx,
|
|
508
|
+
checkpointTxs
|
|
509
|
+
})
|
|
510
|
+
});
|
|
511
|
+
if (!response.ok) {
|
|
512
|
+
const errorText = await response.text();
|
|
513
|
+
handleError(errorText, `Failed to submit virtual transaction: ${errorText}`);
|
|
514
|
+
}
|
|
515
|
+
const data = await response.json();
|
|
516
|
+
return {
|
|
517
|
+
arkTxid: data.arkTxid,
|
|
518
|
+
finalArkTx: data.finalArkTx,
|
|
519
|
+
signedCheckpointTxs: data.signedCheckpointTxs
|
|
520
|
+
};
|
|
521
|
+
}
|
|
522
|
+
async finalizeTx(arkTxid, finalCheckpointTxs) {
|
|
523
|
+
const url = `${this.serverUrl}/v1/tx/finalize`;
|
|
524
|
+
const response = await fetch(url, {
|
|
525
|
+
method: "POST",
|
|
526
|
+
headers: {
|
|
527
|
+
"Content-Type": "application/json"
|
|
528
|
+
},
|
|
529
|
+
body: JSON.stringify({
|
|
530
|
+
arkTxid,
|
|
531
|
+
finalCheckpointTxs
|
|
532
|
+
})
|
|
533
|
+
});
|
|
534
|
+
if (!response.ok) {
|
|
535
|
+
const errorText = await response.text();
|
|
536
|
+
handleError(errorText, `Failed to finalize offchain transaction: ${errorText}`);
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
async registerIntent(intent) {
|
|
540
|
+
const url = `${this.serverUrl}/v1/batch/registerIntent`;
|
|
541
|
+
const response = await fetch(url, {
|
|
542
|
+
method: "POST",
|
|
543
|
+
headers: {
|
|
544
|
+
"Content-Type": "application/json"
|
|
545
|
+
},
|
|
546
|
+
body: JSON.stringify({
|
|
547
|
+
intent: {
|
|
548
|
+
proof: intent.proof,
|
|
549
|
+
message: exports.Intent.encodeMessage(intent.message)
|
|
550
|
+
}
|
|
551
|
+
})
|
|
552
|
+
});
|
|
553
|
+
if (!response.ok) {
|
|
554
|
+
const errorText = await response.text();
|
|
555
|
+
handleError(errorText, `Failed to register intent: ${errorText}`);
|
|
556
|
+
}
|
|
557
|
+
const data = await response.json();
|
|
558
|
+
return data.intentId;
|
|
559
|
+
}
|
|
560
|
+
async deleteIntent(intent) {
|
|
561
|
+
const url = `${this.serverUrl}/v1/batch/deleteIntent`;
|
|
562
|
+
const response = await fetch(url, {
|
|
563
|
+
method: "POST",
|
|
564
|
+
headers: {
|
|
565
|
+
"Content-Type": "application/json"
|
|
566
|
+
},
|
|
567
|
+
body: JSON.stringify({
|
|
568
|
+
intent: {
|
|
569
|
+
proof: intent.proof,
|
|
570
|
+
message: exports.Intent.encodeMessage(intent.message)
|
|
571
|
+
}
|
|
572
|
+
})
|
|
573
|
+
});
|
|
574
|
+
if (!response.ok) {
|
|
575
|
+
const errorText = await response.text();
|
|
576
|
+
handleError(errorText, `Failed to delete intent: ${errorText}`);
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
async confirmRegistration(intentId) {
|
|
580
|
+
const url = `${this.serverUrl}/v1/batch/ack`;
|
|
581
|
+
const response = await fetch(url, {
|
|
582
|
+
method: "POST",
|
|
583
|
+
headers: {
|
|
584
|
+
"Content-Type": "application/json"
|
|
585
|
+
},
|
|
586
|
+
body: JSON.stringify({
|
|
587
|
+
intentId
|
|
588
|
+
})
|
|
589
|
+
});
|
|
590
|
+
if (!response.ok) {
|
|
591
|
+
const errorText = await response.text();
|
|
592
|
+
handleError(errorText, `Failed to confirm registration: ${errorText}`);
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
async submitTreeNonces(batchId, pubkey, nonces) {
|
|
596
|
+
const url = `${this.serverUrl}/v1/batch/tree/submitNonces`;
|
|
597
|
+
const response = await fetch(url, {
|
|
598
|
+
method: "POST",
|
|
599
|
+
headers: {
|
|
600
|
+
"Content-Type": "application/json"
|
|
601
|
+
},
|
|
602
|
+
body: JSON.stringify({
|
|
603
|
+
batchId,
|
|
604
|
+
pubkey,
|
|
605
|
+
treeNonces: encodeMusig2Nonces(nonces)
|
|
606
|
+
})
|
|
607
|
+
});
|
|
608
|
+
if (!response.ok) {
|
|
609
|
+
const errorText = await response.text();
|
|
610
|
+
handleError(errorText, `Failed to submit tree nonces: ${errorText}`);
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
async submitTreeSignatures(batchId, pubkey, signatures) {
|
|
614
|
+
const url = `${this.serverUrl}/v1/batch/tree/submitSignatures`;
|
|
615
|
+
const response = await fetch(url, {
|
|
616
|
+
method: "POST",
|
|
617
|
+
headers: {
|
|
618
|
+
"Content-Type": "application/json"
|
|
619
|
+
},
|
|
620
|
+
body: JSON.stringify({
|
|
621
|
+
batchId,
|
|
622
|
+
pubkey,
|
|
623
|
+
treeSignatures: encodeMusig2Signatures(signatures)
|
|
624
|
+
})
|
|
625
|
+
});
|
|
626
|
+
if (!response.ok) {
|
|
627
|
+
const errorText = await response.text();
|
|
628
|
+
handleError(errorText, `Failed to submit tree signatures: ${errorText}`);
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
async submitSignedForfeitTxs(signedForfeitTxs, signedCommitmentTx) {
|
|
632
|
+
const url = `${this.serverUrl}/v1/batch/submitForfeitTxs`;
|
|
633
|
+
const response = await fetch(url, {
|
|
634
|
+
method: "POST",
|
|
635
|
+
headers: {
|
|
636
|
+
"Content-Type": "application/json"
|
|
637
|
+
},
|
|
638
|
+
body: JSON.stringify({
|
|
639
|
+
signedForfeitTxs,
|
|
640
|
+
signedCommitmentTx
|
|
641
|
+
})
|
|
642
|
+
});
|
|
643
|
+
if (!response.ok) {
|
|
644
|
+
const errorText = await response.text();
|
|
645
|
+
handleError(errorText, `Failed to submit forfeit transactions: ${response.statusText}`);
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
getEventStream(signal, topics) {
|
|
649
|
+
const url = `${this.serverUrl}/v1/batch/events`;
|
|
650
|
+
const queryParams = topics.length > 0 ? `?${topics.map((topic) => `topics=${encodeURIComponent(topic)}`).join("&")}` : "";
|
|
651
|
+
let iterator = null;
|
|
652
|
+
const closeIterator = () => iterator?.close();
|
|
653
|
+
const self = this;
|
|
654
|
+
const gen = (async function* () {
|
|
655
|
+
const abortHandler = closeIterator;
|
|
656
|
+
signal?.addEventListener("abort", abortHandler);
|
|
657
|
+
try {
|
|
658
|
+
while (!signal?.aborted) {
|
|
659
|
+
const currentIterator = eventSourceIterator(new EventSource(url + queryParams));
|
|
660
|
+
iterator = currentIterator;
|
|
661
|
+
try {
|
|
662
|
+
for await (const event of currentIterator) {
|
|
663
|
+
if (signal?.aborted) break;
|
|
664
|
+
try {
|
|
665
|
+
const data = JSON.parse(event.data);
|
|
666
|
+
const settlementEvent = self.parseSettlementEvent(data);
|
|
667
|
+
if (settlementEvent) {
|
|
668
|
+
yield settlementEvent;
|
|
669
|
+
}
|
|
670
|
+
} catch (err) {
|
|
671
|
+
console.error("Failed to parse event:", err);
|
|
672
|
+
throw err;
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
} catch (error) {
|
|
676
|
+
if (signal?.aborted || error instanceof Error && error.name === "AbortError") {
|
|
677
|
+
break;
|
|
678
|
+
}
|
|
679
|
+
if (isFetchTimeoutError(error)) {
|
|
680
|
+
console.debug("Timeout error ignored");
|
|
681
|
+
continue;
|
|
682
|
+
}
|
|
683
|
+
if (isEventSourceError(error)) {
|
|
684
|
+
throw error;
|
|
685
|
+
}
|
|
686
|
+
console.error("Event stream error:", error);
|
|
687
|
+
throw error;
|
|
688
|
+
} finally {
|
|
689
|
+
currentIterator.close();
|
|
690
|
+
iterator = null;
|
|
691
|
+
}
|
|
692
|
+
}
|
|
693
|
+
} finally {
|
|
694
|
+
signal?.removeEventListener("abort", abortHandler);
|
|
695
|
+
closeIterator();
|
|
696
|
+
}
|
|
697
|
+
})();
|
|
698
|
+
const origReturn = gen.return.bind(gen);
|
|
699
|
+
gen.return = (value) => {
|
|
700
|
+
closeIterator();
|
|
701
|
+
return origReturn(value);
|
|
702
|
+
};
|
|
703
|
+
return gen;
|
|
704
|
+
}
|
|
705
|
+
getTransactionsStream(signal) {
|
|
706
|
+
const url = `${this.serverUrl}/v1/txs`;
|
|
707
|
+
let iterator = null;
|
|
708
|
+
const closeIterator = () => iterator?.close();
|
|
709
|
+
const self = this;
|
|
710
|
+
const gen = (async function* () {
|
|
711
|
+
const abortHandler = closeIterator;
|
|
712
|
+
signal?.addEventListener("abort", abortHandler);
|
|
713
|
+
try {
|
|
714
|
+
while (!signal?.aborted) {
|
|
715
|
+
try {
|
|
716
|
+
const currentIterator = eventSourceIterator(new EventSource(url));
|
|
717
|
+
iterator = currentIterator;
|
|
718
|
+
for await (const event of currentIterator) {
|
|
719
|
+
if (signal?.aborted) break;
|
|
720
|
+
try {
|
|
721
|
+
const data = JSON.parse(event.data);
|
|
722
|
+
const txNotification = self.parseTransactionNotification(data);
|
|
723
|
+
if (txNotification) {
|
|
724
|
+
yield txNotification;
|
|
725
|
+
}
|
|
726
|
+
} catch (err) {
|
|
727
|
+
console.error("Failed to parse transaction notification:", err);
|
|
728
|
+
throw err;
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
} catch (error) {
|
|
732
|
+
if (signal?.aborted || error instanceof Error && error.name === "AbortError") {
|
|
733
|
+
break;
|
|
734
|
+
}
|
|
735
|
+
if (isFetchTimeoutError(error)) {
|
|
736
|
+
console.debug("Timeout error ignored");
|
|
737
|
+
continue;
|
|
738
|
+
}
|
|
739
|
+
if (isEventSourceError(error)) {
|
|
740
|
+
throw error;
|
|
741
|
+
}
|
|
742
|
+
console.error("Transaction stream error:", error);
|
|
743
|
+
throw error;
|
|
744
|
+
} finally {
|
|
745
|
+
closeIterator();
|
|
746
|
+
iterator = null;
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
} finally {
|
|
750
|
+
signal?.removeEventListener("abort", abortHandler);
|
|
751
|
+
closeIterator();
|
|
752
|
+
}
|
|
753
|
+
})();
|
|
754
|
+
const origReturn = gen.return.bind(gen);
|
|
755
|
+
gen.return = (value) => {
|
|
756
|
+
closeIterator();
|
|
757
|
+
return origReturn(value);
|
|
758
|
+
};
|
|
759
|
+
return gen;
|
|
760
|
+
}
|
|
761
|
+
async getPendingTxs(intent) {
|
|
762
|
+
const url = `${this.serverUrl}/v1/tx/pending`;
|
|
763
|
+
const response = await fetch(url, {
|
|
764
|
+
method: "POST",
|
|
765
|
+
headers: {
|
|
766
|
+
"Content-Type": "application/json"
|
|
767
|
+
},
|
|
768
|
+
body: JSON.stringify({
|
|
769
|
+
intent: {
|
|
770
|
+
proof: intent.proof,
|
|
771
|
+
message: exports.Intent.encodeMessage(intent.message)
|
|
772
|
+
}
|
|
773
|
+
})
|
|
774
|
+
});
|
|
775
|
+
if (!response.ok) {
|
|
776
|
+
const errorText = await response.text();
|
|
777
|
+
handleError(errorText, `Failed to get pending transactions: ${errorText}`);
|
|
778
|
+
}
|
|
779
|
+
const data = await response.json();
|
|
780
|
+
return data.pendingTxs;
|
|
781
|
+
}
|
|
782
|
+
parseSettlementEvent(data) {
|
|
783
|
+
if (data.batchStarted) {
|
|
784
|
+
return {
|
|
785
|
+
type: "batch_started" /* BatchStarted */,
|
|
786
|
+
id: data.batchStarted.id,
|
|
787
|
+
intentIdHashes: data.batchStarted.intentIdHashes,
|
|
788
|
+
batchExpiry: BigInt(data.batchStarted.batchExpiry)
|
|
789
|
+
};
|
|
790
|
+
}
|
|
791
|
+
if (data.batchFinalization) {
|
|
792
|
+
return {
|
|
793
|
+
type: "batch_finalization" /* BatchFinalization */,
|
|
794
|
+
id: data.batchFinalization.id,
|
|
795
|
+
commitmentTx: data.batchFinalization.commitmentTx
|
|
796
|
+
};
|
|
797
|
+
}
|
|
798
|
+
if (data.batchFinalized) {
|
|
799
|
+
return {
|
|
800
|
+
type: "batch_finalized" /* BatchFinalized */,
|
|
801
|
+
id: data.batchFinalized.id,
|
|
802
|
+
commitmentTxid: data.batchFinalized.commitmentTxid
|
|
803
|
+
};
|
|
804
|
+
}
|
|
805
|
+
if (data.batchFailed) {
|
|
806
|
+
return {
|
|
807
|
+
type: "batch_failed" /* BatchFailed */,
|
|
808
|
+
id: data.batchFailed.id,
|
|
809
|
+
reason: data.batchFailed.reason
|
|
810
|
+
};
|
|
811
|
+
}
|
|
812
|
+
if (data.treeSigningStarted) {
|
|
813
|
+
return {
|
|
814
|
+
type: "tree_signing_started" /* TreeSigningStarted */,
|
|
815
|
+
id: data.treeSigningStarted.id,
|
|
816
|
+
cosignersPublicKeys: data.treeSigningStarted.cosignersPubkeys,
|
|
817
|
+
unsignedCommitmentTx: data.treeSigningStarted.unsignedCommitmentTx
|
|
818
|
+
};
|
|
819
|
+
}
|
|
820
|
+
if (data.treeNoncesAggregated) {
|
|
821
|
+
return null;
|
|
822
|
+
}
|
|
823
|
+
if (data.treeNonces) {
|
|
824
|
+
return {
|
|
825
|
+
type: "tree_nonces" /* TreeNonces */,
|
|
826
|
+
id: data.treeNonces.id,
|
|
827
|
+
topic: data.treeNonces.topic,
|
|
828
|
+
txid: data.treeNonces.txid,
|
|
829
|
+
nonces: decodeMusig2Nonces(data.treeNonces.nonces)
|
|
830
|
+
// pubkey -> public nonce
|
|
831
|
+
};
|
|
832
|
+
}
|
|
833
|
+
if (data.treeTx) {
|
|
834
|
+
const children = Object.fromEntries(
|
|
835
|
+
Object.entries(data.treeTx.children).map(([outputIndex, txid]) => {
|
|
836
|
+
return [parseInt(outputIndex), txid];
|
|
837
|
+
})
|
|
838
|
+
);
|
|
839
|
+
return {
|
|
840
|
+
type: "tree_tx" /* TreeTx */,
|
|
841
|
+
id: data.treeTx.id,
|
|
842
|
+
topic: data.treeTx.topic,
|
|
843
|
+
batchIndex: data.treeTx.batchIndex,
|
|
844
|
+
chunk: {
|
|
845
|
+
txid: data.treeTx.txid,
|
|
846
|
+
tx: data.treeTx.tx,
|
|
847
|
+
children
|
|
848
|
+
}
|
|
849
|
+
};
|
|
850
|
+
}
|
|
851
|
+
if (data.treeSignature) {
|
|
852
|
+
return {
|
|
853
|
+
type: "tree_signature" /* TreeSignature */,
|
|
854
|
+
id: data.treeSignature.id,
|
|
855
|
+
topic: data.treeSignature.topic,
|
|
856
|
+
batchIndex: data.treeSignature.batchIndex,
|
|
857
|
+
txid: data.treeSignature.txid,
|
|
858
|
+
signature: data.treeSignature.signature
|
|
859
|
+
};
|
|
860
|
+
}
|
|
861
|
+
if (data.streamStarted) {
|
|
862
|
+
return {
|
|
863
|
+
type: "stream_started" /* StreamStarted */,
|
|
864
|
+
id: data.streamStarted.id
|
|
865
|
+
};
|
|
866
|
+
}
|
|
867
|
+
if (data.heartbeat) {
|
|
868
|
+
return null;
|
|
869
|
+
}
|
|
870
|
+
console.warn("Unknown event type:", data);
|
|
871
|
+
return null;
|
|
872
|
+
}
|
|
873
|
+
parseTransactionNotification(data) {
|
|
874
|
+
if (data.commitmentTx) {
|
|
875
|
+
return {
|
|
876
|
+
commitmentTx: {
|
|
877
|
+
txid: data.commitmentTx.txid,
|
|
878
|
+
tx: data.commitmentTx.tx,
|
|
879
|
+
spentVtxos: data.commitmentTx.spentVtxos.map(mapVtxo),
|
|
880
|
+
spendableVtxos: data.commitmentTx.spendableVtxos.map(mapVtxo),
|
|
881
|
+
checkpointTxs: data.commitmentTx.checkpointTxs
|
|
882
|
+
}
|
|
883
|
+
};
|
|
884
|
+
}
|
|
885
|
+
if (data.arkTx) {
|
|
886
|
+
return {
|
|
887
|
+
arkTx: {
|
|
888
|
+
txid: data.arkTx.txid,
|
|
889
|
+
tx: data.arkTx.tx,
|
|
890
|
+
spentVtxos: data.arkTx.spentVtxos.map(mapVtxo),
|
|
891
|
+
spendableVtxos: data.arkTx.spendableVtxos.map(mapVtxo),
|
|
892
|
+
checkpointTxs: data.arkTx.checkpointTxs
|
|
893
|
+
}
|
|
894
|
+
};
|
|
895
|
+
}
|
|
896
|
+
if (data.heartbeat) {
|
|
897
|
+
return null;
|
|
898
|
+
}
|
|
899
|
+
console.warn("Unknown transaction notification type:", data);
|
|
900
|
+
return null;
|
|
901
|
+
}
|
|
902
|
+
};
|
|
903
|
+
function encodeMusig2Nonces(nonces) {
|
|
904
|
+
const noncesObject = {};
|
|
905
|
+
for (const [txid, nonce] of nonces) {
|
|
906
|
+
noncesObject[txid] = base.hex.encode(nonce.pubNonce);
|
|
907
|
+
}
|
|
908
|
+
return noncesObject;
|
|
909
|
+
}
|
|
910
|
+
function encodeMusig2Signatures(signatures) {
|
|
911
|
+
const sigObject = {};
|
|
912
|
+
for (const [txid, sig] of signatures) {
|
|
913
|
+
sigObject[txid] = base.hex.encode(sig.encode());
|
|
914
|
+
}
|
|
915
|
+
return sigObject;
|
|
916
|
+
}
|
|
917
|
+
function decodeMusig2Nonces(noncesObject) {
|
|
918
|
+
return new Map(
|
|
919
|
+
Object.entries(noncesObject).map(([txid, nonce]) => {
|
|
920
|
+
if (typeof nonce !== "string") {
|
|
921
|
+
throw new Error("invalid nonce");
|
|
922
|
+
}
|
|
923
|
+
return [txid, { pubNonce: base.hex.decode(nonce) }];
|
|
924
|
+
})
|
|
925
|
+
);
|
|
926
|
+
}
|
|
927
|
+
function isFetchTimeoutError(err) {
|
|
928
|
+
const checkError = (error) => {
|
|
929
|
+
if (!(error instanceof Error)) return false;
|
|
930
|
+
const isCloudflare524 = error.name === "TypeError" && error.message === "Failed to fetch";
|
|
931
|
+
return isCloudflare524 || error.name === "HeadersTimeoutError" || error.name === "BodyTimeoutError" || error.code === "UND_ERR_HEADERS_TIMEOUT" || error.code === "UND_ERR_BODY_TIMEOUT";
|
|
932
|
+
};
|
|
933
|
+
return checkError(err) || checkError(err.cause);
|
|
934
|
+
}
|
|
935
|
+
function mapVtxo(vtxo) {
|
|
936
|
+
return {
|
|
937
|
+
outpoint: {
|
|
938
|
+
txid: vtxo.outpoint.txid,
|
|
939
|
+
vout: vtxo.outpoint.vout
|
|
940
|
+
},
|
|
941
|
+
amount: vtxo.amount,
|
|
942
|
+
script: vtxo.script,
|
|
943
|
+
createdAt: vtxo.createdAt,
|
|
944
|
+
expiresAt: vtxo.expiresAt,
|
|
945
|
+
commitmentTxids: vtxo.commitmentTxids,
|
|
946
|
+
isPreconfirmed: vtxo.isPreconfirmed,
|
|
947
|
+
isSwept: vtxo.isSwept,
|
|
948
|
+
isUnrolled: vtxo.isUnrolled,
|
|
949
|
+
isSpent: vtxo.isSpent,
|
|
950
|
+
spentBy: vtxo.spentBy,
|
|
951
|
+
settledBy: vtxo.settledBy,
|
|
952
|
+
arkTxid: vtxo.arkTxid
|
|
953
|
+
};
|
|
954
|
+
}
|
|
955
|
+
function handleError(errorText, defaultMessage) {
|
|
956
|
+
const error = new Error(errorText);
|
|
957
|
+
const arkError = maybeArkError(error);
|
|
958
|
+
throw arkError ?? new Error(defaultMessage);
|
|
959
|
+
}
|
|
960
|
+
|
|
961
|
+
// src/extension/asset/index.ts
|
|
962
|
+
var asset_exports = {};
|
|
963
|
+
chunk5BLDMQED_cjs.__export(asset_exports, {
|
|
964
|
+
AssetGroup: () => AssetGroup,
|
|
965
|
+
AssetId: () => AssetId,
|
|
966
|
+
AssetInput: () => AssetInput,
|
|
967
|
+
AssetInputType: () => AssetInputType,
|
|
968
|
+
AssetInputs: () => AssetInputs,
|
|
969
|
+
AssetOutput: () => AssetOutput,
|
|
970
|
+
AssetOutputs: () => AssetOutputs,
|
|
971
|
+
AssetRef: () => AssetRef,
|
|
972
|
+
AssetRefType: () => AssetRefType,
|
|
973
|
+
Metadata: () => Metadata,
|
|
974
|
+
MetadataList: () => MetadataList,
|
|
975
|
+
Packet: () => Packet
|
|
976
|
+
});
|
|
977
|
+
|
|
978
|
+
// src/extension/asset/types.ts
|
|
979
|
+
var TX_HASH_SIZE = 32;
|
|
980
|
+
var ASSET_ID_SIZE = 34;
|
|
981
|
+
var AssetInputType = /* @__PURE__ */ ((AssetInputType2) => {
|
|
982
|
+
AssetInputType2[AssetInputType2["Unspecified"] = 0] = "Unspecified";
|
|
983
|
+
AssetInputType2[AssetInputType2["Local"] = 1] = "Local";
|
|
984
|
+
AssetInputType2[AssetInputType2["Intent"] = 2] = "Intent";
|
|
985
|
+
return AssetInputType2;
|
|
986
|
+
})(AssetInputType || {});
|
|
987
|
+
var AssetRefType = /* @__PURE__ */ ((AssetRefType2) => {
|
|
988
|
+
AssetRefType2[AssetRefType2["Unspecified"] = 0] = "Unspecified";
|
|
989
|
+
AssetRefType2[AssetRefType2["ByID"] = 1] = "ByID";
|
|
990
|
+
AssetRefType2[AssetRefType2["ByGroup"] = 2] = "ByGroup";
|
|
991
|
+
return AssetRefType2;
|
|
992
|
+
})(AssetRefType || {});
|
|
993
|
+
var MASK_ASSET_ID = 1;
|
|
994
|
+
var MASK_CONTROL_ASSET = 2;
|
|
995
|
+
var MASK_METADATA = 4;
|
|
996
|
+
|
|
997
|
+
// src/extension/asset/utils.ts
|
|
998
|
+
var BufferWriter = class {
|
|
999
|
+
buffer = [];
|
|
1000
|
+
write(data) {
|
|
1001
|
+
for (const byte of data) {
|
|
1002
|
+
this.buffer.push(byte);
|
|
1003
|
+
}
|
|
1004
|
+
}
|
|
1005
|
+
writeByte(byte) {
|
|
1006
|
+
this.buffer.push(byte & 255);
|
|
1007
|
+
}
|
|
1008
|
+
writeUint16LE(value) {
|
|
1009
|
+
const buf = new Uint8Array(2);
|
|
1010
|
+
new DataView(buf.buffer).setUint16(0, value, true);
|
|
1011
|
+
this.write(buf);
|
|
1012
|
+
}
|
|
1013
|
+
writeVarUint(value) {
|
|
1014
|
+
if (typeof value === "number") {
|
|
1015
|
+
if (!Number.isInteger(value) || value < 0) {
|
|
1016
|
+
throw new RangeError("writeVarUint: value must be a non-negative integer");
|
|
1017
|
+
}
|
|
1018
|
+
} else if (value < 0n) {
|
|
1019
|
+
throw new RangeError("writeVarUint: value must be a non-negative integer");
|
|
1020
|
+
}
|
|
1021
|
+
const val = typeof value === "number" ? BigInt(value) : value;
|
|
1022
|
+
const bytes = [];
|
|
1023
|
+
let remaining = val;
|
|
1024
|
+
do {
|
|
1025
|
+
let byte = Number(remaining & 0x7fn);
|
|
1026
|
+
remaining >>= 7n;
|
|
1027
|
+
if (remaining > 0n) {
|
|
1028
|
+
byte |= 128;
|
|
1029
|
+
}
|
|
1030
|
+
bytes.push(byte);
|
|
1031
|
+
} while (remaining > 0n);
|
|
1032
|
+
this.write(new Uint8Array(bytes));
|
|
1033
|
+
}
|
|
1034
|
+
writeVarSlice(data) {
|
|
1035
|
+
this.writeVarUint(data.length);
|
|
1036
|
+
this.write(data);
|
|
1037
|
+
}
|
|
1038
|
+
toBytes() {
|
|
1039
|
+
return new Uint8Array(this.buffer);
|
|
1040
|
+
}
|
|
1041
|
+
};
|
|
1042
|
+
var BufferReader = class {
|
|
1043
|
+
view;
|
|
1044
|
+
offset = 0;
|
|
1045
|
+
constructor(data) {
|
|
1046
|
+
this.view = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
1047
|
+
}
|
|
1048
|
+
remaining() {
|
|
1049
|
+
return this.view.byteLength - this.offset;
|
|
1050
|
+
}
|
|
1051
|
+
readByte() {
|
|
1052
|
+
if (this.offset >= this.view.byteLength) {
|
|
1053
|
+
throw new Error("unexpected end of buffer");
|
|
1054
|
+
}
|
|
1055
|
+
return this.view.getUint8(this.offset++);
|
|
1056
|
+
}
|
|
1057
|
+
readSlice(size) {
|
|
1058
|
+
if (this.offset + size > this.view.byteLength) {
|
|
1059
|
+
throw new Error("unexpected end of buffer");
|
|
1060
|
+
}
|
|
1061
|
+
const result = new Uint8Array(this.view.buffer, this.view.byteOffset + this.offset, size);
|
|
1062
|
+
this.offset += size;
|
|
1063
|
+
return result;
|
|
1064
|
+
}
|
|
1065
|
+
readUint16LE() {
|
|
1066
|
+
if (this.offset + 2 > this.view.byteLength) {
|
|
1067
|
+
throw new Error("unexpected end of buffer");
|
|
1068
|
+
}
|
|
1069
|
+
const value = this.view.getUint16(this.offset, true);
|
|
1070
|
+
this.offset += 2;
|
|
1071
|
+
return value;
|
|
1072
|
+
}
|
|
1073
|
+
readVarUint() {
|
|
1074
|
+
let result = 0n;
|
|
1075
|
+
let shift = 0n;
|
|
1076
|
+
let byte;
|
|
1077
|
+
do {
|
|
1078
|
+
if (this.offset >= this.view.byteLength) {
|
|
1079
|
+
throw new Error("unexpected end of buffer");
|
|
1080
|
+
}
|
|
1081
|
+
byte = this.view.getUint8(this.offset++);
|
|
1082
|
+
result |= BigInt(byte & 127) << shift;
|
|
1083
|
+
shift += 7n;
|
|
1084
|
+
} while (byte & 128);
|
|
1085
|
+
return result;
|
|
1086
|
+
}
|
|
1087
|
+
readVarSlice() {
|
|
1088
|
+
const length = Number(this.readVarUint());
|
|
1089
|
+
return this.readSlice(length);
|
|
1090
|
+
}
|
|
1091
|
+
};
|
|
1092
|
+
function isZeroBytes(bytes) {
|
|
1093
|
+
return bytes.every((byte) => byte === 0);
|
|
1094
|
+
}
|
|
1095
|
+
|
|
1096
|
+
// src/extension/asset/assetId.ts
|
|
1097
|
+
var AssetId = class _AssetId {
|
|
1098
|
+
constructor(txid, groupIndex) {
|
|
1099
|
+
this.txid = txid;
|
|
1100
|
+
this.groupIndex = groupIndex;
|
|
1101
|
+
}
|
|
1102
|
+
/**
|
|
1103
|
+
* Create an asset id from a genesis transaction id and group index.
|
|
1104
|
+
*
|
|
1105
|
+
* @param txid - Hex-encoded genesis transaction id
|
|
1106
|
+
* @param groupIndex - Asset group index within the genesis transaction
|
|
1107
|
+
* @returns A validated asset id
|
|
1108
|
+
* @throws Error if the txid is missing, malformed, or not 32 bytes long
|
|
1109
|
+
* @see fromString
|
|
1110
|
+
*/
|
|
1111
|
+
static create(txid, groupIndex) {
|
|
1112
|
+
if (!txid) {
|
|
1113
|
+
throw new Error("missing txid");
|
|
1114
|
+
}
|
|
1115
|
+
let buf;
|
|
1116
|
+
try {
|
|
1117
|
+
buf = base.hex.decode(txid);
|
|
1118
|
+
} catch {
|
|
1119
|
+
throw new Error("invalid txid format, must be hex");
|
|
1120
|
+
}
|
|
1121
|
+
if (buf.length !== TX_HASH_SIZE) {
|
|
1122
|
+
throw new Error(
|
|
1123
|
+
`invalid txid length: got ${buf.length} bytes, want ${TX_HASH_SIZE} bytes`
|
|
1124
|
+
);
|
|
1125
|
+
}
|
|
1126
|
+
const assetId = new _AssetId(buf, groupIndex);
|
|
1127
|
+
assetId.validate();
|
|
1128
|
+
return assetId;
|
|
1129
|
+
}
|
|
1130
|
+
/**
|
|
1131
|
+
* Decode an asset id from its hex string representation.
|
|
1132
|
+
*
|
|
1133
|
+
* @param s - Hex-encoded asset id
|
|
1134
|
+
* @returns Decoded asset id
|
|
1135
|
+
* @throws Error if the string is not valid hex or does not encode a valid asset id
|
|
1136
|
+
* @see toString
|
|
1137
|
+
*/
|
|
1138
|
+
static fromString(s) {
|
|
1139
|
+
let buf;
|
|
1140
|
+
try {
|
|
1141
|
+
buf = base.hex.decode(s);
|
|
1142
|
+
} catch {
|
|
1143
|
+
throw new Error("invalid asset id format, must be hex");
|
|
1144
|
+
}
|
|
1145
|
+
return _AssetId.fromBytes(buf);
|
|
1146
|
+
}
|
|
1147
|
+
/**
|
|
1148
|
+
* Decode an asset id from its serialized bytes.
|
|
1149
|
+
*
|
|
1150
|
+
* @param buf - Serialized asset id bytes
|
|
1151
|
+
* @returns Decoded asset id
|
|
1152
|
+
* @throws Error if the buffer length is invalid
|
|
1153
|
+
*/
|
|
1154
|
+
static fromBytes(buf) {
|
|
1155
|
+
if (!buf || buf.length === 0) {
|
|
1156
|
+
throw new Error("missing asset id");
|
|
1157
|
+
}
|
|
1158
|
+
if (buf.length !== ASSET_ID_SIZE) {
|
|
1159
|
+
throw new Error(
|
|
1160
|
+
`invalid asset id length: got ${buf.length} bytes, want ${ASSET_ID_SIZE} bytes`
|
|
1161
|
+
);
|
|
1162
|
+
}
|
|
1163
|
+
const reader = new BufferReader(buf);
|
|
1164
|
+
return _AssetId.fromReader(reader);
|
|
1165
|
+
}
|
|
1166
|
+
/**
|
|
1167
|
+
* Serialize the asset id to raw bytes.
|
|
1168
|
+
*
|
|
1169
|
+
* @returns Serialized asset id bytes
|
|
1170
|
+
* @see fromBytes
|
|
1171
|
+
*/
|
|
1172
|
+
serialize() {
|
|
1173
|
+
const writer = new BufferWriter();
|
|
1174
|
+
this.serializeTo(writer);
|
|
1175
|
+
return writer.toBytes();
|
|
1176
|
+
}
|
|
1177
|
+
/**
|
|
1178
|
+
* Encode the asset id to a hex string.
|
|
1179
|
+
*
|
|
1180
|
+
* @returns Hex-encoded asset id
|
|
1181
|
+
* @see fromString
|
|
1182
|
+
*/
|
|
1183
|
+
toString() {
|
|
1184
|
+
return base.hex.encode(this.serialize());
|
|
1185
|
+
}
|
|
1186
|
+
/**
|
|
1187
|
+
* Validate the asset id fields.
|
|
1188
|
+
*
|
|
1189
|
+
* @throws Error if the txid is empty or the group index is out of range
|
|
1190
|
+
*/
|
|
1191
|
+
validate() {
|
|
1192
|
+
if (isZeroBytes(this.txid)) {
|
|
1193
|
+
throw new Error("empty txid");
|
|
1194
|
+
}
|
|
1195
|
+
if (!Number.isInteger(this.groupIndex) || this.groupIndex < 0 || this.groupIndex > 65535) {
|
|
1196
|
+
throw new Error(`invalid group index: ${this.groupIndex}, must be in range [0, 65535]`);
|
|
1197
|
+
}
|
|
1198
|
+
}
|
|
1199
|
+
/**
|
|
1200
|
+
* Decode an asset id from a binary reader.
|
|
1201
|
+
*
|
|
1202
|
+
* @param reader - Reader positioned at an asset id
|
|
1203
|
+
* @returns Decoded asset id
|
|
1204
|
+
* @throws Error if the reader does not contain enough bytes
|
|
1205
|
+
*/
|
|
1206
|
+
static fromReader(reader) {
|
|
1207
|
+
if (reader.remaining() < ASSET_ID_SIZE) {
|
|
1208
|
+
throw new Error(
|
|
1209
|
+
`invalid asset id length: got ${reader.remaining()}, want ${ASSET_ID_SIZE}`
|
|
1210
|
+
);
|
|
1211
|
+
}
|
|
1212
|
+
const txid = reader.readSlice(TX_HASH_SIZE);
|
|
1213
|
+
const index = reader.readUint16LE();
|
|
1214
|
+
const assetId = new _AssetId(txid, index);
|
|
1215
|
+
assetId.validate();
|
|
1216
|
+
return assetId;
|
|
1217
|
+
}
|
|
1218
|
+
/**
|
|
1219
|
+
* Serialize the asset id into an existing binary writer.
|
|
1220
|
+
*
|
|
1221
|
+
* @param writer - Writer to append the asset id to
|
|
1222
|
+
* @see serialize
|
|
1223
|
+
*/
|
|
1224
|
+
serializeTo(writer) {
|
|
1225
|
+
writer.write(this.txid);
|
|
1226
|
+
writer.writeUint16LE(this.groupIndex);
|
|
1227
|
+
}
|
|
1228
|
+
};
|
|
1229
|
+
var AssetRef = class _AssetRef {
|
|
1230
|
+
constructor(ref) {
|
|
1231
|
+
this.ref = ref;
|
|
1232
|
+
}
|
|
1233
|
+
/** Reference type discriminator. */
|
|
1234
|
+
get type() {
|
|
1235
|
+
return this.ref.type;
|
|
1236
|
+
}
|
|
1237
|
+
/**
|
|
1238
|
+
* Create an asset reference that points to a specific asset id.
|
|
1239
|
+
*
|
|
1240
|
+
* @param assetId - Asset id referenced by this pointer
|
|
1241
|
+
* @returns Asset reference by id
|
|
1242
|
+
* @see fromGroupIndex
|
|
1243
|
+
*/
|
|
1244
|
+
static fromId(assetId) {
|
|
1245
|
+
return new _AssetRef({ type: 1 /* ByID */, assetId });
|
|
1246
|
+
}
|
|
1247
|
+
/**
|
|
1248
|
+
* Create an asset reference that points to another asset group by index.
|
|
1249
|
+
*
|
|
1250
|
+
* @param groupIndex - Zero-based asset group index in the packet
|
|
1251
|
+
* @returns Asset reference by group index
|
|
1252
|
+
* @see fromId
|
|
1253
|
+
*/
|
|
1254
|
+
static fromGroupIndex(groupIndex) {
|
|
1255
|
+
return new _AssetRef({ type: 2 /* ByGroup */, groupIndex });
|
|
1256
|
+
}
|
|
1257
|
+
/**
|
|
1258
|
+
* Decode an asset reference from its hex string form.
|
|
1259
|
+
*
|
|
1260
|
+
* @param s - Hex-encoded asset reference
|
|
1261
|
+
* @returns Decoded asset reference
|
|
1262
|
+
* @throws Error if the string is not valid hex or does not encode a valid asset reference
|
|
1263
|
+
* @see toString
|
|
1264
|
+
*/
|
|
1265
|
+
static fromString(s) {
|
|
1266
|
+
let buf;
|
|
1267
|
+
try {
|
|
1268
|
+
buf = base.hex.decode(s);
|
|
1269
|
+
} catch {
|
|
1270
|
+
throw new Error("invalid asset ref format, must be hex");
|
|
1271
|
+
}
|
|
1272
|
+
return _AssetRef.fromBytes(buf);
|
|
1273
|
+
}
|
|
1274
|
+
/**
|
|
1275
|
+
* Decode an asset reference from its serialized bytes.
|
|
1276
|
+
*
|
|
1277
|
+
* @param buf - Serialized asset reference bytes
|
|
1278
|
+
* @returns Decoded asset reference
|
|
1279
|
+
* @throws Error if the buffer is empty or malformed
|
|
1280
|
+
*/
|
|
1281
|
+
static fromBytes(buf) {
|
|
1282
|
+
if (!buf || buf.length === 0) {
|
|
1283
|
+
throw new Error("missing asset ref");
|
|
1284
|
+
}
|
|
1285
|
+
const reader = new BufferReader(buf);
|
|
1286
|
+
return _AssetRef.fromReader(reader);
|
|
1287
|
+
}
|
|
1288
|
+
/**
|
|
1289
|
+
* Serialize the asset reference to raw bytes.
|
|
1290
|
+
*
|
|
1291
|
+
* @returns Serialized asset reference bytes
|
|
1292
|
+
* @see fromBytes
|
|
1293
|
+
*/
|
|
1294
|
+
serialize() {
|
|
1295
|
+
const writer = new BufferWriter();
|
|
1296
|
+
this.serializeTo(writer);
|
|
1297
|
+
return writer.toBytes();
|
|
1298
|
+
}
|
|
1299
|
+
/**
|
|
1300
|
+
* Encode the asset reference to a hex string.
|
|
1301
|
+
*
|
|
1302
|
+
* @returns Hex-encoded asset reference
|
|
1303
|
+
* @see fromString
|
|
1304
|
+
*/
|
|
1305
|
+
toString() {
|
|
1306
|
+
return base.hex.encode(this.serialize());
|
|
1307
|
+
}
|
|
1308
|
+
/**
|
|
1309
|
+
* Decode an asset reference from a binary reader.
|
|
1310
|
+
*
|
|
1311
|
+
* @param reader - Reader positioned at an asset reference
|
|
1312
|
+
* @returns Decoded asset reference
|
|
1313
|
+
* @throws Error if the type is unknown or the reader does not contain enough bytes
|
|
1314
|
+
*/
|
|
1315
|
+
static fromReader(reader) {
|
|
1316
|
+
const type = reader.readByte();
|
|
1317
|
+
let ref;
|
|
1318
|
+
switch (type) {
|
|
1319
|
+
case 1 /* ByID */: {
|
|
1320
|
+
const assetId = AssetId.fromReader(reader);
|
|
1321
|
+
ref = new _AssetRef({ type: 1 /* ByID */, assetId });
|
|
1322
|
+
break;
|
|
1323
|
+
}
|
|
1324
|
+
case 2 /* ByGroup */: {
|
|
1325
|
+
if (reader.remaining() < 2) {
|
|
1326
|
+
throw new Error("invalid asset ref length");
|
|
1327
|
+
}
|
|
1328
|
+
const groupIndex = reader.readUint16LE();
|
|
1329
|
+
ref = new _AssetRef({ type: 2 /* ByGroup */, groupIndex });
|
|
1330
|
+
break;
|
|
1331
|
+
}
|
|
1332
|
+
case 0 /* Unspecified */:
|
|
1333
|
+
throw new Error("asset ref type unspecified");
|
|
1334
|
+
default:
|
|
1335
|
+
throw new Error(`asset ref type unknown ${type}`);
|
|
1336
|
+
}
|
|
1337
|
+
return ref;
|
|
1338
|
+
}
|
|
1339
|
+
/**
|
|
1340
|
+
* Serialize the asset reference into an existing binary writer.
|
|
1341
|
+
*
|
|
1342
|
+
* @param writer - Writer to append the asset reference to
|
|
1343
|
+
* @see serialize
|
|
1344
|
+
*/
|
|
1345
|
+
serializeTo(writer) {
|
|
1346
|
+
writer.writeByte(this.ref.type);
|
|
1347
|
+
switch (this.ref.type) {
|
|
1348
|
+
case 1 /* ByID */:
|
|
1349
|
+
this.ref.assetId.serializeTo(writer);
|
|
1350
|
+
break;
|
|
1351
|
+
case 2 /* ByGroup */:
|
|
1352
|
+
writer.writeUint16LE(this.ref.groupIndex);
|
|
1353
|
+
break;
|
|
1354
|
+
}
|
|
1355
|
+
}
|
|
1356
|
+
};
|
|
1357
|
+
var AssetInput = class _AssetInput {
|
|
1358
|
+
constructor(input) {
|
|
1359
|
+
this.input = input;
|
|
1360
|
+
}
|
|
1361
|
+
/** Gets the transaction input index for an asset input, e.g. 0 */
|
|
1362
|
+
get vin() {
|
|
1363
|
+
return this.input.vin;
|
|
1364
|
+
}
|
|
1365
|
+
/** Gets the amount for an input (in most cases, 330 sats) */
|
|
1366
|
+
get amount() {
|
|
1367
|
+
return this.input.amount;
|
|
1368
|
+
}
|
|
1369
|
+
/** Create a local asset input that points at a transaction input index. */
|
|
1370
|
+
static create(vin, amount) {
|
|
1371
|
+
const input = new _AssetInput({
|
|
1372
|
+
type: 1 /* Local */,
|
|
1373
|
+
vin,
|
|
1374
|
+
amount: typeof amount === "number" ? BigInt(amount) : amount
|
|
1375
|
+
});
|
|
1376
|
+
input.validate();
|
|
1377
|
+
return input;
|
|
1378
|
+
}
|
|
1379
|
+
/** Create an intent-backed asset input referencing an external intent transaction. */
|
|
1380
|
+
static createIntent(txid, vin, amount) {
|
|
1381
|
+
if (!txid || txid.length === 0) {
|
|
1382
|
+
throw new Error("missing input intent txid");
|
|
1383
|
+
}
|
|
1384
|
+
let buf;
|
|
1385
|
+
try {
|
|
1386
|
+
buf = base.hex.decode(txid);
|
|
1387
|
+
} catch {
|
|
1388
|
+
throw new Error("invalid input intent txid format, must be hex");
|
|
1389
|
+
}
|
|
1390
|
+
if (buf.length !== TX_HASH_SIZE) {
|
|
1391
|
+
throw new Error("invalid input intent txid length");
|
|
1392
|
+
}
|
|
1393
|
+
const input = new _AssetInput({
|
|
1394
|
+
type: 2 /* Intent */,
|
|
1395
|
+
txid: buf,
|
|
1396
|
+
vin,
|
|
1397
|
+
amount: typeof amount === "number" ? BigInt(amount) : amount
|
|
1398
|
+
});
|
|
1399
|
+
input.validate();
|
|
1400
|
+
return input;
|
|
1401
|
+
}
|
|
1402
|
+
/** Decode an asset input from its hex string form. */
|
|
1403
|
+
static fromString(s) {
|
|
1404
|
+
let buf;
|
|
1405
|
+
try {
|
|
1406
|
+
buf = base.hex.decode(s);
|
|
1407
|
+
} catch {
|
|
1408
|
+
throw new Error("invalid format, must be hex");
|
|
1409
|
+
}
|
|
1410
|
+
return _AssetInput.fromBytes(buf);
|
|
1411
|
+
}
|
|
1412
|
+
/** Decode an asset input from its serialized bytes. */
|
|
1413
|
+
static fromBytes(buf) {
|
|
1414
|
+
const reader = new BufferReader(buf);
|
|
1415
|
+
return _AssetInput.fromReader(reader);
|
|
1416
|
+
}
|
|
1417
|
+
/** Serialize the asset input to raw bytes. */
|
|
1418
|
+
serialize() {
|
|
1419
|
+
const writer = new BufferWriter();
|
|
1420
|
+
this.serializeTo(writer);
|
|
1421
|
+
return writer.toBytes();
|
|
1422
|
+
}
|
|
1423
|
+
/** Encode the asset input to a hex string. */
|
|
1424
|
+
toString() {
|
|
1425
|
+
return base.hex.encode(this.serialize());
|
|
1426
|
+
}
|
|
1427
|
+
/** Validate the asset input fields. */
|
|
1428
|
+
validate() {
|
|
1429
|
+
switch (this.input.type) {
|
|
1430
|
+
case 1 /* Local */:
|
|
1431
|
+
break;
|
|
1432
|
+
case 2 /* Intent */:
|
|
1433
|
+
if (isZeroBytes(this.input.txid)) {
|
|
1434
|
+
throw new Error("missing input intent txid");
|
|
1435
|
+
}
|
|
1436
|
+
break;
|
|
1437
|
+
}
|
|
1438
|
+
}
|
|
1439
|
+
/** Decode an asset input from a buffer reader. */
|
|
1440
|
+
static fromReader(reader) {
|
|
1441
|
+
const type = reader.readByte();
|
|
1442
|
+
let input;
|
|
1443
|
+
switch (type) {
|
|
1444
|
+
case 1 /* Local */: {
|
|
1445
|
+
const vin = reader.readUint16LE();
|
|
1446
|
+
const amount = reader.readVarUint();
|
|
1447
|
+
input = new _AssetInput({
|
|
1448
|
+
type: 1 /* Local */,
|
|
1449
|
+
vin,
|
|
1450
|
+
amount
|
|
1451
|
+
});
|
|
1452
|
+
break;
|
|
1453
|
+
}
|
|
1454
|
+
case 2 /* Intent */: {
|
|
1455
|
+
if (reader.remaining() < TX_HASH_SIZE) {
|
|
1456
|
+
throw new Error("invalid input intent txid length");
|
|
1457
|
+
}
|
|
1458
|
+
const txid = reader.readSlice(TX_HASH_SIZE);
|
|
1459
|
+
const vin = reader.readUint16LE();
|
|
1460
|
+
const amount = reader.readVarUint();
|
|
1461
|
+
input = new _AssetInput({
|
|
1462
|
+
type: 2 /* Intent */,
|
|
1463
|
+
txid: new Uint8Array(txid),
|
|
1464
|
+
vin,
|
|
1465
|
+
amount
|
|
1466
|
+
});
|
|
1467
|
+
break;
|
|
1468
|
+
}
|
|
1469
|
+
case 0 /* Unspecified */:
|
|
1470
|
+
throw new Error("asset input type unspecified");
|
|
1471
|
+
default:
|
|
1472
|
+
throw new Error(`asset input type ${type} unknown`);
|
|
1473
|
+
}
|
|
1474
|
+
input.validate();
|
|
1475
|
+
return input;
|
|
1476
|
+
}
|
|
1477
|
+
/** Serialize the asset input into an existing buffer writer. */
|
|
1478
|
+
serializeTo(writer) {
|
|
1479
|
+
writer.writeByte(this.input.type);
|
|
1480
|
+
if (this.input.type === 2 /* Intent */) {
|
|
1481
|
+
writer.write(this.input.txid);
|
|
1482
|
+
}
|
|
1483
|
+
writer.writeUint16LE(this.input.vin);
|
|
1484
|
+
writer.writeVarUint(this.input.amount);
|
|
1485
|
+
}
|
|
1486
|
+
};
|
|
1487
|
+
var AssetInputs = class _AssetInputs {
|
|
1488
|
+
constructor(inputs) {
|
|
1489
|
+
this.inputs = inputs;
|
|
1490
|
+
}
|
|
1491
|
+
/** Create a validated list of asset inputs. */
|
|
1492
|
+
static create(inputs) {
|
|
1493
|
+
const list = new _AssetInputs(inputs);
|
|
1494
|
+
list.validate();
|
|
1495
|
+
return list;
|
|
1496
|
+
}
|
|
1497
|
+
/** Decode an asset input list from its hex string form. */
|
|
1498
|
+
static fromString(s) {
|
|
1499
|
+
if (!s || s.length === 0) {
|
|
1500
|
+
throw new Error("missing asset inputs");
|
|
1501
|
+
}
|
|
1502
|
+
let buf;
|
|
1503
|
+
try {
|
|
1504
|
+
buf = base.hex.decode(s);
|
|
1505
|
+
} catch {
|
|
1506
|
+
throw new Error("invalid asset inputs format, must be hex");
|
|
1507
|
+
}
|
|
1508
|
+
const reader = new BufferReader(buf);
|
|
1509
|
+
return _AssetInputs.fromReader(reader);
|
|
1510
|
+
}
|
|
1511
|
+
/** Serialize the asset input list to raw bytes. */
|
|
1512
|
+
serialize() {
|
|
1513
|
+
const writer = new BufferWriter();
|
|
1514
|
+
this.serializeTo(writer);
|
|
1515
|
+
return writer.toBytes();
|
|
1516
|
+
}
|
|
1517
|
+
/** Encode the asset input list to a hex string. */
|
|
1518
|
+
toString() {
|
|
1519
|
+
return base.hex.encode(this.serialize());
|
|
1520
|
+
}
|
|
1521
|
+
/** Validate the asset input list. */
|
|
1522
|
+
validate() {
|
|
1523
|
+
const seen = /* @__PURE__ */ new Set();
|
|
1524
|
+
let listType = 0 /* Unspecified */;
|
|
1525
|
+
for (const assetInput of this.inputs) {
|
|
1526
|
+
assetInput.validate();
|
|
1527
|
+
if (listType === 0 /* Unspecified */) {
|
|
1528
|
+
listType = assetInput.input.type;
|
|
1529
|
+
} else if (listType !== assetInput.input.type) {
|
|
1530
|
+
throw new Error("all inputs must be of the same type");
|
|
1531
|
+
}
|
|
1532
|
+
if (assetInput.input.type === 1 /* Local */) {
|
|
1533
|
+
if (seen.has(assetInput.input.vin)) {
|
|
1534
|
+
throw new Error(`duplicated input vin ${assetInput.input.vin}`);
|
|
1535
|
+
}
|
|
1536
|
+
seen.add(assetInput.input.vin);
|
|
1537
|
+
continue;
|
|
1538
|
+
}
|
|
1539
|
+
}
|
|
1540
|
+
}
|
|
1541
|
+
/** Decode an asset input list from a buffer reader. */
|
|
1542
|
+
static fromReader(reader) {
|
|
1543
|
+
const count = Number(reader.readVarUint());
|
|
1544
|
+
const inputs = [];
|
|
1545
|
+
for (let i = 0; i < count; i++) {
|
|
1546
|
+
inputs.push(AssetInput.fromReader(reader));
|
|
1547
|
+
}
|
|
1548
|
+
return _AssetInputs.create(inputs);
|
|
1549
|
+
}
|
|
1550
|
+
/** Serialize the asset input list into an existing buffer writer. */
|
|
1551
|
+
serializeTo(writer) {
|
|
1552
|
+
writer.writeVarUint(this.inputs.length);
|
|
1553
|
+
for (const input of this.inputs) {
|
|
1554
|
+
input.serializeTo(writer);
|
|
1555
|
+
}
|
|
1556
|
+
}
|
|
1557
|
+
};
|
|
1558
|
+
var AssetOutput = class _AssetOutput {
|
|
1559
|
+
constructor(vout, amount) {
|
|
1560
|
+
this.vout = vout;
|
|
1561
|
+
this.amount = amount;
|
|
1562
|
+
}
|
|
1563
|
+
// 0x01 means local output, there is only 1 local output type currently
|
|
1564
|
+
// however we serialize it for future upgrades
|
|
1565
|
+
static TYPE_LOCAL = 1;
|
|
1566
|
+
/** Create a local asset output referencing a transaction output index. */
|
|
1567
|
+
static create(vout, amount) {
|
|
1568
|
+
const output = new _AssetOutput(vout, typeof amount === "number" ? BigInt(amount) : amount);
|
|
1569
|
+
output.validate();
|
|
1570
|
+
return output;
|
|
1571
|
+
}
|
|
1572
|
+
/** Decode an asset output from its hex string form. */
|
|
1573
|
+
static fromString(s) {
|
|
1574
|
+
let buf;
|
|
1575
|
+
try {
|
|
1576
|
+
buf = base.hex.decode(s);
|
|
1577
|
+
} catch {
|
|
1578
|
+
throw new Error("invalid asset output format, must be hex");
|
|
1579
|
+
}
|
|
1580
|
+
return _AssetOutput.fromBytes(buf);
|
|
1581
|
+
}
|
|
1582
|
+
/** Decode an asset output from its serialized bytes. */
|
|
1583
|
+
static fromBytes(buf) {
|
|
1584
|
+
if (!buf || buf.length === 0) {
|
|
1585
|
+
throw new Error("missing asset output");
|
|
1586
|
+
}
|
|
1587
|
+
const reader = new BufferReader(buf);
|
|
1588
|
+
const output = _AssetOutput.fromReader(reader);
|
|
1589
|
+
output.validate();
|
|
1590
|
+
return output;
|
|
1591
|
+
}
|
|
1592
|
+
/** Serialize the asset output to raw bytes. */
|
|
1593
|
+
serialize() {
|
|
1594
|
+
const writer = new BufferWriter();
|
|
1595
|
+
this.serializeTo(writer);
|
|
1596
|
+
return writer.toBytes();
|
|
1597
|
+
}
|
|
1598
|
+
/** Encode the asset output to a hex string. */
|
|
1599
|
+
toString() {
|
|
1600
|
+
return base.hex.encode(this.serialize());
|
|
1601
|
+
}
|
|
1602
|
+
/** Validate the asset output fields. */
|
|
1603
|
+
validate() {
|
|
1604
|
+
if (!Number.isInteger(this.vout) || this.vout < 0 || this.vout > 65535) {
|
|
1605
|
+
throw new Error("asset output vout must be an integer in range [0, 65535]");
|
|
1606
|
+
}
|
|
1607
|
+
if (this.amount <= 0n) {
|
|
1608
|
+
throw new Error("asset output amount must be greater than 0");
|
|
1609
|
+
}
|
|
1610
|
+
}
|
|
1611
|
+
/** Decode an asset output from a buffer reader. */
|
|
1612
|
+
static fromReader(reader) {
|
|
1613
|
+
if (reader.remaining() < 2) {
|
|
1614
|
+
throw new Error("invalid asset output vout length");
|
|
1615
|
+
}
|
|
1616
|
+
const type = reader.readByte();
|
|
1617
|
+
if (type !== _AssetOutput.TYPE_LOCAL) {
|
|
1618
|
+
if (type === 0) {
|
|
1619
|
+
throw new Error("output type unspecified");
|
|
1620
|
+
}
|
|
1621
|
+
throw new Error("unknown asset output type");
|
|
1622
|
+
}
|
|
1623
|
+
let vout;
|
|
1624
|
+
try {
|
|
1625
|
+
vout = reader.readUint16LE();
|
|
1626
|
+
} catch {
|
|
1627
|
+
throw new Error("invalid asset output vout length");
|
|
1628
|
+
}
|
|
1629
|
+
const amount = reader.readVarUint();
|
|
1630
|
+
return new _AssetOutput(vout, amount);
|
|
1631
|
+
}
|
|
1632
|
+
/** Serialize the asset output into an existing buffer writer. */
|
|
1633
|
+
serializeTo(writer) {
|
|
1634
|
+
writer.writeByte(1);
|
|
1635
|
+
writer.writeUint16LE(this.vout);
|
|
1636
|
+
writer.writeVarUint(this.amount);
|
|
1637
|
+
}
|
|
1638
|
+
};
|
|
1639
|
+
var AssetOutputs = class _AssetOutputs {
|
|
1640
|
+
constructor(outputs) {
|
|
1641
|
+
this.outputs = outputs;
|
|
1642
|
+
}
|
|
1643
|
+
/** Create a validated list of asset outputs. */
|
|
1644
|
+
static create(outputs) {
|
|
1645
|
+
const list = new _AssetOutputs(outputs);
|
|
1646
|
+
list.validate();
|
|
1647
|
+
return list;
|
|
1648
|
+
}
|
|
1649
|
+
/** Decode an asset output list from its hex string form. */
|
|
1650
|
+
static fromString(s) {
|
|
1651
|
+
if (!s || s.length === 0) {
|
|
1652
|
+
throw new Error("missing asset outputs");
|
|
1653
|
+
}
|
|
1654
|
+
let buf;
|
|
1655
|
+
try {
|
|
1656
|
+
buf = base.hex.decode(s);
|
|
1657
|
+
} catch {
|
|
1658
|
+
throw new Error("invalid asset outputs format, must be hex");
|
|
1659
|
+
}
|
|
1660
|
+
const reader = new BufferReader(buf);
|
|
1661
|
+
return _AssetOutputs.fromReader(reader);
|
|
1662
|
+
}
|
|
1663
|
+
/** Serialize the asset output list to raw bytes. */
|
|
1664
|
+
serialize() {
|
|
1665
|
+
const writer = new BufferWriter();
|
|
1666
|
+
this.serializeTo(writer);
|
|
1667
|
+
return writer.toBytes();
|
|
1668
|
+
}
|
|
1669
|
+
/** Encode the asset output list to a hex string. */
|
|
1670
|
+
toString() {
|
|
1671
|
+
return base.hex.encode(this.serialize());
|
|
1672
|
+
}
|
|
1673
|
+
/** Validate the asset output list. */
|
|
1674
|
+
validate() {
|
|
1675
|
+
const seen = /* @__PURE__ */ new Set();
|
|
1676
|
+
for (const output of this.outputs) {
|
|
1677
|
+
output.validate();
|
|
1678
|
+
if (seen.has(output.vout)) {
|
|
1679
|
+
throw new Error(`duplicated output vout ${output.vout}`);
|
|
1680
|
+
}
|
|
1681
|
+
seen.add(output.vout);
|
|
1682
|
+
}
|
|
1683
|
+
}
|
|
1684
|
+
/** Decode an asset output list from a buffer reader. */
|
|
1685
|
+
static fromReader(reader) {
|
|
1686
|
+
const count = Number(reader.readVarUint());
|
|
1687
|
+
if (count === 0) {
|
|
1688
|
+
return new _AssetOutputs([]);
|
|
1689
|
+
}
|
|
1690
|
+
const outputs = [];
|
|
1691
|
+
for (let i = 0; i < count; i++) {
|
|
1692
|
+
outputs.push(AssetOutput.fromReader(reader));
|
|
1693
|
+
}
|
|
1694
|
+
const result = new _AssetOutputs(outputs);
|
|
1695
|
+
result.validate();
|
|
1696
|
+
return result;
|
|
1697
|
+
}
|
|
1698
|
+
/** Serialize the asset output list into an existing buffer writer. */
|
|
1699
|
+
serializeTo(writer) {
|
|
1700
|
+
this.validate();
|
|
1701
|
+
writer.writeVarUint(this.outputs.length);
|
|
1702
|
+
for (const output of this.outputs) {
|
|
1703
|
+
output.serializeTo(writer);
|
|
1704
|
+
}
|
|
1705
|
+
}
|
|
1706
|
+
};
|
|
1707
|
+
var Metadata = class _Metadata {
|
|
1708
|
+
constructor(key, value) {
|
|
1709
|
+
this.key = key;
|
|
1710
|
+
this.value = value;
|
|
1711
|
+
}
|
|
1712
|
+
/** Create a metadata entry from raw key and value bytes. */
|
|
1713
|
+
static create(key, value) {
|
|
1714
|
+
const md = new _Metadata(key, value);
|
|
1715
|
+
md.validate();
|
|
1716
|
+
return md;
|
|
1717
|
+
}
|
|
1718
|
+
/** Decode metadata from its hex string form. */
|
|
1719
|
+
static fromString(s) {
|
|
1720
|
+
let buf;
|
|
1721
|
+
try {
|
|
1722
|
+
buf = base.hex.decode(s);
|
|
1723
|
+
} catch {
|
|
1724
|
+
throw new Error("invalid metadata format, must be hex");
|
|
1725
|
+
}
|
|
1726
|
+
return _Metadata.fromBytes(buf);
|
|
1727
|
+
}
|
|
1728
|
+
/** Decode metadata from its serialized bytes. */
|
|
1729
|
+
static fromBytes(buf) {
|
|
1730
|
+
if (!buf || buf.length === 0) {
|
|
1731
|
+
throw new Error("missing metadata");
|
|
1732
|
+
}
|
|
1733
|
+
const reader = new BufferReader(buf);
|
|
1734
|
+
return _Metadata.fromReader(reader);
|
|
1735
|
+
}
|
|
1736
|
+
/** Serialize metadata to raw bytes. */
|
|
1737
|
+
serialize() {
|
|
1738
|
+
const writer = new BufferWriter();
|
|
1739
|
+
this.serializeTo(writer);
|
|
1740
|
+
return writer.toBytes();
|
|
1741
|
+
}
|
|
1742
|
+
/** Encode metadata to a hex string. */
|
|
1743
|
+
toString() {
|
|
1744
|
+
return base.hex.encode(this.serialize());
|
|
1745
|
+
}
|
|
1746
|
+
get keyString() {
|
|
1747
|
+
return new TextDecoder().decode(this.key);
|
|
1748
|
+
}
|
|
1749
|
+
get valueString() {
|
|
1750
|
+
return new TextDecoder().decode(this.value);
|
|
1751
|
+
}
|
|
1752
|
+
/** Validate the metadata key and value. */
|
|
1753
|
+
validate() {
|
|
1754
|
+
if (this.key.length === 0) {
|
|
1755
|
+
throw new Error("missing metadata key");
|
|
1756
|
+
}
|
|
1757
|
+
if (this.value.length === 0) {
|
|
1758
|
+
throw new Error("missing metadata value");
|
|
1759
|
+
}
|
|
1760
|
+
}
|
|
1761
|
+
/** Decode metadata from a buffer reader. */
|
|
1762
|
+
static fromReader(reader) {
|
|
1763
|
+
let key;
|
|
1764
|
+
let value;
|
|
1765
|
+
try {
|
|
1766
|
+
key = reader.readVarSlice();
|
|
1767
|
+
} catch {
|
|
1768
|
+
throw new Error("invalid metadata length");
|
|
1769
|
+
}
|
|
1770
|
+
try {
|
|
1771
|
+
value = reader.readVarSlice();
|
|
1772
|
+
} catch {
|
|
1773
|
+
throw new Error("invalid metadata length");
|
|
1774
|
+
}
|
|
1775
|
+
const md = new _Metadata(key, value);
|
|
1776
|
+
md.validate();
|
|
1777
|
+
return md;
|
|
1778
|
+
}
|
|
1779
|
+
/** Serialize metadata into an existing buffer writer. */
|
|
1780
|
+
serializeTo(writer) {
|
|
1781
|
+
writer.writeVarSlice(this.key);
|
|
1782
|
+
writer.writeVarSlice(this.value);
|
|
1783
|
+
}
|
|
1784
|
+
};
|
|
1785
|
+
var MetadataList = class _MetadataList {
|
|
1786
|
+
constructor(items) {
|
|
1787
|
+
this.items = items;
|
|
1788
|
+
}
|
|
1789
|
+
static ARK_LEAF_TAG = "ArkadeAssetLeaf";
|
|
1790
|
+
static ARK_BRANCH_TAG = "ArkadeAssetBranch";
|
|
1791
|
+
static ARK_LEAF_VERSION = 0;
|
|
1792
|
+
/** Create a metadata list from its hex string form. */
|
|
1793
|
+
static fromString(s) {
|
|
1794
|
+
let buf;
|
|
1795
|
+
try {
|
|
1796
|
+
buf = base.hex.decode(s);
|
|
1797
|
+
} catch {
|
|
1798
|
+
throw new Error("invalid metadata list format");
|
|
1799
|
+
}
|
|
1800
|
+
return _MetadataList.fromBytes(buf);
|
|
1801
|
+
}
|
|
1802
|
+
/** Decode a metadata list from its serialized bytes. */
|
|
1803
|
+
static fromBytes(buf) {
|
|
1804
|
+
if (!buf || buf.length === 0) {
|
|
1805
|
+
throw new Error("missing metadata list");
|
|
1806
|
+
}
|
|
1807
|
+
const reader = new BufferReader(buf);
|
|
1808
|
+
return _MetadataList.fromReader(reader);
|
|
1809
|
+
}
|
|
1810
|
+
/** Decode a metadata list from a buffer reader. */
|
|
1811
|
+
static fromReader(reader) {
|
|
1812
|
+
const count = Number(reader.readVarUint());
|
|
1813
|
+
const items = Array.from({ length: count }, () => Metadata.fromReader(reader));
|
|
1814
|
+
return new _MetadataList(items);
|
|
1815
|
+
}
|
|
1816
|
+
/** Serialize the metadata list into an existing buffer writer. */
|
|
1817
|
+
serializeTo(writer) {
|
|
1818
|
+
writer.writeVarUint(this.items.length);
|
|
1819
|
+
for (const item of this) {
|
|
1820
|
+
item.serializeTo(writer);
|
|
1821
|
+
}
|
|
1822
|
+
}
|
|
1823
|
+
/** Serialize the metadata list to raw bytes. */
|
|
1824
|
+
serialize() {
|
|
1825
|
+
const writer = new BufferWriter();
|
|
1826
|
+
this.serializeTo(writer);
|
|
1827
|
+
return writer.toBytes();
|
|
1828
|
+
}
|
|
1829
|
+
/** Iterate through metadata entries in insertion order. */
|
|
1830
|
+
[Symbol.iterator]() {
|
|
1831
|
+
return this.items[Symbol.iterator]();
|
|
1832
|
+
}
|
|
1833
|
+
get length() {
|
|
1834
|
+
return this.items.length;
|
|
1835
|
+
}
|
|
1836
|
+
/** Compute the tagged Merkle root for the metadata list. */
|
|
1837
|
+
hash() {
|
|
1838
|
+
if (this.items.length === 0) throw new Error("missing metadata list");
|
|
1839
|
+
const levels = buildMetadataMerkleTree(this.items);
|
|
1840
|
+
return levels[levels.length - 1][0];
|
|
1841
|
+
}
|
|
1842
|
+
};
|
|
1843
|
+
function computeMetadataLeafHash(md) {
|
|
1844
|
+
const writer = new BufferWriter();
|
|
1845
|
+
writer.writeByte(MetadataList.ARK_LEAF_VERSION);
|
|
1846
|
+
writer.writeVarSlice(md.key);
|
|
1847
|
+
writer.writeVarSlice(md.value);
|
|
1848
|
+
return secp256k1_js.schnorr.utils.taggedHash(MetadataList.ARK_LEAF_TAG, writer.toBytes());
|
|
1849
|
+
}
|
|
1850
|
+
function computeMetadataBranchHash(a, b) {
|
|
1851
|
+
const [smaller, larger] = utils_js.compareBytes(a, b) === -1 ? [a, b] : [b, a];
|
|
1852
|
+
return secp256k1_js.schnorr.utils.taggedHash(MetadataList.ARK_BRANCH_TAG, smaller, larger);
|
|
1853
|
+
}
|
|
1854
|
+
function buildMetadataMerkleTree(leaves) {
|
|
1855
|
+
if (leaves.length === 0) return [];
|
|
1856
|
+
const leafHashes = leaves.map(computeMetadataLeafHash);
|
|
1857
|
+
const levels = [leafHashes];
|
|
1858
|
+
let current = leafHashes;
|
|
1859
|
+
while (current.length > 1) {
|
|
1860
|
+
const next = [];
|
|
1861
|
+
for (let i = 0; i < current.length; i += 2) {
|
|
1862
|
+
if (i + 1 < current.length) {
|
|
1863
|
+
next.push(computeMetadataBranchHash(current[i], current[i + 1]));
|
|
1864
|
+
} else {
|
|
1865
|
+
next.push(current[i]);
|
|
1866
|
+
}
|
|
1867
|
+
}
|
|
1868
|
+
levels.push(next);
|
|
1869
|
+
current = next;
|
|
1870
|
+
}
|
|
1871
|
+
return levels;
|
|
1872
|
+
}
|
|
1873
|
+
var AssetGroup = class _AssetGroup {
|
|
1874
|
+
/** @see create */
|
|
1875
|
+
constructor(assetId, controlAsset, inputs, outputs, metadata) {
|
|
1876
|
+
this.assetId = assetId;
|
|
1877
|
+
this.controlAsset = controlAsset;
|
|
1878
|
+
this.inputs = inputs;
|
|
1879
|
+
this.outputs = outputs;
|
|
1880
|
+
this.metadataList = new MetadataList(metadata);
|
|
1881
|
+
}
|
|
1882
|
+
metadataList;
|
|
1883
|
+
/**
|
|
1884
|
+
* Create and validate an asset group.
|
|
1885
|
+
*
|
|
1886
|
+
* @param assetId - Asset id for this group, or `null` for fresh issuance
|
|
1887
|
+
* @param controlAsset - Optional control asset reference for (re) issuance
|
|
1888
|
+
* @param inputs - Asset inputs in the group
|
|
1889
|
+
* @param outputs - Asset outputs in the group
|
|
1890
|
+
* @param metadata - Metadata entries associated with the group
|
|
1891
|
+
* @returns A validated asset group
|
|
1892
|
+
* @throws Error if the group fails validation
|
|
1893
|
+
* @see validate
|
|
1894
|
+
*/
|
|
1895
|
+
static create(assetId, controlAsset, inputs, outputs, metadata) {
|
|
1896
|
+
const ag = new _AssetGroup(assetId, controlAsset, inputs, outputs, metadata);
|
|
1897
|
+
ag.validate();
|
|
1898
|
+
return ag;
|
|
1899
|
+
}
|
|
1900
|
+
/**
|
|
1901
|
+
* Decode an asset group from its hex string form.
|
|
1902
|
+
*
|
|
1903
|
+
* @param s - Hex-encoded asset group
|
|
1904
|
+
* @returns Decoded asset group
|
|
1905
|
+
* @throws Error if the string is not valid hex or does not encode a valid asset group
|
|
1906
|
+
* @see toString
|
|
1907
|
+
*/
|
|
1908
|
+
static fromString(s) {
|
|
1909
|
+
let buf;
|
|
1910
|
+
try {
|
|
1911
|
+
buf = base.hex.decode(s);
|
|
1912
|
+
} catch {
|
|
1913
|
+
throw new Error("invalid format, must be hex");
|
|
1914
|
+
}
|
|
1915
|
+
return _AssetGroup.fromBytes(buf);
|
|
1916
|
+
}
|
|
1917
|
+
/**
|
|
1918
|
+
* Decode an asset group from its serialized bytes.
|
|
1919
|
+
*
|
|
1920
|
+
* @param buf - Serialized asset group bytes
|
|
1921
|
+
* @returns Decoded asset group
|
|
1922
|
+
* @throws Error if the buffer is empty or malformed
|
|
1923
|
+
*/
|
|
1924
|
+
static fromBytes(buf) {
|
|
1925
|
+
if (!buf || buf.length === 0) {
|
|
1926
|
+
throw new Error("missing asset group");
|
|
1927
|
+
}
|
|
1928
|
+
const reader = new BufferReader(buf);
|
|
1929
|
+
return _AssetGroup.fromReader(reader);
|
|
1930
|
+
}
|
|
1931
|
+
/**
|
|
1932
|
+
* Return true when the group represents an issuance.
|
|
1933
|
+
*
|
|
1934
|
+
* @returns `true` when the group has no asset id
|
|
1935
|
+
*/
|
|
1936
|
+
isIssuance() {
|
|
1937
|
+
return this.assetId === null;
|
|
1938
|
+
}
|
|
1939
|
+
/**
|
|
1940
|
+
* Return true when the group represents a reissuance.
|
|
1941
|
+
*
|
|
1942
|
+
* @returns `true` when the group has an asset id and outputs exceed local inputs
|
|
1943
|
+
* @remarks
|
|
1944
|
+
* Only local inputs contribute to the comparison; intent-backed inputs contribute `0` here.
|
|
1945
|
+
*/
|
|
1946
|
+
isReissuance() {
|
|
1947
|
+
const sumReducer = (s, { amount }) => s + amount;
|
|
1948
|
+
const sumOutputs = this.outputs.reduce(sumReducer, 0n);
|
|
1949
|
+
const sumInputs = this.inputs.map((i) => ({
|
|
1950
|
+
amount: i.input.type === 1 /* Local */ ? i.input.amount : 0n
|
|
1951
|
+
})).reduce(sumReducer, 0n);
|
|
1952
|
+
return !this.isIssuance() && sumInputs < sumOutputs;
|
|
1953
|
+
}
|
|
1954
|
+
/**
|
|
1955
|
+
* Serialize the asset group to raw bytes.
|
|
1956
|
+
*
|
|
1957
|
+
* @returns Serialized asset group bytes
|
|
1958
|
+
* @see fromBytes
|
|
1959
|
+
*/
|
|
1960
|
+
serialize() {
|
|
1961
|
+
this.validate();
|
|
1962
|
+
const writer = new BufferWriter();
|
|
1963
|
+
this.serializeTo(writer);
|
|
1964
|
+
return writer.toBytes();
|
|
1965
|
+
}
|
|
1966
|
+
/**
|
|
1967
|
+
* Validate the asset group and its child structures.
|
|
1968
|
+
*
|
|
1969
|
+
* @throws Error if the group is empty or violates issuance invariants
|
|
1970
|
+
*/
|
|
1971
|
+
validate() {
|
|
1972
|
+
if (this.inputs.length === 0 && this.outputs.length === 0) {
|
|
1973
|
+
throw new Error("empty asset group");
|
|
1974
|
+
}
|
|
1975
|
+
if (this.isIssuance()) {
|
|
1976
|
+
if (this.inputs.length !== 0) {
|
|
1977
|
+
throw new Error("issuance must have no inputs");
|
|
1978
|
+
}
|
|
1979
|
+
} else {
|
|
1980
|
+
if (this.controlAsset !== null) {
|
|
1981
|
+
throw new Error("only issuance can have a control asset");
|
|
1982
|
+
}
|
|
1983
|
+
}
|
|
1984
|
+
}
|
|
1985
|
+
/**
|
|
1986
|
+
* Convert the group into its batch-leaf representation for the given intent txid.
|
|
1987
|
+
*
|
|
1988
|
+
* @param intentTxid - Intent transaction id used to build the leaf input reference
|
|
1989
|
+
* @returns Batch-leaf asset group
|
|
1990
|
+
* @see AssetInput.createIntent
|
|
1991
|
+
*/
|
|
1992
|
+
toBatchLeafAssetGroup(intentTxid) {
|
|
1993
|
+
const leafInput = AssetInput.createIntent(base.hex.encode(intentTxid), 0, 0);
|
|
1994
|
+
return new _AssetGroup(
|
|
1995
|
+
this.assetId,
|
|
1996
|
+
this.controlAsset,
|
|
1997
|
+
[leafInput],
|
|
1998
|
+
this.outputs,
|
|
1999
|
+
this.metadataList.items
|
|
2000
|
+
);
|
|
2001
|
+
}
|
|
2002
|
+
/**
|
|
2003
|
+
* Encode the asset group to a hex string.
|
|
2004
|
+
*
|
|
2005
|
+
* @returns Hex-encoded asset group
|
|
2006
|
+
* @see fromString
|
|
2007
|
+
*/
|
|
2008
|
+
toString() {
|
|
2009
|
+
return base.hex.encode(this.serialize());
|
|
2010
|
+
}
|
|
2011
|
+
/**
|
|
2012
|
+
* Decode an asset group from a binary reader.
|
|
2013
|
+
*
|
|
2014
|
+
* @param reader - Reader positioned at an asset group
|
|
2015
|
+
* @returns Decoded asset group
|
|
2016
|
+
* @throws Error if the encoded group is malformed
|
|
2017
|
+
*/
|
|
2018
|
+
static fromReader(reader) {
|
|
2019
|
+
const presence = reader.readByte();
|
|
2020
|
+
let assetId = null;
|
|
2021
|
+
let controlAsset = null;
|
|
2022
|
+
let metadata = [];
|
|
2023
|
+
if (presence & MASK_ASSET_ID) {
|
|
2024
|
+
assetId = AssetId.fromReader(reader);
|
|
2025
|
+
}
|
|
2026
|
+
if (presence & MASK_CONTROL_ASSET) {
|
|
2027
|
+
controlAsset = AssetRef.fromReader(reader);
|
|
2028
|
+
}
|
|
2029
|
+
if (presence & MASK_METADATA) {
|
|
2030
|
+
metadata = MetadataList.fromReader(reader).items;
|
|
2031
|
+
}
|
|
2032
|
+
const inputs = AssetInputs.fromReader(reader);
|
|
2033
|
+
const outputs = AssetOutputs.fromReader(reader);
|
|
2034
|
+
const ag = new _AssetGroup(assetId, controlAsset, inputs.inputs, outputs.outputs, metadata);
|
|
2035
|
+
ag.validate();
|
|
2036
|
+
return ag;
|
|
2037
|
+
}
|
|
2038
|
+
/**
|
|
2039
|
+
* Serialize the asset group into an existing binary writer.
|
|
2040
|
+
*
|
|
2041
|
+
* @param writer - Writer to append the asset group to
|
|
2042
|
+
*/
|
|
2043
|
+
serializeTo(writer) {
|
|
2044
|
+
let presence = 0;
|
|
2045
|
+
if (this.assetId !== null) {
|
|
2046
|
+
presence |= MASK_ASSET_ID;
|
|
2047
|
+
}
|
|
2048
|
+
if (this.controlAsset !== null) {
|
|
2049
|
+
presence |= MASK_CONTROL_ASSET;
|
|
2050
|
+
}
|
|
2051
|
+
if (this.metadataList.length > 0) {
|
|
2052
|
+
presence |= MASK_METADATA;
|
|
2053
|
+
}
|
|
2054
|
+
writer.writeByte(presence);
|
|
2055
|
+
if (presence & MASK_ASSET_ID) {
|
|
2056
|
+
this.assetId.serializeTo(writer);
|
|
2057
|
+
}
|
|
2058
|
+
if (presence & MASK_CONTROL_ASSET) {
|
|
2059
|
+
this.controlAsset.serializeTo(writer);
|
|
2060
|
+
}
|
|
2061
|
+
if (presence & MASK_METADATA) {
|
|
2062
|
+
this.metadataList.serializeTo(writer);
|
|
2063
|
+
}
|
|
2064
|
+
writer.writeVarUint(this.inputs.length);
|
|
2065
|
+
for (const input of this.inputs) {
|
|
2066
|
+
input.serializeTo(writer);
|
|
2067
|
+
}
|
|
2068
|
+
writer.writeVarUint(this.outputs.length);
|
|
2069
|
+
for (const output of this.outputs) {
|
|
2070
|
+
output.serializeTo(writer);
|
|
2071
|
+
}
|
|
2072
|
+
}
|
|
2073
|
+
};
|
|
2074
|
+
var Packet = class _Packet {
|
|
2075
|
+
constructor(groups) {
|
|
2076
|
+
this.groups = groups;
|
|
2077
|
+
}
|
|
2078
|
+
/** PACKET_TYPE is the 1-byte TLV type tag used in the Extension envelope. */
|
|
2079
|
+
static PACKET_TYPE = 0;
|
|
2080
|
+
/** Create a validated asset packet from a list of asset groups. */
|
|
2081
|
+
static create(groups) {
|
|
2082
|
+
const p = new _Packet(groups);
|
|
2083
|
+
p.validate();
|
|
2084
|
+
return p;
|
|
2085
|
+
}
|
|
2086
|
+
/**
|
|
2087
|
+
* fromBytes parses a Packet from raw bytes.
|
|
2088
|
+
*/
|
|
2089
|
+
static fromBytes(buf) {
|
|
2090
|
+
return _Packet.fromReader(new BufferReader(buf));
|
|
2091
|
+
}
|
|
2092
|
+
/**
|
|
2093
|
+
* fromString parses a Packet from a raw hex string (not an OP_RETURN script).
|
|
2094
|
+
*/
|
|
2095
|
+
static fromString(s) {
|
|
2096
|
+
if (!s) {
|
|
2097
|
+
throw new Error("missing packet data");
|
|
2098
|
+
}
|
|
2099
|
+
let buf;
|
|
2100
|
+
try {
|
|
2101
|
+
buf = base.hex.decode(s);
|
|
2102
|
+
} catch {
|
|
2103
|
+
throw new Error("invalid packet format, must be hex");
|
|
2104
|
+
}
|
|
2105
|
+
return _Packet.fromBytes(buf);
|
|
2106
|
+
}
|
|
2107
|
+
/**
|
|
2108
|
+
* type returns the TLV packet type tag. Implements ExtensionPacket interface.
|
|
2109
|
+
*/
|
|
2110
|
+
type() {
|
|
2111
|
+
return _Packet.PACKET_TYPE;
|
|
2112
|
+
}
|
|
2113
|
+
/** Convert the packet into the batch-leaf form for a specific intent transaction id. */
|
|
2114
|
+
leafTxPacket(intentTxid) {
|
|
2115
|
+
const leafGroups = this.groups.map((group) => group.toBatchLeafAssetGroup(intentTxid));
|
|
2116
|
+
return new _Packet(leafGroups);
|
|
2117
|
+
}
|
|
2118
|
+
/**
|
|
2119
|
+
* serialize encodes the packet as raw bytes (varint group count + group data).
|
|
2120
|
+
* Does NOT include OP_RETURN, Arkade magic bytes (`ARK`), or TLV type/length; those are
|
|
2121
|
+
* added by the Extension module.
|
|
2122
|
+
*/
|
|
2123
|
+
serialize() {
|
|
2124
|
+
if (this.groups.length === 0) {
|
|
2125
|
+
return new Uint8Array(0);
|
|
2126
|
+
}
|
|
2127
|
+
const writer = new BufferWriter();
|
|
2128
|
+
writer.writeVarUint(this.groups.length);
|
|
2129
|
+
for (const group of this.groups) {
|
|
2130
|
+
group.serializeTo(writer);
|
|
2131
|
+
}
|
|
2132
|
+
return writer.toBytes();
|
|
2133
|
+
}
|
|
2134
|
+
/**
|
|
2135
|
+
* toString returns the hex-encoded raw packet bytes.
|
|
2136
|
+
*/
|
|
2137
|
+
toString() {
|
|
2138
|
+
return base.hex.encode(this.serialize());
|
|
2139
|
+
}
|
|
2140
|
+
/** Validate packet structure and cross-group references. */
|
|
2141
|
+
validate() {
|
|
2142
|
+
if (this.groups.length === 0) {
|
|
2143
|
+
throw new Error("missing assets");
|
|
2144
|
+
}
|
|
2145
|
+
const seenAssetIds = /* @__PURE__ */ new Set();
|
|
2146
|
+
for (const group of this.groups) {
|
|
2147
|
+
if (group.assetId !== null) {
|
|
2148
|
+
const key = group.assetId.toString();
|
|
2149
|
+
if (seenAssetIds.has(key)) {
|
|
2150
|
+
throw new Error(`duplicate asset group for asset ${key}`);
|
|
2151
|
+
}
|
|
2152
|
+
seenAssetIds.add(key);
|
|
2153
|
+
}
|
|
2154
|
+
if (group.controlAsset !== null && group.controlAsset.ref.type === 2 /* ByGroup */ && group.controlAsset.ref.groupIndex >= this.groups.length) {
|
|
2155
|
+
throw new Error(
|
|
2156
|
+
`invalid control asset group index, ${group.controlAsset.ref.groupIndex} out of range [0, ${this.groups.length - 1}]`
|
|
2157
|
+
);
|
|
2158
|
+
}
|
|
2159
|
+
}
|
|
2160
|
+
}
|
|
2161
|
+
static fromReader(reader) {
|
|
2162
|
+
const count = Number(reader.readVarUint());
|
|
2163
|
+
const groups = [];
|
|
2164
|
+
for (let i = 0; i < count; i++) {
|
|
2165
|
+
groups.push(AssetGroup.fromReader(reader));
|
|
2166
|
+
}
|
|
2167
|
+
if (reader.remaining() > 0) {
|
|
2168
|
+
throw new Error(
|
|
2169
|
+
`invalid packet length, left ${reader.remaining()} unknown bytes to read`
|
|
2170
|
+
);
|
|
2171
|
+
}
|
|
2172
|
+
const packet = new _Packet(groups);
|
|
2173
|
+
packet.validate();
|
|
2174
|
+
return packet;
|
|
2175
|
+
}
|
|
2176
|
+
};
|
|
2177
|
+
var IndexerTxType = /* @__PURE__ */ ((IndexerTxType2) => {
|
|
2178
|
+
IndexerTxType2[IndexerTxType2["INDEXER_TX_TYPE_UNSPECIFIED"] = 0] = "INDEXER_TX_TYPE_UNSPECIFIED";
|
|
2179
|
+
IndexerTxType2[IndexerTxType2["INDEXER_TX_TYPE_RECEIVED"] = 1] = "INDEXER_TX_TYPE_RECEIVED";
|
|
2180
|
+
IndexerTxType2[IndexerTxType2["INDEXER_TX_TYPE_SENT"] = 2] = "INDEXER_TX_TYPE_SENT";
|
|
2181
|
+
return IndexerTxType2;
|
|
2182
|
+
})(IndexerTxType || {});
|
|
2183
|
+
var ChainTxType = /* @__PURE__ */ ((ChainTxType2) => {
|
|
2184
|
+
ChainTxType2["UNSPECIFIED"] = "INDEXER_CHAINED_TX_TYPE_UNSPECIFIED";
|
|
2185
|
+
ChainTxType2["COMMITMENT"] = "INDEXER_CHAINED_TX_TYPE_COMMITMENT";
|
|
2186
|
+
ChainTxType2["ARK"] = "INDEXER_CHAINED_TX_TYPE_ARK";
|
|
2187
|
+
ChainTxType2["TREE"] = "INDEXER_CHAINED_TX_TYPE_TREE";
|
|
2188
|
+
ChainTxType2["CHECKPOINT"] = "INDEXER_CHAINED_TX_TYPE_CHECKPOINT";
|
|
2189
|
+
return ChainTxType2;
|
|
2190
|
+
})(ChainTxType || {});
|
|
2191
|
+
var RestIndexerProvider = class {
|
|
2192
|
+
constructor(serverUrl) {
|
|
2193
|
+
this.serverUrl = serverUrl;
|
|
2194
|
+
}
|
|
2195
|
+
async getVtxoTree(batchOutpoint, opts) {
|
|
2196
|
+
let url = `${this.serverUrl}/v1/indexer/batch/${batchOutpoint.txid}/${batchOutpoint.vout}/tree`;
|
|
2197
|
+
const params = new URLSearchParams();
|
|
2198
|
+
if (opts) {
|
|
2199
|
+
if (opts.pageIndex !== void 0)
|
|
2200
|
+
params.append("page.index", opts.pageIndex.toString());
|
|
2201
|
+
if (opts.pageSize !== void 0) params.append("page.size", opts.pageSize.toString());
|
|
2202
|
+
}
|
|
2203
|
+
if (params.toString()) {
|
|
2204
|
+
url += "?" + params.toString();
|
|
2205
|
+
}
|
|
2206
|
+
const res = await fetch(url);
|
|
2207
|
+
if (!res.ok) {
|
|
2208
|
+
throw new Error(`Failed to fetch vtxo tree: ${res.statusText}`);
|
|
2209
|
+
}
|
|
2210
|
+
const data = await res.json();
|
|
2211
|
+
if (!Response.isVtxoTreeResponse(data)) {
|
|
2212
|
+
throw new Error("Invalid vtxo tree data received");
|
|
2213
|
+
}
|
|
2214
|
+
data.vtxoTree.forEach((tx) => {
|
|
2215
|
+
tx.children = Object.fromEntries(
|
|
2216
|
+
Object.entries(tx.children).map(([key, value]) => [Number(key), value])
|
|
2217
|
+
);
|
|
2218
|
+
});
|
|
2219
|
+
return data;
|
|
2220
|
+
}
|
|
2221
|
+
async getVtxoTreeLeaves(batchOutpoint, opts) {
|
|
2222
|
+
let url = `${this.serverUrl}/v1/indexer/batch/${batchOutpoint.txid}/${batchOutpoint.vout}/tree/leaves`;
|
|
2223
|
+
const params = new URLSearchParams();
|
|
2224
|
+
if (opts) {
|
|
2225
|
+
if (opts.pageIndex !== void 0)
|
|
2226
|
+
params.append("page.index", opts.pageIndex.toString());
|
|
2227
|
+
if (opts.pageSize !== void 0) params.append("page.size", opts.pageSize.toString());
|
|
2228
|
+
}
|
|
2229
|
+
if (params.toString()) {
|
|
2230
|
+
url += "?" + params.toString();
|
|
2231
|
+
}
|
|
2232
|
+
const res = await fetch(url);
|
|
2233
|
+
if (!res.ok) {
|
|
2234
|
+
throw new Error(`Failed to fetch vtxo tree leaves: ${res.statusText}`);
|
|
2235
|
+
}
|
|
2236
|
+
const data = await res.json();
|
|
2237
|
+
if (!Response.isVtxoTreeLeavesResponse(data)) {
|
|
2238
|
+
throw new Error("Invalid vtxos tree leaves data received");
|
|
2239
|
+
}
|
|
2240
|
+
return data;
|
|
2241
|
+
}
|
|
2242
|
+
async getBatchSweepTransactions(batchOutpoint) {
|
|
2243
|
+
const url = `${this.serverUrl}/v1/indexer/batch/${batchOutpoint.txid}/${batchOutpoint.vout}/sweepTxs`;
|
|
2244
|
+
const res = await fetch(url);
|
|
2245
|
+
if (!res.ok) {
|
|
2246
|
+
throw new Error(`Failed to fetch batch sweep transactions: ${res.statusText}`);
|
|
2247
|
+
}
|
|
2248
|
+
const data = await res.json();
|
|
2249
|
+
if (!Response.isBatchSweepTransactionsResponse(data)) {
|
|
2250
|
+
throw new Error("Invalid batch sweep transactions data received");
|
|
2251
|
+
}
|
|
2252
|
+
return data;
|
|
2253
|
+
}
|
|
2254
|
+
async getCommitmentTx(txid) {
|
|
2255
|
+
const url = `${this.serverUrl}/v1/indexer/commitmentTx/${txid}`;
|
|
2256
|
+
const res = await fetch(url);
|
|
2257
|
+
if (!res.ok) {
|
|
2258
|
+
throw new Error(`Failed to fetch commitment tx: ${res.statusText}`);
|
|
2259
|
+
}
|
|
2260
|
+
const data = await res.json();
|
|
2261
|
+
if (!Response.isCommitmentTx(data)) {
|
|
2262
|
+
throw new Error("Invalid commitment tx data received");
|
|
2263
|
+
}
|
|
2264
|
+
return data;
|
|
2265
|
+
}
|
|
2266
|
+
async getCommitmentTxConnectors(txid, opts) {
|
|
2267
|
+
let url = `${this.serverUrl}/v1/indexer/commitmentTx/${txid}/connectors`;
|
|
2268
|
+
const params = new URLSearchParams();
|
|
2269
|
+
if (opts) {
|
|
2270
|
+
if (opts.pageIndex !== void 0)
|
|
2271
|
+
params.append("page.index", opts.pageIndex.toString());
|
|
2272
|
+
if (opts.pageSize !== void 0) params.append("page.size", opts.pageSize.toString());
|
|
2273
|
+
}
|
|
2274
|
+
if (params.toString()) {
|
|
2275
|
+
url += "?" + params.toString();
|
|
2276
|
+
}
|
|
2277
|
+
const res = await fetch(url);
|
|
2278
|
+
if (!res.ok) {
|
|
2279
|
+
throw new Error(`Failed to fetch commitment tx connectors: ${res.statusText}`);
|
|
2280
|
+
}
|
|
2281
|
+
const data = await res.json();
|
|
2282
|
+
if (!Response.isConnectorsResponse(data)) {
|
|
2283
|
+
throw new Error("Invalid commitment tx connectors data received");
|
|
2284
|
+
}
|
|
2285
|
+
data.connectors.forEach((tx) => {
|
|
2286
|
+
tx.children = Object.fromEntries(
|
|
2287
|
+
Object.entries(tx.children).map(([key, value]) => [Number(key), value])
|
|
2288
|
+
);
|
|
2289
|
+
});
|
|
2290
|
+
return data;
|
|
2291
|
+
}
|
|
2292
|
+
async getCommitmentTxForfeitTxs(txid, opts) {
|
|
2293
|
+
let url = `${this.serverUrl}/v1/indexer/commitmentTx/${txid}/forfeitTxs`;
|
|
2294
|
+
const params = new URLSearchParams();
|
|
2295
|
+
if (opts) {
|
|
2296
|
+
if (opts.pageIndex !== void 0)
|
|
2297
|
+
params.append("page.index", opts.pageIndex.toString());
|
|
2298
|
+
if (opts.pageSize !== void 0) params.append("page.size", opts.pageSize.toString());
|
|
2299
|
+
}
|
|
2300
|
+
if (params.toString()) {
|
|
2301
|
+
url += "?" + params.toString();
|
|
2302
|
+
}
|
|
2303
|
+
const res = await fetch(url);
|
|
2304
|
+
if (!res.ok) {
|
|
2305
|
+
throw new Error(`Failed to fetch commitment tx forfeitTxs: ${res.statusText}`);
|
|
2306
|
+
}
|
|
2307
|
+
const data = await res.json();
|
|
2308
|
+
if (!Response.isForfeitTxsResponse(data)) {
|
|
2309
|
+
throw new Error("Invalid commitment tx forfeitTxs data received");
|
|
2310
|
+
}
|
|
2311
|
+
return data;
|
|
2312
|
+
}
|
|
2313
|
+
getSubscription(subscriptionId, abortSignal) {
|
|
2314
|
+
const url = `${this.serverUrl}/v1/indexer/script/subscription/${subscriptionId}`;
|
|
2315
|
+
let iterator = null;
|
|
2316
|
+
const closeIterator = () => iterator?.close();
|
|
2317
|
+
const gen = (async function* () {
|
|
2318
|
+
const abortHandler = closeIterator;
|
|
2319
|
+
abortSignal?.addEventListener("abort", abortHandler);
|
|
2320
|
+
try {
|
|
2321
|
+
while (!abortSignal?.aborted) {
|
|
2322
|
+
try {
|
|
2323
|
+
const currentIterator = eventSourceIterator(new EventSource(url));
|
|
2324
|
+
iterator = currentIterator;
|
|
2325
|
+
for await (const event of currentIterator) {
|
|
2326
|
+
if (abortSignal?.aborted) break;
|
|
2327
|
+
try {
|
|
2328
|
+
const data = JSON.parse(event.data);
|
|
2329
|
+
if (data.event) {
|
|
2330
|
+
yield {
|
|
2331
|
+
txid: data.event.txid,
|
|
2332
|
+
scripts: data.event.scripts || [],
|
|
2333
|
+
newVtxos: (data.event.newVtxos || []).map(convertVtxo),
|
|
2334
|
+
spentVtxos: (data.event.spentVtxos || []).map(convertVtxo),
|
|
2335
|
+
sweptVtxos: (data.event.sweptVtxos || []).map(convertVtxo),
|
|
2336
|
+
tx: data.event.tx,
|
|
2337
|
+
checkpointTxs: data.event.checkpointTxs
|
|
2338
|
+
};
|
|
2339
|
+
}
|
|
2340
|
+
} catch (err) {
|
|
2341
|
+
console.error("Failed to parse subscription event:", err);
|
|
2342
|
+
throw err;
|
|
2343
|
+
}
|
|
2344
|
+
}
|
|
2345
|
+
} catch (error) {
|
|
2346
|
+
if (abortSignal?.aborted || error instanceof Error && error.name === "AbortError") {
|
|
2347
|
+
break;
|
|
2348
|
+
}
|
|
2349
|
+
if (isFetchTimeoutError(error)) {
|
|
2350
|
+
console.debug("Timeout error ignored");
|
|
2351
|
+
continue;
|
|
2352
|
+
}
|
|
2353
|
+
if (isEventSourceError(error)) {
|
|
2354
|
+
throw error;
|
|
2355
|
+
}
|
|
2356
|
+
console.error("Subscription error:", error);
|
|
2357
|
+
throw error;
|
|
2358
|
+
} finally {
|
|
2359
|
+
closeIterator();
|
|
2360
|
+
iterator = null;
|
|
2361
|
+
}
|
|
2362
|
+
}
|
|
2363
|
+
} finally {
|
|
2364
|
+
abortSignal?.removeEventListener("abort", abortHandler);
|
|
2365
|
+
closeIterator();
|
|
2366
|
+
}
|
|
2367
|
+
})();
|
|
2368
|
+
const origReturn = gen.return.bind(gen);
|
|
2369
|
+
gen.return = (value) => {
|
|
2370
|
+
closeIterator();
|
|
2371
|
+
return origReturn(value);
|
|
2372
|
+
};
|
|
2373
|
+
return gen;
|
|
2374
|
+
}
|
|
2375
|
+
async getVirtualTxs(txids, opts) {
|
|
2376
|
+
let url = `${this.serverUrl}/v1/indexer/virtualTx/${txids.join(",")}`;
|
|
2377
|
+
const params = new URLSearchParams();
|
|
2378
|
+
if (opts) {
|
|
2379
|
+
if (opts.pageIndex !== void 0)
|
|
2380
|
+
params.append("page.index", opts.pageIndex.toString());
|
|
2381
|
+
if (opts.pageSize !== void 0) params.append("page.size", opts.pageSize.toString());
|
|
2382
|
+
}
|
|
2383
|
+
if (params.toString()) {
|
|
2384
|
+
url += "?" + params.toString();
|
|
2385
|
+
}
|
|
2386
|
+
const res = await fetch(url);
|
|
2387
|
+
if (!res.ok) {
|
|
2388
|
+
throw new Error(`Failed to fetch virtual txs: ${res.statusText}`);
|
|
2389
|
+
}
|
|
2390
|
+
const data = await res.json();
|
|
2391
|
+
if (!Response.isVirtualTxsResponse(data)) {
|
|
2392
|
+
throw new Error("Invalid virtual txs data received");
|
|
2393
|
+
}
|
|
2394
|
+
return data;
|
|
2395
|
+
}
|
|
2396
|
+
async getVtxoChain(vtxoOutpoint, opts) {
|
|
2397
|
+
let url = `${this.serverUrl}/v1/indexer/vtxo/${vtxoOutpoint.txid}/${vtxoOutpoint.vout}/chain`;
|
|
2398
|
+
const params = new URLSearchParams();
|
|
2399
|
+
if (opts) {
|
|
2400
|
+
if (opts.pageIndex !== void 0)
|
|
2401
|
+
params.append("page.index", opts.pageIndex.toString());
|
|
2402
|
+
if (opts.pageSize !== void 0) params.append("page.size", opts.pageSize.toString());
|
|
2403
|
+
}
|
|
2404
|
+
if (params.toString()) {
|
|
2405
|
+
url += "?" + params.toString();
|
|
2406
|
+
}
|
|
2407
|
+
const res = await fetch(url);
|
|
2408
|
+
if (!res.ok) {
|
|
2409
|
+
throw new Error(`Failed to fetch vtxo chain: ${res.statusText}`);
|
|
2410
|
+
}
|
|
2411
|
+
const data = await res.json();
|
|
2412
|
+
if (!Response.isVtxoChainResponse(data)) {
|
|
2413
|
+
throw new Error("Invalid vtxo chain data received");
|
|
2414
|
+
}
|
|
2415
|
+
return data;
|
|
2416
|
+
}
|
|
2417
|
+
async getVtxos(opts) {
|
|
2418
|
+
const hasScripts = (opts?.scripts?.length ?? 0) > 0;
|
|
2419
|
+
const hasOutpoints = (opts?.outpoints?.length ?? 0) > 0;
|
|
2420
|
+
if (hasScripts && hasOutpoints) {
|
|
2421
|
+
throw new Error("scripts and outpoints are mutually exclusive options");
|
|
2422
|
+
}
|
|
2423
|
+
if (!hasScripts && !hasOutpoints) {
|
|
2424
|
+
throw new Error("Either scripts or outpoints must be provided");
|
|
2425
|
+
}
|
|
2426
|
+
const filterCount = [opts?.spendableOnly, opts?.spentOnly, opts?.recoverableOnly].filter(
|
|
2427
|
+
Boolean
|
|
2428
|
+
).length;
|
|
2429
|
+
if (filterCount > 1) {
|
|
2430
|
+
throw new Error(
|
|
2431
|
+
"spendableOnly, spentOnly, and recoverableOnly are mutually exclusive options"
|
|
2432
|
+
);
|
|
2433
|
+
}
|
|
2434
|
+
if (opts?.after !== void 0 && opts?.before !== void 0 && opts.after !== 0 && opts.before !== 0 && opts.before <= opts.after) {
|
|
2435
|
+
throw new Error("before must be greater than after");
|
|
2436
|
+
}
|
|
2437
|
+
let url = `${this.serverUrl}/v1/indexer/vtxos`;
|
|
2438
|
+
const params = new URLSearchParams();
|
|
2439
|
+
if (hasScripts) {
|
|
2440
|
+
opts.scripts.forEach((script) => {
|
|
2441
|
+
params.append("scripts", script);
|
|
2442
|
+
});
|
|
2443
|
+
}
|
|
2444
|
+
if (hasOutpoints) {
|
|
2445
|
+
opts.outpoints.forEach((outpoint) => {
|
|
2446
|
+
params.append("outpoints", `${outpoint.txid}:${outpoint.vout}`);
|
|
2447
|
+
});
|
|
2448
|
+
}
|
|
2449
|
+
if (opts) {
|
|
2450
|
+
if (opts.spendableOnly !== void 0)
|
|
2451
|
+
params.append("spendableOnly", opts.spendableOnly.toString());
|
|
2452
|
+
if (opts.spentOnly !== void 0) params.append("spentOnly", opts.spentOnly.toString());
|
|
2453
|
+
if (opts.recoverableOnly !== void 0)
|
|
2454
|
+
params.append("recoverableOnly", opts.recoverableOnly.toString());
|
|
2455
|
+
if (opts.pendingOnly !== void 0)
|
|
2456
|
+
params.append("pendingOnly", opts.pendingOnly.toString());
|
|
2457
|
+
if (opts.after !== void 0) params.append("after", opts.after.toString());
|
|
2458
|
+
if (opts.before !== void 0) params.append("before", opts.before.toString());
|
|
2459
|
+
if (opts.pageIndex !== void 0)
|
|
2460
|
+
params.append("page.index", opts.pageIndex.toString());
|
|
2461
|
+
if (opts.pageSize !== void 0) params.append("page.size", opts.pageSize.toString());
|
|
2462
|
+
}
|
|
2463
|
+
if (params.toString()) {
|
|
2464
|
+
url += "?" + params.toString();
|
|
2465
|
+
}
|
|
2466
|
+
const res = await fetch(url);
|
|
2467
|
+
if (!res.ok) {
|
|
2468
|
+
throw new Error(`Failed to fetch vtxos: ${res.statusText}`);
|
|
2469
|
+
}
|
|
2470
|
+
const data = await res.json();
|
|
2471
|
+
if (!Response.isVtxosResponse(data)) {
|
|
2472
|
+
throw new Error("Invalid vtxos data received");
|
|
2473
|
+
}
|
|
2474
|
+
return {
|
|
2475
|
+
vtxos: data.vtxos.map(convertVtxo),
|
|
2476
|
+
page: data.page
|
|
2477
|
+
};
|
|
2478
|
+
}
|
|
2479
|
+
async getAssetDetails(assetId) {
|
|
2480
|
+
const url = `${this.serverUrl}/v1/indexer/asset/${encodeURIComponent(assetId)}`;
|
|
2481
|
+
const res = await fetch(url);
|
|
2482
|
+
if (!res.ok) {
|
|
2483
|
+
throw new Error(`Failed to fetch asset details: ${res.statusText}`);
|
|
2484
|
+
}
|
|
2485
|
+
const data = await res.json();
|
|
2486
|
+
if (!Response.isGetAssetResponse(data)) {
|
|
2487
|
+
throw new Error("Invalid get asset response");
|
|
2488
|
+
}
|
|
2489
|
+
const metadata = data.metadata?.length ? parseAssetMetadata(data.metadata) : void 0;
|
|
2490
|
+
return {
|
|
2491
|
+
assetId: data.assetId ?? assetId,
|
|
2492
|
+
supply: BigInt(data.supply ?? 0),
|
|
2493
|
+
metadata,
|
|
2494
|
+
controlAssetId: data.controlAsset || void 0
|
|
2495
|
+
};
|
|
2496
|
+
}
|
|
2497
|
+
async subscribeForScripts(scripts, subscriptionId) {
|
|
2498
|
+
const url = `${this.serverUrl}/v1/indexer/script/subscribe`;
|
|
2499
|
+
const res = await fetch(url, {
|
|
2500
|
+
headers: {
|
|
2501
|
+
"Content-Type": "application/json"
|
|
2502
|
+
},
|
|
2503
|
+
method: "POST",
|
|
2504
|
+
body: JSON.stringify({ scripts, subscriptionId })
|
|
2505
|
+
});
|
|
2506
|
+
if (!res.ok) {
|
|
2507
|
+
const errorText = await res.text();
|
|
2508
|
+
throw new Error(`Failed to subscribe to scripts: ${errorText}`);
|
|
2509
|
+
}
|
|
2510
|
+
const data = await res.json();
|
|
2511
|
+
if (!data.subscriptionId) throw new Error(`Subscription ID not found`);
|
|
2512
|
+
return data.subscriptionId;
|
|
2513
|
+
}
|
|
2514
|
+
async unsubscribeForScripts(subscriptionId, scripts) {
|
|
2515
|
+
const url = `${this.serverUrl}/v1/indexer/script/unsubscribe`;
|
|
2516
|
+
const res = await fetch(url, {
|
|
2517
|
+
headers: {
|
|
2518
|
+
"Content-Type": "application/json"
|
|
2519
|
+
},
|
|
2520
|
+
method: "POST",
|
|
2521
|
+
body: JSON.stringify({ subscriptionId, scripts })
|
|
2522
|
+
});
|
|
2523
|
+
if (!res.ok) {
|
|
2524
|
+
const errorText = await res.text();
|
|
2525
|
+
console.warn(`Failed to unsubscribe to scripts: ${errorText}`);
|
|
2526
|
+
}
|
|
2527
|
+
}
|
|
2528
|
+
};
|
|
2529
|
+
function parseAssetMetadata(metadata) {
|
|
2530
|
+
const metadataList = MetadataList.fromString(metadata);
|
|
2531
|
+
const out = {};
|
|
2532
|
+
const decoder = new TextDecoder();
|
|
2533
|
+
for (const { key, value } of metadataList.items) {
|
|
2534
|
+
const keyString = decoder.decode(key);
|
|
2535
|
+
switch (keyString) {
|
|
2536
|
+
case "decimals":
|
|
2537
|
+
const n = Number(decoder.decode(value));
|
|
2538
|
+
out[keyString] = Number.isFinite(n) ? n : base.hex.encode(value);
|
|
2539
|
+
break;
|
|
2540
|
+
case "name":
|
|
2541
|
+
case "ticker":
|
|
2542
|
+
case "icon":
|
|
2543
|
+
out[keyString] = decoder.decode(value);
|
|
2544
|
+
break;
|
|
2545
|
+
default:
|
|
2546
|
+
out[keyString] = base.hex.encode(value);
|
|
2547
|
+
break;
|
|
2548
|
+
}
|
|
2549
|
+
}
|
|
2550
|
+
return out;
|
|
2551
|
+
}
|
|
2552
|
+
function convertVtxo(vtxo) {
|
|
2553
|
+
return {
|
|
2554
|
+
txid: vtxo.outpoint.txid,
|
|
2555
|
+
vout: vtxo.outpoint.vout,
|
|
2556
|
+
value: Number(vtxo.amount),
|
|
2557
|
+
status: {
|
|
2558
|
+
confirmed: !vtxo.isSwept && !vtxo.isPreconfirmed,
|
|
2559
|
+
isLeaf: !vtxo.isPreconfirmed
|
|
2560
|
+
},
|
|
2561
|
+
virtualStatus: {
|
|
2562
|
+
state: vtxo.isSwept ? "swept" : vtxo.isPreconfirmed ? "preconfirmed" : "settled",
|
|
2563
|
+
commitmentTxIds: vtxo.commitmentTxids,
|
|
2564
|
+
batchExpiry: vtxo.expiresAt ? Number(vtxo.expiresAt) * 1e3 : void 0
|
|
2565
|
+
},
|
|
2566
|
+
spentBy: vtxo.spentBy ?? "",
|
|
2567
|
+
settledBy: vtxo.settledBy,
|
|
2568
|
+
arkTxId: vtxo.arkTxid,
|
|
2569
|
+
createdAt: new Date(Number(vtxo.createdAt) * 1e3),
|
|
2570
|
+
isUnrolled: vtxo.isUnrolled,
|
|
2571
|
+
isSpent: vtxo.isSpent,
|
|
2572
|
+
script: vtxo.script,
|
|
2573
|
+
assets: vtxo.assets?.map((a) => ({
|
|
2574
|
+
assetId: a.assetId,
|
|
2575
|
+
amount: BigInt(a.amount)
|
|
2576
|
+
}))
|
|
2577
|
+
};
|
|
2578
|
+
}
|
|
2579
|
+
var Response;
|
|
2580
|
+
((Response2) => {
|
|
2581
|
+
function isBatchInfo(data) {
|
|
2582
|
+
return typeof data === "object" && typeof data.totalOutputAmount === "string" && typeof data.totalOutputVtxos === "number" && typeof data.expiresAt === "string" && typeof data.swept === "boolean";
|
|
2583
|
+
}
|
|
2584
|
+
function isChain(data) {
|
|
2585
|
+
return typeof data === "object" && typeof data.txid === "string" && typeof data.expiresAt === "string" && Object.values(ChainTxType).includes(data.type) && Array.isArray(data.spends) && data.spends.every((spend) => typeof spend === "string");
|
|
2586
|
+
}
|
|
2587
|
+
function isCommitmentTx(data) {
|
|
2588
|
+
return typeof data === "object" && typeof data.startedAt === "string" && typeof data.endedAt === "string" && typeof data.totalInputAmount === "string" && typeof data.totalInputVtxos === "number" && typeof data.totalOutputAmount === "string" && typeof data.totalOutputVtxos === "number" && typeof data.batches === "object" && Object.values(data.batches).every(isBatchInfo);
|
|
2589
|
+
}
|
|
2590
|
+
Response2.isCommitmentTx = isCommitmentTx;
|
|
2591
|
+
function isOutpoint(data) {
|
|
2592
|
+
return typeof data === "object" && typeof data.txid === "string" && typeof data.vout === "number";
|
|
2593
|
+
}
|
|
2594
|
+
Response2.isOutpoint = isOutpoint;
|
|
2595
|
+
function isOutpointArray(data) {
|
|
2596
|
+
return Array.isArray(data) && data.every(isOutpoint);
|
|
2597
|
+
}
|
|
2598
|
+
Response2.isOutpointArray = isOutpointArray;
|
|
2599
|
+
function isTx(data) {
|
|
2600
|
+
return typeof data === "object" && typeof data.txid === "string" && typeof data.children === "object" && Object.values(data.children).every(isTxid) && Object.keys(data.children).every((k) => Number.isInteger(Number(k)));
|
|
2601
|
+
}
|
|
2602
|
+
function isTxsArray(data) {
|
|
2603
|
+
return Array.isArray(data) && data.every(isTx);
|
|
2604
|
+
}
|
|
2605
|
+
Response2.isTxsArray = isTxsArray;
|
|
2606
|
+
function isTxHistoryRecord(data) {
|
|
2607
|
+
return typeof data === "object" && typeof data.amount === "string" && typeof data.createdAt === "string" && typeof data.isSettled === "boolean" && typeof data.settledBy === "string" && Object.values(IndexerTxType).includes(data.type) && (!data.commitmentTxid && typeof data.virtualTxid === "string" || typeof data.commitmentTxid === "string" && !data.virtualTxid);
|
|
2608
|
+
}
|
|
2609
|
+
function isTxHistoryRecordArray(data) {
|
|
2610
|
+
return Array.isArray(data) && data.every(isTxHistoryRecord);
|
|
2611
|
+
}
|
|
2612
|
+
Response2.isTxHistoryRecordArray = isTxHistoryRecordArray;
|
|
2613
|
+
function isTxid(data) {
|
|
2614
|
+
return typeof data === "string" && data.length === 64;
|
|
2615
|
+
}
|
|
2616
|
+
function isTxidArray(data) {
|
|
2617
|
+
return Array.isArray(data) && data.every(isTxid);
|
|
2618
|
+
}
|
|
2619
|
+
Response2.isTxidArray = isTxidArray;
|
|
2620
|
+
function isVtxoAsset(data) {
|
|
2621
|
+
return typeof data === "object" && data !== null && typeof data.assetId === "string" && typeof data.amount === "string";
|
|
2622
|
+
}
|
|
2623
|
+
function isVtxo(data) {
|
|
2624
|
+
return typeof data === "object" && isOutpoint(data.outpoint) && typeof data.createdAt === "string" && (data.expiresAt === null || typeof data.expiresAt === "string") && typeof data.amount === "string" && typeof data.script === "string" && typeof data.isPreconfirmed === "boolean" && typeof data.isSwept === "boolean" && typeof data.isUnrolled === "boolean" && typeof data.isSpent === "boolean" && (!data.spentBy || typeof data.spentBy === "string") && (!data.settledBy || typeof data.settledBy === "string") && (!data.arkTxid || typeof data.arkTxid === "string") && Array.isArray(data.commitmentTxids) && data.commitmentTxids.every(isTxid) && (data.assets === void 0 || Array.isArray(data.assets) && data.assets.every(isVtxoAsset));
|
|
2625
|
+
}
|
|
2626
|
+
function isPageResponse(data) {
|
|
2627
|
+
return typeof data === "object" && typeof data.current === "number" && typeof data.next === "number" && typeof data.total === "number";
|
|
2628
|
+
}
|
|
2629
|
+
function isVtxoTreeResponse(data) {
|
|
2630
|
+
return typeof data === "object" && Array.isArray(data.vtxoTree) && data.vtxoTree.every(isTx) && (!data.page || isPageResponse(data.page));
|
|
2631
|
+
}
|
|
2632
|
+
Response2.isVtxoTreeResponse = isVtxoTreeResponse;
|
|
2633
|
+
function isVtxoTreeLeavesResponse(data) {
|
|
2634
|
+
return typeof data === "object" && Array.isArray(data.leaves) && data.leaves.every(isOutpoint) && (!data.page || isPageResponse(data.page));
|
|
2635
|
+
}
|
|
2636
|
+
Response2.isVtxoTreeLeavesResponse = isVtxoTreeLeavesResponse;
|
|
2637
|
+
function isConnectorsResponse(data) {
|
|
2638
|
+
return typeof data === "object" && Array.isArray(data.connectors) && data.connectors.every(isTx) && (!data.page || isPageResponse(data.page));
|
|
2639
|
+
}
|
|
2640
|
+
Response2.isConnectorsResponse = isConnectorsResponse;
|
|
2641
|
+
function isForfeitTxsResponse(data) {
|
|
2642
|
+
return typeof data === "object" && Array.isArray(data.txids) && data.txids.every(isTxid) && (!data.page || isPageResponse(data.page));
|
|
2643
|
+
}
|
|
2644
|
+
Response2.isForfeitTxsResponse = isForfeitTxsResponse;
|
|
2645
|
+
function isSweptCommitmentTxResponse(data) {
|
|
2646
|
+
return typeof data === "object" && Array.isArray(data.sweptBy) && data.sweptBy.every(isTxid);
|
|
2647
|
+
}
|
|
2648
|
+
Response2.isSweptCommitmentTxResponse = isSweptCommitmentTxResponse;
|
|
2649
|
+
function isBatchSweepTransactionsResponse(data) {
|
|
2650
|
+
return typeof data === "object" && Array.isArray(data.sweptBy) && data.sweptBy.every(isTxid);
|
|
2651
|
+
}
|
|
2652
|
+
Response2.isBatchSweepTransactionsResponse = isBatchSweepTransactionsResponse;
|
|
2653
|
+
function isVirtualTxsResponse(data) {
|
|
2654
|
+
return typeof data === "object" && Array.isArray(data.txs) && data.txs.every((tx) => typeof tx === "string") && (!data.page || isPageResponse(data.page));
|
|
2655
|
+
}
|
|
2656
|
+
Response2.isVirtualTxsResponse = isVirtualTxsResponse;
|
|
2657
|
+
function isVtxoChainResponse(data) {
|
|
2658
|
+
return typeof data === "object" && Array.isArray(data.chain) && data.chain.every(isChain) && (!data.page || isPageResponse(data.page));
|
|
2659
|
+
}
|
|
2660
|
+
Response2.isVtxoChainResponse = isVtxoChainResponse;
|
|
2661
|
+
function isVtxosResponse(data) {
|
|
2662
|
+
return typeof data === "object" && Array.isArray(data.vtxos) && data.vtxos.every(isVtxo) && (!data.page || isPageResponse(data.page));
|
|
2663
|
+
}
|
|
2664
|
+
Response2.isVtxosResponse = isVtxosResponse;
|
|
2665
|
+
function isGetAssetResponse(data) {
|
|
2666
|
+
return typeof data === "object" && data !== null && typeof data.assetId === "string" && typeof data.supply === "string" && (data.controlAsset === void 0 || typeof data.controlAsset === "string") && (data.metadata === void 0 || typeof data.metadata === "string");
|
|
2667
|
+
}
|
|
2668
|
+
Response2.isGetAssetResponse = isGetAssetResponse;
|
|
2669
|
+
})(Response || (Response = {}));
|
|
2670
|
+
|
|
2671
|
+
exports.ArkError = ArkError;
|
|
2672
|
+
exports.ArkPsbtFieldKey = ArkPsbtFieldKey;
|
|
2673
|
+
exports.ArkPsbtFieldKeyType = ArkPsbtFieldKeyType;
|
|
2674
|
+
exports.AssetGroup = AssetGroup;
|
|
2675
|
+
exports.AssetId = AssetId;
|
|
2676
|
+
exports.AssetInput = AssetInput;
|
|
2677
|
+
exports.AssetOutput = AssetOutput;
|
|
2678
|
+
exports.AssetRef = AssetRef;
|
|
2679
|
+
exports.BufferReader = BufferReader;
|
|
2680
|
+
exports.ChainTxType = ChainTxType;
|
|
2681
|
+
exports.ConditionWitness = ConditionWitness;
|
|
2682
|
+
exports.CosignerPublicKey = CosignerPublicKey;
|
|
2683
|
+
exports.IndexerTxType = IndexerTxType;
|
|
2684
|
+
exports.Metadata = Metadata;
|
|
2685
|
+
exports.OP_RETURN_EMPTY_PKSCRIPT = OP_RETURN_EMPTY_PKSCRIPT;
|
|
2686
|
+
exports.Packet = Packet;
|
|
2687
|
+
exports.RestArkProvider = RestArkProvider;
|
|
2688
|
+
exports.RestIndexerProvider = RestIndexerProvider;
|
|
2689
|
+
exports.SettlementEventType = SettlementEventType;
|
|
2690
|
+
exports.Transaction = Transaction;
|
|
2691
|
+
exports.VtxoTaprootTree = VtxoTaprootTree;
|
|
2692
|
+
exports.VtxoTreeExpiry = VtxoTreeExpiry;
|
|
2693
|
+
exports.asset_exports = asset_exports;
|
|
2694
|
+
exports.craftToSpendTx = craftToSpendTx;
|
|
2695
|
+
exports.getArkPsbtFields = getArkPsbtFields;
|
|
2696
|
+
exports.isEventSourceError = isEventSourceError;
|
|
2697
|
+
exports.isFetchTimeoutError = isFetchTimeoutError;
|
|
2698
|
+
exports.maybeArkError = maybeArkError;
|
|
2699
|
+
exports.setArkPsbtField = setArkPsbtField;
|
|
2700
|
+
//# sourceMappingURL=chunk-ADV27S4N.cjs.map
|
|
2701
|
+
//# sourceMappingURL=chunk-ADV27S4N.cjs.map
|