@txnod/sdk 1.0.1
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/AGENTS.md +29 -0
- package/CHANGELOG.md +22 -0
- package/LICENSE +21 -0
- package/README.md +434 -0
- package/dist/_shared/index.d.ts +68 -0
- package/dist/client-sandbox.d.ts +396 -0
- package/dist/client-sandbox.d.ts.map +1 -0
- package/dist/client-sandbox.js +448 -0
- package/dist/client-sandbox.js.map +1 -0
- package/dist/client.d.ts +429 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +588 -0
- package/dist/client.js.map +1 -0
- package/dist/env.d.ts +29 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +44 -0
- package/dist/env.js.map +1 -0
- package/dist/errors.d.ts +1887 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +2107 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/internals/error-ctor-map.d.ts +11 -0
- package/dist/internals/error-ctor-map.d.ts.map +1 -0
- package/dist/internals/error-ctor-map.js +75 -0
- package/dist/internals/error-ctor-map.js.map +1 -0
- package/dist/internals/fetch-with-retry.d.ts +34 -0
- package/dist/internals/fetch-with-retry.d.ts.map +1 -0
- package/dist/internals/fetch-with-retry.js +233 -0
- package/dist/internals/fetch-with-retry.js.map +1 -0
- package/dist/internals/hmac.d.ts +2 -0
- package/dist/internals/hmac.d.ts.map +1 -0
- package/dist/internals/hmac.js +10 -0
- package/dist/internals/hmac.js.map +1 -0
- package/dist/internals/logger.d.ts +9 -0
- package/dist/internals/logger.d.ts.map +1 -0
- package/dist/internals/logger.js +16 -0
- package/dist/internals/logger.js.map +1 -0
- package/dist/internals/parse-problem-details.d.ts +3 -0
- package/dist/internals/parse-problem-details.d.ts.map +1 -0
- package/dist/internals/parse-problem-details.js +76 -0
- package/dist/internals/parse-problem-details.js.map +1 -0
- package/dist/internals/synthetic-details.d.ts +12 -0
- package/dist/internals/synthetic-details.d.ts.map +1 -0
- package/dist/internals/synthetic-details.js +19 -0
- package/dist/internals/synthetic-details.js.map +1 -0
- package/dist/verify/chains/bsc.d.ts +17 -0
- package/dist/verify/chains/bsc.d.ts.map +1 -0
- package/dist/verify/chains/bsc.js +15 -0
- package/dist/verify/chains/bsc.js.map +1 -0
- package/dist/verify/chains/btc.d.ts +22 -0
- package/dist/verify/chains/btc.d.ts.map +1 -0
- package/dist/verify/chains/btc.js +55 -0
- package/dist/verify/chains/btc.js.map +1 -0
- package/dist/verify/chains/cardano.d.ts +73 -0
- package/dist/verify/chains/cardano.d.ts.map +1 -0
- package/dist/verify/chains/cardano.js +175 -0
- package/dist/verify/chains/cardano.js.map +1 -0
- package/dist/verify/chains/evm.d.ts +21 -0
- package/dist/verify/chains/evm.d.ts.map +1 -0
- package/dist/verify/chains/evm.js +46 -0
- package/dist/verify/chains/evm.js.map +1 -0
- package/dist/verify/chains/polygon.d.ts +17 -0
- package/dist/verify/chains/polygon.d.ts.map +1 -0
- package/dist/verify/chains/polygon.js +15 -0
- package/dist/verify/chains/polygon.js.map +1 -0
- package/dist/verify/chains/secp256k1-bip32.d.ts +20 -0
- package/dist/verify/chains/secp256k1-bip32.d.ts.map +1 -0
- package/dist/verify/chains/secp256k1-bip32.js +88 -0
- package/dist/verify/chains/secp256k1-bip32.js.map +1 -0
- package/dist/verify/chains/ton-cell.d.ts +179 -0
- package/dist/verify/chains/ton-cell.d.ts.map +1 -0
- package/dist/verify/chains/ton-cell.js +614 -0
- package/dist/verify/chains/ton-cell.js.map +1 -0
- package/dist/verify/chains/ton.d.ts +84 -0
- package/dist/verify/chains/ton.d.ts.map +1 -0
- package/dist/verify/chains/ton.js +131 -0
- package/dist/verify/chains/ton.js.map +1 -0
- package/dist/verify/chains/tron.d.ts +21 -0
- package/dist/verify/chains/tron.d.ts.map +1 -0
- package/dist/verify/chains/tron.js +42 -0
- package/dist/verify/chains/tron.js.map +1 -0
- package/dist/verify/config.d.ts +41 -0
- package/dist/verify/config.d.ts.map +1 -0
- package/dist/verify/config.js +120 -0
- package/dist/verify/config.js.map +1 -0
- package/dist/verify/errors.d.ts +56 -0
- package/dist/verify/errors.d.ts.map +1 -0
- package/dist/verify/errors.js +58 -0
- package/dist/verify/errors.js.map +1 -0
- package/dist/verify/index.d.ts +119 -0
- package/dist/verify/index.d.ts.map +1 -0
- package/dist/verify/index.js +166 -0
- package/dist/verify/index.js.map +1 -0
- package/dist/verify/xpub-safety.d.ts +33 -0
- package/dist/verify/xpub-safety.d.ts.map +1 -0
- package/dist/verify/xpub-safety.js +54 -0
- package/dist/verify/xpub-safety.js.map +1 -0
- package/dist/verify-webhook-signature.d.ts +30 -0
- package/dist/verify-webhook-signature.d.ts.map +1 -0
- package/dist/verify-webhook-signature.js +84 -0
- package/dist/verify-webhook-signature.js.map +1 -0
- package/docs/00-getting-started.md +135 -0
- package/docs/01-authentication.md +114 -0
- package/docs/02-invoices.md +216 -0
- package/docs/03-rates-and-quotes.md +82 -0
- package/docs/04-webhooks.md +126 -0
- package/docs/05-errors.md +199 -0
- package/docs/05-sandbox.md +159 -0
- package/docs/06-idempotency.md +132 -0
- package/docs/examples/express-webhook-receiver.md +97 -0
- package/docs/examples/nextjs-route-handler.md +206 -0
- package/docs/examples/sandbox-vitest-suite.md +263 -0
- package/docs/index.md +66 -0
- package/docs/reference/client.md +392 -0
- package/docs/reference/errors.md +161 -0
- package/docs/reference/types.md +400 -0
- package/package.json +53 -0
|
@@ -0,0 +1,614 @@
|
|
|
1
|
+
// SDK-side second copy of `packages/shared/src/chains/ton-cell.ts` — kept
|
|
2
|
+
// SDK-self-contained per CLAUDE.md "Package boundaries" (no runtime import
|
|
3
|
+
// from `@txnod/shared`). Byte-for-byte parity with the shared copy is
|
|
4
|
+
// asserted in the co-located cell-parity test (`ton.test.ts`).
|
|
5
|
+
//
|
|
6
|
+
// Vendored TON Cell + Address + beginCell core, narrowed to the
|
|
7
|
+
// address-derivation write path. Pure functions, no class hierarchies, no
|
|
8
|
+
// runtime dependency on `@ton/core`. The full upstream library is dragged in
|
|
9
|
+
// only as a `devDependency` for parity tests.
|
|
10
|
+
//
|
|
11
|
+
// Upstream provenance recorded inline on each export via `@source` tags:
|
|
12
|
+
// `@ton/core@0.63.1` (resolved 2026-04-29 via `npm view @ton/core version`)
|
|
13
|
+
// commit (latest tag): https://github.com/ton-org/ton-core
|
|
14
|
+
//
|
|
15
|
+
// References:
|
|
16
|
+
// - TEP-0002 (address byte layout, CRC-16/XMODEM checksum):
|
|
17
|
+
// https://github.com/ton-blockchain/TEPs/blob/master/text/0002-address.md
|
|
18
|
+
// - TON Docs — Cells (representation hash): https://docs.ton.org/v3/concepts/dive-into-ton/ton-blockchain/cells
|
|
19
|
+
// - TON Docs — Cell BoC: https://docs.ton.org/v3/documentation/data-formats/tlb/cell-boc
|
|
20
|
+
// - reveng CRC catalogue (XMODEM verified): https://reveng.sourceforge.io/crc-catalogue/16.htm
|
|
21
|
+
import { sha256 } from '@noble/hashes/sha2.js';
|
|
22
|
+
import { base64 } from '@scure/base';
|
|
23
|
+
const BOUNCEABLE_TAG = 0x11;
|
|
24
|
+
const NON_BOUNCEABLE_TAG = 0x51;
|
|
25
|
+
const TEST_FLAG = 0x80;
|
|
26
|
+
function hexToBytes(hex) {
|
|
27
|
+
const clean = hex.startsWith('0x') ? hex.slice(2) : hex;
|
|
28
|
+
if (clean.length % 2 !== 0)
|
|
29
|
+
throw new Error(`hex length is odd: ${clean.length}`);
|
|
30
|
+
const out = new Uint8Array(clean.length / 2);
|
|
31
|
+
for (let i = 0; i < out.length; i++) {
|
|
32
|
+
const b = parseInt(clean.slice(i * 2, i * 2 + 2), 16);
|
|
33
|
+
if (Number.isNaN(b))
|
|
34
|
+
throw new Error(`invalid hex byte at offset ${i * 2}`);
|
|
35
|
+
out[i] = b;
|
|
36
|
+
}
|
|
37
|
+
return out;
|
|
38
|
+
}
|
|
39
|
+
function bytesToHex(bytes) {
|
|
40
|
+
let s = '';
|
|
41
|
+
for (const b of bytes)
|
|
42
|
+
s += b.toString(16).padStart(2, '0');
|
|
43
|
+
return s;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* CRC-16/XMODEM (`poly=0x1021, init=0x0000, refIn=false, refOut=false,
|
|
47
|
+
* xorOut=0x0000`) over `data || 0x0000`. Returns the 2 CRC bytes (high then low).
|
|
48
|
+
*
|
|
49
|
+
* @source github.com/ton-org/ton-core/src/utils/crc16.ts (vendored bit-for-bit;
|
|
50
|
+
* reveng CRC catalogue cross-checked).
|
|
51
|
+
*/
|
|
52
|
+
function crc16Xmodem(data) {
|
|
53
|
+
const POLY = 0x1021;
|
|
54
|
+
let reg = 0;
|
|
55
|
+
const message = new Uint8Array(data.length + 2);
|
|
56
|
+
message.set(data);
|
|
57
|
+
for (const byte of message) {
|
|
58
|
+
let mask = 0x80;
|
|
59
|
+
while (mask > 0) {
|
|
60
|
+
reg <<= 1;
|
|
61
|
+
if (byte & mask)
|
|
62
|
+
reg += 1;
|
|
63
|
+
mask >>= 1;
|
|
64
|
+
if (reg > 0xffff) {
|
|
65
|
+
reg &= 0xffff;
|
|
66
|
+
reg ^= POLY;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return new Uint8Array([(reg >> 8) & 0xff, reg & 0xff]);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Parse either raw `<workchain>:<hex64>` or user-friendly base64/base64url
|
|
74
|
+
* (EQ/UQ/kQ/0Q…) into a normalised account record.
|
|
75
|
+
*
|
|
76
|
+
* @source github.com/ton-org/ton-core/src/address/Address.ts — `parseRaw` /
|
|
77
|
+
* `parseFriendly` semantics; rejects malformed input via plain `Error`.
|
|
78
|
+
*/
|
|
79
|
+
export function parseAddress(input) {
|
|
80
|
+
if (input.includes(':')) {
|
|
81
|
+
const [wcStr, hashStr] = input.split(':');
|
|
82
|
+
if (!wcStr || !/^-?\d+$/.test(wcStr)) {
|
|
83
|
+
throw new Error(`parseAddress: invalid workchain in raw form: ${input}`);
|
|
84
|
+
}
|
|
85
|
+
if (!hashStr || hashStr.length !== 64 || !/^[a-fA-F0-9]+$/.test(hashStr)) {
|
|
86
|
+
throw new Error(`parseAddress: invalid hash in raw form: ${input}`);
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
workchain: parseInt(wcStr, 10),
|
|
90
|
+
hex: hashStr.toLowerCase(),
|
|
91
|
+
bounceable: true,
|
|
92
|
+
testOnly: false,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
if (input.length !== 48) {
|
|
96
|
+
throw new Error(`parseAddress: friendly form must be 48 chars, got ${input.length}`);
|
|
97
|
+
}
|
|
98
|
+
if (!/^[A-Za-z0-9+/_-]+$/.test(input)) {
|
|
99
|
+
throw new Error(`parseAddress: invalid base64 characters: ${input}`);
|
|
100
|
+
}
|
|
101
|
+
const standardised = input.replace(/-/g, '+').replace(/_/g, '/');
|
|
102
|
+
let raw;
|
|
103
|
+
try {
|
|
104
|
+
raw = base64.decode(standardised);
|
|
105
|
+
}
|
|
106
|
+
catch (e) {
|
|
107
|
+
throw new Error(`parseAddress: base64 decode failed: ${e.message}`, {
|
|
108
|
+
cause: e,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
if (raw.length !== 36) {
|
|
112
|
+
throw new Error(`parseAddress: expected 36 bytes, got ${raw.length}`);
|
|
113
|
+
}
|
|
114
|
+
const addrBody = raw.subarray(0, 34);
|
|
115
|
+
const crc = raw.subarray(34, 36);
|
|
116
|
+
const expectedCrc = crc16Xmodem(addrBody);
|
|
117
|
+
if (crc[0] !== expectedCrc[0] || crc[1] !== expectedCrc[1]) {
|
|
118
|
+
throw new Error(`parseAddress: CRC checksum mismatch`);
|
|
119
|
+
}
|
|
120
|
+
let tag = addrBody[0];
|
|
121
|
+
let testOnly = false;
|
|
122
|
+
if (tag & TEST_FLAG) {
|
|
123
|
+
testOnly = true;
|
|
124
|
+
tag ^= TEST_FLAG;
|
|
125
|
+
}
|
|
126
|
+
if (tag !== BOUNCEABLE_TAG && tag !== NON_BOUNCEABLE_TAG) {
|
|
127
|
+
throw new Error(`parseAddress: unknown address tag 0x${tag.toString(16)}`);
|
|
128
|
+
}
|
|
129
|
+
const bounceable = tag === BOUNCEABLE_TAG;
|
|
130
|
+
// Workchain is signed int8: 0xff → -1 (masterchain), 0x00 → 0 (basechain).
|
|
131
|
+
const wcByte = addrBody[1];
|
|
132
|
+
const workchain = wcByte === 0xff ? -1 : wcByte;
|
|
133
|
+
const hex = bytesToHex(addrBody.subarray(2, 34));
|
|
134
|
+
return { workchain, hex, bounceable, testOnly };
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Encode a parsed account in user-friendly base64url form. Tag byte is
|
|
138
|
+
* `0x11` (bounceable) / `0x51` (non-bounceable), OR'd with `0x80` for testnet.
|
|
139
|
+
*
|
|
140
|
+
* @source github.com/ton-org/ton-core/src/address/Address.ts — `toString`
|
|
141
|
+
* with `urlSafe: true`.
|
|
142
|
+
*/
|
|
143
|
+
export function serializeAddressUserFriendly(parts, opts) {
|
|
144
|
+
const hash = hexToBytes(parts.hex);
|
|
145
|
+
if (hash.length !== 32) {
|
|
146
|
+
throw new Error(`serializeAddressUserFriendly: hash must be 32 bytes`);
|
|
147
|
+
}
|
|
148
|
+
let tag = opts.bounceable ? BOUNCEABLE_TAG : NON_BOUNCEABLE_TAG;
|
|
149
|
+
if (opts.testOnly)
|
|
150
|
+
tag |= TEST_FLAG;
|
|
151
|
+
const addr = new Uint8Array(34);
|
|
152
|
+
addr[0] = tag;
|
|
153
|
+
addr[1] = parts.workchain & 0xff;
|
|
154
|
+
addr.set(hash, 2);
|
|
155
|
+
const crc = crc16Xmodem(addr);
|
|
156
|
+
const full = new Uint8Array(36);
|
|
157
|
+
full.set(addr);
|
|
158
|
+
full.set(crc, 34);
|
|
159
|
+
return base64.encode(full).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
|
|
160
|
+
}
|
|
161
|
+
/** Lowercase `<workchain>:<hex64>` raw form. */
|
|
162
|
+
export function serializeAddressRaw(parts) {
|
|
163
|
+
return `${parts.workchain}:${parts.hex.toLowerCase()}`;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Parse-then-compare on raw form. EQ… / UQ… / kQ… / 0Q… all collapse to the
|
|
167
|
+
* same `(workchain, hex)` tuple per AR-TON-4 + research §4.9.4.
|
|
168
|
+
*/
|
|
169
|
+
export function addressEquals(a, b) {
|
|
170
|
+
const pa = parseAddress(a);
|
|
171
|
+
const pb = parseAddress(b);
|
|
172
|
+
return pa.workchain === pb.workchain && pa.hex === pb.hex;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* @source github.com/ton-org/ton-core/src/boc/Builder.ts — `beginCell()` /
|
|
176
|
+
* `Builder` write-side primitives only.
|
|
177
|
+
*/
|
|
178
|
+
export function beginCell() {
|
|
179
|
+
const state = {
|
|
180
|
+
bits: new Uint8Array(128), // 1023 bits → 128 bytes max
|
|
181
|
+
bitLen: 0,
|
|
182
|
+
refs: [],
|
|
183
|
+
};
|
|
184
|
+
function writeBit(value) {
|
|
185
|
+
if (state.bitLen >= 1023)
|
|
186
|
+
throw new Error('CellBuilder overflow');
|
|
187
|
+
const bit = typeof value === 'boolean' ? (value ? 1 : 0) : value & 1;
|
|
188
|
+
if (bit) {
|
|
189
|
+
state.bits[state.bitLen >> 3] |= 1 << (7 - (state.bitLen & 7));
|
|
190
|
+
}
|
|
191
|
+
state.bitLen++;
|
|
192
|
+
}
|
|
193
|
+
function writeUint(value, bits) {
|
|
194
|
+
if (bits < 0 || !Number.isSafeInteger(bits)) {
|
|
195
|
+
throw new Error(`writeUint: invalid bits ${bits}`);
|
|
196
|
+
}
|
|
197
|
+
if (bits === 0) {
|
|
198
|
+
if (BigInt(value) !== 0n)
|
|
199
|
+
throw new Error(`writeUint: value not zero for 0 bits`);
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
const v = BigInt(value);
|
|
203
|
+
const limit = 1n << BigInt(bits);
|
|
204
|
+
if (v < 0n || v >= limit) {
|
|
205
|
+
throw new Error(`writeUint: value ${value} out of range for ${bits} bits`);
|
|
206
|
+
}
|
|
207
|
+
for (let i = bits - 1; i >= 0; i--) {
|
|
208
|
+
writeBit(Number((v >> BigInt(i)) & 1n));
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
function writeInt(value, bits) {
|
|
212
|
+
if (bits === 0) {
|
|
213
|
+
if (BigInt(value) !== 0n)
|
|
214
|
+
throw new Error(`writeInt: value not zero for 0 bits`);
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
let v = BigInt(value);
|
|
218
|
+
const limit = 1n << (BigInt(bits) - 1n);
|
|
219
|
+
if (v < -limit || v >= limit) {
|
|
220
|
+
throw new Error(`writeInt: value ${value} out of range for ${bits} bits`);
|
|
221
|
+
}
|
|
222
|
+
if (v < 0n)
|
|
223
|
+
v = (1n << BigInt(bits)) + v;
|
|
224
|
+
writeUint(v, bits);
|
|
225
|
+
}
|
|
226
|
+
const builder = {
|
|
227
|
+
storeUint(value, bits) {
|
|
228
|
+
writeUint(value, bits);
|
|
229
|
+
return builder;
|
|
230
|
+
},
|
|
231
|
+
storeInt(value, bits) {
|
|
232
|
+
writeInt(value, bits);
|
|
233
|
+
return builder;
|
|
234
|
+
},
|
|
235
|
+
storeBit(value) {
|
|
236
|
+
writeBit(value);
|
|
237
|
+
return builder;
|
|
238
|
+
},
|
|
239
|
+
storeBuffer(buf) {
|
|
240
|
+
for (const byte of buf)
|
|
241
|
+
writeUint(byte, 8);
|
|
242
|
+
return builder;
|
|
243
|
+
},
|
|
244
|
+
storeRef(cell) {
|
|
245
|
+
if (state.refs.length >= 4)
|
|
246
|
+
throw new Error('CellBuilder: too many refs');
|
|
247
|
+
state.refs.push(cell);
|
|
248
|
+
return builder;
|
|
249
|
+
},
|
|
250
|
+
storeAddress(parts) {
|
|
251
|
+
// Internal address per TL-B: `addr_std$10 anycast:(Maybe Anycast)
|
|
252
|
+
// workchain_id:int8 address:bits256`. We never emit anycast.
|
|
253
|
+
writeUint(2, 2); // tag: internal
|
|
254
|
+
writeUint(0, 1); // anycast = none
|
|
255
|
+
writeInt(parts.workchain, 8);
|
|
256
|
+
const hash = hexToBytes(parts.hex);
|
|
257
|
+
if (hash.length !== 32) {
|
|
258
|
+
throw new Error('storeAddress: hash must be 32 bytes');
|
|
259
|
+
}
|
|
260
|
+
for (const byte of hash)
|
|
261
|
+
writeUint(byte, 8);
|
|
262
|
+
return builder;
|
|
263
|
+
},
|
|
264
|
+
endCell() {
|
|
265
|
+
const bytesLen = Math.ceil(state.bitLen / 8);
|
|
266
|
+
const bits = state.bits.slice(0, bytesLen);
|
|
267
|
+
return finalizeCell(bits, state.bitLen, state.refs.slice());
|
|
268
|
+
},
|
|
269
|
+
};
|
|
270
|
+
return builder;
|
|
271
|
+
}
|
|
272
|
+
function bitsToPaddedBuffer(bits, bitLen) {
|
|
273
|
+
const byteLen = Math.ceil(bitLen / 8);
|
|
274
|
+
const out = new Uint8Array(byteLen);
|
|
275
|
+
out.set(bits.subarray(0, byteLen));
|
|
276
|
+
const padBits = byteLen * 8 - bitLen;
|
|
277
|
+
if (padBits > 0) {
|
|
278
|
+
// Set the leading padding bit to 1 (the rest are already zero).
|
|
279
|
+
out[bitLen >> 3] |= 1 << (padBits - 1);
|
|
280
|
+
}
|
|
281
|
+
return out;
|
|
282
|
+
}
|
|
283
|
+
function finalizeCell(bits, bitLen, refs) {
|
|
284
|
+
// Ordinary-cell representation per TON Cell spec:
|
|
285
|
+
// d1 = refsCount + 8*(exotic?1:0) + 32*levelMask
|
|
286
|
+
// d2 = ceil(bits/8) + floor(bits/8) // doubled when not byte-aligned
|
|
287
|
+
// payload = paddedBits || (childDepth*2 each) || (childHash*32 each)
|
|
288
|
+
// Hash = sha256(payload). For our use-case, exotic=0, levelMask=0.
|
|
289
|
+
const refsDescriptor = refs.length;
|
|
290
|
+
const bitsDescriptor = Math.ceil(bitLen / 8) + Math.floor(bitLen / 8);
|
|
291
|
+
const padded = bitsToPaddedBuffer(bits, bitLen);
|
|
292
|
+
const repr = new Uint8Array(2 + padded.length + (2 + 32) * refs.length);
|
|
293
|
+
let cursor = 0;
|
|
294
|
+
repr[cursor++] = refsDescriptor;
|
|
295
|
+
repr[cursor++] = bitsDescriptor;
|
|
296
|
+
repr.set(padded, cursor);
|
|
297
|
+
cursor += padded.length;
|
|
298
|
+
for (const r of refs) {
|
|
299
|
+
repr[cursor++] = (r.depth >> 8) & 0xff;
|
|
300
|
+
repr[cursor++] = r.depth & 0xff;
|
|
301
|
+
}
|
|
302
|
+
for (const r of refs) {
|
|
303
|
+
repr.set(r.hash, cursor);
|
|
304
|
+
cursor += 32;
|
|
305
|
+
}
|
|
306
|
+
const hash = sha256(repr);
|
|
307
|
+
let depth = 0;
|
|
308
|
+
for (const r of refs)
|
|
309
|
+
depth = Math.max(depth, r.depth);
|
|
310
|
+
if (refs.length > 0)
|
|
311
|
+
depth += 1;
|
|
312
|
+
return { bits, bitLen, refs: Object.freeze(refs.slice()), depth, hash };
|
|
313
|
+
}
|
|
314
|
+
/** 32-byte representation hash per TVM spec (level 0, no exotic). */
|
|
315
|
+
export function cellHash(cell) {
|
|
316
|
+
return cell.hash;
|
|
317
|
+
}
|
|
318
|
+
function getBit(bits, idx) {
|
|
319
|
+
const byte = bits[idx >> 3] ?? 0;
|
|
320
|
+
return ((byte >> (7 - (idx & 7))) & 1);
|
|
321
|
+
}
|
|
322
|
+
/** Open a read-side slice over `cell`. */
|
|
323
|
+
export function beginParse(cell) {
|
|
324
|
+
let bitOff = 0;
|
|
325
|
+
let refOff = 0;
|
|
326
|
+
function loadUint(bits) {
|
|
327
|
+
if (bits < 0 || !Number.isSafeInteger(bits)) {
|
|
328
|
+
throw new Error(`loadUint: invalid bits ${bits}`);
|
|
329
|
+
}
|
|
330
|
+
if (bits === 0)
|
|
331
|
+
return 0n;
|
|
332
|
+
if (bitOff + bits > cell.bitLen) {
|
|
333
|
+
throw new Error(`loadUint: out of range (${bits} from ${bitOff}/${cell.bitLen})`);
|
|
334
|
+
}
|
|
335
|
+
let v = 0n;
|
|
336
|
+
for (let i = 0; i < bits; i++) {
|
|
337
|
+
v = (v << 1n) | BigInt(getBit(cell.bits, bitOff + i));
|
|
338
|
+
}
|
|
339
|
+
bitOff += bits;
|
|
340
|
+
return v;
|
|
341
|
+
}
|
|
342
|
+
function loadInt(bits) {
|
|
343
|
+
if (bits === 0)
|
|
344
|
+
return 0n;
|
|
345
|
+
const u = loadUint(bits);
|
|
346
|
+
const sign = 1n << BigInt(bits - 1);
|
|
347
|
+
if (u >= sign)
|
|
348
|
+
return u - (1n << BigInt(bits));
|
|
349
|
+
return u;
|
|
350
|
+
}
|
|
351
|
+
return {
|
|
352
|
+
remainingBits() {
|
|
353
|
+
return cell.bitLen - bitOff;
|
|
354
|
+
},
|
|
355
|
+
remainingRefs() {
|
|
356
|
+
return cell.refs.length - refOff;
|
|
357
|
+
},
|
|
358
|
+
loadUint,
|
|
359
|
+
loadInt,
|
|
360
|
+
loadBit() {
|
|
361
|
+
return Number(loadUint(1));
|
|
362
|
+
},
|
|
363
|
+
loadBuffer(bytes) {
|
|
364
|
+
if ((bitOff & 7) !== 0) {
|
|
365
|
+
throw new Error(`loadBuffer: cursor not byte-aligned (${bitOff})`);
|
|
366
|
+
}
|
|
367
|
+
const bitsNeeded = bytes * 8;
|
|
368
|
+
if (bitOff + bitsNeeded > cell.bitLen) {
|
|
369
|
+
throw new Error(`loadBuffer: out of range`);
|
|
370
|
+
}
|
|
371
|
+
const start = bitOff >> 3;
|
|
372
|
+
const out = cell.bits.slice(start, start + bytes);
|
|
373
|
+
bitOff += bitsNeeded;
|
|
374
|
+
return out;
|
|
375
|
+
},
|
|
376
|
+
loadRef() {
|
|
377
|
+
const ref = cell.refs[refOff];
|
|
378
|
+
if (ref === undefined)
|
|
379
|
+
throw new Error('loadRef: no refs remaining');
|
|
380
|
+
refOff += 1;
|
|
381
|
+
return ref;
|
|
382
|
+
},
|
|
383
|
+
loadRemainingBits() {
|
|
384
|
+
const remaining = cell.bitLen - bitOff;
|
|
385
|
+
if (remaining <= 0)
|
|
386
|
+
return { bits: new Uint8Array(0), bitLen: 0 };
|
|
387
|
+
// Pack the remaining bits left-aligned into a fresh buffer.
|
|
388
|
+
const byteLen = Math.ceil(remaining / 8);
|
|
389
|
+
const out = new Uint8Array(byteLen);
|
|
390
|
+
for (let i = 0; i < remaining; i++) {
|
|
391
|
+
const bit = getBit(cell.bits, bitOff + i);
|
|
392
|
+
if (bit)
|
|
393
|
+
out[i >> 3] |= 1 << (7 - (i & 7));
|
|
394
|
+
}
|
|
395
|
+
bitOff += remaining;
|
|
396
|
+
return { bits: out, bitLen: remaining };
|
|
397
|
+
},
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* TEP-74 `VarUInteger 16` decoder: 4-bit length prefix `n` (0..15) followed by
|
|
402
|
+
* `n*8` bits of big-endian unsigned integer. n=0 → value=0. Returns `bigint`.
|
|
403
|
+
*
|
|
404
|
+
* @source github.com/ton-blockchain/TIPs/issues/74 (TEP-74 Fungible Tokens),
|
|
405
|
+
* `Coins` / `VarUInteger 16` definition. Cross-checked against TL-B
|
|
406
|
+
* reference (https://docs.ton.org/develop/data-formats/tl-b-types).
|
|
407
|
+
*/
|
|
408
|
+
export function readVarUInteger16(slice) {
|
|
409
|
+
const len = Number(slice.loadUint(4));
|
|
410
|
+
if (len === 0)
|
|
411
|
+
return 0n;
|
|
412
|
+
return slice.loadUint(len * 8);
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* TL-B `MsgAddress` decoder narrowed to the `addr_std` shape — the only form
|
|
416
|
+
* that matters for end-user senders in jetton transfer/notification flows.
|
|
417
|
+
* Returns `null` for `addr_none`; throws for `addr_extern`/`addr_var`/anycast.
|
|
418
|
+
*
|
|
419
|
+
* addr_none$00 = MsgAddressExt;
|
|
420
|
+
* addr_extern$01 = MsgAddressExt;
|
|
421
|
+
* anycast_info$_ depth:(#<= 30) rewrite_pfx:(bits depth) = Anycast;
|
|
422
|
+
* addr_std$10 anycast:(Maybe Anycast)
|
|
423
|
+
* workchain_id:int8 address:bits256 = MsgAddressInt;
|
|
424
|
+
* addr_var$110 anycast:(Maybe Anycast)
|
|
425
|
+
* addr_len:(## 9) workchain_id:int32 address:(bits addr_len) = MsgAddressInt;
|
|
426
|
+
*
|
|
427
|
+
* @source TL-B reference https://docs.ton.org/develop/data-formats/tl-b-types
|
|
428
|
+
* (`MsgAddress`); cross-checked at impl time 2026-04-29 against TonConsole
|
|
429
|
+
* Cookbook jetton-transfer notes.
|
|
430
|
+
*/
|
|
431
|
+
export function readMsgAddress(slice) {
|
|
432
|
+
const tag = Number(slice.loadUint(2));
|
|
433
|
+
if (tag === 0)
|
|
434
|
+
return null; // addr_none
|
|
435
|
+
if (tag === 1) {
|
|
436
|
+
throw new Error('readMsgAddress: addr_extern not supported');
|
|
437
|
+
}
|
|
438
|
+
if (tag === 2) {
|
|
439
|
+
// addr_std
|
|
440
|
+
const anycast = slice.loadBit();
|
|
441
|
+
if (anycast === 1) {
|
|
442
|
+
throw new Error('readMsgAddress: anycast addr_std not supported');
|
|
443
|
+
}
|
|
444
|
+
const workchain = Number(slice.loadInt(8));
|
|
445
|
+
// Hash is 256 bits — `loadBuffer` requires byte alignment which doesn't
|
|
446
|
+
// hold after the 11-bit prefix (tag+anycast+workchain). Read the bits
|
|
447
|
+
// and pack them into a 32-byte buffer.
|
|
448
|
+
const hashHigh = slice.loadUint(128);
|
|
449
|
+
const hashLow = slice.loadUint(128);
|
|
450
|
+
const hashBig = (hashHigh << 128n) | hashLow;
|
|
451
|
+
const hashHex = hashBig.toString(16).padStart(64, '0');
|
|
452
|
+
return { workchain, hex: hashHex };
|
|
453
|
+
}
|
|
454
|
+
// tag === 3 → addr_var
|
|
455
|
+
throw new Error('readMsgAddress: addr_var not supported');
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* Parse a single-root BoC (magic `0xb5ee9c72`) hex string into a `Cell`. Only
|
|
459
|
+
* the variant we need for the wallet/jetton code BoCs we vendor: no idx, no
|
|
460
|
+
* cache_bits, optional crc32c trailer (validated when present).
|
|
461
|
+
*
|
|
462
|
+
* @source github.com/ton-org/ton-core/src/boc/cell/serialization.ts —
|
|
463
|
+
* `parseBoc` + `deserializeBoc` for magic `0xb5ee9c72`. CRC32-C validation
|
|
464
|
+
* intentionally skipped (the wallet sources we vendor are constants — any
|
|
465
|
+
* tampering would surface immediately as a derivation mismatch in tests).
|
|
466
|
+
*/
|
|
467
|
+
export function deserializeBoC(hex) {
|
|
468
|
+
const buf = hexToBytes(hex);
|
|
469
|
+
let off = 0;
|
|
470
|
+
const readByte = () => {
|
|
471
|
+
if (off >= buf.length)
|
|
472
|
+
throw new Error('deserializeBoC: truncated BoC');
|
|
473
|
+
return buf[off++];
|
|
474
|
+
};
|
|
475
|
+
const readUint = (bytes) => {
|
|
476
|
+
let v = 0;
|
|
477
|
+
for (let i = 0; i < bytes; i++)
|
|
478
|
+
v = v * 256 + readByte();
|
|
479
|
+
return v;
|
|
480
|
+
};
|
|
481
|
+
const magic = readUint(4);
|
|
482
|
+
if (magic !== 0xb5ee9c72) {
|
|
483
|
+
throw new Error(`deserializeBoC: unsupported BoC magic 0x${magic.toString(16)}`);
|
|
484
|
+
}
|
|
485
|
+
const flagsByte = readByte();
|
|
486
|
+
// bit7=hasIdx, bit6=hasCrc32c, bit5=hasCacheBits, bits4-3=flags(=0), bits2-0=size
|
|
487
|
+
// We tolerate any flag combination but only consume the trailing crc32c when
|
|
488
|
+
// present — without re-validating it (constant inputs are tamper-evident
|
|
489
|
+
// through derivation tests).
|
|
490
|
+
const hasIdx = (flagsByte & 0x80) !== 0;
|
|
491
|
+
const hasCrc32c = (flagsByte & 0x40) !== 0;
|
|
492
|
+
const size = flagsByte & 0x07;
|
|
493
|
+
const offBytes = readByte();
|
|
494
|
+
const cellsCount = readUint(size);
|
|
495
|
+
const rootsCount = readUint(size);
|
|
496
|
+
readUint(size); // absent
|
|
497
|
+
readUint(offBytes); // totalCellSize
|
|
498
|
+
const rootIndex = readUint(size);
|
|
499
|
+
if (rootsCount < 1)
|
|
500
|
+
throw new Error('deserializeBoC: no roots');
|
|
501
|
+
for (let i = 1; i < rootsCount; i++)
|
|
502
|
+
readUint(size);
|
|
503
|
+
if (hasIdx)
|
|
504
|
+
off += cellsCount * offBytes;
|
|
505
|
+
const cells = [];
|
|
506
|
+
for (let i = 0; i < cellsCount; i++) {
|
|
507
|
+
const d1 = readByte();
|
|
508
|
+
const d2 = readByte();
|
|
509
|
+
const refsCount = d1 & 0x07;
|
|
510
|
+
const exotic = (d1 & 0x08) !== 0;
|
|
511
|
+
if (exotic)
|
|
512
|
+
throw new Error('deserializeBoC: exotic cells not supported');
|
|
513
|
+
const hasHashes = (d1 & 0x10) !== 0;
|
|
514
|
+
if (hasHashes) {
|
|
515
|
+
// Skip stored hashes/depths — we recompute. levelMask = d1 >> 5.
|
|
516
|
+
const levelMask = d1 >> 5;
|
|
517
|
+
const hashCount = (() => {
|
|
518
|
+
let n = 0, m = levelMask & 7;
|
|
519
|
+
for (let k = 0; k < 3; k++) {
|
|
520
|
+
n += m & 1;
|
|
521
|
+
m >>= 1;
|
|
522
|
+
}
|
|
523
|
+
return n + 1;
|
|
524
|
+
})();
|
|
525
|
+
off += hashCount * (32 + 2);
|
|
526
|
+
}
|
|
527
|
+
const dataBytes = Math.ceil(d2 / 2);
|
|
528
|
+
const padded = (d2 & 1) !== 0;
|
|
529
|
+
const data = buf.subarray(off, off + dataBytes);
|
|
530
|
+
off += dataBytes;
|
|
531
|
+
let bitLen;
|
|
532
|
+
let bits;
|
|
533
|
+
if (!padded) {
|
|
534
|
+
bitLen = dataBytes * 8;
|
|
535
|
+
bits = new Uint8Array(data);
|
|
536
|
+
}
|
|
537
|
+
else {
|
|
538
|
+
// Strip TON padding: a single 1-bit followed by zeros.
|
|
539
|
+
let last = dataBytes * 8;
|
|
540
|
+
for (let k = dataBytes - 1; k >= 0; k--) {
|
|
541
|
+
const b = data[k];
|
|
542
|
+
if (b !== 0) {
|
|
543
|
+
let bitPos = b & -b;
|
|
544
|
+
if ((bitPos & 1) === 0)
|
|
545
|
+
bitPos = Math.log2(bitPos) + 1;
|
|
546
|
+
last = k * 8 + (8 - bitPos);
|
|
547
|
+
break;
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
bitLen = last;
|
|
551
|
+
bits = new Uint8Array(data);
|
|
552
|
+
}
|
|
553
|
+
const refIndices = [];
|
|
554
|
+
for (let r = 0; r < refsCount; r++)
|
|
555
|
+
refIndices.push(readUint(size));
|
|
556
|
+
cells.push({ bits, bitLen, refIndices, finalized: null });
|
|
557
|
+
}
|
|
558
|
+
if (hasCrc32c)
|
|
559
|
+
off += 4; // skip crc32c trailer
|
|
560
|
+
// Finalize bottom-up so refs are already concrete by the time we hash them.
|
|
561
|
+
for (let i = cellsCount - 1; i >= 0; i--) {
|
|
562
|
+
const c = cells[i];
|
|
563
|
+
const refs = c.refIndices.map((idx) => {
|
|
564
|
+
const child = cells[idx]?.finalized;
|
|
565
|
+
if (!child)
|
|
566
|
+
throw new Error('deserializeBoC: forward reference');
|
|
567
|
+
return child;
|
|
568
|
+
});
|
|
569
|
+
c.finalized = finalizeCell(c.bits, c.bitLen, refs);
|
|
570
|
+
}
|
|
571
|
+
const root = cells[rootIndex]?.finalized;
|
|
572
|
+
if (!root)
|
|
573
|
+
throw new Error('deserializeBoC: missing root cell');
|
|
574
|
+
return root;
|
|
575
|
+
}
|
|
576
|
+
/**
|
|
577
|
+
* Build the StateInit cell for a wallet contract:
|
|
578
|
+
* `_ split_depth:(Maybe (## 5)) special:(Maybe TickTock) code:(Maybe ^Cell)
|
|
579
|
+
* data:(Maybe ^Cell) library:(HashmapE 256 SimpleLib) = StateInit;`
|
|
580
|
+
*
|
|
581
|
+
* The per-version data-cell layout differs (v3R2 vs v4R2 vs v5R1), so the
|
|
582
|
+
* caller supplies a `dataCellBuilder` lambda — keeping this function
|
|
583
|
+
* version-agnostic.
|
|
584
|
+
*
|
|
585
|
+
* @source github.com/ton-org/ton-core/src/types/StateInit.ts — `storeStateInit`.
|
|
586
|
+
*/
|
|
587
|
+
export function buildStateInit(opts) {
|
|
588
|
+
const code = deserializeBoC(opts.codeBoCHex);
|
|
589
|
+
const data = opts.dataCellBuilder({
|
|
590
|
+
subwalletId: opts.subwalletId,
|
|
591
|
+
publicKeyHex: opts.publicKeyHex,
|
|
592
|
+
});
|
|
593
|
+
return beginCell()
|
|
594
|
+
.storeBit(0) // splitDepth = none
|
|
595
|
+
.storeBit(0) // special = none
|
|
596
|
+
.storeBit(1) // hasCode
|
|
597
|
+
.storeRef(code)
|
|
598
|
+
.storeBit(1) // hasData
|
|
599
|
+
.storeRef(data)
|
|
600
|
+
.storeBit(0) // libraries = empty dict
|
|
601
|
+
.endCell();
|
|
602
|
+
}
|
|
603
|
+
/**
|
|
604
|
+
* Compute the on-chain account-id for a TON wallet contract. The hex form is
|
|
605
|
+
* the 32-byte representation hash of the `StateInit` cell; pair with
|
|
606
|
+
* `serializeAddressUserFriendly` at API boundaries.
|
|
607
|
+
*
|
|
608
|
+
* @source github.com/ton-org/ton-core/src/address/contractAddress.ts.
|
|
609
|
+
*/
|
|
610
|
+
export function computeWalletAddress(opts) {
|
|
611
|
+
const stateInit = buildStateInit(opts);
|
|
612
|
+
return { workchain: opts.workchain, hex: bytesToHex(cellHash(stateInit)) };
|
|
613
|
+
}
|
|
614
|
+
//# sourceMappingURL=ton-cell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ton-cell.js","sourceRoot":"","sources":["../../../src/verify/chains/ton-cell.ts"],"names":[],"mappings":"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"}
|