@bsv/sdk 2.0.16 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -7
- package/dist/cjs/package.json +14 -13
- package/dist/cjs/src/auth/Peer.js +8 -13
- package/dist/cjs/src/auth/Peer.js.map +1 -1
- package/dist/cjs/src/auth/SessionManager.js +4 -7
- package/dist/cjs/src/auth/SessionManager.js.map +1 -1
- package/dist/cjs/src/auth/certificates/MasterCertificate.js +1 -1
- package/dist/cjs/src/auth/certificates/MasterCertificate.js.map +1 -1
- package/dist/cjs/src/auth/certificates/__tests/CompletedProtoWallet.js +1 -1
- package/dist/cjs/src/auth/certificates/__tests/CompletedProtoWallet.js.map +1 -1
- package/dist/cjs/src/auth/clients/AuthFetch.js +32 -32
- package/dist/cjs/src/auth/clients/AuthFetch.js.map +1 -1
- package/dist/cjs/src/auth/transports/SimplifiedFetchTransport.js +4 -4
- package/dist/cjs/src/auth/transports/SimplifiedFetchTransport.js.map +1 -1
- package/dist/cjs/src/compat/ECIES.js +29 -34
- package/dist/cjs/src/compat/ECIES.js.map +1 -1
- package/dist/cjs/src/compat/HD.js +9 -4
- package/dist/cjs/src/compat/HD.js.map +1 -1
- package/dist/cjs/src/compat/Mnemonic.js +12 -12
- package/dist/cjs/src/compat/Mnemonic.js.map +1 -1
- package/dist/cjs/src/identity/ContactsManager.js +172 -232
- package/dist/cjs/src/identity/ContactsManager.js.map +1 -1
- package/dist/cjs/src/identity/IdentityClient.js +122 -55
- package/dist/cjs/src/identity/IdentityClient.js.map +1 -1
- package/dist/cjs/src/kvstore/GlobalKVStore.js +30 -31
- package/dist/cjs/src/kvstore/GlobalKVStore.js.map +1 -1
- package/dist/cjs/src/kvstore/LocalKVStore.js +9 -9
- package/dist/cjs/src/kvstore/LocalKVStore.js.map +1 -1
- package/dist/cjs/src/kvstore/kvStoreInterpreter.js +2 -2
- package/dist/cjs/src/kvstore/kvStoreInterpreter.js.map +1 -1
- package/dist/cjs/src/messages/SignedMessage.js +1 -1
- package/dist/cjs/src/messages/SignedMessage.js.map +1 -1
- package/dist/cjs/src/overlay-tools/Historian.js +1 -1
- package/dist/cjs/src/overlay-tools/Historian.js.map +1 -1
- package/dist/cjs/src/overlay-tools/LookupResolver.js +139 -46
- package/dist/cjs/src/overlay-tools/LookupResolver.js.map +1 -1
- package/dist/cjs/src/overlay-tools/SHIPBroadcaster.js +75 -146
- package/dist/cjs/src/overlay-tools/SHIPBroadcaster.js.map +1 -1
- package/dist/cjs/src/primitives/AESGCM.js +2 -2
- package/dist/cjs/src/primitives/AESGCM.js.map +1 -1
- package/dist/cjs/src/primitives/BigNumber.js +164 -148
- package/dist/cjs/src/primitives/BigNumber.js.map +1 -1
- package/dist/cjs/src/primitives/Curve.js +17 -15
- package/dist/cjs/src/primitives/Curve.js.map +1 -1
- package/dist/cjs/src/primitives/ECDSA.js +12 -7
- package/dist/cjs/src/primitives/ECDSA.js.map +1 -1
- package/dist/cjs/src/primitives/Hash.js +140 -56
- package/dist/cjs/src/primitives/Hash.js.map +1 -1
- package/dist/cjs/src/primitives/JacobianPoint.js +8 -8
- package/dist/cjs/src/primitives/JacobianPoint.js.map +1 -1
- package/dist/cjs/src/primitives/K256.js +3 -3
- package/dist/cjs/src/primitives/K256.js.map +1 -1
- package/dist/cjs/src/primitives/Point.js +36 -40
- package/dist/cjs/src/primitives/Point.js.map +1 -1
- package/dist/cjs/src/primitives/PrivateKey.js +4 -4
- package/dist/cjs/src/primitives/PrivateKey.js.map +1 -1
- package/dist/cjs/src/primitives/PublicKey.js +4 -4
- package/dist/cjs/src/primitives/PublicKey.js.map +1 -1
- package/dist/cjs/src/primitives/Random.js +10 -14
- package/dist/cjs/src/primitives/Random.js.map +1 -1
- package/dist/cjs/src/primitives/ReaderUint8Array.js +6 -6
- package/dist/cjs/src/primitives/ReaderUint8Array.js.map +1 -1
- package/dist/cjs/src/primitives/Schnorr.js +2 -2
- package/dist/cjs/src/primitives/Schnorr.js.map +1 -1
- package/dist/cjs/src/primitives/Secp256r1.js +2 -1
- package/dist/cjs/src/primitives/Secp256r1.js.map +1 -1
- package/dist/cjs/src/primitives/Signature.js +8 -8
- package/dist/cjs/src/primitives/Signature.js.map +1 -1
- package/dist/cjs/src/primitives/TransactionSignature.js +20 -21
- package/dist/cjs/src/primitives/TransactionSignature.js.map +1 -1
- package/dist/cjs/src/primitives/utils.js +39 -46
- package/dist/cjs/src/primitives/utils.js.map +1 -1
- package/dist/cjs/src/registry/RegistryClient.js +31 -23
- package/dist/cjs/src/registry/RegistryClient.js.map +1 -1
- package/dist/cjs/src/remittance/RemittanceManager.js +19 -18
- package/dist/cjs/src/remittance/RemittanceManager.js.map +1 -1
- package/dist/cjs/src/remittance/modules/BasicBRC29.js.map +1 -1
- package/dist/cjs/src/script/Script.js +93 -170
- package/dist/cjs/src/script/Script.js.map +1 -1
- package/dist/cjs/src/script/ScriptEvaluationError.js +2 -2
- package/dist/cjs/src/script/ScriptEvaluationError.js.map +1 -1
- package/dist/cjs/src/script/Spend.js +14 -12
- package/dist/cjs/src/script/Spend.js.map +1 -1
- package/dist/cjs/src/script/templates/PushDrop.js +22 -18
- package/dist/cjs/src/script/templates/PushDrop.js.map +1 -1
- package/dist/cjs/src/script/templates/RPuzzle.js +2 -4
- package/dist/cjs/src/script/templates/RPuzzle.js.map +1 -1
- package/dist/cjs/src/storage/StorageDownloader.js +42 -9
- package/dist/cjs/src/storage/StorageDownloader.js.map +1 -1
- package/dist/cjs/src/totp/totp.js +1 -1
- package/dist/cjs/src/totp/totp.js.map +1 -1
- package/dist/cjs/src/transaction/Beef.js +239 -192
- package/dist/cjs/src/transaction/Beef.js.map +1 -1
- package/dist/cjs/src/transaction/BeefConstants.js +19 -0
- package/dist/cjs/src/transaction/BeefConstants.js.map +1 -0
- package/dist/cjs/src/transaction/BeefTx.js +12 -12
- package/dist/cjs/src/transaction/BeefTx.js.map +1 -1
- package/dist/cjs/src/transaction/MerklePath.js +4 -4
- package/dist/cjs/src/transaction/MerklePath.js.map +1 -1
- package/dist/cjs/src/transaction/Transaction.js +49 -52
- package/dist/cjs/src/transaction/Transaction.js.map +1 -1
- package/dist/cjs/src/transaction/fee-models/SatoshisPerKilobyte.js +1 -1
- package/dist/cjs/src/transaction/fee-models/SatoshisPerKilobyte.js.map +1 -1
- package/dist/cjs/src/transaction/http/BinaryFetchClient.js +9 -9
- package/dist/cjs/src/transaction/http/BinaryFetchClient.js.map +1 -1
- package/dist/cjs/src/transaction/http/DefaultHttpClient.js +9 -9
- package/dist/cjs/src/transaction/http/DefaultHttpClient.js.map +1 -1
- package/dist/cjs/src/wallet/CachedKeyDeriver.js +1 -1
- package/dist/cjs/src/wallet/CachedKeyDeriver.js.map +1 -1
- package/dist/cjs/src/wallet/WalletClient.js.map +1 -1
- package/dist/cjs/src/wallet/WalletError.js.map +1 -1
- package/dist/cjs/src/wallet/substrates/HTTPWalletJSON.js +5 -4
- package/dist/cjs/src/wallet/substrates/HTTPWalletJSON.js.map +1 -1
- package/dist/cjs/src/wallet/substrates/ReactNativeWebView.js +9 -9
- package/dist/cjs/src/wallet/substrates/ReactNativeWebView.js.map +1 -1
- package/dist/cjs/src/wallet/substrates/WalletWireProcessor.js +92 -92
- package/dist/cjs/src/wallet/substrates/WalletWireProcessor.js.map +1 -1
- package/dist/cjs/src/wallet/substrates/WalletWireTransceiver.js +387 -711
- package/dist/cjs/src/wallet/substrates/WalletWireTransceiver.js.map +1 -1
- package/dist/cjs/src/wallet/substrates/XDM.js +4 -4
- package/dist/cjs/src/wallet/substrates/XDM.js.map +1 -1
- package/dist/cjs/src/wallet/substrates/window.CWI.js +2 -2
- package/dist/cjs/src/wallet/substrates/window.CWI.js.map +1 -1
- package/dist/cjs/src/wallet/validationHelpers.js +9 -9
- package/dist/cjs/src/wallet/validationHelpers.js.map +1 -1
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/esm/src/auth/Peer.js +25 -13
- package/dist/esm/src/auth/Peer.js.map +1 -1
- package/dist/esm/src/auth/SessionManager.js +4 -7
- package/dist/esm/src/auth/SessionManager.js.map +1 -1
- package/dist/esm/src/auth/certificates/MasterCertificate.js +1 -1
- package/dist/esm/src/auth/certificates/MasterCertificate.js.map +1 -1
- package/dist/esm/src/auth/certificates/__tests/CompletedProtoWallet.js +1 -1
- package/dist/esm/src/auth/certificates/__tests/CompletedProtoWallet.js.map +1 -1
- package/dist/esm/src/auth/clients/AuthFetch.js +32 -32
- package/dist/esm/src/auth/clients/AuthFetch.js.map +1 -1
- package/dist/esm/src/auth/transports/SimplifiedFetchTransport.js +4 -4
- package/dist/esm/src/auth/transports/SimplifiedFetchTransport.js.map +1 -1
- package/dist/esm/src/compat/ECIES.js +29 -34
- package/dist/esm/src/compat/ECIES.js.map +1 -1
- package/dist/esm/src/compat/HD.js +9 -4
- package/dist/esm/src/compat/HD.js.map +1 -1
- package/dist/esm/src/compat/Mnemonic.js +12 -12
- package/dist/esm/src/compat/Mnemonic.js.map +1 -1
- package/dist/esm/src/identity/ContactsManager.js +172 -232
- package/dist/esm/src/identity/ContactsManager.js.map +1 -1
- package/dist/esm/src/identity/IdentityClient.js +122 -55
- package/dist/esm/src/identity/IdentityClient.js.map +1 -1
- package/dist/esm/src/kvstore/GlobalKVStore.js +30 -31
- package/dist/esm/src/kvstore/GlobalKVStore.js.map +1 -1
- package/dist/esm/src/kvstore/LocalKVStore.js +9 -9
- package/dist/esm/src/kvstore/LocalKVStore.js.map +1 -1
- package/dist/esm/src/kvstore/kvStoreInterpreter.js +2 -2
- package/dist/esm/src/kvstore/kvStoreInterpreter.js.map +1 -1
- package/dist/esm/src/messages/SignedMessage.js +1 -1
- package/dist/esm/src/messages/SignedMessage.js.map +1 -1
- package/dist/esm/src/overlay-tools/Historian.js +1 -1
- package/dist/esm/src/overlay-tools/Historian.js.map +1 -1
- package/dist/esm/src/overlay-tools/LookupResolver.js +139 -46
- package/dist/esm/src/overlay-tools/LookupResolver.js.map +1 -1
- package/dist/esm/src/overlay-tools/SHIPBroadcaster.js +74 -146
- package/dist/esm/src/overlay-tools/SHIPBroadcaster.js.map +1 -1
- package/dist/esm/src/primitives/AESGCM.js +2 -2
- package/dist/esm/src/primitives/AESGCM.js.map +1 -1
- package/dist/esm/src/primitives/BigNumber.js +167 -154
- package/dist/esm/src/primitives/BigNumber.js.map +1 -1
- package/dist/esm/src/primitives/Curve.js +17 -15
- package/dist/esm/src/primitives/Curve.js.map +1 -1
- package/dist/esm/src/primitives/ECDSA.js +12 -7
- package/dist/esm/src/primitives/ECDSA.js.map +1 -1
- package/dist/esm/src/primitives/Hash.js +140 -56
- package/dist/esm/src/primitives/Hash.js.map +1 -1
- package/dist/esm/src/primitives/JacobianPoint.js +8 -8
- package/dist/esm/src/primitives/JacobianPoint.js.map +1 -1
- package/dist/esm/src/primitives/K256.js +3 -3
- package/dist/esm/src/primitives/K256.js.map +1 -1
- package/dist/esm/src/primitives/Point.js +36 -40
- package/dist/esm/src/primitives/Point.js.map +1 -1
- package/dist/esm/src/primitives/PrivateKey.js +4 -4
- package/dist/esm/src/primitives/PrivateKey.js.map +1 -1
- package/dist/esm/src/primitives/PublicKey.js +4 -4
- package/dist/esm/src/primitives/PublicKey.js.map +1 -1
- package/dist/esm/src/primitives/Random.js +10 -14
- package/dist/esm/src/primitives/Random.js.map +1 -1
- package/dist/esm/src/primitives/ReaderUint8Array.js +6 -6
- package/dist/esm/src/primitives/ReaderUint8Array.js.map +1 -1
- package/dist/esm/src/primitives/Schnorr.js +1 -1
- package/dist/esm/src/primitives/Schnorr.js.map +1 -1
- package/dist/esm/src/primitives/Secp256r1.js +2 -1
- package/dist/esm/src/primitives/Secp256r1.js.map +1 -1
- package/dist/esm/src/primitives/Signature.js +8 -8
- package/dist/esm/src/primitives/Signature.js.map +1 -1
- package/dist/esm/src/primitives/TransactionSignature.js +20 -21
- package/dist/esm/src/primitives/TransactionSignature.js.map +1 -1
- package/dist/esm/src/primitives/utils.js +39 -48
- package/dist/esm/src/primitives/utils.js.map +1 -1
- package/dist/esm/src/registry/RegistryClient.js +31 -23
- package/dist/esm/src/registry/RegistryClient.js.map +1 -1
- package/dist/esm/src/remittance/RemittanceManager.js +19 -18
- package/dist/esm/src/remittance/RemittanceManager.js.map +1 -1
- package/dist/esm/src/remittance/modules/BasicBRC29.js.map +1 -1
- package/dist/esm/src/script/Script.js +93 -170
- package/dist/esm/src/script/Script.js.map +1 -1
- package/dist/esm/src/script/ScriptEvaluationError.js +2 -2
- package/dist/esm/src/script/ScriptEvaluationError.js.map +1 -1
- package/dist/esm/src/script/Spend.js +14 -12
- package/dist/esm/src/script/Spend.js.map +1 -1
- package/dist/esm/src/script/templates/PushDrop.js +4 -3
- package/dist/esm/src/script/templates/PushDrop.js.map +1 -1
- package/dist/esm/src/script/templates/RPuzzle.js +2 -4
- package/dist/esm/src/script/templates/RPuzzle.js.map +1 -1
- package/dist/esm/src/storage/StorageDownloader.js +1 -1
- package/dist/esm/src/storage/StorageDownloader.js.map +1 -1
- package/dist/esm/src/totp/totp.js +1 -1
- package/dist/esm/src/totp/totp.js.map +1 -1
- package/dist/esm/src/transaction/Beef.js +229 -186
- package/dist/esm/src/transaction/Beef.js.map +1 -1
- package/dist/esm/src/transaction/BeefConstants.js +16 -0
- package/dist/esm/src/transaction/BeefConstants.js.map +1 -0
- package/dist/esm/src/transaction/BeefTx.js +3 -3
- package/dist/esm/src/transaction/BeefTx.js.map +1 -1
- package/dist/esm/src/transaction/MerklePath.js +4 -4
- package/dist/esm/src/transaction/MerklePath.js.map +1 -1
- package/dist/esm/src/transaction/Transaction.js +49 -52
- package/dist/esm/src/transaction/Transaction.js.map +1 -1
- package/dist/esm/src/transaction/fee-models/SatoshisPerKilobyte.js +1 -1
- package/dist/esm/src/transaction/fee-models/SatoshisPerKilobyte.js.map +1 -1
- package/dist/esm/src/transaction/http/BinaryFetchClient.js +9 -9
- package/dist/esm/src/transaction/http/BinaryFetchClient.js.map +1 -1
- package/dist/esm/src/transaction/http/DefaultHttpClient.js +9 -9
- package/dist/esm/src/transaction/http/DefaultHttpClient.js.map +1 -1
- package/dist/esm/src/wallet/CachedKeyDeriver.js +1 -1
- package/dist/esm/src/wallet/CachedKeyDeriver.js.map +1 -1
- package/dist/esm/src/wallet/WalletClient.js.map +1 -1
- package/dist/esm/src/wallet/WalletError.js.map +1 -1
- package/dist/esm/src/wallet/substrates/HTTPWalletJSON.js +5 -4
- package/dist/esm/src/wallet/substrates/HTTPWalletJSON.js.map +1 -1
- package/dist/esm/src/wallet/substrates/ReactNativeWebView.js +9 -9
- package/dist/esm/src/wallet/substrates/ReactNativeWebView.js.map +1 -1
- package/dist/esm/src/wallet/substrates/WalletWireProcessor.js +92 -92
- package/dist/esm/src/wallet/substrates/WalletWireProcessor.js.map +1 -1
- package/dist/esm/src/wallet/substrates/WalletWireTransceiver.js +387 -711
- package/dist/esm/src/wallet/substrates/WalletWireTransceiver.js.map +1 -1
- package/dist/esm/src/wallet/substrates/XDM.js +4 -4
- package/dist/esm/src/wallet/substrates/XDM.js.map +1 -1
- package/dist/esm/src/wallet/substrates/window.CWI.js +2 -2
- package/dist/esm/src/wallet/substrates/window.CWI.js.map +1 -1
- package/dist/esm/src/wallet/validationHelpers.js +9 -9
- package/dist/esm/src/wallet/validationHelpers.js.map +1 -1
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/types/src/auth/Peer.d.ts +13 -0
- package/dist/types/src/auth/Peer.d.ts.map +1 -1
- package/dist/types/src/auth/SessionManager.d.ts.map +1 -1
- package/dist/types/src/auth/clients/AuthFetch.d.ts.map +1 -1
- package/dist/types/src/compat/ECIES.d.ts.map +1 -1
- package/dist/types/src/compat/HD.d.ts.map +1 -1
- package/dist/types/src/identity/ContactsManager.d.ts +18 -0
- package/dist/types/src/identity/ContactsManager.d.ts.map +1 -1
- package/dist/types/src/identity/IdentityClient.d.ts +47 -8
- package/dist/types/src/identity/IdentityClient.d.ts.map +1 -1
- package/dist/types/src/kvstore/GlobalKVStore.d.ts.map +1 -1
- package/dist/types/src/overlay-tools/LookupResolver.d.ts +59 -1
- package/dist/types/src/overlay-tools/LookupResolver.d.ts.map +1 -1
- package/dist/types/src/overlay-tools/SHIPBroadcaster.d.ts +18 -3
- package/dist/types/src/overlay-tools/SHIPBroadcaster.d.ts.map +1 -1
- package/dist/types/src/primitives/BigNumber.d.ts +13 -3
- package/dist/types/src/primitives/BigNumber.d.ts.map +1 -1
- package/dist/types/src/primitives/Curve.d.ts.map +1 -1
- package/dist/types/src/primitives/ECDSA.d.ts.map +1 -1
- package/dist/types/src/primitives/Hash.d.ts +3 -3
- package/dist/types/src/primitives/Hash.d.ts.map +1 -1
- package/dist/types/src/primitives/JacobianPoint.d.ts +3 -1
- package/dist/types/src/primitives/JacobianPoint.d.ts.map +1 -1
- package/dist/types/src/primitives/Point.d.ts.map +1 -1
- package/dist/types/src/primitives/Random.d.ts +2 -2
- package/dist/types/src/primitives/Random.d.ts.map +1 -1
- package/dist/types/src/primitives/ReaderUint8Array.d.ts.map +1 -1
- package/dist/types/src/primitives/Schnorr.d.ts +2 -1
- package/dist/types/src/primitives/Schnorr.d.ts.map +1 -1
- package/dist/types/src/primitives/Secp256r1.d.ts.map +1 -1
- package/dist/types/src/primitives/utils.d.ts +2 -4
- package/dist/types/src/primitives/utils.d.ts.map +1 -1
- package/dist/types/src/registry/RegistryClient.d.ts.map +1 -1
- package/dist/types/src/remittance/RemittanceManager.d.ts.map +1 -1
- package/dist/types/src/remittance/modules/BasicBRC29.d.ts.map +1 -1
- package/dist/types/src/script/Script.d.ts +15 -8
- package/dist/types/src/script/Script.d.ts.map +1 -1
- package/dist/types/src/script/Spend.d.ts.map +1 -1
- package/dist/types/src/script/templates/PushDrop.d.ts +3 -1
- 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/transaction/Beef.d.ts +46 -8
- package/dist/types/src/transaction/Beef.d.ts.map +1 -1
- package/dist/types/src/transaction/BeefConstants.d.ts +15 -0
- package/dist/types/src/transaction/BeefConstants.d.ts.map +1 -0
- package/dist/types/src/transaction/Transaction.d.ts.map +1 -1
- package/dist/types/src/wallet/CachedKeyDeriver.d.ts.map +1 -1
- package/dist/types/src/wallet/KeyDeriver.d.ts +1 -1
- package/dist/types/src/wallet/KeyDeriver.d.ts.map +1 -1
- package/dist/types/src/wallet/Wallet.interfaces.d.ts +2 -2
- package/dist/types/src/wallet/Wallet.interfaces.d.ts.map +1 -1
- package/dist/types/src/wallet/WalletClient.d.ts +7 -7
- package/dist/types/src/wallet/WalletClient.d.ts.map +1 -1
- package/dist/types/src/wallet/substrates/HTTPWalletJSON.d.ts +7 -7
- package/dist/types/src/wallet/substrates/HTTPWalletJSON.d.ts.map +1 -1
- package/dist/types/src/wallet/substrates/WalletWireTransceiver.d.ts +36 -7
- package/dist/types/src/wallet/substrates/WalletWireTransceiver.d.ts.map +1 -1
- package/dist/types/src/wallet/substrates/window.CWI.d.ts +8 -8
- 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 +3 -3
- package/docs/reference/kvstore.md +1 -2
- package/docs/reference/primitives.md +0 -1
- package/docs/reference/script.md +0 -7
- package/docs/reference/transaction.md +2 -2
- package/package.json +29 -28
- package/src/auth/Peer.ts +26 -13
- package/src/auth/SessionManager.ts +4 -7
- package/src/auth/certificates/MasterCertificate.ts +1 -1
- package/src/auth/certificates/__tests/CompletedProtoWallet.ts +1 -1
- package/src/auth/clients/AuthFetch.ts +41 -41
- package/src/auth/transports/SimplifiedFetchTransport.ts +4 -4
- package/src/compat/ECIES.ts +29 -34
- package/src/compat/HD.ts +10 -5
- package/src/compat/Mnemonic.ts +11 -11
- package/src/compat/__tests/HD.test.ts +19 -0
- package/src/identity/ContactsManager.ts +194 -257
- package/src/identity/IdentityClient.ts +155 -66
- package/src/identity/__tests/IdentityClient.test.ts +25 -1
- package/src/kvstore/GlobalKVStore.ts +31 -32
- package/src/kvstore/LocalKVStore.ts +8 -8
- package/src/kvstore/kvStoreInterpreter.ts +2 -2
- package/src/messages/SignedMessage.ts +1 -1
- package/src/overlay-tools/Historian.ts +1 -1
- package/src/overlay-tools/LookupResolver.ts +182 -45
- package/src/overlay-tools/SHIPBroadcaster.ts +92 -168
- package/src/primitives/AESGCM.ts +2 -2
- package/src/primitives/BigNumber.ts +122 -113
- package/src/primitives/Curve.ts +16 -15
- package/src/primitives/ECDSA.ts +10 -8
- package/src/primitives/Hash.ts +152 -53
- package/src/primitives/JacobianPoint.ts +13 -11
- package/src/primitives/K256.ts +3 -3
- package/src/primitives/Point.ts +35 -38
- package/src/primitives/PrivateKey.ts +3 -3
- package/src/primitives/PublicKey.ts +3 -3
- package/src/primitives/Random.ts +11 -14
- package/src/primitives/ReaderUint8Array.ts +7 -7
- package/src/primitives/Schnorr.ts +2 -1
- package/src/primitives/Secp256r1.ts +2 -1
- package/src/primitives/Signature.ts +8 -8
- package/src/primitives/TransactionSignature.ts +16 -16
- package/src/primitives/utils.ts +37 -47
- package/src/registry/RegistryClient.ts +25 -25
- package/src/remittance/RemittanceManager.ts +17 -18
- package/src/remittance/modules/BasicBRC29.ts +2 -5
- package/src/script/Script.ts +114 -170
- package/src/script/ScriptEvaluationError.ts +2 -2
- package/src/script/Spend.ts +14 -15
- package/src/script/templates/PushDrop.ts +5 -3
- package/src/script/templates/RPuzzle.ts +2 -4
- package/src/storage/StorageDownloader.ts +1 -1
- package/src/totp/totp.ts +1 -1
- package/src/transaction/Beef.ts +241 -203
- package/src/transaction/BeefConstants.ts +16 -0
- package/src/transaction/BeefTx.ts +3 -3
- package/src/transaction/MerklePath.ts +4 -4
- package/src/transaction/Transaction.ts +48 -51
- package/src/transaction/fee-models/SatoshisPerKilobyte.ts +1 -1
- package/src/transaction/http/BinaryFetchClient.ts +8 -8
- package/src/transaction/http/DefaultHttpClient.ts +8 -8
- package/src/wallet/CachedKeyDeriver.ts +8 -6
- package/src/wallet/KeyDeriver.ts +1 -1
- package/src/wallet/Wallet.interfaces.ts +2 -4
- package/src/wallet/WalletClient.ts +8 -8
- package/src/wallet/WalletError.ts +1 -1
- package/src/wallet/__tests/WalletClient.substrate.test.ts +10 -6
- package/src/wallet/substrates/HTTPWalletJSON.ts +22 -21
- package/src/wallet/substrates/ReactNativeWebView.ts +9 -9
- package/src/wallet/substrates/WalletWireProcessor.ts +83 -83
- package/src/wallet/substrates/WalletWireTransceiver.ts +528 -938
- package/src/wallet/substrates/XDM.ts +4 -4
- package/src/wallet/substrates/__tests/HTTPWalletJSON.test.ts +38 -25
- package/src/wallet/substrates/__tests/ReactNativeWebView.test.ts +174 -0
- package/src/wallet/substrates/__tests/window.CWI.test.ts +256 -0
- package/src/wallet/substrates/window.CWI.ts +10 -10
- package/src/wallet/validationHelpers.ts +9 -9
- package/docs/swagger/dist/LICENSE +0 -21
- package/docs/swagger/dist/favicon-16x16.png +0 -0
- package/docs/swagger/dist/favicon-32x32.png +0 -0
- package/docs/swagger/dist/index.css +0 -16
- package/docs/swagger/dist/oauth2-redirect.html +0 -79
- package/docs/swagger/dist/swagger-initializer.js +0 -20
- package/docs/swagger/dist/swagger-ui-bundle.js +0 -2
- package/docs/swagger/dist/swagger-ui-bundle.js.map +0 -1
- package/docs/swagger/dist/swagger-ui-es-bundle-core.js +0 -3
- package/docs/swagger/dist/swagger-ui-es-bundle-core.js.map +0 -1
- package/docs/swagger/dist/swagger-ui-es-bundle.js +0 -2
- package/docs/swagger/dist/swagger-ui-es-bundle.js.map +0 -1
- package/docs/swagger/dist/swagger-ui-standalone-preset.js +0 -2
- package/docs/swagger/dist/swagger-ui-standalone-preset.js.map +0 -1
- package/docs/swagger/dist/swagger-ui.css +0 -3
- package/docs/swagger/dist/swagger-ui.css.map +0 -1
- package/docs/swagger/dist/swagger-ui.js +0 -2
- package/docs/swagger/dist/swagger-ui.js.map +0 -1
|
@@ -2,15 +2,8 @@ import MerklePath from './MerklePath.js';
|
|
|
2
2
|
import BeefTx from './BeefTx.js';
|
|
3
3
|
import { toHex, toArray, verifyNotNull, ReaderUint8Array, WriterUint8Array, toUint8Array } from '../primitives/utils.js';
|
|
4
4
|
import { hash256 } from '../primitives/Hash.js';
|
|
5
|
-
|
|
6
|
-
export
|
|
7
|
-
export const ATOMIC_BEEF = 0x01010101; // 01010101
|
|
8
|
-
export var TX_DATA_FORMAT;
|
|
9
|
-
(function (TX_DATA_FORMAT) {
|
|
10
|
-
TX_DATA_FORMAT[TX_DATA_FORMAT["RAWTX"] = 0] = "RAWTX";
|
|
11
|
-
TX_DATA_FORMAT[TX_DATA_FORMAT["RAWTX_AND_BUMP_INDEX"] = 1] = "RAWTX_AND_BUMP_INDEX";
|
|
12
|
-
TX_DATA_FORMAT[TX_DATA_FORMAT["TXID_ONLY"] = 2] = "TXID_ONLY";
|
|
13
|
-
})(TX_DATA_FORMAT || (TX_DATA_FORMAT = {}));
|
|
5
|
+
import { BEEF_V1, BEEF_V2, ATOMIC_BEEF } from './BeefConstants.js';
|
|
6
|
+
export { BEEF_V1, BEEF_V2, ATOMIC_BEEF, TX_DATA_FORMAT } from './BeefConstants.js';
|
|
14
7
|
/*
|
|
15
8
|
* BEEF standard: BRC-62: Background Evaluation Extended Format (BEEF) Transactions
|
|
16
9
|
* https://github.com/bsv-blockchain/BRCs/blob/master/transactions/0062.md
|
|
@@ -88,7 +81,9 @@ export class Beef {
|
|
|
88
81
|
}
|
|
89
82
|
ensureSerializableState() {
|
|
90
83
|
for (const tx of this.txs) {
|
|
91
|
-
|
|
84
|
+
// Access txid to ensure it is computed before serialization
|
|
85
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
86
|
+
tx.txid;
|
|
92
87
|
}
|
|
93
88
|
}
|
|
94
89
|
ensureSortedForSerialization() {
|
|
@@ -115,7 +110,7 @@ export class Beef {
|
|
|
115
110
|
throw new Error(`${txid} does not exist in this Beef`);
|
|
116
111
|
}
|
|
117
112
|
// If the transaction is not the last one, clone and modify
|
|
118
|
-
const beef = (this.txs
|
|
113
|
+
const beef = (this.txs.at(-1) === tx) ? this : this.clone();
|
|
119
114
|
if (beef !== this) {
|
|
120
115
|
const i = this.txs.findIndex((t) => t.txid === txid);
|
|
121
116
|
beef.txs.splice(i + 1);
|
|
@@ -175,8 +170,7 @@ export class Beef {
|
|
|
175
170
|
* @returns `MerklePath` with level zero hash equal to txid or undefined.
|
|
176
171
|
*/
|
|
177
172
|
findBump(txid) {
|
|
178
|
-
return this.bumps.find((b) => b.path[0].some((leaf) => leaf.hash === txid)
|
|
179
|
-
);
|
|
173
|
+
return this.bumps.find((b) => b.path[0].some((leaf) => leaf.hash === txid));
|
|
180
174
|
}
|
|
181
175
|
/**
|
|
182
176
|
* Finds a Transaction in this `Beef`
|
|
@@ -213,33 +207,39 @@ export class Beef {
|
|
|
213
207
|
const beefTx = this.findTxid(txid);
|
|
214
208
|
if ((beefTx == null) || (beefTx.tx == null))
|
|
215
209
|
return undefined; // Ensure beefTx.tx exists before using it
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
210
|
+
this.addInputProof(beefTx.tx);
|
|
211
|
+
return beefTx.tx;
|
|
212
|
+
}
|
|
213
|
+
/** Recursively attach merkle paths and source transactions to all inputs. */
|
|
214
|
+
addInputProof(tx) {
|
|
215
|
+
const mp = this.findBump(tx.id('hex'));
|
|
216
|
+
if (mp != null) {
|
|
217
|
+
tx.merklePath = mp;
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
for (const i of tx.inputs) {
|
|
221
|
+
this.resolveInputSource(i);
|
|
222
|
+
if (i.sourceTransaction != null) {
|
|
223
|
+
this.attachMerklePathOrRecurse(i.sourceTransaction);
|
|
220
224
|
}
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
}
|
|
229
|
-
if (i.sourceTransaction != null) {
|
|
230
|
-
const mp = beef.findBump(i.sourceTransaction.id('hex'));
|
|
231
|
-
if (mp != null) {
|
|
232
|
-
i.sourceTransaction.merklePath = mp;
|
|
233
|
-
}
|
|
234
|
-
else {
|
|
235
|
-
addInputProof(beef, i.sourceTransaction);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
resolveInputSource(i) {
|
|
228
|
+
if (i.sourceTransaction == null) {
|
|
229
|
+
const itx = this.findTxid(verifyNotNull(i.sourceTXID, 'sourceTXID must be valid'));
|
|
230
|
+
if (itx != null) {
|
|
231
|
+
i.sourceTransaction = itx.tx;
|
|
239
232
|
}
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
attachMerklePathOrRecurse(sourceTx) {
|
|
236
|
+
const mp = this.findBump(sourceTx.id('hex'));
|
|
237
|
+
if (mp != null) {
|
|
238
|
+
sourceTx.merklePath = mp;
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
this.addInputProof(sourceTx);
|
|
242
|
+
}
|
|
243
243
|
}
|
|
244
244
|
/**
|
|
245
245
|
* Merge a MerklePath that is assumed to be fully valid.
|
|
@@ -248,46 +248,44 @@ export class Beef {
|
|
|
248
248
|
*/
|
|
249
249
|
mergeBump(bump) {
|
|
250
250
|
this.markMutated(false);
|
|
251
|
-
|
|
252
|
-
//
|
|
251
|
+
const bumpIndex = this.findOrInsertBump(bump);
|
|
252
|
+
// Review if any transactions are proven by this bump
|
|
253
|
+
const b = this.bumps[bumpIndex];
|
|
254
|
+
for (const tx of this.txs) {
|
|
255
|
+
if (tx.bumpIndex == null) {
|
|
256
|
+
this.tryMarkTxProvenByBump(tx, b, bumpIndex);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return bumpIndex;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Find an existing compatible bump or insert a new one; return its index.
|
|
263
|
+
*/
|
|
264
|
+
findOrInsertBump(bump) {
|
|
253
265
|
for (let i = 0; i < this.bumps.length; i++) {
|
|
254
266
|
const b = this.bumps[i];
|
|
255
|
-
if (b === bump)
|
|
256
|
-
|
|
267
|
+
if (b === bump)
|
|
268
|
+
return i;
|
|
269
|
+
if (b.blockHeight !== bump.blockHeight)
|
|
270
|
+
continue;
|
|
271
|
+
if (b.computeRoot() === bump.computeRoot()) {
|
|
272
|
+
b.combine(bump);
|
|
257
273
|
return i;
|
|
258
274
|
}
|
|
259
|
-
if (b.blockHeight === bump.blockHeight) {
|
|
260
|
-
// Probably the same...
|
|
261
|
-
const rootA = b.computeRoot();
|
|
262
|
-
const rootB = bump.computeRoot();
|
|
263
|
-
if (rootA === rootB) {
|
|
264
|
-
// Definitely the same... combine them to save space
|
|
265
|
-
b.combine(bump);
|
|
266
|
-
bumpIndex = i;
|
|
267
|
-
break;
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
// if the proof is not yet added, add a new path.
|
|
272
|
-
if (bumpIndex === undefined) {
|
|
273
|
-
bumpIndex = this.bumps.length;
|
|
274
|
-
this.bumps.push(bump);
|
|
275
275
|
}
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
}
|
|
276
|
+
this.bumps.push(bump);
|
|
277
|
+
return this.bumps.length - 1;
|
|
278
|
+
}
|
|
279
|
+
/** If bump's level-0 path contains tx's txid, record the bumpIndex on tx. */
|
|
280
|
+
tryMarkTxProvenByBump(tx, b, bumpIndex) {
|
|
281
|
+
const txid = tx.txid;
|
|
282
|
+
for (const n of b.path[0]) {
|
|
283
|
+
if (n.hash === txid) {
|
|
284
|
+
tx.bumpIndex = bumpIndex;
|
|
285
|
+
n.txid = true;
|
|
286
|
+
break;
|
|
288
287
|
}
|
|
289
288
|
}
|
|
290
|
-
return bumpIndex;
|
|
291
289
|
}
|
|
292
290
|
/**
|
|
293
291
|
* Merge a serialized transaction.
|
|
@@ -462,54 +460,74 @@ export class Beef {
|
|
|
462
460
|
}
|
|
463
461
|
// valid txids: only txids if allowed, bump txids, then txids with input's in txids
|
|
464
462
|
const txids = {};
|
|
463
|
+
if (!this.collectTxidOnlyTxids(txids, allowTxidOnly))
|
|
464
|
+
return r;
|
|
465
|
+
if (!this.collectBumpTxids(txids, r))
|
|
466
|
+
return r;
|
|
467
|
+
if (!this.verifyBumpIndexLeaves())
|
|
468
|
+
return r;
|
|
469
|
+
if (!this.verifyInputDependencies(txids))
|
|
470
|
+
return r;
|
|
471
|
+
r.valid = true;
|
|
472
|
+
return r;
|
|
473
|
+
}
|
|
474
|
+
/** Add txidOnly transaction txids; return false if not allowed. */
|
|
475
|
+
collectTxidOnlyTxids(txids, allowTxidOnly) {
|
|
465
476
|
for (const tx of this.txs) {
|
|
466
|
-
if (tx.isTxidOnly)
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
txids[tx.txid] = true;
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
const confirmComputedRoot = (b, txid) => {
|
|
473
|
-
const root = b.computeRoot(txid);
|
|
474
|
-
if (r.roots[b.blockHeight] === undefined || r.roots[b.blockHeight] === '') {
|
|
475
|
-
// accept the root as valid for this block and reuse for subsequent txids
|
|
476
|
-
r.roots[b.blockHeight] = root;
|
|
477
|
-
}
|
|
478
|
-
if (r.roots[b.blockHeight] !== root) {
|
|
477
|
+
if (!tx.isTxidOnly)
|
|
478
|
+
continue;
|
|
479
|
+
if (allowTxidOnly !== true)
|
|
479
480
|
return false;
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
481
|
+
txids[tx.txid] = true;
|
|
482
|
+
}
|
|
483
|
+
return true;
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* Record txids proven by bumps; validate all bump roots agree per block height.
|
|
487
|
+
* Returns false if any root conflict is detected.
|
|
488
|
+
*/
|
|
489
|
+
collectBumpTxids(txids, r) {
|
|
483
490
|
for (const b of this.bumps) {
|
|
484
491
|
for (const n of b.path[0]) {
|
|
485
|
-
if (n.txid
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
+
if (n.txid !== true || typeof n.hash !== 'string' || n.hash.length === 0)
|
|
493
|
+
continue;
|
|
494
|
+
txids[n.hash] = true;
|
|
495
|
+
if (!this.confirmComputedRoot(b, n.hash, r))
|
|
496
|
+
return false;
|
|
492
497
|
}
|
|
493
498
|
}
|
|
494
|
-
|
|
499
|
+
return true;
|
|
500
|
+
}
|
|
501
|
+
/** Verify that every tx with a bumpIndex has a matching txid leaf in its bump. */
|
|
502
|
+
verifyBumpIndexLeaves() {
|
|
495
503
|
for (const t of this.txs) {
|
|
496
|
-
if (t.bumpIndex
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
}
|
|
504
|
+
if (t.bumpIndex === undefined)
|
|
505
|
+
continue;
|
|
506
|
+
const leaf = this.bumps[t.bumpIndex].path[0].find(l => l.hash === t.txid);
|
|
507
|
+
if (leaf == null)
|
|
508
|
+
return false;
|
|
502
509
|
}
|
|
510
|
+
return true;
|
|
511
|
+
}
|
|
512
|
+
/** Verify all input txids appear before the spending tx in sorted order. */
|
|
513
|
+
verifyInputDependencies(txids) {
|
|
503
514
|
for (const t of this.txs) {
|
|
504
|
-
// all input txids must be included before they are referenced
|
|
505
515
|
for (const i of t.inputTxids) {
|
|
506
516
|
if (!txids[i])
|
|
507
|
-
return
|
|
517
|
+
return false;
|
|
508
518
|
}
|
|
509
519
|
txids[t.txid] = true;
|
|
510
520
|
}
|
|
511
|
-
|
|
512
|
-
|
|
521
|
+
return true;
|
|
522
|
+
}
|
|
523
|
+
/** Confirm the computed merkle root for txid in bump matches previously accepted root for that height. */
|
|
524
|
+
confirmComputedRoot(b, txid, r) {
|
|
525
|
+
const root = b.computeRoot(txid);
|
|
526
|
+
if (r.roots[b.blockHeight] === undefined || r.roots[b.blockHeight] === '') {
|
|
527
|
+
// accept the root as valid for this block and reuse for subsequent txids
|
|
528
|
+
r.roots[b.blockHeight] = root;
|
|
529
|
+
}
|
|
530
|
+
return r.roots[b.blockHeight] === root;
|
|
513
531
|
}
|
|
514
532
|
/**
|
|
515
533
|
* Serializes this data to `writer`
|
|
@@ -670,11 +688,37 @@ export class Beef {
|
|
|
670
688
|
const validTxids = {};
|
|
671
689
|
// Hashtable of all transaction txids to transaction
|
|
672
690
|
const txidToTx = {};
|
|
673
|
-
// queue of unsorted transactions ...
|
|
674
|
-
let queue = [];
|
|
675
691
|
// sorted transactions: hasProof to with longest dependency chain
|
|
676
692
|
const result = [];
|
|
677
693
|
const txidOnly = [];
|
|
694
|
+
// Partition into proven, txidOnly, and remaining queue
|
|
695
|
+
let queue = this.partitionTxs(txidToTx, validTxids, result, txidOnly);
|
|
696
|
+
// Separate queue entries that have missing inputs
|
|
697
|
+
const { txsMissingInputs, missingInputs, remaining } = this.separateMissingInputs(queue, txidToTx);
|
|
698
|
+
queue = remaining;
|
|
699
|
+
// Topological sort of remaining queue
|
|
700
|
+
const txsNotValid = this.topoSort(queue, validTxids, result);
|
|
701
|
+
// New order of txs is unsortable (missing inputs or depends on missing inputs), txidOnly, sorted (so newest sorted is last)
|
|
702
|
+
this.txs = txsMissingInputs
|
|
703
|
+
.concat(txsNotValid)
|
|
704
|
+
.concat(txidOnly)
|
|
705
|
+
.concat(result);
|
|
706
|
+
this.needsSort = false;
|
|
707
|
+
this.invalidateSerializationCaches();
|
|
708
|
+
return {
|
|
709
|
+
missingInputs: Object.keys(missingInputs),
|
|
710
|
+
notValid: txsNotValid.map((tx) => tx.txid),
|
|
711
|
+
valid: Object.keys(validTxids),
|
|
712
|
+
withMissingInputs: txsMissingInputs.map((tx) => tx.txid),
|
|
713
|
+
txidOnly: txidOnly.map((tx) => tx.txid)
|
|
714
|
+
};
|
|
715
|
+
}
|
|
716
|
+
/**
|
|
717
|
+
* Partition txs into proven (result), txidOnly, and a queue of the rest.
|
|
718
|
+
* Populates txidToTx and validTxids as side-effects.
|
|
719
|
+
*/
|
|
720
|
+
partitionTxs(txidToTx, validTxids, result, txidOnly) {
|
|
721
|
+
const queue = [];
|
|
678
722
|
for (const tx of this.txs) {
|
|
679
723
|
txidToTx[tx.txid] = tx;
|
|
680
724
|
tx.isValid = tx.hasProof;
|
|
@@ -690,21 +734,19 @@ export class Beef {
|
|
|
690
734
|
queue.push(tx);
|
|
691
735
|
}
|
|
692
736
|
}
|
|
693
|
-
|
|
737
|
+
return queue;
|
|
738
|
+
}
|
|
739
|
+
/**
|
|
740
|
+
* Separate queue entries that have at least one input txid not present in txidToTx.
|
|
741
|
+
*/
|
|
742
|
+
separateMissingInputs(candidates, txidToTx) {
|
|
694
743
|
const missingInputs = {};
|
|
695
|
-
// transactions with one or more missing inputs
|
|
696
744
|
const txsMissingInputs = [];
|
|
697
|
-
const
|
|
698
|
-
|
|
699
|
-
// all tx are isValid false, hasProof false.
|
|
700
|
-
// if isTxidOnly then has inputTxids
|
|
701
|
-
for (const tx of possiblyMissingInputs) {
|
|
745
|
+
const remaining = [];
|
|
746
|
+
for (const tx of candidates) {
|
|
702
747
|
let hasMissingInput = false;
|
|
703
|
-
// For all the unproven transactions,
|
|
704
|
-
// link their inputs that exist in this beef,
|
|
705
|
-
// make a note of missing inputs.
|
|
706
748
|
for (const inputTxid of tx.inputTxids) {
|
|
707
|
-
if (txidToTx[inputTxid] === undefined) {
|
|
749
|
+
if (txidToTx[inputTxid] === undefined) {
|
|
708
750
|
missingInputs[inputTxid] = true;
|
|
709
751
|
hasMissingInput = true;
|
|
710
752
|
}
|
|
@@ -713,15 +755,18 @@ export class Beef {
|
|
|
713
755
|
txsMissingInputs.push(tx);
|
|
714
756
|
}
|
|
715
757
|
else {
|
|
716
|
-
|
|
758
|
+
remaining.push(tx);
|
|
717
759
|
}
|
|
718
760
|
}
|
|
719
|
-
|
|
761
|
+
return { txsMissingInputs, missingInputs, remaining };
|
|
762
|
+
}
|
|
763
|
+
/**
|
|
764
|
+
* Topologically sort queue into result; return anything that cannot be sorted.
|
|
765
|
+
*/
|
|
766
|
+
topoSort(queue, validTxids, result) {
|
|
720
767
|
while (queue.length > 0) {
|
|
721
768
|
const oldQueue = queue;
|
|
722
769
|
queue = [];
|
|
723
|
-
// all tx are isValid false, hasProof false.
|
|
724
|
-
// if isTxidOnly then has inputTxids
|
|
725
770
|
for (const tx of oldQueue) {
|
|
726
771
|
if (tx.inputTxids.every((txid) => validTxids[txid])) {
|
|
727
772
|
validTxids[tx.txid] = true;
|
|
@@ -731,26 +776,10 @@ export class Beef {
|
|
|
731
776
|
queue.push(tx);
|
|
732
777
|
}
|
|
733
778
|
}
|
|
734
|
-
if (oldQueue.length === queue.length)
|
|
779
|
+
if (oldQueue.length === queue.length)
|
|
735
780
|
break;
|
|
736
|
-
}
|
|
737
781
|
}
|
|
738
|
-
|
|
739
|
-
const txsNotValid = queue;
|
|
740
|
-
// New order of txs is unsortable (missing inputs or depends on missing inputs), txidOnly, sorted (so newest sorted is last)
|
|
741
|
-
this.txs = txsMissingInputs
|
|
742
|
-
.concat(txsNotValid)
|
|
743
|
-
.concat(txidOnly)
|
|
744
|
-
.concat(result);
|
|
745
|
-
this.needsSort = false;
|
|
746
|
-
this.invalidateSerializationCaches();
|
|
747
|
-
return {
|
|
748
|
-
missingInputs: Object.keys(missingInputs),
|
|
749
|
-
notValid: txsNotValid.map((tx) => tx.txid),
|
|
750
|
-
valid: Object.keys(validTxids),
|
|
751
|
-
withMissingInputs: txsMissingInputs.map((tx) => tx.txid),
|
|
752
|
-
txidOnly: txidOnly.map((tx) => tx.txid)
|
|
753
|
-
};
|
|
782
|
+
return queue;
|
|
754
783
|
}
|
|
755
784
|
/**
|
|
756
785
|
* @returns a shallow copy of this beef
|
|
@@ -771,6 +800,14 @@ export class Beef {
|
|
|
771
800
|
* @param knownTxids
|
|
772
801
|
*/
|
|
773
802
|
trimKnownTxids(knownTxids) {
|
|
803
|
+
let mutated = this.removeKnownTxidOnlyTxs(knownTxids);
|
|
804
|
+
mutated = this.reindexBumps() || mutated;
|
|
805
|
+
if (mutated) {
|
|
806
|
+
this.markMutated(true);
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
/** Remove txidOnly entries that appear in knownTxids; return true if any were removed. */
|
|
810
|
+
removeKnownTxidOnlyTxs(knownTxids) {
|
|
774
811
|
let mutated = false;
|
|
775
812
|
for (let i = 0; i < this.txs.length;) {
|
|
776
813
|
const tx = this.txs[i];
|
|
@@ -783,41 +820,43 @@ export class Beef {
|
|
|
783
820
|
i++;
|
|
784
821
|
}
|
|
785
822
|
}
|
|
786
|
-
|
|
823
|
+
return mutated;
|
|
824
|
+
}
|
|
825
|
+
/**
|
|
826
|
+
* Remove bumps that are no longer referenced by any tx and update bumpIndex references.
|
|
827
|
+
* Returns true if any bumps were removed.
|
|
828
|
+
*/
|
|
829
|
+
reindexBumps() {
|
|
787
830
|
const referencedBumpIndices = new Set();
|
|
788
831
|
for (const tx of this.txs) {
|
|
789
832
|
if (tx.bumpIndex !== undefined) {
|
|
790
833
|
referencedBumpIndices.add(tx.bumpIndex);
|
|
791
834
|
}
|
|
792
835
|
}
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
}
|
|
803
|
-
}
|
|
804
|
-
// Remove unreferenced bumps
|
|
805
|
-
this.bumps = this.bumps.filter((_, i) => referencedBumpIndices.has(i));
|
|
806
|
-
// Update all transaction bumpIndex references
|
|
807
|
-
for (const tx of this.txs) {
|
|
808
|
-
if (tx.bumpIndex !== undefined) {
|
|
809
|
-
const newIndex = indexMap.get(tx.bumpIndex);
|
|
810
|
-
if (newIndex === undefined) {
|
|
811
|
-
throw new Error(`Internal error: bumpIndex ${tx.bumpIndex} not found in indexMap`);
|
|
812
|
-
}
|
|
813
|
-
tx.bumpIndex = newIndex;
|
|
814
|
-
}
|
|
836
|
+
if (referencedBumpIndices.size >= this.bumps.length)
|
|
837
|
+
return false;
|
|
838
|
+
// Build mapping of old indices to new indices after removal
|
|
839
|
+
const indexMap = new Map();
|
|
840
|
+
let newIndex = 0;
|
|
841
|
+
for (let i = 0; i < this.bumps.length; i++) {
|
|
842
|
+
if (referencedBumpIndices.has(i)) {
|
|
843
|
+
indexMap.set(i, newIndex);
|
|
844
|
+
newIndex++;
|
|
815
845
|
}
|
|
816
|
-
mutated = true;
|
|
817
846
|
}
|
|
818
|
-
|
|
819
|
-
|
|
847
|
+
// Remove unreferenced bumps
|
|
848
|
+
this.bumps = this.bumps.filter((_, i) => referencedBumpIndices.has(i));
|
|
849
|
+
// Update all transaction bumpIndex references
|
|
850
|
+
for (const tx of this.txs) {
|
|
851
|
+
if (tx.bumpIndex === undefined)
|
|
852
|
+
continue;
|
|
853
|
+
const mapped = indexMap.get(tx.bumpIndex);
|
|
854
|
+
if (mapped === undefined) {
|
|
855
|
+
throw new Error(`Internal error: bumpIndex ${tx.bumpIndex} not found in indexMap`);
|
|
856
|
+
}
|
|
857
|
+
tx.bumpIndex = mapped;
|
|
820
858
|
}
|
|
859
|
+
return true;
|
|
821
860
|
}
|
|
822
861
|
/**
|
|
823
862
|
* @returns array of transaction txids that either have a proof or whose inputs chain back to a proven transaction.
|
|
@@ -836,7 +875,7 @@ export class Beef {
|
|
|
836
875
|
for (const b of this.bumps) {
|
|
837
876
|
i++;
|
|
838
877
|
log += ` BUMP ${i}\n block: ${b.blockHeight}\n txids: [\n${b.path[0]
|
|
839
|
-
.filter((n) => n.txid === true)
|
|
878
|
+
.filter((n) => n.txid === true)
|
|
840
879
|
.map((n) => ` '${n.hash ?? ''}'`)
|
|
841
880
|
.join(',\n')}\n ]\n`;
|
|
842
881
|
}
|
|
@@ -851,7 +890,7 @@ export class Beef {
|
|
|
851
890
|
log += ' txidOnly\n';
|
|
852
891
|
}
|
|
853
892
|
else {
|
|
854
|
-
log += ` rawTx length=${t.rawTx?.length ?? 0}\n`;
|
|
893
|
+
log += ` rawTx length=${t.rawTx?.length ?? 0}\n`;
|
|
855
894
|
}
|
|
856
895
|
if (t.inputTxids.length > 0) {
|
|
857
896
|
log += ` inputs: [\n${t.inputTxids
|
|
@@ -866,25 +905,29 @@ export class Beef {
|
|
|
866
905
|
* leaves that can be computed from row zero.
|
|
867
906
|
*/
|
|
868
907
|
addComputedLeaves() {
|
|
869
|
-
|
|
870
|
-
for (const bump of this.bumps) { // ✅ Use `this` instead of `beef`
|
|
908
|
+
for (const bump of this.bumps) {
|
|
871
909
|
for (let row = 1; row < bump.path.length; row++) {
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
910
|
+
this.addComputedLeavesForRow(bump, row);
|
|
911
|
+
}
|
|
912
|
+
}
|
|
913
|
+
}
|
|
914
|
+
/** Add any missing computable leaf at `row` derived from two known leaves at `row - 1`. */
|
|
915
|
+
addComputedLeavesForRow(bump, row) {
|
|
916
|
+
const hashPair = (m) => toHex(hash256(toArray(m, 'hex').reverse()).reverse());
|
|
917
|
+
for (const leafL of bump.path[row - 1]) {
|
|
918
|
+
if (typeof leafL.hash !== 'string' || (leafL.offset & 1) !== 0)
|
|
919
|
+
continue;
|
|
920
|
+
const leafR = bump.path[row - 1].find((l) => l.offset === leafL.offset + 1);
|
|
921
|
+
if (leafR === undefined || typeof leafR.hash !== 'string')
|
|
922
|
+
continue;
|
|
923
|
+
const offsetOnRow = leafL.offset >> 1;
|
|
924
|
+
if (bump.path[row].every((l) => l.offset !== offsetOnRow)) {
|
|
925
|
+
// Computable leaf is missing... add it.
|
|
926
|
+
bump.path[row].push({
|
|
927
|
+
offset: offsetOnRow,
|
|
928
|
+
// String concatenation puts the right leaf on the left of the left leaf hash
|
|
929
|
+
hash: hashPair(leafR.hash + leafL.hash)
|
|
930
|
+
});
|
|
888
931
|
}
|
|
889
932
|
}
|
|
890
933
|
}
|