@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
package/src/transaction/Beef.ts
CHANGED
|
@@ -5,6 +5,11 @@ import BeefTx from './BeefTx.js'
|
|
|
5
5
|
import { Reader, Writer, toHex, toArray } from '../primitives/utils.js'
|
|
6
6
|
import { hash256 } from '../primitives/Hash.js'
|
|
7
7
|
|
|
8
|
+
function verifyTruthy<T> (v: T | undefined): T {
|
|
9
|
+
if (v == null) throw new Error('Expected a valid value, but got undefined.')
|
|
10
|
+
return v
|
|
11
|
+
}
|
|
12
|
+
|
|
8
13
|
export const BEEF_V1 = 4022206465 // 0100BEEF in LE order
|
|
9
14
|
export const BEEF_V2 = 4022206466 // 0200BEEF in LE order
|
|
10
15
|
export const ATOMIC_BEEF = 0x01010101 // 01010101
|
|
@@ -78,11 +83,11 @@ export class Beef {
|
|
|
78
83
|
}
|
|
79
84
|
|
|
80
85
|
/**
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
86
|
+
* @param txid of `beefTx` to find
|
|
87
|
+
* @returns `BeefTx` in `txs` with `txid`.
|
|
88
|
+
*/
|
|
84
89
|
findTxid (txid: string): BeefTx | undefined {
|
|
85
|
-
return this.txs.find(tx => tx.txid === txid)
|
|
90
|
+
return this.txs.find((tx) => tx.txid === txid)
|
|
86
91
|
}
|
|
87
92
|
|
|
88
93
|
/**
|
|
@@ -96,10 +101,12 @@ export class Beef {
|
|
|
96
101
|
* @returns undefined if txid is unknown.
|
|
97
102
|
*/
|
|
98
103
|
makeTxidOnly (txid: string): BeefTx | undefined {
|
|
99
|
-
const i = this.txs.findIndex(tx => tx.txid === txid)
|
|
104
|
+
const i = this.txs.findIndex((tx) => tx.txid === txid)
|
|
100
105
|
if (i === -1) return undefined
|
|
101
106
|
let btx = this.txs[i]
|
|
102
|
-
if (btx.isTxidOnly) {
|
|
107
|
+
if (btx.isTxidOnly) {
|
|
108
|
+
return btx
|
|
109
|
+
}
|
|
103
110
|
this.txs.splice(i, 1)
|
|
104
111
|
btx = this.mergeTxidOnly(txid)
|
|
105
112
|
return btx
|
|
@@ -109,7 +116,9 @@ export class Beef {
|
|
|
109
116
|
* @returns `MerklePath` with level zero hash equal to txid or undefined.
|
|
110
117
|
*/
|
|
111
118
|
findBump (txid: string): MerklePath | undefined {
|
|
112
|
-
return this.bumps.find(b =>
|
|
119
|
+
return this.bumps.find((b) =>
|
|
120
|
+
b.path[0].some((leaf) => leaf.hash === txid) // ✅ Ensure boolean return with `.some()`
|
|
121
|
+
)
|
|
113
122
|
}
|
|
114
123
|
|
|
115
124
|
/**
|
|
@@ -123,12 +132,12 @@ export class Beef {
|
|
|
123
132
|
*/
|
|
124
133
|
findTransactionForSigning (txid: string): Transaction | undefined {
|
|
125
134
|
const beefTx = this.findTxid(txid)
|
|
126
|
-
if (
|
|
135
|
+
if ((beefTx == null) || (beefTx.tx == null)) return undefined // Ensure beefTx.tx exists before using it
|
|
127
136
|
|
|
128
137
|
for (const i of beefTx.tx.inputs) {
|
|
129
|
-
if (
|
|
130
|
-
const itx = this.findTxid(i.sourceTXID)
|
|
131
|
-
if (itx) {
|
|
138
|
+
if (i.sourceTransaction == null) {
|
|
139
|
+
const itx = this.findTxid(verifyTruthy(i.sourceTXID)) // Ensure sourceTXID is valid
|
|
140
|
+
if (itx != null) {
|
|
132
141
|
i.sourceTransaction = itx.tx
|
|
133
142
|
}
|
|
134
143
|
}
|
|
@@ -147,21 +156,23 @@ export class Beef {
|
|
|
147
156
|
*/
|
|
148
157
|
findAtomicTransaction (txid: string): Transaction | undefined {
|
|
149
158
|
const beefTx = this.findTxid(txid)
|
|
150
|
-
if (
|
|
159
|
+
if ((beefTx == null) || (beefTx.tx == null)) return undefined // Ensure beefTx.tx exists before using it
|
|
151
160
|
|
|
152
|
-
const addInputProof = (beef: Beef, tx: Transaction) => {
|
|
161
|
+
const addInputProof = (beef: Beef, tx: Transaction): void => {
|
|
153
162
|
const mp = beef.findBump(tx.id('hex'))
|
|
154
|
-
if (mp
|
|
163
|
+
if (mp != null) {
|
|
164
|
+
tx.merklePath = mp
|
|
165
|
+
} else {
|
|
155
166
|
for (const i of tx.inputs) {
|
|
156
|
-
if (
|
|
157
|
-
const itx = beef.findTxid(i.sourceTXID)
|
|
158
|
-
if (itx) {
|
|
167
|
+
if (i.sourceTransaction == null) {
|
|
168
|
+
const itx = beef.findTxid(verifyTruthy(i.sourceTXID)) // Ensure sourceTXID is valid
|
|
169
|
+
if (itx != null) {
|
|
159
170
|
i.sourceTransaction = itx.tx
|
|
160
171
|
}
|
|
161
172
|
}
|
|
162
|
-
if (i.sourceTransaction) {
|
|
173
|
+
if (i.sourceTransaction != null) {
|
|
163
174
|
const mp = beef.findBump(i.sourceTransaction.id('hex'))
|
|
164
|
-
if (mp) {
|
|
175
|
+
if (mp != null) {
|
|
165
176
|
i.sourceTransaction.merklePath = mp
|
|
166
177
|
} else {
|
|
167
178
|
addInputProof(beef, i.sourceTransaction)
|
|
@@ -171,22 +182,23 @@ export class Beef {
|
|
|
171
182
|
}
|
|
172
183
|
}
|
|
173
184
|
|
|
174
|
-
addInputProof(this, beefTx.tx)
|
|
185
|
+
addInputProof(this, beefTx.tx) // Safe because we checked that beefTx.tx exists
|
|
175
186
|
|
|
176
187
|
return beefTx.tx
|
|
177
188
|
}
|
|
178
189
|
|
|
179
190
|
/**
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
191
|
+
* Merge a MerklePath that is assumed to be fully valid.
|
|
192
|
+
* @param bump
|
|
193
|
+
* @returns index of merged bump
|
|
194
|
+
*/
|
|
184
195
|
mergeBump (bump: MerklePath): number {
|
|
185
196
|
let bumpIndex: number | undefined
|
|
186
197
|
// 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.
|
|
187
198
|
for (let i = 0; i < this.bumps.length; i++) {
|
|
188
199
|
const b = this.bumps[i]
|
|
189
|
-
if (b === bump) {
|
|
200
|
+
if (b === bump) {
|
|
201
|
+
// Literally the same
|
|
190
202
|
return i
|
|
191
203
|
}
|
|
192
204
|
if (b.blockHeight === bump.blockHeight) {
|
|
@@ -208,11 +220,12 @@ export class Beef {
|
|
|
208
220
|
this.bumps.push(bump)
|
|
209
221
|
}
|
|
210
222
|
|
|
211
|
-
//
|
|
223
|
+
// Review if any transactions are proven by this bump
|
|
212
224
|
const b = this.bumps[bumpIndex]
|
|
213
225
|
for (const tx of this.txs) {
|
|
214
226
|
const txid = tx.txid
|
|
215
|
-
|
|
227
|
+
|
|
228
|
+
if (tx.bumpIndex == null) { // ✅ Explicitly check for null or undefined
|
|
216
229
|
for (const n of b.path[0]) {
|
|
217
230
|
if (n.hash === txid) {
|
|
218
231
|
tx.bumpIndex = bumpIndex
|
|
@@ -227,16 +240,16 @@ export class Beef {
|
|
|
227
240
|
}
|
|
228
241
|
|
|
229
242
|
/**
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
243
|
+
* Merge a serialized transaction.
|
|
244
|
+
*
|
|
245
|
+
* Checks that a transaction with the same txid hasn't already been merged.
|
|
246
|
+
*
|
|
247
|
+
* Replaces existing transaction with same txid.
|
|
248
|
+
*
|
|
249
|
+
* @param rawTx
|
|
250
|
+
* @param bumpIndex Optional. If a number, must be valid index into bumps array.
|
|
251
|
+
* @returns txid of rawTx
|
|
252
|
+
*/
|
|
240
253
|
mergeRawTx (rawTx: number[], bumpIndex?: number): BeefTx {
|
|
241
254
|
const newTx: BeefTx = new BeefTx(rawTx, bumpIndex)
|
|
242
255
|
this.removeExistingTxid(newTx.txid)
|
|
@@ -246,44 +259,50 @@ export class Beef {
|
|
|
246
259
|
}
|
|
247
260
|
|
|
248
261
|
/**
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
262
|
+
* Merge a `Transaction` and any referenced `merklePath` and `sourceTransaction`, recursifely.
|
|
263
|
+
*
|
|
264
|
+
* Replaces existing transaction with same txid.
|
|
265
|
+
*
|
|
266
|
+
* Attempts to match an existing bump to the new transaction.
|
|
267
|
+
*
|
|
268
|
+
* @param tx
|
|
269
|
+
* @returns txid of tx
|
|
270
|
+
*/
|
|
258
271
|
mergeTransaction (tx: Transaction): BeefTx {
|
|
259
272
|
const txid = tx.id('hex')
|
|
260
273
|
this.removeExistingTxid(txid)
|
|
261
274
|
let bumpIndex: number | undefined
|
|
262
|
-
if (tx.merklePath
|
|
275
|
+
if (tx.merklePath != null) {
|
|
276
|
+
bumpIndex = this.mergeBump(tx.merklePath)
|
|
277
|
+
}
|
|
263
278
|
const newTx = new BeefTx(tx, bumpIndex)
|
|
264
279
|
this.txs.push(newTx)
|
|
265
280
|
this.tryToValidateBumpIndex(newTx)
|
|
266
281
|
bumpIndex = newTx.bumpIndex
|
|
267
282
|
if (bumpIndex === undefined) {
|
|
268
283
|
for (const input of tx.inputs) {
|
|
269
|
-
if (input.sourceTransaction
|
|
284
|
+
if (input.sourceTransaction != null) {
|
|
285
|
+
this.mergeTransaction(input.sourceTransaction)
|
|
286
|
+
}
|
|
270
287
|
}
|
|
271
288
|
}
|
|
272
289
|
return newTx
|
|
273
290
|
}
|
|
274
291
|
|
|
275
292
|
/**
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
removeExistingTxid (txid: string) {
|
|
280
|
-
const existingTxIndex = this.txs.findIndex(t => t.txid === txid)
|
|
281
|
-
if (existingTxIndex >= 0) {
|
|
293
|
+
* Removes an existing transaction from the BEEF, given its TXID
|
|
294
|
+
* @param txid TXID of the transaction to remove
|
|
295
|
+
*/
|
|
296
|
+
removeExistingTxid (txid: string): void {
|
|
297
|
+
const existingTxIndex = this.txs.findIndex((t) => t.txid === txid)
|
|
298
|
+
if (existingTxIndex >= 0) {
|
|
299
|
+
this.txs.splice(existingTxIndex, 1)
|
|
300
|
+
}
|
|
282
301
|
}
|
|
283
302
|
|
|
284
303
|
mergeTxidOnly (txid: string): BeefTx {
|
|
285
|
-
let tx = this.txs.find(t => t.txid === txid)
|
|
286
|
-
if (
|
|
304
|
+
let tx = this.txs.find((t) => t.txid === txid)
|
|
305
|
+
if (tx == null) {
|
|
287
306
|
tx = new BeefTx(txid)
|
|
288
307
|
this.txs.push(tx)
|
|
289
308
|
this.tryToValidateBumpIndex(tx)
|
|
@@ -293,63 +312,93 @@ export class Beef {
|
|
|
293
312
|
|
|
294
313
|
mergeBeefTx (btx: BeefTx): BeefTx {
|
|
295
314
|
let beefTx = this.findTxid(btx.txid)
|
|
296
|
-
|
|
315
|
+
|
|
316
|
+
if (btx.isTxidOnly && (beefTx == null)) {
|
|
317
|
+
beefTx = this.mergeTxidOnly(btx.txid)
|
|
318
|
+
} else if ((btx._tx != null) && ((beefTx == null) || beefTx.isTxidOnly)) {
|
|
319
|
+
beefTx = this.mergeTransaction(btx._tx)
|
|
320
|
+
} else if ((btx._rawTx != null) && ((beefTx == null) || beefTx.isTxidOnly)) {
|
|
321
|
+
beefTx = this.mergeRawTx(btx._rawTx)
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
if (beefTx == null) {
|
|
325
|
+
throw new Error(`Failed to merge BeefTx for txid: ${btx.txid}`)
|
|
326
|
+
}
|
|
327
|
+
|
|
297
328
|
return beefTx
|
|
298
329
|
}
|
|
299
330
|
|
|
300
|
-
mergeBeef (beef: number[] | Beef) {
|
|
331
|
+
mergeBeef (beef: number[] | Beef): void {
|
|
301
332
|
const b: Beef = Array.isArray(beef) ? Beef.fromBinary(beef) : beef
|
|
302
333
|
|
|
303
|
-
for (const bump of b.bumps) {
|
|
334
|
+
for (const bump of b.bumps) {
|
|
335
|
+
this.mergeBump(bump)
|
|
336
|
+
}
|
|
304
337
|
|
|
305
|
-
for (const tx of b.txs) {
|
|
338
|
+
for (const tx of b.txs) {
|
|
339
|
+
this.mergeBeefTx(tx)
|
|
340
|
+
}
|
|
306
341
|
}
|
|
307
342
|
|
|
308
343
|
/**
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
344
|
+
* Sorts `txs` and checks structural validity of beef.
|
|
345
|
+
*
|
|
346
|
+
* Does NOT verify merkle roots.
|
|
347
|
+
*
|
|
348
|
+
* Validity requirements:
|
|
349
|
+
* 1. No 'known' txids, unless `allowTxidOnly` is true.
|
|
350
|
+
* 2. All transactions have bumps or their inputs chain back to bumps (or are known).
|
|
351
|
+
* 3. Order of transactions satisfies dependencies before dependents.
|
|
352
|
+
* 4. No transactions with duplicate txids.
|
|
353
|
+
*
|
|
354
|
+
* @param allowTxidOnly optional. If true, transaction txid only is assumed valid
|
|
355
|
+
*/
|
|
321
356
|
isValid (allowTxidOnly?: boolean): boolean {
|
|
322
357
|
return this.verifyValid(allowTxidOnly).valid
|
|
323
358
|
}
|
|
324
359
|
|
|
325
360
|
/**
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
async verify (
|
|
361
|
+
* Sorts `txs` and confirms validity of transaction data contained in beef
|
|
362
|
+
* by validating structure of this beef and confirming computed merkle roots
|
|
363
|
+
* using `chainTracker`.
|
|
364
|
+
*
|
|
365
|
+
* Validity requirements:
|
|
366
|
+
* 1. No 'known' txids, unless `allowTxidOnly` is true.
|
|
367
|
+
* 2. All transactions have bumps or their inputs chain back to bumps (or are known).
|
|
368
|
+
* 3. Order of transactions satisfies dependencies before dependents.
|
|
369
|
+
* 4. No transactions with duplicate txids.
|
|
370
|
+
*
|
|
371
|
+
* @param chainTracker Used to verify computed merkle path roots for all bump txids.
|
|
372
|
+
* @param allowTxidOnly optional. If true, transaction txid is assumed valid
|
|
373
|
+
*/
|
|
374
|
+
async verify (
|
|
375
|
+
chainTracker: ChainTracker,
|
|
376
|
+
allowTxidOnly?: boolean
|
|
377
|
+
): Promise<boolean> {
|
|
340
378
|
const r = this.verifyValid(allowTxidOnly)
|
|
341
379
|
if (!r.valid) return false
|
|
342
380
|
|
|
343
381
|
for (const height of Object.keys(r.roots)) {
|
|
344
|
-
const isValid = await chainTracker.isValidRootForHeight(
|
|
345
|
-
|
|
382
|
+
const isValid = await chainTracker.isValidRootForHeight(
|
|
383
|
+
r.roots[height],
|
|
384
|
+
Number(height)
|
|
385
|
+
)
|
|
386
|
+
if (!isValid) {
|
|
387
|
+
return false
|
|
388
|
+
}
|
|
346
389
|
}
|
|
347
390
|
|
|
348
391
|
return true
|
|
349
392
|
}
|
|
350
393
|
|
|
351
|
-
private verifyValid (allowTxidOnly?: boolean): {
|
|
352
|
-
|
|
394
|
+
private verifyValid (allowTxidOnly?: boolean): {
|
|
395
|
+
valid: boolean
|
|
396
|
+
roots: Record<number, string>
|
|
397
|
+
} {
|
|
398
|
+
const r: { valid: boolean, roots: Record<number, string> } = {
|
|
399
|
+
valid: false,
|
|
400
|
+
roots: {}
|
|
401
|
+
}
|
|
353
402
|
|
|
354
403
|
this.sortTxs()
|
|
355
404
|
|
|
@@ -358,35 +407,41 @@ export class Beef {
|
|
|
358
407
|
|
|
359
408
|
for (const tx of this.txs) {
|
|
360
409
|
if (tx.isTxidOnly) {
|
|
361
|
-
if (
|
|
410
|
+
if (allowTxidOnly !== true) return r // ✅ Explicit check for `true`
|
|
362
411
|
txids[tx.txid] = true
|
|
363
412
|
}
|
|
364
413
|
}
|
|
365
414
|
|
|
366
415
|
const confirmComputedRoot = (b: MerklePath, txid: string): boolean => {
|
|
367
416
|
const root = b.computeRoot(txid)
|
|
368
|
-
if (
|
|
417
|
+
if (r.roots[b.blockHeight] === undefined || r.roots[b.blockHeight] === '') {
|
|
369
418
|
// accept the root as valid for this block and reuse for subsequent txids
|
|
370
419
|
r.roots[b.blockHeight] = root
|
|
371
420
|
}
|
|
372
|
-
if (r.roots[b.blockHeight] !== root) {
|
|
421
|
+
if (r.roots[b.blockHeight] !== root) {
|
|
422
|
+
return false
|
|
423
|
+
}
|
|
373
424
|
return true
|
|
374
425
|
}
|
|
375
426
|
|
|
376
427
|
for (const b of this.bumps) {
|
|
377
428
|
for (const n of b.path[0]) {
|
|
378
|
-
if (n.txid && n.hash) {
|
|
429
|
+
if (n.txid === true && typeof n.hash === 'string' && n.hash.length > 0) {
|
|
379
430
|
txids[n.hash] = true
|
|
380
|
-
|
|
381
|
-
|
|
431
|
+
|
|
432
|
+
// All txid hashes in all bumps must agree on computed merkle path roots
|
|
433
|
+
if (!confirmComputedRoot(b, n.hash)) {
|
|
434
|
+
return r
|
|
435
|
+
}
|
|
382
436
|
}
|
|
383
437
|
}
|
|
384
438
|
}
|
|
385
439
|
|
|
386
440
|
for (const t of this.txs) {
|
|
387
|
-
for (const i of t.inputTxids)
|
|
388
441
|
// all input txids must be included before they are referenced
|
|
389
|
-
|
|
442
|
+
for (const i of t.inputTxids) {
|
|
443
|
+
if (!txids[i]) return r
|
|
444
|
+
}
|
|
390
445
|
txids[t.txid] = true
|
|
391
446
|
}
|
|
392
447
|
|
|
@@ -398,7 +453,7 @@ export class Beef {
|
|
|
398
453
|
* Serializes this data to `writer`
|
|
399
454
|
* @param writer
|
|
400
455
|
*/
|
|
401
|
-
toWriter (writer: Writer) {
|
|
456
|
+
toWriter (writer: Writer): void {
|
|
402
457
|
writer.writeUInt32LE(this.version)
|
|
403
458
|
|
|
404
459
|
writer.writeVarIntNum(this.bumps.length)
|
|
@@ -413,9 +468,9 @@ export class Beef {
|
|
|
413
468
|
}
|
|
414
469
|
|
|
415
470
|
/**
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
471
|
+
* Returns a binary array representing the serialized BEEF
|
|
472
|
+
* @returns A binary array representing the BEEF
|
|
473
|
+
*/
|
|
419
474
|
toBinary (): number[] {
|
|
420
475
|
const writer = new Writer()
|
|
421
476
|
this.toWriter(writer)
|
|
@@ -432,27 +487,33 @@ export class Beef {
|
|
|
432
487
|
* @param txid
|
|
433
488
|
* @returns serialized contents of this Beef with AtomicBEEF prefix.
|
|
434
489
|
*/
|
|
435
|
-
toBinaryAtomic (txid: string) {
|
|
490
|
+
toBinaryAtomic (txid: string): number[] {
|
|
436
491
|
this.sortTxs()
|
|
437
492
|
const tx = this.findTxid(txid)
|
|
438
|
-
if (
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
493
|
+
if (tx == null) {
|
|
494
|
+
throw new Error(`${txid} does not exist in this Beef`)
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
// If the transaction is not the last one, clone and modify
|
|
498
|
+
const beef = (this.txs[this.txs.length - 1] === tx) ? this : this.clone()
|
|
499
|
+
|
|
500
|
+
if (beef !== this) {
|
|
501
|
+
const i = this.txs.findIndex((t) => t.txid === txid)
|
|
443
502
|
beef.txs.splice(i + 1)
|
|
444
503
|
}
|
|
504
|
+
|
|
445
505
|
const writer = new Writer()
|
|
446
506
|
writer.writeUInt32LE(ATOMIC_BEEF)
|
|
447
507
|
writer.write(toArray(txid, 'hex'))
|
|
448
508
|
beef.toWriter(writer)
|
|
509
|
+
|
|
449
510
|
return writer.toArray()
|
|
450
511
|
}
|
|
451
512
|
|
|
452
513
|
/**
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
514
|
+
* Returns a hex string representing the serialized BEEF
|
|
515
|
+
* @returns A hex string representing the BEEF
|
|
516
|
+
*/
|
|
456
517
|
toHex (): string {
|
|
457
518
|
return toHex(this.toBinary())
|
|
458
519
|
}
|
|
@@ -465,7 +526,11 @@ export class Beef {
|
|
|
465
526
|
atomicTxid = toHex(br.read(32))
|
|
466
527
|
version = br.readUInt32LE()
|
|
467
528
|
}
|
|
468
|
-
if (version !== BEEF_V1 && version !== BEEF_V2) {
|
|
529
|
+
if (version !== BEEF_V1 && version !== BEEF_V2) {
|
|
530
|
+
throw new Error(
|
|
531
|
+
`Serialized BEEF must start with ${BEEF_V1} or ${BEEF_V2} but starts with ${version}`
|
|
532
|
+
)
|
|
533
|
+
}
|
|
469
534
|
const beef = new Beef(version)
|
|
470
535
|
const bumpsLength = br.readVarIntNum()
|
|
471
536
|
for (let i = 0; i < bumpsLength; i++) {
|
|
@@ -482,21 +547,21 @@ export class Beef {
|
|
|
482
547
|
}
|
|
483
548
|
|
|
484
549
|
/**
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
550
|
+
* Constructs an instance of the Beef class based on the provided binary array
|
|
551
|
+
* @param bin The binary array from which to construct BEEF
|
|
552
|
+
* @returns An instance of the Beef class constructed from the binary data
|
|
553
|
+
*/
|
|
489
554
|
static fromBinary (bin: number[]): Beef {
|
|
490
555
|
const br = new Reader(bin)
|
|
491
556
|
return Beef.fromReader(br)
|
|
492
557
|
}
|
|
493
558
|
|
|
494
559
|
/**
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
560
|
+
* Constructs an instance of the Beef class based on the provided string
|
|
561
|
+
* @param s The string value from which to construct BEEF
|
|
562
|
+
* @param enc The encoding of the string value from which BEEF should be constructed
|
|
563
|
+
* @returns An instance of the Beef class constructed from the string
|
|
564
|
+
*/
|
|
500
565
|
static fromString (s: string, enc: 'hex' | 'utf8' | 'base64' = 'hex'): Beef {
|
|
501
566
|
const bin = toArray(s, enc)
|
|
502
567
|
const br = new Reader(bin)
|
|
@@ -504,17 +569,19 @@ export class Beef {
|
|
|
504
569
|
}
|
|
505
570
|
|
|
506
571
|
/**
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
572
|
+
* Try to validate newTx.bumpIndex by looking for an existing bump
|
|
573
|
+
* that proves newTx.txid
|
|
574
|
+
*
|
|
575
|
+
* @param newTx A new `BeefTx` that has been added to this.txs
|
|
576
|
+
* @returns true if a bump was found, false otherwise
|
|
577
|
+
*/
|
|
513
578
|
private tryToValidateBumpIndex (newTx: BeefTx): boolean {
|
|
514
|
-
if (newTx.bumpIndex !== undefined) {
|
|
579
|
+
if (newTx.bumpIndex !== undefined) {
|
|
580
|
+
return true
|
|
581
|
+
}
|
|
515
582
|
const txid = newTx.txid
|
|
516
583
|
for (let i = 0; i < this.bumps.length; i++) {
|
|
517
|
-
const j = this.bumps[i].path[0].findIndex(b => b.hash === txid)
|
|
584
|
+
const j = this.bumps[i].path[0].findIndex((b) => b.hash === txid)
|
|
518
585
|
if (j >= 0) {
|
|
519
586
|
newTx.bumpIndex = i
|
|
520
587
|
this.bumps[i].path[0][j].txid = true
|
|
@@ -525,15 +592,15 @@ export class Beef {
|
|
|
525
592
|
}
|
|
526
593
|
|
|
527
594
|
/**
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
595
|
+
* Sort the `txs` by input txid dependency order:
|
|
596
|
+
* - Oldest Tx Anchored by Path or txid only
|
|
597
|
+
* - Newer Txs depending on Older parents
|
|
598
|
+
* - Newest Tx
|
|
599
|
+
*
|
|
600
|
+
* with proof (MerklePath) last, longest chain of dependencies first
|
|
601
|
+
*
|
|
602
|
+
* @returns `{ missingInputs, notValid, valid, withMissingInputs }`
|
|
603
|
+
*/
|
|
537
604
|
sortTxs (): {
|
|
538
605
|
missingInputs: string[]
|
|
539
606
|
notValid: string[]
|
|
@@ -564,7 +631,9 @@ export class Beef {
|
|
|
564
631
|
} else if (tx.isTxidOnly && tx.inputTxids.length === 0) {
|
|
565
632
|
validTxids[tx.txid] = true
|
|
566
633
|
txidOnly.push(tx)
|
|
567
|
-
} else {
|
|
634
|
+
} else {
|
|
635
|
+
queue.push(tx)
|
|
636
|
+
}
|
|
568
637
|
}
|
|
569
638
|
|
|
570
639
|
// Hashtable of unknown input txids used to fund transactions without their own proof.
|
|
@@ -584,12 +653,17 @@ export class Beef {
|
|
|
584
653
|
// link their inputs that exist in this beef,
|
|
585
654
|
// make a note of missing inputs.
|
|
586
655
|
for (const inputTxid of tx.inputTxids) {
|
|
587
|
-
if (
|
|
656
|
+
if (txidToTx[inputTxid] === undefined) { // Explicitly check for undefined
|
|
588
657
|
missingInputs[inputTxid] = true
|
|
589
658
|
hasMissingInput = true
|
|
590
659
|
}
|
|
591
660
|
}
|
|
592
|
-
|
|
661
|
+
|
|
662
|
+
if (hasMissingInput) {
|
|
663
|
+
txsMissingInputs.push(tx)
|
|
664
|
+
} else {
|
|
665
|
+
queue.push(tx)
|
|
666
|
+
}
|
|
593
667
|
}
|
|
594
668
|
|
|
595
669
|
// As long as we have unsorted transactions...
|
|
@@ -599,44 +673,52 @@ export class Beef {
|
|
|
599
673
|
// all tx are isValid false, hasProof false.
|
|
600
674
|
// if isTxidOnly then has inputTxids
|
|
601
675
|
for (const tx of oldQueue) {
|
|
602
|
-
if (tx.inputTxids.every(txid => validTxids[txid])) {
|
|
676
|
+
if (tx.inputTxids.every((txid) => validTxids[txid])) {
|
|
603
677
|
validTxids[tx.txid] = true
|
|
604
678
|
result.push(tx)
|
|
605
|
-
} else {
|
|
679
|
+
} else {
|
|
680
|
+
queue.push(tx)
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
if (oldQueue.length === queue.length) {
|
|
684
|
+
break
|
|
606
685
|
}
|
|
607
|
-
if (oldQueue.length === queue.length) { break }
|
|
608
686
|
}
|
|
609
687
|
|
|
610
688
|
// transactions that don't have proofs and don't chain to proofs
|
|
611
689
|
const txsNotValid = queue
|
|
612
690
|
|
|
613
691
|
// New order of txs is unsortable (missing inputs or depends on missing inputs), txidOnly, sorted (so newest sorted is last)
|
|
614
|
-
this.txs = txsMissingInputs
|
|
692
|
+
this.txs = txsMissingInputs
|
|
693
|
+
.concat(txsNotValid)
|
|
694
|
+
.concat(txidOnly)
|
|
695
|
+
.concat(result)
|
|
615
696
|
|
|
616
697
|
return {
|
|
617
698
|
missingInputs: Object.keys(missingInputs),
|
|
618
|
-
notValid: txsNotValid.map(tx => tx.txid),
|
|
699
|
+
notValid: txsNotValid.map((tx) => tx.txid),
|
|
619
700
|
valid: Object.keys(validTxids),
|
|
620
|
-
withMissingInputs: txsMissingInputs.map(tx => tx.txid),
|
|
621
|
-
txidOnly: txidOnly.map(tx => tx.txid)
|
|
701
|
+
withMissingInputs: txsMissingInputs.map((tx) => tx.txid),
|
|
702
|
+
txidOnly: txidOnly.map((tx) => tx.txid)
|
|
622
703
|
}
|
|
623
704
|
}
|
|
624
705
|
|
|
625
706
|
/**
|
|
626
|
-
|
|
627
|
-
|
|
707
|
+
* @returns a shallow copy of this beef
|
|
708
|
+
*/
|
|
628
709
|
clone (): Beef {
|
|
629
710
|
const c = new Beef()
|
|
711
|
+
c.version = this.version
|
|
630
712
|
c.bumps = Array.from(this.bumps)
|
|
631
713
|
c.txs = Array.from(this.txs)
|
|
632
714
|
return c
|
|
633
715
|
}
|
|
634
716
|
|
|
635
717
|
/**
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
trimKnownTxids (knownTxids: string[]) {
|
|
718
|
+
* Ensure that all the txids in `knownTxids` are txidOnly
|
|
719
|
+
* @param knownTxids
|
|
720
|
+
*/
|
|
721
|
+
trimKnownTxids (knownTxids: string[]): void {
|
|
640
722
|
for (let i = 0; i < this.txs.length;) {
|
|
641
723
|
const tx = this.txs[i]
|
|
642
724
|
if (tx.isTxidOnly && knownTxids.includes(tx.txid)) {
|
|
@@ -657,16 +739,21 @@ export class Beef {
|
|
|
657
739
|
}
|
|
658
740
|
|
|
659
741
|
/**
|
|
660
|
-
|
|
661
|
-
|
|
742
|
+
* @returns Summary of `Beef` contents as multi-line string.
|
|
743
|
+
*/
|
|
662
744
|
toLogString (): string {
|
|
663
745
|
let log = ''
|
|
664
|
-
log += `BEEF with ${this.bumps.length} BUMPS and ${this.txs.length} Transactions, isValid ${this.isValid()}\n`
|
|
746
|
+
log += `BEEF with ${this.bumps.length} BUMPS and ${this.txs.length} Transactions, isValid ${this.isValid().toString()}\n`
|
|
665
747
|
let i = -1
|
|
748
|
+
|
|
666
749
|
for (const b of this.bumps) {
|
|
667
750
|
i++
|
|
668
|
-
log += ` BUMP ${i}\n block: ${b.blockHeight}\n txids: [\n${b.path[0]
|
|
751
|
+
log += ` BUMP ${i}\n block: ${b.blockHeight}\n txids: [\n${b.path[0]
|
|
752
|
+
.filter((n) => n.txid === true) // ✅ Explicitly check if txid is `true`
|
|
753
|
+
.map((n) => ` '${n.hash ?? ''}'`)
|
|
754
|
+
.join(',\n')}\n ]\n`
|
|
669
755
|
}
|
|
756
|
+
|
|
670
757
|
i = -1
|
|
671
758
|
for (const t of this.txs) {
|
|
672
759
|
i++
|
|
@@ -677,36 +764,44 @@ export class Beef {
|
|
|
677
764
|
if (t.isTxidOnly) {
|
|
678
765
|
log += ' txidOnly\n'
|
|
679
766
|
} else {
|
|
680
|
-
log += ` rawTx length=${t.rawTx
|
|
767
|
+
log += ` rawTx length=${t.rawTx?.length ?? 0}\n` // ✅ Fix applied here
|
|
681
768
|
}
|
|
682
769
|
if (t.inputTxids.length > 0) {
|
|
683
|
-
log += ` inputs: [\n${t.inputTxids
|
|
770
|
+
log += ` inputs: [\n${t.inputTxids
|
|
771
|
+
.map((it) => ` '${it}'`)
|
|
772
|
+
.join(',\n')}\n ]\n`
|
|
684
773
|
}
|
|
685
774
|
}
|
|
775
|
+
|
|
686
776
|
return log
|
|
687
777
|
}
|
|
688
778
|
|
|
689
779
|
/**
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
addComputedLeaves () {
|
|
694
|
-
const
|
|
695
|
-
|
|
696
|
-
hash256(toArray(m, 'hex').reverse())
|
|
697
|
-
).reverse())
|
|
780
|
+
* In some circumstances it may be helpful for the BUMP MerklePaths to include
|
|
781
|
+
* leaves that can be computed from row zero.
|
|
782
|
+
*/
|
|
783
|
+
addComputedLeaves (): void {
|
|
784
|
+
const hash = (m: string): string =>
|
|
785
|
+
toHex(hash256(toArray(m, 'hex').reverse()).reverse())
|
|
698
786
|
|
|
699
|
-
for (const bump of
|
|
787
|
+
for (const bump of this.bumps) { // ✅ Use `this` instead of `beef`
|
|
700
788
|
for (let row = 1; row < bump.path.length; row++) {
|
|
701
789
|
for (const leafL of bump.path[row - 1]) {
|
|
702
|
-
if (leafL.hash && (leafL.offset & 1) === 0) {
|
|
703
|
-
const leafR = bump.path[row - 1].find(
|
|
790
|
+
if (typeof leafL.hash === 'string' && (leafL.offset & 1) === 0) {
|
|
791
|
+
const leafR = bump.path[row - 1].find(
|
|
792
|
+
(l) => l.offset === leafL.offset + 1
|
|
793
|
+
)
|
|
704
794
|
const offsetOnRow = leafL.offset >> 1
|
|
705
|
-
|
|
706
|
-
|
|
795
|
+
|
|
796
|
+
if (
|
|
797
|
+
leafR !== undefined &&
|
|
798
|
+
typeof leafR.hash === 'string' &&
|
|
799
|
+
bump.path[row].every((l) => l.offset !== offsetOnRow)
|
|
800
|
+
) {
|
|
801
|
+
// Computable leaf is missing... add it.
|
|
707
802
|
bump.path[row].push({
|
|
708
803
|
offset: offsetOnRow,
|
|
709
|
-
//
|
|
804
|
+
// String concatenation puts the right leaf on the left of the left leaf hash
|
|
710
805
|
hash: hash(leafR.hash + leafL.hash)
|
|
711
806
|
})
|
|
712
807
|
}
|