@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,231 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TonTransactionStatus = void 0;
4
+ exports.summarizeTonTrace = summarizeTonTrace;
5
+ const transaction_status_ts_1 = require("../transaction_status.js");
6
+ const ton_asset_ts_1 = require("./ton_asset.js");
7
+ const ton_messages_ts_1 = require("./ton_messages.js");
8
+ const ton_provider_ts_1 = require("./ton_provider.js");
9
+ function summarizeTonTrace(chainId, trace) {
10
+ (0, ton_provider_ts_1.assertTraceConsistent)('the trace given', trace);
11
+ const native = new ton_asset_ts_1.TonAsset(chainId, 'TON', null, ton_asset_ts_1.TonAsset.NATIVE_DECIMALS);
12
+ const deltas = new Map();
13
+ const add = (account, delta) => {
14
+ deltas.set(account, (deltas.get(account) ?? 0n) + delta);
15
+ };
16
+ let fees = 0n;
17
+ const jettonCredits = [];
18
+ for (const tx of trace.transactions) {
19
+ fees += tx.totalFees;
20
+ let debit = tx.totalFees;
21
+ if (tx.inMsg !== null && tx.inMsg.source !== null)
22
+ add(tx.account, tx.inMsg.value);
23
+ for (const out of tx.outMsgs) {
24
+ if (out.destination === null)
25
+ continue;
26
+ fees += out.fwdFee;
27
+ debit += out.value + out.fwdFee;
28
+ }
29
+ add(tx.account, -debit);
30
+ // Accepted unless the jetton wallet's transaction aborted; a refund it then skipped does not undo the credit.
31
+ const credit = !tx.aborted && tx.inMsg !== null ? jettonCreditOf(tx, tx.inMsg) : null;
32
+ if (credit !== null)
33
+ jettonCredits.push(credit);
34
+ }
35
+ const balanceChanges = new Map();
36
+ for (const [account, delta] of deltas) {
37
+ balanceChanges.set(account, new Map([[(0, transaction_status_ts_1.assetHashOf)(native), { token: native, change: transaction_status_ts_1.AssetBalanceChange.fromMr(delta, ton_asset_ts_1.TonAsset.NATIVE_DECIMALS) }]]));
38
+ }
39
+ const { problem, deliveries } = judgeRequest(trace);
40
+ return {
41
+ success: problem === null,
42
+ problem,
43
+ deliveries,
44
+ fees,
45
+ failedTransactions: trace.transactions.filter((tx) => !tx.success),
46
+ bouncedMessages: trace.transactions.flatMap((tx) => (tx.inMsg !== null && tx.inMsg.bounced ? [tx.inMsg] : [])),
47
+ balanceChanges,
48
+ jettonCredits,
49
+ };
50
+ }
51
+ /**
52
+ * Judges the wallets that sent the request — the root, and any wallet it
53
+ * delivered a signed internal request to — on their own transactions and on
54
+ * the first hop of every message they sent.
55
+ */
56
+ function judgeRequest(trace) {
57
+ const root = trace.transactions[0];
58
+ if (root === undefined)
59
+ return { problem: { code: 'no_transaction', reason: 'the trace has no transaction' }, deliveries: [] };
60
+ const children = childrenByParent(trace.transactions);
61
+ const relayTargets = (children.get(root.hash) ?? []).filter((tx) => tx.inMsg?.opcode === ton_messages_ts_1.TON_W5_SIGNED_INTERNAL_OP);
62
+ const deliveries = [];
63
+ let problem = null;
64
+ const note = (found) => {
65
+ problem ??= found;
66
+ };
67
+ for (const wallet of [root, ...relayTargets]) {
68
+ if (!wallet.success) {
69
+ note(wallet.skippedActions > 0
70
+ ? { code: 'skipped_actions', reason: `${wallet.account} skipped ${wallet.skippedActions} message(s) it could not send` }
71
+ : { code: String(wallet.computeExitCode ?? wallet.actionResultCode ?? 'failed'), reason: `${wallet.account} failed in ${wallet.hash}` });
72
+ }
73
+ // A bounce the wallet sends back is not a message it was asked to send.
74
+ // Sorted by creation, the order the request listed them.
75
+ const sent = wallet.outMsgs
76
+ .filter((m) => m.destination !== null && !m.bounced)
77
+ .sort((a, b) => (a.createdLt === b.createdLt ? 0 : (a.createdLt ?? 0n) < (b.createdLt ?? 0n) ? -1 : 1));
78
+ if (wallet !== root && wallet.success && sent.length === 0) {
79
+ note({ code: 'request_not_executed', reason: `${wallet.account} did not execute the relayed request (bad signature or seqno)` });
80
+ }
81
+ const received = children.get(wallet.hash) ?? [];
82
+ for (const message of sent) {
83
+ const { receiver, outcome: firstHop } = deliveryOf(message, received, trace.complete);
84
+ // A jetton transfer moves the jettons one hop later, in the receiver's jetton wallet.
85
+ const jettonHop = firstHop === 'delivered' && message.opcode === ton_messages_ts_1.TON_JETTON_TRANSFER_OP && receiver !== null
86
+ ? jettonDeliveryOf(receiver, children.get(receiver.hash) ?? [], trace.complete)
87
+ : null;
88
+ const outcome = jettonHop?.outcome ?? firstHop;
89
+ deliveries.push({
90
+ from: wallet.account,
91
+ to: message.destination,
92
+ value: message.value,
93
+ outcome,
94
+ transaction: jettonHop?.receiver?.hash ?? receiver?.hash ?? null,
95
+ });
96
+ if (outcome === 'bounced' || outcome === 'undelivered' || outcome === 'failed') {
97
+ const code = outcome === 'failed' ? 'receiver_failed' : outcome;
98
+ note({
99
+ code: jettonHop === null ? code : `jetton_${code}`,
100
+ reason: `a ${jettonHop === null ? 'message' : 'jetton transfer'} from ${wallet.account} to ${message.destination} was ${outcome}`,
101
+ });
102
+ }
103
+ }
104
+ }
105
+ return { problem, deliveries };
106
+ }
107
+ /**
108
+ * Which received transaction took `message`, and whether it kept the value.
109
+ *
110
+ * Matched on (source, createdLt), which names one message. The providers
111
+ * refuse a trace whose receivers disagree with their senders, so a match is
112
+ * the message itself.
113
+ */
114
+ function deliveryOf(message, received, complete) {
115
+ const receiver = received.find((tx) => tx.inMsg !== null && tx.inMsg.source === message.source && tx.inMsg.createdLt === message.createdLt) ??
116
+ null;
117
+ if (receiver === null)
118
+ return { receiver, outcome: complete ? 'undelivered' : 'pending' };
119
+ // A receiver that did not abort kept the value, even if it skipped one of its
120
+ // own sends (e.g. an excess refund under "ignore errors"); so did one a
121
+ // non-bounceable message reached. An aborted receiver of a bounceable message
122
+ // sends it back only on a failed compute phase (no code yet included), a
123
+ // failed action with send mode +16, and when the value covers the bounce;
124
+ // the bounce is in the receiver's own transaction.
125
+ if (!message.bounce || !receiver.aborted)
126
+ return { receiver, outcome: 'delivered' };
127
+ const bouncedBack = receiver.outMsgs.some((m) => m.bounced && m.destination === message.source);
128
+ return { receiver, outcome: bouncedBack ? 'bounced' : 'failed' };
129
+ }
130
+ /** The `internal_transfer` the sender's jetton wallet sent on, judged where the jettons land. */
131
+ function jettonDeliveryOf(senderJettonWallet, received, complete) {
132
+ const transfer = senderJettonWallet.outMsgs.find((m) => m.opcode === ton_messages_ts_1.TON_JETTON_INTERNAL_TRANSFER_OP && !m.bounced);
133
+ if (transfer === undefined)
134
+ return { receiver: null, outcome: complete ? 'undelivered' : 'pending' };
135
+ return deliveryOf(transfer, received, complete);
136
+ }
137
+ function childrenByParent(transactions) {
138
+ const byParent = new Map();
139
+ for (const tx of transactions) {
140
+ if (tx.parent === null)
141
+ continue;
142
+ byParent.set(tx.parent, [...(byParent.get(tx.parent) ?? []), tx]);
143
+ }
144
+ return byParent;
145
+ }
146
+ function jettonCreditOf(tx, inMsg) {
147
+ if (inMsg.opcode !== ton_messages_ts_1.TON_JETTON_INTERNAL_TRANSFER_OP || inMsg.bounced || inMsg.body === null)
148
+ return null;
149
+ try {
150
+ const slice = inMsg.body.beginParse();
151
+ slice.skip(32 + 64);
152
+ const amount = slice.loadCoins();
153
+ const from = slice.loadMaybeAddress();
154
+ return {
155
+ jettonWallet: tx.account,
156
+ amount,
157
+ from: from === null ? null : from.toRawString(),
158
+ senderJettonWallet: inMsg.source,
159
+ transaction: tx.hash,
160
+ };
161
+ }
162
+ catch {
163
+ return null;
164
+ }
165
+ }
166
+ /**
167
+ * The status of an external message's whole trace.
168
+ *
169
+ * Final — `Success` or `Failed` — only once the trace is complete and every
170
+ * transaction in it is in a block a masterchain block references. TON's
171
+ * consensus is final at that point; `masterchainDepth` lets a caller ask for
172
+ * more anyway. `Failed` when the request did not do what it was signed for
173
+ * (see {@link TonTraceSummary.success}); a failed status still carries the
174
+ * summary, whose `deliveries` say which messages did arrive.
175
+ */
176
+ class TonTransactionStatus extends transaction_status_ts_1.TransactionStatus {
177
+ trace;
178
+ summary;
179
+ /** The highest masterchain block referencing the trace's transactions. */
180
+ masterchainSeqno;
181
+ /** Masterchain blocks since then. */
182
+ masterchainDepth;
183
+ constructor(init) {
184
+ super({
185
+ chainId: init.chainId,
186
+ status: init.status,
187
+ inclusionAt: init.inclusionAt,
188
+ error: init.error,
189
+ balanceChanges: init.balanceChanges,
190
+ });
191
+ this.trace = init.trace ?? null;
192
+ this.summary = init.summary ?? null;
193
+ this.masterchainSeqno = init.masterchainSeqno ?? null;
194
+ this.masterchainDepth = init.masterchainDepth ?? null;
195
+ }
196
+ get fees() {
197
+ return this.summary?.fees ?? null;
198
+ }
199
+ get jettonCredits() {
200
+ return this.summary?.jettonCredits ?? [];
201
+ }
202
+ static fromTrace(args) {
203
+ const { chainId, trace } = args;
204
+ const pending = () => new TonTransactionStatus({ chainId, status: transaction_status_ts_1.TransactionStatusTypes.Pending, trace });
205
+ if (trace === null || !trace.complete || trace.transactions.length === 0)
206
+ return pending();
207
+ const seqnos = trace.transactions.map((tx) => tx.mcSeqno);
208
+ if (seqnos.some((seqno) => seqno === null))
209
+ return pending();
210
+ const masterchainSeqno = Math.max(...seqnos);
211
+ const masterchainDepth = Math.max(args.masterchainTip - masterchainSeqno, 0);
212
+ if (masterchainDepth < (args.minMasterchainDepth ?? 0))
213
+ return pending();
214
+ const summary = summarizeTonTrace(chainId, trace);
215
+ const common = {
216
+ chainId,
217
+ inclusionAt: new Date(trace.transactions[0].utime * 1000),
218
+ trace,
219
+ summary,
220
+ masterchainSeqno,
221
+ masterchainDepth,
222
+ };
223
+ if (summary.success) {
224
+ return new TonTransactionStatus({ ...common, status: transaction_status_ts_1.TransactionStatusTypes.Success, balanceChanges: summary.balanceChanges });
225
+ }
226
+ const error = { ...summary.problem };
227
+ return new TonTransactionStatus({ ...common, status: transaction_status_ts_1.TransactionStatusTypes.Failed, error });
228
+ }
229
+ }
230
+ exports.TonTransactionStatus = TonTransactionStatus;
231
+ //# 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":";;;AA+FA,8CA0CC;AAtID,oEAQkC;AAClC,iDAA0C;AAC1C,uDAAuH;AACvH,uDAAyH;AAiFzH,SAAgB,iBAAiB,CAAC,OAAe,EAAE,KAAe;IAChE,IAAA,uCAAqB,EAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,uBAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,uBAAQ,CAAC,eAAe,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,MAAM,GAAG,GAAG,CAAC,OAAe,EAAE,KAAa,EAAQ,EAAE;QACnD,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC;IAC3D,CAAC,CAAC;IACF,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,MAAM,aAAa,GAAsB,EAAE,CAAC;IAC5C,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACpC,IAAI,IAAI,EAAE,CAAC,SAAS,CAAC;QACrB,IAAI,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC;QACzB,IAAI,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI;YAAE,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACnF,KAAK,MAAM,GAAG,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;YAC7B,IAAI,GAAG,CAAC,WAAW,KAAK,IAAI;gBAAE,SAAS;YACvC,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC;YACnB,KAAK,IAAI,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC;QAClC,CAAC;QACD,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QACxB,8GAA8G;QAC9G,MAAM,MAAM,GAAG,CAAC,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACtF,IAAI,MAAM,KAAK,IAAI;YAAE,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,cAAc,GAAyB,IAAI,GAAG,EAAE,CAAC;IACvD,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QACtC,cAAc,CAAC,GAAG,CAChB,OAAO,EACP,IAAI,GAAG,CAAC,CAAC,CAAC,IAAA,mCAAW,EAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,0CAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,uBAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CACxH,CAAC;IACJ,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACpD,OAAO;QACL,OAAO,EAAE,OAAO,KAAK,IAAI;QACzB,OAAO;QACP,UAAU;QACV,IAAI;QACJ,kBAAkB,EAAE,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC;QAClE,eAAe,EAAE,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9G,cAAc;QACd,aAAa;KACd,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CAAC,KAAe;IACnC,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,8BAA8B,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IAC/H,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACtD,MAAM,YAAY,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,2CAAyB,CAAC,CAAC;IAEpH,MAAM,UAAU,GAAyB,EAAE,CAAC;IAC5C,IAAI,OAAO,GAA6B,IAAI,CAAC;IAC7C,MAAM,IAAI,GAAG,CAAC,KAAwB,EAAQ,EAAE;QAC9C,OAAO,KAAK,KAAK,CAAC;IACpB,CAAC,CAAC;IACF,KAAK,MAAM,MAAM,IAAI,CAAC,IAAI,EAAE,GAAG,YAAY,CAAC,EAAE,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,CACF,MAAM,CAAC,cAAc,GAAG,CAAC;gBACvB,CAAC,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,YAAY,MAAM,CAAC,cAAc,+BAA+B,EAAE;gBACxH,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC,gBAAgB,IAAI,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,cAAc,MAAM,CAAC,IAAI,EAAE,EAAE,CAC1I,CAAC;QACJ,CAAC;QACD,wEAAwE;QACxE,yDAAyD;QACzD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO;aACxB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;aACnD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1G,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3D,IAAI,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,+DAA+D,EAAE,CAAC,CAAC;QACnI,CAAC;QACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACjD,KAAK,MAAM,OAAO,IAAI,IAAI,EAAE,CAAC;YAC3B,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YACtF,sFAAsF;YACtF,MAAM,SAAS,GACb,QAAQ,KAAK,WAAW,IAAI,OAAO,CAAC,MAAM,KAAK,wCAAsB,IAAI,QAAQ,KAAK,IAAI;gBACxF,CAAC,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,QAAQ,CAAC;gBAC/E,CAAC,CAAC,IAAI,CAAC;YACX,MAAM,OAAO,GAAG,SAAS,EAAE,OAAO,IAAI,QAAQ,CAAC;YAC/C,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,MAAM,CAAC,OAAO;gBACpB,EAAE,EAAE,OAAO,CAAC,WAAqB;gBACjC,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,OAAO;gBACP,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,IAAI,QAAQ,EAAE,IAAI,IAAI,IAAI;aACjE,CAAC,CAAC;YACH,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,aAAa,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAC/E,MAAM,IAAI,GAAG,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC;gBAChE,IAAI,CAAC;oBACH,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE;oBAClD,MAAM,EAAE,KAAK,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,SAAS,MAAM,CAAC,OAAO,OAAO,OAAO,CAAC,WAAW,QAAQ,OAAO,EAAE;iBAClI,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;AACjC,CAAC;AAED;;;;;;GAMG;AACH,SAAS,UAAU,CACjB,OAAwB,EACxB,QAAwC,EACxC,QAAiB;IAEjB,MAAM,QAAQ,GACZ,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,CAAC;QAC1H,IAAI,CAAC;IACP,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IAC1F,8EAA8E;IAC9E,wEAAwE;IACxE,8EAA8E;IAC9E,yEAAyE;IACzE,0EAA0E;IAC1E,mDAAmD;IACnD,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO;QAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IACpF,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAChG,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;AACnE,CAAC;AAED,iGAAiG;AACjG,SAAS,gBAAgB,CACvB,kBAAuC,EACvC,QAAwC,EACxC,QAAiB;IAEjB,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,iDAA+B,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACpH,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IACrG,OAAO,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,gBAAgB,CAAC,YAA4C;IACpE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAiC,CAAC;IAC1D,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;QAC9B,IAAI,EAAE,CAAC,MAAM,KAAK,IAAI;YAAE,SAAS;QACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,cAAc,CAAC,EAAuB,EAAE,KAAsB;IACrE,IAAI,KAAK,CAAC,MAAM,KAAK,iDAA+B,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC1G,IAAI,CAAC;QACH,MAAM,KAAK,GAAI,KAAK,CAAC,IAAa,CAAC,UAAU,EAAE,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QACpB,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,KAAK,CAAC,gBAAgB,EAAE,CAAC;QACtC,OAAO;YACL,YAAY,EAAE,EAAE,CAAC,OAAO;YACxB,MAAM;YACN,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE;YAC/C,kBAAkB,EAAE,KAAK,CAAC,MAAM;YAChC,WAAW,EAAE,EAAE,CAAC,IAAI;SACrB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAcD;;;;;;;;;GASG;AACH,MAAa,oBAAqB,SAAQ,yCAAiB;IAChD,KAAK,CAAkB;IACvB,OAAO,CAAyB;IACzC,0EAA0E;IACjE,gBAAgB,CAAgB;IACzC,qCAAqC;IAC5B,gBAAgB,CAAgB;IAEzC,YAAY,IAA8B;QACxC,KAAK,CAAC;YACJ,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,cAAc,EAAE,IAAI,CAAC,cAAc;SACpC,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC;QAChC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;QACpC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC;QACtD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC;IACxD,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI,CAAC;IACpC,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,OAAO,EAAE,aAAa,IAAI,EAAE,CAAC;IAC3C,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,IAKhB;QACC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QAChC,MAAM,OAAO,GAAG,GAAyB,EAAE,CACzC,IAAI,oBAAoB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,8CAAsB,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACvF,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,OAAO,EAAE,CAAC;QAC3F,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QAC1D,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC;YAAE,OAAO,OAAO,EAAE,CAAC;QAC7D,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,GAAI,MAAmB,CAAC,CAAC;QAC3D,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,GAAG,gBAAgB,EAAE,CAAC,CAAC,CAAC;QAC7E,IAAI,gBAAgB,GAAG,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,CAAC;YAAE,OAAO,OAAO,EAAE,CAAC;QAEzE,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG;YACb,OAAO;YACP,WAAW,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC;YACzD,KAAK;YACL,OAAO;YACP,gBAAgB;YAChB,gBAAgB;SACjB,CAAC;QACF,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,IAAI,oBAAoB,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,8CAAsB,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;QACjI,CAAC;QACD,MAAM,KAAK,GAAyB,EAAE,GAAI,OAAO,CAAC,OAA6B,EAAE,CAAC;QAClF,OAAO,IAAI,oBAAoB,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,8CAAsB,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/F,CAAC;CACF;AA7DD,oDA6DC"}
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TonSignedTransaction = exports.TonUnsignedTransaction = void 0;
4
+ exports.tonExternalRequestOf = tonExternalRequestOf;
5
+ exports.tonExternalBocHash = tonExternalBocHash;
6
+ const core_1 = require("@ton/core");
7
+ const errors_ts_1 = require("../errors.js");
8
+ const network_type_ts_1 = require("../network_type.js");
9
+ const signed_transaction_ts_1 = require("../signed_transaction.js");
10
+ const transaction_json_ts_1 = require("../transaction_json.js");
11
+ const unsigned_transaction_ts_1 = require("../unsigned_transaction.js");
12
+ const ton_address_ts_1 = require("./ton_address.js");
13
+ const ton_messages_ts_1 = require("./ton_messages.js");
14
+ /**
15
+ * A request a wallet will send itself: its messages, and optionally how long
16
+ * the signed request stays valid. The seqno and whether to deploy are read at
17
+ * signing time (`TonWallet.signTransaction`).
18
+ */
19
+ class TonUnsignedTransaction extends unsigned_transaction_ts_1.UnsignedTransaction {
20
+ walletAddress;
21
+ messages;
22
+ validUntil;
23
+ constructor(init) {
24
+ super(init.chainId, network_type_ts_1.NetworkType.TON);
25
+ (0, ton_messages_ts_1.tonOutActions)(init.messages);
26
+ this.walletAddress = (0, ton_address_ts_1.tonRawAddress)(init.walletAddress);
27
+ this.messages = init.messages;
28
+ this.validUntil = init.validUntil;
29
+ }
30
+ }
31
+ exports.TonUnsignedTransaction = TonUnsignedTransaction;
32
+ /**
33
+ * A signed external wallet request (W5, v4r2 or v3r2): its BOC, its normalized hash (the
34
+ * transaction id), and — read from the signed body itself, so they survive a
35
+ * JSON round trip — the wallet, seqno and `validUntil` it commits to, which
36
+ * `TonChain.getRequestState` takes.
37
+ */
38
+ class TonSignedTransaction extends signed_transaction_ts_1.AbstractSignedTransaction {
39
+ static JSON_TYPE = 'TonSignedTransaction';
40
+ #chainId;
41
+ boc;
42
+ #hash;
43
+ /** Raw. */
44
+ walletAddress;
45
+ seqno;
46
+ validUntil;
47
+ constructor(init) {
48
+ super();
49
+ const request = tonExternalRequestOf(init.boc);
50
+ this.#chainId = init.chainId;
51
+ this.boc = init.boc;
52
+ this.#hash = request.hash;
53
+ this.walletAddress = request.walletAddress;
54
+ this.seqno = request.seqno;
55
+ this.validUntil = request.validUntil;
56
+ }
57
+ get chainId() {
58
+ return this.#chainId;
59
+ }
60
+ /** Normalized external-message hash, lowercase hex. */
61
+ get txHash() {
62
+ return this.#hash;
63
+ }
64
+ toJson() {
65
+ return (0, transaction_json_ts_1.jsonTransactionEnvelope)(TonSignedTransaction.JSON_TYPE, this.#chainId, { boc: this.boc });
66
+ }
67
+ static fromJson(data) {
68
+ const payload = (0, transaction_json_ts_1.parseJsonTransactionEnvelope)(data, TonSignedTransaction.JSON_TYPE);
69
+ const chainId = (0, transaction_json_ts_1.jsonPayloadItem)(payload, transaction_json_ts_1.JSON_TRANSACTION_CHAIN_ID_KEY);
70
+ const boc = (0, transaction_json_ts_1.jsonPayloadItem)(payload, 'boc');
71
+ if (!Number.isSafeInteger(chainId) || typeof boc !== 'string') {
72
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.InvalidArgument, 'A TonSignedTransaction payload needs an integer chain_id and a boc string');
73
+ }
74
+ return new TonSignedTransaction({ chainId: chainId, boc });
75
+ }
76
+ }
77
+ exports.TonSignedTransaction = TonSignedTransaction;
78
+ (0, transaction_json_ts_1.registerJsonTransactionType)(TonSignedTransaction);
79
+ /** A signed external wallet request (W5, v4r2 or v3r2) read back from its base64 BOC. */
80
+ function tonExternalRequestOf(boc) {
81
+ const message = externalMessageOf(boc);
82
+ const fields = (0, ton_messages_ts_1.tonWalletRequestFields)(message.body);
83
+ if (fields.layout === 'w5' && (0, ton_messages_ts_1.tonW5RequestFields)(message.body).authType !== 'external') {
84
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.TransactionDecodeFailed, 'Not a signed W5 external request: it is an internal one');
85
+ }
86
+ const walletAddress = message.info.dest.toRawString();
87
+ return { walletAddress, hash: (0, ton_messages_ts_1.tonNormalizedExternalHash)(walletAddress, message.body), seqno: fields.seqno, validUntil: fields.validUntil };
88
+ }
89
+ /** The normalized hash of an external message given as a base64 BOC; refuses anything else. */
90
+ function tonExternalBocHash(boc) {
91
+ const message = externalMessageOf(boc);
92
+ return (0, ton_messages_ts_1.tonNormalizedExternalHash)(message.info.dest.toRawString(), message.body);
93
+ }
94
+ function externalMessageOf(boc) {
95
+ let message;
96
+ try {
97
+ message = (0, core_1.loadMessage)(core_1.Cell.fromBase64(boc).beginParse());
98
+ }
99
+ catch (err) {
100
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.TransactionDecodeFailed, 'Not a TON message BOC', undefined, err);
101
+ }
102
+ if (message.info.type !== 'external-in') {
103
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.InvalidArgument, `Expected an external-in message, got ${message.info.type}`);
104
+ }
105
+ return message;
106
+ }
107
+ //# 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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"}
@@ -0,0 +1,285 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TonWallet = exports.TON_PYTHON_MARKER_PATH = exports.TON_LEGACY_MAX_MESSAGES = exports.TON_LEGACY_DEFAULT_WALLET_ID = exports.TON_WALLET_VERSIONS = exports.TON_DEFAULT_REQUEST_TTL_SECONDS = void 0;
4
+ exports.deriveSlip10Ed25519Seed = deriveSlip10Ed25519Seed;
5
+ exports.deriveTonEd25519Seed = deriveTonEd25519Seed;
6
+ exports.deriveTonNativeSeed = deriveTonNativeSeed;
7
+ const node_crypto_1 = require("node:crypto");
8
+ const core_1 = require("@ton/core");
9
+ const crypto_1 = require("@ton/crypto");
10
+ const ton_1 = require("@ton/ton");
11
+ const bip39_ts_1 = require("../bip39.js");
12
+ const chain_type_ts_1 = require("../chain_type.js");
13
+ const errors_ts_1 = require("../errors.js");
14
+ const wallet_base_ts_1 = require("../wallet.base.js");
15
+ const ton_address_ts_1 = require("./ton_address.js");
16
+ const ton_chain_ts_1 = require("./ton_chain.js");
17
+ const ton_messages_ts_1 = require("./ton_messages.js");
18
+ const ton_transactions_ts_1 = require("./ton_transactions.js");
19
+ const TON_COIN_TYPE = 607;
20
+ const TON_DERIVATION_PATH_REGEX = /^m\/44'\/607'\/(\d+)'$/;
21
+ const SLIP10_ED25519_SEED_MODIFIER = 'ed25519 seed';
22
+ const FIRST_HARDENED_INDEX = 0x80000000;
23
+ /** Seconds a request stays valid unless the caller says otherwise. */
24
+ exports.TON_DEFAULT_REQUEST_TTL_SECONDS = 60;
25
+ /** SLIP-0010 ed25519 derivation along hardened `path` segments (e.g. `[44, 607, 0]`) from a BIP-39 seed. */
26
+ function deriveSlip10Ed25519Seed(bip39Seed, path) {
27
+ let digest = (0, node_crypto_1.createHmac)('sha512', SLIP10_ED25519_SEED_MODIFIER).update(bip39Seed).digest();
28
+ let il = digest.subarray(0, 32);
29
+ let ir = digest.subarray(32);
30
+ for (const segment of path) {
31
+ if (!Number.isInteger(segment) || segment < 0 || segment >= FIRST_HARDENED_INDEX) {
32
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.InvalidArgument, `Invalid SLIP-0010 path segment ${segment}`);
33
+ }
34
+ const indexBytes = Buffer.alloc(4);
35
+ indexBytes.writeUInt32BE(FIRST_HARDENED_INDEX + segment);
36
+ digest = (0, node_crypto_1.createHmac)('sha512', ir).update(Buffer.concat([Buffer.alloc(1), il, indexBytes])).digest();
37
+ il = digest.subarray(0, 32);
38
+ ir = digest.subarray(32);
39
+ }
40
+ return Buffer.from(il);
41
+ }
42
+ /** The ed25519 seed of `m/44'/607'/{index}'`. */
43
+ function deriveTonEd25519Seed(bip39Seed, index) {
44
+ return deriveSlip10Ed25519Seed(bip39Seed, [44, TON_COIN_TYPE, index]);
45
+ }
46
+ exports.TON_WALLET_VERSIONS = ['v3r2', 'v4r2', 'v5r1'];
47
+ /** The v3r2 / v4r2 wallet id the Python SDK uses on both workchains. */
48
+ exports.TON_LEGACY_DEFAULT_WALLET_ID = 698983191;
49
+ /** v3r2 / v4r2 send at most four messages per request. */
50
+ exports.TON_LEGACY_MAX_MESSAGES = 4;
51
+ /** The path the Python SDK accepts as a marker for TON's own scheme; it derives nothing. */
52
+ exports.TON_PYTHON_MARKER_PATH = "m/44'/607'/0'/0/0";
53
+ const TON_NATIVE_SEED_SALT = 'TON default seed';
54
+ const TON_NATIVE_PBKDF2_ITERATIONS = 100_000;
55
+ /**
56
+ * The ed25519 seed TON's own mnemonic scheme gives (what TON wallets,
57
+ * `@ton/crypto`'s `mnemonicToPrivateKey` and the Python SDK compute):
58
+ * HMAC-SHA512 of the words keyed by the phrase, then PBKDF2-SHA512 with
59
+ * "TON default seed", 100,000 rounds; the first 32 bytes. The words are
60
+ * trimmed and lowercased, as the Python SDK does; they are not validated.
61
+ */
62
+ function deriveTonNativeSeed(mnemonicStr) {
63
+ const words = mnemonicStr.trim().toLowerCase().split(/\s+/).filter((word) => word.length > 0);
64
+ if (words.length === 0)
65
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.InvalidArgument, 'The mnemonic is empty');
66
+ const entropy = (0, node_crypto_1.createHmac)('sha512', words.join(' ')).update('').digest();
67
+ return (0, node_crypto_1.pbkdf2Sync)(entropy, TON_NATIVE_SEED_SALT, TON_NATIVE_PBKDF2_ITERATIONS, 64, 'sha512').subarray(0, 32);
68
+ }
69
+ /**
70
+ * A wallet v5r1 (W5) account, its key derived from a BIP-39 mnemonic with
71
+ * SLIP-0010 ed25519 at the hardened path `m/44'/607'/{index}'`, on workchain 0
72
+ * with the mainnet client wallet id.
73
+ *
74
+ * It signs two kinds of request: an external one it sends itself (paying its
75
+ * own fees), and an internal one a relayer delivers and pays for
76
+ * (`tonRelayMessage`).
77
+ */
78
+ class TonWallet extends wallet_base_ts_1.AbstractBip32StyleSingleAccountWallet {
79
+ publicKey;
80
+ /** The wallet contract: W5 (v5r1, the default), or v4r2 / v3r2 as the Python SDK builds them. */
81
+ version;
82
+ /** 0 (the basechain, the default) or -1 (the masterchain, where gas and storage cost far more). */
83
+ workchain;
84
+ contract;
85
+ #secretKey;
86
+ _address;
87
+ constructor(ed25519Seed, opts = {}) {
88
+ super();
89
+ if (ed25519Seed.length !== 32) {
90
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.InvalidArgument, `A TON ed25519 seed is 32 bytes, got ${ed25519Seed.length}`);
91
+ }
92
+ const version = opts.version ?? 'v5r1';
93
+ if (!exports.TON_WALLET_VERSIONS.includes(version)) {
94
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.InvalidArgument, `TON wallet version must be one of ${exports.TON_WALLET_VERSIONS.join(', ')}, got ${String(version)}`);
95
+ }
96
+ const workchain = opts.workchain ?? 0;
97
+ if (workchain !== 0 && workchain !== -1) {
98
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.InvalidArgument, `A TON wallet lives on workchain 0 or -1, got ${String(workchain)}`);
99
+ }
100
+ const keyPair = (0, crypto_1.keyPairFromSeed)(Buffer.from(ed25519Seed));
101
+ this.publicKey = keyPair.publicKey;
102
+ this.#secretKey = keyPair.secretKey;
103
+ this.version = version;
104
+ this.workchain = workchain;
105
+ // The wallet ids the Python SDK (ton_core) uses on either workchain: W5's
106
+ // context names workchain 0 (as @ton/ton's default does), and v3r2 /
107
+ // v4r2's is 698983191 whatever the wallet's workchain — where @ton/ton
108
+ // would add the workchain, giving another address on -1.
109
+ const publicKey = keyPair.publicKey;
110
+ this.contract =
111
+ version === 'v5r1'
112
+ ? ton_1.WalletContractV5R1.create({ workchain, publicKey })
113
+ : version === 'v4r2'
114
+ ? ton_1.WalletContractV4.create({ workchain, publicKey, walletId: exports.TON_LEGACY_DEFAULT_WALLET_ID })
115
+ : ton_1.WalletContractV3R2.create({ workchain, publicKey, walletId: exports.TON_LEGACY_DEFAULT_WALLET_ID });
116
+ this._address = this.contract.address.toRawString();
117
+ }
118
+ [Symbol.for('nodejs.util.inspect.custom')]() {
119
+ return `TonWallet { address: '${this._address}' }`;
120
+ }
121
+ static chainType() {
122
+ return chain_type_ts_1.ChainType.TON;
123
+ }
124
+ static walletFamily() {
125
+ return chain_type_ts_1.WalletFamily.TON;
126
+ }
127
+ chainType() {
128
+ return TonWallet.chainType();
129
+ }
130
+ walletFamily() {
131
+ return TonWallet.walletFamily();
132
+ }
133
+ /**
134
+ * - **No `derivationPath`** (or Python's marker `m/44'/607'/0'/0/0`): TON's
135
+ * own mnemonic scheme, as TON wallets and the Python SDK derive it — one
136
+ * key per mnemonic, so a wallet's own words give its W5 account. A
137
+ * passphrase is refused: Python ignores it, so honouring it would give a
138
+ * key Python does not.
139
+ * - **A `derivationPath`** (`derivationPath({ account })`): BIP-39 and
140
+ * SLIP-0010 at that path — many accounts from one mnemonic. Note that
141
+ * `m/44'/607'/0'` is account 0 of this scheme, not Python's key.
142
+ */
143
+ static fromMnemonic(mnemonicStr, opts = {}) {
144
+ if (opts.derivationPath === undefined || opts.derivationPath === exports.TON_PYTHON_MARKER_PATH) {
145
+ if (opts.passphrase !== undefined && opts.passphrase !== '') {
146
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.InvalidArgument, "TON's own mnemonic scheme takes no passphrase here (the Python SDK ignores it); pass a derivationPath to use one");
147
+ }
148
+ return new TonWallet(deriveTonNativeSeed(mnemonicStr), { version: opts.version, workchain: opts.workchain });
149
+ }
150
+ const index = TonWallet.indexFromDerivationPath(opts.derivationPath);
151
+ return new TonWallet(deriveTonEd25519Seed((0, bip39_ts_1.mnemonicToSeedBip39)(mnemonicStr, opts.passphrase ?? ''), index), { version: opts.version, workchain: opts.workchain });
152
+ }
153
+ static derivationPath(args = {}) {
154
+ return `m/44'/${TON_COIN_TYPE}'/${args.account ?? 0}'`;
155
+ }
156
+ /** Canonical raw address, `0:<hex>`. */
157
+ get address() {
158
+ return this._address;
159
+ }
160
+ addressUserFriendly(opts = {}) {
161
+ return new ton_address_ts_1.TonAddress(this._address).toUserFriendly(opts);
162
+ }
163
+ /** The code and data that deploy this wallet; attach while it is not deployed. */
164
+ get stateInit() {
165
+ return { code: this.contract.init.code, data: this.contract.init.data };
166
+ }
167
+ /**
168
+ * A request this wallet sends itself, as an external message. Pass `deploy`
169
+ * while the wallet is not deployed, so the message carries its StateInit.
170
+ *
171
+ * Every version sends external requests with "ignore errors" (+2) on every
172
+ * message (W5 forces it; v3r2 / v4r2 get it here), so a message that cannot
173
+ * be sent is skipped rather than failing the others — a v3r2 / v4r2
174
+ * request whose action phase failed would keep its seqno and could land
175
+ * again. v3r2 / v4r2 carry at most 4 messages.
176
+ */
177
+ createExternalRequest(args) {
178
+ const validUntil = args.validUntil ?? defaultValidUntil();
179
+ const body = this.contract instanceof ton_1.WalletContractV5R1
180
+ ? this.contract.createRequest({
181
+ seqno: args.seqno,
182
+ timeout: validUntil,
183
+ secretKey: this.#secretKey,
184
+ authType: 'external',
185
+ actions: (0, ton_messages_ts_1.tonOutActions)(args.messages),
186
+ })
187
+ : this.legacyExternalBody(args.seqno, validUntil, args.messages);
188
+ const message = (0, core_1.external)({ to: this.contract.address, init: args.deploy === true ? this.stateInit : undefined, body });
189
+ return {
190
+ boc: (0, core_1.beginCell)().store((0, core_1.storeMessage)(message)).endCell().toBoc().toString('base64'),
191
+ hash: (0, ton_messages_ts_1.tonNormalizedExternalHash)(this._address, body),
192
+ seqno: args.seqno,
193
+ validUntil,
194
+ };
195
+ }
196
+ /**
197
+ * A signed internal request (op `0x73696e74`) for a relayer to deliver with
198
+ * `tonRelayMessage` — the gasless path, where another account pays. W5
199
+ * (v5r1) only: v3r2 / v4r2 wallets accept requests only as external
200
+ * messages they pay for themselves. Send modes are kept as given, so
201
+ * without "ignore errors" the request's messages leave all together or not
202
+ * at all.
203
+ */
204
+ createInternalRequest(args) {
205
+ if (!(this.contract instanceof ton_1.WalletContractV5R1)) {
206
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.FeatureNotSupported, `Relayed (gasless) requests need a W5 (v5r1) wallet; this one is ${this.version}`);
207
+ }
208
+ const validUntil = args.validUntil ?? defaultValidUntil();
209
+ const body = this.contract.createRequest({
210
+ seqno: args.seqno,
211
+ timeout: validUntil,
212
+ secretKey: this.#secretKey,
213
+ authType: 'internal',
214
+ actions: (0, ton_messages_ts_1.tonOutActions)(args.messages),
215
+ });
216
+ return { body, seqno: args.seqno, validUntil };
217
+ }
218
+ /**
219
+ * A v3r2 / v4r2 signed body: the signature, then wallet id, valid_until,
220
+ * seqno, (v4r2: op 0, "send messages"), and each message with its own send
221
+ * mode (+2) — what `@ton/ton`'s transfers build, with per-message modes.
222
+ */
223
+ legacyExternalBody(seqno, validUntil, messages) {
224
+ if (messages.length > exports.TON_LEGACY_MAX_MESSAGES) {
225
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.InvalidArgument, `A ${this.version} request carries at most ${exports.TON_LEGACY_MAX_MESSAGES} messages, got ${messages.length}`);
226
+ }
227
+ const signing = (0, core_1.beginCell)()
228
+ .storeUint(this.contract.walletId, 32)
229
+ .storeUint(validUntil, 32)
230
+ .storeUint(seqno, 32);
231
+ if (this.version === 'v4r2')
232
+ signing.storeUint(0, 8);
233
+ for (const action of (0, ton_messages_ts_1.tonOutActions)(messages)) {
234
+ signing.storeUint(action.mode | core_1.SendMode.IGNORE_ERRORS, 8).storeRef((0, core_1.beginCell)().store((0, core_1.storeMessageRelaxed)(action.outMsg)).endCell());
235
+ }
236
+ const signature = (0, crypto_1.sign)(signing.endCell().hash(), this.#secretKey);
237
+ return (0, core_1.beginCell)().storeBuffer(signature).storeBuilder(signing).endCell();
238
+ }
239
+ /** Signs `transaction` as an external request, reading the seqno and deployment from `chain`. */
240
+ async signTransaction(transaction, chain) {
241
+ if (!(transaction instanceof ton_transactions_ts_1.TonUnsignedTransaction)) {
242
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.InvalidArgument, `Expected a TonUnsignedTransaction, got ${transaction.constructor.name}`);
243
+ }
244
+ if (new ton_address_ts_1.TonAddress(transaction.walletAddress).canonical() !== this._address) {
245
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.InvalidArgument, `Transaction is for ${transaction.walletAddress}, not this wallet ${this._address}`);
246
+ }
247
+ const tonChain = assertTonChain(chain);
248
+ if (tonChain.chainId !== transaction.chainId) {
249
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.InvalidArgument, `Transaction for chain ${transaction.chainId} cannot be signed on ${tonChain.chainId}`);
250
+ }
251
+ const seqno = await tonChain.getSeqno(this._address);
252
+ // At seqno 0 the wallet may have no code yet; a StateInit sent to a
253
+ // deployed wallet is ignored.
254
+ const request = this.createExternalRequest({ seqno, messages: transaction.messages, validUntil: transaction.validUntil, deploy: seqno === 0 });
255
+ return new ton_transactions_ts_1.TonSignedTransaction({ chainId: transaction.chainId, boc: request.boc });
256
+ }
257
+ /** An ed25519 signature over {@link tonMessageHash}, hex; never over the message's bytes, which could pass for a request hash. */
258
+ signMessage(message) {
259
+ return new ton_messages_ts_1.TonSignedMessage((0, crypto_1.sign)((0, ton_messages_ts_1.tonMessageHash)(message), this.#secretKey).toString('hex'));
260
+ }
261
+ verifySignature(message, signedMessage) {
262
+ return ton_chain_ts_1.TonChain.verifySignature(this.publicKey, message, signedMessage);
263
+ }
264
+ async handleTransactionPrerequisite(prerequisite) {
265
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.FeatureNotSupported, `TonWallet has no transaction prerequisites (got ${prerequisite?.constructor?.name ?? typeof prerequisite})`);
266
+ }
267
+ static indexFromDerivationPath(derivationPath) {
268
+ const match = TON_DERIVATION_PATH_REGEX.exec(derivationPath);
269
+ if (match === null) {
270
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.InvalidArgument, `Invalid TON derivation path ${derivationPath}; expected m/44'/607'/<account>' (hardened, SLIP-0010)`);
271
+ }
272
+ return Number(match[1]);
273
+ }
274
+ }
275
+ exports.TonWallet = TonWallet;
276
+ function assertTonChain(chain) {
277
+ if (!(chain instanceof ton_chain_ts_1.TonChain)) {
278
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.InvalidArgument, `Expected a TonChain, got ${chain.constructor.name}`);
279
+ }
280
+ return chain;
281
+ }
282
+ function defaultValidUntil() {
283
+ return Math.floor(Date.now() / 1000) + exports.TON_DEFAULT_REQUEST_TTL_SECONDS;
284
+ }
285
+ //# sourceMappingURL=ton_wallet.js.map