@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,759 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ const chai_1 = __importDefault(require("chai"));
30
+ const chai_as_promised_1 = __importDefault(require("chai-as-promised"));
31
+ const sinon_1 = __importDefault(require("sinon"));
32
+ const engine_1 = require("@matrix-privacy/engine");
33
+ const shared_models_1 = require("@matrix-privacy/shared-models");
34
+ const setup_test_1 = require("../../../tests/setup.test");
35
+ const mocks_test_1 = require("../../../tests/mocks.test");
36
+ const tx_unshield_1 = require("../tx-unshield");
37
+ const tx_proof_unshield_1 = require("../tx-proof-unshield");
38
+ const txGasDetailsModule = __importStar(require("../tx-gas-details"));
39
+ const matrixModule = __importStar(require("../../matrix"));
40
+ const wallets_1 = require("../../matrix/wallets/wallets");
41
+ const providers_1 = require("../../matrix/core/providers");
42
+ const proof_cache_1 = require("../proof-cache");
43
+ const engine_stubs_test_1 = require("../../../tests/stubs/engine-stubs.test");
44
+ let gasEstimateStub;
45
+ let railProveStub;
46
+ let railDummyProveStub;
47
+ let railTransactStub;
48
+ let relayAdaptPopulateUnshieldBaseToken;
49
+ let addUnshieldDataSpy;
50
+ let erc20NoteSpy;
51
+ let matrixWallet;
52
+ let broadcasterFeeERC20AmountRecipient;
53
+ const hardhatRelayAdaptContract = shared_models_1.NETWORK_CONFIG[shared_models_1.NetworkName.Hardhat].relayAdaptContract;
54
+ chai_1.default.use(chai_as_promised_1.default);
55
+ const { expect } = chai_1.default;
56
+ const mockERC20TokenData0 = (0, engine_1.getTokenDataERC20)(mocks_test_1.MOCK_TOKEN_AMOUNTS[0].tokenAddress);
57
+ const mockERC20TokenData1 = (0, engine_1.getTokenDataERC20)(mocks_test_1.MOCK_TOKEN_AMOUNTS[1].tokenAddress);
58
+ const mockNFTTokenData0 = (0, engine_1.getTokenDataNFT)(mocks_test_1.MOCK_NFT_AMOUNT_RECIPIENTS_UNSHIELD[0].nftAddress, mocks_test_1.MOCK_NFT_AMOUNT_RECIPIENTS_UNSHIELD[0].nftTokenType, mocks_test_1.MOCK_NFT_AMOUNT_RECIPIENTS_UNSHIELD[0].tokenSubID);
59
+ const mockNFTTokenData1 = (0, engine_1.getTokenDataNFT)(mocks_test_1.MOCK_NFT_AMOUNT_RECIPIENTS_UNSHIELD[1].nftAddress, mocks_test_1.MOCK_NFT_AMOUNT_RECIPIENTS_UNSHIELD[1].nftTokenType, mocks_test_1.MOCK_NFT_AMOUNT_RECIPIENTS_UNSHIELD[1].tokenSubID);
60
+ const MOCK_TOKEN_AMOUNTS_DIFFERENT = [
61
+ {
62
+ tokenAddress: mocks_test_1.MOCK_TOKEN_ADDRESS,
63
+ amount: BigInt(0x0100),
64
+ },
65
+ {
66
+ tokenAddress: mocks_test_1.MOCK_TOKEN_ADDRESS_2,
67
+ amount: BigInt(0x0300),
68
+ },
69
+ ];
70
+ const overallBatchMinGasPrice = BigInt('0x1000');
71
+ const gasDetails = {
72
+ evmGasType: shared_models_1.EVMGasType.Type1,
73
+ gasEstimate: 1000n,
74
+ gasPrice: overallBatchMinGasPrice,
75
+ };
76
+ const gasDetailsType2 = {
77
+ evmGasType: shared_models_1.EVMGasType.Type2,
78
+ gasEstimate: 1000n,
79
+ maxFeePerGas: overallBatchMinGasPrice,
80
+ maxPriorityFeePerGas: overallBatchMinGasPrice,
81
+ };
82
+ const MOCK_TOKEN_AMOUNT_RECIPIENTS_INVALID = mocks_test_1.MOCK_TOKEN_AMOUNTS.map(erc20Amount => ({
83
+ ...erc20Amount,
84
+ recipientAddress: mocks_test_1.MOCK_MATRIX_WALLET_ADDRESS,
85
+ }));
86
+ const MOCK_TOKEN_AMOUNT_RECIPIENTS = mocks_test_1.MOCK_TOKEN_AMOUNTS.map(erc20Amount => ({
87
+ ...erc20Amount,
88
+ recipientAddress: mocks_test_1.MOCK_ETH_WALLET_ADDRESS,
89
+ }));
90
+ const MOCK_TOKEN_AMOUNT_RECIPIENTS_DIFFERENT = MOCK_TOKEN_AMOUNTS_DIFFERENT.map(erc20Amount => ({
91
+ ...erc20Amount,
92
+ recipientAddress: mocks_test_1.MOCK_ETH_WALLET_ADDRESS,
93
+ }));
94
+ const stubGasEstimateSuccess = () => {
95
+ gasEstimateStub = sinon_1.default.stub(txGasDetailsModule, 'getGasEstimate').resolves(BigInt('200'));
96
+ };
97
+ const stubGasEstimateFailure = () => {
98
+ gasEstimateStub = sinon_1.default.stub(txGasDetailsModule, 'getGasEstimate').rejects(new Error('test rejection - gas estimate'));
99
+ };
100
+ const spyOnSetUnshield = () => {
101
+ addUnshieldDataSpy = sinon_1.default.spy(engine_1.TransactionBatch.prototype, 'addUnshieldData');
102
+ };
103
+ describe('tx-unshield', () => {
104
+ before(async function run() {
105
+ this.timeout(60000);
106
+ await (0, setup_test_1.initTestEngine)();
107
+ await (0, setup_test_1.initTestEngineNetworks)();
108
+ const matrixWalletInfo = await (0, wallets_1.createMatrixWallet)(mocks_test_1.MOCK_DB_ENCRYPTION_KEY, mocks_test_1.MOCK_MNEMONIC, undefined);
109
+ if (!(0, shared_models_1.isDefined)(matrixWalletInfo)) {
110
+ throw new Error('Expected matrixWalletInfo');
111
+ }
112
+ matrixWallet = (0, wallets_1.fullWalletForID)(matrixWalletInfo.id);
113
+ const broadcasterWalletInfo = await (0, wallets_1.createMatrixWallet)(mocks_test_1.MOCK_DB_ENCRYPTION_KEY, mocks_test_1.MOCK_MNEMONIC, undefined);
114
+ if (!(0, shared_models_1.isDefined)(broadcasterWalletInfo)) {
115
+ throw new Error('Expected broadcasterWalletInfo');
116
+ }
117
+ const broadcasterMatrixAddress = broadcasterWalletInfo.matrixAddress;
118
+ broadcasterFeeERC20AmountRecipient = {
119
+ ...mocks_test_1.MOCK_TOKEN_FEE,
120
+ recipientAddress: broadcasterMatrixAddress,
121
+ };
122
+ railProveStub = sinon_1.default.stub(engine_1.TransactionBatch.prototype, 'generateTransactions').resolves({
123
+ provedTransactions: [
124
+ {
125
+ nullifiers: mocks_test_1.MOCK_NULLIFIERS,
126
+ },
127
+ ],
128
+ });
129
+ railDummyProveStub = sinon_1.default.stub(engine_1.TransactionBatch.prototype, 'generateDummyTransactions').resolves([
130
+ {
131
+ commitments: mocks_test_1.MOCK_COMMITMENTS,
132
+ boundParams: mocks_test_1.MOCK_BOUND_PARAMS_V3,
133
+ nullifiers: mocks_test_1.MOCK_NULLIFIERS,
134
+ },
135
+ ]);
136
+ railTransactStub = sinon_1.default.stub(engine_1.MatrixContracts, 'generateTransact').resolves({ data: '0x0123' });
137
+ relayAdaptPopulateUnshieldBaseToken = sinon_1.default.stub(engine_1.RelayAdaptV3Contract.prototype, 'populateUnshieldBaseToken').resolves({ data: '0x0123' });
138
+ // For Unshield To Origin
139
+ await (0, engine_stubs_test_1.createEngineWalletBalancesStub)(matrixWallet.addressKeys, mocks_test_1.MOCK_TOKEN_ADDRESS, 0);
140
+ });
141
+ afterEach(() => {
142
+ gasEstimateStub?.restore();
143
+ addUnshieldDataSpy?.restore();
144
+ erc20NoteSpy?.restore();
145
+ });
146
+ after(async () => {
147
+ railProveStub.restore();
148
+ railDummyProveStub.restore();
149
+ railTransactStub.restore();
150
+ relayAdaptPopulateUnshieldBaseToken.restore();
151
+ (0, engine_stubs_test_1.restoreEngineStubs)();
152
+ await (0, setup_test_1.closeTestEngine)();
153
+ });
154
+ // UNSHIELD - GAS ESTIMATE
155
+ it('Should get gas estimates for valid Unshield', async () => {
156
+ stubGasEstimateSuccess();
157
+ spyOnSetUnshield();
158
+ const rsp = await (0, tx_unshield_1.gasEstimateForUnprovenUnshield)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, mocks_test_1.MOCK_DB_ENCRYPTION_KEY, MOCK_TOKEN_AMOUNT_RECIPIENTS, [], // nftAmountRecipients
159
+ mocks_test_1.MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2, mocks_test_1.MOCK_FEE_TOKEN_DETAILS, false);
160
+ expect(addUnshieldDataSpy.called).to.be.true;
161
+ expect(addUnshieldDataSpy.args).to.deep.equal([
162
+ [
163
+ {
164
+ toAddress: mocks_test_1.MOCK_ETH_WALLET_ADDRESS,
165
+ tokenData: mockERC20TokenData0,
166
+ value: BigInt('0x0100'),
167
+ allowOverride: false,
168
+ },
169
+ ],
170
+ [
171
+ {
172
+ toAddress: mocks_test_1.MOCK_ETH_WALLET_ADDRESS,
173
+ tokenData: mockERC20TokenData1,
174
+ value: BigInt('0x0200'),
175
+ allowOverride: false,
176
+ },
177
+ ],
178
+ [
179
+ {
180
+ toAddress: mocks_test_1.MOCK_ETH_WALLET_ADDRESS,
181
+ tokenData: mockERC20TokenData0,
182
+ value: BigInt('0x0100'),
183
+ allowOverride: false,
184
+ },
185
+ ],
186
+ [
187
+ {
188
+ toAddress: mocks_test_1.MOCK_ETH_WALLET_ADDRESS,
189
+ tokenData: mockERC20TokenData1,
190
+ value: BigInt('0x0200'),
191
+ allowOverride: false,
192
+ },
193
+ ], // run 2 - token 2
194
+ ]);
195
+ // Add 9000 for the dummy tx variance
196
+ expect(rsp.gasEstimate).to.equal(9000n + 200n);
197
+ }).timeout(30000);
198
+ it('Should get gas estimates for valid Unshield To Origin', async () => {
199
+ stubGasEstimateSuccess();
200
+ spyOnSetUnshield();
201
+ const rsp = await (0, tx_unshield_1.gasEstimateForUnprovenUnshieldToOrigin)(engine_stubs_test_1.MOCK_SHIELD_TXID_FOR_BALANCES, // originalShieldTxid
202
+ shared_models_1.NetworkName.Hardhat, matrixWallet.id, mocks_test_1.MOCK_DB_ENCRYPTION_KEY, [
203
+ {
204
+ tokenAddress: mocks_test_1.MOCK_TOKEN_ADDRESS,
205
+ amount: engine_stubs_test_1.MOCK_TOKEN_BALANCE,
206
+ recipientAddress: mocks_test_1.MOCK_ETH_WALLET_ADDRESS,
207
+ },
208
+ ], []);
209
+ expect(addUnshieldDataSpy.called).to.be.true;
210
+ expect(addUnshieldDataSpy.args).to.deep.equal([
211
+ [
212
+ {
213
+ toAddress: mocks_test_1.MOCK_ETH_WALLET_ADDRESS,
214
+ tokenData: mockERC20TokenData0,
215
+ value: engine_stubs_test_1.MOCK_TOKEN_BALANCE,
216
+ allowOverride: false,
217
+ },
218
+ ],
219
+ ]);
220
+ // Add 9000 for the dummy tx variance
221
+ expect(rsp.gasEstimate).to.equal(9000n + 200n);
222
+ }).timeout(30000);
223
+ it('Should error on gas estimates for invalid Unshield', async () => {
224
+ stubGasEstimateSuccess();
225
+ await expect((0, tx_unshield_1.gasEstimateForUnprovenUnshield)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, mocks_test_1.MOCK_DB_ENCRYPTION_KEY, MOCK_TOKEN_AMOUNT_RECIPIENTS_INVALID, [], // nftAmountRecipients
226
+ mocks_test_1.MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2, mocks_test_1.MOCK_FEE_TOKEN_DETAILS, false)).rejectedWith('Invalid wallet address.');
227
+ });
228
+ it('Should error on unshield gas estimate for ethers rejections', async () => {
229
+ stubGasEstimateFailure();
230
+ await expect((0, tx_unshield_1.gasEstimateForUnprovenUnshield)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, mocks_test_1.MOCK_DB_ENCRYPTION_KEY, MOCK_TOKEN_AMOUNT_RECIPIENTS, [], // nftAmountRecipients
231
+ mocks_test_1.MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2, mocks_test_1.MOCK_FEE_TOKEN_DETAILS, false)).rejectedWith('test rejection - gas estimate');
232
+ });
233
+ // UNSHIELD BASE TOKEN - GAS ESTIMATE
234
+ it('Should get gas estimates for valid Unshield base token', async () => {
235
+ stubGasEstimateSuccess();
236
+ spyOnSetUnshield();
237
+ const rsp = await (0, tx_unshield_1.gasEstimateForUnprovenUnshieldBaseToken)(shared_models_1.NetworkName.Hardhat, mocks_test_1.MOCK_ETH_WALLET_ADDRESS, matrixWallet.id, mocks_test_1.MOCK_DB_ENCRYPTION_KEY, mocks_test_1.MOCK_TOKEN_AMOUNTS[0], mocks_test_1.MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2, mocks_test_1.MOCK_FEE_TOKEN_DETAILS, false);
238
+ expect(addUnshieldDataSpy.called).to.be.true;
239
+ expect(addUnshieldDataSpy.args).to.deep.equal([
240
+ [
241
+ {
242
+ toAddress: hardhatRelayAdaptContract,
243
+ tokenData: mockERC20TokenData0,
244
+ value: BigInt('0x0100'),
245
+ allowOverride: false,
246
+ },
247
+ ],
248
+ [
249
+ {
250
+ toAddress: hardhatRelayAdaptContract,
251
+ tokenData: mockERC20TokenData0,
252
+ value: BigInt('0x0100'),
253
+ allowOverride: false,
254
+ },
255
+ ],
256
+ ]);
257
+ // Add 9000 for the dummy tx variance
258
+ expect(rsp.gasEstimate).to.equal(9000n + 200n);
259
+ }).timeout(30000);
260
+ it('Should get gas estimates for valid Unshield base token: public wallet', async () => {
261
+ stubGasEstimateSuccess();
262
+ spyOnSetUnshield();
263
+ const rsp = await (0, tx_unshield_1.gasEstimateForUnprovenUnshieldBaseToken)(shared_models_1.NetworkName.Hardhat, mocks_test_1.MOCK_ETH_WALLET_ADDRESS, matrixWallet.id, mocks_test_1.MOCK_DB_ENCRYPTION_KEY, mocks_test_1.MOCK_TOKEN_AMOUNTS[0], mocks_test_1.MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2, mocks_test_1.MOCK_FEE_TOKEN_DETAILS, true);
264
+ expect(addUnshieldDataSpy.called).to.be.true;
265
+ expect(addUnshieldDataSpy.args).to.deep.equal([
266
+ [
267
+ {
268
+ toAddress: hardhatRelayAdaptContract,
269
+ tokenData: mockERC20TokenData0,
270
+ value: BigInt('0x0100'),
271
+ allowOverride: false,
272
+ },
273
+ ],
274
+ ]);
275
+ // Add 9000 for the dummy tx variance
276
+ expect(rsp.gasEstimate).to.equal(9000n + 200n);
277
+ }).timeout(30000);
278
+ it('Should error on gas estimates for invalid Unshield base token', async () => {
279
+ stubGasEstimateSuccess();
280
+ await expect((0, tx_unshield_1.gasEstimateForUnprovenUnshieldBaseToken)(shared_models_1.NetworkName.Hardhat, mocks_test_1.MOCK_MATRIX_WALLET_ADDRESS, matrixWallet.id, mocks_test_1.MOCK_DB_ENCRYPTION_KEY, mocks_test_1.MOCK_TOKEN_AMOUNTS[0], mocks_test_1.MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2, mocks_test_1.MOCK_FEE_TOKEN_DETAILS, false)).rejectedWith('Invalid wallet address.');
281
+ });
282
+ it('Should error on unshield base token gas estimate for ethers rejections', async () => {
283
+ stubGasEstimateFailure();
284
+ await expect((0, tx_unshield_1.gasEstimateForUnprovenUnshieldBaseToken)(shared_models_1.NetworkName.Hardhat, mocks_test_1.MOCK_ETH_WALLET_ADDRESS, matrixWallet.id, mocks_test_1.MOCK_DB_ENCRYPTION_KEY, mocks_test_1.MOCK_TOKEN_AMOUNTS[0], mocks_test_1.MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2, mocks_test_1.MOCK_FEE_TOKEN_DETAILS, false)).rejectedWith('test rejection - gas estimate');
285
+ });
286
+ // UNSHIELD - PROVE AND SEND
287
+ it('Should populate tx for valid Unshield', async () => {
288
+ stubGasEstimateSuccess();
289
+ (0, proof_cache_1.setCachedProvedTransaction)(undefined);
290
+ spyOnSetUnshield();
291
+ await (0, tx_proof_unshield_1.generateUnshieldProof)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, mocks_test_1.MOCK_DB_ENCRYPTION_KEY, MOCK_TOKEN_AMOUNT_RECIPIENTS, mocks_test_1.MOCK_NFT_AMOUNT_RECIPIENTS_UNSHIELD, broadcasterFeeERC20AmountRecipient, false, // sendWithPublicWallet
292
+ overallBatchMinGasPrice, () => { });
293
+ expect(addUnshieldDataSpy.called).to.be.true;
294
+ expect(addUnshieldDataSpy.args).to.deep.equal([
295
+ [
296
+ {
297
+ toAddress: mocks_test_1.MOCK_ETH_WALLET_ADDRESS,
298
+ tokenData: mockERC20TokenData0,
299
+ value: BigInt('0x0100'),
300
+ allowOverride: false,
301
+ },
302
+ ],
303
+ [
304
+ {
305
+ toAddress: mocks_test_1.MOCK_ETH_WALLET_ADDRESS,
306
+ tokenData: mockERC20TokenData1,
307
+ value: BigInt('0x0200'),
308
+ allowOverride: false,
309
+ },
310
+ ],
311
+ [
312
+ {
313
+ toAddress: mocks_test_1.MOCK_ETH_WALLET_ADDRESS,
314
+ tokenData: mockNFTTokenData0,
315
+ value: BigInt(1),
316
+ allowOverride: false,
317
+ },
318
+ ],
319
+ [
320
+ {
321
+ toAddress: mocks_test_1.MOCK_ETH_WALLET_ADDRESS,
322
+ tokenData: mockNFTTokenData1,
323
+ value: BigInt(2),
324
+ allowOverride: false,
325
+ },
326
+ ], // run 1 - NFT token 2
327
+ ]);
328
+ const populateResponse = await (0, tx_unshield_1.populateProvedUnshield)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, MOCK_TOKEN_AMOUNT_RECIPIENTS, mocks_test_1.MOCK_NFT_AMOUNT_RECIPIENTS_UNSHIELD, broadcasterFeeERC20AmountRecipient, false, // sendWithPublicWallet
329
+ overallBatchMinGasPrice, gasDetails);
330
+ expect(populateResponse.nullifiers).to.deep.equal([
331
+ '0x0000000000000000000000000000000000000000000000000000000000000001',
332
+ '0x0000000000000000000000000000000000000000000000000000000000000002',
333
+ ]);
334
+ const { transaction } = populateResponse;
335
+ expect(transaction.nonce).to.equal(undefined);
336
+ expect(transaction.gasPrice?.toString()).to.equal('4096');
337
+ expect(transaction.gasLimit).to.equal(1200n);
338
+ expect(transaction.value?.toString()).to.equal(undefined);
339
+ expect(transaction.data).to.equal('0x0123');
340
+ expect(transaction.to).to.equal(undefined);
341
+ expect(transaction.chainId).to.equal(undefined);
342
+ expect(transaction.type).to.equal(1);
343
+ });
344
+ it('Should populate tx for valid Unshield To Origin', async () => {
345
+ stubGasEstimateSuccess();
346
+ (0, proof_cache_1.setCachedProvedTransaction)(undefined);
347
+ spyOnSetUnshield();
348
+ await (0, tx_proof_unshield_1.generateUnshieldToOriginProof)(engine_stubs_test_1.MOCK_SHIELD_TXID_FOR_BALANCES, // originalShieldTxid
349
+ shared_models_1.NetworkName.Hardhat, matrixWallet.id, mocks_test_1.MOCK_DB_ENCRYPTION_KEY, [
350
+ {
351
+ tokenAddress: mocks_test_1.MOCK_TOKEN_ADDRESS,
352
+ amount: engine_stubs_test_1.MOCK_TOKEN_BALANCE,
353
+ recipientAddress: mocks_test_1.MOCK_ETH_WALLET_ADDRESS,
354
+ },
355
+ ], [], () => { });
356
+ expect(addUnshieldDataSpy.called).to.be.true;
357
+ expect(addUnshieldDataSpy.args).to.deep.equal([
358
+ [
359
+ {
360
+ toAddress: mocks_test_1.MOCK_ETH_WALLET_ADDRESS,
361
+ tokenData: mockERC20TokenData0,
362
+ value: engine_stubs_test_1.MOCK_TOKEN_BALANCE,
363
+ allowOverride: false,
364
+ },
365
+ ], // run 1 - erc20 token 1
366
+ ]);
367
+ const populateResponse = await (0, tx_unshield_1.populateProvedUnshieldToOrigin)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, [
368
+ {
369
+ tokenAddress: mocks_test_1.MOCK_TOKEN_ADDRESS,
370
+ amount: engine_stubs_test_1.MOCK_TOKEN_BALANCE,
371
+ recipientAddress: mocks_test_1.MOCK_ETH_WALLET_ADDRESS,
372
+ },
373
+ ], [], gasDetailsType2);
374
+ expect(populateResponse.nullifiers).to.deep.equal([
375
+ '0x0000000000000000000000000000000000000000000000000000000000000001',
376
+ '0x0000000000000000000000000000000000000000000000000000000000000002',
377
+ ]);
378
+ const { transaction } = populateResponse;
379
+ expect(transaction.nonce).to.equal(undefined);
380
+ expect(transaction.gasLimit).to.equal(1200n);
381
+ expect(transaction.value?.toString()).to.equal(undefined);
382
+ expect(transaction.data).to.equal('0x0123');
383
+ expect(transaction.to).to.equal(undefined);
384
+ expect(transaction.chainId).to.equal(undefined);
385
+ expect(transaction.type).to.equal(2);
386
+ });
387
+ it('Should error on populate tx for invalid Unshield', async () => {
388
+ stubGasEstimateSuccess();
389
+ await expect((0, tx_unshield_1.populateProvedUnshield)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, MOCK_TOKEN_AMOUNT_RECIPIENTS_DIFFERENT, mocks_test_1.MOCK_NFT_AMOUNT_RECIPIENTS_UNSHIELD, broadcasterFeeERC20AmountRecipient, false, // sendWithPublicWallet
390
+ overallBatchMinGasPrice, gasDetails)).rejectedWith('Invalid proof for this transaction');
391
+ });
392
+ it('Should error on populate unshield tx for unproved transaction', async () => {
393
+ stubGasEstimateSuccess();
394
+ (0, proof_cache_1.setCachedProvedTransaction)(undefined);
395
+ await expect((0, tx_unshield_1.populateProvedUnshield)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, MOCK_TOKEN_AMOUNT_RECIPIENTS, [], // nftAmountRecipients
396
+ broadcasterFeeERC20AmountRecipient, false, // sendWithPublicWallet
397
+ overallBatchMinGasPrice, gasDetails)).rejectedWith('Invalid proof for this transaction');
398
+ });
399
+ it('Should error on populate unshield tx when params changed (invalid cached proof)', async () => {
400
+ stubGasEstimateSuccess();
401
+ await (0, tx_proof_unshield_1.generateUnshieldProof)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, mocks_test_1.MOCK_DB_ENCRYPTION_KEY, MOCK_TOKEN_AMOUNT_RECIPIENTS, [], // nftAmountRecipients
402
+ broadcasterFeeERC20AmountRecipient, false, // sendWithPublicWallet
403
+ overallBatchMinGasPrice, () => { });
404
+ await expect((0, tx_unshield_1.populateProvedUnshield)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, MOCK_TOKEN_AMOUNT_RECIPIENTS_DIFFERENT, [], // nftAmountRecipients
405
+ broadcasterFeeERC20AmountRecipient, false, // sendWithPublicWallet
406
+ overallBatchMinGasPrice, gasDetails)).rejectedWith('Invalid proof for this transaction');
407
+ });
408
+ // UNSHIELD BASE TOKEN - PROVE AND SEND
409
+ it('Should populate tx for valid Unshield Base Token', async () => {
410
+ stubGasEstimateSuccess();
411
+ (0, proof_cache_1.setCachedProvedTransaction)(undefined);
412
+ spyOnSetUnshield();
413
+ await (0, tx_proof_unshield_1.generateUnshieldBaseTokenProof)(shared_models_1.NetworkName.Hardhat, mocks_test_1.MOCK_ETH_WALLET_ADDRESS, matrixWallet.id, mocks_test_1.MOCK_DB_ENCRYPTION_KEY, mocks_test_1.MOCK_TOKEN_AMOUNTS[0], broadcasterFeeERC20AmountRecipient, false, // sendWithPublicWallet
414
+ overallBatchMinGasPrice, () => { });
415
+ expect(addUnshieldDataSpy.called).to.be.true;
416
+ expect(addUnshieldDataSpy.args).to.deep.equal([
417
+ [
418
+ {
419
+ toAddress: hardhatRelayAdaptContract,
420
+ tokenData: mockERC20TokenData0,
421
+ value: BigInt('0x0100'),
422
+ allowOverride: false,
423
+ },
424
+ ],
425
+ [
426
+ {
427
+ toAddress: hardhatRelayAdaptContract,
428
+ tokenData: mockERC20TokenData0,
429
+ value: BigInt('0x0100'),
430
+ allowOverride: false,
431
+ },
432
+ ], // Actual prove
433
+ ]);
434
+ const populateResponse = await (0, tx_unshield_1.populateProvedUnshieldBaseToken)(shared_models_1.NetworkName.Hardhat, mocks_test_1.MOCK_ETH_WALLET_ADDRESS, matrixWallet.id, mocks_test_1.MOCK_TOKEN_AMOUNTS[0], broadcasterFeeERC20AmountRecipient, false, // sendWithPublicWallet
435
+ overallBatchMinGasPrice, gasDetails);
436
+ const { transaction } = populateResponse;
437
+ expect(transaction.nonce).to.equal(undefined);
438
+ expect(transaction.gasPrice?.toString()).to.equal('4096');
439
+ expect(transaction.gasLimit).to.equal(1200n);
440
+ expect(transaction.value?.toString()).to.equal(undefined);
441
+ expect(transaction.data).to.equal('0x0123');
442
+ expect(transaction.to).to.equal(undefined);
443
+ expect(transaction.chainId).to.equal(undefined);
444
+ expect(transaction.type).to.equal(1);
445
+ }).timeout(60000);
446
+ it('Should error on populate tx for invalid Unshield Base Token', async () => {
447
+ stubGasEstimateSuccess();
448
+ await expect((0, tx_unshield_1.populateProvedUnshieldBaseToken)(shared_models_1.NetworkName.Hardhat, mocks_test_1.MOCK_ETH_WALLET_ADDRESS, matrixWallet.id, MOCK_TOKEN_AMOUNTS_DIFFERENT[1], broadcasterFeeERC20AmountRecipient, false, // sendWithPublicWallet
449
+ overallBatchMinGasPrice, gasDetails)).rejectedWith('Invalid proof for this transaction');
450
+ });
451
+ it('Should error on populate Unshield Base Token tx for unproved transaction', async () => {
452
+ stubGasEstimateSuccess();
453
+ (0, proof_cache_1.setCachedProvedTransaction)(undefined);
454
+ await expect((0, tx_unshield_1.populateProvedUnshieldBaseToken)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, mocks_test_1.MOCK_ETH_WALLET_ADDRESS, mocks_test_1.MOCK_TOKEN_AMOUNTS[0], broadcasterFeeERC20AmountRecipient, false, // sendWithPublicWallet
455
+ overallBatchMinGasPrice, gasDetails)).rejectedWith('Invalid proof for this transaction');
456
+ });
457
+ it('Should error on populate Unshield Base Token tx when params changed (invalid cached proof)', async () => {
458
+ stubGasEstimateSuccess();
459
+ await (0, tx_proof_unshield_1.generateUnshieldBaseTokenProof)(shared_models_1.NetworkName.Hardhat, mocks_test_1.MOCK_ETH_WALLET_ADDRESS, matrixWallet.id, mocks_test_1.MOCK_DB_ENCRYPTION_KEY, mocks_test_1.MOCK_TOKEN_AMOUNTS[1], broadcasterFeeERC20AmountRecipient, false, // sendWithPublicWallet
460
+ overallBatchMinGasPrice, () => { });
461
+ await expect((0, tx_unshield_1.populateProvedUnshieldBaseToken)(shared_models_1.NetworkName.Hardhat, mocks_test_1.MOCK_ETH_WALLET_ADDRESS, matrixWallet.id, MOCK_TOKEN_AMOUNTS_DIFFERENT[1], broadcasterFeeERC20AmountRecipient, false, // sendWithPublicWallet
462
+ overallBatchMinGasPrice, gasDetails)).rejectedWith('Invalid proof for this transaction');
463
+ });
464
+ describe('Token unshield owner', () => {
465
+ let originalProvider;
466
+ let hadOriginalProvider;
467
+ const MOCK_USER_ADDRESS = '0x1234567890123456789012345678901234567890';
468
+ const MOCK_RELAYER_ADDRESS = '0x9876543210987654321098765432109876543210';
469
+ const MOCK_MATRIX_PROXY_ADDRESS = shared_models_1.NETWORK_CONFIG[shared_models_1.NetworkName.Hardhat].accumulatorContract;
470
+ const MOCK_SHIELD_TXID = '0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890';
471
+ const ERC20_TRANSFER_EVENT_SIGNATURE = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';
472
+ beforeEach(() => {
473
+ // Save original provider if it exists
474
+ try {
475
+ originalProvider = matrixModule.getFallbackProviderForNetwork(shared_models_1.NetworkName.Hardhat);
476
+ hadOriginalProvider = true;
477
+ }
478
+ catch {
479
+ originalProvider = undefined;
480
+ hadOriginalProvider = false;
481
+ }
482
+ });
483
+ afterEach(() => {
484
+ // Restore original provider or clear it
485
+ if (hadOriginalProvider && originalProvider) {
486
+ (0, providers_1.setFallbackProviderForNetwork)(shared_models_1.NetworkName.Hardhat, originalProvider);
487
+ }
488
+ else if (!hadOriginalProvider) {
489
+ // Clear the mock provider we set
490
+ delete providers_1.fallbackProviderMap[shared_models_1.NetworkName.Hardhat];
491
+ }
492
+ });
493
+ const createMockTransferLog = (fromAddress, toAddress, tokenAddress = mocks_test_1.MOCK_TOKEN_ADDRESS) => {
494
+ const paddedFrom = fromAddress.toLowerCase().replace('0x', '').padStart(64, '0');
495
+ const paddedTo = toAddress.toLowerCase().replace('0x', '').padStart(64, '0');
496
+ return {
497
+ address: tokenAddress,
498
+ topics: [
499
+ ERC20_TRANSFER_EVENT_SIGNATURE,
500
+ `0x${paddedFrom}`,
501
+ `0x${paddedTo}`,
502
+ ],
503
+ data: '0x0000000000000000000000000000000000000000000000000de0b6b3a7640000',
504
+ blockNumber: 12345,
505
+ transactionHash: MOCK_SHIELD_TXID,
506
+ transactionIndex: 0,
507
+ blockHash: '0xblockhash',
508
+ logIndex: 0,
509
+ removed: false,
510
+ index: 0,
511
+ };
512
+ };
513
+ const createMockReceipt = (logs) => {
514
+ return {
515
+ to: MOCK_MATRIX_PROXY_ADDRESS,
516
+ from: MOCK_RELAYER_ADDRESS,
517
+ contractAddress: null,
518
+ transactionIndex: 0,
519
+ gasUsed: BigInt(100000),
520
+ logsBloom: '0x',
521
+ blockHash: '0xblockhash',
522
+ transactionHash: MOCK_SHIELD_TXID,
523
+ logs,
524
+ blockNumber: 12345,
525
+ confirmations: 10,
526
+ cumulativeGasUsed: BigInt(100000),
527
+ effectiveGasPrice: BigInt(1000000000),
528
+ status: 1,
529
+ type: 2,
530
+ byzantium: true,
531
+ hash: MOCK_SHIELD_TXID,
532
+ index: 0,
533
+ };
534
+ };
535
+ const createMockTransaction = (fromAddress) => {
536
+ return {
537
+ hash: MOCK_SHIELD_TXID,
538
+ from: fromAddress,
539
+ to: MOCK_MATRIX_PROXY_ADDRESS,
540
+ nonce: 1,
541
+ gasLimit: BigInt(200000),
542
+ data: '0x',
543
+ value: BigInt(0),
544
+ chainId: BigInt(137),
545
+ blockNumber: 12345,
546
+ blockHash: '0xblockhash',
547
+ index: 0,
548
+ type: 2,
549
+ accessList: [],
550
+ };
551
+ };
552
+ it('Should reject when getTransaction fails', async function () {
553
+ this.timeout(60000);
554
+ const mockProvider = {
555
+ getTransaction: async () => {
556
+ throw new Error('RPC error: Transaction lookup failed');
557
+ },
558
+ getTransactionReceipt: async () => createMockReceipt([]),
559
+ };
560
+ (0, providers_1.setFallbackProviderForNetwork)(shared_models_1.NetworkName.Hardhat, mockProvider);
561
+ await expect((0, tx_unshield_1.getERC20AndNFTAmountRecipientsForUnshieldToOrigin)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, MOCK_SHIELD_TXID)).to.be.rejectedWith('RPC error: Transaction lookup failed');
562
+ });
563
+ it('Should reject when getTransactionReceipt fails', async function () {
564
+ this.timeout(60000);
565
+ const mockProvider = {
566
+ getTransaction: async () => createMockTransaction(MOCK_USER_ADDRESS),
567
+ getTransactionReceipt: async () => {
568
+ throw new Error('RPC error: Receipt lookup failed');
569
+ },
570
+ };
571
+ (0, providers_1.setFallbackProviderForNetwork)(shared_models_1.NetworkName.Hardhat, mockProvider);
572
+ await expect((0, tx_unshield_1.getERC20AndNFTAmountRecipientsForUnshieldToOrigin)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, MOCK_SHIELD_TXID)).to.be.rejectedWith('RPC error: Receipt lookup failed');
573
+ });
574
+ it('Should reject when both getTransaction and getTransactionReceipt fail', async function () {
575
+ this.timeout(60000);
576
+ const mockProvider = {
577
+ getTransaction: async () => {
578
+ // Simulate slower failure
579
+ await new Promise(resolve => setTimeout(resolve, 100));
580
+ throw new Error('RPC error: Transaction lookup failed');
581
+ },
582
+ getTransactionReceipt: async () => {
583
+ // Simulate faster failure
584
+ throw new Error('RPC error: Receipt lookup failed');
585
+ },
586
+ };
587
+ (0, providers_1.setFallbackProviderForNetwork)(shared_models_1.NetworkName.Hardhat, mockProvider);
588
+ // Promise.all() should reject with whichever error occurs first
589
+ // In this case, receipt fails faster
590
+ await expect((0, tx_unshield_1.getERC20AndNFTAmountRecipientsForUnshieldToOrigin)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, MOCK_SHIELD_TXID)).to.be.rejectedWith(/RPC error/);
591
+ });
592
+ it('Should timeout when getTransaction hangs indefinitely', async function () {
593
+ this.timeout(10000);
594
+ const mockProvider = {
595
+ getTransaction: async () => {
596
+ // Simulate a hanging promise that never resolves
597
+ return new Promise(() => { });
598
+ },
599
+ getTransactionReceipt: async () => createMockReceipt([]),
600
+ };
601
+ (0, providers_1.setFallbackProviderForNetwork)(shared_models_1.NetworkName.Hardhat, mockProvider);
602
+ // Create a timeout wrapper to test hanging behavior
603
+ const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('Test timeout: getTransaction hung')), 2000));
604
+ const callPromise = (0, tx_unshield_1.getERC20AndNFTAmountRecipientsForUnshieldToOrigin)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, MOCK_SHIELD_TXID);
605
+ await expect(Promise.race([callPromise, timeoutPromise])).to.be.rejectedWith('Test timeout: getTransaction hung');
606
+ });
607
+ it('Should timeout when getTransactionReceipt hangs indefinitely', async function () {
608
+ this.timeout(10000);
609
+ const mockProvider = {
610
+ getTransaction: async () => createMockTransaction(MOCK_USER_ADDRESS),
611
+ getTransactionReceipt: async () => {
612
+ // Simulate a hanging promise that never resolves
613
+ return new Promise(() => { });
614
+ },
615
+ };
616
+ (0, providers_1.setFallbackProviderForNetwork)(shared_models_1.NetworkName.Hardhat, mockProvider);
617
+ // Create a timeout wrapper to test hanging behavior
618
+ const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('Test timeout: getTransactionReceipt hung')), 2000));
619
+ const callPromise = (0, tx_unshield_1.getERC20AndNFTAmountRecipientsForUnshieldToOrigin)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, MOCK_SHIELD_TXID);
620
+ await expect(Promise.race([callPromise, timeoutPromise])).to.be.rejectedWith('Test timeout: getTransactionReceipt hung');
621
+ });
622
+ it('Should extract true token owner from Transfer events in EIP-7702 gasless transaction', async function () {
623
+ this.timeout(60000);
624
+ const transferLog = createMockTransferLog(MOCK_USER_ADDRESS, MOCK_MATRIX_PROXY_ADDRESS);
625
+ const mockReceipt = createMockReceipt([transferLog]);
626
+ const mockTransaction = createMockTransaction(MOCK_RELAYER_ADDRESS);
627
+ const mockProvider = {
628
+ getTransaction: async () => mockTransaction,
629
+ getTransactionReceipt: async () => mockReceipt,
630
+ };
631
+ (0, providers_1.setFallbackProviderForNetwork)(shared_models_1.NetworkName.Hardhat, mockProvider);
632
+ const result = await (0, tx_unshield_1.getERC20AndNFTAmountRecipientsForUnshieldToOrigin)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, MOCK_SHIELD_TXID);
633
+ expect(result.erc20AmountRecipients).to.be.an('array');
634
+ if (result.erc20AmountRecipients.length > 0) {
635
+ expect(result.erc20AmountRecipients[0].recipientAddress).to.equal(MOCK_USER_ADDRESS, 'Should extract token owner from Transfer event, not tx.from (relayer)');
636
+ }
637
+ });
638
+ it('Should handle standard transactions where tx.from equals token owner', async function () {
639
+ this.timeout(60000);
640
+ const transferLog = createMockTransferLog(MOCK_USER_ADDRESS, MOCK_MATRIX_PROXY_ADDRESS);
641
+ const mockReceipt = createMockReceipt([transferLog]);
642
+ const mockTransaction = createMockTransaction(MOCK_USER_ADDRESS);
643
+ const mockProvider = {
644
+ getTransaction: async () => mockTransaction,
645
+ getTransactionReceipt: async () => mockReceipt,
646
+ };
647
+ (0, providers_1.setFallbackProviderForNetwork)(shared_models_1.NetworkName.Hardhat, mockProvider);
648
+ const result = await (0, tx_unshield_1.getERC20AndNFTAmountRecipientsForUnshieldToOrigin)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, MOCK_SHIELD_TXID);
649
+ expect(result.erc20AmountRecipients).to.be.an('array');
650
+ if (result.erc20AmountRecipients.length > 0) {
651
+ expect(result.erc20AmountRecipients[0].recipientAddress).to.equal(MOCK_USER_ADDRESS);
652
+ }
653
+ });
654
+ it('Should ignore Transfer events not directed to Matrix contract', async function () {
655
+ this.timeout(60000);
656
+ const irrelevantTransferLog = createMockTransferLog(MOCK_USER_ADDRESS, mocks_test_1.MOCK_ETH_WALLET_ADDRESS);
657
+ const relevantTransferLog = createMockTransferLog(MOCK_USER_ADDRESS, MOCK_MATRIX_PROXY_ADDRESS);
658
+ const mockReceipt = createMockReceipt([
659
+ irrelevantTransferLog,
660
+ relevantTransferLog,
661
+ ]);
662
+ const mockTransaction = createMockTransaction(MOCK_RELAYER_ADDRESS);
663
+ const mockProvider = {
664
+ getTransaction: async () => mockTransaction,
665
+ getTransactionReceipt: async () => mockReceipt,
666
+ };
667
+ (0, providers_1.setFallbackProviderForNetwork)(shared_models_1.NetworkName.Hardhat, mockProvider);
668
+ const result = await (0, tx_unshield_1.getERC20AndNFTAmountRecipientsForUnshieldToOrigin)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, MOCK_SHIELD_TXID);
669
+ expect(result.erc20AmountRecipients).to.be.an('array');
670
+ if (result.erc20AmountRecipients.length > 0) {
671
+ expect(result.erc20AmountRecipients[0].recipientAddress).to.equal(MOCK_USER_ADDRESS);
672
+ }
673
+ });
674
+ it('Should fallback to tx.from when no Transfer events found', async function () {
675
+ this.timeout(60000);
676
+ const mockReceipt = createMockReceipt([]);
677
+ const mockTransaction = createMockTransaction(MOCK_USER_ADDRESS);
678
+ const mockProvider = {
679
+ getTransaction: async () => mockTransaction,
680
+ getTransactionReceipt: async () => mockReceipt,
681
+ };
682
+ (0, providers_1.setFallbackProviderForNetwork)(shared_models_1.NetworkName.Hardhat, mockProvider);
683
+ const result = await (0, tx_unshield_1.getERC20AndNFTAmountRecipientsForUnshieldToOrigin)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, MOCK_SHIELD_TXID);
684
+ expect(result.erc20AmountRecipients).to.be.an('array');
685
+ if (result.erc20AmountRecipients.length > 0) {
686
+ expect(result.erc20AmountRecipients[0].recipientAddress).to.equal(MOCK_USER_ADDRESS, 'Should fallback to tx.from when no Transfer events');
687
+ }
688
+ });
689
+ it('Should handle malformed log topics gracefully', async function () {
690
+ this.timeout(60000);
691
+ const malformedLog = {
692
+ address: mocks_test_1.MOCK_TOKEN_ADDRESS,
693
+ topics: [ERC20_TRANSFER_EVENT_SIGNATURE],
694
+ data: '0x0000000000000000000000000000000000000000000000000de0b6b3a7640000',
695
+ blockNumber: 12345,
696
+ transactionHash: MOCK_SHIELD_TXID,
697
+ transactionIndex: 0,
698
+ blockHash: '0xblockhash',
699
+ logIndex: 0,
700
+ removed: false,
701
+ index: 0,
702
+ };
703
+ const validLog = createMockTransferLog(MOCK_USER_ADDRESS, MOCK_MATRIX_PROXY_ADDRESS);
704
+ const mockReceipt = createMockReceipt([malformedLog, validLog]);
705
+ const mockTransaction = createMockTransaction(MOCK_RELAYER_ADDRESS);
706
+ const mockProvider = {
707
+ getTransaction: async () => mockTransaction,
708
+ getTransactionReceipt: async () => mockReceipt,
709
+ };
710
+ (0, providers_1.setFallbackProviderForNetwork)(shared_models_1.NetworkName.Hardhat, mockProvider);
711
+ const result = await (0, tx_unshield_1.getERC20AndNFTAmountRecipientsForUnshieldToOrigin)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, MOCK_SHIELD_TXID);
712
+ expect(result.erc20AmountRecipients).to.be.an('array');
713
+ if (result.erc20AmountRecipients.length > 0) {
714
+ expect(result.erc20AmountRecipients[0].recipientAddress).to.equal(MOCK_USER_ADDRESS, 'Should skip malformed log and process valid one');
715
+ }
716
+ });
717
+ it('Should throw error when transaction is not found', async function () {
718
+ this.timeout(60000);
719
+ const mockProvider = {
720
+ getTransaction: async () => null,
721
+ getTransactionReceipt: async () => createMockReceipt([]),
722
+ };
723
+ (0, providers_1.setFallbackProviderForNetwork)(shared_models_1.NetworkName.Hardhat, mockProvider);
724
+ await expect((0, tx_unshield_1.getERC20AndNFTAmountRecipientsForUnshieldToOrigin)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, MOCK_SHIELD_TXID)).to.be.rejectedWith('Could not find shield transaction from RPC');
725
+ });
726
+ it('Should throw error when receipt is not found', async function () {
727
+ this.timeout(60000);
728
+ const mockProvider = {
729
+ getTransaction: async () => createMockTransaction(MOCK_USER_ADDRESS),
730
+ getTransactionReceipt: async () => null,
731
+ };
732
+ (0, providers_1.setFallbackProviderForNetwork)(shared_models_1.NetworkName.Hardhat, mockProvider);
733
+ await expect((0, tx_unshield_1.getERC20AndNFTAmountRecipientsForUnshieldToOrigin)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, MOCK_SHIELD_TXID)).to.be.rejectedWith('Could not find shield transaction receipt from RPC');
734
+ });
735
+ it('Should handle multiple token owners by using first one', async function () {
736
+ this.timeout(60000);
737
+ const user1Address = '0x1111111111111111111111111111111111111111';
738
+ const user2Address = '0x2222222222222222222222222222222222222222';
739
+ const transferLog1 = createMockTransferLog(user1Address, MOCK_MATRIX_PROXY_ADDRESS);
740
+ const transferLog2 = createMockTransferLog(user2Address, MOCK_MATRIX_PROXY_ADDRESS);
741
+ const mockReceipt = createMockReceipt([transferLog1, transferLog2]);
742
+ const mockTransaction = createMockTransaction(MOCK_RELAYER_ADDRESS);
743
+ const mockProvider = {
744
+ getTransaction: async () => mockTransaction,
745
+ getTransactionReceipt: async () => mockReceipt,
746
+ };
747
+ (0, providers_1.setFallbackProviderForNetwork)(shared_models_1.NetworkName.Hardhat, mockProvider);
748
+ const result = await (0, tx_unshield_1.getERC20AndNFTAmountRecipientsForUnshieldToOrigin)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, MOCK_SHIELD_TXID);
749
+ expect(result.erc20AmountRecipients).to.be.an('array');
750
+ if (result.erc20AmountRecipients.length > 0) {
751
+ const recipientAddr = result.erc20AmountRecipients[0].recipientAddress.toLowerCase();
752
+ const isValidOwner = recipientAddr === user1Address.toLowerCase() ||
753
+ recipientAddr === user2Address.toLowerCase();
754
+ expect(isValidOwner).to.be.true;
755
+ }
756
+ });
757
+ });
758
+ });
759
+ //# sourceMappingURL=tx-unshield.test.js.map