@getomnichain/omnichain 0.6.2 → 0.7.0
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/CHANGELOG.md +69 -0
- package/dist/cjs/chain_ids.js +2 -2
- package/dist/cjs/chain_ids.js.map +1 -1
- package/dist/cjs/errors.js +6 -0
- package/dist/cjs/errors.js.map +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/ton/index.js +12 -0
- package/dist/cjs/ton/index.js.map +1 -1
- package/dist/cjs/ton/ton_address.js +72 -14
- package/dist/cjs/ton/ton_address.js.map +1 -1
- package/dist/cjs/ton/ton_asset.js +21 -0
- package/dist/cjs/ton/ton_asset.js.map +1 -0
- package/dist/cjs/ton/ton_assets.js +10 -0
- package/dist/cjs/ton/ton_assets.js.map +1 -0
- package/dist/cjs/ton/ton_chain.js +483 -0
- package/dist/cjs/ton/ton_chain.js.map +1 -0
- package/dist/cjs/ton/ton_chains.js +21 -0
- package/dist/cjs/ton/ton_chains.js.map +1 -0
- package/dist/cjs/ton/ton_jetton_metadata.js +107 -0
- package/dist/cjs/ton/ton_jetton_metadata.js.map +1 -0
- package/dist/cjs/ton/ton_messages.js +174 -0
- package/dist/cjs/ton/ton_messages.js.map +1 -0
- package/dist/cjs/ton/ton_provider.js +456 -0
- package/dist/cjs/ton/ton_provider.js.map +1 -0
- package/dist/cjs/ton/ton_tonapi.js +243 -0
- package/dist/cjs/ton/ton_tonapi.js.map +1 -0
- package/dist/cjs/ton/ton_toncenter.js +252 -0
- package/dist/cjs/ton/ton_toncenter.js.map +1 -0
- package/dist/cjs/ton/ton_transaction_status.js +231 -0
- package/dist/cjs/ton/ton_transaction_status.js.map +1 -0
- package/dist/cjs/ton/ton_transactions.js +107 -0
- package/dist/cjs/ton/ton_transactions.js.map +1 -0
- package/dist/cjs/ton/ton_wallet.js +285 -0
- package/dist/cjs/ton/ton_wallet.js.map +1 -0
- package/dist/cjs/tron/index.js +1 -0
- package/dist/cjs/tron/index.js.map +1 -1
- package/dist/cjs/tron/tron_chain.js +88 -45
- package/dist/cjs/tron/tron_chain.js.map +1 -1
- package/dist/cjs/tron/tron_memo.js +17 -0
- package/dist/cjs/tron/tron_memo.js.map +1 -0
- package/dist/cjs/tron/tron_raw_data.js +213 -0
- package/dist/cjs/tron/tron_raw_data.js.map +1 -0
- package/dist/cjs/tron/tron_transaction_builder.js +34 -13
- package/dist/cjs/tron/tron_transaction_builder.js.map +1 -1
- package/dist/cjs/tron/tron_transaction_status.js +10 -7
- package/dist/cjs/tron/tron_transaction_status.js.map +1 -1
- package/dist/cjs/tron/tron_transactions.js +1 -1
- package/dist/cjs/tron/tron_transactions.js.map +1 -1
- package/dist/esm/chain_ids.js +2 -2
- package/dist/esm/chain_ids.js.map +1 -1
- package/dist/esm/errors.d.ts +3 -0
- package/dist/esm/errors.d.ts.map +1 -1
- package/dist/esm/errors.js +5 -0
- package/dist/esm/errors.js.map +1 -1
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/ton/index.d.ts +12 -0
- package/dist/esm/ton/index.d.ts.map +1 -1
- package/dist/esm/ton/index.js +12 -0
- package/dist/esm/ton/index.js.map +1 -1
- package/dist/esm/ton/ton_address.d.ts +26 -2
- package/dist/esm/ton/ton_address.d.ts.map +1 -1
- package/dist/esm/ton/ton_address.js +70 -14
- package/dist/esm/ton/ton_address.js.map +1 -1
- package/dist/esm/ton/ton_asset.d.ts +12 -0
- package/dist/esm/ton/ton_asset.d.ts.map +1 -0
- package/dist/esm/ton/ton_asset.js +17 -0
- package/dist/esm/ton/ton_asset.js.map +1 -0
- package/dist/esm/ton/ton_assets.d.ts +6 -0
- package/dist/esm/ton/ton_assets.d.ts.map +1 -0
- package/dist/esm/ton/ton_assets.js +7 -0
- package/dist/esm/ton/ton_assets.js.map +1 -0
- package/dist/esm/ton/ton_chain.d.ts +205 -0
- package/dist/esm/ton/ton_chain.d.ts.map +1 -0
- package/dist/esm/ton/ton_chain.js +479 -0
- package/dist/esm/ton/ton_chain.js.map +1 -0
- package/dist/esm/ton/ton_chains.d.ts +11 -0
- package/dist/esm/ton/ton_chains.d.ts.map +1 -0
- package/dist/esm/ton/ton_chains.js +18 -0
- package/dist/esm/ton/ton_chains.js.map +1 -0
- package/dist/esm/ton/ton_jetton_metadata.d.ts +36 -0
- package/dist/esm/ton/ton_jetton_metadata.d.ts.map +1 -0
- package/dist/esm/ton/ton_jetton_metadata.js +103 -0
- package/dist/esm/ton/ton_jetton_metadata.js.map +1 -0
- package/dist/esm/ton/ton_messages.d.ts +133 -0
- package/dist/esm/ton/ton_messages.d.ts.map +1 -0
- package/dist/esm/ton/ton_messages.js +159 -0
- package/dist/esm/ton/ton_messages.js.map +1 -0
- package/dist/esm/ton/ton_provider.d.ts +261 -0
- package/dist/esm/ton/ton_provider.d.ts.map +1 -0
- package/dist/esm/ton/ton_provider.js +432 -0
- package/dist/esm/ton/ton_provider.js.map +1 -0
- package/dist/esm/ton/ton_tonapi.d.ts +39 -0
- package/dist/esm/ton/ton_tonapi.d.ts.map +1 -0
- package/dist/esm/ton/ton_tonapi.js +239 -0
- package/dist/esm/ton/ton_tonapi.js.map +1 -0
- package/dist/esm/ton/ton_toncenter.d.ts +25 -0
- package/dist/esm/ton/ton_toncenter.d.ts.map +1 -0
- package/dist/esm/ton/ton_toncenter.js +248 -0
- package/dist/esm/ton/ton_toncenter.js.map +1 -0
- package/dist/esm/ton/ton_transaction_status.d.ts +116 -0
- package/dist/esm/ton/ton_transaction_status.d.ts.map +1 -0
- package/dist/esm/ton/ton_transaction_status.js +226 -0
- package/dist/esm/ton/ton_transaction_status.js.map +1 -0
- package/dist/esm/ton/ton_transactions.d.ts +54 -0
- package/dist/esm/ton/ton_transactions.d.ts.map +1 -0
- package/dist/esm/ton/ton_transactions.js +100 -0
- package/dist/esm/ton/ton_transactions.js.map +1 -0
- package/dist/esm/ton/ton_wallet.d.ts +134 -0
- package/dist/esm/ton/ton_wallet.d.ts.map +1 -0
- package/dist/esm/ton/ton_wallet.js +278 -0
- package/dist/esm/ton/ton_wallet.js.map +1 -0
- package/dist/esm/tron/index.d.ts +1 -0
- package/dist/esm/tron/index.d.ts.map +1 -1
- package/dist/esm/tron/index.js +1 -0
- package/dist/esm/tron/index.js.map +1 -1
- package/dist/esm/tron/tron_chain.d.ts +13 -1
- package/dist/esm/tron/tron_chain.d.ts.map +1 -1
- package/dist/esm/tron/tron_chain.js +89 -46
- package/dist/esm/tron/tron_chain.js.map +1 -1
- package/dist/esm/tron/tron_memo.d.ts +2 -0
- package/dist/esm/tron/tron_memo.d.ts.map +1 -0
- package/dist/esm/tron/tron_memo.js +14 -0
- package/dist/esm/tron/tron_memo.js.map +1 -0
- package/dist/esm/tron/tron_raw_data.d.ts +4 -0
- package/dist/esm/tron/tron_raw_data.d.ts.map +1 -0
- package/dist/esm/tron/tron_raw_data.js +209 -0
- package/dist/esm/tron/tron_raw_data.js.map +1 -0
- package/dist/esm/tron/tron_transaction_builder.d.ts +4 -0
- package/dist/esm/tron/tron_transaction_builder.d.ts.map +1 -1
- package/dist/esm/tron/tron_transaction_builder.js +34 -13
- package/dist/esm/tron/tron_transaction_builder.js.map +1 -1
- package/dist/esm/tron/tron_transaction_status.d.ts +16 -2
- package/dist/esm/tron/tron_transaction_status.d.ts.map +1 -1
- package/dist/esm/tron/tron_transaction_status.js +10 -7
- package/dist/esm/tron/tron_transaction_status.js.map +1 -1
- package/dist/esm/tron/tron_transactions.js +1 -1
- package/dist/esm/tron/tron_transactions.js.map +1 -1
- package/docs/README.md +2 -1
- package/docs/ton.md +164 -0
- package/docs/tron.md +21 -11
- package/package.json +5 -1
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { Dictionary } from '@ton/core';
|
|
3
|
+
import { ChainErrorKinds } from "../errors.js";
|
|
4
|
+
import { TonProviderError } from "./ton_provider.js";
|
|
5
|
+
const TEP64_KEYS = ['uri', 'name', 'description', 'image', 'symbol', 'decimals'];
|
|
6
|
+
const OFFCHAIN_FETCH_TIMEOUT_MS = 10_000;
|
|
7
|
+
const OFFCHAIN_MAX_BYTES = 64 * 1024;
|
|
8
|
+
const TEP64_DEFAULT_DECIMALS = 9;
|
|
9
|
+
/**
|
|
10
|
+
* The fields of a jetton master's content cell (`get_jetton_data`, TEP-64):
|
|
11
|
+
* on-chain (prefix 0x00, a dictionary keyed by the SHA-256 of each field
|
|
12
|
+
* name, values snake or chunked), or off-chain (any other prefix, a snake
|
|
13
|
+
* URI — TEP-64's 0x01 and the older variants some jettons use).
|
|
14
|
+
*/
|
|
15
|
+
export function parseTonJettonContent(content) {
|
|
16
|
+
const slice = content.beginParse();
|
|
17
|
+
const prefix = slice.loadUint(8);
|
|
18
|
+
if (prefix !== 0x00)
|
|
19
|
+
return { fields: {}, uri: slice.loadStringTail() };
|
|
20
|
+
const dict = slice.loadDict(Dictionary.Keys.Buffer(32), Dictionary.Values.Cell());
|
|
21
|
+
const fields = {};
|
|
22
|
+
for (const key of TEP64_KEYS) {
|
|
23
|
+
const value = dict.get(createHash('sha256').update(key).digest());
|
|
24
|
+
if (value !== undefined)
|
|
25
|
+
fields[key] = contentDataOf(value.beginParse());
|
|
26
|
+
}
|
|
27
|
+
return { fields, uri: fields.uri ?? null };
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* A jetton's metadata from its content cell, filling what the content lacks
|
|
31
|
+
* from the off-chain JSON its URI names (https only).
|
|
32
|
+
*
|
|
33
|
+
* The decimals decide every amount, so they are never guessed: when the
|
|
34
|
+
* content names none and the off-chain JSON could not be read, this throws
|
|
35
|
+
* (retryably). A symbol that cannot be read is `null`.
|
|
36
|
+
*/
|
|
37
|
+
export async function readTonJettonMetadata(content, fetchJson = fetchOffchainJson) {
|
|
38
|
+
const { fields, uri } = parseTonJettonContent(content);
|
|
39
|
+
const merged = { ...fields };
|
|
40
|
+
let offchainRead = uri === null;
|
|
41
|
+
if (uri !== null && (merged.symbol === undefined || merged.decimals === undefined)) {
|
|
42
|
+
try {
|
|
43
|
+
const json = await fetchJson(uri);
|
|
44
|
+
if (json !== null && typeof json === 'object' && !Array.isArray(json)) {
|
|
45
|
+
for (const key of TEP64_KEYS) {
|
|
46
|
+
const value = json[key];
|
|
47
|
+
if (merged[key] === undefined && (typeof value === 'string' || typeof value === 'number'))
|
|
48
|
+
merged[key] = String(value);
|
|
49
|
+
}
|
|
50
|
+
offchainRead = true;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
offchainRead = false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
offchainRead = true;
|
|
59
|
+
}
|
|
60
|
+
if (merged.decimals === undefined && !offchainRead) {
|
|
61
|
+
throw new TonProviderError(ChainErrorKinds.RpcError, `Could not read the jetton's decimals: its metadata at ${uri} did not load`, true);
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
symbol: merged.symbol ?? null,
|
|
65
|
+
name: merged.name ?? null,
|
|
66
|
+
decimals: merged.decimals === undefined ? TEP64_DEFAULT_DECIMALS : decimalsOf(merged.decimals),
|
|
67
|
+
description: merged.description ?? null,
|
|
68
|
+
image: merged.image ?? null,
|
|
69
|
+
uri,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function decimalsOf(value) {
|
|
73
|
+
if (!/^\d{1,3}$/.test(value.trim()) || Number(value) > 255) {
|
|
74
|
+
throw new TonProviderError(ChainErrorKinds.InvalidTokenIdentifier, `A jetton's decimals must be 0 to 255, got ${JSON.stringify(value)}`, false);
|
|
75
|
+
}
|
|
76
|
+
return Number(value);
|
|
77
|
+
}
|
|
78
|
+
/** A TEP-64 content value: snake (0x00) or chunked (0x01, a dictionary of snake chunks). */
|
|
79
|
+
function contentDataOf(slice) {
|
|
80
|
+
const prefix = slice.loadUint(8);
|
|
81
|
+
if (prefix === 0x00)
|
|
82
|
+
return slice.loadStringTail();
|
|
83
|
+
if (prefix === 0x01) {
|
|
84
|
+
const chunks = slice.loadDict(Dictionary.Keys.Uint(32), Dictionary.Values.Cell());
|
|
85
|
+
return [...chunks.keys()]
|
|
86
|
+
.sort((a, b) => a - b)
|
|
87
|
+
.map((index) => chunks.get(index).beginParse().loadStringTail())
|
|
88
|
+
.join('');
|
|
89
|
+
}
|
|
90
|
+
throw new TonProviderError(ChainErrorKinds.InvalidTokenIdentifier, `Unknown TEP-64 content data prefix 0x${prefix.toString(16)}`, false);
|
|
91
|
+
}
|
|
92
|
+
async function fetchOffchainJson(uri) {
|
|
93
|
+
if (!uri.startsWith('https://'))
|
|
94
|
+
throw new Error(`only https metadata is fetched, not ${uri}`);
|
|
95
|
+
const response = await fetch(uri, { signal: AbortSignal.timeout(OFFCHAIN_FETCH_TIMEOUT_MS), redirect: 'follow' });
|
|
96
|
+
if (!response.ok)
|
|
97
|
+
throw new Error(`HTTP ${response.status}`);
|
|
98
|
+
const text = await response.text();
|
|
99
|
+
if (text.length > OFFCHAIN_MAX_BYTES)
|
|
100
|
+
throw new Error('metadata too large');
|
|
101
|
+
return JSON.parse(text);
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=ton_jetton_metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ton_jetton_metadata.js","sourceRoot":"","sources":["../../../ton/ton_jetton_metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { Address, Cell, type OutActionSendMsg, SendMode, type StateInit } from '@ton/core';
|
|
2
|
+
import { AbstractSignedMessage } from '../wallet.base.ts';
|
|
3
|
+
/**
|
|
4
|
+
* What `signMessage` signs: SHA-256 of a fixed prefix and the message's UTF-8
|
|
5
|
+
* bytes, as Stellar's SEP-53 does. The same key authorizes W5 requests by
|
|
6
|
+
* signing a 32-byte cell hash, so signing a message's bytes directly would let
|
|
7
|
+
* a crafted 32-byte message stand in for a request; a prefixed digest cannot
|
|
8
|
+
* equal a cell hash without a SHA-256 preimage.
|
|
9
|
+
*/
|
|
10
|
+
export declare function tonMessageHash(message: string): Buffer;
|
|
11
|
+
export declare class TonSignedMessage extends AbstractSignedMessage {
|
|
12
|
+
constructor(signature: string);
|
|
13
|
+
}
|
|
14
|
+
/** W5's limit on outgoing messages per request. */
|
|
15
|
+
export declare const TON_MAX_MESSAGES_PER_REQUEST = 255;
|
|
16
|
+
/** The send mode a message gets unless it names one: the wallet pays forward fees on top of `value`. */
|
|
17
|
+
export declare const TON_DEFAULT_SEND_MODE = SendMode.PAY_GAS_SEPARATELY;
|
|
18
|
+
export declare const TON_COMMENT_OP = 0;
|
|
19
|
+
export declare const TON_JETTON_TRANSFER_OP = 260734629;
|
|
20
|
+
export declare const TON_JETTON_INTERNAL_TRANSFER_OP = 395134233;
|
|
21
|
+
/** One outgoing internal message of a wallet request. */
|
|
22
|
+
export interface TonOutMessage {
|
|
23
|
+
/** Any address form. */
|
|
24
|
+
to: string;
|
|
25
|
+
/** Nanotons attached. */
|
|
26
|
+
value: bigint;
|
|
27
|
+
body?: Cell;
|
|
28
|
+
/** Defaults to `true` when there is a body and `false` otherwise. */
|
|
29
|
+
bounce?: boolean;
|
|
30
|
+
stateInit?: StateInit;
|
|
31
|
+
/** Defaults to {@link TON_DEFAULT_SEND_MODE}. */
|
|
32
|
+
mode?: number;
|
|
33
|
+
}
|
|
34
|
+
export declare function tonOutAction(message: TonOutMessage): OutActionSendMsg;
|
|
35
|
+
export declare function tonOutActions(messages: readonly TonOutMessage[]): OutActionSendMsg[];
|
|
36
|
+
/** A text comment body (op 0), the form wallets show as a memo. */
|
|
37
|
+
export declare function tonCommentBody(text: string): Cell;
|
|
38
|
+
export interface TonJettonTransferBodyArgs {
|
|
39
|
+
/** Jetton units, in the jetton's smallest unit. */
|
|
40
|
+
amount: bigint;
|
|
41
|
+
/** The new owner (not their jetton wallet). */
|
|
42
|
+
destination: string;
|
|
43
|
+
/** Who receives the excess TON once the transfer settles. */
|
|
44
|
+
responseDestination: string;
|
|
45
|
+
/** TON forwarded to `destination` with the transfer notification; 0 sends none. */
|
|
46
|
+
forwardTonAmount?: bigint;
|
|
47
|
+
forwardPayload?: Cell;
|
|
48
|
+
queryId?: bigint;
|
|
49
|
+
}
|
|
50
|
+
/** The TEP-74 `transfer` body, sent to the sender's own jetton wallet. */
|
|
51
|
+
export declare function tonJettonTransferBody(args: TonJettonTransferBodyArgs): Cell;
|
|
52
|
+
export declare const TON_W5_SIGNED_INTERNAL_OP = 1936289396;
|
|
53
|
+
export declare const TON_W5_SIGNED_EXTERNAL_OP = 1936287598;
|
|
54
|
+
/** What a signed W5 request commits to, read back from its body. */
|
|
55
|
+
export interface TonW5RequestFields {
|
|
56
|
+
/** `external`: the wallet sends it itself; `internal`: a relayer delivers it. */
|
|
57
|
+
authType: 'external' | 'internal';
|
|
58
|
+
walletId: number;
|
|
59
|
+
/** Unix seconds; the wallet refuses it from then on. */
|
|
60
|
+
validUntil: number;
|
|
61
|
+
/** The wallet seqno it executes at. */
|
|
62
|
+
seqno: number;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* The fields of a signed W5R1 request body: op, wallet id, `valid_until` and
|
|
66
|
+
* seqno lead the body, the signature trails it. Throws `TransactionDecodeFailed`
|
|
67
|
+
* for anything that is not one.
|
|
68
|
+
*/
|
|
69
|
+
export declare function tonW5RequestFields(body: Cell): TonW5RequestFields;
|
|
70
|
+
/** What a signed wallet request commits to, whatever its version. */
|
|
71
|
+
export interface TonWalletRequestFields {
|
|
72
|
+
/** `w5`: op, wallet id, valid_until, seqno first, the signature at the tail. `legacy`: v3r2 / v4r2, the signature first. */
|
|
73
|
+
layout: 'w5' | 'legacy';
|
|
74
|
+
walletId: number;
|
|
75
|
+
validUntil: number;
|
|
76
|
+
seqno: number;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* The fields of any signed wallet request body the SDK builds. A v3r2 / v4r2
|
|
80
|
+
* body is the signature, then wallet id, valid_until and seqno, every field
|
|
81
|
+
* whole bytes; a W5 body leads with its op and is never byte-aligned (its
|
|
82
|
+
* action-list flags are two bits). Throws `TransactionDecodeFailed` for
|
|
83
|
+
* anything else.
|
|
84
|
+
*/
|
|
85
|
+
export declare function tonWalletRequestFields(body: Cell): TonWalletRequestFields;
|
|
86
|
+
/**
|
|
87
|
+
* A request a wallet signed for a relayer (`TonWallet.createInternalRequest`),
|
|
88
|
+
* with the seqno and `validUntil` it commits to — what
|
|
89
|
+
* `TonChain.getRequestState` needs once it has been sent.
|
|
90
|
+
*/
|
|
91
|
+
export interface TonInternalRequest {
|
|
92
|
+
/** The signed request, the relay message's body. */
|
|
93
|
+
body: Cell;
|
|
94
|
+
seqno: number;
|
|
95
|
+
validUntil: number;
|
|
96
|
+
}
|
|
97
|
+
/** A signed internal request read back from its body, e.g. one found in a trace. */
|
|
98
|
+
export declare function tonInternalRequestOf(body: Cell): TonInternalRequest;
|
|
99
|
+
/** The wallet contracts the SDK builds: W5 (v5r1), and v4r2 / v3r2 as the Python SDK has them. */
|
|
100
|
+
export type TonWalletVersion = 'v3r2' | 'v4r2' | 'v5r1';
|
|
101
|
+
/** The wallet a relay delivers to: its address and the StateInit that deploys it (a `TonWallet` fits). */
|
|
102
|
+
export interface TonRelayTarget {
|
|
103
|
+
address: string;
|
|
104
|
+
stateInit: StateInit;
|
|
105
|
+
/** Relaying needs W5; any other version is refused. */
|
|
106
|
+
version?: TonWalletVersion;
|
|
107
|
+
}
|
|
108
|
+
export interface TonRelayMessageArgs {
|
|
109
|
+
wallet: TonRelayTarget;
|
|
110
|
+
/** The wallet's own signed internal request (`TonWallet.createInternalRequest`). */
|
|
111
|
+
request: TonInternalRequest;
|
|
112
|
+
/** Nanotons the relayer attaches: the trace's fees plus whatever the request's messages need. */
|
|
113
|
+
value: bigint;
|
|
114
|
+
/** Attach the wallet's StateInit, deploying it; set while it is not deployed. */
|
|
115
|
+
deploy: boolean;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* The message a relayer sends to deliver a wallet's signed internal request.
|
|
119
|
+
*
|
|
120
|
+
* Bounceable, so a request that fails in the wallet returns the value. A
|
|
121
|
+
* request the wallet does not accept (a bad signature, a stale seqno) is
|
|
122
|
+
* dropped without a bounce and the wallet keeps the value; the transaction
|
|
123
|
+
* status reports that as `request_not_executed`.
|
|
124
|
+
*/
|
|
125
|
+
export declare function tonRelayMessage(args: TonRelayMessageArgs): TonOutMessage;
|
|
126
|
+
/**
|
|
127
|
+
* The normalized hash of an external message (TEP-467): source, import fee and
|
|
128
|
+
* StateInit dropped, body stored as a reference. It is what both TON Center and
|
|
129
|
+
* TonAPI index the external message under, and is used as the transaction id.
|
|
130
|
+
*/
|
|
131
|
+
export declare function tonNormalizedExternalHash(destination: string, body: Cell): string;
|
|
132
|
+
export declare function parseTonAddress(address: string): Address;
|
|
133
|
+
//# sourceMappingURL=ton_messages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ton_messages.d.ts","sourceRoot":"","sources":["../../../ton/ton_messages.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { Address, SendMode, beginCell, internal, storeMessage, } from '@ton/core';
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import { ChainError, ChainErrorKinds } from "../errors.js";
|
|
4
|
+
import { AbstractSignedMessage } from "../wallet.base.js";
|
|
5
|
+
const TON_MESSAGE_PREFIX = 'TON Signed Message:\n';
|
|
6
|
+
/**
|
|
7
|
+
* What `signMessage` signs: SHA-256 of a fixed prefix and the message's UTF-8
|
|
8
|
+
* bytes, as Stellar's SEP-53 does. The same key authorizes W5 requests by
|
|
9
|
+
* signing a 32-byte cell hash, so signing a message's bytes directly would let
|
|
10
|
+
* a crafted 32-byte message stand in for a request; a prefixed digest cannot
|
|
11
|
+
* equal a cell hash without a SHA-256 preimage.
|
|
12
|
+
*/
|
|
13
|
+
export function tonMessageHash(message) {
|
|
14
|
+
return createHash('sha256').update(TON_MESSAGE_PREFIX, 'utf8').update(message, 'utf8').digest();
|
|
15
|
+
}
|
|
16
|
+
export class TonSignedMessage extends AbstractSignedMessage {
|
|
17
|
+
constructor(signature) {
|
|
18
|
+
super(signature);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/** W5's limit on outgoing messages per request. */
|
|
22
|
+
export const TON_MAX_MESSAGES_PER_REQUEST = 255;
|
|
23
|
+
/** The send mode a message gets unless it names one: the wallet pays forward fees on top of `value`. */
|
|
24
|
+
export const TON_DEFAULT_SEND_MODE = SendMode.PAY_GAS_SEPARATELY;
|
|
25
|
+
export const TON_COMMENT_OP = 0;
|
|
26
|
+
export const TON_JETTON_TRANSFER_OP = 0x0f8a7ea5;
|
|
27
|
+
export const TON_JETTON_INTERNAL_TRANSFER_OP = 0x178d4519;
|
|
28
|
+
export function tonOutAction(message) {
|
|
29
|
+
if (message.value < 0n) {
|
|
30
|
+
throw new ChainError(ChainErrorKinds.InvalidArgument, `TON message value must be >= 0, got ${message.value}`);
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
type: 'sendMsg',
|
|
34
|
+
mode: message.mode ?? TON_DEFAULT_SEND_MODE,
|
|
35
|
+
outMsg: internal({
|
|
36
|
+
to: parseTonAddress(message.to),
|
|
37
|
+
value: message.value,
|
|
38
|
+
bounce: message.bounce ?? message.body !== undefined,
|
|
39
|
+
body: message.body,
|
|
40
|
+
init: message.stateInit,
|
|
41
|
+
}),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export function tonOutActions(messages) {
|
|
45
|
+
if (messages.length === 0 || messages.length > TON_MAX_MESSAGES_PER_REQUEST) {
|
|
46
|
+
throw new ChainError(ChainErrorKinds.InvalidArgument, `A TON request carries 1 to ${TON_MAX_MESSAGES_PER_REQUEST} messages, got ${messages.length}`);
|
|
47
|
+
}
|
|
48
|
+
return messages.map(tonOutAction);
|
|
49
|
+
}
|
|
50
|
+
/** A text comment body (op 0), the form wallets show as a memo. */
|
|
51
|
+
export function tonCommentBody(text) {
|
|
52
|
+
return beginCell().storeUint(TON_COMMENT_OP, 32).storeStringTail(text).endCell();
|
|
53
|
+
}
|
|
54
|
+
/** The TEP-74 `transfer` body, sent to the sender's own jetton wallet. */
|
|
55
|
+
export function tonJettonTransferBody(args) {
|
|
56
|
+
const builder = beginCell()
|
|
57
|
+
.storeUint(TON_JETTON_TRANSFER_OP, 32)
|
|
58
|
+
.storeUint(args.queryId ?? 0n, 64)
|
|
59
|
+
.storeCoins(args.amount)
|
|
60
|
+
.storeAddress(parseTonAddress(args.destination))
|
|
61
|
+
.storeAddress(parseTonAddress(args.responseDestination))
|
|
62
|
+
.storeBit(false)
|
|
63
|
+
.storeCoins(args.forwardTonAmount ?? 0n);
|
|
64
|
+
return args.forwardPayload === undefined
|
|
65
|
+
? builder.storeBit(false).endCell()
|
|
66
|
+
: builder.storeBit(true).storeRef(args.forwardPayload).endCell();
|
|
67
|
+
}
|
|
68
|
+
export const TON_W5_SIGNED_INTERNAL_OP = 0x73696e74;
|
|
69
|
+
export const TON_W5_SIGNED_EXTERNAL_OP = 0x7369676e;
|
|
70
|
+
/**
|
|
71
|
+
* The fields of a signed W5R1 request body: op, wallet id, `valid_until` and
|
|
72
|
+
* seqno lead the body, the signature trails it. Throws `TransactionDecodeFailed`
|
|
73
|
+
* for anything that is not one.
|
|
74
|
+
*/
|
|
75
|
+
export function tonW5RequestFields(body) {
|
|
76
|
+
try {
|
|
77
|
+
const slice = body.beginParse();
|
|
78
|
+
const op = slice.loadUint(32);
|
|
79
|
+
if (op !== TON_W5_SIGNED_EXTERNAL_OP && op !== TON_W5_SIGNED_INTERNAL_OP)
|
|
80
|
+
throw new Error(`op 0x${op.toString(16)}`);
|
|
81
|
+
return {
|
|
82
|
+
authType: op === TON_W5_SIGNED_EXTERNAL_OP ? 'external' : 'internal',
|
|
83
|
+
walletId: slice.loadInt(32),
|
|
84
|
+
validUntil: slice.loadUint(32),
|
|
85
|
+
seqno: slice.loadUint(32),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
throw new ChainError(ChainErrorKinds.TransactionDecodeFailed, `Not a signed W5 request: ${err.message}`, undefined, err);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const ED25519_SIGNATURE_BITS = 512;
|
|
93
|
+
/**
|
|
94
|
+
* The fields of any signed wallet request body the SDK builds. A v3r2 / v4r2
|
|
95
|
+
* body is the signature, then wallet id, valid_until and seqno, every field
|
|
96
|
+
* whole bytes; a W5 body leads with its op and is never byte-aligned (its
|
|
97
|
+
* action-list flags are two bits). Throws `TransactionDecodeFailed` for
|
|
98
|
+
* anything else.
|
|
99
|
+
*/
|
|
100
|
+
export function tonWalletRequestFields(body) {
|
|
101
|
+
if (body.bits.length % 8 !== 0)
|
|
102
|
+
return { layout: 'w5', ...tonW5RequestFields(body) };
|
|
103
|
+
try {
|
|
104
|
+
const slice = body.beginParse();
|
|
105
|
+
slice.skip(ED25519_SIGNATURE_BITS);
|
|
106
|
+
return { layout: 'legacy', walletId: slice.loadUint(32), validUntil: slice.loadUint(32), seqno: slice.loadUint(32) };
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
throw new ChainError(ChainErrorKinds.TransactionDecodeFailed, `Not a signed wallet request: ${err.message}`, undefined, err);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/** A signed internal request read back from its body, e.g. one found in a trace. */
|
|
113
|
+
export function tonInternalRequestOf(body) {
|
|
114
|
+
const fields = tonW5RequestFields(body);
|
|
115
|
+
if (fields.authType !== 'internal') {
|
|
116
|
+
throw new ChainError(ChainErrorKinds.TransactionDecodeFailed, 'Not a signed W5 internal request: it is an external one');
|
|
117
|
+
}
|
|
118
|
+
return { body, seqno: fields.seqno, validUntil: fields.validUntil };
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* The message a relayer sends to deliver a wallet's signed internal request.
|
|
122
|
+
*
|
|
123
|
+
* Bounceable, so a request that fails in the wallet returns the value. A
|
|
124
|
+
* request the wallet does not accept (a bad signature, a stale seqno) is
|
|
125
|
+
* dropped without a bounce and the wallet keeps the value; the transaction
|
|
126
|
+
* status reports that as `request_not_executed`.
|
|
127
|
+
*/
|
|
128
|
+
export function tonRelayMessage(args) {
|
|
129
|
+
if (args.wallet.version !== undefined && args.wallet.version !== 'v5r1') {
|
|
130
|
+
throw new ChainError(ChainErrorKinds.FeatureNotSupported, `Only W5 (v5r1) wallets take relayed requests; ${args.wallet.address} is ${args.wallet.version}`);
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
to: args.wallet.address,
|
|
134
|
+
value: args.value,
|
|
135
|
+
body: args.request.body,
|
|
136
|
+
bounce: true,
|
|
137
|
+
stateInit: args.deploy ? args.wallet.stateInit : undefined,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* The normalized hash of an external message (TEP-467): source, import fee and
|
|
142
|
+
* StateInit dropped, body stored as a reference. It is what both TON Center and
|
|
143
|
+
* TonAPI index the external message under, and is used as the transaction id.
|
|
144
|
+
*/
|
|
145
|
+
export function tonNormalizedExternalHash(destination, body) {
|
|
146
|
+
const normalized = beginCell()
|
|
147
|
+
.store(storeMessage({ info: { type: 'external-in', src: null, dest: parseTonAddress(destination), importFee: 0n }, body }, { forceRef: true }))
|
|
148
|
+
.endCell();
|
|
149
|
+
return normalized.hash().toString('hex');
|
|
150
|
+
}
|
|
151
|
+
export function parseTonAddress(address) {
|
|
152
|
+
try {
|
|
153
|
+
return Address.parse(address);
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
throw new ChainError(ChainErrorKinds.InvalidAddress, `Invalid TON address: ${address}`, { address }, err);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=ton_messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ton_messages.js","sourceRoot":"","sources":["../../../ton/ton_messages.ts"],"names":[],"mappings":"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"}
|