@btc-vision/transaction 1.0.59 → 1.0.61
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/.gitattributes +2 -2
- package/browser/_version.d.ts +1 -1
- package/browser/index.js +1 -1
- package/browser/transaction/builders/TapUnwarpTransaction.d.ts +40 -40
- package/browser/transaction/builders/UnwarpTransaction.d.ts +34 -34
- package/browser/utxo/UTXOManager.d.ts +7 -7
- package/build/Utils.d.ts +0 -0
- package/build/Utils.js +1 -0
- package/build/_version.d.ts +1 -1
- package/build/_version.js +1 -1
- package/build/consensus/metadata/RoswsellConsensus.d.ts +2 -0
- package/build/consensus/metadata/RoswsellConsensus.js +4 -0
- package/build/contracts/ContractMetadataManager.d.ts +0 -0
- package/build/contracts/ContractMetadataManager.js +1 -0
- package/build/generators/OPNetAddressGenerator.d.ts +0 -0
- package/build/generators/OPNetAddressGenerator.js +1 -0
- package/build/generators/builders/UnwrapGenerator.d.ts +8 -0
- package/build/generators/builders/UnwrapGenerator.js +79 -0
- package/build/keypair/interfaces/GeneratedWallet.d.ts +5 -0
- package/build/keypair/interfaces/GeneratedWallet.js +1 -0
- package/build/metadata/CommonContracts.d.ts +6 -0
- package/build/metadata/CommonContracts.js +5 -0
- package/build/metadata/ContractMetadataManager.d.ts +1 -0
- package/build/metadata/ContractMetadataManager.js +9 -0
- package/build/metadata/contracts/ContractBase.d.ts +9 -0
- package/build/metadata/contracts/ContractBase.js +13 -0
- package/build/metadata/contracts/ContractBaseMetadata.d.ts +9 -0
- package/build/metadata/contracts/ContractBaseMetadata.js +13 -0
- package/build/metadata/contracts/ContractMetadataManager.d.ts +0 -0
- package/build/metadata/contracts/ContractMetadataManager.js +1 -0
- package/build/network/NetworkConverter.d.ts +0 -0
- package/build/network/NetworkConverter.js +14 -0
- package/build/scripts/Regtest.d.ts +2 -0
- package/build/scripts/Regtest.js +15 -0
- package/build/scripts/test.d.ts +1 -0
- package/build/scripts/test.js +74 -0
- package/build/signer/Regtest.d.ts +2 -0
- package/build/signer/Regtest.js +15 -0
- package/build/tests/Regtest.d.ts +3 -0
- package/build/tests/Regtest.js +29 -0
- package/build/tests/adaptPSBT.d.ts +1 -0
- package/build/tests/adaptPSBT.js +44 -0
- package/build/tests/btc/send.d.ts +1 -0
- package/build/tests/btc/send.js +35 -0
- package/build/tests/btc/transfer.d.ts +1 -0
- package/build/tests/btc/transfer.js +35 -0
- package/build/tests/createPairReg.d.ts +1 -0
- package/build/tests/createPairReg.js +73 -0
- package/build/tests/deploy/deployMoto.d.ts +4 -0
- package/build/tests/deploy/deployMoto.js +89 -0
- package/build/tests/deploy/deployPool.d.ts +1 -0
- package/build/tests/deploy/deployPool.js +5 -0
- package/build/tests/deploy/deployStep1.d.ts +1 -0
- package/build/tests/deploy/deployStep1.js +5 -0
- package/build/tests/deploy/deployStep2.d.ts +1 -0
- package/build/tests/deploy/deployStep2.js +5 -0
- package/build/tests/deploy/deployStep3.d.ts +1 -0
- package/build/tests/deploy/deployStep3.js +5 -0
- package/build/tests/deploy.d.ts +1 -0
- package/build/tests/deploy.js +41 -0
- package/build/tests/deployMotoRegStep1.d.ts +1 -0
- package/build/tests/deployMotoRegStep1.js +85 -0
- package/build/tests/deployReg.d.ts +1 -0
- package/build/tests/deployReg.js +85 -0
- package/build/tests/factory/createPairReg.d.ts +1 -0
- package/build/tests/factory/createPairReg.js +13 -0
- package/build/tests/gen.d.ts +1 -0
- package/build/tests/gen.js +19 -0
- package/build/tests/interaction.d.ts +5 -0
- package/build/tests/interaction.js +62 -0
- package/build/tests/massWrapReg.d.ts +1 -0
- package/build/tests/massWrapReg.js +105 -0
- package/build/tests/mineReg.d.ts +1 -0
- package/build/tests/mineReg.js +19 -0
- package/build/tests/moto/airdropToken.d.ts +1 -0
- package/build/tests/moto/airdropToken.js +21 -0
- package/build/tests/moto/airdropTokens.d.ts +1 -0
- package/build/tests/moto/airdropTokens.js +60 -0
- package/build/tests/moto/allowance.d.ts +1 -0
- package/build/tests/moto/allowance.js +6 -0
- package/build/tests/moto/approve.d.ts +1 -0
- package/build/tests/moto/approve.js +10 -0
- package/build/tests/moto/approveWBTC.d.ts +1 -0
- package/build/tests/moto/approveWBTC.js +12 -0
- package/build/tests/moto/balanceOf.d.ts +1 -0
- package/build/tests/moto/balanceOf.js +12 -0
- package/build/tests/moto/transfer.d.ts +1 -0
- package/build/tests/moto/transfer.js +16 -0
- package/build/tests/motoswap/airdropToken.d.ts +11 -0
- package/build/tests/motoswap/airdropToken.js +36 -0
- package/build/tests/motoswap/deployMoto.d.ts +4 -0
- package/build/tests/motoswap/deployMoto.js +89 -0
- package/build/tests/motoswap/deployMotoRegStep1.d.ts +1 -0
- package/build/tests/motoswap/deployMotoRegStep1.js +91 -0
- package/build/tests/motoswap/deployMotoRegStep2.d.ts +1 -0
- package/build/tests/motoswap/deployMotoRegStep2.js +91 -0
- package/build/tests/motoswap/deployPool.d.ts +1 -0
- package/build/tests/motoswap/deployPool.js +5 -0
- package/build/tests/motoswap/deployStep1.d.ts +1 -0
- package/build/tests/motoswap/deployStep1.js +5 -0
- package/build/tests/motoswap/deployStep2.d.ts +1 -0
- package/build/tests/motoswap/deployStep2.js +5 -0
- package/build/tests/motoswap/deployStep3.d.ts +1 -0
- package/build/tests/motoswap/deployStep3.js +5 -0
- package/build/tests/motoswap/interaction.d.ts +3 -0
- package/build/tests/motoswap/interaction.js +63 -0
- package/build/tests/motoswap/routerAddLiquidity.d.ts +11 -0
- package/build/tests/motoswap/routerAddLiquidity.js +35 -0
- package/build/tests/motoswap-router/addLiquidity.d.ts +11 -0
- package/build/tests/motoswap-router/addLiquidity.js +36 -0
- package/build/tests/motoswap-router/deployMoto.d.ts +4 -0
- package/build/tests/motoswap-router/deployMoto.js +89 -0
- package/build/tests/motoswap-router/deployPool.d.ts +1 -0
- package/build/tests/motoswap-router/deployPool.js +5 -0
- package/build/tests/motoswap-router/deployStep1.d.ts +1 -0
- package/build/tests/motoswap-router/deployStep1.js +5 -0
- package/build/tests/motoswap-router/deployStep2.d.ts +1 -0
- package/build/tests/motoswap-router/deployStep2.js +5 -0
- package/build/tests/motoswap-router/deployStep3.d.ts +1 -0
- package/build/tests/motoswap-router/deployStep3.js +5 -0
- package/build/tests/motoswap-router/getAmountsOut.d.ts +5 -0
- package/build/tests/motoswap-router/getAmountsOut.js +34 -0
- package/build/tests/motoswap-router/routerAddLiquidity.d.ts +11 -0
- package/build/tests/motoswap-router/routerAddLiquidity.js +35 -0
- package/build/tests/motoswap-router/swap.d.ts +8 -0
- package/build/tests/motoswap-router/swap.js +24 -0
- package/build/tests/multisign.d.ts +1 -0
- package/build/tests/multisign.js +47 -0
- package/build/tests/multisign2.d.ts +1 -0
- package/build/tests/multisign2.js +27 -0
- package/build/tests/pool/DecodePoolAddress.d.ts +6 -0
- package/build/tests/pool/DecodePoolAddress.js +12 -0
- package/build/tests/pool/decodeReserves.d.ts +5 -0
- package/build/tests/pool/decodeReserves.js +13 -0
- package/build/tests/pool/reserves.d.ts +1 -0
- package/build/tests/pool/reserves.js +18 -0
- package/build/tests/shared/Utils.d.ts +2 -0
- package/build/tests/shared/Utils.js +14 -0
- package/build/tests/shared/interaction.d.ts +7 -0
- package/build/tests/shared/interaction.js +85 -0
- package/build/tests/shared/tokens.d.ts +6 -0
- package/build/tests/shared/tokens.js +5 -0
- package/build/tests/stakeReg.d.ts +1 -0
- package/build/tests/stakeReg.js +73 -0
- package/build/tests/stakedReg.d.ts +1 -0
- package/build/tests/stakedReg.js +28 -0
- package/build/tests/test.d.ts +1 -0
- package/build/tests/test.js +51 -0
- package/build/tests/test2.d.ts +1 -0
- package/build/tests/test2.js +73 -0
- package/build/tests/testReg.d.ts +1 -0
- package/build/tests/testReg.js +91 -0
- package/build/tests/tokens.d.ts +6 -0
- package/build/tests/tokens.js +5 -0
- package/build/tests/totalRewardReg.d.ts +1 -0
- package/build/tests/totalRewardReg.js +28 -0
- package/build/tests/transfer.d.ts +1 -0
- package/build/tests/transfer.js +74 -0
- package/build/tests/transferReg.d.ts +1 -0
- package/build/tests/transferReg.js +74 -0
- package/build/tests/unStakeReg.d.ts +1 -0
- package/build/tests/unStakeReg.js +72 -0
- package/build/tests/unwrapReg.d.ts +1 -0
- package/build/tests/unwrapReg.js +61 -0
- package/build/tests/unwrapReg2.d.ts +1 -0
- package/build/tests/unwrapReg2.js +56 -0
- package/build/tests/unwrapRegSegwit.d.ts +1 -0
- package/build/tests/unwrapRegSegwit.js +83 -0
- package/build/tests/wbtc/approve.d.ts +1 -0
- package/build/tests/wbtc/approve.js +6 -0
- package/build/tests/wbtc/approveWBTC.d.ts +1 -0
- package/build/tests/wbtc/approveWBTC.js +12 -0
- package/build/tests/wbtc/massWrapReg.d.ts +1 -0
- package/build/tests/wbtc/massWrapReg.js +105 -0
- package/build/tests/wbtc/transfer.d.ts +1 -0
- package/build/tests/wbtc/transfer.js +16 -0
- package/build/tests/wbtc/transferReg.d.ts +1 -0
- package/build/tests/wbtc/transferReg.js +16 -0
- package/build/tests/wbtc/unStakeReg.d.ts +1 -0
- package/build/tests/wbtc/unStakeReg.js +72 -0
- package/build/tests/wbtc/unwrapReg.d.ts +1 -0
- package/build/tests/wbtc/unwrapReg.js +60 -0
- package/build/tests/wbtc/unwrapRegSegwit.d.ts +1 -0
- package/build/tests/wbtc/unwrapRegSegwit.js +83 -0
- package/build/tests/wbtc/withdrawalRequestReg.d.ts +1 -0
- package/build/tests/wbtc/withdrawalRequestReg.js +71 -0
- package/build/tests/wbtc/wrapReg.d.ts +1 -0
- package/build/tests/wbtc/wrapReg.js +65 -0
- package/build/tests/wbtc/wrapTest.d.ts +1 -0
- package/build/tests/wbtc/wrapTest.js +66 -0
- package/build/tests/withdrawalRequestReg.d.ts +1 -0
- package/build/tests/withdrawalRequestReg.js +71 -0
- package/build/tests/wrap.d.ts +1 -0
- package/build/tests/wrap.js +65 -0
- package/build/tests/wrapReg.d.ts +1 -0
- package/build/tests/wrapReg.js +68 -0
- package/build/tests/wrapTest.d.ts +1 -0
- package/build/tests/wrapTest.js +66 -0
- package/build/tests/wrapTestg.d.ts +1 -0
- package/build/tests/wrapTestg.js +66 -0
- package/build/tests/writers/allowance.d.ts +3 -0
- package/build/tests/writers/allowance.js +10 -0
- package/build/tests/writers/approve.d.ts +4 -0
- package/build/tests/writers/approve.js +11 -0
- package/build/transaction/TransactionBuilder.d.ts +60 -0
- package/build/transaction/TransactionBuilder.js +244 -0
- package/build/transaction/TransactionFactory.js +3 -2
- package/build/transaction/browser/BrowserSigner.d.ts +11 -0
- package/build/transaction/browser/BrowserSigner.js +10 -0
- package/build/transaction/browser/extensions/Unisat.d.ts +54 -0
- package/build/transaction/browser/extensions/Unisat.js +11 -0
- package/build/transaction/builders/GenericTransaction.d.ts +11 -0
- package/build/transaction/builders/GenericTransaction.js +23 -0
- package/build/transaction/builders/TapUnwarpTransaction.d.ts +37 -0
- package/build/transaction/builders/TapUnwarpTransaction.js +201 -0
- package/build/transaction/builders/TransactionBuilder.js +1 -1
- package/build/transaction/builders/UnwarpSegwitTransaction.d.ts +34 -0
- package/build/transaction/builders/UnwarpSegwitTransaction.js +184 -0
- package/build/transaction/builders/UnwarpTransaction.d.ts +35 -0
- package/build/transaction/builders/UnwarpTransaction.js +199 -0
- package/build/transaction/interfaces/ITransactions.d.ts +32 -0
- package/build/transaction/interfaces/ITransactions.js +1 -0
- package/build/utxo/IUTXO.d.ts +0 -0
- package/build/utxo/IUTXO.js +1 -0
- package/build/utxo/OPNetUtils.d.ts +7 -0
- package/build/utxo/OPNetUtils.js +47 -0
- package/build/utxo/UTXOManager.d.ts +7 -0
- package/build/utxo/UTXOManager.js +47 -0
- package/build/wbtc/BroadcastResponse.d.ts +0 -0
- package/build/wbtc/BroadcastResponse.js +1 -0
- package/gulpfile.js +152 -152
- package/package.json +1 -1
- package/src/_version.ts +1 -1
- package/src/consensus/Consensus.ts +36 -36
- package/src/consensus/ConsensusConfig.ts +39 -39
- package/src/crypto/crypto-browser.js +75 -75
- package/src/generators/AddressGenerator.ts +24 -24
- package/src/generators/Features.ts +5 -5
- package/src/generators/Generator.ts +75 -75
- package/src/generators/builders/CalldataGenerator.ts +148 -148
- package/src/generators/builders/DeploymentGenerator.ts +66 -66
- package/src/index.ts +4 -4
- package/src/keypair/AddressVerificator.ts +40 -40
- package/src/keypair/EcKeyPair.ts +282 -282
- package/src/keypair/Wallet.ts +97 -97
- package/src/keypair/interfaces/IWallet.ts +19 -19
- package/src/metadata/ContractBaseMetadata.ts +23 -23
- package/src/network/NetworkInformation.ts +7 -7
- package/src/opnet.ts +84 -84
- package/src/transaction/TransactionFactory.ts +3 -2
- package/src/transaction/browser/BrowserSignerBase.ts +37 -37
- package/src/transaction/browser/Web3Provider.ts +46 -46
- package/src/transaction/browser/extensions/UnisatSigner.ts +218 -218
- package/src/transaction/browser/types/Unisat.ts +80 -80
- package/src/transaction/builders/FundingTransaction.ts +40 -40
- package/src/transaction/builders/InteractionTransaction.ts +38 -38
- package/src/transaction/builders/SharedInteractionTransaction.ts +368 -368
- package/src/transaction/builders/TransactionBuilder.ts +665 -665
- package/src/transaction/interfaces/Tap.ts +26 -26
- package/src/transaction/psbt/PSBTTypes.ts +3 -3
- package/src/transaction/shared/TweakedTransaction.ts +537 -537
- package/src/utxo/OPNetLimitedProvider.ts +244 -244
- package/src/utxo/interfaces/BroadcastResponse.ts +10 -10
- package/src/utxo/interfaces/IUTXO.ts +29 -29
- package/src/verification/TapscriptVerificator.ts +89 -89
- package/src/wbtc/Generate.ts +40 -40
- package/src/wbtc/UnwrapGeneration.ts +13 -13
- package/src/wbtc/WrappedGenerationParameters.ts +33 -33
- package/webpack.config.js +78 -78
- /package/build/generators/builders/{MultiSignGenerator.d.ts → MultisignGenerator.d.ts} +0 -0
- /package/build/generators/builders/{MultiSignGenerator.js → MultisignGenerator.js} +0 -0
- /package/build/generators/{Features.d.ts → features.d.ts} +0 -0
- /package/build/generators/{Features.js → features.js} +0 -0
|
@@ -1,75 +1,75 @@
|
|
|
1
|
-
/* Browser Crypto Shims */
|
|
2
|
-
import { hmac } from '@noble/hashes/hmac';
|
|
3
|
-
import { pbkdf2 } from '@noble/hashes/pbkdf2';
|
|
4
|
-
import { sha256 } from '@noble/hashes/sha256';
|
|
5
|
-
import { sha512 } from '@noble/hashes/sha512';
|
|
6
|
-
import assert from 'assert';
|
|
7
|
-
|
|
8
|
-
function assertArgument(check, message, name, value) {
|
|
9
|
-
assert(check, message, 'INVALID_ARGUMENT', { argument: name, value: value });
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
function getGlobal() {
|
|
13
|
-
if (typeof self !== 'undefined') {
|
|
14
|
-
return self;
|
|
15
|
-
}
|
|
16
|
-
if (typeof window !== 'undefined') {
|
|
17
|
-
return window;
|
|
18
|
-
}
|
|
19
|
-
if (typeof global !== 'undefined') {
|
|
20
|
-
return global;
|
|
21
|
-
}
|
|
22
|
-
throw new Error('unable to locate global object');
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const anyGlobal = getGlobal();
|
|
26
|
-
const crypto = anyGlobal.crypto || anyGlobal.msCrypto;
|
|
27
|
-
|
|
28
|
-
export function createHash(algo) {
|
|
29
|
-
switch (algo) {
|
|
30
|
-
case 'sha256':
|
|
31
|
-
return sha256.create();
|
|
32
|
-
case 'sha512':
|
|
33
|
-
return sha512.create();
|
|
34
|
-
}
|
|
35
|
-
assertArgument(false, 'invalid hashing algorithm name', 'algorithm', algo);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export function createHmac(_algo, key) {
|
|
39
|
-
const algo = { sha256, sha512 }[_algo];
|
|
40
|
-
assertArgument(algo != null, 'invalid hmac algorithm', 'algorithm', _algo);
|
|
41
|
-
return hmac.create(algo, key);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export function pbkdf2Sync(password, salt, iterations, keylen, _algo) {
|
|
45
|
-
const algo = { sha256, sha512 }[_algo];
|
|
46
|
-
assertArgument(algo != null, 'invalid pbkdf2 algorithm', 'algorithm', _algo);
|
|
47
|
-
return pbkdf2(algo, password, salt, { c: iterations, dkLen: keylen });
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export function randomBytes(length) {
|
|
51
|
-
assert(
|
|
52
|
-
crypto != null,
|
|
53
|
-
'platform does not support secure random numbers',
|
|
54
|
-
'UNSUPPORTED_OPERATION',
|
|
55
|
-
{
|
|
56
|
-
operation: 'randomBytes',
|
|
57
|
-
},
|
|
58
|
-
);
|
|
59
|
-
assertArgument(
|
|
60
|
-
Number.isInteger(length) && length > 0 && length <= 1024,
|
|
61
|
-
'invalid length',
|
|
62
|
-
'length',
|
|
63
|
-
length,
|
|
64
|
-
);
|
|
65
|
-
const result = new Uint8Array(length);
|
|
66
|
-
crypto.getRandomValues(result);
|
|
67
|
-
return result;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
export default {
|
|
71
|
-
createHash,
|
|
72
|
-
createHmac,
|
|
73
|
-
pbkdf2Sync,
|
|
74
|
-
randomBytes,
|
|
75
|
-
};
|
|
1
|
+
/* Browser Crypto Shims */
|
|
2
|
+
import { hmac } from '@noble/hashes/hmac';
|
|
3
|
+
import { pbkdf2 } from '@noble/hashes/pbkdf2';
|
|
4
|
+
import { sha256 } from '@noble/hashes/sha256';
|
|
5
|
+
import { sha512 } from '@noble/hashes/sha512';
|
|
6
|
+
import assert from 'assert';
|
|
7
|
+
|
|
8
|
+
function assertArgument(check, message, name, value) {
|
|
9
|
+
assert(check, message, 'INVALID_ARGUMENT', { argument: name, value: value });
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function getGlobal() {
|
|
13
|
+
if (typeof self !== 'undefined') {
|
|
14
|
+
return self;
|
|
15
|
+
}
|
|
16
|
+
if (typeof window !== 'undefined') {
|
|
17
|
+
return window;
|
|
18
|
+
}
|
|
19
|
+
if (typeof global !== 'undefined') {
|
|
20
|
+
return global;
|
|
21
|
+
}
|
|
22
|
+
throw new Error('unable to locate global object');
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const anyGlobal = getGlobal();
|
|
26
|
+
const crypto = anyGlobal.crypto || anyGlobal.msCrypto;
|
|
27
|
+
|
|
28
|
+
export function createHash(algo) {
|
|
29
|
+
switch (algo) {
|
|
30
|
+
case 'sha256':
|
|
31
|
+
return sha256.create();
|
|
32
|
+
case 'sha512':
|
|
33
|
+
return sha512.create();
|
|
34
|
+
}
|
|
35
|
+
assertArgument(false, 'invalid hashing algorithm name', 'algorithm', algo);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function createHmac(_algo, key) {
|
|
39
|
+
const algo = { sha256, sha512 }[_algo];
|
|
40
|
+
assertArgument(algo != null, 'invalid hmac algorithm', 'algorithm', _algo);
|
|
41
|
+
return hmac.create(algo, key);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function pbkdf2Sync(password, salt, iterations, keylen, _algo) {
|
|
45
|
+
const algo = { sha256, sha512 }[_algo];
|
|
46
|
+
assertArgument(algo != null, 'invalid pbkdf2 algorithm', 'algorithm', _algo);
|
|
47
|
+
return pbkdf2(algo, password, salt, { c: iterations, dkLen: keylen });
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function randomBytes(length) {
|
|
51
|
+
assert(
|
|
52
|
+
crypto != null,
|
|
53
|
+
'platform does not support secure random numbers',
|
|
54
|
+
'UNSUPPORTED_OPERATION',
|
|
55
|
+
{
|
|
56
|
+
operation: 'randomBytes',
|
|
57
|
+
},
|
|
58
|
+
);
|
|
59
|
+
assertArgument(
|
|
60
|
+
Number.isInteger(length) && length > 0 && length <= 1024,
|
|
61
|
+
'invalid length',
|
|
62
|
+
'length',
|
|
63
|
+
length,
|
|
64
|
+
);
|
|
65
|
+
const result = new Uint8Array(length);
|
|
66
|
+
crypto.getRandomValues(result);
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export default {
|
|
71
|
+
createHash,
|
|
72
|
+
createHmac,
|
|
73
|
+
pbkdf2Sync,
|
|
74
|
+
randomBytes,
|
|
75
|
+
};
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
import { bech32 } from 'bech32';
|
|
2
|
-
import { initEccLib, Network } from 'bitcoinjs-lib';
|
|
3
|
-
import * as ecc from '@bitcoinerlab/secp256k1';
|
|
4
|
-
import { ripemd160 } from 'bitcoinjs-lib/src/crypto.js';
|
|
5
|
-
|
|
6
|
-
initEccLib(ecc);
|
|
7
|
-
|
|
8
|
-
export class AddressGenerator {
|
|
9
|
-
// Generate a valid SegWit address from random bytes
|
|
10
|
-
public static generatePKSH(sha256Hash: Buffer, network: Network): string {
|
|
11
|
-
if (sha256Hash.length !== 32) throw new Error('Invalid hash length');
|
|
12
|
-
|
|
13
|
-
const pkh = ripemd160(sha256Hash);
|
|
14
|
-
return this.toSegwitAddress(pkh, network);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
// Convert a hash to a SegWit address
|
|
18
|
-
private static toSegwitAddress(pkh: Buffer, network: Network): string {
|
|
19
|
-
const words = bech32.toWords(pkh);
|
|
20
|
-
words.unshift(0x00); // Add the witness version byte (0x00 for P2WPKH)
|
|
21
|
-
|
|
22
|
-
return bech32.encode(network.bech32, words);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
1
|
+
import { bech32 } from 'bech32';
|
|
2
|
+
import { initEccLib, Network } from 'bitcoinjs-lib';
|
|
3
|
+
import * as ecc from '@bitcoinerlab/secp256k1';
|
|
4
|
+
import { ripemd160 } from 'bitcoinjs-lib/src/crypto.js';
|
|
5
|
+
|
|
6
|
+
initEccLib(ecc);
|
|
7
|
+
|
|
8
|
+
export class AddressGenerator {
|
|
9
|
+
// Generate a valid SegWit address from random bytes
|
|
10
|
+
public static generatePKSH(sha256Hash: Buffer, network: Network): string {
|
|
11
|
+
if (sha256Hash.length !== 32) throw new Error('Invalid hash length');
|
|
12
|
+
|
|
13
|
+
const pkh = ripemd160(sha256Hash);
|
|
14
|
+
return this.toSegwitAddress(pkh, network);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// Convert a hash to a SegWit address
|
|
18
|
+
private static toSegwitAddress(pkh: Buffer, network: Network): string {
|
|
19
|
+
const words = bech32.toWords(pkh);
|
|
20
|
+
words.unshift(0x00); // Add the witness version byte (0x00 for P2WPKH)
|
|
21
|
+
|
|
22
|
+
return bech32.encode(network.bech32, words);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { opcodes } from 'bitcoinjs-lib';
|
|
2
|
-
|
|
3
|
-
export enum Features {
|
|
4
|
-
UNWRAP = opcodes.OP_16,
|
|
5
|
-
}
|
|
1
|
+
import { opcodes } from 'bitcoinjs-lib';
|
|
2
|
+
|
|
3
|
+
export enum Features {
|
|
4
|
+
UNWRAP = opcodes.OP_16,
|
|
5
|
+
}
|
|
@@ -1,75 +1,75 @@
|
|
|
1
|
-
import { Network, networks } from 'bitcoinjs-lib';
|
|
2
|
-
|
|
3
|
-
/** Bitcoin Script Generator */
|
|
4
|
-
export abstract class Generator {
|
|
5
|
-
/**
|
|
6
|
-
* The maximum size of a data chunk
|
|
7
|
-
*/
|
|
8
|
-
public static readonly DATA_CHUNK_SIZE: number = 512;
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* The magic number of OPNet
|
|
12
|
-
*/
|
|
13
|
-
public static readonly MAGIC: Buffer = Buffer.from('bsi', 'utf-8');
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* The public key of the sender
|
|
17
|
-
* @protected
|
|
18
|
-
*/
|
|
19
|
-
protected readonly senderPubKey: Buffer;
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* The public key of the contract salt
|
|
23
|
-
* @protected
|
|
24
|
-
*/
|
|
25
|
-
protected readonly contractSaltPubKey: Buffer;
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* The network to use
|
|
29
|
-
* @protected
|
|
30
|
-
*/
|
|
31
|
-
protected readonly network: Network = networks.bitcoin;
|
|
32
|
-
|
|
33
|
-
protected constructor(
|
|
34
|
-
senderPubKey: Buffer,
|
|
35
|
-
contractSaltPubKey: Buffer,
|
|
36
|
-
network: Network = networks.bitcoin,
|
|
37
|
-
) {
|
|
38
|
-
this.senderPubKey = senderPubKey;
|
|
39
|
-
this.contractSaltPubKey = contractSaltPubKey;
|
|
40
|
-
this.network = network;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Compile the script
|
|
45
|
-
* @param args - The arguments to use when compiling the script
|
|
46
|
-
* @returns {Buffer} - The compiled script
|
|
47
|
-
*/
|
|
48
|
-
public abstract compile(...args: unknown[]): Buffer;
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Split a buffer into chunks
|
|
52
|
-
* @param {Buffer} buffer - The buffer to split
|
|
53
|
-
* @param {number} chunkSize - The size of each chunk
|
|
54
|
-
* @protected
|
|
55
|
-
* @returns {Array<Buffer[]>} - The chunks
|
|
56
|
-
*/
|
|
57
|
-
protected splitBufferIntoChunks(
|
|
58
|
-
buffer: Buffer,
|
|
59
|
-
chunkSize: number = Generator.DATA_CHUNK_SIZE,
|
|
60
|
-
): Array<Buffer[]> {
|
|
61
|
-
const chunks: Array<Buffer[]> = [];
|
|
62
|
-
for (let i = 0; i < buffer.length; i += chunkSize) {
|
|
63
|
-
const dataLength = Math.min(chunkSize, buffer.length - i);
|
|
64
|
-
|
|
65
|
-
const buf2 = Buffer.alloc(dataLength);
|
|
66
|
-
for (let j = 0; j < dataLength; j++) {
|
|
67
|
-
buf2.writeUInt8(buffer[i + j], j);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
chunks.push([buf2]);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
return chunks;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
1
|
+
import { Network, networks } from 'bitcoinjs-lib';
|
|
2
|
+
|
|
3
|
+
/** Bitcoin Script Generator */
|
|
4
|
+
export abstract class Generator {
|
|
5
|
+
/**
|
|
6
|
+
* The maximum size of a data chunk
|
|
7
|
+
*/
|
|
8
|
+
public static readonly DATA_CHUNK_SIZE: number = 512;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* The magic number of OPNet
|
|
12
|
+
*/
|
|
13
|
+
public static readonly MAGIC: Buffer = Buffer.from('bsi', 'utf-8');
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* The public key of the sender
|
|
17
|
+
* @protected
|
|
18
|
+
*/
|
|
19
|
+
protected readonly senderPubKey: Buffer;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* The public key of the contract salt
|
|
23
|
+
* @protected
|
|
24
|
+
*/
|
|
25
|
+
protected readonly contractSaltPubKey: Buffer;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* The network to use
|
|
29
|
+
* @protected
|
|
30
|
+
*/
|
|
31
|
+
protected readonly network: Network = networks.bitcoin;
|
|
32
|
+
|
|
33
|
+
protected constructor(
|
|
34
|
+
senderPubKey: Buffer,
|
|
35
|
+
contractSaltPubKey: Buffer,
|
|
36
|
+
network: Network = networks.bitcoin,
|
|
37
|
+
) {
|
|
38
|
+
this.senderPubKey = senderPubKey;
|
|
39
|
+
this.contractSaltPubKey = contractSaltPubKey;
|
|
40
|
+
this.network = network;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Compile the script
|
|
45
|
+
* @param args - The arguments to use when compiling the script
|
|
46
|
+
* @returns {Buffer} - The compiled script
|
|
47
|
+
*/
|
|
48
|
+
public abstract compile(...args: unknown[]): Buffer;
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Split a buffer into chunks
|
|
52
|
+
* @param {Buffer} buffer - The buffer to split
|
|
53
|
+
* @param {number} chunkSize - The size of each chunk
|
|
54
|
+
* @protected
|
|
55
|
+
* @returns {Array<Buffer[]>} - The chunks
|
|
56
|
+
*/
|
|
57
|
+
protected splitBufferIntoChunks(
|
|
58
|
+
buffer: Buffer,
|
|
59
|
+
chunkSize: number = Generator.DATA_CHUNK_SIZE,
|
|
60
|
+
): Array<Buffer[]> {
|
|
61
|
+
const chunks: Array<Buffer[]> = [];
|
|
62
|
+
for (let i = 0; i < buffer.length; i += chunkSize) {
|
|
63
|
+
const dataLength = Math.min(chunkSize, buffer.length - i);
|
|
64
|
+
|
|
65
|
+
const buf2 = Buffer.alloc(dataLength);
|
|
66
|
+
for (let j = 0; j < dataLength; j++) {
|
|
67
|
+
buf2.writeUInt8(buffer[i + j], j);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
chunks.push([buf2]);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return chunks;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -1,148 +1,148 @@
|
|
|
1
|
-
import { crypto, Network, networks, opcodes, script } from 'bitcoinjs-lib';
|
|
2
|
-
import { ECPairInterface } from 'ecpair';
|
|
3
|
-
import { Compressor } from '../../bytecode/Compressor.js';
|
|
4
|
-
import { Generator } from '../Generator.js';
|
|
5
|
-
import { EcKeyPair } from '../../keypair/EcKeyPair.js';
|
|
6
|
-
import { Features } from '../Features.js';
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Class to generate bitcoin script for interaction transactions
|
|
10
|
-
*/
|
|
11
|
-
export class CalldataGenerator extends Generator {
|
|
12
|
-
constructor(
|
|
13
|
-
senderPubKey: Buffer,
|
|
14
|
-
contractSaltPubKey: Buffer,
|
|
15
|
-
network: Network = networks.bitcoin,
|
|
16
|
-
) {
|
|
17
|
-
super(senderPubKey, contractSaltPubKey, network);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Get the public key as a buffer
|
|
22
|
-
* @param {Buffer[]} witnessKeys - The public keys
|
|
23
|
-
* @param {Network} network - The network to use
|
|
24
|
-
* @private
|
|
25
|
-
* @returns {Buffer} - The public key as a buffer
|
|
26
|
-
*/
|
|
27
|
-
public static getPubKeyAsBuffer(witnessKeys: Buffer[], network: Network): Buffer {
|
|
28
|
-
let finalBuffer: Buffer = Buffer.alloc(0);
|
|
29
|
-
|
|
30
|
-
for (let pubKey of witnessKeys) {
|
|
31
|
-
const key: ECPairInterface = EcKeyPair.fromPublicKey(pubKey, network);
|
|
32
|
-
|
|
33
|
-
if (!key.compressed) {
|
|
34
|
-
throw new Error('Public key must be compressed');
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
if (pubKey.byteLength !== 33) {
|
|
38
|
-
throw new Error(`Public key must be 33 bytes, got ${pubKey.byteLength} bytes.`);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
finalBuffer = Buffer.concat([finalBuffer, pubKey]);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// compress the public keys
|
|
45
|
-
const compressed: Buffer = Compressor.compress(finalBuffer);
|
|
46
|
-
if (compressed.byteLength >= finalBuffer.byteLength) {
|
|
47
|
-
// we ensure that the user pays the smallest amount of fees. [micro-optimization]
|
|
48
|
-
return finalBuffer;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// if compressed is smaller, return compressed.
|
|
52
|
-
return compressed;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Compile an interaction bitcoin script
|
|
57
|
-
* @param {Buffer} calldata - The calldata to use
|
|
58
|
-
* @param {Buffer} contractSecret - The contract secret
|
|
59
|
-
* @param {number[]} [features=[]] - The features to use (optional)
|
|
60
|
-
* @param {Buffer[]} [vaultPublicKeys=[]] - The public keys of the vault (optional)
|
|
61
|
-
* @param {number} [minimumSignatures=0] - The minimum number of signatures (optional)
|
|
62
|
-
* @returns {Buffer} - The compiled script
|
|
63
|
-
* @throws {Error} - If something goes wrong
|
|
64
|
-
*/
|
|
65
|
-
public compile(
|
|
66
|
-
calldata: Buffer,
|
|
67
|
-
contractSecret: Buffer,
|
|
68
|
-
features: Features[] = [],
|
|
69
|
-
vaultPublicKeys: Buffer[] = [],
|
|
70
|
-
minimumSignatures: number = 0,
|
|
71
|
-
): Buffer {
|
|
72
|
-
const dataChunks: Buffer[][] = this.splitBufferIntoChunks(calldata);
|
|
73
|
-
if (!dataChunks.length) throw new Error('No data chunks found');
|
|
74
|
-
|
|
75
|
-
let compiledData = [
|
|
76
|
-
this.senderPubKey,
|
|
77
|
-
opcodes.OP_CHECKSIGVERIFY,
|
|
78
|
-
|
|
79
|
-
this.contractSaltPubKey,
|
|
80
|
-
opcodes.OP_CHECKSIGVERIFY,
|
|
81
|
-
|
|
82
|
-
opcodes.OP_HASH160,
|
|
83
|
-
crypto.hash160(this.senderPubKey),
|
|
84
|
-
opcodes.OP_EQUALVERIFY,
|
|
85
|
-
|
|
86
|
-
opcodes.OP_HASH160,
|
|
87
|
-
crypto.hash160(contractSecret),
|
|
88
|
-
opcodes.OP_EQUALVERIFY,
|
|
89
|
-
|
|
90
|
-
opcodes.OP_DEPTH,
|
|
91
|
-
opcodes.OP_1,
|
|
92
|
-
opcodes.OP_NUMEQUAL,
|
|
93
|
-
opcodes.OP_IF,
|
|
94
|
-
|
|
95
|
-
Generator.MAGIC,
|
|
96
|
-
];
|
|
97
|
-
|
|
98
|
-
// write pub keys, when requested.
|
|
99
|
-
if (vaultPublicKeys.length > 0) {
|
|
100
|
-
const pubKeyBuffer = CalldataGenerator.getPubKeyAsBuffer(vaultPublicKeys, this.network);
|
|
101
|
-
const pubKeyDataChunks: Buffer[][] = this.splitBufferIntoChunks(pubKeyBuffer);
|
|
102
|
-
|
|
103
|
-
compiledData = compiledData.concat(
|
|
104
|
-
...[
|
|
105
|
-
opcodes.OP_0, // provide opnet public keys
|
|
106
|
-
...pubKeyDataChunks,
|
|
107
|
-
],
|
|
108
|
-
);
|
|
109
|
-
|
|
110
|
-
if (minimumSignatures) {
|
|
111
|
-
// verify that the minimum is not greater than 255
|
|
112
|
-
if (minimumSignatures > 255) {
|
|
113
|
-
throw new Error('Minimum signatures cannot exceed 255');
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// we use a 2 bytes buffer even if we limit to 255 so it does not use an opcode for the number
|
|
117
|
-
const minSigBuffer = Buffer.alloc(2);
|
|
118
|
-
minSigBuffer.writeUint16LE(minimumSignatures, 0);
|
|
119
|
-
|
|
120
|
-
compiledData = compiledData.concat(
|
|
121
|
-
...[
|
|
122
|
-
opcodes.OP_1, // provide minimum signatures
|
|
123
|
-
minSigBuffer,
|
|
124
|
-
],
|
|
125
|
-
);
|
|
126
|
-
} else {
|
|
127
|
-
throw new Error('Minimum signatures must be provided');
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// Write calldata
|
|
132
|
-
compiledData = compiledData.concat(
|
|
133
|
-
...features,
|
|
134
|
-
...[opcodes.OP_1NEGATE, ...dataChunks, opcodes.OP_ELSE, opcodes.OP_1, opcodes.OP_ENDIF],
|
|
135
|
-
);
|
|
136
|
-
|
|
137
|
-
const asm = compiledData.flat();
|
|
138
|
-
const compiled = script.compile(asm);
|
|
139
|
-
|
|
140
|
-
/** Verify the validity of the script */
|
|
141
|
-
const decompiled = script.decompile(compiled);
|
|
142
|
-
if (!decompiled) {
|
|
143
|
-
throw new Error('Failed to decompile script??');
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
return compiled;
|
|
147
|
-
}
|
|
148
|
-
}
|
|
1
|
+
import { crypto, Network, networks, opcodes, script } from 'bitcoinjs-lib';
|
|
2
|
+
import { ECPairInterface } from 'ecpair';
|
|
3
|
+
import { Compressor } from '../../bytecode/Compressor.js';
|
|
4
|
+
import { Generator } from '../Generator.js';
|
|
5
|
+
import { EcKeyPair } from '../../keypair/EcKeyPair.js';
|
|
6
|
+
import { Features } from '../Features.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Class to generate bitcoin script for interaction transactions
|
|
10
|
+
*/
|
|
11
|
+
export class CalldataGenerator extends Generator {
|
|
12
|
+
constructor(
|
|
13
|
+
senderPubKey: Buffer,
|
|
14
|
+
contractSaltPubKey: Buffer,
|
|
15
|
+
network: Network = networks.bitcoin,
|
|
16
|
+
) {
|
|
17
|
+
super(senderPubKey, contractSaltPubKey, network);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Get the public key as a buffer
|
|
22
|
+
* @param {Buffer[]} witnessKeys - The public keys
|
|
23
|
+
* @param {Network} network - The network to use
|
|
24
|
+
* @private
|
|
25
|
+
* @returns {Buffer} - The public key as a buffer
|
|
26
|
+
*/
|
|
27
|
+
public static getPubKeyAsBuffer(witnessKeys: Buffer[], network: Network): Buffer {
|
|
28
|
+
let finalBuffer: Buffer = Buffer.alloc(0);
|
|
29
|
+
|
|
30
|
+
for (let pubKey of witnessKeys) {
|
|
31
|
+
const key: ECPairInterface = EcKeyPair.fromPublicKey(pubKey, network);
|
|
32
|
+
|
|
33
|
+
if (!key.compressed) {
|
|
34
|
+
throw new Error('Public key must be compressed');
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (pubKey.byteLength !== 33) {
|
|
38
|
+
throw new Error(`Public key must be 33 bytes, got ${pubKey.byteLength} bytes.`);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
finalBuffer = Buffer.concat([finalBuffer, pubKey]);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// compress the public keys
|
|
45
|
+
const compressed: Buffer = Compressor.compress(finalBuffer);
|
|
46
|
+
if (compressed.byteLength >= finalBuffer.byteLength) {
|
|
47
|
+
// we ensure that the user pays the smallest amount of fees. [micro-optimization]
|
|
48
|
+
return finalBuffer;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// if compressed is smaller, return compressed.
|
|
52
|
+
return compressed;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Compile an interaction bitcoin script
|
|
57
|
+
* @param {Buffer} calldata - The calldata to use
|
|
58
|
+
* @param {Buffer} contractSecret - The contract secret
|
|
59
|
+
* @param {number[]} [features=[]] - The features to use (optional)
|
|
60
|
+
* @param {Buffer[]} [vaultPublicKeys=[]] - The public keys of the vault (optional)
|
|
61
|
+
* @param {number} [minimumSignatures=0] - The minimum number of signatures (optional)
|
|
62
|
+
* @returns {Buffer} - The compiled script
|
|
63
|
+
* @throws {Error} - If something goes wrong
|
|
64
|
+
*/
|
|
65
|
+
public compile(
|
|
66
|
+
calldata: Buffer,
|
|
67
|
+
contractSecret: Buffer,
|
|
68
|
+
features: Features[] = [],
|
|
69
|
+
vaultPublicKeys: Buffer[] = [],
|
|
70
|
+
minimumSignatures: number = 0,
|
|
71
|
+
): Buffer {
|
|
72
|
+
const dataChunks: Buffer[][] = this.splitBufferIntoChunks(calldata);
|
|
73
|
+
if (!dataChunks.length) throw new Error('No data chunks found');
|
|
74
|
+
|
|
75
|
+
let compiledData = [
|
|
76
|
+
this.senderPubKey,
|
|
77
|
+
opcodes.OP_CHECKSIGVERIFY,
|
|
78
|
+
|
|
79
|
+
this.contractSaltPubKey,
|
|
80
|
+
opcodes.OP_CHECKSIGVERIFY,
|
|
81
|
+
|
|
82
|
+
opcodes.OP_HASH160,
|
|
83
|
+
crypto.hash160(this.senderPubKey),
|
|
84
|
+
opcodes.OP_EQUALVERIFY,
|
|
85
|
+
|
|
86
|
+
opcodes.OP_HASH160,
|
|
87
|
+
crypto.hash160(contractSecret),
|
|
88
|
+
opcodes.OP_EQUALVERIFY,
|
|
89
|
+
|
|
90
|
+
opcodes.OP_DEPTH,
|
|
91
|
+
opcodes.OP_1,
|
|
92
|
+
opcodes.OP_NUMEQUAL,
|
|
93
|
+
opcodes.OP_IF,
|
|
94
|
+
|
|
95
|
+
Generator.MAGIC,
|
|
96
|
+
];
|
|
97
|
+
|
|
98
|
+
// write pub keys, when requested.
|
|
99
|
+
if (vaultPublicKeys.length > 0) {
|
|
100
|
+
const pubKeyBuffer = CalldataGenerator.getPubKeyAsBuffer(vaultPublicKeys, this.network);
|
|
101
|
+
const pubKeyDataChunks: Buffer[][] = this.splitBufferIntoChunks(pubKeyBuffer);
|
|
102
|
+
|
|
103
|
+
compiledData = compiledData.concat(
|
|
104
|
+
...[
|
|
105
|
+
opcodes.OP_0, // provide opnet public keys
|
|
106
|
+
...pubKeyDataChunks,
|
|
107
|
+
],
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
if (minimumSignatures) {
|
|
111
|
+
// verify that the minimum is not greater than 255
|
|
112
|
+
if (minimumSignatures > 255) {
|
|
113
|
+
throw new Error('Minimum signatures cannot exceed 255');
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// we use a 2 bytes buffer even if we limit to 255 so it does not use an opcode for the number
|
|
117
|
+
const minSigBuffer = Buffer.alloc(2);
|
|
118
|
+
minSigBuffer.writeUint16LE(minimumSignatures, 0);
|
|
119
|
+
|
|
120
|
+
compiledData = compiledData.concat(
|
|
121
|
+
...[
|
|
122
|
+
opcodes.OP_1, // provide minimum signatures
|
|
123
|
+
minSigBuffer,
|
|
124
|
+
],
|
|
125
|
+
);
|
|
126
|
+
} else {
|
|
127
|
+
throw new Error('Minimum signatures must be provided');
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Write calldata
|
|
132
|
+
compiledData = compiledData.concat(
|
|
133
|
+
...features,
|
|
134
|
+
...[opcodes.OP_1NEGATE, ...dataChunks, opcodes.OP_ELSE, opcodes.OP_1, opcodes.OP_ENDIF],
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
const asm = compiledData.flat();
|
|
138
|
+
const compiled = script.compile(asm);
|
|
139
|
+
|
|
140
|
+
/** Verify the validity of the script */
|
|
141
|
+
const decompiled = script.decompile(compiled);
|
|
142
|
+
if (!decompiled) {
|
|
143
|
+
throw new Error('Failed to decompile script??');
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return compiled;
|
|
147
|
+
}
|
|
148
|
+
}
|