@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 @@
1
+ {"version":3,"file":"proof-cache.test.js","sourceRoot":"","sources":["../../../../src/services/transactions/__tests__/proof-cache.test.ts"],"names":[],"mappings":"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","sourcesContent":["import chai from 'chai';\nimport chaiAsPromised from 'chai-as-promised';\nimport {\n ProofType,\n MatrixNFTAmountRecipient,\n MatrixERC20Amount,\n MatrixERC20AmountRecipient,\n NetworkName,\n MatrixNFTAmount,\n MatrixERC20Recipient,\n} from '@matrix-privacy/shared-models';\nimport {\n MOCK_NFT_AMOUNTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n MOCK_MATRIX_WALLET_ADDRESS,\n MOCK_TOKEN_AMOUNTS,\n MOCK_TOKEN_FEE,\n} from '../../../tests/mocks.test';\nimport {\n setCachedProvedTransaction,\n validateCachedProvedTransaction,\n} from '../proof-cache';\nimport { ContractTransaction } from 'ethers';\n\nchai.use(chaiAsPromised);\nconst { expect } = chai;\n\nconst networkName = NetworkName.Hardhat;\nconst matrixWalletID = '123';\nconst showSenderAddressToRecipient = true;\nconst memoText = 'Some memo';\nconst recipientAddress = '0x12345';\nconst erc20AmountRecipients: MatrixERC20AmountRecipient[] =\n MOCK_TOKEN_AMOUNTS.map(erc20Amount => ({\n ...erc20Amount,\n recipientAddress,\n }));\nconst nftAmountRecipients: MatrixNFTAmountRecipient[] =\n MOCK_NFT_AMOUNT_RECIPIENTS;\nconst broadcasterFeeERC20AmountRecipient: MatrixERC20AmountRecipient = {\n ...MOCK_TOKEN_FEE,\n recipientAddress: MOCK_MATRIX_WALLET_ADDRESS,\n};\nconst crossContractCalls: ContractTransaction[] = [\n { to: '0x4567', data: '0x' },\n];\nconst relayAdaptShieldERC20Recipients: MatrixERC20Recipient[] = [\n { tokenAddress: '0x123', recipientAddress: MOCK_MATRIX_WALLET_ADDRESS },\n];\nconst relayAdaptUnshieldERC20Amounts: MatrixERC20Amount[] = [MOCK_TOKEN_FEE];\nconst relayAdaptUnshieldNFTAmounts: MatrixNFTAmount[] = MOCK_NFT_AMOUNTS;\nconst relayAdaptShieldNFTRecipients: MatrixNFTAmountRecipient[] =\n MOCK_NFT_AMOUNT_RECIPIENTS;\n\nconst nullifiers = ['0x1234'];\n\nconst sendWithPublicWallet = false;\nconst overallBatchMinGasPrice = BigInt('0x1000');\n\nconst setCached = (proofType: ProofType) => {\n setCachedProvedTransaction({\n proofType,\n transaction: {} as ContractTransaction,\n showSenderAddressToRecipient,\n memoText,\n matrixWalletID,\n erc20AmountRecipients,\n nftAmountRecipients,\n relayAdaptUnshieldERC20Amounts,\n relayAdaptUnshieldNFTAmounts,\n relayAdaptShieldERC20Recipients,\n relayAdaptShieldNFTRecipients,\n crossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet: false,\n overallBatchMinGasPrice,\n nullifiers,\n });\n};\n\ndescribe('proof-cache', () => {\n it('Should validate cached transaction correctly', () => {\n setCachedProvedTransaction(undefined);\n expect(() =>\n validateCachedProvedTransaction(\n networkName,\n ProofType.CrossContractCalls,\n matrixWalletID,\n showSenderAddressToRecipient,\n memoText,\n erc20AmountRecipients,\n nftAmountRecipients,\n relayAdaptUnshieldERC20Amounts,\n relayAdaptUnshieldNFTAmounts,\n relayAdaptShieldERC20Recipients,\n relayAdaptShieldNFTRecipients,\n crossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n overallBatchMinGasPrice,\n ),\n ).to.throw('No proof found.');\n\n setCached(ProofType.CrossContractCalls);\n\n // Same same\n expect(() =>\n validateCachedProvedTransaction(\n networkName,\n ProofType.CrossContractCalls,\n matrixWalletID,\n showSenderAddressToRecipient,\n memoText,\n erc20AmountRecipients,\n nftAmountRecipients,\n relayAdaptUnshieldERC20Amounts,\n relayAdaptUnshieldNFTAmounts,\n relayAdaptShieldERC20Recipients,\n relayAdaptShieldNFTRecipients,\n crossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n overallBatchMinGasPrice,\n ),\n ).to.not.throw();\n\n expect(() =>\n validateCachedProvedTransaction(\n networkName,\n ProofType.Unshield,\n matrixWalletID,\n showSenderAddressToRecipient,\n memoText,\n erc20AmountRecipients,\n nftAmountRecipients,\n relayAdaptUnshieldERC20Amounts,\n relayAdaptUnshieldNFTAmounts,\n relayAdaptShieldERC20Recipients,\n relayAdaptShieldNFTRecipients,\n crossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n overallBatchMinGasPrice,\n ),\n ).to.throw('Mismatch: proofType.');\n\n expect(() =>\n validateCachedProvedTransaction(\n networkName,\n ProofType.Transfer,\n matrixWalletID,\n showSenderAddressToRecipient,\n memoText,\n erc20AmountRecipients,\n nftAmountRecipients,\n relayAdaptUnshieldERC20Amounts,\n relayAdaptUnshieldNFTAmounts,\n relayAdaptShieldERC20Recipients,\n relayAdaptShieldNFTRecipients,\n crossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n overallBatchMinGasPrice,\n ),\n ).to.throw('Mismatch: proofType.');\n\n expect(() =>\n validateCachedProvedTransaction(\n networkName,\n ProofType.CrossContractCalls,\n '987',\n showSenderAddressToRecipient,\n memoText,\n erc20AmountRecipients,\n nftAmountRecipients,\n relayAdaptUnshieldERC20Amounts,\n relayAdaptUnshieldNFTAmounts,\n relayAdaptShieldERC20Recipients,\n relayAdaptShieldNFTRecipients,\n crossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n overallBatchMinGasPrice,\n ),\n ).to.throw('Mismatch: matrixWalletID.');\n\n // Set new for Transfer proof type\n setCached(ProofType.Transfer);\n\n // Requires ProofType.Transfer\n expect(() =>\n validateCachedProvedTransaction(\n networkName,\n ProofType.Transfer,\n matrixWalletID,\n false, // showSenderAddressToRecipient\n memoText,\n erc20AmountRecipients,\n nftAmountRecipients,\n relayAdaptUnshieldERC20Amounts,\n relayAdaptUnshieldNFTAmounts,\n relayAdaptShieldERC20Recipients,\n relayAdaptShieldNFTRecipients,\n crossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n overallBatchMinGasPrice,\n ),\n ).to.throw('Mismatch: showSenderAddressToRecipient.');\n\n // Requires ProofType.Transfer\n expect(() =>\n validateCachedProvedTransaction(\n networkName,\n ProofType.Transfer,\n matrixWalletID,\n showSenderAddressToRecipient,\n 'different memo',\n erc20AmountRecipients,\n nftAmountRecipients,\n relayAdaptUnshieldERC20Amounts,\n relayAdaptUnshieldNFTAmounts,\n relayAdaptShieldERC20Recipients,\n relayAdaptShieldNFTRecipients,\n crossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n overallBatchMinGasPrice,\n ),\n ).to.throw('Mismatch: memoText.');\n\n // Requires ProofType.Transfer\n expect(() =>\n validateCachedProvedTransaction(\n networkName,\n ProofType.Transfer,\n matrixWalletID,\n showSenderAddressToRecipient,\n memoText,\n [\n {\n tokenAddress: '0x765',\n amount: 100n,\n recipientAddress: '0x123',\n },\n ],\n nftAmountRecipients,\n relayAdaptUnshieldERC20Amounts,\n relayAdaptUnshieldNFTAmounts,\n relayAdaptShieldERC20Recipients,\n relayAdaptShieldNFTRecipients,\n crossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n overallBatchMinGasPrice,\n ),\n ).to.throw('Mismatch: erc20AmountRecipients.');\n\n setCached(ProofType.CrossContractCalls);\n\n expect(() =>\n validateCachedProvedTransaction(\n networkName,\n ProofType.CrossContractCalls,\n matrixWalletID,\n showSenderAddressToRecipient,\n memoText,\n erc20AmountRecipients,\n [MOCK_NFT_AMOUNT_RECIPIENTS[0]],\n relayAdaptUnshieldERC20Amounts,\n relayAdaptUnshieldNFTAmounts,\n relayAdaptShieldERC20Recipients,\n relayAdaptShieldNFTRecipients,\n crossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n overallBatchMinGasPrice,\n ),\n ).to.throw('Mismatch: nftAmountRecipients.');\n\n // Note: requires ProofType.CrossContractCalls\n expect(() =>\n validateCachedProvedTransaction(\n networkName,\n ProofType.CrossContractCalls,\n matrixWalletID,\n showSenderAddressToRecipient,\n memoText,\n erc20AmountRecipients,\n nftAmountRecipients,\n [\n {\n tokenAddress: '0x765',\n amount: 100n,\n },\n ],\n relayAdaptUnshieldNFTAmounts,\n relayAdaptShieldERC20Recipients,\n relayAdaptShieldNFTRecipients,\n crossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n overallBatchMinGasPrice,\n ),\n ).to.throw('Mismatch: relayAdaptUnshieldERC20Amounts.');\n\n // Note: requires ProofType.CrossContractCalls\n expect(() =>\n validateCachedProvedTransaction(\n networkName,\n ProofType.CrossContractCalls,\n matrixWalletID,\n showSenderAddressToRecipient,\n memoText,\n erc20AmountRecipients,\n nftAmountRecipients,\n relayAdaptUnshieldERC20Amounts,\n [MOCK_NFT_AMOUNTS[0]],\n relayAdaptShieldERC20Recipients,\n relayAdaptShieldNFTRecipients,\n crossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n overallBatchMinGasPrice,\n ),\n ).to.throw('Mismatch: relayAdaptUnshieldNFTAmounts.');\n\n expect(() =>\n validateCachedProvedTransaction(\n networkName,\n ProofType.CrossContractCalls,\n matrixWalletID,\n showSenderAddressToRecipient,\n memoText,\n erc20AmountRecipients,\n nftAmountRecipients,\n relayAdaptUnshieldERC20Amounts,\n relayAdaptUnshieldNFTAmounts,\n [\n {\n tokenAddress: 'test',\n recipientAddress: MOCK_MATRIX_WALLET_ADDRESS,\n },\n ],\n relayAdaptShieldNFTRecipients,\n crossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n overallBatchMinGasPrice,\n ),\n ).to.throw('Mismatch: relayAdaptShieldERC20Recipients.');\n\n expect(() =>\n validateCachedProvedTransaction(\n networkName,\n ProofType.CrossContractCalls,\n matrixWalletID,\n showSenderAddressToRecipient,\n memoText,\n erc20AmountRecipients,\n nftAmountRecipients,\n relayAdaptUnshieldERC20Amounts,\n relayAdaptUnshieldNFTAmounts,\n [],\n relayAdaptShieldNFTRecipients,\n crossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n overallBatchMinGasPrice,\n ),\n ).to.throw('Mismatch: relayAdaptShieldERC20Recipients.');\n\n expect(() =>\n validateCachedProvedTransaction(\n networkName,\n ProofType.CrossContractCalls,\n matrixWalletID,\n showSenderAddressToRecipient,\n memoText,\n erc20AmountRecipients,\n nftAmountRecipients,\n relayAdaptUnshieldERC20Amounts,\n relayAdaptUnshieldNFTAmounts,\n relayAdaptShieldERC20Recipients,\n [MOCK_NFT_AMOUNTS[0]],\n crossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n overallBatchMinGasPrice,\n ),\n ).to.throw('Mismatch: relayAdaptShieldNFTRecipients.');\n\n expect(() =>\n validateCachedProvedTransaction(\n networkName,\n ProofType.CrossContractCalls,\n matrixWalletID,\n showSenderAddressToRecipient,\n memoText,\n erc20AmountRecipients,\n nftAmountRecipients,\n relayAdaptUnshieldERC20Amounts,\n relayAdaptUnshieldNFTAmounts,\n relayAdaptShieldERC20Recipients,\n relayAdaptShieldNFTRecipients,\n [{ to: 'test', data: '0x' }],\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n overallBatchMinGasPrice,\n ),\n ).to.throw('Mismatch: crossContractCalls.');\n\n expect(() =>\n validateCachedProvedTransaction(\n networkName,\n ProofType.CrossContractCalls,\n matrixWalletID,\n showSenderAddressToRecipient,\n memoText,\n erc20AmountRecipients,\n nftAmountRecipients,\n relayAdaptUnshieldERC20Amounts,\n relayAdaptUnshieldNFTAmounts,\n relayAdaptShieldERC20Recipients,\n relayAdaptShieldNFTRecipients,\n crossContractCalls,\n {\n tokenAddress: '0x765',\n amount: 100n,\n recipientAddress: '0x1233',\n },\n sendWithPublicWallet,\n overallBatchMinGasPrice,\n ),\n ).to.throw('Mismatch: broadcasterFeeERC20AmountRecipient.');\n\n expect(() =>\n validateCachedProvedTransaction(\n networkName,\n ProofType.CrossContractCalls,\n matrixWalletID,\n showSenderAddressToRecipient,\n memoText,\n erc20AmountRecipients,\n nftAmountRecipients,\n relayAdaptUnshieldERC20Amounts,\n relayAdaptUnshieldNFTAmounts,\n relayAdaptShieldERC20Recipients,\n relayAdaptShieldNFTRecipients,\n crossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n true, // sendWithPublicWallet\n overallBatchMinGasPrice,\n ),\n ).to.throw('Mismatch: sendWithPublicWallet.');\n\n expect(() =>\n validateCachedProvedTransaction(\n networkName,\n ProofType.CrossContractCalls,\n matrixWalletID,\n showSenderAddressToRecipient,\n memoText,\n erc20AmountRecipients,\n nftAmountRecipients,\n relayAdaptUnshieldERC20Amounts,\n relayAdaptUnshieldNFTAmounts,\n relayAdaptShieldERC20Recipients,\n relayAdaptShieldNFTRecipients,\n crossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n BigInt('0x2000'),\n ),\n ).to.throw('Mismatch: overallBatchMinGasPrice.');\n });\n});\n"]}
@@ -0,0 +1,376 @@
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 engine_1 = require("@matrix-privacy/engine");
10
+ const shared_models_1 = require("@matrix-privacy/shared-models");
11
+ const setup_test_1 = require("../../../tests/setup.test");
12
+ const mocks_test_1 = require("../../../tests/mocks.test");
13
+ const wallets_1 = require("../../matrix/wallets/wallets");
14
+ const proof_cache_1 = require("../proof-cache");
15
+ const tx_cross_contract_calls_1 = require("../tx-cross-contract-calls");
16
+ const formatted_relay_adapt_error_logs_json_1 = __importDefault(require("./json/formatted-relay-adapt-error-logs.json"));
17
+ const ethers_1 = require("ethers");
18
+ let gasEstimateStub;
19
+ let railProveStub;
20
+ let railDummyProveStub;
21
+ let relayAdaptPopulateCrossContractCalls;
22
+ let relayAdaptGasEstimateStub;
23
+ let addUnshieldDataSpy;
24
+ let erc20NoteSpy;
25
+ let matrixWallet;
26
+ let broadcasterFeeERC20AmountRecipient;
27
+ const hardhatRelayAdaptContract = shared_models_1.NETWORK_CONFIG[shared_models_1.NetworkName.Hardhat].relayAdaptContract;
28
+ chai_1.default.use(chai_as_promised_1.default);
29
+ const { expect } = chai_1.default;
30
+ const mockERC20TokenData0 = (0, engine_1.getTokenDataERC20)(mocks_test_1.MOCK_TOKEN_AMOUNTS[0].tokenAddress);
31
+ const mockERC20TokenData1 = (0, engine_1.getTokenDataERC20)(mocks_test_1.MOCK_TOKEN_AMOUNTS[1].tokenAddress);
32
+ const mockNFTTokenData0 = (0, tx_cross_contract_calls_1.createNFTTokenDataFromMatrixNFTAmount)(mocks_test_1.MOCK_NFT_AMOUNTS[0]);
33
+ const mockNFTTokenData1 = (0, tx_cross_contract_calls_1.createNFTTokenDataFromMatrixNFTAmount)(mocks_test_1.MOCK_NFT_AMOUNTS[1]);
34
+ const mockCrossContractCalls = [
35
+ {
36
+ to: mocks_test_1.MOCK_ETH_WALLET_ADDRESS,
37
+ data: '0x0789',
38
+ value: BigInt('0x01'),
39
+ },
40
+ {
41
+ to: mocks_test_1.MOCK_ETH_WALLET_ADDRESS,
42
+ data: '0x9789',
43
+ value: BigInt('0x02'),
44
+ },
45
+ ];
46
+ const MOCK_TOKEN_AMOUNTS_DIFFERENT = [
47
+ {
48
+ tokenAddress: mocks_test_1.MOCK_TOKEN_ADDRESS,
49
+ amount: 100n,
50
+ },
51
+ {
52
+ tokenAddress: mocks_test_1.MOCK_TOKEN_ADDRESS_2,
53
+ amount: 300n,
54
+ },
55
+ ];
56
+ const overallBatchMinGasPrice = BigInt('0x1000');
57
+ const minGasLimit = engine_1.MINIMUM_RELAY_ADAPT_CROSS_CONTRACT_CALLS_GAS_LIMIT_V2;
58
+ const gasDetails = {
59
+ evmGasType: shared_models_1.EVMGasType.Type1,
60
+ gasEstimate: 2000n,
61
+ gasPrice: overallBatchMinGasPrice,
62
+ };
63
+ const stubRelayAdaptGasEstimate = () => {
64
+ relayAdaptGasEstimateStub = sinon_1.default.stub(engine_1.RelayAdaptV3Contract, 'estimateGasWithErrorHandler').resolves(BigInt('200'));
65
+ };
66
+ const stubGasEstimateSuccess = () => {
67
+ gasEstimateStub = sinon_1.default.stub(ethers_1.FallbackProvider.prototype, 'estimateGas').resolves(BigInt('200'));
68
+ };
69
+ const stubRelayAdaptGasEstimateFailure = () => {
70
+ relayAdaptGasEstimateStub = sinon_1.default.stub(engine_1.RelayAdaptV3Contract, 'estimateGasWithErrorHandler').rejects(new Error('RelayAdapt multicall failed at index UNKNOWN.'));
71
+ };
72
+ const spyOnSetUnshield = () => {
73
+ addUnshieldDataSpy = sinon_1.default.spy(engine_1.TransactionBatch.prototype, 'addUnshieldData');
74
+ };
75
+ describe('tx-cross-contract-calls', () => {
76
+ before(async function run() {
77
+ this.timeout(60000);
78
+ await (0, setup_test_1.initTestEngine)();
79
+ await (0, setup_test_1.initTestEngineNetworks)();
80
+ const matrixWalletInfo = await (0, wallets_1.createMatrixWallet)(mocks_test_1.MOCK_DB_ENCRYPTION_KEY, mocks_test_1.MOCK_MNEMONIC, undefined);
81
+ if (!(0, shared_models_1.isDefined)(matrixWalletInfo)) {
82
+ throw new Error('Expected matrixWalletInfo');
83
+ }
84
+ matrixWallet = (0, wallets_1.fullWalletForID)(matrixWalletInfo.id);
85
+ const broadcasterWalletInfo = await (0, wallets_1.createMatrixWallet)(mocks_test_1.MOCK_DB_ENCRYPTION_KEY, mocks_test_1.MOCK_MNEMONIC, undefined);
86
+ if (!(0, shared_models_1.isDefined)(broadcasterWalletInfo)) {
87
+ throw new Error('Expected broadcasterWalletInfo');
88
+ }
89
+ const broadcasterMatrixAddress = broadcasterWalletInfo.matrixAddress;
90
+ broadcasterFeeERC20AmountRecipient = {
91
+ ...mocks_test_1.MOCK_TOKEN_FEE,
92
+ recipientAddress: broadcasterMatrixAddress,
93
+ };
94
+ railProveStub = sinon_1.default.stub(engine_1.TransactionBatch.prototype, 'generateTransactions').resolves({
95
+ provedTransactions: [
96
+ {
97
+ nullifiers: mocks_test_1.MOCK_NULLIFIERS,
98
+ },
99
+ ],
100
+ });
101
+ railDummyProveStub = sinon_1.default.stub(engine_1.TransactionBatch.prototype, 'generateDummyTransactions').resolves([
102
+ {
103
+ commitments: mocks_test_1.MOCK_COMMITMENTS,
104
+ boundParams: mocks_test_1.MOCK_BOUND_PARAMS_V3,
105
+ nullifiers: mocks_test_1.MOCK_NULLIFIERS,
106
+ },
107
+ ]);
108
+ relayAdaptPopulateCrossContractCalls = sinon_1.default.stub(engine_1.RelayAdaptV3Contract.prototype, 'populateCrossContractCalls').resolves({ data: '0x0123' });
109
+ });
110
+ afterEach(() => {
111
+ gasEstimateStub?.restore();
112
+ addUnshieldDataSpy?.restore();
113
+ erc20NoteSpy?.restore();
114
+ relayAdaptGasEstimateStub?.restore();
115
+ });
116
+ after(async () => {
117
+ railProveStub.restore();
118
+ railDummyProveStub.restore();
119
+ relayAdaptPopulateCrossContractCalls.restore();
120
+ await (0, setup_test_1.closeTestEngine)();
121
+ });
122
+ // GAS ESTIMATE
123
+ it('Should get gas estimates for valid cross contract calls', async () => {
124
+ stubRelayAdaptGasEstimate();
125
+ spyOnSetUnshield();
126
+ const rsp = await (0, tx_cross_contract_calls_1.gasEstimateForUnprovenCrossContractCalls)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, mocks_test_1.MOCK_DB_ENCRYPTION_KEY, mocks_test_1.MOCK_TOKEN_AMOUNTS, mocks_test_1.MOCK_NFT_AMOUNTS, mocks_test_1.MOCK_ERC20_RECIPIENTS, mocks_test_1.MOCK_NFT_AMOUNT_RECIPIENTS, mockCrossContractCalls, mocks_test_1.MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2, mocks_test_1.MOCK_FEE_TOKEN_DETAILS, false, // sendWithPublicWallet
127
+ minGasLimit);
128
+ expect(addUnshieldDataSpy.called).to.be.true;
129
+ expect(addUnshieldDataSpy.args).to.deep.equal([
130
+ [
131
+ {
132
+ toAddress: hardhatRelayAdaptContract,
133
+ tokenData: mockERC20TokenData0,
134
+ value: BigInt('0x0100'),
135
+ allowOverride: false,
136
+ },
137
+ ],
138
+ [
139
+ {
140
+ toAddress: hardhatRelayAdaptContract,
141
+ tokenData: mockERC20TokenData1,
142
+ value: BigInt('0x0200'),
143
+ allowOverride: false,
144
+ },
145
+ ],
146
+ [
147
+ {
148
+ toAddress: hardhatRelayAdaptContract,
149
+ tokenData: mockNFTTokenData0,
150
+ value: BigInt('1'),
151
+ allowOverride: false,
152
+ },
153
+ ],
154
+ [
155
+ {
156
+ toAddress: hardhatRelayAdaptContract,
157
+ tokenData: mockNFTTokenData1,
158
+ value: BigInt('2'),
159
+ allowOverride: false,
160
+ },
161
+ ],
162
+ [
163
+ {
164
+ toAddress: hardhatRelayAdaptContract,
165
+ tokenData: mockERC20TokenData0,
166
+ value: BigInt('0x0100'),
167
+ allowOverride: false,
168
+ },
169
+ ],
170
+ [
171
+ {
172
+ toAddress: hardhatRelayAdaptContract,
173
+ tokenData: mockERC20TokenData1,
174
+ value: BigInt('0x0200'),
175
+ allowOverride: false,
176
+ },
177
+ ],
178
+ [
179
+ {
180
+ toAddress: hardhatRelayAdaptContract,
181
+ tokenData: mockNFTTokenData0,
182
+ value: BigInt('1'),
183
+ allowOverride: false,
184
+ },
185
+ ],
186
+ [
187
+ {
188
+ toAddress: hardhatRelayAdaptContract,
189
+ tokenData: mockNFTTokenData1,
190
+ value: BigInt('2'),
191
+ allowOverride: false,
192
+ },
193
+ ], // run 2 - nft 1
194
+ ]);
195
+ // Add 9000 for the dummy tx variance
196
+ // expect(rsp.gasEstimate).to.equal(9000n + 280n);
197
+ expect(rsp.gasEstimate).to.equal(3200000n); // Cross Contract Minimum
198
+ }).timeout(10000);
199
+ it('Should get gas estimates for valid cross contract calls, public wallet', async () => {
200
+ stubRelayAdaptGasEstimate();
201
+ spyOnSetUnshield();
202
+ const rsp = await (0, tx_cross_contract_calls_1.gasEstimateForUnprovenCrossContractCalls)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, mocks_test_1.MOCK_DB_ENCRYPTION_KEY, mocks_test_1.MOCK_TOKEN_AMOUNTS, mocks_test_1.MOCK_NFT_AMOUNTS, mocks_test_1.MOCK_ERC20_RECIPIENTS, mocks_test_1.MOCK_NFT_AMOUNT_RECIPIENTS, mockCrossContractCalls, mocks_test_1.MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2, mocks_test_1.MOCK_FEE_TOKEN_DETAILS, true, // sendWithPublicWallet
203
+ minGasLimit);
204
+ expect(addUnshieldDataSpy.called).to.be.true;
205
+ expect(addUnshieldDataSpy.args).to.deep.equal([
206
+ [
207
+ {
208
+ toAddress: hardhatRelayAdaptContract,
209
+ tokenData: mockERC20TokenData0,
210
+ value: BigInt('0x0100'),
211
+ allowOverride: false,
212
+ },
213
+ ],
214
+ [
215
+ {
216
+ toAddress: hardhatRelayAdaptContract,
217
+ tokenData: mockERC20TokenData1,
218
+ value: BigInt('0x0200'),
219
+ allowOverride: false,
220
+ },
221
+ ],
222
+ [
223
+ {
224
+ toAddress: hardhatRelayAdaptContract,
225
+ tokenData: mockNFTTokenData0,
226
+ value: BigInt('1'),
227
+ allowOverride: false,
228
+ },
229
+ ],
230
+ [
231
+ {
232
+ toAddress: hardhatRelayAdaptContract,
233
+ tokenData: mockNFTTokenData1,
234
+ value: BigInt('2'),
235
+ allowOverride: false,
236
+ },
237
+ ], // run 1 - nft 1
238
+ ]);
239
+ // Add 9000 for the dummy tx variance
240
+ // expect(rsp.gasEstimate).to.equal(9000n + 280n);
241
+ expect(rsp.gasEstimate).to.equal(3200000n); // Cross Contract Minimum
242
+ }).timeout(10000);
243
+ it('Should error on gas estimates for invalid cross contract calls', async () => {
244
+ stubGasEstimateSuccess();
245
+ await expect((0, tx_cross_contract_calls_1.gasEstimateForUnprovenCrossContractCalls)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, mocks_test_1.MOCK_DB_ENCRYPTION_KEY, mocks_test_1.MOCK_TOKEN_AMOUNTS, mocks_test_1.MOCK_NFT_AMOUNTS, mocks_test_1.MOCK_ERC20_RECIPIENTS, mocks_test_1.MOCK_NFT_AMOUNT_RECIPIENTS, [{ data: 'abc' }], // Invalid
246
+ mocks_test_1.MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2, mocks_test_1.MOCK_FEE_TOKEN_DETAILS, false, // sendWithPublicWallet
247
+ minGasLimit)).rejectedWith(`Cross-contract calls require to and data fields.`);
248
+ });
249
+ it('Should error on cross contract calls gas estimate for ethers rejections', async () => {
250
+ stubRelayAdaptGasEstimateFailure();
251
+ await expect((0, tx_cross_contract_calls_1.gasEstimateForUnprovenCrossContractCalls)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, mocks_test_1.MOCK_DB_ENCRYPTION_KEY, mocks_test_1.MOCK_TOKEN_AMOUNTS, mocks_test_1.MOCK_NFT_AMOUNTS, mocks_test_1.MOCK_ERC20_RECIPIENTS, mocks_test_1.MOCK_NFT_AMOUNT_RECIPIENTS, mockCrossContractCalls, mocks_test_1.MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2, mocks_test_1.MOCK_FEE_TOKEN_DETAILS, false, // sendWithPublicWallet
252
+ minGasLimit)).rejectedWith('RelayAdapt multicall failed at index UNKNOWN.');
253
+ });
254
+ // PROVE AND SEND
255
+ it('Should populate tx for valid cross contract calls', async () => {
256
+ stubGasEstimateSuccess();
257
+ (0, proof_cache_1.setCachedProvedTransaction)(undefined);
258
+ spyOnSetUnshield();
259
+ await (0, tx_cross_contract_calls_1.generateCrossContractCallsProof)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, mocks_test_1.MOCK_DB_ENCRYPTION_KEY, mocks_test_1.MOCK_TOKEN_AMOUNTS, mocks_test_1.MOCK_NFT_AMOUNTS, mocks_test_1.MOCK_ERC20_RECIPIENTS, mocks_test_1.MOCK_NFT_AMOUNT_RECIPIENTS, mockCrossContractCalls, broadcasterFeeERC20AmountRecipient, false, // sendWithPublicWallet
260
+ overallBatchMinGasPrice, minGasLimit, () => { });
261
+ expect(addUnshieldDataSpy.called).to.be.true;
262
+ expect(addUnshieldDataSpy.args).to.deep.equal([
263
+ [
264
+ {
265
+ toAddress: hardhatRelayAdaptContract,
266
+ tokenData: mockERC20TokenData0,
267
+ value: BigInt('0x0100'),
268
+ allowOverride: false,
269
+ },
270
+ ],
271
+ [
272
+ {
273
+ toAddress: hardhatRelayAdaptContract,
274
+ tokenData: mockERC20TokenData1,
275
+ value: BigInt('0x0200'),
276
+ allowOverride: false,
277
+ },
278
+ ],
279
+ [
280
+ {
281
+ toAddress: hardhatRelayAdaptContract,
282
+ tokenData: mockNFTTokenData0,
283
+ value: BigInt('1'),
284
+ allowOverride: false,
285
+ },
286
+ ],
287
+ [
288
+ {
289
+ toAddress: hardhatRelayAdaptContract,
290
+ tokenData: mockNFTTokenData1,
291
+ value: BigInt('2'),
292
+ allowOverride: false,
293
+ },
294
+ ],
295
+ [
296
+ {
297
+ toAddress: hardhatRelayAdaptContract,
298
+ tokenData: mockERC20TokenData0,
299
+ value: BigInt('0x0100'),
300
+ allowOverride: false,
301
+ },
302
+ ],
303
+ [
304
+ {
305
+ toAddress: hardhatRelayAdaptContract,
306
+ tokenData: mockERC20TokenData1,
307
+ value: BigInt('0x0200'),
308
+ allowOverride: false,
309
+ },
310
+ ],
311
+ [
312
+ {
313
+ toAddress: hardhatRelayAdaptContract,
314
+ tokenData: mockNFTTokenData0,
315
+ value: BigInt('1'),
316
+ allowOverride: false,
317
+ },
318
+ ],
319
+ [
320
+ {
321
+ toAddress: hardhatRelayAdaptContract,
322
+ tokenData: mockNFTTokenData1,
323
+ value: BigInt('2'),
324
+ allowOverride: false,
325
+ },
326
+ ], // actual proof - nft 1
327
+ ]);
328
+ const populateResponse = await (0, tx_cross_contract_calls_1.populateProvedCrossContractCalls)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, mocks_test_1.MOCK_TOKEN_AMOUNTS, mocks_test_1.MOCK_NFT_AMOUNTS, mocks_test_1.MOCK_ERC20_RECIPIENTS, mocks_test_1.MOCK_NFT_AMOUNT_RECIPIENTS, mockCrossContractCalls, 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(2400n);
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 error on populate tx for invalid cross contract calls', async () => {
345
+ stubGasEstimateSuccess();
346
+ await expect((0, tx_cross_contract_calls_1.populateProvedCrossContractCalls)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, MOCK_TOKEN_AMOUNTS_DIFFERENT, mocks_test_1.MOCK_NFT_AMOUNTS, mocks_test_1.MOCK_ERC20_RECIPIENTS, mocks_test_1.MOCK_NFT_AMOUNT_RECIPIENTS, [{ data: '123' }], // Invalid
347
+ broadcasterFeeERC20AmountRecipient, false, // sendWithPublicWallet
348
+ overallBatchMinGasPrice, gasDetails)).rejectedWith('Invalid proof for this transaction');
349
+ });
350
+ it('Should error on populate cross contract calls tx for unproved transaction', async () => {
351
+ stubGasEstimateSuccess();
352
+ (0, proof_cache_1.setCachedProvedTransaction)(undefined);
353
+ await expect((0, tx_cross_contract_calls_1.populateProvedCrossContractCalls)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, mocks_test_1.MOCK_TOKEN_AMOUNTS, mocks_test_1.MOCK_NFT_AMOUNTS, mocks_test_1.MOCK_ERC20_RECIPIENTS, mocks_test_1.MOCK_NFT_AMOUNT_RECIPIENTS, mockCrossContractCalls, broadcasterFeeERC20AmountRecipient, false, // sendWithPublicWallet
354
+ overallBatchMinGasPrice, gasDetails)).rejectedWith('Invalid proof for this transaction');
355
+ });
356
+ it('Should error on populate cross contract calls tx when params changed (invalid cached proof)', async () => {
357
+ stubGasEstimateSuccess();
358
+ await (0, tx_cross_contract_calls_1.generateCrossContractCallsProof)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, mocks_test_1.MOCK_DB_ENCRYPTION_KEY, mocks_test_1.MOCK_TOKEN_AMOUNTS, mocks_test_1.MOCK_NFT_AMOUNTS, mocks_test_1.MOCK_ERC20_RECIPIENTS, mocks_test_1.MOCK_NFT_AMOUNT_RECIPIENTS, mockCrossContractCalls, broadcasterFeeERC20AmountRecipient, false, // sendWithPublicWallet
359
+ overallBatchMinGasPrice, minGasLimit, () => { });
360
+ await expect((0, tx_cross_contract_calls_1.populateProvedCrossContractCalls)(shared_models_1.NetworkName.Hardhat, matrixWallet.id, MOCK_TOKEN_AMOUNTS_DIFFERENT, mocks_test_1.MOCK_NFT_AMOUNTS, mocks_test_1.MOCK_ERC20_RECIPIENTS, mocks_test_1.MOCK_NFT_AMOUNT_RECIPIENTS, mockCrossContractCalls, broadcasterFeeERC20AmountRecipient, false, // sendWithPublicWallet
361
+ overallBatchMinGasPrice, gasDetails)).rejectedWith('Invalid proof for this transaction');
362
+ });
363
+ it('Should decode and parse relay adapt error logs (from failed Sushi V2 LP removal)', () => {
364
+ const transactionError = (0, tx_cross_contract_calls_1.getRelayAdaptTransactionError)(shared_models_1.NetworkName.Hardhat, formatted_relay_adapt_error_logs_json_1.default);
365
+ expect(transactionError).to.equal('ds-math-sub-underflow');
366
+ });
367
+ it('Should parse relay adapt log revert data', () => {
368
+ const transactionError = (0, tx_cross_contract_calls_1.parseRelayAdaptReturnValue)(shared_models_1.NetworkName.Hardhat, `0x5c0dee5d00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006408c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001564732d6d6174682d7375622d756e646572666c6f77000000000000000000000000000000000000000000000000000000000000000000000000000000`);
369
+ expect(transactionError).to.equal('ds-math-sub-underflow');
370
+ });
371
+ it('Should parse relay adapt revert data from matrix cookbook', () => {
372
+ const transactionError = (0, tx_cross_contract_calls_1.parseRelayAdaptReturnValue)(shared_models_1.NetworkName.Hardhat, `0x5c0dee5d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002d52656c617941646170743a205265667573696e6720746f2063616c6c205261696c67756e20636f6e747261637400000000000000000000000000000000000000`);
373
+ expect(transactionError).to.equal('RelayAdapt: Refusing to call Matrix contract');
374
+ });
375
+ });
376
+ //# sourceMappingURL=tx-cross-contract-calls.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tx-cross-contract-calls.test.js","sourceRoot":"","sources":["../../../../src/services/transactions/__tests__/tx-cross-contract-calls.test.ts"],"names":[],"mappings":"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","sourcesContent":["import chai from 'chai';\nimport chaiAsPromised from 'chai-as-promised';\nimport Sinon, { SinonStub, SinonSpy } from 'sinon';\nimport {\n MatrixWallet,\n TransactionBatch,\n getTokenDataERC20,\n MINIMUM_RELAY_ADAPT_CROSS_CONTRACT_CALLS_GAS_LIMIT_V2,\n TransactionStructV3,\n RelayAdaptV3Contract,\n} from '@matrix-privacy/engine';\nimport {\n MatrixERC20Amount,\n NetworkName,\n NETWORK_CONFIG,\n EVMGasType,\n MatrixERC20AmountRecipient,\n TransactionGasDetails,\n isDefined,\n} from '@matrix-privacy/shared-models';\nimport {\n closeTestEngine,\n initTestEngine,\n initTestEngineNetworks,\n} from '../../../tests/setup.test';\nimport {\n MOCK_BOUND_PARAMS_V3,\n MOCK_COMMITMENTS,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_ERC20_RECIPIENTS,\n MOCK_ETH_WALLET_ADDRESS,\n MOCK_FEE_TOKEN_DETAILS,\n MOCK_FORMATTED_BROADCASTER_FEE_COMMITMENT_CIPHERTEXT_V3,\n MOCK_MNEMONIC,\n MOCK_NFT_AMOUNTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n MOCK_NULLIFIERS,\n MOCK_TOKEN_ADDRESS,\n MOCK_TOKEN_ADDRESS_2,\n MOCK_TOKEN_AMOUNTS,\n MOCK_TOKEN_FEE,\n MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2,\n} from '../../../tests/mocks.test';\nimport {\n createMatrixWallet,\n fullWalletForID,\n} from '../../matrix/wallets/wallets';\nimport { setCachedProvedTransaction } from '../proof-cache';\nimport {\n createNFTTokenDataFromMatrixNFTAmount,\n gasEstimateForUnprovenCrossContractCalls,\n generateCrossContractCallsProof,\n getRelayAdaptTransactionError,\n parseRelayAdaptReturnValue,\n populateProvedCrossContractCalls,\n} from '../tx-cross-contract-calls';\nimport FormattedRelayAdaptErrorLogs from './json/formatted-relay-adapt-error-logs.json';\nimport { ContractTransaction, FallbackProvider } from 'ethers';\n\nlet gasEstimateStub: SinonStub;\nlet railProveStub: SinonStub;\nlet railDummyProveStub: SinonStub;\nlet relayAdaptPopulateCrossContractCalls: SinonStub;\nlet relayAdaptGasEstimateStub: SinonStub;\nlet addUnshieldDataSpy: SinonSpy;\nlet erc20NoteSpy: SinonSpy;\n\nlet matrixWallet: MatrixWallet;\nlet broadcasterFeeERC20AmountRecipient: MatrixERC20AmountRecipient;\n\nconst hardhatRelayAdaptContract =\n NETWORK_CONFIG[NetworkName.Hardhat].relayAdaptContract;\n\nchai.use(chaiAsPromised);\nconst { expect } = chai;\n\nconst mockERC20TokenData0 = getTokenDataERC20(\n MOCK_TOKEN_AMOUNTS[0].tokenAddress,\n);\nconst mockERC20TokenData1 = getTokenDataERC20(\n MOCK_TOKEN_AMOUNTS[1].tokenAddress,\n);\nconst mockNFTTokenData0 = createNFTTokenDataFromMatrixNFTAmount(\n MOCK_NFT_AMOUNTS[0],\n);\nconst mockNFTTokenData1 = createNFTTokenDataFromMatrixNFTAmount(\n MOCK_NFT_AMOUNTS[1],\n);\n\nconst mockCrossContractCalls: ContractTransaction[] = [\n {\n to: MOCK_ETH_WALLET_ADDRESS,\n data: '0x0789',\n value: BigInt('0x01'),\n },\n {\n to: MOCK_ETH_WALLET_ADDRESS,\n data: '0x9789',\n value: BigInt('0x02'),\n },\n];\n\nconst MOCK_TOKEN_AMOUNTS_DIFFERENT: MatrixERC20Amount[] = [\n {\n tokenAddress: MOCK_TOKEN_ADDRESS,\n amount: 100n,\n },\n {\n tokenAddress: MOCK_TOKEN_ADDRESS_2,\n amount: 300n,\n },\n];\n\nconst overallBatchMinGasPrice = BigInt('0x1000');\n\nconst minGasLimit = MINIMUM_RELAY_ADAPT_CROSS_CONTRACT_CALLS_GAS_LIMIT_V2;\n\nconst gasDetails: TransactionGasDetails = {\n evmGasType: EVMGasType.Type1,\n gasEstimate: 2000n,\n gasPrice: overallBatchMinGasPrice,\n};\n\nconst stubRelayAdaptGasEstimate = () => {\n relayAdaptGasEstimateStub = Sinon.stub(\n RelayAdaptV3Contract,\n 'estimateGasWithErrorHandler',\n ).resolves(BigInt('200'));\n};\n\nconst stubGasEstimateSuccess = () => {\n gasEstimateStub = Sinon.stub(\n FallbackProvider.prototype,\n 'estimateGas',\n ).resolves(BigInt('200'));\n};\n\nconst stubRelayAdaptGasEstimateFailure = () => {\n relayAdaptGasEstimateStub = Sinon.stub(\n RelayAdaptV3Contract,\n 'estimateGasWithErrorHandler',\n ).rejects(new Error('RelayAdapt multicall failed at index UNKNOWN.'));\n};\n\nconst spyOnSetUnshield = () => {\n addUnshieldDataSpy = Sinon.spy(TransactionBatch.prototype, 'addUnshieldData');\n};\n\ndescribe('tx-cross-contract-calls', () => {\n before(async function run() {\n this.timeout(60_000);\n await initTestEngine();\n await initTestEngineNetworks();\n\n const matrixWalletInfo = await createMatrixWallet(\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_MNEMONIC,\n undefined, // creationBlockNumbers\n );\n if (!isDefined(matrixWalletInfo)) {\n throw new Error('Expected matrixWalletInfo');\n }\n matrixWallet = fullWalletForID(matrixWalletInfo.id);\n\n const broadcasterWalletInfo = await createMatrixWallet(\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_MNEMONIC,\n undefined, // creationBlockNumbers\n );\n if (!isDefined(broadcasterWalletInfo)) {\n throw new Error('Expected broadcasterWalletInfo');\n }\n const broadcasterMatrixAddress = broadcasterWalletInfo.matrixAddress;\n\n broadcasterFeeERC20AmountRecipient = {\n ...MOCK_TOKEN_FEE,\n recipientAddress: broadcasterMatrixAddress,\n };\n\n railProveStub = Sinon.stub(\n TransactionBatch.prototype,\n 'generateTransactions',\n ).resolves({\n provedTransactions: [\n {\n nullifiers: MOCK_NULLIFIERS,\n },\n ] as (TransactionStructV3)[],\n });\n railDummyProveStub = Sinon.stub(\n TransactionBatch.prototype,\n 'generateDummyTransactions',\n ).resolves([\n {\n commitments: MOCK_COMMITMENTS,\n boundParams: MOCK_BOUND_PARAMS_V3,\n nullifiers: MOCK_NULLIFIERS,\n },\n ] as (TransactionStructV3)[]);\n relayAdaptPopulateCrossContractCalls = Sinon.stub(\n RelayAdaptV3Contract.prototype,\n 'populateCrossContractCalls',\n ).resolves({ data: '0x0123' } as ContractTransaction);\n });\n afterEach(() => {\n gasEstimateStub?.restore();\n addUnshieldDataSpy?.restore();\n erc20NoteSpy?.restore();\n relayAdaptGasEstimateStub?.restore();\n });\n after(async () => {\n railProveStub.restore();\n railDummyProveStub.restore();\n relayAdaptPopulateCrossContractCalls.restore();\n await closeTestEngine();\n });\n\n // GAS ESTIMATE\n\n it('Should get gas estimates for valid cross contract calls', async () => {\n stubRelayAdaptGasEstimate();\n spyOnSetUnshield();\n const rsp = await gasEstimateForUnprovenCrossContractCalls(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNTS,\n MOCK_NFT_AMOUNTS,\n MOCK_ERC20_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n mockCrossContractCalls,\n MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2,\n MOCK_FEE_TOKEN_DETAILS,\n false, // sendWithPublicWallet\n minGasLimit,\n );\n expect(addUnshieldDataSpy.called).to.be.true;\n expect(addUnshieldDataSpy.args).to.deep.equal([\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData0,\n value: BigInt('0x0100'),\n allowOverride: false,\n },\n ], // run 1 - erc20 1\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData1,\n value: BigInt('0x0200'),\n allowOverride: false,\n },\n ], // run 1 - erc20 2\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockNFTTokenData0,\n value: BigInt('1'),\n allowOverride: false,\n },\n ], // run 1 - nft 0\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockNFTTokenData1,\n value: BigInt('2'),\n allowOverride: false,\n },\n ], // run 1 - nft 1\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData0,\n value: BigInt('0x0100'),\n allowOverride: false,\n },\n ], // run 2 - erc20 1\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData1,\n value: BigInt('0x0200'),\n allowOverride: false,\n },\n ], // run 2 - erc20 2\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockNFTTokenData0,\n value: BigInt('1'),\n allowOverride: false,\n },\n ], // run 2 - nft 0\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockNFTTokenData1,\n value: BigInt('2'),\n allowOverride: false,\n },\n ], // run 2 - nft 1\n ]);\n // Add 9000 for the dummy tx variance\n // expect(rsp.gasEstimate).to.equal(9000n + 280n);\n expect(rsp.gasEstimate).to.equal(3_200_000n); // Cross Contract Minimum\n }).timeout(10_000);\n\n it('Should get gas estimates for valid cross contract calls, public wallet', async () => {\n stubRelayAdaptGasEstimate();\n spyOnSetUnshield();\n const rsp = await gasEstimateForUnprovenCrossContractCalls(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNTS,\n MOCK_NFT_AMOUNTS,\n MOCK_ERC20_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n mockCrossContractCalls,\n MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2,\n MOCK_FEE_TOKEN_DETAILS,\n true, // sendWithPublicWallet\n minGasLimit,\n );\n\n expect(addUnshieldDataSpy.called).to.be.true;\n expect(addUnshieldDataSpy.args).to.deep.equal([\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData0,\n value: BigInt('0x0100'),\n allowOverride: false,\n },\n ], // run 1 - erc20 1\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData1,\n value: BigInt('0x0200'),\n allowOverride: false,\n },\n ], // run 1 - erc20 2\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockNFTTokenData0,\n value: BigInt('1'),\n allowOverride: false,\n },\n ], // run 1 - nft 0\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockNFTTokenData1,\n value: BigInt('2'),\n allowOverride: false,\n },\n ], // run 1 - nft 1\n ]);\n // Add 9000 for the dummy tx variance\n // expect(rsp.gasEstimate).to.equal(9000n + 280n);\n expect(rsp.gasEstimate).to.equal(3_200_000n); // Cross Contract Minimum\n }).timeout(10_000);\n\n it('Should error on gas estimates for invalid cross contract calls', async () => {\n stubGasEstimateSuccess();\n await expect(\n gasEstimateForUnprovenCrossContractCalls(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNTS,\n MOCK_NFT_AMOUNTS,\n MOCK_ERC20_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n [{ data: 'abc' } as ContractTransaction], // Invalid\n MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2,\n MOCK_FEE_TOKEN_DETAILS,\n false, // sendWithPublicWallet\n minGasLimit,\n ),\n ).rejectedWith(`Cross-contract calls require to and data fields.`);\n });\n\n it('Should error on cross contract calls gas estimate for ethers rejections', async () => {\n stubRelayAdaptGasEstimateFailure();\n await expect(\n gasEstimateForUnprovenCrossContractCalls(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNTS,\n MOCK_NFT_AMOUNTS,\n MOCK_ERC20_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n mockCrossContractCalls,\n MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2,\n MOCK_FEE_TOKEN_DETAILS,\n false, // sendWithPublicWallet\n minGasLimit,\n ),\n ).rejectedWith('RelayAdapt multicall failed at index UNKNOWN.');\n });\n\n // PROVE AND SEND\n\n it('Should populate tx for valid cross contract calls', async () => {\n stubGasEstimateSuccess();\n setCachedProvedTransaction(undefined);\n spyOnSetUnshield();\n await generateCrossContractCallsProof(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNTS,\n MOCK_NFT_AMOUNTS,\n MOCK_ERC20_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n mockCrossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n minGasLimit,\n () => {}, // progressCallback\n );\n expect(addUnshieldDataSpy.called).to.be.true;\n expect(addUnshieldDataSpy.args).to.deep.equal([\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData0,\n value: BigInt('0x0100'),\n allowOverride: false,\n },\n ], // dummy proof - erc20 token 0\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData1,\n value: BigInt('0x0200'),\n allowOverride: false,\n },\n ], // dummy proof - erc20 token 1\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockNFTTokenData0,\n value: BigInt('1'),\n allowOverride: false,\n },\n ], // dummy proof - nft 0\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockNFTTokenData1,\n value: BigInt('2'),\n allowOverride: false,\n },\n ], // actual proof - nft 1\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData0,\n value: BigInt('0x0100'),\n allowOverride: false,\n },\n ], // actual proof - erc20 token 0\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData1,\n value: BigInt('0x0200'),\n allowOverride: false,\n },\n ], // actual proof - erc20 token 1\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockNFTTokenData0,\n value: BigInt('1'),\n allowOverride: false,\n },\n ], // actual proof - nft 0\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockNFTTokenData1,\n value: BigInt('2'),\n allowOverride: false,\n },\n ], // actual proof - nft 1\n ]);\n const populateResponse = await populateProvedCrossContractCalls(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_TOKEN_AMOUNTS,\n MOCK_NFT_AMOUNTS,\n MOCK_ERC20_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n mockCrossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n gasDetails, // gasDetails\n );\n expect(populateResponse.nullifiers).to.deep.equal([\n '0x0000000000000000000000000000000000000000000000000000000000000001',\n '0x0000000000000000000000000000000000000000000000000000000000000002',\n ]);\n\n const { transaction } = populateResponse;\n\n expect(transaction.nonce).to.equal(undefined);\n expect(transaction.gasPrice?.toString()).to.equal('4096');\n expect(transaction.gasLimit).to.equal(2400n);\n expect(transaction.value?.toString()).to.equal(undefined);\n expect(transaction.data).to.equal('0x0123');\n expect(transaction.to).to.equal(undefined);\n expect(transaction.chainId).to.equal(undefined);\n expect(transaction.type).to.equal(1);\n });\n\n it('Should error on populate tx for invalid cross contract calls', async () => {\n stubGasEstimateSuccess();\n await expect(\n populateProvedCrossContractCalls(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_TOKEN_AMOUNTS_DIFFERENT,\n MOCK_NFT_AMOUNTS,\n MOCK_ERC20_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n [{ data: '123' } as ContractTransaction], // Invalid\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n gasDetails,\n ),\n ).rejectedWith('Invalid proof for this transaction');\n });\n\n it('Should error on populate cross contract calls tx for unproved transaction', async () => {\n stubGasEstimateSuccess();\n setCachedProvedTransaction(undefined);\n await expect(\n populateProvedCrossContractCalls(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_TOKEN_AMOUNTS,\n MOCK_NFT_AMOUNTS,\n MOCK_ERC20_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n mockCrossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n gasDetails,\n ),\n ).rejectedWith('Invalid proof for this transaction');\n });\n\n it('Should error on populate cross contract calls tx when params changed (invalid cached proof)', async () => {\n stubGasEstimateSuccess();\n await generateCrossContractCallsProof(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNTS,\n MOCK_NFT_AMOUNTS,\n MOCK_ERC20_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n mockCrossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n minGasLimit,\n () => {}, // progressCallback\n );\n await expect(\n populateProvedCrossContractCalls(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_TOKEN_AMOUNTS_DIFFERENT,\n MOCK_NFT_AMOUNTS,\n MOCK_ERC20_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n mockCrossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n gasDetails,\n ),\n ).rejectedWith('Invalid proof for this transaction');\n });\n\n it('Should decode and parse relay adapt error logs (from failed Sushi V2 LP removal)', () => {\n const transactionError = getRelayAdaptTransactionError(\n NetworkName.Hardhat,\n FormattedRelayAdaptErrorLogs,\n );\n expect(transactionError).to.equal('ds-math-sub-underflow');\n });\n\n it('Should parse relay adapt log revert data', () => {\n const transactionError = parseRelayAdaptReturnValue(\n NetworkName.Hardhat,\n `0x5c0dee5d00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006408c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001564732d6d6174682d7375622d756e646572666c6f77000000000000000000000000000000000000000000000000000000000000000000000000000000`,\n );\n expect(transactionError).to.equal('ds-math-sub-underflow');\n });\n\n it('Should parse relay adapt revert data from matrix cookbook', () => {\n const transactionError = parseRelayAdaptReturnValue(\n NetworkName.Hardhat,\n `0x5c0dee5d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002d52656c617941646170743a205265667573696e6720746f2063616c6c205261696c67756e20636f6e747261637400000000000000000000000000000000000000`,\n );\n expect(transactionError).to.equal(\n 'RelayAdapt: Refusing to call Matrix contract',\n );\n });\n});\n"]}
@@ -0,0 +1,109 @@
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 shared_models_1 = require("@matrix-privacy/shared-models");
10
+ const mocks_test_1 = require("../../../tests/mocks.test");
11
+ const tx_gas_details_1 = require("../tx-gas-details");
12
+ const matrix_1 = require("../../matrix");
13
+ const ethers_1 = require("ethers");
14
+ let gasEstimateStub;
15
+ chai_1.default.use(chai_as_promised_1.default);
16
+ const { expect } = chai_1.default;
17
+ const stubGasEstimateSuccess = () => {
18
+ gasEstimateStub = sinon_1.default.stub(ethers_1.FallbackProvider.prototype, 'estimateGas').resolves(BigInt('200'));
19
+ };
20
+ describe('tx-gas', () => {
21
+ afterEach(() => {
22
+ gasEstimateStub?.restore();
23
+ });
24
+ it('Should format gas estimate response', async () => {
25
+ const transaction = {};
26
+ const fallbackProvider = (0, shared_models_1.createFallbackProviderFromJsonConfig)(mocks_test_1.MOCK_FALLBACK_PROVIDER_JSON_CONFIG_SEPOLIA);
27
+ (0, matrix_1.setFallbackProviderForNetwork)(shared_models_1.NetworkName.Hardhat, fallbackProvider);
28
+ const gasEstimate = await (0, tx_gas_details_1.getGasEstimate)(shared_models_1.NetworkName.Hardhat, transaction, mocks_test_1.MOCK_ETH_WALLET_ADDRESS, true, // sendWithPublicWallet
29
+ false);
30
+ const isGasEstimateWithDummyProof = false;
31
+ const rsp = (0, tx_gas_details_1.gasEstimateResponse)(gasEstimate, undefined, // broadcasterFeeCommitment
32
+ isGasEstimateWithDummyProof);
33
+ const expectedGas = 53000n; // This field may vary
34
+ const variance = 0.05; // 5%
35
+ const lowerBound = Number(expectedGas) * (1 - variance);
36
+ const upperBound = Number(expectedGas) * (1 + variance);
37
+ expect(Number(rsp.gasEstimate)).to.be.within(lowerBound, upperBound);
38
+ }).timeout(6000);
39
+ it('Should pull gas estimate for basic transaction - self-signed', async () => {
40
+ stubGasEstimateSuccess();
41
+ const fallbackProvider = (0, shared_models_1.createFallbackProviderFromJsonConfig)(mocks_test_1.MOCK_FALLBACK_PROVIDER_JSON_CONFIG_SEPOLIA);
42
+ (0, matrix_1.setFallbackProviderForNetwork)(shared_models_1.NetworkName.Hardhat, fallbackProvider);
43
+ const tx = {
44
+ chainId: 31337n,
45
+ to: mocks_test_1.MOCK_ETH_WALLET_ADDRESS,
46
+ value: BigInt('100'),
47
+ data: '0x',
48
+ };
49
+ const gasEstimate = await (0, tx_gas_details_1.getGasEstimate)(shared_models_1.NetworkName.Hardhat, tx, mocks_test_1.MOCK_ETH_WALLET_ADDRESS, true, // sendWithPublicWallet
50
+ false);
51
+ const isGasEstimateWithDummyProof = true;
52
+ const rsp = (0, tx_gas_details_1.gasEstimateResponse)(gasEstimate, undefined, // broadcasterFeeCommitment
53
+ isGasEstimateWithDummyProof);
54
+ expect(rsp.gasEstimate).to.not.be.undefined;
55
+ }).timeout(60000);
56
+ it('Should pull gas estimate for basic transaction - broadcaster', async () => {
57
+ stubGasEstimateSuccess();
58
+ const fallbackProvider = (0, shared_models_1.createFallbackProviderFromJsonConfig)(mocks_test_1.MOCK_FALLBACK_PROVIDER_JSON_CONFIG_SEPOLIA);
59
+ (0, matrix_1.setFallbackProviderForNetwork)(shared_models_1.NetworkName.Hardhat, fallbackProvider);
60
+ const tx = {
61
+ chainId: 31337n,
62
+ to: mocks_test_1.MOCK_ETH_WALLET_ADDRESS,
63
+ value: BigInt('100'),
64
+ data: '0x',
65
+ };
66
+ const gasEstimate = await (0, tx_gas_details_1.getGasEstimate)(shared_models_1.NetworkName.Hardhat, tx, mocks_test_1.MOCK_ETH_WALLET_ADDRESS, false, // sendWithPublicWallet
67
+ false);
68
+ const isGasEstimateWithDummyProof = true;
69
+ const rsp = (0, tx_gas_details_1.gasEstimateResponse)(gasEstimate, undefined, // broadcasterFeeCommitment
70
+ isGasEstimateWithDummyProof);
71
+ expect(rsp.gasEstimate).to.not.be.undefined;
72
+ }).timeout(60000);
73
+ it('Should set gas details for populated tx', () => {
74
+ const transaction = {};
75
+ const gasDetailsType0 = {
76
+ evmGasType: shared_models_1.EVMGasType.Type0,
77
+ gasEstimate: 100000n,
78
+ gasPrice: 500n,
79
+ };
80
+ const gasDetailsType1 = {
81
+ evmGasType: shared_models_1.EVMGasType.Type1,
82
+ gasEstimate: 100000n,
83
+ gasPrice: 500n,
84
+ };
85
+ const gasDetailsType2 = {
86
+ evmGasType: shared_models_1.EVMGasType.Type2,
87
+ gasEstimate: 120000n,
88
+ maxFeePerGas: 10000n,
89
+ maxPriorityFeePerGas: 500n,
90
+ };
91
+ // Hardhat - self-sign
92
+ (0, tx_gas_details_1.setGasDetailsForTransaction)(shared_models_1.NetworkName.Hardhat, transaction, gasDetailsType2, true);
93
+ expect(transaction.type).to.equal(2);
94
+ expect(transaction.gasLimit).to.equal(144000n);
95
+ expect(transaction.gasPrice).to.be.undefined;
96
+ expect(transaction.maxFeePerGas).to.equal(10000n);
97
+ expect(transaction.maxPriorityFeePerGas).to.equal(500n);
98
+ // Hardhat - Broadcaster
99
+ (0, tx_gas_details_1.setGasDetailsForTransaction)(shared_models_1.NetworkName.Hardhat, transaction, gasDetailsType1, false);
100
+ // Hardhat - self-sign - type0
101
+ (0, tx_gas_details_1.setGasDetailsForTransaction)(shared_models_1.NetworkName.Hardhat, transaction, gasDetailsType0, true);
102
+ // Hardhat - Broadcaster - type0
103
+ (0, tx_gas_details_1.setGasDetailsForTransaction)(shared_models_1.NetworkName.Hardhat, transaction, gasDetailsType0, false);
104
+ expect(transaction.type).to.equal(0);
105
+ expect(transaction.gasLimit).to.equal(120000n);
106
+ expect(transaction.gasPrice).to.equal(500n);
107
+ });
108
+ });
109
+ //# sourceMappingURL=tx-gas-details.test.js.map