@sabaaa1/common 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 (445) hide show
  1. package/.env.example +5 -0
  2. package/.eslintrc.json +18 -0
  3. package/README.md +164 -0
  4. package/copyPackageJson.js +81 -0
  5. package/handleCDNWorkers.js +92 -0
  6. package/jest.config.ts +10 -0
  7. package/package.json +101 -0
  8. package/polyfillWorker.ts +15 -0
  9. package/project.json +32 -0
  10. package/src/API/API.ts +203 -0
  11. package/src/API/admin-calls.ts +8 -0
  12. package/src/API/ai-calls.ts +48 -0
  13. package/src/API/brotherhoodCalls.ts +184 -0
  14. package/src/API/callLifiAPI.ts +41 -0
  15. package/src/API/callMonitor.ts +9 -0
  16. package/src/API/callOdosAPI.ts +89 -0
  17. package/src/API/callOneInchAPI.ts +47 -0
  18. package/src/API/callRelayer.ts +23 -0
  19. package/src/API/checkRisk.ts +7 -0
  20. package/src/API/duneAPI.ts +26 -0
  21. package/src/API/enclaveCalls.ts +23 -0
  22. package/src/API/fetchCommitmentsCache.ts +63 -0
  23. package/src/API/generate-trading-points.ts +77 -0
  24. package/src/API/get-token-data.ts +12 -0
  25. package/src/API/getBridgeProtocols.ts +16 -0
  26. package/src/API/getCoingeckoPrice.ts +59 -0
  27. package/src/API/getGasEstimates.ts +30 -0
  28. package/src/API/getLifiStatus.ts +35 -0
  29. package/src/API/getRelayerURL.ts +27 -0
  30. package/src/API/getServerURL.ts +116 -0
  31. package/src/API/getTokenPrice.ts +39 -0
  32. package/src/API/getWebsiteURL.ts +58 -0
  33. package/src/API/index.ts +19 -0
  34. package/src/API/is-tx-stateless.ts +32 -0
  35. package/src/API/kycCalls.ts +81 -0
  36. package/src/API/leaderboardCalls.ts +32 -0
  37. package/src/API/mysteryBoxesCalls.ts +141 -0
  38. package/src/API/passwordCalls.ts +34 -0
  39. package/src/API/proxyAccountsCalls.ts +40 -0
  40. package/src/API/referralsCalls.ts +52 -0
  41. package/src/API/relayCalls.ts +14 -0
  42. package/src/API/restoreSnapshots.ts +7 -0
  43. package/src/API/rewardsUserCalls.ts +124 -0
  44. package/src/API/send-telegram-callback.ts +17 -0
  45. package/src/API/simulate-batch-tx.ts +19 -0
  46. package/src/API/tenderly.api.ts +96 -0
  47. package/src/API/token-calls.ts +19 -0
  48. package/src/API/weeklyAnalyticCalls.ts +43 -0
  49. package/src/constants/activity.constants.ts +10 -0
  50. package/src/constants/addresses.constants.ts +74 -0
  51. package/src/constants/assets.constants.ts +15 -0
  52. package/src/constants/backend.constants.ts +16 -0
  53. package/src/constants/balance.constants.ts +1 -0
  54. package/src/constants/bridging.constants.ts +5 -0
  55. package/src/constants/chains.constants.ts +194 -0
  56. package/src/constants/coingecko.constants.ts +67 -0
  57. package/src/constants/contracts.constants.ts +106 -0
  58. package/src/constants/conversion.constants.ts +1 -0
  59. package/src/constants/deploy-data/deploy-data-arbMainnet.json +5685 -0
  60. package/src/constants/deploy-data/deploy-data-arcTestnet.json +6157 -0
  61. package/src/constants/deploy-data/deploy-data-avalanche.json +5921 -0
  62. package/src/constants/deploy-data/deploy-data-base.json +5695 -0
  63. package/src/constants/deploy-data/deploy-data-bnbMainnet.json +5921 -0
  64. package/src/constants/deploy-data/deploy-data-ethMainnet.json +5922 -0
  65. package/src/constants/deploy-data/deploy-data-localhost.json +5921 -0
  66. package/src/constants/deploy-data/deploy-data-optimism.json +5687 -0
  67. package/src/constants/deploy-data/deploy-data-polygon.json +5695 -0
  68. package/src/constants/deploy-data/index.ts +21 -0
  69. package/src/constants/events.constants.ts +10 -0
  70. package/src/constants/fees.constants.ts +4 -0
  71. package/src/constants/function-signatures.constants.ts +6 -0
  72. package/src/constants/index.ts +30 -0
  73. package/src/constants/kyc.constants.ts +202 -0
  74. package/src/constants/lifi.constants.ts +1 -0
  75. package/src/constants/mediaUrls.constants.ts +25 -0
  76. package/src/constants/mystery-boxes.constants.ts +402 -0
  77. package/src/constants/oauthUrls.constants.ts +7 -0
  78. package/src/constants/permit2.constants.ts +28 -0
  79. package/src/constants/presale.constants.ts +503 -0
  80. package/src/constants/protocol.constants.ts +65 -0
  81. package/src/constants/reorg-depths.constants.ts +13 -0
  82. package/src/constants/rewards.constants.ts +27 -0
  83. package/src/constants/save-depths.ts +13 -0
  84. package/src/constants/server.constants.ts +233 -0
  85. package/src/constants/tasks.constants.ts +205 -0
  86. package/src/constants/token-data/ERC20Registry.ts +90 -0
  87. package/src/constants/token-data/arbMainnetRegistry.json +1841 -0
  88. package/src/constants/token-data/arbMainnetRegistryFixed.json +1841 -0
  89. package/src/constants/token-data/arcTestnetRegistry.json +436 -0
  90. package/src/constants/token-data/avalancheRegistry.json +729 -0
  91. package/src/constants/token-data/avalancheRegistryFixed.json +729 -0
  92. package/src/constants/token-data/baseRegistry.json +1134 -0
  93. package/src/constants/token-data/baseRegistryFixed.json +1134 -0
  94. package/src/constants/token-data/bnbMainnetRegistry.json +900 -0
  95. package/src/constants/token-data/bnbMainnetRegistryFixed.json +900 -0
  96. package/src/constants/token-data/ethMainnetRegistry.json +4298 -0
  97. package/src/constants/token-data/ethMainnetRegistryFixed.json +4298 -0
  98. package/src/constants/token-data/index.ts +60 -0
  99. package/src/constants/token-data/localhostRegistry.json +2784 -0
  100. package/src/constants/token-data/optimismRegistry.json +701 -0
  101. package/src/constants/token-data/optimismRegistryFixed.json +701 -0
  102. package/src/constants/token-data/polygonRegistry.json +2309 -0
  103. package/src/constants/token-data/polygonRegistryFixed.json +2309 -0
  104. package/src/constants/token-data/popularTokens.constants.ts +11 -0
  105. package/src/constants/token-data/tokenPricing.consts.ts +2 -0
  106. package/src/constants/token.limits.constants.ts +31 -0
  107. package/src/constants/vite.constants.ts +74 -0
  108. package/src/constants/wallet.constants.ts +9 -0
  109. package/src/crypto/babyJub.ts +31 -0
  110. package/src/crypto/index.ts +3 -0
  111. package/src/crypto/poseidon.ts +36 -0
  112. package/src/crypto/preProcessing.ts +20 -0
  113. package/src/data-structures/ApprovalDBs/EventsPublicApprovalsDB.ts +288 -0
  114. package/src/data-structures/ApprovalDBs/index.ts +1 -0
  115. package/src/data-structures/Hinkal/Hinkal.ts +746 -0
  116. package/src/data-structures/Hinkal/IHinkal.ts +315 -0
  117. package/src/data-structures/Hinkal/handleAutoDepositBack.ts +138 -0
  118. package/src/data-structures/Hinkal/hinkalActionFundApproveAndTransact.ts +64 -0
  119. package/src/data-structures/Hinkal/hinkalActionReceive.ts +65 -0
  120. package/src/data-structures/Hinkal/hinkalActionStake.ts +152 -0
  121. package/src/data-structures/Hinkal/hinkalApprove.ts +170 -0
  122. package/src/data-structures/Hinkal/hinkalCheckTokenRegistry.ts +26 -0
  123. package/src/data-structures/Hinkal/hinkalDeposit.ts +199 -0
  124. package/src/data-structures/Hinkal/hinkalGetRecipientInfo.ts +12 -0
  125. package/src/data-structures/Hinkal/hinkalGetZkMeProvider.ts +31 -0
  126. package/src/data-structures/Hinkal/hinkalInsideTransact.ts +190 -0
  127. package/src/data-structures/Hinkal/hinkalMultiSend.ts +26 -0
  128. package/src/data-structures/Hinkal/hinkalPrivateWallet.ts +198 -0
  129. package/src/data-structures/Hinkal/hinkalProoflessDeposit.ts +91 -0
  130. package/src/data-structures/Hinkal/hinkalProxySwap.ts +91 -0
  131. package/src/data-structures/Hinkal/hinkalSignSubAccount.ts +28 -0
  132. package/src/data-structures/Hinkal/hinkalSwap.ts +157 -0
  133. package/src/data-structures/Hinkal/hinkalTransfer.ts +171 -0
  134. package/src/data-structures/Hinkal/hinkalWithdraw.ts +161 -0
  135. package/src/data-structures/Hinkal/index.ts +9 -0
  136. package/src/data-structures/Hinkal/resetMerkleTrees.ts +64 -0
  137. package/src/data-structures/IndexedDB/activity-db.ts +204 -0
  138. package/src/data-structures/IndexedDB/balances-db.ts +97 -0
  139. package/src/data-structures/IndexedDB/contact-db.ts +81 -0
  140. package/src/data-structures/IndexedDB/index.ts +6 -0
  141. package/src/data-structures/IndexedDB/prices-db.ts +89 -0
  142. package/src/data-structures/IndexedDB/private-balances-db.ts +31 -0
  143. package/src/data-structures/IndexedDB/signatures-db.ts +62 -0
  144. package/src/data-structures/MultiThreadedUtxoUtils/MultiThreadedUtxoUtils.ts +152 -0
  145. package/src/data-structures/TokenDBs/AlchemyPublicTokensDB.ts +224 -0
  146. package/src/data-structures/TokenDBs/ArcPublicTokensDB.ts +198 -0
  147. package/src/data-structures/TokenDBs/EventsPublicTokensDB.ts +216 -0
  148. package/src/data-structures/TokenDBs/IPublicTokensDB.ts +7 -0
  149. package/src/data-structures/TokenDBs/PrivateTokensDB.ts +96 -0
  150. package/src/data-structures/TokenDBs/PublicTokensDB.ts +49 -0
  151. package/src/data-structures/TokenDBs/index.ts +4 -0
  152. package/src/data-structures/TokenDBs/token-visibility-db.ts +154 -0
  153. package/src/data-structures/ValueCache/ValueCache.ts +29 -0
  154. package/src/data-structures/ValueCache/index.ts +1 -0
  155. package/src/data-structures/cacheDevices/AttachableMemoryCacheDevice.ts +33 -0
  156. package/src/data-structures/cacheDevices/BaseCacheDevice.ts +30 -0
  157. package/src/data-structures/cacheDevices/FileCacheDevice.ts +59 -0
  158. package/src/data-structures/cacheDevices/LocalStorageCacheDevice.ts +36 -0
  159. package/src/data-structures/cacheDevices/index.ts +2 -0
  160. package/src/data-structures/crypto-keys/decodeUTXO.ts +60 -0
  161. package/src/data-structures/crypto-keys/encryptDecryptUtxo.ts +74 -0
  162. package/src/data-structures/crypto-keys/index.ts +4 -0
  163. package/src/data-structures/crypto-keys/keyUtils.ts +8 -0
  164. package/src/data-structures/crypto-keys/keys.ts +203 -0
  165. package/src/data-structures/custom-token-registry/CustomTokenRegistry.ts +49 -0
  166. package/src/data-structures/event-service/AbstractAccessTokenSnapshotService.ts +142 -0
  167. package/src/data-structures/event-service/AbstractApprovalsSnapshotService.ts +152 -0
  168. package/src/data-structures/event-service/AbstractCommitmentsSnapshotService.ts +116 -0
  169. package/src/data-structures/event-service/AbstractEventService.ts +44 -0
  170. package/src/data-structures/event-service/AbstractNullifierSnapshotService.ts +76 -0
  171. package/src/data-structures/event-service/AbstractSnapshotService.ts +63 -0
  172. package/src/data-structures/event-service/BlockchainEventEmitter.ts +132 -0
  173. package/src/data-structures/event-service/index.ts +7 -0
  174. package/src/data-structures/index.ts +18 -0
  175. package/src/data-structures/merkle-tree/MerkleTree.test.ts +77 -0
  176. package/src/data-structures/merkle-tree/MerkleTree.ts +253 -0
  177. package/src/data-structures/merkle-tree/MerkleTreeIncompleteError.ts +6 -0
  178. package/src/data-structures/merkle-tree/getPatchedAccessTokenMerkleTree.ts +24 -0
  179. package/src/data-structures/merkle-tree/index.ts +3 -0
  180. package/src/data-structures/presale/PresaleContractWrapper.ts +80 -0
  181. package/src/data-structures/presale/index.ts +1 -0
  182. package/src/data-structures/provider-adapter/IProviderAdapter.ts +43 -0
  183. package/src/data-structures/snapshot/ClientAccessTokenSnapshotService.ts +41 -0
  184. package/src/data-structures/snapshot/ClientApprovalsSnapshotService.ts +36 -0
  185. package/src/data-structures/snapshot/ClientCommitmentsSnapshotService.ts +30 -0
  186. package/src/data-structures/snapshot/ClientNullifierSnapshotService.ts +28 -0
  187. package/src/data-structures/snapshot/SnapshotFetcherService.ts +68 -0
  188. package/src/data-structures/snapshot/index.ts +1 -0
  189. package/src/data-structures/token-price-fetcher/TokenChecker.ts +45 -0
  190. package/src/data-structures/token-price-fetcher/index.ts +1 -0
  191. package/src/data-structures/tor/HttpClient.ts +118 -0
  192. package/src/data-structures/tor/TorAdapter.ts +94 -0
  193. package/src/data-structures/tor/TorClient.ts +283 -0
  194. package/src/data-structures/tor/WebSocketDuplex.ts +32 -0
  195. package/src/data-structures/tor/index.ts +3 -0
  196. package/src/data-structures/transactions-manager/history/history.types.ts +14 -0
  197. package/src/data-structures/transactions-manager/index.ts +1 -0
  198. package/src/data-structures/utxo/Utxo.ts +189 -0
  199. package/src/error-handling/customErrors/ErrorWithAmount.ts +8 -0
  200. package/src/error-handling/customErrors/ErrorWithTx.ts +10 -0
  201. package/src/error-handling/customErrors/FeeOverTransactionValueError.ts +16 -0
  202. package/src/error-handling/customErrors/SimulationFailureError.ts +9 -0
  203. package/src/error-handling/customErrors/customErrors.helpers.ts +39 -0
  204. package/src/error-handling/customErrors/index.ts +5 -0
  205. package/src/error-handling/error-codes.constants.ts +214 -0
  206. package/src/error-handling/get-error.message.ts +149 -0
  207. package/src/error-handling/handleErrorRestore.ts +25 -0
  208. package/src/error-handling/index.ts +7 -0
  209. package/src/error-handling/logError.ts +8 -0
  210. package/src/error-handling/logger.ts +21 -0
  211. package/src/error-handling/types.ts +10 -0
  212. package/src/externalABIs/BUSD.ts +516 -0
  213. package/src/externalABIs/BabPassport.json +24 -0
  214. package/src/externalABIs/DAI.ts +331 -0
  215. package/src/externalABIs/ERC1155.json +316 -0
  216. package/src/externalABIs/ERC20.json +297 -0
  217. package/src/externalABIs/ERC20.ts +1 -0
  218. package/src/externalABIs/ERC721.json +205 -0
  219. package/src/externalABIs/GalxePassport.json +23 -0
  220. package/src/externalABIs/IQuoterV2.json +211 -0
  221. package/src/externalABIs/ISwapRouter.json +568 -0
  222. package/src/externalABIs/IUniswapV3Factory.json +207 -0
  223. package/src/externalABIs/IUniswapV3Pool.json +999 -0
  224. package/src/externalABIs/NodeInterfaceABI.json +1 -0
  225. package/src/externalABIs/OptimismGasPriceOracle.json +1 -0
  226. package/src/externalABIs/PoLidoNftAbi.json +307 -0
  227. package/src/externalABIs/SanctionsList.ts +86 -0
  228. package/src/externalABIs/USDC.ts +718 -0
  229. package/src/externalABIs/USDR.ts +343 -0
  230. package/src/externalABIs/USDR3CRV.ts +539 -0
  231. package/src/externalABIs/USDT.ts +390 -0
  232. package/src/externalABIs/UniswapV2PoolAbi.json +66 -0
  233. package/src/externalABIs/WETH.ts +153 -0
  234. package/src/externalABIs/amToken.ts +347 -0
  235. package/src/externalABIs/index.ts +53 -0
  236. package/src/externalABIs/swapAbi.ts +442 -0
  237. package/src/externalABIs/transactionsProver.json +45 -0
  238. package/src/functions/index.ts +16 -0
  239. package/src/functions/kyc/aiPriseHelper.ts +0 -0
  240. package/src/functions/kyc/authentoHelper.ts +44 -0
  241. package/src/functions/kyc/index.ts +3 -0
  242. package/src/functions/kyc/openDefaultPassportWindow.ts +9 -0
  243. package/src/functions/kyc/passportHelper.ts +13 -0
  244. package/src/functions/kyc/zkMeHelper.ts +69 -0
  245. package/src/functions/pre-transaction/constructAdminData.ts +21 -0
  246. package/src/functions/pre-transaction/getExternalSwapAddress.ts +30 -0
  247. package/src/functions/pre-transaction/getFeeStructure.ts +44 -0
  248. package/src/functions/pre-transaction/getFlatFees.ts +88 -0
  249. package/src/functions/pre-transaction/getSignatureDataForTransact.ts +16 -0
  250. package/src/functions/pre-transaction/getVolatileTransferAmount.ts +56 -0
  251. package/src/functions/pre-transaction/index.ts +7 -0
  252. package/src/functions/pre-transaction/interaction-to-action.ts +17 -0
  253. package/src/functions/pre-transaction/merge-with-fee-structure-emporium.ts +50 -0
  254. package/src/functions/pre-transaction/merge-with-fee-structure.ts +35 -0
  255. package/src/functions/pre-transaction/outputApprovalDataProcessing.ts +95 -0
  256. package/src/functions/pre-transaction/outputUtxoProcessing.ts +52 -0
  257. package/src/functions/pre-transaction/process-gas-estimates.ts +36 -0
  258. package/src/functions/pre-transaction/shouldPatchAccessTokenMerkleTree.ts +15 -0
  259. package/src/functions/private-wallet/emporium.helpers.ts +296 -0
  260. package/src/functions/private-wallet/emporium.swap.helpers.ts +284 -0
  261. package/src/functions/private-wallet/index.ts +3 -0
  262. package/src/functions/private-wallet/opProducer.ts +33 -0
  263. package/src/functions/snarkjs/common.snarkjs.ts +377 -0
  264. package/src/functions/snarkjs/constant.ts +490 -0
  265. package/src/functions/snarkjs/constructEmporiumProof.ts +301 -0
  266. package/src/functions/snarkjs/constructGeneralZkProof.ts +281 -0
  267. package/src/functions/snarkjs/generateCircomData.ts +81 -0
  268. package/src/functions/snarkjs/generateZkProof.ts +21 -0
  269. package/src/functions/snarkjs/generateZkProofEnclave.ts +45 -0
  270. package/src/functions/snarkjs/generateZkProofSelf.ts +29 -0
  271. package/src/functions/snarkjs/getOriginalSender.ts +4 -0
  272. package/src/functions/snarkjs/getZKFiles.ts +29 -0
  273. package/src/functions/snarkjs/index.ts +4 -0
  274. package/src/functions/staking/index.ts +78 -0
  275. package/src/functions/utils/addresses.ts +37 -0
  276. package/src/functions/utils/amounts.utils.test.ts +91 -0
  277. package/src/functions/utils/amounts.utils.ts +119 -0
  278. package/src/functions/utils/arraysMatch.ts +4 -0
  279. package/src/functions/utils/cacheDevice.utils.ts +21 -0
  280. package/src/functions/utils/cacheFunctions.ts +154 -0
  281. package/src/functions/utils/caseInsensitive.utils.ts +10 -0
  282. package/src/functions/utils/convertEmporiumOpToCallInfo.ts +19 -0
  283. package/src/functions/utils/convertIntegrationProviderToExternalActionId.ts +14 -0
  284. package/src/functions/utils/create-provider.ts +11 -0
  285. package/src/functions/utils/encodeTokenWithId.ts +4 -0
  286. package/src/functions/utils/encryptInputForEnclave.ts +119 -0
  287. package/src/functions/utils/enum.utils.ts +30 -0
  288. package/src/functions/utils/erc20tokenFunctions.ts +110 -0
  289. package/src/functions/utils/ethers-formatter.utils.ts +32 -0
  290. package/src/functions/utils/evmNetworkFunctions.ts +9 -0
  291. package/src/functions/utils/external-action.utils.ts +15 -0
  292. package/src/functions/utils/fees.utils.ts +26 -0
  293. package/src/functions/utils/get-hinkal-approvals.ts +36 -0
  294. package/src/functions/utils/get-signature-header.ts +5 -0
  295. package/src/functions/utils/getBlockExplorerUrl.ts +14 -0
  296. package/src/functions/utils/getDataFromTransaction.ts +79 -0
  297. package/src/functions/utils/getRecipientInfoFromUserKeys.ts +28 -0
  298. package/src/functions/utils/inLogicMetadata.ts +9 -0
  299. package/src/functions/utils/index.ts +43 -0
  300. package/src/functions/utils/involves-permit2-op.ts +17 -0
  301. package/src/functions/utils/ipfs.ts +74 -0
  302. package/src/functions/utils/is-valid-url.ts +5 -0
  303. package/src/functions/utils/lifi.utils.ts +3 -0
  304. package/src/functions/utils/memoize.utils.ts +23 -0
  305. package/src/functions/utils/merkleTree.utils.ts +27 -0
  306. package/src/functions/utils/mutexes.utils.ts +3 -0
  307. package/src/functions/utils/mystery-box-auction.utils.ts +61 -0
  308. package/src/functions/utils/networks.utils.ts +6 -0
  309. package/src/functions/utils/nftTokenFunctions.ts +25 -0
  310. package/src/functions/utils/nickname.utils.ts +4 -0
  311. package/src/functions/utils/postToOffscreen.ts +6 -0
  312. package/src/functions/utils/prepareHinkal.ts +78 -0
  313. package/src/functions/utils/process.utils.ts +23 -0
  314. package/src/functions/utils/processUseApprovalUtxoData.ts +26 -0
  315. package/src/functions/utils/publicBalance.utils.ts +131 -0
  316. package/src/functions/utils/reloadPage.ts +1 -0
  317. package/src/functions/utils/replaceAddressInCalldata.ts +6 -0
  318. package/src/functions/utils/requireEnv.ts +10 -0
  319. package/src/functions/utils/resolve-sync.utils.ts +40 -0
  320. package/src/functions/utils/rpc-int-encode.ts +7 -0
  321. package/src/functions/utils/serialize.utils.ts +12 -0
  322. package/src/functions/utils/string.utils.ts +92 -0
  323. package/src/functions/utils/time.utils.ts +80 -0
  324. package/src/functions/utils/token-check.utils.ts +12 -0
  325. package/src/functions/utils/trimFieldValues.ts +24 -0
  326. package/src/functions/utils/upToDateState.ts +12 -0
  327. package/src/functions/utils/userAgent.ts +26 -0
  328. package/src/functions/utils/walletBalances.utils.ts +117 -0
  329. package/src/functions/web3/EIP-712.test.ts +302 -0
  330. package/src/functions/web3/EIP-712.ts +243 -0
  331. package/src/functions/web3/etherFunctions.test.ts +129 -0
  332. package/src/functions/web3/etherFunctions.ts +84 -0
  333. package/src/functions/web3/events/balanceChangedCustomHandler.ts +13 -0
  334. package/src/functions/web3/events/balanceChangedHandler.ts +10 -0
  335. package/src/functions/web3/events/getApprovedBalance.ts +154 -0
  336. package/src/functions/web3/events/getInputUtxoAndBalance.ts +305 -0
  337. package/src/functions/web3/events/getInputUtxosEnclave.ts +40 -0
  338. package/src/functions/web3/events/getShieldedBalance.ts +163 -0
  339. package/src/functions/web3/events/getTransactionLogEvents.ts +55 -0
  340. package/src/functions/web3/events/index.ts +7 -0
  341. package/src/functions/web3/events/web3RetrieveEvents.ts +33 -0
  342. package/src/functions/web3/functionCalls/accessTokenCalls.ts +27 -0
  343. package/src/functions/web3/functionCalls/approveToken.ts +180 -0
  344. package/src/functions/web3/functionCalls/approveTokensToHinkal.ts +21 -0
  345. package/src/functions/web3/functionCalls/estimateGasRelayer.ts +40 -0
  346. package/src/functions/web3/functionCalls/getRootHash.ts +7 -0
  347. package/src/functions/web3/functionCalls/inHinkalApprovalCalls.ts +60 -0
  348. package/src/functions/web3/functionCalls/relayFunctions.ts +12 -0
  349. package/src/functions/web3/functionCalls/transactCallDirect.ts +71 -0
  350. package/src/functions/web3/functionCalls/transactCallRelayer.ts +57 -0
  351. package/src/functions/web3/getContractMetadata.ts +43 -0
  352. package/src/functions/web3/getPublicAddressBalance.ts +17 -0
  353. package/src/functions/web3/getTokenHolder.ts +53 -0
  354. package/src/functions/web3/index.ts +9 -0
  355. package/src/functions/web3/lifiAPI.ts +41 -0
  356. package/src/functions/web3/odosAPI.ts +50 -0
  357. package/src/functions/web3/oneInchAPI.ts +47 -0
  358. package/src/functions/web3/runContractFunction.ts +116 -0
  359. package/src/functions/web3/uniswapAPI.ts +156 -0
  360. package/src/index.ts +9 -0
  361. package/src/mutexes/index.ts +1 -0
  362. package/src/mutexes/mutex.ts +3 -0
  363. package/src/providers/EthersProviderAdapter.ts +230 -0
  364. package/src/providers/TorExternalProvider.ts +36 -0
  365. package/src/providers/WagmiProviderAdapter.ts +311 -0
  366. package/src/providers/exportProviers.ts +11 -0
  367. package/src/providers/prepareEthersHinkal.ts +18 -0
  368. package/src/providers/prepareWagmiHinkal.ts +16 -0
  369. package/src/types/API.types.ts +23 -0
  370. package/src/types/ICacheDevice.ts +5 -0
  371. package/src/types/IMultiThreadedUtxoUtils.ts +16 -0
  372. package/src/types/RewardUserEnums.ts +12 -0
  373. package/src/types/TransactionSimulator.types.ts +30 -0
  374. package/src/types/WeeklyAnalytics.types.ts +44 -0
  375. package/src/types/activities.types.ts +90 -0
  376. package/src/types/admin.types.ts +30 -0
  377. package/src/types/all-points.types.ts +8 -0
  378. package/src/types/approvals.types.ts +45 -0
  379. package/src/types/balances.types.ts +20 -0
  380. package/src/types/big-intable.types.ts +3 -0
  381. package/src/types/bridging.types.ts +30 -0
  382. package/src/types/brotherhood-user.types.ts +13 -0
  383. package/src/types/cache.types.ts +42 -0
  384. package/src/types/circom-data.types.ts +120 -0
  385. package/src/types/coingecko.types.ts +216 -0
  386. package/src/types/commitments.types.ts +39 -0
  387. package/src/types/confirmation-request.types.ts +10 -0
  388. package/src/types/contacts.types.ts +6 -0
  389. package/src/types/crypto.types.ts +8 -0
  390. package/src/types/duneAPI.types.ts +9 -0
  391. package/src/types/eip5792.types.ts +31 -0
  392. package/src/types/ethereum-network.types.ts +70 -0
  393. package/src/types/external-action.types.ts +19 -0
  394. package/src/types/fee.types.ts +11 -0
  395. package/src/types/generatePoints.ts +14 -0
  396. package/src/types/hinkal.stake.types.ts +12 -0
  397. package/src/types/hinkal.types.ts +150 -0
  398. package/src/types/index.ts +50 -0
  399. package/src/types/kyc.types.ts +49 -0
  400. package/src/types/merch-order.types.ts +18 -0
  401. package/src/types/message.types.ts +6 -0
  402. package/src/types/mystery-boxes.types.ts +50 -0
  403. package/src/types/new-rewards.type.ts +181 -0
  404. package/src/types/offscreen.types.ts +8 -0
  405. package/src/types/presaleReferral.types.ts +4 -0
  406. package/src/types/proxy.types.ts +11 -0
  407. package/src/types/referral.types.ts +13 -0
  408. package/src/types/relayer.types.ts +16 -0
  409. package/src/types/remote-proof.types.ts +18 -0
  410. package/src/types/rewards.types.ts +53 -0
  411. package/src/types/routing.types.ts +7 -0
  412. package/src/types/sandbox.types.ts +246 -0
  413. package/src/types/session.types.ts +12 -0
  414. package/src/types/signature.types.ts +11 -0
  415. package/src/types/slippage.types.ts +3 -0
  416. package/src/types/snark.types.ts +43 -0
  417. package/src/types/tenderly.api.types.ts +200 -0
  418. package/src/types/token-prices.types.ts +8 -0
  419. package/src/types/token-with-id.types.ts +4 -0
  420. package/src/types/token.types.ts +86 -0
  421. package/src/types/transactions.types.ts +120 -0
  422. package/src/types/wc.types.ts +83 -0
  423. package/src/types/with-id.types.ts +1 -0
  424. package/src/webworker/performTaskWithWorker.ts +50 -0
  425. package/src/webworker/snarkjsWorker/snarkjs.d.ts +2 -0
  426. package/src/webworker/snarkjsWorker/snarkjsWorker.types.ts +18 -0
  427. package/src/webworker/snarkjsWorker/snarkjsWorkerLauncher.ts +19 -0
  428. package/src/webworker/snarkjsWorker/snarkjsWorkerLogic.ts +90 -0
  429. package/src/webworker/utxoWorker/utxoWorker.types.ts +41 -0
  430. package/src/webworker/utxoWorker/utxoWorkerLauncher.ts +19 -0
  431. package/src/webworker/utxoWorker/utxoWorkerLogic.ts +107 -0
  432. package/src/webworker/viteWorkerURL.constant.ts +25 -0
  433. package/src/webworker/worker.registry.ts +11 -0
  434. package/src/webworker/worker.types.ts +35 -0
  435. package/src/webworker/workerErrorHandler.ts +10 -0
  436. package/src/webworker/workerFactory.ts +47 -0
  437. package/src/webworker/workerProxy.ts +88 -0
  438. package/src/webworker/zkProofWorker/zkProofWorker.types.ts +52 -0
  439. package/src/webworker/zkProofWorker/zkProofWorkerLauncher.ts +19 -0
  440. package/src/webworker/zkProofWorker/zkProofWorkerLogic.ts +84 -0
  441. package/tsconfig.json +23 -0
  442. package/tsconfig.lib.json +10 -0
  443. package/tsconfig.spec.json +15 -0
  444. package/vite.config.ts +97 -0
  445. package/vite.config.workers.ts +51 -0
@@ -0,0 +1,305 @@
1
+ import { IHinkal } from '../../../data-structures/Hinkal/IHinkal';
2
+ import { UserKeys } from '../../../data-structures/crypto-keys/keys';
3
+ import { Utxo } from '../../../data-structures/utxo/Utxo';
4
+ import { EncryptedOutputWithSign } from '../../../types/commitments.types';
5
+ import { checkChainOrAddressNotUpdated } from '../../utils/upToDateState';
6
+ import { getHinkalCache, resetCache, setHinkalCache } from '../../utils/cacheFunctions';
7
+ import { type TokenWithId } from '../../../types/token-with-id.types';
8
+ import { caseInsensitiveEqual } from '../../utils/caseInsensitive.utils';
9
+ import { encodeTokenWithId } from '../../utils/encodeTokenWithId';
10
+ import { getInputUtxosEnclave } from './getInputUtxosEnclave';
11
+ import { Logger } from '../../../error-handling/logger';
12
+
13
+ interface IGetInputUtxos {
14
+ hinkal: IHinkal;
15
+ tokenWithId?: TokenWithId | TokenWithId[];
16
+ minInput?: number;
17
+ sliceIfMore6?: boolean;
18
+ tokenId?: number;
19
+ chainId?: number;
20
+ passedShieldedPrivateKey?: string;
21
+ passedShieldedPublicKey?: string;
22
+ ethAddress?: string;
23
+ resetCacheBefore?: boolean;
24
+ allowRemoteDecryption?: boolean;
25
+ ensuredTokensWithId?: TokenWithId[];
26
+ }
27
+
28
+ const getInputUtxosLocally = async (
29
+ hinkal: IHinkal,
30
+ userKeys: UserKeys,
31
+ currentChainId: number,
32
+ ethereumAddress: string,
33
+ shieldedPublicKey: string,
34
+ hinkalOutputs: EncryptedOutputWithSign<boolean>[],
35
+ cachedEncryptedOutputs: EncryptedOutputWithSign<boolean>[],
36
+ lastOutput: string,
37
+ lastOutputIndex: number,
38
+ ) => {
39
+ lastOutputIndex += 1;
40
+ const outputsSlice = hinkalOutputs.slice(lastOutputIndex);
41
+
42
+ const { lastOutput: lastOutputNew, additionalEncryptedOutputs } = await hinkal.utxoUtils.batchProcess(
43
+ outputsSlice,
44
+ lastOutput,
45
+ userKeys,
46
+ );
47
+
48
+ const newEncryptedOutputs = [...cachedEncryptedOutputs, ...additionalEncryptedOutputs];
49
+
50
+ await checkChainOrAddressNotUpdated(hinkal, currentChainId, ethereumAddress);
51
+
52
+ setHinkalCache(
53
+ {
54
+ lastOutput: lastOutputNew,
55
+ encryptedOutputs: newEncryptedOutputs,
56
+ },
57
+ hinkal,
58
+ currentChainId,
59
+ shieldedPublicKey,
60
+ );
61
+
62
+ const resolvedUtxos = await hinkal.utxoUtils.buildBatchProcess(newEncryptedOutputs, userKeys);
63
+ return resolvedUtxos;
64
+ };
65
+
66
+ export const getInputUtxosRemotely = async (
67
+ hinkal: IHinkal,
68
+ userKeys: UserKeys,
69
+ currentChainId: number,
70
+ shieldedPublicKey: string,
71
+ ) => {
72
+ const {
73
+ utxos: resolvedUtxos,
74
+ encryptedOutputs: newEncryptedOutputs,
75
+ lastOutput,
76
+ } = await getInputUtxosEnclave(hinkal, currentChainId, userKeys);
77
+
78
+ setHinkalCache(
79
+ {
80
+ encryptedOutputs: newEncryptedOutputs,
81
+ lastOutput,
82
+ },
83
+ hinkal,
84
+ currentChainId,
85
+ shieldedPublicKey,
86
+ );
87
+
88
+ return resolvedUtxos;
89
+ };
90
+
91
+ export const attemptGetInputUtxosRemotely = async (
92
+ hinkal: IHinkal,
93
+ userKeys: UserKeys,
94
+ currentChainId: number,
95
+ ethereumAddress: string,
96
+ shieldedPublicKey: string,
97
+ hinkalOutputs: EncryptedOutputWithSign<boolean>[],
98
+ cachedEncryptedOutputs: EncryptedOutputWithSign<boolean>[],
99
+ lastOutput: string,
100
+ lastOutputIndex: number,
101
+ ) => {
102
+ try {
103
+ return await getInputUtxosRemotely(hinkal, userKeys, currentChainId, shieldedPublicKey);
104
+ } catch {
105
+ return getInputUtxosLocally(
106
+ hinkal,
107
+ userKeys,
108
+ currentChainId,
109
+ ethereumAddress,
110
+ shieldedPublicKey,
111
+ hinkalOutputs,
112
+ cachedEncryptedOutputs,
113
+ lastOutput,
114
+ lastOutputIndex,
115
+ );
116
+ }
117
+ };
118
+
119
+ const arraifyTokenWithId = (tokenWithId: TokenWithId | TokenWithId[] | undefined) => {
120
+ if (Array.isArray(tokenWithId)) return tokenWithId;
121
+ if (tokenWithId === undefined) return undefined;
122
+ return [tokenWithId];
123
+ };
124
+
125
+ const filterSpentUtxos = async (hinkal: IHinkal, allUtxos: Utxo[], nullifiers: Set<string>) => {
126
+ const inputUtxos = await hinkal.utxoUtils.batchFilterUtxosWithNullifier(allUtxos, nullifiers);
127
+ return inputUtxos;
128
+ };
129
+
130
+ const sortAndPadUtxos = (
131
+ inputUtxos: Utxo[],
132
+ minInput: number,
133
+ sliceIfMore6: boolean,
134
+ shieldedPrivateKey: string,
135
+ erc20TokenAddress: string,
136
+ tokenId: number,
137
+ ) => {
138
+ inputUtxos.sort((utxoOne, utxoTwo) => (utxoOne.amount <= utxoTwo.amount ? 1 : -1)); // descending order
139
+
140
+ while (inputUtxos.length < minInput || (inputUtxos.length > minInput && inputUtxos.length < 6)) {
141
+ inputUtxos.push(new Utxo({ amount: 0n, erc20TokenAddress, shieldedPrivateKey, tokenId }));
142
+
143
+ if (sliceIfMore6) {
144
+ while (inputUtxos.length > 6) {
145
+ inputUtxos.splice(inputUtxos.length - 1);
146
+ }
147
+ }
148
+ }
149
+ };
150
+
151
+ /**
152
+ *
153
+ * @param hinkal instance of the hinkal class
154
+ * @param erc20TokenAddress erc20 token address
155
+ * @param minInput min number of input UTXOs
156
+ * @param sliceIfMore6 max upper bound on input UTXOs controller
157
+ * @returns UTXOs for particular erc20 token address
158
+ */
159
+ export const getInputUtxoAndBalance = async ({
160
+ hinkal,
161
+ chainId = undefined,
162
+ passedShieldedPublicKey = undefined,
163
+ ethAddress = undefined,
164
+ resetCacheBefore = false,
165
+ allowRemoteDecryption = false,
166
+ }: IGetInputUtxos): Promise<{ inputUtxos: Utxo[] }> => {
167
+ if (!hinkal.getCurrentChainId || !hinkal.getSelectedNetwork()) {
168
+ Logger.log('returning empty balance');
169
+ return { inputUtxos: [] };
170
+ }
171
+ const ethereumAddress = ethAddress ?? (await hinkal.getEthereumAddress());
172
+ const currentChainId = chainId ?? hinkal.getCurrentChainId();
173
+ const shieldedPublicKey = passedShieldedPublicKey ?? hinkal.userKeys.getShieldedPublicKey();
174
+ const { encryptedOutputs, nullifiers, userKeys } = hinkal;
175
+ const hinkalOutputs = Array.from(encryptedOutputs);
176
+
177
+ if (resetCacheBefore) {
178
+ resetCache(hinkal, currentChainId, shieldedPublicKey);
179
+ }
180
+
181
+ // eslint-disable-next-line prefer-const
182
+ let { encryptedOutputs: cachedEncryptedOutputs, lastOutput } = getHinkalCache(
183
+ hinkal,
184
+ currentChainId,
185
+ shieldedPublicKey,
186
+ );
187
+
188
+ await checkChainOrAddressNotUpdated(hinkal, currentChainId, ethereumAddress);
189
+
190
+ const lastOutputExist = lastOutput !== '';
191
+ const lastOutputIndex = hinkalOutputs.findIndex((output: EncryptedOutputWithSign) => {
192
+ return output.value === lastOutput;
193
+ });
194
+
195
+ // case 1: we already decrypted something, there may be some new outputs to decrypt
196
+ const case1 = lastOutputIndex > -1;
197
+ // case 2: we never decrypted anything
198
+ const case2 = !lastOutputExist && lastOutputIndex === -1;
199
+ // case 3: data in the cache is more up to date than last output: we do nothing
200
+ // const case3 = lastOutputExist && lastOutputIndex === -1;
201
+
202
+ const forceReadFromCache = hinkal.areMerkleTreeUpdatesDisabled();
203
+
204
+ const decryptLocally = !forceReadFromCache && (case1 || (!allowRemoteDecryption && case2));
205
+ const decryptRemotely = !forceReadFromCache && allowRemoteDecryption && case2;
206
+ const useCache = !decryptLocally && !decryptRemotely; // case 3 + forceReadFromCache
207
+
208
+ let allUtxos: Utxo[] = [];
209
+
210
+ // decrypt locally block
211
+ if (decryptLocally) {
212
+ allUtxos = await getInputUtxosLocally(
213
+ hinkal,
214
+ userKeys,
215
+ currentChainId,
216
+ ethereumAddress,
217
+ shieldedPublicKey,
218
+ hinkalOutputs,
219
+ cachedEncryptedOutputs,
220
+ lastOutput,
221
+ lastOutputIndex,
222
+ );
223
+ } else if (decryptRemotely) {
224
+ allUtxos = await attemptGetInputUtxosRemotely(
225
+ hinkal,
226
+ userKeys,
227
+ currentChainId,
228
+ ethereumAddress,
229
+ shieldedPublicKey,
230
+ hinkalOutputs,
231
+ cachedEncryptedOutputs,
232
+ lastOutput,
233
+ lastOutputIndex,
234
+ );
235
+ } else if (useCache) {
236
+ allUtxos = await hinkal.utxoUtils.buildBatchProcess(cachedEncryptedOutputs, userKeys);
237
+ }
238
+
239
+ await checkChainOrAddressNotUpdated(hinkal, currentChainId, ethereumAddress);
240
+
241
+ const inputUtxos = await filterSpentUtxos(hinkal, allUtxos, nullifiers);
242
+
243
+ return { inputUtxos };
244
+ };
245
+
246
+ export const getInputUtxoAndBalancePerToken = async ({
247
+ hinkal,
248
+ tokenWithId,
249
+ minInput = 2,
250
+ sliceIfMore6 = true,
251
+ chainId = undefined,
252
+ passedShieldedPrivateKey = undefined,
253
+ passedShieldedPublicKey = undefined,
254
+ ethAddress = undefined,
255
+ resetCacheBefore = false,
256
+ ensuredTokensWithId,
257
+ }: IGetInputUtxos) => {
258
+ const shieldedPrivateKey = passedShieldedPrivateKey ?? hinkal.userKeys.getShieldedPrivateKey();
259
+
260
+ const { inputUtxos } = await getInputUtxoAndBalance({
261
+ hinkal,
262
+ minInput,
263
+ sliceIfMore6,
264
+ chainId,
265
+ passedShieldedPrivateKey,
266
+ passedShieldedPublicKey,
267
+ ethAddress,
268
+ resetCacheBefore,
269
+ });
270
+
271
+ const tokensWithId = arraifyTokenWithId(tokenWithId);
272
+
273
+ const inputUtxosPerToken = new Map<string, Utxo[]>();
274
+
275
+ inputUtxos.forEach((item) => {
276
+ if (
277
+ tokensWithId &&
278
+ !tokensWithId.some(
279
+ (currentTokenWithId) =>
280
+ caseInsensitiveEqual(currentTokenWithId.erc20TokenAddress, item.erc20TokenAddress) &&
281
+ currentTokenWithId.tokenId === item.tokenId,
282
+ )
283
+ )
284
+ return;
285
+
286
+ const utxoKey = encodeTokenWithId({ erc20TokenAddress: item.erc20TokenAddress, tokenId: item.tokenId });
287
+
288
+ const utxoArray = inputUtxosPerToken.get(utxoKey) ?? [];
289
+ inputUtxosPerToken.set(utxoKey, [...utxoArray, item]);
290
+ });
291
+
292
+ ensuredTokensWithId?.forEach((item) => {
293
+ const utxoKey = encodeTokenWithId({ erc20TokenAddress: item.erc20TokenAddress, tokenId: item.tokenId });
294
+ inputUtxosPerToken.set(utxoKey, inputUtxosPerToken.get(utxoKey) ?? []);
295
+ });
296
+
297
+ // eslint-disable-next-line no-restricted-syntax
298
+ for (const [key, value] of inputUtxosPerToken) {
299
+ const erc20TokenAddress = key.split('-')[0];
300
+ const tokenId = Number(key.split('-')[1]);
301
+ sortAndPadUtxos(value, minInput, sliceIfMore6, shieldedPrivateKey, erc20TokenAddress, tokenId);
302
+ }
303
+
304
+ return inputUtxosPerToken;
305
+ };
@@ -0,0 +1,40 @@
1
+ import { ethers } from 'ethers';
2
+ import { type IHinkal } from '../../../data-structures/Hinkal/IHinkal';
3
+ import { Utxo } from '../../../data-structures/utxo/Utxo';
4
+ import { UserKeys } from '../../../data-structures/crypto-keys/keys';
5
+ import { makeEnclaveHandshakeAndEncryptUint8Array } from '../../utils/encryptInputForEnclave';
6
+
7
+ export const getInputUtxosEnclave = async (hinkal: IHinkal, chainId: number, userKeys: UserKeys) => {
8
+ const shieldedPrivateKey = userKeys.getShieldedPrivateKey();
9
+ const { privateKey, publicKey } = UserKeys.getEncryptionKeyPair(shieldedPrivateKey);
10
+
11
+ const packResult = ethers.utils.solidityPack(
12
+ ['uint256', 'uint256', 'uint256'],
13
+ [publicKey, privateKey, shieldedPrivateKey],
14
+ );
15
+
16
+ const data = ethers.utils.arrayify(packResult);
17
+
18
+ // encrypt data for enclave, results are in base64
19
+ const { keyCiphertext, inputCiphertext } = await makeEnclaveHandshakeAndEncryptUint8Array(data);
20
+
21
+ const { utxos, lastOutput, encryptedOutputs } = await hinkal
22
+ .getAPI()
23
+ .decryptUtxoEnclaveCall(chainId, keyCiphertext, inputCiphertext);
24
+
25
+ const deserializedUtxos = utxos.map(
26
+ (item) =>
27
+ new Utxo({
28
+ ...item,
29
+ amount: BigInt(item.amount),
30
+ randomization: item.randomization ? BigInt(item.randomization) : undefined,
31
+ shieldedPrivateKey,
32
+ }),
33
+ );
34
+
35
+ return {
36
+ utxos: deserializedUtxos,
37
+ encryptedOutputs,
38
+ lastOutput,
39
+ };
40
+ };
@@ -0,0 +1,163 @@
1
+ import { ERC20Token, TokenBalance } from '../../../types/token.types';
2
+ import { getERC20Token, getErc20TokensForChain } from '../../utils/erc20tokenFunctions';
3
+ import { caseInsensitiveEqual } from '../../utils/caseInsensitive.utils';
4
+ import { Utxo } from '../../../data-structures/utxo/Utxo';
5
+ import { IHinkal } from '../../../data-structures/Hinkal/IHinkal';
6
+ import { getAmountWithPrecision } from '../etherFunctions';
7
+ import { ErrorWithAmount } from '../../../error-handling/customErrors';
8
+ import { getInputUtxoAndBalance, getInputUtxoAndBalancePerToken } from './getInputUtxoAndBalance';
9
+ import { privateTokensDB } from '../../../data-structures/TokenDBs/PrivateTokensDB';
10
+ import { isExtension } from '../../../constants/vite.constants';
11
+ import { encodeTokenWithId } from '../../utils/encodeTokenWithId';
12
+ import { balanceFetchingMutex } from '../../utils/mutexes.utils';
13
+
14
+ /**
15
+ *
16
+ * @param UserKeys to access user's encryption keys
17
+ * @returns shielded balance
18
+ */
19
+ export const getShieldedBalance = async (
20
+ hinkal: IHinkal,
21
+ chainId: number,
22
+ passedShieldedPrivateKey: string,
23
+ passedShieldedPublicKey: string,
24
+ ethAddress: string,
25
+ resetCacheBefore = false,
26
+ allowRemoteDecryption?: boolean,
27
+ updateTokensListBefore = false,
28
+ ): Promise<Map<string, TokenBalance>> => {
29
+ return balanceFetchingMutex.runExclusive(async () => {
30
+ const { inputUtxos } = await getInputUtxoAndBalance({
31
+ hinkal,
32
+ sliceIfMore6: false,
33
+ chainId,
34
+ passedShieldedPrivateKey,
35
+ passedShieldedPublicKey,
36
+ ethAddress,
37
+ resetCacheBefore,
38
+ allowRemoteDecryption,
39
+ });
40
+
41
+ if (updateTokensListBefore && isExtension) {
42
+ await privateTokensDB.fetchAndUpdatePrivateTokens(
43
+ inputUtxos.map((utxo) => utxo.erc20TokenAddress),
44
+ chainId,
45
+ ethAddress,
46
+ );
47
+ }
48
+
49
+ const tokenRegistry = isExtension
50
+ ? await privateTokensDB.getPrivateTokens(chainId, ethAddress)
51
+ : getErc20TokensForChain(chainId);
52
+
53
+ // Handle volatile token by patching the erc20TokenAddress with approriate share token address.
54
+ // TODO: Refactor address patching logic into Token Modal
55
+
56
+ const balances: TokenBalance[] = tokenRegistry.map((token) => ({
57
+ token,
58
+ balance: inputUtxos.reduce((prev, currentUtxo) => {
59
+ // TODO: Refactor address patching logic into Token Modal
60
+ const tokenAddress = token.erc20TokenAddress;
61
+ if (caseInsensitiveEqual(tokenAddress, currentUtxo.erc20TokenAddress)) {
62
+ return prev + currentUtxo.amount;
63
+ }
64
+ return prev;
65
+ }, 0n),
66
+ timestamp: inputUtxos.filter((currentUtxo) =>
67
+ caseInsensitiveEqual(currentUtxo.erc20TokenAddress, token.erc20TokenAddress),
68
+ )[0]?.timeStamp,
69
+ nfts: inputUtxos
70
+ .filter(
71
+ (currentUtxo) =>
72
+ caseInsensitiveEqual(currentUtxo.erc20TokenAddress, token.erc20TokenAddress) && currentUtxo.tokenId !== 0,
73
+ )
74
+ .map((currentUtxo) => ({ tokenId: currentUtxo.tokenId, timestamp: currentUtxo.timeStamp })),
75
+ }));
76
+
77
+ const balancesMap = new Map<string, TokenBalance>();
78
+
79
+ balances.forEach((balance) => {
80
+ balancesMap.set(balance.token.erc20TokenAddress.toLowerCase(), balance);
81
+ });
82
+
83
+ return balancesMap;
84
+ });
85
+ };
86
+
87
+ /**
88
+ *
89
+ * @param hinkal hinkal instance to get userKeys
90
+ * @param erc20Addresses array of erc20 tokens
91
+ * @param amountChanges array of token amounts
92
+ * @param maxInput to pad until maxInput number
93
+ * @returns return padded UTXOs for every erc20 token
94
+ */
95
+ export const addPaddingToUtxos = async (
96
+ hinkal: IHinkal,
97
+ erc20Addresses: string[],
98
+ amountChanges: bigint[],
99
+ maxInput = 6,
100
+ tokenIds: number[] = erc20Addresses.map(() => 0),
101
+ forceEmptyUtxos = false,
102
+ ) => {
103
+ const { userKeys } = hinkal;
104
+ const inputUtxosArrayPadded: Utxo[][] = [];
105
+ const inputUtxosArrayToBePadded: Utxo[][] = [];
106
+
107
+ const inputUtxosPerToken = await getInputUtxoAndBalancePerToken({
108
+ hinkal,
109
+ sliceIfMore6: false,
110
+ ensuredTokensWithId: erc20Addresses.map((_, i) => ({ erc20TokenAddress: erc20Addresses[i], tokenId: tokenIds[i] })),
111
+ allowRemoteDecryption: false,
112
+ });
113
+
114
+ let maxUtxoNum = 0;
115
+ for (let i = 0; i < erc20Addresses.length; i += 1) {
116
+ if (forceEmptyUtxos === false) {
117
+ // eslint-disable-next-line no-await-in-loop
118
+ const inputUtxos =
119
+ inputUtxosPerToken.get(encodeTokenWithId({ erc20TokenAddress: erc20Addresses[i], tokenId: tokenIds[i] })) ?? [];
120
+ // this should never happen
121
+ // if it does then it is bug in the code
122
+ if (!inputUtxos) throw new Error('Missing utxos for token');
123
+ maxUtxoNum = Math.max(inputUtxos.length, maxUtxoNum);
124
+ inputUtxosArrayToBePadded.push(inputUtxos);
125
+ } else {
126
+ inputUtxosArrayToBePadded.push([]);
127
+ }
128
+ }
129
+ // Case of 2 dimesional circuit
130
+ if (maxUtxoNum === 2) return inputUtxosArrayToBePadded;
131
+
132
+ // Case of 6 dimensional circuit => adding empty UTXOs if needed: maxUtxoNum >= maxInput
133
+
134
+ inputUtxosArrayToBePadded.forEach((utxos: Utxo[], i) => {
135
+ if (utxos.length > maxInput) {
136
+ const firstSixUtxos = utxos.slice(0, maxInput);
137
+ const firstSixAmount = firstSixUtxos.reduce((prev, current) => prev + current.amount, 0n);
138
+ if (amountChanges[i] < 0n && firstSixAmount < -amountChanges[i]) {
139
+ const token = getERC20Token(erc20Addresses[i], hinkal.getCurrentChainId()) as ERC20Token;
140
+ const amountInToken = Number(getAmountWithPrecision(firstSixAmount, token, 2));
141
+ const message = `Unfortunately your transaction did not go through due to UTXOs limitations. \n Please try again with ${token.symbol}`;
142
+ throw new ErrorWithAmount(amountInToken, message);
143
+ }
144
+ inputUtxosArrayPadded.push(firstSixUtxos);
145
+ } else if (utxos.length <= maxInput) {
146
+ const tempUtxosStorage = [...utxos];
147
+ let diff = maxInput - utxos.length;
148
+ while (diff > 0) {
149
+ diff -= 1;
150
+ tempUtxosStorage.push(
151
+ new Utxo({
152
+ amount: 0n,
153
+ erc20TokenAddress: erc20Addresses[i],
154
+ shieldedPrivateKey: userKeys.getShieldedPrivateKey(),
155
+ tokenId: tokenIds[i],
156
+ }),
157
+ );
158
+ }
159
+ inputUtxosArrayPadded.push(tempUtxosStorage);
160
+ }
161
+ });
162
+ return inputUtxosArrayPadded;
163
+ };
@@ -0,0 +1,55 @@
1
+ import { networkRegistry } from '../../../constants';
2
+ import { ethers } from 'ethers';
3
+ import { Fragment, JsonFragment } from '@ethersproject/abi';
4
+ import { createTorRpcProvider } from '../../utils';
5
+
6
+ const decodeEventWithABI = (
7
+ log: ethers.providers.Log,
8
+ contractABI: string | readonly (string | Fragment | JsonFragment)[],
9
+ ) => {
10
+ const int = new ethers.utils.Interface(contractABI);
11
+ try {
12
+ const parsedLog = int.parseLog(log);
13
+ return {
14
+ name: parsedLog.name,
15
+ args: parsedLog.args,
16
+ };
17
+ } catch (error) {
18
+ console.warn('Could not decode log');
19
+ return null;
20
+ }
21
+ };
22
+
23
+ export async function getTransactionLogEvents(
24
+ chainId: number,
25
+ txHash: string,
26
+ contractAddress: string,
27
+ contractABI: string | readonly (string | Fragment | JsonFragment)[],
28
+ ) {
29
+ try {
30
+ const providerUrl = networkRegistry[chainId].fetchRpcUrl;
31
+ if (!providerUrl) throw new Error('RPC URL not found for the specified chain ID');
32
+ const provider = createTorRpcProvider(providerUrl);
33
+
34
+ const receipt = await provider.getTransactionReceipt(txHash);
35
+
36
+ if (!receipt) throw new Error('Transaction receipt not found');
37
+ if (receipt.status !== 1) throw new Error('Transaction failed');
38
+
39
+ const events = receipt.logs
40
+ .filter((log) => log.address.toLowerCase() === contractAddress.toLowerCase())
41
+ .map((log) => decodeEventWithABI(log, contractABI))
42
+ .filter((log): log is { name: string; args: ethers.utils.Result } => log !== null);
43
+
44
+ return {
45
+ transactionHash: receipt.transactionHash,
46
+ from: receipt.from,
47
+ to: receipt.to,
48
+ blockNumber: receipt.blockNumber,
49
+ events,
50
+ };
51
+ } catch (error) {
52
+ console.error('Error retrieving transaction events:', error);
53
+ throw error;
54
+ }
55
+ }
@@ -0,0 +1,7 @@
1
+ export * from './getInputUtxoAndBalance';
2
+ export * from './getShieldedBalance';
3
+ export * from './web3RetrieveEvents';
4
+ export * from './balanceChangedHandler';
5
+ export * from './balanceChangedCustomHandler';
6
+ export * from './getApprovedBalance';
7
+ export * from './getTransactionLogEvents';
@@ -0,0 +1,33 @@
1
+ import { Contract, ethers } from 'ethers';
2
+
3
+ /**
4
+ * to get contract events
5
+ * @param eventName to retrieve specific events
6
+ * @param eventArgs event arguments
7
+ * @returns array of the specific events
8
+ */
9
+ export const retrieveEvents = async (hinkalContract: ethers.Contract, eventName: string, ...eventArgs: unknown[]) => {
10
+ if (!hinkalContract.filters?.[eventName]) throw new Error('Contract Event not found');
11
+
12
+ // filter for events
13
+ const events = await hinkalContract.queryFilter(hinkalContract.filters?.[eventName](...eventArgs), 39561411);
14
+
15
+ return events;
16
+ };
17
+
18
+ /**
19
+ *
20
+ * @param web3Provider instance to get hinkal contract
21
+ * @returns array of deposit timestamps in JS new Date format
22
+ */
23
+ export const getDepositEvents = async (hinkalContract: Contract, erc20TokenAddress: string) => {
24
+ const depositEvents = await retrieveEvents(hinkalContract, 'NewTransaction');
25
+ const tokenSpecificDeposits = depositEvents
26
+ .map((event) => {
27
+ if (event.args![1] === erc20TokenAddress && BigInt(event.args![2]) >= 0n) return new Date(event.args![0] * 1000);
28
+ return new Date(0);
29
+ })
30
+ .filter((e) => e.getTime() !== 0);
31
+
32
+ return tokenSpecificDeposits;
33
+ };
@@ -0,0 +1,27 @@
1
+ /* eslint-disable @typescript-eslint/dot-notation */
2
+ import { ethers } from 'ethers';
3
+ import { IHinkal } from '../../../data-structures/Hinkal/IHinkal';
4
+ import { ContractType, SignatureData } from '../../../types';
5
+
6
+ export const checkHinkalAccessToken = async (hinkal: IHinkal) => {
7
+ const accessToken = hinkal.getContractWithFetcher(ContractType.AccessTokenContract); // as AccessToken;
8
+
9
+ const tx = await accessToken.functions['hasToken'](hinkal.userKeys.getAccessKey());
10
+ return tx[0];
11
+ };
12
+
13
+ export const mintAccessToken = async (
14
+ hinkal: IHinkal,
15
+ signatureData: SignatureData,
16
+ fromWallet?: boolean,
17
+ ): Promise<ethers.ContractTransaction> => {
18
+ const accessToken = hinkal.getContractWithSigner(ContractType.AccessTokenContract); // as AccessToken;
19
+
20
+ const overrides = {
21
+ value: 0n,
22
+ ...(fromWallet && { type: 0 }),
23
+ };
24
+
25
+ const tx = await accessToken['addToken'](signatureData, overrides);
26
+ return tx;
27
+ };