@bsv/sdk 1.3.12 → 1.3.14
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/package.json +15 -3
- package/dist/cjs/src/auth/Peer.js +83 -57
- package/dist/cjs/src/auth/Peer.js.map +1 -1
- package/dist/cjs/src/auth/SessionManager.js +14 -9
- package/dist/cjs/src/auth/SessionManager.js.map +1 -1
- package/dist/cjs/src/auth/certificates/Certificate.js +16 -10
- package/dist/cjs/src/auth/certificates/Certificate.js.map +1 -1
- package/dist/cjs/src/auth/certificates/MasterCertificate.js +25 -23
- package/dist/cjs/src/auth/certificates/MasterCertificate.js.map +1 -1
- package/dist/cjs/src/auth/certificates/VerifiableCertificate.js +2 -2
- package/dist/cjs/src/auth/certificates/VerifiableCertificate.js.map +1 -1
- package/dist/cjs/src/auth/certificates/__tests/CompletedProtoWallet.js +62 -46
- package/dist/cjs/src/auth/certificates/__tests/CompletedProtoWallet.js.map +1 -1
- package/dist/cjs/src/auth/clients/AuthFetch.js +1 -0
- package/dist/cjs/src/auth/clients/AuthFetch.js.map +1 -1
- package/dist/cjs/src/auth/transports/SimplifiedFetchTransport.js +70 -43
- package/dist/cjs/src/auth/transports/SimplifiedFetchTransport.js.map +1 -1
- package/dist/cjs/src/auth/utils/createNonce.js +2 -1
- package/dist/cjs/src/auth/utils/createNonce.js.map +1 -1
- package/dist/cjs/src/auth/utils/getVerifiableCertificates.js.map +1 -1
- package/dist/cjs/src/auth/utils/validateCertificates.js +5 -2
- package/dist/cjs/src/auth/utils/validateCertificates.js.map +1 -1
- package/dist/cjs/src/auth/utils/verifyNonce.js +2 -1
- package/dist/cjs/src/auth/utils/verifyNonce.js.map +1 -1
- package/dist/cjs/src/compat/BSM.js +7 -17
- package/dist/cjs/src/compat/BSM.js.map +1 -1
- package/dist/cjs/src/compat/ECIES.js +172 -133
- package/dist/cjs/src/compat/ECIES.js.map +1 -1
- package/dist/cjs/src/compat/HD.js +63 -73
- package/dist/cjs/src/compat/HD.js.map +1 -1
- package/dist/cjs/src/compat/Mnemonic.js +102 -106
- package/dist/cjs/src/compat/Mnemonic.js.map +1 -1
- package/dist/cjs/src/compat/Utxo.js +2 -2
- package/dist/cjs/src/compat/Utxo.js.map +1 -1
- package/dist/cjs/src/compat/index.js +7 -17
- package/dist/cjs/src/compat/index.js.map +1 -1
- package/dist/cjs/src/messages/EncryptedMessage.js +3 -1
- package/dist/cjs/src/messages/EncryptedMessage.js.map +1 -1
- package/dist/cjs/src/messages/SignedMessage.js +1 -0
- package/dist/cjs/src/messages/SignedMessage.js.map +1 -1
- package/dist/cjs/src/messages/index.js +7 -17
- package/dist/cjs/src/messages/index.js.map +1 -1
- package/dist/cjs/src/overlay-tools/LookupResolver.js +54 -35
- package/dist/cjs/src/overlay-tools/LookupResolver.js.map +1 -1
- package/dist/cjs/src/overlay-tools/OverlayAdminTokenTemplate.js +32 -20
- package/dist/cjs/src/overlay-tools/OverlayAdminTokenTemplate.js.map +1 -1
- package/dist/cjs/src/overlay-tools/SHIPBroadcaster.js +40 -28
- package/dist/cjs/src/overlay-tools/SHIPBroadcaster.js.map +1 -1
- package/dist/cjs/src/primitives/AESGCM.js +6 -5
- package/dist/cjs/src/primitives/AESGCM.js.map +1 -1
- package/dist/cjs/src/primitives/BasePoint.js +1 -1
- package/dist/cjs/src/primitives/BasePoint.js.map +1 -1
- package/dist/cjs/src/primitives/BigNumber.js +50 -62
- package/dist/cjs/src/primitives/BigNumber.js.map +1 -1
- package/dist/cjs/src/primitives/Curve.js +46 -22
- package/dist/cjs/src/primitives/Curve.js.map +1 -1
- package/dist/cjs/src/primitives/DRBG.js +2 -8
- package/dist/cjs/src/primitives/DRBG.js.map +1 -1
- package/dist/cjs/src/primitives/ECDSA.js +51 -35
- package/dist/cjs/src/primitives/ECDSA.js.map +1 -1
- package/dist/cjs/src/primitives/Hash.js +191 -216
- package/dist/cjs/src/primitives/Hash.js.map +1 -1
- package/dist/cjs/src/primitives/JacobianPoint.js +19 -5
- 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 +117 -88
- package/dist/cjs/src/primitives/Point.js.map +1 -1
- package/dist/cjs/src/primitives/Polynomial.js +4 -2
- package/dist/cjs/src/primitives/Polynomial.js.map +1 -1
- package/dist/cjs/src/primitives/PrivateKey.js +32 -33
- package/dist/cjs/src/primitives/PrivateKey.js.map +1 -1
- package/dist/cjs/src/primitives/PublicKey.js.map +1 -1
- package/dist/cjs/src/primitives/Random.js +6 -5
- package/dist/cjs/src/primitives/Random.js.map +1 -1
- package/dist/cjs/src/primitives/ReductionContext.js +1 -1
- package/dist/cjs/src/primitives/ReductionContext.js.map +1 -1
- package/dist/cjs/src/primitives/Schnorr.js +21 -15
- package/dist/cjs/src/primitives/Schnorr.js.map +1 -1
- package/dist/cjs/src/primitives/Signature.js +8 -7
- package/dist/cjs/src/primitives/Signature.js.map +1 -1
- package/dist/cjs/src/primitives/SymmetricKey.js +13 -13
- package/dist/cjs/src/primitives/SymmetricKey.js.map +1 -1
- package/dist/cjs/src/primitives/TransactionSignature.js +31 -29
- package/dist/cjs/src/primitives/TransactionSignature.js.map +1 -1
- package/dist/cjs/src/primitives/index.js +7 -17
- package/dist/cjs/src/primitives/index.js.map +1 -1
- package/dist/cjs/src/primitives/utils.js +79 -68
- package/dist/cjs/src/primitives/utils.js.map +1 -1
- package/dist/cjs/src/script/OP.js +3 -3
- package/dist/cjs/src/script/OP.js.map +1 -1
- package/dist/cjs/src/script/Script.js +12 -10
- package/dist/cjs/src/script/Script.js.map +1 -1
- package/dist/cjs/src/script/Spend.js +47 -49
- package/dist/cjs/src/script/Spend.js.map +1 -1
- package/dist/cjs/src/script/templates/P2PKH.js +24 -12
- package/dist/cjs/src/script/templates/P2PKH.js.map +1 -1
- package/dist/cjs/src/script/templates/PushDrop.js +28 -23
- package/dist/cjs/src/script/templates/PushDrop.js.map +1 -1
- package/dist/cjs/src/script/templates/RPuzzle.js +10 -6
- package/dist/cjs/src/script/templates/RPuzzle.js.map +1 -1
- package/dist/cjs/src/totp/totp.js +2 -1
- package/dist/cjs/src/totp/totp.js.map +1 -1
- package/dist/cjs/src/transaction/Beef.js +177 -154
- package/dist/cjs/src/transaction/Beef.js.map +1 -1
- package/dist/cjs/src/transaction/BeefParty.js +24 -24
- package/dist/cjs/src/transaction/BeefParty.js.map +1 -1
- package/dist/cjs/src/transaction/BeefTx.js +26 -18
- package/dist/cjs/src/transaction/BeefTx.js.map +1 -1
- package/dist/cjs/src/transaction/Broadcaster.js +3 -2
- package/dist/cjs/src/transaction/Broadcaster.js.map +1 -1
- package/dist/cjs/src/transaction/MerklePath.js +64 -37
- package/dist/cjs/src/transaction/MerklePath.js.map +1 -1
- package/dist/cjs/src/transaction/Transaction.js +111 -137
- package/dist/cjs/src/transaction/Transaction.js.map +1 -1
- package/dist/cjs/src/transaction/broadcasters/ARC.js +25 -16
- package/dist/cjs/src/transaction/broadcasters/ARC.js.map +1 -1
- package/dist/cjs/src/transaction/broadcasters/DefaultBroadcaster.js +2 -1
- package/dist/cjs/src/transaction/broadcasters/DefaultBroadcaster.js.map +1 -1
- package/dist/cjs/src/transaction/broadcasters/WhatsOnChainBroadcaster.js.map +1 -1
- package/dist/cjs/src/transaction/chaintrackers/DefaultChainTracker.js +2 -1
- package/dist/cjs/src/transaction/chaintrackers/DefaultChainTracker.js.map +1 -1
- package/dist/cjs/src/transaction/chaintrackers/WhatsOnChain.js +3 -3
- package/dist/cjs/src/transaction/chaintrackers/WhatsOnChain.js.map +1 -1
- package/dist/cjs/src/transaction/fee-models/SatoshisPerKilobyte.js.map +1 -1
- package/dist/cjs/src/transaction/http/DefaultHttpClient.js +5 -3
- package/dist/cjs/src/transaction/http/DefaultHttpClient.js.map +1 -1
- package/dist/cjs/src/transaction/http/FetchHttpClient.js +5 -2
- package/dist/cjs/src/transaction/http/FetchHttpClient.js.map +1 -1
- package/dist/cjs/src/transaction/http/NodejsHttpClient.js +5 -3
- package/dist/cjs/src/transaction/http/NodejsHttpClient.js.map +1 -1
- package/dist/cjs/src/transaction/http/index.js.map +1 -1
- package/dist/cjs/src/transaction/index.js.map +1 -1
- package/dist/cjs/src/wallet/CachedKeyDeriver.js +91 -66
- package/dist/cjs/src/wallet/CachedKeyDeriver.js.map +1 -1
- package/dist/cjs/src/wallet/KeyDeriver.js +61 -52
- package/dist/cjs/src/wallet/KeyDeriver.js.map +1 -1
- package/dist/cjs/src/wallet/ProtoWallet.js +79 -29
- package/dist/cjs/src/wallet/ProtoWallet.js.map +1 -1
- package/dist/cjs/src/wallet/WalletClient.js +7 -2
- package/dist/cjs/src/wallet/WalletClient.js.map +1 -1
- package/dist/cjs/src/wallet/WalletError.js +2 -2
- package/dist/cjs/src/wallet/WalletError.js.map +1 -1
- package/dist/cjs/src/wallet/substrates/HTTPWalletJSON.js +4 -3
- package/dist/cjs/src/wallet/substrates/HTTPWalletJSON.js.map +1 -1
- package/dist/cjs/src/wallet/substrates/HTTPWalletWire.js +2 -2
- package/dist/cjs/src/wallet/substrates/HTTPWalletWire.js.map +1 -1
- package/dist/cjs/src/wallet/substrates/WalletWireProcessor.js +1239 -1261
- package/dist/cjs/src/wallet/substrates/WalletWireProcessor.js.map +1 -1
- package/dist/cjs/src/wallet/substrates/WalletWireTransceiver.js +102 -43
- package/dist/cjs/src/wallet/substrates/WalletWireTransceiver.js.map +1 -1
- package/dist/cjs/src/wallet/substrates/XDM.js +8 -3
- package/dist/cjs/src/wallet/substrates/XDM.js.map +1 -1
- package/dist/cjs/src/wallet/substrates/window.CWI.js +28 -28
- package/dist/cjs/src/wallet/substrates/window.CWI.js.map +1 -1
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/esm/mod.js +15 -15
- package/dist/esm/src/auth/Peer.js +75 -54
- package/dist/esm/src/auth/Peer.js.map +1 -1
- package/dist/esm/src/auth/SessionManager.js +14 -9
- package/dist/esm/src/auth/SessionManager.js.map +1 -1
- package/dist/esm/src/auth/certificates/Certificate.js +15 -11
- package/dist/esm/src/auth/certificates/Certificate.js.map +1 -1
- package/dist/esm/src/auth/certificates/MasterCertificate.js +25 -23
- package/dist/esm/src/auth/certificates/MasterCertificate.js.map +1 -1
- package/dist/esm/src/auth/certificates/VerifiableCertificate.js +2 -2
- package/dist/esm/src/auth/certificates/VerifiableCertificate.js.map +1 -1
- package/dist/esm/src/auth/certificates/__tests/CompletedProtoWallet.js +64 -47
- package/dist/esm/src/auth/certificates/__tests/CompletedProtoWallet.js.map +1 -1
- package/dist/esm/src/auth/clients/AuthFetch.js +1 -0
- package/dist/esm/src/auth/clients/AuthFetch.js.map +1 -1
- package/dist/esm/src/auth/transports/SimplifiedFetchTransport.js +69 -43
- package/dist/esm/src/auth/transports/SimplifiedFetchTransport.js.map +1 -1
- package/dist/esm/src/auth/utils/createNonce.js.map +1 -1
- package/dist/esm/src/auth/utils/getVerifiableCertificates.js +1 -1
- package/dist/esm/src/auth/utils/getVerifiableCertificates.js.map +1 -1
- package/dist/esm/src/auth/utils/validateCertificates.js +6 -3
- package/dist/esm/src/auth/utils/validateCertificates.js.map +1 -1
- package/dist/esm/src/auth/utils/verifyNonce.js.map +1 -1
- package/dist/esm/src/compat/BSM.js.map +1 -1
- package/dist/esm/src/compat/ECIES.js +165 -116
- package/dist/esm/src/compat/ECIES.js.map +1 -1
- package/dist/esm/src/compat/HD.js +56 -56
- package/dist/esm/src/compat/HD.js.map +1 -1
- package/dist/esm/src/compat/Mnemonic.js +95 -89
- package/dist/esm/src/compat/Mnemonic.js.map +1 -1
- package/dist/esm/src/compat/Utxo.js +1 -1
- package/dist/esm/src/compat/Utxo.js.map +1 -1
- package/dist/esm/src/messages/EncryptedMessage.js +3 -1
- package/dist/esm/src/messages/EncryptedMessage.js.map +1 -1
- package/dist/esm/src/messages/SignedMessage.js +1 -0
- package/dist/esm/src/messages/SignedMessage.js.map +1 -1
- package/dist/esm/src/overlay-tools/LookupResolver.js +53 -35
- package/dist/esm/src/overlay-tools/LookupResolver.js.map +1 -1
- package/dist/esm/src/overlay-tools/OverlayAdminTokenTemplate.js +32 -20
- package/dist/esm/src/overlay-tools/OverlayAdminTokenTemplate.js.map +1 -1
- package/dist/esm/src/overlay-tools/SHIPBroadcaster.js +40 -28
- package/dist/esm/src/overlay-tools/SHIPBroadcaster.js.map +1 -1
- package/dist/esm/src/primitives/AESGCM.js +1 -0
- package/dist/esm/src/primitives/AESGCM.js.map +1 -1
- package/dist/esm/src/primitives/BasePoint.js +1 -1
- package/dist/esm/src/primitives/BasePoint.js.map +1 -1
- package/dist/esm/src/primitives/BigNumber.js +50 -62
- package/dist/esm/src/primitives/BigNumber.js.map +1 -1
- package/dist/esm/src/primitives/Curve.js +45 -22
- package/dist/esm/src/primitives/Curve.js.map +1 -1
- package/dist/esm/src/primitives/DRBG.js +2 -8
- package/dist/esm/src/primitives/DRBG.js.map +1 -1
- package/dist/esm/src/primitives/ECDSA.js +50 -35
- package/dist/esm/src/primitives/ECDSA.js.map +1 -1
- package/dist/esm/src/primitives/Hash.js +188 -213
- package/dist/esm/src/primitives/Hash.js.map +1 -1
- package/dist/esm/src/primitives/JacobianPoint.js +18 -5
- 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 +107 -88
- package/dist/esm/src/primitives/Point.js.map +1 -1
- package/dist/esm/src/primitives/Polynomial.js +4 -2
- package/dist/esm/src/primitives/Polynomial.js.map +1 -1
- package/dist/esm/src/primitives/PrivateKey.js +25 -16
- package/dist/esm/src/primitives/PrivateKey.js.map +1 -1
- package/dist/esm/src/primitives/PublicKey.js.map +1 -1
- package/dist/esm/src/primitives/Random.js +7 -6
- package/dist/esm/src/primitives/Random.js.map +1 -1
- package/dist/esm/src/primitives/ReductionContext.js +1 -1
- package/dist/esm/src/primitives/ReductionContext.js.map +1 -1
- package/dist/esm/src/primitives/Schnorr.js +21 -15
- package/dist/esm/src/primitives/Schnorr.js.map +1 -1
- package/dist/esm/src/primitives/Signature.js +8 -7
- package/dist/esm/src/primitives/Signature.js.map +1 -1
- package/dist/esm/src/primitives/SymmetricKey.js +13 -13
- package/dist/esm/src/primitives/SymmetricKey.js.map +1 -1
- package/dist/esm/src/primitives/TransactionSignature.js +22 -12
- package/dist/esm/src/primitives/TransactionSignature.js.map +1 -1
- package/dist/esm/src/primitives/utils.js +76 -66
- package/dist/esm/src/primitives/utils.js.map +1 -1
- package/dist/esm/src/script/OP.js +3 -3
- package/dist/esm/src/script/OP.js.map +1 -1
- package/dist/esm/src/script/Script.js +12 -10
- package/dist/esm/src/script/Script.js.map +1 -1
- package/dist/esm/src/script/Spend.js +39 -32
- package/dist/esm/src/script/Spend.js.map +1 -1
- package/dist/esm/src/script/templates/P2PKH.js +26 -11
- package/dist/esm/src/script/templates/P2PKH.js.map +1 -1
- package/dist/esm/src/script/templates/PushDrop.js +29 -22
- package/dist/esm/src/script/templates/PushDrop.js.map +1 -1
- package/dist/esm/src/script/templates/RPuzzle.js +11 -6
- package/dist/esm/src/script/templates/RPuzzle.js.map +1 -1
- package/dist/esm/src/totp/totp.js +2 -1
- package/dist/esm/src/totp/totp.js.map +1 -1
- package/dist/esm/src/transaction/Beef.js +176 -154
- package/dist/esm/src/transaction/Beef.js.map +1 -1
- package/dist/esm/src/transaction/BeefParty.js +24 -24
- package/dist/esm/src/transaction/BeefParty.js.map +1 -1
- package/dist/esm/src/transaction/BeefTx.js +26 -18
- package/dist/esm/src/transaction/BeefTx.js.map +1 -1
- package/dist/esm/src/transaction/Broadcaster.js.map +1 -1
- package/dist/esm/src/transaction/MerklePath.js +61 -36
- package/dist/esm/src/transaction/MerklePath.js.map +1 -1
- package/dist/esm/src/transaction/Transaction.js +105 -138
- package/dist/esm/src/transaction/Transaction.js.map +1 -1
- package/dist/esm/src/transaction/broadcasters/ARC.js +25 -16
- package/dist/esm/src/transaction/broadcasters/ARC.js.map +1 -1
- package/dist/esm/src/transaction/broadcasters/DefaultBroadcaster.js.map +1 -1
- package/dist/esm/src/transaction/broadcasters/WhatsOnChainBroadcaster.js.map +1 -1
- package/dist/esm/src/transaction/chaintrackers/WhatsOnChain.js +3 -3
- package/dist/esm/src/transaction/chaintrackers/WhatsOnChain.js.map +1 -1
- package/dist/esm/src/transaction/fee-models/SatoshisPerKilobyte.js.map +1 -1
- package/dist/esm/src/transaction/http/DefaultHttpClient.js +3 -2
- package/dist/esm/src/transaction/http/DefaultHttpClient.js.map +1 -1
- package/dist/esm/src/transaction/http/FetchHttpClient.js +4 -2
- package/dist/esm/src/transaction/http/FetchHttpClient.js.map +1 -1
- package/dist/esm/src/transaction/http/NodejsHttpClient.js +5 -3
- package/dist/esm/src/transaction/http/NodejsHttpClient.js.map +1 -1
- package/dist/esm/src/transaction/http/index.js.map +1 -1
- package/dist/esm/src/transaction/index.js.map +1 -1
- package/dist/esm/src/wallet/CachedKeyDeriver.js +91 -66
- package/dist/esm/src/wallet/CachedKeyDeriver.js.map +1 -1
- package/dist/esm/src/wallet/KeyDeriver.js +60 -52
- package/dist/esm/src/wallet/KeyDeriver.js.map +1 -1
- package/dist/esm/src/wallet/ProtoWallet.js +75 -29
- package/dist/esm/src/wallet/ProtoWallet.js.map +1 -1
- package/dist/esm/src/wallet/WalletClient.js +7 -2
- package/dist/esm/src/wallet/WalletClient.js.map +1 -1
- package/dist/esm/src/wallet/WalletError.js +2 -2
- package/dist/esm/src/wallet/WalletError.js.map +1 -1
- package/dist/esm/src/wallet/substrates/HTTPWalletJSON.js +4 -4
- package/dist/esm/src/wallet/substrates/HTTPWalletJSON.js.map +1 -1
- package/dist/esm/src/wallet/substrates/HTTPWalletWire.js +2 -2
- package/dist/esm/src/wallet/substrates/HTTPWalletWire.js.map +1 -1
- package/dist/esm/src/wallet/substrates/WalletWireProcessor.js +1239 -1261
- package/dist/esm/src/wallet/substrates/WalletWireProcessor.js.map +1 -1
- package/dist/esm/src/wallet/substrates/WalletWireTransceiver.js +95 -43
- package/dist/esm/src/wallet/substrates/WalletWireTransceiver.js.map +1 -1
- package/dist/esm/src/wallet/substrates/XDM.js +8 -3
- package/dist/esm/src/wallet/substrates/XDM.js.map +1 -1
- package/dist/esm/src/wallet/substrates/window.CWI.js +28 -28
- package/dist/esm/src/wallet/substrates/window.CWI.js.map +1 -1
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/types/mod.d.ts +15 -15
- package/dist/types/src/auth/Peer.d.ts +10 -10
- package/dist/types/src/auth/Peer.d.ts.map +1 -1
- package/dist/types/src/auth/SessionManager.d.ts +4 -4
- package/dist/types/src/auth/SessionManager.d.ts.map +1 -1
- package/dist/types/src/auth/certificates/Certificate.d.ts +6 -6
- package/dist/types/src/auth/certificates/Certificate.d.ts.map +1 -1
- package/dist/types/src/auth/certificates/MasterCertificate.d.ts +5 -5
- package/dist/types/src/auth/certificates/MasterCertificate.d.ts.map +1 -1
- package/dist/types/src/auth/certificates/VerifiableCertificate.d.ts.map +1 -1
- package/dist/types/src/auth/certificates/__tests/CompletedProtoWallet.d.ts +23 -22
- package/dist/types/src/auth/certificates/__tests/CompletedProtoWallet.d.ts.map +1 -1
- package/dist/types/src/auth/clients/AuthFetch.d.ts.map +1 -1
- package/dist/types/src/auth/transports/SimplifiedFetchTransport.d.ts +1 -1
- package/dist/types/src/auth/transports/SimplifiedFetchTransport.d.ts.map +1 -1
- package/dist/types/src/auth/utils/createNonce.d.ts.map +1 -1
- package/dist/types/src/auth/utils/getVerifiableCertificates.d.ts +3 -3
- package/dist/types/src/auth/utils/getVerifiableCertificates.d.ts.map +1 -1
- package/dist/types/src/auth/utils/validateCertificates.d.ts +2 -2
- package/dist/types/src/auth/utils/validateCertificates.d.ts.map +1 -1
- package/dist/types/src/auth/utils/verifyNonce.d.ts +1 -1
- package/dist/types/src/auth/utils/verifyNonce.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/compat/ECIES.d.ts +36 -36
- package/dist/types/src/compat/ECIES.d.ts.map +1 -1
- package/dist/types/src/compat/HD.d.ts +51 -51
- package/dist/types/src/compat/HD.d.ts.map +1 -1
- package/dist/types/src/compat/Mnemonic.d.ts +79 -79
- package/dist/types/src/compat/Mnemonic.d.ts.map +1 -1
- package/dist/types/src/compat/Utxo.d.ts.map +1 -1
- 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/overlay-tools/LookupResolver.d.ts +9 -9
- package/dist/types/src/overlay-tools/LookupResolver.d.ts.map +1 -1
- package/dist/types/src/overlay-tools/OverlayAdminTokenTemplate.d.ts +17 -17
- package/dist/types/src/overlay-tools/OverlayAdminTokenTemplate.d.ts.map +1 -1
- package/dist/types/src/overlay-tools/SHIPBroadcaster.d.ts +14 -14
- package/dist/types/src/overlay-tools/SHIPBroadcaster.d.ts.map +1 -1
- package/dist/types/src/primitives/AESGCM.d.ts.map +1 -1
- package/dist/types/src/primitives/BasePoint.d.ts +8 -8
- package/dist/types/src/primitives/BasePoint.d.ts.map +1 -1
- package/dist/types/src/primitives/BigNumber.d.ts.map +1 -1
- package/dist/types/src/primitives/Curve.d.ts +14 -7
- package/dist/types/src/primitives/Curve.d.ts.map +1 -1
- package/dist/types/src/primitives/DRBG.d.ts.map +1 -1
- package/dist/types/src/primitives/ECDSA.d.ts +1 -1
- package/dist/types/src/primitives/ECDSA.d.ts.map +1 -1
- package/dist/types/src/primitives/Hash.d.ts +11 -11
- package/dist/types/src/primitives/Hash.d.ts.map +1 -1
- package/dist/types/src/primitives/JacobianPoint.d.ts.map +1 -1
- package/dist/types/src/primitives/Point.d.ts +14 -10
- package/dist/types/src/primitives/Point.d.ts.map +1 -1
- package/dist/types/src/primitives/Polynomial.d.ts.map +1 -1
- package/dist/types/src/primitives/PrivateKey.d.ts +2 -2
- package/dist/types/src/primitives/PrivateKey.d.ts.map +1 -1
- package/dist/types/src/primitives/PublicKey.d.ts.map +1 -1
- package/dist/types/src/primitives/Random.d.ts.map +1 -1
- package/dist/types/src/primitives/Schnorr.d.ts +14 -14
- package/dist/types/src/primitives/Schnorr.d.ts.map +1 -1
- package/dist/types/src/primitives/Signature.d.ts +1 -1
- package/dist/types/src/primitives/Signature.d.ts.map +1 -1
- package/dist/types/src/primitives/SymmetricKey.d.ts +13 -13
- package/dist/types/src/primitives/SymmetricKey.d.ts.map +1 -1
- package/dist/types/src/primitives/TransactionSignature.d.ts +4 -4
- package/dist/types/src/primitives/TransactionSignature.d.ts.map +1 -1
- package/dist/types/src/primitives/utils.d.ts +3 -6
- package/dist/types/src/primitives/utils.d.ts.map +1 -1
- package/dist/types/src/script/Script.d.ts +3 -3
- package/dist/types/src/script/Script.d.ts.map +1 -1
- package/dist/types/src/script/ScriptTemplate.d.ts +2 -2
- package/dist/types/src/script/ScriptTemplate.d.ts.map +1 -1
- package/dist/types/src/script/Spend.d.ts.map +1 -1
- package/dist/types/src/script/templates/P2PKH.d.ts.map +1 -1
- package/dist/types/src/script/templates/PushDrop.d.ts +1 -2
- package/dist/types/src/script/templates/PushDrop.d.ts.map +1 -1
- package/dist/types/src/script/templates/RPuzzle.d.ts.map +1 -1
- package/dist/types/src/totp/totp.d.ts.map +1 -1
- package/dist/types/src/transaction/Beef.d.ts +96 -96
- package/dist/types/src/transaction/Beef.d.ts.map +1 -1
- package/dist/types/src/transaction/BeefParty.d.ts +22 -22
- package/dist/types/src/transaction/BeefParty.d.ts.map +1 -1
- package/dist/types/src/transaction/BeefTx.d.ts +5 -5
- package/dist/types/src/transaction/BeefTx.d.ts.map +1 -1
- package/dist/types/src/transaction/Broadcaster.d.ts.map +1 -1
- package/dist/types/src/transaction/ChainTracker.d.ts +2 -2
- package/dist/types/src/transaction/FeeModel.d.ts.map +1 -1
- package/dist/types/src/transaction/MerklePath.d.ts.map +1 -1
- package/dist/types/src/transaction/Transaction.d.ts +4 -12
- package/dist/types/src/transaction/Transaction.d.ts.map +1 -1
- package/dist/types/src/transaction/TransactionOutput.d.ts.map +1 -1
- package/dist/types/src/transaction/broadcasters/ARC.d.ts +1 -1
- package/dist/types/src/transaction/broadcasters/ARC.d.ts.map +1 -1
- package/dist/types/src/transaction/broadcasters/DefaultBroadcaster.d.ts.map +1 -1
- package/dist/types/src/transaction/broadcasters/WhatsOnChainBroadcaster.d.ts.map +1 -1
- package/dist/types/src/transaction/chaintrackers/DefaultChainTracker.d.ts.map +1 -1
- package/dist/types/src/transaction/chaintrackers/WhatsOnChain.d.ts.map +1 -1
- package/dist/types/src/transaction/fee-models/SatoshisPerKilobyte.d.ts.map +1 -1
- package/dist/types/src/transaction/http/DefaultHttpClient.d.ts +1 -1
- package/dist/types/src/transaction/http/DefaultHttpClient.d.ts.map +1 -1
- package/dist/types/src/transaction/http/FetchHttpClient.d.ts +5 -5
- package/dist/types/src/transaction/http/FetchHttpClient.d.ts.map +1 -1
- package/dist/types/src/transaction/http/HttpClient.d.ts +4 -4
- package/dist/types/src/transaction/http/HttpClient.d.ts.map +1 -1
- package/dist/types/src/transaction/http/NodejsHttpClient.d.ts +3 -3
- package/dist/types/src/transaction/http/NodejsHttpClient.d.ts.map +1 -1
- package/dist/types/src/transaction/http/index.d.ts.map +1 -1
- package/dist/types/src/transaction/index.d.ts.map +1 -1
- package/dist/types/src/wallet/CachedKeyDeriver.d.ts +58 -58
- package/dist/types/src/wallet/CachedKeyDeriver.d.ts.map +1 -1
- package/dist/types/src/wallet/KeyDeriver.d.ts +78 -78
- package/dist/types/src/wallet/KeyDeriver.d.ts.map +1 -1
- package/dist/types/src/wallet/ProtoWallet.d.ts +10 -10
- package/dist/types/src/wallet/ProtoWallet.d.ts.map +1 -1
- package/dist/types/src/wallet/Wallet.interfaces.d.ts +151 -152
- package/dist/types/src/wallet/Wallet.interfaces.d.ts.map +1 -1
- package/dist/types/src/wallet/WalletClient.d.ts +5 -5
- package/dist/types/src/wallet/WalletClient.d.ts.map +1 -1
- package/dist/types/src/wallet/substrates/HTTPWalletJSON.d.ts +6 -6
- package/dist/types/src/wallet/substrates/HTTPWalletJSON.d.ts.map +1 -1
- package/dist/types/src/wallet/substrates/HTTPWalletWire.d.ts.map +1 -1
- package/dist/types/src/wallet/substrates/WalletWireProcessor.d.ts.map +1 -1
- package/dist/types/src/wallet/substrates/WalletWireTransceiver.d.ts.map +1 -1
- package/dist/types/src/wallet/substrates/XDM.d.ts +1 -1
- package/dist/types/src/wallet/substrates/XDM.d.ts.map +1 -1
- package/dist/types/src/wallet/substrates/window.CWI.d.ts +6 -6
- package/dist/types/src/wallet/substrates/window.CWI.d.ts.map +1 -1
- package/dist/types/tsconfig.types.tsbuildinfo +1 -1
- package/dist/umd/bundle.js +1 -1
- package/docs/auth.md +92 -82
- package/docs/compat.md +24 -24
- package/docs/messages.md +7 -5
- package/docs/overlay-tools.md +21 -21
- package/docs/primitives.md +336 -315
- package/docs/script.md +35 -35
- package/docs/swagger/dist/swagger-initializer.js +7 -7
- package/docs/swagger/dist/swagger-ui-bundle.js +1 -1
- package/docs/swagger/dist/swagger-ui-es-bundle-core.js +2 -2
- package/docs/swagger/dist/swagger-ui-es-bundle.js +1 -1
- package/docs/swagger/dist/swagger-ui-standalone-preset.js +1 -1
- package/docs/swagger/dist/swagger-ui.js +2 -2
- package/docs/totp.md +5 -5
- package/docs/transaction.md +103 -105
- package/docs/wallet-substrates.md +17 -17
- package/docs/wallet.md +202 -204
- package/mod.ts +15 -15
- package/package.json +15 -3
- package/src/auth/Peer.ts +271 -121
- package/src/auth/SessionManager.ts +17 -10
- package/src/auth/__tests/Peer.test.ts +361 -179
- package/src/auth/__tests/SessionManager.test.ts +67 -19
- package/src/auth/__tests/build.test.ts +11 -0
- package/src/auth/certificates/Certificate.ts +27 -14
- package/src/auth/certificates/MasterCertificate.ts +106 -62
- package/src/auth/certificates/VerifiableCertificate.ts +30 -8
- package/src/auth/certificates/__tests/Certificate.test.ts +32 -17
- package/src/auth/certificates/__tests/CompletedProtoWallet.ts +171 -68
- package/src/auth/certificates/__tests/MasterCertificate.test.ts +63 -47
- package/src/auth/certificates/__tests/VerifiableCertificate.test.ts +42 -31
- package/src/auth/certificates/index.ts +1 -1
- package/src/auth/clients/AuthFetch.ts +1 -0
- package/src/auth/clients/index.ts +1 -1
- package/src/auth/transports/SimplifiedFetchTransport.ts +145 -72
- package/src/auth/transports/index.ts +1 -1
- package/src/auth/utils/__tests/cryptononce.test.ts +52 -23
- package/src/auth/utils/__tests/getVerifiableCertificates.test.ts +56 -30
- package/src/auth/utils/__tests/validateCertificates.test.ts +53 -31
- package/src/auth/utils/createNonce.ts +11 -3
- package/src/auth/utils/getVerifiableCertificates.ts +12 -7
- package/src/auth/utils/validateCertificates.ts +57 -39
- package/src/auth/utils/verifyNonce.ts +6 -2
- package/src/compat/BSM.ts +10 -2
- package/src/compat/ECIES.ts +265 -141
- package/src/compat/HD.ts +81 -63
- package/src/compat/Mnemonic.ts +104 -91
- package/src/compat/Utxo.ts +8 -5
- package/src/compat/__tests/BSM.test.ts +42 -16
- package/src/compat/__tests/ECIES.test.ts +117 -52
- package/src/compat/__tests/HD.test.ts +55 -42
- package/src/compat/__tests/Mnemonic.test.ts +11 -12
- package/src/compat/__tests/Mnemonic.vectors.ts +110 -55
- package/src/messages/EncryptedMessage.ts +6 -2
- package/src/messages/SignedMessage.ts +14 -8
- package/src/messages/__tests/EncryptedMessage.test.ts +23 -24
- package/src/messages/__tests/SignedMessage.test.ts +17 -11
- package/src/overlay-tools/LookupResolver.ts +108 -56
- package/src/overlay-tools/OverlayAdminTokenTemplate.ts +52 -23
- package/src/overlay-tools/SHIPBroadcaster.ts +135 -59
- package/src/overlay-tools/__tests/LookupResolver.test.ts +723 -323
- package/src/overlay-tools/__tests/OverlayAdminTokenTemplate.test.ts +50 -22
- package/src/overlay-tools/__tests/SHIPBroadcaster.test.ts +607 -290
- package/src/primitives/AESGCM.ts +2 -0
- package/src/primitives/BasePoint.ts +4 -4
- package/src/primitives/BigNumber.ts +99 -90
- package/src/primitives/Curve.ts +117 -46
- package/src/primitives/DRBG.ts +9 -11
- package/src/primitives/ECDSA.ts +109 -63
- package/src/primitives/Hash.ts +492 -321
- package/src/primitives/JacobianPoint.ts +67 -19
- package/src/primitives/Point.ts +254 -152
- package/src/primitives/Polynomial.ts +8 -3
- package/src/primitives/PrivateKey.ts +41 -17
- package/src/primitives/PublicKey.ts +13 -3
- package/src/primitives/Random.ts +14 -8
- package/src/primitives/ReductionContext.ts +1 -1
- package/src/primitives/Schnorr.ts +40 -18
- package/src/primitives/Signature.ts +26 -16
- package/src/primitives/SymmetricKey.ts +14 -14
- package/src/primitives/TransactionSignature.ts +41 -17
- package/src/primitives/__tests/AESGCM.test.ts +457 -151
- package/src/primitives/__tests/BRC42.private.vectors.ts +30 -15
- package/src/primitives/__tests/BRC42.public.vectors.ts +30 -15
- package/src/primitives/__tests/BigNumber.arithmatic.test.ts +344 -125
- package/src/primitives/__tests/BigNumber.binary.test.ts +148 -67
- package/src/primitives/__tests/BigNumber.constructor.test.ts +65 -25
- package/src/primitives/__tests/BigNumber.dhGroup.test.ts +15 -11
- package/src/primitives/__tests/BigNumber.fixtures.ts +16 -8
- package/src/primitives/__tests/BigNumber.serializers.test.ts +41 -15
- package/src/primitives/__tests/BigNumber.utils.test.ts +132 -42
- package/src/primitives/__tests/Curve.unit.test.ts +75 -53
- package/src/primitives/__tests/DRBG.test.ts +1 -1
- package/src/primitives/__tests/DRBG.vectors.ts +45 -75
- package/src/primitives/__tests/ECDH.test.ts +15 -8
- package/src/primitives/__tests/ECDSA.test.ts +12 -6
- package/src/primitives/__tests/HMAC.test.ts +24 -18
- package/src/primitives/__tests/Hash.test.ts +57 -46
- package/src/primitives/__tests/PBKDF2.vectors.ts +130 -117
- package/src/primitives/__tests/PrivateKey.split.test.ts +33 -11
- package/src/primitives/__tests/PrivateKey.test.ts +11 -10
- package/src/primitives/__tests/PublicKey.test.ts +64 -53
- package/src/primitives/__tests/Random.test.ts +1 -1
- package/src/primitives/__tests/Reader.test.ts +240 -219
- package/src/primitives/__tests/ReductionContext.test.ts +98 -61
- package/src/primitives/__tests/Schnorr.test.ts +249 -237
- package/src/primitives/__tests/SymmetricKey.test.ts +18 -15
- package/src/primitives/__tests/SymmetricKey.vectors.ts +16 -8
- package/src/primitives/__tests/Writer.test.ts +23 -13
- package/src/primitives/__tests/bug-31.test.ts +6 -10
- package/src/primitives/__tests/utils.test.ts +70 -19
- package/src/primitives/utils.ts +103 -79
- package/src/script/Script.ts +18 -12
- package/src/script/ScriptTemplate.ts +3 -5
- package/src/script/Spend.ts +306 -108
- package/src/script/__tests/Script.test.ts +73 -55
- package/src/script/__tests/Spend.test.ts +208 -83
- package/src/script/__tests/SpendComplex.test.ts +19 -13
- package/src/script/__tests/script.invalid.vectors.ts +428 -1796
- package/src/script/__tests/script.valid.vectors.ts +728 -2764
- package/src/script/templates/P2PKH.ts +34 -12
- package/src/script/templates/PushDrop.ts +65 -31
- package/src/script/templates/RPuzzle.ts +29 -8
- package/src/script/templates/__tests/PushDrop.test.ts +146 -41
- package/src/totp/__tests/totp.test.ts +45 -44
- package/src/totp/totp.ts +3 -2
- package/src/transaction/Beef.ts +269 -174
- package/src/transaction/BeefParty.ts +41 -31
- package/src/transaction/BeefTx.ts +36 -26
- package/src/transaction/Broadcaster.ts +10 -6
- package/src/transaction/ChainTracker.ts +2 -2
- package/src/transaction/FeeModel.ts +0 -1
- package/src/transaction/MerklePath.ts +124 -59
- package/src/transaction/Transaction.ts +188 -187
- package/src/transaction/TransactionOutput.ts +0 -1
- package/src/transaction/__tests/Beef.test.ts +390 -287
- package/src/transaction/__tests/MerklePath.test.ts +59 -26
- package/src/transaction/__tests/Transaction.benchmarks.test.ts +231 -201
- package/src/transaction/__tests/Transaction.test.ts +758 -482
- package/src/transaction/__tests/bigtx.vectors.ts +2 -1
- package/src/transaction/__tests/bump.invalid.vectors.ts +24 -6
- package/src/transaction/__tests/bump.valid.vectors.ts +6 -2
- package/src/transaction/__tests/tx.invalid.vectors.ts +881 -185
- package/src/transaction/__tests/tx.valid.vectors.ts +1210 -257
- package/src/transaction/broadcasters/ARC.ts +69 -38
- package/src/transaction/broadcasters/DefaultBroadcaster.ts +9 -3
- package/src/transaction/broadcasters/WhatsOnChainBroadcaster.ts +20 -7
- package/src/transaction/broadcasters/__tests/ARC.test.ts +127 -59
- package/src/transaction/broadcasters/__tests/WhatsOnChainBroadcaster.test.ts +27 -18
- package/src/transaction/chaintrackers/DefaultChainTracker.ts +1 -1
- package/src/transaction/chaintrackers/WhatsOnChain.ts +27 -11
- package/src/transaction/chaintrackers/__tests/WhatsOnChainChainTracker.test.ts +59 -23
- package/src/transaction/fee-models/SatoshisPerKilobyte.ts +9 -5
- package/src/transaction/http/DefaultHttpClient.ts +5 -4
- package/src/transaction/http/FetchHttpClient.ts +18 -9
- package/src/transaction/http/HttpClient.ts +27 -22
- package/src/transaction/http/NodejsHttpClient.ts +23 -9
- package/src/transaction/http/index.ts +5 -1
- package/src/transaction/index.ts +5 -1
- package/src/wallet/CachedKeyDeriver.ts +151 -82
- package/src/wallet/KeyDeriver.ts +186 -105
- package/src/wallet/ProtoWallet.ts +121 -52
- package/src/wallet/Wallet.interfaces.ts +167 -156
- package/src/wallet/WalletClient.ts +314 -59
- package/src/wallet/WalletError.ts +2 -2
- package/src/wallet/__tests/CachedKeyDeriver.test.ts +86 -27
- package/src/wallet/__tests/KeyDeriver.test.ts +136 -33
- package/src/wallet/__tests/ProtoWallet.test.ts +190 -102
- package/src/wallet/substrates/HTTPWalletJSON.ts +250 -67
- package/src/wallet/substrates/HTTPWalletWire.ts +7 -3
- package/src/wallet/substrates/WalletWireCalls.ts +2 -2
- package/src/wallet/substrates/WalletWireProcessor.ts +1412 -1277
- package/src/wallet/substrates/WalletWireTransceiver.ts +713 -138
- package/src/wallet/substrates/XDM.ts +425 -36
- package/src/wallet/substrates/__tests/WalletWire.integration.test.ts +488 -225
- package/src/wallet/substrates/__tests/XDM.test.ts +232 -234
- package/src/wallet/substrates/window.CWI.ts +520 -61
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
1
2
|
import TransactionInput from './TransactionInput.js'
|
|
2
3
|
import TransactionOutput from './TransactionOutput.js'
|
|
3
4
|
import UnlockingScript from '../script/UnlockingScript.js'
|
|
@@ -12,7 +13,7 @@ import Spend from '../script/Spend.js'
|
|
|
12
13
|
import ChainTracker from './ChainTracker.js'
|
|
13
14
|
import { defaultBroadcaster } from './broadcasters/DefaultBroadcaster.js'
|
|
14
15
|
import { defaultChainTracker } from './chaintrackers/DefaultChainTracker.js'
|
|
15
|
-
import {
|
|
16
|
+
import { Beef, BEEF_V1 } from './Beef.js'
|
|
16
17
|
import P2PKH from '../script/templates/P2PKH.js'
|
|
17
18
|
|
|
18
19
|
/**
|
|
@@ -60,10 +61,17 @@ export default class Transaction {
|
|
|
60
61
|
private cachedHash?: number[]
|
|
61
62
|
|
|
62
63
|
// Recursive function for adding merkle proofs or input transactions
|
|
63
|
-
private static addPathOrInputs (
|
|
64
|
-
pathIndex?: number
|
|
65
|
-
|
|
66
|
-
|
|
64
|
+
private static addPathOrInputs (
|
|
65
|
+
obj: { pathIndex?: number, tx: Transaction },
|
|
66
|
+
transactions: Record<
|
|
67
|
+
string,
|
|
68
|
+
{
|
|
69
|
+
pathIndex?: number
|
|
70
|
+
tx: Transaction
|
|
71
|
+
}
|
|
72
|
+
>,
|
|
73
|
+
BUMPs: MerklePath[]
|
|
74
|
+
): void {
|
|
67
75
|
if (typeof obj.pathIndex === 'number') {
|
|
68
76
|
const path = BUMPs[obj.pathIndex]
|
|
69
77
|
if (typeof path !== 'object') {
|
|
@@ -72,9 +80,14 @@ export default class Transaction {
|
|
|
72
80
|
obj.tx.merklePath = path
|
|
73
81
|
} else {
|
|
74
82
|
for (const input of obj.tx.inputs) {
|
|
83
|
+
if (input.sourceTXID === undefined) {
|
|
84
|
+
throw new Error('Input sourceTXID is undefined')
|
|
85
|
+
}
|
|
75
86
|
const sourceObj = transactions[input.sourceTXID]
|
|
76
87
|
if (typeof sourceObj !== 'object') {
|
|
77
|
-
throw new Error(
|
|
88
|
+
throw new Error(
|
|
89
|
+
`Reference to unknown TXID in BEEF: ${input.sourceTXID ?? 'undefined'}`
|
|
90
|
+
)
|
|
78
91
|
}
|
|
79
92
|
input.sourceTransaction = sourceObj.tx
|
|
80
93
|
this.addPathOrInputs(sourceObj, transactions, BUMPs)
|
|
@@ -83,138 +96,45 @@ export default class Transaction {
|
|
|
83
96
|
}
|
|
84
97
|
|
|
85
98
|
/**
|
|
86
|
-
* Creates a new transaction, linked to its inputs and their associated merkle paths, from a BEEF
|
|
99
|
+
* Creates a new transaction, linked to its inputs and their associated merkle paths, from a BEEF V1, V2 or Atomic.
|
|
87
100
|
* Optionally, you can provide a specific TXID to retrieve a particular transaction from the BEEF data.
|
|
88
101
|
* If the TXID is provided but not found in the BEEF data, an error will be thrown.
|
|
89
|
-
* If no TXID is provided, the last transaction in the BEEF data is returned.
|
|
102
|
+
* If no TXID is provided, the last transaction in the BEEF data is returned, or the atomic txid.
|
|
90
103
|
* @param beef A binary representation of transactions in BEEF format.
|
|
91
104
|
* @param txid Optional TXID of the transaction to retrieve from the BEEF data.
|
|
92
105
|
* @returns An anchored transaction, linked to its associated inputs populated with merkle paths.
|
|
93
106
|
*/
|
|
94
107
|
static fromBEEF (beef: number[], txid?: string): Transaction {
|
|
95
|
-
const
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
// The last transaction in the BEEF data can be used if txid is not provided
|
|
99
|
-
const txids = Object.keys(transactions)
|
|
100
|
-
const lastTXID = txids[txids.length - 1]
|
|
101
|
-
const targetTXID = txid || lastTXID
|
|
102
|
-
|
|
103
|
-
if (!transactions[targetTXID]) {
|
|
104
|
-
throw new Error(`Transaction with TXID ${targetTXID} not found in BEEF data.`)
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
this.addPathOrInputs(transactions[targetTXID], transactions, BUMPs)
|
|
108
|
-
|
|
109
|
-
return transactions[targetTXID].tx
|
|
108
|
+
const { tx } = Transaction.fromAnyBeef(beef, txid)
|
|
109
|
+
return tx
|
|
110
110
|
}
|
|
111
111
|
|
|
112
112
|
/**
|
|
113
113
|
* Creates a new transaction from an Atomic BEEF (BRC-95) structure.
|
|
114
|
-
* Extracts the subject transaction and
|
|
115
|
-
* are part of the dependency graph of the subject transaction.
|
|
116
|
-
* Throws errors if the Atomic BEEF data does not strictly adhere to the BRC-95 specification.
|
|
114
|
+
* Extracts the subject transaction and supporting merkle path and source transactions contained in the BEEF data
|
|
117
115
|
*
|
|
118
116
|
* @param beef A binary representation of an Atomic BEEF structure.
|
|
119
117
|
* @returns The subject transaction, linked to its associated inputs populated with merkle paths.
|
|
120
118
|
*/
|
|
121
119
|
static fromAtomicBEEF (beef: number[]): Transaction {
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
if (prefix !== ATOMIC_BEEF) {
|
|
126
|
-
throw new Error(`Invalid Atomic BEEF prefix. Expected 0x01010101, received 0x${prefix.toString(16)}.`)
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
// Read the subject TXID
|
|
130
|
-
const subjectTXIDArray = reader.read(32)
|
|
131
|
-
const subjectTXID = toHex(subjectTXIDArray)
|
|
132
|
-
|
|
133
|
-
// The remaining data is the BEEF data
|
|
134
|
-
const beefReader = new Reader(reader.read())
|
|
135
|
-
const { transactions, BUMPs } = Transaction.parseBEEFData(beefReader)
|
|
136
|
-
|
|
137
|
-
// Ensure that the subject transaction exists
|
|
138
|
-
if (!transactions[subjectTXID]) {
|
|
139
|
-
throw new Error(`Subject transaction with TXID ${subjectTXID} not found in Atomic BEEF data.`)
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// Ensure that all transactions are part of the dependency graph of the subject transaction
|
|
143
|
-
const validTxids = new Set<string>()
|
|
144
|
-
// All BUMP level 0 hashes are valid.
|
|
145
|
-
for (const bump of BUMPs) {
|
|
146
|
-
for (const n of bump.path[0]) {
|
|
147
|
-
if (n.hash) { validTxids.add(n.hash) }
|
|
148
|
-
}
|
|
120
|
+
const { tx, txid, beef: b } = Transaction.fromAnyBeef(beef)
|
|
121
|
+
if (txid !== b.atomicTxid) {
|
|
122
|
+
if (b.atomicTxid) { throw new Error(`Transaction with TXID ${b.atomicTxid} not found in BEEF data.`) } else { throw new Error('beef must conform to BRC-95 and must contain the subject txid.') }
|
|
149
123
|
}
|
|
150
|
-
|
|
151
|
-
const unusedTxTxids = new Set<string>()
|
|
152
|
-
for (const txid of Object.keys(transactions)) unusedTxTxids.add(txid)
|
|
153
|
-
|
|
154
|
-
const traverseDependencies = (txid: string) => {
|
|
155
|
-
unusedTxTxids.delete(txid)
|
|
156
|
-
if (validTxids.has(txid)) {
|
|
157
|
-
return
|
|
158
|
-
}
|
|
159
|
-
validTxids.add(txid)
|
|
160
|
-
const tx = transactions[txid].tx
|
|
161
|
-
for (const input of tx.inputs) {
|
|
162
|
-
const inputTxid = input.sourceTXID
|
|
163
|
-
if (!transactions[inputTxid]) {
|
|
164
|
-
throw new Error(`Input transaction with TXID ${inputTxid} is missing in Atomic BEEF data.`)
|
|
165
|
-
}
|
|
166
|
-
traverseDependencies(inputTxid)
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
traverseDependencies(subjectTXID)
|
|
171
|
-
|
|
172
|
-
// Check for any unrelated transactions
|
|
173
|
-
for (const txid of unusedTxTxids) {
|
|
174
|
-
throw new Error(`Unrelated transaction with TXID ${txid} found in Atomic BEEF data.`)
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
this.addPathOrInputs(transactions[subjectTXID], transactions, BUMPs)
|
|
178
|
-
|
|
179
|
-
return transactions[subjectTXID].tx
|
|
124
|
+
return tx
|
|
180
125
|
}
|
|
181
126
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
* @returns An object containing the transactions and BUMPs.
|
|
187
|
-
*/
|
|
188
|
-
private static parseBEEFData (reader: Reader): { transactions: Record<string, { pathIndex?: number, tx: Transaction }>, BUMPs: MerklePath[] } {
|
|
189
|
-
// Read the version
|
|
190
|
-
const version = reader.readUInt32LE()
|
|
191
|
-
if (version !== BEEF_V1) {
|
|
192
|
-
throw new Error(`Invalid BEEF version. Expected ${BEEF_V1}, received ${version}.`)
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
// Read the BUMPs
|
|
196
|
-
const numberOfBUMPs = reader.readVarIntNum()
|
|
197
|
-
const BUMPs = []
|
|
198
|
-
for (let i = 0; i < numberOfBUMPs; i++) {
|
|
199
|
-
BUMPs.push(MerklePath.fromReader(reader))
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
// Read all transactions into an object
|
|
203
|
-
// The object has keys of TXIDs and values of objects with transactions and BUMP indexes
|
|
204
|
-
const numberOfTransactions = reader.readVarIntNum()
|
|
205
|
-
const transactions: Record<string, { pathIndex?: number, tx: Transaction }> = {}
|
|
206
|
-
for (let i = 0; i < numberOfTransactions; i++) {
|
|
207
|
-
const tx = Transaction.fromReader(reader)
|
|
208
|
-
const obj: { pathIndex?: number, tx: Transaction } = { tx }
|
|
209
|
-
const txid = tx.id('hex')
|
|
210
|
-
const hasBump = Boolean(reader.readUInt8())
|
|
211
|
-
if (hasBump) {
|
|
212
|
-
obj.pathIndex = reader.readVarIntNum()
|
|
213
|
-
}
|
|
214
|
-
transactions[txid] = obj
|
|
127
|
+
private static fromAnyBeef (beef: number[], txid?: string): { tx: Transaction, beef: Beef, txid: string } {
|
|
128
|
+
const b = Beef.fromBinary(beef)
|
|
129
|
+
if (b.txs.length < 1) {
|
|
130
|
+
throw new Error('beef must include at least one transaction.')
|
|
215
131
|
}
|
|
216
|
-
|
|
217
|
-
|
|
132
|
+
const target = txid || b.atomicTxid || b.txs.slice(-1)[0].txid
|
|
133
|
+
const tx = b.findAtomicTransaction(target)
|
|
134
|
+
if (tx == null) {
|
|
135
|
+
if (txid) { throw new Error(`Transaction with TXID ${target} not found in BEEF data.`) } else { throw new Error('beef does not contain transaction for atomic txid.') }
|
|
136
|
+
}
|
|
137
|
+
return { tx, beef: b, txid: target }
|
|
218
138
|
}
|
|
219
139
|
|
|
220
140
|
/**
|
|
@@ -225,7 +145,7 @@ export default class Transaction {
|
|
|
225
145
|
static fromEF (ef: number[]): Transaction {
|
|
226
146
|
const br = new Reader(ef)
|
|
227
147
|
const version = br.readUInt32LE()
|
|
228
|
-
if (toHex(br.read(6)) !== '0000000000ef') throw new Error('Invalid EF marker')
|
|
148
|
+
if (toHex(br.read(6)) !== '0000000000ef') { throw new Error('Invalid EF marker') }
|
|
229
149
|
const inputsLength = br.readVarIntNum()
|
|
230
150
|
const inputs: TransactionInput[] = []
|
|
231
151
|
for (let i = 0; i < inputsLength; i++) {
|
|
@@ -239,7 +159,7 @@ export default class Transaction {
|
|
|
239
159
|
const lockingScriptLength = br.readVarIntNum()
|
|
240
160
|
const lockingScriptBin = br.read(lockingScriptLength)
|
|
241
161
|
const lockingScript = LockingScript.fromBinary(lockingScriptBin)
|
|
242
|
-
const sourceTransaction = new Transaction(
|
|
162
|
+
const sourceTransaction = new Transaction(undefined, [], [], undefined)
|
|
243
163
|
sourceTransaction.outputs = Array(sourceOutputIndex + 1).fill(null)
|
|
244
164
|
sourceTransaction.outputs[sourceOutputIndex] = {
|
|
245
165
|
satoshis,
|
|
@@ -420,11 +340,13 @@ export default class Transaction {
|
|
|
420
340
|
typeof input.sourceTXID === 'undefined' &&
|
|
421
341
|
typeof input.sourceTransaction === 'undefined'
|
|
422
342
|
) {
|
|
423
|
-
throw new Error(
|
|
343
|
+
throw new Error(
|
|
344
|
+
'A reference to an an input transaction is required. If the input transaction itself cannot be referenced, its TXID must still be provided.'
|
|
345
|
+
)
|
|
424
346
|
}
|
|
425
347
|
// If the input sequence number hasn't been set, the expectation is that it is final.
|
|
426
348
|
if (typeof input.sequence === 'undefined') {
|
|
427
|
-
input.sequence =
|
|
349
|
+
input.sequence = 0xffffffff
|
|
428
350
|
}
|
|
429
351
|
this.cachedHash = undefined
|
|
430
352
|
this.inputs.push(input)
|
|
@@ -437,11 +359,15 @@ export default class Transaction {
|
|
|
437
359
|
*/
|
|
438
360
|
addOutput (output: TransactionOutput): void {
|
|
439
361
|
this.cachedHash = undefined
|
|
440
|
-
if (
|
|
441
|
-
if (typeof output.satoshis === 'undefined')
|
|
442
|
-
|
|
362
|
+
if (output.change !== true) {
|
|
363
|
+
if (typeof output.satoshis === 'undefined') {
|
|
364
|
+
throw new Error(
|
|
365
|
+
'either satoshis must be defined or change must be set to true'
|
|
366
|
+
)
|
|
367
|
+
}
|
|
368
|
+
if (output.satoshis < 0) { throw new Error('satoshis must be a positive integer or zero') }
|
|
443
369
|
}
|
|
444
|
-
if (
|
|
370
|
+
if (output.lockingScript == null) throw new Error('lockingScript must be defined')
|
|
445
371
|
this.outputs.push(output)
|
|
446
372
|
}
|
|
447
373
|
|
|
@@ -454,7 +380,9 @@ export default class Transaction {
|
|
|
454
380
|
*/
|
|
455
381
|
addP2PKHOutput (address: number[] | string, satoshis?: number): void {
|
|
456
382
|
const lockingScript = new P2PKH().lock(address)
|
|
457
|
-
if (typeof satoshis === 'undefined') {
|
|
383
|
+
if (typeof satoshis === 'undefined') {
|
|
384
|
+
return this.addOutput({ lockingScript, change: true })
|
|
385
|
+
}
|
|
458
386
|
this.addOutput({
|
|
459
387
|
lockingScript,
|
|
460
388
|
satoshis
|
|
@@ -483,7 +411,10 @@ export default class Transaction {
|
|
|
483
411
|
* amongst the change outputs
|
|
484
412
|
*
|
|
485
413
|
*/
|
|
486
|
-
async fee (
|
|
414
|
+
async fee (
|
|
415
|
+
modelOrFee: FeeModel | number = new SatoshisPerKilobyte(10),
|
|
416
|
+
changeDistribution: 'equal' | 'random' = 'equal'
|
|
417
|
+
): Promise<void> {
|
|
487
418
|
this.cachedHash = undefined
|
|
488
419
|
if (typeof modelOrFee === 'number') {
|
|
489
420
|
const sats = modelOrFee
|
|
@@ -494,7 +425,7 @@ export default class Transaction {
|
|
|
494
425
|
const fee = await modelOrFee.computeFee(this)
|
|
495
426
|
const change = this.calculateChange(fee)
|
|
496
427
|
if (change <= 0) {
|
|
497
|
-
this.outputs = this.outputs.filter(output =>
|
|
428
|
+
this.outputs = this.outputs.filter((output) => output.change !== true)
|
|
498
429
|
return
|
|
499
430
|
}
|
|
500
431
|
this.distributeChange(change, changeDistribution)
|
|
@@ -504,51 +435,70 @@ export default class Transaction {
|
|
|
504
435
|
let change = 0
|
|
505
436
|
for (const input of this.inputs) {
|
|
506
437
|
if (typeof input.sourceTransaction !== 'object') {
|
|
507
|
-
throw new Error(
|
|
438
|
+
throw new Error(
|
|
439
|
+
'Source transactions are required for all inputs during fee computation'
|
|
440
|
+
)
|
|
508
441
|
}
|
|
509
|
-
change +=
|
|
442
|
+
change +=
|
|
443
|
+
input.sourceTransaction.outputs[input.sourceOutputIndex].satoshis ?? 0
|
|
510
444
|
}
|
|
511
445
|
change -= fee
|
|
512
446
|
for (const out of this.outputs) {
|
|
513
|
-
if (
|
|
514
|
-
|
|
447
|
+
if (out.change !== true) {
|
|
448
|
+
if (out.satoshis !== undefined) {
|
|
449
|
+
change -= out.satoshis
|
|
450
|
+
}
|
|
515
451
|
}
|
|
516
452
|
}
|
|
517
453
|
return change
|
|
518
454
|
}
|
|
519
455
|
|
|
520
|
-
private distributeChange (
|
|
456
|
+
private distributeChange (
|
|
457
|
+
change: number,
|
|
458
|
+
changeDistribution: 'equal' | 'random'
|
|
459
|
+
): void {
|
|
521
460
|
let distributedChange = 0
|
|
522
|
-
const changeOutputs = this.outputs.filter(out => out.change)
|
|
461
|
+
const changeOutputs = this.outputs.filter((out) => out.change)
|
|
523
462
|
if (changeDistribution === 'random') {
|
|
524
463
|
distributedChange = this.distributeRandomChange(change, changeOutputs)
|
|
525
464
|
} else if (changeDistribution === 'equal') {
|
|
526
465
|
distributedChange = this.distributeEqualChange(change, changeOutputs)
|
|
527
466
|
}
|
|
528
467
|
if (distributedChange < change) {
|
|
529
|
-
this.outputs[this.outputs.length - 1]
|
|
468
|
+
const lastOutput = this.outputs[this.outputs.length - 1]
|
|
469
|
+
if (lastOutput.satoshis !== undefined) {
|
|
470
|
+
lastOutput.satoshis += change - distributedChange
|
|
471
|
+
} else {
|
|
472
|
+
lastOutput.satoshis = change - distributedChange
|
|
473
|
+
}
|
|
530
474
|
}
|
|
531
475
|
}
|
|
532
476
|
|
|
533
|
-
private distributeRandomChange (
|
|
477
|
+
private distributeRandomChange (
|
|
478
|
+
change: number,
|
|
479
|
+
changeOutputs: TransactionOutput[]
|
|
480
|
+
): number {
|
|
534
481
|
let distributedChange = 0
|
|
535
482
|
let changeToUse = change
|
|
536
483
|
const benfordNumbers = Array(changeOutputs.length).fill(1)
|
|
537
484
|
changeToUse -= changeOutputs.length
|
|
538
485
|
distributedChange += changeOutputs.length
|
|
539
486
|
for (let i = 0; i < changeOutputs.length - 1; i++) {
|
|
540
|
-
const portion = this.benfordNumber(0, changeToUse)
|
|
541
|
-
benfordNumbers[i]
|
|
487
|
+
const portion: number = this.benfordNumber(0, changeToUse)
|
|
488
|
+
benfordNumbers[i] = (benfordNumbers[i] as number) + portion
|
|
542
489
|
distributedChange += portion
|
|
543
490
|
changeToUse -= portion
|
|
544
491
|
}
|
|
545
492
|
for (const output of this.outputs) {
|
|
546
|
-
if (output.change) output.satoshis = benfordNumbers.shift()
|
|
493
|
+
if (output.change === true) output.satoshis = benfordNumbers.shift()
|
|
547
494
|
}
|
|
548
495
|
return distributedChange
|
|
549
496
|
}
|
|
550
497
|
|
|
551
|
-
private distributeEqualChange (
|
|
498
|
+
private distributeEqualChange (
|
|
499
|
+
change: number,
|
|
500
|
+
changeOutputs: TransactionOutput[]
|
|
501
|
+
): number {
|
|
552
502
|
let distributedChange = 0
|
|
553
503
|
const perOutput = Math.floor(change / changeOutputs.length)
|
|
554
504
|
for (const out of changeOutputs) {
|
|
@@ -560,7 +510,9 @@ export default class Transaction {
|
|
|
560
510
|
|
|
561
511
|
private benfordNumber (min: number, max: number): number {
|
|
562
512
|
const d = Math.floor(Math.random() * 9) + 1
|
|
563
|
-
return Math.floor(
|
|
513
|
+
return Math.floor(
|
|
514
|
+
min + ((max - min) * Math.log10(1 + 1 / d)) / Math.log10(10)
|
|
515
|
+
)
|
|
564
516
|
}
|
|
565
517
|
|
|
566
518
|
/**
|
|
@@ -572,13 +524,16 @@ export default class Transaction {
|
|
|
572
524
|
let totalIn = 0
|
|
573
525
|
for (const input of this.inputs) {
|
|
574
526
|
if (typeof input.sourceTransaction !== 'object') {
|
|
575
|
-
throw new Error(
|
|
527
|
+
throw new Error(
|
|
528
|
+
'Source transactions or sourceSatoshis are required for all inputs to calculate fee'
|
|
529
|
+
)
|
|
576
530
|
}
|
|
577
|
-
totalIn +=
|
|
531
|
+
totalIn +=
|
|
532
|
+
input.sourceTransaction.outputs[input.sourceOutputIndex].satoshis ?? 0
|
|
578
533
|
}
|
|
579
534
|
let totalOut = 0
|
|
580
535
|
for (const output of this.outputs) {
|
|
581
|
-
totalOut += output.satoshis
|
|
536
|
+
totalOut += output.satoshis ?? 0
|
|
582
537
|
}
|
|
583
538
|
return totalIn - totalOut
|
|
584
539
|
}
|
|
@@ -590,20 +545,26 @@ export default class Transaction {
|
|
|
590
545
|
this.cachedHash = undefined
|
|
591
546
|
for (const out of this.outputs) {
|
|
592
547
|
if (typeof out.satoshis === 'undefined') {
|
|
593
|
-
if (out.change) {
|
|
594
|
-
throw new Error(
|
|
548
|
+
if (out.change === true) {
|
|
549
|
+
throw new Error(
|
|
550
|
+
'There are still change outputs with uncomputed amounts. Use the fee() method to compute the change amounts and transaction fees prior to signing.'
|
|
551
|
+
)
|
|
595
552
|
} else {
|
|
596
|
-
throw new Error(
|
|
553
|
+
throw new Error(
|
|
554
|
+
'One or more transaction outputs is missing an amount. Ensure all output amounts are provided before signing.'
|
|
555
|
+
)
|
|
597
556
|
}
|
|
598
557
|
}
|
|
599
558
|
}
|
|
600
|
-
const unlockingScripts = await Promise.all(
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
559
|
+
const unlockingScripts = await Promise.all(
|
|
560
|
+
this.inputs.map(async (x, i): Promise<UnlockingScript | undefined> => {
|
|
561
|
+
if (typeof this.inputs[i].unlockingScriptTemplate === 'object') {
|
|
562
|
+
return await this.inputs[i]?.unlockingScriptTemplate?.sign(this, i)
|
|
563
|
+
} else {
|
|
564
|
+
return await Promise.resolve(undefined)
|
|
565
|
+
}
|
|
566
|
+
})
|
|
567
|
+
)
|
|
607
568
|
for (let i = 0, l = this.inputs.length; i < l; i++) {
|
|
608
569
|
if (typeof this.inputs[i].unlockingScriptTemplate === 'object') {
|
|
609
570
|
this.inputs[i].unlockingScript = unlockingScripts[i]
|
|
@@ -617,7 +578,9 @@ export default class Transaction {
|
|
|
617
578
|
* @param broadcaster The Broadcaster instance wwhere the transaction will be sent
|
|
618
579
|
* @returns A BroadcastResponse or BroadcastFailure from the Broadcaster
|
|
619
580
|
*/
|
|
620
|
-
async broadcast (
|
|
581
|
+
async broadcast (
|
|
582
|
+
broadcaster: Broadcaster = defaultBroadcaster()
|
|
583
|
+
): Promise<BroadcastResponse | BroadcastFailure> {
|
|
621
584
|
return await broadcaster.broadcast(this)
|
|
622
585
|
}
|
|
623
586
|
|
|
@@ -632,19 +595,26 @@ export default class Transaction {
|
|
|
632
595
|
writer.writeVarIntNum(this.inputs.length)
|
|
633
596
|
for (const i of this.inputs) {
|
|
634
597
|
if (typeof i.sourceTXID === 'undefined') {
|
|
635
|
-
|
|
598
|
+
if (i.sourceTransaction != null) {
|
|
599
|
+
writer.write(i.sourceTransaction.hash() as number[])
|
|
600
|
+
} else {
|
|
601
|
+
throw new Error('sourceTransaction is undefined')
|
|
602
|
+
}
|
|
636
603
|
} else {
|
|
637
604
|
writer.writeReverse(toArray(i.sourceTXID, 'hex'))
|
|
638
605
|
}
|
|
639
606
|
writer.writeUInt32LE(i.sourceOutputIndex)
|
|
607
|
+
if (i.unlockingScript == null) {
|
|
608
|
+
throw new Error('unlockingScript is undefined')
|
|
609
|
+
}
|
|
640
610
|
const scriptBin = i.unlockingScript.toBinary()
|
|
641
611
|
writer.writeVarIntNum(scriptBin.length)
|
|
642
612
|
writer.write(scriptBin)
|
|
643
|
-
writer.writeUInt32LE(i.sequence)
|
|
613
|
+
writer.writeUInt32LE(i.sequence ?? 0)
|
|
644
614
|
}
|
|
645
615
|
writer.writeVarIntNum(this.outputs.length)
|
|
646
616
|
for (const o of this.outputs) {
|
|
647
|
-
writer.writeUInt64LE(o.satoshis)
|
|
617
|
+
writer.writeUInt64LE(o.satoshis ?? 0)
|
|
648
618
|
const scriptBin = o.lockingScript.toBinary()
|
|
649
619
|
writer.writeVarIntNum(scriptBin.length)
|
|
650
620
|
writer.write(scriptBin)
|
|
@@ -665,7 +635,9 @@ export default class Transaction {
|
|
|
665
635
|
writer.writeVarIntNum(this.inputs.length)
|
|
666
636
|
for (const i of this.inputs) {
|
|
667
637
|
if (typeof i.sourceTransaction === 'undefined') {
|
|
668
|
-
throw new Error(
|
|
638
|
+
throw new Error(
|
|
639
|
+
'All inputs must have source transactions when serializing to EF format'
|
|
640
|
+
)
|
|
669
641
|
}
|
|
670
642
|
if (typeof i.sourceTXID === 'undefined') {
|
|
671
643
|
writer.write(i.sourceTransaction.hash() as number[])
|
|
@@ -673,18 +645,26 @@ export default class Transaction {
|
|
|
673
645
|
writer.write(toArray(i.sourceTXID, 'hex').reverse() as number[])
|
|
674
646
|
}
|
|
675
647
|
writer.writeUInt32LE(i.sourceOutputIndex)
|
|
648
|
+
if (i.unlockingScript == null) {
|
|
649
|
+
throw new Error('unlockingScript is undefined')
|
|
650
|
+
}
|
|
676
651
|
const scriptBin = i.unlockingScript.toBinary()
|
|
677
652
|
writer.writeVarIntNum(scriptBin.length)
|
|
678
653
|
writer.write(scriptBin)
|
|
679
|
-
writer.writeUInt32LE(i.sequence)
|
|
680
|
-
writer.writeUInt64LE(
|
|
681
|
-
|
|
654
|
+
writer.writeUInt32LE(i.sequence ?? 0)
|
|
655
|
+
writer.writeUInt64LE(
|
|
656
|
+
i.sourceTransaction.outputs[i.sourceOutputIndex].satoshis ?? 0
|
|
657
|
+
)
|
|
658
|
+
const lockingScriptBin =
|
|
659
|
+
i.sourceTransaction.outputs[
|
|
660
|
+
i.sourceOutputIndex
|
|
661
|
+
].lockingScript.toBinary()
|
|
682
662
|
writer.writeVarIntNum(lockingScriptBin.length)
|
|
683
663
|
writer.write(lockingScriptBin)
|
|
684
664
|
}
|
|
685
665
|
writer.writeVarIntNum(this.outputs.length)
|
|
686
666
|
for (const o of this.outputs) {
|
|
687
|
-
writer.writeUInt64LE(o.satoshis)
|
|
667
|
+
writer.writeUInt64LE(o.satoshis ?? 0)
|
|
688
668
|
const scriptBin = o.lockingScript.toBinary()
|
|
689
669
|
writer.writeVarIntNum(scriptBin.length)
|
|
690
670
|
writer.write(scriptBin)
|
|
@@ -737,7 +717,7 @@ export default class Transaction {
|
|
|
737
717
|
*/
|
|
738
718
|
hash (enc?: 'hex'): number[] | string {
|
|
739
719
|
let hash
|
|
740
|
-
if (this.cachedHash) {
|
|
720
|
+
if (this.cachedHash != null) {
|
|
741
721
|
hash = this.cachedHash
|
|
742
722
|
} else {
|
|
743
723
|
hash = hash256(this.toBinary())
|
|
@@ -769,7 +749,7 @@ export default class Transaction {
|
|
|
769
749
|
* @returns {string | number[]} - The ID of the transaction in the specified format.
|
|
770
750
|
*/
|
|
771
751
|
id (enc?: 'hex'): number[] | string {
|
|
772
|
-
const id = [...this.hash() as number[]]
|
|
752
|
+
const id = [...(this.hash() as number[])]
|
|
773
753
|
id.reverse()
|
|
774
754
|
if (enc === 'hex') {
|
|
775
755
|
return toHex(id)
|
|
@@ -795,21 +775,20 @@ export default class Transaction {
|
|
|
795
775
|
|
|
796
776
|
while (txQueue.length > 0) {
|
|
797
777
|
const tx = txQueue.shift()
|
|
798
|
-
const txid = tx
|
|
799
|
-
if (verifiedTxids.has(txid)) {
|
|
778
|
+
const txid = tx?.id('hex') ?? ''
|
|
779
|
+
if (txid != null && txid !== '' && verifiedTxids.has(txid)) {
|
|
800
780
|
continue
|
|
801
781
|
}
|
|
802
782
|
|
|
803
783
|
// If the transaction has a valid merkle path, verification is complete.
|
|
804
|
-
if (typeof tx
|
|
784
|
+
if (typeof tx?.merklePath === 'object') {
|
|
805
785
|
if (chainTracker === 'scripts only') {
|
|
806
|
-
|
|
786
|
+
if (txid != null) {
|
|
787
|
+
verifiedTxids.add(txid)
|
|
788
|
+
}
|
|
807
789
|
continue
|
|
808
790
|
} else {
|
|
809
|
-
const proofValid = await tx.merklePath.verify(
|
|
810
|
-
txid,
|
|
811
|
-
chainTracker
|
|
812
|
-
)
|
|
791
|
+
const proofValid = await tx.merklePath.verify(txid, chainTracker)
|
|
813
792
|
// If the proof is valid, no need to verify inputs.
|
|
814
793
|
if (proofValid) {
|
|
815
794
|
verifiedTxids.add(txid)
|
|
@@ -820,28 +799,41 @@ export default class Transaction {
|
|
|
820
799
|
|
|
821
800
|
// Verify fee if feeModel is provided
|
|
822
801
|
if (typeof feeModel !== 'undefined') {
|
|
802
|
+
if (tx === undefined) {
|
|
803
|
+
throw new Error('Transaction is undefined')
|
|
804
|
+
}
|
|
823
805
|
const cpTx = Transaction.fromEF(tx.toEF())
|
|
824
806
|
delete cpTx.outputs[0].satoshis
|
|
825
807
|
cpTx.outputs[0].change = true
|
|
826
808
|
await cpTx.fee(feeModel)
|
|
827
809
|
if (tx.getFee() < cpTx.getFee()) {
|
|
828
|
-
throw new Error(
|
|
810
|
+
throw new Error(
|
|
811
|
+
`Verification failed because the transaction ${txid} has an insufficient fee and has not been mined.`
|
|
812
|
+
)
|
|
829
813
|
}
|
|
830
814
|
}
|
|
831
815
|
|
|
832
816
|
// Verify each input transaction and evaluate the spend events.
|
|
833
817
|
// Also, keep a total of the input amounts for later.
|
|
834
818
|
let inputTotal = 0
|
|
819
|
+
if (tx === undefined) {
|
|
820
|
+
throw new Error('Transaction is undefined')
|
|
821
|
+
}
|
|
835
822
|
for (let i = 0; i < tx.inputs.length; i++) {
|
|
836
823
|
const input = tx.inputs[i]
|
|
837
824
|
if (typeof input.sourceTransaction !== 'object') {
|
|
838
|
-
throw new Error(
|
|
825
|
+
throw new Error(
|
|
826
|
+
`Verification failed because the input at index ${i} of transaction ${txid} is missing an associated source transaction. This source transaction is required for transaction verification because there is no merkle proof for the transaction spending a UTXO it contains.`
|
|
827
|
+
)
|
|
839
828
|
}
|
|
840
829
|
if (typeof input.unlockingScript !== 'object') {
|
|
841
|
-
throw new Error(
|
|
830
|
+
throw new Error(
|
|
831
|
+
`Verification failed because the input at index ${i} of transaction ${txid} is missing an associated unlocking script. This script is required for transaction verification because there is no merkle proof for the transaction spending the UTXO.`
|
|
832
|
+
)
|
|
842
833
|
}
|
|
843
|
-
const sourceOutput =
|
|
844
|
-
|
|
834
|
+
const sourceOutput =
|
|
835
|
+
input.sourceTransaction.outputs[input.sourceOutputIndex]
|
|
836
|
+
inputTotal += sourceOutput.satoshis ?? 0
|
|
845
837
|
|
|
846
838
|
const sourceTxid = input.sourceTransaction.id('hex')
|
|
847
839
|
if (!verifiedTxids.has(sourceTxid)) {
|
|
@@ -857,11 +849,11 @@ export default class Transaction {
|
|
|
857
849
|
sourceTXID: input.sourceTXID,
|
|
858
850
|
sourceOutputIndex: input.sourceOutputIndex,
|
|
859
851
|
lockingScript: sourceOutput.lockingScript,
|
|
860
|
-
sourceSatoshis: sourceOutput.satoshis,
|
|
852
|
+
sourceSatoshis: sourceOutput.satoshis ?? 0,
|
|
861
853
|
transactionVersion: tx.version,
|
|
862
854
|
otherInputs,
|
|
863
855
|
unlockingScript: input.unlockingScript,
|
|
864
|
-
inputSequence: input.sequence,
|
|
856
|
+
inputSequence: input.sequence ?? 0,
|
|
865
857
|
inputIndex: i,
|
|
866
858
|
outputs: tx.outputs,
|
|
867
859
|
lockTime: tx.lockTime
|
|
@@ -877,7 +869,9 @@ export default class Transaction {
|
|
|
877
869
|
let outputTotal = 0
|
|
878
870
|
for (const out of tx.outputs) {
|
|
879
871
|
if (typeof out.satoshis !== 'number') {
|
|
880
|
-
throw new Error(
|
|
872
|
+
throw new Error(
|
|
873
|
+
'Every output must have a defined amount during transaction verification.'
|
|
874
|
+
)
|
|
881
875
|
}
|
|
882
876
|
outputTotal += out.satoshis
|
|
883
877
|
}
|
|
@@ -914,12 +908,13 @@ export default class Transaction {
|
|
|
914
908
|
let added = false
|
|
915
909
|
// If this proof is identical to another one previously added, we use that first. Otherwise, we try to merge it with proofs from the same block.
|
|
916
910
|
for (let i = 0; i < BUMPs.length; i++) {
|
|
917
|
-
if (BUMPs[i] === tx.merklePath) {
|
|
911
|
+
if (BUMPs[i] === tx.merklePath) {
|
|
912
|
+
// Literally the same
|
|
918
913
|
obj.pathIndex = i
|
|
919
914
|
added = true
|
|
920
915
|
break
|
|
921
916
|
}
|
|
922
|
-
if (BUMPs[i].blockHeight === tx.merklePath.blockHeight) {
|
|
917
|
+
if (tx.merklePath !== null && tx.merklePath !== undefined && BUMPs[i].blockHeight === tx.merklePath.blockHeight) {
|
|
923
918
|
// Probably the same...
|
|
924
919
|
const rootA = BUMPs[i].computeRoot()
|
|
925
920
|
const rootB = tx.merklePath.computeRoot()
|
|
@@ -935,17 +930,23 @@ export default class Transaction {
|
|
|
935
930
|
// Finally, if the proof is not yet added, add a new path.
|
|
936
931
|
if (!added) {
|
|
937
932
|
obj.pathIndex = BUMPs.length
|
|
938
|
-
|
|
933
|
+
if (tx.merklePath !== null && tx.merklePath !== undefined) {
|
|
934
|
+
BUMPs.push(tx.merklePath)
|
|
935
|
+
}
|
|
939
936
|
}
|
|
940
937
|
}
|
|
941
|
-
const duplicate = txs.some(x => x.tx.id('hex') === tx.id('hex'))
|
|
938
|
+
const duplicate = txs.some((x) => x.tx.id('hex') === tx.id('hex'))
|
|
942
939
|
if (!duplicate) {
|
|
943
940
|
txs.unshift(obj)
|
|
944
941
|
}
|
|
945
942
|
if (!hasProof) {
|
|
946
943
|
for (let i = 0; i < tx.inputs.length; i++) {
|
|
947
944
|
const input = tx.inputs[i]
|
|
948
|
-
if (typeof input.sourceTransaction === 'object') {
|
|
945
|
+
if (typeof input.sourceTransaction === 'object') {
|
|
946
|
+
addPathsAndInputs(input.sourceTransaction)
|
|
947
|
+
} else if (allowPartial === false) {
|
|
948
|
+
throw new Error('A required source transaction is missing!')
|
|
949
|
+
}
|
|
949
950
|
}
|
|
950
951
|
}
|
|
951
952
|
}
|