@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.
Files changed (134) hide show
  1. package/browser/_version.d.ts +1 -1
  2. package/browser/abi/ABICoder.d.ts +31 -0
  3. package/browser/buffer/BinaryReader.d.ts +37 -0
  4. package/browser/buffer/BinaryWriter.d.ts +46 -0
  5. package/browser/deterministic/AddressMap.d.ts +10 -0
  6. package/browser/deterministic/AddressSet.d.ts +13 -0
  7. package/browser/deterministic/DeterministicMap.d.ts +17 -0
  8. package/browser/deterministic/DeterministicSet.d.ts +13 -0
  9. package/browser/deterministic/Map.d.ts +14 -0
  10. package/browser/event/NetEvent.d.ts +5 -0
  11. package/browser/generators/AddressGenerator.d.ts +3 -0
  12. package/browser/index.js +1 -1
  13. package/browser/keypair/Address.d.ts +23 -0
  14. package/browser/keypair/AddressVerificator.d.ts +1 -2
  15. package/browser/keypair/EcKeyPair.d.ts +9 -9
  16. package/browser/keypair/Wallet.d.ts +11 -5
  17. package/browser/metadata/ContractBaseMetadata.d.ts +3 -4
  18. package/browser/metadata/contracts/wBTC.d.ts +2 -3
  19. package/browser/metadata/tokens.d.ts +1 -1
  20. package/browser/opnet.d.ts +11 -0
  21. package/browser/transaction/TransactionFactory.d.ts +6 -6
  22. package/browser/transaction/browser/BrowserSignerBase.d.ts +3 -4
  23. package/browser/transaction/browser/extensions/UnisatSigner.d.ts +3 -4
  24. package/browser/transaction/browser/types/Unisat.d.ts +2 -3
  25. package/browser/transaction/builders/CustomScriptTransaction.d.ts +4 -5
  26. package/browser/transaction/builders/DeploymentTransaction.d.ts +4 -2
  27. package/browser/transaction/builders/MultiSignTransaction.d.ts +4 -5
  28. package/browser/transaction/builders/TransactionBuilder.d.ts +5 -6
  29. package/browser/transaction/builders/WrapTransaction.d.ts +2 -2
  30. package/browser/transaction/interfaces/ITransactionParameters.d.ts +6 -6
  31. package/browser/transaction/processor/PsbtTransaction.d.ts +3 -4
  32. package/browser/transaction/shared/P2TR_MS.d.ts +1 -2
  33. package/browser/utils/BufferHelper.d.ts +11 -0
  34. package/browser/utils/types.d.ts +12 -0
  35. package/browser/utxo/OPNetLimitedProvider.d.ts +1 -2
  36. package/build/_version.d.ts +1 -1
  37. package/build/_version.js +1 -1
  38. package/build/abi/ABICoder.d.ts +31 -0
  39. package/build/abi/ABICoder.js +137 -0
  40. package/build/buffer/BinaryReader.d.ts +37 -0
  41. package/build/buffer/BinaryReader.js +192 -0
  42. package/build/buffer/BinaryWriter.d.ts +46 -0
  43. package/build/buffer/BinaryWriter.js +258 -0
  44. package/build/deterministic/AddressMap.d.ts +10 -0
  45. package/build/deterministic/AddressMap.js +46 -0
  46. package/build/deterministic/AddressSet.d.ts +13 -0
  47. package/build/deterministic/AddressSet.js +44 -0
  48. package/build/deterministic/DeterministicMap.d.ts +17 -0
  49. package/build/deterministic/DeterministicMap.js +83 -0
  50. package/build/deterministic/DeterministicSet.d.ts +13 -0
  51. package/build/deterministic/DeterministicSet.js +46 -0
  52. package/build/deterministic/Map.d.ts +14 -0
  53. package/build/deterministic/Map.js +56 -0
  54. package/build/event/NetEvent.d.ts +5 -0
  55. package/build/event/NetEvent.js +6 -0
  56. package/build/generators/AddressGenerator.d.ts +3 -0
  57. package/build/generators/AddressGenerator.js +8 -1
  58. package/build/keypair/Address.d.ts +23 -0
  59. package/build/keypair/Address.js +129 -0
  60. package/build/keypair/AddressVerificator.d.ts +1 -2
  61. package/build/keypair/AddressVerificator.js +7 -2
  62. package/build/keypair/EcKeyPair.d.ts +9 -9
  63. package/build/keypair/EcKeyPair.js +9 -2
  64. package/build/keypair/Wallet.d.ts +11 -5
  65. package/build/keypair/Wallet.js +14 -1
  66. package/build/metadata/ContractBaseMetadata.d.ts +3 -4
  67. package/build/metadata/contracts/wBTC.d.ts +2 -3
  68. package/build/metadata/contracts/wBTC.js +4 -6
  69. package/build/metadata/tokens.d.ts +1 -1
  70. package/build/metadata/tokens.js +19 -15
  71. package/build/opnet.d.ts +11 -0
  72. package/build/opnet.js +11 -0
  73. package/build/transaction/TransactionFactory.d.ts +6 -6
  74. package/build/transaction/TransactionFactory.js +3 -2
  75. package/build/transaction/browser/BrowserSignerBase.d.ts +3 -4
  76. package/build/transaction/browser/extensions/UnisatSigner.d.ts +3 -4
  77. package/build/transaction/browser/types/Unisat.d.ts +2 -3
  78. package/build/transaction/builders/CustomScriptTransaction.d.ts +4 -5
  79. package/build/transaction/builders/DeploymentTransaction.d.ts +4 -2
  80. package/build/transaction/builders/DeploymentTransaction.js +6 -2
  81. package/build/transaction/builders/MultiSignTransaction.d.ts +4 -5
  82. package/build/transaction/builders/TransactionBuilder.d.ts +5 -6
  83. package/build/transaction/builders/UnwrapSegwitTransaction.js +2 -1
  84. package/build/transaction/builders/UnwrapTransaction.js +2 -1
  85. package/build/transaction/builders/WrapTransaction.d.ts +2 -2
  86. package/build/transaction/builders/WrapTransaction.js +5 -6
  87. package/build/transaction/interfaces/ITransactionParameters.d.ts +6 -6
  88. package/build/transaction/processor/PsbtTransaction.d.ts +3 -4
  89. package/build/transaction/shared/P2TR_MS.d.ts +1 -2
  90. package/build/utils/BufferHelper.d.ts +11 -0
  91. package/build/utils/BufferHelper.js +50 -0
  92. package/build/utils/types.d.ts +12 -0
  93. package/build/utils/types.js +1 -0
  94. package/build/utxo/OPNetLimitedProvider.d.ts +1 -2
  95. package/build/utxo/OPNetLimitedProvider.js +1 -1
  96. package/build/verification/TapscriptVerificator.js +3 -2
  97. package/package.json +3 -2
  98. package/src/_version.ts +1 -1
  99. package/src/abi/ABICoder.ts +158 -0
  100. package/src/buffer/BinaryReader.ts +260 -0
  101. package/src/buffer/BinaryWriter.ts +331 -0
  102. package/src/deterministic/AddressMap.ts +57 -0
  103. package/src/deterministic/AddressSet.ts +62 -0
  104. package/src/deterministic/DeterministicMap.ts +88 -0
  105. package/src/deterministic/DeterministicSet.ts +56 -0
  106. package/src/deterministic/Map.ts +66 -0
  107. package/src/event/NetEvent.ts +6 -0
  108. package/src/generators/AddressGenerator.ts +15 -1
  109. package/src/keypair/Address.ts +235 -0
  110. package/src/keypair/AddressVerificator.ts +9 -5
  111. package/src/keypair/EcKeyPair.ts +39 -37
  112. package/src/keypair/Wallet.ts +61 -12
  113. package/src/metadata/ContractBaseMetadata.ts +3 -4
  114. package/src/metadata/contracts/wBTC.ts +8 -9
  115. package/src/metadata/tokens.ts +21 -16
  116. package/src/opnet.ts +13 -0
  117. package/src/transaction/TransactionFactory.ts +11 -10
  118. package/src/transaction/browser/BrowserSignerBase.ts +3 -4
  119. package/src/transaction/browser/extensions/UnisatSigner.ts +6 -7
  120. package/src/transaction/browser/types/Unisat.ts +2 -3
  121. package/src/transaction/builders/CustomScriptTransaction.ts +4 -5
  122. package/src/transaction/builders/DeploymentTransaction.ts +17 -4
  123. package/src/transaction/builders/MultiSignTransaction.ts +4 -5
  124. package/src/transaction/builders/TransactionBuilder.ts +8 -9
  125. package/src/transaction/builders/UnwrapSegwitTransaction.ts +3 -1
  126. package/src/transaction/builders/UnwrapTransaction.ts +3 -17
  127. package/src/transaction/builders/WrapTransaction.ts +7 -8
  128. package/src/transaction/interfaces/ITransactionParameters.ts +7 -6
  129. package/src/transaction/processor/PsbtTransaction.ts +3 -4
  130. package/src/transaction/shared/P2TR_MS.ts +2 -3
  131. package/src/utils/BufferHelper.ts +71 -0
  132. package/src/utils/types.ts +19 -0
  133. package/src/utxo/OPNetLimitedProvider.ts +3 -8
  134. package/src/verification/TapscriptVerificator.ts +4 -2
@@ -0,0 +1,137 @@
1
+ import shajs from 'sha.js';
2
+ import { BinaryReader } from '../buffer/BinaryReader.js';
3
+ import { BufferHelper } from '../utils/BufferHelper.js';
4
+ export var ABIDataTypes;
5
+ (function (ABIDataTypes) {
6
+ ABIDataTypes["UINT8"] = "UINT8";
7
+ ABIDataTypes["UINT16"] = "UINT16";
8
+ ABIDataTypes["UINT32"] = "UINT32";
9
+ ABIDataTypes["UINT64"] = "UINT64";
10
+ ABIDataTypes["BOOL"] = "BOOL";
11
+ ABIDataTypes["ADDRESS"] = "ADDRESS";
12
+ ABIDataTypes["STRING"] = "STRING";
13
+ ABIDataTypes["BYTES32"] = "BYTES32";
14
+ ABIDataTypes["UINT256"] = "UINT256";
15
+ ABIDataTypes["TUPLE"] = "TUPLE";
16
+ ABIDataTypes["BYTES"] = "BYTES";
17
+ ABIDataTypes["ADDRESS_UINT256_TUPLE"] = "ADDRESS_UINT256_TUPLE";
18
+ ABIDataTypes["ARRAY_OF_ADDRESSES"] = "ARRAY_OF_ADDRESSES";
19
+ ABIDataTypes["ARRAY_OF_UINT256"] = "ARRAY_OF_UINT256";
20
+ ABIDataTypes["ARRAY_OF_UINT64"] = "ARRAY_OF_UINT64";
21
+ ABIDataTypes["ARRAY_OF_UINT32"] = "ARRAY_OF_UINT32";
22
+ ABIDataTypes["ARRAY_OF_UINT16"] = "ARRAY_OF_UINT16";
23
+ ABIDataTypes["ARRAY_OF_UINT8"] = "ARRAY_OF_UINT8";
24
+ ABIDataTypes["ARRAY_OF_STRING"] = "ARRAY_OF_STRING";
25
+ ABIDataTypes["ARRAY_OF_BYTES"] = "ARRAY_OF_BYTES";
26
+ })(ABIDataTypes || (ABIDataTypes = {}));
27
+ export class ABICoder {
28
+ decodeData(data, types) {
29
+ const byteReader = new BinaryReader(data);
30
+ const result = [];
31
+ for (let i = 0; i < types.length; i++) {
32
+ const type = types[i];
33
+ switch (type) {
34
+ case ABIDataTypes.UINT8:
35
+ result.push(byteReader.readU8());
36
+ break;
37
+ case ABIDataTypes.UINT16:
38
+ result.push(byteReader.readU16());
39
+ break;
40
+ case ABIDataTypes.UINT32:
41
+ result.push(byteReader.readU32());
42
+ break;
43
+ case ABIDataTypes.BYTES32:
44
+ result.push(byteReader.readBytes(32));
45
+ break;
46
+ case ABIDataTypes.BOOL:
47
+ result.push(byteReader.readBoolean());
48
+ break;
49
+ case ABIDataTypes.ADDRESS:
50
+ result.push(byteReader.readAddress());
51
+ break;
52
+ case ABIDataTypes.STRING:
53
+ result.push(byteReader.readStringWithLength());
54
+ break;
55
+ case ABIDataTypes.UINT256:
56
+ result.push(byteReader.readU256());
57
+ break;
58
+ case ABIDataTypes.TUPLE:
59
+ result.push(byteReader.readTuple());
60
+ break;
61
+ case ABIDataTypes.ADDRESS_UINT256_TUPLE:
62
+ result.push(byteReader.readAddressValueTuple());
63
+ break;
64
+ case ABIDataTypes.BYTES:
65
+ result.push(byteReader.readBytesWithLength());
66
+ break;
67
+ case ABIDataTypes.UINT64:
68
+ result.push(byteReader.readU64());
69
+ break;
70
+ case ABIDataTypes.ARRAY_OF_ADDRESSES:
71
+ result.push(byteReader.readAddressArray());
72
+ break;
73
+ case ABIDataTypes.ARRAY_OF_UINT256:
74
+ result.push(byteReader.readU256Array());
75
+ break;
76
+ case ABIDataTypes.ARRAY_OF_UINT64:
77
+ result.push(byteReader.readU64Array());
78
+ break;
79
+ case ABIDataTypes.ARRAY_OF_UINT32:
80
+ result.push(byteReader.readU32Array());
81
+ break;
82
+ case ABIDataTypes.ARRAY_OF_UINT16:
83
+ result.push(byteReader.readU16Array());
84
+ break;
85
+ case ABIDataTypes.ARRAY_OF_UINT8:
86
+ result.push(byteReader.readU8Array());
87
+ break;
88
+ case ABIDataTypes.ARRAY_OF_STRING:
89
+ result.push(byteReader.readStringArray());
90
+ break;
91
+ case ABIDataTypes.ARRAY_OF_BYTES:
92
+ result.push(byteReader.readBytesArray());
93
+ }
94
+ }
95
+ return result;
96
+ }
97
+ encodePointer(key) {
98
+ const hash = this.sha256(key);
99
+ const finalBuffer = Buffer.alloc(BufferHelper.EXPECTED_BUFFER_LENGTH);
100
+ const selector = hash.subarray(0, BufferHelper.EXPECTED_BUFFER_LENGTH);
101
+ for (let i = 0; i < BufferHelper.EXPECTED_BUFFER_LENGTH; i++) {
102
+ finalBuffer[i] = selector[i];
103
+ }
104
+ return BigInt('0x' + finalBuffer.toString('hex'));
105
+ }
106
+ encodePointerHash(pointer, sub) {
107
+ const finalBuffer = new Uint8Array(BufferHelper.EXPECTED_BUFFER_LENGTH + 2);
108
+ finalBuffer[0] = pointer & 0xff;
109
+ finalBuffer[1] = (pointer >> 8) & 0xff;
110
+ const subKey = this.bigIntToUint8Array(sub, BufferHelper.EXPECTED_BUFFER_LENGTH);
111
+ finalBuffer.set(subKey, 2);
112
+ const hashed = this.sha256(finalBuffer);
113
+ if (hashed.byteLength !== BufferHelper.EXPECTED_BUFFER_LENGTH) {
114
+ throw new Error('Invalid hash length');
115
+ }
116
+ return hashed;
117
+ }
118
+ encodeSelector(selectorIdentifier) {
119
+ const hash = this.sha256(selectorIdentifier);
120
+ const selector = hash.subarray(0, 4);
121
+ return selector.toString('hex');
122
+ }
123
+ numericSelectorToHex(selector) {
124
+ return selector.toString(16);
125
+ }
126
+ bigIntToUint8Array(bigIntValue, length) {
127
+ const byteArray = new Uint8Array(length);
128
+ const buf = BufferHelper.valueToUint8Array(bigIntValue);
129
+ for (let i = 0; i < length; i++) {
130
+ byteArray[i] = buf[i] || 0;
131
+ }
132
+ return byteArray;
133
+ }
134
+ sha256(buffer) {
135
+ return new shajs.sha256().update(buffer).digest();
136
+ }
137
+ }
@@ -0,0 +1,37 @@
1
+ import { 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
+ export declare class BinaryReader {
5
+ private buffer;
6
+ private currentOffset;
7
+ constructor(bytes: BufferLike);
8
+ static stringCompare(a: string, b: string): number;
9
+ static bigintCompare(a: bigint, b: bigint): number;
10
+ static numberCompare(a: number, b: number): number;
11
+ setBuffer(bytes: BufferLike): void;
12
+ readAddressArray(): Address[];
13
+ readU256Array(): bigint[];
14
+ readU64Array(): bigint[];
15
+ readU32Array(): u32[];
16
+ readU16Array(): u16[];
17
+ readU8Array(): u8[];
18
+ readStringArray(): string[];
19
+ readBytesArray(): Uint8Array[];
20
+ readBytesWithLength(maxLength?: number): Uint8Array;
21
+ readTuple(): bigint[];
22
+ readU8(): u8;
23
+ readU16(): u16;
24
+ readU32(le?: boolean): u32;
25
+ readU64(): bigint;
26
+ readAddressValueTuple(): AddressMap<bigint>;
27
+ readU256(): bigint;
28
+ readBytes(length: u32, zeroStop?: boolean): Uint8Array;
29
+ readString(length: u16): string;
30
+ readSelector(): Selector;
31
+ readStringWithLength(): string;
32
+ readBoolean(): boolean;
33
+ readAddress(): Address;
34
+ getOffset(): u16;
35
+ setOffset(offset: u16): void;
36
+ verifyEnd(size: i32): void;
37
+ }
@@ -0,0 +1,192 @@
1
+ import { ADDRESS_BYTE_LENGTH } from '../utils/types.js';
2
+ import { Address } from '../keypair/Address.js';
3
+ import { AddressMap } from '../deterministic/AddressMap.js';
4
+ export class BinaryReader {
5
+ constructor(bytes) {
6
+ this.currentOffset = 0;
7
+ this.buffer = new DataView(bytes.buffer);
8
+ }
9
+ static stringCompare(a, b) {
10
+ return a.localeCompare(b);
11
+ }
12
+ static bigintCompare(a, b) {
13
+ if (a < b)
14
+ return -1;
15
+ if (a > b)
16
+ return 1;
17
+ return 0;
18
+ }
19
+ static numberCompare(a, b) {
20
+ if (a < b)
21
+ return -1;
22
+ if (a > b)
23
+ return 1;
24
+ return 0;
25
+ }
26
+ setBuffer(bytes) {
27
+ this.buffer = new DataView(bytes.buffer);
28
+ this.currentOffset = 0;
29
+ }
30
+ readAddressArray() {
31
+ const length = this.readU16();
32
+ const result = new Array(length);
33
+ for (let i = 0; i < length; i++) {
34
+ result[i] = this.readAddress();
35
+ }
36
+ return result;
37
+ }
38
+ readU256Array() {
39
+ const length = this.readU16();
40
+ const result = new Array(length);
41
+ for (let i = 0; i < length; i++) {
42
+ result[i] = this.readU256();
43
+ }
44
+ return result;
45
+ }
46
+ readU64Array() {
47
+ const length = this.readU16();
48
+ const result = new Array(length);
49
+ for (let i = 0; i < length; i++) {
50
+ result[i] = this.readU64();
51
+ }
52
+ return result;
53
+ }
54
+ readU32Array() {
55
+ const length = this.readU16();
56
+ const result = new Array(length);
57
+ for (let i = 0; i < length; i++) {
58
+ result[i] = this.readU32();
59
+ }
60
+ return result;
61
+ }
62
+ readU16Array() {
63
+ const length = this.readU16();
64
+ const result = new Array(length);
65
+ for (let i = 0; i < length; i++) {
66
+ result[i] = this.readU16();
67
+ }
68
+ return result;
69
+ }
70
+ readU8Array() {
71
+ const length = this.readU16();
72
+ const result = new Array(length);
73
+ for (let i = 0; i < length; i++) {
74
+ result[i] = this.readU8();
75
+ }
76
+ return result;
77
+ }
78
+ readStringArray() {
79
+ const length = this.readU16();
80
+ const result = new Array(length);
81
+ for (let i = 0; i < length; i++) {
82
+ result[i] = this.readStringWithLength();
83
+ }
84
+ return result;
85
+ }
86
+ readBytesArray() {
87
+ const length = this.readU16();
88
+ const result = new Array(length);
89
+ for (let i = 0; i < length; i++) {
90
+ result[i] = this.readBytesWithLength();
91
+ }
92
+ return result;
93
+ }
94
+ readBytesWithLength(maxLength = 0) {
95
+ const length = this.readU32();
96
+ if (maxLength > 0 && length > maxLength) {
97
+ throw new Error('Data length exceeds maximum length.');
98
+ }
99
+ return this.readBytes(length);
100
+ }
101
+ readTuple() {
102
+ const length = this.readU32();
103
+ const result = new Array(length);
104
+ for (let i = 0; i < length; i++) {
105
+ result[i] = this.readU256();
106
+ }
107
+ return result;
108
+ }
109
+ readU8() {
110
+ this.verifyEnd(this.currentOffset + 1);
111
+ return this.buffer.getUint8(this.currentOffset++);
112
+ }
113
+ readU16() {
114
+ this.verifyEnd(this.currentOffset + 2);
115
+ const value = this.buffer.getUint16(this.currentOffset, true);
116
+ this.currentOffset += 2;
117
+ return value;
118
+ }
119
+ readU32(le = true) {
120
+ this.verifyEnd(this.currentOffset + 4);
121
+ const value = this.buffer.getUint32(this.currentOffset, le);
122
+ this.currentOffset += 4;
123
+ return value;
124
+ }
125
+ readU64() {
126
+ this.verifyEnd(this.currentOffset + 8);
127
+ const value = this.buffer.getBigUint64(this.currentOffset, true);
128
+ this.currentOffset += 8;
129
+ return value;
130
+ }
131
+ readAddressValueTuple() {
132
+ const length = this.readU16();
133
+ const result = new AddressMap();
134
+ for (let i = 0; i < length; i++) {
135
+ const address = this.readAddress();
136
+ const value = this.readU256();
137
+ if (result.has(address))
138
+ throw new Error('Duplicate address found in map');
139
+ result.set(address, value);
140
+ }
141
+ return result;
142
+ }
143
+ readU256() {
144
+ const next32Bytes = this.readBytes(32);
145
+ return BigInt('0x' + next32Bytes.reduce((acc, byte) => acc + byte.toString(16).padStart(2, '0'), ''));
146
+ }
147
+ readBytes(length, zeroStop = false) {
148
+ let bytes = new Uint8Array(length);
149
+ for (let i = 0; i < length; i++) {
150
+ const byte = this.readU8();
151
+ if (zeroStop && byte === 0) {
152
+ bytes = bytes.slice(0, i);
153
+ break;
154
+ }
155
+ bytes[i] = byte;
156
+ }
157
+ return bytes;
158
+ }
159
+ readString(length) {
160
+ const textDecoder = new TextDecoder();
161
+ const bytes = this.readBytes(length, true);
162
+ return textDecoder.decode(bytes);
163
+ }
164
+ readSelector() {
165
+ return this.readU32(false);
166
+ }
167
+ readStringWithLength() {
168
+ const length = this.readU16();
169
+ return this.readString(length);
170
+ }
171
+ readBoolean() {
172
+ return this.readU8() !== 0;
173
+ }
174
+ readAddress() {
175
+ const bytes = new Array(ADDRESS_BYTE_LENGTH);
176
+ for (let i = 0; i < ADDRESS_BYTE_LENGTH; i++) {
177
+ bytes[i] = this.readU8();
178
+ }
179
+ return new Address(bytes);
180
+ }
181
+ getOffset() {
182
+ return this.currentOffset;
183
+ }
184
+ setOffset(offset) {
185
+ this.currentOffset = offset;
186
+ }
187
+ verifyEnd(size) {
188
+ if (this.currentOffset > this.buffer.byteLength) {
189
+ throw new Error(`Expected to read ${size} bytes but read ${this.currentOffset} bytes`);
190
+ }
191
+ }
192
+ }
@@ -0,0 +1,46 @@
1
+ import { Selector, u16, u32, u64, u8 } from '../utils/types.js';
2
+ import { Address } from '../keypair/Address.js';
3
+ import { BinaryReader } from './BinaryReader.js';
4
+ import { AddressMap } from '../deterministic/AddressMap.js';
5
+ export declare class BinaryWriter {
6
+ private currentOffset;
7
+ private buffer;
8
+ constructor(length?: number);
9
+ writeU8(value: u8): void;
10
+ writeU16(value: u16): void;
11
+ writeU32(value: u32, le?: boolean): void;
12
+ writeU64(value: u64): void;
13
+ writeSelector(value: Selector): void;
14
+ writeBoolean(value: boolean): void;
15
+ writeU256(bigIntValue: bigint): void;
16
+ writeBytes(value: Uint8Array | Buffer): void;
17
+ writeString(value: string): void;
18
+ writeAddress(value: Address): void;
19
+ writeStringWithLength(value: string): void;
20
+ getBuffer(clear?: boolean): Uint8Array;
21
+ reset(): void;
22
+ writeTuple(values: bigint[]): void;
23
+ toBytesReader(): BinaryReader;
24
+ getOffset(): u32;
25
+ setOffset(offset: u32): void;
26
+ clear(): void;
27
+ allocSafe(size: u32): void;
28
+ writeABISelector(name: string, selector: Selector): void;
29
+ writeAddressValueTupleMap(map: AddressMap<bigint>): void;
30
+ writeLimitedAddressBytesMap(map: AddressMap<Uint8Array[]>): void;
31
+ writeBytesWithLength(value: Uint8Array): void;
32
+ writeAddressArray(value: Address[]): void;
33
+ writeU32Array(value: u32[]): void;
34
+ writeU256Array(value: bigint[]): void;
35
+ writeStringArray(value: string[]): void;
36
+ writeU16Array(value: u16[]): void;
37
+ writeU8Array(value: u8[]): void;
38
+ writeU64Array(value: bigint[]): void;
39
+ writeBytesArray(value: Uint8Array[]): void;
40
+ writeSelectorArray(value: Selector[]): void;
41
+ private getChecksum;
42
+ private writeMethodSelectorMap;
43
+ private fromAddress;
44
+ private resize;
45
+ private getDefaultBuffer;
46
+ }
@@ -0,0 +1,258 @@
1
+ import { BufferHelper } from '../utils/BufferHelper.js';
2
+ import { ADDRESS_BYTE_LENGTH } from '../utils/types.js';
3
+ import { BinaryReader } from './BinaryReader.js';
4
+ export class BinaryWriter {
5
+ constructor(length = 0) {
6
+ this.currentOffset = 0;
7
+ this.buffer = this.getDefaultBuffer(length);
8
+ }
9
+ writeU8(value) {
10
+ if (value > 255)
11
+ throw new Error('Value is too large.');
12
+ this.allocSafe(1);
13
+ this.buffer.setUint8(this.currentOffset++, value);
14
+ }
15
+ writeU16(value) {
16
+ if (value > 65535)
17
+ throw new Error('Value is too large.');
18
+ this.allocSafe(2);
19
+ this.buffer.setUint16(this.currentOffset, value, true);
20
+ this.currentOffset += 2;
21
+ }
22
+ writeU32(value, le = true) {
23
+ if (value > 4294967295)
24
+ throw new Error('Value is too large.');
25
+ this.allocSafe(4);
26
+ this.buffer.setUint32(this.currentOffset, value, le);
27
+ this.currentOffset += 4;
28
+ }
29
+ writeU64(value) {
30
+ if (value > 18446744073709551615n)
31
+ throw new Error('Value is too large.');
32
+ this.allocSafe(8);
33
+ this.buffer.setBigUint64(this.currentOffset, value, true);
34
+ this.currentOffset += 8;
35
+ }
36
+ writeSelector(value) {
37
+ this.writeU32(value, false);
38
+ }
39
+ writeBoolean(value) {
40
+ this.writeU8(value ? 1 : 0);
41
+ }
42
+ writeU256(bigIntValue) {
43
+ if (bigIntValue >
44
+ 115792089237316195423570985008687907853269984665640564039457584007913129639935n) {
45
+ throw new Error('Value is too large.');
46
+ }
47
+ this.allocSafe(32);
48
+ const bytesToHex = BufferHelper.valueToUint8Array(bigIntValue);
49
+ if (bytesToHex.byteLength !== 32) {
50
+ console.log('Invalid u256 value:', bytesToHex);
51
+ throw new Error(`Invalid u256 value: ${bigIntValue}`);
52
+ }
53
+ for (let i = 0; i < bytesToHex.byteLength; i++) {
54
+ this.writeU8(bytesToHex[i]);
55
+ }
56
+ }
57
+ writeBytes(value) {
58
+ this.allocSafe(value.byteLength);
59
+ for (let i = 0; i < value.byteLength; i++) {
60
+ this.writeU8(value[i]);
61
+ }
62
+ }
63
+ writeString(value) {
64
+ this.allocSafe(value.length);
65
+ for (let i = 0; i < value.length; i++) {
66
+ this.writeU8(value.charCodeAt(i));
67
+ }
68
+ }
69
+ writeAddress(value) {
70
+ const bytes = this.fromAddress(value);
71
+ this.writeBytes(bytes);
72
+ }
73
+ writeStringWithLength(value) {
74
+ this.allocSafe(value.length + 2);
75
+ this.writeU16(value.length);
76
+ this.writeString(value);
77
+ }
78
+ getBuffer(clear = true) {
79
+ const buf = new Uint8Array(this.buffer.byteLength);
80
+ for (let i = 0; i < this.buffer.byteLength; i++) {
81
+ buf[i] = this.buffer.getUint8(i);
82
+ }
83
+ if (clear)
84
+ this.clear();
85
+ return buf;
86
+ }
87
+ reset() {
88
+ this.currentOffset = 0;
89
+ this.buffer = this.getDefaultBuffer(4);
90
+ }
91
+ writeTuple(values) {
92
+ this.allocSafe(4 + values.length * 32);
93
+ this.writeU32(values.length);
94
+ for (let i = 0; i < values.length; i++) {
95
+ this.writeU256(values[i]);
96
+ }
97
+ }
98
+ toBytesReader() {
99
+ return new BinaryReader(this.getBuffer());
100
+ }
101
+ getOffset() {
102
+ return this.currentOffset;
103
+ }
104
+ setOffset(offset) {
105
+ this.currentOffset = offset;
106
+ }
107
+ clear() {
108
+ this.currentOffset = 0;
109
+ this.buffer = this.getDefaultBuffer();
110
+ }
111
+ allocSafe(size) {
112
+ if (this.currentOffset + size > this.buffer.byteLength) {
113
+ this.resize(size);
114
+ }
115
+ }
116
+ writeABISelector(name, selector) {
117
+ this.writeStringWithLength(name);
118
+ this.writeSelector(selector);
119
+ }
120
+ writeAddressValueTupleMap(map) {
121
+ if (map.size > 65535)
122
+ throw new Error('Map size is too large');
123
+ this.writeU16(map.size);
124
+ const keys = Array.from(map.keys());
125
+ for (let i = 0; i < keys.length; i++) {
126
+ const key = keys[i];
127
+ const value = map.get(key);
128
+ if (value === null || value === undefined)
129
+ throw new Error('Value not found');
130
+ this.writeAddress(key);
131
+ this.writeU256(value);
132
+ }
133
+ }
134
+ writeLimitedAddressBytesMap(map) {
135
+ if (map.size > 8)
136
+ throw new Error('Too many contract calls');
137
+ this.writeU8(map.size);
138
+ const keys = Array.from(map.keys());
139
+ for (let i = 0; i < keys.length; i++) {
140
+ const address = keys[i];
141
+ const calls = map.get(address);
142
+ if (!calls)
143
+ throw new Error('Calls not found');
144
+ if (calls.length > 10)
145
+ throw new Error('Too many calls.');
146
+ this.writeAddress(address);
147
+ this.writeU8(calls.length);
148
+ for (let j = 0; j < calls.length; j++) {
149
+ this.writeBytesWithLength(calls[j]);
150
+ }
151
+ }
152
+ }
153
+ writeBytesWithLength(value) {
154
+ this.writeU32(value.length);
155
+ this.writeBytes(value);
156
+ }
157
+ writeAddressArray(value) {
158
+ if (value.length > 65535)
159
+ throw new Error('Array size is too large');
160
+ this.writeU16(value.length);
161
+ for (let i = 0; i < value.length; i++) {
162
+ this.writeAddress(value[i]);
163
+ }
164
+ }
165
+ writeU32Array(value) {
166
+ if (value.length > 65535)
167
+ throw new Error('Array size is too large');
168
+ this.writeU16(value.length);
169
+ for (let i = 0; i < value.length; i++) {
170
+ this.writeU32(value[i]);
171
+ }
172
+ }
173
+ writeU256Array(value) {
174
+ if (value.length > 65535)
175
+ throw new Error('Array size is too large');
176
+ this.writeU16(value.length);
177
+ for (let i = 0; i < value.length; i++) {
178
+ this.writeU256(value[i]);
179
+ }
180
+ }
181
+ writeStringArray(value) {
182
+ if (value.length > 65535)
183
+ throw new Error('Array size is too large');
184
+ this.writeU16(value.length);
185
+ for (let i = 0; i < value.length; i++) {
186
+ this.writeStringWithLength(value[i]);
187
+ }
188
+ }
189
+ writeU16Array(value) {
190
+ if (value.length > 65535)
191
+ throw new Error('Array size is too large');
192
+ this.writeU16(value.length);
193
+ for (let i = 0; i < value.length; i++) {
194
+ this.writeU16(value[i]);
195
+ }
196
+ }
197
+ writeU8Array(value) {
198
+ if (value.length > 65535)
199
+ throw new Error('Array size is too large');
200
+ this.writeU16(value.length);
201
+ for (let i = 0; i < value.length; i++) {
202
+ this.writeU8(value[i]);
203
+ }
204
+ }
205
+ writeU64Array(value) {
206
+ if (value.length > 65535)
207
+ throw new Error('Array size is too large');
208
+ this.writeU16(value.length);
209
+ for (let i = 0; i < value.length; i++) {
210
+ this.writeU64(value[i]);
211
+ }
212
+ }
213
+ writeBytesArray(value) {
214
+ if (value.length > 65535)
215
+ throw new Error('Array size is too large');
216
+ this.writeU16(value.length);
217
+ for (let i = 0; i < value.length; i++) {
218
+ this.writeBytesWithLength(value[i]);
219
+ }
220
+ }
221
+ writeSelectorArray(value) {
222
+ if (value.length > 65535)
223
+ throw new Error('Array size is too large');
224
+ this.writeU16(value.length);
225
+ for (let i = 0; i < value.length; i++) {
226
+ this.writeSelector(value[i]);
227
+ }
228
+ }
229
+ getChecksum() {
230
+ let checksum = 0;
231
+ for (let i = 0; i < this.buffer.byteLength; i++) {
232
+ checksum += this.buffer.getUint8(i);
233
+ }
234
+ return checksum % 2 ** 32;
235
+ }
236
+ writeMethodSelectorMap(value) {
237
+ this.writeU16(value.size);
238
+ value.forEach((selector, _value, _set) => {
239
+ this.writeSelector(selector);
240
+ });
241
+ }
242
+ fromAddress(pubKey) {
243
+ if (pubKey.byteLength > ADDRESS_BYTE_LENGTH) {
244
+ throw new Error(`Address is too long ${pubKey.byteLength} > ${ADDRESS_BYTE_LENGTH} bytes`);
245
+ }
246
+ return pubKey;
247
+ }
248
+ resize(size) {
249
+ const buf = new Uint8Array(this.buffer.byteLength + size);
250
+ for (let i = 0; i < this.buffer.byteLength; i++) {
251
+ buf[i] = this.buffer.getUint8(i);
252
+ }
253
+ this.buffer = new DataView(buf.buffer);
254
+ }
255
+ getDefaultBuffer(length = 0) {
256
+ return new DataView(new ArrayBuffer(length));
257
+ }
258
+ }
@@ -0,0 +1,10 @@
1
+ import { i32 } from '../utils/types.js';
2
+ import { Address } from '../keypair/Address.js';
3
+ import { Map } from './Map.js';
4
+ export declare class AddressMap<V> extends Map<Address, V> {
5
+ set(key: Address, value: V): void;
6
+ indexOf(address: Address): i32;
7
+ has(key: Address): boolean;
8
+ get(key: Address): V;
9
+ delete(key: Address): boolean;
10
+ }