@getomnichain/omnichain 0.6.3 → 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 +38 -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/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/docs/README.md +2 -1
- package/docs/ton.md +164 -0
- package/package.json +5 -1
|
@@ -0,0 +1,479 @@
|
|
|
1
|
+
import { SendMode } from '@ton/core';
|
|
2
|
+
import { signVerify } from '@ton/crypto';
|
|
3
|
+
import { Chain, resolveTransferAmount, } from "../chain.base.js";
|
|
4
|
+
import { ChainType } from "../chain_type.js";
|
|
5
|
+
import { ChainError, ChainErrorKinds } from "../errors.js";
|
|
6
|
+
import { NetworkType } from "../network_type.js";
|
|
7
|
+
import { AssetBalanceChange } from "../transaction_status.js";
|
|
8
|
+
import { TonAddress, tonRawAddress } from "./ton_address.js";
|
|
9
|
+
import { TonAsset } from "./ton_asset.js";
|
|
10
|
+
import { readTonJettonMetadata } from "./ton_jetton_metadata.js";
|
|
11
|
+
import { TON_JETTON_TRANSFER_OP, TonSignedMessage, tonCommentBody, tonJettonTransferBody, tonMessageHash, tonWalletRequestFields, } from "./ton_messages.js";
|
|
12
|
+
import { TonBroadcastUncertainError, TonFallbackProvider, TonProviderError, assertTonTxHash, } from "./ton_provider.js";
|
|
13
|
+
import { ToncenterProvider } from "./ton_toncenter.js";
|
|
14
|
+
import { TonapiProvider } from "./ton_tonapi.js";
|
|
15
|
+
import { TonTransactionStatus, summarizeTonTrace } from "./ton_transaction_status.js";
|
|
16
|
+
import { TonUnsignedTransaction, tonExternalBocHash } from "./ton_transactions.js";
|
|
17
|
+
/** TON a jetton transfer carries to the sender's jetton wallet; the excess returns to `responseDestination`. */
|
|
18
|
+
export const DEFAULT_JETTON_TRANSFER_ATTACHED_NANOTON = 50000000n;
|
|
19
|
+
/** TON forwarded to the jetton recipient with the transfer notification. */
|
|
20
|
+
export const DEFAULT_JETTON_FORWARD_NANOTON = 1n;
|
|
21
|
+
/**
|
|
22
|
+
* How far past a request's `validUntil` the masterchain must be before the
|
|
23
|
+
* request counts as expired; shard blocks and the provider's state can trail
|
|
24
|
+
* the masterchain head by a few seconds.
|
|
25
|
+
*/
|
|
26
|
+
export const REQUEST_EXPIRY_MARGIN_SECONDS = 60;
|
|
27
|
+
function strictHex(value, bytes, what) {
|
|
28
|
+
if (!new RegExp(`^[0-9a-fA-F]{${bytes * 2}}$`).test(value)) {
|
|
29
|
+
throw new ChainError(ChainErrorKinds.InvalidArgument, `A TON ${what} is ${bytes * 2} hex characters`);
|
|
30
|
+
}
|
|
31
|
+
return Buffer.from(value, 'hex');
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* A TON chain, read through TON Center v3 with TonAPI as the fallback.
|
|
35
|
+
*
|
|
36
|
+
* Transaction ids are normalized external-message hashes (lowercase hex), and
|
|
37
|
+
* a transaction's status covers its whole trace.
|
|
38
|
+
*/
|
|
39
|
+
export class TonChain extends Chain {
|
|
40
|
+
#init;
|
|
41
|
+
#jettons = new Map();
|
|
42
|
+
#provider;
|
|
43
|
+
_nativeAsset;
|
|
44
|
+
constructor(init) {
|
|
45
|
+
super(init.chainId, init.name, NetworkType.TON, 5, 'TON', init.explorerUrl);
|
|
46
|
+
this.#init = init;
|
|
47
|
+
this.#provider = init.provider ?? null;
|
|
48
|
+
this._nativeAsset = new TonAsset(init.chainId, 'TON', null, TonAsset.NATIVE_DECIMALS);
|
|
49
|
+
}
|
|
50
|
+
/** The configured provider, built on first use so a chain without keys can still be constructed. */
|
|
51
|
+
get provider() {
|
|
52
|
+
if (this.#provider === null) {
|
|
53
|
+
const toncenter = endpointOf('TON Center', this.#init.toncenter, 'TONCENTER_API_KEY');
|
|
54
|
+
if (toncenter === null) {
|
|
55
|
+
throw new ChainError(ChainErrorKinds.RpcNotConfigured, `${this.name}: a TON Center API key is required`, {
|
|
56
|
+
chainId: this.chainId,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
const tonapi = this.#init.tonapi === undefined || this.#init.tonapi === null
|
|
60
|
+
? null
|
|
61
|
+
: endpointOf('TonAPI', this.#init.tonapi, 'TONAPI_API_KEY');
|
|
62
|
+
this.#provider = new TonFallbackProvider(new ToncenterProvider(toncenter), tonapi === null ? null : new TonapiProvider(tonapi));
|
|
63
|
+
}
|
|
64
|
+
return this.#provider;
|
|
65
|
+
}
|
|
66
|
+
get chainType() {
|
|
67
|
+
return ChainType.TON;
|
|
68
|
+
}
|
|
69
|
+
get nativeToken() {
|
|
70
|
+
return this._nativeAsset;
|
|
71
|
+
}
|
|
72
|
+
get nativeAsset() {
|
|
73
|
+
return this._nativeAsset;
|
|
74
|
+
}
|
|
75
|
+
getWalletExplorerUrl(address) {
|
|
76
|
+
return `${this.explorerBaseUrl}/${new TonAddress(address).toUserFriendly({ bounceable: false })}`;
|
|
77
|
+
}
|
|
78
|
+
/** A jetton master is a contract, so its link uses the bounceable (`EQ…`) form. */
|
|
79
|
+
getTokenExplorerUrl(tokenIdentifier) {
|
|
80
|
+
if (tokenIdentifier === undefined)
|
|
81
|
+
return this.explorerBaseUrl;
|
|
82
|
+
return `${this.explorerBaseUrl}/${new TonAddress(tokenIdentifier).toUserFriendly({ bounceable: true })}`;
|
|
83
|
+
}
|
|
84
|
+
/** `null` for native TON. */
|
|
85
|
+
getAssetExplorerUrl(asset) {
|
|
86
|
+
if (!(asset instanceof TonAsset)) {
|
|
87
|
+
throw new ChainError(ChainErrorKinds.InvalidArgument, `Invalid asset ${String(asset)}, expected TonAsset`, { chainId: this.chainId });
|
|
88
|
+
}
|
|
89
|
+
return asset.jettonMaster === null ? null : this.getTokenExplorerUrl(asset.jettonMaster);
|
|
90
|
+
}
|
|
91
|
+
getTransactionExplorerUrl(txHash) {
|
|
92
|
+
return `${this.explorerBaseUrl}/transaction/${txHash}`;
|
|
93
|
+
}
|
|
94
|
+
validateAddress(raw) {
|
|
95
|
+
try {
|
|
96
|
+
const { workchain } = new TonAddress(raw);
|
|
97
|
+
return workchain === 0 || workchain === -1;
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
validateTokenIdentifier(raw) {
|
|
104
|
+
return raw === undefined || this.validateAddress(raw);
|
|
105
|
+
}
|
|
106
|
+
getAccountState(address) {
|
|
107
|
+
return this.provider.getAccountState(tonRawAddress(address));
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* The wallet's seqno, read live from its get-method rather than from the
|
|
111
|
+
* indexed account state, which can trail a deploy; 0 while it has no code.
|
|
112
|
+
*/
|
|
113
|
+
getSeqno(address) {
|
|
114
|
+
return this.provider.getSeqno(tonRawAddress(address));
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Native TON for no identifier; otherwise the jetton whose master
|
|
118
|
+
* `identifier` names, its symbol and decimals read from its TEP-64
|
|
119
|
+
* metadata ({@link getJettonMetadata}). Resolved jettons are kept for the
|
|
120
|
+
* chain's lifetime.
|
|
121
|
+
*/
|
|
122
|
+
async resolveAsset(identifier) {
|
|
123
|
+
if (identifier === null || identifier === undefined)
|
|
124
|
+
return this._nativeAsset;
|
|
125
|
+
const master = tonRawAddress(identifier);
|
|
126
|
+
const known = this.#jettons.get(master);
|
|
127
|
+
if (known !== undefined)
|
|
128
|
+
return known;
|
|
129
|
+
const metadata = await this.getJettonMetadata(master);
|
|
130
|
+
// As Python does: a jetton whose metadata names no symbol is called by its address's first characters.
|
|
131
|
+
const symbol = metadata.symbol ?? new TonAddress(master).toUserFriendly({ bounceable: true }).slice(0, 4);
|
|
132
|
+
const asset = new TonAsset(this.chainId, symbol, master, metadata.decimals);
|
|
133
|
+
this.#jettons.set(master, asset);
|
|
134
|
+
return asset;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* A jetton's TEP-64 metadata: the master's `get_jetton_data` content, and the
|
|
138
|
+
* off-chain JSON its URI names (https) for what the content lacks. Throws
|
|
139
|
+
* `InvalidTokenIdentifier` for anything that is not a jetton master, and
|
|
140
|
+
* (retryably) when the decimals cannot be read.
|
|
141
|
+
*/
|
|
142
|
+
async getJettonMetadata(jettonMaster) {
|
|
143
|
+
return readTonJettonMetadata(await this.provider.getJettonContent(tonRawAddress(jettonMaster)), this.#init.fetchMetadata);
|
|
144
|
+
}
|
|
145
|
+
createAsset(symbol, identifier, decimals) {
|
|
146
|
+
if (identifier === null || identifier === undefined) {
|
|
147
|
+
if (symbol !== 'TON' || decimals !== TonAsset.NATIVE_DECIMALS) {
|
|
148
|
+
throw new ChainError(ChainErrorKinds.InvalidArgument, `Native TON is TON with ${TonAsset.NATIVE_DECIMALS} decimals`, { chainId: this.chainId });
|
|
149
|
+
}
|
|
150
|
+
return this._nativeAsset;
|
|
151
|
+
}
|
|
152
|
+
return this.getJettonAsset(symbol, identifier, decimals);
|
|
153
|
+
}
|
|
154
|
+
getJettonAsset(symbol, jettonMaster, decimals) {
|
|
155
|
+
return new TonAsset(this.chainId, symbol, jettonMaster, decimals);
|
|
156
|
+
}
|
|
157
|
+
/** The jetton wallet `owner` has (or will have) for `jettonMaster`, raw. */
|
|
158
|
+
getJettonWalletAddress(jettonMaster, owner) {
|
|
159
|
+
return this.provider.getJettonWalletAddress(tonRawAddress(jettonMaster), tonRawAddress(owner));
|
|
160
|
+
}
|
|
161
|
+
/** Nanotons, or the jetton's smallest unit when `tokenIdentifier` is a jetton master. */
|
|
162
|
+
async getBalance(owner, tokenIdentifier) {
|
|
163
|
+
if (tokenIdentifier === undefined)
|
|
164
|
+
return (await this.getAccountState(owner)).balance;
|
|
165
|
+
return this.provider.getJettonBalance(await this.getJettonWalletAddress(tokenIdentifier, owner));
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* A transfer from `from`: native TON (with `memo` as a text comment), or a
|
|
169
|
+
* jetton through the sender's jetton wallet, the excess returned to the
|
|
170
|
+
* sender. `amountHr` takes the jetton's decimals from its metadata.
|
|
171
|
+
*
|
|
172
|
+
* - `isFullBalance`: native TON sends everything the wallet holds (send mode
|
|
173
|
+
* 128 + 2, value 0); a jetton sends the jetton wallet's whole balance.
|
|
174
|
+
* - Native `bounce`, unless given: only to a bounceable (`EQ…`) address
|
|
175
|
+
* that is deployed — a contract that fails then returns the TON, and a
|
|
176
|
+
* wallet not deployed yet still receives it, as TON wallets send.
|
|
177
|
+
* - Jetton transfers are always bounceable unless `bounce` says otherwise,
|
|
178
|
+
* carry {@link DEFAULT_JETTON_TRANSFER_ATTACHED_NANOTON} and forward
|
|
179
|
+
* {@link DEFAULT_JETTON_FORWARD_NANOTON}; `jettonAttachedNanoton`,
|
|
180
|
+
* `forwardTonAmountNanoton` and `sendMode` override.
|
|
181
|
+
*/
|
|
182
|
+
async createTransferUnsignedTransaction(req) {
|
|
183
|
+
if (req.from === undefined) {
|
|
184
|
+
throw new ChainError(ChainErrorKinds.InvalidArgument, 'TON transfers need `from`', { chainId: this.chainId });
|
|
185
|
+
}
|
|
186
|
+
if (req.gasPricing !== undefined) {
|
|
187
|
+
throw new ChainError(ChainErrorKinds.InvalidArgument, 'TON transfers take no gasPricing', { chainId: this.chainId });
|
|
188
|
+
}
|
|
189
|
+
const from = req.from;
|
|
190
|
+
const comment = req.memo === undefined ? undefined : tonCommentBody(req.memo);
|
|
191
|
+
const jettonMaster = req.tokenIdentifier;
|
|
192
|
+
if (jettonMaster === undefined) {
|
|
193
|
+
const resolved = resolveTransferAmount(req, TonAsset.NATIVE_DECIMALS);
|
|
194
|
+
const full = resolved.kind === 'full';
|
|
195
|
+
return new TonUnsignedTransaction({
|
|
196
|
+
chainId: this.chainId,
|
|
197
|
+
walletAddress: from,
|
|
198
|
+
messages: [
|
|
199
|
+
{
|
|
200
|
+
to: req.to,
|
|
201
|
+
value: full ? 0n : resolved.amountMr,
|
|
202
|
+
body: comment,
|
|
203
|
+
bounce: req.bounce ?? (await this.bouncesByDefault(req.to)),
|
|
204
|
+
mode: req.sendMode ?? (full ? SendMode.CARRY_ALL_REMAINING_BALANCE | SendMode.IGNORE_ERRORS : undefined),
|
|
205
|
+
},
|
|
206
|
+
],
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
// Only a human-readable amount needs the jetton's decimals, and so its metadata.
|
|
210
|
+
const decimals = req.amountHr === undefined ? 0 : (await this.resolveAsset(jettonMaster)).decimals;
|
|
211
|
+
const resolved = resolveTransferAmount(req, decimals);
|
|
212
|
+
const amount = resolved.kind === 'full' ? await this.getBalance(from, jettonMaster) : resolved.amountMr;
|
|
213
|
+
if (amount === 0n) {
|
|
214
|
+
throw new ChainError(ChainErrorKinds.InsufficientFunds, `${from} holds none of ${jettonMaster}`, { chainId: this.chainId });
|
|
215
|
+
}
|
|
216
|
+
return new TonUnsignedTransaction({
|
|
217
|
+
chainId: this.chainId,
|
|
218
|
+
walletAddress: from,
|
|
219
|
+
messages: [
|
|
220
|
+
{
|
|
221
|
+
to: await this.getJettonWalletAddress(jettonMaster, from),
|
|
222
|
+
value: req.jettonAttachedNanoton ?? DEFAULT_JETTON_TRANSFER_ATTACHED_NANOTON,
|
|
223
|
+
bounce: req.bounce ?? true,
|
|
224
|
+
mode: req.sendMode,
|
|
225
|
+
body: tonJettonTransferBody({
|
|
226
|
+
amount,
|
|
227
|
+
destination: req.to,
|
|
228
|
+
responseDestination: from,
|
|
229
|
+
forwardTonAmount: req.forwardTonAmountNanoton ?? DEFAULT_JETTON_FORWARD_NANOTON,
|
|
230
|
+
forwardPayload: comment,
|
|
231
|
+
}),
|
|
232
|
+
},
|
|
233
|
+
],
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Emulates the whole trace of an external message (signature ignored): what
|
|
238
|
+
* it would cost, and whether every transaction would succeed with nothing
|
|
239
|
+
* bounced. Throws `SimulationFailed` when the message would be refused
|
|
240
|
+
* outright.
|
|
241
|
+
*/
|
|
242
|
+
async emulate(boc) {
|
|
243
|
+
const trace = await this.provider.emulate(boc);
|
|
244
|
+
const summary = summarizeTonTrace(this.chainId, trace);
|
|
245
|
+
await this.addJettonBalanceChanges(trace, summary.jettonCredits, summary.balanceChanges);
|
|
246
|
+
return { trace, ...summary };
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Sends an external message (base64 BOC or bytes) and returns its normalized
|
|
250
|
+
* hash. Throws `TonBroadcastUncertainError` when the message may have reached
|
|
251
|
+
* the network anyway; re-signing then can pay twice.
|
|
252
|
+
*/
|
|
253
|
+
async broadcast(signed, opts) {
|
|
254
|
+
if (opts?.signal !== undefined) {
|
|
255
|
+
throw new ChainError(ChainErrorKinds.FeatureNotSupported, 'TON broadcast does not take a signal', { chainId: this.chainId });
|
|
256
|
+
}
|
|
257
|
+
const boc = typeof signed === 'string' ? signed : Buffer.from(signed).toString('base64');
|
|
258
|
+
const hash = tonExternalBocHash(boc);
|
|
259
|
+
try {
|
|
260
|
+
await this.provider.sendBoc(boc);
|
|
261
|
+
}
|
|
262
|
+
catch (err) {
|
|
263
|
+
if (err instanceof TonBroadcastUncertainError) {
|
|
264
|
+
throw new TonBroadcastUncertainError(err.message, { chainId: this.chainId, txHash: hash }, err);
|
|
265
|
+
}
|
|
266
|
+
if (err instanceof TonProviderError) {
|
|
267
|
+
throw new ChainError(err.kind, err.message, { chainId: this.chainId, txHash: hash }, err);
|
|
268
|
+
}
|
|
269
|
+
throw err;
|
|
270
|
+
}
|
|
271
|
+
return hash;
|
|
272
|
+
}
|
|
273
|
+
broadcastSignedTransaction(signed) {
|
|
274
|
+
if (signed.chainId !== this.chainId) {
|
|
275
|
+
throw new ChainError(ChainErrorKinds.InvalidArgument, `Signed for chain ${signed.chainId}, not ${this.chainId}`);
|
|
276
|
+
}
|
|
277
|
+
return this.broadcast(signed.boc);
|
|
278
|
+
}
|
|
279
|
+
async getTransactionStatus(hashOrHashes, opts = {}) {
|
|
280
|
+
if (Array.isArray(hashOrHashes)) {
|
|
281
|
+
const statuses = [];
|
|
282
|
+
for (const hash of hashOrHashes)
|
|
283
|
+
statuses.push(await this.statusOf(hash, opts));
|
|
284
|
+
return statuses;
|
|
285
|
+
}
|
|
286
|
+
return this.statusOf(hashOrHashes, opts);
|
|
287
|
+
}
|
|
288
|
+
/** The masterchain's latest block. */
|
|
289
|
+
async getChainTipHeight() {
|
|
290
|
+
return (await this.provider.getMasterchainHead()).seqno;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Where a signed request stands, so it is never replaced while it can still
|
|
294
|
+
* execute — the one check to make before signing a replacement, after a
|
|
295
|
+
* `Failed` relayed request or an uncertain broadcast:
|
|
296
|
+
* - `consumed`: the wallet's seqno has moved past the request's, or (given
|
|
297
|
+
* `hash`, for an external request) the request has a trace. It executed —
|
|
298
|
+
* or another request signed with the same seqno did. Do not re-sign it;
|
|
299
|
+
* read its status (`getTransactionStatus(hash)`, or the relay's).
|
|
300
|
+
* - `expired`: the chain's own time (not this machine's) is past
|
|
301
|
+
* `validUntil` by {@link REQUEST_EXPIRY_MARGIN_SECONDS}, with the seqno
|
|
302
|
+
* not moved past it and no trace. It can never execute; replacing it is
|
|
303
|
+
* safe.
|
|
304
|
+
* - `live`: neither yet. It can still execute — a relayed request that
|
|
305
|
+
* failed included: W5 keeps an internal request's seqno only when the
|
|
306
|
+
* transaction succeeds, so anyone can deliver it again from the trace
|
|
307
|
+
* until `validUntil`.
|
|
308
|
+
*
|
|
309
|
+
* `wallet` is the wallet that signed it: the sender of an external request,
|
|
310
|
+
* the target of a relayed one (pass no `hash` for a relayed request; a
|
|
311
|
+
* relay's own hash is the relayer's request). All reads come from one
|
|
312
|
+
* provider.
|
|
313
|
+
*/
|
|
314
|
+
async getRequestState(args) {
|
|
315
|
+
if (args.hash !== undefined)
|
|
316
|
+
this.assertTxHash(args.hash);
|
|
317
|
+
const wallet = tonRawAddress(args.wallet);
|
|
318
|
+
return this.onOneProvider('getRequestState', async (provider) => {
|
|
319
|
+
if ((await provider.getSeqno(wallet)) > args.seqno)
|
|
320
|
+
return 'consumed';
|
|
321
|
+
const trace = args.hash === undefined ? null : await provider.getTrace(args.hash);
|
|
322
|
+
if (trace !== null) {
|
|
323
|
+
// A relay's hash names the relayer's request, not the relayed one: its
|
|
324
|
+
// trace says nothing about whether the target's request executed.
|
|
325
|
+
const root = trace.transactions[0];
|
|
326
|
+
if (root !== undefined && root.parent === null) {
|
|
327
|
+
if (root.account !== wallet) {
|
|
328
|
+
throw new ChainError(ChainErrorKinds.InvalidArgument, `${args.hash} is a request of ${root.account}, not of ${wallet}; for a relayed request pass no hash`, { chainId: this.chainId, txHash: args.hash });
|
|
329
|
+
}
|
|
330
|
+
// The provider bound the trace to `hash`, so its root carries the signed request.
|
|
331
|
+
const signedSeqno = tonWalletRequestFields(root.inMsg?.body).seqno;
|
|
332
|
+
if (signedSeqno !== args.seqno) {
|
|
333
|
+
throw new ChainError(ChainErrorKinds.InvalidArgument, `${args.hash} was signed at seqno ${signedSeqno}, not ${args.seqno}`, { chainId: this.chainId, txHash: args.hash });
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
return 'consumed';
|
|
337
|
+
}
|
|
338
|
+
const head = await provider.getMasterchainHead();
|
|
339
|
+
return head.utime > args.validUntil + REQUEST_EXPIRY_MARGIN_SECONDS ? 'expired' : 'live';
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
/** Native TON bounces only to a bounceable (`EQ…`) address that is deployed. */
|
|
343
|
+
async bouncesByDefault(to) {
|
|
344
|
+
if (new TonAddress(to).isBounceable !== true)
|
|
345
|
+
return false;
|
|
346
|
+
return (await this.getAccountState(to)).status === 'active';
|
|
347
|
+
}
|
|
348
|
+
assertTxHash(hash) {
|
|
349
|
+
try {
|
|
350
|
+
assertTonTxHash(hash);
|
|
351
|
+
}
|
|
352
|
+
catch (err) {
|
|
353
|
+
throw new ChainError(ChainErrorKinds.InvalidArgument, err.message, { chainId: this.chainId });
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
onOneProvider(method, run) {
|
|
357
|
+
const provider = this.provider;
|
|
358
|
+
return provider instanceof TonFallbackProvider ? provider.onOneProvider(method, run) : run(provider);
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Whether `signedMessage` is `publicKey`'s signature of `message`
|
|
362
|
+
* (`TonWallet.signMessage`: ed25519 over {@link tonMessageHash}). Needs only
|
|
363
|
+
* the public key — 32 bytes, or 64 hex characters — as Tron's and
|
|
364
|
+
* Stellar's do. A signature must be exactly 128 hex characters.
|
|
365
|
+
*/
|
|
366
|
+
static verifySignature(publicKey, message, signedMessage) {
|
|
367
|
+
if (!(signedMessage instanceof TonSignedMessage)) {
|
|
368
|
+
throw new ChainError(ChainErrorKinds.InvalidArgument, `TonChain expected a TonSignedMessage, got ${signedMessage?.constructor?.name ?? typeof signedMessage}`);
|
|
369
|
+
}
|
|
370
|
+
const key = typeof publicKey === 'string' ? strictHex(publicKey, 32, 'public key') : Buffer.from(publicKey);
|
|
371
|
+
if (key.length !== 32)
|
|
372
|
+
throw new ChainError(ChainErrorKinds.InvalidArgument, `A TON public key is 32 bytes, got ${key.length}`);
|
|
373
|
+
if (!/^[0-9a-fA-F]{128}$/.test(signedMessage.signature))
|
|
374
|
+
return false;
|
|
375
|
+
try {
|
|
376
|
+
return signVerify(tonMessageHash(message), Buffer.from(signedMessage.signature, 'hex'), key);
|
|
377
|
+
}
|
|
378
|
+
catch {
|
|
379
|
+
return false;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* TON addresses do not reveal their key, so a signature cannot be checked
|
|
384
|
+
* against an address alone: use `TonChain.verifySignature` with the
|
|
385
|
+
* signer's public key (its W5 address is `WalletContractV5R1.create({
|
|
386
|
+
* publicKey, workchain: 0 }).address`).
|
|
387
|
+
*/
|
|
388
|
+
async verifyMessageSignature(_req) {
|
|
389
|
+
throw new ChainError(ChainErrorKinds.FeatureNotSupported, 'TON message signatures need the signer public key; use TonChain.verifySignature(publicKey, message, signature)', { chainId: this.chainId });
|
|
390
|
+
}
|
|
391
|
+
async statusOf(hash, opts) {
|
|
392
|
+
this.assertTxHash(hash);
|
|
393
|
+
const trace = await this.provider.getTrace(hash);
|
|
394
|
+
const masterchainTip = trace === null ? 0 : (await this.provider.getMasterchainHead()).seqno;
|
|
395
|
+
const status = TonTransactionStatus.fromTrace({
|
|
396
|
+
chainId: this.chainId,
|
|
397
|
+
trace,
|
|
398
|
+
masterchainTip,
|
|
399
|
+
minMasterchainDepth: opts.minMasterchainDepth,
|
|
400
|
+
});
|
|
401
|
+
if (trace !== null && status.balanceChanges !== null)
|
|
402
|
+
await this.addJettonBalanceChanges(trace, status.jettonCredits, status.balanceChanges);
|
|
403
|
+
return status;
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Adds the jetton balance changes of the trace's wallet-to-wallet jetton
|
|
407
|
+
* transfers (TEP-74 \`transfer\` → \`internal_transfer\`) to
|
|
408
|
+
* \`balanceChanges\`: the sending owner loses the amount and the recipient
|
|
409
|
+
* gains it, in the jetton's asset ({@link resolveAsset}).
|
|
410
|
+
*
|
|
411
|
+
* A transfer counts only once its master vouches for both jetton wallets:
|
|
412
|
+
* the sender's must be the master's wallet for the owner it reports, and
|
|
413
|
+
* the receiving one the master's wallet for the recipient the transfer
|
|
414
|
+
* named. Anything else — a contract posing as a jetton wallet, a mint or a
|
|
415
|
+
* burn — moves no balance here.
|
|
416
|
+
*/
|
|
417
|
+
async addJettonBalanceChanges(trace, credits, balanceChanges) {
|
|
418
|
+
const byHash = new Map(trace.transactions.map((tx) => [tx.hash, tx]));
|
|
419
|
+
const walletData = new Map();
|
|
420
|
+
const walletOf = new Map();
|
|
421
|
+
const dataOf = (wallet) => {
|
|
422
|
+
if (!walletData.has(wallet))
|
|
423
|
+
walletData.set(wallet, this.provider.getJettonWalletData(wallet));
|
|
424
|
+
return walletData.get(wallet);
|
|
425
|
+
};
|
|
426
|
+
const walletAddressOf = (master, owner) => {
|
|
427
|
+
const key = `${master}|${owner}`;
|
|
428
|
+
if (!walletOf.has(key))
|
|
429
|
+
walletOf.set(key, this.provider.getJettonWalletAddress(master, owner));
|
|
430
|
+
return walletOf.get(key);
|
|
431
|
+
};
|
|
432
|
+
for (const credit of credits) {
|
|
433
|
+
const received = byHash.get(credit.transaction);
|
|
434
|
+
const sender = received?.parent === null || received?.parent === undefined ? undefined : byHash.get(received.parent);
|
|
435
|
+
const recipient = sender?.inMsg === null || sender?.inMsg === undefined ? null : jettonTransferDestinationOf(sender.inMsg);
|
|
436
|
+
if (credit.senderJettonWallet === null || sender === undefined || recipient === null)
|
|
437
|
+
continue;
|
|
438
|
+
const data = await dataOf(credit.senderJettonWallet);
|
|
439
|
+
if (data === null)
|
|
440
|
+
continue;
|
|
441
|
+
const [senderWallet, recipientWallet] = await Promise.all([
|
|
442
|
+
walletAddressOf(data.jettonMaster, data.owner),
|
|
443
|
+
walletAddressOf(data.jettonMaster, recipient),
|
|
444
|
+
]);
|
|
445
|
+
if (senderWallet !== credit.senderJettonWallet || recipientWallet !== credit.jettonWallet)
|
|
446
|
+
continue;
|
|
447
|
+
const asset = await this.resolveAsset(data.jettonMaster);
|
|
448
|
+
AssetBalanceChange.upsert(balanceChanges, data.owner, asset, AssetBalanceChange.fromMr(-credit.amount, asset.decimals));
|
|
449
|
+
AssetBalanceChange.upsert(balanceChanges, recipient, asset, AssetBalanceChange.fromMr(credit.amount, asset.decimals));
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
/** The recipient owner a jetton \`transfer\` names, raw; \`null\` for any other message. */
|
|
454
|
+
function jettonTransferDestinationOf(message) {
|
|
455
|
+
if (message.opcode !== TON_JETTON_TRANSFER_OP || message.body === null)
|
|
456
|
+
return null;
|
|
457
|
+
try {
|
|
458
|
+
const slice = message.body.beginParse();
|
|
459
|
+
slice.skip(32 + 64);
|
|
460
|
+
slice.loadCoins();
|
|
461
|
+
return slice.loadAddress().toRawString();
|
|
462
|
+
}
|
|
463
|
+
catch {
|
|
464
|
+
return null;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
function endpointOf(name, endpoint, apiKeyEnv) {
|
|
468
|
+
const apiKey = (endpoint.apiKey ?? readEnv()?.[apiKeyEnv] ?? '').trim();
|
|
469
|
+
if (apiKey.length === 0)
|
|
470
|
+
return null;
|
|
471
|
+
if (!/^https:\/\//.test(endpoint.url)) {
|
|
472
|
+
throw new ChainError(ChainErrorKinds.InvalidArgument, `${name} URL must be https, got ${endpoint.url}`);
|
|
473
|
+
}
|
|
474
|
+
return { url: endpoint.url, apiKey, timeoutMs: endpoint.timeoutMs };
|
|
475
|
+
}
|
|
476
|
+
function readEnv() {
|
|
477
|
+
return globalThis.process?.env;
|
|
478
|
+
}
|
|
479
|
+
//# sourceMappingURL=ton_chain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ton_chain.js","sourceRoot":"","sources":["../../../ton/ton_chain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { TonChain } from './ton_chain.ts';
|
|
2
|
+
export declare const TON_CENTER_MAINNET_URL = "https://toncenter.com";
|
|
3
|
+
export declare const TONAPI_MAINNET_URL = "https://tonapi.io";
|
|
4
|
+
/**
|
|
5
|
+
* TON mainnet. Its keys are read at first use from `TONCENTER_API_KEY` and
|
|
6
|
+
* `TONAPI_API_KEY`; a service that holds them elsewhere builds its own
|
|
7
|
+
* `TonChain` with the same URLs.
|
|
8
|
+
*/
|
|
9
|
+
export declare const TonMainnet: TonChain;
|
|
10
|
+
export declare const ALL_TON_CHAINS: ReadonlyArray<TonChain>;
|
|
11
|
+
//# sourceMappingURL=ton_chains.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ton_chains.d.ts","sourceRoot":"","sources":["../../../ton/ton_chains.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,eAAO,MAAM,sBAAsB,0BAA0B,CAAC;AAC9D,eAAO,MAAM,kBAAkB,sBAAsB,CAAC;AAEtD;;;;GAIG;AACH,eAAO,MAAM,UAAU,UAMrB,CAAC;AAEH,eAAO,MAAM,cAAc,EAAE,aAAa,CAAC,QAAQ,CAAgB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { CHAIN_ID_TON_MAINNET } from "../chain_ids.js";
|
|
2
|
+
import { TonChain } from "./ton_chain.js";
|
|
3
|
+
export const TON_CENTER_MAINNET_URL = 'https://toncenter.com';
|
|
4
|
+
export const TONAPI_MAINNET_URL = 'https://tonapi.io';
|
|
5
|
+
/**
|
|
6
|
+
* TON mainnet. Its keys are read at first use from `TONCENTER_API_KEY` and
|
|
7
|
+
* `TONAPI_API_KEY`; a service that holds them elsewhere builds its own
|
|
8
|
+
* `TonChain` with the same URLs.
|
|
9
|
+
*/
|
|
10
|
+
export const TonMainnet = new TonChain({
|
|
11
|
+
chainId: CHAIN_ID_TON_MAINNET,
|
|
12
|
+
name: 'TON Mainnet',
|
|
13
|
+
explorerUrl: 'https://tonviewer.com',
|
|
14
|
+
toncenter: { url: TON_CENTER_MAINNET_URL },
|
|
15
|
+
tonapi: { url: TONAPI_MAINNET_URL },
|
|
16
|
+
});
|
|
17
|
+
export const ALL_TON_CHAINS = [TonMainnet];
|
|
18
|
+
//# sourceMappingURL=ton_chains.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ton_chains.js","sourceRoot":"","sources":["../../../ton/ton_chains.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,CAAC,MAAM,sBAAsB,GAAG,uBAAuB,CAAC;AAC9D,MAAM,CAAC,MAAM,kBAAkB,GAAG,mBAAmB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,QAAQ,CAAC;IACrC,OAAO,EAAE,oBAAoB;IAC7B,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,uBAAuB;IACpC,SAAS,EAAE,EAAE,GAAG,EAAE,sBAAsB,EAAE;IAC1C,MAAM,EAAE,EAAE,GAAG,EAAE,kBAAkB,EAAE;CACpC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAA4B,CAAC,UAAU,CAAC,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type Cell } from '@ton/core';
|
|
2
|
+
/** A jetton's TEP-64 metadata, as far as it could be read. */
|
|
3
|
+
export interface TonJettonMetadata {
|
|
4
|
+
symbol: string | null;
|
|
5
|
+
name: string | null;
|
|
6
|
+
/** Always set: the content's, the off-chain JSON's, or TEP-64's default of 9 when neither names one. */
|
|
7
|
+
decimals: number;
|
|
8
|
+
description: string | null;
|
|
9
|
+
image: string | null;
|
|
10
|
+
/** The off-chain metadata URI, when the content names one. */
|
|
11
|
+
uri: string | null;
|
|
12
|
+
}
|
|
13
|
+
/** Fetches a metadata URI's JSON; injectable for tests. */
|
|
14
|
+
export type TonMetadataFetcher = (uri: string) => Promise<unknown>;
|
|
15
|
+
declare const TEP64_KEYS: readonly ["uri", "name", "description", "image", "symbol", "decimals"];
|
|
16
|
+
/**
|
|
17
|
+
* The fields of a jetton master's content cell (`get_jetton_data`, TEP-64):
|
|
18
|
+
* on-chain (prefix 0x00, a dictionary keyed by the SHA-256 of each field
|
|
19
|
+
* name, values snake or chunked), or off-chain (any other prefix, a snake
|
|
20
|
+
* URI — TEP-64's 0x01 and the older variants some jettons use).
|
|
21
|
+
*/
|
|
22
|
+
export declare function parseTonJettonContent(content: Cell): {
|
|
23
|
+
fields: Partial<Record<(typeof TEP64_KEYS)[number], string>>;
|
|
24
|
+
uri: string | null;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* A jetton's metadata from its content cell, filling what the content lacks
|
|
28
|
+
* from the off-chain JSON its URI names (https only).
|
|
29
|
+
*
|
|
30
|
+
* The decimals decide every amount, so they are never guessed: when the
|
|
31
|
+
* content names none and the off-chain JSON could not be read, this throws
|
|
32
|
+
* (retryably). A symbol that cannot be read is `null`.
|
|
33
|
+
*/
|
|
34
|
+
export declare function readTonJettonMetadata(content: Cell, fetchJson?: TonMetadataFetcher): Promise<TonJettonMetadata>;
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=ton_jetton_metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ton_jetton_metadata.d.ts","sourceRoot":"","sources":["../../../ton/ton_jetton_metadata.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,IAAI,EAA0B,MAAM,WAAW,CAAC;AAK9D,8DAA8D;AAC9D,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,wGAAwG;IACxG,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,8DAA8D;IAC9D,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED,2DAA2D;AAC3D,MAAM,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAEnE,QAAA,MAAM,UAAU,wEAAyE,CAAC;AAK1F;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,IAAI,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAWzI;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,GAAE,kBAAsC,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA+BxI"}
|