@ironwallet/mcp-server 1.0.0-preprod.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/LICENSE +21 -0
- package/README.md +161 -0
- package/assets/knight.png +0 -0
- package/assets/wordmark.svg +20 -0
- package/dist/api/auth.d.ts +20 -0
- package/dist/api/auth.js +92 -0
- package/dist/api/auth.js.map +1 -0
- package/dist/api/balances.d.ts +25 -0
- package/dist/api/balances.js +565 -0
- package/dist/api/balances.js.map +1 -0
- package/dist/api/http.d.ts +34 -0
- package/dist/api/http.js +277 -0
- package/dist/api/http.js.map +1 -0
- package/dist/api/relay.d.ts +49 -0
- package/dist/api/relay.js +194 -0
- package/dist/api/relay.js.map +1 -0
- package/dist/api/rpc.d.ts +10 -0
- package/dist/api/rpc.js +26 -0
- package/dist/api/rpc.js.map +1 -0
- package/dist/api/swap.d.ts +134 -0
- package/dist/api/swap.js +554 -0
- package/dist/api/swap.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.js +20 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +91 -0
- package/dist/config.js +175 -0
- package/dist/config.js.map +1 -0
- package/dist/generated/env-config.d.ts +5 -0
- package/dist/generated/env-config.js +23 -0
- package/dist/generated/env-config.js.map +1 -0
- package/dist/generated/env-profile.d.ts +15 -0
- package/dist/generated/env-profile.js +2 -0
- package/dist/generated/env-profile.js.map +1 -0
- package/dist/keystore/crypto.d.ts +17 -0
- package/dist/keystore/crypto.js +57 -0
- package/dist/keystore/crypto.js.map +1 -0
- package/dist/keystore/store.d.ts +45 -0
- package/dist/keystore/store.js +224 -0
- package/dist/keystore/store.js.map +1 -0
- package/dist/keystore/types.d.ts +31 -0
- package/dist/keystore/types.js +2 -0
- package/dist/keystore/types.js.map +1 -0
- package/dist/local-secrets.d.ts +16 -0
- package/dist/local-secrets.js +73 -0
- package/dist/local-secrets.js.map +1 -0
- package/dist/log.d.ts +30 -0
- package/dist/log.js +323 -0
- package/dist/log.js.map +1 -0
- package/dist/passphrase.d.ts +6 -0
- package/dist/passphrase.js +10 -0
- package/dist/passphrase.js.map +1 -0
- package/dist/policy.d.ts +22 -0
- package/dist/policy.js +108 -0
- package/dist/policy.js.map +1 -0
- package/dist/server.d.ts +6 -0
- package/dist/server.js +38 -0
- package/dist/server.js.map +1 -0
- package/dist/signing/bitcoin.d.ts +18 -0
- package/dist/signing/bitcoin.js +84 -0
- package/dist/signing/bitcoin.js.map +1 -0
- package/dist/signing/dispatch.d.ts +7 -0
- package/dist/signing/dispatch.js +35 -0
- package/dist/signing/dispatch.js.map +1 -0
- package/dist/signing/evm.d.ts +16 -0
- package/dist/signing/evm.js +59 -0
- package/dist/signing/evm.js.map +1 -0
- package/dist/signing/index.d.ts +10 -0
- package/dist/signing/index.js +57 -0
- package/dist/signing/index.js.map +1 -0
- package/dist/signing/solana.d.ts +18 -0
- package/dist/signing/solana.js +106 -0
- package/dist/signing/solana.js.map +1 -0
- package/dist/signing/swap.d.ts +10 -0
- package/dist/signing/swap.js +114 -0
- package/dist/signing/swap.js.map +1 -0
- package/dist/signing/ton.d.ts +33 -0
- package/dist/signing/ton.js +166 -0
- package/dist/signing/ton.js.map +1 -0
- package/dist/signing/tron.d.ts +11 -0
- package/dist/signing/tron.js +39 -0
- package/dist/signing/tron.js.map +1 -0
- package/dist/signing/types.d.ts +23 -0
- package/dist/signing/types.js +2 -0
- package/dist/signing/types.js.map +1 -0
- package/dist/signing/xrp.d.ts +11 -0
- package/dist/signing/xrp.js +122 -0
- package/dist/signing/xrp.js.map +1 -0
- package/dist/tools/helpers.d.ts +42 -0
- package/dist/tools/helpers.js +80 -0
- package/dist/tools/helpers.js.map +1 -0
- package/dist/tools/index.d.ts +7 -0
- package/dist/tools/index.js +16 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/swap.d.ts +6 -0
- package/dist/tools/swap.js +343 -0
- package/dist/tools/swap.js.map +1 -0
- package/dist/tools/transfer.d.ts +6 -0
- package/dist/tools/transfer.js +284 -0
- package/dist/tools/transfer.js.map +1 -0
- package/dist/tools/wallets.d.ts +6 -0
- package/dist/tools/wallets.js +79 -0
- package/dist/tools/wallets.js.map +1 -0
- package/dist/wallet/derive.d.ts +53 -0
- package/dist/wallet/derive.js +233 -0
- package/dist/wallet/derive.js.map +1 -0
- package/dist/web/manager.d.ts +15 -0
- package/dist/web/manager.js +444 -0
- package/dist/web/manager.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,565 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* On-chain balances read directly from RPC.
|
|
3
|
+
* - EVM: ethers JsonRpcProvider. Native via getBalance; ERC-20 via
|
|
4
|
+
* balanceOf/decimals/symbol calls.
|
|
5
|
+
* - Tron: TronGrid HTTP API. Native TRX via /wallet/getaccount; TRC-20 via
|
|
6
|
+
* /wallet/triggerconstantcontract (balanceOf) plus on-chain decimals/symbol.
|
|
7
|
+
* - Solana: native SOL via getBalance; SPL via getTokenAccountsByOwner + mint.
|
|
8
|
+
* - TON: native via getAddressBalance; jettons via TonCenter v3 indexer,
|
|
9
|
+
* with on-chain get_wallet_address + get_wallet_data as fallback.
|
|
10
|
+
*/
|
|
11
|
+
import { Contract, formatUnits, getAddress } from "ethers";
|
|
12
|
+
import { Address, beginCell, Dictionary, TonClient } from "@ton/ton";
|
|
13
|
+
import { sha256 } from "@noble/hashes/sha2.js";
|
|
14
|
+
import { getConfig, isEvmNetwork } from "../config.js";
|
|
15
|
+
import { httpJson } from "./http.js";
|
|
16
|
+
import { providerFor } from "./rpc.js";
|
|
17
|
+
import { logError, logInfo } from "../log.js";
|
|
18
|
+
const ERC20_ABI = [
|
|
19
|
+
"function balanceOf(address) view returns (uint256)",
|
|
20
|
+
"function decimals() view returns (uint8)",
|
|
21
|
+
"function symbol() view returns (string)",
|
|
22
|
+
];
|
|
23
|
+
const NATIVE_SYMBOL = {
|
|
24
|
+
ethereum: "ETH",
|
|
25
|
+
bsc: "BNB",
|
|
26
|
+
polygon: "POL",
|
|
27
|
+
base: "ETH",
|
|
28
|
+
arbitrum: "ETH",
|
|
29
|
+
optimism: "ETH",
|
|
30
|
+
avalanche: "AVAX",
|
|
31
|
+
tron: "TRX",
|
|
32
|
+
bitcoin: "BTC",
|
|
33
|
+
litecoin: "LTC",
|
|
34
|
+
doge: "DOGE",
|
|
35
|
+
solana: "SOL",
|
|
36
|
+
ton: "TON",
|
|
37
|
+
xrp: "XRP",
|
|
38
|
+
};
|
|
39
|
+
async function getEvmBalance(network, address, contractAddress) {
|
|
40
|
+
const provider = providerFor(network);
|
|
41
|
+
const owner = getAddress(address);
|
|
42
|
+
if (!contractAddress) {
|
|
43
|
+
const raw = await provider.getBalance(owner);
|
|
44
|
+
return {
|
|
45
|
+
network,
|
|
46
|
+
address: owner,
|
|
47
|
+
contractAddress: null,
|
|
48
|
+
symbol: NATIVE_SYMBOL[network],
|
|
49
|
+
decimals: 18,
|
|
50
|
+
raw: raw.toString(),
|
|
51
|
+
formatted: formatUnits(raw, 18),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
const token = getAddress(contractAddress);
|
|
55
|
+
const erc20 = new Contract(token, ERC20_ABI, provider);
|
|
56
|
+
const [raw, decimals, symbol] = await Promise.all([
|
|
57
|
+
erc20.balanceOf(owner),
|
|
58
|
+
erc20.decimals().then((d) => Number(d)).catch(() => 18),
|
|
59
|
+
erc20.symbol().catch(() => "TOKEN"),
|
|
60
|
+
]);
|
|
61
|
+
return {
|
|
62
|
+
network,
|
|
63
|
+
address: owner,
|
|
64
|
+
contractAddress: token,
|
|
65
|
+
symbol,
|
|
66
|
+
decimals,
|
|
67
|
+
raw: raw.toString(),
|
|
68
|
+
formatted: formatUnits(raw, decimals),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/** Decode a hex ABI-encoded uint256 word. */
|
|
72
|
+
function hexWordToBigInt(hex) {
|
|
73
|
+
if (!hex)
|
|
74
|
+
return 0n;
|
|
75
|
+
return BigInt(`0x${hex.replace(/^0x/, "") || "0"}`);
|
|
76
|
+
}
|
|
77
|
+
/** Decode an ABI-encoded string return value (offset + length + bytes). */
|
|
78
|
+
function decodeAbiString(hex) {
|
|
79
|
+
if (!hex)
|
|
80
|
+
return undefined;
|
|
81
|
+
const clean = hex.replace(/^0x/, "");
|
|
82
|
+
if (clean.length < 128)
|
|
83
|
+
return undefined;
|
|
84
|
+
const length = Number(BigInt(`0x${clean.slice(64, 128)}`));
|
|
85
|
+
const bytes = clean.slice(128, 128 + length * 2);
|
|
86
|
+
const buf = Buffer.from(bytes, "hex");
|
|
87
|
+
const s = buf.toString("utf8").replace(/\0+$/, "");
|
|
88
|
+
return s.length > 0 ? s : undefined;
|
|
89
|
+
}
|
|
90
|
+
async function tronCall(ownerAddress, contractAddress, selector, parameter) {
|
|
91
|
+
const cfg = getConfig();
|
|
92
|
+
const res = await httpJson(`${cfg.tronApiUrl}/wallet/triggerconstantcontract`, {
|
|
93
|
+
method: "POST",
|
|
94
|
+
headers: { "Content-Type": "application/json" },
|
|
95
|
+
body: JSON.stringify({
|
|
96
|
+
owner_address: ownerAddress,
|
|
97
|
+
contract_address: contractAddress,
|
|
98
|
+
function_selector: selector,
|
|
99
|
+
parameter,
|
|
100
|
+
visible: true,
|
|
101
|
+
}),
|
|
102
|
+
}, { retry: true });
|
|
103
|
+
return res.constant_result?.[0];
|
|
104
|
+
}
|
|
105
|
+
async function getTronBalance(address, contractAddress) {
|
|
106
|
+
const cfg = getConfig();
|
|
107
|
+
if (!contractAddress) {
|
|
108
|
+
const account = await httpJson(`${cfg.tronApiUrl}/wallet/getaccount`, {
|
|
109
|
+
method: "POST",
|
|
110
|
+
headers: { "Content-Type": "application/json" },
|
|
111
|
+
body: JSON.stringify({ address, visible: true }),
|
|
112
|
+
}, { retry: true });
|
|
113
|
+
const raw = BigInt(account.balance ?? 0);
|
|
114
|
+
return {
|
|
115
|
+
network: "tron",
|
|
116
|
+
address,
|
|
117
|
+
contractAddress: null,
|
|
118
|
+
symbol: "TRX",
|
|
119
|
+
decimals: 6,
|
|
120
|
+
raw: raw.toString(),
|
|
121
|
+
formatted: formatUnits(raw, 6),
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
// ABI-encode balanceOf(address): the trigger endpoint (visible:true) resolves
|
|
125
|
+
// the owner address; the parameter must be the 32-byte word of the queried
|
|
126
|
+
// address. We ask the node to resolve it by passing the base58 through the
|
|
127
|
+
// dedicated helper below.
|
|
128
|
+
const paramWord = await tronBase58ToAbiWord(address);
|
|
129
|
+
const [balHex, decHex, symHex] = await Promise.all([
|
|
130
|
+
tronCall(address, contractAddress, "balanceOf(address)", paramWord),
|
|
131
|
+
tronCall(address, contractAddress, "decimals()", ""),
|
|
132
|
+
tronCall(address, contractAddress, "symbol()", ""),
|
|
133
|
+
]);
|
|
134
|
+
const raw = hexWordToBigInt(balHex);
|
|
135
|
+
const decimals = decHex ? Number(hexWordToBigInt(decHex)) : 6;
|
|
136
|
+
const symbol = decodeAbiString(symHex) ?? "TRC20";
|
|
137
|
+
return {
|
|
138
|
+
network: "tron",
|
|
139
|
+
address,
|
|
140
|
+
contractAddress,
|
|
141
|
+
symbol,
|
|
142
|
+
decimals,
|
|
143
|
+
raw: raw.toString(),
|
|
144
|
+
formatted: formatUnits(raw, decimals),
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Convert a base58 Tron address to a 32-byte ABI word (left-padded 20-byte
|
|
149
|
+
* EVM-style address) suitable for a balanceOf(address) parameter.
|
|
150
|
+
*/
|
|
151
|
+
async function tronBase58ToAbiWord(base58) {
|
|
152
|
+
const { default: bs58check } = await import("bs58check");
|
|
153
|
+
const decoded = bs58check.decode(base58); // 0x41 + 20 bytes
|
|
154
|
+
const hex = Buffer.from(decoded).toString("hex");
|
|
155
|
+
const evm20 = hex.slice(2); // drop the 0x41 prefix
|
|
156
|
+
return evm20.padStart(64, "0");
|
|
157
|
+
}
|
|
158
|
+
/** Native UTXO balance via an Esplora REST API (blockstream / litecoinspace style). */
|
|
159
|
+
async function getEsploraBalance(network, apiBase, address) {
|
|
160
|
+
const info = await httpJson(`${apiBase}/address/${address}`, {
|
|
161
|
+
method: "GET",
|
|
162
|
+
});
|
|
163
|
+
const chain = info.chain_stats ?? {};
|
|
164
|
+
const mem = info.mempool_stats ?? {};
|
|
165
|
+
const sats = BigInt(chain.funded_txo_sum ?? 0) -
|
|
166
|
+
BigInt(chain.spent_txo_sum ?? 0) +
|
|
167
|
+
BigInt(mem.funded_txo_sum ?? 0) -
|
|
168
|
+
BigInt(mem.spent_txo_sum ?? 0);
|
|
169
|
+
return {
|
|
170
|
+
network,
|
|
171
|
+
address,
|
|
172
|
+
contractAddress: null,
|
|
173
|
+
symbol: NATIVE_SYMBOL[network],
|
|
174
|
+
decimals: 8,
|
|
175
|
+
raw: sats.toString(),
|
|
176
|
+
formatted: formatUnits(sats, 8),
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
async function getBitcoinBalance(address) {
|
|
180
|
+
return getEsploraBalance("bitcoin", getConfig().bitcoinApiUrl, address);
|
|
181
|
+
}
|
|
182
|
+
async function getLitecoinBalance(address) {
|
|
183
|
+
return getEsploraBalance("litecoin", getConfig().litecoinApiUrl, address);
|
|
184
|
+
}
|
|
185
|
+
/** Dogecoin native balance via BlockCypher (…/addrs/{addr}/balance). */
|
|
186
|
+
async function getDogeBalance(address) {
|
|
187
|
+
const cfg = getConfig();
|
|
188
|
+
const info = await httpJson(`${cfg.dogeApiUrl}/addrs/${encodeURIComponent(address)}/balance`, { method: "GET" });
|
|
189
|
+
// Prefer confirmed+unconfirmed final_balance when present.
|
|
190
|
+
const koinu = BigInt(info.final_balance ?? info.balance ?? 0);
|
|
191
|
+
return {
|
|
192
|
+
network: "doge",
|
|
193
|
+
address,
|
|
194
|
+
contractAddress: null,
|
|
195
|
+
symbol: "DOGE",
|
|
196
|
+
decimals: 8,
|
|
197
|
+
raw: koinu.toString(),
|
|
198
|
+
formatted: formatUnits(koinu, 8),
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
/** JSON-RPC helper for chains that speak the standard JSON-RPC 2.0 envelope. */
|
|
202
|
+
async function jsonRpc(url, method, params) {
|
|
203
|
+
const res = await httpJson(url, {
|
|
204
|
+
method: "POST",
|
|
205
|
+
headers: { "Content-Type": "application/json" },
|
|
206
|
+
body: JSON.stringify({ jsonrpc: "2.0", id: 1, method, params }),
|
|
207
|
+
}, { retry: true });
|
|
208
|
+
if (res.error)
|
|
209
|
+
throw new Error(`RPC ${method} failed: ${res.error.message}`);
|
|
210
|
+
return res.result;
|
|
211
|
+
}
|
|
212
|
+
/** Solana native SOL (lamports) or SPL token balance for `mint`. */
|
|
213
|
+
async function getSolanaBalance(address, mint) {
|
|
214
|
+
if (mint)
|
|
215
|
+
return getSolanaSplBalance(address, mint);
|
|
216
|
+
const cfg = getConfig();
|
|
217
|
+
const res = await jsonRpc(cfg.solanaRpcUrl, "getBalance", [address]);
|
|
218
|
+
const lamports = BigInt(res?.value ?? 0);
|
|
219
|
+
return {
|
|
220
|
+
network: "solana",
|
|
221
|
+
address,
|
|
222
|
+
contractAddress: null,
|
|
223
|
+
symbol: "SOL",
|
|
224
|
+
decimals: 9,
|
|
225
|
+
raw: lamports.toString(),
|
|
226
|
+
formatted: formatUnits(lamports, 9),
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
async function getSolanaMintDecimals(mint) {
|
|
230
|
+
const cfg = getConfig();
|
|
231
|
+
const res = await jsonRpc(cfg.solanaRpcUrl, "getAccountInfo", [mint, { encoding: "jsonParsed", commitment: "confirmed" }]);
|
|
232
|
+
const parsed = res?.value?.data?.parsed;
|
|
233
|
+
if (parsed?.type === "mint" && typeof parsed.info?.decimals === "number") {
|
|
234
|
+
return parsed.info.decimals;
|
|
235
|
+
}
|
|
236
|
+
throw new Error(`Solana mint ${mint} was not found or is not a token mint.`);
|
|
237
|
+
}
|
|
238
|
+
/** Sum SPL token accounts for `mint`. Missing ATA is a zero balance, not an error. */
|
|
239
|
+
async function getSolanaSplBalance(address, mint) {
|
|
240
|
+
const cfg = getConfig();
|
|
241
|
+
const [accounts, decimals] = await Promise.all([
|
|
242
|
+
jsonRpc(cfg.solanaRpcUrl, "getTokenAccountsByOwner", [
|
|
243
|
+
address,
|
|
244
|
+
{ mint },
|
|
245
|
+
{ encoding: "jsonParsed", commitment: "confirmed" },
|
|
246
|
+
]),
|
|
247
|
+
getSolanaMintDecimals(mint),
|
|
248
|
+
]);
|
|
249
|
+
let raw = 0n;
|
|
250
|
+
for (const item of accounts?.value ?? []) {
|
|
251
|
+
const amt = item.account?.data?.parsed?.info?.tokenAmount?.amount;
|
|
252
|
+
if (amt)
|
|
253
|
+
raw += BigInt(amt);
|
|
254
|
+
}
|
|
255
|
+
return {
|
|
256
|
+
network: "solana",
|
|
257
|
+
address,
|
|
258
|
+
contractAddress: mint,
|
|
259
|
+
symbol: "SPL",
|
|
260
|
+
decimals,
|
|
261
|
+
raw: raw.toString(),
|
|
262
|
+
formatted: formatUnits(raw, decimals),
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
/** TON native (nanotons) or jetton balance for `jettonMaster`. */
|
|
266
|
+
async function getTonBalance(address, jettonMaster) {
|
|
267
|
+
if (jettonMaster)
|
|
268
|
+
return getTonJettonBalance(address, jettonMaster);
|
|
269
|
+
const cfg = getConfig();
|
|
270
|
+
const res = await httpJson(`${cfg.tonApiUrl}/getAddressBalance?address=${encodeURIComponent(address)}`, { method: "GET" });
|
|
271
|
+
if (res.ok === false)
|
|
272
|
+
throw new Error(`TON balance failed: ${res.error}`);
|
|
273
|
+
const nano = BigInt(res.result ?? "0");
|
|
274
|
+
return {
|
|
275
|
+
network: "ton",
|
|
276
|
+
address,
|
|
277
|
+
contractAddress: null,
|
|
278
|
+
symbol: "TON",
|
|
279
|
+
decimals: 9,
|
|
280
|
+
raw: nano.toString(),
|
|
281
|
+
formatted: formatUnits(nano, 9),
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
function tonClient() {
|
|
285
|
+
const cfg = getConfig();
|
|
286
|
+
const apiKey = process.env.IW_TON_API_KEY?.trim();
|
|
287
|
+
return new TonClient({
|
|
288
|
+
endpoint: `${cfg.tonApiUrl.replace(/\/$/, "")}/jsonRPC`,
|
|
289
|
+
...(apiKey ? { apiKey } : {}),
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
/** `https://toncenter.com/api/v2` → `https://toncenter.com/api/v3`. Null if the URL is not a v2 TonCenter-style path. */
|
|
293
|
+
function toncenterV3Base(v2Url) {
|
|
294
|
+
const base = v2Url.replace(/\/$/, "");
|
|
295
|
+
if (!base.endsWith("/api/v2"))
|
|
296
|
+
return null;
|
|
297
|
+
return `${base.slice(0, -1)}3`;
|
|
298
|
+
}
|
|
299
|
+
function tonApiHeaders() {
|
|
300
|
+
const apiKey = process.env.IW_TON_API_KEY?.trim();
|
|
301
|
+
return apiKey ? { "X-Api-Key": apiKey } : undefined;
|
|
302
|
+
}
|
|
303
|
+
function normalizeJettonSymbol(symbol) {
|
|
304
|
+
return symbol.replaceAll("₮", "T");
|
|
305
|
+
}
|
|
306
|
+
function v3JettonMeta(res, master) {
|
|
307
|
+
for (const [raw, entry] of Object.entries(res.metadata ?? {})) {
|
|
308
|
+
try {
|
|
309
|
+
if (!Address.parse(raw).equals(master))
|
|
310
|
+
continue;
|
|
311
|
+
}
|
|
312
|
+
catch {
|
|
313
|
+
continue;
|
|
314
|
+
}
|
|
315
|
+
const info = entry.token_info?.find((t) => t.type === "jetton_masters") ?? entry.token_info?.[0];
|
|
316
|
+
const symbol = typeof info?.symbol === "string" && info.symbol.length > 0
|
|
317
|
+
? normalizeJettonSymbol(info.symbol)
|
|
318
|
+
: "JETTON";
|
|
319
|
+
return { decimals: clampJettonDecimals(info?.extra?.decimals), symbol };
|
|
320
|
+
}
|
|
321
|
+
return { decimals: 9, symbol: "JETTON" };
|
|
322
|
+
}
|
|
323
|
+
/** Indexed jetton balance. Returns null when this Ton API has no v3 (caller falls back on-chain). */
|
|
324
|
+
async function getTonJettonBalanceIndexed(owner, jettonMaster) {
|
|
325
|
+
const cfg = getConfig();
|
|
326
|
+
const v3 = toncenterV3Base(cfg.tonApiUrl);
|
|
327
|
+
if (!v3)
|
|
328
|
+
return null;
|
|
329
|
+
const masterAddr = Address.parse(jettonMaster);
|
|
330
|
+
const url = `${v3}/jetton/wallets?owner_address=${encodeURIComponent(owner)}` +
|
|
331
|
+
`&jetton_address=${encodeURIComponent(jettonMaster)}&limit=16`;
|
|
332
|
+
let res;
|
|
333
|
+
try {
|
|
334
|
+
res = await httpJson(url, { method: "GET", headers: tonApiHeaders() }, { retry: true, label: "ton.jetton.wallets" });
|
|
335
|
+
}
|
|
336
|
+
catch {
|
|
337
|
+
return null;
|
|
338
|
+
}
|
|
339
|
+
const wallets = res.jetton_wallets ?? [];
|
|
340
|
+
if (wallets.length === 0)
|
|
341
|
+
return null;
|
|
342
|
+
const meta = v3JettonMeta(res, masterAddr);
|
|
343
|
+
let raw = 0n;
|
|
344
|
+
let matched = 0;
|
|
345
|
+
for (const wallet of wallets) {
|
|
346
|
+
if (!wallet.jetton || wallet.balance == null)
|
|
347
|
+
continue;
|
|
348
|
+
try {
|
|
349
|
+
if (!Address.parse(wallet.jetton).equals(masterAddr))
|
|
350
|
+
continue;
|
|
351
|
+
}
|
|
352
|
+
catch {
|
|
353
|
+
continue;
|
|
354
|
+
}
|
|
355
|
+
try {
|
|
356
|
+
raw += BigInt(wallet.balance);
|
|
357
|
+
matched++;
|
|
358
|
+
}
|
|
359
|
+
catch {
|
|
360
|
+
continue;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
if (matched === 0)
|
|
364
|
+
return null;
|
|
365
|
+
logInfo("balance.ton.jetton.indexed", {
|
|
366
|
+
owner,
|
|
367
|
+
jettonMaster,
|
|
368
|
+
raw: raw.toString(),
|
|
369
|
+
symbol: meta.symbol,
|
|
370
|
+
decimals: meta.decimals,
|
|
371
|
+
wallets: res.jetton_wallets?.length ?? 0,
|
|
372
|
+
});
|
|
373
|
+
return {
|
|
374
|
+
network: "ton",
|
|
375
|
+
address: owner,
|
|
376
|
+
contractAddress: jettonMaster,
|
|
377
|
+
symbol: meta.symbol,
|
|
378
|
+
decimals: meta.decimals,
|
|
379
|
+
raw: raw.toString(),
|
|
380
|
+
formatted: formatUnits(raw, meta.decimals),
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
function sha256Key(name) {
|
|
384
|
+
return BigInt(`0x${Buffer.from(sha256(new TextEncoder().encode(name))).toString("hex")}`);
|
|
385
|
+
}
|
|
386
|
+
function clampJettonDecimals(raw) {
|
|
387
|
+
const n = typeof raw === "number" ? raw : Number(String(raw ?? ""));
|
|
388
|
+
if (!Number.isInteger(n) || n < 0 || n > 18)
|
|
389
|
+
return 9;
|
|
390
|
+
return n;
|
|
391
|
+
}
|
|
392
|
+
async function fetchOffchainJettonMeta(uri) {
|
|
393
|
+
const url = uri.startsWith("ipfs://")
|
|
394
|
+
? `https://ipfs.io/ipfs/${uri.slice("ipfs://".length)}`
|
|
395
|
+
: uri;
|
|
396
|
+
const json = await httpJson(url, { method: "GET" }, { retry: true, label: "ton.jetton.meta" });
|
|
397
|
+
return {
|
|
398
|
+
decimals: clampJettonDecimals(json.decimals),
|
|
399
|
+
symbol: typeof json.symbol === "string" && json.symbol.length > 0 ? json.symbol : "JETTON",
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
function readOnchainSnake(cell) {
|
|
403
|
+
const s = cell.beginParse();
|
|
404
|
+
if (s.remainingBits >= 8) {
|
|
405
|
+
const tag = s.preloadUint(8);
|
|
406
|
+
if (tag === 0)
|
|
407
|
+
s.loadUint(8);
|
|
408
|
+
}
|
|
409
|
+
return s.loadStringTail();
|
|
410
|
+
}
|
|
411
|
+
function parseOnchainJettonMeta(content) {
|
|
412
|
+
const slice = content.beginParse();
|
|
413
|
+
slice.loadUint(8);
|
|
414
|
+
const dict = slice.loadDict(Dictionary.Keys.BigUint(256), Dictionary.Values.Cell());
|
|
415
|
+
const decCell = dict.get(sha256Key("decimals"));
|
|
416
|
+
const symCell = dict.get(sha256Key("symbol"));
|
|
417
|
+
return {
|
|
418
|
+
decimals: decCell ? clampJettonDecimals(readOnchainSnake(decCell)) : 9,
|
|
419
|
+
symbol: symCell ? readOnchainSnake(symCell) || "JETTON" : "JETTON",
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
async function jettonDecimalsAndSymbol(client, master) {
|
|
423
|
+
try {
|
|
424
|
+
const data = await client.runMethod(master, "get_jetton_data");
|
|
425
|
+
data.stack.readBigNumber();
|
|
426
|
+
data.stack.readNumber();
|
|
427
|
+
data.stack.readAddress();
|
|
428
|
+
const content = data.stack.readCell();
|
|
429
|
+
const cs = content.beginParse();
|
|
430
|
+
if (cs.remainingBits < 8)
|
|
431
|
+
return { decimals: 9, symbol: "JETTON" };
|
|
432
|
+
const layout = cs.loadUint(8);
|
|
433
|
+
if (layout === 1) {
|
|
434
|
+
return await fetchOffchainJettonMeta(cs.loadStringTail());
|
|
435
|
+
}
|
|
436
|
+
if (layout === 0) {
|
|
437
|
+
return parseOnchainJettonMeta(content);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
catch {
|
|
441
|
+
// TEP-64 metadata is optional for the fee check; raw wallet units still match Relay.
|
|
442
|
+
}
|
|
443
|
+
return { decimals: 9, symbol: "JETTON" };
|
|
444
|
+
}
|
|
445
|
+
function isTonAccountUndeployed(e) {
|
|
446
|
+
const msg = e instanceof Error ? `${e.message} ${e.name}` : String(e);
|
|
447
|
+
return /uninit|not initialized|inactive/i.test(msg) || /exit_code[^\d-]*(-1[13]|0)\b/i.test(msg);
|
|
448
|
+
}
|
|
449
|
+
/** Jetton units from the owner's jetton wallet. Undeployed wallet is balance 0. */
|
|
450
|
+
async function getTonJettonBalance(owner, jettonMaster) {
|
|
451
|
+
const indexed = await getTonJettonBalanceIndexed(owner, jettonMaster);
|
|
452
|
+
if (indexed)
|
|
453
|
+
return indexed;
|
|
454
|
+
const client = tonClient();
|
|
455
|
+
const ownerAddr = Address.parse(owner);
|
|
456
|
+
const masterAddr = Address.parse(jettonMaster);
|
|
457
|
+
const ownerCell = beginCell().storeAddress(ownerAddr).endCell();
|
|
458
|
+
const walletRes = await client.runMethod(masterAddr, "get_wallet_address", [
|
|
459
|
+
{ type: "slice", cell: ownerCell },
|
|
460
|
+
]);
|
|
461
|
+
const jettonWallet = walletRes.stack.readAddress();
|
|
462
|
+
const meta = await jettonDecimalsAndSymbol(client, masterAddr);
|
|
463
|
+
let raw = 0n;
|
|
464
|
+
try {
|
|
465
|
+
const walletData = await client.runMethod(jettonWallet, "get_wallet_data");
|
|
466
|
+
raw = walletData.stack.readBigNumber();
|
|
467
|
+
}
|
|
468
|
+
catch (e) {
|
|
469
|
+
if (!isTonAccountUndeployed(e))
|
|
470
|
+
throw e;
|
|
471
|
+
raw = 0n;
|
|
472
|
+
}
|
|
473
|
+
return {
|
|
474
|
+
network: "ton",
|
|
475
|
+
address: owner,
|
|
476
|
+
contractAddress: jettonMaster,
|
|
477
|
+
symbol: meta.symbol,
|
|
478
|
+
decimals: meta.decimals,
|
|
479
|
+
raw: raw.toString(),
|
|
480
|
+
formatted: formatUnits(raw, meta.decimals),
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
/** XRP native balance (drops) via account_info. Unfunded accounts read as 0. */
|
|
484
|
+
async function getXrpBalance(address) {
|
|
485
|
+
const cfg = getConfig();
|
|
486
|
+
const res = await httpJson(cfg.xrpRpcUrl, {
|
|
487
|
+
method: "POST",
|
|
488
|
+
headers: { "Content-Type": "application/json" },
|
|
489
|
+
body: JSON.stringify({
|
|
490
|
+
method: "account_info",
|
|
491
|
+
params: [{ account: address, ledger_index: "validated" }],
|
|
492
|
+
}),
|
|
493
|
+
}, { retry: true });
|
|
494
|
+
const info = res.result ?? {};
|
|
495
|
+
// actNotFound => account not yet funded => zero balance.
|
|
496
|
+
const drops = info.error === "actNotFound" ? 0n : BigInt(info.account_data?.Balance ?? 0);
|
|
497
|
+
return {
|
|
498
|
+
network: "xrp",
|
|
499
|
+
address,
|
|
500
|
+
contractAddress: null,
|
|
501
|
+
symbol: "XRP",
|
|
502
|
+
decimals: 6,
|
|
503
|
+
raw: drops.toString(),
|
|
504
|
+
formatted: formatUnits(drops, 6),
|
|
505
|
+
};
|
|
506
|
+
}
|
|
507
|
+
/** Read the on-chain balance for a wallet address on the given network. */
|
|
508
|
+
export async function getBalance(network, address, contractAddress) {
|
|
509
|
+
const started = Date.now();
|
|
510
|
+
logInfo("balance.start", { network, address, contractAddress });
|
|
511
|
+
try {
|
|
512
|
+
let result;
|
|
513
|
+
if (isEvmNetwork(network)) {
|
|
514
|
+
result = await getEvmBalance(network, address, contractAddress);
|
|
515
|
+
}
|
|
516
|
+
else {
|
|
517
|
+
switch (network) {
|
|
518
|
+
case "tron":
|
|
519
|
+
result = await getTronBalance(address, contractAddress);
|
|
520
|
+
break;
|
|
521
|
+
case "bitcoin":
|
|
522
|
+
result = await getBitcoinBalance(address);
|
|
523
|
+
break;
|
|
524
|
+
case "litecoin":
|
|
525
|
+
result = await getLitecoinBalance(address);
|
|
526
|
+
break;
|
|
527
|
+
case "doge":
|
|
528
|
+
result = await getDogeBalance(address);
|
|
529
|
+
break;
|
|
530
|
+
case "solana":
|
|
531
|
+
result = await getSolanaBalance(address, contractAddress);
|
|
532
|
+
break;
|
|
533
|
+
case "ton":
|
|
534
|
+
result = await getTonBalance(address, contractAddress);
|
|
535
|
+
break;
|
|
536
|
+
case "xrp":
|
|
537
|
+
result = await getXrpBalance(address);
|
|
538
|
+
break;
|
|
539
|
+
default:
|
|
540
|
+
throw new Error(`Unsupported network for balance: ${network}`);
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
logInfo("balance.ok", {
|
|
544
|
+
network,
|
|
545
|
+
address,
|
|
546
|
+
contractAddress: result.contractAddress,
|
|
547
|
+
symbol: result.symbol,
|
|
548
|
+
decimals: result.decimals,
|
|
549
|
+
raw: result.raw,
|
|
550
|
+
formatted: result.formatted,
|
|
551
|
+
elapsedMs: Date.now() - started,
|
|
552
|
+
});
|
|
553
|
+
return result;
|
|
554
|
+
}
|
|
555
|
+
catch (e) {
|
|
556
|
+
logError("balance.fail", e, {
|
|
557
|
+
network,
|
|
558
|
+
address,
|
|
559
|
+
contractAddress,
|
|
560
|
+
elapsedMs: Date.now() - started,
|
|
561
|
+
});
|
|
562
|
+
throw e;
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
//# sourceMappingURL=balances.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"balances.js","sourceRoot":"","sources":["../../src/api/balances.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fetch helper with JSON handling, per-attempt timeouts and bounded retries.
|
|
3
|
+
*
|
|
4
|
+
* Timeouts: every attempt is aborted after `timeoutMs` (default from config).
|
|
5
|
+
* Retries: transient failures (network errors, timeouts, and retryable HTTP
|
|
6
|
+
* statuses like 429/5xx) are retried with exponential backoff + jitter, honoring
|
|
7
|
+
* a `Retry-After` header when present.
|
|
8
|
+
*
|
|
9
|
+
* Safety: retries default ON for idempotent methods (GET/HEAD) and OFF for others
|
|
10
|
+
* (a broadcast POST must never be silently resent). Callers can override this per
|
|
11
|
+
* request with `retry: true` for read-only POSTs (e.g. auth, Tron node reads).
|
|
12
|
+
*
|
|
13
|
+
* Every attempt is written to the JSONL file logger (see src/log.ts) with
|
|
14
|
+
* timings, status, retry decisions and undici cause chains — without secrets.
|
|
15
|
+
*/
|
|
16
|
+
export interface HttpError extends Error {
|
|
17
|
+
status?: number;
|
|
18
|
+
body?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface HttpOptions {
|
|
21
|
+
/** Force-enable/disable retries regardless of method. */
|
|
22
|
+
retry?: boolean;
|
|
23
|
+
/** Override the number of retry attempts for this call. */
|
|
24
|
+
retries?: number;
|
|
25
|
+
/** Override the per-attempt timeout (ms) for this call. */
|
|
26
|
+
timeoutMs?: number;
|
|
27
|
+
/** Correlation id for log lines (auto-generated if omitted). */
|
|
28
|
+
correlationId?: string;
|
|
29
|
+
/** Short label for logs, e.g. "relay.forward". */
|
|
30
|
+
label?: string;
|
|
31
|
+
}
|
|
32
|
+
export declare function httpJson<T>(url: string, init: RequestInit & {
|
|
33
|
+
headers?: Record<string, string>;
|
|
34
|
+
}, opts?: HttpOptions): Promise<T>;
|