@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,210 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseRelayAdaptReturnValue = exports.getRelayAdaptTransactionError = exports.generateCrossContractCallsProof = exports.gasEstimateForUnprovenCrossContractCalls = exports.populateProvedCrossContractCalls = exports.createNFTTokenDataFromMatrixNFTAmount = exports.createRelayAdaptUnshieldNFTAmountRecipients = exports.createRelayAdaptUnshieldERC20AmountRecipients = void 0;
4
+ const shared_models_1 = require("@matrix-privacy/shared-models");
5
+ const tx_generator_1 = require("./tx-generator");
6
+ const proof_cache_1 = require("./proof-cache");
7
+ const logger_1 = require("../../utils/logger");
8
+ const engine_1 = require("@matrix-privacy/engine");
9
+ const tx_gas_broadcaster_fee_estimator_1 = require("./tx-gas-broadcaster-fee-estimator");
10
+ const error_1 = require("../../utils/error");
11
+ const utils_1 = require("../../utils");
12
+ const shared_formatters_1 = require("../matrix/quick-sync/shared-formatters");
13
+ const createValidCrossContractCalls = (crossContractCalls) => {
14
+ if (!crossContractCalls.length) {
15
+ throw new Error('No cross contract calls in transaction.');
16
+ }
17
+ try {
18
+ return crossContractCalls.map(transactionRequest => {
19
+ if (!transactionRequest.to || !transactionRequest.data) {
20
+ throw new Error(`Cross-contract calls require 'to' and 'data' fields.`);
21
+ }
22
+ const transaction = {
23
+ to: transactionRequest.to,
24
+ value: transactionRequest.value,
25
+ data: engine_1.ByteUtils.hexlify(transactionRequest.data, true),
26
+ };
27
+ return transaction;
28
+ });
29
+ }
30
+ catch (cause) {
31
+ if (!(cause instanceof Error)) {
32
+ throw new Error('Non-error thrown from createValidCrossContractCalls', {
33
+ cause,
34
+ });
35
+ }
36
+ throw (0, error_1.reportAndSanitizeError)(createValidCrossContractCalls.name, cause);
37
+ }
38
+ };
39
+ const createRelayAdaptUnshieldERC20AmountRecipients = (networkName, unshieldERC20Amounts) => {
40
+ const chain = shared_models_1.NETWORK_CONFIG[networkName].chain;
41
+ const relayAdaptContract = engine_1.MatrixContracts.getRelayAdaptContract(chain);
42
+ const unshieldERC20AmountRecipients = unshieldERC20Amounts.map(unshieldERC20Amount => ({
43
+ ...unshieldERC20Amount,
44
+ recipientAddress: relayAdaptContract.address,
45
+ }));
46
+ return unshieldERC20AmountRecipients;
47
+ };
48
+ exports.createRelayAdaptUnshieldERC20AmountRecipients = createRelayAdaptUnshieldERC20AmountRecipients;
49
+ const createRelayAdaptUnshieldNFTAmountRecipients = (networkName, unshieldNFTAmounts) => {
50
+ const chain = shared_models_1.NETWORK_CONFIG[networkName].chain;
51
+ const relayAdaptContract = engine_1.MatrixContracts.getRelayAdaptContract(chain);
52
+ const unshieldNFTAmountRecipients = unshieldNFTAmounts.map(unshieldNFTAmount => ({
53
+ ...unshieldNFTAmount,
54
+ recipientAddress: relayAdaptContract.address,
55
+ }));
56
+ return unshieldNFTAmountRecipients;
57
+ };
58
+ exports.createRelayAdaptUnshieldNFTAmountRecipients = createRelayAdaptUnshieldNFTAmountRecipients;
59
+ const createNFTTokenDataFromMatrixNFTAmount = (nftAmount) => {
60
+ const tokenSubIDHex = (0, utils_1.isDecimalStr)(nftAmount.tokenSubID)
61
+ ? (0, shared_formatters_1.bigIntStringToHex)(nftAmount.tokenSubID)
62
+ : nftAmount.tokenSubID;
63
+ return {
64
+ tokenAddress: engine_1.ByteUtils.formatToByteLength(nftAmount.nftAddress, engine_1.ByteLength.Address, true),
65
+ tokenType: nftAmount.nftTokenType,
66
+ tokenSubID: engine_1.ByteUtils.formatToByteLength(tokenSubIDHex, engine_1.ByteLength.UINT_256, true),
67
+ };
68
+ };
69
+ exports.createNFTTokenDataFromMatrixNFTAmount = createNFTTokenDataFromMatrixNFTAmount;
70
+ const createRelayAdaptShieldNFTRecipients = (relayAdaptShieldNFTRecipients) => {
71
+ return relayAdaptShieldNFTRecipients.map((nftRecipient) => ({
72
+ nftTokenData: (0, exports.createNFTTokenDataFromMatrixNFTAmount)(nftRecipient),
73
+ recipientAddress: nftRecipient.recipientAddress,
74
+ }));
75
+ };
76
+ const populateProvedCrossContractCalls = async (networkName, matrixWalletID, relayAdaptUnshieldERC20Amounts, relayAdaptUnshieldNFTAmounts, relayAdaptShieldERC20Recipients, relayAdaptShieldNFTRecipients, crossContractCalls, broadcasterFeeERC20AmountRecipient, sendWithPublicWallet, overallBatchMinGasPrice, gasDetails) => {
77
+ try {
78
+ const { transaction, nullifiers } = await (0, proof_cache_1.populateProvedTransaction)(networkName, shared_models_1.ProofType.CrossContractCalls, matrixWalletID, false, // showSenderAddressToRecipient
79
+ undefined, // memoText
80
+ [], // erc20AmountRecipients
81
+ [], // nftAmountRecipients
82
+ relayAdaptUnshieldERC20Amounts, relayAdaptUnshieldNFTAmounts, relayAdaptShieldERC20Recipients, relayAdaptShieldNFTRecipients, crossContractCalls, broadcasterFeeERC20AmountRecipient, sendWithPublicWallet, overallBatchMinGasPrice, gasDetails);
83
+ delete transaction.from;
84
+ return {
85
+ nullifiers,
86
+ transaction,
87
+ };
88
+ }
89
+ catch (err) {
90
+ throw (0, error_1.reportAndSanitizeError)(exports.populateProvedCrossContractCalls.name, err);
91
+ }
92
+ };
93
+ exports.populateProvedCrossContractCalls = populateProvedCrossContractCalls;
94
+ const gasEstimateForUnprovenCrossContractCalls = async (networkName, matrixWalletID, encryptionKey, relayAdaptUnshieldERC20Amounts, relayAdaptUnshieldNFTAmounts, relayAdaptShieldERC20Recipients, relayAdaptShieldNFTRecipients, crossContractCalls, originalGasDetails, feeTokenDetails, sendWithPublicWallet, minGasLimit) => {
95
+ try {
96
+ (0, proof_cache_1.setCachedProvedTransaction)(undefined);
97
+ const overallBatchMinGasPrice = 0n;
98
+ const validCrossContractCalls = createValidCrossContractCalls(crossContractCalls);
99
+ const chain = shared_models_1.NETWORK_CONFIG[networkName].chain;
100
+ const relayAdaptUnshieldERC20AmountRecipients = (0, exports.createRelayAdaptUnshieldERC20AmountRecipients)(networkName, relayAdaptUnshieldERC20Amounts);
101
+ const relayAdaptUnshieldNFTAmountRecipients = (0, exports.createRelayAdaptUnshieldNFTAmountRecipients)(networkName, relayAdaptUnshieldNFTAmounts);
102
+ const shieldRandom = engine_1.ByteUtils.randomHex(16);
103
+ const relayShieldRequests = await engine_1.RelayAdaptHelper.generateRelayShieldRequests(shieldRandom, relayAdaptShieldERC20Recipients, createRelayAdaptShieldNFTRecipients(relayAdaptShieldNFTRecipients));
104
+ const minimumGasLimit = minGasLimit ?? engine_1.MINIMUM_RELAY_ADAPT_CROSS_CONTRACT_CALLS_GAS_LIMIT_V2;
105
+ const relayAdaptContract = engine_1.MatrixContracts.getRelayAdaptContract(chain);
106
+ const response = await (0, tx_gas_broadcaster_fee_estimator_1.gasEstimateResponseDummyProofIterativeBroadcasterFee)((broadcasterFeeERC20Amount) => (0, tx_generator_1.generateDummyProofTransactions)(shared_models_1.ProofType.CrossContractCalls, networkName, matrixWalletID, encryptionKey, false, // showSenderAddressToRecipient
107
+ undefined, // memoText
108
+ relayAdaptUnshieldERC20AmountRecipients, relayAdaptUnshieldNFTAmountRecipients, broadcasterFeeERC20Amount, sendWithPublicWallet, overallBatchMinGasPrice), async (txs) => {
109
+ const relayAdaptParamsRandom = engine_1.ByteUtils.randomHex(31);
110
+ const transaction = await relayAdaptContract.populateCrossContractCalls(txs, validCrossContractCalls, relayShieldRequests, relayAdaptParamsRandom, true, // isGasEstimate
111
+ !sendWithPublicWallet, // isBroadcasterTransaction
112
+ minimumGasLimit);
113
+ // Remove gasLimit, we'll set to the minimum below.
114
+ delete transaction.gasLimit;
115
+ return transaction;
116
+ }, networkName, matrixWalletID, relayAdaptUnshieldERC20AmountRecipients, originalGasDetails, feeTokenDetails, sendWithPublicWallet, true);
117
+ // If gas estimate is under the cross-contract-minimum, replace it with the minimum.
118
+ if (response.gasEstimate) {
119
+ if (response.gasEstimate < minimumGasLimit) {
120
+ response.gasEstimate = minimumGasLimit;
121
+ }
122
+ }
123
+ return response;
124
+ }
125
+ catch (err) {
126
+ throw (0, error_1.reportAndSanitizeError)(exports.gasEstimateForUnprovenCrossContractCalls.name, err);
127
+ }
128
+ };
129
+ exports.gasEstimateForUnprovenCrossContractCalls = gasEstimateForUnprovenCrossContractCalls;
130
+ const generateCrossContractCallsProof = async (networkName, matrixWalletID, encryptionKey, relayAdaptUnshieldERC20Amounts, relayAdaptUnshieldNFTAmounts, relayAdaptShieldERC20Recipients, relayAdaptShieldNFTRecipients, crossContractCalls, broadcasterFeeERC20AmountRecipient, sendWithPublicWallet, overallBatchMinGasPrice, minGasLimit, progressCallback) => {
131
+ try {
132
+ (0, proof_cache_1.setCachedProvedTransaction)(undefined);
133
+ const validCrossContractCalls = createValidCrossContractCalls(crossContractCalls);
134
+ const relayAdaptUnshieldERC20AmountRecipients = (0, exports.createRelayAdaptUnshieldERC20AmountRecipients)(networkName, relayAdaptUnshieldERC20Amounts);
135
+ const relayAdaptUnshieldNFTAmountRecipients = (0, exports.createRelayAdaptUnshieldNFTAmountRecipients)(networkName, relayAdaptUnshieldNFTAmounts);
136
+ // Generate dummy txs for relay adapt params.
137
+ const dummyUnshieldTxs = await (0, tx_generator_1.generateDummyProofTransactions)(shared_models_1.ProofType.CrossContractCalls, networkName, matrixWalletID, encryptionKey, false, // showSenderAddressToRecipient
138
+ undefined, // memoText
139
+ relayAdaptUnshieldERC20AmountRecipients, relayAdaptUnshieldNFTAmountRecipients, broadcasterFeeERC20AmountRecipient, sendWithPublicWallet, overallBatchMinGasPrice);
140
+ // Generate relay adapt params from dummy transactions.
141
+ const shieldRandom = engine_1.ByteUtils.randomHex(16);
142
+ const relayShieldRequests = await engine_1.RelayAdaptHelper.generateRelayShieldRequests(shieldRandom, relayAdaptShieldERC20Recipients, createRelayAdaptShieldNFTRecipients(relayAdaptShieldNFTRecipients));
143
+ const minimumGasLimit = minGasLimit ?? engine_1.MINIMUM_RELAY_ADAPT_CROSS_CONTRACT_CALLS_GAS_LIMIT_V2;
144
+ const { chain } = shared_models_1.NETWORK_CONFIG[networkName];
145
+ const isBroadcasterTransaction = !sendWithPublicWallet;
146
+ const relayAdaptParamsRandom = engine_1.ByteUtils.randomHex(31);
147
+ const relayAdaptContract = engine_1.MatrixContracts.getRelayAdaptContract(chain);
148
+ const relayAdaptParams = await relayAdaptContract.getRelayAdaptParamsCrossContractCalls(dummyUnshieldTxs, validCrossContractCalls, relayShieldRequests, relayAdaptParamsRandom, isBroadcasterTransaction, minimumGasLimit);
149
+ // Create real transactions with relay adapt params.
150
+ const { provedTransactions } = await (0, tx_generator_1.generateProofTransactions)(shared_models_1.ProofType.CrossContractCalls, networkName, matrixWalletID, encryptionKey, false, // showSenderAddressToRecipient
151
+ undefined, // memoText
152
+ relayAdaptUnshieldERC20AmountRecipients, relayAdaptUnshieldNFTAmountRecipients, broadcasterFeeERC20AmountRecipient, sendWithPublicWallet, false, // useDummyProof
153
+ overallBatchMinGasPrice, progressCallback);
154
+ const nullifiers = (0, tx_generator_1.nullifiersForTransactions)(provedTransactions);
155
+ const transaction = await relayAdaptContract.populateCrossContractCalls(provedTransactions, validCrossContractCalls, relayShieldRequests, relayAdaptParamsRandom, false, // isGasEstimate
156
+ isBroadcasterTransaction, minimumGasLimit);
157
+ delete transaction.from;
158
+ (0, proof_cache_1.setCachedProvedTransaction)({
159
+ proofType: shared_models_1.ProofType.CrossContractCalls,
160
+ matrixWalletID,
161
+ showSenderAddressToRecipient: false,
162
+ memoText: undefined,
163
+ erc20AmountRecipients: [],
164
+ nftAmountRecipients: [],
165
+ relayAdaptUnshieldERC20Amounts,
166
+ relayAdaptUnshieldNFTAmounts,
167
+ relayAdaptShieldERC20Recipients,
168
+ relayAdaptShieldNFTRecipients,
169
+ crossContractCalls: validCrossContractCalls,
170
+ broadcasterFeeERC20AmountRecipient,
171
+ sendWithPublicWallet,
172
+ transaction,
173
+ overallBatchMinGasPrice,
174
+ nullifiers,
175
+ });
176
+ }
177
+ catch (err) {
178
+ throw (0, error_1.reportAndSanitizeError)(exports.generateCrossContractCallsProof.name, err);
179
+ }
180
+ };
181
+ exports.generateCrossContractCallsProof = generateCrossContractCallsProof;
182
+ const getRelayAdaptTransactionError = (networkName, receiptLogs) => {
183
+ try {
184
+ const relayAdaptError = engine_1.RelayAdaptV3Contract.getRelayAdaptCallError(receiptLogs);
185
+ if ((0, shared_models_1.isDefined)(relayAdaptError)) {
186
+ (0, logger_1.sendErrorMessage)(relayAdaptError);
187
+ return relayAdaptError;
188
+ }
189
+ return undefined;
190
+ }
191
+ catch (err) {
192
+ throw (0, error_1.reportAndSanitizeError)(exports.getRelayAdaptTransactionError.name, err);
193
+ }
194
+ };
195
+ exports.getRelayAdaptTransactionError = getRelayAdaptTransactionError;
196
+ const parseRelayAdaptReturnValue = (networkName, data) => {
197
+ try {
198
+ const relayAdaptErrorParsed = engine_1.RelayAdaptV3Contract.parseRelayAdaptReturnValue(data);
199
+ if ((0, shared_models_1.isDefined)(relayAdaptErrorParsed)) {
200
+ (0, logger_1.sendErrorMessage)(relayAdaptErrorParsed.error);
201
+ return relayAdaptErrorParsed.error;
202
+ }
203
+ return undefined;
204
+ }
205
+ catch (err) {
206
+ throw (0, error_1.reportAndSanitizeError)(exports.getRelayAdaptTransactionError.name, err);
207
+ }
208
+ };
209
+ exports.parseRelayAdaptReturnValue = parseRelayAdaptReturnValue;
210
+ //# sourceMappingURL=tx-cross-contract-calls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tx-cross-contract-calls.js","sourceRoot":"","sources":["../../../src/services/transactions/tx-cross-contract-calls.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n MatrixPopulateTransactionResponse,\n MatrixTransactionGasEstimateResponse,\n MatrixERC20Amount,\n NetworkName,\n ProofType,\n TransactionReceiptLog,\n FeeTokenDetails,\n MatrixERC20AmountRecipient,\n MatrixNFTAmountRecipient,\n MatrixNFTAmount,\n TransactionGasDetails,\n isDefined,\n MatrixERC20Recipient,\n NETWORK_CONFIG,\n} from '@matrix-privacy/shared-models';\nimport {\n GenerateTransactionsProgressCallback,\n generateDummyProofTransactions,\n generateProofTransactions,\n nullifiersForTransactions,\n} from './tx-generator';\nimport {\n populateProvedTransaction,\n setCachedProvedTransaction,\n} from './proof-cache';\nimport { sendErrorMessage } from '../../utils/logger';\nimport {\n RelayAdaptHelper,\n NFTTokenData,\n ByteUtils,\n ByteLength,\n MINIMUM_RELAY_ADAPT_CROSS_CONTRACT_CALLS_GAS_LIMIT_V2,\n RelayAdaptShieldNFTRecipient,\n TransactionStructV3,\n MatrixContracts,\n RelayAdaptV3Contract,\n} from '@matrix-privacy/engine';\nimport { gasEstimateResponseDummyProofIterativeBroadcasterFee } from './tx-gas-broadcaster-fee-estimator';\nimport { reportAndSanitizeError } from '../../utils/error';\nimport { ContractTransaction } from 'ethers';\nimport { isDecimalStr } from '../../utils';\nimport { bigIntStringToHex } from '../matrix/quick-sync/shared-formatters';\n\nconst createValidCrossContractCalls = (\n crossContractCalls: ContractTransaction[],\n): ContractTransaction[] => {\n if (!crossContractCalls.length) {\n throw new Error('No cross contract calls in transaction.');\n }\n try {\n return crossContractCalls.map(transactionRequest => {\n if (!transactionRequest.to || !transactionRequest.data) {\n throw new Error(`Cross-contract calls require 'to' and 'data' fields.`);\n }\n const transaction: ContractTransaction = {\n to: transactionRequest.to,\n value: transactionRequest.value,\n data: ByteUtils.hexlify(transactionRequest.data, true),\n };\n return transaction;\n });\n } catch (cause) {\n if (!(cause instanceof Error)) {\n throw new Error('Non-error thrown from createValidCrossContractCalls', {\n cause,\n });\n }\n throw reportAndSanitizeError(createValidCrossContractCalls.name, cause);\n }\n};\n\nexport const createRelayAdaptUnshieldERC20AmountRecipients = (\n networkName: NetworkName,\n unshieldERC20Amounts: MatrixERC20Amount[],\n): MatrixERC20AmountRecipient[] => {\n const chain = NETWORK_CONFIG[networkName].chain;\n const relayAdaptContract =\n MatrixContracts.getRelayAdaptContract(chain);\n const unshieldERC20AmountRecipients: MatrixERC20AmountRecipient[] =\n unshieldERC20Amounts.map(unshieldERC20Amount => ({\n ...unshieldERC20Amount,\n recipientAddress: relayAdaptContract.address,\n }));\n return unshieldERC20AmountRecipients;\n};\n\nexport const createRelayAdaptUnshieldNFTAmountRecipients = (\n networkName: NetworkName,\n unshieldNFTAmounts: MatrixNFTAmount[],\n): MatrixNFTAmountRecipient[] => {\n const chain = NETWORK_CONFIG[networkName].chain;\n const relayAdaptContract =\n MatrixContracts.getRelayAdaptContract(chain);\n const unshieldNFTAmountRecipients: MatrixNFTAmountRecipient[] =\n unshieldNFTAmounts.map(unshieldNFTAmount => ({\n ...unshieldNFTAmount,\n recipientAddress: relayAdaptContract.address,\n }));\n return unshieldNFTAmountRecipients;\n};\n\nexport const createNFTTokenDataFromMatrixNFTAmount = (\n nftAmount: MatrixNFTAmount,\n): NFTTokenData => {\n const tokenSubIDHex = isDecimalStr(nftAmount.tokenSubID)\n ? bigIntStringToHex(nftAmount.tokenSubID)\n : nftAmount.tokenSubID;\n\n return {\n tokenAddress: ByteUtils.formatToByteLength(\n nftAmount.nftAddress,\n ByteLength.Address,\n true,\n ),\n tokenType: nftAmount.nftTokenType as 1 | 2,\n tokenSubID: ByteUtils.formatToByteLength(\n tokenSubIDHex,\n ByteLength.UINT_256,\n true,\n ),\n };\n};\n\nconst createRelayAdaptShieldNFTRecipients = (\n relayAdaptShieldNFTRecipients: MatrixNFTAmountRecipient[],\n): RelayAdaptShieldNFTRecipient[] => {\n return relayAdaptShieldNFTRecipients.map(\n (nftRecipient: MatrixNFTAmountRecipient) => ({\n nftTokenData: createNFTTokenDataFromMatrixNFTAmount(nftRecipient),\n recipientAddress: nftRecipient.recipientAddress,\n }),\n );\n};\n\nexport const populateProvedCrossContractCalls = async (\n networkName: NetworkName,\n matrixWalletID: string,\n relayAdaptUnshieldERC20Amounts: MatrixERC20Amount[],\n relayAdaptUnshieldNFTAmounts: MatrixNFTAmount[],\n relayAdaptShieldERC20Recipients: MatrixERC20Recipient[],\n relayAdaptShieldNFTRecipients: MatrixNFTAmountRecipient[],\n crossContractCalls: ContractTransaction[],\n broadcasterFeeERC20AmountRecipient: Optional<MatrixERC20AmountRecipient>,\n sendWithPublicWallet: boolean,\n overallBatchMinGasPrice: Optional<bigint>,\n gasDetails: TransactionGasDetails,\n): Promise<MatrixPopulateTransactionResponse> => {\n try {\n const { transaction, nullifiers } =\n await populateProvedTransaction(\n networkName,\n ProofType.CrossContractCalls,\n matrixWalletID,\n false, // showSenderAddressToRecipient\n undefined, // memoText\n [], // erc20AmountRecipients\n [], // nftAmountRecipients\n relayAdaptUnshieldERC20Amounts,\n relayAdaptUnshieldNFTAmounts,\n relayAdaptShieldERC20Recipients,\n relayAdaptShieldNFTRecipients,\n crossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n overallBatchMinGasPrice,\n gasDetails,\n );\n delete transaction.from;\n\n return {\n nullifiers,\n transaction,\n };\n } catch (err) {\n throw reportAndSanitizeError(populateProvedCrossContractCalls.name, err);\n }\n};\n\nexport const gasEstimateForUnprovenCrossContractCalls = async (\n networkName: NetworkName,\n matrixWalletID: string,\n encryptionKey: string,\n relayAdaptUnshieldERC20Amounts: MatrixERC20Amount[],\n relayAdaptUnshieldNFTAmounts: MatrixNFTAmount[],\n relayAdaptShieldERC20Recipients: MatrixERC20Recipient[],\n relayAdaptShieldNFTRecipients: MatrixNFTAmountRecipient[],\n crossContractCalls: ContractTransaction[],\n originalGasDetails: TransactionGasDetails,\n feeTokenDetails: Optional<FeeTokenDetails>,\n sendWithPublicWallet: boolean,\n minGasLimit: Optional<bigint>,\n): Promise<MatrixTransactionGasEstimateResponse> => {\n try {\n setCachedProvedTransaction(undefined);\n\n const overallBatchMinGasPrice = 0n;\n\n const validCrossContractCalls =\n createValidCrossContractCalls(crossContractCalls);\n\n const chain = NETWORK_CONFIG[networkName].chain;\n\n const relayAdaptUnshieldERC20AmountRecipients: MatrixERC20AmountRecipient[] =\n createRelayAdaptUnshieldERC20AmountRecipients(\n networkName,\n relayAdaptUnshieldERC20Amounts,\n );\n const relayAdaptUnshieldNFTAmountRecipients: MatrixNFTAmountRecipient[] =\n createRelayAdaptUnshieldNFTAmountRecipients(\n networkName,\n relayAdaptUnshieldNFTAmounts,\n );\n\n const shieldRandom = ByteUtils.randomHex(16);\n const relayShieldRequests =\n await RelayAdaptHelper.generateRelayShieldRequests(\n shieldRandom,\n relayAdaptShieldERC20Recipients,\n createRelayAdaptShieldNFTRecipients(relayAdaptShieldNFTRecipients),\n );\n\n const minimumGasLimit =\n minGasLimit ?? MINIMUM_RELAY_ADAPT_CROSS_CONTRACT_CALLS_GAS_LIMIT_V2;\n\n const relayAdaptContract = MatrixContracts.getRelayAdaptContract(chain);\n\n const response = await gasEstimateResponseDummyProofIterativeBroadcasterFee(\n (broadcasterFeeERC20Amount: Optional<MatrixERC20Amount>) =>\n generateDummyProofTransactions(\n ProofType.CrossContractCalls,\n networkName,\n matrixWalletID,\n encryptionKey,\n false, // showSenderAddressToRecipient\n undefined, // memoText\n relayAdaptUnshieldERC20AmountRecipients,\n relayAdaptUnshieldNFTAmountRecipients,\n broadcasterFeeERC20Amount,\n sendWithPublicWallet,\n overallBatchMinGasPrice,\n ),\n async (txs: TransactionStructV3[]) => {\n const relayAdaptParamsRandom = ByteUtils.randomHex(31);\n\n const transaction =\n await relayAdaptContract.populateCrossContractCalls(\n txs,\n validCrossContractCalls,\n relayShieldRequests,\n relayAdaptParamsRandom,\n true, // isGasEstimate\n !sendWithPublicWallet, // isBroadcasterTransaction\n minimumGasLimit,\n );\n // Remove gasLimit, we'll set to the minimum below.\n delete transaction.gasLimit;\n return transaction;\n },\n networkName,\n matrixWalletID,\n relayAdaptUnshieldERC20AmountRecipients,\n originalGasDetails,\n feeTokenDetails,\n sendWithPublicWallet,\n true, // isCrossContractCall\n );\n\n // If gas estimate is under the cross-contract-minimum, replace it with the minimum.\n if (response.gasEstimate) {\n if (response.gasEstimate < minimumGasLimit) {\n response.gasEstimate = minimumGasLimit;\n }\n }\n\n return response;\n } catch (err) {\n throw reportAndSanitizeError(\n gasEstimateForUnprovenCrossContractCalls.name,\n err,\n );\n }\n};\n\nexport const generateCrossContractCallsProof = async (\n networkName: NetworkName,\n matrixWalletID: string,\n encryptionKey: string,\n relayAdaptUnshieldERC20Amounts: MatrixERC20Amount[],\n relayAdaptUnshieldNFTAmounts: MatrixNFTAmount[],\n relayAdaptShieldERC20Recipients: MatrixERC20Recipient[],\n relayAdaptShieldNFTRecipients: MatrixNFTAmountRecipient[],\n crossContractCalls: ContractTransaction[],\n broadcasterFeeERC20AmountRecipient: Optional<MatrixERC20AmountRecipient>,\n sendWithPublicWallet: boolean,\n overallBatchMinGasPrice: Optional<bigint>,\n minGasLimit: Optional<bigint>,\n progressCallback: GenerateTransactionsProgressCallback,\n): Promise<void> => {\n try {\n setCachedProvedTransaction(undefined);\n\n const validCrossContractCalls =\n createValidCrossContractCalls(crossContractCalls);\n\n const relayAdaptUnshieldERC20AmountRecipients: MatrixERC20AmountRecipient[] =\n createRelayAdaptUnshieldERC20AmountRecipients(\n networkName,\n relayAdaptUnshieldERC20Amounts,\n );\n const relayAdaptUnshieldNFTAmountRecipients: MatrixNFTAmountRecipient[] =\n createRelayAdaptUnshieldNFTAmountRecipients(\n networkName,\n relayAdaptUnshieldNFTAmounts,\n );\n\n // Generate dummy txs for relay adapt params.\n const dummyUnshieldTxs = await generateDummyProofTransactions(\n ProofType.CrossContractCalls,\n networkName,\n matrixWalletID,\n encryptionKey,\n false, // showSenderAddressToRecipient\n undefined, // memoText\n relayAdaptUnshieldERC20AmountRecipients,\n relayAdaptUnshieldNFTAmountRecipients,\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n overallBatchMinGasPrice,\n );\n\n // Generate relay adapt params from dummy transactions.\n const shieldRandom = ByteUtils.randomHex(16);\n\n const relayShieldRequests =\n await RelayAdaptHelper.generateRelayShieldRequests(\n shieldRandom,\n relayAdaptShieldERC20Recipients,\n createRelayAdaptShieldNFTRecipients(relayAdaptShieldNFTRecipients),\n );\n\n const minimumGasLimit =\n minGasLimit ?? MINIMUM_RELAY_ADAPT_CROSS_CONTRACT_CALLS_GAS_LIMIT_V2;\n\n const { chain } = NETWORK_CONFIG[networkName];\n\n const isBroadcasterTransaction = !sendWithPublicWallet;\n const relayAdaptParamsRandom = ByteUtils.randomHex(31);\n const relayAdaptContract = MatrixContracts.getRelayAdaptContract(chain);\n const relayAdaptParams =\n await relayAdaptContract.getRelayAdaptParamsCrossContractCalls(\n dummyUnshieldTxs,\n validCrossContractCalls,\n relayShieldRequests,\n relayAdaptParamsRandom,\n isBroadcasterTransaction,\n minimumGasLimit,\n );\n\n // Create real transactions with relay adapt params.\n const { provedTransactions } =\n await generateProofTransactions(\n ProofType.CrossContractCalls,\n networkName,\n matrixWalletID,\n encryptionKey,\n false, // showSenderAddressToRecipient\n undefined, // memoText\n relayAdaptUnshieldERC20AmountRecipients,\n relayAdaptUnshieldNFTAmountRecipients,\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n false, // useDummyProof\n overallBatchMinGasPrice,\n progressCallback,\n );\n\n const nullifiers = nullifiersForTransactions(provedTransactions);\n\n const transaction =\n await relayAdaptContract.populateCrossContractCalls(\n provedTransactions,\n validCrossContractCalls,\n relayShieldRequests,\n relayAdaptParamsRandom,\n false, // isGasEstimate\n isBroadcasterTransaction,\n minimumGasLimit,\n );\n delete transaction.from;\n\n setCachedProvedTransaction({\n proofType: ProofType.CrossContractCalls,\n matrixWalletID,\n showSenderAddressToRecipient: false,\n memoText: undefined,\n erc20AmountRecipients: [],\n nftAmountRecipients: [],\n relayAdaptUnshieldERC20Amounts,\n relayAdaptUnshieldNFTAmounts,\n relayAdaptShieldERC20Recipients,\n relayAdaptShieldNFTRecipients,\n crossContractCalls: validCrossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n transaction,\n overallBatchMinGasPrice,\n nullifiers,\n });\n } catch (err) {\n throw reportAndSanitizeError(generateCrossContractCallsProof.name, err);\n }\n};\n\nexport const getRelayAdaptTransactionError = (\n networkName: NetworkName,\n receiptLogs: TransactionReceiptLog[],\n): Optional<string> => {\n try {\n const relayAdaptError = RelayAdaptV3Contract.getRelayAdaptCallError(\n receiptLogs,\n );\n if (isDefined(relayAdaptError)) {\n sendErrorMessage(relayAdaptError);\n return relayAdaptError;\n }\n return undefined;\n } catch (err) {\n throw reportAndSanitizeError(getRelayAdaptTransactionError.name, err);\n }\n};\n\nexport const parseRelayAdaptReturnValue = (\n networkName: NetworkName,\n data: string,\n): Optional<string> => {\n try {\n const relayAdaptErrorParsed = RelayAdaptV3Contract.parseRelayAdaptReturnValue(\n data,\n );\n if (isDefined(relayAdaptErrorParsed)) {\n sendErrorMessage(relayAdaptErrorParsed.error);\n return relayAdaptErrorParsed.error;\n }\n return undefined;\n } catch (err) {\n throw reportAndSanitizeError(getRelayAdaptTransactionError.name, err);\n }\n};\n"]}
@@ -0,0 +1,5 @@
1
+ import { TransactionStructV3 } from '@matrix-privacy/engine';
2
+ import { NetworkName, TransactionGasDetails, MatrixERC20Amount, MatrixTransactionGasEstimateResponse, FeeTokenDetails, MatrixERC20AmountRecipient } from '@matrix-privacy/shared-models';
3
+ import { ContractTransaction } from 'ethers';
4
+ export declare const calculateBroadcasterFeeERC20Amount: (feeTokenDetails: FeeTokenDetails, gasDetails: TransactionGasDetails) => MatrixERC20Amount;
5
+ export declare const gasEstimateResponseDummyProofIterativeBroadcasterFee: (generateDummyTransactionStructsWithBroadcasterFee: (broadcasterFeeERC20Amount: Optional<MatrixERC20Amount>) => Promise<TransactionStructV3[]>, generateTransaction: (serializedTransactions: TransactionStructV3[]) => Promise<ContractTransaction>, networkName: NetworkName, matrixWalletID: string, erc20AmountRecipients: MatrixERC20AmountRecipient[], originalGasDetails: TransactionGasDetails, feeTokenDetails: Optional<FeeTokenDetails>, sendWithPublicWallet: boolean, isCrossContractCall: boolean) => Promise<MatrixTransactionGasEstimateResponse>;
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.gasEstimateResponseDummyProofIterativeBroadcasterFee = exports.calculateBroadcasterFeeERC20Amount = void 0;
4
+ const engine_1 = require("@matrix-privacy/engine");
5
+ const shared_models_1 = require("@matrix-privacy/shared-models");
6
+ const tx_generator_1 = require("./tx-generator");
7
+ const tx_gas_details_1 = require("./tx-gas-details");
8
+ const balance_update_1 = require("../matrix/wallets/balance-update");
9
+ const wallets_1 = require("../matrix/wallets/wallets");
10
+ const MAX_ITERATIONS_BROADCASTER_FEE_REESTIMATION = 5;
11
+ const calculateBroadcasterFeeERC20Amount = (feeTokenDetails, gasDetails) => {
12
+ const tokenFeePerUnitGas = BigInt(feeTokenDetails.feePerUnitGas);
13
+ const oneUnitGas = 10n ** 18n;
14
+ const maximumGas = (0, shared_models_1.calculateMaximumGas)(gasDetails);
15
+ const tokenFee = (tokenFeePerUnitGas * maximumGas) / oneUnitGas;
16
+ return {
17
+ tokenAddress: feeTokenDetails.tokenAddress,
18
+ amount: tokenFee,
19
+ };
20
+ };
21
+ exports.calculateBroadcasterFeeERC20Amount = calculateBroadcasterFeeERC20Amount;
22
+ const getBroadcasterFeeCommitment = (transactionStructs) => {
23
+ const transactionIndex = 0;
24
+ const broadcasterFeeCommitment = transactionStructs[transactionIndex];
25
+ const broadcasterFeeCommitmentIndex = 0;
26
+ return (0, engine_1.convertTransactionStructToCommitmentSummary)(broadcasterFeeCommitment, broadcasterFeeCommitmentIndex);
27
+ };
28
+ const gasEstimateResponseDummyProofIterativeBroadcasterFee = async (generateDummyTransactionStructsWithBroadcasterFee, generateTransaction, networkName, matrixWalletID, erc20AmountRecipients, originalGasDetails, feeTokenDetails, sendWithPublicWallet, isCrossContractCall) => {
29
+ const wallet = (0, wallets_1.walletForID)(matrixWalletID);
30
+ // Use dead address for private transaction gas estimate
31
+ const fromWalletAddress = tx_generator_1.DUMMY_FROM_ADDRESS;
32
+ const isGasEstimateWithDummyProof = true;
33
+ const dummyBroadcasterFee = feeTokenDetails
34
+ ? (0, tx_generator_1.createDummyBroadcasterFeeERC20Amount)(feeTokenDetails.tokenAddress)
35
+ : undefined;
36
+ let serializedTransactions = await generateDummyTransactionStructsWithBroadcasterFee(dummyBroadcasterFee);
37
+ let transaction = await generateTransaction(serializedTransactions);
38
+ let gasEstimate = await (0, tx_gas_details_1.getGasEstimate)(networkName, transaction, fromWalletAddress, sendWithPublicWallet, isCrossContractCall);
39
+ if (sendWithPublicWallet) {
40
+ return (0, tx_gas_details_1.gasEstimateResponse)(gasEstimate, undefined, // broadcasterFeeCommitment
41
+ isGasEstimateWithDummyProof);
42
+ }
43
+ if (!feeTokenDetails) {
44
+ throw new Error('Must have Broadcaster Fee details or sendWithPublicWallet field.');
45
+ }
46
+ // Find any erc20Amount in transfer that matches token of broadcaster fee, if exists.
47
+ const broadcasterFeeMatchingSendingERC20Amount = erc20AmountRecipients.find(erc20AmountRecipient => erc20AmountRecipient.tokenAddress.toLowerCase() ===
48
+ feeTokenDetails.tokenAddress.toLowerCase());
49
+ // Get private balance of matching token.
50
+ const balanceForBroadcasterFeeERC20 = await (0, balance_update_1.balanceForERC20Token)(wallet, networkName, feeTokenDetails.tokenAddress, true);
51
+ let broadcasterFeeCommitment = getBroadcasterFeeCommitment(serializedTransactions);
52
+ // Iteratively calculate new broadcaster fee and estimate new gas amount.
53
+ // This change if the number of circuits changes because of the additional Broadcaster Fees.
54
+ for (let i = 0; i < MAX_ITERATIONS_BROADCASTER_FEE_REESTIMATION; i += 1) {
55
+ const updatedGasDetails = {
56
+ ...originalGasDetails,
57
+ gasEstimate,
58
+ };
59
+ const updatedBroadcasterFee = (0, exports.calculateBroadcasterFeeERC20Amount)(feeTokenDetails, updatedGasDetails);
60
+ // If Broadcaster fee causes overflow with the token balance,
61
+ // then use the MAX amount for Broadcaster Fee, which is BALANCE - SENDING AMOUNT.
62
+ if (balanceForBroadcasterFeeERC20 > 0n &&
63
+ broadcasterFeeMatchingSendingERC20Amount &&
64
+ // eslint-disable-next-line no-await-in-loop
65
+ (await broadcasterFeeWillOverflowBalance(balanceForBroadcasterFeeERC20, broadcasterFeeMatchingSendingERC20Amount, updatedBroadcasterFee))) {
66
+ updatedBroadcasterFee.amount =
67
+ balanceForBroadcasterFeeERC20 -
68
+ broadcasterFeeMatchingSendingERC20Amount.amount;
69
+ }
70
+ const newSerializedTransactions =
71
+ // eslint-disable-next-line no-await-in-loop
72
+ await generateDummyTransactionStructsWithBroadcasterFee(updatedBroadcasterFee);
73
+ broadcasterFeeCommitment = getBroadcasterFeeCommitment(newSerializedTransactions);
74
+ if (compareCircuitSizesTransactionStructs(newSerializedTransactions, serializedTransactions)) {
75
+ // Same circuit sizes, no need to run further gas estimates.
76
+ return (0, tx_gas_details_1.gasEstimateResponse)(gasEstimate, broadcasterFeeCommitment, isGasEstimateWithDummyProof);
77
+ }
78
+ serializedTransactions = newSerializedTransactions;
79
+ // eslint-disable-next-line no-await-in-loop
80
+ transaction = await generateTransaction(serializedTransactions);
81
+ // eslint-disable-next-line no-await-in-loop
82
+ const newGasEstimate = await (0, tx_gas_details_1.getGasEstimate)(networkName, transaction, fromWalletAddress, sendWithPublicWallet, isCrossContractCall);
83
+ if (newGasEstimate === gasEstimate) {
84
+ return (0, tx_gas_details_1.gasEstimateResponse)(newGasEstimate, broadcasterFeeCommitment, isGasEstimateWithDummyProof);
85
+ }
86
+ gasEstimate = newGasEstimate;
87
+ }
88
+ return (0, tx_gas_details_1.gasEstimateResponse)(gasEstimate, broadcasterFeeCommitment, isGasEstimateWithDummyProof);
89
+ };
90
+ exports.gasEstimateResponseDummyProofIterativeBroadcasterFee = gasEstimateResponseDummyProofIterativeBroadcasterFee;
91
+ const compareCircuitSizesTransactionStructs = (serializedA, serializedB) => {
92
+ if (serializedA.length !== serializedB.length) {
93
+ return false;
94
+ }
95
+ for (let i = 0; i < serializedA.length; i += 1) {
96
+ if (serializedA[i].commitments.length !== serializedB[i].commitments.length) {
97
+ return false;
98
+ }
99
+ if (serializedA[i].nullifiers.length !== serializedB[i].nullifiers.length) {
100
+ return false;
101
+ }
102
+ }
103
+ return true;
104
+ };
105
+ const broadcasterFeeWillOverflowBalance = async (tokenBalance, sendingERC20Amount, broadcasterFeeERC20Amount) => {
106
+ const sendingAmount = sendingERC20Amount.amount;
107
+ const broadcasterFeeAmount = broadcasterFeeERC20Amount.amount;
108
+ return sendingAmount + broadcasterFeeAmount > tokenBalance;
109
+ };
110
+ //# sourceMappingURL=tx-gas-broadcaster-fee-estimator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tx-gas-broadcaster-fee-estimator.js","sourceRoot":"","sources":["../../../src/services/transactions/tx-gas-broadcaster-fee-estimator.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n TransactionStructV3,\n convertTransactionStructToCommitmentSummary,\n} from '@matrix-privacy/engine';\nimport {\n NetworkName,\n TransactionGasDetails,\n MatrixERC20Amount,\n MatrixTransactionGasEstimateResponse,\n FeeTokenDetails,\n calculateMaximumGas,\n MatrixERC20AmountRecipient,\n CommitmentSummary,\n} from '@matrix-privacy/shared-models';\nimport {\n DUMMY_FROM_ADDRESS,\n createDummyBroadcasterFeeERC20Amount,\n} from './tx-generator';\nimport { getGasEstimate, gasEstimateResponse } from './tx-gas-details';\nimport { balanceForERC20Token } from '../matrix/wallets/balance-update';\nimport { ContractTransaction } from 'ethers';\nimport { walletForID } from '../matrix/wallets/wallets';\n\nconst MAX_ITERATIONS_BROADCASTER_FEE_REESTIMATION = 5;\n\nexport const calculateBroadcasterFeeERC20Amount = (\n feeTokenDetails: FeeTokenDetails,\n gasDetails: TransactionGasDetails,\n): MatrixERC20Amount => {\n const tokenFeePerUnitGas = BigInt(feeTokenDetails.feePerUnitGas);\n const oneUnitGas = 10n ** 18n;\n const maximumGas = calculateMaximumGas(gasDetails);\n const tokenFee = (tokenFeePerUnitGas * maximumGas) / oneUnitGas;\n return {\n tokenAddress: feeTokenDetails.tokenAddress,\n amount: tokenFee,\n };\n};\n\nconst getBroadcasterFeeCommitment = (\n transactionStructs: TransactionStructV3[],\n): CommitmentSummary => {\n const transactionIndex = 0;\n const broadcasterFeeCommitment = transactionStructs[transactionIndex];\n const broadcasterFeeCommitmentIndex = 0;\n return convertTransactionStructToCommitmentSummary(\n broadcasterFeeCommitment,\n broadcasterFeeCommitmentIndex,\n );\n};\n\nexport const gasEstimateResponseDummyProofIterativeBroadcasterFee = async (\n generateDummyTransactionStructsWithBroadcasterFee: (\n broadcasterFeeERC20Amount: Optional<MatrixERC20Amount>,\n ) => Promise<TransactionStructV3[]>,\n generateTransaction: (\n serializedTransactions: TransactionStructV3[],\n ) => Promise<ContractTransaction>,\n networkName: NetworkName,\n matrixWalletID: string,\n erc20AmountRecipients: MatrixERC20AmountRecipient[],\n originalGasDetails: TransactionGasDetails,\n feeTokenDetails: Optional<FeeTokenDetails>,\n sendWithPublicWallet: boolean,\n isCrossContractCall: boolean,\n): Promise<MatrixTransactionGasEstimateResponse> => {\n const wallet = walletForID(matrixWalletID);\n\n // Use dead address for private transaction gas estimate\n const fromWalletAddress = DUMMY_FROM_ADDRESS;\n\n const isGasEstimateWithDummyProof = true;\n\n const dummyBroadcasterFee = feeTokenDetails\n ? createDummyBroadcasterFeeERC20Amount(feeTokenDetails.tokenAddress)\n : undefined;\n\n let serializedTransactions =\n await generateDummyTransactionStructsWithBroadcasterFee(\n dummyBroadcasterFee,\n );\n let transaction = await generateTransaction(serializedTransactions);\n\n let gasEstimate = await getGasEstimate(\n networkName,\n transaction,\n fromWalletAddress,\n sendWithPublicWallet,\n isCrossContractCall,\n );\n\n if (sendWithPublicWallet) {\n return gasEstimateResponse(\n gasEstimate,\n undefined, // broadcasterFeeCommitment\n isGasEstimateWithDummyProof,\n );\n }\n\n if (!feeTokenDetails) {\n throw new Error(\n 'Must have Broadcaster Fee details or sendWithPublicWallet field.',\n );\n }\n\n // Find any erc20Amount in transfer that matches token of broadcaster fee, if exists.\n const broadcasterFeeMatchingSendingERC20Amount = erc20AmountRecipients.find(\n erc20AmountRecipient =>\n erc20AmountRecipient.tokenAddress.toLowerCase() ===\n feeTokenDetails.tokenAddress.toLowerCase(),\n );\n\n // Get private balance of matching token.\n const balanceForBroadcasterFeeERC20 = await balanceForERC20Token(\n wallet,\n networkName,\n feeTokenDetails.tokenAddress,\n true,\n );\n\n let broadcasterFeeCommitment = getBroadcasterFeeCommitment(\n serializedTransactions,\n );\n\n // Iteratively calculate new broadcaster fee and estimate new gas amount.\n // This change if the number of circuits changes because of the additional Broadcaster Fees.\n for (let i = 0; i < MAX_ITERATIONS_BROADCASTER_FEE_REESTIMATION; i += 1) {\n const updatedGasDetails: TransactionGasDetails = {\n ...originalGasDetails,\n gasEstimate,\n };\n const updatedBroadcasterFee: MatrixERC20Amount =\n calculateBroadcasterFeeERC20Amount(feeTokenDetails, updatedGasDetails);\n\n // If Broadcaster fee causes overflow with the token balance,\n // then use the MAX amount for Broadcaster Fee, which is BALANCE - SENDING AMOUNT.\n if (\n balanceForBroadcasterFeeERC20 > 0n &&\n broadcasterFeeMatchingSendingERC20Amount &&\n // eslint-disable-next-line no-await-in-loop\n (await broadcasterFeeWillOverflowBalance(\n balanceForBroadcasterFeeERC20,\n broadcasterFeeMatchingSendingERC20Amount,\n updatedBroadcasterFee,\n ))\n ) {\n updatedBroadcasterFee.amount =\n balanceForBroadcasterFeeERC20 -\n broadcasterFeeMatchingSendingERC20Amount.amount;\n }\n\n const newSerializedTransactions =\n // eslint-disable-next-line no-await-in-loop\n await generateDummyTransactionStructsWithBroadcasterFee(\n updatedBroadcasterFee,\n );\n\n broadcasterFeeCommitment = getBroadcasterFeeCommitment(\n newSerializedTransactions,\n );\n\n if (\n compareCircuitSizesTransactionStructs(\n newSerializedTransactions,\n serializedTransactions,\n )\n ) {\n // Same circuit sizes, no need to run further gas estimates.\n return gasEstimateResponse(\n gasEstimate,\n broadcasterFeeCommitment,\n isGasEstimateWithDummyProof,\n );\n }\n\n serializedTransactions = newSerializedTransactions;\n\n // eslint-disable-next-line no-await-in-loop\n transaction = await generateTransaction(serializedTransactions);\n\n // eslint-disable-next-line no-await-in-loop\n const newGasEstimate = await getGasEstimate(\n networkName,\n transaction,\n fromWalletAddress,\n sendWithPublicWallet,\n isCrossContractCall,\n );\n\n if (newGasEstimate === gasEstimate) {\n return gasEstimateResponse(\n newGasEstimate,\n broadcasterFeeCommitment,\n isGasEstimateWithDummyProof,\n );\n }\n gasEstimate = newGasEstimate;\n }\n\n return gasEstimateResponse(\n gasEstimate,\n broadcasterFeeCommitment,\n isGasEstimateWithDummyProof,\n );\n};\n\nconst compareCircuitSizesTransactionStructs = (\n serializedA: TransactionStructV3[],\n serializedB: TransactionStructV3[],\n) => {\n if (serializedA.length !== serializedB.length) {\n return false;\n }\n for (let i = 0; i < serializedA.length; i += 1) {\n if (\n serializedA[i].commitments.length !== serializedB[i].commitments.length\n ) {\n return false;\n }\n if (serializedA[i].nullifiers.length !== serializedB[i].nullifiers.length) {\n return false;\n }\n }\n return true;\n};\n\nconst broadcasterFeeWillOverflowBalance = async (\n tokenBalance: bigint,\n sendingERC20Amount: MatrixERC20Amount,\n broadcasterFeeERC20Amount: MatrixERC20Amount,\n) => {\n const sendingAmount = sendingERC20Amount.amount;\n const broadcasterFeeAmount = broadcasterFeeERC20Amount.amount;\n\n return sendingAmount + broadcasterFeeAmount > tokenBalance;\n};\n"]}
@@ -0,0 +1,5 @@
1
+ import { MatrixTransactionGasEstimateResponse, NetworkName, TransactionGasDetails } from '@matrix-privacy/shared-models';
2
+ import { ContractTransaction } from 'ethers';
3
+ export declare const getGasEstimate: (networkName: NetworkName, transaction: ContractTransaction, fromWalletAddress: string, sendWithPublicWallet: boolean, isCrossContractCall: boolean) => Promise<bigint>;
4
+ export declare const gasEstimateResponse: (gasEstimate: bigint, _broadcasterFeeCommitment: unknown, isGasEstimateWithDummyProof: boolean) => MatrixTransactionGasEstimateResponse;
5
+ export declare const setGasDetailsForTransaction: (networkName: NetworkName, transaction: ContractTransaction, gasDetails: TransactionGasDetails, sendWithPublicWallet: boolean) => void;
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setGasDetailsForTransaction = exports.gasEstimateResponse = exports.getGasEstimate = void 0;
4
+ const shared_models_1 = require("@matrix-privacy/shared-models");
5
+ const matrix_1 = require("../matrix");
6
+ const error_1 = require("../../utils/error");
7
+ const engine_1 = require("@matrix-privacy/engine");
8
+ const getGasEstimate = async (networkName, transaction, fromWalletAddress, sendWithPublicWallet, isCrossContractCall) => {
9
+ const evmGasType = (0, shared_models_1.getEVMGasTypeForTransaction)(networkName, sendWithPublicWallet);
10
+ // Add 'from' field, which is required, as a mock address.
11
+ // Note that DEPOSIT needs a real address, as it checks the balance for transfer.
12
+ const estimateGasTransactionRequest = {
13
+ ...transaction,
14
+ from: fromWalletAddress,
15
+ type: evmGasType,
16
+ };
17
+ if (shouldRemoveGasLimitForL2GasEstimate(networkName)) {
18
+ delete estimateGasTransactionRequest.gasLimit;
19
+ }
20
+ try {
21
+ return estimateGas(networkName, estimateGasTransactionRequest, isCrossContractCall);
22
+ }
23
+ catch (err) {
24
+ throw (0, error_1.reportAndSanitizeError)(exports.getGasEstimate.name, err);
25
+ }
26
+ };
27
+ exports.getGasEstimate = getGasEstimate;
28
+ const estimateGas = (networkName, transaction, isCrossContractCall) => {
29
+ const provider = (0, matrix_1.getFallbackProviderForNetwork)(networkName);
30
+ if (isCrossContractCall) {
31
+ // Includes custom error handler for relay-adapt transactions.
32
+ return engine_1.RelayAdaptV3Contract.estimateGasWithErrorHandler(provider, transaction);
33
+ }
34
+ return provider.estimateGas(transaction);
35
+ };
36
+ /**
37
+ * Gas estimates can fail for relay-adapt transactions on L2s like Arbitrum.
38
+ * This occurs on cross-contract calls (relay-adapt) which have a manual minimum gas limit set by Matrix Engine.
39
+ */
40
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
41
+ const shouldRemoveGasLimitForL2GasEstimate = (_networkName) => {
42
+ // Matrix currently only supports Hardhat; add L2 logic here as networks are added.
43
+ return false;
44
+ };
45
+ const gasEstimateResponse = (gasEstimate, _broadcasterFeeCommitment, isGasEstimateWithDummyProof) => {
46
+ // TODO: This variance will be different on L2s.
47
+ // However, it's small enough that it shouldn't matter very much.
48
+ const gasEstimateWithDummyProofVariance = isGasEstimateWithDummyProof
49
+ ? gasEstimate + BigInt(engine_1.GAS_ESTIMATE_VARIANCE_DUMMY_TO_ACTUAL_TRANSACTION)
50
+ : gasEstimate;
51
+ const response = {
52
+ gasEstimate: gasEstimateWithDummyProofVariance,
53
+ };
54
+ return response;
55
+ };
56
+ exports.gasEstimateResponse = gasEstimateResponse;
57
+ const setGasDetailsForTransaction = (networkName, transaction, gasDetails, sendWithPublicWallet) => {
58
+ const { gasEstimate } = gasDetails;
59
+ // eslint-disable-next-line no-param-reassign
60
+ transaction.gasLimit = (0, shared_models_1.calculateGasLimit)(gasEstimate);
61
+ const evmGasType = (0, shared_models_1.getEVMGasTypeForTransaction)(networkName, sendWithPublicWallet);
62
+ if (gasDetails.evmGasType !== evmGasType) {
63
+ const transactionType = sendWithPublicWallet
64
+ ? 'self-signed'
65
+ : 'Broadcaster';
66
+ throw new Error(`Invalid evmGasType for ${networkName} (${transactionType}): expected Type${evmGasType}, received Type${gasDetails.evmGasType} in gasDetails. Retrieve appropriate gas type with getEVMGasTypeForTransaction (@matrix-privacy/shared-models).`);
67
+ }
68
+ // eslint-disable-next-line no-param-reassign
69
+ transaction.type = gasDetails.evmGasType;
70
+ switch (gasDetails.evmGasType) {
71
+ case shared_models_1.EVMGasType.Type0: {
72
+ // eslint-disable-next-line no-param-reassign
73
+ transaction.gasPrice = gasDetails.gasPrice;
74
+ // eslint-disable-next-line no-param-reassign
75
+ delete transaction.accessList;
76
+ break;
77
+ }
78
+ case shared_models_1.EVMGasType.Type1: {
79
+ // eslint-disable-next-line no-param-reassign
80
+ transaction.gasPrice = gasDetails.gasPrice;
81
+ break;
82
+ }
83
+ case shared_models_1.EVMGasType.Type2: {
84
+ // eslint-disable-next-line no-param-reassign
85
+ transaction.maxFeePerGas = gasDetails.maxFeePerGas;
86
+ // eslint-disable-next-line no-param-reassign
87
+ transaction.maxPriorityFeePerGas = gasDetails.maxPriorityFeePerGas;
88
+ break;
89
+ }
90
+ case shared_models_1.EVMGasType.Type4: {
91
+ // EIP-7702 transaction type — handle like Type2 for gas purposes.
92
+ // eslint-disable-next-line no-param-reassign
93
+ transaction.maxFeePerGas = gasDetails.maxFeePerGas;
94
+ // eslint-disable-next-line no-param-reassign
95
+ transaction.maxPriorityFeePerGas = gasDetails.maxPriorityFeePerGas;
96
+ break;
97
+ }
98
+ }
99
+ };
100
+ exports.setGasDetailsForTransaction = setGasDetailsForTransaction;
101
+ //# sourceMappingURL=tx-gas-details.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tx-gas-details.js","sourceRoot":"","sources":["../../../src/services/transactions/tx-gas-details.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n MatrixTransactionGasEstimateResponse,\n EVMGasType,\n calculateGasLimit,\n NetworkName,\n getEVMGasTypeForTransaction,\n TransactionGasDetails,\n NETWORK_CONFIG,\n} from '@matrix-privacy/shared-models';\nimport { getFallbackProviderForNetwork } from '../matrix';\nimport { reportAndSanitizeError } from '../../utils/error';\nimport {\n GAS_ESTIMATE_VARIANCE_DUMMY_TO_ACTUAL_TRANSACTION,\n RelayAdaptV3Contract,\n} from '@matrix-privacy/engine';\nimport { ContractTransaction } from 'ethers';\n\nexport const getGasEstimate = async (\n networkName: NetworkName,\n transaction: ContractTransaction,\n fromWalletAddress: string,\n sendWithPublicWallet: boolean,\n isCrossContractCall: boolean,\n): Promise<bigint> => {\n const evmGasType = getEVMGasTypeForTransaction(\n networkName,\n sendWithPublicWallet,\n );\n\n // Add 'from' field, which is required, as a mock address.\n // Note that DEPOSIT needs a real address, as it checks the balance for transfer.\n const estimateGasTransactionRequest: ContractTransaction = {\n ...transaction,\n from: fromWalletAddress,\n type: evmGasType,\n };\n if (shouldRemoveGasLimitForL2GasEstimate(networkName)) {\n delete estimateGasTransactionRequest.gasLimit;\n }\n\n try {\n return estimateGas(\n networkName,\n estimateGasTransactionRequest,\n isCrossContractCall,\n );\n } catch (err) {\n throw reportAndSanitizeError(getGasEstimate.name, err);\n }\n};\n\nconst estimateGas = (\n networkName: NetworkName,\n transaction: ContractTransaction,\n isCrossContractCall: boolean,\n): Promise<bigint> => {\n const provider = getFallbackProviderForNetwork(networkName);\n if (isCrossContractCall) {\n // Includes custom error handler for relay-adapt transactions.\n return RelayAdaptV3Contract.estimateGasWithErrorHandler(\n provider,\n transaction,\n );\n }\n return provider.estimateGas(transaction);\n};\n\n/**\n * Gas estimates can fail for relay-adapt transactions on L2s like Arbitrum.\n * This occurs on cross-contract calls (relay-adapt) which have a manual minimum gas limit set by Matrix Engine.\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst shouldRemoveGasLimitForL2GasEstimate = (_networkName: NetworkName) => {\n // Matrix currently only supports Hardhat; add L2 logic here as networks are added.\n return false;\n};\n\nexport const gasEstimateResponse = (\n gasEstimate: bigint,\n _broadcasterFeeCommitment: unknown,\n isGasEstimateWithDummyProof: boolean,\n): MatrixTransactionGasEstimateResponse => {\n // TODO: This variance will be different on L2s.\n // However, it's small enough that it shouldn't matter very much.\n const gasEstimateWithDummyProofVariance = isGasEstimateWithDummyProof\n ? gasEstimate + BigInt(GAS_ESTIMATE_VARIANCE_DUMMY_TO_ACTUAL_TRANSACTION)\n : gasEstimate;\n\n const response: MatrixTransactionGasEstimateResponse = {\n gasEstimate: gasEstimateWithDummyProofVariance,\n };\n return response;\n};\n\nexport const setGasDetailsForTransaction = (\n networkName: NetworkName,\n transaction: ContractTransaction,\n gasDetails: TransactionGasDetails,\n sendWithPublicWallet: boolean,\n) => {\n const { gasEstimate } = gasDetails;\n\n // eslint-disable-next-line no-param-reassign\n transaction.gasLimit = calculateGasLimit(gasEstimate);\n\n const evmGasType = getEVMGasTypeForTransaction(\n networkName,\n sendWithPublicWallet,\n );\n\n if (gasDetails.evmGasType !== evmGasType) {\n const transactionType = sendWithPublicWallet\n ? 'self-signed'\n : 'Broadcaster';\n throw new Error(\n `Invalid evmGasType for ${networkName} (${transactionType}): expected Type${evmGasType}, received Type${gasDetails.evmGasType} in gasDetails. Retrieve appropriate gas type with getEVMGasTypeForTransaction (@matrix-privacy/shared-models).`,\n );\n }\n\n // eslint-disable-next-line no-param-reassign\n transaction.type = gasDetails.evmGasType;\n\n switch (gasDetails.evmGasType) {\n case EVMGasType.Type0: {\n // eslint-disable-next-line no-param-reassign\n transaction.gasPrice = gasDetails.gasPrice;\n // eslint-disable-next-line no-param-reassign\n delete transaction.accessList;\n break;\n }\n case EVMGasType.Type1: {\n // eslint-disable-next-line no-param-reassign\n transaction.gasPrice = gasDetails.gasPrice;\n break;\n }\n case EVMGasType.Type2: {\n // eslint-disable-next-line no-param-reassign\n transaction.maxFeePerGas = gasDetails.maxFeePerGas;\n // eslint-disable-next-line no-param-reassign\n transaction.maxPriorityFeePerGas = gasDetails.maxPriorityFeePerGas;\n break;\n }\n case EVMGasType.Type4: {\n // EIP-7702 transaction type — handle like Type2 for gas purposes.\n // eslint-disable-next-line no-param-reassign\n transaction.maxFeePerGas = gasDetails.maxFeePerGas;\n // eslint-disable-next-line no-param-reassign\n transaction.maxPriorityFeePerGas = gasDetails.maxPriorityFeePerGas;\n break;\n }\n }\n};\n"]}
@@ -0,0 +1,13 @@
1
+ import { TransactionStructV3 } from '@matrix-privacy/engine';
2
+ import { MatrixERC20Amount, MatrixERC20AmountRecipient, NetworkName, ProofType, MatrixNFTAmountRecipient } from '@matrix-privacy/shared-models';
3
+ import { ContractTransaction } from 'ethers';
4
+ export declare const DUMMY_FROM_ADDRESS = "0x000000000000000000000000000000000000dEaD";
5
+ export type GenerateTransactionsProgressCallback = (progress: number, status: string) => void;
6
+ export declare const generateProofTransactions: (proofType: ProofType, networkName: NetworkName, matrixWalletID: string, encryptionKey: string, showSenderAddressToRecipient: boolean, memoText: Optional<string>, erc20AmountRecipients: MatrixERC20AmountRecipient[], nftAmountRecipients: MatrixNFTAmountRecipient[], broadcasterFeeERC20AmountRecipient: Optional<MatrixERC20AmountRecipient>, sendWithPublicWallet: boolean, useDummyProof: boolean, overallBatchMinGasPrice: Optional<bigint>, progressCallback: GenerateTransactionsProgressCallback, originShieldTxidForSpendabilityOverride?: string) => Promise<{
7
+ provedTransactions: TransactionStructV3[];
8
+ }>;
9
+ export declare const nullifiersForTransactions: (transactions: TransactionStructV3[]) => string[];
10
+ export declare const createDummyBroadcasterFeeERC20Amount: (feeTokenAddress: string) => MatrixERC20Amount;
11
+ export declare const generateDummyProofTransactions: (proofType: ProofType, networkName: NetworkName, matrixWalletID: string, encryptionKey: string, showSenderAddressToRecipient: boolean, memoText: Optional<string>, erc20AmountRecipients: MatrixERC20AmountRecipient[], nftAmountRecipients: MatrixNFTAmountRecipient[], broadcasterFeeERC20Amount: Optional<MatrixERC20Amount>, sendWithPublicWallet: boolean, overallBatchMinGasPrice: Optional<bigint>, originShieldTxidForSpendabilityOverride?: string) => Promise<TransactionStructV3[]>;
12
+ export declare const generateTransact: (txs: TransactionStructV3[], networkName: NetworkName, useDummyProof?: boolean) => Promise<ContractTransaction>;
13
+ export declare const generateUnshieldBaseToken: (txs: TransactionStructV3[], networkName: NetworkName, toWalletAddress: string, relayAdaptParamsRandom: string, useDummyProof: boolean | undefined, sendWithPublicWallet: boolean) => Promise<ContractTransaction>;