@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/script/Spend.ts
CHANGED
|
@@ -144,11 +144,13 @@ export default class Spend {
|
|
|
144
144
|
}
|
|
145
145
|
|
|
146
146
|
const isOpcodeDisabled = (op: number): boolean => {
|
|
147
|
-
return
|
|
147
|
+
return (
|
|
148
|
+
op === OP.OP_2MUL ||
|
|
148
149
|
op === OP.OP_2DIV ||
|
|
149
150
|
op === OP.OP_VERIF ||
|
|
150
151
|
op === OP.OP_VERNOTIF ||
|
|
151
152
|
op === OP.OP_VER
|
|
153
|
+
)
|
|
152
154
|
}
|
|
153
155
|
|
|
154
156
|
const isChunkMinimal = (chunk: ScriptChunk): boolean => {
|
|
@@ -179,8 +181,11 @@ export default class Spend {
|
|
|
179
181
|
return true
|
|
180
182
|
}
|
|
181
183
|
|
|
182
|
-
// Following example from sCrypt now using Number.MAX_SAFE_INTEGER (bsv/lib/transaction/input/input
|
|
183
|
-
const isMinimallyEncoded = (
|
|
184
|
+
// Following example from sCrypt now using Number.MAX_SAFE_INTEGER (bsv/lib/transaction/input/input).
|
|
185
|
+
const isMinimallyEncoded = (
|
|
186
|
+
buf: number[],
|
|
187
|
+
maxNumSize: number = Number.MAX_SAFE_INTEGER
|
|
188
|
+
): boolean => {
|
|
184
189
|
if (buf.length > maxNumSize) {
|
|
185
190
|
return false
|
|
186
191
|
}
|
|
@@ -316,15 +321,21 @@ export default class Spend {
|
|
|
316
321
|
|
|
317
322
|
const checkPublicKeyEncoding = (buf: number[]): boolean => {
|
|
318
323
|
if (buf.length < 33) {
|
|
319
|
-
this.scriptEvaluationError(
|
|
324
|
+
this.scriptEvaluationError(
|
|
325
|
+
'The public key is too short, it must be at least 33 bytes.'
|
|
326
|
+
)
|
|
320
327
|
}
|
|
321
328
|
if (buf[0] === 0x04) {
|
|
322
329
|
if (buf.length !== 65) {
|
|
323
|
-
this.scriptEvaluationError(
|
|
330
|
+
this.scriptEvaluationError(
|
|
331
|
+
'The non-compressed public key must be 65 bytes.'
|
|
332
|
+
)
|
|
324
333
|
}
|
|
325
|
-
} else if (
|
|
334
|
+
} else if (buf[0] === 0x02 || buf[0] === 0x03) {
|
|
326
335
|
if (buf.length !== 33) {
|
|
327
|
-
this.scriptEvaluationError(
|
|
336
|
+
this.scriptEvaluationError(
|
|
337
|
+
'The compressed public key must be 33 bytes.'
|
|
338
|
+
)
|
|
328
339
|
}
|
|
329
340
|
} else {
|
|
330
341
|
this.scriptEvaluationError('The public key is in an unknown format.')
|
|
@@ -355,20 +366,51 @@ export default class Spend {
|
|
|
355
366
|
}
|
|
356
367
|
|
|
357
368
|
const isScriptExecuting = !this.ifStack.includes(false)
|
|
358
|
-
let buf: number[],
|
|
359
|
-
|
|
369
|
+
let buf: number[],
|
|
370
|
+
buf1: number[],
|
|
371
|
+
buf2: number[],
|
|
372
|
+
buf3: number[],
|
|
373
|
+
spliced: number[][],
|
|
374
|
+
n: number,
|
|
375
|
+
size: number,
|
|
376
|
+
rawnum: number[],
|
|
377
|
+
num: number[],
|
|
378
|
+
signbit: number,
|
|
379
|
+
x1: number[],
|
|
380
|
+
x2: number[],
|
|
381
|
+
x3: number[],
|
|
382
|
+
bn: BigNumber,
|
|
383
|
+
bn1: BigNumber,
|
|
384
|
+
bn2: BigNumber,
|
|
385
|
+
bn3: BigNumber,
|
|
386
|
+
bufSig: number[],
|
|
387
|
+
bufPubkey: number[],
|
|
388
|
+
subscript
|
|
389
|
+
let sig,
|
|
390
|
+
pubkey,
|
|
391
|
+
i: number,
|
|
392
|
+
fOk: boolean,
|
|
393
|
+
nKeysCount: number,
|
|
394
|
+
ikey: number,
|
|
395
|
+
ikey2: number,
|
|
396
|
+
nSigsCount: number,
|
|
397
|
+
isig: number
|
|
360
398
|
let fValue: boolean, fEqual: boolean, fSuccess: boolean
|
|
361
399
|
|
|
362
400
|
// Read instruction
|
|
363
401
|
const currentOpcode = operation.op
|
|
364
402
|
if (typeof currentOpcode === 'undefined') {
|
|
365
|
-
this.scriptEvaluationError(
|
|
403
|
+
this.scriptEvaluationError(
|
|
404
|
+
`An opcode is missing in this chunk of the ${this.context}!`
|
|
405
|
+
)
|
|
366
406
|
}
|
|
367
407
|
if (
|
|
368
408
|
Array.isArray(operation.data) &&
|
|
369
409
|
operation.data.length > maxScriptElementSize
|
|
370
410
|
) {
|
|
371
|
-
this.scriptEvaluationError(
|
|
411
|
+
this.scriptEvaluationError(
|
|
412
|
+
`It's not currently possible to push data larger than ${maxScriptElementSize} bytes.`
|
|
413
|
+
)
|
|
372
414
|
}
|
|
373
415
|
|
|
374
416
|
if (isScriptExecuting && isOpcodeDisabled(currentOpcode)) {
|
|
@@ -376,7 +418,8 @@ export default class Spend {
|
|
|
376
418
|
}
|
|
377
419
|
|
|
378
420
|
if (
|
|
379
|
-
isScriptExecuting &&
|
|
421
|
+
isScriptExecuting &&
|
|
422
|
+
currentOpcode >= 0 &&
|
|
380
423
|
currentOpcode <= OP.OP_PUSHDATA4
|
|
381
424
|
) {
|
|
382
425
|
if (requireMinimalPush && !isChunkMinimal(operation)) {
|
|
@@ -388,7 +431,10 @@ export default class Spend {
|
|
|
388
431
|
} else {
|
|
389
432
|
this.stack.push(operation.data)
|
|
390
433
|
}
|
|
391
|
-
} else if (
|
|
434
|
+
} else if (
|
|
435
|
+
isScriptExecuting ||
|
|
436
|
+
(OP.OP_IF <= currentOpcode && currentOpcode <= OP.OP_ENDIF)
|
|
437
|
+
) {
|
|
392
438
|
switch (currentOpcode) {
|
|
393
439
|
case OP.OP_1NEGATE:
|
|
394
440
|
case OP.OP_1:
|
|
@@ -494,7 +540,9 @@ export default class Spend {
|
|
|
494
540
|
fValue = false
|
|
495
541
|
if (isScriptExecuting) {
|
|
496
542
|
if (this.stack.length < 1) {
|
|
497
|
-
this.scriptEvaluationError(
|
|
543
|
+
this.scriptEvaluationError(
|
|
544
|
+
'OP_IF and OP_NOTIF require at least one item on the stack when they are used!'
|
|
545
|
+
)
|
|
498
546
|
}
|
|
499
547
|
buf = this.stacktop(-1)
|
|
500
548
|
|
|
@@ -511,7 +559,8 @@ export default class Spend {
|
|
|
511
559
|
if (this.ifStack.length === 0) {
|
|
512
560
|
this.scriptEvaluationError('OP_ELSE requires a preceeding OP_IF.')
|
|
513
561
|
}
|
|
514
|
-
this.ifStack[this.ifStack.length - 1] =
|
|
562
|
+
this.ifStack[this.ifStack.length - 1] =
|
|
563
|
+
!this.ifStack[this.ifStack.length - 1]
|
|
515
564
|
break
|
|
516
565
|
|
|
517
566
|
case OP.OP_ENDIF:
|
|
@@ -523,14 +572,18 @@ export default class Spend {
|
|
|
523
572
|
|
|
524
573
|
case OP.OP_VERIFY:
|
|
525
574
|
if (this.stack.length < 1) {
|
|
526
|
-
this.scriptEvaluationError(
|
|
575
|
+
this.scriptEvaluationError(
|
|
576
|
+
'OP_VERIFY requires at least one item to be on the stack.'
|
|
577
|
+
)
|
|
527
578
|
}
|
|
528
579
|
buf = this.stacktop(-1)
|
|
529
580
|
fValue = this.castToBool(buf)
|
|
530
581
|
if (fValue) {
|
|
531
582
|
this.stack.pop()
|
|
532
583
|
} else {
|
|
533
|
-
this.scriptEvaluationError(
|
|
584
|
+
this.scriptEvaluationError(
|
|
585
|
+
'OP_VERIFY requires the top stack value to be truthy.'
|
|
586
|
+
)
|
|
534
587
|
}
|
|
535
588
|
break
|
|
536
589
|
|
|
@@ -545,21 +598,26 @@ export default class Spend {
|
|
|
545
598
|
|
|
546
599
|
case OP.OP_TOALTSTACK:
|
|
547
600
|
if (this.stack.length < 1) {
|
|
548
|
-
this.scriptEvaluationError(
|
|
601
|
+
this.scriptEvaluationError(
|
|
602
|
+
'OP_TOALTSTACK requires at oeast one item to be on the stack.')
|
|
549
603
|
}
|
|
550
|
-
this.altStack.push(this.stack.pop())
|
|
604
|
+
this.altStack.push(this.stack.pop() ?? [])
|
|
551
605
|
break
|
|
552
606
|
|
|
553
607
|
case OP.OP_FROMALTSTACK:
|
|
554
608
|
if (this.altStack.length < 1) {
|
|
555
|
-
this.scriptEvaluationError(
|
|
609
|
+
this.scriptEvaluationError(
|
|
610
|
+
'OP_FROMALTSTACK requires at least one item to be on the stack.'
|
|
611
|
+
)
|
|
556
612
|
}
|
|
557
|
-
this.stack.push(this.altStack.pop())
|
|
613
|
+
this.stack.push(this.altStack.pop() ?? [])
|
|
558
614
|
break
|
|
559
615
|
|
|
560
616
|
case OP.OP_2DROP:
|
|
561
617
|
if (this.stack.length < 2) {
|
|
562
|
-
this.scriptEvaluationError(
|
|
618
|
+
this.scriptEvaluationError(
|
|
619
|
+
'OP_2DROP requires at least two items to be on the stack.'
|
|
620
|
+
)
|
|
563
621
|
}
|
|
564
622
|
this.stack.pop()
|
|
565
623
|
this.stack.pop()
|
|
@@ -567,7 +625,9 @@ export default class Spend {
|
|
|
567
625
|
|
|
568
626
|
case OP.OP_2DUP:
|
|
569
627
|
if (this.stack.length < 2) {
|
|
570
|
-
this.scriptEvaluationError(
|
|
628
|
+
this.scriptEvaluationError(
|
|
629
|
+
'OP_2DUP requires at least two items to be on the stack.'
|
|
630
|
+
)
|
|
571
631
|
}
|
|
572
632
|
buf1 = this.stacktop(-2)
|
|
573
633
|
buf2 = this.stacktop(-1)
|
|
@@ -577,7 +637,9 @@ export default class Spend {
|
|
|
577
637
|
|
|
578
638
|
case OP.OP_3DUP:
|
|
579
639
|
if (this.stack.length < 3) {
|
|
580
|
-
this.scriptEvaluationError(
|
|
640
|
+
this.scriptEvaluationError(
|
|
641
|
+
'OP_3DUP requires at least three items to be on the stack.'
|
|
642
|
+
)
|
|
581
643
|
}
|
|
582
644
|
buf1 = this.stacktop(-3)
|
|
583
645
|
buf2 = this.stacktop(-2)
|
|
@@ -589,7 +651,9 @@ export default class Spend {
|
|
|
589
651
|
|
|
590
652
|
case OP.OP_2OVER:
|
|
591
653
|
if (this.stack.length < 4) {
|
|
592
|
-
this.scriptEvaluationError(
|
|
654
|
+
this.scriptEvaluationError(
|
|
655
|
+
'OP_2OVER requires at least four items to be on the stack.'
|
|
656
|
+
)
|
|
593
657
|
}
|
|
594
658
|
buf1 = this.stacktop(-4)
|
|
595
659
|
buf2 = this.stacktop(-3)
|
|
@@ -599,7 +663,9 @@ export default class Spend {
|
|
|
599
663
|
|
|
600
664
|
case OP.OP_2ROT:
|
|
601
665
|
if (this.stack.length < 6) {
|
|
602
|
-
this.scriptEvaluationError(
|
|
666
|
+
this.scriptEvaluationError(
|
|
667
|
+
'OP_2ROT requires at least six items to be on the stack.'
|
|
668
|
+
)
|
|
603
669
|
}
|
|
604
670
|
spliced = this.stack.splice(this.stack.length - 6, 2)
|
|
605
671
|
this.stack.push(spliced[0])
|
|
@@ -608,7 +674,9 @@ export default class Spend {
|
|
|
608
674
|
|
|
609
675
|
case OP.OP_2SWAP:
|
|
610
676
|
if (this.stack.length < 4) {
|
|
611
|
-
this.scriptEvaluationError(
|
|
677
|
+
this.scriptEvaluationError(
|
|
678
|
+
'OP_2SWAP requires at least four items to be on the stack.'
|
|
679
|
+
)
|
|
612
680
|
}
|
|
613
681
|
spliced = this.stack.splice(this.stack.length - 4, 2)
|
|
614
682
|
this.stack.push(spliced[0])
|
|
@@ -617,7 +685,9 @@ export default class Spend {
|
|
|
617
685
|
|
|
618
686
|
case OP.OP_IFDUP:
|
|
619
687
|
if (this.stack.length < 1) {
|
|
620
|
-
this.scriptEvaluationError(
|
|
688
|
+
this.scriptEvaluationError(
|
|
689
|
+
'OP_IFDUP requires at least one item to be on the stack.'
|
|
690
|
+
)
|
|
621
691
|
}
|
|
622
692
|
buf = this.stacktop(-1)
|
|
623
693
|
fValue = this.castToBool(buf)
|
|
@@ -633,28 +703,36 @@ export default class Spend {
|
|
|
633
703
|
|
|
634
704
|
case OP.OP_DROP:
|
|
635
705
|
if (this.stack.length < 1) {
|
|
636
|
-
this.scriptEvaluationError(
|
|
706
|
+
this.scriptEvaluationError(
|
|
707
|
+
'OP_DROP requires at least one item to be on the stack.'
|
|
708
|
+
)
|
|
637
709
|
}
|
|
638
710
|
this.stack.pop()
|
|
639
711
|
break
|
|
640
712
|
|
|
641
713
|
case OP.OP_DUP:
|
|
642
714
|
if (this.stack.length < 1) {
|
|
643
|
-
this.scriptEvaluationError(
|
|
715
|
+
this.scriptEvaluationError(
|
|
716
|
+
'OP_DUP requires at least one item to be on the stack.'
|
|
717
|
+
)
|
|
644
718
|
}
|
|
645
719
|
this.stack.push([...this.stacktop(-1)])
|
|
646
720
|
break
|
|
647
721
|
|
|
648
722
|
case OP.OP_NIP:
|
|
649
723
|
if (this.stack.length < 2) {
|
|
650
|
-
this.scriptEvaluationError(
|
|
724
|
+
this.scriptEvaluationError(
|
|
725
|
+
'OP_NIP requires at least two items to be on the stack.'
|
|
726
|
+
)
|
|
651
727
|
}
|
|
652
728
|
this.stack.splice(this.stack.length - 2, 1)
|
|
653
729
|
break
|
|
654
730
|
|
|
655
731
|
case OP.OP_OVER:
|
|
656
732
|
if (this.stack.length < 2) {
|
|
657
|
-
this.scriptEvaluationError(
|
|
733
|
+
this.scriptEvaluationError(
|
|
734
|
+
'OP_OVER requires at least two items to be on the stack.'
|
|
735
|
+
)
|
|
658
736
|
}
|
|
659
737
|
this.stack.push([...this.stacktop(-2)])
|
|
660
738
|
break
|
|
@@ -662,14 +740,18 @@ export default class Spend {
|
|
|
662
740
|
case OP.OP_PICK:
|
|
663
741
|
case OP.OP_ROLL:
|
|
664
742
|
if (this.stack.length < 2) {
|
|
665
|
-
this.scriptEvaluationError(
|
|
743
|
+
this.scriptEvaluationError(
|
|
744
|
+
`${OP[currentOpcode] as string} requires at least two items to be on the stack.`
|
|
745
|
+
)
|
|
666
746
|
}
|
|
667
747
|
buf = this.stacktop(-1)
|
|
668
748
|
bn = BigNumber.fromScriptNum(buf, requireMinimalPush)
|
|
669
749
|
n = bn.toNumber()
|
|
670
750
|
this.stack.pop()
|
|
671
751
|
if (n < 0 || n >= this.stack.length) {
|
|
672
|
-
this.scriptEvaluationError(
|
|
752
|
+
this.scriptEvaluationError(
|
|
753
|
+
`${OP[currentOpcode] as string} requires the top stack element to be 0 or a positive number less than the current size of the stack.`
|
|
754
|
+
)
|
|
673
755
|
}
|
|
674
756
|
buf = this.stacktop(-n - 1)
|
|
675
757
|
if (currentOpcode === OP.OP_ROLL) {
|
|
@@ -680,7 +762,9 @@ export default class Spend {
|
|
|
680
762
|
|
|
681
763
|
case OP.OP_ROT:
|
|
682
764
|
if (this.stack.length < 3) {
|
|
683
|
-
this.scriptEvaluationError(
|
|
765
|
+
this.scriptEvaluationError(
|
|
766
|
+
'OP_ROT requires at least three items to be on the stack.'
|
|
767
|
+
)
|
|
684
768
|
}
|
|
685
769
|
x1 = this.stacktop(-3)
|
|
686
770
|
x2 = this.stacktop(-2)
|
|
@@ -692,7 +776,9 @@ export default class Spend {
|
|
|
692
776
|
|
|
693
777
|
case OP.OP_SWAP:
|
|
694
778
|
if (this.stack.length < 2) {
|
|
695
|
-
this.scriptEvaluationError(
|
|
779
|
+
this.scriptEvaluationError(
|
|
780
|
+
'OP_SWAP requires at least two items to be on the stack.'
|
|
781
|
+
)
|
|
696
782
|
}
|
|
697
783
|
x1 = this.stacktop(-2)
|
|
698
784
|
x2 = this.stacktop(-1)
|
|
@@ -702,14 +788,18 @@ export default class Spend {
|
|
|
702
788
|
|
|
703
789
|
case OP.OP_TUCK:
|
|
704
790
|
if (this.stack.length < 2) {
|
|
705
|
-
this.scriptEvaluationError(
|
|
791
|
+
this.scriptEvaluationError(
|
|
792
|
+
'OP_TUCK requires at least two items to be on the stack.'
|
|
793
|
+
)
|
|
706
794
|
}
|
|
707
795
|
this.stack.splice(this.stack.length - 2, 0, [...this.stacktop(-1)])
|
|
708
796
|
break
|
|
709
797
|
|
|
710
798
|
case OP.OP_SIZE:
|
|
711
799
|
if (this.stack.length < 1) {
|
|
712
|
-
this.scriptEvaluationError(
|
|
800
|
+
this.scriptEvaluationError(
|
|
801
|
+
'OP_SIZE requires at least one item to be on the stack.'
|
|
802
|
+
)
|
|
713
803
|
}
|
|
714
804
|
bn = new BigNumber(this.stacktop(-1).length)
|
|
715
805
|
this.stack.push(bn.toScriptNum())
|
|
@@ -719,13 +809,17 @@ export default class Spend {
|
|
|
719
809
|
case OP.OP_OR:
|
|
720
810
|
case OP.OP_XOR:
|
|
721
811
|
if (this.stack.length < 2) {
|
|
722
|
-
this.scriptEvaluationError(
|
|
812
|
+
this.scriptEvaluationError(
|
|
813
|
+
`${OP[currentOpcode] as string} requires at least one item to be on the stack.`
|
|
814
|
+
)
|
|
723
815
|
}
|
|
724
816
|
buf1 = this.stacktop(-2)
|
|
725
817
|
buf2 = this.stacktop(-1)
|
|
726
818
|
|
|
727
819
|
if (buf1.length !== buf2.length) {
|
|
728
|
-
this.scriptEvaluationError(
|
|
820
|
+
this.scriptEvaluationError(
|
|
821
|
+
`${OP[currentOpcode] as string} requires the top two stack items to be the same size.`
|
|
822
|
+
)
|
|
729
823
|
}
|
|
730
824
|
|
|
731
825
|
switch (currentOpcode) {
|
|
@@ -752,7 +846,9 @@ export default class Spend {
|
|
|
752
846
|
|
|
753
847
|
case OP.OP_INVERT:
|
|
754
848
|
if (this.stack.length < 1) {
|
|
755
|
-
this.scriptEvaluationError(
|
|
849
|
+
this.scriptEvaluationError(
|
|
850
|
+
'OP_INVERT requires at least one item to be on the stack.'
|
|
851
|
+
)
|
|
756
852
|
}
|
|
757
853
|
buf = this.stacktop(-1)
|
|
758
854
|
for (let i = 0; i < buf.length; i++) {
|
|
@@ -763,17 +859,24 @@ export default class Spend {
|
|
|
763
859
|
case OP.OP_LSHIFT:
|
|
764
860
|
case OP.OP_RSHIFT:
|
|
765
861
|
if (this.stack.length < 2) {
|
|
766
|
-
this.scriptEvaluationError(
|
|
862
|
+
this.scriptEvaluationError(
|
|
863
|
+
`${OP[currentOpcode] as string} requires at least two items to be on the stack.`
|
|
864
|
+
)
|
|
767
865
|
}
|
|
768
866
|
buf1 = this.stacktop(-2)
|
|
769
867
|
if (buf1.length === 0) {
|
|
770
868
|
this.stack.pop()
|
|
771
869
|
} else {
|
|
772
870
|
bn1 = new BigNumber(buf1)
|
|
773
|
-
bn2 = BigNumber.fromScriptNum(
|
|
871
|
+
bn2 = BigNumber.fromScriptNum(
|
|
872
|
+
this.stacktop(-1),
|
|
873
|
+
requireMinimalPush
|
|
874
|
+
)
|
|
774
875
|
n = bn2.toNumber()
|
|
775
876
|
if (n < 0) {
|
|
776
|
-
this.scriptEvaluationError(
|
|
877
|
+
this.scriptEvaluationError(
|
|
878
|
+
`${OP[currentOpcode] as string} requires the top item on the stack not to be negative.`
|
|
879
|
+
)
|
|
777
880
|
}
|
|
778
881
|
this.stack.pop()
|
|
779
882
|
this.stack.pop()
|
|
@@ -795,7 +898,9 @@ export default class Spend {
|
|
|
795
898
|
case OP.OP_EQUAL:
|
|
796
899
|
case OP.OP_EQUALVERIFY:
|
|
797
900
|
if (this.stack.length < 2) {
|
|
798
|
-
this.scriptEvaluationError(
|
|
901
|
+
this.scriptEvaluationError(
|
|
902
|
+
`${OP[currentOpcode] as string} requires at least two items to be on the stack.`
|
|
903
|
+
)
|
|
799
904
|
}
|
|
800
905
|
buf1 = this.stacktop(-2)
|
|
801
906
|
buf2 = this.stacktop(-1)
|
|
@@ -807,7 +912,9 @@ export default class Spend {
|
|
|
807
912
|
if (fEqual) {
|
|
808
913
|
this.stack.pop()
|
|
809
914
|
} else {
|
|
810
|
-
this.scriptEvaluationError(
|
|
915
|
+
this.scriptEvaluationError(
|
|
916
|
+
'OP_EQUALVERIFY requires the top two stack items to be equal.'
|
|
917
|
+
)
|
|
811
918
|
}
|
|
812
919
|
}
|
|
813
920
|
break
|
|
@@ -819,7 +926,9 @@ export default class Spend {
|
|
|
819
926
|
case OP.OP_NOT:
|
|
820
927
|
case OP.OP_0NOTEQUAL:
|
|
821
928
|
if (this.stack.length < 1) {
|
|
822
|
-
this.scriptEvaluationError(
|
|
929
|
+
this.scriptEvaluationError(
|
|
930
|
+
`${OP[currentOpcode] as string} requires at least one items to be on the stack.`
|
|
931
|
+
)
|
|
823
932
|
}
|
|
824
933
|
buf = this.stacktop(-1)
|
|
825
934
|
bn = BigNumber.fromScriptNum(buf, requireMinimalPush)
|
|
@@ -839,10 +948,10 @@ export default class Spend {
|
|
|
839
948
|
}
|
|
840
949
|
break
|
|
841
950
|
case OP.OP_NOT:
|
|
842
|
-
bn = new BigNumber(
|
|
951
|
+
bn = new BigNumber(bn.cmpn(0) === 0 ? 1 : 0 + 0)
|
|
843
952
|
break
|
|
844
953
|
case OP.OP_0NOTEQUAL:
|
|
845
|
-
bn = new BigNumber(
|
|
954
|
+
bn = new BigNumber(bn.cmpn(0) !== 0 ? 1 : 0 + 0)
|
|
846
955
|
break
|
|
847
956
|
}
|
|
848
957
|
this.stack.pop()
|
|
@@ -866,7 +975,9 @@ export default class Spend {
|
|
|
866
975
|
case OP.OP_MIN:
|
|
867
976
|
case OP.OP_MAX:
|
|
868
977
|
if (this.stack.length < 2) {
|
|
869
|
-
this.scriptEvaluationError(
|
|
978
|
+
this.scriptEvaluationError(
|
|
979
|
+
`${OP[currentOpcode] as string} requires at least two items to be on the stack.`
|
|
980
|
+
)
|
|
870
981
|
}
|
|
871
982
|
bn1 = BigNumber.fromScriptNum(this.stacktop(-2), requireMinimalPush)
|
|
872
983
|
bn2 = BigNumber.fromScriptNum(this.stacktop(-1), requireMinimalPush)
|
|
@@ -896,40 +1007,40 @@ export default class Spend {
|
|
|
896
1007
|
break
|
|
897
1008
|
case OP.OP_BOOLAND:
|
|
898
1009
|
bn = new BigNumber(
|
|
899
|
-
|
|
1010
|
+
bn1.cmpn(0) !== 0 && bn2.cmpn(0) !== 0 ? 1 : 0 + 0
|
|
900
1011
|
)
|
|
901
1012
|
break
|
|
902
1013
|
case OP.OP_BOOLOR:
|
|
903
1014
|
bn = new BigNumber(
|
|
904
|
-
|
|
1015
|
+
bn1.cmpn(0) !== 0 || bn2.cmpn(0) !== 0 ? 1 : 0 + 0
|
|
905
1016
|
)
|
|
906
1017
|
break
|
|
907
1018
|
case OP.OP_NUMEQUAL:
|
|
908
|
-
bn = new BigNumber(
|
|
1019
|
+
bn = new BigNumber(bn1.cmp(bn2) === 0 ? 1 : 0 + 0)
|
|
909
1020
|
break
|
|
910
1021
|
case OP.OP_NUMEQUALVERIFY:
|
|
911
|
-
bn = new BigNumber(
|
|
1022
|
+
bn = new BigNumber(bn1.cmp(bn2) === 0 ? 1 : 0 + 0)
|
|
912
1023
|
break
|
|
913
1024
|
case OP.OP_NUMNOTEQUAL:
|
|
914
|
-
bn = new BigNumber(
|
|
1025
|
+
bn = new BigNumber(bn1.cmp(bn2) !== 0 ? 1 : 0 + 0)
|
|
915
1026
|
break
|
|
916
1027
|
case OP.OP_LESSTHAN:
|
|
917
|
-
bn = new BigNumber(
|
|
1028
|
+
bn = new BigNumber(bn1.cmp(bn2) < 0 ? 1 : 0 + 0)
|
|
918
1029
|
break
|
|
919
1030
|
case OP.OP_GREATERTHAN:
|
|
920
|
-
bn = new BigNumber(
|
|
1031
|
+
bn = new BigNumber(bn1.cmp(bn2) > 0 ? 1 : 0 + 0)
|
|
921
1032
|
break
|
|
922
1033
|
case OP.OP_LESSTHANOREQUAL:
|
|
923
|
-
bn = new BigNumber(
|
|
1034
|
+
bn = new BigNumber(bn1.cmp(bn2) <= 0 ? 1 : 0 + 0)
|
|
924
1035
|
break
|
|
925
1036
|
case OP.OP_GREATERTHANOREQUAL:
|
|
926
|
-
bn = new BigNumber(
|
|
1037
|
+
bn = new BigNumber(bn1.cmp(bn2) >= 0 ? 1 : 0 + 0)
|
|
927
1038
|
break
|
|
928
1039
|
case OP.OP_MIN:
|
|
929
|
-
bn =
|
|
1040
|
+
bn = bn1.cmp(bn2) < 0 ? bn1 : bn2
|
|
930
1041
|
break
|
|
931
1042
|
case OP.OP_MAX:
|
|
932
|
-
bn =
|
|
1043
|
+
bn = bn1.cmp(bn2) > 0 ? bn1 : bn2
|
|
933
1044
|
break
|
|
934
1045
|
}
|
|
935
1046
|
this.stack.pop()
|
|
@@ -940,19 +1051,23 @@ export default class Spend {
|
|
|
940
1051
|
if (this.castToBool(this.stacktop(-1))) {
|
|
941
1052
|
this.stack.pop()
|
|
942
1053
|
} else {
|
|
943
|
-
this.scriptEvaluationError(
|
|
1054
|
+
this.scriptEvaluationError(
|
|
1055
|
+
'OP_NUMEQUALVERIFY requires the top stack item to be truthy.'
|
|
1056
|
+
)
|
|
944
1057
|
}
|
|
945
1058
|
}
|
|
946
1059
|
break
|
|
947
1060
|
|
|
948
1061
|
case OP.OP_WITHIN:
|
|
949
1062
|
if (this.stack.length < 3) {
|
|
950
|
-
this.scriptEvaluationError(
|
|
1063
|
+
this.scriptEvaluationError(
|
|
1064
|
+
'OP_WITHIN requires at least three items to be on the stack.'
|
|
1065
|
+
)
|
|
951
1066
|
}
|
|
952
1067
|
bn1 = BigNumber.fromScriptNum(this.stacktop(-3), requireMinimalPush)
|
|
953
1068
|
bn2 = BigNumber.fromScriptNum(this.stacktop(-2), requireMinimalPush)
|
|
954
1069
|
bn3 = BigNumber.fromScriptNum(this.stacktop(-1), requireMinimalPush)
|
|
955
|
-
fValue =
|
|
1070
|
+
fValue = bn2.cmp(bn1) <= 0 && bn1.cmp(bn3) < 0
|
|
956
1071
|
this.stack.pop()
|
|
957
1072
|
this.stack.pop()
|
|
958
1073
|
this.stack.pop()
|
|
@@ -963,10 +1078,14 @@ export default class Spend {
|
|
|
963
1078
|
case OP.OP_SHA1:
|
|
964
1079
|
case OP.OP_SHA256:
|
|
965
1080
|
case OP.OP_HASH160:
|
|
966
|
-
case OP.OP_HASH256:
|
|
1081
|
+
case OP.OP_HASH256: {
|
|
967
1082
|
if (this.stack.length < 1) {
|
|
968
|
-
this.scriptEvaluationError(
|
|
1083
|
+
this.scriptEvaluationError(
|
|
1084
|
+
`${OP[currentOpcode] as string} requires at least one item to be on the stack.`
|
|
1085
|
+
)
|
|
969
1086
|
}
|
|
1087
|
+
|
|
1088
|
+
let bufHash: number[] = [] // ✅ Initialize bufHash to an empty array
|
|
970
1089
|
buf = this.stacktop(-1)
|
|
971
1090
|
if (currentOpcode === OP.OP_RIPEMD160) {
|
|
972
1091
|
bufHash = Hash.ripemd160(buf)
|
|
@@ -979,9 +1098,11 @@ export default class Spend {
|
|
|
979
1098
|
} else if (currentOpcode === OP.OP_HASH256) {
|
|
980
1099
|
bufHash = Hash.hash256(buf)
|
|
981
1100
|
}
|
|
1101
|
+
|
|
982
1102
|
this.stack.pop()
|
|
983
1103
|
this.stack.push(bufHash)
|
|
984
1104
|
break
|
|
1105
|
+
}
|
|
985
1106
|
|
|
986
1107
|
case OP.OP_CODESEPARATOR:
|
|
987
1108
|
this.lastCodeSeparator = this.programCounter
|
|
@@ -990,7 +1111,9 @@ export default class Spend {
|
|
|
990
1111
|
case OP.OP_CHECKSIG:
|
|
991
1112
|
case OP.OP_CHECKSIGVERIFY:
|
|
992
1113
|
if (this.stack.length < 2) {
|
|
993
|
-
this.scriptEvaluationError(
|
|
1114
|
+
this.scriptEvaluationError(
|
|
1115
|
+
`${OP[currentOpcode] as string} requires at least two items to be on the stack.`
|
|
1116
|
+
)
|
|
994
1117
|
}
|
|
995
1118
|
|
|
996
1119
|
bufSig = this.stacktop(-2)
|
|
@@ -1000,15 +1123,21 @@ export default class Spend {
|
|
|
1000
1123
|
!checkSignatureEncoding(bufSig) ||
|
|
1001
1124
|
!checkPublicKeyEncoding(bufPubkey)
|
|
1002
1125
|
) {
|
|
1003
|
-
this.scriptEvaluationError(
|
|
1126
|
+
this.scriptEvaluationError(
|
|
1127
|
+
`${OP[currentOpcode] as string} requires correct encoding for the public key and signature.`
|
|
1128
|
+
)
|
|
1004
1129
|
}
|
|
1005
1130
|
|
|
1006
1131
|
// Subset of script starting at the most recent codeseparator
|
|
1007
1132
|
// CScript scriptCode(pbegincodehash, pend);
|
|
1008
1133
|
if (this.context === 'UnlockingScript') {
|
|
1009
|
-
subscript = new Script(
|
|
1134
|
+
subscript = new Script(
|
|
1135
|
+
this.unlockingScript.chunks.slice(this.lastCodeSeparator ?? 0)
|
|
1136
|
+
)
|
|
1010
1137
|
} else {
|
|
1011
|
-
subscript = new Script(
|
|
1138
|
+
subscript = new Script(
|
|
1139
|
+
this.lockingScript.chunks.slice(this.lastCodeSeparator ?? 0)
|
|
1140
|
+
)
|
|
1012
1141
|
}
|
|
1013
1142
|
|
|
1014
1143
|
// Drop the signature, since there's no way for a signature to sign itself
|
|
@@ -1024,7 +1153,9 @@ export default class Spend {
|
|
|
1024
1153
|
}
|
|
1025
1154
|
|
|
1026
1155
|
if (!fSuccess && bufSig.length > 0) {
|
|
1027
|
-
this.scriptEvaluationError(
|
|
1156
|
+
this.scriptEvaluationError(
|
|
1157
|
+
`${OP[currentOpcode] as string} failed to verify the signature, and requires an empty signature when verification fails.`
|
|
1158
|
+
)
|
|
1028
1159
|
}
|
|
1029
1160
|
|
|
1030
1161
|
this.stack.pop()
|
|
@@ -1036,23 +1167,31 @@ export default class Spend {
|
|
|
1036
1167
|
if (fSuccess) {
|
|
1037
1168
|
this.stack.pop()
|
|
1038
1169
|
} else {
|
|
1039
|
-
this.scriptEvaluationError(
|
|
1170
|
+
this.scriptEvaluationError(
|
|
1171
|
+
'OP_CHECKSIGVERIFY requires that a valid signature is provided.'
|
|
1172
|
+
)
|
|
1040
1173
|
}
|
|
1041
1174
|
}
|
|
1042
1175
|
break
|
|
1043
1176
|
|
|
1044
1177
|
case OP.OP_CHECKMULTISIG:
|
|
1045
1178
|
case OP.OP_CHECKMULTISIGVERIFY:
|
|
1046
|
-
|
|
1047
1179
|
i = 1
|
|
1048
1180
|
if (this.stack.length < i) {
|
|
1049
|
-
this.scriptEvaluationError(
|
|
1181
|
+
this.scriptEvaluationError(
|
|
1182
|
+
`${OP[currentOpcode] as string} requires at least 1 item to be on the stack.`
|
|
1183
|
+
)
|
|
1050
1184
|
}
|
|
1051
1185
|
|
|
1052
|
-
nKeysCount = BigNumber.fromScriptNum(
|
|
1186
|
+
nKeysCount = BigNumber.fromScriptNum(
|
|
1187
|
+
this.stacktop(-i),
|
|
1188
|
+
requireMinimalPush
|
|
1189
|
+
).toNumber()
|
|
1053
1190
|
// TODO: Keys and opcount are parameterized in client. No magic numbers!
|
|
1054
1191
|
if (nKeysCount < 0 || nKeysCount > maxMultisigKeyCount) {
|
|
1055
|
-
this.scriptEvaluationError(
|
|
1192
|
+
this.scriptEvaluationError(
|
|
1193
|
+
`${OP[currentOpcode] as string} requires a key count between 0 and ${maxMultisigKeyCount}.`
|
|
1194
|
+
)
|
|
1056
1195
|
}
|
|
1057
1196
|
ikey = ++i
|
|
1058
1197
|
i += nKeysCount
|
|
@@ -1064,24 +1203,37 @@ export default class Spend {
|
|
|
1064
1203
|
ikey2 = nKeysCount + 2
|
|
1065
1204
|
|
|
1066
1205
|
if (this.stack.length < i) {
|
|
1067
|
-
this.scriptEvaluationError(
|
|
1206
|
+
this.scriptEvaluationError(
|
|
1207
|
+
`${OP[currentOpcode] as string} requires the number of stack items not to be less than the number of keys used.`
|
|
1208
|
+
)
|
|
1068
1209
|
}
|
|
1069
1210
|
|
|
1070
|
-
nSigsCount = BigNumber.fromScriptNum(
|
|
1211
|
+
nSigsCount = BigNumber.fromScriptNum(
|
|
1212
|
+
this.stacktop(-i),
|
|
1213
|
+
requireMinimalPush
|
|
1214
|
+
).toNumber()
|
|
1071
1215
|
if (nSigsCount < 0 || nSigsCount > nKeysCount) {
|
|
1072
|
-
this.scriptEvaluationError(
|
|
1216
|
+
this.scriptEvaluationError(
|
|
1217
|
+
`${OP[currentOpcode] as string} requires the number of signatures to be no greater than the number of keys.`
|
|
1218
|
+
)
|
|
1073
1219
|
}
|
|
1074
1220
|
isig = ++i
|
|
1075
1221
|
i += nSigsCount
|
|
1076
1222
|
if (this.stack.length < i) {
|
|
1077
|
-
this.scriptEvaluationError(
|
|
1223
|
+
this.scriptEvaluationError(
|
|
1224
|
+
`${OP[currentOpcode] as string} requires the number of stack items not to be less than the number of signatures provided.`
|
|
1225
|
+
)
|
|
1078
1226
|
}
|
|
1079
1227
|
|
|
1080
1228
|
// Subset of script starting at the most recent codeseparator
|
|
1081
1229
|
if (this.context === 'UnlockingScript') {
|
|
1082
|
-
subscript = new Script(
|
|
1230
|
+
subscript = new Script(
|
|
1231
|
+
this.unlockingScript.chunks.slice(this.lastCodeSeparator ?? 0)
|
|
1232
|
+
)
|
|
1083
1233
|
} else {
|
|
1084
|
-
subscript = new Script(
|
|
1234
|
+
subscript = new Script(
|
|
1235
|
+
this.lockingScript.chunks.slice(this.lastCodeSeparator ?? 0)
|
|
1236
|
+
)
|
|
1085
1237
|
}
|
|
1086
1238
|
|
|
1087
1239
|
// Drop the signatures, since there's no way for a signature to sign itself
|
|
@@ -1101,7 +1253,9 @@ export default class Spend {
|
|
|
1101
1253
|
!checkSignatureEncoding(bufSig) ||
|
|
1102
1254
|
!checkPublicKeyEncoding(bufPubkey)
|
|
1103
1255
|
) {
|
|
1104
|
-
this.scriptEvaluationError(
|
|
1256
|
+
this.scriptEvaluationError(
|
|
1257
|
+
`${OP[currentOpcode] as string} requires correct encoding for the public key and signature.`
|
|
1258
|
+
)
|
|
1105
1259
|
}
|
|
1106
1260
|
|
|
1107
1261
|
try {
|
|
@@ -1129,10 +1283,10 @@ export default class Spend {
|
|
|
1129
1283
|
|
|
1130
1284
|
// Clean up stack of actual arguments
|
|
1131
1285
|
while (i-- > 1) {
|
|
1132
|
-
if (
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1286
|
+
if (!fSuccess && ikey2 === 0 && this.stacktop(-1).length > 0) {
|
|
1287
|
+
this.scriptEvaluationError(
|
|
1288
|
+
`${OP[currentOpcode] as string} failed to verify a signature, and requires an empty signature when verification fails.`
|
|
1289
|
+
)
|
|
1136
1290
|
}
|
|
1137
1291
|
|
|
1138
1292
|
if (ikey2 > 0) {
|
|
@@ -1149,10 +1303,15 @@ export default class Spend {
|
|
|
1149
1303
|
// so optionally verify it is exactly equal to zero prior
|
|
1150
1304
|
// to removing it from the stack.
|
|
1151
1305
|
if (this.stack.length < 1) {
|
|
1152
|
-
this.scriptEvaluationError(
|
|
1306
|
+
this.scriptEvaluationError(
|
|
1307
|
+
`${OP[currentOpcode] as string} requires an extra item to be on the stack.`
|
|
1308
|
+
)
|
|
1153
1309
|
}
|
|
1154
|
-
if (this.stacktop(-1).length > 0) {
|
|
1155
|
-
|
|
1310
|
+
if (this.stacktop(-1).length > 0) {
|
|
1311
|
+
// NOTE: Is this necessary? We don't care about malleability.
|
|
1312
|
+
this.scriptEvaluationError(
|
|
1313
|
+
`${OP[currentOpcode] as string} requires the extra stack item to be empty.`
|
|
1314
|
+
)
|
|
1156
1315
|
}
|
|
1157
1316
|
this.stack.pop()
|
|
1158
1317
|
|
|
@@ -1162,20 +1321,26 @@ export default class Spend {
|
|
|
1162
1321
|
if (fSuccess) {
|
|
1163
1322
|
this.stack.pop()
|
|
1164
1323
|
} else {
|
|
1165
|
-
this.scriptEvaluationError(
|
|
1324
|
+
this.scriptEvaluationError(
|
|
1325
|
+
'OP_CHECKMULTISIGVERIFY requires that a sufficient number of valid signatures are provided.'
|
|
1326
|
+
)
|
|
1166
1327
|
}
|
|
1167
1328
|
}
|
|
1168
1329
|
break
|
|
1169
1330
|
|
|
1170
1331
|
case OP.OP_CAT:
|
|
1171
1332
|
if (this.stack.length < 2) {
|
|
1172
|
-
this.scriptEvaluationError(
|
|
1333
|
+
this.scriptEvaluationError(
|
|
1334
|
+
'OP_CAT requires at least two items to be on the stack.'
|
|
1335
|
+
)
|
|
1173
1336
|
}
|
|
1174
1337
|
|
|
1175
1338
|
buf1 = this.stacktop(-2)
|
|
1176
1339
|
buf2 = this.stacktop(-1)
|
|
1177
1340
|
if (buf1.length + buf2.length > maxScriptElementSize) {
|
|
1178
|
-
this.scriptEvaluationError(
|
|
1341
|
+
this.scriptEvaluationError(
|
|
1342
|
+
`It's not currently possible to push data larger than ${maxScriptElementSize} bytes.`
|
|
1343
|
+
)
|
|
1179
1344
|
}
|
|
1180
1345
|
this.stack[this.stack.length - 2] = [...buf1, ...buf2]
|
|
1181
1346
|
this.stack.pop()
|
|
@@ -1183,14 +1348,21 @@ export default class Spend {
|
|
|
1183
1348
|
|
|
1184
1349
|
case OP.OP_SPLIT:
|
|
1185
1350
|
if (this.stack.length < 2) {
|
|
1186
|
-
this.scriptEvaluationError(
|
|
1351
|
+
this.scriptEvaluationError(
|
|
1352
|
+
'OP_SPLIT requires at least two items to be on the stack.'
|
|
1353
|
+
)
|
|
1187
1354
|
}
|
|
1188
1355
|
buf1 = this.stacktop(-2)
|
|
1189
1356
|
|
|
1190
1357
|
// Make sure the split point is apropriate.
|
|
1191
|
-
n = BigNumber.fromScriptNum(
|
|
1358
|
+
n = BigNumber.fromScriptNum(
|
|
1359
|
+
this.stacktop(-1),
|
|
1360
|
+
requireMinimalPush
|
|
1361
|
+
).toNumber()
|
|
1192
1362
|
if (n < 0 || n > buf1.length) {
|
|
1193
|
-
this.scriptEvaluationError(
|
|
1363
|
+
this.scriptEvaluationError(
|
|
1364
|
+
'OP_SPLIT requires the first stack item to be a non-negative number less than or equal to the size of the second-from-top stack item.'
|
|
1365
|
+
)
|
|
1194
1366
|
}
|
|
1195
1367
|
|
|
1196
1368
|
// Prepare the results in their own buffer as `data`
|
|
@@ -1205,12 +1377,19 @@ export default class Spend {
|
|
|
1205
1377
|
|
|
1206
1378
|
case OP.OP_NUM2BIN:
|
|
1207
1379
|
if (this.stack.length < 2) {
|
|
1208
|
-
this.scriptEvaluationError(
|
|
1380
|
+
this.scriptEvaluationError(
|
|
1381
|
+
'OP_NUM2BIN requires at least two items to be on the stack.'
|
|
1382
|
+
)
|
|
1209
1383
|
}
|
|
1210
1384
|
|
|
1211
|
-
size = BigNumber.fromScriptNum(
|
|
1385
|
+
size = BigNumber.fromScriptNum(
|
|
1386
|
+
this.stacktop(-1),
|
|
1387
|
+
requireMinimalPush
|
|
1388
|
+
).toNumber()
|
|
1212
1389
|
if (size > maxScriptElementSize) {
|
|
1213
|
-
this.scriptEvaluationError(
|
|
1390
|
+
this.scriptEvaluationError(
|
|
1391
|
+
`It's not currently possible to push data larger than ${maxScriptElementSize} bytes.`
|
|
1392
|
+
)
|
|
1214
1393
|
}
|
|
1215
1394
|
|
|
1216
1395
|
this.stack.pop()
|
|
@@ -1221,7 +1400,9 @@ export default class Spend {
|
|
|
1221
1400
|
rawnum = minimallyEncode(rawnum)
|
|
1222
1401
|
|
|
1223
1402
|
if (rawnum.length > size) {
|
|
1224
|
-
this.scriptEvaluationError(
|
|
1403
|
+
this.scriptEvaluationError(
|
|
1404
|
+
'OP_NUM2BIN requires that the size expressed in the top stack item is large enough to hold the value expressed in the second-from-top stack item.'
|
|
1405
|
+
)
|
|
1225
1406
|
}
|
|
1226
1407
|
|
|
1227
1408
|
// We already have an element of the right size, we
|
|
@@ -1254,7 +1435,9 @@ export default class Spend {
|
|
|
1254
1435
|
|
|
1255
1436
|
case OP.OP_BIN2NUM:
|
|
1256
1437
|
if (this.stack.length < 1) {
|
|
1257
|
-
this.scriptEvaluationError(
|
|
1438
|
+
this.scriptEvaluationError(
|
|
1439
|
+
'OP_BIN2NUM requires at least one item to be on the stack.'
|
|
1440
|
+
)
|
|
1258
1441
|
}
|
|
1259
1442
|
|
|
1260
1443
|
buf1 = this.stacktop(-1)
|
|
@@ -1264,7 +1447,9 @@ export default class Spend {
|
|
|
1264
1447
|
|
|
1265
1448
|
// The resulting number must be a valid number.
|
|
1266
1449
|
if (!isMinimallyEncoded(buf2)) {
|
|
1267
|
-
this.scriptEvaluationError(
|
|
1450
|
+
this.scriptEvaluationError(
|
|
1451
|
+
'OP_BIN2NUM requires that the resulting number is valid.'
|
|
1452
|
+
)
|
|
1268
1453
|
}
|
|
1269
1454
|
break
|
|
1270
1455
|
|
|
@@ -1290,24 +1475,35 @@ export default class Spend {
|
|
|
1290
1475
|
*/
|
|
1291
1476
|
validate (): boolean {
|
|
1292
1477
|
if (requirePushOnlyUnlockingScripts && !this.unlockingScript.isPushOnly()) {
|
|
1293
|
-
this.scriptEvaluationError(
|
|
1478
|
+
this.scriptEvaluationError(
|
|
1479
|
+
'Unlocking scripts can only contain push operations, and no other opcodes.'
|
|
1480
|
+
)
|
|
1294
1481
|
}
|
|
1295
1482
|
while (true) {
|
|
1296
1483
|
this.step()
|
|
1297
|
-
if (
|
|
1484
|
+
if (
|
|
1485
|
+
this.context === 'LockingScript' &&
|
|
1486
|
+
this.programCounter >= this.lockingScript.chunks.length
|
|
1487
|
+
) {
|
|
1298
1488
|
break
|
|
1299
1489
|
}
|
|
1300
1490
|
}
|
|
1301
1491
|
if (this.ifStack.length > 0) {
|
|
1302
|
-
this.scriptEvaluationError(
|
|
1492
|
+
this.scriptEvaluationError(
|
|
1493
|
+
'Every OP_IF must be terminated prior to the end of the script.'
|
|
1494
|
+
)
|
|
1303
1495
|
}
|
|
1304
1496
|
if (requireCleanStack) {
|
|
1305
1497
|
if (this.stack.length !== 1) {
|
|
1306
|
-
this.scriptEvaluationError(
|
|
1498
|
+
this.scriptEvaluationError(
|
|
1499
|
+
'The clean stack rule requires exactly one item to be on the stack after script execution.'
|
|
1500
|
+
)
|
|
1307
1501
|
}
|
|
1308
1502
|
}
|
|
1309
1503
|
if (!this.castToBool(this.stacktop(-1))) {
|
|
1310
|
-
this.scriptEvaluationError(
|
|
1504
|
+
this.scriptEvaluationError(
|
|
1505
|
+
'The top stack element must be truthy after script evaluation.'
|
|
1506
|
+
)
|
|
1311
1507
|
}
|
|
1312
1508
|
return true
|
|
1313
1509
|
}
|
|
@@ -1330,6 +1526,8 @@ export default class Spend {
|
|
|
1330
1526
|
}
|
|
1331
1527
|
|
|
1332
1528
|
private scriptEvaluationError (str: string): void {
|
|
1333
|
-
throw new Error(
|
|
1529
|
+
throw new Error(
|
|
1530
|
+
`Script evaluation error: ${str}\n\nSource TXID: ${this.sourceTXID}\nSource output index: ${this.sourceOutputIndex}\nContext: ${this.context}\nProgram counter: ${this.programCounter}\nStack size: ${this.stack.length}\nAlt stack size: ${this.altStack.length}`
|
|
1531
|
+
)
|
|
1334
1532
|
}
|
|
1335
1533
|
}
|