@bsv/sdk 2.0.0-beta.0 → 2.0.1
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/dist/cjs/mod.js +1 -0
- package/dist/cjs/mod.js.map +1 -1
- package/dist/cjs/package.json +1 -1
- package/dist/cjs/src/auth/Peer.js +149 -74
- package/dist/cjs/src/auth/Peer.js.map +1 -1
- package/dist/cjs/src/auth/SessionManager.js.map +1 -1
- package/dist/cjs/src/auth/certificates/Certificate.js +18 -8
- package/dist/cjs/src/auth/certificates/Certificate.js.map +1 -1
- package/dist/cjs/src/auth/certificates/MasterCertificate.js +19 -9
- package/dist/cjs/src/auth/certificates/MasterCertificate.js.map +1 -1
- package/dist/cjs/src/auth/certificates/VerifiableCertificate.js +17 -7
- package/dist/cjs/src/auth/certificates/VerifiableCertificate.js.map +1 -1
- package/dist/cjs/src/auth/certificates/__tests/CompletedProtoWallet.js.map +1 -1
- package/dist/cjs/src/auth/clients/AuthFetch.js +30 -10
- package/dist/cjs/src/auth/clients/AuthFetch.js.map +1 -1
- package/dist/cjs/src/auth/clients/__tests__/AuthFetch.test.js.map +1 -1
- package/dist/cjs/src/auth/transports/SimplifiedFetchTransport.js +17 -7
- package/dist/cjs/src/auth/transports/SimplifiedFetchTransport.js.map +1 -1
- package/dist/cjs/src/auth/transports/__tests__/SimplifiedFetchTransport.test.js +17 -7
- package/dist/cjs/src/auth/transports/__tests__/SimplifiedFetchTransport.test.js.map +1 -1
- package/dist/cjs/src/auth/utils/createNonce.js +18 -9
- package/dist/cjs/src/auth/utils/createNonce.js.map +1 -1
- package/dist/cjs/src/auth/utils/validateCertificates.js.map +1 -1
- package/dist/cjs/src/auth/utils/verifyNonce.js +18 -9
- package/dist/cjs/src/auth/utils/verifyNonce.js.map +1 -1
- package/dist/cjs/src/compat/BSM.js +17 -7
- package/dist/cjs/src/compat/BSM.js.map +1 -1
- package/dist/cjs/src/compat/ECIES.js +17 -7
- package/dist/cjs/src/compat/ECIES.js.map +1 -1
- package/dist/cjs/src/compat/HD.js +17 -7
- package/dist/cjs/src/compat/HD.js.map +1 -1
- package/dist/cjs/src/compat/Mnemonic.js +17 -7
- package/dist/cjs/src/compat/Mnemonic.js.map +1 -1
- package/dist/cjs/src/compat/Utxo.js +1 -1
- package/dist/cjs/src/compat/Utxo.js.map +1 -1
- package/dist/cjs/src/compat/index.js +17 -7
- package/dist/cjs/src/compat/index.js.map +1 -1
- package/dist/cjs/src/identity/ContactsManager.js +1 -1
- package/dist/cjs/src/identity/ContactsManager.js.map +1 -1
- package/dist/cjs/src/identity/IdentityClient.js.map +1 -1
- package/dist/cjs/src/kvstore/GlobalKVStore.js +20 -10
- package/dist/cjs/src/kvstore/GlobalKVStore.js.map +1 -1
- package/dist/cjs/src/kvstore/LocalKVStore.js +17 -7
- package/dist/cjs/src/kvstore/LocalKVStore.js.map +1 -1
- package/dist/cjs/src/kvstore/kvStoreInterpreter.js +17 -7
- package/dist/cjs/src/kvstore/kvStoreInterpreter.js.map +1 -1
- package/dist/cjs/src/messages/EncryptedMessage.js +19 -0
- package/dist/cjs/src/messages/EncryptedMessage.js.map +1 -1
- package/dist/cjs/src/messages/SignedMessage.js.map +1 -1
- package/dist/cjs/src/messages/index.js +17 -7
- package/dist/cjs/src/messages/index.js.map +1 -1
- package/dist/cjs/src/overlay-tools/Historian.js.map +1 -1
- package/dist/cjs/src/overlay-tools/HostReputationTracker.js.map +1 -1
- package/dist/cjs/src/overlay-tools/LookupResolver.js +17 -7
- package/dist/cjs/src/overlay-tools/LookupResolver.js.map +1 -1
- package/dist/cjs/src/overlay-tools/OverlayAdminTokenTemplate.js.map +1 -1
- package/dist/cjs/src/overlay-tools/SHIPBroadcaster.js +17 -7
- package/dist/cjs/src/overlay-tools/SHIPBroadcaster.js.map +1 -1
- package/dist/cjs/src/overlay-tools/withDoubleSpendRetry.js +1 -2
- package/dist/cjs/src/overlay-tools/withDoubleSpendRetry.js.map +1 -1
- package/dist/cjs/src/primitives/AESGCM.js +77 -32
- package/dist/cjs/src/primitives/AESGCM.js.map +1 -1
- package/dist/cjs/src/primitives/BigNumber.js +28 -54
- package/dist/cjs/src/primitives/BigNumber.js.map +1 -1
- package/dist/cjs/src/primitives/Curve.js.map +1 -1
- package/dist/cjs/src/primitives/DRBG.js.map +1 -1
- package/dist/cjs/src/primitives/ECDSA.js +58 -24
- package/dist/cjs/src/primitives/ECDSA.js.map +1 -1
- package/dist/cjs/src/primitives/Hash.js +6 -6
- package/dist/cjs/src/primitives/Hash.js.map +1 -1
- package/dist/cjs/src/primitives/JacobianPoint.js.map +1 -1
- package/dist/cjs/src/primitives/K256.js.map +1 -1
- package/dist/cjs/src/primitives/Mersenne.js.map +1 -1
- package/dist/cjs/src/primitives/MontgomoryMethod.js.map +1 -1
- package/dist/cjs/src/primitives/Point.js +63 -6
- package/dist/cjs/src/primitives/Point.js.map +1 -1
- package/dist/cjs/src/primitives/Polynomial.js.map +1 -1
- package/dist/cjs/src/primitives/PrivateKey.js +46 -9
- package/dist/cjs/src/primitives/PrivateKey.js.map +1 -1
- package/dist/cjs/src/primitives/PublicKey.js +1 -1
- package/dist/cjs/src/primitives/PublicKey.js.map +1 -1
- package/dist/cjs/src/primitives/Random.js.map +1 -1
- package/dist/cjs/src/primitives/ReaderUint8Array.js +180 -0
- package/dist/cjs/src/primitives/ReaderUint8Array.js.map +1 -0
- package/dist/cjs/src/primitives/ReductionContext.js +35 -46
- package/dist/cjs/src/primitives/ReductionContext.js.map +1 -1
- package/dist/cjs/src/primitives/Schnorr.js.map +1 -1
- package/dist/cjs/src/primitives/Secp256r1.js.map +1 -1
- package/dist/cjs/src/primitives/Signature.js.map +1 -1
- package/dist/cjs/src/primitives/SymmetricKey.js.map +1 -1
- package/dist/cjs/src/primitives/TransactionSignature.js +132 -17
- package/dist/cjs/src/primitives/TransactionSignature.js.map +1 -1
- package/dist/cjs/src/primitives/WriterUint8Array.js +173 -0
- package/dist/cjs/src/primitives/WriterUint8Array.js.map +1 -0
- package/dist/cjs/src/primitives/hex.js +2 -3
- package/dist/cjs/src/primitives/hex.js.map +1 -1
- package/dist/cjs/src/primitives/index.js +17 -7
- package/dist/cjs/src/primitives/index.js.map +1 -1
- package/dist/cjs/src/primitives/utils.js +43 -16
- package/dist/cjs/src/primitives/utils.js.map +1 -1
- package/dist/cjs/src/registry/RegistryClient.js +2 -2
- package/dist/cjs/src/registry/RegistryClient.js.map +1 -1
- package/dist/cjs/src/remittance/CommsLayer.js +3 -0
- package/dist/cjs/src/remittance/CommsLayer.js.map +1 -0
- package/dist/cjs/src/remittance/IdentityLayer.js +3 -0
- package/dist/cjs/src/remittance/IdentityLayer.js.map +1 -0
- package/dist/cjs/src/remittance/RemittanceManager.js +1245 -0
- package/dist/cjs/src/remittance/RemittanceManager.js.map +1 -0
- package/dist/cjs/src/remittance/RemittanceModule.js +3 -0
- package/dist/cjs/src/remittance/RemittanceModule.js.map +1 -0
- package/dist/cjs/src/remittance/index.js +23 -0
- package/dist/cjs/src/remittance/index.js.map +1 -0
- package/dist/cjs/src/remittance/modules/BasicBRC29.js +225 -0
- package/dist/cjs/src/remittance/modules/BasicBRC29.js.map +1 -0
- package/dist/cjs/src/remittance/modules/index.js +18 -0
- package/dist/cjs/src/remittance/modules/index.js.map +1 -0
- package/dist/cjs/src/remittance/types.js +22 -0
- package/dist/cjs/src/remittance/types.js.map +1 -0
- package/dist/cjs/src/script/OP.js +15 -13
- package/dist/cjs/src/script/OP.js.map +1 -1
- package/dist/cjs/src/script/Script.js +80 -5
- package/dist/cjs/src/script/Script.js.map +1 -1
- package/dist/cjs/src/script/Spend.js +145 -53
- package/dist/cjs/src/script/Spend.js.map +1 -1
- package/dist/cjs/src/script/templates/P2PKH.js.map +1 -1
- package/dist/cjs/src/script/templates/PushDrop.js +21 -7
- package/dist/cjs/src/script/templates/PushDrop.js.map +1 -1
- package/dist/cjs/src/script/templates/RPuzzle.js.map +1 -1
- package/dist/cjs/src/storage/StorageDownloader.js.map +1 -1
- package/dist/cjs/src/storage/StorageUploader.js +17 -7
- package/dist/cjs/src/storage/StorageUploader.js.map +1 -1
- package/dist/cjs/src/storage/StorageUtils.js.map +1 -1
- package/dist/cjs/src/storage/index.js +17 -7
- package/dist/cjs/src/storage/index.js.map +1 -1
- package/dist/cjs/src/totp/totp.js.map +1 -1
- package/dist/cjs/src/transaction/Beef.js +85 -27
- package/dist/cjs/src/transaction/Beef.js.map +1 -1
- package/dist/cjs/src/transaction/BeefParty.js.map +1 -1
- package/dist/cjs/src/transaction/BeefTx.js +32 -14
- package/dist/cjs/src/transaction/BeefTx.js.map +1 -1
- package/dist/cjs/src/transaction/Broadcaster.js +2 -3
- package/dist/cjs/src/transaction/Broadcaster.js.map +1 -1
- package/dist/cjs/src/transaction/MerklePath.js +25 -6
- package/dist/cjs/src/transaction/MerklePath.js.map +1 -1
- package/dist/cjs/src/transaction/Transaction.js +238 -27
- package/dist/cjs/src/transaction/Transaction.js.map +1 -1
- package/dist/cjs/src/transaction/broadcasters/ARC.js +23 -0
- package/dist/cjs/src/transaction/broadcasters/ARC.js.map +1 -1
- package/dist/cjs/src/transaction/broadcasters/DefaultBroadcaster.js +1 -2
- package/dist/cjs/src/transaction/broadcasters/DefaultBroadcaster.js.map +1 -1
- package/dist/cjs/src/transaction/broadcasters/Teranode.js.map +1 -1
- package/dist/cjs/src/transaction/broadcasters/WhatsOnChainBroadcaster.js.map +1 -1
- package/dist/cjs/src/transaction/chaintrackers/BlockHeadersService.js.map +1 -1
- package/dist/cjs/src/transaction/chaintrackers/DefaultChainTracker.js +1 -2
- package/dist/cjs/src/transaction/chaintrackers/DefaultChainTracker.js.map +1 -1
- package/dist/cjs/src/transaction/chaintrackers/WhatsOnChain.js.map +1 -1
- package/dist/cjs/src/transaction/fee-models/LivePolicy.js.map +1 -1
- package/dist/cjs/src/transaction/fee-models/SatoshisPerKilobyte.js.map +1 -1
- package/dist/cjs/src/transaction/http/BinaryFetchClient.js +2 -2
- package/dist/cjs/src/transaction/http/BinaryFetchClient.js.map +1 -1
- package/dist/cjs/src/transaction/http/DefaultHttpClient.js +1 -2
- package/dist/cjs/src/transaction/http/DefaultHttpClient.js.map +1 -1
- package/dist/cjs/src/transaction/http/NodejsHttpClient.js.map +1 -1
- package/dist/cjs/src/wallet/CachedKeyDeriver.js.map +1 -1
- package/dist/cjs/src/wallet/KeyDeriver.js.map +1 -1
- package/dist/cjs/src/wallet/ProtoWallet.js +1 -1
- package/dist/cjs/src/wallet/ProtoWallet.js.map +1 -1
- package/dist/cjs/src/wallet/WalletClient.js.map +1 -1
- package/dist/cjs/src/wallet/WalletError.js.map +1 -1
- package/dist/cjs/src/wallet/index.js +17 -7
- package/dist/cjs/src/wallet/index.js.map +1 -1
- package/dist/cjs/src/wallet/substrates/HTTPWalletJSON.js.map +1 -1
- package/dist/cjs/src/wallet/substrates/HTTPWalletWire.js +17 -7
- package/dist/cjs/src/wallet/substrates/HTTPWalletWire.js.map +1 -1
- package/dist/cjs/src/wallet/substrates/ReactNativeWebView.js +17 -7
- package/dist/cjs/src/wallet/substrates/ReactNativeWebView.js.map +1 -1
- package/dist/cjs/src/wallet/substrates/WalletWireProcessor.js +17 -7
- package/dist/cjs/src/wallet/substrates/WalletWireProcessor.js.map +1 -1
- package/dist/cjs/src/wallet/substrates/WalletWireTransceiver.js +17 -7
- package/dist/cjs/src/wallet/substrates/WalletWireTransceiver.js.map +1 -1
- package/dist/cjs/src/wallet/substrates/XDM.js +17 -7
- package/dist/cjs/src/wallet/substrates/XDM.js.map +1 -1
- package/dist/cjs/src/wallet/substrates/utils/toOriginHeader.js +1 -2
- package/dist/cjs/src/wallet/substrates/utils/toOriginHeader.js.map +1 -1
- package/dist/cjs/src/wallet/substrates/window.CWI.js.map +1 -1
- package/dist/cjs/src/wallet/validationHelpers.js +51 -41
- package/dist/cjs/src/wallet/validationHelpers.js.map +1 -1
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/esm/mod.js +1 -0
- package/dist/esm/mod.js.map +1 -1
- package/dist/esm/src/auth/Peer.js +132 -67
- package/dist/esm/src/auth/Peer.js.map +1 -1
- package/dist/esm/src/auth/SessionManager.js.map +1 -1
- package/dist/esm/src/auth/certificates/Certificate.js +1 -1
- package/dist/esm/src/auth/certificates/Certificate.js.map +1 -1
- package/dist/esm/src/auth/certificates/MasterCertificate.js +2 -2
- package/dist/esm/src/auth/certificates/MasterCertificate.js.map +1 -1
- package/dist/esm/src/auth/certificates/VerifiableCertificate.js.map +1 -1
- package/dist/esm/src/auth/certificates/__tests/CompletedProtoWallet.js.map +1 -1
- package/dist/esm/src/auth/clients/AuthFetch.js +13 -3
- package/dist/esm/src/auth/clients/AuthFetch.js.map +1 -1
- package/dist/esm/src/auth/clients/__tests__/AuthFetch.test.js.map +1 -1
- package/dist/esm/src/auth/transports/SimplifiedFetchTransport.js.map +1 -1
- package/dist/esm/src/auth/transports/__tests__/SimplifiedFetchTransport.test.js.map +1 -1
- package/dist/esm/src/auth/utils/validateCertificates.js.map +1 -1
- package/dist/esm/src/compat/BSM.js.map +1 -1
- package/dist/esm/src/compat/ECIES.js.map +1 -1
- package/dist/esm/src/compat/HD.js.map +1 -1
- package/dist/esm/src/compat/Mnemonic.js.map +1 -1
- package/dist/esm/src/identity/ContactsManager.js +1 -1
- package/dist/esm/src/identity/ContactsManager.js.map +1 -1
- package/dist/esm/src/identity/IdentityClient.js.map +1 -1
- package/dist/esm/src/kvstore/GlobalKVStore.js +3 -3
- package/dist/esm/src/kvstore/GlobalKVStore.js.map +1 -1
- package/dist/esm/src/kvstore/LocalKVStore.js.map +1 -1
- package/dist/esm/src/kvstore/kvStoreInterpreter.js.map +1 -1
- package/dist/esm/src/messages/EncryptedMessage.js +19 -0
- package/dist/esm/src/messages/EncryptedMessage.js.map +1 -1
- package/dist/esm/src/messages/SignedMessage.js.map +1 -1
- package/dist/esm/src/overlay-tools/Historian.js.map +1 -1
- package/dist/esm/src/overlay-tools/HostReputationTracker.js.map +1 -1
- package/dist/esm/src/overlay-tools/LookupResolver.js.map +1 -1
- package/dist/esm/src/overlay-tools/OverlayAdminTokenTemplate.js.map +1 -1
- package/dist/esm/src/overlay-tools/SHIPBroadcaster.js.map +1 -1
- package/dist/esm/src/overlay-tools/withDoubleSpendRetry.js.map +1 -1
- package/dist/esm/src/primitives/AESGCM.js +71 -26
- package/dist/esm/src/primitives/AESGCM.js.map +1 -1
- package/dist/esm/src/primitives/BigNumber.js +28 -54
- package/dist/esm/src/primitives/BigNumber.js.map +1 -1
- package/dist/esm/src/primitives/Curve.js.map +1 -1
- package/dist/esm/src/primitives/DRBG.js.map +1 -1
- package/dist/esm/src/primitives/ECDSA.js +58 -24
- package/dist/esm/src/primitives/ECDSA.js.map +1 -1
- package/dist/esm/src/primitives/Hash.js.map +1 -1
- package/dist/esm/src/primitives/JacobianPoint.js.map +1 -1
- package/dist/esm/src/primitives/K256.js.map +1 -1
- package/dist/esm/src/primitives/Mersenne.js.map +1 -1
- package/dist/esm/src/primitives/MontgomoryMethod.js.map +1 -1
- package/dist/esm/src/primitives/Point.js +61 -4
- package/dist/esm/src/primitives/Point.js.map +1 -1
- package/dist/esm/src/primitives/Polynomial.js.map +1 -1
- package/dist/esm/src/primitives/PrivateKey.js +29 -2
- package/dist/esm/src/primitives/PrivateKey.js.map +1 -1
- package/dist/esm/src/primitives/PublicKey.js +1 -1
- package/dist/esm/src/primitives/PublicKey.js.map +1 -1
- package/dist/esm/src/primitives/Random.js.map +1 -1
- package/dist/esm/src/primitives/ReaderUint8Array.js +176 -0
- package/dist/esm/src/primitives/ReaderUint8Array.js.map +1 -0
- package/dist/esm/src/primitives/ReductionContext.js +35 -46
- package/dist/esm/src/primitives/ReductionContext.js.map +1 -1
- package/dist/esm/src/primitives/Schnorr.js.map +1 -1
- package/dist/esm/src/primitives/Secp256r1.js.map +1 -1
- package/dist/esm/src/primitives/Signature.js.map +1 -1
- package/dist/esm/src/primitives/SymmetricKey.js.map +1 -1
- package/dist/esm/src/primitives/TransactionSignature.js +115 -10
- package/dist/esm/src/primitives/TransactionSignature.js.map +1 -1
- package/dist/esm/src/primitives/WriterUint8Array.js +169 -0
- package/dist/esm/src/primitives/WriterUint8Array.js.map +1 -0
- package/dist/esm/src/primitives/hex.js.map +1 -1
- package/dist/esm/src/primitives/utils.js +37 -11
- package/dist/esm/src/primitives/utils.js.map +1 -1
- package/dist/esm/src/registry/RegistryClient.js.map +1 -1
- package/dist/esm/src/remittance/CommsLayer.js +2 -0
- package/dist/esm/src/remittance/CommsLayer.js.map +1 -0
- package/dist/esm/src/remittance/IdentityLayer.js +2 -0
- package/dist/esm/src/remittance/IdentityLayer.js.map +1 -0
- package/dist/esm/src/remittance/RemittanceManager.js +1254 -0
- package/dist/esm/src/remittance/RemittanceManager.js.map +1 -0
- package/dist/esm/src/remittance/RemittanceModule.js +2 -0
- package/dist/esm/src/remittance/RemittanceModule.js.map +1 -0
- package/dist/esm/src/remittance/index.js +7 -0
- package/dist/esm/src/remittance/index.js.map +1 -0
- package/dist/esm/src/remittance/modules/BasicBRC29.js +227 -0
- package/dist/esm/src/remittance/modules/BasicBRC29.js.map +1 -0
- package/dist/esm/src/remittance/modules/index.js +2 -0
- package/dist/esm/src/remittance/modules/index.js.map +1 -0
- package/dist/esm/src/remittance/types.js +19 -0
- package/dist/esm/src/remittance/types.js.map +1 -0
- package/dist/esm/src/script/OP.js +15 -13
- package/dist/esm/src/script/OP.js.map +1 -1
- package/dist/esm/src/script/Script.js +80 -5
- package/dist/esm/src/script/Script.js.map +1 -1
- package/dist/esm/src/script/Spend.js +129 -46
- package/dist/esm/src/script/Spend.js.map +1 -1
- package/dist/esm/src/script/templates/P2PKH.js.map +1 -1
- package/dist/esm/src/script/templates/PushDrop.js +21 -7
- package/dist/esm/src/script/templates/PushDrop.js.map +1 -1
- package/dist/esm/src/script/templates/RPuzzle.js.map +1 -1
- package/dist/esm/src/storage/StorageDownloader.js.map +1 -1
- package/dist/esm/src/storage/StorageUploader.js.map +1 -1
- package/dist/esm/src/storage/StorageUtils.js.map +1 -1
- package/dist/esm/src/totp/totp.js.map +1 -1
- package/dist/esm/src/transaction/Beef.js +86 -28
- package/dist/esm/src/transaction/Beef.js.map +1 -1
- package/dist/esm/src/transaction/BeefParty.js.map +1 -1
- package/dist/esm/src/transaction/BeefTx.js +32 -14
- package/dist/esm/src/transaction/BeefTx.js.map +1 -1
- package/dist/esm/src/transaction/MerklePath.js +26 -7
- package/dist/esm/src/transaction/MerklePath.js.map +1 -1
- package/dist/esm/src/transaction/Transaction.js +239 -28
- package/dist/esm/src/transaction/Transaction.js.map +1 -1
- package/dist/esm/src/transaction/broadcasters/ARC.js +23 -0
- package/dist/esm/src/transaction/broadcasters/ARC.js.map +1 -1
- package/dist/esm/src/transaction/broadcasters/Teranode.js.map +1 -1
- package/dist/esm/src/transaction/broadcasters/WhatsOnChainBroadcaster.js.map +1 -1
- package/dist/esm/src/transaction/chaintrackers/BlockHeadersService.js.map +1 -1
- package/dist/esm/src/transaction/chaintrackers/WhatsOnChain.js.map +1 -1
- package/dist/esm/src/transaction/fee-models/LivePolicy.js.map +1 -1
- package/dist/esm/src/transaction/fee-models/SatoshisPerKilobyte.js.map +1 -1
- package/dist/esm/src/transaction/http/BinaryFetchClient.js.map +1 -1
- package/dist/esm/src/transaction/http/DefaultHttpClient.js.map +1 -1
- package/dist/esm/src/transaction/http/NodejsHttpClient.js.map +1 -1
- package/dist/esm/src/wallet/CachedKeyDeriver.js.map +1 -1
- package/dist/esm/src/wallet/KeyDeriver.js.map +1 -1
- package/dist/esm/src/wallet/ProtoWallet.js +1 -1
- package/dist/esm/src/wallet/ProtoWallet.js.map +1 -1
- package/dist/esm/src/wallet/WalletClient.js.map +1 -1
- package/dist/esm/src/wallet/WalletError.js.map +1 -1
- package/dist/esm/src/wallet/substrates/HTTPWalletJSON.js.map +1 -1
- package/dist/esm/src/wallet/substrates/HTTPWalletWire.js.map +1 -1
- package/dist/esm/src/wallet/substrates/ReactNativeWebView.js.map +1 -1
- package/dist/esm/src/wallet/substrates/WalletWireProcessor.js.map +1 -1
- package/dist/esm/src/wallet/substrates/WalletWireTransceiver.js.map +1 -1
- package/dist/esm/src/wallet/substrates/XDM.js.map +1 -1
- package/dist/esm/src/wallet/substrates/utils/toOriginHeader.js.map +1 -1
- package/dist/esm/src/wallet/substrates/window.CWI.js.map +1 -1
- package/dist/esm/src/wallet/validationHelpers.js +1 -1
- package/dist/esm/src/wallet/validationHelpers.js.map +1 -1
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/types/mod.d.ts +1 -0
- package/dist/types/mod.d.ts.map +1 -1
- package/dist/types/src/auth/Peer.d.ts +12 -7
- package/dist/types/src/auth/Peer.d.ts.map +1 -1
- package/dist/types/src/auth/certificates/MasterCertificate.d.ts.map +1 -1
- package/dist/types/src/auth/clients/AuthFetch.d.ts.map +1 -1
- package/dist/types/src/auth/types.d.ts +2 -0
- package/dist/types/src/auth/types.d.ts.map +1 -1
- package/dist/types/src/auth/utils/getVerifiableCertificates.d.ts.map +1 -1
- package/dist/types/src/auth/utils/validateCertificates.d.ts.map +1 -1
- package/dist/types/src/compat/BSM.d.ts +1 -1
- package/dist/types/src/compat/BSM.d.ts.map +1 -1
- package/dist/types/src/messages/EncryptedMessage.d.ts +19 -0
- package/dist/types/src/messages/EncryptedMessage.d.ts.map +1 -1
- package/dist/types/src/messages/SignedMessage.d.ts.map +1 -1
- package/dist/types/src/primitives/AESGCM.d.ts +18 -0
- package/dist/types/src/primitives/AESGCM.d.ts.map +1 -1
- package/dist/types/src/primitives/BigNumber.d.ts +8 -0
- package/dist/types/src/primitives/BigNumber.d.ts.map +1 -1
- package/dist/types/src/primitives/ECDSA.d.ts +24 -0
- package/dist/types/src/primitives/ECDSA.d.ts.map +1 -1
- package/dist/types/src/primitives/Hash.d.ts +8 -8
- package/dist/types/src/primitives/Hash.d.ts.map +1 -1
- package/dist/types/src/primitives/Point.d.ts +1 -0
- package/dist/types/src/primitives/Point.d.ts.map +1 -1
- package/dist/types/src/primitives/PrivateKey.d.ts +27 -0
- package/dist/types/src/primitives/PrivateKey.d.ts.map +1 -1
- package/dist/types/src/primitives/Random.d.ts.map +1 -1
- package/dist/types/src/primitives/ReaderUint8Array.d.ts +32 -0
- package/dist/types/src/primitives/ReaderUint8Array.d.ts.map +1 -0
- package/dist/types/src/primitives/ReductionContext.d.ts +9 -0
- package/dist/types/src/primitives/ReductionContext.d.ts.map +1 -1
- package/dist/types/src/primitives/Secp256r1.d.ts.map +1 -1
- package/dist/types/src/primitives/TransactionSignature.d.ts +16 -4
- package/dist/types/src/primitives/TransactionSignature.d.ts.map +1 -1
- package/dist/types/src/primitives/WriterUint8Array.d.ts +54 -0
- package/dist/types/src/primitives/WriterUint8Array.d.ts.map +1 -0
- package/dist/types/src/primitives/utils.d.ts +19 -6
- package/dist/types/src/primitives/utils.d.ts.map +1 -1
- package/dist/types/src/remittance/CommsLayer.d.ts +50 -0
- package/dist/types/src/remittance/CommsLayer.d.ts.map +1 -0
- package/dist/types/src/remittance/IdentityLayer.d.ts +35 -0
- package/dist/types/src/remittance/IdentityLayer.d.ts.map +1 -0
- package/dist/types/src/remittance/RemittanceManager.d.ts +452 -0
- package/dist/types/src/remittance/RemittanceManager.d.ts.map +1 -0
- package/dist/types/src/remittance/RemittanceModule.d.ts +106 -0
- package/dist/types/src/remittance/RemittanceModule.d.ts.map +1 -0
- package/dist/types/src/remittance/index.d.ts +7 -0
- package/dist/types/src/remittance/index.d.ts.map +1 -0
- package/dist/types/src/remittance/modules/BasicBRC29.d.ts +133 -0
- package/dist/types/src/remittance/modules/BasicBRC29.d.ts.map +1 -0
- package/dist/types/src/remittance/modules/index.d.ts +2 -0
- package/dist/types/src/remittance/modules/index.d.ts.map +1 -0
- package/dist/types/src/remittance/types.d.ts +238 -0
- package/dist/types/src/remittance/types.d.ts.map +1 -0
- package/dist/types/src/script/OP.d.ts +5 -3
- package/dist/types/src/script/OP.d.ts.map +1 -1
- package/dist/types/src/script/Script.d.ts.map +1 -1
- package/dist/types/src/script/Spend.d.ts +7 -0
- package/dist/types/src/script/Spend.d.ts.map +1 -1
- package/dist/types/src/script/templates/PushDrop.d.ts +3 -4
- package/dist/types/src/script/templates/PushDrop.d.ts.map +1 -1
- package/dist/types/src/storage/StorageUtils.d.ts.map +1 -1
- package/dist/types/src/transaction/Beef.d.ts +26 -9
- package/dist/types/src/transaction/Beef.d.ts.map +1 -1
- package/dist/types/src/transaction/BeefTx.d.ts +13 -6
- package/dist/types/src/transaction/BeefTx.d.ts.map +1 -1
- package/dist/types/src/transaction/MerklePath.d.ts +16 -3
- package/dist/types/src/transaction/MerklePath.d.ts.map +1 -1
- package/dist/types/src/transaction/Transaction.d.ts +58 -7
- package/dist/types/src/transaction/Transaction.d.ts.map +1 -1
- package/dist/types/src/transaction/broadcasters/ARC.d.ts.map +1 -1
- package/dist/types/src/transaction/http/BinaryFetchClient.d.ts +0 -2
- package/dist/types/src/transaction/http/BinaryFetchClient.d.ts.map +1 -1
- package/dist/types/src/wallet/Wallet.interfaces.d.ts +5 -5
- package/dist/types/src/wallet/Wallet.interfaces.d.ts.map +1 -1
- package/dist/types/tsconfig.types.tsbuildinfo +1 -1
- package/dist/umd/bundle.js +13 -13
- package/dist/umd/bundle.js.map +1 -1
- package/docs/index.md +3 -1
- package/docs/reference/auth.md +8 -12
- package/docs/reference/primitives.md +260 -55
- package/docs/reference/remittance.md +2166 -0
- package/docs/reference/script.md +12 -4
- package/docs/reference/transaction.md +203 -34
- package/docs/reference/wallet.md +6 -5
- package/docs/remittance-getting-started.md +138 -0
- package/mod.ts +1 -0
- package/package.json +11 -1
- package/src/auth/Peer.ts +196 -85
- package/src/auth/__tests/Peer.test.ts +424 -257
- package/src/auth/clients/AuthFetch.ts +18 -3
- package/src/auth/types.ts +2 -0
- package/src/messages/EncryptedMessage.ts +19 -0
- package/src/overlay-tools/__tests/SHIPBroadcaster.test.ts +7 -0
- package/src/primitives/AESGCM.ts +75 -34
- package/src/primitives/BigNumber.ts +27 -31
- package/src/primitives/ECDSA.ts +41 -2
- package/src/primitives/PrivateKey.ts +27 -0
- package/src/primitives/ReaderUint8Array.ts +196 -0
- package/src/primitives/ReductionContext.ts +44 -48
- package/src/primitives/TransactionSignature.ts +129 -10
- package/src/primitives/WriterUint8Array.ts +195 -0
- package/src/primitives/__tests/AESGCM.test.ts +31 -0
- package/src/primitives/__tests/ECDSA.test.ts +16 -0
- package/src/primitives/__tests/ReaderUint8Array.test.ts +317 -0
- package/src/primitives/__tests/WriterUint8Array.test.ts +208 -0
- package/src/primitives/utils.ts +31 -4
- package/src/remittance/CommsLayer.ts +41 -0
- package/src/remittance/IdentityLayer.ts +32 -0
- package/src/remittance/RemittanceManager.ts +1672 -0
- package/src/remittance/RemittanceModule.ts +92 -0
- package/src/remittance/__tests/BasicBRC29.test.ts +188 -0
- package/src/remittance/__tests/RemittanceManager.test.ts +493 -0
- package/src/remittance/__tests/examples.ts +130 -0
- package/src/remittance/index.ts +6 -0
- package/src/remittance/modules/BasicBRC29.ts +361 -0
- package/src/remittance/modules/index.ts +1 -0
- package/src/remittance/types.ts +284 -0
- package/src/script/OP.ts +15 -13
- package/src/script/Script.ts +70 -5
- package/src/script/Spend.ts +128 -52
- package/src/script/__tests/Chronicle.test.ts +186 -0
- package/src/script/__tests/Script.test.ts +39 -6
- package/src/script/__tests/Spend.test.ts +1 -1
- package/src/script/__tests/SpendValildVectors.test.ts +63 -0
- package/src/script/__tests/lrshiftnum.test.ts +185 -0
- package/src/script/__tests/sighashTestData.ts +1031 -0
- package/src/script/__tests/spend.valid.vectors.ts +9 -16
- package/src/script/templates/PushDrop.ts +32 -17
- package/src/script/templates/__tests/PushDrop.test.ts +28 -0
- package/src/storage/__tests/StorageUploader.test.ts +1 -1
- package/src/transaction/Beef.ts +103 -40
- package/src/transaction/BeefTx.ts +38 -19
- package/src/transaction/MerklePath.ts +30 -9
- package/src/transaction/Transaction.ts +277 -38
- package/src/transaction/__tests/Beef.test.ts +77 -0
- package/src/transaction/__tests/Transaction.test.ts +641 -3
- package/src/transaction/broadcasters/ARC.ts +34 -7
- package/src/transaction/broadcasters/__tests/ARC.test.ts +98 -0
- package/src/wallet/Wallet.interfaces.ts +5 -5
- package/dist/cjs/src/storage/__test/StorageDownloader.test.js +0 -171
- package/dist/cjs/src/storage/__test/StorageDownloader.test.js.map +0 -1
- package/dist/cjs/src/storage/__test/StorageUploader.test.js +0 -163
- package/dist/cjs/src/storage/__test/StorageUploader.test.js.map +0 -1
- package/dist/cjs/src/storage/__test/StorageUtils.test.js +0 -97
- package/dist/cjs/src/storage/__test/StorageUtils.test.js.map +0 -1
- package/dist/esm/src/storage/__test/StorageDownloader.test.js +0 -166
- package/dist/esm/src/storage/__test/StorageDownloader.test.js.map +0 -1
- package/dist/esm/src/storage/__test/StorageUploader.test.js +0 -135
- package/dist/esm/src/storage/__test/StorageUploader.test.js.map +0 -1
- package/dist/esm/src/storage/__test/StorageUtils.test.js +0 -72
- package/dist/esm/src/storage/__test/StorageUtils.test.js.map +0 -1
- package/dist/types/src/storage/__test/StorageDownloader.test.d.ts +0 -2
- package/dist/types/src/storage/__test/StorageDownloader.test.d.ts.map +0 -1
- package/dist/types/src/storage/__test/StorageUploader.test.d.ts +0 -2
- package/dist/types/src/storage/__test/StorageUploader.test.d.ts.map +0 -1
- package/dist/types/src/storage/__test/StorageUtils.test.d.ts +0 -2
- package/dist/types/src/storage/__test/StorageUtils.test.d.ts.map +0 -1
|
@@ -25,7 +25,7 @@ export interface ArcConfig {
|
|
|
25
25
|
headers?: Record<string, string>
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
function defaultDeploymentId(): string {
|
|
28
|
+
function defaultDeploymentId (): string {
|
|
29
29
|
return `ts-sdk-${toHex(Random(16))}`
|
|
30
30
|
}
|
|
31
31
|
|
|
@@ -47,16 +47,16 @@ export default class ARC implements Broadcaster {
|
|
|
47
47
|
* @param {string} URL - The URL endpoint for the ARC API.
|
|
48
48
|
* @param {ArcConfig} config - Configuration options for the ARC broadcaster.
|
|
49
49
|
*/
|
|
50
|
-
constructor(URL: string, config?: ArcConfig)
|
|
50
|
+
constructor (URL: string, config?: ArcConfig)
|
|
51
51
|
/**
|
|
52
52
|
* Constructs an instance of the ARC broadcaster.
|
|
53
53
|
*
|
|
54
54
|
* @param {string} URL - The URL endpoint for the ARC API.
|
|
55
55
|
* @param {string} apiKey - The API key used for authorization with the ARC API.
|
|
56
56
|
*/
|
|
57
|
-
constructor(URL: string, apiKey?: string)
|
|
57
|
+
constructor (URL: string, apiKey?: string)
|
|
58
58
|
|
|
59
|
-
constructor(URL: string, config?: string | ArcConfig) {
|
|
59
|
+
constructor (URL: string, config?: string | ArcConfig) {
|
|
60
60
|
this.URL = URL
|
|
61
61
|
if (typeof config === 'string') {
|
|
62
62
|
this.apiKey = config
|
|
@@ -86,7 +86,7 @@ export default class ARC implements Broadcaster {
|
|
|
86
86
|
/**
|
|
87
87
|
* Constructs a dictionary of the default & supplied request headers.
|
|
88
88
|
*/
|
|
89
|
-
private requestHeaders(): Record<string, string> {
|
|
89
|
+
private requestHeaders (): Record<string, string> {
|
|
90
90
|
const headers: Record<string, string> = {
|
|
91
91
|
'Content-Type': 'application/json',
|
|
92
92
|
'XDeployment-ID': this.deploymentId
|
|
@@ -119,7 +119,7 @@ export default class ARC implements Broadcaster {
|
|
|
119
119
|
* @param {Transaction} tx - The transaction to be broadcasted.
|
|
120
120
|
* @returns {Promise<BroadcastResponse | BroadcastFailure>} A promise that resolves to either a success or failure response.
|
|
121
121
|
*/
|
|
122
|
-
async broadcast(
|
|
122
|
+
async broadcast (
|
|
123
123
|
tx: Transaction
|
|
124
124
|
): Promise<BroadcastResponse | BroadcastFailure> {
|
|
125
125
|
let rawTx
|
|
@@ -149,6 +149,33 @@ export default class ARC implements Broadcaster {
|
|
|
149
149
|
)
|
|
150
150
|
if (response.ok) {
|
|
151
151
|
const { txid, extraInfo, txStatus, competingTxs } = response.data
|
|
152
|
+
|
|
153
|
+
// Check for error txStatus values that ARC returns with HTTP 200
|
|
154
|
+
// These should be treated as broadcast failures
|
|
155
|
+
const errorStatuses = [
|
|
156
|
+
'DOUBLE_SPEND_ATTEMPTED',
|
|
157
|
+
'REJECTED',
|
|
158
|
+
'INVALID',
|
|
159
|
+
'MALFORMED',
|
|
160
|
+
'MINED_IN_STALE_BLOCK'
|
|
161
|
+
]
|
|
162
|
+
|
|
163
|
+
const isOrphan = extraInfo?.toUpperCase().includes('ORPHAN') ||
|
|
164
|
+
txStatus?.toUpperCase().includes('ORPHAN')
|
|
165
|
+
|
|
166
|
+
if (errorStatuses.includes(txStatus?.toUpperCase()) || isOrphan) {
|
|
167
|
+
const failure: BroadcastFailure = {
|
|
168
|
+
status: 'error',
|
|
169
|
+
code: txStatus ?? 'UNKNOWN',
|
|
170
|
+
txid,
|
|
171
|
+
description: `${txStatus ?? ''} ${extraInfo ?? ''}`.trim()
|
|
172
|
+
}
|
|
173
|
+
if (competingTxs != null) {
|
|
174
|
+
failure.more = { competingTxs }
|
|
175
|
+
}
|
|
176
|
+
return failure
|
|
177
|
+
}
|
|
178
|
+
|
|
152
179
|
const broadcastRes: BroadcastResponse = {
|
|
153
180
|
status: 'success',
|
|
154
181
|
txid,
|
|
@@ -208,7 +235,7 @@ export default class ARC implements Broadcaster {
|
|
|
208
235
|
* @param {Transaction[]} txs - Array of transactions to be broadcasted.
|
|
209
236
|
* @returns {Promise<Array<object>>} A promise that resolves to an array of objects.
|
|
210
237
|
*/
|
|
211
|
-
async broadcastMany(txs: Transaction[]): Promise<object[]> {
|
|
238
|
+
async broadcastMany (txs: Transaction[]): Promise<object[]> {
|
|
212
239
|
const rawTxs = txs.map((tx) => {
|
|
213
240
|
try {
|
|
214
241
|
return { rawTx: tx.toHexEF() }
|
|
@@ -250,6 +250,104 @@ describe('ARC Broadcaster', () => {
|
|
|
250
250
|
}
|
|
251
251
|
})
|
|
252
252
|
|
|
253
|
+
it('should return error for DOUBLE_SPEND_ATTEMPTED even with HTTP 200', async () => {
|
|
254
|
+
const mockFetch = mockedFetch({
|
|
255
|
+
status: 200,
|
|
256
|
+
data: {
|
|
257
|
+
txid: '89100426fc13a55260fa65e621e7591f8b01007af62480e818d0da518723bfd3',
|
|
258
|
+
txStatus: 'DOUBLE_SPEND_ATTEMPTED',
|
|
259
|
+
extraInfo: '',
|
|
260
|
+
competingTxs: ['5e58f06a83343011f77d9109aab08dcc38d89e8cc7bd55da16affa948281d7ed']
|
|
261
|
+
}
|
|
262
|
+
})
|
|
263
|
+
|
|
264
|
+
const broadcaster = new ARC(URL, {
|
|
265
|
+
httpClient: new FetchHttpClient(mockFetch)
|
|
266
|
+
})
|
|
267
|
+
const response = await broadcaster.broadcast(transaction)
|
|
268
|
+
|
|
269
|
+
expect(mockFetch).toHaveBeenCalled()
|
|
270
|
+
expect(response.status).toBe('error')
|
|
271
|
+
if (response.status === 'error') {
|
|
272
|
+
expect(response.code).toBe('DOUBLE_SPEND_ATTEMPTED')
|
|
273
|
+
expect(response.txid).toBe('89100426fc13a55260fa65e621e7591f8b01007af62480e818d0da518723bfd3')
|
|
274
|
+
expect(response.more).toEqual({
|
|
275
|
+
competingTxs: ['5e58f06a83343011f77d9109aab08dcc38d89e8cc7bd55da16affa948281d7ed']
|
|
276
|
+
})
|
|
277
|
+
}
|
|
278
|
+
})
|
|
279
|
+
|
|
280
|
+
it('should return error for SEEN_IN_ORPHAN_MEMPOOL even with HTTP 200', async () => {
|
|
281
|
+
const mockFetch = mockedFetch({
|
|
282
|
+
status: 200,
|
|
283
|
+
data: {
|
|
284
|
+
txid: 'b06cb1059c2bf3debee1e65dc90d0815653325c7cf2584763b90c761c09919db',
|
|
285
|
+
txStatus: 'success',
|
|
286
|
+
extraInfo: 'SEEN_IN_ORPHAN_MEMPOOL'
|
|
287
|
+
}
|
|
288
|
+
})
|
|
289
|
+
|
|
290
|
+
const broadcaster = new ARC(URL, {
|
|
291
|
+
httpClient: new FetchHttpClient(mockFetch)
|
|
292
|
+
})
|
|
293
|
+
const response = await broadcaster.broadcast(transaction)
|
|
294
|
+
|
|
295
|
+
expect(mockFetch).toHaveBeenCalled()
|
|
296
|
+
expect(response.status).toBe('error')
|
|
297
|
+
if (response.status === 'error') {
|
|
298
|
+
expect(response.code).toBe('success')
|
|
299
|
+
expect(response.txid).toBe('b06cb1059c2bf3debee1e65dc90d0815653325c7cf2584763b90c761c09919db')
|
|
300
|
+
expect(response.description).toContain('ORPHAN')
|
|
301
|
+
}
|
|
302
|
+
})
|
|
303
|
+
|
|
304
|
+
it('should return error for REJECTED status even with HTTP 200', async () => {
|
|
305
|
+
const mockFetch = mockedFetch({
|
|
306
|
+
status: 200,
|
|
307
|
+
data: {
|
|
308
|
+
txid: 'abc123',
|
|
309
|
+
txStatus: 'REJECTED',
|
|
310
|
+
extraInfo: 'Transaction rejected by network'
|
|
311
|
+
}
|
|
312
|
+
})
|
|
313
|
+
|
|
314
|
+
const broadcaster = new ARC(URL, {
|
|
315
|
+
httpClient: new FetchHttpClient(mockFetch)
|
|
316
|
+
})
|
|
317
|
+
const response = await broadcaster.broadcast(transaction)
|
|
318
|
+
|
|
319
|
+
expect(mockFetch).toHaveBeenCalled()
|
|
320
|
+
expect(response.status).toBe('error')
|
|
321
|
+
if (response.status === 'error') {
|
|
322
|
+
expect(response.code).toBe('REJECTED')
|
|
323
|
+
expect(response.description).toContain('REJECTED')
|
|
324
|
+
expect(response.description).toContain('Transaction rejected by network')
|
|
325
|
+
}
|
|
326
|
+
})
|
|
327
|
+
|
|
328
|
+
it('should still return success for valid txStatus values', async () => {
|
|
329
|
+
const mockFetch = mockedFetch({
|
|
330
|
+
status: 200,
|
|
331
|
+
data: {
|
|
332
|
+
txid: 'valid_txid',
|
|
333
|
+
txStatus: 'SEEN_ON_NETWORK',
|
|
334
|
+
extraInfo: 'Transaction accepted'
|
|
335
|
+
}
|
|
336
|
+
})
|
|
337
|
+
|
|
338
|
+
const broadcaster = new ARC(URL, {
|
|
339
|
+
httpClient: new FetchHttpClient(mockFetch)
|
|
340
|
+
})
|
|
341
|
+
const response = await broadcaster.broadcast(transaction)
|
|
342
|
+
|
|
343
|
+
expect(mockFetch).toHaveBeenCalled()
|
|
344
|
+
expect(response.status).toBe('success')
|
|
345
|
+
if (response.status === 'success') {
|
|
346
|
+
expect(response.txid).toBe('valid_txid')
|
|
347
|
+
expect(response.message).toBe('SEEN_ON_NETWORK Transaction accepted')
|
|
348
|
+
}
|
|
349
|
+
})
|
|
350
|
+
|
|
253
351
|
function mockedFetch (response: { status: number, data: any }): jest.Mock {
|
|
254
352
|
return jest.fn().mockResolvedValue({
|
|
255
353
|
ok: response.status === 200,
|
|
@@ -128,16 +128,16 @@ export type OutputTagStringUnder300Bytes = string
|
|
|
128
128
|
export type LabelStringUnder300Bytes = string
|
|
129
129
|
|
|
130
130
|
/**
|
|
131
|
-
* @typedef {Byte[]} BEEF
|
|
131
|
+
* @typedef {Byte[] | Uint8Array} BEEF
|
|
132
132
|
* An array of integers, each ranging from 0 to 255, indicating transaction data in BEEF (BRC-62) format.
|
|
133
133
|
*/
|
|
134
|
-
export type BEEF = Byte[]
|
|
134
|
+
export type BEEF = Byte[] | Uint8Array
|
|
135
135
|
|
|
136
136
|
/**
|
|
137
|
-
* @typedef {Byte[]} AtomicBEEF
|
|
137
|
+
* @typedef {Byte[] | Uint8Array} AtomicBEEF
|
|
138
138
|
* An array of integers, each ranging from 0 to 255, indicating transaction data in Atomic BEEF (BRC-95) format.
|
|
139
139
|
*/
|
|
140
|
-
export type AtomicBEEF = Byte[]
|
|
140
|
+
export type AtomicBEEF = Byte[] | Uint8Array
|
|
141
141
|
|
|
142
142
|
/**
|
|
143
143
|
* @typedef {string & { minLength: 5, maxLength: 400 }} ProtocolString5To400Bytes
|
|
@@ -324,7 +324,7 @@ export interface ReviewActionResult {
|
|
|
324
324
|
/**
|
|
325
325
|
* Merged beef of competingTxs, valid when status is 'doubleSpend'.
|
|
326
326
|
*/
|
|
327
|
-
competingBeef?:
|
|
327
|
+
competingBeef?: BEEF
|
|
328
328
|
}
|
|
329
329
|
|
|
330
330
|
export interface SignableTransaction {
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const StorageDownloader_js_1 = require("../StorageDownloader.js");
|
|
7
|
-
const index_js_1 = require("../index.js");
|
|
8
|
-
const index_js_2 = require("../../overlay-tools/index.js");
|
|
9
|
-
const Transaction_js_1 = __importDefault(require("../../transaction/Transaction.js"));
|
|
10
|
-
const PushDrop_js_1 = __importDefault(require("../../script/templates/PushDrop.js"));
|
|
11
|
-
const index_js_3 = require("../../primitives/index.js");
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
jest.restoreAllMocks();
|
|
14
|
-
});
|
|
15
|
-
describe('StorageDownloader', () => {
|
|
16
|
-
let downloader;
|
|
17
|
-
beforeEach(() => {
|
|
18
|
-
// Create a fresh instance
|
|
19
|
-
downloader = new StorageDownloader_js_1.StorageDownloader();
|
|
20
|
-
});
|
|
21
|
-
describe('resolve()', () => {
|
|
22
|
-
it('throws if the lookup response is not "output-list"', async () => {
|
|
23
|
-
// Mock the LookupResolver to return something invalid
|
|
24
|
-
jest.spyOn(index_js_2.LookupResolver.prototype, 'query').mockResolvedValue({
|
|
25
|
-
type: 'something-else',
|
|
26
|
-
outputs: []
|
|
27
|
-
});
|
|
28
|
-
await expect(downloader.resolve('fakeUhrpUrl'))
|
|
29
|
-
.rejects
|
|
30
|
-
.toThrow('Lookup answer must be an output list');
|
|
31
|
-
});
|
|
32
|
-
it('decodes each output with Transaction.fromBEEF and PushDrop.decode', async () => {
|
|
33
|
-
// 1) Mock lookup response
|
|
34
|
-
jest.spyOn(index_js_2.LookupResolver.prototype, 'query').mockResolvedValue({
|
|
35
|
-
type: 'output-list',
|
|
36
|
-
outputs: [
|
|
37
|
-
{ beef: 'fake-beef-a', outputIndex: 0 },
|
|
38
|
-
{ beef: 'fake-beef-b', outputIndex: 1 }
|
|
39
|
-
]
|
|
40
|
-
});
|
|
41
|
-
// 2) Mock Transaction.fromBEEF -> returns a dummy transaction
|
|
42
|
-
jest.spyOn(Transaction_js_1.default, 'fromBEEF').mockImplementation(() => {
|
|
43
|
-
// Each transaction might have multiple outputs; we only care about `outputIndex`
|
|
44
|
-
return {
|
|
45
|
-
outputs: [
|
|
46
|
-
{ lockingScript: {} },
|
|
47
|
-
{ lockingScript: {} } // index 1
|
|
48
|
-
]
|
|
49
|
-
};
|
|
50
|
-
});
|
|
51
|
-
// 3) Mock PushDrop.decode -> returns { fields: number[][] }
|
|
52
|
-
jest.spyOn(PushDrop_js_1.default, 'decode').mockImplementation(() => {
|
|
53
|
-
// The decode function returns an object with `fields`,
|
|
54
|
-
return {
|
|
55
|
-
lockingPublicKey: {},
|
|
56
|
-
fields: [
|
|
57
|
-
[11],
|
|
58
|
-
[22],
|
|
59
|
-
[104, 116, 116, 112, 58, 47, 47, 97, 46, 99, 111, 109]
|
|
60
|
-
]
|
|
61
|
-
};
|
|
62
|
-
});
|
|
63
|
-
// 4) Mock Utils.toUTF8 to convert that number[] to a string
|
|
64
|
-
jest.spyOn(index_js_3.Utils, 'toUTF8').mockReturnValue('http://a.com');
|
|
65
|
-
const resolved = await downloader.resolve('fakeUhrpUrl');
|
|
66
|
-
expect(resolved).toEqual(['http://a.com', 'http://a.com']);
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
describe('download()', () => {
|
|
70
|
-
it('throws if UHRP URL is invalid', async () => {
|
|
71
|
-
jest.spyOn(index_js_1.StorageUtils, 'isValidURL').mockReturnValue(false);
|
|
72
|
-
await expect(downloader.download('invalidUrl'))
|
|
73
|
-
.rejects
|
|
74
|
-
.toThrow('Invalid parameter UHRP url');
|
|
75
|
-
});
|
|
76
|
-
it('throws if no hosts are found', async () => {
|
|
77
|
-
// Valid UHRP URL
|
|
78
|
-
jest.spyOn(index_js_1.StorageUtils, 'isValidURL').mockReturnValue(true);
|
|
79
|
-
// Return some random 32-byte hash so we can pass the check
|
|
80
|
-
jest.spyOn(index_js_1.StorageUtils, 'getHashFromURL').mockReturnValue(new Array(32).fill(0));
|
|
81
|
-
// Force resolve() to return an empty array
|
|
82
|
-
jest.spyOn(downloader, 'resolve').mockResolvedValue([]);
|
|
83
|
-
await expect(downloader.download('validButUnhostedUrl'))
|
|
84
|
-
.rejects
|
|
85
|
-
.toThrow('No one currently hosts this file!');
|
|
86
|
-
});
|
|
87
|
-
it('downloads successfully from the first working host', async () => {
|
|
88
|
-
jest.spyOn(index_js_1.StorageUtils, 'isValidURL').mockReturnValue(true);
|
|
89
|
-
const knownHash = [
|
|
90
|
-
102, 104, 122, 173, 248, 98, 189, 119, 108, 143,
|
|
91
|
-
193, 139, 142, 159, 142, 32, 8, 151, 20, 133,
|
|
92
|
-
110, 226, 51, 179, 144, 42, 89, 29, 13, 95,
|
|
93
|
-
41, 37
|
|
94
|
-
];
|
|
95
|
-
jest.spyOn(index_js_1.StorageUtils, 'getHashFromURL').mockReturnValue(knownHash);
|
|
96
|
-
// Suppose two possible download URLs
|
|
97
|
-
jest.spyOn(downloader, 'resolve').mockResolvedValue([
|
|
98
|
-
'http://host1/404',
|
|
99
|
-
'http://host2/ok'
|
|
100
|
-
]);
|
|
101
|
-
// The first fetch -> 404, second fetch -> success
|
|
102
|
-
const fetchSpy = jest.spyOn(global, 'fetch')
|
|
103
|
-
.mockResolvedValueOnce(new Response(null, { status: 404 }))
|
|
104
|
-
.mockResolvedValueOnce(new Response(new Uint8Array(32).fill(0), {
|
|
105
|
-
status: 200,
|
|
106
|
-
headers: { 'Content-Type': 'application/test' }
|
|
107
|
-
}));
|
|
108
|
-
const result = await downloader.download('validUrl');
|
|
109
|
-
expect(fetchSpy).toHaveBeenCalledTimes(2);
|
|
110
|
-
expect(result).toEqual({
|
|
111
|
-
data: new Array(32).fill(0),
|
|
112
|
-
mimeType: 'application/test'
|
|
113
|
-
});
|
|
114
|
-
});
|
|
115
|
-
it('throws if content hash mismatches the UHRP hash', async () => {
|
|
116
|
-
jest.spyOn(index_js_1.StorageUtils, 'isValidURL').mockReturnValue(true);
|
|
117
|
-
// The expected hash is all zeros
|
|
118
|
-
jest.spyOn(index_js_1.StorageUtils, 'getHashFromURL').mockReturnValue(new Array(32).fill(0));
|
|
119
|
-
// One potential host
|
|
120
|
-
jest.spyOn(downloader, 'resolve').mockResolvedValue([
|
|
121
|
-
'http://bad-content.test'
|
|
122
|
-
]);
|
|
123
|
-
// The fetch returns 32 bytes of all 1's => hash mismatch
|
|
124
|
-
jest.spyOn(global, 'fetch').mockResolvedValue(new Response(new Uint8Array(32).fill(1), { status: 200 }));
|
|
125
|
-
await expect(downloader.download('validButBadHashUrl'))
|
|
126
|
-
.rejects
|
|
127
|
-
.toThrow();
|
|
128
|
-
});
|
|
129
|
-
it('throws if all hosts fail or mismatch', async () => {
|
|
130
|
-
jest.spyOn(index_js_1.StorageUtils, 'isValidURL').mockReturnValue(true);
|
|
131
|
-
jest.spyOn(index_js_1.StorageUtils, 'getHashFromURL').mockReturnValue(new Array(32).fill(0));
|
|
132
|
-
jest.spyOn(downloader, 'resolve').mockResolvedValue([
|
|
133
|
-
'http://host1.test',
|
|
134
|
-
'http://host2.test'
|
|
135
|
-
]);
|
|
136
|
-
// Both fetches fail with 500 or something >=400
|
|
137
|
-
jest.spyOn(global, 'fetch').mockResolvedValue(new Response(null, { status: 500 }));
|
|
138
|
-
await expect(downloader.download('validButNoGoodHostUrl'))
|
|
139
|
-
.rejects
|
|
140
|
-
.toThrow('Unable to download content from validButNoGoodHostUrl');
|
|
141
|
-
});
|
|
142
|
-
it('throws if all entries are expired', async () => {
|
|
143
|
-
const currentTime = Math.floor(Date.now());
|
|
144
|
-
jest.spyOn(index_js_2.LookupResolver.prototype, 'query').mockResolvedValue({
|
|
145
|
-
type: 'output-list',
|
|
146
|
-
outputs: [
|
|
147
|
-
{ beef: 'fake-beef-a', outputIndex: 0 },
|
|
148
|
-
{ beef: 'fake-beef-b', outputIndex: 1 }
|
|
149
|
-
]
|
|
150
|
-
});
|
|
151
|
-
jest.spyOn(Transaction_js_1.default, 'fromBEEF').mockImplementation(() => {
|
|
152
|
-
return {
|
|
153
|
-
outputs: [
|
|
154
|
-
{ lockingScript: {} },
|
|
155
|
-
{ lockingScript: {} }
|
|
156
|
-
]
|
|
157
|
-
};
|
|
158
|
-
});
|
|
159
|
-
jest.spyOn(PushDrop_js_1.default, 'decode').mockImplementation(() => {
|
|
160
|
-
return {
|
|
161
|
-
lockingPublicKey: {},
|
|
162
|
-
fields: [[], [], [], [currentTime - 100]]
|
|
163
|
-
};
|
|
164
|
-
});
|
|
165
|
-
await expect(downloader.resolve('expiredUhrpUrl'))
|
|
166
|
-
.resolves
|
|
167
|
-
.toEqual(["", ""]);
|
|
168
|
-
});
|
|
169
|
-
});
|
|
170
|
-
});
|
|
171
|
-
//# sourceMappingURL=StorageDownloader.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StorageDownloader.test.js","sourceRoot":"","sources":["../../../../../src/storage/__test/StorageDownloader.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
-
};
|
|
28
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
const StorageUploader_js_1 = require("../StorageUploader.js");
|
|
30
|
-
const StorageUtils = __importStar(require("../StorageUtils.js"));
|
|
31
|
-
const WalletClient_js_1 = __importDefault(require("../../wallet/WalletClient.js"));
|
|
32
|
-
/**
|
|
33
|
-
* A helper for converting a string to a number[] of UTF-8 bytes
|
|
34
|
-
*/
|
|
35
|
-
function stringToUtf8Array(str) {
|
|
36
|
-
return Array.from(new TextEncoder().encode(str));
|
|
37
|
-
}
|
|
38
|
-
describe('StorageUploader Tests', () => {
|
|
39
|
-
let uploader;
|
|
40
|
-
let walletClient;
|
|
41
|
-
// We'll have TWO spies:
|
|
42
|
-
let authFetchSpy;
|
|
43
|
-
let globalFetchSpy;
|
|
44
|
-
beforeEach(() => {
|
|
45
|
-
walletClient = new WalletClient_js_1.default('json-api', 'non-admin.com');
|
|
46
|
-
uploader = new StorageUploader_js_1.StorageUploader({
|
|
47
|
-
storageURL: 'https://example.test.system',
|
|
48
|
-
wallet: walletClient
|
|
49
|
-
});
|
|
50
|
-
// 1) Spy on the "authFetch.fetch" calls for /find, /list, /renew
|
|
51
|
-
authFetchSpy = jest
|
|
52
|
-
.spyOn(uploader['authFetch'], 'fetch')
|
|
53
|
-
.mockResolvedValue(new Response(null, { status: 200 }));
|
|
54
|
-
// 2) Spy on the global "fetch" calls for file upload (uploadFile)
|
|
55
|
-
globalFetchSpy = jest
|
|
56
|
-
.spyOn(global, 'fetch')
|
|
57
|
-
.mockResolvedValue(new Response(null, { status: 200 }));
|
|
58
|
-
});
|
|
59
|
-
afterEach(() => {
|
|
60
|
-
jest.restoreAllMocks();
|
|
61
|
-
});
|
|
62
|
-
it('should upload a file, produce a valid UHRP URL, and decode it to the known SHA-256', async () => {
|
|
63
|
-
const data = stringToUtf8Array('Hello, world!');
|
|
64
|
-
// Mock out getUploadInfo so we can control the returned upload/public URLs
|
|
65
|
-
jest.spyOn(uploader, 'getUploadInfo').mockResolvedValue({
|
|
66
|
-
uploadURL: 'https://example-upload.com/put'
|
|
67
|
-
});
|
|
68
|
-
const result = await uploader.publishFile({
|
|
69
|
-
file: { data, type: 'text/plain' },
|
|
70
|
-
retentionPeriod: 7
|
|
71
|
-
});
|
|
72
|
-
// This direct upload uses global.fetch, not authFetch
|
|
73
|
-
expect(globalFetchSpy).toHaveBeenCalledTimes(1);
|
|
74
|
-
// Check the result
|
|
75
|
-
expect(StorageUtils.isValidURL(result.uhrpURL)).toBe(true);
|
|
76
|
-
expect(result.published).toBe(true);
|
|
77
|
-
const url = StorageUtils.getHashFromURL(result.uhrpURL);
|
|
78
|
-
const firstFour = url.slice(0, 4)
|
|
79
|
-
.map(b => b.toString(16).padStart(2, '0'))
|
|
80
|
-
.join('');
|
|
81
|
-
expect(firstFour).toHaveLength(8);
|
|
82
|
-
});
|
|
83
|
-
it('should throw if the upload fails with HTTP 500', async () => {
|
|
84
|
-
// Force the direct upload (global fetch) to fail
|
|
85
|
-
globalFetchSpy.mockResolvedValueOnce(new Response(null, { status: 500 }));
|
|
86
|
-
// Also mock getUploadInfo
|
|
87
|
-
jest.spyOn(uploader, 'getUploadInfo').mockResolvedValue({
|
|
88
|
-
uploadURL: 'https://example-upload.com/put'
|
|
89
|
-
});
|
|
90
|
-
const failingData = stringToUtf8Array('failing data');
|
|
91
|
-
await expect(uploader.publishFile({
|
|
92
|
-
file: { data: failingData, type: 'text/plain' },
|
|
93
|
-
retentionPeriod: 30
|
|
94
|
-
})).rejects.toThrow('File upload failed: HTTP 500');
|
|
95
|
-
});
|
|
96
|
-
it('should find a file and return metadata', async () => {
|
|
97
|
-
// This route goes through authFetch, not global fetch
|
|
98
|
-
authFetchSpy.mockResolvedValueOnce(new Response(JSON.stringify({
|
|
99
|
-
status: 'success',
|
|
100
|
-
data: {
|
|
101
|
-
name: 'cdn/abc123',
|
|
102
|
-
size: '1024',
|
|
103
|
-
mimeType: 'text/plain',
|
|
104
|
-
expiryTime: 123456
|
|
105
|
-
}
|
|
106
|
-
}), { status: 200 }));
|
|
107
|
-
const fileData = await uploader.findFile('uhrp://some-hash');
|
|
108
|
-
expect(authFetchSpy).toHaveBeenCalledTimes(1);
|
|
109
|
-
expect(fileData.name).toBe('cdn/abc123');
|
|
110
|
-
expect(fileData.size).toBe('1024');
|
|
111
|
-
expect(fileData.mimeType).toBe('text/plain');
|
|
112
|
-
expect(fileData.expiryTime).toBe(123456);
|
|
113
|
-
});
|
|
114
|
-
it('should throw an error if findFile returns an error status', async () => {
|
|
115
|
-
authFetchSpy.mockResolvedValueOnce(new Response(JSON.stringify({ status: 'error', code: 'ERR_NOT_FOUND', description: 'File not found' }), { status: 200 }));
|
|
116
|
-
await expect(uploader.findFile('uhrp://unknown-hash'))
|
|
117
|
-
.rejects
|
|
118
|
-
.toThrow('findFile returned an error: ERR_NOT_FOUND - File not found');
|
|
119
|
-
});
|
|
120
|
-
it('should list user uploads successfully', async () => {
|
|
121
|
-
// /list uses authFetch
|
|
122
|
-
const mockUploads = [
|
|
123
|
-
{ uhrpUrl: 'uhrp://hash1', expiryTime: 111111 },
|
|
124
|
-
{ uhrpUrl: 'uhrp://hash2', expiryTime: 222222 }
|
|
125
|
-
];
|
|
126
|
-
authFetchSpy.mockResolvedValueOnce(new Response(JSON.stringify({ status: 'success', uploads: mockUploads }), { status: 200 }));
|
|
127
|
-
const result = await uploader.listUploads();
|
|
128
|
-
expect(authFetchSpy).toHaveBeenCalledTimes(1);
|
|
129
|
-
expect(result).toEqual(mockUploads);
|
|
130
|
-
});
|
|
131
|
-
it('should throw an error if listUploads returns an error', async () => {
|
|
132
|
-
authFetchSpy.mockResolvedValueOnce(new Response(JSON.stringify({ status: 'error', code: 'ERR_INTERNAL', description: 'Something broke' }), { status: 200 }));
|
|
133
|
-
await expect(uploader.listUploads()).rejects.toThrow('listUploads returned an error: ERR_INTERNAL - Something broke');
|
|
134
|
-
});
|
|
135
|
-
it('should renew a file and return the new expiry info', async () => {
|
|
136
|
-
// /renew uses authFetch
|
|
137
|
-
authFetchSpy.mockResolvedValueOnce(new Response(JSON.stringify({
|
|
138
|
-
status: 'success',
|
|
139
|
-
prevExpiryTime: 123,
|
|
140
|
-
newExpiryTime: 456,
|
|
141
|
-
amount: 99
|
|
142
|
-
}), { status: 200 }));
|
|
143
|
-
const renewal = await uploader.renewFile('uhrp://some-hash', 30);
|
|
144
|
-
expect(authFetchSpy).toHaveBeenCalledTimes(1);
|
|
145
|
-
expect(renewal.status).toBe('success');
|
|
146
|
-
expect(renewal.prevExpiryTime).toBe(123);
|
|
147
|
-
expect(renewal.newExpiryTime).toBe(456);
|
|
148
|
-
expect(renewal.amount).toBe(99);
|
|
149
|
-
});
|
|
150
|
-
it('should throw an error if renewFile returns error status JSON', async () => {
|
|
151
|
-
authFetchSpy.mockResolvedValueOnce(new Response(JSON.stringify({ status: 'error', code: 'ERR_CANT_RENEW', description: 'Failed to renew' }), { status: 200 }));
|
|
152
|
-
await expect(uploader.renewFile('uhrp://some-other-hash', 15))
|
|
153
|
-
.rejects
|
|
154
|
-
.toThrow('renewFile returned an error: ERR_CANT_RENEW - Failed to renew');
|
|
155
|
-
});
|
|
156
|
-
it('should throw if renewFile request fails with non-200 status', async () => {
|
|
157
|
-
authFetchSpy.mockResolvedValueOnce(new Response(null, { status: 404 }));
|
|
158
|
-
await expect(uploader.renewFile('uhrp://ghost', 10))
|
|
159
|
-
.rejects
|
|
160
|
-
.toThrow('renewFile request failed: HTTP 404');
|
|
161
|
-
});
|
|
162
|
-
});
|
|
163
|
-
//# sourceMappingURL=StorageUploader.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StorageUploader.test.js","sourceRoot":"","sources":["../../../../../src/storage/__test/StorageUploader.test.ts"],"names":[],"mappings":"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"}
|