@matrix-privacy/wallet 0.0.1

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 (270) hide show
  1. package/.eslintrc.js +73 -0
  2. package/.prettierrc.js +21 -0
  3. package/LICENSE +21 -0
  4. package/README.md +7 -0
  5. package/dist/__tests__/index.test.d.ts +1 -0
  6. package/dist/__tests__/index.test.js +13 -0
  7. package/dist/__tests__/index.test.js.map +1 -0
  8. package/dist/index.d.ts +4 -0
  9. package/dist/index.js +20 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/services/artifacts/__tests__/artifact-downloader.test.d.ts +1 -0
  12. package/dist/services/artifacts/__tests__/artifact-downloader.test.js +172 -0
  13. package/dist/services/artifacts/__tests__/artifact-downloader.test.js.map +1 -0
  14. package/dist/services/artifacts/artifact-downloader.d.ts +13 -0
  15. package/dist/services/artifacts/artifact-downloader.js +142 -0
  16. package/dist/services/artifacts/artifact-downloader.js.map +1 -0
  17. package/dist/services/artifacts/artifact-hash.d.ts +3 -0
  18. package/dist/services/artifacts/artifact-hash.js +53 -0
  19. package/dist/services/artifacts/artifact-hash.js.map +1 -0
  20. package/dist/services/artifacts/artifact-store.d.ts +11 -0
  21. package/dist/services/artifacts/artifact-store.js +15 -0
  22. package/dist/services/artifacts/artifact-store.js.map +1 -0
  23. package/dist/services/artifacts/artifact-util.d.ts +7 -0
  24. package/dist/services/artifacts/artifact-util.js +64 -0
  25. package/dist/services/artifacts/artifact-util.js.map +1 -0
  26. package/dist/services/artifacts/index.d.ts +2 -0
  27. package/dist/services/artifacts/index.js +19 -0
  28. package/dist/services/artifacts/index.js.map +1 -0
  29. package/dist/services/artifacts/json/artifact-v2-hashes.json +467 -0
  30. package/dist/services/ethers/__tests__/ethers-util.test.d.ts +1 -0
  31. package/dist/services/ethers/__tests__/ethers-util.test.js +19 -0
  32. package/dist/services/ethers/__tests__/ethers-util.test.js.map +1 -0
  33. package/dist/services/ethers/ethers-util.d.ts +1 -0
  34. package/dist/services/ethers/ethers-util.js +9 -0
  35. package/dist/services/ethers/ethers-util.js.map +1 -0
  36. package/dist/services/ethers/index.d.ts +1 -0
  37. package/dist/services/ethers/index.js +18 -0
  38. package/dist/services/ethers/index.js.map +1 -0
  39. package/dist/services/index.d.ts +4 -0
  40. package/dist/services/index.js +21 -0
  41. package/dist/services/index.js.map +1 -0
  42. package/dist/services/matrix/core/__tests__/engine.test.d.ts +1 -0
  43. package/dist/services/matrix/core/__tests__/engine.test.js +30 -0
  44. package/dist/services/matrix/core/__tests__/engine.test.js.map +1 -0
  45. package/dist/services/matrix/core/__tests__/providers.test.d.ts +1 -0
  46. package/dist/services/matrix/core/__tests__/providers.test.js +54 -0
  47. package/dist/services/matrix/core/__tests__/providers.test.js.map +1 -0
  48. package/dist/services/matrix/core/artifacts.d.ts +10 -0
  49. package/dist/services/matrix/core/artifacts.js +70 -0
  50. package/dist/services/matrix/core/artifacts.js.map +1 -0
  51. package/dist/services/matrix/core/engine.d.ts +4 -0
  52. package/dist/services/matrix/core/engine.js +21 -0
  53. package/dist/services/matrix/core/engine.js.map +1 -0
  54. package/dist/services/matrix/core/index.d.ts +8 -0
  55. package/dist/services/matrix/core/index.js +25 -0
  56. package/dist/services/matrix/core/index.js.map +1 -0
  57. package/dist/services/matrix/core/init.d.ts +21 -0
  58. package/dist/services/matrix/core/init.js +79 -0
  59. package/dist/services/matrix/core/init.js.map +1 -0
  60. package/dist/services/matrix/core/load-provider.d.ts +9 -0
  61. package/dist/services/matrix/core/load-provider.js +100 -0
  62. package/dist/services/matrix/core/load-provider.js.map +1 -0
  63. package/dist/services/matrix/core/merkletree.d.ts +5 -0
  64. package/dist/services/matrix/core/merkletree.js +40 -0
  65. package/dist/services/matrix/core/merkletree.js.map +1 -0
  66. package/dist/services/matrix/core/prover.d.ts +3 -0
  67. package/dist/services/matrix/core/prover.js +14 -0
  68. package/dist/services/matrix/core/prover.js.map +1 -0
  69. package/dist/services/matrix/core/providers.d.ts +9 -0
  70. package/dist/services/matrix/core/providers.js +31 -0
  71. package/dist/services/matrix/core/providers.js.map +1 -0
  72. package/dist/services/matrix/core/shields.d.ts +11 -0
  73. package/dist/services/matrix/core/shields.js +24 -0
  74. package/dist/services/matrix/core/shields.js.map +1 -0
  75. package/dist/services/matrix/history/__tests__/transaction-history.test.d.ts +1 -0
  76. package/dist/services/matrix/history/__tests__/transaction-history.test.js +249 -0
  77. package/dist/services/matrix/history/__tests__/transaction-history.test.js.map +1 -0
  78. package/dist/services/matrix/history/transaction-history.d.ts +4 -0
  79. package/dist/services/matrix/history/transaction-history.js +182 -0
  80. package/dist/services/matrix/history/transaction-history.js.map +1 -0
  81. package/dist/services/matrix/index.d.ts +4 -0
  82. package/dist/services/matrix/index.js +21 -0
  83. package/dist/services/matrix/index.js.map +1 -0
  84. package/dist/services/matrix/process/extract-transaction-data.d.ts +3 -0
  85. package/dist/services/matrix/process/extract-transaction-data.js +19 -0
  86. package/dist/services/matrix/process/extract-transaction-data.js.map +1 -0
  87. package/dist/services/matrix/process/index.d.ts +1 -0
  88. package/dist/services/matrix/process/index.js +18 -0
  89. package/dist/services/matrix/process/index.js.map +1 -0
  90. package/dist/services/matrix/quick-sync/V3/__tests__/quick-sync-events-graph-v3.test.d.ts +1 -0
  91. package/dist/services/matrix/quick-sync/V3/__tests__/quick-sync-events-graph-v3.test.js +56 -0
  92. package/dist/services/matrix/quick-sync/V3/__tests__/quick-sync-events-graph-v3.test.js.map +1 -0
  93. package/dist/services/matrix/quick-sync/V3/graph-type-formatters-v3.d.ts +8 -0
  94. package/dist/services/matrix/quick-sync/V3/graph-type-formatters-v3.js +103 -0
  95. package/dist/services/matrix/quick-sync/V3/graph-type-formatters-v3.js.map +1 -0
  96. package/dist/services/matrix/quick-sync/V3/graphql/.graphclient/sources/mumbai/introspectionSchema.d.ts +2 -0
  97. package/dist/services/matrix/quick-sync/V3/graphql/.graphclient/sources/mumbai/introspectionSchema.js +19861 -0
  98. package/dist/services/matrix/quick-sync/V3/graphql/.graphclient/sources/mumbai/introspectionSchema.js.map +1 -0
  99. package/dist/services/matrix/quick-sync/V3/graphql/.graphclient/sources/mumbai/types.d.ts +1352 -0
  100. package/dist/services/matrix/quick-sync/V3/graphql/.graphclient/sources/mumbai/types.js +4 -0
  101. package/dist/services/matrix/quick-sync/V3/graphql/.graphclient/sources/mumbai/types.js.map +1 -0
  102. package/dist/services/matrix/quick-sync/V3/graphql/index.d.ts +1680 -0
  103. package/dist/services/matrix/quick-sync/V3/graphql/index.js +348 -0
  104. package/dist/services/matrix/quick-sync/V3/graphql/index.js.map +1 -0
  105. package/dist/services/matrix/quick-sync/V3/quick-sync-events-graph-v3.d.ts +2 -0
  106. package/dist/services/matrix/quick-sync/V3/quick-sync-events-graph-v3.js +99 -0
  107. package/dist/services/matrix/quick-sync/V3/quick-sync-events-graph-v3.js.map +1 -0
  108. package/dist/services/matrix/quick-sync/graph-query.d.ts +5 -0
  109. package/dist/services/matrix/quick-sync/graph-query.js +26 -0
  110. package/dist/services/matrix/quick-sync/graph-query.js.map +1 -0
  111. package/dist/services/matrix/quick-sync/quick-sync-events.d.ts +2 -0
  112. package/dist/services/matrix/quick-sync/quick-sync-events.js +9 -0
  113. package/dist/services/matrix/quick-sync/quick-sync-events.js.map +1 -0
  114. package/dist/services/matrix/quick-sync/shared-formatters.d.ts +8 -0
  115. package/dist/services/matrix/quick-sync/shared-formatters.js +36 -0
  116. package/dist/services/matrix/quick-sync/shared-formatters.js.map +1 -0
  117. package/dist/services/matrix/util/__tests__/bytes-util.test.d.ts +1 -0
  118. package/dist/services/matrix/util/__tests__/bytes-util.test.js +23 -0
  119. package/dist/services/matrix/util/__tests__/bytes-util.test.js.map +1 -0
  120. package/dist/services/matrix/util/__tests__/crypto-util.test.d.ts +1 -0
  121. package/dist/services/matrix/util/__tests__/crypto-util.test.js +62 -0
  122. package/dist/services/matrix/util/__tests__/crypto-util.test.js.map +1 -0
  123. package/dist/services/matrix/util/bytes.d.ts +5 -0
  124. package/dist/services/matrix/util/bytes.js +22 -0
  125. package/dist/services/matrix/util/bytes.js.map +1 -0
  126. package/dist/services/matrix/util/crypto.d.ts +14 -0
  127. package/dist/services/matrix/util/crypto.js +80 -0
  128. package/dist/services/matrix/util/crypto.js.map +1 -0
  129. package/dist/services/matrix/util/graph-util.d.ts +3 -0
  130. package/dist/services/matrix/util/graph-util.js +13 -0
  131. package/dist/services/matrix/util/graph-util.js.map +1 -0
  132. package/dist/services/matrix/util/index.d.ts +2 -0
  133. package/dist/services/matrix/util/index.js +19 -0
  134. package/dist/services/matrix/util/index.js.map +1 -0
  135. package/dist/services/matrix/util/runtime.d.ts +2 -0
  136. package/dist/services/matrix/util/runtime.js +8 -0
  137. package/dist/services/matrix/util/runtime.js.map +1 -0
  138. package/dist/services/matrix/wallets/__tests__/balances-live.test.d.ts +1 -0
  139. package/dist/services/matrix/wallets/__tests__/balances-live.test.js +48 -0
  140. package/dist/services/matrix/wallets/__tests__/balances-live.test.js.map +1 -0
  141. package/dist/services/matrix/wallets/__tests__/balances-update.test.d.ts +1 -0
  142. package/dist/services/matrix/wallets/__tests__/balances-update.test.js +85 -0
  143. package/dist/services/matrix/wallets/__tests__/balances-update.test.js.map +1 -0
  144. package/dist/services/matrix/wallets/__tests__/balances.test.d.ts +1 -0
  145. package/dist/services/matrix/wallets/__tests__/balances.test.js +59 -0
  146. package/dist/services/matrix/wallets/__tests__/balances.test.js.map +1 -0
  147. package/dist/services/matrix/wallets/__tests__/wallets.test.d.ts +1 -0
  148. package/dist/services/matrix/wallets/__tests__/wallets.test.js +80 -0
  149. package/dist/services/matrix/wallets/__tests__/wallets.test.js.map +1 -0
  150. package/dist/services/matrix/wallets/balance-update.d.ts +10 -0
  151. package/dist/services/matrix/wallets/balance-update.js +126 -0
  152. package/dist/services/matrix/wallets/balance-update.js.map +1 -0
  153. package/dist/services/matrix/wallets/balances.d.ts +3 -0
  154. package/dist/services/matrix/wallets/balances.js +32 -0
  155. package/dist/services/matrix/wallets/balances.js.map +1 -0
  156. package/dist/services/matrix/wallets/index.d.ts +4 -0
  157. package/dist/services/matrix/wallets/index.js +21 -0
  158. package/dist/services/matrix/wallets/index.js.map +1 -0
  159. package/dist/services/matrix/wallets/wallets.d.ts +22 -0
  160. package/dist/services/matrix/wallets/wallets.js +252 -0
  161. package/dist/services/matrix/wallets/wallets.js.map +1 -0
  162. package/dist/services/transactions/__tests__/json/formatted-relay-adapt-error-logs.json +216 -0
  163. package/dist/services/transactions/__tests__/proof-cache.test.d.ts +1 -0
  164. package/dist/services/transactions/__tests__/proof-cache.test.js +114 -0
  165. package/dist/services/transactions/__tests__/proof-cache.test.js.map +1 -0
  166. package/dist/services/transactions/__tests__/tx-cross-contract-calls.test.d.ts +1 -0
  167. package/dist/services/transactions/__tests__/tx-cross-contract-calls.test.js +376 -0
  168. package/dist/services/transactions/__tests__/tx-cross-contract-calls.test.js.map +1 -0
  169. package/dist/services/transactions/__tests__/tx-gas-details.test.d.ts +1 -0
  170. package/dist/services/transactions/__tests__/tx-gas-details.test.js +109 -0
  171. package/dist/services/transactions/__tests__/tx-gas-details.test.js.map +1 -0
  172. package/dist/services/transactions/__tests__/tx-notes.test.d.ts +1 -0
  173. package/dist/services/transactions/__tests__/tx-notes.test.js +193 -0
  174. package/dist/services/transactions/__tests__/tx-notes.test.js.map +1 -0
  175. package/dist/services/transactions/__tests__/tx-shield-base-token.test.d.ts +1 -0
  176. package/dist/services/transactions/__tests__/tx-shield-base-token.test.js +99 -0
  177. package/dist/services/transactions/__tests__/tx-shield-base-token.test.js.map +1 -0
  178. package/dist/services/transactions/__tests__/tx-shield.test.d.ts +1 -0
  179. package/dist/services/transactions/__tests__/tx-shield.test.js +146 -0
  180. package/dist/services/transactions/__tests__/tx-shield.test.js.map +1 -0
  181. package/dist/services/transactions/__tests__/tx-transfer.test.d.ts +1 -0
  182. package/dist/services/transactions/__tests__/tx-transfer.test.js +263 -0
  183. package/dist/services/transactions/__tests__/tx-transfer.test.js.map +1 -0
  184. package/dist/services/transactions/__tests__/tx-unshield.test.d.ts +1 -0
  185. package/dist/services/transactions/__tests__/tx-unshield.test.js +759 -0
  186. package/dist/services/transactions/__tests__/tx-unshield.test.js.map +1 -0
  187. package/dist/services/transactions/index.d.ts +13 -0
  188. package/dist/services/transactions/index.js +30 -0
  189. package/dist/services/transactions/index.js.map +1 -0
  190. package/dist/services/transactions/proof-cache.d.ts +27 -0
  191. package/dist/services/transactions/proof-cache.js +130 -0
  192. package/dist/services/transactions/proof-cache.js.map +1 -0
  193. package/dist/services/transactions/tx-cross-contract-calls.d.ts +12 -0
  194. package/dist/services/transactions/tx-cross-contract-calls.js +210 -0
  195. package/dist/services/transactions/tx-cross-contract-calls.js.map +1 -0
  196. package/dist/services/transactions/tx-gas-broadcaster-fee-estimator.d.ts +5 -0
  197. package/dist/services/transactions/tx-gas-broadcaster-fee-estimator.js +110 -0
  198. package/dist/services/transactions/tx-gas-broadcaster-fee-estimator.js.map +1 -0
  199. package/dist/services/transactions/tx-gas-details.d.ts +5 -0
  200. package/dist/services/transactions/tx-gas-details.js +101 -0
  201. package/dist/services/transactions/tx-gas-details.js.map +1 -0
  202. package/dist/services/transactions/tx-generator.d.ts +13 -0
  203. package/dist/services/transactions/tx-generator.js +168 -0
  204. package/dist/services/transactions/tx-generator.js.map +1 -0
  205. package/dist/services/transactions/tx-notes.d.ts +11 -0
  206. package/dist/services/transactions/tx-notes.js +153 -0
  207. package/dist/services/transactions/tx-notes.js.map +1 -0
  208. package/dist/services/transactions/tx-nullifiers.d.ts +2 -0
  209. package/dist/services/transactions/tx-nullifiers.js +17 -0
  210. package/dist/services/transactions/tx-nullifiers.js.map +1 -0
  211. package/dist/services/transactions/tx-proof-transfer.d.ts +3 -0
  212. package/dist/services/transactions/tx-proof-transfer.js +39 -0
  213. package/dist/services/transactions/tx-proof-transfer.js.map +1 -0
  214. package/dist/services/transactions/tx-proof-unshield.d.ts +5 -0
  215. package/dist/services/transactions/tx-proof-unshield.js +132 -0
  216. package/dist/services/transactions/tx-proof-unshield.js.map +1 -0
  217. package/dist/services/transactions/tx-shield-base-token.d.ts +3 -0
  218. package/dist/services/transactions/tx-shield-base-token.js +55 -0
  219. package/dist/services/transactions/tx-shield-base-token.js.map +1 -0
  220. package/dist/services/transactions/tx-shield.d.ts +6 -0
  221. package/dist/services/transactions/tx-shield.js +77 -0
  222. package/dist/services/transactions/tx-shield.js.map +1 -0
  223. package/dist/services/transactions/tx-transfer.d.ts +3 -0
  224. package/dist/services/transactions/tx-transfer.js +39 -0
  225. package/dist/services/transactions/tx-transfer.js.map +1 -0
  226. package/dist/services/transactions/tx-unshield.d.ts +11 -0
  227. package/dist/services/transactions/tx-unshield.js +224 -0
  228. package/dist/services/transactions/tx-unshield.js.map +1 -0
  229. package/dist/tests/local-e2e.d.ts +13 -0
  230. package/dist/tests/local-e2e.js +487 -0
  231. package/dist/tests/local-e2e.js.map +1 -0
  232. package/dist/tests/mocks.test.d.ts +40 -0
  233. package/dist/tests/mocks.test.js +171 -0
  234. package/dist/tests/mocks.test.js.map +1 -0
  235. package/dist/tests/setup.test.d.ts +7 -0
  236. package/dist/tests/setup.test.js +88 -0
  237. package/dist/tests/setup.test.js.map +1 -0
  238. package/dist/tests/stubs/engine-stubs.test.d.ts +7 -0
  239. package/dist/tests/stubs/engine-stubs.test.js +72 -0
  240. package/dist/tests/stubs/engine-stubs.test.js.map +1 -0
  241. package/dist/utils/__tests__/blocked-address.test.d.ts +1 -0
  242. package/dist/utils/__tests__/blocked-address.test.js +23 -0
  243. package/dist/utils/__tests__/blocked-address.test.js.map +1 -0
  244. package/dist/utils/__tests__/logger.test.d.ts +1 -0
  245. package/dist/utils/__tests__/logger.test.js +28 -0
  246. package/dist/utils/__tests__/logger.test.js.map +1 -0
  247. package/dist/utils/__tests__/utils.test.d.ts +1 -0
  248. package/dist/utils/__tests__/utils.test.js +21 -0
  249. package/dist/utils/__tests__/utils.test.js.map +1 -0
  250. package/dist/utils/blocked-address.d.ts +2 -0
  251. package/dist/utils/blocked-address.js +17 -0
  252. package/dist/utils/blocked-address.js.map +1 -0
  253. package/dist/utils/error.d.ts +1 -0
  254. package/dist/utils/error.js +20 -0
  255. package/dist/utils/error.js.map +1 -0
  256. package/dist/utils/gas-price.d.ts +6 -0
  257. package/dist/utils/gas-price.js +19 -0
  258. package/dist/utils/gas-price.js.map +1 -0
  259. package/dist/utils/index.d.ts +2 -0
  260. package/dist/utils/index.js +19 -0
  261. package/dist/utils/index.js.map +1 -0
  262. package/dist/utils/logger.d.ts +3 -0
  263. package/dist/utils/logger.js +21 -0
  264. package/dist/utils/logger.js.map +1 -0
  265. package/dist/utils/utils.d.ts +4 -0
  266. package/dist/utils/utils.js +54 -0
  267. package/dist/utils/utils.js.map +1 -0
  268. package/package.json +94 -0
  269. package/postinstall.js +52 -0
  270. package/react-native-shims.js +42 -0
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getMerkleProofForERC721 = exports.getSpendableUTXOsForToken = exports.getUTXOMerkletreeForNetwork = void 0;
4
+ const shared_models_1 = require("@matrix-privacy/shared-models");
5
+ const engine_1 = require("@matrix-privacy/engine");
6
+ const engine_2 = require("./engine");
7
+ const wallets_1 = require("../wallets/wallets");
8
+ const getUTXOMerkletreeForNetwork = (networkName) => {
9
+ const network = shared_models_1.NETWORK_CONFIG[networkName];
10
+ const { chain } = network;
11
+ const utxoMerkletree = (0, engine_2.getEngine)().getUTXOMerkletree(chain);
12
+ if (!(0, shared_models_1.isDefined)(utxoMerkletree)) {
13
+ throw new Error(`MerkleTree not yet loaded for network ${network.publicName}`);
14
+ }
15
+ return utxoMerkletree;
16
+ };
17
+ exports.getUTXOMerkletreeForNetwork = getUTXOMerkletreeForNetwork;
18
+ const getSpendableUTXOsForToken = async (networkName, walletID, tokenData) => {
19
+ const wallet = (0, wallets_1.walletForID)(walletID);
20
+ const chain = shared_models_1.NETWORK_CONFIG[networkName].chain;
21
+ const onlySpendable = true;
22
+ const balances = await wallet.getTokenBalances(chain, onlySpendable);
23
+ const tokenHash = (0, engine_1.getTokenDataHash)(tokenData);
24
+ return balances[tokenHash]?.utxos;
25
+ };
26
+ exports.getSpendableUTXOsForToken = getSpendableUTXOsForToken;
27
+ const getMerkleProofForERC721 = async (networkName, walletID, nftTokenData) => {
28
+ const utxos = await (0, exports.getSpendableUTXOsForToken)(networkName, walletID, nftTokenData);
29
+ if (!utxos || !utxos.length) {
30
+ throw new Error('No spendable UTXOs found for NFT');
31
+ }
32
+ if (utxos.length !== 1) {
33
+ throw new Error('Expected 1 UTXO for NFT');
34
+ }
35
+ const { tree, position } = utxos[0];
36
+ const utxoMerkletree = (0, exports.getUTXOMerkletreeForNetwork)(networkName);
37
+ return utxoMerkletree.getMerkleProof(tree, position);
38
+ };
39
+ exports.getMerkleProofForERC721 = getMerkleProofForERC721;
40
+ //# sourceMappingURL=merkletree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merkletree.js","sourceRoot":"","sources":["../../../../src/services/matrix/core/merkletree.ts"],"names":[],"mappings":";;;AAAA,iEAIuC;AACvC,mDAKgC;AAChC,qCAAqC;AACrC,gDAAiD;AAE1C,MAAM,2BAA2B,GAAG,CACzC,WAAwB,EACxB,EAAE;IACF,MAAM,OAAO,GAAG,8BAAc,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAC1B,MAAM,cAAc,GAAG,IAAA,kBAAS,GAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC5D,IAAI,CAAC,IAAA,yBAAS,EAAC,cAAc,CAAC,EAAE;QAC9B,MAAM,IAAI,KAAK,CACb,yCAAyC,OAAO,CAAC,UAAU,EAAE,CAC9D,CAAC;KACH;IACD,OAAO,cAAc,CAAC;AACxB,CAAC,CAAC;AAZW,QAAA,2BAA2B,+BAYtC;AAEK,MAAM,yBAAyB,GAAG,KAAK,EAC5C,WAAwB,EACxB,QAAgB,EAChB,SAAoB,EACM,EAAE;IAC5B,MAAM,MAAM,GAAG,IAAA,qBAAW,EAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,8BAAc,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC;IAChD,MAAM,aAAa,GAAG,IAAI,CAAC;IAC3B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAC5C,KAAK,EACL,aAAa,CACd,CAAC;IACF,MAAM,SAAS,GAAG,IAAA,yBAAgB,EAAC,SAAS,CAAC,CAAC;IAC9C,OAAO,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC;AACpC,CAAC,CAAC;AAdW,QAAA,yBAAyB,6BAcpC;AAEK,MAAM,uBAAuB,GAAG,KAAK,EAC1C,WAAwB,EACxB,QAAgB,EAChB,YAA0B,EAC1B,EAAE;IACF,MAAM,KAAK,GAAG,MAAM,IAAA,iCAAyB,EAC3C,WAAW,EACX,QAAQ,EACR,YAAY,CACb,CAAC;IACF,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;QAC3B,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;KACrD;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;QACtB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;KAC5C;IAED,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,cAAc,GAAG,IAAA,mCAA2B,EAAC,WAAW,CAAC,CAAC;IAChE,OAAO,cAAc,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACvD,CAAC,CAAC;AApBW,QAAA,uBAAuB,2BAoBlC","sourcesContent":["import {\n NETWORK_CONFIG,\n NetworkName,\n isDefined,\n} from '@matrix-privacy/shared-models';\nimport {\n NFTTokenData,\n TXO,\n TokenData,\n getTokenDataHash,\n} from '@matrix-privacy/engine';\nimport { getEngine } from './engine';\nimport { walletForID } from '../wallets/wallets';\n\nexport const getUTXOMerkletreeForNetwork = (\n networkName: NetworkName,\n) => {\n const network = NETWORK_CONFIG[networkName];\n const { chain } = network;\n const utxoMerkletree = getEngine().getUTXOMerkletree(chain);\n if (!isDefined(utxoMerkletree)) {\n throw new Error(\n `MerkleTree not yet loaded for network ${network.publicName}`,\n );\n }\n return utxoMerkletree;\n};\n\nexport const getSpendableUTXOsForToken = async (\n networkName: NetworkName,\n walletID: string,\n tokenData: TokenData,\n): Promise<Optional<TXO[]>> => {\n const wallet = walletForID(walletID);\n const chain = NETWORK_CONFIG[networkName].chain;\n const onlySpendable = true;\n const balances = await wallet.getTokenBalances(\n chain,\n onlySpendable,\n );\n const tokenHash = getTokenDataHash(tokenData);\n return balances[tokenHash]?.utxos;\n};\n\nexport const getMerkleProofForERC721 = async (\n networkName: NetworkName,\n walletID: string,\n nftTokenData: NFTTokenData,\n) => {\n const utxos = await getSpendableUTXOsForToken(\n networkName,\n walletID,\n nftTokenData,\n );\n if (!utxos || !utxos.length) {\n throw new Error('No spendable UTXOs found for NFT');\n }\n if (utxos.length !== 1) {\n throw new Error('Expected 1 UTXO for NFT');\n }\n\n const { tree, position } = utxos[0];\n const utxoMerkletree = getUTXOMerkletreeForNetwork(networkName);\n return utxoMerkletree.getMerkleProof(tree, position);\n};\n"]}
@@ -0,0 +1,3 @@
1
+ import { FormattedCircuitInputsMatrix, SnarkJSGroth16, Proof, Prover } from '@matrix-privacy/engine';
2
+ export declare const getProver: () => Prover;
3
+ export { FormattedCircuitInputsMatrix, Proof, SnarkJSGroth16 };
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getProver = void 0;
4
+ const engine_1 = require("./engine");
5
+ const shared_models_1 = require("@matrix-privacy/shared-models");
6
+ const getProver = () => {
7
+ const engine = (0, engine_1.getEngine)();
8
+ if (!(0, shared_models_1.isDefined)(engine)) {
9
+ throw new Error('Matrix Engine not yet init. Please reload your app or try again.');
10
+ }
11
+ return engine.prover;
12
+ };
13
+ exports.getProver = getProver;
14
+ //# sourceMappingURL=prover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prover.js","sourceRoot":"","sources":["../../../../src/services/matrix/core/prover.ts"],"names":[],"mappings":";;;AAMA,qCAAqC;AACrC,iEAA0D;AAEnD,MAAM,SAAS,GAAG,GAAW,EAAE;IACpC,MAAM,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;IAC3B,IAAI,CAAC,IAAA,yBAAS,EAAC,MAAM,CAAC,EAAE;QACtB,MAAM,IAAI,KAAK,CACb,kEAAkE,CACnE,CAAC;KACH;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC,CAAC;AARW,QAAA,SAAS,aAQpB","sourcesContent":["import {\n FormattedCircuitInputsMatrix,\n SnarkJSGroth16,\n Proof,\n Prover,\n} from '@matrix-privacy/engine';\nimport { getEngine } from './engine';\nimport { isDefined } from '@matrix-privacy/shared-models';\n\nexport const getProver = (): Prover => {\n const engine = getEngine();\n if (!isDefined(engine)) {\n throw new Error(\n 'Matrix Engine not yet init. Please reload your app or try again.',\n );\n }\n return engine.prover;\n};\n\nexport { FormattedCircuitInputsMatrix, Proof, SnarkJSGroth16 };\n"]}
@@ -0,0 +1,9 @@
1
+ import { NetworkName } from '@matrix-privacy/shared-models';
2
+ import { PollingJsonRpcProvider } from '@matrix-privacy/engine';
3
+ import { FallbackProvider } from 'ethers';
4
+ export declare const fallbackProviderMap: MapType<FallbackProvider>;
5
+ export declare const pollingProviderMap: MapType<PollingJsonRpcProvider>;
6
+ export declare const getFallbackProviderForNetwork: (networkName: NetworkName) => FallbackProvider;
7
+ export declare const getPollingProviderForNetwork: (networkName: NetworkName) => PollingJsonRpcProvider;
8
+ export declare const setFallbackProviderForNetwork: (networkName: NetworkName, provider: FallbackProvider) => void;
9
+ export declare const setPollingProviderForNetwork: (networkName: NetworkName, provider: PollingJsonRpcProvider) => void;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setPollingProviderForNetwork = exports.setFallbackProviderForNetwork = exports.getPollingProviderForNetwork = exports.getFallbackProviderForNetwork = exports.pollingProviderMap = exports.fallbackProviderMap = void 0;
4
+ const shared_models_1 = require("@matrix-privacy/shared-models");
5
+ exports.fallbackProviderMap = {};
6
+ exports.pollingProviderMap = {};
7
+ const getFallbackProviderForNetwork = (networkName) => {
8
+ const provider = exports.fallbackProviderMap[networkName];
9
+ if (!(0, shared_models_1.isDefined)(provider)) {
10
+ throw new Error(`Provider not yet loaded for network ${networkName}`);
11
+ }
12
+ return provider;
13
+ };
14
+ exports.getFallbackProviderForNetwork = getFallbackProviderForNetwork;
15
+ const getPollingProviderForNetwork = (networkName) => {
16
+ const provider = exports.pollingProviderMap[networkName];
17
+ if (!(0, shared_models_1.isDefined)(provider)) {
18
+ throw new Error(`Polling provider not yet loaded for network ${networkName}`);
19
+ }
20
+ return provider;
21
+ };
22
+ exports.getPollingProviderForNetwork = getPollingProviderForNetwork;
23
+ const setFallbackProviderForNetwork = (networkName, provider) => {
24
+ exports.fallbackProviderMap[networkName] = provider;
25
+ };
26
+ exports.setFallbackProviderForNetwork = setFallbackProviderForNetwork;
27
+ const setPollingProviderForNetwork = (networkName, provider) => {
28
+ exports.pollingProviderMap[networkName] = provider;
29
+ };
30
+ exports.setPollingProviderForNetwork = setPollingProviderForNetwork;
31
+ //# sourceMappingURL=providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../../../src/services/matrix/core/providers.ts"],"names":[],"mappings":";;;AAAA,iEAAuE;AAI1D,QAAA,mBAAmB,GAA8B,EAAE,CAAC;AACpD,QAAA,kBAAkB,GAAoC,EAAE,CAAC;AAE/D,MAAM,6BAA6B,GAAG,CAC3C,WAAwB,EACN,EAAE;IACpB,MAAM,QAAQ,GAAG,2BAAmB,CAAC,WAAW,CAAC,CAAC;IAClD,IAAI,CAAC,IAAA,yBAAS,EAAC,QAAQ,CAAC,EAAE;QACxB,MAAM,IAAI,KAAK,CAAC,uCAAuC,WAAW,EAAE,CAAC,CAAC;KACvE;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AARW,QAAA,6BAA6B,iCAQxC;AAEK,MAAM,4BAA4B,GAAG,CAC1C,WAAwB,EACA,EAAE;IAC1B,MAAM,QAAQ,GAAG,0BAAkB,CAAC,WAAW,CAAC,CAAC;IACjD,IAAI,CAAC,IAAA,yBAAS,EAAC,QAAQ,CAAC,EAAE;QACxB,MAAM,IAAI,KAAK,CACb,+CAA+C,WAAW,EAAE,CAC7D,CAAC;KACH;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAVW,QAAA,4BAA4B,gCAUvC;AAEK,MAAM,6BAA6B,GAAG,CAC3C,WAAwB,EACxB,QAA0B,EACpB,EAAE;IACR,2BAAmB,CAAC,WAAW,CAAC,GAAG,QAAQ,CAAC;AAC9C,CAAC,CAAC;AALW,QAAA,6BAA6B,iCAKxC;AAEK,MAAM,4BAA4B,GAAG,CAC1C,WAAwB,EACxB,QAAgC,EAC1B,EAAE;IACR,0BAAkB,CAAC,WAAW,CAAC,GAAG,QAAQ,CAAC;AAC7C,CAAC,CAAC;AALW,QAAA,4BAA4B,gCAKvC","sourcesContent":["import { NetworkName, isDefined } from '@matrix-privacy/shared-models';\nimport { PollingJsonRpcProvider } from '@matrix-privacy/engine';\nimport { FallbackProvider } from 'ethers';\n\nexport const fallbackProviderMap: MapType<FallbackProvider> = {};\nexport const pollingProviderMap: MapType<PollingJsonRpcProvider> = {};\n\nexport const getFallbackProviderForNetwork = (\n networkName: NetworkName,\n): FallbackProvider => {\n const provider = fallbackProviderMap[networkName];\n if (!isDefined(provider)) {\n throw new Error(`Provider not yet loaded for network ${networkName}`);\n }\n return provider;\n};\n\nexport const getPollingProviderForNetwork = (\n networkName: NetworkName,\n): PollingJsonRpcProvider => {\n const provider = pollingProviderMap[networkName];\n if (!isDefined(provider)) {\n throw new Error(\n `Polling provider not yet loaded for network ${networkName}`,\n );\n }\n return provider;\n};\n\nexport const setFallbackProviderForNetwork = (\n networkName: NetworkName,\n provider: FallbackProvider,\n): void => {\n fallbackProviderMap[networkName] = provider;\n};\n\nexport const setPollingProviderForNetwork = (\n networkName: NetworkName,\n provider: PollingJsonRpcProvider,\n): void => {\n pollingProviderMap[networkName] = provider;\n};\n"]}
@@ -0,0 +1,11 @@
1
+ import { NetworkName } from '@matrix-privacy/shared-models';
2
+ export type ShieldData = {
3
+ txid: string;
4
+ commitmentHash: string;
5
+ npk: string;
6
+ timestamp: Optional<number>;
7
+ blockNumber: number;
8
+ utxoTree: number;
9
+ utxoIndex: number;
10
+ };
11
+ export declare const getAllShields: (networkName: NetworkName, startingBlock: number) => Promise<ShieldData[]>;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getAllShields = void 0;
4
+ const shared_models_1 = require("@matrix-privacy/shared-models");
5
+ const engine_1 = require("./engine");
6
+ const getAllShields = async (networkName, startingBlock) => {
7
+ const engine = (0, engine_1.getEngine)();
8
+ const { chain } = shared_models_1.NETWORK_CONFIG[networkName];
9
+ const shieldCommitments = await engine.getAllShieldCommitments(chain, startingBlock);
10
+ return shieldCommitments.map(commitment => {
11
+ const shieldData = {
12
+ txid: `0x${commitment.txid}`,
13
+ commitmentHash: `0x${commitment.hash}`,
14
+ npk: `0x${commitment.preImage.npk}`,
15
+ utxoTree: commitment.utxoTree,
16
+ utxoIndex: commitment.utxoIndex,
17
+ timestamp: commitment.timestamp,
18
+ blockNumber: commitment.blockNumber,
19
+ };
20
+ return shieldData;
21
+ });
22
+ };
23
+ exports.getAllShields = getAllShields;
24
+ //# sourceMappingURL=shields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shields.js","sourceRoot":"","sources":["../../../../src/services/matrix/core/shields.ts"],"names":[],"mappings":";;;AAAA,iEAGuC;AACvC,qCAAqC;AAY9B,MAAM,aAAa,GAAG,KAAK,EAChC,WAAwB,EACxB,aAAqB,EACE,EAAE;IACzB,MAAM,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;IAC3B,MAAM,EAAE,KAAK,EAAE,GAAG,8BAAc,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,iBAAiB,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAC5D,KAAK,EACL,aAAa,CACd,CAAC;IAEF,OAAO,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;QACxC,MAAM,UAAU,GAAe;YAC7B,IAAI,EAAE,KAAK,UAAU,CAAC,IAAI,EAAE;YAC5B,cAAc,EAAE,KAAK,UAAU,CAAC,IAAI,EAAE;YACtC,GAAG,EAAE,KAAK,UAAU,CAAC,QAAQ,CAAC,GAAG,EAAE;YACnC,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,WAAW,EAAE,UAAU,CAAC,WAAW;SACpC,CAAC;QACF,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAvBW,QAAA,aAAa,iBAuBxB","sourcesContent":["import {\n NETWORK_CONFIG,\n NetworkName,\n} from '@matrix-privacy/shared-models';\nimport { getEngine } from './engine';\n\nexport type ShieldData = {\n txid: string;\n commitmentHash: string;\n npk: string;\n timestamp: Optional<number>;\n blockNumber: number;\n utxoTree: number;\n utxoIndex: number;\n};\n\nexport const getAllShields = async (\n networkName: NetworkName,\n startingBlock: number,\n): Promise<ShieldData[]> => {\n const engine = getEngine();\n const { chain } = NETWORK_CONFIG[networkName];\n const shieldCommitments = await engine.getAllShieldCommitments(\n chain,\n startingBlock,\n );\n\n return shieldCommitments.map(commitment => {\n const shieldData: ShieldData = {\n txid: `0x${commitment.txid}`,\n commitmentHash: `0x${commitment.hash}`,\n npk: `0x${commitment.preImage.npk}`,\n utxoTree: commitment.utxoTree,\n utxoIndex: commitment.utxoIndex,\n timestamp: commitment.timestamp,\n blockNumber: commitment.blockNumber,\n };\n return shieldData;\n });\n};\n"]}
@@ -0,0 +1,249 @@
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
+ const chai_1 = __importDefault(require("chai"));
7
+ const chai_as_promised_1 = __importDefault(require("chai-as-promised"));
8
+ const sinon_1 = __importDefault(require("sinon"));
9
+ const wallets_1 = require("../../wallets/wallets");
10
+ const transaction_history_1 = require("../transaction-history");
11
+ const mocks_test_1 = require("../../../../tests/mocks.test");
12
+ const setup_test_1 = require("../../../../tests/setup.test");
13
+ const shared_models_1 = require("@matrix-privacy/shared-models");
14
+ chai_1.default.use(chai_as_promised_1.default);
15
+ const { expect } = chai_1.default;
16
+ const SEPOLIA_CHAIN = { type: shared_models_1.ChainType.EVM, id: 11155111 };
17
+ let wallet;
18
+ const transferERC20AmountsSend = [
19
+ {
20
+ tokenAddress: '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270',
21
+ amount: BigInt('0x435532c61b0800'),
22
+ recipientAddress: '0zk1qygxrr7l92f6wltkpqlqcqstftfn0cn0x5ckyl5tjz6a4kyxnwy9arv7j6fe3z53llg8qt4s7axfdazyrrps78np9pylk4055gkz9e2gd8ulmk0urqt55y3m07t',
23
+ walletSource: 'railway web',
24
+ memoText: '',
25
+ },
26
+ {
27
+ tokenAddress: '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270',
28
+ amount: BigInt('0x01626218b4586000'),
29
+ recipientAddress: '0zk1qygxrr7l92f6wltkpqlqcqstftfn0cn0x5ckyl5tjz6a4kyxnwy9arv7j6fe3z53llg8qt4s7axfdazyrrps78np9pylk4055gkz9e2gd8ulmk0urqt55y3m07t',
30
+ walletSource: 'railway web',
31
+ memoText: '',
32
+ },
33
+ {
34
+ tokenAddress: '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270',
35
+ amount: BigInt('0x0120d3a540a09800'),
36
+ recipientAddress: '0zk1qygxrr7l92f6wltkpqlqcqstftfn0cn0x5ckyl5tjz6a4kyxnwy9arv7j6fe3z53llg8qt4s7axfdazyrrps78np9pylk4055gkz9e2gd8ulmk0urqt55y3m07t',
37
+ walletSource: 'railway web',
38
+ memoText: '',
39
+ },
40
+ ];
41
+ const MOCKED_TRANSFER_SEND_TRX = {
42
+ txid: '0x2cedf31ad89e317dab2bc522333c58e9d644e4977c9c7249ca99e3846eb5d652',
43
+ blockNumber: 100,
44
+ transferERC20Amounts: transferERC20AmountsSend,
45
+ changeERC20Amounts: [
46
+ {
47
+ tokenAddress: '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270',
48
+ amount: BigInt('0xabdf14769f1800'),
49
+ },
50
+ ],
51
+ receiveERC20Amounts: [],
52
+ unshieldERC20Amounts: [],
53
+ receiveNFTAmounts: [],
54
+ transferNFTAmounts: [],
55
+ unshieldNFTAmounts: [],
56
+ version: 3,
57
+ category: shared_models_1.TransactionHistoryItemCategory.TransferSendERC20s,
58
+ timestamp: 1678801493,
59
+ };
60
+ const receiveERC20AmountsReceive = [
61
+ {
62
+ tokenAddress: '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270',
63
+ amount: BigInt('0x0b470553066cd0f8'),
64
+ memoText: 'este va a ser un memo corto',
65
+ senderAddress: '0zk1qyy0deg6tdmfum0dcxj8j69p9ue9emvyyuv46ltdrxcmfr06wafh8rv7j6fe3z53lalv6k0cvxsap0xqpcgjnplrkrz5nsykud3u5nstfclh96k4uwwcq8un6tm',
66
+ shieldFee: '',
67
+ balanceBucket: shared_models_1.MatrixWalletBalanceBucket.Spendable,
68
+ },
69
+ ];
70
+ const MOCKED_TRANSFER_RECEIVE_TRX = {
71
+ txid: '0x3245173576d6fdd6032915e9d742498e08b327cd4fbdeb0d7bb1858455698fa4',
72
+ blockNumber: 100,
73
+ transferERC20Amounts: [],
74
+ changeERC20Amounts: [],
75
+ receiveERC20Amounts: receiveERC20AmountsReceive,
76
+ unshieldERC20Amounts: [],
77
+ receiveNFTAmounts: [],
78
+ transferNFTAmounts: [],
79
+ unshieldNFTAmounts: [],
80
+ version: 0,
81
+ category: shared_models_1.TransactionHistoryItemCategory.TransferReceiveERC20s,
82
+ timestamp: 1681132187.844,
83
+ };
84
+ const receiveERC20AmountsShield = [
85
+ {
86
+ tokenAddress: '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270',
87
+ amount: BigInt('0x1bafa9ee16e78000'),
88
+ shieldFee: '0x11c37937e08000',
89
+ senderAddress: '',
90
+ memoText: '',
91
+ balanceBucket: shared_models_1.MatrixWalletBalanceBucket.ShieldPending,
92
+ },
93
+ ];
94
+ const MOCKED_SHIELD_TRX = {
95
+ txid: '0x19a6a73d658c7517625ce16ab554ccb6dc3dbed85dfae8e7ced42b42ad71692c',
96
+ blockNumber: 100,
97
+ transferERC20Amounts: [],
98
+ changeERC20Amounts: [],
99
+ receiveERC20Amounts: receiveERC20AmountsShield,
100
+ unshieldERC20Amounts: [],
101
+ receiveNFTAmounts: [],
102
+ transferNFTAmounts: [],
103
+ unshieldNFTAmounts: [],
104
+ version: 0,
105
+ category: shared_models_1.TransactionHistoryItemCategory.ShieldERC20s,
106
+ timestamp: 1680269703,
107
+ };
108
+ const unshieldERC20AmountsUnshield = [
109
+ {
110
+ tokenAddress: '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270',
111
+ amount: BigInt('0x06316e3f4d951280'),
112
+ recipientAddress: '0xc7FfA542736321A3dd69246d73987566a5486968',
113
+ unshieldFee: '0x03f937fa6b8580',
114
+ walletSource: 'railway web',
115
+ memoText: '',
116
+ },
117
+ ];
118
+ const MOCKED_UNSHIELD_TRX = {
119
+ txid: '0xefcff65175d3dc33b7d384951fbeeb7698f8b86a29c635704e3ee78a9d947b66',
120
+ blockNumber: 100,
121
+ transferERC20Amounts: [],
122
+ changeERC20Amounts: [],
123
+ receiveERC20Amounts: [],
124
+ unshieldERC20Amounts: unshieldERC20AmountsUnshield,
125
+ receiveNFTAmounts: [],
126
+ transferNFTAmounts: [],
127
+ unshieldNFTAmounts: [],
128
+ version: 3,
129
+ category: shared_models_1.TransactionHistoryItemCategory.UnshieldERC20s,
130
+ timestamp: 1678821969,
131
+ };
132
+ const receiveERC20AmountsUnknow = [
133
+ {
134
+ tokenAddress: '0x8f3cf7ad23cd3cadbd9735aff958023239c6a063',
135
+ amount: BigInt('0x0f3603f585000c34'),
136
+ shieldFee: '0x09c26a7ae13400',
137
+ senderAddress: '',
138
+ memoText: '',
139
+ balanceBucket: shared_models_1.MatrixWalletBalanceBucket.Spendable,
140
+ },
141
+ ];
142
+ const unshieldERC20AmountsUnknow = [
143
+ {
144
+ tokenAddress: '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270',
145
+ amount: BigInt('0x0dd7d4f70b73c000'),
146
+ recipientAddress: '0xc7FfA542736321A3dd69246d73987566a5486968',
147
+ unshieldFee: '0x08e1bc9bf04000',
148
+ memoText: '',
149
+ walletSource: 'railway web',
150
+ },
151
+ ];
152
+ const MOCKED_UNKNOWN_SWAP_TRX = {
153
+ txid: '0xf12496efa5966edb39308b424038a2fec0235a01a2cb469908bc0b4bda7e1cbe',
154
+ blockNumber: 100,
155
+ transferERC20Amounts: [],
156
+ changeERC20Amounts: [
157
+ {
158
+ tokenAddress: '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270',
159
+ amount: BigInt('0x012d2a0caec49380'),
160
+ },
161
+ ],
162
+ receiveERC20Amounts: receiveERC20AmountsUnknow,
163
+ unshieldERC20Amounts: unshieldERC20AmountsUnknow,
164
+ receiveNFTAmounts: [],
165
+ transferNFTAmounts: [],
166
+ unshieldNFTAmounts: [],
167
+ version: 3,
168
+ category: shared_models_1.TransactionHistoryItemCategory.Unknown,
169
+ timestamp: 1680269870,
170
+ };
171
+ const MOCK_HISTORY_ENTRY = [
172
+ {
173
+ txid: MOCKED_TRANSFER_SEND_TRX.txid,
174
+ blockNumber: MOCKED_TRANSFER_SEND_TRX.blockNumber,
175
+ transferTokenAmounts: [],
176
+ changeTokenAmounts: [],
177
+ receiveTokenAmounts: [],
178
+ unshieldTokenAmounts: [],
179
+ version: MOCKED_TRANSFER_SEND_TRX.version,
180
+ timestamp: MOCKED_TRANSFER_SEND_TRX.timestamp,
181
+ },
182
+ {
183
+ txid: MOCKED_TRANSFER_RECEIVE_TRX.txid,
184
+ blockNumber: MOCKED_TRANSFER_RECEIVE_TRX.blockNumber,
185
+ transferTokenAmounts: [],
186
+ changeTokenAmounts: [],
187
+ receiveTokenAmounts: [],
188
+ unshieldTokenAmounts: [],
189
+ version: MOCKED_TRANSFER_RECEIVE_TRX.version,
190
+ timestamp: MOCKED_TRANSFER_RECEIVE_TRX.timestamp,
191
+ },
192
+ {
193
+ txid: MOCKED_SHIELD_TRX.txid,
194
+ blockNumber: MOCKED_SHIELD_TRX.blockNumber,
195
+ transferTokenAmounts: [],
196
+ changeTokenAmounts: [],
197
+ receiveTokenAmounts: [],
198
+ unshieldTokenAmounts: [],
199
+ version: MOCKED_SHIELD_TRX.version,
200
+ timestamp: MOCKED_SHIELD_TRX.timestamp,
201
+ },
202
+ ];
203
+ describe('transaction-history', () => {
204
+ before(async function run() {
205
+ this.timeout(6 * 60000); // The scanning nowadays can take a long time
206
+ await (0, setup_test_1.initTestEngine)();
207
+ await (0, setup_test_1.initTestEngineNetworks)();
208
+ const matrixWalletInfo = await (0, wallets_1.createMatrixWallet)(mocks_test_1.MOCK_DB_ENCRYPTION_KEY, mocks_test_1.MOCK_MNEMONIC_2, { [shared_models_1.NetworkName.Hardhat]: 0 });
209
+ if (!(0, shared_models_1.isDefined)(matrixWalletInfo)) {
210
+ throw new Error(`Could not create wallet`);
211
+ }
212
+ wallet = (0, wallets_1.fullWalletForID)(matrixWalletInfo.id);
213
+ await (0, setup_test_1.pollUntilUTXOMerkletreeScanned)();
214
+ });
215
+ after(async () => {
216
+ await (0, setup_test_1.closeTestEngine)();
217
+ });
218
+ it('Should get wallet transaction history', async () => {
219
+ const mockGetHistory = sinon_1.default.stub(wallet, 'getTransactionHistory').resolves(MOCK_HISTORY_ENTRY);
220
+ const items = await (0, transaction_history_1.getWalletTransactionHistory)(SEPOLIA_CHAIN, wallet.id, undefined);
221
+ expect(mockGetHistory.calledWith(SEPOLIA_CHAIN, undefined)).to.be.true;
222
+ expect(items.length).to.be.greaterThanOrEqual(3);
223
+ for (const item of items) {
224
+ expect(item.txid.length).to.equal(66); // '0x' + 32 bytes
225
+ }
226
+ mockGetHistory.restore();
227
+ });
228
+ it('Should get Unknown category for transaction history item', () => {
229
+ const category = (0, transaction_history_1.categoryForTransactionHistoryItem)(MOCKED_UNKNOWN_SWAP_TRX);
230
+ expect(category).to.equal(shared_models_1.TransactionHistoryItemCategory.Unknown);
231
+ });
232
+ it('Should get TransferSendERC20s category for transaction history item', () => {
233
+ const category = (0, transaction_history_1.categoryForTransactionHistoryItem)(MOCKED_TRANSFER_SEND_TRX);
234
+ expect(category).to.equal(shared_models_1.TransactionHistoryItemCategory.TransferSendERC20s);
235
+ });
236
+ it('Should get ShieldERC20s category for transaction history item', () => {
237
+ const category = (0, transaction_history_1.categoryForTransactionHistoryItem)(MOCKED_SHIELD_TRX);
238
+ expect(category).to.equal(shared_models_1.TransactionHistoryItemCategory.ShieldERC20s);
239
+ });
240
+ it('Should get TransferReceiveERC20s category for transaction history item', () => {
241
+ const category = (0, transaction_history_1.categoryForTransactionHistoryItem)(MOCKED_TRANSFER_RECEIVE_TRX);
242
+ expect(category).to.equal(shared_models_1.TransactionHistoryItemCategory.TransferReceiveERC20s);
243
+ });
244
+ it('Should get UnshieldERC20s category for transaction history item', () => {
245
+ const category = (0, transaction_history_1.categoryForTransactionHistoryItem)(MOCKED_UNSHIELD_TRX);
246
+ expect(category).to.equal(shared_models_1.TransactionHistoryItemCategory.UnshieldERC20s);
247
+ });
248
+ });
249
+ //# sourceMappingURL=transaction-history.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction-history.test.js","sourceRoot":"","sources":["../../../../../src/services/matrix/history/__tests__/transaction-history.test.ts"],"names":[],"mappings":"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","sourcesContent":["import chai from 'chai';\nimport chaiAsPromised from 'chai-as-promised';\nimport sinon from 'sinon';\nimport { createMatrixWallet, fullWalletForID } from '../../wallets/wallets';\nimport {\n categoryForTransactionHistoryItem,\n getWalletTransactionHistory,\n} from '../transaction-history';\nimport {\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_MNEMONIC_2,\n} from '../../../../tests/mocks.test';\nimport {\n closeTestEngine,\n initTestEngine,\n initTestEngineNetworks,\n pollUntilUTXOMerkletreeScanned,\n} from '../../../../tests/setup.test';\nimport { MatrixWallet, TransactionHistoryEntry } from '@matrix-privacy/engine';\nimport {\n Chain,\n ChainType,\n NetworkName,\n MatrixHistoryReceiveERC20Amount,\n MatrixHistorySendERC20Amount,\n MatrixHistoryUnshieldERC20Amount,\n MatrixWalletBalanceBucket,\n TransactionHistoryItem,\n TransactionHistoryItemCategory,\n isDefined,\n} from '@matrix-privacy/shared-models';\n\nchai.use(chaiAsPromised);\nconst { expect } = chai;\n\nconst SEPOLIA_CHAIN: Chain = { type: ChainType.EVM, id: 11155111 };\n\nlet wallet: MatrixWallet;\n\nconst transferERC20AmountsSend: MatrixHistorySendERC20Amount[] = [\n {\n tokenAddress: '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270',\n amount: BigInt('0x435532c61b0800'),\n recipientAddress:\n '0zk1qygxrr7l92f6wltkpqlqcqstftfn0cn0x5ckyl5tjz6a4kyxnwy9arv7j6fe3z53llg8qt4s7axfdazyrrps78np9pylk4055gkz9e2gd8ulmk0urqt55y3m07t',\n walletSource: 'railway web',\n memoText: '',\n },\n {\n tokenAddress: '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270',\n amount: BigInt('0x01626218b4586000'),\n recipientAddress:\n '0zk1qygxrr7l92f6wltkpqlqcqstftfn0cn0x5ckyl5tjz6a4kyxnwy9arv7j6fe3z53llg8qt4s7axfdazyrrps78np9pylk4055gkz9e2gd8ulmk0urqt55y3m07t',\n walletSource: 'railway web',\n memoText: '',\n },\n {\n tokenAddress: '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270',\n amount: BigInt('0x0120d3a540a09800'),\n recipientAddress:\n '0zk1qygxrr7l92f6wltkpqlqcqstftfn0cn0x5ckyl5tjz6a4kyxnwy9arv7j6fe3z53llg8qt4s7axfdazyrrps78np9pylk4055gkz9e2gd8ulmk0urqt55y3m07t',\n walletSource: 'railway web',\n memoText: '',\n },\n];\nconst MOCKED_TRANSFER_SEND_TRX: TransactionHistoryItem = {\n txid: '0x2cedf31ad89e317dab2bc522333c58e9d644e4977c9c7249ca99e3846eb5d652',\n blockNumber: 100,\n transferERC20Amounts: transferERC20AmountsSend,\n changeERC20Amounts: [\n {\n tokenAddress: '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270',\n amount: BigInt('0xabdf14769f1800'),\n },\n ],\n receiveERC20Amounts: [],\n unshieldERC20Amounts: [],\n receiveNFTAmounts: [],\n transferNFTAmounts: [],\n unshieldNFTAmounts: [],\n version: 3,\n category: TransactionHistoryItemCategory.TransferSendERC20s,\n timestamp: 1678801493,\n};\n\nconst receiveERC20AmountsReceive: MatrixHistoryReceiveERC20Amount[] = [\n {\n tokenAddress: '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270',\n amount: BigInt('0x0b470553066cd0f8'),\n memoText: 'este va a ser un memo corto',\n senderAddress:\n '0zk1qyy0deg6tdmfum0dcxj8j69p9ue9emvyyuv46ltdrxcmfr06wafh8rv7j6fe3z53lalv6k0cvxsap0xqpcgjnplrkrz5nsykud3u5nstfclh96k4uwwcq8un6tm',\n shieldFee: '',\n balanceBucket: MatrixWalletBalanceBucket.Spendable,\n },\n];\nconst MOCKED_TRANSFER_RECEIVE_TRX: TransactionHistoryItem = {\n txid: '0x3245173576d6fdd6032915e9d742498e08b327cd4fbdeb0d7bb1858455698fa4',\n blockNumber: 100,\n transferERC20Amounts: [],\n changeERC20Amounts: [],\n receiveERC20Amounts: receiveERC20AmountsReceive,\n unshieldERC20Amounts: [],\n receiveNFTAmounts: [],\n transferNFTAmounts: [],\n unshieldNFTAmounts: [],\n version: 0,\n category: TransactionHistoryItemCategory.TransferReceiveERC20s,\n timestamp: 1681132187.844,\n};\n\nconst receiveERC20AmountsShield: MatrixHistoryReceiveERC20Amount[] = [\n {\n tokenAddress: '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270',\n amount: BigInt('0x1bafa9ee16e78000'),\n shieldFee: '0x11c37937e08000',\n senderAddress: '',\n memoText: '',\n balanceBucket: MatrixWalletBalanceBucket.ShieldPending,\n },\n];\nconst MOCKED_SHIELD_TRX: TransactionHistoryItem = {\n txid: '0x19a6a73d658c7517625ce16ab554ccb6dc3dbed85dfae8e7ced42b42ad71692c',\n blockNumber: 100,\n transferERC20Amounts: [],\n changeERC20Amounts: [],\n receiveERC20Amounts: receiveERC20AmountsShield,\n unshieldERC20Amounts: [],\n receiveNFTAmounts: [],\n transferNFTAmounts: [],\n unshieldNFTAmounts: [],\n version: 0,\n category: TransactionHistoryItemCategory.ShieldERC20s,\n timestamp: 1680269703,\n};\n\nconst unshieldERC20AmountsUnshield: MatrixHistoryUnshieldERC20Amount[] = [\n {\n tokenAddress: '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270',\n amount: BigInt('0x06316e3f4d951280'),\n recipientAddress: '0xc7FfA542736321A3dd69246d73987566a5486968',\n unshieldFee: '0x03f937fa6b8580',\n walletSource: 'railway web',\n memoText: '',\n },\n];\nconst MOCKED_UNSHIELD_TRX: TransactionHistoryItem = {\n txid: '0xefcff65175d3dc33b7d384951fbeeb7698f8b86a29c635704e3ee78a9d947b66',\n blockNumber: 100,\n transferERC20Amounts: [],\n changeERC20Amounts: [],\n receiveERC20Amounts: [],\n unshieldERC20Amounts: unshieldERC20AmountsUnshield,\n receiveNFTAmounts: [],\n transferNFTAmounts: [],\n unshieldNFTAmounts: [],\n version: 3,\n category: TransactionHistoryItemCategory.UnshieldERC20s,\n timestamp: 1678821969,\n};\n\nconst receiveERC20AmountsUnknow: MatrixHistoryReceiveERC20Amount[] = [\n {\n tokenAddress: '0x8f3cf7ad23cd3cadbd9735aff958023239c6a063',\n amount: BigInt('0x0f3603f585000c34'),\n shieldFee: '0x09c26a7ae13400',\n senderAddress: '',\n memoText: '',\n balanceBucket: MatrixWalletBalanceBucket.Spendable,\n },\n];\nconst unshieldERC20AmountsUnknow: MatrixHistoryUnshieldERC20Amount[] = [\n {\n tokenAddress: '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270',\n amount: BigInt('0x0dd7d4f70b73c000'),\n recipientAddress: '0xc7FfA542736321A3dd69246d73987566a5486968',\n unshieldFee: '0x08e1bc9bf04000',\n memoText: '',\n walletSource: 'railway web',\n },\n];\nconst MOCKED_UNKNOWN_SWAP_TRX: TransactionHistoryItem = {\n txid: '0xf12496efa5966edb39308b424038a2fec0235a01a2cb469908bc0b4bda7e1cbe',\n blockNumber: 100,\n transferERC20Amounts: [],\n changeERC20Amounts: [\n {\n tokenAddress: '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270',\n amount: BigInt('0x012d2a0caec49380'),\n },\n ],\n receiveERC20Amounts: receiveERC20AmountsUnknow,\n unshieldERC20Amounts: unshieldERC20AmountsUnknow,\n receiveNFTAmounts: [],\n transferNFTAmounts: [],\n unshieldNFTAmounts: [],\n version: 3,\n category: TransactionHistoryItemCategory.Unknown,\n timestamp: 1680269870,\n};\n\nconst MOCK_HISTORY_ENTRY: TransactionHistoryEntry[] = [\n {\n txid: MOCKED_TRANSFER_SEND_TRX.txid,\n blockNumber: MOCKED_TRANSFER_SEND_TRX.blockNumber,\n transferTokenAmounts: [],\n changeTokenAmounts: [],\n receiveTokenAmounts: [],\n unshieldTokenAmounts: [],\n version: MOCKED_TRANSFER_SEND_TRX.version,\n timestamp: MOCKED_TRANSFER_SEND_TRX.timestamp,\n } as TransactionHistoryEntry,\n {\n txid: MOCKED_TRANSFER_RECEIVE_TRX.txid,\n blockNumber: MOCKED_TRANSFER_RECEIVE_TRX.blockNumber,\n transferTokenAmounts: [],\n changeTokenAmounts: [],\n receiveTokenAmounts: [],\n unshieldTokenAmounts: [],\n version: MOCKED_TRANSFER_RECEIVE_TRX.version,\n timestamp: MOCKED_TRANSFER_RECEIVE_TRX.timestamp,\n } as TransactionHistoryEntry,\n {\n txid: MOCKED_SHIELD_TRX.txid,\n blockNumber: MOCKED_SHIELD_TRX.blockNumber,\n transferTokenAmounts: [],\n changeTokenAmounts: [],\n receiveTokenAmounts: [],\n unshieldTokenAmounts: [],\n version: MOCKED_SHIELD_TRX.version,\n timestamp: MOCKED_SHIELD_TRX.timestamp,\n } as TransactionHistoryEntry,\n ];\n\n\ndescribe('transaction-history', () => {\n before(async function run() {\n this.timeout(6 * 60_000); // The scanning nowadays can take a long time\n await initTestEngine();\n await initTestEngineNetworks();\n const matrixWalletInfo = await createMatrixWallet(\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_MNEMONIC_2,\n { [NetworkName.Hardhat]: 0 }, // creationBlockNumbers\n );\n if (!isDefined(matrixWalletInfo)) {\n throw new Error(`Could not create wallet`);\n }\n wallet = fullWalletForID(matrixWalletInfo.id);\n\n await pollUntilUTXOMerkletreeScanned();\n });\n after(async () => {\n await closeTestEngine();\n });\n\n it('Should get wallet transaction history', async () => {\n const mockGetHistory = sinon.stub(wallet, 'getTransactionHistory').resolves(MOCK_HISTORY_ENTRY);\n\n const items = await getWalletTransactionHistory(\n SEPOLIA_CHAIN,\n wallet.id,\n undefined,\n );\n\n expect(mockGetHistory.calledWith(SEPOLIA_CHAIN, undefined)).to.be.true;\n expect(items.length).to.be.greaterThanOrEqual(3);\n for (const item of items) {\n expect(item.txid.length).to.equal(66); // '0x' + 32 bytes\n }\n\n mockGetHistory.restore();\n });\n\n it('Should get Unknown category for transaction history item', () => {\n const category = categoryForTransactionHistoryItem(MOCKED_UNKNOWN_SWAP_TRX);\n expect(category).to.equal(TransactionHistoryItemCategory.Unknown);\n });\n\n it('Should get TransferSendERC20s category for transaction history item', () => {\n const category = categoryForTransactionHistoryItem(\n MOCKED_TRANSFER_SEND_TRX,\n );\n expect(category).to.equal(\n TransactionHistoryItemCategory.TransferSendERC20s,\n );\n });\n\n it('Should get ShieldERC20s category for transaction history item', () => {\n const category = categoryForTransactionHistoryItem(MOCKED_SHIELD_TRX);\n expect(category).to.equal(TransactionHistoryItemCategory.ShieldERC20s);\n });\n\n it('Should get TransferReceiveERC20s category for transaction history item', () => {\n const category = categoryForTransactionHistoryItem(\n MOCKED_TRANSFER_RECEIVE_TRX,\n );\n expect(category).to.equal(\n TransactionHistoryItemCategory.TransferReceiveERC20s,\n );\n });\n\n it('Should get UnshieldERC20s category for transaction history item', () => {\n const category = categoryForTransactionHistoryItem(MOCKED_UNSHIELD_TRX);\n expect(category).to.equal(TransactionHistoryItemCategory.UnshieldERC20s);\n });\n});\n"]}
@@ -0,0 +1,4 @@
1
+ import { Chain } from '@matrix-privacy/engine';
2
+ import { TransactionHistoryItem, TransactionHistoryItemCategory } from '@matrix-privacy/shared-models';
3
+ export declare const categoryForTransactionHistoryItem: (historyItem: TransactionHistoryItem) => TransactionHistoryItemCategory;
4
+ export declare const getWalletTransactionHistory: (chain: Chain, matrixWalletID: string, startingBlock: Optional<number>) => Promise<TransactionHistoryItem[]>;
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getWalletTransactionHistory = exports.categoryForTransactionHistoryItem = void 0;
4
+ const engine_1 = require("@matrix-privacy/engine");
5
+ const shared_models_1 = require("@matrix-privacy/shared-models");
6
+ const bytes_1 = require("../util/bytes");
7
+ const error_1 = require("../../../utils/error");
8
+ const wallets_1 = require("../wallets/wallets");
9
+ const getMatrixBalanceBucketFromEngineBalanceBucket = (balanceBucket) => {
10
+ switch (balanceBucket) {
11
+ case 'Spendable':
12
+ return shared_models_1.MatrixWalletBalanceBucket.Spendable;
13
+ case 'ShieldPending':
14
+ return shared_models_1.MatrixWalletBalanceBucket.ShieldPending;
15
+ case 'ProofSubmitted':
16
+ return shared_models_1.MatrixWalletBalanceBucket.ProofSubmitted;
17
+ case 'Spent':
18
+ return shared_models_1.MatrixWalletBalanceBucket.Spent;
19
+ default:
20
+ return shared_models_1.MatrixWalletBalanceBucket.Spendable;
21
+ }
22
+ };
23
+ const transactionHistoryReceiveTokenAmountToMatrixERC20Amount = (transactionHistoryReceiveTokenAmount) => {
24
+ return {
25
+ ...transactionHistoryTokenAmountToMatrixERC20Amount(transactionHistoryReceiveTokenAmount),
26
+ memoText: transactionHistoryReceiveTokenAmount.memoText,
27
+ senderAddress: transactionHistoryReceiveTokenAmount.senderAddress,
28
+ shieldFee: transactionHistoryReceiveTokenAmount.shieldFee,
29
+ balanceBucket: getMatrixBalanceBucketFromEngineBalanceBucket(transactionHistoryReceiveTokenAmount.balanceBucket),
30
+ };
31
+ };
32
+ const transactionHistoryReceiveNFTToMatrixNFTAmount = (transactionHistoryReceiveTokenAmount) => {
33
+ return {
34
+ ...transactionHistoryNFTToMatrixNFTAmount(transactionHistoryReceiveTokenAmount),
35
+ memoText: transactionHistoryReceiveTokenAmount.memoText,
36
+ senderAddress: transactionHistoryReceiveTokenAmount.senderAddress,
37
+ shieldFee: transactionHistoryReceiveTokenAmount.shieldFee,
38
+ balanceBucket: getMatrixBalanceBucketFromEngineBalanceBucket(transactionHistoryReceiveTokenAmount.balanceBucket),
39
+ };
40
+ };
41
+ const transactionHistoryTransferTokenAmountToMatrixERC20Amount = (transactionHistoryTokenAmount) => {
42
+ return {
43
+ ...transactionHistoryTokenAmountToMatrixERC20Amount(transactionHistoryTokenAmount),
44
+ recipientAddress: transactionHistoryTokenAmount.recipientAddress,
45
+ memoText: transactionHistoryTokenAmount.memoText,
46
+ walletSource: transactionHistoryTokenAmount.walletSource,
47
+ };
48
+ };
49
+ const transactionHistoryUnshieldTokenAmountToMatrixERC20Amount = (transactionHistoryUnshieldTokenAmount) => {
50
+ return {
51
+ ...transactionHistoryTransferTokenAmountToMatrixERC20Amount(transactionHistoryUnshieldTokenAmount),
52
+ unshieldFee: transactionHistoryUnshieldTokenAmount.unshieldFee,
53
+ };
54
+ };
55
+ const transactionHistoryTransferNFTToMatrixNFTAmount = (transactionHistoryNFT) => {
56
+ return {
57
+ ...transactionHistoryNFTToMatrixNFTAmount(transactionHistoryNFT),
58
+ memoText: transactionHistoryNFT.memoText,
59
+ walletSource: transactionHistoryNFT.walletSource,
60
+ recipientAddress: transactionHistoryNFT.recipientAddress,
61
+ };
62
+ };
63
+ const transactionHistoryUnshieldNFTToMatrixNFTAmount = (transactionHistoryNFT) => {
64
+ return {
65
+ ...transactionHistoryTransferNFTToMatrixNFTAmount(transactionHistoryNFT),
66
+ unshieldFee: transactionHistoryNFT.unshieldFee,
67
+ };
68
+ };
69
+ const transactionHistoryTokenAmountToMatrixERC20Amount = (transactionHistoryTokenAmount) => {
70
+ return {
71
+ tokenAddress: (0, bytes_1.parseMatrixTokenAddress)(transactionHistoryTokenAmount.tokenData.tokenAddress).toLowerCase(),
72
+ amount: transactionHistoryTokenAmount.amount,
73
+ };
74
+ };
75
+ const transactionHistoryNFTToMatrixNFTAmount = (transactionHistoryNFT) => {
76
+ return {
77
+ nftAddress: (0, bytes_1.parseMatrixTokenAddress)(transactionHistoryNFT.tokenData.tokenAddress).toLowerCase(),
78
+ nftTokenType: transactionHistoryNFT.tokenData.tokenType,
79
+ tokenSubID: transactionHistoryNFT.tokenData.tokenSubID,
80
+ amount: transactionHistoryNFT.amount,
81
+ };
82
+ };
83
+ const filterERC20 = (tokenAmount) => {
84
+ return tokenAmount.tokenData.tokenType === engine_1.TokenType.ERC20;
85
+ };
86
+ const filterNFT = (tokenAmount) => {
87
+ switch (tokenAmount.tokenData.tokenType) {
88
+ case engine_1.TokenType.ERC20:
89
+ return false;
90
+ case engine_1.TokenType.ERC721:
91
+ case engine_1.TokenType.ERC1155:
92
+ return tokenAmount.amount > BigInt(0);
93
+ }
94
+ };
95
+ const receiveERC20AmountsHaveShieldFee = (receiveERC20Amounts) => {
96
+ return receiveERC20Amounts.find(amount => amount.shieldFee) != null;
97
+ };
98
+ const categoryForTransactionHistoryItem = (historyItem) => {
99
+ const hasTransferNFTs = historyItem.transferNFTAmounts.length > 0;
100
+ const hasReceiveNFTs = historyItem.receiveNFTAmounts.length > 0;
101
+ const hasUnshieldNFTs = historyItem.unshieldNFTAmounts.length > 0;
102
+ if (hasTransferNFTs || hasReceiveNFTs || hasUnshieldNFTs) {
103
+ // Some kind of NFT Transfer. Unhandled case.
104
+ return shared_models_1.TransactionHistoryItemCategory.Unknown;
105
+ }
106
+ const hasTransferERC20s = historyItem.transferERC20Amounts.length > 0;
107
+ const hasReceiveERC20s = historyItem.receiveERC20Amounts.length > 0;
108
+ const hasUnshieldERC20s = historyItem.unshieldERC20Amounts.length > 0;
109
+ if (hasTransferERC20s && !hasReceiveERC20s && !hasUnshieldERC20s) {
110
+ // Only transfer erc20s.
111
+ return shared_models_1.TransactionHistoryItemCategory.TransferSendERC20s;
112
+ }
113
+ if (!hasTransferERC20s && hasReceiveERC20s && !hasUnshieldERC20s) {
114
+ // Only receive erc20s.
115
+ const hasShieldFee = receiveERC20AmountsHaveShieldFee(historyItem.receiveERC20Amounts);
116
+ if (hasShieldFee) {
117
+ // Note: Shield fees were added to contract events in Mar 2023.
118
+ // Prior shields will show as TransferReceiveERC20s without fees.
119
+ return shared_models_1.TransactionHistoryItemCategory.ShieldERC20s;
120
+ }
121
+ return shared_models_1.TransactionHistoryItemCategory.TransferReceiveERC20s;
122
+ }
123
+ if (!hasTransferERC20s && !hasReceiveERC20s && hasUnshieldERC20s) {
124
+ // Only unshield erc20s.
125
+ return shared_models_1.TransactionHistoryItemCategory.UnshieldERC20s;
126
+ }
127
+ return shared_models_1.TransactionHistoryItemCategory.Unknown;
128
+ };
129
+ exports.categoryForTransactionHistoryItem = categoryForTransactionHistoryItem;
130
+ const serializeTransactionHistory = (transactionHistory) => {
131
+ const historyItemsUncategorized = transactionHistory.map(historyEntry => ({
132
+ txid: engine_1.ByteUtils.formatToByteLength(historyEntry.txid, engine_1.ByteLength.UINT_256, true),
133
+ blockNumber: historyEntry.blockNumber,
134
+ timestamp: historyEntry.timestamp,
135
+ transferERC20Amounts: historyEntry.transferTokenAmounts
136
+ .filter(filterERC20)
137
+ .map(transactionHistoryTransferTokenAmountToMatrixERC20Amount),
138
+ broadcasterFeeERC20Amount: historyEntry.relayerFeeTokenAmount
139
+ ? transactionHistoryTokenAmountToMatrixERC20Amount(historyEntry.relayerFeeTokenAmount)
140
+ : undefined,
141
+ changeERC20Amounts: historyEntry.changeTokenAmounts
142
+ .filter(filterERC20)
143
+ .map(transactionHistoryTokenAmountToMatrixERC20Amount),
144
+ receiveERC20Amounts: historyEntry.receiveTokenAmounts
145
+ .filter(filterERC20)
146
+ .map(transactionHistoryReceiveTokenAmountToMatrixERC20Amount),
147
+ unshieldERC20Amounts: historyEntry.unshieldTokenAmounts
148
+ .filter(filterERC20)
149
+ .map(transactionHistoryUnshieldTokenAmountToMatrixERC20Amount),
150
+ receiveNFTAmounts: historyEntry.receiveTokenAmounts
151
+ .filter(filterNFT)
152
+ .map(transactionHistoryReceiveNFTToMatrixNFTAmount),
153
+ transferNFTAmounts: historyEntry.transferTokenAmounts
154
+ .filter(filterNFT)
155
+ .map(transactionHistoryTransferNFTToMatrixNFTAmount),
156
+ unshieldNFTAmounts: historyEntry.unshieldTokenAmounts
157
+ .filter(filterNFT)
158
+ .map(transactionHistoryUnshieldNFTToMatrixNFTAmount),
159
+ version: historyEntry.version,
160
+ category: shared_models_1.TransactionHistoryItemCategory.Unknown,
161
+ }));
162
+ // Add category for items based on token types.
163
+ return historyItemsUncategorized.map(historyItem => ({
164
+ ...historyItem,
165
+ category: (0, exports.categoryForTransactionHistoryItem)(historyItem),
166
+ }));
167
+ };
168
+ const getWalletTransactionHistory = async (chain, matrixWalletID, startingBlock) => {
169
+ try {
170
+ const wallet = (0, wallets_1.walletForID)(matrixWalletID);
171
+ const transactionHistory = await wallet.getTransactionHistory(chain, startingBlock);
172
+ return serializeTransactionHistory(transactionHistory);
173
+ }
174
+ catch (err) {
175
+ (0, error_1.reportAndSanitizeError)(exports.getWalletTransactionHistory.name, err);
176
+ throw new Error('Could not load Matrix wallet transaction history.', {
177
+ cause: err,
178
+ });
179
+ }
180
+ };
181
+ exports.getWalletTransactionHistory = getWalletTransactionHistory;
182
+ //# sourceMappingURL=transaction-history.js.map