@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":"tx-proof-unshield.js","sourceRoot":"","sources":["../../../src/services/transactions/tx-proof-unshield.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n MatrixERC20Amount,\n NetworkName,\n ProofType,\n MatrixERC20AmountRecipient,\n MatrixNFTAmountRecipient,\n NETWORK_CONFIG,\n} from '@matrix-privacy/shared-models';\nimport {\n GenerateTransactionsProgressCallback,\n generateDummyProofTransactions,\n generateProofTransactions,\n generateTransact,\n generateUnshieldBaseToken,\n nullifiersForTransactions,\n} from './tx-generator';\nimport { assertValidEthAddress } from '../matrix/wallets/wallets';\nimport { setCachedProvedTransaction } from './proof-cache';\nimport {\n ByteUtils,\n MatrixContracts,\n} from '@matrix-privacy/engine';\nimport { createRelayAdaptUnshieldERC20AmountRecipients } from './tx-cross-contract-calls';\nimport { reportAndSanitizeError } from '../../utils/error';\n\nexport const generateUnshieldProof = async (\n networkName: NetworkName,\n matrixWalletID: string,\n encryptionKey: string,\n erc20AmountRecipients: MatrixERC20AmountRecipient[],\n nftAmountRecipients: MatrixNFTAmountRecipient[],\n broadcasterFeeERC20AmountRecipient: Optional<MatrixERC20AmountRecipient>,\n sendWithPublicWallet: boolean,\n overallBatchMinGasPrice: Optional<bigint>,\n progressCallback: GenerateTransactionsProgressCallback,\n): Promise<void> => {\n try {\n setCachedProvedTransaction(undefined);\n\n const { provedTransactions } =\n await generateProofTransactions(\n ProofType.Unshield,\n networkName,\n matrixWalletID,\n encryptionKey,\n false, // showSenderAddressToRecipient\n undefined, // memoText\n erc20AmountRecipients,\n nftAmountRecipients,\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n false, // useDummyProof\n overallBatchMinGasPrice,\n progressCallback,\n );\n const transaction = await generateTransact(\n provedTransactions,\n networkName,\n );\n\n const nullifiers = nullifiersForTransactions(provedTransactions);\n\n setCachedProvedTransaction({\n proofType: ProofType.Unshield,\n matrixWalletID,\n showSenderAddressToRecipient: false,\n memoText: undefined,\n erc20AmountRecipients,\n nftAmountRecipients,\n relayAdaptUnshieldERC20Amounts: undefined,\n relayAdaptUnshieldNFTAmounts: undefined,\n relayAdaptShieldERC20Recipients: undefined,\n relayAdaptShieldNFTRecipients: undefined,\n crossContractCalls: undefined,\n broadcasterFeeERC20AmountRecipient,\n transaction,\n sendWithPublicWallet,\n overallBatchMinGasPrice,\n nullifiers,\n });\n } catch (err) {\n throw reportAndSanitizeError(generateUnshieldProof.name, err);\n }\n};\n\nexport const generateUnshieldToOriginProof = async (\n originalShieldTxid: string,\n networkName: NetworkName,\n matrixWalletID: string,\n encryptionKey: string,\n erc20AmountRecipients: MatrixERC20AmountRecipient[],\n nftAmountRecipients: MatrixNFTAmountRecipient[],\n progressCallback: GenerateTransactionsProgressCallback,\n): Promise<void> => {\n try {\n setCachedProvedTransaction(undefined);\n\n const { provedTransactions } =\n await generateProofTransactions(\n ProofType.Unshield,\n networkName,\n matrixWalletID,\n encryptionKey,\n false, // showSenderAddressToRecipient\n undefined, // memoText\n erc20AmountRecipients,\n nftAmountRecipients,\n undefined, // broadcasterFeeERC20AmountRecipient\n true, // sendWithPublicWallet\n false, // useDummyProof\n undefined, // overallBatchMinGasPrice\n progressCallback,\n originalShieldTxid,\n );\n const transaction = await generateTransact(\n provedTransactions,\n networkName,\n );\n\n const nullifiers = nullifiersForTransactions(provedTransactions);\n\n setCachedProvedTransaction({\n proofType: ProofType.Unshield,\n matrixWalletID,\n showSenderAddressToRecipient: false,\n memoText: undefined,\n erc20AmountRecipients,\n nftAmountRecipients,\n relayAdaptUnshieldERC20Amounts: undefined,\n relayAdaptUnshieldNFTAmounts: undefined,\n relayAdaptShieldERC20Recipients: undefined,\n relayAdaptShieldNFTRecipients: undefined,\n crossContractCalls: undefined,\n broadcasterFeeERC20AmountRecipient: undefined,\n transaction,\n sendWithPublicWallet: true,\n overallBatchMinGasPrice: undefined,\n nullifiers,\n });\n } catch (err) {\n throw reportAndSanitizeError(generateUnshieldProof.name, err);\n }\n};\n\nexport const generateUnshieldBaseTokenProof = async (\n networkName: NetworkName,\n publicWalletAddress: string,\n matrixWalletID: string,\n encryptionKey: string,\n wrappedERC20Amount: MatrixERC20Amount,\n broadcasterFeeERC20AmountRecipient: Optional<MatrixERC20AmountRecipient>,\n sendWithPublicWallet: boolean,\n overallBatchMinGasPrice: Optional<bigint>,\n progressCallback: GenerateTransactionsProgressCallback,\n): Promise<void> => {\n try {\n assertValidEthAddress(publicWalletAddress);\n\n setCachedProvedTransaction(undefined);\n\n const erc20AmountRecipients: MatrixERC20AmountRecipient[] = [\n {\n ...wrappedERC20Amount,\n recipientAddress: publicWalletAddress,\n },\n ];\n\n const relayAdaptUnshieldERC20Amounts: MatrixERC20Amount[] = [\n wrappedERC20Amount,\n ];\n\n const relayAdaptUnshieldERC20AmountRecipients: MatrixERC20AmountRecipient[] =\n createRelayAdaptUnshieldERC20AmountRecipients(networkName, [\n wrappedERC20Amount,\n ]);\n\n // Empty NFT recipients.\n const nftAmountRecipients: MatrixNFTAmountRecipient[] = [];\n\n const showSenderAddressToRecipient = false;\n const memoText: Optional<string> = undefined;\n\n // Create transactions with proof.\n const { provedTransactions } =\n await generateProofTransactions(\n ProofType.UnshieldBaseToken,\n networkName,\n matrixWalletID,\n encryptionKey,\n showSenderAddressToRecipient,\n memoText,\n relayAdaptUnshieldERC20AmountRecipients,\n [], // nftAmountRecipients\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n false, // useDummyProof\n overallBatchMinGasPrice,\n progressCallback,\n );\n\n const relayAdaptParamsRandom = ByteUtils.randomHex(31);\n\n const transaction = await generateUnshieldBaseToken(\n provedTransactions,\n networkName,\n publicWalletAddress,\n relayAdaptParamsRandom,\n false, // useDummyProof\n sendWithPublicWallet,\n );\n\n const nullifiers = nullifiersForTransactions(provedTransactions);\n\n setCachedProvedTransaction({\n proofType: ProofType.UnshieldBaseToken,\n matrixWalletID,\n showSenderAddressToRecipient,\n memoText,\n erc20AmountRecipients,\n nftAmountRecipients,\n relayAdaptUnshieldERC20Amounts,\n relayAdaptUnshieldNFTAmounts: undefined,\n relayAdaptShieldERC20Recipients: undefined,\n relayAdaptShieldNFTRecipients: undefined,\n crossContractCalls: undefined,\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n transaction,\n overallBatchMinGasPrice,\n nullifiers,\n });\n } catch (err) {\n throw reportAndSanitizeError(generateUnshieldBaseTokenProof.name, err);\n }\n};\n"]}
@@ -0,0 +1,3 @@
1
+ import { MatrixPopulateTransactionResponse, MatrixTransactionGasEstimateResponse, MatrixERC20Amount, NetworkName, TransactionGasDetails } from '@matrix-privacy/shared-models';
2
+ export declare const populateShieldBaseToken: (networkName: NetworkName, matrixAddress: string, shieldPrivateKey: string, wrappedERC20Amount: MatrixERC20Amount, gasDetails?: TransactionGasDetails) => Promise<MatrixPopulateTransactionResponse>;
3
+ export declare const gasEstimateForShieldBaseToken: (networkName: NetworkName, matrixAddress: string, shieldPrivateKey: string, wrappedERC20Amount: MatrixERC20Amount, fromWalletAddress: string) => Promise<MatrixTransactionGasEstimateResponse>;
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.gasEstimateForShieldBaseToken = exports.populateShieldBaseToken = void 0;
4
+ const shared_models_1 = require("@matrix-privacy/shared-models");
5
+ const tx_gas_details_1 = require("./tx-gas-details");
6
+ const engine_1 = require("@matrix-privacy/engine");
7
+ const error_1 = require("../../utils/error");
8
+ const wallets_1 = require("../matrix/wallets/wallets");
9
+ const generateShieldBaseTokenTransaction = async (networkName, matrixAddress, shieldPrivateKey, wrappedERC20Amount) => {
10
+ try {
11
+ const { masterPublicKey, viewingPublicKey } = engine_1.MatrixEngine.decodeAddress(matrixAddress);
12
+ const random = engine_1.ByteUtils.randomHex(16);
13
+ const { amount, tokenAddress } = wrappedERC20Amount;
14
+ const shield = new engine_1.ShieldNoteERC20(masterPublicKey, random, amount, tokenAddress);
15
+ const shieldRequest = await shield.serialize(engine_1.ByteUtils.hexToBytes(shieldPrivateKey), viewingPublicKey);
16
+ const { chain } = shared_models_1.NETWORK_CONFIG[networkName];
17
+ const transaction = await engine_1.MatrixContracts.getRelayAdaptContract(chain).populateShieldBaseToken(shieldRequest);
18
+ return transaction;
19
+ }
20
+ catch (err) {
21
+ throw (0, error_1.reportAndSanitizeError)(generateShieldBaseTokenTransaction.name, err);
22
+ }
23
+ };
24
+ const populateShieldBaseToken = async (networkName, matrixAddress, shieldPrivateKey, wrappedERC20Amount, gasDetails) => {
25
+ try {
26
+ (0, wallets_1.assertValidMatrixAddress)(matrixAddress);
27
+ const transaction = await generateShieldBaseTokenTransaction(networkName, matrixAddress, shieldPrivateKey, wrappedERC20Amount);
28
+ if (gasDetails) {
29
+ const sendWithPublicWallet = true;
30
+ (0, tx_gas_details_1.setGasDetailsForTransaction)(networkName, transaction, gasDetails, sendWithPublicWallet);
31
+ }
32
+ return {
33
+ transaction,
34
+ };
35
+ }
36
+ catch (err) {
37
+ throw (0, error_1.reportAndSanitizeError)(exports.populateShieldBaseToken.name, err);
38
+ }
39
+ };
40
+ exports.populateShieldBaseToken = populateShieldBaseToken;
41
+ const gasEstimateForShieldBaseToken = async (networkName, matrixAddress, shieldPrivateKey, wrappedERC20Amount, fromWalletAddress) => {
42
+ try {
43
+ (0, wallets_1.assertValidMatrixAddress)(matrixAddress);
44
+ const transaction = await generateShieldBaseTokenTransaction(networkName, matrixAddress, shieldPrivateKey, wrappedERC20Amount);
45
+ const sendWithPublicWallet = true;
46
+ const isGasEstimateWithDummyProof = false;
47
+ return (0, tx_gas_details_1.gasEstimateResponse)(await (0, tx_gas_details_1.getGasEstimate)(networkName, transaction, fromWalletAddress, sendWithPublicWallet, false), undefined, // broadcasterFeeCommitment
48
+ isGasEstimateWithDummyProof);
49
+ }
50
+ catch (err) {
51
+ throw (0, error_1.reportAndSanitizeError)(exports.gasEstimateForShieldBaseToken.name, err);
52
+ }
53
+ };
54
+ exports.gasEstimateForShieldBaseToken = gasEstimateForShieldBaseToken;
55
+ //# sourceMappingURL=tx-shield-base-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tx-shield-base-token.js","sourceRoot":"","sources":["../../../src/services/transactions/tx-shield-base-token.ts"],"names":[],"mappings":";;;AAAA,iEAOuC;AACvC,qDAI0B;AAC1B,mDAKgC;AAChC,6CAA2D;AAE3D,uDAAqE;AAErE,MAAM,kCAAkC,GAAG,KAAK,EAC9C,WAAwB,EACxB,aAAqB,EACrB,gBAAwB,EACxB,kBAAqC,EACP,EAAE;IAChC,IAAI;QACF,MAAM,EAAE,eAAe,EAAE,gBAAgB,EAAE,GACzC,qBAAY,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,kBAAS,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAEvC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,kBAAkB,CAAC;QAEpD,MAAM,MAAM,GAAG,IAAI,wBAAe,CAChC,eAAe,EACf,MAAM,EACN,MAAM,EACN,YAAY,CACb,CAAC;QAEF,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,SAAS,CAC1C,kBAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC,EACtC,gBAAgB,CACjB,CAAC;QAEF,MAAM,EAAE,KAAK,EAAE,GAAG,8BAAc,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,WAAW,GACf,MAAM,wBAAe,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,uBAAuB,CACxE,aAAa,CACd,CAAC;QAEJ,OAAO,WAAW,CAAC;KACpB;IAAC,OAAO,GAAG,EAAE;QACZ,MAAM,IAAA,8BAAsB,EAAC,kCAAkC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;KAC5E;AACH,CAAC,CAAC;AAEK,MAAM,uBAAuB,GAAG,KAAK,EAC1C,WAAwB,EACxB,aAAqB,EACrB,gBAAwB,EACxB,kBAAqC,EACrC,UAAkC,EACU,EAAE;IAC9C,IAAI;QACF,IAAA,kCAAwB,EAAC,aAAa,CAAC,CAAC;QAExC,MAAM,WAAW,GAAG,MAAM,kCAAkC,CAC1D,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,kBAAkB,CACnB,CAAC;QAEF,IAAI,UAAU,EAAE;YACd,MAAM,oBAAoB,GAAG,IAAI,CAAC;YAClC,IAAA,4CAA2B,EACzB,WAAW,EACX,WAAW,EACX,UAAU,EACV,oBAAoB,CACrB,CAAC;SACH;QAED,OAAO;YACL,WAAW;SACZ,CAAC;KACH;IAAC,OAAO,GAAG,EAAE;QACZ,MAAM,IAAA,8BAAsB,EAAC,+BAAuB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;KACjE;AACH,CAAC,CAAC;AAjCW,QAAA,uBAAuB,2BAiClC;AAEK,MAAM,6BAA6B,GAAG,KAAK,EAChD,WAAwB,EACxB,aAAqB,EACrB,gBAAwB,EACxB,kBAAqC,EACrC,iBAAyB,EACsB,EAAE;IACjD,IAAI;QACF,IAAA,kCAAwB,EAAC,aAAa,CAAC,CAAC;QAExC,MAAM,WAAW,GAAG,MAAM,kCAAkC,CAC1D,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,kBAAkB,CACnB,CAAC;QAEF,MAAM,oBAAoB,GAAG,IAAI,CAAC;QAClC,MAAM,2BAA2B,GAAG,KAAK,CAAC;QAC1C,OAAO,IAAA,oCAAmB,EACxB,MAAM,IAAA,+BAAc,EAClB,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,KAAK,CACN,EACD,SAAS,EAAE,2BAA2B;QACtC,2BAA2B,CAC5B,CAAC;KACH;IAAC,OAAO,GAAG,EAAE;QACZ,MAAM,IAAA,8BAAsB,EAAC,qCAA6B,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;KACvE;AACH,CAAC,CAAC;AAjCW,QAAA,6BAA6B,iCAiCxC","sourcesContent":["import {\n MatrixPopulateTransactionResponse,\n MatrixTransactionGasEstimateResponse,\n MatrixERC20Amount,\n NetworkName,\n TransactionGasDetails,\n NETWORK_CONFIG,\n} from '@matrix-privacy/shared-models';\nimport {\n gasEstimateResponse,\n getGasEstimate,\n setGasDetailsForTransaction,\n} from './tx-gas-details';\nimport {\n ShieldNoteERC20,\n MatrixEngine,\n ByteUtils,\n MatrixContracts,\n} from '@matrix-privacy/engine';\nimport { reportAndSanitizeError } from '../../utils/error';\nimport { ContractTransaction } from 'ethers';\nimport { assertValidMatrixAddress } from '../matrix/wallets/wallets';\n\nconst generateShieldBaseTokenTransaction = async (\n networkName: NetworkName,\n matrixAddress: string,\n shieldPrivateKey: string,\n wrappedERC20Amount: MatrixERC20Amount,\n): Promise<ContractTransaction> => {\n try {\n const { masterPublicKey, viewingPublicKey } =\n MatrixEngine.decodeAddress(matrixAddress);\n const random = ByteUtils.randomHex(16);\n\n const { amount, tokenAddress } = wrappedERC20Amount;\n\n const shield = new ShieldNoteERC20(\n masterPublicKey,\n random,\n amount,\n tokenAddress,\n );\n\n const shieldRequest = await shield.serialize(\n ByteUtils.hexToBytes(shieldPrivateKey),\n viewingPublicKey,\n );\n\n const { chain } = NETWORK_CONFIG[networkName];\n const transaction =\n await MatrixContracts.getRelayAdaptContract(chain).populateShieldBaseToken(\n shieldRequest,\n );\n\n return transaction;\n } catch (err) {\n throw reportAndSanitizeError(generateShieldBaseTokenTransaction.name, err);\n }\n};\n\nexport const populateShieldBaseToken = async (\n networkName: NetworkName,\n matrixAddress: string,\n shieldPrivateKey: string,\n wrappedERC20Amount: MatrixERC20Amount,\n gasDetails?: TransactionGasDetails,\n): Promise<MatrixPopulateTransactionResponse> => {\n try {\n assertValidMatrixAddress(matrixAddress);\n\n const transaction = await generateShieldBaseTokenTransaction(\n networkName,\n matrixAddress,\n shieldPrivateKey,\n wrappedERC20Amount,\n );\n\n if (gasDetails) {\n const sendWithPublicWallet = true;\n setGasDetailsForTransaction(\n networkName,\n transaction,\n gasDetails,\n sendWithPublicWallet,\n );\n }\n\n return {\n transaction,\n };\n } catch (err) {\n throw reportAndSanitizeError(populateShieldBaseToken.name, err);\n }\n};\n\nexport const gasEstimateForShieldBaseToken = async (\n networkName: NetworkName,\n matrixAddress: string,\n shieldPrivateKey: string,\n wrappedERC20Amount: MatrixERC20Amount,\n fromWalletAddress: string,\n): Promise<MatrixTransactionGasEstimateResponse> => {\n try {\n assertValidMatrixAddress(matrixAddress);\n\n const transaction = await generateShieldBaseTokenTransaction(\n networkName,\n matrixAddress,\n shieldPrivateKey,\n wrappedERC20Amount,\n );\n\n const sendWithPublicWallet = true;\n const isGasEstimateWithDummyProof = false;\n return gasEstimateResponse(\n await getGasEstimate(\n networkName,\n transaction,\n fromWalletAddress,\n sendWithPublicWallet,\n false, // isCrossContractCall\n ),\n undefined, // broadcasterFeeCommitment\n isGasEstimateWithDummyProof,\n );\n } catch (err) {\n throw reportAndSanitizeError(gasEstimateForShieldBaseToken.name, err);\n }\n};\n"]}
@@ -0,0 +1,6 @@
1
+ import { MatrixPopulateTransactionResponse, MatrixTransactionGasEstimateResponse, NetworkName, MatrixERC20AmountRecipient, MatrixNFTAmountRecipient, TransactionGasDetails } from '@matrix-privacy/shared-models';
2
+ import { ContractTransaction } from 'ethers';
3
+ export declare const getShieldPrivateKeySignatureMessage: () => string;
4
+ export declare const generateShieldTransaction: (networkName: NetworkName, shieldPrivateKey: string, erc20AmountRecipients: MatrixERC20AmountRecipient[], nftAmountRecipients: MatrixNFTAmountRecipient[]) => Promise<ContractTransaction>;
5
+ export declare const populateShield: (networkName: NetworkName, shieldPrivateKey: string, erc20AmountRecipients: MatrixERC20AmountRecipient[], nftAmountRecipients: MatrixNFTAmountRecipient[], gasDetails?: TransactionGasDetails) => Promise<MatrixPopulateTransactionResponse>;
6
+ export declare const gasEstimateForShield: (networkName: NetworkName, shieldPrivateKey: string, erc20AmountRecipients: MatrixERC20AmountRecipient[], nftAmountRecipients: MatrixNFTAmountRecipient[], fromWalletAddress: string) => Promise<MatrixTransactionGasEstimateResponse>;
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.gasEstimateForShield = exports.populateShield = exports.generateShieldTransaction = exports.getShieldPrivateKeySignatureMessage = void 0;
4
+ const shared_models_1 = require("@matrix-privacy/shared-models");
5
+ const engine_1 = require("@matrix-privacy/engine");
6
+ const tx_gas_details_1 = require("./tx-gas-details");
7
+ const tx_cross_contract_calls_1 = require("./tx-cross-contract-calls");
8
+ const error_1 = require("../../utils/error");
9
+ const wallets_1 = require("../matrix/wallets");
10
+ const getShieldPrivateKeySignatureMessage = () => {
11
+ return engine_1.ShieldNote.getShieldPrivateKeySignatureMessage();
12
+ };
13
+ exports.getShieldPrivateKeySignatureMessage = getShieldPrivateKeySignatureMessage;
14
+ const generateERC20ShieldRequests = async (erc20AmountRecipient, random, shieldPrivateKey) => {
15
+ const matrixAddress = erc20AmountRecipient.recipientAddress;
16
+ (0, wallets_1.assertValidMatrixAddress)(matrixAddress);
17
+ const { masterPublicKey, viewingPublicKey } = engine_1.MatrixEngine.decodeAddress(matrixAddress);
18
+ const shield = new engine_1.ShieldNoteERC20(masterPublicKey, random, erc20AmountRecipient.amount, erc20AmountRecipient.tokenAddress);
19
+ return shield.serialize(engine_1.ByteUtils.hexToBytes(shieldPrivateKey), viewingPublicKey);
20
+ };
21
+ const generateNFTShieldRequests = async (nftAmountRecipient, random, shieldPrivateKey) => {
22
+ const matrixAddress = nftAmountRecipient.recipientAddress;
23
+ (0, wallets_1.assertValidMatrixAddress)(matrixAddress);
24
+ const { masterPublicKey, viewingPublicKey } = engine_1.MatrixEngine.decodeAddress(matrixAddress);
25
+ const value = nftAmountRecipient.nftTokenType === shared_models_1.NFTTokenType.ERC721
26
+ ? engine_1.ERC721_NOTE_VALUE
27
+ : nftAmountRecipient.amount;
28
+ const nftTokenData = (0, tx_cross_contract_calls_1.createNFTTokenDataFromMatrixNFTAmount)(nftAmountRecipient);
29
+ const shield = new engine_1.ShieldNoteNFT(masterPublicKey, random, value, nftTokenData);
30
+ return shield.serialize(engine_1.ByteUtils.hexToBytes(shieldPrivateKey), viewingPublicKey);
31
+ };
32
+ const generateShieldTransaction = async (networkName, shieldPrivateKey, erc20AmountRecipients, nftAmountRecipients) => {
33
+ try {
34
+ const random = engine_1.ByteUtils.randomHex(16);
35
+ const shieldInputs = await Promise.all([
36
+ ...erc20AmountRecipients.map(erc20AmountRecipient => generateERC20ShieldRequests(erc20AmountRecipient, random, shieldPrivateKey)),
37
+ ...nftAmountRecipients.map(nftAmountRecipient => generateNFTShieldRequests(nftAmountRecipient, random, shieldPrivateKey)),
38
+ ]);
39
+ const chain = shared_models_1.NETWORK_CONFIG[networkName].chain;
40
+ const transaction = await engine_1.MatrixContracts.generateShield(chain, shieldInputs);
41
+ return transaction;
42
+ }
43
+ catch (err) {
44
+ throw (0, error_1.reportAndSanitizeError)(exports.generateShieldTransaction.name, err);
45
+ }
46
+ };
47
+ exports.generateShieldTransaction = generateShieldTransaction;
48
+ const populateShield = async (networkName, shieldPrivateKey, erc20AmountRecipients, nftAmountRecipients, gasDetails) => {
49
+ try {
50
+ const transaction = await (0, exports.generateShieldTransaction)(networkName, shieldPrivateKey, erc20AmountRecipients, nftAmountRecipients);
51
+ if (gasDetails) {
52
+ const sendWithPublicWallet = true;
53
+ (0, tx_gas_details_1.setGasDetailsForTransaction)(networkName, transaction, gasDetails, sendWithPublicWallet);
54
+ }
55
+ return {
56
+ transaction,
57
+ };
58
+ }
59
+ catch (err) {
60
+ throw (0, error_1.reportAndSanitizeError)(exports.populateShield.name, err);
61
+ }
62
+ };
63
+ exports.populateShield = populateShield;
64
+ const gasEstimateForShield = async (networkName, shieldPrivateKey, erc20AmountRecipients, nftAmountRecipients, fromWalletAddress) => {
65
+ try {
66
+ const transaction = await (0, exports.generateShieldTransaction)(networkName, shieldPrivateKey, erc20AmountRecipients, nftAmountRecipients);
67
+ const sendWithPublicWallet = true;
68
+ const isGasEstimateWithDummyProof = false;
69
+ return (0, tx_gas_details_1.gasEstimateResponse)(await (0, tx_gas_details_1.getGasEstimate)(networkName, transaction, fromWalletAddress, sendWithPublicWallet, false), undefined, // broadcasterFeeCommitment
70
+ isGasEstimateWithDummyProof);
71
+ }
72
+ catch (err) {
73
+ throw (0, error_1.reportAndSanitizeError)(exports.gasEstimateForShield.name, err);
74
+ }
75
+ };
76
+ exports.gasEstimateForShield = gasEstimateForShield;
77
+ //# sourceMappingURL=tx-shield.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tx-shield.js","sourceRoot":"","sources":["../../../src/services/transactions/tx-shield.ts"],"names":[],"mappings":";;;AAAA,iEASuC;AACvC,mDASgC;AAChC,qDAI0B;AAC1B,uEAAkF;AAClF,6CAA2D;AAE3D,+CAA6D;AAEtD,MAAM,mCAAmC,GAAG,GAAG,EAAE;IACtD,OAAO,mBAAU,CAAC,mCAAmC,EAAE,CAAC;AAC1D,CAAC,CAAC;AAFW,QAAA,mCAAmC,uCAE9C;AAEF,MAAM,2BAA2B,GAAG,KAAK,EACvC,oBAAgD,EAChD,MAAc,EACd,gBAAwB,EACM,EAAE;IAChC,MAAM,aAAa,GAAG,oBAAoB,CAAC,gBAAgB,CAAC;IAE5D,IAAA,kCAAwB,EAAC,aAAa,CAAC,CAAC;IAExC,MAAM,EAAE,eAAe,EAAE,gBAAgB,EAAE,GACzC,qBAAY,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IAE5C,MAAM,MAAM,GAAG,IAAI,wBAAe,CAChC,eAAe,EACf,MAAM,EACN,oBAAoB,CAAC,MAAM,EAC3B,oBAAoB,CAAC,YAAY,CAClC,CAAC;IACF,OAAO,MAAM,CAAC,SAAS,CACrB,kBAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC,EACtC,gBAAgB,CACjB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,yBAAyB,GAAG,KAAK,EACrC,kBAA4C,EAC5C,MAAc,EACd,gBAAwB,EACM,EAAE;IAChC,MAAM,aAAa,GAAG,kBAAkB,CAAC,gBAAgB,CAAC;IAE1D,IAAA,kCAAwB,EAAC,aAAa,CAAC,CAAC;IAExC,MAAM,EAAE,eAAe,EAAE,gBAAgB,EAAE,GACzC,qBAAY,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IAE5C,MAAM,KAAK,GACT,kBAAkB,CAAC,YAAY,KAAK,4BAAY,CAAC,MAAM;QACrD,CAAC,CAAC,0BAAiB;QACnB,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC;IAEhC,MAAM,YAAY,GAChB,IAAA,+DAAqC,EAAC,kBAAkB,CAAC,CAAC;IAE5D,MAAM,MAAM,GAAG,IAAI,sBAAa,CAC9B,eAAe,EACf,MAAM,EACN,KAAK,EACL,YAAY,CACb,CAAC;IACF,OAAO,MAAM,CAAC,SAAS,CACrB,kBAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC,EACtC,gBAAgB,CACjB,CAAC;AACJ,CAAC,CAAC;AAEK,MAAM,yBAAyB,GAAG,KAAK,EAC5C,WAAwB,EACxB,gBAAwB,EACxB,qBAAmD,EACnD,mBAA+C,EACjB,EAAE;IAChC,IAAI;QACF,MAAM,MAAM,GAAG,kBAAS,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAEvC,MAAM,YAAY,GAA0B,MAAM,OAAO,CAAC,GAAG,CAAC;YAC5D,GAAG,qBAAqB,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAClD,2BAA2B,CACzB,oBAAoB,EACpB,MAAM,EACN,gBAAgB,CACjB,CACF;YACD,GAAG,mBAAmB,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAC9C,yBAAyB,CAAC,kBAAkB,EAAE,MAAM,EAAE,gBAAgB,CAAC,CACxE;SACF,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,8BAAc,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC;QAChD,MAAM,WAAW,GAAG,MAAM,wBAAe,CAAC,cAAc,CACtD,KAAK,EACL,YAAY,CACb,CAAC;QACF,OAAO,WAAW,CAAC;KACpB;IAAC,OAAO,GAAG,EAAE;QACZ,MAAM,IAAA,8BAAsB,EAAC,iCAAyB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;KACnE;AACH,CAAC,CAAC;AA/BW,QAAA,yBAAyB,6BA+BpC;AAEK,MAAM,cAAc,GAAG,KAAK,EACjC,WAAwB,EACxB,gBAAwB,EACxB,qBAAmD,EACnD,mBAA+C,EAC/C,UAAkC,EACU,EAAE;IAC9C,IAAI;QACF,MAAM,WAAW,GAAG,MAAM,IAAA,iCAAyB,EACjD,WAAW,EACX,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,CACpB,CAAC;QAEF,IAAI,UAAU,EAAE;YACd,MAAM,oBAAoB,GAAG,IAAI,CAAC;YAClC,IAAA,4CAA2B,EACzB,WAAW,EACX,WAAW,EACX,UAAU,EACV,oBAAoB,CACrB,CAAC;SACH;QAED,OAAO;YACL,WAAW;SACZ,CAAC;KACH;IAAC,OAAO,GAAG,EAAE;QACZ,MAAM,IAAA,8BAAsB,EAAC,sBAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;KACxD;AACH,CAAC,CAAC;AA/BW,QAAA,cAAc,kBA+BzB;AAEK,MAAM,oBAAoB,GAAG,KAAK,EACvC,WAAwB,EACxB,gBAAwB,EACxB,qBAAmD,EACnD,mBAA+C,EAC/C,iBAAyB,EACsB,EAAE;IACjD,IAAI;QACF,MAAM,WAAW,GAAG,MAAM,IAAA,iCAAyB,EACjD,WAAW,EACX,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,CACpB,CAAC;QAEF,MAAM,oBAAoB,GAAG,IAAI,CAAC;QAClC,MAAM,2BAA2B,GAAG,KAAK,CAAC;QAC1C,OAAO,IAAA,oCAAmB,EACxB,MAAM,IAAA,+BAAc,EAClB,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,KAAK,CACN,EACD,SAAS,EAAE,2BAA2B;QACtC,2BAA2B,CAC5B,CAAC;KACH;IAAC,OAAO,GAAG,EAAE;QACZ,MAAM,IAAA,8BAAsB,EAAC,4BAAoB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;KAC9D;AACH,CAAC,CAAC;AA/BW,QAAA,oBAAoB,wBA+B/B","sourcesContent":["import {\n MatrixPopulateTransactionResponse,\n MatrixTransactionGasEstimateResponse,\n NetworkName,\n MatrixERC20AmountRecipient,\n MatrixNFTAmountRecipient,\n NFTTokenType,\n TransactionGasDetails,\n NETWORK_CONFIG,\n} from '@matrix-privacy/shared-models';\nimport {\n ShieldNote,\n MatrixEngine,\n ShieldRequestStruct,\n ByteUtils,\n ShieldNoteERC20,\n ShieldNoteNFT,\n ERC721_NOTE_VALUE,\n MatrixContracts,\n} from '@matrix-privacy/engine';\nimport {\n gasEstimateResponse,\n getGasEstimate,\n setGasDetailsForTransaction,\n} from './tx-gas-details';\nimport { createNFTTokenDataFromMatrixNFTAmount } from './tx-cross-contract-calls';\nimport { reportAndSanitizeError } from '../../utils/error';\nimport { ContractTransaction } from 'ethers';\nimport { assertValidMatrixAddress } from '../matrix/wallets';\n\nexport const getShieldPrivateKeySignatureMessage = () => {\n return ShieldNote.getShieldPrivateKeySignatureMessage();\n};\n\nconst generateERC20ShieldRequests = async (\n erc20AmountRecipient: MatrixERC20AmountRecipient,\n random: string,\n shieldPrivateKey: string,\n): Promise<ShieldRequestStruct> => {\n const matrixAddress = erc20AmountRecipient.recipientAddress;\n\n assertValidMatrixAddress(matrixAddress);\n\n const { masterPublicKey, viewingPublicKey } =\n MatrixEngine.decodeAddress(matrixAddress);\n\n const shield = new ShieldNoteERC20(\n masterPublicKey,\n random,\n erc20AmountRecipient.amount,\n erc20AmountRecipient.tokenAddress,\n );\n return shield.serialize(\n ByteUtils.hexToBytes(shieldPrivateKey),\n viewingPublicKey,\n );\n};\n\nconst generateNFTShieldRequests = async (\n nftAmountRecipient: MatrixNFTAmountRecipient,\n random: string,\n shieldPrivateKey: string,\n): Promise<ShieldRequestStruct> => {\n const matrixAddress = nftAmountRecipient.recipientAddress;\n\n assertValidMatrixAddress(matrixAddress);\n\n const { masterPublicKey, viewingPublicKey } =\n MatrixEngine.decodeAddress(matrixAddress);\n\n const value =\n nftAmountRecipient.nftTokenType === NFTTokenType.ERC721\n ? ERC721_NOTE_VALUE\n : nftAmountRecipient.amount;\n\n const nftTokenData =\n createNFTTokenDataFromMatrixNFTAmount(nftAmountRecipient);\n\n const shield = new ShieldNoteNFT(\n masterPublicKey,\n random,\n value,\n nftTokenData,\n );\n return shield.serialize(\n ByteUtils.hexToBytes(shieldPrivateKey),\n viewingPublicKey,\n );\n};\n\nexport const generateShieldTransaction = async (\n networkName: NetworkName,\n shieldPrivateKey: string,\n erc20AmountRecipients: MatrixERC20AmountRecipient[],\n nftAmountRecipients: MatrixNFTAmountRecipient[],\n): Promise<ContractTransaction> => {\n try {\n const random = ByteUtils.randomHex(16);\n\n const shieldInputs: ShieldRequestStruct[] = await Promise.all([\n ...erc20AmountRecipients.map(erc20AmountRecipient =>\n generateERC20ShieldRequests(\n erc20AmountRecipient,\n random,\n shieldPrivateKey,\n ),\n ),\n ...nftAmountRecipients.map(nftAmountRecipient =>\n generateNFTShieldRequests(nftAmountRecipient, random, shieldPrivateKey),\n ),\n ]);\n\n const chain = NETWORK_CONFIG[networkName].chain;\n const transaction = await MatrixContracts.generateShield(\n chain,\n shieldInputs,\n );\n return transaction;\n } catch (err) {\n throw reportAndSanitizeError(generateShieldTransaction.name, err);\n }\n};\n\nexport const populateShield = async (\n networkName: NetworkName,\n shieldPrivateKey: string,\n erc20AmountRecipients: MatrixERC20AmountRecipient[],\n nftAmountRecipients: MatrixNFTAmountRecipient[],\n gasDetails?: TransactionGasDetails,\n): Promise<MatrixPopulateTransactionResponse> => {\n try {\n const transaction = await generateShieldTransaction(\n networkName,\n shieldPrivateKey,\n erc20AmountRecipients,\n nftAmountRecipients,\n );\n\n if (gasDetails) {\n const sendWithPublicWallet = true;\n setGasDetailsForTransaction(\n networkName,\n transaction,\n gasDetails,\n sendWithPublicWallet,\n );\n }\n\n return {\n transaction,\n };\n } catch (err) {\n throw reportAndSanitizeError(populateShield.name, err);\n }\n};\n\nexport const gasEstimateForShield = async (\n networkName: NetworkName,\n shieldPrivateKey: string,\n erc20AmountRecipients: MatrixERC20AmountRecipient[],\n nftAmountRecipients: MatrixNFTAmountRecipient[],\n fromWalletAddress: string,\n): Promise<MatrixTransactionGasEstimateResponse> => {\n try {\n const transaction = await generateShieldTransaction(\n networkName,\n shieldPrivateKey,\n erc20AmountRecipients,\n nftAmountRecipients,\n );\n\n const sendWithPublicWallet = true;\n const isGasEstimateWithDummyProof = false;\n return gasEstimateResponse(\n await getGasEstimate(\n networkName,\n transaction,\n fromWalletAddress,\n sendWithPublicWallet,\n false, // isCrossContractCall\n ),\n undefined, // broadcasterFeeCommitment\n isGasEstimateWithDummyProof,\n );\n } catch (err) {\n throw reportAndSanitizeError(gasEstimateForShield.name, err);\n }\n};\n"]}
@@ -0,0 +1,3 @@
1
+ import { MatrixPopulateTransactionResponse, MatrixTransactionGasEstimateResponse, NetworkName, FeeTokenDetails, MatrixERC20AmountRecipient, MatrixNFTAmountRecipient, TransactionGasDetails } from '@matrix-privacy/shared-models';
2
+ export declare const populateProvedTransfer: (networkName: NetworkName, matrixWalletID: string, showSenderAddressToRecipient: boolean, memoText: Optional<string>, erc20AmountRecipients: MatrixERC20AmountRecipient[], nftAmountRecipients: MatrixNFTAmountRecipient[], broadcasterFeeERC20AmountRecipient: Optional<MatrixERC20AmountRecipient>, sendWithPublicWallet: boolean, overallBatchMinGasPrice: Optional<bigint>, gasDetails: TransactionGasDetails) => Promise<MatrixPopulateTransactionResponse>;
3
+ export declare const gasEstimateForUnprovenTransfer: (networkName: NetworkName, matrixWalletID: string, encryptionKey: string, memoText: Optional<string>, erc20AmountRecipients: MatrixERC20AmountRecipient[], nftAmountRecipients: MatrixNFTAmountRecipient[], originalGasDetails: TransactionGasDetails, feeTokenDetails: Optional<FeeTokenDetails>, sendWithPublicWallet: boolean) => Promise<MatrixTransactionGasEstimateResponse>;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.gasEstimateForUnprovenTransfer = exports.populateProvedTransfer = 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 tx_gas_broadcaster_fee_estimator_1 = require("./tx-gas-broadcaster-fee-estimator");
8
+ const error_1 = require("../../utils/error");
9
+ const populateProvedTransfer = async (networkName, matrixWalletID, showSenderAddressToRecipient, memoText, erc20AmountRecipients, nftAmountRecipients, broadcasterFeeERC20AmountRecipient, sendWithPublicWallet, overallBatchMinGasPrice, gasDetails) => {
10
+ try {
11
+ const { transaction, nullifiers } = await (0, proof_cache_1.populateProvedTransaction)(networkName, shared_models_1.ProofType.Transfer, matrixWalletID, showSenderAddressToRecipient, memoText, erc20AmountRecipients, nftAmountRecipients, undefined, // relayAdaptUnshieldERC20AmountRecipients
12
+ undefined, // relayAdaptUnshieldNFTAmounts
13
+ undefined, // relayAdaptShieldERC20Recipients
14
+ undefined, // relayAdaptShieldNFTRecipients
15
+ undefined, // crossContractCalls
16
+ broadcasterFeeERC20AmountRecipient, sendWithPublicWallet, overallBatchMinGasPrice, gasDetails);
17
+ return {
18
+ nullifiers,
19
+ transaction,
20
+ };
21
+ }
22
+ catch (err) {
23
+ throw (0, error_1.reportAndSanitizeError)(exports.populateProvedTransfer.name, err);
24
+ }
25
+ };
26
+ exports.populateProvedTransfer = populateProvedTransfer;
27
+ const gasEstimateForUnprovenTransfer = async (networkName, matrixWalletID, encryptionKey, memoText, erc20AmountRecipients, nftAmountRecipients, originalGasDetails, feeTokenDetails, sendWithPublicWallet) => {
28
+ try {
29
+ const overallBatchMinGasPrice = 0n;
30
+ const response = await (0, tx_gas_broadcaster_fee_estimator_1.gasEstimateResponseDummyProofIterativeBroadcasterFee)((broadcasterFeeERC20Amount) => (0, tx_generator_1.generateDummyProofTransactions)(shared_models_1.ProofType.Transfer, networkName, matrixWalletID, encryptionKey, false, // showSenderAddressToRecipient - doesn't matter for gas estimate.
31
+ memoText, erc20AmountRecipients, nftAmountRecipients, broadcasterFeeERC20Amount, sendWithPublicWallet, overallBatchMinGasPrice), (txs) => (0, tx_generator_1.generateTransact)(txs, networkName, true), networkName, matrixWalletID, erc20AmountRecipients, originalGasDetails, feeTokenDetails, sendWithPublicWallet, false);
32
+ return response;
33
+ }
34
+ catch (err) {
35
+ throw (0, error_1.reportAndSanitizeError)(exports.gasEstimateForUnprovenTransfer.name, err);
36
+ }
37
+ };
38
+ exports.gasEstimateForUnprovenTransfer = gasEstimateForUnprovenTransfer;
39
+ //# sourceMappingURL=tx-transfer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tx-transfer.js","sourceRoot":"","sources":["../../../src/services/transactions/tx-transfer.ts"],"names":[],"mappings":";;;AAAA,iEAUuC;AACvC,iDAGwB;AACxB,+CAA0D;AAI1D,yFAA0G;AAC1G,6CAA2D;AAEpD,MAAM,sBAAsB,GAAG,KAAK,EACzC,WAAwB,EACxB,cAAsB,EACtB,4BAAqC,EACrC,QAA0B,EAC1B,qBAAmD,EACnD,mBAA+C,EAC/C,kCAAwE,EACxE,oBAA6B,EAC7B,uBAAyC,EACzC,UAAiC,EACW,EAAE;IAC9C,IAAI;QACF,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAC/B,MAAM,IAAA,uCAAyB,EAC7B,WAAW,EACX,yBAAS,CAAC,QAAQ,EAClB,cAAc,EACd,4BAA4B,EAC5B,QAAQ,EACR,qBAAqB,EACrB,mBAAmB,EACnB,SAAS,EAAE,0CAA0C;QACrD,SAAS,EAAE,+BAA+B;QAC1C,SAAS,EAAE,kCAAkC;QAC7C,SAAS,EAAE,gCAAgC;QAC3C,SAAS,EAAE,qBAAqB;QAChC,kCAAkC,EAClC,oBAAoB,EACpB,uBAAuB,EACvB,UAAU,CACX,CAAC;QACJ,OAAO;YACL,UAAU;YACV,WAAW;SACZ,CAAC;KACH;IAAC,OAAO,GAAG,EAAE;QACZ,MAAM,IAAA,8BAAsB,EAAC,8BAAsB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;KAChE;AACH,CAAC,CAAC;AAvCW,QAAA,sBAAsB,0BAuCjC;AAEK,MAAM,8BAA8B,GAAG,KAAK,EACjD,WAAwB,EACxB,cAAsB,EACtB,aAAqB,EACrB,QAA0B,EAC1B,qBAAmD,EACnD,mBAA+C,EAC/C,kBAAyC,EACzC,eAA0C,EAC1C,oBAA6B,EACkB,EAAE;IACjD,IAAI;QACF,MAAM,uBAAuB,GAAG,EAAE,CAAC;QAEnC,MAAM,QAAQ,GAAG,MAAM,IAAA,uFAAoD,EACzE,CAAC,yBAAsD,EAAE,EAAE,CACzD,IAAA,6CAA8B,EAC5B,yBAAS,CAAC,QAAQ,EAClB,WAAW,EACX,cAAc,EACd,aAAa,EACb,KAAK,EAAE,kEAAkE;QACzE,QAAQ,EACR,qBAAqB,EACrB,mBAAmB,EACnB,yBAAyB,EACzB,oBAAoB,EACpB,uBAAuB,CACxB,EACH,CAAC,GAA0B,EAAE,EAAE,CAC7B,IAAA,+BAAgB,EACd,GAAG,EACH,WAAW,EACX,IAAI,CACL,EACH,WAAW,EACX,cAAc,EACd,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,KAAK,CACN,CAAC;QACF,OAAO,QAAQ,CAAC;KACjB;IAAC,OAAO,GAAG,EAAE;QACZ,MAAM,IAAA,8BAAsB,EAAC,sCAA8B,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;KACxE;AACH,CAAC,CAAC;AA/CW,QAAA,8BAA8B,kCA+CzC","sourcesContent":["import {\n MatrixPopulateTransactionResponse,\n MatrixTransactionGasEstimateResponse,\n MatrixERC20Amount,\n NetworkName,\n ProofType,\n FeeTokenDetails,\n MatrixERC20AmountRecipient,\n MatrixNFTAmountRecipient,\n TransactionGasDetails,\n} from '@matrix-privacy/shared-models';\nimport {\n generateDummyProofTransactions,\n generateTransact,\n} from './tx-generator';\nimport { populateProvedTransaction } from './proof-cache';\nimport {\n TransactionStructV3,\n} from '@matrix-privacy/engine';\nimport { gasEstimateResponseDummyProofIterativeBroadcasterFee } from './tx-gas-broadcaster-fee-estimator';\nimport { reportAndSanitizeError } from '../../utils/error';\n\nexport const populateProvedTransfer = async (\n networkName: NetworkName,\n matrixWalletID: string,\n showSenderAddressToRecipient: boolean,\n memoText: Optional<string>,\n erc20AmountRecipients: MatrixERC20AmountRecipient[],\n nftAmountRecipients: MatrixNFTAmountRecipient[],\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.Transfer,\n matrixWalletID,\n showSenderAddressToRecipient,\n memoText,\n erc20AmountRecipients,\n nftAmountRecipients,\n undefined, // relayAdaptUnshieldERC20AmountRecipients\n undefined, // relayAdaptUnshieldNFTAmounts\n undefined, // relayAdaptShieldERC20Recipients\n undefined, // relayAdaptShieldNFTRecipients\n undefined, // crossContractCalls\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n overallBatchMinGasPrice,\n gasDetails,\n );\n return {\n nullifiers,\n transaction,\n };\n } catch (err) {\n throw reportAndSanitizeError(populateProvedTransfer.name, err);\n }\n};\n\nexport const gasEstimateForUnprovenTransfer = async (\n networkName: NetworkName,\n matrixWalletID: string,\n encryptionKey: string,\n memoText: Optional<string>,\n erc20AmountRecipients: MatrixERC20AmountRecipient[],\n nftAmountRecipients: MatrixNFTAmountRecipient[],\n originalGasDetails: TransactionGasDetails,\n feeTokenDetails: Optional<FeeTokenDetails>,\n sendWithPublicWallet: boolean,\n): Promise<MatrixTransactionGasEstimateResponse> => {\n try {\n const overallBatchMinGasPrice = 0n;\n\n const response = await gasEstimateResponseDummyProofIterativeBroadcasterFee(\n (broadcasterFeeERC20Amount: Optional<MatrixERC20Amount>) =>\n generateDummyProofTransactions(\n ProofType.Transfer,\n networkName,\n matrixWalletID,\n encryptionKey,\n false, // showSenderAddressToRecipient - doesn't matter for gas estimate.\n memoText,\n erc20AmountRecipients,\n nftAmountRecipients,\n broadcasterFeeERC20Amount,\n sendWithPublicWallet,\n overallBatchMinGasPrice,\n ),\n (txs: TransactionStructV3[]) =>\n generateTransact(\n txs,\n networkName,\n true, // useDummyProof\n ),\n networkName,\n matrixWalletID,\n erc20AmountRecipients,\n originalGasDetails,\n feeTokenDetails,\n sendWithPublicWallet,\n false, // isCrossContractCall\n );\n return response;\n } catch (err) {\n throw reportAndSanitizeError(gasEstimateForUnprovenTransfer.name, err);\n }\n};\n"]}
@@ -0,0 +1,11 @@
1
+ import { MatrixPopulateTransactionResponse, MatrixTransactionGasEstimateResponse, MatrixERC20Amount, NetworkName, FeeTokenDetails, MatrixERC20AmountRecipient, MatrixNFTAmountRecipient, TransactionGasDetails } from '@matrix-privacy/shared-models';
2
+ export declare const populateProvedUnshield: (networkName: NetworkName, matrixWalletID: string, erc20AmountRecipients: MatrixERC20AmountRecipient[], nftAmountRecipients: MatrixNFTAmountRecipient[], broadcasterFeeERC20AmountRecipient: Optional<MatrixERC20AmountRecipient>, sendWithPublicWallet: boolean, overallBatchMinGasPrice: Optional<bigint>, gasDetails: TransactionGasDetails) => Promise<MatrixPopulateTransactionResponse>;
3
+ export declare const populateProvedUnshieldBaseToken: (networkName: NetworkName, publicWalletAddress: string, matrixWalletID: string, wrappedERC20Amount: MatrixERC20Amount, broadcasterFeeERC20AmountRecipient: Optional<MatrixERC20AmountRecipient>, sendWithPublicWallet: boolean, overallBatchMinGasPrice: Optional<bigint>, gasDetails: TransactionGasDetails) => Promise<MatrixPopulateTransactionResponse>;
4
+ export declare const gasEstimateForUnprovenUnshield: (networkName: NetworkName, matrixWalletID: string, encryptionKey: string, erc20AmountRecipients: MatrixERC20AmountRecipient[], nftAmountRecipients: MatrixNFTAmountRecipient[], originalGasDetails: TransactionGasDetails, feeTokenDetails: Optional<FeeTokenDetails>, sendWithPublicWallet: boolean) => Promise<MatrixTransactionGasEstimateResponse>;
5
+ export declare const gasEstimateForUnprovenUnshieldBaseToken: (networkName: NetworkName, publicWalletAddress: string, matrixWalletID: string, encryptionKey: string, wrappedERC20Amount: MatrixERC20Amount, originalGasDetails: TransactionGasDetails, feeTokenDetails: Optional<FeeTokenDetails>, sendWithPublicWallet: boolean) => Promise<MatrixTransactionGasEstimateResponse>;
6
+ export declare const getERC20AndNFTAmountRecipientsForUnshieldToOrigin: (networkName: NetworkName, matrixWalletID: string, originalShieldTxid: string) => Promise<{
7
+ erc20AmountRecipients: MatrixERC20AmountRecipient[];
8
+ nftAmountRecipients: MatrixNFTAmountRecipient[];
9
+ }>;
10
+ export declare const populateProvedUnshieldToOrigin: (networkName: NetworkName, matrixWalletID: string, erc20AmountRecipients: MatrixERC20AmountRecipient[], nftAmountRecipients: MatrixNFTAmountRecipient[], gasDetails: TransactionGasDetails) => Promise<MatrixPopulateTransactionResponse>;
11
+ export declare const gasEstimateForUnprovenUnshieldToOrigin: (originalShieldTxid: string, networkName: NetworkName, matrixWalletID: string, encryptionKey: string, erc20AmountRecipients: MatrixERC20AmountRecipient[], nftAmountRecipients: MatrixNFTAmountRecipient[]) => Promise<MatrixTransactionGasEstimateResponse>;
@@ -0,0 +1,224 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.gasEstimateForUnprovenUnshieldToOrigin = exports.populateProvedUnshieldToOrigin = exports.getERC20AndNFTAmountRecipientsForUnshieldToOrigin = exports.gasEstimateForUnprovenUnshieldBaseToken = exports.gasEstimateForUnprovenUnshield = exports.populateProvedUnshieldBaseToken = exports.populateProvedUnshield = 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 engine_1 = require("@matrix-privacy/engine");
8
+ const tx_gas_broadcaster_fee_estimator_1 = require("./tx-gas-broadcaster-fee-estimator");
9
+ const tx_cross_contract_calls_1 = require("./tx-cross-contract-calls");
10
+ const error_1 = require("../../utils/error");
11
+ const tx_gas_details_1 = require("./tx-gas-details");
12
+ const matrix_1 = require("../matrix");
13
+ const ERC20_TRANSFER_EVENT_SIGNATURE = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';
14
+ const populateProvedUnshield = async (networkName, matrixWalletID, erc20AmountRecipients, nftAmountRecipients, broadcasterFeeERC20AmountRecipient, sendWithPublicWallet, overallBatchMinGasPrice, gasDetails) => {
15
+ try {
16
+ const { transaction, nullifiers } = await (0, proof_cache_1.populateProvedTransaction)(networkName, shared_models_1.ProofType.Unshield, matrixWalletID, false, // showSenderAddressToRecipient
17
+ undefined, // memoText
18
+ erc20AmountRecipients, nftAmountRecipients, undefined, // relayAdaptUnshieldERC20AmountRecipients
19
+ undefined, // relayAdaptUnshieldNFTAmounts
20
+ undefined, // relayAdaptShieldERC20Recipients
21
+ undefined, // relayAdaptShieldNFTRecipients
22
+ undefined, // crossContractCalls
23
+ broadcasterFeeERC20AmountRecipient, sendWithPublicWallet, overallBatchMinGasPrice, gasDetails);
24
+ return {
25
+ nullifiers,
26
+ transaction,
27
+ };
28
+ }
29
+ catch (err) {
30
+ throw (0, error_1.reportAndSanitizeError)(exports.populateProvedUnshield.name, err);
31
+ }
32
+ };
33
+ exports.populateProvedUnshield = populateProvedUnshield;
34
+ const populateProvedUnshieldBaseToken = async (networkName, publicWalletAddress, matrixWalletID, wrappedERC20Amount, broadcasterFeeERC20AmountRecipient, sendWithPublicWallet, overallBatchMinGasPrice, gasDetails) => {
35
+ try {
36
+ const erc20AmountRecipients = [
37
+ {
38
+ ...wrappedERC20Amount,
39
+ recipientAddress: publicWalletAddress,
40
+ },
41
+ ];
42
+ const relayAdaptUnshieldERC20Amounts = [
43
+ wrappedERC20Amount,
44
+ ];
45
+ // Empty NFT Recipients.
46
+ const nftAmountRecipients = [];
47
+ const { transaction, nullifiers } = await (0, proof_cache_1.populateProvedTransaction)(networkName, shared_models_1.ProofType.UnshieldBaseToken, matrixWalletID, false, // showSenderAddressToRecipient
48
+ undefined, // memoText
49
+ erc20AmountRecipients, nftAmountRecipients, relayAdaptUnshieldERC20Amounts, undefined, // relayAdaptUnshieldNFTAmounts
50
+ undefined, // relayAdaptShieldERC20Recipients
51
+ undefined, // relayAdaptShieldNFTRecipients
52
+ undefined, // crossContractCalls
53
+ broadcasterFeeERC20AmountRecipient, sendWithPublicWallet, overallBatchMinGasPrice, gasDetails);
54
+ return {
55
+ nullifiers,
56
+ transaction,
57
+ };
58
+ }
59
+ catch (err) {
60
+ throw (0, error_1.reportAndSanitizeError)(exports.populateProvedUnshieldBaseToken.name, err);
61
+ }
62
+ };
63
+ exports.populateProvedUnshieldBaseToken = populateProvedUnshieldBaseToken;
64
+ const gasEstimateForUnprovenUnshield = async (networkName, matrixWalletID, encryptionKey, erc20AmountRecipients, nftAmountRecipients, originalGasDetails, feeTokenDetails, sendWithPublicWallet) => {
65
+ try {
66
+ const overallBatchMinGasPrice = 0n;
67
+ const response = await (0, tx_gas_broadcaster_fee_estimator_1.gasEstimateResponseDummyProofIterativeBroadcasterFee)((broadcasterFeeERC20Amount) => (0, tx_generator_1.generateDummyProofTransactions)(shared_models_1.ProofType.Unshield, networkName, matrixWalletID, encryptionKey, false, // showSenderAddressToRecipient
68
+ undefined, // memoText
69
+ erc20AmountRecipients, nftAmountRecipients, broadcasterFeeERC20Amount, sendWithPublicWallet, overallBatchMinGasPrice), (txs) => (0, tx_generator_1.generateTransact)(txs, networkName, true), networkName, matrixWalletID, erc20AmountRecipients, originalGasDetails, feeTokenDetails, sendWithPublicWallet, false);
70
+ return response;
71
+ }
72
+ catch (err) {
73
+ throw (0, error_1.reportAndSanitizeError)(exports.gasEstimateForUnprovenUnshield.name, err);
74
+ }
75
+ };
76
+ exports.gasEstimateForUnprovenUnshield = gasEstimateForUnprovenUnshield;
77
+ const gasEstimateForUnprovenUnshieldBaseToken = async (networkName, publicWalletAddress, matrixWalletID, encryptionKey, wrappedERC20Amount, originalGasDetails, feeTokenDetails, sendWithPublicWallet) => {
78
+ try {
79
+ const relayAdaptUnshieldERC20AmountRecipients = (0, tx_cross_contract_calls_1.createRelayAdaptUnshieldERC20AmountRecipients)(networkName, [
80
+ wrappedERC20Amount,
81
+ ]);
82
+ // Empty NFT Recipients.
83
+ const nftAmountRecipients = [];
84
+ const overallBatchMinGasPrice = 0n;
85
+ const response = await (0, tx_gas_broadcaster_fee_estimator_1.gasEstimateResponseDummyProofIterativeBroadcasterFee)((broadcasterFeeERC20Amount) => (0, tx_generator_1.generateDummyProofTransactions)(shared_models_1.ProofType.UnshieldBaseToken, networkName, matrixWalletID, encryptionKey, false, // showSenderAddressToRecipient
86
+ undefined, // memoText
87
+ relayAdaptUnshieldERC20AmountRecipients, nftAmountRecipients, broadcasterFeeERC20Amount, sendWithPublicWallet, overallBatchMinGasPrice), (txs) => {
88
+ const relayAdaptParamsRandom = engine_1.ByteUtils.randomHex(31);
89
+ return (0, tx_generator_1.generateUnshieldBaseToken)(txs, networkName, publicWalletAddress, relayAdaptParamsRandom, true, // useDummyProof (for gas estimation)
90
+ sendWithPublicWallet);
91
+ }, networkName, matrixWalletID, relayAdaptUnshieldERC20AmountRecipients, originalGasDetails, feeTokenDetails, sendWithPublicWallet, false);
92
+ return response;
93
+ }
94
+ catch (err) {
95
+ throw (0, error_1.reportAndSanitizeError)(exports.gasEstimateForUnprovenUnshieldBaseToken.name, err);
96
+ }
97
+ };
98
+ exports.gasEstimateForUnprovenUnshieldBaseToken = gasEstimateForUnprovenUnshieldBaseToken;
99
+ async function extractTokenOwnerFromTransferEvents(receipt, matrixContractAddress) {
100
+ const matrixAddressLower = matrixContractAddress.toLowerCase();
101
+ const potentialOwners = new Set();
102
+ for (const log of receipt.logs) {
103
+ try {
104
+ if (log.topics.length < 3) {
105
+ continue;
106
+ }
107
+ if (log.topics[0] !== ERC20_TRANSFER_EVENT_SIGNATURE) {
108
+ continue;
109
+ }
110
+ // topics[0] = event signature hash
111
+ const toAddress = `0x${log.topics[2].slice(-40).toLowerCase()}`;
112
+ if (toAddress === matrixAddressLower) {
113
+ const fromAddress = `0x${log.topics[1].slice(-40)}`;
114
+ potentialOwners.add(fromAddress);
115
+ }
116
+ }
117
+ catch (error) {
118
+ console.warn('Error parsing log for token owner extraction:', error);
119
+ continue;
120
+ }
121
+ }
122
+ if (potentialOwners.size === 1) {
123
+ const [owner] = Array.from(potentialOwners);
124
+ return owner;
125
+ }
126
+ // this handles cases where there are multiple deposits in one transaction
127
+ if (potentialOwners.size > 1) {
128
+ const [firstOwner] = Array.from(potentialOwners);
129
+ return firstOwner;
130
+ }
131
+ throw new Error('Could not find token owner: No Transfer event to contract detected in transaction');
132
+ }
133
+ async function getTokenOwnerWithFallback(receipt, transaction, contractAddress) {
134
+ try {
135
+ const tokenOwner = await extractTokenOwnerFromTransferEvents(receipt, contractAddress);
136
+ return tokenOwner;
137
+ }
138
+ catch (error) {
139
+ return transaction.from;
140
+ }
141
+ }
142
+ const getERC20AndNFTAmountRecipientsForUnshieldToOrigin = async (networkName, matrixWalletID, originalShieldTxid) => {
143
+ const wallet = (0, matrix_1.walletForID)(matrixWalletID);
144
+ const chain = shared_models_1.NETWORK_CONFIG[networkName].chain;
145
+ const balances = await wallet.getTokenBalancesForUnshieldToOrigin(chain, originalShieldTxid);
146
+ const provider = (0, matrix_1.getFallbackProviderForNetwork)(networkName);
147
+ const [transaction, receipt] = await Promise.all([
148
+ provider.getTransaction(originalShieldTxid),
149
+ provider.getTransactionReceipt(originalShieldTxid),
150
+ ]);
151
+ if (!transaction) {
152
+ throw new Error('Could not find shield transaction from RPC');
153
+ }
154
+ if (!receipt) {
155
+ throw new Error('Could not find shield transaction receipt from RPC');
156
+ }
157
+ const network = shared_models_1.NETWORK_CONFIG[networkName];
158
+ const contractAddress = network.accumulatorContract;
159
+ if (!contractAddress) {
160
+ throw new Error(`Could not find contract for network: ${networkName}`);
161
+ }
162
+ const recipientAddress = await getTokenOwnerWithFallback(receipt, transaction, contractAddress);
163
+ const erc20Amounts = (0, matrix_1.getSerializedERC20Balances)(balances);
164
+ const nftAmounts = (0, matrix_1.getSerializedNFTBalances)(balances);
165
+ const erc20AmountRecipients = erc20Amounts
166
+ .filter(({ amount }) => amount > 0n)
167
+ .map(erc20Amount => ({
168
+ ...erc20Amount,
169
+ recipientAddress,
170
+ }));
171
+ const nftAmountRecipients = nftAmounts
172
+ .filter(({ amount }) => amount > 0n)
173
+ .map(nftAmount => ({
174
+ ...nftAmount,
175
+ recipientAddress,
176
+ }));
177
+ return { erc20AmountRecipients, nftAmountRecipients };
178
+ };
179
+ exports.getERC20AndNFTAmountRecipientsForUnshieldToOrigin = getERC20AndNFTAmountRecipientsForUnshieldToOrigin;
180
+ const populateProvedUnshieldToOrigin = async (networkName, matrixWalletID, erc20AmountRecipients, nftAmountRecipients, gasDetails) => {
181
+ try {
182
+ const { transaction, nullifiers } = await (0, proof_cache_1.populateProvedTransaction)(networkName, shared_models_1.ProofType.Unshield, matrixWalletID, false, // showSenderAddressToRecipient
183
+ undefined, // memoText
184
+ erc20AmountRecipients, nftAmountRecipients, undefined, // relayAdaptUnshieldERC20AmountRecipients
185
+ undefined, // relayAdaptUnshieldNFTAmounts
186
+ undefined, // relayAdaptShieldERC20Recipients
187
+ undefined, // relayAdaptShieldNFTRecipients
188
+ undefined, // crossContractCalls
189
+ undefined, // broadcasterFeeERC20AmountRecipient
190
+ true, // sendWithPublicWallet
191
+ undefined, // overallBatchMinGasPrice
192
+ gasDetails);
193
+ return {
194
+ nullifiers,
195
+ transaction,
196
+ };
197
+ }
198
+ catch (err) {
199
+ throw (0, error_1.reportAndSanitizeError)(exports.populateProvedUnshieldToOrigin.name, err);
200
+ }
201
+ };
202
+ exports.populateProvedUnshieldToOrigin = populateProvedUnshieldToOrigin;
203
+ const gasEstimateForUnprovenUnshieldToOrigin = async (originalShieldTxid, networkName, matrixWalletID, encryptionKey, erc20AmountRecipients, nftAmountRecipients) => {
204
+ try {
205
+ // Use dead address for private transaction gas estimate
206
+ const fromWalletAddress = tx_generator_1.DUMMY_FROM_ADDRESS;
207
+ const overallBatchMinGasPrice = 0n;
208
+ const serializedTransactions = await (0, tx_generator_1.generateDummyProofTransactions)(shared_models_1.ProofType.Unshield, networkName, matrixWalletID, encryptionKey, false, // showSenderAddressToRecipient
209
+ undefined, // memoText
210
+ erc20AmountRecipients, nftAmountRecipients, undefined, // broadcasterFeeERC20Amount
211
+ true, // sendWithPublicWallet
212
+ overallBatchMinGasPrice, originalShieldTxid);
213
+ const transaction = await (0, tx_generator_1.generateTransact)(serializedTransactions, networkName, true);
214
+ const gasEstimate = await (0, tx_gas_details_1.getGasEstimate)(networkName, transaction, fromWalletAddress, true, // sendWithPublicWallet
215
+ false);
216
+ return (0, tx_gas_details_1.gasEstimateResponse)(gasEstimate, undefined, // broadcasterFeeCommitment
217
+ true);
218
+ }
219
+ catch (err) {
220
+ throw (0, error_1.reportAndSanitizeError)(exports.gasEstimateForUnprovenUnshieldToOrigin.name, err);
221
+ }
222
+ };
223
+ exports.gasEstimateForUnprovenUnshieldToOrigin = gasEstimateForUnprovenUnshieldToOrigin;
224
+ //# sourceMappingURL=tx-unshield.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tx-unshield.js","sourceRoot":"","sources":["../../../src/services/transactions/tx-unshield.ts"],"names":[],"mappings":";;;AAAA,iEAWuC;AACvC,iDAKwB;AACxB,+CAA0D;AAC1D,mDAGgC;AAChC,yFAA0G;AAC1G,uEAA0F;AAC1F,6CAA2D;AAC3D,qDAAuE;AACvE,sCAKmB;AAGnB,MAAM,8BAA8B,GAAG,oEAAoE,CAAC;AAErG,MAAM,sBAAsB,GAAG,KAAK,EACzC,WAAwB,EACxB,cAAsB,EACtB,qBAAmD,EACnD,mBAA+C,EAC/C,kCAAwE,EACxE,oBAA6B,EAC7B,uBAAyC,EACzC,UAAiC,EACW,EAAE;IAC9C,IAAI;QACF,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAC/B,MAAM,IAAA,uCAAyB,EAC7B,WAAW,EACX,yBAAS,CAAC,QAAQ,EAClB,cAAc,EACd,KAAK,EAAE,+BAA+B;QACtC,SAAS,EAAE,WAAW;QACtB,qBAAqB,EACrB,mBAAmB,EACnB,SAAS,EAAE,0CAA0C;QACrD,SAAS,EAAE,+BAA+B;QAC1C,SAAS,EAAE,kCAAkC;QAC7C,SAAS,EAAE,gCAAgC;QAC3C,SAAS,EAAE,qBAAqB;QAChC,kCAAkC,EAClC,oBAAoB,EACpB,uBAAuB,EACvB,UAAU,CACX,CAAC;QACJ,OAAO;YACL,UAAU;YACV,WAAW;SACZ,CAAC;KACH;IAAC,OAAO,GAAG,EAAE;QACZ,MAAM,IAAA,8BAAsB,EAAC,8BAAsB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;KAChE;AACH,CAAC,CAAC;AArCW,QAAA,sBAAsB,0BAqCjC;AAEK,MAAM,+BAA+B,GAAG,KAAK,EAClD,WAAwB,EACxB,mBAA2B,EAC3B,cAAsB,EACtB,kBAAqC,EACrC,kCAAwE,EACxE,oBAA6B,EAC7B,uBAAyC,EACzC,UAAiC,EACW,EAAE;IAC9C,IAAI;QACF,MAAM,qBAAqB,GAAiC;YAC1D;gBACE,GAAG,kBAAkB;gBACrB,gBAAgB,EAAE,mBAAmB;aACtC;SACF,CAAC;QACF,MAAM,8BAA8B,GAAwB;YAC1D,kBAAkB;SACnB,CAAC;QAEF,wBAAwB;QACxB,MAAM,mBAAmB,GAA+B,EAAE,CAAC;QAE3D,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAC/B,MAAM,IAAA,uCAAyB,EAC7B,WAAW,EACX,yBAAS,CAAC,iBAAiB,EAC3B,cAAc,EACd,KAAK,EAAE,+BAA+B;QACtC,SAAS,EAAE,WAAW;QACtB,qBAAqB,EACrB,mBAAmB,EACnB,8BAA8B,EAC9B,SAAS,EAAE,+BAA+B;QAC1C,SAAS,EAAE,kCAAkC;QAC7C,SAAS,EAAE,gCAAgC;QAC3C,SAAS,EAAE,qBAAqB;QAChC,kCAAkC,EAClC,oBAAoB,EACpB,uBAAuB,EACvB,UAAU,CACX,CAAC;QACJ,OAAO;YACL,UAAU;YACV,WAAW;SACZ,CAAC;KACH;IAAC,OAAO,GAAG,EAAE;QACZ,MAAM,IAAA,8BAAsB,EAAC,uCAA+B,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;KACzE;AACH,CAAC,CAAC;AAlDW,QAAA,+BAA+B,mCAkD1C;AAEK,MAAM,8BAA8B,GAAG,KAAK,EACjD,WAAwB,EACxB,cAAsB,EACtB,aAAqB,EACrB,qBAAmD,EACnD,mBAA+C,EAC/C,kBAAyC,EACzC,eAA0C,EAC1C,oBAA6B,EACkB,EAAE;IACjD,IAAI;QACF,MAAM,uBAAuB,GAAG,EAAE,CAAC;QAEnC,MAAM,QAAQ,GAAG,MAAM,IAAA,uFAAoD,EACzE,CAAC,yBAAsD,EAAE,EAAE,CACzD,IAAA,6CAA8B,EAC5B,yBAAS,CAAC,QAAQ,EAClB,WAAW,EACX,cAAc,EACd,aAAa,EACb,KAAK,EAAE,+BAA+B;QACtC,SAAS,EAAE,WAAW;QACtB,qBAAqB,EACrB,mBAAmB,EACnB,yBAAyB,EACzB,oBAAoB,EACpB,uBAAuB,CACxB,EACH,CAAC,GAA0B,EAAE,EAAE,CAC7B,IAAA,+BAAgB,EACd,GAAG,EACH,WAAW,EACX,IAAI,CACL,EACH,WAAW,EACX,cAAc,EACd,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,KAAK,CACN,CAAC;QACF,OAAO,QAAQ,CAAC;KACjB;IAAC,OAAO,GAAG,EAAE;QACZ,MAAM,IAAA,8BAAsB,EAAC,sCAA8B,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;KACxE;AACH,CAAC,CAAC;AA9CW,QAAA,8BAA8B,kCA8CzC;AAEK,MAAM,uCAAuC,GAAG,KAAK,EAC1D,WAAwB,EACxB,mBAA2B,EAC3B,cAAsB,EACtB,aAAqB,EACrB,kBAAqC,EACrC,kBAAyC,EACzC,eAA0C,EAC1C,oBAA6B,EACkB,EAAE;IACjD,IAAI;QACF,MAAM,uCAAuC,GAC3C,IAAA,uEAA6C,EAAC,WAAW,EAAE;YACzD,kBAAkB;SACnB,CAAC,CAAC;QAEL,wBAAwB;QACxB,MAAM,mBAAmB,GAA+B,EAAE,CAAC;QAE3D,MAAM,uBAAuB,GAAG,EAAE,CAAC;QAEnC,MAAM,QAAQ,GAAG,MAAM,IAAA,uFAAoD,EACzE,CAAC,yBAAsD,EAAE,EAAE,CACzD,IAAA,6CAA8B,EAC5B,yBAAS,CAAC,iBAAiB,EAC3B,WAAW,EACX,cAAc,EACd,aAAa,EACb,KAAK,EAAE,+BAA+B;QACtC,SAAS,EAAE,WAAW;QACtB,uCAAuC,EACvC,mBAAmB,EACnB,yBAAyB,EACzB,oBAAoB,EACpB,uBAAuB,CACxB,EACH,CAAC,GAA0B,EAAE,EAAE;YAC7B,MAAM,sBAAsB,GAAG,kBAAS,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACvD,OAAO,IAAA,wCAAyB,EAC9B,GAAG,EACH,WAAW,EACX,mBAAmB,EACnB,sBAAsB,EACtB,IAAI,EAAE,qCAAqC;YAC3C,oBAAoB,CACrB,CAAC;QACJ,CAAC,EACD,WAAW,EACX,cAAc,EACd,uCAAuC,EACvC,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,KAAK,CACN,CAAC;QACF,OAAO,QAAQ,CAAC;KACjB;IAAC,OAAO,GAAG,EAAE;QACZ,MAAM,IAAA,8BAAsB,EAC1B,+CAAuC,CAAC,IAAI,EAC5C,GAAG,CACJ,CAAC;KACH;AACH,CAAC,CAAC;AA9DW,QAAA,uCAAuC,2CA8DlD;AAEF,KAAK,UAAU,mCAAmC,CAChD,OAA2B,EAC3B,qBAA6B;IAE7B,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,WAAW,EAAE,CAAC;IAE/D,MAAM,eAAe,GAAgB,IAAI,GAAG,EAAE,CAAC;IAE/C,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE;QAC9B,IAAI;YACF,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBACzB,SAAS;aACV;YAED,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,8BAA8B,EAAE;gBACpD,SAAS;aACV;YACD,mCAAmC;YACnC,MAAM,SAAS,GAAG,KAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YAElE,IAAI,SAAS,KAAK,kBAAkB,EAAE;gBACpC,MAAM,WAAW,GAAG,KAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;gBACtD,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;aAClC;SACF;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,IAAI,CAAC,+CAA+C,EAAE,KAAK,CAAC,CAAC;YACrE,SAAS;SACV;KACF;IAED,IAAI,eAAe,CAAC,IAAI,KAAK,CAAC,EAAE;QAC9B,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC5C,OAAO,KAAK,CAAC;KACd;IACD,0EAA0E;IAC1E,IAAI,eAAe,CAAC,IAAI,GAAG,CAAC,EAAE;QAC5B,MAAM,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACjD,OAAO,UAAU,CAAC;KACnB;IAED,MAAM,IAAI,KAAK,CACb,mFAAmF,CACpF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,yBAAyB,CACtC,OAA2B,EAC3B,WAAgC,EAChC,eAAuB;IAEvB,IAAI;QACF,MAAM,UAAU,GAAG,MAAM,mCAAmC,CAC1D,OAAO,EACP,eAAe,CAChB,CAAC;QACF,OAAO,UAAU,CAAC;KACnB;IAAC,OAAO,KAAK,EAAE;QACd,OAAO,WAAW,CAAC,IAAI,CAAC;KACzB;AACH,CAAC;AAEM,MAAM,iDAAiD,GAAG,KAAK,EACpE,WAAwB,EACxB,cAAsB,EACtB,kBAA0B,EAIzB,EAAE;IACH,MAAM,MAAM,GAAG,IAAA,oBAAW,EAAC,cAAc,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,8BAAc,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC;IAEhD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,mCAAmC,CAC/D,KAAK,EACL,kBAAkB,CACnB,CAAC;IAEF,MAAM,QAAQ,GAAG,IAAA,sCAA6B,EAAC,WAAW,CAAC,CAAC;IAE5D,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC/C,QAAQ,CAAC,cAAc,CAAC,kBAAkB,CAAC;QAC3C,QAAQ,CAAC,qBAAqB,CAAC,kBAAkB,CAAC;KACnD,CAAC,CAAC;IAEH,IAAI,CAAC,WAAW,EAAE;QAChB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;KAC/D;IAED,IAAI,CAAC,OAAO,EAAE;QACZ,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;KACvE;IAED,MAAM,OAAO,GAAG,8BAAc,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,eAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAEpD,IAAI,CAAC,eAAe,EAAE;QACpB,MAAM,IAAI,KAAK,CAAC,wCAAwC,WAAW,EAAE,CAAC,CAAC;KACxE;IAED,MAAM,gBAAgB,GAAG,MAAM,yBAAyB,CACtD,OAAO,EACP,WAAW,EACX,eAAe,CAChB,CAAC;IACF,MAAM,YAAY,GAAG,IAAA,mCAA0B,EAAC,QAAQ,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,IAAA,iCAAwB,EAAC,QAAQ,CAAC,CAAC;IACtD,MAAM,qBAAqB,GAAiC,YAAY;SACrE,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC;SACnC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACnB,GAAG,WAAW;QACd,gBAAgB;KACjB,CAAC,CAAC,CAAC;IACN,MAAM,mBAAmB,GAA+B,UAAU;SAC/D,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC;SACnC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACjB,GAAG,SAAS;QACZ,gBAAgB;KACjB,CAAC,CAAC,CAAC;IACN,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,CAAC;AACxD,CAAC,CAAC;AA1DW,QAAA,iDAAiD,qDA0D5D;AAEK,MAAM,8BAA8B,GAAG,KAAK,EACjD,WAAwB,EACxB,cAAsB,EACtB,qBAAmD,EACnD,mBAA+C,EAC/C,UAAiC,EACW,EAAE;IAC9C,IAAI;QACF,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAC/B,MAAM,IAAA,uCAAyB,EAC7B,WAAW,EACX,yBAAS,CAAC,QAAQ,EAClB,cAAc,EACd,KAAK,EAAE,+BAA+B;QACtC,SAAS,EAAE,WAAW;QACtB,qBAAqB,EACrB,mBAAmB,EACnB,SAAS,EAAE,0CAA0C;QACrD,SAAS,EAAE,+BAA+B;QAC1C,SAAS,EAAE,kCAAkC;QAC7C,SAAS,EAAE,gCAAgC;QAC3C,SAAS,EAAE,qBAAqB;QAChC,SAAS,EAAE,qCAAqC;QAChD,IAAI,EAAE,uBAAuB;QAC7B,SAAS,EAAE,0BAA0B;QACrC,UAAU,CACX,CAAC;QACJ,OAAO;YACL,UAAU;YACV,WAAW;SACZ,CAAC;KACH;IAAC,OAAO,GAAG,EAAE;QACZ,MAAM,IAAA,8BAAsB,EAAC,sCAA8B,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;KACxE;AACH,CAAC,CAAC;AAlCW,QAAA,8BAA8B,kCAkCzC;AAEK,MAAM,sCAAsC,GAAG,KAAK,EACzD,kBAA0B,EAC1B,WAAwB,EACxB,cAAsB,EACtB,aAAqB,EACrB,qBAAmD,EACnD,mBAA+C,EACA,EAAE;IACjD,IAAI;QACF,wDAAwD;QACxD,MAAM,iBAAiB,GAAG,iCAAkB,CAAC;QAE7C,MAAM,uBAAuB,GAAG,EAAE,CAAC;QAEnC,MAAM,sBAAsB,GAAG,MAAM,IAAA,6CAA8B,EACjE,yBAAS,CAAC,QAAQ,EAClB,WAAW,EACX,cAAc,EACd,aAAa,EACb,KAAK,EAAE,+BAA+B;QACtC,SAAS,EAAE,WAAW;QACtB,qBAAqB,EACrB,mBAAmB,EACnB,SAAS,EAAE,4BAA4B;QACvC,IAAI,EAAE,uBAAuB;QAC7B,uBAAuB,EACvB,kBAAkB,CACnB,CAAC;QACF,MAAM,WAAW,GAAG,MAAM,IAAA,+BAAgB,EACxC,sBAAsB,EACtB,WAAW,EACX,IAAI,CACL,CAAC;QAEF,MAAM,WAAW,GAAG,MAAM,IAAA,+BAAc,EACtC,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,IAAI,EAAE,uBAAuB;QAC7B,KAAK,CACN,CAAC;QAEF,OAAO,IAAA,oCAAmB,EACxB,WAAW,EACX,SAAS,EAAE,2BAA2B;QACtC,IAAI,CACL,CAAC;KACH;IAAC,OAAO,GAAG,EAAE;QACZ,MAAM,IAAA,8BAAsB,EAC1B,8CAAsC,CAAC,IAAI,EAC3C,GAAG,CACJ,CAAC;KACH;AACH,CAAC,CAAC;AArDW,QAAA,sCAAsC,0CAqDjD","sourcesContent":["import {\n MatrixPopulateTransactionResponse,\n MatrixTransactionGasEstimateResponse,\n MatrixERC20Amount,\n NetworkName,\n ProofType,\n FeeTokenDetails,\n MatrixERC20AmountRecipient,\n MatrixNFTAmountRecipient,\n TransactionGasDetails,\n NETWORK_CONFIG,\n} from '@matrix-privacy/shared-models';\nimport {\n DUMMY_FROM_ADDRESS,\n generateDummyProofTransactions,\n generateTransact,\n generateUnshieldBaseToken,\n} from './tx-generator';\nimport { populateProvedTransaction } from './proof-cache';\nimport {\n ByteUtils,\n TransactionStructV3,\n} from '@matrix-privacy/engine';\nimport { gasEstimateResponseDummyProofIterativeBroadcasterFee } from './tx-gas-broadcaster-fee-estimator';\nimport { createRelayAdaptUnshieldERC20AmountRecipients } from './tx-cross-contract-calls';\nimport { reportAndSanitizeError } from '../../utils/error';\nimport { gasEstimateResponse, getGasEstimate } from './tx-gas-details';\nimport {\n walletForID,\n getFallbackProviderForNetwork,\n getSerializedERC20Balances,\n getSerializedNFTBalances,\n} from '../matrix';\nimport { TransactionReceipt, TransactionResponse } from 'ethers';\n\nconst ERC20_TRANSFER_EVENT_SIGNATURE = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';\n\nexport const populateProvedUnshield = async (\n networkName: NetworkName,\n matrixWalletID: string,\n erc20AmountRecipients: MatrixERC20AmountRecipient[],\n nftAmountRecipients: MatrixNFTAmountRecipient[],\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.Unshield,\n matrixWalletID,\n false, // showSenderAddressToRecipient\n undefined, // memoText\n erc20AmountRecipients,\n nftAmountRecipients,\n undefined, // relayAdaptUnshieldERC20AmountRecipients\n undefined, // relayAdaptUnshieldNFTAmounts\n undefined, // relayAdaptShieldERC20Recipients\n undefined, // relayAdaptShieldNFTRecipients\n undefined, // crossContractCalls\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n overallBatchMinGasPrice,\n gasDetails,\n );\n return {\n nullifiers,\n transaction,\n };\n } catch (err) {\n throw reportAndSanitizeError(populateProvedUnshield.name, err);\n }\n};\n\nexport const populateProvedUnshieldBaseToken = async (\n networkName: NetworkName,\n publicWalletAddress: string,\n matrixWalletID: string,\n wrappedERC20Amount: MatrixERC20Amount,\n broadcasterFeeERC20AmountRecipient: Optional<MatrixERC20AmountRecipient>,\n sendWithPublicWallet: boolean,\n overallBatchMinGasPrice: Optional<bigint>,\n gasDetails: TransactionGasDetails,\n): Promise<MatrixPopulateTransactionResponse> => {\n try {\n const erc20AmountRecipients: MatrixERC20AmountRecipient[] = [\n {\n ...wrappedERC20Amount,\n recipientAddress: publicWalletAddress,\n },\n ];\n const relayAdaptUnshieldERC20Amounts: MatrixERC20Amount[] = [\n wrappedERC20Amount,\n ];\n\n // Empty NFT Recipients.\n const nftAmountRecipients: MatrixNFTAmountRecipient[] = [];\n\n const { transaction, nullifiers } =\n await populateProvedTransaction(\n networkName,\n ProofType.UnshieldBaseToken,\n matrixWalletID,\n false, // showSenderAddressToRecipient\n undefined, // memoText\n erc20AmountRecipients,\n nftAmountRecipients,\n relayAdaptUnshieldERC20Amounts,\n undefined, // relayAdaptUnshieldNFTAmounts\n undefined, // relayAdaptShieldERC20Recipients\n undefined, // relayAdaptShieldNFTRecipients\n undefined, // crossContractCalls\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n overallBatchMinGasPrice,\n gasDetails,\n );\n return {\n nullifiers,\n transaction,\n };\n } catch (err) {\n throw reportAndSanitizeError(populateProvedUnshieldBaseToken.name, err);\n }\n};\n\nexport const gasEstimateForUnprovenUnshield = async (\n networkName: NetworkName,\n matrixWalletID: string,\n encryptionKey: string,\n erc20AmountRecipients: MatrixERC20AmountRecipient[],\n nftAmountRecipients: MatrixNFTAmountRecipient[],\n originalGasDetails: TransactionGasDetails,\n feeTokenDetails: Optional<FeeTokenDetails>,\n sendWithPublicWallet: boolean,\n): Promise<MatrixTransactionGasEstimateResponse> => {\n try {\n const overallBatchMinGasPrice = 0n;\n\n const response = await gasEstimateResponseDummyProofIterativeBroadcasterFee(\n (broadcasterFeeERC20Amount: Optional<MatrixERC20Amount>) =>\n generateDummyProofTransactions(\n ProofType.Unshield,\n networkName,\n matrixWalletID,\n encryptionKey,\n false, // showSenderAddressToRecipient\n undefined, // memoText\n erc20AmountRecipients,\n nftAmountRecipients,\n broadcasterFeeERC20Amount,\n sendWithPublicWallet,\n overallBatchMinGasPrice,\n ),\n (txs: TransactionStructV3[]) =>\n generateTransact(\n txs,\n networkName,\n true, // useDummyProof\n ),\n networkName,\n matrixWalletID,\n erc20AmountRecipients,\n originalGasDetails,\n feeTokenDetails,\n sendWithPublicWallet,\n false, // isCrossContractCall\n );\n return response;\n } catch (err) {\n throw reportAndSanitizeError(gasEstimateForUnprovenUnshield.name, err);\n }\n};\n\nexport const gasEstimateForUnprovenUnshieldBaseToken = async (\n networkName: NetworkName,\n publicWalletAddress: string,\n matrixWalletID: string,\n encryptionKey: string,\n wrappedERC20Amount: MatrixERC20Amount,\n originalGasDetails: TransactionGasDetails,\n feeTokenDetails: Optional<FeeTokenDetails>,\n sendWithPublicWallet: boolean,\n): Promise<MatrixTransactionGasEstimateResponse> => {\n try {\n const relayAdaptUnshieldERC20AmountRecipients: MatrixERC20AmountRecipient[] =\n createRelayAdaptUnshieldERC20AmountRecipients(networkName, [\n wrappedERC20Amount,\n ]);\n\n // Empty NFT Recipients.\n const nftAmountRecipients: MatrixNFTAmountRecipient[] = [];\n\n const overallBatchMinGasPrice = 0n;\n\n const response = await gasEstimateResponseDummyProofIterativeBroadcasterFee(\n (broadcasterFeeERC20Amount: Optional<MatrixERC20Amount>) =>\n generateDummyProofTransactions(\n ProofType.UnshieldBaseToken,\n networkName,\n matrixWalletID,\n encryptionKey,\n false, // showSenderAddressToRecipient\n undefined, // memoText\n relayAdaptUnshieldERC20AmountRecipients,\n nftAmountRecipients,\n broadcasterFeeERC20Amount,\n sendWithPublicWallet,\n overallBatchMinGasPrice,\n ),\n (txs: TransactionStructV3[]) => {\n const relayAdaptParamsRandom = ByteUtils.randomHex(31);\n return generateUnshieldBaseToken(\n txs,\n networkName,\n publicWalletAddress,\n relayAdaptParamsRandom,\n true, // useDummyProof (for gas estimation)\n sendWithPublicWallet,\n );\n },\n networkName,\n matrixWalletID,\n relayAdaptUnshieldERC20AmountRecipients,\n originalGasDetails,\n feeTokenDetails,\n sendWithPublicWallet,\n false, // isCrossContractCall\n );\n return response;\n } catch (err) {\n throw reportAndSanitizeError(\n gasEstimateForUnprovenUnshieldBaseToken.name,\n err,\n );\n }\n};\n\nasync function extractTokenOwnerFromTransferEvents(\n receipt: TransactionReceipt,\n matrixContractAddress: string\n): Promise<string> {\n const matrixAddressLower = matrixContractAddress.toLowerCase();\n\n const potentialOwners: Set<string> = new Set();\n\n for (const log of receipt.logs) {\n try {\n if (log.topics.length < 3) {\n continue;\n }\n\n if (log.topics[0] !== ERC20_TRANSFER_EVENT_SIGNATURE) {\n continue;\n }\n // topics[0] = event signature hash\n const toAddress = `0x${ log.topics[2].slice(-40).toLowerCase()}`;\n\n if (toAddress === matrixAddressLower) {\n const fromAddress = `0x${ log.topics[1].slice(-40)}`;\n potentialOwners.add(fromAddress);\n }\n } catch (error) {\n console.warn('Error parsing log for token owner extraction:', error);\n continue;\n }\n }\n\n if (potentialOwners.size === 1) {\n const [owner] = Array.from(potentialOwners);\n return owner;\n }\n // this handles cases where there are multiple deposits in one transaction\n if (potentialOwners.size > 1) {\n const [firstOwner] = Array.from(potentialOwners);\n return firstOwner;\n }\n\n throw new Error(\n 'Could not find token owner: No Transfer event to contract detected in transaction'\n );\n}\n\nasync function getTokenOwnerWithFallback(\n receipt: TransactionReceipt,\n transaction: TransactionResponse,\n contractAddress: string\n): Promise<string> {\n try {\n const tokenOwner = await extractTokenOwnerFromTransferEvents(\n receipt,\n contractAddress\n );\n return tokenOwner;\n } catch (error) {\n return transaction.from;\n }\n}\n\nexport const getERC20AndNFTAmountRecipientsForUnshieldToOrigin = async (\n networkName: NetworkName,\n matrixWalletID: string,\n originalShieldTxid: string,\n): Promise<{\n erc20AmountRecipients: MatrixERC20AmountRecipient[];\n nftAmountRecipients: MatrixNFTAmountRecipient[];\n}> => {\n const wallet = walletForID(matrixWalletID);\n const chain = NETWORK_CONFIG[networkName].chain;\n\n const balances = await wallet.getTokenBalancesForUnshieldToOrigin(\n chain,\n originalShieldTxid,\n );\n\n const provider = getFallbackProviderForNetwork(networkName);\n\n const [transaction, receipt] = await Promise.all([\n provider.getTransaction(originalShieldTxid),\n provider.getTransactionReceipt(originalShieldTxid),\n ]);\n\n if (!transaction) {\n throw new Error('Could not find shield transaction from RPC');\n }\n\n if (!receipt) {\n throw new Error('Could not find shield transaction receipt from RPC');\n }\n\n const network = NETWORK_CONFIG[networkName];\n const contractAddress = network.accumulatorContract;\n\n if (!contractAddress) {\n throw new Error(`Could not find contract for network: ${networkName}`);\n }\n\n const recipientAddress = await getTokenOwnerWithFallback(\n receipt,\n transaction,\n contractAddress\n );\n const erc20Amounts = getSerializedERC20Balances(balances);\n const nftAmounts = getSerializedNFTBalances(balances);\n const erc20AmountRecipients: MatrixERC20AmountRecipient[] = erc20Amounts\n .filter(({ amount }) => amount > 0n)\n .map(erc20Amount => ({\n ...erc20Amount,\n recipientAddress,\n }));\n const nftAmountRecipients: MatrixNFTAmountRecipient[] = nftAmounts\n .filter(({ amount }) => amount > 0n)\n .map(nftAmount => ({\n ...nftAmount,\n recipientAddress,\n }));\n return { erc20AmountRecipients, nftAmountRecipients };\n};\n\nexport const populateProvedUnshieldToOrigin = async (\n networkName: NetworkName,\n matrixWalletID: string,\n erc20AmountRecipients: MatrixERC20AmountRecipient[],\n nftAmountRecipients: MatrixNFTAmountRecipient[],\n gasDetails: TransactionGasDetails,\n): Promise<MatrixPopulateTransactionResponse> => {\n try {\n const { transaction, nullifiers } =\n await populateProvedTransaction(\n networkName,\n ProofType.Unshield,\n matrixWalletID,\n false, // showSenderAddressToRecipient\n undefined, // memoText\n erc20AmountRecipients,\n nftAmountRecipients,\n undefined, // relayAdaptUnshieldERC20AmountRecipients\n undefined, // relayAdaptUnshieldNFTAmounts\n undefined, // relayAdaptShieldERC20Recipients\n undefined, // relayAdaptShieldNFTRecipients\n undefined, // crossContractCalls\n undefined, // broadcasterFeeERC20AmountRecipient\n true, // sendWithPublicWallet\n undefined, // overallBatchMinGasPrice\n gasDetails,\n );\n return {\n nullifiers,\n transaction,\n };\n } catch (err) {\n throw reportAndSanitizeError(populateProvedUnshieldToOrigin.name, err);\n }\n};\n\nexport const gasEstimateForUnprovenUnshieldToOrigin = async (\n originalShieldTxid: string,\n networkName: NetworkName,\n matrixWalletID: string,\n encryptionKey: string,\n erc20AmountRecipients: MatrixERC20AmountRecipient[],\n nftAmountRecipients: MatrixNFTAmountRecipient[],\n): Promise<MatrixTransactionGasEstimateResponse> => {\n try {\n // Use dead address for private transaction gas estimate\n const fromWalletAddress = DUMMY_FROM_ADDRESS;\n\n const overallBatchMinGasPrice = 0n;\n\n const serializedTransactions = await generateDummyProofTransactions(\n ProofType.Unshield,\n networkName,\n matrixWalletID,\n encryptionKey,\n false, // showSenderAddressToRecipient\n undefined, // memoText\n erc20AmountRecipients,\n nftAmountRecipients,\n undefined, // broadcasterFeeERC20Amount\n true, // sendWithPublicWallet\n overallBatchMinGasPrice,\n originalShieldTxid, // originShieldTxidForSpendabilityOverride\n );\n const transaction = await generateTransact(\n serializedTransactions,\n networkName,\n true, // useDummyProof\n );\n\n const gasEstimate = await getGasEstimate(\n networkName,\n transaction,\n fromWalletAddress,\n true, // sendWithPublicWallet\n false, // isCrossContractCall\n );\n\n return gasEstimateResponse(\n gasEstimate,\n undefined, // broadcasterFeeCommitment\n true, // isGasEstimateWithDummyProof\n );\n } catch (err) {\n throw reportAndSanitizeError(\n gasEstimateForUnprovenUnshieldToOrigin.name,\n err,\n );\n }\n};\n"]}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Local E2E test for Matrix wallet against a local Ganache/Hardhat node.
3
+ *
4
+ * Prerequisites:
5
+ * 1. Start local node: ./ganache.sh (or: npx hardhat node)
6
+ * 2. Deploy contracts: cd matrix-contracts && yarn hardhat deploy:full --network localhost
7
+ * 3. Fill in deployed addresses in wallet/local-deploy.json.example
8
+ * (also set "mnemonic" and "userPrivateKey" matching your local node)
9
+ *
10
+ * Run:
11
+ * cd wallet && npx ts-node -P tsconfig.test.json src/tests/local-e2e.ts
12
+ */
13
+ export {};