@btc-vision/transaction 1.0.85 → 1.0.87
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/keypair/Wallet.d.ts +3 -0
- 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/Wallet.d.ts +3 -0
- package/build/keypair/Wallet.js +8 -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/metadata/tokens.js +1 -1
- 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 +2 -0
- 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/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 +109 -109
- 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 +120 -97
- package/src/keypair/interfaces/IWallet.ts +19 -19
- package/src/metadata/ContractBaseMetadata.ts +23 -23
- package/src/metadata/contracts/wBTC.ts +60 -60
- package/src/metadata/tokens.ts +1 -1
- package/src/network/NetworkInformation.ts +7 -7
- package/src/transaction/TransactionFactory.ts +2 -0
- 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 +97 -97
- 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/builders/UnwrapSegwitTransaction.ts +365 -365
- package/src/transaction/builders/UnwrapTransaction.ts +507 -507
- package/src/transaction/builders/WrapTransaction.ts +346 -346
- package/src/transaction/interfaces/ITransactionParameters.ts +59 -59
- package/src/transaction/interfaces/Tap.ts +26 -26
- package/src/transaction/psbt/PSBTTypes.ts +3 -3
- package/src/transaction/shared/TweakedTransaction.ts +539 -539
- 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
package/src/keypair/EcKeyPair.ts
CHANGED
|
@@ -1,282 +1,282 @@
|
|
|
1
|
-
import bip32, { BIP32Interface } from 'bip32';
|
|
2
|
-
import { address, initEccLib, Network, networks, payments } from 'bitcoinjs-lib';
|
|
3
|
-
import { ECPairFactory, ECPairInterface } from 'ecpair';
|
|
4
|
-
import * as ecc from '@bitcoinerlab/secp256k1';
|
|
5
|
-
import { Address } from '@btc-vision/bsi-binary';
|
|
6
|
-
import { IWallet } from './interfaces/IWallet.js';
|
|
7
|
-
import { toXOnly } from 'bitcoinjs-lib/src/psbt/bip371.js';
|
|
8
|
-
|
|
9
|
-
initEccLib(ecc);
|
|
10
|
-
|
|
11
|
-
// @ts-ignore
|
|
12
|
-
const BIP32Factory = typeof bip32 === 'function' ? bip32 : bip32.BIP32Factory;
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Class for handling EC key pairs
|
|
16
|
-
* @class EcKeyPair
|
|
17
|
-
* @module EcKeyPair
|
|
18
|
-
* @typicalname EcKeyPair
|
|
19
|
-
* @example import { EcKeyPair } from '@btc-vision/transaction';
|
|
20
|
-
*/
|
|
21
|
-
export class EcKeyPair {
|
|
22
|
-
// @ts-ignore
|
|
23
|
-
public static BIP32 = BIP32Factory(ecc);
|
|
24
|
-
public static ECPair = ECPairFactory(ecc);
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Generate a keypair from a WIF
|
|
28
|
-
* @param {string} wif - The WIF to use
|
|
29
|
-
* @param {Network} network - The network to use
|
|
30
|
-
* @returns {ECPairInterface} - The generated keypair
|
|
31
|
-
*/
|
|
32
|
-
public static fromWIF(wif: string, network: Network = networks.bitcoin): ECPairInterface {
|
|
33
|
-
return this.ECPair.fromWIF(wif, network);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Generate a keypair from a private key
|
|
38
|
-
* @param {Buffer} privateKey - The private key to use
|
|
39
|
-
* @param {Network} network - The network to use
|
|
40
|
-
* @returns {ECPairInterface} - The generated keypair
|
|
41
|
-
*/
|
|
42
|
-
public static fromPrivateKey(
|
|
43
|
-
privateKey: Buffer,
|
|
44
|
-
network: Network = networks.bitcoin,
|
|
45
|
-
): ECPairInterface {
|
|
46
|
-
return this.ECPair.fromPrivateKey(privateKey, { network });
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Generate a keypair from a public key
|
|
51
|
-
* @param {Buffer} publicKey - The public key to use
|
|
52
|
-
* @param {Network} network - The network to use
|
|
53
|
-
* @returns {ECPairInterface} - The generated keypair
|
|
54
|
-
*/
|
|
55
|
-
public static fromPublicKey(
|
|
56
|
-
publicKey: Buffer,
|
|
57
|
-
network: Network = networks.bitcoin,
|
|
58
|
-
): ECPairInterface {
|
|
59
|
-
return this.ECPair.fromPublicKey(publicKey, { network });
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Generate a multi-sig address
|
|
64
|
-
* @param {Buffer[]} pubKeys - The public keys to use
|
|
65
|
-
* @param {number} minimumSignatureRequired - The minimum number of signatures required
|
|
66
|
-
* @param {Network} network - The network to use
|
|
67
|
-
* @returns {Address} - The generated address
|
|
68
|
-
* @throws {Error} - If the address cannot be generated
|
|
69
|
-
*/
|
|
70
|
-
public static generateMultiSigAddress(
|
|
71
|
-
pubKeys: Buffer[],
|
|
72
|
-
minimumSignatureRequired: number,
|
|
73
|
-
network: Network = networks.bitcoin,
|
|
74
|
-
): Address {
|
|
75
|
-
const publicKeys: Buffer[] = this.verifyPubKeys(pubKeys, network);
|
|
76
|
-
if (publicKeys.length !== pubKeys.length) throw new Error(`Contains invalid public keys`);
|
|
77
|
-
|
|
78
|
-
const p2ms = payments.p2ms({
|
|
79
|
-
m: minimumSignatureRequired,
|
|
80
|
-
pubkeys: publicKeys,
|
|
81
|
-
network: network,
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
const p2wsh = payments.p2wsh({ redeem: p2ms, network: network });
|
|
85
|
-
const address = p2wsh.address;
|
|
86
|
-
|
|
87
|
-
// fake params
|
|
88
|
-
/*const multiSignParams: MultiSignParameters = {
|
|
89
|
-
network: network,
|
|
90
|
-
utxos: [],
|
|
91
|
-
pubkeys: pubKeys,
|
|
92
|
-
minimumSignatures: minimumSignatureRequired,
|
|
93
|
-
feeRate: 100,
|
|
94
|
-
receiver: 'a',
|
|
95
|
-
requestedAmount: 1n,
|
|
96
|
-
refundVault: 'a',
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
const address = new MultiSignTransaction(multiSignParams).getScriptAddress();
|
|
100
|
-
*/
|
|
101
|
-
if (!address) {
|
|
102
|
-
throw new Error('Failed to generate address');
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
return address;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Verify public keys and return the public keys
|
|
110
|
-
* @param {Buffer[]} pubKeys - The public keys to verify
|
|
111
|
-
* @param {Network} network - The network to use
|
|
112
|
-
* @returns {Buffer[]} - The verified public keys
|
|
113
|
-
* @throws {Error} - If the key cannot be regenerated
|
|
114
|
-
*/
|
|
115
|
-
public static verifyPubKeys(pubKeys: Buffer[], network: Network = networks.bitcoin): Buffer[] {
|
|
116
|
-
return pubKeys.map((pubKey) => {
|
|
117
|
-
const key = EcKeyPair.fromPublicKey(pubKey, network);
|
|
118
|
-
|
|
119
|
-
if (!key) {
|
|
120
|
-
throw new Error('Failed to regenerate key');
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
return key.publicKey;
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Get a P2WPKH address from a keypair
|
|
129
|
-
* @param {ECPairInterface} keyPair - The keypair to get the address for
|
|
130
|
-
* @param {Network} network - The network to use
|
|
131
|
-
* @returns {Address} - The address
|
|
132
|
-
*/
|
|
133
|
-
public static getP2WPKHAddress(
|
|
134
|
-
keyPair: ECPairInterface,
|
|
135
|
-
network: Network = networks.bitcoin,
|
|
136
|
-
): Address {
|
|
137
|
-
const res = payments.p2wpkh({ pubkey: keyPair.publicKey, network: network });
|
|
138
|
-
|
|
139
|
-
if (!res.address) {
|
|
140
|
-
throw new Error('Failed to generate wallet');
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
return res.address;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Generate a random wallet
|
|
148
|
-
* @param {Network} network - The network to use
|
|
149
|
-
* @returns {IWallet} - The generated wallet
|
|
150
|
-
*/
|
|
151
|
-
public static generateWallet(network: Network = networks.bitcoin): IWallet {
|
|
152
|
-
const keyPair = this.ECPair.makeRandom({
|
|
153
|
-
network: network,
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
const wallet = this.getP2WPKHAddress(keyPair, network);
|
|
157
|
-
|
|
158
|
-
if (!wallet) {
|
|
159
|
-
throw new Error('Failed to generate wallet');
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
return {
|
|
163
|
-
address: wallet,
|
|
164
|
-
privateKey: keyPair.toWIF(),
|
|
165
|
-
publicKey: keyPair.publicKey.toString('hex'),
|
|
166
|
-
};
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
/**
|
|
170
|
-
* Verify that a contract address is a valid p2tr address
|
|
171
|
-
* @param {Address} contractAddress - The contract address to verify
|
|
172
|
-
* @param {Network} network - The network to use
|
|
173
|
-
* @returns {boolean} - Whether the address is valid
|
|
174
|
-
*/
|
|
175
|
-
public static verifyContractAddress(
|
|
176
|
-
contractAddress: Address,
|
|
177
|
-
network: Network = networks.bitcoin,
|
|
178
|
-
): boolean {
|
|
179
|
-
return !!address.toOutputScript(contractAddress, network);
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
/**
|
|
183
|
-
* Get the legacy address from a keypair
|
|
184
|
-
* @param {ECPairInterface} keyPair - The keypair to get the address for
|
|
185
|
-
* @param {Network} network - The network to use
|
|
186
|
-
* @returns {Address} - The legacy address
|
|
187
|
-
*/
|
|
188
|
-
public static getLegacyAddress(
|
|
189
|
-
keyPair: ECPairInterface,
|
|
190
|
-
network: Network = networks.bitcoin,
|
|
191
|
-
): Address {
|
|
192
|
-
const wallet = payments.p2pkh({ pubkey: keyPair.publicKey, network: network });
|
|
193
|
-
|
|
194
|
-
if (!wallet.address) {
|
|
195
|
-
throw new Error('Failed to generate wallet');
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
return wallet.address;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
/**
|
|
202
|
-
* Generate a random keypair
|
|
203
|
-
* @param {Network} network - The network to use
|
|
204
|
-
* @returns {ECPairInterface} - The generated keypair
|
|
205
|
-
*/
|
|
206
|
-
public static generateRandomKeyPair(network: Network = networks.bitcoin): ECPairInterface {
|
|
207
|
-
return this.ECPair.makeRandom({
|
|
208
|
-
network: network,
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
/**
|
|
213
|
-
* Generate a BIP32 keypair from a seed
|
|
214
|
-
* @param {Buffer} seed - The seed to generate the keypair from
|
|
215
|
-
* @param {Network} network - The network to use
|
|
216
|
-
* @returns {BIP32Interface} - The generated keypair
|
|
217
|
-
*/
|
|
218
|
-
public static fromSeed(seed: Buffer, network: Network = networks.bitcoin): BIP32Interface {
|
|
219
|
-
return this.BIP32.fromSeed(seed, network);
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
/**
|
|
223
|
-
* Get taproot address from keypair
|
|
224
|
-
* @param {ECPairInterface} keyPair - The keypair to get the taproot address for
|
|
225
|
-
* @param {Network} network - The network to use
|
|
226
|
-
* @returns {Address} - The taproot address
|
|
227
|
-
*/
|
|
228
|
-
public static getTaprootAddress(
|
|
229
|
-
keyPair: ECPairInterface,
|
|
230
|
-
network: Network = networks.bitcoin,
|
|
231
|
-
): Address {
|
|
232
|
-
const { address } = payments.p2tr({
|
|
233
|
-
internalPubkey: toXOnly(keyPair.publicKey),
|
|
234
|
-
network: network,
|
|
235
|
-
});
|
|
236
|
-
|
|
237
|
-
if (!address) {
|
|
238
|
-
throw new Error(`Failed to generate sender address for transaction`);
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
return address;
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
/**
|
|
245
|
-
* Get taproot address from address
|
|
246
|
-
* @param {Address} inAddr - The address to convert to taproot
|
|
247
|
-
* @param {Network} network - The network to use
|
|
248
|
-
* @returns {Address} - The taproot address
|
|
249
|
-
*/
|
|
250
|
-
public static getTaprootAddressFromAddress(
|
|
251
|
-
inAddr: Address,
|
|
252
|
-
network: Network = networks.bitcoin,
|
|
253
|
-
): Address {
|
|
254
|
-
const { address } = payments.p2tr({
|
|
255
|
-
address: inAddr,
|
|
256
|
-
network: network,
|
|
257
|
-
});
|
|
258
|
-
|
|
259
|
-
if (!address) {
|
|
260
|
-
throw new Error(`Failed to generate sender address for transaction`);
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
return address;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
/**
|
|
267
|
-
* Get a keypair from a given seed.
|
|
268
|
-
* @param {Buffer} seed - The seed to generate the key pair from
|
|
269
|
-
* @param {Network} network - The network to use
|
|
270
|
-
* @returns {ECPairInterface} - The generated key pair
|
|
271
|
-
*/
|
|
272
|
-
public static fromSeedKeyPair(
|
|
273
|
-
seed: Buffer,
|
|
274
|
-
network: Network = networks.bitcoin,
|
|
275
|
-
): ECPairInterface {
|
|
276
|
-
const fromSeed = this.BIP32.fromSeed(seed, network);
|
|
277
|
-
const privKey = fromSeed.privateKey;
|
|
278
|
-
if (!privKey) throw new Error('Failed to generate key pair');
|
|
279
|
-
|
|
280
|
-
return this.ECPair.fromPrivateKey(privKey, { network });
|
|
281
|
-
}
|
|
282
|
-
}
|
|
1
|
+
import bip32, { BIP32Interface } from 'bip32';
|
|
2
|
+
import { address, initEccLib, Network, networks, payments } from 'bitcoinjs-lib';
|
|
3
|
+
import { ECPairFactory, ECPairInterface } from 'ecpair';
|
|
4
|
+
import * as ecc from '@bitcoinerlab/secp256k1';
|
|
5
|
+
import { Address } from '@btc-vision/bsi-binary';
|
|
6
|
+
import { IWallet } from './interfaces/IWallet.js';
|
|
7
|
+
import { toXOnly } from 'bitcoinjs-lib/src/psbt/bip371.js';
|
|
8
|
+
|
|
9
|
+
initEccLib(ecc);
|
|
10
|
+
|
|
11
|
+
// @ts-ignore
|
|
12
|
+
const BIP32Factory = typeof bip32 === 'function' ? bip32 : bip32.BIP32Factory;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Class for handling EC key pairs
|
|
16
|
+
* @class EcKeyPair
|
|
17
|
+
* @module EcKeyPair
|
|
18
|
+
* @typicalname EcKeyPair
|
|
19
|
+
* @example import { EcKeyPair } from '@btc-vision/transaction';
|
|
20
|
+
*/
|
|
21
|
+
export class EcKeyPair {
|
|
22
|
+
// @ts-ignore
|
|
23
|
+
public static BIP32 = BIP32Factory(ecc);
|
|
24
|
+
public static ECPair = ECPairFactory(ecc);
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Generate a keypair from a WIF
|
|
28
|
+
* @param {string} wif - The WIF to use
|
|
29
|
+
* @param {Network} network - The network to use
|
|
30
|
+
* @returns {ECPairInterface} - The generated keypair
|
|
31
|
+
*/
|
|
32
|
+
public static fromWIF(wif: string, network: Network = networks.bitcoin): ECPairInterface {
|
|
33
|
+
return this.ECPair.fromWIF(wif, network);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Generate a keypair from a private key
|
|
38
|
+
* @param {Buffer} privateKey - The private key to use
|
|
39
|
+
* @param {Network} network - The network to use
|
|
40
|
+
* @returns {ECPairInterface} - The generated keypair
|
|
41
|
+
*/
|
|
42
|
+
public static fromPrivateKey(
|
|
43
|
+
privateKey: Buffer,
|
|
44
|
+
network: Network = networks.bitcoin,
|
|
45
|
+
): ECPairInterface {
|
|
46
|
+
return this.ECPair.fromPrivateKey(privateKey, { network });
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Generate a keypair from a public key
|
|
51
|
+
* @param {Buffer} publicKey - The public key to use
|
|
52
|
+
* @param {Network} network - The network to use
|
|
53
|
+
* @returns {ECPairInterface} - The generated keypair
|
|
54
|
+
*/
|
|
55
|
+
public static fromPublicKey(
|
|
56
|
+
publicKey: Buffer,
|
|
57
|
+
network: Network = networks.bitcoin,
|
|
58
|
+
): ECPairInterface {
|
|
59
|
+
return this.ECPair.fromPublicKey(publicKey, { network });
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Generate a multi-sig address
|
|
64
|
+
* @param {Buffer[]} pubKeys - The public keys to use
|
|
65
|
+
* @param {number} minimumSignatureRequired - The minimum number of signatures required
|
|
66
|
+
* @param {Network} network - The network to use
|
|
67
|
+
* @returns {Address} - The generated address
|
|
68
|
+
* @throws {Error} - If the address cannot be generated
|
|
69
|
+
*/
|
|
70
|
+
public static generateMultiSigAddress(
|
|
71
|
+
pubKeys: Buffer[],
|
|
72
|
+
minimumSignatureRequired: number,
|
|
73
|
+
network: Network = networks.bitcoin,
|
|
74
|
+
): Address {
|
|
75
|
+
const publicKeys: Buffer[] = this.verifyPubKeys(pubKeys, network);
|
|
76
|
+
if (publicKeys.length !== pubKeys.length) throw new Error(`Contains invalid public keys`);
|
|
77
|
+
|
|
78
|
+
const p2ms = payments.p2ms({
|
|
79
|
+
m: minimumSignatureRequired,
|
|
80
|
+
pubkeys: publicKeys,
|
|
81
|
+
network: network,
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
const p2wsh = payments.p2wsh({ redeem: p2ms, network: network });
|
|
85
|
+
const address = p2wsh.address;
|
|
86
|
+
|
|
87
|
+
// fake params
|
|
88
|
+
/*const multiSignParams: MultiSignParameters = {
|
|
89
|
+
network: network,
|
|
90
|
+
utxos: [],
|
|
91
|
+
pubkeys: pubKeys,
|
|
92
|
+
minimumSignatures: minimumSignatureRequired,
|
|
93
|
+
feeRate: 100,
|
|
94
|
+
receiver: 'a',
|
|
95
|
+
requestedAmount: 1n,
|
|
96
|
+
refundVault: 'a',
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
const address = new MultiSignTransaction(multiSignParams).getScriptAddress();
|
|
100
|
+
*/
|
|
101
|
+
if (!address) {
|
|
102
|
+
throw new Error('Failed to generate address');
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return address;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Verify public keys and return the public keys
|
|
110
|
+
* @param {Buffer[]} pubKeys - The public keys to verify
|
|
111
|
+
* @param {Network} network - The network to use
|
|
112
|
+
* @returns {Buffer[]} - The verified public keys
|
|
113
|
+
* @throws {Error} - If the key cannot be regenerated
|
|
114
|
+
*/
|
|
115
|
+
public static verifyPubKeys(pubKeys: Buffer[], network: Network = networks.bitcoin): Buffer[] {
|
|
116
|
+
return pubKeys.map((pubKey) => {
|
|
117
|
+
const key = EcKeyPair.fromPublicKey(pubKey, network);
|
|
118
|
+
|
|
119
|
+
if (!key) {
|
|
120
|
+
throw new Error('Failed to regenerate key');
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return key.publicKey;
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Get a P2WPKH address from a keypair
|
|
129
|
+
* @param {ECPairInterface} keyPair - The keypair to get the address for
|
|
130
|
+
* @param {Network} network - The network to use
|
|
131
|
+
* @returns {Address} - The address
|
|
132
|
+
*/
|
|
133
|
+
public static getP2WPKHAddress(
|
|
134
|
+
keyPair: ECPairInterface,
|
|
135
|
+
network: Network = networks.bitcoin,
|
|
136
|
+
): Address {
|
|
137
|
+
const res = payments.p2wpkh({ pubkey: keyPair.publicKey, network: network });
|
|
138
|
+
|
|
139
|
+
if (!res.address) {
|
|
140
|
+
throw new Error('Failed to generate wallet');
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return res.address;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Generate a random wallet
|
|
148
|
+
* @param {Network} network - The network to use
|
|
149
|
+
* @returns {IWallet} - The generated wallet
|
|
150
|
+
*/
|
|
151
|
+
public static generateWallet(network: Network = networks.bitcoin): IWallet {
|
|
152
|
+
const keyPair = this.ECPair.makeRandom({
|
|
153
|
+
network: network,
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
const wallet = this.getP2WPKHAddress(keyPair, network);
|
|
157
|
+
|
|
158
|
+
if (!wallet) {
|
|
159
|
+
throw new Error('Failed to generate wallet');
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
return {
|
|
163
|
+
address: wallet,
|
|
164
|
+
privateKey: keyPair.toWIF(),
|
|
165
|
+
publicKey: keyPair.publicKey.toString('hex'),
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Verify that a contract address is a valid p2tr address
|
|
171
|
+
* @param {Address} contractAddress - The contract address to verify
|
|
172
|
+
* @param {Network} network - The network to use
|
|
173
|
+
* @returns {boolean} - Whether the address is valid
|
|
174
|
+
*/
|
|
175
|
+
public static verifyContractAddress(
|
|
176
|
+
contractAddress: Address,
|
|
177
|
+
network: Network = networks.bitcoin,
|
|
178
|
+
): boolean {
|
|
179
|
+
return !!address.toOutputScript(contractAddress, network);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Get the legacy address from a keypair
|
|
184
|
+
* @param {ECPairInterface} keyPair - The keypair to get the address for
|
|
185
|
+
* @param {Network} network - The network to use
|
|
186
|
+
* @returns {Address} - The legacy address
|
|
187
|
+
*/
|
|
188
|
+
public static getLegacyAddress(
|
|
189
|
+
keyPair: ECPairInterface,
|
|
190
|
+
network: Network = networks.bitcoin,
|
|
191
|
+
): Address {
|
|
192
|
+
const wallet = payments.p2pkh({ pubkey: keyPair.publicKey, network: network });
|
|
193
|
+
|
|
194
|
+
if (!wallet.address) {
|
|
195
|
+
throw new Error('Failed to generate wallet');
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
return wallet.address;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Generate a random keypair
|
|
203
|
+
* @param {Network} network - The network to use
|
|
204
|
+
* @returns {ECPairInterface} - The generated keypair
|
|
205
|
+
*/
|
|
206
|
+
public static generateRandomKeyPair(network: Network = networks.bitcoin): ECPairInterface {
|
|
207
|
+
return this.ECPair.makeRandom({
|
|
208
|
+
network: network,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Generate a BIP32 keypair from a seed
|
|
214
|
+
* @param {Buffer} seed - The seed to generate the keypair from
|
|
215
|
+
* @param {Network} network - The network to use
|
|
216
|
+
* @returns {BIP32Interface} - The generated keypair
|
|
217
|
+
*/
|
|
218
|
+
public static fromSeed(seed: Buffer, network: Network = networks.bitcoin): BIP32Interface {
|
|
219
|
+
return this.BIP32.fromSeed(seed, network);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Get taproot address from keypair
|
|
224
|
+
* @param {ECPairInterface} keyPair - The keypair to get the taproot address for
|
|
225
|
+
* @param {Network} network - The network to use
|
|
226
|
+
* @returns {Address} - The taproot address
|
|
227
|
+
*/
|
|
228
|
+
public static getTaprootAddress(
|
|
229
|
+
keyPair: ECPairInterface,
|
|
230
|
+
network: Network = networks.bitcoin,
|
|
231
|
+
): Address {
|
|
232
|
+
const { address } = payments.p2tr({
|
|
233
|
+
internalPubkey: toXOnly(keyPair.publicKey),
|
|
234
|
+
network: network,
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
if (!address) {
|
|
238
|
+
throw new Error(`Failed to generate sender address for transaction`);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
return address;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Get taproot address from address
|
|
246
|
+
* @param {Address} inAddr - The address to convert to taproot
|
|
247
|
+
* @param {Network} network - The network to use
|
|
248
|
+
* @returns {Address} - The taproot address
|
|
249
|
+
*/
|
|
250
|
+
public static getTaprootAddressFromAddress(
|
|
251
|
+
inAddr: Address,
|
|
252
|
+
network: Network = networks.bitcoin,
|
|
253
|
+
): Address {
|
|
254
|
+
const { address } = payments.p2tr({
|
|
255
|
+
address: inAddr,
|
|
256
|
+
network: network,
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
if (!address) {
|
|
260
|
+
throw new Error(`Failed to generate sender address for transaction`);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
return address;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Get a keypair from a given seed.
|
|
268
|
+
* @param {Buffer} seed - The seed to generate the key pair from
|
|
269
|
+
* @param {Network} network - The network to use
|
|
270
|
+
* @returns {ECPairInterface} - The generated key pair
|
|
271
|
+
*/
|
|
272
|
+
public static fromSeedKeyPair(
|
|
273
|
+
seed: Buffer,
|
|
274
|
+
network: Network = networks.bitcoin,
|
|
275
|
+
): ECPairInterface {
|
|
276
|
+
const fromSeed = this.BIP32.fromSeed(seed, network);
|
|
277
|
+
const privKey = fromSeed.privateKey;
|
|
278
|
+
if (!privKey) throw new Error('Failed to generate key pair');
|
|
279
|
+
|
|
280
|
+
return this.ECPair.fromPrivateKey(privKey, { network });
|
|
281
|
+
}
|
|
282
|
+
}
|