@btc-vision/bitcoin 6.5.6 → 7.0.0-alpha.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/HOW_TO_WRITE_GOOD_CODE.md +2436 -0
- package/benchmark/psbt-2000-inputs.bench.ts +178 -0
- package/benchmark/signing.bench.ts +147 -0
- package/browser/address.d.ts +57 -10
- package/browser/address.d.ts.map +1 -0
- package/browser/bech32utils.d.ts +9 -1
- package/browser/bech32utils.d.ts.map +1 -0
- package/browser/bip66.d.ts +11 -6
- package/browser/bip66.d.ts.map +1 -0
- package/browser/block.d.ts +117 -11
- package/browser/block.d.ts.map +1 -0
- package/browser/branded.d.ts +20 -0
- package/browser/branded.d.ts.map +1 -0
- package/browser/crypto/crypto.d.ts +1 -0
- package/browser/crypto/crypto.d.ts.map +1 -0
- package/browser/crypto.d.ts +46 -7
- package/browser/crypto.d.ts.map +1 -0
- package/browser/ecc/context.d.ts +129 -0
- package/browser/ecc/context.d.ts.map +1 -0
- package/browser/ecc/index.d.ts +11 -0
- package/browser/ecc/index.d.ts.map +1 -0
- package/browser/ecc/types.d.ts +128 -0
- package/browser/ecc/types.d.ts.map +1 -0
- package/browser/ecpair.d.ts +99 -0
- package/browser/errors.d.ts +124 -0
- package/browser/errors.d.ts.map +1 -0
- package/browser/index.d.ts +32 -5
- package/browser/index.d.ts.map +1 -0
- package/browser/index.js +12477 -101
- package/browser/io/BinaryReader.d.ts +276 -0
- package/browser/io/BinaryReader.d.ts.map +1 -0
- package/browser/io/BinaryWriter.d.ts +391 -0
- package/browser/io/BinaryWriter.d.ts.map +1 -0
- package/browser/io/MemoryPool.d.ts +220 -0
- package/browser/io/MemoryPool.d.ts.map +1 -0
- package/browser/io/base64.d.ts +13 -0
- package/browser/io/base64.d.ts.map +1 -0
- package/browser/io/hex.d.ts +67 -0
- package/browser/io/hex.d.ts.map +1 -0
- package/browser/io/index.d.ts +17 -0
- package/browser/io/index.d.ts.map +1 -0
- package/browser/io/utils.d.ts +199 -0
- package/browser/io/utils.d.ts.map +1 -0
- package/browser/merkle.d.ts +10 -1
- package/browser/merkle.d.ts.map +1 -0
- package/browser/networks.d.ts +70 -9
- package/browser/networks.d.ts.map +1 -0
- package/browser/opcodes.d.ts +1 -0
- package/browser/opcodes.d.ts.map +1 -0
- package/browser/payments/bip341.d.ts +35 -9
- package/browser/payments/bip341.d.ts.map +1 -0
- package/browser/payments/embed.d.ts +112 -1
- package/browser/payments/embed.d.ts.map +1 -0
- package/browser/payments/index.d.ts +17 -10
- package/browser/payments/index.d.ts.map +1 -0
- package/browser/payments/p2ms.d.ts +150 -0
- package/browser/payments/p2ms.d.ts.map +1 -0
- package/browser/payments/p2op.d.ts +150 -24
- package/browser/payments/p2op.d.ts.map +1 -0
- package/browser/payments/p2pk.d.ts +154 -1
- package/browser/payments/p2pk.d.ts.map +1 -0
- package/browser/payments/p2pkh.d.ts +176 -1
- package/browser/payments/p2pkh.d.ts.map +1 -0
- package/browser/payments/p2sh.d.ts +150 -1
- package/browser/payments/p2sh.d.ts.map +1 -0
- package/browser/payments/p2tr.d.ts +185 -1
- package/browser/payments/p2tr.d.ts.map +1 -0
- package/browser/payments/p2wpkh.d.ts +161 -1
- package/browser/payments/p2wpkh.d.ts.map +1 -0
- package/browser/payments/p2wsh.d.ts +146 -1
- package/browser/payments/p2wsh.d.ts.map +1 -0
- package/browser/payments/types.d.ts +94 -64
- package/browser/payments/types.d.ts.map +1 -0
- package/browser/psbt/bip371.d.ts +34 -8
- package/browser/psbt/bip371.d.ts.map +1 -0
- package/browser/psbt/psbtutils.d.ts +56 -16
- package/browser/psbt/psbtutils.d.ts.map +1 -0
- package/browser/psbt/types.d.ts +245 -0
- package/browser/psbt/types.d.ts.map +1 -0
- package/browser/psbt/utils.d.ts +64 -0
- package/browser/psbt/utils.d.ts.map +1 -0
- package/browser/psbt/validation.d.ts +84 -0
- package/browser/psbt/validation.d.ts.map +1 -0
- package/browser/psbt.d.ts +82 -118
- package/browser/psbt.d.ts.map +1 -0
- package/browser/pubkey.d.ts +27 -6
- package/browser/pubkey.d.ts.map +1 -0
- package/browser/push_data.d.ts +24 -2
- package/browser/push_data.d.ts.map +1 -0
- package/browser/script.d.ts +33 -8
- package/browser/script.d.ts.map +1 -0
- package/browser/script_number.d.ts +17 -0
- package/browser/script_number.d.ts.map +1 -0
- package/browser/script_signature.d.ts +23 -5
- package/browser/script_signature.d.ts.map +1 -0
- package/browser/transaction.d.ts +160 -18
- package/browser/transaction.d.ts.map +1 -0
- package/browser/types.d.ts +36 -38
- package/browser/types.d.ts.map +1 -0
- package/browser/workers/WorkerSigningPool.d.ts +143 -0
- package/browser/workers/WorkerSigningPool.d.ts.map +1 -0
- package/browser/workers/WorkerSigningPool.node.d.ts +116 -0
- package/browser/workers/WorkerSigningPool.node.d.ts.map +1 -0
- package/browser/workers/ecc-bundle.d.ts +25 -0
- package/browser/workers/ecc-bundle.d.ts.map +1 -0
- package/browser/workers/index.d.ts +91 -0
- package/browser/workers/index.d.ts.map +1 -0
- package/browser/workers/psbt-parallel.d.ts +88 -0
- package/browser/workers/psbt-parallel.d.ts.map +1 -0
- package/browser/workers/signing-worker.d.ts +37 -0
- package/browser/workers/signing-worker.d.ts.map +1 -0
- package/browser/workers/types.d.ts +365 -0
- package/browser/workers/types.d.ts.map +1 -0
- package/build/address.d.ts +58 -11
- package/build/address.d.ts.map +1 -0
- package/build/address.js +82 -25
- package/build/address.js.map +1 -0
- package/build/bech32utils.d.ts +9 -1
- package/build/bech32utils.d.ts.map +1 -0
- package/build/bech32utils.js +10 -2
- package/build/bech32utils.js.map +1 -0
- package/build/bip66.d.ts +11 -6
- package/build/bip66.d.ts.map +1 -0
- package/build/bip66.js +32 -3
- package/build/bip66.js.map +1 -0
- package/build/block.d.ts +117 -11
- package/build/block.d.ts.map +1 -0
- package/build/block.js +202 -72
- package/build/block.js.map +1 -0
- package/build/branded.d.ts +20 -0
- package/build/branded.d.ts.map +1 -0
- package/build/branded.js +7 -0
- package/build/branded.js.map +1 -0
- package/build/crypto/crypto.d.ts +1 -0
- package/build/crypto/crypto.d.ts.map +1 -0
- package/build/crypto/crypto.js +1 -0
- package/build/crypto/crypto.js.map +1 -0
- package/build/crypto.d.ts +46 -7
- package/build/crypto.d.ts.map +1 -0
- package/build/crypto.js +65 -20
- package/build/crypto.js.map +1 -0
- package/build/ecc/context.d.ts +135 -0
- package/build/ecc/context.d.ts.map +1 -0
- package/build/ecc/context.js +232 -0
- package/build/ecc/context.js.map +1 -0
- package/build/ecc/index.d.ts +11 -0
- package/build/ecc/index.d.ts.map +1 -0
- package/build/ecc/index.js +11 -0
- package/build/ecc/index.js.map +1 -0
- package/build/ecc/types.d.ts +134 -0
- package/build/ecc/types.d.ts.map +1 -0
- package/build/ecc/types.js +8 -0
- package/build/ecc/types.js.map +1 -0
- package/build/errors.d.ts +124 -0
- package/build/errors.d.ts.map +1 -0
- package/build/errors.js +155 -0
- package/build/errors.js.map +1 -0
- package/build/index.d.ts +32 -5
- package/build/index.d.ts.map +1 -0
- package/build/index.js +26 -3
- package/build/index.js.map +1 -0
- package/build/io/BinaryReader.d.ts +276 -0
- package/build/io/BinaryReader.d.ts.map +1 -0
- package/build/io/BinaryReader.js +425 -0
- package/build/io/BinaryReader.js.map +1 -0
- package/build/io/BinaryWriter.d.ts +391 -0
- package/build/io/BinaryWriter.d.ts.map +1 -0
- package/build/io/BinaryWriter.js +611 -0
- package/build/io/BinaryWriter.js.map +1 -0
- package/build/io/MemoryPool.d.ts +220 -0
- package/build/io/MemoryPool.d.ts.map +1 -0
- package/build/io/MemoryPool.js +309 -0
- package/build/io/MemoryPool.js.map +1 -0
- package/build/io/base64.d.ts +13 -0
- package/build/io/base64.d.ts.map +1 -0
- package/build/io/base64.js +20 -0
- package/build/io/base64.js.map +1 -0
- package/build/io/hex.d.ts +67 -0
- package/build/io/hex.d.ts.map +1 -0
- package/build/io/hex.js +138 -0
- package/build/io/hex.js.map +1 -0
- package/build/io/index.d.ts +17 -0
- package/build/io/index.d.ts.map +1 -0
- package/build/io/index.js +23 -0
- package/build/io/index.js.map +1 -0
- package/build/io/utils.d.ts +199 -0
- package/build/io/utils.d.ts.map +1 -0
- package/build/io/utils.js +271 -0
- package/build/io/utils.js.map +1 -0
- package/build/merkle.d.ts +10 -1
- package/build/merkle.d.ts.map +1 -0
- package/build/merkle.js +12 -1
- package/build/merkle.js.map +1 -0
- package/build/networks.d.ts +70 -9
- package/build/networks.d.ts.map +1 -0
- package/build/networks.js +90 -4
- package/build/networks.js.map +1 -0
- package/build/opcodes.d.ts +1 -0
- package/build/opcodes.d.ts.map +1 -0
- package/build/opcodes.js +1 -0
- package/build/opcodes.js.map +1 -0
- package/build/payments/bip341.d.ts +35 -9
- package/build/payments/bip341.d.ts.map +1 -0
- package/build/payments/bip341.js +34 -15
- package/build/payments/bip341.js.map +1 -0
- package/build/payments/embed.d.ts +120 -1
- package/build/payments/embed.d.ts.map +1 -0
- package/build/payments/embed.js +215 -34
- package/build/payments/embed.js.map +1 -0
- package/build/payments/index.d.ts +17 -10
- package/build/payments/index.d.ts.map +1 -0
- package/build/payments/index.js +20 -10
- package/build/payments/index.js.map +1 -0
- package/build/payments/p2ms.d.ts +159 -1
- package/build/payments/p2ms.d.ts.map +1 -0
- package/build/payments/p2ms.js +427 -108
- package/build/payments/p2ms.js.map +1 -0
- package/build/payments/p2op.d.ts +158 -24
- package/build/payments/p2op.d.ts.map +1 -0
- package/build/payments/p2op.js +379 -93
- package/build/payments/p2op.js.map +1 -0
- package/build/payments/p2pk.d.ts +162 -1
- package/build/payments/p2pk.d.ts.map +1 -0
- package/build/payments/p2pk.js +327 -58
- package/build/payments/p2pk.js.map +1 -0
- package/build/payments/p2pkh.d.ts +185 -1
- package/build/payments/p2pkh.d.ts.map +1 -0
- package/build/payments/p2pkh.js +467 -114
- package/build/payments/p2pkh.js.map +1 -0
- package/build/payments/p2sh.d.ts +159 -1
- package/build/payments/p2sh.d.ts.map +1 -0
- package/build/payments/p2sh.js +500 -150
- package/build/payments/p2sh.js.map +1 -0
- package/build/payments/p2tr.d.ts +193 -1
- package/build/payments/p2tr.d.ts.map +1 -0
- package/build/payments/p2tr.js +592 -174
- package/build/payments/p2tr.js.map +1 -0
- package/build/payments/p2wpkh.d.ts +170 -1
- package/build/payments/p2wpkh.d.ts.map +1 -0
- package/build/payments/p2wpkh.js +428 -103
- package/build/payments/p2wpkh.js.map +1 -0
- package/build/payments/p2wsh.d.ts +155 -1
- package/build/payments/p2wsh.d.ts.map +1 -0
- package/build/payments/p2wsh.js +465 -143
- package/build/payments/p2wsh.js.map +1 -0
- package/build/payments/types.d.ts +98 -64
- package/build/payments/types.d.ts.map +1 -0
- package/build/payments/types.js +17 -13
- package/build/payments/types.js.map +1 -0
- package/build/psbt/bip371.d.ts +35 -9
- package/build/psbt/bip371.d.ts.map +1 -0
- package/build/psbt/bip371.js +117 -28
- package/build/psbt/bip371.js.map +1 -0
- package/build/psbt/psbtutils.d.ts +56 -16
- package/build/psbt/psbtutils.d.ts.map +1 -0
- package/build/psbt/psbtutils.js +71 -16
- package/build/psbt/psbtutils.js.map +1 -0
- package/build/psbt/types.d.ts +249 -0
- package/build/psbt/types.d.ts.map +1 -0
- package/build/psbt/types.js +6 -0
- package/build/psbt/types.js.map +1 -0
- package/build/psbt/utils.d.ts +68 -0
- package/build/psbt/utils.d.ts.map +1 -0
- package/build/psbt/utils.js +171 -0
- package/build/psbt/utils.js.map +1 -0
- package/build/psbt/validation.d.ts +88 -0
- package/build/psbt/validation.d.ts.map +1 -0
- package/build/psbt/validation.js +149 -0
- package/build/psbt/validation.js.map +1 -0
- package/build/psbt.d.ts +84 -120
- package/build/psbt.d.ts.map +1 -0
- package/build/psbt.js +406 -413
- package/build/psbt.js.map +1 -0
- package/build/pubkey.d.ts +27 -6
- package/build/pubkey.d.ts.map +1 -0
- package/build/pubkey.js +36 -12
- package/build/pubkey.js.map +1 -0
- package/build/push_data.d.ts +24 -2
- package/build/push_data.d.ts.map +1 -0
- package/build/push_data.js +44 -12
- package/build/push_data.js.map +1 -0
- package/build/script.d.ts +33 -8
- package/build/script.d.ts.map +1 -0
- package/build/script.js +101 -37
- package/build/script.js.map +1 -0
- package/build/script_number.d.ts +17 -0
- package/build/script_number.d.ts.map +1 -0
- package/build/script_number.js +19 -0
- package/build/script_number.js.map +1 -0
- package/build/script_signature.d.ts +23 -5
- package/build/script_signature.d.ts.map +1 -0
- package/build/script_signature.js +48 -15
- package/build/script_signature.js.map +1 -0
- package/build/transaction.d.ts +160 -18
- package/build/transaction.d.ts.map +1 -0
- package/build/transaction.js +443 -176
- package/build/transaction.js.map +1 -0
- package/build/tsconfig.build.tsbuildinfo +1 -0
- package/build/types.d.ts +36 -38
- package/build/types.d.ts.map +1 -0
- package/build/types.js +169 -57
- package/build/types.js.map +1 -0
- package/build/workers/WorkerSigningPool.d.ts +174 -0
- package/build/workers/WorkerSigningPool.d.ts.map +1 -0
- package/build/workers/WorkerSigningPool.js +553 -0
- package/build/workers/WorkerSigningPool.js.map +1 -0
- package/build/workers/WorkerSigningPool.node.d.ts +124 -0
- package/build/workers/WorkerSigningPool.node.d.ts.map +1 -0
- package/build/workers/WorkerSigningPool.node.js +753 -0
- package/build/workers/WorkerSigningPool.node.js.map +1 -0
- package/build/workers/ecc-bundle.d.ts +25 -0
- package/build/workers/ecc-bundle.d.ts.map +1 -0
- package/build/workers/ecc-bundle.js +25 -0
- package/build/workers/ecc-bundle.js.map +1 -0
- package/build/workers/index.d.ts +91 -0
- package/build/workers/index.d.ts.map +1 -0
- package/build/workers/index.js +114 -0
- package/build/workers/index.js.map +1 -0
- package/build/workers/psbt-parallel.d.ts +117 -0
- package/build/workers/psbt-parallel.d.ts.map +1 -0
- package/build/workers/psbt-parallel.js +233 -0
- package/build/workers/psbt-parallel.js.map +1 -0
- package/build/workers/signing-worker.d.ts +37 -0
- package/build/workers/signing-worker.d.ts.map +1 -0
- package/build/workers/signing-worker.js +350 -0
- package/build/workers/signing-worker.js.map +1 -0
- package/build/workers/types.d.ts +365 -0
- package/build/workers/types.d.ts.map +1 -0
- package/build/workers/types.js +60 -0
- package/build/workers/types.js.map +1 -0
- package/package.json +68 -9
- package/scripts/bundle-ecc.ts +111 -0
- package/src/address.ts +91 -45
- package/src/bech32utils.ts +3 -3
- package/src/bip66.ts +34 -24
- package/src/block.ts +205 -86
- package/src/branded.ts +18 -0
- package/src/crypto.ts +64 -26
- package/src/ecc/context.ts +280 -0
- package/src/ecc/index.ts +14 -0
- package/src/ecc/types.ts +147 -0
- package/src/ecpair.d.ts +99 -0
- package/src/errors.ts +163 -0
- package/src/index.ts +112 -9
- package/src/io/BinaryReader.ts +461 -0
- package/src/io/BinaryWriter.ts +696 -0
- package/src/io/MemoryPool.ts +343 -0
- package/src/io/base64.ts +20 -0
- package/src/io/hex.ts +155 -0
- package/src/io/index.ts +41 -0
- package/src/io/utils.ts +283 -0
- package/src/merkle.ts +14 -9
- package/src/networks.ts +9 -9
- package/src/payments/bip341.ts +32 -33
- package/src/payments/embed.ts +244 -41
- package/src/payments/index.ts +12 -10
- package/src/payments/p2ms.ts +497 -118
- package/src/payments/p2op.ts +432 -134
- package/src/payments/p2pk.ts +370 -72
- package/src/payments/p2pkh.ts +524 -130
- package/src/payments/p2sh.ts +572 -169
- package/src/payments/p2tr.ts +686 -194
- package/src/payments/p2wpkh.ts +482 -105
- package/src/payments/p2wsh.ts +524 -162
- package/src/payments/types.ts +80 -66
- package/src/psbt/bip371.ts +72 -51
- package/src/psbt/psbtutils.ts +39 -40
- package/src/psbt/types.ts +324 -0
- package/src/psbt/utils.ts +188 -0
- package/src/psbt/validation.ts +185 -0
- package/src/psbt.ts +608 -827
- package/src/pubkey.ts +22 -23
- package/src/push_data.ts +18 -16
- package/src/script.ts +81 -66
- package/src/script_number.ts +6 -6
- package/src/script_signature.ts +33 -36
- package/src/transaction.ts +462 -239
- package/src/types.ts +229 -100
- package/src/workers/WorkerSigningPool.node.ts +887 -0
- package/src/workers/WorkerSigningPool.ts +666 -0
- package/src/workers/ecc-bundle.ts +26 -0
- package/src/workers/index.ts +165 -0
- package/src/workers/psbt-parallel.ts +327 -0
- package/src/workers/signing-worker.ts +353 -0
- package/src/workers/types.ts +417 -0
- package/test/address.spec.ts +9 -6
- package/test/bitcoin.core.spec.ts +16 -17
- package/test/block.spec.ts +8 -7
- package/test/bufferutils.spec.ts +228 -214
- package/test/crypto.spec.ts +19 -11
- package/test/fixtures/p2pk.json +0 -8
- package/test/fixtures/p2pkh.json +1 -1
- package/test/fixtures/p2sh.json +1 -1
- package/test/fixtures/script.json +1 -1
- package/test/fixtures/transaction.json +2 -2
- package/test/integration/_regtest.ts +25 -0
- package/test/integration/addresses.spec.ts +4 -3
- package/test/integration/bip32.spec.ts +2 -1
- package/test/integration/blocks.spec.ts +1 -1
- package/test/integration/cltv.spec.ts +18 -16
- package/test/integration/csv.spec.ts +37 -64
- package/test/integration/payments.spec.ts +5 -3
- package/test/integration/taproot.spec.ts +76 -83
- package/test/integration/transactions.spec.ts +38 -35
- package/test/payments.spec.ts +35 -13
- package/test/payments.utils.ts +17 -16
- package/test/psbt.spec.ts +111 -100
- package/test/script.spec.ts +11 -10
- package/test/script_signature.spec.ts +9 -11
- package/test/taproot-cache.spec.ts +694 -0
- package/test/transaction.spec.ts +32 -40
- package/test/types.spec.ts +74 -29
- package/test/workers-pool.spec.ts +963 -0
- package/test/workers-signing.spec.ts +635 -0
- package/test/workers.spec.ts +1390 -0
- package/tsconfig.base.json +34 -18
- package/tsconfig.browser.json +15 -0
- package/tsconfig.build.json +5 -0
- package/tsconfig.json +5 -14
- package/typedoc.json +29 -0
- package/vite.config.browser.ts +3 -42
- package/vitest.config.integration.ts +2 -0
- package/browser/bufferutils.d.ts +0 -34
- package/browser/chunks/crypto-BhCpKpek.js +0 -2033
- package/browser/chunks/payments-B1wlSccx.js +0 -1089
- package/browser/chunks/psbt-BCNk7JUx.js +0 -4055
- package/browser/chunks/script-DyPItFEl.js +0 -318
- package/browser/chunks/transaction-C_UbhMGn.js +0 -432
- package/browser/chunks/utils-DNZi-T5W.js +0 -761
- package/browser/ecc_lib.d.ts +0 -3
- package/browser/hooks/AdvancedSignatureManager.d.ts +0 -16
- package/browser/hooks/HookedSigner.d.ts +0 -4
- package/browser/hooks/SignatureManager.d.ts +0 -13
- package/browser/payments/lazy.d.ts +0 -2
- package/browser/typeforce.d.ts +0 -38
- package/build/bufferutils.d.ts +0 -34
- package/build/bufferutils.js +0 -141
- package/build/ecc_lib.d.ts +0 -3
- package/build/ecc_lib.js +0 -61
- package/build/hooks/AdvancedSignatureManager.d.ts +0 -16
- package/build/hooks/AdvancedSignatureManager.js +0 -52
- package/build/hooks/HookedSigner.d.ts +0 -4
- package/build/hooks/HookedSigner.js +0 -64
- package/build/hooks/SignatureManager.d.ts +0 -13
- package/build/hooks/SignatureManager.js +0 -45
- package/build/payments/lazy.d.ts +0 -2
- package/build/payments/lazy.js +0 -28
- package/build/tsconfig.tsbuildinfo +0 -1
- package/src/bufferutils.ts +0 -188
- package/src/ecc_lib.ts +0 -94
- package/src/hooks/AdvancedSignatureManager.ts +0 -104
- package/src/hooks/HookedSigner.ts +0 -108
- package/src/hooks/SignatureManager.ts +0 -84
- package/src/payments/lazy.ts +0 -28
- package/src/typeforce.d.ts +0 -38
- package/tsconfig.webpack.json +0 -18
package/src/payments/p2op.ts
CHANGED
|
@@ -1,196 +1,494 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pay-to-OPNet (P2OP) payment class.
|
|
3
|
+
*
|
|
4
|
+
* P2OP is a custom witness version 16 output type for the OPNet network.
|
|
5
|
+
* The witness program contains a deployment version and hash160.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
|
|
1
10
|
import { bech32m } from 'bech32';
|
|
2
|
-
import { Buffer as NBuffer } from 'buffer';
|
|
3
11
|
import { fromBech32 } from '../bech32utils.js';
|
|
4
|
-
import { bitcoin as BITCOIN_NETWORK, Network } from '../networks.js';
|
|
12
|
+
import { bitcoin as BITCOIN_NETWORK, type Network } from '../networks.js';
|
|
5
13
|
import * as bscript from '../script.js';
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import
|
|
14
|
+
import { alloc, concat, equals } from '../io/index.js';
|
|
15
|
+
import type { Bytes20, Script } from '../types.js';
|
|
16
|
+
import { type P2OPPayment, type PaymentOpts, PaymentType } from './types.js';
|
|
9
17
|
|
|
10
18
|
const OPS = bscript.opcodes;
|
|
11
19
|
const P2OP_WITNESS_VERSION = 0x10;
|
|
12
20
|
const MIN_SIZE = 2;
|
|
13
21
|
const MAX_SIZE = 40;
|
|
14
22
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
23
|
+
/**
|
|
24
|
+
* Pay-to-OPNet (P2OP) payment class.
|
|
25
|
+
*
|
|
26
|
+
* Creates locking scripts of the form: `OP_16 {program}`
|
|
27
|
+
* where program = `{deploymentVersion:uint8}{hash160:20-bytes|...}`
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* import { P2OP } from '@btc-vision/bitcoin';
|
|
32
|
+
*
|
|
33
|
+
* // Create from program
|
|
34
|
+
* const payment = P2OP.fromProgram(program);
|
|
35
|
+
* console.log(payment.address); // opnet address
|
|
36
|
+
*
|
|
37
|
+
* // Create from deployment version and hash160
|
|
38
|
+
* const fromParts = P2OP.fromParts(deploymentVersion, hash160);
|
|
39
|
+
*
|
|
40
|
+
* // Decode an existing output
|
|
41
|
+
* const decoded = P2OP.fromOutput(scriptPubKey);
|
|
42
|
+
* console.log(decoded.program);
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export class P2OP {
|
|
46
|
+
// Static public fields
|
|
47
|
+
static readonly NAME = PaymentType.P2OP;
|
|
48
|
+
|
|
49
|
+
// Private instance fields
|
|
50
|
+
readonly #network: Network;
|
|
51
|
+
readonly #opts: Required<PaymentOpts>;
|
|
52
|
+
|
|
53
|
+
// Input data (provided by user)
|
|
54
|
+
#inputAddress?: string | undefined;
|
|
55
|
+
#inputProgram?: Uint8Array | undefined;
|
|
56
|
+
#inputDeploymentVersion?: number | undefined;
|
|
57
|
+
#inputHash160?: Uint8Array | undefined;
|
|
58
|
+
#inputOutput?: Uint8Array | undefined;
|
|
59
|
+
|
|
60
|
+
// Cached computed values
|
|
61
|
+
#address?: string | undefined;
|
|
62
|
+
#program?: Uint8Array | undefined;
|
|
63
|
+
#deploymentVersion?: number | undefined;
|
|
64
|
+
#hash160?: Uint8Array | undefined;
|
|
65
|
+
#output?: Uint8Array | undefined;
|
|
66
|
+
|
|
67
|
+
// Cache flags
|
|
68
|
+
#addressComputed = false;
|
|
69
|
+
#programComputed = false;
|
|
70
|
+
#deploymentVersionComputed = false;
|
|
71
|
+
#hash160Computed = false;
|
|
72
|
+
#outputComputed = false;
|
|
73
|
+
|
|
74
|
+
// Decoded address cache
|
|
75
|
+
#decodedAddress?: { version: number; prefix: string; data: Uint8Array } | undefined;
|
|
76
|
+
#decodedAddressComputed = false;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Creates a new P2OP payment instance.
|
|
80
|
+
*
|
|
81
|
+
* @param params - Payment parameters
|
|
82
|
+
* @param params.address - Bech32m encoded OPNet address
|
|
83
|
+
* @param params.program - Witness program (2-40 bytes)
|
|
84
|
+
* @param params.deploymentVersion - Deployment version (0-255)
|
|
85
|
+
* @param params.hash160 - 20-byte hash
|
|
86
|
+
* @param params.output - The scriptPubKey
|
|
87
|
+
* @param params.network - Network parameters (defaults to mainnet)
|
|
88
|
+
* @param opts - Payment options
|
|
89
|
+
* @param opts.validate - Whether to validate inputs (default: true)
|
|
90
|
+
*
|
|
91
|
+
* @throws {TypeError} If validation is enabled and data is invalid
|
|
92
|
+
*/
|
|
93
|
+
constructor(
|
|
94
|
+
params: {
|
|
95
|
+
address?: string | undefined;
|
|
96
|
+
program?: Uint8Array | undefined;
|
|
97
|
+
deploymentVersion?: number | undefined;
|
|
98
|
+
hash160?: Uint8Array | undefined;
|
|
99
|
+
output?: Uint8Array | undefined;
|
|
100
|
+
network?: Network | undefined;
|
|
101
|
+
},
|
|
102
|
+
opts?: PaymentOpts,
|
|
103
|
+
) {
|
|
104
|
+
this.#network = params.network ?? BITCOIN_NETWORK;
|
|
105
|
+
this.#opts = {
|
|
106
|
+
validate: opts?.validate ?? true,
|
|
107
|
+
allowIncomplete: opts?.allowIncomplete ?? false,
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
// Store input data
|
|
111
|
+
this.#inputAddress = params.address;
|
|
112
|
+
this.#inputProgram = params.program;
|
|
113
|
+
this.#inputDeploymentVersion = params.deploymentVersion;
|
|
114
|
+
this.#inputHash160 = params.hash160;
|
|
115
|
+
this.#inputOutput = params.output;
|
|
116
|
+
|
|
117
|
+
// Validate if requested
|
|
118
|
+
if (this.#opts.validate) {
|
|
119
|
+
this.#validate();
|
|
120
|
+
}
|
|
121
|
+
}
|
|
18
122
|
|
|
19
|
-
|
|
20
|
-
output: Buffer;
|
|
123
|
+
// Public getters
|
|
21
124
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
125
|
+
/**
|
|
126
|
+
* Payment type discriminant.
|
|
127
|
+
*/
|
|
128
|
+
get name(): typeof PaymentType.P2OP {
|
|
129
|
+
return PaymentType.P2OP;
|
|
130
|
+
}
|
|
26
131
|
|
|
27
|
-
|
|
28
|
-
|
|
132
|
+
/**
|
|
133
|
+
* Network parameters.
|
|
134
|
+
*/
|
|
135
|
+
get network(): Network {
|
|
136
|
+
return this.#network;
|
|
137
|
+
}
|
|
29
138
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
139
|
+
/**
|
|
140
|
+
* Bech32m encoded OPNet address.
|
|
141
|
+
*/
|
|
142
|
+
get address(): string | undefined {
|
|
143
|
+
if (!this.#addressComputed) {
|
|
144
|
+
this.#address = this.#computeAddress();
|
|
145
|
+
this.#addressComputed = true;
|
|
146
|
+
}
|
|
147
|
+
return this.#address;
|
|
148
|
+
}
|
|
34
149
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
150
|
+
/**
|
|
151
|
+
* Witness program (2-40 bytes).
|
|
152
|
+
* Format: `{deploymentVersion:uint8}{hash160:20-bytes|...}`
|
|
153
|
+
*/
|
|
154
|
+
get program(): Uint8Array | undefined {
|
|
155
|
+
if (!this.#programComputed) {
|
|
156
|
+
this.#program = this.#computeProgram();
|
|
157
|
+
this.#programComputed = true;
|
|
158
|
+
}
|
|
159
|
+
return this.#program;
|
|
160
|
+
}
|
|
38
161
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
162
|
+
/**
|
|
163
|
+
* Deployment version (first byte of program).
|
|
164
|
+
*/
|
|
165
|
+
get deploymentVersion(): number | undefined {
|
|
166
|
+
if (!this.#deploymentVersionComputed) {
|
|
167
|
+
this.#deploymentVersion = this.#computeDeploymentVersion();
|
|
168
|
+
this.#deploymentVersionComputed = true;
|
|
169
|
+
}
|
|
170
|
+
return this.#deploymentVersion;
|
|
171
|
+
}
|
|
42
172
|
|
|
43
|
-
|
|
173
|
+
/**
|
|
174
|
+
* Hash160 (remaining bytes of program).
|
|
175
|
+
*/
|
|
176
|
+
get hash160(): Bytes20 | undefined {
|
|
177
|
+
if (!this.#hash160Computed) {
|
|
178
|
+
this.#hash160 = this.#computeHash160();
|
|
179
|
+
this.#hash160Computed = true;
|
|
180
|
+
}
|
|
181
|
+
return this.#hash160 as Bytes20 | undefined;
|
|
182
|
+
}
|
|
44
183
|
|
|
45
|
-
/**
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
*/
|
|
55
|
-
export function p2op(a: Omit<P2OPPaymentParams, 'name'>, opts?: PaymentOpts): P2OPPayment {
|
|
56
|
-
if (
|
|
57
|
-
!a.address &&
|
|
58
|
-
!a.output &&
|
|
59
|
-
!a.program &&
|
|
60
|
-
(typeof a.deploymentVersion === 'undefined' || !a.hash160)
|
|
61
|
-
) {
|
|
62
|
-
throw new TypeError('At least one of address, output or program must be provided');
|
|
184
|
+
/**
|
|
185
|
+
* The scriptPubKey: `OP_16 {program}`
|
|
186
|
+
*/
|
|
187
|
+
get output(): Uint8Array | undefined {
|
|
188
|
+
if (!this.#outputComputed) {
|
|
189
|
+
this.#output = this.#computeOutput();
|
|
190
|
+
this.#outputComputed = true;
|
|
191
|
+
}
|
|
192
|
+
return this.#output;
|
|
63
193
|
}
|
|
64
194
|
|
|
65
|
-
|
|
195
|
+
// Static factory methods
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Creates a P2OP payment from a witness program.
|
|
199
|
+
*
|
|
200
|
+
* @param program - Witness program (2-40 bytes)
|
|
201
|
+
* @param network - Network parameters (defaults to mainnet)
|
|
202
|
+
* @returns A new P2OP payment instance
|
|
203
|
+
*/
|
|
204
|
+
static fromProgram(program: Uint8Array, network?: Network): P2OP {
|
|
205
|
+
return new P2OP({ program, network });
|
|
206
|
+
}
|
|
66
207
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
208
|
+
/**
|
|
209
|
+
* Creates a P2OP payment from deployment version and hash160.
|
|
210
|
+
*
|
|
211
|
+
* @param deploymentVersion - Deployment version (0-255)
|
|
212
|
+
* @param hash160 - 20-byte hash
|
|
213
|
+
* @param network - Network parameters (defaults to mainnet)
|
|
214
|
+
* @returns A new P2OP payment instance
|
|
215
|
+
*/
|
|
216
|
+
static fromParts(deploymentVersion: number, hash160: Uint8Array, network?: Network): P2OP {
|
|
217
|
+
return new P2OP({ deploymentVersion, hash160, network });
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Creates a P2OP payment from an OPNet address.
|
|
222
|
+
*
|
|
223
|
+
* @param address - Bech32m encoded OPNet address
|
|
224
|
+
* @param network - Network parameters (defaults to mainnet)
|
|
225
|
+
* @returns A new P2OP payment instance
|
|
226
|
+
*/
|
|
227
|
+
static fromAddress(address: string, network?: Network): P2OP {
|
|
228
|
+
return new P2OP({ address, network });
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Creates a P2OP payment from a scriptPubKey.
|
|
233
|
+
*
|
|
234
|
+
* @param output - The scriptPubKey
|
|
235
|
+
* @param network - Network parameters (defaults to mainnet)
|
|
236
|
+
* @returns A new P2OP payment instance
|
|
237
|
+
*/
|
|
238
|
+
static fromOutput(output: Uint8Array, network?: Network): P2OP {
|
|
239
|
+
return new P2OP({ output, network });
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// Private helper methods
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Converts to a plain P2OPPayment object for backwards compatibility.
|
|
246
|
+
*
|
|
247
|
+
* @returns A P2OPPayment object
|
|
248
|
+
*/
|
|
249
|
+
toPayment(): P2OPPayment {
|
|
250
|
+
return {
|
|
251
|
+
name: this.name,
|
|
252
|
+
network: this.network,
|
|
253
|
+
address: this.address,
|
|
254
|
+
program: this.program,
|
|
255
|
+
deploymentVersion: this.deploymentVersion,
|
|
256
|
+
hash160: this.hash160,
|
|
257
|
+
output: this.output as Script | undefined,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
78
260
|
|
|
79
|
-
|
|
80
|
-
if (
|
|
81
|
-
if (
|
|
82
|
-
|
|
261
|
+
#getDecodedAddress(): { version: number; prefix: string; data: Uint8Array } | undefined {
|
|
262
|
+
if (!this.#decodedAddressComputed) {
|
|
263
|
+
if (this.#inputAddress) {
|
|
264
|
+
const decoded = fromBech32(this.#inputAddress);
|
|
265
|
+
if (decoded) {
|
|
266
|
+
this.#decodedAddress = {
|
|
267
|
+
version: decoded.version,
|
|
268
|
+
prefix: decoded.prefix,
|
|
269
|
+
data: decoded.data,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
this.#decodedAddressComputed = true;
|
|
274
|
+
}
|
|
275
|
+
return this.#decodedAddress;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// Private computation methods
|
|
279
|
+
|
|
280
|
+
#makeProgramFromParts(): Uint8Array | undefined {
|
|
281
|
+
if (
|
|
282
|
+
typeof this.#inputDeploymentVersion !== 'undefined' &&
|
|
283
|
+
typeof this.#inputHash160 !== 'undefined'
|
|
284
|
+
) {
|
|
285
|
+
if (this.#inputHash160.length !== 20) {
|
|
286
|
+
throw new TypeError('hash160 must be exactly 20 bytes');
|
|
287
|
+
}
|
|
288
|
+
if (this.#inputDeploymentVersion < 0 || this.#inputDeploymentVersion > 0xff) {
|
|
83
289
|
throw new TypeError('deploymentVersion must fit in one byte');
|
|
84
|
-
|
|
290
|
+
}
|
|
291
|
+
return concat([new Uint8Array([this.#inputDeploymentVersion]), this.#inputHash160]);
|
|
85
292
|
}
|
|
86
293
|
return undefined;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
#computeAddress(): string | undefined {
|
|
297
|
+
if (this.#inputAddress) {
|
|
298
|
+
return this.#inputAddress;
|
|
299
|
+
}
|
|
300
|
+
const prog = this.program;
|
|
301
|
+
if (!prog) return undefined;
|
|
302
|
+
|
|
303
|
+
if (!this.#network.bech32Opnet) {
|
|
304
|
+
throw new TypeError('Network does not support opnet');
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
const words = bech32m.toWords(prog);
|
|
308
|
+
words.unshift(P2OP_WITNESS_VERSION);
|
|
309
|
+
return bech32m.encode(this.#network.bech32Opnet, words);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
#computeProgram(): Uint8Array | undefined {
|
|
313
|
+
if (this.#inputProgram) {
|
|
314
|
+
return this.#inputProgram;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// Build from deployment version + hash160
|
|
318
|
+
const fromParts = this.#makeProgramFromParts();
|
|
319
|
+
if (fromParts) {
|
|
320
|
+
return fromParts;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
if (this.#inputOutput) {
|
|
324
|
+
if (this.#inputOutput[0] !== OPS.OP_16) {
|
|
325
|
+
throw new TypeError('Invalid P2OP script');
|
|
326
|
+
}
|
|
327
|
+
let pushPos = 1;
|
|
328
|
+
let progLen: number;
|
|
329
|
+
if (this.#inputOutput[1]! < 0x4c) {
|
|
330
|
+
progLen = this.#inputOutput[1]!;
|
|
111
331
|
pushPos = 2;
|
|
112
|
-
} else if (
|
|
113
|
-
progLen =
|
|
332
|
+
} else if (this.#inputOutput[1] === 0x4c) {
|
|
333
|
+
progLen = this.#inputOutput[2]!;
|
|
114
334
|
pushPos = 3;
|
|
115
335
|
} else {
|
|
116
336
|
throw new TypeError('Unsupported push opcode in P2OP script');
|
|
117
337
|
}
|
|
118
|
-
return
|
|
338
|
+
return this.#inputOutput.subarray(pushPos, pushPos + progLen);
|
|
119
339
|
}
|
|
120
340
|
|
|
121
|
-
if (
|
|
122
|
-
|
|
123
|
-
return dec.data;
|
|
341
|
+
if (this.#inputAddress) {
|
|
342
|
+
return this.#getDecodedAddress()?.data;
|
|
124
343
|
}
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
lazy.prop(o, 'deploymentVersion', () => {
|
|
128
|
-
if (!o.program) return;
|
|
129
|
-
return o.program[0];
|
|
130
|
-
});
|
|
131
344
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
return o.program.subarray(1);
|
|
135
|
-
});
|
|
345
|
+
return undefined;
|
|
346
|
+
}
|
|
136
347
|
|
|
137
|
-
|
|
138
|
-
if (
|
|
139
|
-
|
|
140
|
-
|
|
348
|
+
#computeDeploymentVersion(): number | undefined {
|
|
349
|
+
if (this.#inputDeploymentVersion !== undefined) {
|
|
350
|
+
return this.#inputDeploymentVersion;
|
|
351
|
+
}
|
|
352
|
+
const prog = this.program;
|
|
353
|
+
if (!prog) return undefined;
|
|
354
|
+
return prog[0];
|
|
355
|
+
}
|
|
141
356
|
|
|
142
|
-
|
|
143
|
-
if (
|
|
144
|
-
|
|
145
|
-
throw new TypeError('Network does not support opnet');
|
|
357
|
+
#computeHash160(): Uint8Array | undefined {
|
|
358
|
+
if (this.#inputHash160) {
|
|
359
|
+
return this.#inputHash160;
|
|
146
360
|
}
|
|
361
|
+
const prog = this.program;
|
|
362
|
+
if (!prog) return undefined;
|
|
363
|
+
return prog.subarray(1) as Bytes20;
|
|
364
|
+
}
|
|
147
365
|
|
|
148
|
-
|
|
149
|
-
words.unshift(P2OP_WITNESS_VERSION);
|
|
366
|
+
// Validation
|
|
150
367
|
|
|
151
|
-
|
|
152
|
-
|
|
368
|
+
#computeOutput(): Uint8Array | undefined {
|
|
369
|
+
if (this.#inputOutput) {
|
|
370
|
+
return this.#inputOutput;
|
|
371
|
+
}
|
|
372
|
+
const prog = this.program;
|
|
373
|
+
if (!prog) return undefined;
|
|
153
374
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
let prog: Buffer = NBuffer.alloc(0);
|
|
375
|
+
return bscript.compile([OPS.OP_16, prog]);
|
|
376
|
+
}
|
|
157
377
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
378
|
+
#validate(): void {
|
|
379
|
+
let prog: Uint8Array = alloc(0);
|
|
380
|
+
|
|
381
|
+
if (this.#inputAddress) {
|
|
382
|
+
const dec = this.#getDecodedAddress();
|
|
383
|
+
if (!dec) {
|
|
384
|
+
throw new TypeError('Invalid address');
|
|
385
|
+
}
|
|
386
|
+
if (this.#network.bech32Opnet !== dec.prefix) {
|
|
161
387
|
throw new TypeError('Invalid prefix or network mismatch');
|
|
162
|
-
|
|
388
|
+
}
|
|
389
|
+
if (dec.version !== P2OP_WITNESS_VERSION) {
|
|
163
390
|
throw new TypeError('Invalid witness version for p2op');
|
|
164
|
-
|
|
391
|
+
}
|
|
392
|
+
if (dec.data.length < MIN_SIZE || dec.data.length > MAX_SIZE) {
|
|
165
393
|
throw new TypeError('Invalid witness program length');
|
|
394
|
+
}
|
|
166
395
|
prog = dec.data;
|
|
167
396
|
}
|
|
168
397
|
|
|
169
|
-
if (
|
|
170
|
-
if (prog.length && !
|
|
171
|
-
|
|
398
|
+
if (this.#inputProgram) {
|
|
399
|
+
if (prog.length > 0 && !equals(prog, this.#inputProgram)) {
|
|
400
|
+
throw new TypeError('Program mismatch');
|
|
401
|
+
}
|
|
402
|
+
prog = this.#inputProgram;
|
|
172
403
|
}
|
|
173
404
|
|
|
174
|
-
if (!prog.length &&
|
|
175
|
-
|
|
405
|
+
if (!prog.length && this.#inputDeploymentVersion !== undefined && this.#inputHash160) {
|
|
406
|
+
const made = this.#makeProgramFromParts();
|
|
407
|
+
if (made) prog = made;
|
|
176
408
|
}
|
|
177
409
|
|
|
178
|
-
if (
|
|
179
|
-
const outProg =
|
|
180
|
-
if (
|
|
410
|
+
if (this.#inputOutput) {
|
|
411
|
+
const outProg = this.program;
|
|
412
|
+
if (!outProg) {
|
|
413
|
+
throw new TypeError('Output program is required');
|
|
414
|
+
}
|
|
415
|
+
if (prog.length > 0 && !equals(prog, outProg)) {
|
|
181
416
|
throw new TypeError('Program mismatch (output vs other source)');
|
|
417
|
+
}
|
|
182
418
|
prog = outProg;
|
|
183
419
|
}
|
|
184
420
|
|
|
185
|
-
if (prog.length < MIN_SIZE || prog.length > MAX_SIZE)
|
|
421
|
+
if (prog.length < MIN_SIZE || prog.length > MAX_SIZE) {
|
|
186
422
|
throw new TypeError(`Witness program must be 2–40 bytes. Was ${prog.length} bytes`);
|
|
423
|
+
}
|
|
187
424
|
|
|
188
|
-
if (
|
|
425
|
+
if (
|
|
426
|
+
this.#inputDeploymentVersion !== undefined &&
|
|
427
|
+
this.#inputDeploymentVersion !== prog[0]
|
|
428
|
+
) {
|
|
189
429
|
throw new TypeError('deploymentVersion mismatch');
|
|
430
|
+
}
|
|
190
431
|
|
|
191
|
-
if (
|
|
432
|
+
if (this.#inputHash160 && !equals(this.#inputHash160, prog.subarray(1))) {
|
|
192
433
|
throw new TypeError('hash160 mismatch');
|
|
434
|
+
}
|
|
193
435
|
}
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/**
|
|
439
|
+
* Creates a Pay-to-OPNet (P2OP) payment object.
|
|
440
|
+
*
|
|
441
|
+
* This is the legacy factory function for backwards compatibility.
|
|
442
|
+
* For new code, prefer using the P2OP class directly.
|
|
443
|
+
*
|
|
444
|
+
* @param a - The payment object containing the necessary data
|
|
445
|
+
* @param opts - Optional payment options
|
|
446
|
+
* @returns The P2OP payment object
|
|
447
|
+
* @throws {TypeError} If the required data is not provided or if the data is invalid
|
|
448
|
+
*
|
|
449
|
+
* @example
|
|
450
|
+
* ```typescript
|
|
451
|
+
* import { p2op } from '@btc-vision/bitcoin';
|
|
452
|
+
*
|
|
453
|
+
* // Create from program
|
|
454
|
+
* const payment = p2op({ program });
|
|
455
|
+
*
|
|
456
|
+
* // Create from parts
|
|
457
|
+
* const fromParts = p2op({ deploymentVersion: 0, hash160 });
|
|
458
|
+
* ```
|
|
459
|
+
*/
|
|
460
|
+
export function p2op(
|
|
461
|
+
a: {
|
|
462
|
+
address?: string;
|
|
463
|
+
program?: Uint8Array;
|
|
464
|
+
deploymentVersion?: number;
|
|
465
|
+
hash160?: Uint8Array;
|
|
466
|
+
output?: Uint8Array;
|
|
467
|
+
network?: Network;
|
|
468
|
+
},
|
|
469
|
+
opts?: PaymentOpts,
|
|
470
|
+
): P2OPPayment {
|
|
471
|
+
if (
|
|
472
|
+
!a.address &&
|
|
473
|
+
!a.output &&
|
|
474
|
+
!a.program &&
|
|
475
|
+
(typeof a.deploymentVersion === 'undefined' || !a.hash160)
|
|
476
|
+
) {
|
|
477
|
+
throw new TypeError('At least one of address, output or program must be provided');
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
const instance = new P2OP(
|
|
481
|
+
{
|
|
482
|
+
address: a.address,
|
|
483
|
+
program: a.program,
|
|
484
|
+
deploymentVersion: a.deploymentVersion,
|
|
485
|
+
hash160: a.hash160,
|
|
486
|
+
output: a.output,
|
|
487
|
+
network: a.network,
|
|
488
|
+
},
|
|
489
|
+
opts,
|
|
490
|
+
);
|
|
194
491
|
|
|
195
|
-
|
|
492
|
+
// Return a merged object for backwards compatibility
|
|
493
|
+
return Object.assign(instance.toPayment(), a);
|
|
196
494
|
}
|