@btc-vision/transaction 1.0.112 → 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 +15 -4
- package/browser/keypair/EcKeyPair.d.ts +15 -12
- package/browser/keypair/Wallet.d.ts +12 -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/signer/TweakedSigner.d.ts +2 -2
- 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/FundingTransaction.d.ts +2 -1
- package/browser/transaction/builders/MultiSignTransaction.d.ts +6 -6
- package/browser/transaction/builders/SharedInteractionTransaction.d.ts +1 -1
- package/browser/transaction/builders/TransactionBuilder.d.ts +6 -7
- 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/transaction/shared/TweakedTransaction.d.ts +8 -7
- 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 +15 -4
- package/build/keypair/AddressVerificator.js +79 -3
- package/build/keypair/EcKeyPair.d.ts +15 -12
- package/build/keypair/EcKeyPair.js +61 -9
- package/build/keypair/Wallet.d.ts +12 -5
- package/build/keypair/Wallet.js +19 -5
- 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/signer/TweakedSigner.d.ts +2 -2
- package/build/signer/TweakedSigner.js +1 -1
- 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/CustomScriptTransaction.js +3 -3
- package/build/transaction/builders/DeploymentTransaction.d.ts +4 -2
- package/build/transaction/builders/DeploymentTransaction.js +10 -6
- package/build/transaction/builders/FundingTransaction.d.ts +2 -1
- package/build/transaction/builders/MultiSignTransaction.d.ts +6 -6
- package/build/transaction/builders/SharedInteractionTransaction.d.ts +1 -1
- package/build/transaction/builders/SharedInteractionTransaction.js +4 -4
- package/build/transaction/builders/TransactionBuilder.d.ts +6 -7
- package/build/transaction/builders/UnwrapSegwitTransaction.js +2 -1
- package/build/transaction/builders/UnwrapTransaction.js +4 -3
- 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/transaction/shared/TweakedTransaction.d.ts +8 -7
- package/build/transaction/shared/TweakedTransaction.js +1 -1
- 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 +4 -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 +149 -6
- package/src/keypair/EcKeyPair.ts +146 -47
- package/src/keypair/Wallet.ts +72 -15
- 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/signer/TweakedSigner.ts +3 -2
- 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 +10 -10
- package/src/transaction/builders/DeploymentTransaction.ts +23 -9
- package/src/transaction/builders/FundingTransaction.ts +2 -1
- package/src/transaction/builders/MultiSignTransaction.ts +10 -7
- package/src/transaction/builders/SharedInteractionTransaction.ts +5 -5
- package/src/transaction/builders/TransactionBuilder.ts +26 -17
- package/src/transaction/builders/UnwrapSegwitTransaction.ts +10 -4
- package/src/transaction/builders/UnwrapTransaction.ts +5 -19
- package/src/transaction/builders/WrapTransaction.ts +7 -13
- 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/transaction/shared/TweakedTransaction.ts +12 -12
- 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,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
|
+
}
|