@btc-vision/bitcoin 6.5.5 → 7.0.0-alpha.0
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/AUDIT/README.md +9 -0
- package/HOW_TO_WRITE_GOOD_CODE.md +2436 -0
- package/SECURITY.md +27 -0
- package/benchmark/psbt-2000-inputs.bench.ts +178 -0
- package/benchmark/signing.bench.ts +147 -0
- package/browser/address.d.ts +56 -9
- 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 +12482 -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 +57 -10
- package/build/address.d.ts.map +1 -0
- package/build/address.js +80 -24
- 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 +204 -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 +36 -9
- package/build/payments/bip341.d.ts.map +1 -0
- package/build/payments/bip341.js +35 -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 -152
- 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 +429 -104
- 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 +466 -144
- 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 +113 -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 +411 -412
- 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 +37 -13
- 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 +100 -36
- 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 +175 -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 +83 -25
- package/scripts/bundle-ecc.ts +111 -0
- package/src/address.ts +81 -44
- package/src/bech32utils.ts +3 -3
- package/src/bip66.ts +34 -24
- package/src/block.ts +196 -84
- package/src/branded.ts +18 -0
- package/src/crypto.ts +64 -26
- package/src/ecc/context.ts +277 -0
- package/src/ecc/index.ts +14 -0
- package/src/ecc/types.ts +154 -0
- package/src/ecpair.d.ts +99 -0
- package/src/errors.ts +163 -0
- package/src/index.ts +113 -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 +34 -33
- package/src/payments/embed.ts +244 -41
- package/src/payments/index.ts +12 -10
- package/src/payments/p2ms.ts +490 -118
- package/src/payments/p2op.ts +431 -133
- package/src/payments/p2pk.ts +370 -72
- package/src/payments/p2pkh.ts +524 -130
- package/src/payments/p2sh.ts +572 -172
- package/src/payments/p2tr.ts +686 -194
- package/src/payments/p2wpkh.ts +484 -107
- package/src/payments/p2wsh.ts +526 -164
- package/src/payments/types.ts +80 -66
- package/src/psbt/bip371.ts +68 -51
- package/src/psbt/psbtutils.ts +39 -40
- package/src/psbt/types.ts +331 -0
- package/src/psbt/utils.ts +188 -0
- package/src/psbt/validation.ts +192 -0
- package/src/psbt.ts +566 -809
- package/src/pubkey.ts +24 -25
- package/src/push_data.ts +18 -16
- package/src/script.ts +82 -64
- package/src/script_number.ts +6 -6
- package/src/script_signature.ts +33 -36
- package/src/transaction.ts +458 -238
- package/src/types.ts +231 -100
- package/src/workers/WorkerSigningPool.node.ts +887 -0
- package/src/workers/WorkerSigningPool.ts +670 -0
- package/src/workers/ecc-bundle.ts +26 -0
- package/src/workers/index.ts +165 -0
- package/src/workers/psbt-parallel.ts +332 -0
- package/src/workers/signing-worker.ts +353 -0
- package/src/workers/types.ts +413 -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/vite.config.browser.ts +3 -42
- package/vitest.config.integration.ts +11 -0
- package/browser/bufferutils.d.ts +0 -34
- package/browser/chunks/crypto-BhCpKpek.js +0 -2033
- package/browser/chunks/payments-yjA0Evsv.js +0 -1089
- package/browser/chunks/psbt-URK2hBFc.js +0 -4039
- 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 { PaymentType, type P2OPPayment, type PaymentOpts } 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
|
+
}
|
|
172
|
+
|
|
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
|
+
}
|
|
42
183
|
|
|
43
|
-
|
|
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;
|
|
193
|
+
}
|
|
44
194
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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');
|
|
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 });
|
|
63
206
|
}
|
|
64
207
|
|
|
65
|
-
|
|
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
|
+
}
|
|
66
219
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
|
|
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
|
+
}
|
|
78
241
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
242
|
+
// Private helper methods
|
|
243
|
+
|
|
244
|
+
#getDecodedAddress(): { version: number; prefix: string; data: Uint8Array } | undefined {
|
|
245
|
+
if (!this.#decodedAddressComputed) {
|
|
246
|
+
if (this.#inputAddress) {
|
|
247
|
+
const decoded = fromBech32(this.#inputAddress);
|
|
248
|
+
if (decoded) {
|
|
249
|
+
this.#decodedAddress = {
|
|
250
|
+
version: decoded.version,
|
|
251
|
+
prefix: decoded.prefix,
|
|
252
|
+
data: decoded.data,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
this.#decodedAddressComputed = true;
|
|
257
|
+
}
|
|
258
|
+
return this.#decodedAddress;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
#makeProgramFromParts(): Uint8Array | undefined {
|
|
262
|
+
if (
|
|
263
|
+
typeof this.#inputDeploymentVersion !== 'undefined' &&
|
|
264
|
+
typeof this.#inputHash160 !== 'undefined'
|
|
265
|
+
) {
|
|
266
|
+
if (this.#inputHash160.length !== 20) {
|
|
267
|
+
throw new TypeError('hash160 must be exactly 20 bytes');
|
|
268
|
+
}
|
|
269
|
+
if (this.#inputDeploymentVersion < 0 || this.#inputDeploymentVersion > 0xff) {
|
|
83
270
|
throw new TypeError('deploymentVersion must fit in one byte');
|
|
84
|
-
|
|
271
|
+
}
|
|
272
|
+
return concat([new Uint8Array([this.#inputDeploymentVersion]), this.#inputHash160]);
|
|
85
273
|
}
|
|
86
274
|
return undefined;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// Private computation methods
|
|
278
|
+
|
|
279
|
+
#computeAddress(): string | undefined {
|
|
280
|
+
if (this.#inputAddress) {
|
|
281
|
+
return this.#inputAddress;
|
|
282
|
+
}
|
|
283
|
+
const prog = this.program;
|
|
284
|
+
if (!prog) return undefined;
|
|
285
|
+
|
|
286
|
+
if (!this.#network.bech32Opnet) {
|
|
287
|
+
throw new TypeError('Network does not support opnet');
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
const words = bech32m.toWords(prog);
|
|
291
|
+
words.unshift(P2OP_WITNESS_VERSION);
|
|
292
|
+
return bech32m.encode(this.#network.bech32Opnet, words);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
#computeProgram(): Uint8Array | undefined {
|
|
296
|
+
if (this.#inputProgram) {
|
|
297
|
+
return this.#inputProgram;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// Build from deployment version + hash160
|
|
301
|
+
const fromParts = this.#makeProgramFromParts();
|
|
302
|
+
if (fromParts) {
|
|
303
|
+
return fromParts;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
if (this.#inputOutput) {
|
|
307
|
+
if (this.#inputOutput[0] !== OPS.OP_16) {
|
|
308
|
+
throw new TypeError('Invalid P2OP script');
|
|
309
|
+
}
|
|
310
|
+
let pushPos = 1;
|
|
311
|
+
let progLen: number;
|
|
312
|
+
if (this.#inputOutput[1]! < 0x4c) {
|
|
313
|
+
progLen = this.#inputOutput[1]!;
|
|
111
314
|
pushPos = 2;
|
|
112
|
-
} else if (
|
|
113
|
-
progLen =
|
|
315
|
+
} else if (this.#inputOutput[1] === 0x4c) {
|
|
316
|
+
progLen = this.#inputOutput[2]!;
|
|
114
317
|
pushPos = 3;
|
|
115
318
|
} else {
|
|
116
319
|
throw new TypeError('Unsupported push opcode in P2OP script');
|
|
117
320
|
}
|
|
118
|
-
return
|
|
321
|
+
return this.#inputOutput.subarray(pushPos, pushPos + progLen);
|
|
119
322
|
}
|
|
120
323
|
|
|
121
|
-
if (
|
|
122
|
-
|
|
123
|
-
return dec.data;
|
|
324
|
+
if (this.#inputAddress) {
|
|
325
|
+
return this.#getDecodedAddress()?.data;
|
|
124
326
|
}
|
|
125
|
-
});
|
|
126
327
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
return o.program[0];
|
|
130
|
-
});
|
|
328
|
+
return undefined;
|
|
329
|
+
}
|
|
131
330
|
|
|
132
|
-
|
|
133
|
-
if (
|
|
134
|
-
|
|
135
|
-
|
|
331
|
+
#computeDeploymentVersion(): number | undefined {
|
|
332
|
+
if (this.#inputDeploymentVersion !== undefined) {
|
|
333
|
+
return this.#inputDeploymentVersion;
|
|
334
|
+
}
|
|
335
|
+
const prog = this.program;
|
|
336
|
+
if (!prog) return undefined;
|
|
337
|
+
return prog[0];
|
|
338
|
+
}
|
|
136
339
|
|
|
137
|
-
|
|
138
|
-
if (
|
|
139
|
-
|
|
140
|
-
|
|
340
|
+
#computeHash160(): Uint8Array | undefined {
|
|
341
|
+
if (this.#inputHash160) {
|
|
342
|
+
return this.#inputHash160;
|
|
343
|
+
}
|
|
344
|
+
const prog = this.program;
|
|
345
|
+
if (!prog) return undefined;
|
|
346
|
+
return prog.subarray(1) as Bytes20;
|
|
347
|
+
}
|
|
141
348
|
|
|
142
|
-
|
|
143
|
-
if (
|
|
144
|
-
|
|
145
|
-
throw new TypeError('Network does not support opnet');
|
|
349
|
+
#computeOutput(): Uint8Array | undefined {
|
|
350
|
+
if (this.#inputOutput) {
|
|
351
|
+
return this.#inputOutput;
|
|
146
352
|
}
|
|
353
|
+
const prog = this.program;
|
|
354
|
+
if (!prog) return undefined;
|
|
147
355
|
|
|
148
|
-
|
|
149
|
-
|
|
356
|
+
return bscript.compile([OPS.OP_16, prog]);
|
|
357
|
+
}
|
|
150
358
|
|
|
151
|
-
|
|
152
|
-
});
|
|
359
|
+
// Validation
|
|
153
360
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
let prog: Buffer = NBuffer.alloc(0);
|
|
361
|
+
#validate(): void {
|
|
362
|
+
let prog: Uint8Array = alloc(0);
|
|
157
363
|
|
|
158
|
-
if (
|
|
159
|
-
const dec =
|
|
160
|
-
if (
|
|
364
|
+
if (this.#inputAddress) {
|
|
365
|
+
const dec = this.#getDecodedAddress();
|
|
366
|
+
if (!dec) {
|
|
367
|
+
throw new TypeError('Invalid address');
|
|
368
|
+
}
|
|
369
|
+
if (this.#network.bech32Opnet !== dec.prefix) {
|
|
161
370
|
throw new TypeError('Invalid prefix or network mismatch');
|
|
162
|
-
|
|
371
|
+
}
|
|
372
|
+
if (dec.version !== P2OP_WITNESS_VERSION) {
|
|
163
373
|
throw new TypeError('Invalid witness version for p2op');
|
|
164
|
-
|
|
374
|
+
}
|
|
375
|
+
if (dec.data.length < MIN_SIZE || dec.data.length > MAX_SIZE) {
|
|
165
376
|
throw new TypeError('Invalid witness program length');
|
|
377
|
+
}
|
|
166
378
|
prog = dec.data;
|
|
167
379
|
}
|
|
168
380
|
|
|
169
|
-
if (
|
|
170
|
-
if (prog.length && !
|
|
171
|
-
|
|
381
|
+
if (this.#inputProgram) {
|
|
382
|
+
if (prog.length > 0 && !equals(prog, this.#inputProgram)) {
|
|
383
|
+
throw new TypeError('Program mismatch');
|
|
384
|
+
}
|
|
385
|
+
prog = this.#inputProgram;
|
|
172
386
|
}
|
|
173
387
|
|
|
174
|
-
if (!prog.length &&
|
|
175
|
-
|
|
388
|
+
if (!prog.length && this.#inputDeploymentVersion !== undefined && this.#inputHash160) {
|
|
389
|
+
const made = this.#makeProgramFromParts();
|
|
390
|
+
if (made) prog = made;
|
|
176
391
|
}
|
|
177
392
|
|
|
178
|
-
if (
|
|
179
|
-
const outProg =
|
|
180
|
-
if (
|
|
393
|
+
if (this.#inputOutput) {
|
|
394
|
+
const outProg = this.program;
|
|
395
|
+
if (!outProg) {
|
|
396
|
+
throw new TypeError('Output program is required');
|
|
397
|
+
}
|
|
398
|
+
if (prog.length > 0 && !equals(prog, outProg)) {
|
|
181
399
|
throw new TypeError('Program mismatch (output vs other source)');
|
|
400
|
+
}
|
|
182
401
|
prog = outProg;
|
|
183
402
|
}
|
|
184
403
|
|
|
185
|
-
if (prog.length < MIN_SIZE || prog.length > MAX_SIZE)
|
|
404
|
+
if (prog.length < MIN_SIZE || prog.length > MAX_SIZE) {
|
|
186
405
|
throw new TypeError(`Witness program must be 2–40 bytes. Was ${prog.length} bytes`);
|
|
406
|
+
}
|
|
187
407
|
|
|
188
|
-
if (
|
|
408
|
+
if (
|
|
409
|
+
this.#inputDeploymentVersion !== undefined &&
|
|
410
|
+
this.#inputDeploymentVersion !== prog[0]
|
|
411
|
+
) {
|
|
189
412
|
throw new TypeError('deploymentVersion mismatch');
|
|
413
|
+
}
|
|
190
414
|
|
|
191
|
-
if (
|
|
415
|
+
if (this.#inputHash160 && !equals(this.#inputHash160, prog.subarray(1))) {
|
|
192
416
|
throw new TypeError('hash160 mismatch');
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
/**
|
|
421
|
+
* Converts to a plain P2OPPayment object for backwards compatibility.
|
|
422
|
+
*
|
|
423
|
+
* @returns A P2OPPayment object
|
|
424
|
+
*/
|
|
425
|
+
toPayment(): P2OPPayment {
|
|
426
|
+
return {
|
|
427
|
+
name: this.name,
|
|
428
|
+
network: this.network,
|
|
429
|
+
address: this.address,
|
|
430
|
+
program: this.program,
|
|
431
|
+
deploymentVersion: this.deploymentVersion,
|
|
432
|
+
hash160: this.hash160,
|
|
433
|
+
output: this.output as Script | undefined,
|
|
434
|
+
};
|
|
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');
|
|
193
478
|
}
|
|
194
479
|
|
|
195
|
-
|
|
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
|
+
);
|
|
491
|
+
|
|
492
|
+
// Return a merged object for backwards compatibility
|
|
493
|
+
return Object.assign(instance.toPayment(), a);
|
|
196
494
|
}
|