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
package/dist/db/Db.js ADDED
@@ -0,0 +1,739 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.RangeOpen = void 0;
7
+ const common_1 = require("./common");
8
+ const path_1 = __importDefault(require("path"));
9
+ const utils_1 = require("../utils/utils");
10
+ const client_1 = require("../client/client");
11
+ const core_1 = require("@ton/core");
12
+ const util_1 = __importDefault(require("util"));
13
+ const const_value_1 = require("../const/const-value");
14
+ const logger_1 = require("../utils/logger");
15
+ const crypto_1 = require("@ton/crypto");
16
+ const LOG_ROOT = path_1.default.join(__dirname, "../log/");
17
+ var _ = require('lodash');
18
+ const { Mutex } = require('async-mutex');
19
+ const minLt = BigInt(0);
20
+ //const maxLt = 1n << 256n - 1n; //error: "TypeError: Can't parse integer in parameter lt"
21
+ const maxLt = 1n << 255n - 1n;
22
+ var RangeOpen;
23
+ (function (RangeOpen) {
24
+ RangeOpen[RangeOpen["CloseRange"] = 0] = "CloseRange";
25
+ RangeOpen[RangeOpen["RightOpenRange"] = 1] = "RightOpenRange";
26
+ //LeftOpenRange, // 2
27
+ //BothOpenRange // 3
28
+ })(RangeOpen || (exports.RangeOpen = RangeOpen = {}));
29
+ const defaultData = {
30
+ trans: [],
31
+ isInitial: true,
32
+ scanTasks: [{
33
+ rangeStart: minLt,
34
+ rangeEnd: maxLt,
35
+ rangeOpen: RangeOpen.RightOpenRange,
36
+ }],
37
+ };
38
+ var serializeWithBig = function (obj) {
39
+ let ret = JSON.stringify(obj, utils_1.bigIntReplacer, 2);
40
+ return ret;
41
+ };
42
+ var deserializeWithBig = function (str) {
43
+ let ret = JSON.parse(str, utils_1.bigIntReplacer);
44
+ return ret;
45
+ };
46
+ class DB {
47
+ constructor(dbName) {
48
+ this.db = null;
49
+ this.dbName = dbName;
50
+ this.db = null;
51
+ this.mutex = new Mutex();
52
+ this.logger = null;
53
+ }
54
+ getDbName() {
55
+ return this.dbName;
56
+ }
57
+ async init(dbName) {
58
+ this.logger = new logger_1.Logger("wan-ton-sdk-db", path_1.default.join(LOG_ROOT, `${dbName}/wan-ton-sdk-db-${dbName}.out`), path_1.default.join(LOG_ROOT, `${dbName}/wan-ton-sdk-db-${dbName}.err`), global.SDK_LOG_LEVEL);
59
+ const low = require('lowdb');
60
+ const FileSync = require('lowdb/adapters/FileSync');
61
+ const fullName = path_1.default.join(...[(0, client_1.getDBDataDir)(), dbName + '.json']);
62
+ this.logger.info("fullName", fullName);
63
+ this.fullFileName = fullName;
64
+ if (!(await (0, utils_1.ensurePath)(fullName))) {
65
+ throw new Error(`init db error ${fullName}`);
66
+ }
67
+ let myDefaultData = _.cloneDeep(defaultData);
68
+ const adapter = new FileSync(fullName, {
69
+ defaultValue: myDefaultData,
70
+ serialize: serializeWithBig,
71
+ deserialize: deserializeWithBig,
72
+ });
73
+ this.db = low(adapter);
74
+ if (!(await (0, utils_1.ensurePath)(`../log/${dbName}`))) {
75
+ throw new Error(`init db log path error ${dbName}`);
76
+ }
77
+ this.logger.info("finish init", "dbName", dbName);
78
+ }
79
+ async stopFeedTrans() {
80
+ const release = await this.mutex.acquire();
81
+ try {
82
+ this.logger.info("Entering stopFeedTrans");
83
+ }
84
+ finally {
85
+ release();
86
+ }
87
+ }
88
+ async insertTrans(trans) {
89
+ this.logger.info("Entering insertTrans", "dbName", this.dbName, "tonTrans.length", trans?.length);
90
+ if (trans?.length == 0) {
91
+ return;
92
+ }
93
+ let copy = {};
94
+ const release = await this.mutex.acquire();
95
+ try {
96
+ copy = _.cloneDeep(this.db.getState());
97
+ _.forEach(trans, tran => {
98
+ let result = null;
99
+ result = this.db.get("trans").find({ lt: tran.lt.toString(10) }).value();
100
+ this.logger.info("insertTrans ", "dbName", this.dbName, "lt", tran.lt, "result", result);
101
+ if (!result) {
102
+ this.db.get('trans').value().push(tran);
103
+ this.logger.info("insertTrans inserting ", "dbName", this.dbName, "lt", tran.lt);
104
+ }
105
+ else {
106
+ this.logger.info("insertTrans duplicated", "dbName", this.dbName, "lt", tran.lt);
107
+ }
108
+ });
109
+ this.db.write();
110
+ }
111
+ catch (err) {
112
+ this.db.setState(copy);
113
+ this.logger.error("insertTrans", "err", (0, utils_1.formatError)(err));
114
+ throw err;
115
+ }
116
+ finally {
117
+ release();
118
+ }
119
+ }
120
+ /////////////////////////////////////
121
+ // write db
122
+ /////////////////////////////////////
123
+ async updateTask(tasks) {
124
+ this.logger.info("=======================================Entering updateTask=========================", "tasks", JSON.stringify(tasks, utils_1.bigIntReplacer));
125
+ let copy = {};
126
+ const release = await this.mutex.acquire();
127
+ try {
128
+ copy = _.cloneDeep(this.db.getState());
129
+ this.db.set("scanTasks", tasks).write();
130
+ }
131
+ catch (err) {
132
+ this.db.setState(copy);
133
+ this.logger.error("updateTask", "err", (0, utils_1.formatError)(err));
134
+ }
135
+ finally {
136
+ release();
137
+ }
138
+ }
139
+ async setTranHandleFlag(tran, finishOrNot) {
140
+ let copy = {};
141
+ const release = await this.mutex.acquire();
142
+ try {
143
+ this.logger.info("Entering setTranHandleFlag", "hash", tran.hash, "lt", tran.lt, "dbName", this.dbName, "finishOrNot", finishOrNot);
144
+ copy = _.cloneDeep(this.db.getState());
145
+ let txHashBas64 = (0, utils_1.toBase64)(tran.hash);
146
+ this.db.get('trans').find({ hash: txHashBas64, lt: tran.lt.toString(10) })
147
+ .assign({ emitEventOrNot: finishOrNot })
148
+ .value();
149
+ this.db.write();
150
+ }
151
+ catch (err) {
152
+ this.db.setState(copy);
153
+ this.logger.error("Entering setTranHandleFlag", "err", (0, utils_1.formatError)(err), "hash", tran.hash, "lt", tran.lt, "dbName", this.dbName, "finishOrNot", finishOrNot);
154
+ }
155
+ finally {
156
+ release();
157
+ }
158
+ }
159
+ async setTranHandleFlags(trans, finishOrNots) {
160
+ this.logger.info("Entering setTranHandleFlag");
161
+ if (trans.length != finishOrNots.length || trans.length == 0) {
162
+ throw (new Error("setTranHandleFlag fail"));
163
+ }
164
+ try {
165
+ for (let i = 0; i < trans.length; i++) {
166
+ await this.setTranHandleFlag(trans[i], finishOrNots[i]);
167
+ }
168
+ }
169
+ catch (err) {
170
+ this.logger.info("setTranHandleFlags", "err", (0, utils_1.formatError)(err));
171
+ }
172
+ }
173
+ // isInitial (true->false)
174
+ async setScanStarted() {
175
+ let copy = {};
176
+ const release = await this.mutex.acquire();
177
+ try {
178
+ this.logger.info("Entering setScanStarted");
179
+ copy = _.cloneDeep(this.db.getState());
180
+ this.db.set('isInitial', false).write();
181
+ }
182
+ catch (err) {
183
+ this.db.setState(copy);
184
+ this.logger.error("setScanStarted", "err", (0, utils_1.formatError)(err));
185
+ }
186
+ finally {
187
+ release();
188
+ }
189
+ }
190
+ async getScanStatus() {
191
+ let copy = {};
192
+ const release = await this.mutex.acquire();
193
+ try {
194
+ this.logger.info("Entering getScanStatus");
195
+ copy = _.cloneDeep(this.db.getState());
196
+ return this.db.get('isInitial').value();
197
+ }
198
+ catch (err) {
199
+ this.db.setState(copy);
200
+ this.logger.error("setScanStarted", "err", (0, utils_1.formatError)(err));
201
+ }
202
+ finally {
203
+ release();
204
+ }
205
+ }
206
+ async scanFun() {
207
+ try {
208
+ let tasks = await this.getTasks();
209
+ this.logger.info("scanFun", "dbName", this.dbName, "tasks", JSON.stringify(tasks, utils_1.bigIntReplacer));
210
+ let retTasks = await this.scanTonTxByTasks(tasks);
211
+ await this.updateTask(retTasks);
212
+ }
213
+ catch (err) {
214
+ this.logger.error("scanFun", "scanFun", "dbName", this.dbName, "scanFun", "err", (0, utils_1.formatError)(err));
215
+ }
216
+ }
217
+ // scan history and increased new trans into db.
218
+ async feedTrans() {
219
+ this.logger.info("Entering feedTrans..............", this.dbName);
220
+ let randInternal = await (0, crypto_1.getSecureRandomNumber)(const_value_1.MIN_SCAN_INTER, const_value_1.MAX_SCAN_INTER);
221
+ this.logger.info("feedTrans..............", this.dbName, "randInternal", randInternal);
222
+ let scanInit = await this.getScanStatus();
223
+ if (scanInit) {
224
+ await this.setScanStarted();
225
+ }
226
+ let isRunning = false;
227
+ //let isRunning = true;
228
+ setInterval(async () => {
229
+ this.logger.info(`***************************Entering feedTrans setInterval ${this.dbName} isRunning: ${isRunning}`);
230
+ if (isRunning)
231
+ return;
232
+ isRunning = true;
233
+ try {
234
+ this.logger.info(`***************************feedTrans is working**************************************`, this.dbName, "isRunning", isRunning);
235
+ await this.scanFun();
236
+ }
237
+ catch (e) {
238
+ this.logger.error("feedTrans error", (0, utils_1.formatError)(e));
239
+ }
240
+ finally {
241
+ this.logger.info("**************************finish one round feedTrans********************************", this.dbName, "isRunning:", isRunning, "\n\n\n");
242
+ isRunning = false;
243
+ }
244
+ }, randInternal);
245
+ }
246
+ async scanTonTxByTasks(tasks) {
247
+ this.logger.info("entering scanTonTxByTasks:", this.dbName, "tasks", JSON.stringify(tasks, utils_1.bigIntReplacer));
248
+ let retTask = [];
249
+ for (let i = tasks.length - 1; i >= 0; i--) {
250
+ try {
251
+ this.logger.info("----------------------before scanTonTxByTask--------------", "input task", tasks[i]);
252
+ let retOneTask = await this.scanTonTxByTask(tasks[i]);
253
+ this.logger.info("----------------------after scanTonTxByTask--------------", "output tasks", retOneTask, "input task", tasks[i]);
254
+ retTask.push(...retOneTask);
255
+ }
256
+ catch (err) {
257
+ this.logger.error("scanTonTxByTasks err", (0, utils_1.formatError)(err));
258
+ retTask.push(tasks[i]);
259
+ }
260
+ }
261
+ return retTask;
262
+ }
263
+ async scanTonTxByTask(task) {
264
+ this.logger.info("scanTonTxByTask", "before getClient");
265
+ let client = await (0, client_1.getClient)();
266
+ this.logger.info("scanTonTxByTask", "end getClient");
267
+ let rawAddr = core_1.Address.parseFriendly(this.dbName).address;
268
+ this.logger.info("entering scanTonTxByTask:", this.dbName, "rawAddr", rawAddr, "task", JSON.stringify(task, utils_1.bigIntReplacer), "typeof task.rangeStart", typeof task.rangeStart);
269
+ let rangeStartLt = BigInt(0);
270
+ let rangeEndLt = BigInt(0);
271
+ if (typeof task.rangeStart === "string") {
272
+ let strTemp = String(task.rangeStart);
273
+ rangeStartLt = strTemp[strTemp.length - 1] == 'n' ? BigInt(strTemp.slice(0, strTemp.length - 1)) : BigInt(strTemp);
274
+ }
275
+ if (typeof task.rangeStart === "bigint") {
276
+ rangeStartLt = task.rangeStart;
277
+ }
278
+ if (typeof task.rangeEnd === "string") {
279
+ let strTemp = String(task.rangeEnd);
280
+ rangeEndLt = strTemp[strTemp.length - 1] == 'n' ? BigInt(strTemp.slice(0, strTemp.length - 1)) : BigInt(strTemp);
281
+ }
282
+ if (typeof task.rangeEnd === "bigint") {
283
+ rangeEndLt = task.rangeEnd;
284
+ }
285
+ if (rangeEndLt >= maxLt) {
286
+ let tranPovit = null;
287
+ //need split one task to two task by povilt trans.
288
+ let optsOne = {
289
+ limit: 1,
290
+ archival: true,
291
+ };
292
+ let scAddress = core_1.Address.parse(this.dbName);
293
+ try {
294
+ let getSuccess = false;
295
+ let maxRetry = const_value_1.MAX_RETRY;
296
+ while ((maxRetry-- > 0) && (!getSuccess)) {
297
+ try {
298
+ //let trans = await client.getTransactions(scAddress, optsOne)
299
+ let trans = await client.getTransactions(rawAddr, optsOne);
300
+ getSuccess = true;
301
+ this.logger.info("get transcations one", "optsOne", optsOne, "pivolt tran hash", trans[0].hash().toString('hex'));
302
+ tranPovit = trans[0];
303
+ }
304
+ catch (e) {
305
+ this.logger.error("get transcations one err ", (0, utils_1.formatError)(e));
306
+ await (0, utils_1.sleep)(const_value_1.RETRY_INTERNAL_TIME);
307
+ }
308
+ }
309
+ if (maxRetry < 0) {
310
+ this.logger.info(" get transcations one maxRetry == 0, before throw err");
311
+ throw new Error(util_1.default.format("fail by max_retry getTransactions one failed after %d retry. opts is %s", const_value_1.MAX_RETRY, JSON.stringify(optsOne)));
312
+ }
313
+ await (0, utils_1.sleep)(const_value_1.RETRY_INTERNAL_TIME);
314
+ }
315
+ catch (err) {
316
+ this.logger.error("err", (0, utils_1.formatError)(err));
317
+ throw err;
318
+ }
319
+ finally {
320
+ client = null;
321
+ }
322
+ let retTask = [];
323
+ if (tranPovit?.lt > rangeStartLt) {
324
+ retTask.push({
325
+ //rangeStart:tranPovit?.lt - BigInt(MAX_BACKTRACE_SECONDS) > rangeStartLt ? tranPovit?.lt-BigInt(MAX_BACKTRACE_SECONDS) : rangeStartLt,
326
+ rangeStart: rangeStartLt,
327
+ rangeEnd: tranPovit?.lt,
328
+ rangeEndHash: tranPovit?.hash().toString('base64'),
329
+ rangeOpen: RangeOpen.CloseRange,
330
+ });
331
+ }
332
+ retTask.push({
333
+ rangeStart: tranPovit?.lt.toString(10),
334
+ rangeEnd: rangeEndLt,
335
+ rangeOpen: RangeOpen.CloseRange,
336
+ });
337
+ return retTask;
338
+ }
339
+ let rangeOpen = task.rangeOpen;
340
+ let retTask = [];
341
+ let maxScanedLt = rangeStartLt;
342
+ let minScanedLt = rangeEndLt;
343
+ let minScannedHash = '';
344
+ let trans = [];
345
+ let transCount = const_value_1.MAX_LIMIT;
346
+ let limit = const_value_1.MAX_LIMIT;
347
+ let maxRetry = const_value_1.MAX_RETRY;
348
+ let retry = const_value_1.MAX_RETRY;
349
+ let needSlitRange = false;
350
+ let opts = {
351
+ limit,
352
+ archival: true,
353
+ to_lt: rangeStartLt.toString(10),
354
+ lt: rangeEndLt.toString(10),
355
+ hash: task.rangeEndHash,
356
+ inclusive: true,
357
+ };
358
+ let scAddress = core_1.Address.parse(this.dbName);
359
+ let retraced = false;
360
+ let nowTimeStamp = Math.floor((new Date()).getTime() / 1000);
361
+ let oldestTimeStamp = nowTimeStamp;
362
+ try {
363
+ while (transCount && !retraced) {
364
+ let getSuccess = false;
365
+ let insertSuccess = false;
366
+ let oldMaxScaanedLt = maxScanedLt;
367
+ let oldMinScanedLt = minScanedLt;
368
+ while ((maxRetry-- > 0) && (!getSuccess || !insertSuccess)) {
369
+ try {
370
+ this.logger.info("maxRetry = %s, getSuccess = %s, insertSuccess=%s,transCount = %s, dbName = %s opts = %s", maxRetry, getSuccess, insertSuccess, transCount, scAddress.toString(), JSON.stringify(opts, utils_1.bigIntReplacer));
371
+ let ret = await client.getTransactions(rawAddr, opts);
372
+ getSuccess = true;
373
+ transCount = ret.length;
374
+ this.logger.info("scanTonTxByTask getTransactions success from rpc", "opts", JSON.stringify(opts, utils_1.bigIntReplacer), "len of getTransactions", transCount, "dbName", this.dbName);
375
+ for (let tran of ret) {
376
+ this.logger.info("(scanTonTxByTask) =====> tranHash = %s lt = %s", tran.hash().toString('base64'), tran.lt.toString(10), "dbName", this.dbName);
377
+ trans.push(tran);
378
+ }
379
+ if (ret.length) {
380
+ opts.lt = ret[ret.length - 1].lt.toString(10);
381
+ opts.hash = ret[ret.length - 1].hash().toString('base64');
382
+ maxScanedLt = ret[0].lt > maxScanedLt ? ret[0].lt : maxScanedLt;
383
+ minScanedLt = ret[ret.length - 1].lt < minScanedLt ? ret[ret.length - 1].lt : minScanedLt;
384
+ minScannedHash = ret[ret.length - 1].hash().toString('base64');
385
+ let cci = ret[ret.length - 1].inMessage.info;
386
+ //this.logger.info("cci=>",cci);
387
+ if (cci?.createdAt) {
388
+ oldestTimeStamp = cci.createdAt;
389
+ }
390
+ }
391
+ this.logger.info("maxScanedLt", maxScanedLt, "minScanedLt", minScanedLt, "scAddress or dbName", this.dbName);
392
+ let tonTrans = [];
393
+ this.logger.info("before convertTranToTonTrans", "db", this.dbName, "trans.length", trans?.length);
394
+ tonTrans = (0, common_1.convertTranToTonTrans)(trans);
395
+ this.logger.info("before insertTrans", "db", this.dbName, "tonTrans.length", tonTrans?.length);
396
+ await this.insertTrans(tonTrans);
397
+ trans = [];
398
+ insertSuccess = true;
399
+ maxRetry = retry;
400
+ this.logger.info("scanTonTxByTask", "oldestTimeStamp", oldestTimeStamp, "MAX_BACKTRACE_SECONDS", const_value_1.MAX_BACKTRACE_SECONDS, "nowTimeStamp", nowTimeStamp);
401
+ if (BigInt(oldestTimeStamp) + BigInt(const_value_1.MAX_BACKTRACE_SECONDS) < BigInt(nowTimeStamp)) {
402
+ retraced = true;
403
+ this.logger.info("scan finish because other are too older.");
404
+ break;
405
+ }
406
+ }
407
+ catch (e) {
408
+ maxScanedLt = oldMaxScaanedLt;
409
+ minScanedLt = oldMinScanedLt;
410
+ this.logger.error("err ", (0, utils_1.formatError)(e));
411
+ await (0, utils_1.sleep)(const_value_1.RETRY_INTERNAL_TIME);
412
+ }
413
+ }
414
+ if (maxRetry < 0) {
415
+ this.logger.info("maxRetry == 0, before throw err.XXXXXXXXXXXXXXX");
416
+ throw new Error(util_1.default.format("fail by max_retry getTransactions failed after %d retry. opts is %s", retry, JSON.stringify(opts)));
417
+ }
418
+ await (0, utils_1.sleep)(const_value_1.RETRY_INTERNAL_TIME);
419
+ this.logger.info("last loop transCount", transCount, "retry", maxRetry);
420
+ }
421
+ }
422
+ catch (err) {
423
+ this.logger.error("err", (0, utils_1.formatError)(err));
424
+ needSlitRange = true;
425
+ }
426
+ finally {
427
+ client = null;
428
+ }
429
+ if (transCount == 0 || retraced) {
430
+ this.logger.info("scan success", "startLt", rangeStartLt.toString(10), "endLt", rangeEndLt.toString(10), "rangeOpen", rangeOpen);
431
+ return retTask;
432
+ }
433
+ this.logger.info("minScanedLt", minScanedLt, "maxScanedLt", maxScanedLt, "rangeStartLt", rangeStartLt, "rangeEndLt", rangeEndLt);
434
+ if (maxScanedLt == rangeStartLt) { // no one tran scanned.
435
+ retTask.push(task);
436
+ return retTask;
437
+ }
438
+ if (needSlitRange) { // shrink the range
439
+ if (rangeStartLt < minScanedLt) {
440
+ retTask.push({
441
+ rangeStart: rangeStartLt,
442
+ rangeEnd: minScanedLt,
443
+ rangeEndHash: minScannedHash,
444
+ rangeOpen: RangeOpen.CloseRange,
445
+ });
446
+ }
447
+ }
448
+ this.logger.info(`after scanTonTxByTask, task`, JSON.stringify(retTask, utils_1.bigIntReplacer), "dbName", this.dbName);
449
+ return retTask;
450
+ }
451
+ async clearDb() {
452
+ this.db.setState({}).write();
453
+ await (0, utils_1.removeFile)(this.fullFileName);
454
+ }
455
+ /////////////////////////////////////
456
+ // read db
457
+ /////////////////////////////////////
458
+ async getAllTransNotHandled() {
459
+ let copy = {};
460
+ const release = await this.mutex.acquire();
461
+ try {
462
+ this.logger.info("getAllTransNotHandled");
463
+ copy = _.cloneDeep(this.db.get('trans').value());
464
+ }
465
+ catch (err) {
466
+ this.logger.error("getAllTransNotHandled", "err", (0, utils_1.formatError)(err));
467
+ }
468
+ finally {
469
+ release();
470
+ }
471
+ let result = [];
472
+ try {
473
+ result = _.filter(copy, (item) => {
474
+ return (item.emitEventOrNot == false);
475
+ });
476
+ }
477
+ catch (err) {
478
+ this.logger.error("getAllTransNotHandled error", "dbName", this.dbName, "err", (0, utils_1.formatError)(err));
479
+ }
480
+ finally {
481
+ copy = null;
482
+ }
483
+ return result;
484
+ }
485
+ async getTasks() {
486
+ const release = await this.mutex.acquire();
487
+ try {
488
+ this.logger.info("getTasks");
489
+ return _.cloneDeep(this.db.get("scanTasks").value());
490
+ }
491
+ catch (err) {
492
+ this.logger.info("getTasks", "err", (0, utils_1.formatError)(err));
493
+ }
494
+ finally {
495
+ release();
496
+ }
497
+ }
498
+ async getParentTx(tran) {
499
+ //this.logger.info("before getParentTx","dbName",this.dbName,"hash",tran.hash,"lt",tran.lt,"tonTran",JSON.stringify(tran,bigIntReplacer));
500
+ this.logger.info("before getParentTx", "dbName", this.dbName, "hash", tran.hash, "lt", tran.lt, "tran.in", JSON.stringify(tran.in, utils_1.bigIntReplacer), "tran.out", JSON.stringify(tran.out, utils_1.bigIntReplacer));
501
+ if (!tran) {
502
+ return null;
503
+ }
504
+ let copy = {};
505
+ const release = await this.mutex.acquire();
506
+ try {
507
+ copy = _.cloneDeep(this.db.get('trans').value());
508
+ }
509
+ catch (err) {
510
+ this.logger.error("getParentTx", "err", (0, utils_1.formatError)(err));
511
+ }
512
+ finally {
513
+ release();
514
+ }
515
+ let result = [];
516
+ try {
517
+ result = _.filter(copy, (tonTran) => {
518
+ return _.some(tonTran.out, (item) => {
519
+ return (((0, utils_1.isAddressEqual)(this.dbName, tran.in.src) && BigInt(item.createdLt) === tran.in.createdLt) &&
520
+ ((item.outMsgHash === tran.in.inMsgHash) || (item.outBodyHash == tran.in.inBodyHash)));
521
+ });
522
+ });
523
+ }
524
+ catch (err) {
525
+ this.logger.error("error getParentTx", "err", (0, utils_1.formatError)(err));
526
+ }
527
+ finally {
528
+ copy = null;
529
+ }
530
+ if (result && result.length > 0) {
531
+ this.logger.info("after getParentTx", "tran hash", tran.hash, "result", result, "parent hash", result[0].hash, "dbName", this.dbName);
532
+ }
533
+ else {
534
+ this.logger.error("after getParentTx (no parent found)", "tran hash", tran.hash, "dbName", this.dbName);
535
+ }
536
+ return result;
537
+ }
538
+ async getChildTxs(tran) {
539
+ let copy = {};
540
+ const release = await this.mutex.acquire();
541
+ try {
542
+ this.logger.info("getChildTxs");
543
+ copy = _.cloneDeep(this.db.get('trans').value());
544
+ }
545
+ catch (err) {
546
+ this.logger.error("getChildTxs", "err", (0, utils_1.formatError)(err));
547
+ }
548
+ finally {
549
+ release();
550
+ }
551
+ let result = [];
552
+ this.logger.info("getChildTxs", "db", this.dbName, "tran", tran);
553
+ try {
554
+ for (let i = 0; i < tran.out.length; i++) {
555
+ this.logger.info("getChildTxs", "db", this.dbName, `tran${i}.out`, tran[i].out);
556
+ let oneTran = _.filter(copy, (item) => {
557
+ return ((0, utils_1.isAddressEqual)(item.in.src, tran.out[i].dst) &&
558
+ (item.in.inMsgHash == tran.out[i].outMsgHash || item.in.inBodyHash == tran.out[i].outBodyHash) &&
559
+ BigInt(item.in.createdLt) == tran.out[i].createdLt);
560
+ });
561
+ result.push(...oneTran);
562
+ }
563
+ }
564
+ catch (err) {
565
+ this.logger.error("getChildTxs err", (0, utils_1.formatError)(err));
566
+ }
567
+ finally {
568
+ copy = null;
569
+ }
570
+ return result;
571
+ }
572
+ async getTxByTxHash(txHash) {
573
+ let copy = {};
574
+ const release = await this.mutex.acquire();
575
+ try {
576
+ this.logger.info("getChildTxs");
577
+ copy = _.cloneDeep(this.db.get('trans').value());
578
+ }
579
+ catch (err) {
580
+ this.logger.error("getChildTxs", "err", (0, utils_1.formatError)(err));
581
+ }
582
+ finally {
583
+ release();
584
+ }
585
+ let result = null;
586
+ try {
587
+ result = _.filter(copy, (item) => {
588
+ return (item.hash == txHash);
589
+ });
590
+ }
591
+ catch (err) {
592
+ this.logger.error("getTxByTxHash error", "txHash", txHash, "dbName", this.dbName, "err", (0, utils_1.formatError)(err));
593
+ }
594
+ finally {
595
+ copy = null;
596
+ }
597
+ return result;
598
+ }
599
+ async getTxByHashLt(txHash, lt) {
600
+ let copy = {};
601
+ const release = await this.mutex.acquire();
602
+ try {
603
+ this.logger.info("getTxByHashLt");
604
+ copy = _.cloneDeep(this.db.get('trans').value());
605
+ }
606
+ catch (err) {
607
+ this.logger.error("getTxByHashLt", "err", (0, utils_1.formatError)(err), "txHash", txHash, "lt", lt);
608
+ }
609
+ finally {
610
+ release();
611
+ }
612
+ let result = null;
613
+ try {
614
+ this.logger.info("getTxByHashLt", "txHash", txHash, "lt", lt, "dbName", this.dbName);
615
+ result = _.filter(copy, (item) => {
616
+ return ((item.hash == txHash) && item.lt == lt);
617
+ });
618
+ }
619
+ catch (err) {
620
+ this.logger.error("getTxByHashLt", "err", (0, utils_1.formatError)(err), "txHash", txHash, "lt", lt, "dbName", this.dbName);
621
+ }
622
+ finally {
623
+ copy = null;
624
+ }
625
+ return result;
626
+ }
627
+ async getTxsByLtRange(lt, to_lt) {
628
+ let copy = {};
629
+ const release = await this.mutex.acquire();
630
+ try {
631
+ this.logger.info("getTxByHashLt");
632
+ copy = _.cloneDeep(this.db.get('trans').value());
633
+ }
634
+ catch (err) {
635
+ this.logger.error("getTxsByLtRange", "err", (0, utils_1.formatError)(err), "to_lt", to_lt, "lt", lt);
636
+ }
637
+ finally {
638
+ release();
639
+ }
640
+ let result = null;
641
+ try {
642
+ this.logger.info("getTxsByLtRange", "lt", lt, "dbName", this.dbName, "to_lt", to_lt);
643
+ result = _.filter(copy, (item) => {
644
+ return ((item.lt > to_lt) && item.lt <= lt);
645
+ });
646
+ }
647
+ catch (err) {
648
+ this.logger.error("getTxsByLtRange", "err", (0, utils_1.formatError)(err), "to_lt", to_lt, "lt", lt, "dbName", this.dbName);
649
+ }
650
+ finally {
651
+ copy = null;
652
+ }
653
+ return result;
654
+ }
655
+ async getAllTransNotHandledByRange(lt, to_lt) {
656
+ let copy = {};
657
+ const release = await this.mutex.acquire();
658
+ try {
659
+ this.logger.info("getAllTransNotHandledByRange");
660
+ copy = _.cloneDeep(this.db.get('trans').value());
661
+ }
662
+ catch (err) {
663
+ this.logger.error("getAllTransNotHandledByRange", "err", (0, utils_1.formatError)(err), "to_lt", to_lt, "lt", lt);
664
+ }
665
+ finally {
666
+ release();
667
+ }
668
+ let result = null;
669
+ try {
670
+ this.logger.info("getAllTransNotHandledByRange", "lt", lt, "dbName", this.dbName, "to_lt", to_lt);
671
+ result = _.filter(copy, (item) => {
672
+ return ((item.lt > to_lt) && item.lt <= lt) && (item.emitEventOrNot == false);
673
+ });
674
+ }
675
+ catch (err) {
676
+ this.logger.error("getAllTransNotHandledByRange", "err", (0, utils_1.formatError)(err), "to_lt", to_lt, "lt", lt, "dbName", this.dbName);
677
+ }
678
+ finally {
679
+ copy = null;
680
+ }
681
+ return result;
682
+ }
683
+ async getTxByMsg(msgHash, bodyHash, lt) {
684
+ let copy = {};
685
+ const release = await this.mutex.acquire();
686
+ try {
687
+ this.logger.info("getTxByMsg");
688
+ copy = _.cloneDeep(this.db.get('trans').value());
689
+ }
690
+ catch (err) {
691
+ this.logger.error("getTxByMsg", "err", (0, utils_1.formatError)(err), "dbName", this.dbName, "msgHash", msgHash, "bodyHash", bodyHash, "lt", lt.toString(10));
692
+ }
693
+ finally {
694
+ release();
695
+ }
696
+ let result = [];
697
+ try {
698
+ result = _.filter(copy, (item) => {
699
+ return ((item.in.inMsgHash == msgHash || item.in.inBodyHash == bodyHash) &&
700
+ BigInt(item.in.createdLt) == lt);
701
+ });
702
+ }
703
+ catch (err) {
704
+ this.logger.error("getTxByMsg", "err", (0, utils_1.formatError)(err), "dbName", this.dbName, "msgHash", msgHash, "bodyHash", bodyHash, "lt", lt.toString(10));
705
+ }
706
+ finally {
707
+ copy = null;
708
+ }
709
+ return result;
710
+ }
711
+ async getTxByOnlyMsgHash(msgHash) {
712
+ let copy = {};
713
+ const release = await this.mutex.acquire();
714
+ try {
715
+ this.logger.info("getTxByMsg");
716
+ copy = _.cloneDeep(this.db.get('trans').value());
717
+ }
718
+ catch (err) {
719
+ this.logger.error("getTxByOnlyMsgHash", "err", (0, utils_1.formatError)(err), "dbName", this.dbName, "msgHash", msgHash);
720
+ }
721
+ finally {
722
+ release();
723
+ }
724
+ let result = [];
725
+ try {
726
+ result = _.filter(copy, (item) => {
727
+ return ((item.in.inMsgHash == msgHash));
728
+ });
729
+ }
730
+ catch (err) {
731
+ this.logger.info("getTxByOnlyMsgHash", "err", (0, utils_1.formatError)(err), "dbName", this.dbName, "msgHash");
732
+ }
733
+ finally {
734
+ copy = null;
735
+ }
736
+ return result;
737
+ }
738
+ }
739
+ exports.DB = DB;