@getomnichain/omnichain 0.6.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/CHANGELOG.md +69 -0
  2. package/dist/cjs/chain_ids.js +2 -2
  3. package/dist/cjs/chain_ids.js.map +1 -1
  4. package/dist/cjs/errors.js +6 -0
  5. package/dist/cjs/errors.js.map +1 -1
  6. package/dist/cjs/index.js +1 -1
  7. package/dist/cjs/index.js.map +1 -1
  8. package/dist/cjs/ton/index.js +12 -0
  9. package/dist/cjs/ton/index.js.map +1 -1
  10. package/dist/cjs/ton/ton_address.js +72 -14
  11. package/dist/cjs/ton/ton_address.js.map +1 -1
  12. package/dist/cjs/ton/ton_asset.js +21 -0
  13. package/dist/cjs/ton/ton_asset.js.map +1 -0
  14. package/dist/cjs/ton/ton_assets.js +10 -0
  15. package/dist/cjs/ton/ton_assets.js.map +1 -0
  16. package/dist/cjs/ton/ton_chain.js +483 -0
  17. package/dist/cjs/ton/ton_chain.js.map +1 -0
  18. package/dist/cjs/ton/ton_chains.js +21 -0
  19. package/dist/cjs/ton/ton_chains.js.map +1 -0
  20. package/dist/cjs/ton/ton_jetton_metadata.js +107 -0
  21. package/dist/cjs/ton/ton_jetton_metadata.js.map +1 -0
  22. package/dist/cjs/ton/ton_messages.js +174 -0
  23. package/dist/cjs/ton/ton_messages.js.map +1 -0
  24. package/dist/cjs/ton/ton_provider.js +456 -0
  25. package/dist/cjs/ton/ton_provider.js.map +1 -0
  26. package/dist/cjs/ton/ton_tonapi.js +243 -0
  27. package/dist/cjs/ton/ton_tonapi.js.map +1 -0
  28. package/dist/cjs/ton/ton_toncenter.js +252 -0
  29. package/dist/cjs/ton/ton_toncenter.js.map +1 -0
  30. package/dist/cjs/ton/ton_transaction_status.js +231 -0
  31. package/dist/cjs/ton/ton_transaction_status.js.map +1 -0
  32. package/dist/cjs/ton/ton_transactions.js +107 -0
  33. package/dist/cjs/ton/ton_transactions.js.map +1 -0
  34. package/dist/cjs/ton/ton_wallet.js +285 -0
  35. package/dist/cjs/ton/ton_wallet.js.map +1 -0
  36. package/dist/cjs/tron/index.js +1 -0
  37. package/dist/cjs/tron/index.js.map +1 -1
  38. package/dist/cjs/tron/tron_chain.js +88 -45
  39. package/dist/cjs/tron/tron_chain.js.map +1 -1
  40. package/dist/cjs/tron/tron_memo.js +17 -0
  41. package/dist/cjs/tron/tron_memo.js.map +1 -0
  42. package/dist/cjs/tron/tron_raw_data.js +213 -0
  43. package/dist/cjs/tron/tron_raw_data.js.map +1 -0
  44. package/dist/cjs/tron/tron_transaction_builder.js +34 -13
  45. package/dist/cjs/tron/tron_transaction_builder.js.map +1 -1
  46. package/dist/cjs/tron/tron_transaction_status.js +10 -7
  47. package/dist/cjs/tron/tron_transaction_status.js.map +1 -1
  48. package/dist/cjs/tron/tron_transactions.js +1 -1
  49. package/dist/cjs/tron/tron_transactions.js.map +1 -1
  50. package/dist/esm/chain_ids.js +2 -2
  51. package/dist/esm/chain_ids.js.map +1 -1
  52. package/dist/esm/errors.d.ts +3 -0
  53. package/dist/esm/errors.d.ts.map +1 -1
  54. package/dist/esm/errors.js +5 -0
  55. package/dist/esm/errors.js.map +1 -1
  56. package/dist/esm/index.d.ts +1 -1
  57. package/dist/esm/index.d.ts.map +1 -1
  58. package/dist/esm/index.js +1 -1
  59. package/dist/esm/index.js.map +1 -1
  60. package/dist/esm/ton/index.d.ts +12 -0
  61. package/dist/esm/ton/index.d.ts.map +1 -1
  62. package/dist/esm/ton/index.js +12 -0
  63. package/dist/esm/ton/index.js.map +1 -1
  64. package/dist/esm/ton/ton_address.d.ts +26 -2
  65. package/dist/esm/ton/ton_address.d.ts.map +1 -1
  66. package/dist/esm/ton/ton_address.js +70 -14
  67. package/dist/esm/ton/ton_address.js.map +1 -1
  68. package/dist/esm/ton/ton_asset.d.ts +12 -0
  69. package/dist/esm/ton/ton_asset.d.ts.map +1 -0
  70. package/dist/esm/ton/ton_asset.js +17 -0
  71. package/dist/esm/ton/ton_asset.js.map +1 -0
  72. package/dist/esm/ton/ton_assets.d.ts +6 -0
  73. package/dist/esm/ton/ton_assets.d.ts.map +1 -0
  74. package/dist/esm/ton/ton_assets.js +7 -0
  75. package/dist/esm/ton/ton_assets.js.map +1 -0
  76. package/dist/esm/ton/ton_chain.d.ts +205 -0
  77. package/dist/esm/ton/ton_chain.d.ts.map +1 -0
  78. package/dist/esm/ton/ton_chain.js +479 -0
  79. package/dist/esm/ton/ton_chain.js.map +1 -0
  80. package/dist/esm/ton/ton_chains.d.ts +11 -0
  81. package/dist/esm/ton/ton_chains.d.ts.map +1 -0
  82. package/dist/esm/ton/ton_chains.js +18 -0
  83. package/dist/esm/ton/ton_chains.js.map +1 -0
  84. package/dist/esm/ton/ton_jetton_metadata.d.ts +36 -0
  85. package/dist/esm/ton/ton_jetton_metadata.d.ts.map +1 -0
  86. package/dist/esm/ton/ton_jetton_metadata.js +103 -0
  87. package/dist/esm/ton/ton_jetton_metadata.js.map +1 -0
  88. package/dist/esm/ton/ton_messages.d.ts +133 -0
  89. package/dist/esm/ton/ton_messages.d.ts.map +1 -0
  90. package/dist/esm/ton/ton_messages.js +159 -0
  91. package/dist/esm/ton/ton_messages.js.map +1 -0
  92. package/dist/esm/ton/ton_provider.d.ts +261 -0
  93. package/dist/esm/ton/ton_provider.d.ts.map +1 -0
  94. package/dist/esm/ton/ton_provider.js +432 -0
  95. package/dist/esm/ton/ton_provider.js.map +1 -0
  96. package/dist/esm/ton/ton_tonapi.d.ts +39 -0
  97. package/dist/esm/ton/ton_tonapi.d.ts.map +1 -0
  98. package/dist/esm/ton/ton_tonapi.js +239 -0
  99. package/dist/esm/ton/ton_tonapi.js.map +1 -0
  100. package/dist/esm/ton/ton_toncenter.d.ts +25 -0
  101. package/dist/esm/ton/ton_toncenter.d.ts.map +1 -0
  102. package/dist/esm/ton/ton_toncenter.js +248 -0
  103. package/dist/esm/ton/ton_toncenter.js.map +1 -0
  104. package/dist/esm/ton/ton_transaction_status.d.ts +116 -0
  105. package/dist/esm/ton/ton_transaction_status.d.ts.map +1 -0
  106. package/dist/esm/ton/ton_transaction_status.js +226 -0
  107. package/dist/esm/ton/ton_transaction_status.js.map +1 -0
  108. package/dist/esm/ton/ton_transactions.d.ts +54 -0
  109. package/dist/esm/ton/ton_transactions.d.ts.map +1 -0
  110. package/dist/esm/ton/ton_transactions.js +100 -0
  111. package/dist/esm/ton/ton_transactions.js.map +1 -0
  112. package/dist/esm/ton/ton_wallet.d.ts +134 -0
  113. package/dist/esm/ton/ton_wallet.d.ts.map +1 -0
  114. package/dist/esm/ton/ton_wallet.js +278 -0
  115. package/dist/esm/ton/ton_wallet.js.map +1 -0
  116. package/dist/esm/tron/index.d.ts +1 -0
  117. package/dist/esm/tron/index.d.ts.map +1 -1
  118. package/dist/esm/tron/index.js +1 -0
  119. package/dist/esm/tron/index.js.map +1 -1
  120. package/dist/esm/tron/tron_chain.d.ts +13 -1
  121. package/dist/esm/tron/tron_chain.d.ts.map +1 -1
  122. package/dist/esm/tron/tron_chain.js +89 -46
  123. package/dist/esm/tron/tron_chain.js.map +1 -1
  124. package/dist/esm/tron/tron_memo.d.ts +2 -0
  125. package/dist/esm/tron/tron_memo.d.ts.map +1 -0
  126. package/dist/esm/tron/tron_memo.js +14 -0
  127. package/dist/esm/tron/tron_memo.js.map +1 -0
  128. package/dist/esm/tron/tron_raw_data.d.ts +4 -0
  129. package/dist/esm/tron/tron_raw_data.d.ts.map +1 -0
  130. package/dist/esm/tron/tron_raw_data.js +209 -0
  131. package/dist/esm/tron/tron_raw_data.js.map +1 -0
  132. package/dist/esm/tron/tron_transaction_builder.d.ts +4 -0
  133. package/dist/esm/tron/tron_transaction_builder.d.ts.map +1 -1
  134. package/dist/esm/tron/tron_transaction_builder.js +34 -13
  135. package/dist/esm/tron/tron_transaction_builder.js.map +1 -1
  136. package/dist/esm/tron/tron_transaction_status.d.ts +16 -2
  137. package/dist/esm/tron/tron_transaction_status.d.ts.map +1 -1
  138. package/dist/esm/tron/tron_transaction_status.js +10 -7
  139. package/dist/esm/tron/tron_transaction_status.js.map +1 -1
  140. package/dist/esm/tron/tron_transactions.js +1 -1
  141. package/dist/esm/tron/tron_transactions.js.map +1 -1
  142. package/docs/README.md +2 -1
  143. package/docs/ton.md +164 -0
  144. package/docs/tron.md +21 -11
  145. package/package.json +5 -1
@@ -0,0 +1,116 @@
1
+ import { type NestedBalanceChanges, TransactionStatus, type TransactionErrorInfo, type TransactionStatusType } from '../transaction_status.ts';
2
+ import { type TonTrace, type TonTraceMessage, type TonTraceTransaction } from './ton_provider.ts';
3
+ /** Jettons a jetton wallet received in a trace (a TEP-74 `internal_transfer` it accepted). */
4
+ /** Jettons a jetton wallet accepted (`internal_transfer`), read from the trace alone — not yet checked against any master. */
5
+ export interface TonJettonCredit {
6
+ /** The receiving jetton wallet, raw. */
7
+ jettonWallet: string;
8
+ amount: bigint;
9
+ /** The previous owner the transfer names, raw. */
10
+ from: string | null;
11
+ /** The jetton wallet that sent them, raw. */
12
+ senderJettonWallet: string | null;
13
+ /** The receiving transaction. */
14
+ transaction: string;
15
+ }
16
+ /** What happened to one message a wallet sent. */
17
+ export type TonDeliveryOutcome =
18
+ /**
19
+ * Its destination kept it (a non-bounceable message is delivered even if the
20
+ * receiver then failed). For a jetton transfer, the receiver's jetton wallet
21
+ * accepted the jettons.
22
+ */
23
+ 'delivered'
24
+ /** Its destination failed or had no code, and the value (or the jettons) came back. */
25
+ | 'bounced'
26
+ /**
27
+ * A bounceable message whose destination failed without sending it back —
28
+ * an action phase that failed without send mode +16, or too little value
29
+ * left to pay for the bounce. The value stayed there or went on fees.
30
+ */
31
+ | 'failed'
32
+ /**
33
+ * A jetton transfer whose sender's jetton wallet took it without error but
34
+ * sent the jettons nowhere. Never a message missing from a complete trace:
35
+ * that is the provider's gap, refused as an inconsistent trace.
36
+ */
37
+ | 'undelivered'
38
+ /** The trace is still running. */
39
+ | 'pending';
40
+ export interface TonMessageDelivery {
41
+ /** The sending wallet, raw. */
42
+ from: string;
43
+ /** Raw. */
44
+ to: string;
45
+ value: bigint;
46
+ outcome: TonDeliveryOutcome;
47
+ /** The receiving transaction's hash, when there is one. */
48
+ transaction: string | null;
49
+ }
50
+ /** Why the request did not do what it was signed for. */
51
+ export interface TonRequestProblem {
52
+ code: string;
53
+ reason: string;
54
+ }
55
+ /** What a trace did, from either a real trace or an emulation. */
56
+ export interface TonTraceSummary {
57
+ /**
58
+ * The request did what it was signed for: the sending wallet's transaction
59
+ * (and, for a relayed request, the target wallet's) succeeded with nothing
60
+ * skipped, and every message those wallets sent was delivered. Failures
61
+ * further down — a recipient contract that throws on a notification, an
62
+ * excess refund that was skipped — do not undo those deliveries and are
63
+ * reported in `failedTransactions` / `bouncedMessages` only.
64
+ */
65
+ success: boolean;
66
+ problem: TonRequestProblem | null;
67
+ /** Every message the sending wallets sent, and what became of it. */
68
+ deliveries: TonMessageDelivery[];
69
+ /** Nanotons the network took: every transaction's fees plus the forward fees its messages carried. */
70
+ fees: bigint;
71
+ failedTransactions: TonTraceTransaction[];
72
+ bouncedMessages: TonTraceMessage[];
73
+ /** Native TON per account. */
74
+ balanceChanges: NestedBalanceChanges;
75
+ jettonCredits: TonJettonCredit[];
76
+ }
77
+ export declare function summarizeTonTrace(chainId: number, trace: TonTrace): TonTraceSummary;
78
+ export interface TonTransactionStatusInit {
79
+ chainId: number;
80
+ status: TransactionStatusType;
81
+ inclusionAt?: Date | null;
82
+ error?: TransactionErrorInfo | null;
83
+ balanceChanges?: NestedBalanceChanges | null;
84
+ trace?: TonTrace | null;
85
+ summary?: TonTraceSummary | null;
86
+ masterchainSeqno?: number | null;
87
+ masterchainDepth?: number | null;
88
+ }
89
+ /**
90
+ * The status of an external message's whole trace.
91
+ *
92
+ * Final — `Success` or `Failed` — only once the trace is complete and every
93
+ * transaction in it is in a block a masterchain block references. TON's
94
+ * consensus is final at that point; `masterchainDepth` lets a caller ask for
95
+ * more anyway. `Failed` when the request did not do what it was signed for
96
+ * (see {@link TonTraceSummary.success}); a failed status still carries the
97
+ * summary, whose `deliveries` say which messages did arrive.
98
+ */
99
+ export declare class TonTransactionStatus extends TransactionStatus {
100
+ readonly trace: TonTrace | null;
101
+ readonly summary: TonTraceSummary | null;
102
+ /** The highest masterchain block referencing the trace's transactions. */
103
+ readonly masterchainSeqno: number | null;
104
+ /** Masterchain blocks since then. */
105
+ readonly masterchainDepth: number | null;
106
+ constructor(init: TonTransactionStatusInit);
107
+ get fees(): bigint | null;
108
+ get jettonCredits(): TonJettonCredit[];
109
+ static fromTrace(args: {
110
+ chainId: number;
111
+ trace: TonTrace | null;
112
+ masterchainTip: number;
113
+ minMasterchainDepth?: number;
114
+ }): TonTransactionStatus;
115
+ }
116
+ //# sourceMappingURL=ton_transaction_status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ton_transaction_status.d.ts","sourceRoot":"","sources":["../../../ton/ton_transaction_status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,226 @@
1
+ import { AssetBalanceChange, TransactionStatus, TransactionStatusTypes, assetHashOf, } from "../transaction_status.js";
2
+ import { TonAsset } from "./ton_asset.js";
3
+ import { TON_JETTON_INTERNAL_TRANSFER_OP, TON_JETTON_TRANSFER_OP, TON_W5_SIGNED_INTERNAL_OP } from "./ton_messages.js";
4
+ import { assertTraceConsistent } from "./ton_provider.js";
5
+ export function summarizeTonTrace(chainId, trace) {
6
+ assertTraceConsistent('the trace given', trace);
7
+ const native = new TonAsset(chainId, 'TON', null, TonAsset.NATIVE_DECIMALS);
8
+ const deltas = new Map();
9
+ const add = (account, delta) => {
10
+ deltas.set(account, (deltas.get(account) ?? 0n) + delta);
11
+ };
12
+ let fees = 0n;
13
+ const jettonCredits = [];
14
+ for (const tx of trace.transactions) {
15
+ fees += tx.totalFees;
16
+ let debit = tx.totalFees;
17
+ if (tx.inMsg !== null && tx.inMsg.source !== null)
18
+ add(tx.account, tx.inMsg.value);
19
+ for (const out of tx.outMsgs) {
20
+ if (out.destination === null)
21
+ continue;
22
+ fees += out.fwdFee;
23
+ debit += out.value + out.fwdFee;
24
+ }
25
+ add(tx.account, -debit);
26
+ // Accepted unless the jetton wallet's transaction aborted; a refund it then skipped does not undo the credit.
27
+ const credit = !tx.aborted && tx.inMsg !== null ? jettonCreditOf(tx, tx.inMsg) : null;
28
+ if (credit !== null)
29
+ jettonCredits.push(credit);
30
+ }
31
+ const balanceChanges = new Map();
32
+ for (const [account, delta] of deltas) {
33
+ balanceChanges.set(account, new Map([[assetHashOf(native), { token: native, change: AssetBalanceChange.fromMr(delta, TonAsset.NATIVE_DECIMALS) }]]));
34
+ }
35
+ const { problem, deliveries } = judgeRequest(trace);
36
+ return {
37
+ success: problem === null,
38
+ problem,
39
+ deliveries,
40
+ fees,
41
+ failedTransactions: trace.transactions.filter((tx) => !tx.success),
42
+ bouncedMessages: trace.transactions.flatMap((tx) => (tx.inMsg !== null && tx.inMsg.bounced ? [tx.inMsg] : [])),
43
+ balanceChanges,
44
+ jettonCredits,
45
+ };
46
+ }
47
+ /**
48
+ * Judges the wallets that sent the request — the root, and any wallet it
49
+ * delivered a signed internal request to — on their own transactions and on
50
+ * the first hop of every message they sent.
51
+ */
52
+ function judgeRequest(trace) {
53
+ const root = trace.transactions[0];
54
+ if (root === undefined)
55
+ return { problem: { code: 'no_transaction', reason: 'the trace has no transaction' }, deliveries: [] };
56
+ const children = childrenByParent(trace.transactions);
57
+ const relayTargets = (children.get(root.hash) ?? []).filter((tx) => tx.inMsg?.opcode === TON_W5_SIGNED_INTERNAL_OP);
58
+ const deliveries = [];
59
+ let problem = null;
60
+ const note = (found) => {
61
+ problem ??= found;
62
+ };
63
+ for (const wallet of [root, ...relayTargets]) {
64
+ if (!wallet.success) {
65
+ note(wallet.skippedActions > 0
66
+ ? { code: 'skipped_actions', reason: `${wallet.account} skipped ${wallet.skippedActions} message(s) it could not send` }
67
+ : { code: String(wallet.computeExitCode ?? wallet.actionResultCode ?? 'failed'), reason: `${wallet.account} failed in ${wallet.hash}` });
68
+ }
69
+ // A bounce the wallet sends back is not a message it was asked to send.
70
+ // Sorted by creation, the order the request listed them.
71
+ const sent = wallet.outMsgs
72
+ .filter((m) => m.destination !== null && !m.bounced)
73
+ .sort((a, b) => (a.createdLt === b.createdLt ? 0 : (a.createdLt ?? 0n) < (b.createdLt ?? 0n) ? -1 : 1));
74
+ if (wallet !== root && wallet.success && sent.length === 0) {
75
+ note({ code: 'request_not_executed', reason: `${wallet.account} did not execute the relayed request (bad signature or seqno)` });
76
+ }
77
+ const received = children.get(wallet.hash) ?? [];
78
+ for (const message of sent) {
79
+ const { receiver, outcome: firstHop } = deliveryOf(message, received, trace.complete);
80
+ // A jetton transfer moves the jettons one hop later, in the receiver's jetton wallet.
81
+ const jettonHop = firstHop === 'delivered' && message.opcode === TON_JETTON_TRANSFER_OP && receiver !== null
82
+ ? jettonDeliveryOf(receiver, children.get(receiver.hash) ?? [], trace.complete)
83
+ : null;
84
+ const outcome = jettonHop?.outcome ?? firstHop;
85
+ deliveries.push({
86
+ from: wallet.account,
87
+ to: message.destination,
88
+ value: message.value,
89
+ outcome,
90
+ transaction: jettonHop?.receiver?.hash ?? receiver?.hash ?? null,
91
+ });
92
+ if (outcome === 'bounced' || outcome === 'undelivered' || outcome === 'failed') {
93
+ const code = outcome === 'failed' ? 'receiver_failed' : outcome;
94
+ note({
95
+ code: jettonHop === null ? code : `jetton_${code}`,
96
+ reason: `a ${jettonHop === null ? 'message' : 'jetton transfer'} from ${wallet.account} to ${message.destination} was ${outcome}`,
97
+ });
98
+ }
99
+ }
100
+ }
101
+ return { problem, deliveries };
102
+ }
103
+ /**
104
+ * Which received transaction took `message`, and whether it kept the value.
105
+ *
106
+ * Matched on (source, createdLt), which names one message. The providers
107
+ * refuse a trace whose receivers disagree with their senders, so a match is
108
+ * the message itself.
109
+ */
110
+ function deliveryOf(message, received, complete) {
111
+ const receiver = received.find((tx) => tx.inMsg !== null && tx.inMsg.source === message.source && tx.inMsg.createdLt === message.createdLt) ??
112
+ null;
113
+ if (receiver === null)
114
+ return { receiver, outcome: complete ? 'undelivered' : 'pending' };
115
+ // A receiver that did not abort kept the value, even if it skipped one of its
116
+ // own sends (e.g. an excess refund under "ignore errors"); so did one a
117
+ // non-bounceable message reached. An aborted receiver of a bounceable message
118
+ // sends it back only on a failed compute phase (no code yet included), a
119
+ // failed action with send mode +16, and when the value covers the bounce;
120
+ // the bounce is in the receiver's own transaction.
121
+ if (!message.bounce || !receiver.aborted)
122
+ return { receiver, outcome: 'delivered' };
123
+ const bouncedBack = receiver.outMsgs.some((m) => m.bounced && m.destination === message.source);
124
+ return { receiver, outcome: bouncedBack ? 'bounced' : 'failed' };
125
+ }
126
+ /** The `internal_transfer` the sender's jetton wallet sent on, judged where the jettons land. */
127
+ function jettonDeliveryOf(senderJettonWallet, received, complete) {
128
+ const transfer = senderJettonWallet.outMsgs.find((m) => m.opcode === TON_JETTON_INTERNAL_TRANSFER_OP && !m.bounced);
129
+ if (transfer === undefined)
130
+ return { receiver: null, outcome: complete ? 'undelivered' : 'pending' };
131
+ return deliveryOf(transfer, received, complete);
132
+ }
133
+ function childrenByParent(transactions) {
134
+ const byParent = new Map();
135
+ for (const tx of transactions) {
136
+ if (tx.parent === null)
137
+ continue;
138
+ byParent.set(tx.parent, [...(byParent.get(tx.parent) ?? []), tx]);
139
+ }
140
+ return byParent;
141
+ }
142
+ function jettonCreditOf(tx, inMsg) {
143
+ if (inMsg.opcode !== TON_JETTON_INTERNAL_TRANSFER_OP || inMsg.bounced || inMsg.body === null)
144
+ return null;
145
+ try {
146
+ const slice = inMsg.body.beginParse();
147
+ slice.skip(32 + 64);
148
+ const amount = slice.loadCoins();
149
+ const from = slice.loadMaybeAddress();
150
+ return {
151
+ jettonWallet: tx.account,
152
+ amount,
153
+ from: from === null ? null : from.toRawString(),
154
+ senderJettonWallet: inMsg.source,
155
+ transaction: tx.hash,
156
+ };
157
+ }
158
+ catch {
159
+ return null;
160
+ }
161
+ }
162
+ /**
163
+ * The status of an external message's whole trace.
164
+ *
165
+ * Final — `Success` or `Failed` — only once the trace is complete and every
166
+ * transaction in it is in a block a masterchain block references. TON's
167
+ * consensus is final at that point; `masterchainDepth` lets a caller ask for
168
+ * more anyway. `Failed` when the request did not do what it was signed for
169
+ * (see {@link TonTraceSummary.success}); a failed status still carries the
170
+ * summary, whose `deliveries` say which messages did arrive.
171
+ */
172
+ export class TonTransactionStatus extends TransactionStatus {
173
+ trace;
174
+ summary;
175
+ /** The highest masterchain block referencing the trace's transactions. */
176
+ masterchainSeqno;
177
+ /** Masterchain blocks since then. */
178
+ masterchainDepth;
179
+ constructor(init) {
180
+ super({
181
+ chainId: init.chainId,
182
+ status: init.status,
183
+ inclusionAt: init.inclusionAt,
184
+ error: init.error,
185
+ balanceChanges: init.balanceChanges,
186
+ });
187
+ this.trace = init.trace ?? null;
188
+ this.summary = init.summary ?? null;
189
+ this.masterchainSeqno = init.masterchainSeqno ?? null;
190
+ this.masterchainDepth = init.masterchainDepth ?? null;
191
+ }
192
+ get fees() {
193
+ return this.summary?.fees ?? null;
194
+ }
195
+ get jettonCredits() {
196
+ return this.summary?.jettonCredits ?? [];
197
+ }
198
+ static fromTrace(args) {
199
+ const { chainId, trace } = args;
200
+ const pending = () => new TonTransactionStatus({ chainId, status: TransactionStatusTypes.Pending, trace });
201
+ if (trace === null || !trace.complete || trace.transactions.length === 0)
202
+ return pending();
203
+ const seqnos = trace.transactions.map((tx) => tx.mcSeqno);
204
+ if (seqnos.some((seqno) => seqno === null))
205
+ return pending();
206
+ const masterchainSeqno = Math.max(...seqnos);
207
+ const masterchainDepth = Math.max(args.masterchainTip - masterchainSeqno, 0);
208
+ if (masterchainDepth < (args.minMasterchainDepth ?? 0))
209
+ return pending();
210
+ const summary = summarizeTonTrace(chainId, trace);
211
+ const common = {
212
+ chainId,
213
+ inclusionAt: new Date(trace.transactions[0].utime * 1000),
214
+ trace,
215
+ summary,
216
+ masterchainSeqno,
217
+ masterchainDepth,
218
+ };
219
+ if (summary.success) {
220
+ return new TonTransactionStatus({ ...common, status: TransactionStatusTypes.Success, balanceChanges: summary.balanceChanges });
221
+ }
222
+ const error = { ...summary.problem };
223
+ return new TonTransactionStatus({ ...common, status: TransactionStatusTypes.Failed, error });
224
+ }
225
+ }
226
+ //# sourceMappingURL=ton_transaction_status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ton_transaction_status.js","sourceRoot":"","sources":["../../../ton/ton_transaction_status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import { AbstractSignedTransaction } from '../signed_transaction.ts';
2
+ import { type JsonDict, type JsonTransactionInput } from '../transaction_json.ts';
3
+ import { UnsignedTransaction } from '../unsigned_transaction.ts';
4
+ import { type TonOutMessage } from './ton_messages.ts';
5
+ /**
6
+ * A request a wallet will send itself: its messages, and optionally how long
7
+ * the signed request stays valid. The seqno and whether to deploy are read at
8
+ * signing time (`TonWallet.signTransaction`).
9
+ */
10
+ export declare class TonUnsignedTransaction extends UnsignedTransaction {
11
+ readonly walletAddress: string;
12
+ readonly messages: readonly TonOutMessage[];
13
+ readonly validUntil: number | undefined;
14
+ constructor(init: {
15
+ chainId: number;
16
+ walletAddress: string;
17
+ messages: readonly TonOutMessage[];
18
+ validUntil?: number;
19
+ });
20
+ }
21
+ /**
22
+ * A signed external wallet request (W5, v4r2 or v3r2): its BOC, its normalized hash (the
23
+ * transaction id), and — read from the signed body itself, so they survive a
24
+ * JSON round trip — the wallet, seqno and `validUntil` it commits to, which
25
+ * `TonChain.getRequestState` takes.
26
+ */
27
+ export declare class TonSignedTransaction extends AbstractSignedTransaction {
28
+ #private;
29
+ static readonly JSON_TYPE = "TonSignedTransaction";
30
+ readonly boc: string;
31
+ /** Raw. */
32
+ readonly walletAddress: string;
33
+ readonly seqno: number;
34
+ readonly validUntil: number;
35
+ constructor(init: {
36
+ chainId: number;
37
+ boc: string;
38
+ });
39
+ get chainId(): number;
40
+ /** Normalized external-message hash, lowercase hex. */
41
+ get txHash(): string;
42
+ toJson(): JsonDict;
43
+ static fromJson(data: JsonTransactionInput): TonSignedTransaction;
44
+ }
45
+ /** A signed external wallet request (W5, v4r2 or v3r2) read back from its base64 BOC. */
46
+ export declare function tonExternalRequestOf(boc: string): {
47
+ walletAddress: string;
48
+ hash: string;
49
+ seqno: number;
50
+ validUntil: number;
51
+ };
52
+ /** The normalized hash of an external message given as a base64 BOC; refuses anything else. */
53
+ export declare function tonExternalBocHash(boc: string): string;
54
+ //# sourceMappingURL=ton_transactions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ton_transactions.d.ts","sourceRoot":"","sources":["../../../ton/ton_transactions.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,oBAAoB,EAK1B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,OAAO,EAAE,KAAK,aAAa,EAAwF,MAAM,mBAAmB,CAAC;AAE7I;;;;GAIG;AACH,qBAAa,sBAAuB,SAAQ,mBAAmB;IAC7D,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;IAC5C,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;gBAE5B,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;CAOtH;AAED;;;;;GAKG;AACH,qBAAa,oBAAqB,SAAQ,yBAAyB;;IACjE,MAAM,CAAC,QAAQ,CAAC,SAAS,0BAA0B;IAGnD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAErB,WAAW;IACX,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAEhB,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE;IAWlD,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,uDAAuD;IACvD,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,MAAM,IAAI,QAAQ;IAIlB,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,GAAG,oBAAoB;CASlE;AAID,yFAAyF;AACzF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAQ5H;AAED,+FAA+F;AAC/F,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGtD"}
@@ -0,0 +1,100 @@
1
+ import { Cell, loadMessage } from '@ton/core';
2
+ import { ChainError, ChainErrorKinds } from "../errors.js";
3
+ import { NetworkType } from "../network_type.js";
4
+ import { AbstractSignedTransaction } from "../signed_transaction.js";
5
+ import { JSON_TRANSACTION_CHAIN_ID_KEY, jsonPayloadItem, jsonTransactionEnvelope, parseJsonTransactionEnvelope, registerJsonTransactionType, } from "../transaction_json.js";
6
+ import { UnsignedTransaction } from "../unsigned_transaction.js";
7
+ import { tonRawAddress } from "./ton_address.js";
8
+ import { tonNormalizedExternalHash, tonOutActions, tonW5RequestFields, tonWalletRequestFields } from "./ton_messages.js";
9
+ /**
10
+ * A request a wallet will send itself: its messages, and optionally how long
11
+ * the signed request stays valid. The seqno and whether to deploy are read at
12
+ * signing time (`TonWallet.signTransaction`).
13
+ */
14
+ export class TonUnsignedTransaction extends UnsignedTransaction {
15
+ walletAddress;
16
+ messages;
17
+ validUntil;
18
+ constructor(init) {
19
+ super(init.chainId, NetworkType.TON);
20
+ tonOutActions(init.messages);
21
+ this.walletAddress = tonRawAddress(init.walletAddress);
22
+ this.messages = init.messages;
23
+ this.validUntil = init.validUntil;
24
+ }
25
+ }
26
+ /**
27
+ * A signed external wallet request (W5, v4r2 or v3r2): its BOC, its normalized hash (the
28
+ * transaction id), and — read from the signed body itself, so they survive a
29
+ * JSON round trip — the wallet, seqno and `validUntil` it commits to, which
30
+ * `TonChain.getRequestState` takes.
31
+ */
32
+ export class TonSignedTransaction extends AbstractSignedTransaction {
33
+ static JSON_TYPE = 'TonSignedTransaction';
34
+ #chainId;
35
+ boc;
36
+ #hash;
37
+ /** Raw. */
38
+ walletAddress;
39
+ seqno;
40
+ validUntil;
41
+ constructor(init) {
42
+ super();
43
+ const request = tonExternalRequestOf(init.boc);
44
+ this.#chainId = init.chainId;
45
+ this.boc = init.boc;
46
+ this.#hash = request.hash;
47
+ this.walletAddress = request.walletAddress;
48
+ this.seqno = request.seqno;
49
+ this.validUntil = request.validUntil;
50
+ }
51
+ get chainId() {
52
+ return this.#chainId;
53
+ }
54
+ /** Normalized external-message hash, lowercase hex. */
55
+ get txHash() {
56
+ return this.#hash;
57
+ }
58
+ toJson() {
59
+ return jsonTransactionEnvelope(TonSignedTransaction.JSON_TYPE, this.#chainId, { boc: this.boc });
60
+ }
61
+ static fromJson(data) {
62
+ const payload = parseJsonTransactionEnvelope(data, TonSignedTransaction.JSON_TYPE);
63
+ const chainId = jsonPayloadItem(payload, JSON_TRANSACTION_CHAIN_ID_KEY);
64
+ const boc = jsonPayloadItem(payload, 'boc');
65
+ if (!Number.isSafeInteger(chainId) || typeof boc !== 'string') {
66
+ throw new ChainError(ChainErrorKinds.InvalidArgument, 'A TonSignedTransaction payload needs an integer chain_id and a boc string');
67
+ }
68
+ return new TonSignedTransaction({ chainId: chainId, boc });
69
+ }
70
+ }
71
+ registerJsonTransactionType(TonSignedTransaction);
72
+ /** A signed external wallet request (W5, v4r2 or v3r2) read back from its base64 BOC. */
73
+ export function tonExternalRequestOf(boc) {
74
+ const message = externalMessageOf(boc);
75
+ const fields = tonWalletRequestFields(message.body);
76
+ if (fields.layout === 'w5' && tonW5RequestFields(message.body).authType !== 'external') {
77
+ throw new ChainError(ChainErrorKinds.TransactionDecodeFailed, 'Not a signed W5 external request: it is an internal one');
78
+ }
79
+ const walletAddress = message.info.dest.toRawString();
80
+ return { walletAddress, hash: tonNormalizedExternalHash(walletAddress, message.body), seqno: fields.seqno, validUntil: fields.validUntil };
81
+ }
82
+ /** The normalized hash of an external message given as a base64 BOC; refuses anything else. */
83
+ export function tonExternalBocHash(boc) {
84
+ const message = externalMessageOf(boc);
85
+ return tonNormalizedExternalHash(message.info.dest.toRawString(), message.body);
86
+ }
87
+ function externalMessageOf(boc) {
88
+ let message;
89
+ try {
90
+ message = loadMessage(Cell.fromBase64(boc).beginParse());
91
+ }
92
+ catch (err) {
93
+ throw new ChainError(ChainErrorKinds.TransactionDecodeFailed, 'Not a TON message BOC', undefined, err);
94
+ }
95
+ if (message.info.type !== 'external-in') {
96
+ throw new ChainError(ChainErrorKinds.InvalidArgument, `Expected an external-in message, got ${message.info.type}`);
97
+ }
98
+ return message;
99
+ }
100
+ //# sourceMappingURL=ton_transactions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ton_transactions.js","sourceRoot":"","sources":["../../../ton/ton_transactions.ts"],"names":[],"mappings":"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"}