@btc-vision/transaction 1.0.113 → 1.0.114
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/abi/ABICoder.d.ts +31 -0
- package/browser/buffer/BinaryReader.d.ts +37 -0
- package/browser/buffer/BinaryWriter.d.ts +46 -0
- package/browser/deterministic/AddressMap.d.ts +10 -0
- package/browser/deterministic/AddressSet.d.ts +13 -0
- package/browser/deterministic/DeterministicMap.d.ts +17 -0
- package/browser/deterministic/DeterministicSet.d.ts +13 -0
- package/browser/deterministic/Map.d.ts +14 -0
- package/browser/event/NetEvent.d.ts +5 -0
- package/browser/generators/AddressGenerator.d.ts +3 -0
- package/browser/index.js +1 -1
- package/browser/keypair/Address.d.ts +23 -0
- package/browser/keypair/AddressVerificator.d.ts +1 -2
- package/browser/keypair/EcKeyPair.d.ts +9 -9
- package/browser/keypair/Wallet.d.ts +11 -5
- package/browser/metadata/ContractBaseMetadata.d.ts +3 -4
- package/browser/metadata/contracts/wBTC.d.ts +2 -3
- package/browser/metadata/tokens.d.ts +1 -1
- package/browser/opnet.d.ts +11 -0
- package/browser/transaction/TransactionFactory.d.ts +6 -6
- package/browser/transaction/browser/BrowserSignerBase.d.ts +3 -4
- package/browser/transaction/browser/extensions/UnisatSigner.d.ts +3 -4
- package/browser/transaction/browser/types/Unisat.d.ts +2 -3
- package/browser/transaction/builders/CustomScriptTransaction.d.ts +4 -5
- package/browser/transaction/builders/DeploymentTransaction.d.ts +4 -2
- package/browser/transaction/builders/MultiSignTransaction.d.ts +4 -5
- package/browser/transaction/builders/TransactionBuilder.d.ts +5 -6
- package/browser/transaction/builders/WrapTransaction.d.ts +2 -2
- package/browser/transaction/interfaces/ITransactionParameters.d.ts +6 -6
- package/browser/transaction/processor/PsbtTransaction.d.ts +3 -4
- package/browser/transaction/shared/P2TR_MS.d.ts +1 -2
- package/browser/utils/BufferHelper.d.ts +11 -0
- package/browser/utils/types.d.ts +12 -0
- package/browser/utxo/OPNetLimitedProvider.d.ts +1 -2
- package/build/_version.d.ts +1 -1
- package/build/_version.js +1 -1
- package/build/abi/ABICoder.d.ts +31 -0
- package/build/abi/ABICoder.js +137 -0
- package/build/buffer/BinaryReader.d.ts +37 -0
- package/build/buffer/BinaryReader.js +192 -0
- package/build/buffer/BinaryWriter.d.ts +46 -0
- package/build/buffer/BinaryWriter.js +258 -0
- package/build/deterministic/AddressMap.d.ts +10 -0
- package/build/deterministic/AddressMap.js +46 -0
- package/build/deterministic/AddressSet.d.ts +13 -0
- package/build/deterministic/AddressSet.js +44 -0
- package/build/deterministic/DeterministicMap.d.ts +17 -0
- package/build/deterministic/DeterministicMap.js +83 -0
- package/build/deterministic/DeterministicSet.d.ts +13 -0
- package/build/deterministic/DeterministicSet.js +46 -0
- package/build/deterministic/Map.d.ts +14 -0
- package/build/deterministic/Map.js +56 -0
- package/build/event/NetEvent.d.ts +5 -0
- package/build/event/NetEvent.js +6 -0
- package/build/generators/AddressGenerator.d.ts +3 -0
- package/build/generators/AddressGenerator.js +8 -1
- package/build/keypair/Address.d.ts +23 -0
- package/build/keypair/Address.js +129 -0
- package/build/keypair/AddressVerificator.d.ts +1 -2
- package/build/keypair/AddressVerificator.js +7 -2
- package/build/keypair/EcKeyPair.d.ts +9 -9
- package/build/keypair/EcKeyPair.js +9 -2
- package/build/keypair/Wallet.d.ts +11 -5
- package/build/keypair/Wallet.js +14 -1
- package/build/metadata/ContractBaseMetadata.d.ts +3 -4
- package/build/metadata/contracts/wBTC.d.ts +2 -3
- package/build/metadata/contracts/wBTC.js +4 -6
- package/build/metadata/tokens.d.ts +1 -1
- package/build/metadata/tokens.js +19 -15
- package/build/opnet.d.ts +11 -0
- package/build/opnet.js +11 -0
- package/build/transaction/TransactionFactory.d.ts +6 -6
- package/build/transaction/TransactionFactory.js +3 -2
- package/build/transaction/browser/BrowserSignerBase.d.ts +3 -4
- package/build/transaction/browser/extensions/UnisatSigner.d.ts +3 -4
- package/build/transaction/browser/types/Unisat.d.ts +2 -3
- package/build/transaction/builders/CustomScriptTransaction.d.ts +4 -5
- package/build/transaction/builders/DeploymentTransaction.d.ts +4 -2
- package/build/transaction/builders/DeploymentTransaction.js +6 -2
- package/build/transaction/builders/MultiSignTransaction.d.ts +4 -5
- package/build/transaction/builders/TransactionBuilder.d.ts +5 -6
- package/build/transaction/builders/UnwrapSegwitTransaction.js +2 -1
- package/build/transaction/builders/UnwrapTransaction.js +2 -1
- package/build/transaction/builders/WrapTransaction.d.ts +2 -2
- package/build/transaction/builders/WrapTransaction.js +5 -6
- package/build/transaction/interfaces/ITransactionParameters.d.ts +6 -6
- package/build/transaction/processor/PsbtTransaction.d.ts +3 -4
- package/build/transaction/shared/P2TR_MS.d.ts +1 -2
- package/build/utils/BufferHelper.d.ts +11 -0
- package/build/utils/BufferHelper.js +50 -0
- package/build/utils/types.d.ts +12 -0
- package/build/utils/types.js +1 -0
- package/build/utxo/OPNetLimitedProvider.d.ts +1 -2
- package/build/utxo/OPNetLimitedProvider.js +1 -1
- package/build/verification/TapscriptVerificator.js +3 -2
- package/package.json +3 -2
- package/src/_version.ts +1 -1
- package/src/abi/ABICoder.ts +158 -0
- package/src/buffer/BinaryReader.ts +260 -0
- package/src/buffer/BinaryWriter.ts +331 -0
- package/src/deterministic/AddressMap.ts +57 -0
- package/src/deterministic/AddressSet.ts +62 -0
- package/src/deterministic/DeterministicMap.ts +88 -0
- package/src/deterministic/DeterministicSet.ts +56 -0
- package/src/deterministic/Map.ts +66 -0
- package/src/event/NetEvent.ts +6 -0
- package/src/generators/AddressGenerator.ts +15 -1
- package/src/keypair/Address.ts +235 -0
- package/src/keypair/AddressVerificator.ts +9 -5
- package/src/keypair/EcKeyPair.ts +39 -37
- package/src/keypair/Wallet.ts +61 -12
- package/src/metadata/ContractBaseMetadata.ts +3 -4
- package/src/metadata/contracts/wBTC.ts +8 -9
- package/src/metadata/tokens.ts +21 -16
- package/src/opnet.ts +13 -0
- package/src/transaction/TransactionFactory.ts +11 -10
- package/src/transaction/browser/BrowserSignerBase.ts +3 -4
- package/src/transaction/browser/extensions/UnisatSigner.ts +6 -7
- package/src/transaction/browser/types/Unisat.ts +2 -3
- package/src/transaction/builders/CustomScriptTransaction.ts +4 -5
- package/src/transaction/builders/DeploymentTransaction.ts +17 -4
- package/src/transaction/builders/MultiSignTransaction.ts +4 -5
- package/src/transaction/builders/TransactionBuilder.ts +8 -9
- package/src/transaction/builders/UnwrapSegwitTransaction.ts +3 -1
- package/src/transaction/builders/UnwrapTransaction.ts +3 -17
- package/src/transaction/builders/WrapTransaction.ts +7 -8
- package/src/transaction/interfaces/ITransactionParameters.ts +7 -6
- package/src/transaction/processor/PsbtTransaction.ts +3 -4
- package/src/transaction/shared/P2TR_MS.ts +2 -3
- package/src/utils/BufferHelper.ts +71 -0
- package/src/utils/types.ts +19 -0
- package/src/utxo/OPNetLimitedProvider.ts +3 -8
- package/src/verification/TapscriptVerificator.ts +4 -2
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export class BufferHelper {
|
|
2
|
+
static bufferToUint8Array(buffer) {
|
|
3
|
+
if (Buffer.isBuffer(buffer)) {
|
|
4
|
+
const length = buffer.byteLength;
|
|
5
|
+
const arrayBuffer = new ArrayBuffer(length);
|
|
6
|
+
const view = new Uint8Array(arrayBuffer);
|
|
7
|
+
for (let i = 0; i < length; ++i) {
|
|
8
|
+
view[i] = buffer[i];
|
|
9
|
+
}
|
|
10
|
+
return view;
|
|
11
|
+
}
|
|
12
|
+
return buffer;
|
|
13
|
+
}
|
|
14
|
+
static uint8ArrayToHex(input) {
|
|
15
|
+
return Buffer.from(input, 0, input.byteLength).toString('hex');
|
|
16
|
+
}
|
|
17
|
+
static hexToUint8Array(input) {
|
|
18
|
+
if (input.startsWith('0x')) {
|
|
19
|
+
input = input.substring(2);
|
|
20
|
+
}
|
|
21
|
+
if (input.length % 2 !== 0) {
|
|
22
|
+
input = '0' + input;
|
|
23
|
+
}
|
|
24
|
+
const length = input.length / 2;
|
|
25
|
+
const buffer = new Uint8Array(length);
|
|
26
|
+
for (let i = 0; i < length; i++) {
|
|
27
|
+
buffer[i] = parseInt(input.substring(i * 2, i * 2 + 2), 16);
|
|
28
|
+
}
|
|
29
|
+
return buffer;
|
|
30
|
+
}
|
|
31
|
+
static pointerToUint8Array(pointer) {
|
|
32
|
+
const pointerHex = pointer.toString(16).padStart(64, '0');
|
|
33
|
+
return BufferHelper.hexToUint8Array(pointerHex);
|
|
34
|
+
}
|
|
35
|
+
static uint8ArrayToPointer(input) {
|
|
36
|
+
const hex = BufferHelper.uint8ArrayToHex(input);
|
|
37
|
+
return BigInt('0x' + hex);
|
|
38
|
+
}
|
|
39
|
+
static valueToUint8Array(value) {
|
|
40
|
+
const valueHex = value.toString(16).padStart(64, '0');
|
|
41
|
+
return BufferHelper.hexToUint8Array(valueHex);
|
|
42
|
+
}
|
|
43
|
+
static uint8ArrayToValue(input) {
|
|
44
|
+
const hex = BufferHelper.uint8ArrayToHex(input);
|
|
45
|
+
if (!hex)
|
|
46
|
+
return BigInt(0);
|
|
47
|
+
return BigInt('0x' + hex);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
BufferHelper.EXPECTED_BUFFER_LENGTH = 32;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { DeterministicMap } from '../deterministic/DeterministicMap.js';
|
|
2
|
+
export declare const ADDRESS_BYTE_LENGTH: number;
|
|
3
|
+
export type MemorySlotPointer = bigint;
|
|
4
|
+
export type BufferLike = Uint8Array | Buffer;
|
|
5
|
+
export type MemorySlotData<T> = T;
|
|
6
|
+
export type PointerStorage = DeterministicMap<MemorySlotPointer, MemorySlotData<bigint>>;
|
|
7
|
+
export type i32 = number;
|
|
8
|
+
export type u8 = number;
|
|
9
|
+
export type u16 = number;
|
|
10
|
+
export type u32 = number;
|
|
11
|
+
export type u64 = bigint;
|
|
12
|
+
export type Selector = number;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const ADDRESS_BYTE_LENGTH = 32;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { Address } from '@btc-vision/bsi-binary';
|
|
2
1
|
import { Network } from 'bitcoinjs-lib';
|
|
3
|
-
import { Wallet } from '../opnet.js';
|
|
2
|
+
import { Address, Wallet } from '../opnet.js';
|
|
4
3
|
import { UnwrapGeneration } from '../wbtc/UnwrapGeneration.js';
|
|
5
4
|
import { WrappedGeneration } from '../wbtc/WrappedGenerationParameters.js';
|
|
6
5
|
import { BroadcastResponse } from './interfaces/BroadcastResponse.js';
|
|
@@ -182,7 +182,7 @@ export class OPNetLimitedProvider {
|
|
|
182
182
|
if (receiver.length < 50) {
|
|
183
183
|
throw new Error('Invalid receiver address');
|
|
184
184
|
}
|
|
185
|
-
const params = [1, amount.toString(), receiver];
|
|
185
|
+
const params = [1, amount.toString(), receiver.toHex()];
|
|
186
186
|
const result = await this.rpcMethod('btc_generate', params);
|
|
187
187
|
if (!result) {
|
|
188
188
|
return;
|
|
@@ -2,7 +2,7 @@ import { crypto as bitCrypto, networks, payments } from 'bitcoinjs-lib';
|
|
|
2
2
|
import { toXOnly } from 'bitcoinjs-lib/src/psbt/bip371.js';
|
|
3
3
|
import { DeploymentGenerator } from '../generators/builders/DeploymentGenerator.js';
|
|
4
4
|
import { TransactionBuilder } from '../transaction/builders/TransactionBuilder.js';
|
|
5
|
-
import {
|
|
5
|
+
import { Address } from '../keypair/Address.js';
|
|
6
6
|
export class TapscriptVerificator {
|
|
7
7
|
static getContractAddress(params) {
|
|
8
8
|
const network = params.network || networks.bitcoin;
|
|
@@ -27,7 +27,8 @@ export class TapscriptVerificator {
|
|
|
27
27
|
}
|
|
28
28
|
static generateContractVirtualAddress(deployerPubKey, bytecode, saltHash, network = networks.bitcoin) {
|
|
29
29
|
const virtualAddress = TapscriptVerificator.getContractSeed(deployerPubKey, bytecode, saltHash);
|
|
30
|
-
|
|
30
|
+
const address = new Address(virtualAddress);
|
|
31
|
+
return address.p2tr(network);
|
|
31
32
|
}
|
|
32
33
|
static generateAddressFromScript(params, scriptTree) {
|
|
33
34
|
const network = params.network || networks.bitcoin;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@btc-vision/transaction",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.114",
|
|
5
5
|
"author": "BlobMaster41",
|
|
6
6
|
"description": "OPNet transaction library allows you to create and sign transactions for the OPNet network.",
|
|
7
7
|
"engines": {
|
|
@@ -72,6 +72,7 @@
|
|
|
72
72
|
"@babel/preset-react": "^7.24.1",
|
|
73
73
|
"@babel/preset-typescript": "^7.24.1",
|
|
74
74
|
"@types/node": "^22.5.5",
|
|
75
|
+
"@types/sha.js": "^2.4.4",
|
|
75
76
|
"eslint": "^9.10.0",
|
|
76
77
|
"gulp": "^5.0.0",
|
|
77
78
|
"gulp-cached": "^1.1.1",
|
|
@@ -91,7 +92,6 @@
|
|
|
91
92
|
"dependencies": {
|
|
92
93
|
"@babel/plugin-proposal-object-rest-spread": "^7.20.7",
|
|
93
94
|
"@bitcoinerlab/secp256k1": "^1.1.1",
|
|
94
|
-
"@btc-vision/bsi-binary": "^1.0.42",
|
|
95
95
|
"@btc-vision/bsi-bitcoin-rpc": "^1.0.29",
|
|
96
96
|
"@btc-vision/logger": "^1.0.6",
|
|
97
97
|
"@eslint/js": "^9.10.0",
|
|
@@ -111,6 +111,7 @@
|
|
|
111
111
|
"gulp-clean": "^0.4.0",
|
|
112
112
|
"gulp-eslint-new": "^2.3.0",
|
|
113
113
|
"process": "^0.11.10",
|
|
114
|
+
"sha.js": "^2.4.11",
|
|
114
115
|
"ts-loader": "^9.5.1",
|
|
115
116
|
"ts-node": "^10.9.2",
|
|
116
117
|
"typescript": "^5.6.2"
|
package/src/_version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = '1.0.
|
|
1
|
+
export const version = '1.0.114';
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import shajs from 'sha.js';
|
|
2
|
+
|
|
3
|
+
import { BinaryReader } from '../buffer/BinaryReader.js';
|
|
4
|
+
import { BufferHelper } from '../utils/BufferHelper.js';
|
|
5
|
+
|
|
6
|
+
export enum ABIDataTypes {
|
|
7
|
+
UINT8 = 'UINT8',
|
|
8
|
+
UINT16 = 'UINT16',
|
|
9
|
+
UINT32 = 'UINT32',
|
|
10
|
+
UINT64 = 'UINT64',
|
|
11
|
+
BOOL = 'BOOL',
|
|
12
|
+
ADDRESS = 'ADDRESS',
|
|
13
|
+
STRING = 'STRING',
|
|
14
|
+
BYTES32 = 'BYTES32',
|
|
15
|
+
UINT256 = 'UINT256',
|
|
16
|
+
TUPLE = 'TUPLE',
|
|
17
|
+
BYTES = 'BYTES',
|
|
18
|
+
ADDRESS_UINT256_TUPLE = 'ADDRESS_UINT256_TUPLE',
|
|
19
|
+
ARRAY_OF_ADDRESSES = 'ARRAY_OF_ADDRESSES',
|
|
20
|
+
ARRAY_OF_UINT256 = 'ARRAY_OF_UINT256',
|
|
21
|
+
ARRAY_OF_UINT64 = 'ARRAY_OF_UINT64',
|
|
22
|
+
ARRAY_OF_UINT32 = 'ARRAY_OF_UINT32',
|
|
23
|
+
ARRAY_OF_UINT16 = 'ARRAY_OF_UINT16',
|
|
24
|
+
ARRAY_OF_UINT8 = 'ARRAY_OF_UINT8',
|
|
25
|
+
ARRAY_OF_STRING = 'ARRAY_OF_STRING',
|
|
26
|
+
ARRAY_OF_BYTES = 'ARRAY_OF_BYTES',
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export class ABICoder {
|
|
30
|
+
public decodeData(data: Uint8Array, types: ABIDataTypes[]): unknown[] {
|
|
31
|
+
const byteReader = new BinaryReader(data);
|
|
32
|
+
const result: unknown[] = [];
|
|
33
|
+
|
|
34
|
+
for (let i = 0; i < types.length; i++) {
|
|
35
|
+
const type = types[i];
|
|
36
|
+
switch (type) {
|
|
37
|
+
case ABIDataTypes.UINT8:
|
|
38
|
+
result.push(byteReader.readU8());
|
|
39
|
+
break;
|
|
40
|
+
case ABIDataTypes.UINT16:
|
|
41
|
+
result.push(byteReader.readU16());
|
|
42
|
+
break;
|
|
43
|
+
case ABIDataTypes.UINT32:
|
|
44
|
+
result.push(byteReader.readU32());
|
|
45
|
+
break;
|
|
46
|
+
case ABIDataTypes.BYTES32:
|
|
47
|
+
result.push(byteReader.readBytes(32));
|
|
48
|
+
break;
|
|
49
|
+
case ABIDataTypes.BOOL:
|
|
50
|
+
result.push(byteReader.readBoolean());
|
|
51
|
+
break;
|
|
52
|
+
case ABIDataTypes.ADDRESS:
|
|
53
|
+
result.push(byteReader.readAddress());
|
|
54
|
+
break;
|
|
55
|
+
case ABIDataTypes.STRING:
|
|
56
|
+
result.push(byteReader.readStringWithLength());
|
|
57
|
+
break;
|
|
58
|
+
case ABIDataTypes.UINT256:
|
|
59
|
+
result.push(byteReader.readU256());
|
|
60
|
+
break;
|
|
61
|
+
case ABIDataTypes.TUPLE: // very basic for now, only contains uint256
|
|
62
|
+
result.push(byteReader.readTuple());
|
|
63
|
+
break;
|
|
64
|
+
case ABIDataTypes.ADDRESS_UINT256_TUPLE:
|
|
65
|
+
result.push(byteReader.readAddressValueTuple());
|
|
66
|
+
break;
|
|
67
|
+
case ABIDataTypes.BYTES:
|
|
68
|
+
result.push(byteReader.readBytesWithLength());
|
|
69
|
+
break;
|
|
70
|
+
case ABIDataTypes.UINT64:
|
|
71
|
+
result.push(byteReader.readU64());
|
|
72
|
+
break;
|
|
73
|
+
case ABIDataTypes.ARRAY_OF_ADDRESSES:
|
|
74
|
+
result.push(byteReader.readAddressArray());
|
|
75
|
+
break;
|
|
76
|
+
case ABIDataTypes.ARRAY_OF_UINT256:
|
|
77
|
+
result.push(byteReader.readU256Array());
|
|
78
|
+
break;
|
|
79
|
+
case ABIDataTypes.ARRAY_OF_UINT64:
|
|
80
|
+
result.push(byteReader.readU64Array());
|
|
81
|
+
break;
|
|
82
|
+
case ABIDataTypes.ARRAY_OF_UINT32:
|
|
83
|
+
result.push(byteReader.readU32Array());
|
|
84
|
+
break;
|
|
85
|
+
case ABIDataTypes.ARRAY_OF_UINT16:
|
|
86
|
+
result.push(byteReader.readU16Array());
|
|
87
|
+
break;
|
|
88
|
+
case ABIDataTypes.ARRAY_OF_UINT8:
|
|
89
|
+
result.push(byteReader.readU8Array());
|
|
90
|
+
break;
|
|
91
|
+
case ABIDataTypes.ARRAY_OF_STRING:
|
|
92
|
+
result.push(byteReader.readStringArray());
|
|
93
|
+
break;
|
|
94
|
+
case ABIDataTypes.ARRAY_OF_BYTES:
|
|
95
|
+
result.push(byteReader.readBytesArray());
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return result;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
public encodePointer(key: string): bigint {
|
|
103
|
+
const hash = this.sha256(key);
|
|
104
|
+
const finalBuffer = Buffer.alloc(BufferHelper.EXPECTED_BUFFER_LENGTH);
|
|
105
|
+
const selector = hash.subarray(0, BufferHelper.EXPECTED_BUFFER_LENGTH); // 32 bytes
|
|
106
|
+
|
|
107
|
+
for (let i = 0; i < BufferHelper.EXPECTED_BUFFER_LENGTH; i++) {
|
|
108
|
+
finalBuffer[i] = selector[i];
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return BigInt('0x' + finalBuffer.toString('hex'));
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
public encodePointerHash(pointer: number, sub: bigint): Uint8Array {
|
|
115
|
+
const finalBuffer = new Uint8Array(BufferHelper.EXPECTED_BUFFER_LENGTH + 2); // 32 bytes for `sub` + 2 bytes for `pointer`
|
|
116
|
+
// Encode pointer
|
|
117
|
+
finalBuffer[0] = pointer & 0xff;
|
|
118
|
+
finalBuffer[1] = (pointer >> 8) & 0xff;
|
|
119
|
+
|
|
120
|
+
// Convert `sub` to Uint8Array and append it
|
|
121
|
+
const subKey = this.bigIntToUint8Array(sub, BufferHelper.EXPECTED_BUFFER_LENGTH); // Assuming a function to convert BigInt to Uint8Array of fixed size
|
|
122
|
+
finalBuffer.set(subKey, 2);
|
|
123
|
+
|
|
124
|
+
const hashed = this.sha256(finalBuffer);
|
|
125
|
+
if (hashed.byteLength !== BufferHelper.EXPECTED_BUFFER_LENGTH) {
|
|
126
|
+
throw new Error('Invalid hash length');
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return hashed;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
public encodeSelector(selectorIdentifier: string): string {
|
|
133
|
+
// first 4 bytes of sha256 hash of the function signature
|
|
134
|
+
const hash = this.sha256(selectorIdentifier);
|
|
135
|
+
const selector = hash.subarray(0, 4); // 4 bytes
|
|
136
|
+
|
|
137
|
+
return selector.toString('hex');
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
public numericSelectorToHex(selector: number): string {
|
|
141
|
+
return selector.toString(16);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
private bigIntToUint8Array(bigIntValue: bigint, length: number): Uint8Array {
|
|
145
|
+
const byteArray = new Uint8Array(length);
|
|
146
|
+
const buf = BufferHelper.valueToUint8Array(bigIntValue);
|
|
147
|
+
|
|
148
|
+
for (let i = 0; i < length; i++) {
|
|
149
|
+
byteArray[i] = buf[i] || 0;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return byteArray;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
private sha256(buffer: Buffer | string | Uint8Array): Buffer {
|
|
156
|
+
return new shajs.sha256().update(buffer).digest();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import { ADDRESS_BYTE_LENGTH, BufferLike, i32, Selector, u16, u32, u8 } from '../utils/types.js';
|
|
2
|
+
import { Address } from '../keypair/Address.js';
|
|
3
|
+
import { AddressMap } from '../deterministic/AddressMap.js';
|
|
4
|
+
|
|
5
|
+
export class BinaryReader {
|
|
6
|
+
private buffer: DataView;
|
|
7
|
+
|
|
8
|
+
private currentOffset: i32 = 0;
|
|
9
|
+
|
|
10
|
+
constructor(bytes: BufferLike) {
|
|
11
|
+
this.buffer = new DataView(bytes.buffer);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
public static stringCompare(a: string, b: string): number {
|
|
15
|
+
return a.localeCompare(b);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
public static bigintCompare(a: bigint, b: bigint): number {
|
|
19
|
+
if (a < b) return -1;
|
|
20
|
+
if (a > b) return 1;
|
|
21
|
+
return 0;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public static numberCompare(a: number, b: number): number {
|
|
25
|
+
if (a < b) return -1;
|
|
26
|
+
if (a > b) return 1;
|
|
27
|
+
return 0;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
public setBuffer(bytes: BufferLike): void {
|
|
31
|
+
this.buffer = new DataView(bytes.buffer);
|
|
32
|
+
|
|
33
|
+
this.currentOffset = 0;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
public readAddressArray(): Address[] {
|
|
37
|
+
const length = this.readU16();
|
|
38
|
+
const result: Address[] = new Array<Address>(length);
|
|
39
|
+
|
|
40
|
+
for (let i = 0; i < length; i++) {
|
|
41
|
+
result[i] = this.readAddress();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
public readU256Array(): bigint[] {
|
|
48
|
+
const length = this.readU16();
|
|
49
|
+
const result: bigint[] = new Array<bigint>(length);
|
|
50
|
+
|
|
51
|
+
for (let i = 0; i < length; i++) {
|
|
52
|
+
result[i] = this.readU256();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
public readU64Array(): bigint[] {
|
|
59
|
+
const length = this.readU16();
|
|
60
|
+
const result: bigint[] = new Array<bigint>(length);
|
|
61
|
+
|
|
62
|
+
for (let i = 0; i < length; i++) {
|
|
63
|
+
result[i] = this.readU64();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
public readU32Array(): u32[] {
|
|
70
|
+
const length = this.readU16();
|
|
71
|
+
const result: u32[] = new Array<u32>(length);
|
|
72
|
+
|
|
73
|
+
for (let i = 0; i < length; i++) {
|
|
74
|
+
result[i] = this.readU32();
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
public readU16Array(): u16[] {
|
|
81
|
+
const length = this.readU16();
|
|
82
|
+
const result: u16[] = new Array<u16>(length);
|
|
83
|
+
|
|
84
|
+
for (let i = 0; i < length; i++) {
|
|
85
|
+
result[i] = this.readU16();
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
public readU8Array(): u8[] {
|
|
92
|
+
const length = this.readU16();
|
|
93
|
+
const result: u8[] = new Array<u8>(length);
|
|
94
|
+
|
|
95
|
+
for (let i = 0; i < length; i++) {
|
|
96
|
+
result[i] = this.readU8();
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return result;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
public readStringArray(): string[] {
|
|
103
|
+
const length = this.readU16();
|
|
104
|
+
const result: string[] = new Array<string>(length);
|
|
105
|
+
|
|
106
|
+
for (let i = 0; i < length; i++) {
|
|
107
|
+
result[i] = this.readStringWithLength();
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
public readBytesArray(): Uint8Array[] {
|
|
114
|
+
const length = this.readU16();
|
|
115
|
+
const result: Uint8Array[] = new Array<Uint8Array>(length);
|
|
116
|
+
|
|
117
|
+
for (let i = 0; i < length; i++) {
|
|
118
|
+
result[i] = this.readBytesWithLength();
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return result;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
public readBytesWithLength(maxLength: number = 0): Uint8Array {
|
|
125
|
+
const length = this.readU32();
|
|
126
|
+
|
|
127
|
+
if (maxLength > 0 && length > maxLength) {
|
|
128
|
+
throw new Error('Data length exceeds maximum length.');
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return this.readBytes(length);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
public readTuple(): bigint[] {
|
|
135
|
+
const length = this.readU32();
|
|
136
|
+
const result: bigint[] = new Array<bigint>(length);
|
|
137
|
+
|
|
138
|
+
for (let i = 0; i < length; i++) {
|
|
139
|
+
result[i] = this.readU256();
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return result;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
public readU8(): u8 {
|
|
146
|
+
this.verifyEnd(this.currentOffset + 1);
|
|
147
|
+
|
|
148
|
+
return this.buffer.getUint8(this.currentOffset++);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
public readU16(): u16 {
|
|
152
|
+
this.verifyEnd(this.currentOffset + 2);
|
|
153
|
+
|
|
154
|
+
const value = this.buffer.getUint16(this.currentOffset, true);
|
|
155
|
+
this.currentOffset += 2;
|
|
156
|
+
|
|
157
|
+
return value;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
public readU32(le: boolean = true): u32 {
|
|
161
|
+
this.verifyEnd(this.currentOffset + 4);
|
|
162
|
+
|
|
163
|
+
const value = this.buffer.getUint32(this.currentOffset, le);
|
|
164
|
+
this.currentOffset += 4;
|
|
165
|
+
|
|
166
|
+
return value;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
public readU64(): bigint {
|
|
170
|
+
this.verifyEnd(this.currentOffset + 8);
|
|
171
|
+
|
|
172
|
+
const value: bigint = this.buffer.getBigUint64(this.currentOffset, true);
|
|
173
|
+
this.currentOffset += 8;
|
|
174
|
+
|
|
175
|
+
return value;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
public readAddressValueTuple(): AddressMap<bigint> {
|
|
179
|
+
const length = this.readU16();
|
|
180
|
+
const result = new AddressMap<bigint>();
|
|
181
|
+
|
|
182
|
+
for (let i = 0; i < length; i++) {
|
|
183
|
+
const address = this.readAddress();
|
|
184
|
+
const value = this.readU256();
|
|
185
|
+
|
|
186
|
+
if (result.has(address)) throw new Error('Duplicate address found in map');
|
|
187
|
+
|
|
188
|
+
result.set(address, value);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
return result;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
public readU256(): bigint {
|
|
195
|
+
const next32Bytes = this.readBytes(32);
|
|
196
|
+
|
|
197
|
+
return BigInt(
|
|
198
|
+
'0x' + next32Bytes.reduce((acc, byte) => acc + byte.toString(16).padStart(2, '0'), ''),
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
public readBytes(length: u32, zeroStop: boolean = false): Uint8Array {
|
|
203
|
+
let bytes: Uint8Array = new Uint8Array(length);
|
|
204
|
+
for (let i: u32 = 0; i < length; i++) {
|
|
205
|
+
const byte: u8 = this.readU8();
|
|
206
|
+
if (zeroStop && byte === 0) {
|
|
207
|
+
bytes = bytes.slice(0, i);
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
bytes[i] = byte;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
return bytes;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
public readString(length: u16): string {
|
|
218
|
+
const textDecoder = new TextDecoder();
|
|
219
|
+
const bytes = this.readBytes(length, true);
|
|
220
|
+
|
|
221
|
+
return textDecoder.decode(bytes);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
public readSelector(): Selector {
|
|
225
|
+
return this.readU32(false);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
public readStringWithLength(): string {
|
|
229
|
+
const length = this.readU16();
|
|
230
|
+
|
|
231
|
+
return this.readString(length);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
public readBoolean(): boolean {
|
|
235
|
+
return this.readU8() !== 0;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
public readAddress(): Address {
|
|
239
|
+
const bytes: u8[] = new Array<u8>(ADDRESS_BYTE_LENGTH);
|
|
240
|
+
for (let i: u32 = 0; i < ADDRESS_BYTE_LENGTH; i++) {
|
|
241
|
+
bytes[i] = this.readU8();
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
return new Address(bytes);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
public getOffset(): u16 {
|
|
248
|
+
return this.currentOffset;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
public setOffset(offset: u16): void {
|
|
252
|
+
this.currentOffset = offset;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
public verifyEnd(size: i32): void {
|
|
256
|
+
if (this.currentOffset > this.buffer.byteLength) {
|
|
257
|
+
throw new Error(`Expected to read ${size} bytes but read ${this.currentOffset} bytes`);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|