@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
|
@@ -23,54 +23,62 @@ import { Beef } from './Beef.js'
|
|
|
23
23
|
*/
|
|
24
24
|
export class BeefParty extends Beef {
|
|
25
25
|
/**
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
* keys are party identifiers.
|
|
27
|
+
* values are records of txids with truthy value for which the party already has validity proof.
|
|
28
|
+
*/
|
|
29
29
|
knownTo: Record<string, Record<string, boolean>> = {}
|
|
30
30
|
|
|
31
31
|
/**
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
*
|
|
33
|
+
* @param parties Optional array of initial unique party identifiers.
|
|
34
|
+
*/
|
|
35
35
|
constructor (parties?: string[]) {
|
|
36
36
|
super()
|
|
37
|
-
if (parties) {
|
|
38
|
-
for (const party of parties) {
|
|
37
|
+
if (parties != null) {
|
|
38
|
+
for (const party of parties) {
|
|
39
|
+
this.addParty(party)
|
|
40
|
+
}
|
|
39
41
|
}
|
|
40
42
|
}
|
|
41
43
|
|
|
42
44
|
/**
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
isParty (party: string) {
|
|
45
|
+
* @param party
|
|
46
|
+
* @returns `true` if `party` has already been added to this `BeefParty`.
|
|
47
|
+
*/
|
|
48
|
+
isParty (party: string): boolean {
|
|
47
49
|
const r = Object.keys(this.knownTo).includes(party)
|
|
48
50
|
return r
|
|
49
51
|
}
|
|
50
52
|
|
|
51
53
|
/**
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
addParty (party: string) {
|
|
56
|
-
if (this.isParty(party)) {
|
|
54
|
+
* Adds a new unique party identifier to this `BeefParty`.
|
|
55
|
+
* @param party
|
|
56
|
+
*/
|
|
57
|
+
addParty (party: string): void {
|
|
58
|
+
if (this.isParty(party)) {
|
|
59
|
+
throw new Error(`Party ${party} already exists.`)
|
|
60
|
+
}
|
|
57
61
|
this.knownTo[party] = {}
|
|
58
62
|
}
|
|
59
63
|
|
|
60
64
|
/**
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
65
|
+
* @param party
|
|
66
|
+
* @returns Array of txids "known" to `party`.
|
|
67
|
+
*/
|
|
64
68
|
getKnownTxidsForParty (party: string): string[] {
|
|
65
69
|
const knownTxids = this.knownTo[party]
|
|
66
|
-
|
|
70
|
+
|
|
71
|
+
if (knownTxids === undefined) { // ✅ Explicitly check for undefined
|
|
72
|
+
throw new Error(`Party ${party} is unknown.`)
|
|
73
|
+
}
|
|
74
|
+
|
|
67
75
|
return Object.keys(knownTxids)
|
|
68
76
|
}
|
|
69
77
|
|
|
70
78
|
/**
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
79
|
+
* @param party
|
|
80
|
+
* @returns trimmed beef of unknown transactions and proofs for `party`
|
|
81
|
+
*/
|
|
74
82
|
getTrimmedBeefForParty (party: string): Beef {
|
|
75
83
|
const knownTxids = this.getKnownTxidsForParty(party)
|
|
76
84
|
const prunedBeef = this.clone()
|
|
@@ -79,12 +87,14 @@ export class BeefParty extends Beef {
|
|
|
79
87
|
}
|
|
80
88
|
|
|
81
89
|
/**
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
addKnownTxidsForParty (party: string, knownTxids: string[]) {
|
|
87
|
-
if (!this.isParty(party)) {
|
|
90
|
+
* Make note of additional txids "known" to `party`.
|
|
91
|
+
* @param party unique identifier, added if new.
|
|
92
|
+
* @param knownTxids
|
|
93
|
+
*/
|
|
94
|
+
addKnownTxidsForParty (party: string, knownTxids: string[]): void {
|
|
95
|
+
if (!this.isParty(party)) {
|
|
96
|
+
this.addParty(party)
|
|
97
|
+
}
|
|
88
98
|
const kts = this.knownTo[party]
|
|
89
99
|
for (const txid of knownTxids) {
|
|
90
100
|
kts[txid] = true
|
|
@@ -102,7 +112,7 @@ export class BeefParty extends Beef {
|
|
|
102
112
|
* @param party
|
|
103
113
|
* @param beef
|
|
104
114
|
*/
|
|
105
|
-
mergeBeefFromParty (party: string, beef: number[] | Beef) {
|
|
115
|
+
mergeBeefFromParty (party: string, beef: number[] | Beef): void {
|
|
106
116
|
const b: Beef = Array.isArray(beef) ? Beef.fromBinary(beef) : beef
|
|
107
117
|
const knownTxids = b.getValidTxids()
|
|
108
118
|
this.mergeBeef(b)
|
|
@@ -25,7 +25,9 @@ export default class BeefTx {
|
|
|
25
25
|
*/
|
|
26
26
|
isValid?: boolean = undefined
|
|
27
27
|
|
|
28
|
-
get bumpIndex (): number | undefined {
|
|
28
|
+
get bumpIndex (): number | undefined {
|
|
29
|
+
return this._bumpIndex
|
|
30
|
+
}
|
|
29
31
|
|
|
30
32
|
set bumpIndex (v: number | undefined) {
|
|
31
33
|
this._bumpIndex = v
|
|
@@ -37,34 +39,34 @@ export default class BeefTx {
|
|
|
37
39
|
}
|
|
38
40
|
|
|
39
41
|
get isTxidOnly (): boolean {
|
|
40
|
-
return
|
|
42
|
+
return this._txid !== undefined && this._txid !== null && (this._rawTx == null) && (this._tx == null)
|
|
41
43
|
}
|
|
42
44
|
|
|
43
|
-
get txid () {
|
|
44
|
-
if (this._txid) return this._txid
|
|
45
|
-
if (this._tx) {
|
|
45
|
+
get txid (): string {
|
|
46
|
+
if (this._txid !== undefined && this._txid !== null && this._txid !== '') return this._txid
|
|
47
|
+
if (this._tx != null) {
|
|
46
48
|
this._txid = this._tx.id('hex')
|
|
47
49
|
return this._txid
|
|
48
50
|
}
|
|
49
|
-
if (this._rawTx) {
|
|
51
|
+
if (this._rawTx != null) {
|
|
50
52
|
this._txid = toHex(hash256(this._rawTx))
|
|
51
53
|
return this._txid
|
|
52
54
|
}
|
|
53
55
|
throw new Error('Internal')
|
|
54
56
|
}
|
|
55
57
|
|
|
56
|
-
get tx () {
|
|
57
|
-
if (this._tx) return this._tx
|
|
58
|
-
if (this._rawTx) {
|
|
58
|
+
get tx (): Transaction | undefined {
|
|
59
|
+
if (this._tx != null) return this._tx
|
|
60
|
+
if (this._rawTx != null) {
|
|
59
61
|
this._tx = Transaction.fromBinary(this._rawTx)
|
|
60
62
|
return this._tx
|
|
61
63
|
}
|
|
62
64
|
return undefined
|
|
63
65
|
}
|
|
64
66
|
|
|
65
|
-
get rawTx () {
|
|
66
|
-
if (this._rawTx) return this._rawTx
|
|
67
|
-
if (this._tx) {
|
|
67
|
+
get rawTx (): number[] | undefined {
|
|
68
|
+
if (this._rawTx != null) return this._rawTx
|
|
69
|
+
if (this._tx != null) {
|
|
68
70
|
this._rawTx = this._tx.toBinary()
|
|
69
71
|
return this._rawTx
|
|
70
72
|
}
|
|
@@ -72,9 +74,9 @@ export default class BeefTx {
|
|
|
72
74
|
}
|
|
73
75
|
|
|
74
76
|
/**
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
77
|
+
* @param tx If string, must be a valid txid. If `number[]` must be a valid serialized transaction.
|
|
78
|
+
* @param bumpIndex If transaction already has a proof in the beef to which it will be added.
|
|
79
|
+
*/
|
|
78
80
|
constructor (tx: Transaction | number[] | string, bumpIndex?: number) {
|
|
79
81
|
if (typeof tx === 'string') {
|
|
80
82
|
this._txid = tx
|
|
@@ -99,37 +101,45 @@ export default class BeefTx {
|
|
|
99
101
|
return new BeefTx(txid, bumpIndex)
|
|
100
102
|
}
|
|
101
103
|
|
|
102
|
-
private updateInputTxids () {
|
|
103
|
-
if (this.hasProof ||
|
|
104
|
+
private updateInputTxids (): void {
|
|
105
|
+
if (this.hasProof || (this.tx == null)) {
|
|
104
106
|
// If we have a proof, or don't have a parsed transaction
|
|
105
107
|
this.inputTxids = []
|
|
106
108
|
} else {
|
|
107
|
-
const inputTxids = {}
|
|
108
|
-
for (const input of this.tx.inputs) {
|
|
109
|
+
const inputTxids: Record<string, boolean> = {} // ✅ Explicit object type
|
|
110
|
+
for (const input of this.tx.inputs) {
|
|
111
|
+
if (input.sourceTXID !== undefined && input.sourceTXID !== null && input.sourceTXID !== '') {
|
|
112
|
+
// ✅ Ensure sourceTXID is defined
|
|
113
|
+
inputTxids[input.sourceTXID] = true
|
|
114
|
+
}
|
|
115
|
+
}
|
|
109
116
|
this.inputTxids = Object.keys(inputTxids)
|
|
110
117
|
}
|
|
111
118
|
}
|
|
112
119
|
|
|
113
120
|
toWriter (writer: Writer, version: number): void {
|
|
114
|
-
const writeByte = (bb: number) => {
|
|
121
|
+
const writeByte = (bb: number): void => {
|
|
115
122
|
writer.writeUInt8(bb)
|
|
116
123
|
}
|
|
117
124
|
|
|
118
|
-
const writeTxid = () => {
|
|
125
|
+
const writeTxid = (): void => {
|
|
126
|
+
if (this._txid == null) {
|
|
127
|
+
throw new Error('Transaction ID (_txid) is undefined')
|
|
128
|
+
}
|
|
119
129
|
writer.writeReverse(toArray(this._txid, 'hex'))
|
|
120
130
|
}
|
|
121
131
|
|
|
122
|
-
const writeTx = () => {
|
|
123
|
-
if (this._rawTx) {
|
|
132
|
+
const writeTx = (): void => {
|
|
133
|
+
if (this._rawTx != null) {
|
|
124
134
|
writer.write(this._rawTx)
|
|
125
|
-
} else if (this._tx) {
|
|
135
|
+
} else if (this._tx != null) {
|
|
126
136
|
writer.write(this._tx.toBinary())
|
|
127
137
|
} else {
|
|
128
138
|
throw new Error('a valid serialized Transaction is expected')
|
|
129
139
|
}
|
|
130
140
|
}
|
|
131
141
|
|
|
132
|
-
const writeBumpIndex = () => {
|
|
142
|
+
const writeBumpIndex = (): void => {
|
|
133
143
|
if (this.bumpIndex === undefined) {
|
|
134
144
|
writeByte(TX_DATA_FORMAT.RAWTX) // 0
|
|
135
145
|
} else {
|
|
@@ -175,7 +185,7 @@ export default class BeefTx {
|
|
|
175
185
|
} else {
|
|
176
186
|
// V1
|
|
177
187
|
data = Transaction.fromReader(br)
|
|
178
|
-
bumpIndex = br.readUInt8() ? br.readVarIntNum() : undefined
|
|
188
|
+
bumpIndex = br.readUInt8() !== 0 ? br.readVarIntNum() : undefined
|
|
179
189
|
beefTx = BeefTx.fromTx(data, bumpIndex)
|
|
180
190
|
}
|
|
181
191
|
|
|
@@ -44,22 +44,26 @@ export interface BroadcastFailure {
|
|
|
44
44
|
* The promise resolves to an array of broadcast result response objects.
|
|
45
45
|
*/
|
|
46
46
|
export interface Broadcaster {
|
|
47
|
-
broadcast: (
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
Promise<object[]>
|
|
47
|
+
broadcast: (
|
|
48
|
+
transaction: Transaction
|
|
49
|
+
) => Promise<BroadcastResponse | BroadcastFailure>
|
|
50
|
+
broadcastMany?: (txs: Transaction[]) => Promise<object[]>
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
/**
|
|
54
54
|
* Convenience type guard for response from `Broadcaster.broadcast`
|
|
55
55
|
*/
|
|
56
|
-
export function isBroadcastResponse (
|
|
56
|
+
export function isBroadcastResponse (
|
|
57
|
+
r: BroadcastResponse | BroadcastFailure
|
|
58
|
+
): r is BroadcastResponse {
|
|
57
59
|
return r.status === 'success'
|
|
58
60
|
}
|
|
59
61
|
|
|
60
62
|
/**
|
|
61
63
|
* Convenience type guard for response from `Broadcaster.broadcast`
|
|
62
64
|
*/
|
|
63
|
-
export function isBroadcastFailure (
|
|
65
|
+
export function isBroadcastFailure (
|
|
66
|
+
r: BroadcastResponse | BroadcastFailure
|
|
67
|
+
): r is BroadcastFailure {
|
|
64
68
|
return r.status === 'error'
|
|
65
69
|
}
|
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
* // Implementation to check if the Merkle root is valid for the specified block height.
|
|
19
19
|
* }
|
|
20
20
|
* currentHeight: async () => {
|
|
21
|
-
* // Implementation to get the current block height.
|
|
22
|
-
* }
|
|
21
|
+
* // Implementation to get the current block height.
|
|
22
|
+
* }
|
|
23
23
|
* };
|
|
24
24
|
*/
|
|
25
25
|
export default interface ChainTracker {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
|
|
1
2
|
import { Reader, Writer, toHex, toArray } from '../primitives/utils.js'
|
|
2
3
|
import { hash256 } from '../primitives/Hash.js'
|
|
3
4
|
import ChainTracker from './ChainTracker.js'
|
|
@@ -32,12 +33,14 @@ export interface MerklePathLeaf {
|
|
|
32
33
|
*/
|
|
33
34
|
export default class MerklePath {
|
|
34
35
|
blockHeight: number
|
|
35
|
-
path: Array<
|
|
36
|
+
path: Array<
|
|
37
|
+
Array<{
|
|
36
38
|
offset: number
|
|
37
39
|
hash?: string
|
|
38
40
|
txid?: boolean
|
|
39
41
|
duplicate?: boolean
|
|
40
|
-
}
|
|
42
|
+
}>
|
|
43
|
+
>
|
|
41
44
|
|
|
42
45
|
/**
|
|
43
46
|
* Creates a MerklePath instance from a hexadecimal string.
|
|
@@ -50,14 +53,20 @@ export default class MerklePath {
|
|
|
50
53
|
return MerklePath.fromBinary(toArray(hex, 'hex'))
|
|
51
54
|
}
|
|
52
55
|
|
|
53
|
-
static fromReader (
|
|
56
|
+
static fromReader (
|
|
57
|
+
reader: Reader,
|
|
58
|
+
legalOffsetsOnly: boolean = true
|
|
59
|
+
): MerklePath {
|
|
54
60
|
const blockHeight = reader.readVarIntNum()
|
|
55
61
|
const treeHeight = reader.readUInt8()
|
|
56
|
-
|
|
57
|
-
|
|
62
|
+
// Explicitly define the type of path as an array of arrays of leaf objects
|
|
63
|
+
const path: Array<Array<{ offset: number, hash?: string, txid?: boolean, duplicate?: boolean }>> = Array(treeHeight)
|
|
64
|
+
.fill(null)
|
|
65
|
+
.map(() => [])
|
|
66
|
+
let flags: number, offset: number, nLeavesAtThisHeight: number
|
|
58
67
|
for (let level = 0; level < treeHeight; level++) {
|
|
59
68
|
nLeavesAtThisHeight = reader.readVarIntNum()
|
|
60
|
-
while (nLeavesAtThisHeight) {
|
|
69
|
+
while (nLeavesAtThisHeight > 0) {
|
|
61
70
|
offset = reader.readVarIntNum()
|
|
62
71
|
flags = reader.readUInt8()
|
|
63
72
|
const leaf: {
|
|
@@ -66,17 +75,22 @@ export default class MerklePath {
|
|
|
66
75
|
txid?: boolean
|
|
67
76
|
duplicate?: boolean
|
|
68
77
|
} = { offset }
|
|
69
|
-
if (flags & 1) {
|
|
78
|
+
if ((flags & 1) !== 0) {
|
|
70
79
|
leaf.duplicate = true
|
|
71
80
|
} else {
|
|
72
|
-
if (flags & 2) {
|
|
81
|
+
if ((flags & 2) !== 0) {
|
|
73
82
|
leaf.txid = true
|
|
74
83
|
}
|
|
75
84
|
leaf.hash = toHex(reader.read(32).reverse())
|
|
76
85
|
}
|
|
86
|
+
// Ensure path[level] exists before pushing
|
|
87
|
+
if (!Array.isArray(path[level]) || path[level].length === 0) {
|
|
88
|
+
path[level] = []
|
|
89
|
+
}
|
|
77
90
|
path[level].push(leaf)
|
|
78
91
|
nLeavesAtThisHeight--
|
|
79
92
|
}
|
|
93
|
+
// Sort the array based on the offset property
|
|
80
94
|
path[level].sort((a, b) => a.offset - b.offset)
|
|
81
95
|
}
|
|
82
96
|
return new MerklePath(blockHeight, path, legalOffsetsOnly)
|
|
@@ -109,34 +123,48 @@ export default class MerklePath {
|
|
|
109
123
|
return new MerklePath(height, [[{ offset: 0, hash: txid, txid: true }]])
|
|
110
124
|
}
|
|
111
125
|
|
|
112
|
-
constructor (
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
126
|
+
constructor (
|
|
127
|
+
blockHeight: number,
|
|
128
|
+
path: Array<
|
|
129
|
+
Array<{
|
|
130
|
+
offset: number
|
|
131
|
+
hash?: string
|
|
132
|
+
txid?: boolean
|
|
133
|
+
duplicate?: boolean
|
|
134
|
+
}>
|
|
135
|
+
>,
|
|
136
|
+
legalOffsetsOnly: boolean = true
|
|
137
|
+
) {
|
|
118
138
|
this.blockHeight = blockHeight
|
|
119
139
|
this.path = path
|
|
120
140
|
|
|
121
141
|
// store all of the legal offsets which we expect given the txid indices.
|
|
122
|
-
const legalOffsets = Array(this.path.length)
|
|
123
|
-
|
|
142
|
+
const legalOffsets = Array(this.path.length)
|
|
143
|
+
.fill(0)
|
|
144
|
+
.map(() => new Set())
|
|
145
|
+
this.path.forEach((leaves, height) => {
|
|
124
146
|
if (leaves.length === 0 && height === 0) {
|
|
125
147
|
throw new Error(`Empty level at height: ${height}`)
|
|
126
148
|
}
|
|
127
149
|
const offsetsAtThisHeight = new Set()
|
|
128
|
-
leaves.
|
|
129
|
-
if (offsetsAtThisHeight.has(leaf.offset))
|
|
150
|
+
leaves.forEach((leaf) => {
|
|
151
|
+
if (offsetsAtThisHeight.has(leaf.offset)) {
|
|
152
|
+
throw new Error(
|
|
153
|
+
`Duplicate offset: ${leaf.offset}, at height: ${height}`
|
|
154
|
+
)
|
|
155
|
+
}
|
|
130
156
|
offsetsAtThisHeight.add(leaf.offset)
|
|
131
157
|
if (height === 0) {
|
|
132
|
-
if (
|
|
158
|
+
if (leaf.duplicate !== true) {
|
|
133
159
|
for (let h = 1; h < this.path.length; h++) {
|
|
134
|
-
legalOffsets[h].add(leaf.offset >> h ^ 1)
|
|
160
|
+
legalOffsets[h].add((leaf.offset >> h) ^ 1)
|
|
135
161
|
}
|
|
136
162
|
}
|
|
137
163
|
} else {
|
|
138
164
|
if (legalOffsetsOnly && !legalOffsets[height].has(leaf.offset)) {
|
|
139
|
-
throw new Error(
|
|
165
|
+
throw new Error(
|
|
166
|
+
`Invalid offset: ${leaf.offset}, at height: ${height}, with legal offsets: ${Array.from(legalOffsets[height]).join(', ')}`
|
|
167
|
+
)
|
|
140
168
|
}
|
|
141
169
|
}
|
|
142
170
|
})
|
|
@@ -144,7 +172,7 @@ export default class MerklePath {
|
|
|
144
172
|
|
|
145
173
|
// every txid must calculate to the same root.
|
|
146
174
|
let root: string
|
|
147
|
-
this.path[0].
|
|
175
|
+
this.path[0].forEach((leaf, idx) => {
|
|
148
176
|
if (idx === 0) root = this.computeRoot(leaf.hash)
|
|
149
177
|
if (root !== this.computeRoot(leaf.hash)) {
|
|
150
178
|
throw new Error('Mismatched roots')
|
|
@@ -168,10 +196,10 @@ export default class MerklePath {
|
|
|
168
196
|
for (const leaf of this.path[level]) {
|
|
169
197
|
writer.writeVarIntNum(leaf.offset)
|
|
170
198
|
let flags = 0
|
|
171
|
-
if (leaf?.duplicate) {
|
|
199
|
+
if (leaf?.duplicate === true) {
|
|
172
200
|
flags |= 1
|
|
173
201
|
}
|
|
174
|
-
if (leaf?.txid) {
|
|
202
|
+
if (leaf?.txid !== undefined && leaf.txid !== null) {
|
|
175
203
|
flags |= 2
|
|
176
204
|
}
|
|
177
205
|
writer.writeUInt8(flags)
|
|
@@ -194,7 +222,11 @@ export default class MerklePath {
|
|
|
194
222
|
|
|
195
223
|
//
|
|
196
224
|
private indexOf (txid: string): number {
|
|
197
|
-
|
|
225
|
+
const leaf = this.path[0].find((l) => l.hash === txid)
|
|
226
|
+
if (leaf === null || leaf === undefined) {
|
|
227
|
+
throw new Error(`Transaction ID ${txid} not found in the Merkle Path`)
|
|
228
|
+
}
|
|
229
|
+
return leaf.offset
|
|
198
230
|
}
|
|
199
231
|
|
|
200
232
|
/**
|
|
@@ -206,35 +238,42 @@ export default class MerklePath {
|
|
|
206
238
|
*/
|
|
207
239
|
computeRoot (txid?: string): string {
|
|
208
240
|
if (typeof txid !== 'string') {
|
|
209
|
-
|
|
241
|
+
const foundLeaf = this.path[0].find((leaf) => Boolean(leaf?.hash))
|
|
242
|
+
if (foundLeaf === null || foundLeaf === undefined) {
|
|
243
|
+
throw new Error('No valid leaf found in the Merkle Path')
|
|
244
|
+
}
|
|
245
|
+
txid = foundLeaf.hash
|
|
210
246
|
}
|
|
211
247
|
// Find the index of the txid at the lowest level of the Merkle tree
|
|
248
|
+
if (typeof txid !== 'string') {
|
|
249
|
+
throw new Error('Transaction ID is undefined')
|
|
250
|
+
}
|
|
212
251
|
const index = this.indexOf(txid)
|
|
213
252
|
if (typeof index !== 'number') {
|
|
214
|
-
throw new Error(`This proof does not contain the txid: ${txid}`)
|
|
253
|
+
throw new Error(`This proof does not contain the txid: ${txid ?? 'undefined'}`)
|
|
215
254
|
}
|
|
216
255
|
// Calculate the root using the index as a way to determine which direction to concatenate.
|
|
217
|
-
const hash = (m: string): string =>
|
|
218
|
-
hash256(toArray(m, 'hex').reverse())
|
|
219
|
-
).reverse())
|
|
256
|
+
const hash = (m: string): string =>
|
|
257
|
+
toHex(hash256(toArray(m, 'hex').reverse()).reverse())
|
|
220
258
|
let workingHash = txid
|
|
221
259
|
|
|
222
260
|
// special case for blocks with only one transaction
|
|
223
261
|
if (this.path.length === 1 && this.path[0].length === 1) return workingHash
|
|
224
262
|
|
|
225
263
|
for (let height = 0; height < this.path.length; height++) {
|
|
264
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
226
265
|
const leaves = this.path[height]
|
|
227
|
-
const offset = index >> height ^ 1
|
|
266
|
+
const offset = (index >> height) ^ 1
|
|
228
267
|
const leaf = this.findOrComputeLeaf(height, offset)
|
|
229
268
|
if (typeof leaf !== 'object') {
|
|
230
269
|
throw new Error(`Missing hash for index ${index} at height ${height}`)
|
|
231
270
|
}
|
|
232
|
-
if (leaf.duplicate) {
|
|
233
|
-
workingHash = hash(workingHash + workingHash)
|
|
271
|
+
if (leaf.duplicate === true) {
|
|
272
|
+
workingHash = hash((workingHash ?? '') + (workingHash ?? ''))
|
|
234
273
|
} else if (offset % 2 !== 0) {
|
|
235
|
-
workingHash = hash(leaf.hash + workingHash)
|
|
274
|
+
workingHash = hash((leaf.hash ?? '') + (workingHash ?? ''))
|
|
236
275
|
} else {
|
|
237
|
-
workingHash = hash(workingHash + leaf.hash)
|
|
276
|
+
workingHash = hash((workingHash ?? '') + (leaf.hash ?? ''))
|
|
238
277
|
}
|
|
239
278
|
}
|
|
240
279
|
return workingHash
|
|
@@ -248,14 +287,18 @@ export default class MerklePath {
|
|
|
248
287
|
* @param height
|
|
249
288
|
* @param offset
|
|
250
289
|
*/
|
|
251
|
-
findOrComputeLeaf (
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
290
|
+
findOrComputeLeaf (
|
|
291
|
+
height: number,
|
|
292
|
+
offset: number
|
|
293
|
+
): MerklePathLeaf | undefined {
|
|
294
|
+
const hash = (m: string): string =>
|
|
295
|
+
toHex(hash256(toArray(m, 'hex').reverse()).reverse())
|
|
255
296
|
|
|
256
|
-
let leaf: MerklePathLeaf | undefined = this.path[height].find(
|
|
297
|
+
let leaf: MerklePathLeaf | undefined = this.path[height].find(
|
|
298
|
+
(l) => l.offset === offset
|
|
299
|
+
)
|
|
257
300
|
|
|
258
|
-
if (leaf) return leaf
|
|
301
|
+
if (leaf != null) return leaf
|
|
259
302
|
|
|
260
303
|
if (height === 0) return undefined
|
|
261
304
|
|
|
@@ -263,13 +306,17 @@ export default class MerklePath {
|
|
|
263
306
|
const l = offset << 1
|
|
264
307
|
|
|
265
308
|
const leaf0 = this.findOrComputeLeaf(h, l)
|
|
266
|
-
if (
|
|
309
|
+
if (leaf0 == null || leaf0.hash == null || leaf0.hash === '') return undefined
|
|
267
310
|
|
|
268
311
|
const leaf1 = this.findOrComputeLeaf(h, l + 1)
|
|
269
|
-
if (
|
|
312
|
+
if (leaf1 == null) return undefined
|
|
270
313
|
|
|
271
314
|
let workinghash: string
|
|
272
|
-
if (leaf1.duplicate
|
|
315
|
+
if (leaf1.duplicate === true) {
|
|
316
|
+
workinghash = hash(leaf0.hash + leaf0.hash)
|
|
317
|
+
} else {
|
|
318
|
+
workinghash = hash((leaf1.hash ?? '') + (leaf0.hash ?? ''))
|
|
319
|
+
}
|
|
273
320
|
leaf = {
|
|
274
321
|
offset,
|
|
275
322
|
hash: workinghash
|
|
@@ -306,27 +353,39 @@ export default class MerklePath {
|
|
|
306
353
|
*/
|
|
307
354
|
combine (other: MerklePath): void {
|
|
308
355
|
if (this.blockHeight !== other.blockHeight) {
|
|
309
|
-
throw new Error(
|
|
356
|
+
throw new Error(
|
|
357
|
+
'You cannot combine paths which do not have the same block height.'
|
|
358
|
+
)
|
|
310
359
|
}
|
|
311
360
|
const root1 = this.computeRoot()
|
|
312
361
|
const root2 = other.computeRoot()
|
|
313
362
|
if (root1 !== root2) {
|
|
314
|
-
throw new Error(
|
|
363
|
+
throw new Error(
|
|
364
|
+
'You cannot combine paths which do not have the same root.'
|
|
365
|
+
)
|
|
315
366
|
}
|
|
316
|
-
const combinedPath = []
|
|
367
|
+
const combinedPath: Array<Array<{ offset: number, hash?: string, txid?: boolean, duplicate?: boolean }>> = []
|
|
317
368
|
for (let h = 0; h < this.path.length; h++) {
|
|
318
369
|
combinedPath.push([])
|
|
319
370
|
for (let l = 0; l < this.path[h].length; l++) {
|
|
320
371
|
combinedPath[h].push(this.path[h][l])
|
|
321
372
|
}
|
|
322
373
|
for (let l = 0; l < other.path[h].length; l++) {
|
|
323
|
-
if (
|
|
374
|
+
if (
|
|
375
|
+
combinedPath[h].find(
|
|
376
|
+
(leaf) => leaf.offset === other.path[h][l].offset
|
|
377
|
+
) === undefined
|
|
378
|
+
) {
|
|
324
379
|
combinedPath[h].push(other.path[h][l])
|
|
325
380
|
} else {
|
|
326
381
|
// Ensure that any elements which appear in both are not downgraded to a non txid.
|
|
327
|
-
if (other.path[h][l]?.txid) {
|
|
328
|
-
const target = combinedPath[h].find(
|
|
329
|
-
|
|
382
|
+
if (other.path[h][l]?.txid !== undefined && other.path[h][l]?.txid !== null) {
|
|
383
|
+
const target = combinedPath[h].find(
|
|
384
|
+
(leaf) => leaf.offset === other.path[h][l].offset
|
|
385
|
+
)
|
|
386
|
+
if (target !== null && target !== undefined) {
|
|
387
|
+
target.txid = true
|
|
388
|
+
}
|
|
330
389
|
}
|
|
331
390
|
}
|
|
332
391
|
}
|
|
@@ -340,15 +399,21 @@ export default class MerklePath {
|
|
|
340
399
|
* Assumes that at least all required nodes are present.
|
|
341
400
|
* Leaves all levels sorted by increasing offset.
|
|
342
401
|
*/
|
|
343
|
-
trim () {
|
|
344
|
-
const pushIfNew = (v: number, a: number[]) => {
|
|
345
|
-
if (a.length === 0 || a.slice(-1)[0] !== v) {
|
|
402
|
+
trim (): void {
|
|
403
|
+
const pushIfNew = (v: number, a: number[]): void => {
|
|
404
|
+
if (a.length === 0 || a.slice(-1)[0] !== v) {
|
|
405
|
+
a.push(v)
|
|
406
|
+
}
|
|
346
407
|
}
|
|
347
408
|
|
|
348
|
-
const dropOffsetsFromLevel = (dropOffsets: number[], level: number) => {
|
|
409
|
+
const dropOffsetsFromLevel = (dropOffsets: number[], level: number): void => {
|
|
349
410
|
for (let i = dropOffsets.length; i >= 0; i--) {
|
|
350
|
-
const l = this.path[level].findIndex(
|
|
351
|
-
|
|
411
|
+
const l = this.path[level].findIndex(
|
|
412
|
+
(n) => n.offset === dropOffsets[i]
|
|
413
|
+
)
|
|
414
|
+
if (l >= 0) {
|
|
415
|
+
this.path[level].splice(l, 1)
|
|
416
|
+
}
|
|
352
417
|
}
|
|
353
418
|
}
|
|
354
419
|
|
|
@@ -368,13 +433,13 @@ export default class MerklePath {
|
|
|
368
433
|
}
|
|
369
434
|
for (let l = 0; l < this.path[0].length; l++) {
|
|
370
435
|
const n = this.path[0][l]
|
|
371
|
-
if (n.txid) {
|
|
436
|
+
if (n.txid === true) {
|
|
372
437
|
// level 0 must enable computing level 1 for txid nodes
|
|
373
438
|
pushIfNew(n.offset >> 1, computedOffsets)
|
|
374
439
|
} else {
|
|
375
440
|
const isOdd = n.offset % 2 === 1
|
|
376
441
|
const peer = this.path[0][l + (isOdd ? -1 : 1)]
|
|
377
|
-
if (!peer.txid) {
|
|
442
|
+
if (peer.txid === undefined || peer.txid === null || !peer.txid) {
|
|
378
443
|
// drop non-txid level 0 nodes without a txid peer
|
|
379
444
|
pushIfNew(peer.offset, dropOffsets)
|
|
380
445
|
}
|