wan-ton-sdk 0.0.7 → 0.0.9

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 (247) hide show
  1. package/dist/Bridge.compile.d.ts +2 -0
  2. package/dist/Bridge.compile.js +9 -0
  3. package/dist/Bridge.d.ts +208 -0
  4. package/dist/Bridge.js +468 -0
  5. package/dist/Fake.compile.d.ts +2 -0
  6. package/dist/Fake.compile.js +9 -0
  7. package/dist/GroupApprove.compile.d.ts +2 -0
  8. package/dist/GroupApprove.compile.js +7 -0
  9. package/dist/GroupApprove.d.ts +124 -0
  10. package/dist/GroupApprove.js +181 -0
  11. package/dist/JettonMinter.compile.d.ts +2 -0
  12. package/dist/JettonMinter.compile.js +6 -0
  13. package/dist/JettonMinter.d.ts +45 -0
  14. package/dist/JettonMinter.js +124 -0
  15. package/dist/JettonWallet.compile.d.ts +2 -0
  16. package/dist/JettonWallet.compile.js +6 -0
  17. package/dist/JettonWallet.d.ts +26 -0
  18. package/dist/JettonWallet.js +103 -0
  19. package/dist/Signature.compile.d.ts +2 -0
  20. package/dist/Signature.compile.js +7 -0
  21. package/dist/Signature.d.ts +44 -0
  22. package/dist/Signature.js +106 -0
  23. package/dist/address.compile.d.ts +2 -0
  24. package/dist/address.compile.js +9 -0
  25. package/dist/client/client-interface.d.ts +35 -0
  26. package/dist/client/client-interface.js +9 -0
  27. package/dist/client/client.d.ts +22 -0
  28. package/dist/client/client.js +86 -0
  29. package/dist/client/tonapi-client.d.ts +4630 -0
  30. package/dist/client/tonapi-client.js +5376 -0
  31. package/dist/code/encode-decode.d.ts +132 -0
  32. package/dist/code/encode-decode.js +645 -0
  33. package/dist/code/userLock.d.ts +39 -0
  34. package/dist/code/userLock.js +284 -0
  35. package/dist/common.d.ts +9 -0
  36. package/dist/common.js +45 -0
  37. package/dist/config/config-ex.d.ts +7 -0
  38. package/dist/config/config-ex.js +73 -0
  39. package/dist/const/const-value.d.ts +21 -0
  40. package/dist/const/const-value.js +26 -0
  41. package/dist/contractAccess/bridgeAccess.d.ts +10 -0
  42. package/dist/contractAccess/bridgeAccess.js +55 -0
  43. package/dist/contractAccess/groupApproveAccess.d.ts +10 -0
  44. package/dist/contractAccess/groupApproveAccess.js +54 -0
  45. package/dist/db/Db.d.ts +24 -0
  46. package/dist/db/Db.js +739 -0
  47. package/dist/db/DbAccess.d.ts +24 -0
  48. package/dist/db/DbAccess.js +211 -0
  49. package/dist/db/common.d.ts +5 -0
  50. package/dist/db/common.js +114 -0
  51. package/dist/event/getEvents.d.ts +17 -0
  52. package/dist/event/getEvents.js +387 -0
  53. package/dist/example/db/createDb-ex.d.ts +1 -0
  54. package/{example/createDb-ex.ts → dist/example/db/createDb-ex.js} +3 -4
  55. package/dist/example/db/dbFeedTrans-ex.d.ts +1 -0
  56. package/{example/dbFeedTrans-ex.ts → dist/example/db/dbFeedTrans-ex.js} +9 -11
  57. package/dist/example/event/getAllEvents-ex.d.ts +1 -0
  58. package/dist/example/event/getAllEvents-ex.js +70 -0
  59. package/dist/example/event/getEventByHash-ex.d.ts +1 -0
  60. package/{example/getEventByHash-ex.ts → dist/example/event/getEventByHash-ex.js} +21 -25
  61. package/dist/example/event/getEventsByRange-ex.d.ts +1 -0
  62. package/dist/example/event/getEventsByRange-ex.js +58 -0
  63. package/dist/example/getAllTrans.d.ts +1 -0
  64. package/dist/example/getAllTrans.js +30 -0
  65. package/dist/example/jetton/getJettonInfo-ex.d.ts +1 -0
  66. package/dist/example/jetton/getJettonInfo-ex.js +32 -0
  67. package/dist/example/lock-release/smgRelease-ex.d.ts +1 -0
  68. package/dist/example/lock-release/smgRelease-ex.js +134 -0
  69. package/dist/example/lock-release/userLock-ex.d.ts +1 -0
  70. package/dist/example/lock-release/userLock-ex.js +69 -0
  71. package/dist/example/manage/addSmg-ex.d.ts +1 -0
  72. package/dist/example/manage/addSmg-ex.js +59 -0
  73. package/dist/example/manage/compileContract-ex.d.ts +1 -0
  74. package/dist/example/manage/compileContract-ex.js +11 -0
  75. package/dist/example/manage/deploy-ex.d.ts +1 -0
  76. package/dist/example/manage/deploy-ex.js +58 -0
  77. package/dist/example/manage/setFee-ex.d.ts +1 -0
  78. package/dist/example/manage/setFee-ex.js +61 -0
  79. package/dist/example/manage/setFeeProxy.d.ts +1 -0
  80. package/dist/example/manage/setFeeProxy.js +47 -0
  81. package/dist/example/manage/upgradeBridgeSc-ex.d.ts +1 -0
  82. package/dist/example/manage/upgradeBridgeSc-ex.js +44 -0
  83. package/dist/example/token/AddToken-ex.d.ts +1 -0
  84. package/dist/example/token/AddToken-ex.js +113 -0
  85. package/dist/example/token/addTokenPair-ex.d.ts +1 -0
  86. package/dist/example/token/addTokenPair-ex.js +59 -0
  87. package/dist/example/token/delTokenPair-ex.d.ts +1 -0
  88. package/dist/example/token/delTokenPair-ex.js +49 -0
  89. package/dist/example/token/getTokenPair-ex.d.ts +1 -0
  90. package/dist/example/token/getTokenPair-ex.js +39 -0
  91. package/dist/example/token/mintToken-ex.d.ts +1 -0
  92. package/dist/example/token/mintToken-ex.js +56 -0
  93. package/dist/example/tran/converTranToTonTran.d.ts +1 -0
  94. package/dist/example/tran/converTranToTonTran.js +32 -0
  95. package/dist/example/tran/getTransByRange-ex.d.ts +1 -0
  96. package/{example/getTransByRange-ex.ts → dist/example/tran/getTransByRange-ex.js} +26 -40
  97. package/dist/example/tran/getTransaction-ex.d.ts +1 -0
  98. package/dist/example/tran/getTransaction-ex.js +47 -0
  99. package/dist/example/tran/isTranSuccess-ex.d.ts +1 -0
  100. package/dist/example/tran/isTranSuccess-ex.js +27 -0
  101. package/dist/fee/fee.d.ts +12 -0
  102. package/dist/fee/fee.js +21 -0
  103. package/dist/index.d.ts +15 -0
  104. package/dist/index.js +95 -0
  105. package/dist/jest.config.d.ts +3 -0
  106. package/dist/jest.config.js +8 -0
  107. package/dist/opcodes.d.ts +55 -0
  108. package/dist/opcodes.js +59 -0
  109. package/dist/sign/buildHash.d.ts +6 -0
  110. package/dist/sign/buildHash.js +39 -0
  111. package/dist/sign/rawTrans.d.ts +36 -0
  112. package/dist/sign/rawTrans.js +89 -0
  113. package/dist/sign/tools-secp256k1.d.ts +21 -0
  114. package/{sign → dist/sign}/tools-secp256k1.js +18 -44
  115. package/dist/testData/JettonMinter.compile.func.d.ts +2 -0
  116. package/dist/testData/JettonMinter.compile.func.js +13 -0
  117. package/dist/testData/JettonWallet.compile.func.d.ts +2 -0
  118. package/dist/testData/JettonWallet.compile.func.js +13 -0
  119. package/dist/testData/bridge.compile.func.d.ts +2 -0
  120. package/dist/testData/bridge.compile.func.js +13 -0
  121. package/dist/transResult/transResult.d.ts +29 -0
  122. package/dist/transResult/transResult.js +528 -0
  123. package/dist/utils/compileContract.d.ts +13 -0
  124. package/dist/utils/compileContract.js +54 -0
  125. package/dist/utils/logger.d.ts +16 -0
  126. package/dist/utils/logger.js +94 -0
  127. package/dist/utils/utils.d.ts +26 -0
  128. package/dist/utils/utils.js +330 -0
  129. package/dist/wallet/balance.d.ts +5 -0
  130. package/dist/wallet/balance.js +29 -0
  131. package/dist/wallet/jetton.d.ts +16 -0
  132. package/dist/wallet/jetton.js +171 -0
  133. package/dist/wallet/walletContract.d.ts +31 -0
  134. package/dist/wallet/walletContract.js +106 -0
  135. package/package.json +8 -6
  136. package/Bridge.compile.ts +0 -8
  137. package/Bridge.ts +0 -645
  138. package/Bridge.ts.org +0 -647
  139. package/Fake.compile.ts +0 -8
  140. package/GroupApprove.compile.ts +0 -6
  141. package/GroupApprove.ts +0 -274
  142. package/JettonMinter.compile.ts +0 -5
  143. package/JettonMinter.ts +0 -135
  144. package/JettonWallet.compile.ts +0 -5
  145. package/JettonWallet.ts +0 -127
  146. package/Signature.compile.ts +0 -6
  147. package/Signature.ts +0 -105
  148. package/address.compile.ts +0 -8
  149. package/client/1.json +0 -1730
  150. package/client/client.ts +0 -73
  151. package/client/log/.ba8901062aebb86bf525b42c65ff84f9485419e4-audit.json +0 -15
  152. package/code/decode.spec.ts +0 -81
  153. package/code/encode-decode.ts +0 -622
  154. package/code/log/.ba8901062aebb86bf525b42c65ff84f9485419e4-audit.json +0 -20
  155. package/code/log/wan-ton-sdk.out.2025-01-20 +0 -0
  156. package/code/userLock.ts +0 -291
  157. package/common.ts +0 -62
  158. package/config/config-ex.ts +0 -25
  159. package/config/config.ts +0 -1
  160. package/const/const-value.ts +0 -33
  161. package/contractAccess/bridgeAccess.ts +0 -60
  162. package/contractAccess/groupApproveAccess.ts +0 -59
  163. package/data/EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs.json +0 -7348
  164. package/db/Db.spec.ts +0 -193
  165. package/db/Db.ts +0 -736
  166. package/db/DbAccess.spec.ts +0 -23
  167. package/db/DbAccess.ts +0 -186
  168. package/db/common.ts +0 -94
  169. package/db/log/.ba8901062aebb86bf525b42c65ff84f9485419e4-audit.json +0 -15
  170. package/db/log/wan-ton-sdk.out.2025-04-21 +0 -0
  171. package/event/getEvents.ts +0 -441
  172. package/event/log/.ba8901062aebb86bf525b42c65ff84f9485419e4-audit.json +0 -15
  173. package/event/log/wan-ton-sdk.out.2024-12-19 +0 -0
  174. package/example/0:1.txt +0 -1
  175. package/example/AddToken-ex.ts +0 -148
  176. package/example/README.md +0 -21
  177. package/example/addSmg-ex.ts +0 -78
  178. package/example/addTokenPair-ex.ts +0 -73
  179. package/example/compileContract-ex.ts +0 -10
  180. package/example/converTranToTonTran.ts +0 -43
  181. package/example/delTokenPair-ex.ts +0 -63
  182. package/example/deploy-ex.ts +0 -68
  183. package/example/getAllEvents-ex.ts +0 -61
  184. package/example/getAllTrans.ts +0 -32
  185. package/example/getContractState-ex.ts +0 -33
  186. package/example/getEvents-ex.ts +0 -55
  187. package/example/getJettonInfo-ex.ts +0 -44
  188. package/example/getTokenPair-ex.ts +0 -47
  189. package/example/getTransaction-ex.ts +0 -62
  190. package/example/isTranSuccess-ex.ts +0 -33
  191. package/example/locateTx-ex.ts +0 -44
  192. package/example/log/.ba8901062aebb86bf525b42c65ff84f9485419e4-audit.json +0 -55
  193. package/example/log/wan-ton-sdk.out.2025-04-21 +0 -447
  194. package/example/log/wan-ton-sdk.out.2025-04-22 +0 -1918
  195. package/example/log/wan-ton-sdk.out.2025-04-23 +0 -4216
  196. package/example/log/wan-ton-sdk.out.2025-04-24.gz +0 -0
  197. package/example/log/wan-ton-sdk.out.2025-04-25 +0 -46814
  198. package/example/log/wan-ton-sdk.out.2025-04-27.gz +0 -0
  199. package/example/log/wan-ton-sdk.out.2025-04-28 +0 -4966
  200. package/example/log/wan-ton-sdk.out.2025-04-29 +0 -1328
  201. package/example/log/wan-ton-sdk.out.2025-04-30 +0 -9
  202. package/example/mintToken-ex.ts +0 -82
  203. package/example/setFee-ex.ts +0 -82
  204. package/example/setFeeProxy.ts +0 -70
  205. package/example/smgRelease-ex.ts +0 -173
  206. package/example/upgradeBridgeSc-ex.ts +0 -49
  207. package/example/userLock-ex.ts +0 -78
  208. package/fee/fee.ts +0 -23
  209. package/index.ts +0 -76
  210. package/jest.config.ts +0 -9
  211. package/log/.ba8901062aebb86bf525b42c65ff84f9485419e4-audit.json +0 -20
  212. package/log/wan-ton-sdk.out.2025-04-21 +0 -0
  213. package/log/wan-ton-sdk.out.2025-04-30 +0 -10
  214. package/opcodes.ts +0 -58
  215. package/publish.sh +0 -78
  216. package/sign/buildHash.ts +0 -47
  217. package/sign/log/.ba8901062aebb86bf525b42c65ff84f9485419e4-audit.json +0 -15
  218. package/sign/log/wan-ton-sdk.out.2025-04-14 +0 -3
  219. package/sign/rawTrans.spec.ts +0 -117
  220. package/sign/rawTrans.ts +0 -122
  221. package/testData/JettonMinter.compile.func.ts +0 -8
  222. package/testData/JettonWallet.compile.func.ts +0 -8
  223. package/testData/addressList.json +0 -6
  224. package/testData/bridge.compile.func.ts +0 -8
  225. package/testData/bridge.compiled.json +0 -1
  226. package/testData/contractAddress.json +0 -7
  227. package/testData/jettonTokenInfo.json +0 -14
  228. package/testData/prvlist.json +0 -6
  229. package/testData/smg.json +0 -5
  230. package/testData/tokenInfo.json +0 -23
  231. package/transResult/transResult.ts +0 -608
  232. package/tsconfig.json +0 -19
  233. package/utils/.compiled.json +0 -1
  234. package/utils/compileContract.ts +0 -60
  235. package/utils/log/.ba8901062aebb86bf525b42c65ff84f9485419e4-audit.json +0 -15
  236. package/utils/log/wan-ton-sdk.out.2025-01-08 +0 -0
  237. package/utils/logger.spec.ts +0 -14
  238. package/utils/logger.ts +0 -96
  239. package/utils/utils.spec.ts +0 -21
  240. package/utils/utils.ts +0 -295
  241. package/wallet/balance.ts +0 -29
  242. package/wallet/jetton.spec.ts +0 -27
  243. package/wallet/jetton.ts +0 -159
  244. package/wallet/walletContract.spec.ts +0 -111
  245. package/wallet/walletContract.ts +0 -105
  246. /package/{client/log/wan-ton-sdk.out.2024-12-19 → dist/config/config.d.ts} +0 -0
  247. /package/{code/log/wan-ton-sdk.out.2025-01-15 → dist/config/config.js} +0 -0
@@ -1,608 +0,0 @@
1
- import {Address, beginCell, storeMessage, storeMessageRelaxed, Transaction} from "@ton/core";
2
- import {TonClient} from "@ton/ton";
3
- import {TransactionDescriptionGeneric} from "@ton/core/src/types/TransactionDescription";
4
- import {TransactionComputeVm} from "@ton/core/src/types/TransactionComputePhase";
5
- import {bigIntReplacer, formatError} from "../utils/utils";
6
- import {CommonMessageInfoInternal} from "@ton/core/src/types/CommonMessageInfo";
7
- import {DBAccess} from "../db/DbAccess";
8
- import {convertTranToTonTrans} from "../db/common";
9
- import { MAX_LIMIT } from "../const/const-value";
10
- const formatUtil = require('util');
11
-
12
- function sleep(ms) {
13
- return new Promise(resolve => setTimeout(resolve, ms));
14
- }
15
-
16
- /*
17
- return
18
- [
19
- {
20
- addr: Address,
21
- txHash: string,
22
- gasUsed: bigInt,
23
- status: boolean,
24
- },
25
- ...
26
- ]
27
- */
28
-
29
- async function getTranPathInfoByMsgHash(client: TonClient, scAddr: Address, msgBodyCellHash:string, msgInHash: string): Promise<TranPathInfo> {
30
- let pivotTran = await getTranByMsgHash(client, scAddr, msgBodyCellHash,msgInHash);
31
- let path = await getTranPathInfoByPivotTran(client, scAddr, pivotTran);
32
- return path;
33
- }
34
-
35
- export async function isTranSuccess(tran:Transaction):Promise<boolean>{
36
- //https://testnet.tonviewer.com/transaction/3a80c94fa62a855ebb47c634f1b42ebd0fdc9ea35ab3f6389bf2c086aac887ef
37
- let td = tran.description as unknown as TransactionDescriptionGeneric
38
- // if(td.aborted){
39
- // return false
40
- // }
41
-
42
- let cp = td.computePhase as unknown as TransactionComputeVm
43
- if( (cp.type == "vm") && (!cp.success || cp.exitCode != 0)){
44
- return false
45
- }
46
-
47
- if( td.aborted && cp.type == "vm"){
48
- return false
49
- }
50
-
51
- let ap = td.actionPhase
52
- let apSuccess = ap?.success ? ap.success:true
53
- if(!apSuccess){
54
- return false;
55
- }
56
- return true;
57
- }
58
-
59
- async function computePathGas(path:TranPathInfo):Promise<bigint>{
60
- let ret = BigInt(0);
61
- for(let step of path){
62
- ret += step.gasUsed
63
- }
64
- return ret;
65
- }
66
-
67
- async function isTranPathSuccess(allTranPathInfo:TranPathInfo):Promise<boolean>{
68
- let ret = true;
69
- for(let step of allTranPathInfo){
70
- if(!step.status){
71
- return false
72
- }
73
- }
74
- return true;
75
- }
76
-
77
-
78
- export async function getUpperStepsFromDb(client:TonClient,scAddr:Address,tran:Transaction, path:TranPathInfo){
79
- console.log("getUpperStepsFromDb","tran hash",tran.hash().toString('hex'));
80
- if(tran.inMessage.info.type == 'external-in'){
81
- return
82
- }
83
- const inMessageCell = beginCell().store(storeMessage( tran.inMessage)).endCell();
84
- console.log("getUpperStepsFromDb inMessageCell==>","hash",tran.hash().toString('hex'));
85
-
86
- let upperAddress = tran.inMessage.info.src as Address;
87
-
88
- let maxRetry = 5;
89
- //get from scanned db
90
- let dbAccess = await DBAccess.getDBAccess();
91
- if(!dbAccess){
92
- console.error("not using db cache");
93
- throw new Error("not using db cache");
94
- }
95
- let transFromDb = null;
96
- let foundInDb = false;
97
- while(maxRetry-- >0 && !transFromDb){
98
- try{
99
- let inDb = await dbAccess?.has(upperAddress.toString());
100
- if(!inDb){
101
- await dbAccess?.addDbByName(upperAddress.toString());
102
- await sleep(2000);
103
- }
104
- console.log("getUpperStepsFromDb before dbAccess.getParentTx","tran hash",tran.hash().toString('hex'),"upperAddress",upperAddress.toString());
105
- transFromDb = await dbAccess?.getParentTx(upperAddress.toString(),convertTranToTonTrans([tran])[0]);
106
- if(transFromDb){ // found from db
107
- foundInDb = true;
108
- }
109
- }catch(err){
110
- console.log("getTranByMsgHash from db err",formatError(err),"retry ",maxRetry);
111
- }
112
- await sleep(2000);
113
- }
114
- if(maxRetry == 0 && !foundInDb){
115
- throw new Error(`Fail to look for parent. upDb: ${upperAddress.toString()}`)
116
- }
117
- if(foundInDb && transFromDb){
118
- console.log("getUpperStepsFromDB success","hash",tran.hash().toString('hex'),"parent hash",transFromDb.hash().toString('hex'));
119
- let stepInfoTemp :TranStepInfo = {
120
- addr:upperAddress as Address,
121
- txHash:transFromDb.hash().toString('hex'),
122
- gasUsed:transFromDb.totalFees.coins,
123
- status:await isTranSuccess(transFromDb),
124
- lt:transFromDb.lt.toString(),
125
- }
126
- path.unshift(stepInfoTemp);
127
-
128
- await getUpperStepsFromDb(client,upperAddress,transFromDb,path);
129
- }
130
- }
131
-
132
- export async function getUpperSteps(client:TonClient,scAddr:Address,tran:Transaction, path:TranPathInfo){
133
- if(tran.inMessage.info.type == 'external-in'){
134
- return
135
- }
136
-
137
- try{
138
- await getUpperStepsFromDb(client,scAddr,tran,path);
139
- return;
140
- }catch(err){
141
- console.log("getUpperStepsFromDb error",formatError(err));
142
- }
143
-
144
- console.log("getUpperSteps from rpc","scAddr",scAddr,"tran hash",tran.hash().toString('hex'));
145
- const inMessageCell = beginCell().store(storeMessage( tran.inMessage)).endCell();
146
- console.log("inMessageCell==>",inMessageCell.toBoc().toString('hex'));
147
- let tranInMsgHash = inMessageCell.hash().toString('hex');
148
-
149
- let tranInMsgBodyCellHash = tran.inMessage.body.hash().toString('hex');
150
-
151
- let upperAddress = tran.inMessage.info.src as Address;
152
-
153
-
154
- let maxTrans = 1000;
155
- let transChecked = 0;
156
- let opts:{
157
- limit: number;
158
- lt?: string;
159
- hash?: string;
160
- to_lt?: string;
161
- inclusive?: boolean;
162
- archival?: boolean;
163
- } = {
164
- limit: 10,
165
- archival:true,
166
- }
167
- let foundUpper = false
168
- let transCount = 10;
169
-
170
- while(transChecked<maxTrans && !foundUpper && transCount){
171
- let retry = 5;
172
- let status = false;
173
- let transactions:Transaction[] = [];
174
- while(--retry > 0 && !status){
175
- try{
176
- console.log("getUpperSteps getTransactions ","scAddress",upperAddress,"opts",opts);
177
- transactions = await client.getTransactions(upperAddress, opts);
178
- transCount = transactions.length;
179
- status = true;
180
- retry = 5;
181
- }catch(e){
182
- await sleep(1000);
183
- console.error(formatError(e))
184
- }
185
- }
186
- if(retry == 0){
187
- throw(new Error(formatUtil.format("error getUpperSteps getTransactions ","scAddress",upperAddress,"opts",opts)))
188
- }
189
-
190
- for (let i=0; i<transactions.length; i++) {
191
- let tx = transactions[i]
192
- if(i == transactions.length-1) {
193
- opts.lt = tx.lt.toString(10);
194
- opts.hash = tx.hash().toString('base64');
195
- }
196
- const transactionHash = tx.hash().toString('base64');
197
- console.log("tx hash is:",i, tx.lt, transactionHash,tx.hash().toString('hex'))
198
- const outMessages = tx.outMessages;
199
- let foundInOutMsgs = false;
200
- for(let outMsgKey of outMessages.keys()){
201
- let outMsg = outMessages.get(outMsgKey);
202
- let outMsgHash = beginCell().store(storeMessage(outMsg)).endCell().hash().toString('hex');
203
- let outMsgBodyHash = outMsg.body.hash().toString('hex');
204
- console.log("outMsgHash",outMsgHash,"tranInMsgHash",tranInMsgHash,"outMsgBodyHash",outMsgBodyHash,"tranInMsgBodyCellHash",tranInMsgBodyCellHash);
205
- if (outMsgHash == tranInMsgHash || outMsgBodyHash == tranInMsgBodyCellHash){
206
- if((outMsg.info.dest as unknown as Address).equals(scAddr)){
207
- if((outMsg.info as unknown as CommonMessageInfoInternal).createdLt == (tran.inMessage.info as unknown as CommonMessageInfoInternal).createdLt){
208
- let stepInfoTemp :TranStepInfo = {
209
- addr:upperAddress as Address,
210
- txHash:tx.hash().toString('hex'),
211
- gasUsed:tx.totalFees.coins,
212
- status:await isTranSuccess(tx),
213
- lt:tx.lt.toString(),
214
- }
215
- path.unshift(stepInfoTemp);
216
- foundInOutMsgs = true;
217
- break;
218
- }
219
- }
220
-
221
- }
222
-
223
- }
224
-
225
- if (foundInOutMsgs){
226
- console.log("found upper tx",tx.hash().toString('base64'));
227
- await getUpperSteps(client,upperAddress,tx,path);
228
- foundUpper = true;
229
- break; // found the upper tx
230
- }
231
- }
232
- await sleep(2000);
233
- transChecked += transactions.length;
234
- }
235
-
236
- if(transChecked>=maxTrans){
237
- throw new Error("can not found the upper tx!")
238
- }
239
- }
240
-
241
- export async function getLowerSteps(client:TonClient,scAddr:Address,tran:Transaction, path:TranPathInfo){
242
- console.log("Entering getLowerSteps","scAddr",scAddr);
243
- if(tran.outMessages.keys().length == 0){
244
- return
245
- }
246
-
247
- const outMessages = tran.outMessages;
248
- for(let outMsgKey of outMessages.keys()){
249
- let outMsg = outMessages.get(outMsgKey);
250
- let lowerAddr = outMsg.info.dest as Address;
251
- let msgCellHash = beginCell().store(storeMessage(outMsg)).endCell().hash().toString('hex');
252
- let msgBodyHash = outMsg.body.hash().toString('hex');
253
- console.log("===========================before getTranByMsgHash","outMsg",outMsg);
254
- let lowerTx = await getTranByMsgHash(client,lowerAddr,msgCellHash,msgBodyHash,(outMsg.info as unknown as CommonMessageInfoInternal).createdLt.toString(10));
255
-
256
- let stepInfoTemp :TranStepInfo = {
257
- addr:lowerAddr as Address,
258
- txHash:lowerTx.hash().toString('hex'),
259
- gasUsed:lowerTx.totalFees.coins,
260
- status:await isTranSuccess(lowerTx),
261
- lt:lowerTx.lt.toString(),
262
- }
263
- path.push(stepInfoTemp);
264
- await getLowerSteps(client,lowerAddr,lowerTx,path);
265
- }
266
- }
267
-
268
- async function getTranPathInfoByPivotTran(client:TonClient,scAddr:Address,pivotTran:Transaction):Promise<TranPathInfo>{
269
- console.log("Entering getTranPathInfoByPivotTran");
270
- let allTranPathInfo: TranPathInfo = [];
271
- let beforePivotTranPathInfo: TranPathInfo = [];
272
- let afterPivotTranPathInfo: TranPathInfo = [];
273
-
274
- let pivoltTranStepInfo: TranStepInfo = {
275
- addr: scAddr,
276
- txHash: pivotTran.hash().toString('hex'),
277
- gasUsed: pivotTran.totalFees.coins,
278
- status: await isTranSuccess(pivotTran),
279
- lt:pivotTran.lt.toString(),
280
- }
281
-
282
- console.log("Entering get children tx");
283
- await getLowerSteps(client,scAddr,pivotTran,afterPivotTranPathInfo); // find children tx //todo check it carefully.
284
- console.log("End get children tx");
285
-
286
- console.log("Entering get parent tx");
287
- await getUpperSteps(client,scAddr,pivotTran,beforePivotTranPathInfo); // find parent tx
288
- console.log("End get parent tx");
289
-
290
- console.log("[pivoltTranStepInfo]====>",[pivoltTranStepInfo]);
291
- console.log("[beforePivotTranPathInfo]====>",beforePivotTranPathInfo);
292
- console.log("[afterPivotTranPathInfo]====>",afterPivotTranPathInfo);
293
- let ret = allTranPathInfo.concat(beforePivotTranPathInfo,[pivoltTranStepInfo],afterPivotTranPathInfo);
294
- console.log("========================ret = >", ret);
295
- return ret;
296
- }
297
-
298
-
299
-
300
- export interface TranStepInfo {
301
- addr: Address;
302
- txHash: string;
303
- gasUsed: bigint;
304
- status: boolean;
305
- lt:string;
306
- }
307
-
308
- export interface TranResult {
309
- addr: Address;
310
- msgInHash: string;
311
- path:TranPathInfo;
312
- success: boolean;
313
- originAddr: Address;
314
- gasUsed:bigint;
315
- }
316
-
317
- export type TranPathInfo = TranStepInfo[]
318
-
319
- // example of result
320
- /*
321
- TranResult=> {
322
- addr: EQCT7rMc77KcPciOlxV-dfhYWK7RisB7lEAdGze2f0-vUI30,
323
- msgInHash: '8a2fdd9e5508f06c94ff55f0d367fdaaca82207c52ed03008680319b2424bfed',
324
- path: [
325
- {
326
- addr: EQCT7rMc77KcPciOlxV-dfhYWK7RisB7lEAdGze2f0-vUI30,
327
- txHash: '3bc0e57c110eab0a0ad1d282df89a99f3c2a3aa71fcd27d2ff897bc45febd3bb',
328
- gasUsed: 2577471n,
329
- status: true,
330
- lt: '29498261000001'
331
- },
332
- {
333
- addr: EQBsdoNazbwI9ybbsgufhRocWBPm7emo7cZQxojqzNuvNRcC,
334
- txHash: '9e4f815609fa16591648b08d186cda0d81175e3a45ee17a91754f83fe013136d',
335
- gasUsed: 4319392n,
336
- status: true,
337
- lt: '29498264000001'
338
- },
339
- {
340
- addr: EQCT7rMc77KcPciOlxV-dfhYWK7RisB7lEAdGze2f0-vUI30,
341
- txHash: '78b3031ffed07ec7b147f24db7a80e6fda5338d1d9fdbf5e9a845dbcf12de67f',
342
- gasUsed: 396405n,
343
- status: true,
344
- lt: '29498268000001'
345
- }
346
- ],
347
- success: true,
348
- originAddr: EQCT7rMc77KcPciOlxV-dfhYWK7RisB7lEAdGze2f0-vUI30,
349
- gasUsed: 7293268n
350
- }
351
- */
352
- export async function getTranResultByMsgHash(client:TonClient,scAddr:Address,msgBodyCellHash:string,msgInHash:string):Promise<TranResult>{
353
-
354
- let path = await getTranPathInfoByMsgHash(client,scAddr,msgBodyCellHash,msgInHash);
355
- let success = await isTranPathSuccess(path);
356
- return {
357
- addr: scAddr,
358
- msgInHash,
359
- path,
360
- success,
361
- originAddr: path[0].addr,
362
- gasUsed: await computePathGas(path)
363
- };
364
- }
365
-
366
- export async function getTranResultByTxHash(client:TonClient,scAddr:Address,txHash:string, lt:string):Promise<TranResult>{
367
- let tran = await client.getTransaction(scAddr,lt,txHash);
368
- let path = await getTranPathInfoByPivotTran(client,scAddr,tran);
369
-
370
- let success = await isTranPathSuccess(path);
371
- return {
372
- addr: scAddr,
373
- msgInHash:tran.inMessage.body.hash().toString('base64'),
374
- path,
375
- success,
376
- originAddr: path[0].addr,
377
- gasUsed: await computePathGas(path)
378
- };
379
- }
380
-
381
- export async function getTranResultByTran(client:TonClient,scAddr:Address,tran:Transaction):Promise<TranResult>{
382
- console.log("Entering getTranResultByTran");
383
- let path = await getTranPathInfoByPivotTran(client,scAddr,tran);
384
- let success = await isTranPathSuccess(path);
385
- return {
386
- addr: scAddr,
387
- msgInHash:tran.inMessage.body.hash().toString('base64'),
388
- path,
389
- success,
390
- originAddr: path[0].addr,
391
- gasUsed: await computePathGas(path)
392
- };
393
- }
394
-
395
-
396
- export async function findMsgCellHashInTran(tran:Transaction,msgCellHash:string,msgBodyHash:string,lt:string=''):Promise<Boolean> {
397
- let found = false;
398
- const inMessageCell = beginCell().store(storeMessage(tran.inMessage)).endCell();
399
- let inMessageHash = inMessageCell.hash().toString('hex');
400
- let inMessageBodyCellHash = tran.inMessage.body.hash().toString('hex');
401
- let internalMsg = true;
402
- if(tran.inMessage.info.type == 'external-in'){
403
- internalMsg = false;
404
- }
405
- let inMessageLt = "";
406
- if(internalMsg){
407
- inMessageLt = (tran.inMessage.info as unknown as CommonMessageInfoInternal).createdLt.toString(10);
408
- }
409
-
410
- if(!internalMsg){
411
- if ((inMessageHash == msgCellHash || inMessageBodyCellHash == msgBodyHash)) {
412
- found = true;
413
- }
414
- }else{
415
- if ((inMessageHash == msgCellHash || inMessageBodyCellHash == msgBodyHash)) {
416
- if (lt.length != 0 && (inMessageLt == lt)){
417
- found = true;
418
- }else{
419
- if(lt.length == 0 ){
420
- found = true;
421
- }
422
- }
423
- }
424
- }
425
-
426
- return found;
427
- }
428
-
429
- export async function findOnlyMsgCellHashInTran(tran:Transaction,msgCellHash:string):Promise<Boolean> {
430
- let found = false;
431
- const inMessageCell = beginCell().store(storeMessage(tran.inMessage)).endCell();
432
- let inMessageHash = inMessageCell.hash().toString('hex');
433
- let inMessageBodyCellHash = tran.inMessage.body.hash().toString('hex');
434
- let internalMsg = true;
435
- if(tran.inMessage.info.type == 'external-in'){
436
- internalMsg = false;
437
- }
438
- let inMessageLt = "";
439
- if(internalMsg){
440
- inMessageLt = (tran.inMessage.info as unknown as CommonMessageInfoInternal).createdLt.toString(10);
441
- }
442
-
443
- if(!internalMsg){
444
- if ((inMessageHash == msgCellHash)) {
445
- found = true;
446
- }
447
- }else{
448
- if ((inMessageHash == msgCellHash)) {
449
- found = true;
450
- }
451
- }
452
-
453
- return found;
454
- }
455
-
456
- export async function getTranByMsgHash(client:TonClient, scAddr:Address, msgCellHash:string,msgBodyHash:string,lt:string=''):Promise<Transaction> {
457
- let limit = MAX_LIMIT;
458
- let retry = 5
459
- let maxRetry = retry;
460
- //get from scanned db
461
- let dbAccess = await DBAccess.getDBAccess();
462
- let transFromDb = null;
463
- while(maxRetry-- >0 && !transFromDb){
464
- try{
465
- let inDb = await dbAccess?.has(scAddr.toString());
466
- if(!inDb){
467
- await dbAccess.addDbByName(scAddr.toString());
468
- await sleep(2000);
469
- }
470
- transFromDb = await dbAccess?.getTxByMsg(scAddr.toString(),msgCellHash,msgBodyHash,BigInt(lt));
471
- if(transFromDb){ // found from db
472
- return transFromDb;
473
- }
474
- }catch(err){
475
- console.error("getTranByMsgHash from db err",formatError(err),"retry ",maxRetry);
476
- }
477
- await sleep(2000);
478
- }
479
-
480
- //get from rpc
481
- maxRetry = retry;
482
-
483
- let trans = [];
484
- let transCount = limit;
485
- let opts: {
486
- limit: number;
487
- lt?: string;
488
- hash?: string;
489
- to_lt?: string;
490
- inclusive?: boolean;
491
- archival?: boolean;
492
- } = {
493
- limit,
494
- archival:true,
495
- }
496
-
497
- while(transCount){
498
- let getSuccess = false
499
- while(maxRetry-- >0 && (!getSuccess)){
500
- try{
501
- console.log("maxRetry = %s, getSuccess = %s, transCount = %s, scAddress = %s opts = %s",maxRetry,getSuccess,transCount,scAddr,JSON.stringify(opts,bigIntReplacer));
502
- let ret = await client.getTransactions(scAddr,opts)
503
- transCount = ret.length;
504
- console.log("getTransactions success","opts",JSON.stringify(opts,bigIntReplacer),"len of getTransactions",transCount);
505
- for(let tran of ret){
506
- console.log("=====> tranHash = %s lt = %s",tran.hash().toString('base64'),tran.lt.toString(10));
507
- let found = await findMsgCellHashInTran(tran,msgCellHash,msgBodyHash,lt);
508
- if(found){
509
- return tran;
510
- }
511
- }
512
- if(ret.length){
513
- opts.lt = ret[ret.length-1].lt.toString(10);
514
- opts.hash = ret[ret.length-1].hash().toString('base64');
515
- }
516
- getSuccess = true;
517
- maxRetry = retry;
518
-
519
- }catch(e){
520
- console.error("err ",formatError(e));
521
- await sleep(2000);
522
- }
523
- }
524
- if(maxRetry == 0){
525
- throw(new Error(formatUtil("getTransactions failed after %d retry. opts is %s",retry,JSON.stringify(opts))));
526
- }
527
-
528
- await sleep(2000);
529
- }
530
-
531
- }
532
-
533
- export async function getTranByOnlyMsgHash(client:TonClient, scAddr:Address, msgCellHash:string):Promise<Transaction> {
534
- let limit = MAX_LIMIT;
535
- let retry = 5
536
- let maxRetry = retry;
537
- //get from scanned db
538
- let dbAccess = await DBAccess.getDBAccess();
539
- let transFromDb = null;
540
- while(maxRetry-- >0 && !transFromDb){
541
- try{
542
- let inDb = await dbAccess?.has(scAddr.toString());
543
- if(!inDb){
544
- await dbAccess.addDbByName(scAddr.toString());
545
- await sleep(2000);
546
- }
547
- transFromDb = await dbAccess?.getTxByOnlyMsgHash(scAddr.toString(),msgCellHash);
548
- if(transFromDb){ // found from db
549
- return transFromDb;
550
- }
551
- }catch(err){
552
- console.error("getTranByMsgHash from db err",formatError(err),"retry ",maxRetry);
553
- }
554
- await sleep(2000);
555
- }
556
-
557
- //get from rpc
558
- maxRetry = retry;
559
-
560
- let trans = [];
561
- let transCount = limit;
562
- let opts: {
563
- limit: number;
564
- lt?: string;
565
- hash?: string;
566
- to_lt?: string;
567
- inclusive?: boolean;
568
- archival?: boolean;
569
- } = {
570
- limit,
571
- archival:true,
572
- }
573
-
574
- while(transCount){
575
- let getSuccess = false
576
- while(maxRetry-- >0 && (!getSuccess)){
577
- try{
578
- console.log("maxRetry = %s, getSuccess = %s, transCount = %s, scAddress = %s opts = %s",maxRetry,getSuccess,transCount,scAddr,JSON.stringify(opts,bigIntReplacer));
579
- let ret = await client.getTransactions(scAddr,opts)
580
- transCount = ret.length;
581
- console.log("getTransactions success","opts",JSON.stringify(opts,bigIntReplacer),"len of getTransactions",transCount);
582
- for(let tran of ret){
583
- console.log("=====> tranHash = %s lt = %s",tran.hash().toString('base64'),tran.lt.toString(10));
584
- let found = await findOnlyMsgCellHashInTran(tran,msgCellHash);
585
- if(found){
586
- return tran;
587
- }
588
- }
589
- if(ret.length){
590
- opts.lt = ret[ret.length-1].lt.toString(10);
591
- opts.hash = ret[ret.length-1].hash().toString('base64');
592
- }
593
- getSuccess = true;
594
- maxRetry = retry;
595
-
596
- }catch(e){
597
- console.error("err ",formatError(e));
598
- await sleep(2000);
599
- }
600
- }
601
- if(maxRetry == 0){
602
- throw(new Error(formatUtil("getTransactions failed after %d retry. opts is %s",retry,JSON.stringify(opts))));
603
- }
604
-
605
- await sleep(2000);
606
- }
607
-
608
- }
package/tsconfig.json DELETED
@@ -1,19 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2020",
4
- "outDir": "../wan-ton-sdk/dist",
5
- "module": "commonjs",
6
- "rootDir": "./",
7
- "declaration": true,
8
- "esModuleInterop": true,
9
- "resolveJsonModule": true,
10
- "forceConsistentCasingInFileNames": true,
11
- "strict": false,
12
- "skipLibCheck": true,
13
- "allowJs": true,
14
- "types": ["jest","node"]
15
- },
16
- "include": ["./**/*"],
17
- "exclude": [
18
- "node_modules", "./*.spec.ts","./*/*log*","./log/*"]
19
- }
@@ -1 +0,0 @@
1
- {"version":{"funcVersion":"0.4.4","funcFiftLibCommitHash":"ffe0a1c63073dda0a0dd0e14f199b83fe5b05e66","funcFiftLibCommitDate":"2024-03-27 12:57:15 +0300"},"hashHex":"cc86dd282df9a8848afa3bfaab9b7b7463fc01a9306fe80ed0b34517429a45e2","codeBase64":"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"}