@affluent-org/sdk 0.0.5 → 0.0.7
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/dist/affluent.d.ts +3 -3
- package/dist/affluent.js +3 -3
- package/dist/common/computation.d.ts +6 -0
- package/dist/common/computation.js +54 -0
- package/dist/common/helper.d.ts +5 -0
- package/dist/common/helper.js +29 -0
- package/dist/common/service.d.ts +10 -2
- package/dist/common/service.js +56 -3
- package/dist/common/trace-action.d.ts +92 -0
- package/dist/common/trace-action.js +187 -0
- package/dist/common/transform.d.ts +15 -21
- package/dist/common/transform.js +63 -150
- package/dist/common/types.d.ts +9 -13
- package/dist/common/types.js +2 -2
- package/dist/context.d.ts +3 -0
- package/dist/context.js +9 -0
- package/dist/contracts/oracle/redstone-onchain-oracle/index.js +2 -0
- package/dist/contracts/vault/strategy-vault/index.d.ts +2 -1
- package/dist/contracts/vault/strategy-vault/index.js +1 -0
- package/dist/factorial.d.ts +18 -8
- package/dist/factorial.js +26 -14
- package/dist/index.d.ts +4 -2
- package/dist/index.js +18 -2
- package/dist/lib/send-msg.d.ts +16 -2
- package/dist/lib/send-msg.js +23 -2
- package/dist/monitor.js +2 -0
- package/dist/monitorCacheV1.js +3 -2
- package/dist/oracle/oracle.d.ts +3 -2
- package/dist/oracle/oracle.js +25 -2
- package/dist/pool.d.ts +41 -0
- package/dist/pool.js +146 -178
- package/dist/poolCacheV1.js +1 -0
- package/dist/rfq-auction.d.ts +2 -2
- package/dist/rfq-auction.js +6 -6
- package/dist/rfq-batch.d.ts +21 -11
- package/dist/rfq-batch.js +81 -9
- package/dist/services/composite-oracle/computation.d.ts +3 -8
- package/dist/services/composite-oracle/computation.js +91 -56
- package/dist/services/composite-oracle/index.js +4 -5
- package/dist/services/composite-oracle/query.js +1 -3
- package/dist/services/pool/computation.js +9 -61
- package/dist/services/pool/index.d.ts +10 -59
- package/dist/services/pool/index.js +71 -8
- package/dist/services/pool/query.js +1 -1
- package/dist/services/pool/user/trace.d.ts +90 -0
- package/dist/services/pool/user/trace.js +168 -0
- package/dist/services/rfq-auction/index.d.ts +7 -23
- package/dist/services/rfq-auction/index.js +55 -6
- package/dist/services/rfq-auction/user/index.js +1 -1
- package/dist/services/rfq-auction/user/trace.d.ts +53 -0
- package/dist/services/rfq-auction/user/trace.js +68 -0
- package/dist/services/rfq-batch/index.d.ts +9 -26
- package/dist/services/rfq-batch/index.js +48 -10
- package/dist/services/rfq-batch/user/trace.d.ts +49 -0
- package/dist/services/rfq-batch/user/trace.js +67 -0
- package/dist/services/share-vault/index.d.ts +12 -56
- package/dist/services/share-vault/index.js +57 -10
- package/dist/services/share-vault/query.js +1 -1
- package/dist/services/share-vault/user/trace.d.ts +54 -0
- package/dist/services/share-vault/user/trace.js +84 -0
- package/dist/services/strategy-vault/index.d.ts +68 -1981
- package/dist/services/strategy-vault/index.js +214 -53
- package/dist/services/strategy-vault/oracle.js +1 -0
- package/dist/services/strategy-vault/owner/index.d.ts +2 -2
- package/dist/services/strategy-vault/owner/index.js +1 -1
- package/dist/services/strategy-vault/owner/types.d.ts +4 -0
- package/dist/services/strategy-vault/query.js +1 -1
- package/dist/services/strategy-vault/user/trace.d.ts +156 -0
- package/dist/services/strategy-vault/user/trace.js +264 -0
- package/dist/share-vault.d.ts +164 -8
- package/dist/share-vault.js +222 -67
- package/dist/strategy_vault/base.d.ts +521 -105
- package/dist/strategy_vault/base.js +493 -41
- package/dist/strategy_vault/steps.d.ts +120 -3
- package/dist/strategy_vault/steps.js +161 -0
- package/dist/types/sender.d.ts +1 -0
- package/dist/utils/_parse_temp/StrategyVault.d.ts +9 -9
- package/dist/utils/_parse_temp/StrategyVault.js +48 -40
- package/dist/utils/_parse_temp/parseMsgBody.d.ts +2 -2
- package/dist/utils/_parse_temp/parseMsgBody.js +84 -84
- package/dist/utils/external-message-hash.d.ts +7 -3
- package/dist/utils/external-message-hash.js +20 -7
- package/dist/utils/oracle/redstone/helper.js +2 -0
- package/dist/utils/oracle/redstone/redstoneHelper.d.ts +7 -0
- package/dist/utils/oracle/redstone/redstoneHelper.js +103 -1
- package/dist/utils/pending-tracker/trackable-sender.d.ts +37 -4
- package/dist/utils/pending-tracker/trackable-sender.js +47 -8
- package/dist/utils/pending-tracker/v3-client.d.ts +16 -0
- package/dist/utils/pending-tracker/v3-client.js +80 -2
- package/dist/utils/toncenter/index.d.ts +1 -0
- package/dist/utils/toncenter/index.js +17 -0
- package/dist/utils/toncenter/transform.d.ts +11 -0
- package/dist/utils/toncenter/transform.js +40 -0
- package/dist/utils/toncenter/type.d.ts +227 -0
- package/dist/utils/toncenter/type.js +2 -0
- package/package.json +3 -3
|
@@ -1,4 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
37
|
};
|
|
@@ -8,6 +41,7 @@ exports.createPayload = createPayload;
|
|
|
8
41
|
exports.getHexlifiedFeedIds = getHexlifiedFeedIds;
|
|
9
42
|
exports.getDataFeedIdTuples = getDataFeedIdTuples;
|
|
10
43
|
exports.createRedstoneHelper = createRedstoneHelper;
|
|
44
|
+
exports.createRedstoneCustomHelper = createRedstoneCustomHelper;
|
|
11
45
|
const core_1 = require("@ton/core");
|
|
12
46
|
const sdk_1 = require("@redstone-finance/sdk");
|
|
13
47
|
const protocol_1 = require("@redstone-finance/protocol");
|
|
@@ -211,13 +245,81 @@ function createRedstoneHelper(type) {
|
|
|
211
245
|
getPrices,
|
|
212
246
|
};
|
|
213
247
|
}
|
|
248
|
+
function createRedstoneCustomHelper(baseUrl) {
|
|
249
|
+
const SIGNER_COUNT_THRESHOLD = 5;
|
|
250
|
+
async function fetchPayloadHex(assets) {
|
|
251
|
+
const { default: axios } = await Promise.resolve(`${"axios"}`).then(s => __importStar(require(s)));
|
|
252
|
+
const response = await axios.get(`${baseUrl}/prices/latest`, {
|
|
253
|
+
timeout: 10000,
|
|
254
|
+
params: {
|
|
255
|
+
dataFeedIds: assets,
|
|
256
|
+
minimalSignersCount: SIGNER_COUNT_THRESHOLD,
|
|
257
|
+
},
|
|
258
|
+
paramsSerializer: { indexes: null },
|
|
259
|
+
});
|
|
260
|
+
const { SignedDataPackage, RedstonePayload } = await Promise.resolve(`${"@redstone-finance/protocol"}`).then(s => __importStar(require(s)));
|
|
261
|
+
const prices = response.data.prices;
|
|
262
|
+
const flatPackages = assets.flatMap((asset) => prices[asset] || []);
|
|
263
|
+
const signedDataPackages = flatPackages.map((obj) => SignedDataPackage.fromObj(obj));
|
|
264
|
+
const payload = new RedstonePayload(signedDataPackages, "");
|
|
265
|
+
return payload.toBytesHexWithout0xPrefix();
|
|
266
|
+
}
|
|
267
|
+
async function createPayload(assets) {
|
|
268
|
+
if (assets.length === 0)
|
|
269
|
+
return (0, core_1.beginCell)().storeUint(0, 2).endCell();
|
|
270
|
+
const payloadHex = await fetchPayloadHex(assets);
|
|
271
|
+
const { dataPackageChunks, metadata } = splitPayloadHex(payloadHex);
|
|
272
|
+
const payloadCell = (0, core_1.beginCell)();
|
|
273
|
+
const cells = new Map();
|
|
274
|
+
for (let i = 0; i < dataPackageChunks.length; i++) {
|
|
275
|
+
cells.set(BigInt(i), dataPackageChunks[i]);
|
|
276
|
+
}
|
|
277
|
+
const dataPackagesDict = (0, core_1.beginCell)();
|
|
278
|
+
const BASE_KEY_LEN = 16;
|
|
279
|
+
(0, serializeDict_1.serializeDict)(cells, BASE_KEY_LEN, storeSignatureAndData, dataPackagesDict);
|
|
280
|
+
payloadCell.storeRef(dataPackagesDict);
|
|
281
|
+
storeMetadata(metadata, payloadCell);
|
|
282
|
+
return payloadCell.endCell();
|
|
283
|
+
}
|
|
284
|
+
async function getPrices(assets) {
|
|
285
|
+
const payloadHex = await fetchPayloadHex(assets);
|
|
286
|
+
const { dataPackageChunks } = splitPayloadHex(payloadHex);
|
|
287
|
+
const result = [];
|
|
288
|
+
for (let i = 0; i < dataPackageChunks.length; i++) {
|
|
289
|
+
result.push({
|
|
290
|
+
name: assets[i],
|
|
291
|
+
...parseDataPackageHex(dataPackageChunks[i]),
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
return result;
|
|
295
|
+
}
|
|
296
|
+
function getHexlifiedFeedIds(assets) {
|
|
297
|
+
const paramsProvider = new sdk_1.ContractParamsProvider({
|
|
298
|
+
dataServiceId: "redstone-primary-prod",
|
|
299
|
+
uniqueSignersCount: SIGNER_COUNT_THRESHOLD,
|
|
300
|
+
dataPackagesIds: assets,
|
|
301
|
+
});
|
|
302
|
+
return paramsProvider.getHexlifiedFeedIds();
|
|
303
|
+
}
|
|
304
|
+
function getDataFeedIdTuples(assets) {
|
|
305
|
+
const dataFeedIdsTupleBuilder = new core_1.TupleBuilder();
|
|
306
|
+
getHexlifiedFeedIds(assets).forEach((item) => dataFeedIdsTupleBuilder.writeNumber(BigInt(item)));
|
|
307
|
+
return (0, core_1.serializeTuple)(dataFeedIdsTupleBuilder.build());
|
|
308
|
+
}
|
|
309
|
+
return {
|
|
310
|
+
createPayload,
|
|
311
|
+
getHexlifiedFeedIds,
|
|
312
|
+
getDataFeedIdTuples,
|
|
313
|
+
getPrices,
|
|
314
|
+
};
|
|
315
|
+
}
|
|
214
316
|
exports.default = {
|
|
215
317
|
getDataFeedIdTuples,
|
|
216
318
|
getHexlifiedFeedIds,
|
|
217
319
|
createPayload,
|
|
218
320
|
createRedstoneHelper,
|
|
321
|
+
createRedstoneCustomHelper,
|
|
219
322
|
};
|
|
220
|
-
const encoder = new TextEncoder();
|
|
221
323
|
function stringToBytes(value) {
|
|
222
324
|
const hexArray = value
|
|
223
325
|
.slice(2)
|
|
@@ -1,16 +1,49 @@
|
|
|
1
|
+
import { SenderArguments, OpenedContract, Address, Cell } from "@ton/core";
|
|
1
2
|
import { TonClient, WalletContractV5R1 } from "@ton/ton";
|
|
2
3
|
import { KeyPair } from "@ton/crypto";
|
|
3
|
-
import {
|
|
4
|
+
import { MessageHash } from "../external-message-hash";
|
|
5
|
+
export declare const sleep: (ms?: number) => Promise<unknown>;
|
|
4
6
|
export interface TrackableSenderConfig {
|
|
5
7
|
client: TonClient;
|
|
6
|
-
wallet: WalletContractV5R1
|
|
8
|
+
wallet: OpenedContract<WalletContractV5R1>;
|
|
7
9
|
keyPair: KeyPair;
|
|
8
10
|
}
|
|
11
|
+
export declare function parseExternalMessage(body: Cell): {
|
|
12
|
+
op: number;
|
|
13
|
+
walletId: number;
|
|
14
|
+
timeout: number;
|
|
15
|
+
seqno: number;
|
|
16
|
+
actions: any[];
|
|
17
|
+
signature: Buffer<ArrayBufferLike>;
|
|
18
|
+
};
|
|
19
|
+
export declare function pollExternalTransfer(client: TonClient, address: Address, seqno: number): Promise<MessageHash>;
|
|
9
20
|
/**
|
|
10
21
|
* Create a TrackableSender from wallet contract and key pair
|
|
11
22
|
*/
|
|
12
|
-
export declare function createTrackableSender(config: TrackableSenderConfig):
|
|
23
|
+
export declare function createTrackableSender(config: TrackableSenderConfig): {
|
|
24
|
+
address: Address;
|
|
25
|
+
getSeqno(): Promise<number>;
|
|
26
|
+
send(args: SenderArguments): Promise<{
|
|
27
|
+
signedBody: Cell;
|
|
28
|
+
extMsgHash: {
|
|
29
|
+
ext: MessageHash;
|
|
30
|
+
norm: MessageHash;
|
|
31
|
+
};
|
|
32
|
+
seqno: number;
|
|
33
|
+
}>;
|
|
34
|
+
};
|
|
13
35
|
/**
|
|
14
36
|
* Create a TrackableSender from mnemonic
|
|
15
37
|
*/
|
|
16
|
-
export declare function createTrackableSenderFromMnemonic(client: TonClient, mnemonic: string[], workchain?: number): Promise<
|
|
38
|
+
export declare function createTrackableSenderFromMnemonic(client: TonClient, mnemonic: string[], workchain?: number): Promise<{
|
|
39
|
+
address: Address;
|
|
40
|
+
getSeqno(): Promise<number>;
|
|
41
|
+
send(args: SenderArguments): Promise<{
|
|
42
|
+
signedBody: Cell;
|
|
43
|
+
extMsgHash: {
|
|
44
|
+
ext: MessageHash;
|
|
45
|
+
norm: MessageHash;
|
|
46
|
+
};
|
|
47
|
+
seqno: number;
|
|
48
|
+
}>;
|
|
49
|
+
}>;
|
|
@@ -33,22 +33,60 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.sleep = void 0;
|
|
37
|
+
exports.parseExternalMessage = parseExternalMessage;
|
|
38
|
+
exports.pollExternalTransfer = pollExternalTransfer;
|
|
36
39
|
exports.createTrackableSender = createTrackableSender;
|
|
37
40
|
exports.createTrackableSenderFromMnemonic = createTrackableSenderFromMnemonic;
|
|
38
41
|
const core_1 = require("@ton/core");
|
|
39
42
|
const ton_1 = require("@ton/ton");
|
|
40
43
|
const external_message_hash_1 = require("../external-message-hash");
|
|
44
|
+
const WalletContractV5R1_1 = require("@ton/ton/dist/wallets/WalletContractV5R1");
|
|
45
|
+
const sleep = (ms = 1000) => new Promise(r => setTimeout(r, ms));
|
|
46
|
+
exports.sleep = sleep;
|
|
47
|
+
function parseExternalMessage(body) {
|
|
48
|
+
const slice = body.beginParse();
|
|
49
|
+
const op = Number(slice.loadUint(32));
|
|
50
|
+
const walletId = Number(slice.loadUint(32));
|
|
51
|
+
const timeout = Number(slice.loadUint(32));
|
|
52
|
+
const seqno = Number(slice.loadUint(32));
|
|
53
|
+
const actions = [];
|
|
54
|
+
const outList = slice.loadMaybeRef();
|
|
55
|
+
if (outList)
|
|
56
|
+
actions.push(...(0, core_1.loadOutList)(outList.beginParse()));
|
|
57
|
+
if (slice.loadBit())
|
|
58
|
+
actions.push((0, WalletContractV5R1_1.loadOutActionExtendedV5R1)(slice));
|
|
59
|
+
while (slice.remainingRefs > 0) {
|
|
60
|
+
actions.push((0, WalletContractV5R1_1.loadOutActionExtendedV5R1)(slice.loadRef().beginParse()));
|
|
61
|
+
}
|
|
62
|
+
const signature = slice.loadBuffer(64);
|
|
63
|
+
return { op, walletId, timeout, seqno, actions, signature };
|
|
64
|
+
}
|
|
65
|
+
async function pollExternalTransfer(client, address, seqno) {
|
|
66
|
+
while (true) {
|
|
67
|
+
const txs = await client.getTransactions(address, {
|
|
68
|
+
limit: 100
|
|
69
|
+
});
|
|
70
|
+
const tx = txs
|
|
71
|
+
.filter(tx => tx.inMessage?.info.type === "external-in")
|
|
72
|
+
.find(tx => parseExternalMessage(tx.inMessage?.body).seqno === seqno);
|
|
73
|
+
if (tx) {
|
|
74
|
+
const result = (0, external_message_hash_1.computeExternalMessageHash)(address, tx.inMessage?.body);
|
|
75
|
+
return result.ext;
|
|
76
|
+
}
|
|
77
|
+
await (0, exports.sleep)();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
41
80
|
/**
|
|
42
81
|
* Create a TrackableSender from wallet contract and key pair
|
|
43
82
|
*/
|
|
44
83
|
function createTrackableSender(config) {
|
|
45
84
|
const { client, wallet, keyPair } = config;
|
|
46
|
-
const openedWallet = client.open(wallet);
|
|
47
85
|
return {
|
|
48
86
|
address: wallet.address,
|
|
49
87
|
async getSeqno() {
|
|
50
88
|
try {
|
|
51
|
-
return await
|
|
89
|
+
return await wallet.getSeqno();
|
|
52
90
|
}
|
|
53
91
|
catch {
|
|
54
92
|
return 0;
|
|
@@ -61,18 +99,19 @@ function createTrackableSender(config) {
|
|
|
61
99
|
value: args.value,
|
|
62
100
|
body: args.body,
|
|
63
101
|
bounce: args.bounce ?? true,
|
|
64
|
-
init: args.init,
|
|
102
|
+
// init: args.init,
|
|
65
103
|
});
|
|
66
104
|
const sendMode = args.sendMode ?? core_1.SendMode.PAY_GAS_SEPARATELY;
|
|
67
|
-
|
|
105
|
+
wallet.send;
|
|
106
|
+
const signedBody = wallet.createTransfer({
|
|
68
107
|
seqno,
|
|
69
108
|
secretKey: keyPair.secretKey,
|
|
70
109
|
sendMode,
|
|
71
110
|
messages: [internalMessage],
|
|
72
111
|
});
|
|
73
|
-
const
|
|
74
|
-
await
|
|
75
|
-
return { extMsgHash
|
|
112
|
+
const extMsgHash = (0, external_message_hash_1.computeExternalMessageHash)(wallet.address, signedBody);
|
|
113
|
+
await wallet.send(signedBody);
|
|
114
|
+
return { signedBody, extMsgHash, seqno };
|
|
76
115
|
},
|
|
77
116
|
};
|
|
78
117
|
}
|
|
@@ -82,6 +121,6 @@ function createTrackableSender(config) {
|
|
|
82
121
|
async function createTrackableSenderFromMnemonic(client, mnemonic, workchain = 0) {
|
|
83
122
|
const { mnemonicToWalletKey } = await Promise.resolve().then(() => __importStar(require("@ton/crypto")));
|
|
84
123
|
const keyPair = await mnemonicToWalletKey(mnemonic);
|
|
85
|
-
const wallet = ton_1.WalletContractV5R1.create({ publicKey: keyPair.publicKey, workchain });
|
|
124
|
+
const wallet = client.open(ton_1.WalletContractV5R1.create({ publicKey: keyPair.publicKey, workchain }));
|
|
86
125
|
return createTrackableSender({ client, wallet, keyPair });
|
|
87
126
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { PendingTraceResponse, TraceResult, WaitOptions } from "./type";
|
|
2
|
+
import { ToncenterPendingTracesResponseRaw, ToncenterTraceRaw } from "../toncenter/type";
|
|
2
3
|
/**
|
|
3
4
|
* Toncenter v3 API endpoints
|
|
4
5
|
*/
|
|
@@ -19,6 +20,21 @@ export declare class ToncenterV3Client {
|
|
|
19
20
|
* Get pending traces by external message hash
|
|
20
21
|
*/
|
|
21
22
|
getPendingTraces(extMsgHash: string): Promise<PendingTraceResponse>;
|
|
23
|
+
/**
|
|
24
|
+
* Get detailed pending traces (includes transaction details for step tracking)
|
|
25
|
+
*/
|
|
26
|
+
getDetailedPendingTraces(extMsgHash: string): Promise<ToncenterPendingTracesResponseRaw>;
|
|
27
|
+
/**
|
|
28
|
+
* Get confirmed traces by message hash
|
|
29
|
+
*/
|
|
30
|
+
getTraces(msgHash: string): Promise<ToncenterPendingTracesResponseRaw>;
|
|
31
|
+
/**
|
|
32
|
+
* Poll for detailed trace (for TracerBase compatibility)
|
|
33
|
+
*/
|
|
34
|
+
pollDetailedTrace(extMsgHash: string, options?: {
|
|
35
|
+
pollInterval?: number;
|
|
36
|
+
maxRetries?: number;
|
|
37
|
+
}): Promise<ToncenterTraceRaw>;
|
|
22
38
|
/**
|
|
23
39
|
* Convert raw trace to simplified TraceResult
|
|
24
40
|
*/
|
|
@@ -3,6 +3,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.ToncenterV3Client = void 0;
|
|
4
4
|
const core_1 = require("@ton/core");
|
|
5
5
|
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
6
|
+
class ToncenterApiError extends Error {
|
|
7
|
+
status;
|
|
8
|
+
statusText;
|
|
9
|
+
payload;
|
|
10
|
+
constructor(status, statusText, payload) {
|
|
11
|
+
super(`Toncenter v3 API error: ${status} ${statusText}`);
|
|
12
|
+
this.status = status;
|
|
13
|
+
this.statusText = statusText;
|
|
14
|
+
this.payload = payload;
|
|
15
|
+
this.name = "ToncenterApiError";
|
|
16
|
+
}
|
|
17
|
+
}
|
|
6
18
|
/**
|
|
7
19
|
* Toncenter v3 API endpoints
|
|
8
20
|
*/
|
|
@@ -30,7 +42,14 @@ class ToncenterV3Client {
|
|
|
30
42
|
}
|
|
31
43
|
const response = await fetch(url, { headers });
|
|
32
44
|
if (!response.ok) {
|
|
33
|
-
|
|
45
|
+
let payload;
|
|
46
|
+
try {
|
|
47
|
+
payload = await response.json();
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
payload = await response.text();
|
|
51
|
+
}
|
|
52
|
+
throw new ToncenterApiError(response.status, response.statusText, payload);
|
|
34
53
|
}
|
|
35
54
|
return response.json();
|
|
36
55
|
}
|
|
@@ -38,7 +57,66 @@ class ToncenterV3Client {
|
|
|
38
57
|
* Get pending traces by external message hash
|
|
39
58
|
*/
|
|
40
59
|
async getPendingTraces(extMsgHash) {
|
|
41
|
-
|
|
60
|
+
const param = encodeURIComponent(extMsgHash);
|
|
61
|
+
try {
|
|
62
|
+
return await this.fetch(`/pendingTraces?ext_msg_hash=${param}`);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
if (error instanceof ToncenterApiError && error.status === 422) {
|
|
66
|
+
return { traces: [] };
|
|
67
|
+
}
|
|
68
|
+
throw error;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get detailed pending traces (includes transaction details for step tracking)
|
|
73
|
+
*/
|
|
74
|
+
async getDetailedPendingTraces(extMsgHash) {
|
|
75
|
+
const param = encodeURIComponent(extMsgHash);
|
|
76
|
+
try {
|
|
77
|
+
return await this.fetch(`/pendingTraces?ext_msg_hash=${param}`);
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
if (error instanceof ToncenterApiError && error.status === 422) {
|
|
81
|
+
return { traces: null, address_book: {}, metadata: {} };
|
|
82
|
+
}
|
|
83
|
+
throw error;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Get confirmed traces by message hash
|
|
88
|
+
*/
|
|
89
|
+
async getTraces(msgHash) {
|
|
90
|
+
const param = encodeURIComponent(msgHash);
|
|
91
|
+
try {
|
|
92
|
+
return await this.fetch(`/traces?msg_hash=${param}`);
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
if (error instanceof ToncenterApiError && error.status === 422) {
|
|
96
|
+
return { traces: null, address_book: {}, metadata: {} };
|
|
97
|
+
}
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Poll for detailed trace (for TracerBase compatibility)
|
|
103
|
+
*/
|
|
104
|
+
async pollDetailedTrace(extMsgHash, options = {}) {
|
|
105
|
+
const { pollInterval = 3000, maxRetries = 30 } = options;
|
|
106
|
+
let count = 0;
|
|
107
|
+
while (count < maxRetries) {
|
|
108
|
+
count++;
|
|
109
|
+
const pending = await this.getDetailedPendingTraces(extMsgHash);
|
|
110
|
+
const pendingTrace = pending.traces?.find(t => t.trace.in_msg_hash === extMsgHash);
|
|
111
|
+
if (pendingTrace)
|
|
112
|
+
return pendingTrace;
|
|
113
|
+
const confirmed = await this.getTraces(extMsgHash);
|
|
114
|
+
const confirmedTrace = confirmed.traces?.find(t => t.trace.in_msg_hash === extMsgHash);
|
|
115
|
+
if (confirmedTrace)
|
|
116
|
+
return confirmedTrace;
|
|
117
|
+
await sleep(pollInterval);
|
|
118
|
+
}
|
|
119
|
+
throw new Error(`Max retries exceeded for trace: ${extMsgHash}`);
|
|
42
120
|
}
|
|
43
121
|
/**
|
|
44
122
|
* Convert raw trace to simplified TraceResult
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./type";
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./type"), exports);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ToncenterPendingTracesResponse, ToncenterPendingTracesResponseRaw } from "./type";
|
|
2
|
+
/**
|
|
3
|
+
* Convert Toncenter raw JSON responses into objects where numeric strings become bigint.
|
|
4
|
+
*/
|
|
5
|
+
export declare class ToncenterResponseTransformer {
|
|
6
|
+
static normalize(response: ToncenterPendingTracesResponseRaw): ToncenterPendingTracesResponse;
|
|
7
|
+
static normalize(response: Promise<ToncenterPendingTracesResponseRaw>): Promise<ToncenterPendingTracesResponse>;
|
|
8
|
+
private static deepNormalize;
|
|
9
|
+
private static isNumericString;
|
|
10
|
+
private static isPromise;
|
|
11
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ToncenterResponseTransformer = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Convert Toncenter raw JSON responses into objects where numeric strings become bigint.
|
|
6
|
+
*/
|
|
7
|
+
class ToncenterResponseTransformer {
|
|
8
|
+
static normalize(response) {
|
|
9
|
+
if (ToncenterResponseTransformer.isPromise(response)) {
|
|
10
|
+
return response.then((value) => ToncenterResponseTransformer.deepNormalize(value));
|
|
11
|
+
}
|
|
12
|
+
return ToncenterResponseTransformer.deepNormalize(response);
|
|
13
|
+
}
|
|
14
|
+
static deepNormalize(value) {
|
|
15
|
+
if (value === null || value === undefined) {
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
if (typeof value === "string" && ToncenterResponseTransformer.isNumericString(value)) {
|
|
19
|
+
return BigInt(value);
|
|
20
|
+
}
|
|
21
|
+
if (Array.isArray(value)) {
|
|
22
|
+
return value.map((item) => this.deepNormalize(item));
|
|
23
|
+
}
|
|
24
|
+
if (typeof value === "object") {
|
|
25
|
+
const result = {};
|
|
26
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
27
|
+
result[key] = this.deepNormalize(entry);
|
|
28
|
+
}
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
33
|
+
static isNumericString(value) {
|
|
34
|
+
return /^-?\d+$/.test(value);
|
|
35
|
+
}
|
|
36
|
+
static isPromise(value) {
|
|
37
|
+
return typeof value.then === "function";
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.ToncenterResponseTransformer = ToncenterResponseTransformer;
|