@btc-vision/transaction 1.0.5 → 1.0.7
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/browser/_version.d.ts +1 -1
- package/browser/index.js +1 -1
- package/browser/index.js.LICENSE.txt +2 -0
- package/build/_version.d.ts +1 -1
- package/build/_version.js +1 -1
- package/build/generators/AddressGenerator.js +1 -1
- package/build/keypair/EcKeyPair.js +1 -1
- package/build/signer/TweakedSigner.js +1 -1
- package/build/transaction/builders/TransactionBuilder.js +1 -1
- package/cjs/_version.d.ts +1 -1
- package/cjs/_version.js +1 -1
- package/cjs/bytecode/Compressor.js +1 -1
- package/cjs/generators/AddressGenerator.d.ts +7 -0
- package/cjs/generators/AddressGenerator.js +48 -0
- package/cjs/generators/Generator.d.ts +1 -2
- package/cjs/generators/Generator.js +1 -3
- package/cjs/generators/builders/DeploymentGenerator.d.ts +1 -0
- package/cjs/generators/builders/DeploymentGenerator.js +10 -7
- package/cjs/keypair/Wallet.d.ts +1 -0
- package/cjs/keypair/Wallet.js +6 -0
- package/cjs/opnet.d.ts +23 -0
- package/cjs/opnet.js +37 -0
- package/{browser/scripts → cjs/tests}/Regtest.d.ts +1 -0
- package/cjs/tests/Regtest.js +32 -0
- package/cjs/tests/gen.js +17 -0
- package/cjs/tests/test.js +53 -0
- package/cjs/tests/transfer.js +76 -0
- package/cjs/transaction/TransactionFactory.js +7 -4
- package/cjs/transaction/builders/FundingTransaction.js +1 -1
- package/cjs/transaction/builders/InteractionTransaction.d.ts +2 -0
- package/cjs/transaction/builders/InteractionTransaction.js +11 -2
- package/cjs/transaction/builders/TransactionBuilder.d.ts +3 -2
- package/cjs/transaction/builders/TransactionBuilder.js +22 -7
- package/cjs/transaction/interfaces/ITransactionParameters.d.ts +1 -0
- package/cjs/verification/TapscriptVerificator.d.ts +17 -0
- package/cjs/verification/TapscriptVerificator.js +70 -0
- package/package.json +1 -2
- package/src/_version.ts +1 -1
- package/src/bytecode/Compressor.ts +27 -27
- package/src/generators/AddressGenerator.ts +1 -1
- package/src/keypair/EcKeyPair.ts +1 -1
- package/src/signer/TweakedSigner.ts +1 -1
- package/src/transaction/builders/TransactionBuilder.ts +1 -1
- package/webpack.config.js +2 -1
- package/browser/873e754d6c7c6e9361f1.module.wasm +0 -0
- /package/{browser/metadata/ContractMetadataManager.d.ts → cjs/tests/gen.d.ts} +0 -0
- /package/{browser/scripts → cjs/tests}/test.d.ts +0 -0
- /package/{browser/transaction/TransactionBuilder.d.ts → cjs/tests/transfer.d.ts} +0 -0
|
@@ -16,6 +16,8 @@
|
|
|
16
16
|
|
|
17
17
|
/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
18
18
|
|
|
19
|
+
/*! noble-secp256k1 - MIT License (c) 2019 Paul Miller (paulmillr.com) */
|
|
20
|
+
|
|
19
21
|
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
|
|
20
22
|
|
|
21
23
|
/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
|
package/build/_version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const version = "1.0.
|
|
1
|
+
export declare const version = "1.0.7";
|
package/build/_version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = '1.0.
|
|
1
|
+
export const version = '1.0.7';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createHash } from 'crypto';
|
|
2
2
|
import { bech32 } from 'bech32';
|
|
3
3
|
import { initEccLib } from 'bitcoinjs-lib';
|
|
4
|
-
import * as ecc from '
|
|
4
|
+
import * as ecc from '@bitcoinerlab/secp256k1';
|
|
5
5
|
initEccLib(ecc);
|
|
6
6
|
export class AddressGenerator {
|
|
7
7
|
static generatePKSH(sha256Hash, network) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import bip32 from 'bip32';
|
|
2
2
|
import { address, initEccLib, networks, payments } from 'bitcoinjs-lib';
|
|
3
3
|
import { ECPairFactory } from 'ecpair';
|
|
4
|
-
import * as ecc from '
|
|
4
|
+
import * as ecc from '@bitcoinerlab/secp256k1';
|
|
5
5
|
initEccLib(ecc);
|
|
6
6
|
const BIP32Factory = typeof bip32 === 'function' ? bip32 : bip32.BIP32Factory;
|
|
7
7
|
export class EcKeyPair {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { initEccLib } from 'bitcoinjs-lib';
|
|
2
2
|
import { tapTweakHash } from 'bitcoinjs-lib/src/payments/bip341.js';
|
|
3
3
|
import { toXOnly } from 'bitcoinjs-lib/src/psbt/bip371.js';
|
|
4
|
-
import * as ecc from '
|
|
4
|
+
import * as ecc from '@bitcoinerlab/secp256k1';
|
|
5
5
|
import { EcKeyPair } from '../keypair/EcKeyPair.js';
|
|
6
6
|
initEccLib(ecc);
|
|
7
7
|
export class TweakedSigner {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { initEccLib, opcodes, payments, Psbt, script } from 'bitcoinjs-lib';
|
|
2
2
|
import { varuint } from 'bitcoinjs-lib/src/bufferutils.js';
|
|
3
3
|
import { toXOnly } from 'bitcoinjs-lib/src/psbt/bip371.js';
|
|
4
|
-
import * as ecc from '
|
|
4
|
+
import * as ecc from '@bitcoinerlab/secp256k1';
|
|
5
5
|
import { EcKeyPair } from '../../keypair/EcKeyPair.js';
|
|
6
6
|
import { Logger } from '@btc-vision/logger';
|
|
7
7
|
export class TransactionBuilder extends Logger {
|
package/cjs/_version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const version = "1.0.
|
|
1
|
+
export declare const version = "1.0.6";
|
package/cjs/_version.js
CHANGED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.AddressGenerator = void 0;
|
|
27
|
+
const crypto_1 = require("crypto");
|
|
28
|
+
const bech32_1 = require("bech32");
|
|
29
|
+
const bitcoinjs_lib_1 = require("bitcoinjs-lib");
|
|
30
|
+
const ecc = __importStar(require("tiny-secp256k1"));
|
|
31
|
+
(0, bitcoinjs_lib_1.initEccLib)(ecc);
|
|
32
|
+
class AddressGenerator {
|
|
33
|
+
static generatePKSH(sha256Hash, network) {
|
|
34
|
+
if (sha256Hash.length !== 32)
|
|
35
|
+
throw new Error('Invalid hash length');
|
|
36
|
+
const pkh = this.ripemd160(sha256Hash);
|
|
37
|
+
return this.toSegwitAddress(pkh, network);
|
|
38
|
+
}
|
|
39
|
+
static ripemd160(data) {
|
|
40
|
+
return (0, crypto_1.createHash)('ripemd160').update(data).digest();
|
|
41
|
+
}
|
|
42
|
+
static toSegwitAddress(pkh, network) {
|
|
43
|
+
const words = bech32_1.bech32.toWords(pkh);
|
|
44
|
+
words.unshift(0x00);
|
|
45
|
+
return bech32_1.bech32.encode(network.bech32, words);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.AddressGenerator = AddressGenerator;
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
import { Logger } from '@btc-vision/logger';
|
|
3
2
|
import { Network } from 'bitcoinjs-lib';
|
|
4
|
-
export declare abstract class Generator
|
|
3
|
+
export declare abstract class Generator {
|
|
5
4
|
static readonly DATA_CHUNK_SIZE: number;
|
|
6
5
|
static readonly MAGIC: Buffer;
|
|
7
6
|
protected readonly senderPubKey: Buffer;
|
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Generator = void 0;
|
|
4
|
-
const logger_1 = require("@btc-vision/logger");
|
|
5
4
|
const bitcoinjs_lib_1 = require("bitcoinjs-lib");
|
|
6
|
-
class Generator
|
|
5
|
+
class Generator {
|
|
7
6
|
static DATA_CHUNK_SIZE = 512;
|
|
8
7
|
static MAGIC = Buffer.from('bsi', 'utf-8');
|
|
9
8
|
senderPubKey;
|
|
10
9
|
contractSaltPubKey;
|
|
11
10
|
network = bitcoinjs_lib_1.networks.bitcoin;
|
|
12
11
|
constructor(senderPubKey, contractSaltPubKey, network = bitcoinjs_lib_1.networks.bitcoin) {
|
|
13
|
-
super();
|
|
14
12
|
this.senderPubKey = senderPubKey;
|
|
15
13
|
this.contractSaltPubKey = contractSaltPubKey;
|
|
16
14
|
this.network = network;
|
|
@@ -4,4 +4,5 @@ import { Generator } from '../Generator.js';
|
|
|
4
4
|
export declare class DeploymentGenerator extends Generator {
|
|
5
5
|
constructor(senderPubKey: Buffer, contractSaltPubKey: Buffer, network?: Network);
|
|
6
6
|
compile(contractBytecode: Buffer, contractSalt: Buffer): Buffer;
|
|
7
|
+
private getAsm;
|
|
7
8
|
}
|
|
@@ -8,8 +8,17 @@ class DeploymentGenerator extends Generator_js_1.Generator {
|
|
|
8
8
|
super(senderPubKey, contractSaltPubKey, network);
|
|
9
9
|
}
|
|
10
10
|
compile(contractBytecode, contractSalt) {
|
|
11
|
+
const asm = this.getAsm(contractBytecode, contractSalt);
|
|
12
|
+
const compiled = bitcoinjs_lib_1.script.compile(asm);
|
|
13
|
+
const decompiled = bitcoinjs_lib_1.script.decompile(compiled);
|
|
14
|
+
if (!decompiled) {
|
|
15
|
+
throw new Error('Failed to decompile script??');
|
|
16
|
+
}
|
|
17
|
+
return compiled;
|
|
18
|
+
}
|
|
19
|
+
getAsm(contractBytecode, contractSalt) {
|
|
11
20
|
const dataChunks = this.splitBufferIntoChunks(contractBytecode);
|
|
12
|
-
|
|
21
|
+
return [
|
|
13
22
|
this.senderPubKey,
|
|
14
23
|
bitcoinjs_lib_1.opcodes.OP_CHECKSIGVERIFY,
|
|
15
24
|
this.contractSaltPubKey,
|
|
@@ -31,12 +40,6 @@ class DeploymentGenerator extends Generator_js_1.Generator {
|
|
|
31
40
|
bitcoinjs_lib_1.opcodes.OP_1,
|
|
32
41
|
bitcoinjs_lib_1.opcodes.OP_ENDIF,
|
|
33
42
|
].flat();
|
|
34
|
-
const compiled = bitcoinjs_lib_1.script.compile(asm);
|
|
35
|
-
const decompiled = bitcoinjs_lib_1.script.decompile(compiled);
|
|
36
|
-
if (!decompiled) {
|
|
37
|
-
throw new Error('Failed to decompile script??');
|
|
38
|
-
}
|
|
39
|
-
return compiled;
|
|
40
43
|
}
|
|
41
44
|
}
|
|
42
45
|
exports.DeploymentGenerator = DeploymentGenerator;
|
package/cjs/keypair/Wallet.d.ts
CHANGED
package/cjs/keypair/Wallet.js
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.Wallet = void 0;
|
|
4
4
|
const EcKeyPair_js_1 = require("./EcKeyPair.js");
|
|
5
5
|
const bitcoinjs_lib_1 = require("bitcoinjs-lib");
|
|
6
|
+
const bip371_js_1 = require("bitcoinjs-lib/src/psbt/bip371.js");
|
|
6
7
|
class Wallet {
|
|
7
8
|
network;
|
|
8
9
|
_keypair;
|
|
@@ -30,5 +31,10 @@ class Wallet {
|
|
|
30
31
|
throw new Error('Keypair not set');
|
|
31
32
|
return this.keypair.publicKey;
|
|
32
33
|
}
|
|
34
|
+
get xOnly() {
|
|
35
|
+
if (!this.keypair)
|
|
36
|
+
throw new Error('Keypair not set');
|
|
37
|
+
return (0, bip371_js_1.toXOnly)(this.keypair.publicKey);
|
|
38
|
+
}
|
|
33
39
|
}
|
|
34
40
|
exports.Wallet = Wallet;
|
package/cjs/opnet.d.ts
CHANGED
|
@@ -1 +1,24 @@
|
|
|
1
1
|
export { version } from './_version.js';
|
|
2
|
+
export * from './bytecode/Compressor.js';
|
|
3
|
+
export * from './generators/Generator.js';
|
|
4
|
+
export * from './generators/builders/CalldataGenerator.js';
|
|
5
|
+
export * from './generators/builders/DeploymentGenerator.js';
|
|
6
|
+
export * from './generators/AddressGenerator.js';
|
|
7
|
+
export * from './verification/TapscriptVerificator.js';
|
|
8
|
+
export * from './keypair/EcKeyPair.js';
|
|
9
|
+
export * from './keypair/Wallet.js';
|
|
10
|
+
export * from './keypair/interfaces/IWallet.js';
|
|
11
|
+
export * from './metadata/contracts/wBTC.js';
|
|
12
|
+
export * from './metadata/ContractBaseMetadata.js';
|
|
13
|
+
export * from './network/NetworkInformation.js';
|
|
14
|
+
export * from './signer/TweakedSigner.js';
|
|
15
|
+
export * from './transaction/TransactionFactory.js';
|
|
16
|
+
export * from './transaction/interfaces/ITransactionParameters.js';
|
|
17
|
+
export * from './transaction/interfaces/Tap.js';
|
|
18
|
+
export * from './transaction/enums/TransactionType.js';
|
|
19
|
+
export * from './transaction/builders/InteractionTransaction.js';
|
|
20
|
+
export * from './transaction/builders/FundingTransaction.js';
|
|
21
|
+
export * from './transaction/builders/TransactionBuilder.js';
|
|
22
|
+
export * from './utils/BitcoinUtils.js';
|
|
23
|
+
export * from './utxo/interfaces/IUTXO.js';
|
|
24
|
+
export * from './utxo/UTXOManager.js';
|
package/cjs/opnet.js
CHANGED
|
@@ -1,5 +1,42 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
2
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
17
|
exports.version = void 0;
|
|
4
18
|
var _version_js_1 = require("./_version.js");
|
|
5
19
|
Object.defineProperty(exports, "version", { enumerable: true, get: function () { return _version_js_1.version; } });
|
|
20
|
+
__exportStar(require("./bytecode/Compressor.js"), exports);
|
|
21
|
+
__exportStar(require("./generators/Generator.js"), exports);
|
|
22
|
+
__exportStar(require("./generators/builders/CalldataGenerator.js"), exports);
|
|
23
|
+
__exportStar(require("./generators/builders/DeploymentGenerator.js"), exports);
|
|
24
|
+
__exportStar(require("./generators/AddressGenerator.js"), exports);
|
|
25
|
+
__exportStar(require("./verification/TapscriptVerificator.js"), exports);
|
|
26
|
+
__exportStar(require("./keypair/EcKeyPair.js"), exports);
|
|
27
|
+
__exportStar(require("./keypair/Wallet.js"), exports);
|
|
28
|
+
__exportStar(require("./keypair/interfaces/IWallet.js"), exports);
|
|
29
|
+
__exportStar(require("./metadata/contracts/wBTC.js"), exports);
|
|
30
|
+
__exportStar(require("./metadata/ContractBaseMetadata.js"), exports);
|
|
31
|
+
__exportStar(require("./network/NetworkInformation.js"), exports);
|
|
32
|
+
__exportStar(require("./signer/TweakedSigner.js"), exports);
|
|
33
|
+
__exportStar(require("./transaction/TransactionFactory.js"), exports);
|
|
34
|
+
__exportStar(require("./transaction/interfaces/ITransactionParameters.js"), exports);
|
|
35
|
+
__exportStar(require("./transaction/interfaces/Tap.js"), exports);
|
|
36
|
+
__exportStar(require("./transaction/enums/TransactionType.js"), exports);
|
|
37
|
+
__exportStar(require("./transaction/builders/InteractionTransaction.js"), exports);
|
|
38
|
+
__exportStar(require("./transaction/builders/FundingTransaction.js"), exports);
|
|
39
|
+
__exportStar(require("./transaction/builders/TransactionBuilder.js"), exports);
|
|
40
|
+
__exportStar(require("./utils/BitcoinUtils.js"), exports);
|
|
41
|
+
__exportStar(require("./utxo/interfaces/IUTXO.js"), exports);
|
|
42
|
+
__exportStar(require("./utxo/UTXOManager.js"), exports);
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Testnet = exports.Regtest = void 0;
|
|
4
|
+
const bsi_common_1 = require("@btc-vision/bsi-common");
|
|
5
|
+
exports.Regtest = {
|
|
6
|
+
wallet: {
|
|
7
|
+
address: 'bcrt1qfqsr3m7vjxheghcvw4ks0fryqxfq8qzjf8fxes',
|
|
8
|
+
publicKey: '020373626d317ae8788ce3280b491068610d840c23ecb64c14075bbb9f670af52c',
|
|
9
|
+
privateKey: 'cRCiYAgCBrU7hSaJBRuPqKVYXQqM5CKXbMfWHb25X4FDAWJ8Ai92',
|
|
10
|
+
},
|
|
11
|
+
config: {
|
|
12
|
+
BITCOIND_NETWORK: bsi_common_1.BitcoinNetwork.Regtest,
|
|
13
|
+
BITCOIND_HOST: '51.81.67.34',
|
|
14
|
+
BITCOIND_PORT: 9242,
|
|
15
|
+
BITCOIND_USERNAME: 'HJSiowseujhs',
|
|
16
|
+
BITCOIND_PASSWORD: 'YHEFHSDJ23JOIhjjef2ied9u290efu2930u90U',
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
exports.Testnet = {
|
|
20
|
+
wallet: {
|
|
21
|
+
address: 'tb1qcfszz8dcvsz9mcp70ezw5zy2r3ydr0cfz60d3t',
|
|
22
|
+
privateKey: 'cSZU2QB9aUYvaL6ukU9d3DKq7QaxTRms1BCQnx5vqXbxBk4bdBc4',
|
|
23
|
+
publicKey: '026764d622f083d78f47c2f2a007ab08e96edf398de74acc0251a7bba202ffb92b',
|
|
24
|
+
},
|
|
25
|
+
config: {
|
|
26
|
+
BITCOIND_NETWORK: bsi_common_1.BitcoinNetwork.TestNet,
|
|
27
|
+
BITCOIND_HOST: '51.81.67.34',
|
|
28
|
+
BITCOIND_PORT: 9237,
|
|
29
|
+
BITCOIND_USERNAME: 'HJSiowseujhs',
|
|
30
|
+
BITCOIND_PASSWORD: 'YHEFHSDJ23JOIhjjef2ied9u290efu2930u90U',
|
|
31
|
+
},
|
|
32
|
+
};
|
package/cjs/tests/gen.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const TapscriptVerificator_js_1 = require("../verification/TapscriptVerificator.js");
|
|
4
|
+
const bitcoinjs_lib_1 = require("bitcoinjs-lib");
|
|
5
|
+
const Regtest_js_1 = require("./Regtest.js");
|
|
6
|
+
const Wallet_js_1 = require("../keypair/Wallet.js");
|
|
7
|
+
const wallet = new Wallet_js_1.Wallet(Regtest_js_1.Regtest.wallet, bitcoinjs_lib_1.networks.regtest);
|
|
8
|
+
const params = {
|
|
9
|
+
bytecode: Buffer.from('deadbeef', 'hex'),
|
|
10
|
+
contractSaltPubKey: Buffer.from('deadbeef', 'hex'),
|
|
11
|
+
deployerPubKeyXOnly: wallet.xOnly,
|
|
12
|
+
originalSalt: Buffer.from('deadbeef', 'hex'),
|
|
13
|
+
network: bitcoinjs_lib_1.networks.regtest,
|
|
14
|
+
};
|
|
15
|
+
const contractAddress = TapscriptVerificator_js_1.TapscriptVerificator.getContractAddress(params);
|
|
16
|
+
const virtualAddress = TapscriptVerificator_js_1.TapscriptVerificator.generateContractVirtualAddress(params.deployerPubKeyXOnly, params.bytecode, params.originalSalt, bitcoinjs_lib_1.networks.regtest);
|
|
17
|
+
console.log('contract sewgit address', virtualAddress, '\ncontract p2tr address', contractAddress);
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const Wallet_js_1 = require("../keypair/Wallet.js");
|
|
4
|
+
const Regtest_js_1 = require("./Regtest.js");
|
|
5
|
+
const UTXOManager_js_1 = require("../utxo/UTXOManager.js");
|
|
6
|
+
const bitcoinjs_lib_1 = require("bitcoinjs-lib");
|
|
7
|
+
const bsi_bitcoin_rpc_1 = require("@btc-vision/bsi-bitcoin-rpc");
|
|
8
|
+
const FundingTransaction_js_1 = require("../transaction/builders/FundingTransaction.js");
|
|
9
|
+
const network = bitcoinjs_lib_1.networks.regtest;
|
|
10
|
+
const rpc = new bsi_bitcoin_rpc_1.BitcoinRPC();
|
|
11
|
+
const wallet = new Wallet_js_1.Wallet(Regtest_js_1.Regtest.wallet, network);
|
|
12
|
+
const utxoManager = new UTXOManager_js_1.UTXOManager('http://localhost:9001');
|
|
13
|
+
const shouldMineBlock = true;
|
|
14
|
+
async function mineBlock() {
|
|
15
|
+
const ok = await rpc.generateToAddress(1, wallet.p2wpkh, 'default');
|
|
16
|
+
if (!ok) {
|
|
17
|
+
throw new Error('Could not mine block');
|
|
18
|
+
}
|
|
19
|
+
console.log(`Mined block`, ok);
|
|
20
|
+
return !!ok.length;
|
|
21
|
+
}
|
|
22
|
+
(async () => {
|
|
23
|
+
await rpc.init(Regtest_js_1.Regtest.config);
|
|
24
|
+
const utxoSetting = {
|
|
25
|
+
address: wallet.p2wpkh,
|
|
26
|
+
minAmount: 10000n,
|
|
27
|
+
requestedAmount: 100000n,
|
|
28
|
+
};
|
|
29
|
+
const utxos = await utxoManager.fetchUTXO(utxoSetting);
|
|
30
|
+
if (!utxos) {
|
|
31
|
+
throw new Error('No UTXOs found');
|
|
32
|
+
}
|
|
33
|
+
const interactionParameters = {
|
|
34
|
+
from: wallet.p2wpkh,
|
|
35
|
+
to: 'bcrt1qqvf4gprr05z248ph6gvx54rpg08p8ngq3zh8uh',
|
|
36
|
+
utxos: utxos,
|
|
37
|
+
signer: wallet.keypair,
|
|
38
|
+
network: network,
|
|
39
|
+
feeRate: 150,
|
|
40
|
+
priorityFee: 1000n,
|
|
41
|
+
childTransactionRequiredFees: 0n,
|
|
42
|
+
};
|
|
43
|
+
const fundingTransaction = new FundingTransaction_js_1.FundingTransaction(interactionParameters);
|
|
44
|
+
const fundingTx = fundingTransaction.signTransaction();
|
|
45
|
+
console.log(fundingTx.toHex());
|
|
46
|
+
const secondTxBroadcast = await rpc.sendRawTransaction({
|
|
47
|
+
hexstring: fundingTx.toHex(),
|
|
48
|
+
});
|
|
49
|
+
console.log(`Transaction broadcasted: ${secondTxBroadcast}`);
|
|
50
|
+
if (shouldMineBlock) {
|
|
51
|
+
await mineBlock();
|
|
52
|
+
}
|
|
53
|
+
})();
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const wBTC_js_1 = require("../metadata/contracts/wBTC.js");
|
|
4
|
+
const Wallet_js_1 = require("../keypair/Wallet.js");
|
|
5
|
+
const Regtest_js_1 = require("./Regtest.js");
|
|
6
|
+
const UTXOManager_js_1 = require("../utxo/UTXOManager.js");
|
|
7
|
+
const bitcoinjs_lib_1 = require("bitcoinjs-lib");
|
|
8
|
+
const TransactionFactory_js_1 = require("../transaction/TransactionFactory.js");
|
|
9
|
+
const bsi_bitcoin_rpc_1 = require("@btc-vision/bsi-bitcoin-rpc");
|
|
10
|
+
const bsi_binary_1 = require("@btc-vision/bsi-binary");
|
|
11
|
+
const network = bitcoinjs_lib_1.networks.testnet;
|
|
12
|
+
const rpc = new bsi_bitcoin_rpc_1.BitcoinRPC();
|
|
13
|
+
const wBtc = new wBTC_js_1.wBTC(network);
|
|
14
|
+
const wallet = new Wallet_js_1.Wallet(Regtest_js_1.Testnet.wallet, network);
|
|
15
|
+
const utxoManager = new UTXOManager_js_1.UTXOManager('https://testnet.opnet.org');
|
|
16
|
+
const factory = new TransactionFactory_js_1.TransactionFactory();
|
|
17
|
+
const abiCoder = new bsi_binary_1.ABICoder();
|
|
18
|
+
const transferSelector = Number(`0x` + abiCoder.encodeSelector('transfer'));
|
|
19
|
+
function getTransferToCalldata(to, amount) {
|
|
20
|
+
const addCalldata = new bsi_binary_1.BinaryWriter();
|
|
21
|
+
addCalldata.writeSelector(transferSelector);
|
|
22
|
+
addCalldata.writeAddress(to);
|
|
23
|
+
addCalldata.writeU256(amount);
|
|
24
|
+
return Buffer.from(addCalldata.getBuffer());
|
|
25
|
+
}
|
|
26
|
+
const shouldMineBlock = false;
|
|
27
|
+
async function mineBlock() {
|
|
28
|
+
const ok = await rpc.generateToAddress(1, wallet.p2wpkh, 'default');
|
|
29
|
+
if (!ok) {
|
|
30
|
+
throw new Error('Could not mine block');
|
|
31
|
+
}
|
|
32
|
+
console.log(`Mined block`, ok);
|
|
33
|
+
return !!ok.length;
|
|
34
|
+
}
|
|
35
|
+
(async () => {
|
|
36
|
+
await rpc.init(Regtest_js_1.Testnet.config);
|
|
37
|
+
const utxoSetting = {
|
|
38
|
+
address: wallet.p2wpkh,
|
|
39
|
+
minAmount: 10000n,
|
|
40
|
+
requestedAmount: 100000n,
|
|
41
|
+
};
|
|
42
|
+
const utxos = await utxoManager.fetchUTXO(utxoSetting);
|
|
43
|
+
console.log(`UTXOs:`, utxos);
|
|
44
|
+
if (!utxos) {
|
|
45
|
+
throw new Error('No UTXOs found');
|
|
46
|
+
}
|
|
47
|
+
const calldata = getTransferToCalldata('tb1pt3ncc5ktfzpry2uvnag06v3jkv4quvmdydf09q8fx6rkgd7f5s8q3aenuk', 5000000n);
|
|
48
|
+
const interactionParameters = {
|
|
49
|
+
from: wallet.p2wpkh,
|
|
50
|
+
to: wBtc.getAddress(),
|
|
51
|
+
utxos: utxos,
|
|
52
|
+
signer: wallet.keypair,
|
|
53
|
+
network: network,
|
|
54
|
+
feeRate: 150,
|
|
55
|
+
priorityFee: 50000n,
|
|
56
|
+
calldata: calldata,
|
|
57
|
+
};
|
|
58
|
+
const finalTx = factory.signInteraction(interactionParameters);
|
|
59
|
+
const firstTxBroadcast = await rpc.sendRawTransaction({
|
|
60
|
+
hexstring: finalTx[0],
|
|
61
|
+
});
|
|
62
|
+
console.log(`First transaction broadcasted: ${firstTxBroadcast}`);
|
|
63
|
+
if (!firstTxBroadcast) {
|
|
64
|
+
throw new Error('Could not broadcast first transaction');
|
|
65
|
+
}
|
|
66
|
+
const secondTxBroadcast = await rpc.sendRawTransaction({
|
|
67
|
+
hexstring: finalTx[1],
|
|
68
|
+
});
|
|
69
|
+
console.log(`Second transaction broadcasted: ${secondTxBroadcast}`);
|
|
70
|
+
if (!secondTxBroadcast) {
|
|
71
|
+
throw new Error('Could not broadcast second transaction');
|
|
72
|
+
}
|
|
73
|
+
if (shouldMineBlock) {
|
|
74
|
+
await mineBlock();
|
|
75
|
+
}
|
|
76
|
+
})();
|
|
@@ -8,7 +8,6 @@ class TransactionFactory {
|
|
|
8
8
|
const preTransaction = new InteractionTransaction_js_1.InteractionTransaction(interactionParameters);
|
|
9
9
|
preTransaction.signTransaction();
|
|
10
10
|
const parameters = preTransaction.getFundingTransactionParameters();
|
|
11
|
-
console.log('funding transaction parameters:', parameters);
|
|
12
11
|
const fundingTransaction = new FundingTransaction_js_1.FundingTransaction(parameters);
|
|
13
12
|
const signedTransaction = fundingTransaction.signTransaction();
|
|
14
13
|
if (!signedTransaction) {
|
|
@@ -20,12 +19,16 @@ class TransactionFactory {
|
|
|
20
19
|
outputIndex: 0,
|
|
21
20
|
scriptPubKey: {
|
|
22
21
|
hex: out.script.toString('hex'),
|
|
22
|
+
address: preTransaction.getScriptAddress(),
|
|
23
23
|
},
|
|
24
24
|
value: BigInt(out.value),
|
|
25
25
|
};
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
const newParams = {
|
|
27
|
+
...interactionParameters,
|
|
28
|
+
utxos: [newUtxo],
|
|
29
|
+
randomBytes: preTransaction.getRndBytes(),
|
|
30
|
+
};
|
|
31
|
+
const finalTransaction = new InteractionTransaction_js_1.InteractionTransaction(newParams);
|
|
29
32
|
const outTx = finalTransaction.signTransaction();
|
|
30
33
|
return [signedTransaction.toHex(), outTx.toHex()];
|
|
31
34
|
}
|
|
@@ -14,7 +14,7 @@ class FundingTransaction extends TransactionBuilder_js_1.TransactionBuilder {
|
|
|
14
14
|
buildTransaction() {
|
|
15
15
|
this.addInputsFromUTXO();
|
|
16
16
|
const amountSpent = this.getTransactionOPNetFee() + this.childTransactionRequiredFees;
|
|
17
|
-
this.
|
|
17
|
+
this.addOutput({
|
|
18
18
|
value: Number(amountSpent),
|
|
19
19
|
address: this.to,
|
|
20
20
|
});
|
|
@@ -24,6 +24,8 @@ export declare class InteractionTransaction extends TransactionBuilder<Transacti
|
|
|
24
24
|
protected readonly interactionPubKeys: Buffer[];
|
|
25
25
|
protected readonly minimumSignatures: number;
|
|
26
26
|
constructor(parameters: IInteractionParameters);
|
|
27
|
+
getContractSecret(): Buffer;
|
|
28
|
+
getRndBytes(): Buffer;
|
|
27
29
|
protected generateSecret(): Buffer;
|
|
28
30
|
protected tweakSigner(): void;
|
|
29
31
|
protected scriptSignerXOnlyPubKey(): Buffer;
|
|
@@ -12,7 +12,7 @@ const bip371_js_1 = require("bitcoinjs-lib/src/psbt/bip371.js");
|
|
|
12
12
|
const TweakedSigner_js_1 = require("../../signer/TweakedSigner.js");
|
|
13
13
|
class InteractionTransaction extends TransactionBuilder_js_1.TransactionBuilder {
|
|
14
14
|
type = TransactionType_js_1.TransactionType.INTERACTION;
|
|
15
|
-
randomBytes
|
|
15
|
+
randomBytes;
|
|
16
16
|
targetScriptRedeem = null;
|
|
17
17
|
leftOverFundsScriptRedeem = null;
|
|
18
18
|
compiledTargetScript;
|
|
@@ -22,7 +22,7 @@ class InteractionTransaction extends TransactionBuilder_js_1.TransactionBuilder
|
|
|
22
22
|
calldata;
|
|
23
23
|
contractSecret = this.generateSecret();
|
|
24
24
|
tweakedSigner;
|
|
25
|
-
scriptSigner
|
|
25
|
+
scriptSigner;
|
|
26
26
|
interactionPubKeys;
|
|
27
27
|
minimumSignatures;
|
|
28
28
|
constructor(parameters) {
|
|
@@ -33,11 +33,19 @@ class InteractionTransaction extends TransactionBuilder_js_1.TransactionBuilder
|
|
|
33
33
|
this.calldata = Compressor_js_1.Compressor.compress(parameters.calldata);
|
|
34
34
|
this.interactionPubKeys = parameters.pubKeys || [];
|
|
35
35
|
this.minimumSignatures = parameters.minimumSignatures || 0;
|
|
36
|
+
this.randomBytes = parameters.randomBytes || BitcoinUtils_js_1.BitcoinUtils.rndBytes();
|
|
37
|
+
this.scriptSigner = this.generateKeyPairFromSeed();
|
|
36
38
|
this.calldataGenerator = new CalldataGenerator_js_1.CalldataGenerator(this.internalPubKeyToXOnly(), this.scriptSignerXOnlyPubKey(), this.network);
|
|
37
39
|
this.compiledTargetScript = this.calldataGenerator.compile(this.calldata, this.contractSecret, this.interactionPubKeys, this.minimumSignatures);
|
|
38
40
|
this.scriptTree = this.getScriptTree();
|
|
39
41
|
this.internalInit();
|
|
40
42
|
}
|
|
43
|
+
getContractSecret() {
|
|
44
|
+
return this.contractSecret;
|
|
45
|
+
}
|
|
46
|
+
getRndBytes() {
|
|
47
|
+
return this.randomBytes;
|
|
48
|
+
}
|
|
41
49
|
generateSecret() {
|
|
42
50
|
return bitcoinjs_lib_1.address.fromBech32(this.to).data;
|
|
43
51
|
}
|
|
@@ -62,6 +70,7 @@ class InteractionTransaction extends TransactionBuilder_js_1.TransactionBuilder
|
|
|
62
70
|
script: this.getTapOutput(),
|
|
63
71
|
},
|
|
64
72
|
tapLeafScript: [this.tapLeafScript],
|
|
73
|
+
sequence: 0xfffffffd,
|
|
65
74
|
};
|
|
66
75
|
this.addInput(input);
|
|
67
76
|
}
|
|
@@ -7,8 +7,8 @@ import { Address } from '@btc-vision/bsi-binary';
|
|
|
7
7
|
import { UTXO } from '../../utxo/interfaces/IUTXO.js';
|
|
8
8
|
import { Logger } from '@btc-vision/logger';
|
|
9
9
|
export declare abstract class TransactionBuilder<T extends TransactionType> extends Logger {
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
static readonly LOCK_LEAF_SCRIPT: Buffer;
|
|
11
|
+
static readonly MINIMUM_DUST: bigint;
|
|
12
12
|
abstract readonly type: T;
|
|
13
13
|
readonly logColor: string;
|
|
14
14
|
transactionFee: bigint;
|
|
@@ -36,6 +36,7 @@ export declare abstract class TransactionBuilder<T extends TransactionType> exte
|
|
|
36
36
|
signTransaction(): Transaction;
|
|
37
37
|
getTransaction(): Transaction;
|
|
38
38
|
getScriptAddress(): string;
|
|
39
|
+
disableRBF(): void;
|
|
39
40
|
getTapAddress(): string;
|
|
40
41
|
addInput(input: PsbtInputExtended): void;
|
|
41
42
|
addOutput(output: PsbtOutputExtended): void;
|