@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,11 @@
1
+ export const PopularTokenSymbols = [
2
+ { symbol: 'hETH' },
3
+ { symbol: 'BNB' },
4
+ { symbol: 'DAI' },
5
+ { symbol: 'ETH' },
6
+ { symbol: 'MATIC' },
7
+ { symbol: 'USDC' },
8
+ { symbol: 'USDT' },
9
+ { symbol: 'WETH' },
10
+ { symbol: 'stETH' },
11
+ ];
@@ -0,0 +1,2 @@
1
+ export const urlForBeefyVaultTokens = 'https://api.beefy.finance/vaults';
2
+ export const urlForBeefyVaultLpTokens = 'https://api.beefy.finance/lps';
@@ -0,0 +1,31 @@
1
+ import { getAmountInWei } from '../functions/web3/etherFunctions';
2
+ import { getERC20TokenBySymbol } from '../functions/utils/erc20tokenFunctions';
3
+ import { chainIds } from './chains.constants';
4
+
5
+ export const TOKEN_LIMITS: Record<number, Record<string, string>> = {
6
+ [chainIds.optimism]: {
7
+ ETH: '0.5',
8
+ WETH: '0.5',
9
+ rETH: '0.5',
10
+ USDC: '1000',
11
+ 'USDC.e': '1000',
12
+ USDT: '1000',
13
+ DAI: '1000',
14
+ WBTC: '0.0125',
15
+ },
16
+ };
17
+
18
+ export const getTokensLimits = (chainId: number): { erc20Addresses: string[]; limits: bigint[] } => {
19
+ if (!(chainId in TOKEN_LIMITS)) return { erc20Addresses: [], limits: [] };
20
+ const limitsObject = Object.entries(TOKEN_LIMITS[chainId]);
21
+ const erc20Addresses: string[] = [];
22
+ const limits: bigint[] = [];
23
+ for (let i = 0; i < limitsObject.length; i += 1) {
24
+ const [symbol, limit] = limitsObject[i];
25
+ const token = getERC20TokenBySymbol(symbol, chainId);
26
+ if (!token) throw Error('no token in getTokenLimit');
27
+ erc20Addresses.push(token.erc20TokenAddress);
28
+ limits.push(getAmountInWei(token, limit));
29
+ }
30
+ return { erc20Addresses, limits };
31
+ };
@@ -0,0 +1,74 @@
1
+ /* eslint-disable @typescript-eslint/dot-notation */
2
+ /* eslint-disable global-require */
3
+ /* eslint-disable import/no-extraneous-dependencies */
4
+ /* eslint-disable @typescript-eslint/no-var-requires */
5
+
6
+ import { toEnumValue } from '../functions/utils/enum.utils';
7
+
8
+ /* eslint-disable @typescript-eslint/naming-convention */
9
+ export enum DEPLOYMENT_MODE {
10
+ DEVELOPMENT = 'development',
11
+ PLAYGROUND = 'playground',
12
+ PRODUCTION = 'production',
13
+ STAGING = 'staging',
14
+ }
15
+
16
+ const URLS = {
17
+ [DEPLOYMENT_MODE.DEVELOPMENT]: ['localhost', '192.', '127.'],
18
+ [DEPLOYMENT_MODE.PLAYGROUND]: ['playground'],
19
+ [DEPLOYMENT_MODE.STAGING]: ['working', 'staging'],
20
+ };
21
+
22
+ declare const WALLET_DEPLOYMENT_MODE: DEPLOYMENT_MODE; // passed from vite.config.ts as hardcoded value
23
+
24
+ const isServer = typeof process !== 'undefined' && process?.release?.name === 'node';
25
+ export const isNode = typeof process !== 'undefined' && process.versions != null && process.versions.node != null;
26
+ export const isSandbox = !isNode && typeof window !== 'undefined' && window.origin === 'null';
27
+ // @ts-expect-error webpack check is done like this
28
+ export const isWebpack = typeof __webpack_require__ !== 'undefined';
29
+ export const isExtension = typeof window !== 'undefined' && window?.location?.protocol === 'chrome-extension:';
30
+
31
+ function includesAny(str: string, substrings: string[]) {
32
+ return substrings.some((substring) => str.includes(substring));
33
+ }
34
+
35
+ const getDeploymentModeOnServer = (): DEPLOYMENT_MODE | undefined => {
36
+ require('dotenv').config({
37
+ // allow overriding .env file path, see startServer.sh script for explenation on why it is needed
38
+ path: 'DOTENV_OVERRIDE' in process.env ? process.env['DOTENV_OVERRIDE'] : undefined,
39
+ });
40
+ const deploymentMode = toEnumValue(DEPLOYMENT_MODE, process.env['DEPLOYMENT_MODE']);
41
+ return deploymentMode || DEPLOYMENT_MODE.DEVELOPMENT; // default to development if not set
42
+ };
43
+
44
+ const getDeploymentMode = (): DEPLOYMENT_MODE | undefined => {
45
+ if (!isServer && typeof window === 'undefined') return undefined; // on client but no window - just files being loaded into memory most likely
46
+
47
+ // case for server: server, relayer, staging, data server
48
+ if (isServer) return getDeploymentModeOnServer();
49
+
50
+ // case of chrome extension
51
+ if (window?.location?.protocol === 'chrome-extension:') {
52
+ const envDeploymentMode = toEnumValue(DEPLOYMENT_MODE, WALLET_DEPLOYMENT_MODE);
53
+ if (envDeploymentMode) {
54
+ return envDeploymentMode;
55
+ }
56
+ return DEPLOYMENT_MODE.STAGING;
57
+ }
58
+
59
+ // case of browser window: client, onboarding, rewards
60
+ const url = window?.location?.host;
61
+ if (includesAny(url, URLS[DEPLOYMENT_MODE.DEVELOPMENT])) return DEPLOYMENT_MODE.DEVELOPMENT;
62
+ if (includesAny(url, URLS[DEPLOYMENT_MODE.PLAYGROUND])) return DEPLOYMENT_MODE.PLAYGROUND;
63
+ if (includesAny(url, URLS[DEPLOYMENT_MODE.STAGING])) return DEPLOYMENT_MODE.STAGING;
64
+ return DEPLOYMENT_MODE.PRODUCTION;
65
+ };
66
+
67
+ export const deploymentMode = getDeploymentMode();
68
+
69
+ export const isDevelopment = deploymentMode === DEPLOYMENT_MODE.DEVELOPMENT;
70
+ export const isPlayground = deploymentMode === DEPLOYMENT_MODE.PLAYGROUND;
71
+ export const isStaging = deploymentMode === DEPLOYMENT_MODE.STAGING;
72
+ export const isNotProduction = isStaging || isDevelopment || isPlayground;
73
+
74
+ export const isNotClientProduction = isNotProduction || (isServer && deploymentMode === DEPLOYMENT_MODE.PRODUCTION);
@@ -0,0 +1,9 @@
1
+ export const UNSUPPORTED_WALLETS_WALLETCONNECT_NAMES = {
2
+ mpcVault: 'MPCVault - Multisig Wallet',
3
+ utila: 'UtilaWallet',
4
+ };
5
+
6
+ // Utila may need to be added here in the future, but it cannot be tested currently due to its institutional nature
7
+ export const UNSUPPORTED_WALLET_IDS = {
8
+ mpcVault: 'com.mpcvault.console',
9
+ };
@@ -0,0 +1,31 @@
1
+ // @ts-ignore
2
+ import { buildBabyjub } from 'circomlibjs-hinkal-fork';
3
+
4
+ class JubHolder {
5
+ private babyjub: any = undefined;
6
+
7
+ public async init() {
8
+ if (this.babyjub) return;
9
+ this.babyjub = await buildBabyjub();
10
+ }
11
+
12
+ public getJub() {
13
+ return this.babyjub;
14
+ }
15
+ }
16
+
17
+ export const jubHolder = new JubHolder();
18
+
19
+ export const babyJubInstance = () => {
20
+ return jubHolder.getJub();
21
+ };
22
+
23
+ export type JubPoint = [bigint, bigint];
24
+
25
+ export interface BabyJubType {
26
+ mulPointEscalar: (point: [Uint8Array, Uint8Array], s: bigint) => [Uint8Array, Uint8Array];
27
+ F: {
28
+ toString: (arr: Uint8Array) => string;
29
+ };
30
+ Base8: [Uint8Array, Uint8Array];
31
+ }
@@ -0,0 +1,3 @@
1
+ export * from './poseidon';
2
+ export * from './babyJub';
3
+ export * from './preProcessing';
@@ -0,0 +1,36 @@
1
+ import { BigNumber } from 'ethers';
2
+ import { toBigInt } from '../functions/utils/amounts.utils';
3
+ // @ts-ignore
4
+ import { buildPoseidon } from 'circomlibjs-hinkal-fork';
5
+
6
+ class PoseidonHolder {
7
+ private poseidon: any = undefined;
8
+
9
+ public async init() {
10
+ if (this.poseidon) return;
11
+ this.poseidon = await buildPoseidon();
12
+ }
13
+
14
+ public getPoseidon() {
15
+ return this.poseidon;
16
+ }
17
+ }
18
+
19
+ export const poseidonHolder = new PoseidonHolder();
20
+
21
+ export function poseidonFunction<T = any>(...args: T[]) {
22
+ const poseidon = poseidonHolder.getPoseidon();
23
+ return toBigInt(poseidon.F.toString(poseidon(args)));
24
+ }
25
+
26
+ /**
27
+ * hashing algorithm implementation
28
+ * @param args rest parameter to take unlimited number of arguments
29
+ * @returns poseidon hash in base 16
30
+ */
31
+ export const poseidonHash = (...args: unknown[]) => {
32
+ const poseidon = poseidonHolder.getPoseidon();
33
+ return BigNumber.from(poseidon.F.toString(poseidon([...args]))).toHexString();
34
+ };
35
+
36
+ export type PoseidonHasher = (...args: unknown[]) => string;
@@ -0,0 +1,20 @@
1
+ import { jubHolder } from './babyJub';
2
+ import { poseidonHolder } from './poseidon';
3
+ import sodium from 'libsodium-wrappers'; // added * as for jest
4
+ import process from 'process';
5
+ import { Buffer } from 'buffer';
6
+
7
+ // ToDo: For corner cases will be good to implement somthing like .ready folw or event emmeter here to fix potential async based issues
8
+ export const preProcessing = async () => {
9
+ // eslint-disable-next-line no-restricted-globals
10
+ if (typeof window !== 'undefined' || typeof self !== 'undefined') {
11
+ if (typeof window !== 'undefined') {
12
+ window.global = window;
13
+ }
14
+ // We need to inject it to global scopre before we import snarkjs
15
+ globalThis.Buffer = Buffer;
16
+ globalThis.process = process;
17
+ }
18
+
19
+ await Promise.all([sodium.ready, poseidonHolder.init(), jubHolder.init()]);
20
+ };
@@ -0,0 +1,288 @@
1
+ import { ethers } from 'ethers';
2
+ import { get, update } from 'idb-keyval';
3
+ import { Mutex } from 'async-mutex';
4
+ import { ALCHEMY_API_KEY, chainIds, networkRegistry } from '../../constants/chains.constants';
5
+ import { Logger } from '../../error-handling/logger';
6
+ import { getStateKey } from '../../functions/utils/string.utils';
7
+ import { StorageKeys } from '../../types/cache.types';
8
+ import { httpClient } from '../tor/HttpClient';
9
+ import { API } from '../../API/API';
10
+ import {
11
+ AlchemyBatchRequest,
12
+ AlchemyBatchResponse,
13
+ ApprovalPair,
14
+ ApprovalRequestMetadata,
15
+ RevokeType,
16
+ TokenApproval,
17
+ } from '../../types/approvals.types';
18
+ import { isNFTToken } from '../../functions/utils/erc20tokenFunctions';
19
+ import { createTorRpcProvider } from '../../functions/utils/create-provider';
20
+ import { EVENTS_INITIAL_BLOCKS } from '../../constants/events.constants';
21
+ import { ERC20Token } from '../../types/token.types';
22
+ import { caseInsensitiveEqual } from '../../functions/utils/caseInsensitive.utils';
23
+ import { zeroAddress } from '../../constants/protocol.constants';
24
+
25
+ export class EventsPublicApprovalsDB {
26
+ private updateMutexes: Record<string, Mutex> = {};
27
+
28
+ private readonly approvalTopic = ethers.utils.id('Approval(address,address,uint256)');
29
+
30
+ private readonly approvalForAllTopic = ethers.utils.id('ApprovalForAll(address,address,bool)');
31
+
32
+ private readonly getApprovedSelector = ethers.utils.id('getApproved(uint256)').substring(0, 10);
33
+
34
+ private readonly isApprovedForAllSelector = ethers.utils.id('isApprovedForAll(address,address)').substring(0, 10);
35
+
36
+ private readonly ALCHEMY_URLS = {
37
+ [chainIds.ethMainnet]: `eth-mainnet`,
38
+ [chainIds.polygon]: `polygon-mainnet`,
39
+ [chainIds.arbMainnet]: `arb-mainnet`,
40
+ [chainIds.optimism]: `opt-mainnet`,
41
+ [chainIds.base]: `base-mainnet`,
42
+ [chainIds.arcTestnet]: `arc-testnet`,
43
+ [chainIds.avalanche]: `avax-mainnet`,
44
+ };
45
+
46
+ private getMutex(stateKey: string): Mutex {
47
+ if (!this.updateMutexes[stateKey]) {
48
+ this.updateMutexes[stateKey] = new Mutex();
49
+ }
50
+ return this.updateMutexes[stateKey];
51
+ }
52
+
53
+ private getAlchemyUrl(chainId: number): string {
54
+ const network = this.ALCHEMY_URLS[chainId];
55
+ if (!network) {
56
+ throw new Error(`Unsupported chainId for Alchemy: ${chainId}`);
57
+ }
58
+ return `https://${network}.g.alchemy.com/v2/${ALCHEMY_API_KEY}`;
59
+ }
60
+
61
+ public async getApprovals(chainId: number, walletAddress: string): Promise<TokenApproval[]> {
62
+ const key = getStateKey(walletAddress, chainId);
63
+ const approvals = await get<Record<string, TokenApproval[]>>(StorageKeys.EVENTS_PUBLIC_APPROVALS);
64
+ return approvals?.[key] || [];
65
+ }
66
+
67
+ private async getLastProcessedBlock(chainId: number, walletAddress: string): Promise<number> {
68
+ const lastBlocks = (await get<Record<string, number>>(StorageKeys.PUBLIC_APPROVALS_LAST_PROCESSED_BLOCKS)) || {};
69
+ const key = getStateKey(walletAddress, chainId);
70
+ return lastBlocks[key] || EVENTS_INITIAL_BLOCKS[chainId];
71
+ }
72
+
73
+ private async updateLastProcessedBlock(chainId: number, walletAddress: string, blockNumber: number): Promise<void> {
74
+ await update(StorageKeys.PUBLIC_APPROVALS_LAST_PROCESSED_BLOCKS, (lastBlocks: Record<string, number> = {}) => {
75
+ const key = getStateKey(walletAddress, chainId);
76
+ return {
77
+ ...lastBlocks,
78
+ [key]: blockNumber,
79
+ };
80
+ });
81
+ }
82
+
83
+ private async getApprovalEvents(
84
+ walletAddress: string,
85
+ chainId: number,
86
+ ): Promise<{ approvalEvents: ethers.providers.Log[]; latestBlock: number | undefined }> {
87
+ try {
88
+ const { fetchRpcUrl } = networkRegistry[chainId];
89
+ if (!fetchRpcUrl) throw Error('No fetchRpcUrl in EventsPublicApprovalsDB');
90
+ const provider = createTorRpcProvider(fetchRpcUrl);
91
+
92
+ const fromBlock = (await this.getLastProcessedBlock(chainId, walletAddress)) + 1;
93
+ const latestBlock = await provider.getBlockNumber();
94
+
95
+ if (fromBlock > latestBlock) {
96
+ return { approvalEvents: [], latestBlock };
97
+ }
98
+
99
+ const paddedWalletAddress = ethers.utils.hexZeroPad(walletAddress.toLowerCase(), 32);
100
+
101
+ const filter = {
102
+ topics: [[this.approvalTopic, this.approvalForAllTopic], paddedWalletAddress],
103
+ fromBlock,
104
+ toBlock: latestBlock,
105
+ };
106
+
107
+ const approvalEvents = await provider.getLogs(filter);
108
+ return { approvalEvents, latestBlock };
109
+ } catch (error) {
110
+ Logger.error('Failed to fetch approval events', error);
111
+ return { approvalEvents: [], latestBlock: undefined };
112
+ }
113
+ }
114
+
115
+ private async checkCurrentAllowances(
116
+ chainId: number,
117
+ walletAddress: string,
118
+ approvalPairs: ApprovalPair[],
119
+ ): Promise<TokenApproval[]> {
120
+ const alchemyUrl = this.getAlchemyUrl(chainId);
121
+ const paddedOwner = `0x${walletAddress.substring(2).padStart(64, '0')}`;
122
+
123
+ const uniqueAddresses = [...new Set(approvalPairs.map((p) => p.contractAddress))];
124
+ const tokens = (await API.tokensInfoCall(chainId, uniqueAddresses)).filter((token): token is ERC20Token => !!token);
125
+ const tokenMap = new Map(tokens.map((token) => [token.erc20TokenAddress.toLowerCase(), token]));
126
+
127
+ const batchRequests: AlchemyBatchRequest[] = [];
128
+ const requestMetadata: ApprovalRequestMetadata[] = [];
129
+
130
+ approvalPairs.forEach((pair, pairIndex) => {
131
+ const token = tokenMap.get(pair.contractAddress.toLowerCase());
132
+ if (!token) return;
133
+
134
+ if (!isNFTToken(token)) {
135
+ batchRequests.push({
136
+ jsonrpc: '2.0',
137
+ id: batchRequests.length,
138
+ method: 'alchemy_getTokenAllowance',
139
+ params: [{ contract: pair.contractAddress, owner: walletAddress, spender: pair.spenderAddress }],
140
+ });
141
+ requestMetadata.push({ pairIndex, type: RevokeType.ERC20 });
142
+ } else {
143
+ const paddedSpender = `0x${pair.spenderAddress.substring(2).padStart(64, '0')}`;
144
+ const dataAll = `${this.isApprovedForAllSelector}${paddedOwner.substring(2)}${paddedSpender.substring(2)}`;
145
+
146
+ batchRequests.push({
147
+ jsonrpc: '2.0',
148
+ id: batchRequests.length,
149
+ method: 'eth_call',
150
+ params: [{ to: pair.contractAddress, data: dataAll }, 'latest'],
151
+ });
152
+ requestMetadata.push({ pairIndex, type: RevokeType.approvedForAll });
153
+
154
+ if (pair.tokenIds && pair.tokenIds.size > 0) {
155
+ pair.tokenIds.forEach((tokenId) => {
156
+ const hexTokenId = ethers.BigNumber.from(tokenId).toHexString().substring(2).padStart(64, '0');
157
+ const dataSingle = `${this.getApprovedSelector}${hexTokenId}`;
158
+
159
+ batchRequests.push({
160
+ jsonrpc: '2.0',
161
+ id: batchRequests.length,
162
+ method: 'eth_call',
163
+ params: [{ to: pair.contractAddress, data: dataSingle }, 'latest'],
164
+ });
165
+ requestMetadata.push({ pairIndex, type: RevokeType.tokenId, tokenId });
166
+ });
167
+ }
168
+ }
169
+ });
170
+
171
+ if (batchRequests.length === 0) return [];
172
+
173
+ const responses = await httpClient.post<AlchemyBatchResponse[]>(alchemyUrl, batchRequests);
174
+
175
+ const approvals: TokenApproval[] = [];
176
+ const approvedForAllPairs = new Set<number>();
177
+
178
+ responses.forEach((resp, index) => {
179
+ const metadata = requestMetadata[index];
180
+ if (!metadata) return;
181
+
182
+ const pair = approvalPairs[metadata.pairIndex];
183
+ const token = tokenMap.get(pair.contractAddress.toLowerCase());
184
+ if (!token || caseInsensitiveEqual(pair.spenderAddress, zeroAddress)) return;
185
+
186
+ if (!resp?.error && !!resp?.result && resp.result !== '0x') {
187
+ try {
188
+ if (metadata.type === RevokeType.ERC20 && BigInt(resp.result) > 0n) {
189
+ approvals.push({ token, spenderAddress: pair.spenderAddress, allowance: BigInt(resp.result) });
190
+ } else if (metadata.type === RevokeType.approvedForAll && BigInt(resp.result) === 1n) {
191
+ approvedForAllPairs.add(metadata.pairIndex);
192
+ approvals.push({ token, spenderAddress: pair.spenderAddress, allowance: 1n });
193
+ } else if (metadata.type === RevokeType.tokenId && !approvedForAllPairs.has(metadata.pairIndex)) {
194
+ const approvedAddress = `0x${resp.result.substring(26)}`.toLowerCase();
195
+ if (
196
+ !caseInsensitiveEqual(approvedAddress, zeroAddress) &&
197
+ caseInsensitiveEqual(approvedAddress, pair.spenderAddress)
198
+ ) {
199
+ approvals.push({
200
+ token,
201
+ spenderAddress: pair.spenderAddress,
202
+ allowance: 1n,
203
+ tokenId: metadata.tokenId,
204
+ });
205
+ }
206
+ }
207
+ } catch (error) {
208
+ Logger.error('Error processing approval response', error);
209
+ }
210
+ }
211
+ });
212
+
213
+ return approvals;
214
+ }
215
+
216
+ public async fetchAndUpdatePublicApprovals(walletAddress: string, chainId: number): Promise<void> {
217
+ const stateKey = getStateKey(walletAddress, chainId);
218
+ const mutex = this.getMutex(stateKey);
219
+
220
+ await mutex.runExclusive(async () => {
221
+ try {
222
+ const { approvalEvents, latestBlock } = await this.getApprovalEvents(walletAddress, chainId);
223
+ if (!latestBlock) return;
224
+
225
+ const existingApprovals = await this.getApprovals(chainId, walletAddress);
226
+ const pairsMap = new Map<string, ApprovalPair>();
227
+
228
+ existingApprovals.forEach((approval) => {
229
+ const contract = approval.token.erc20TokenAddress.toLowerCase();
230
+ const spender = approval.spenderAddress.toLowerCase();
231
+
232
+ const pairKey = `${contract}_${spender}`;
233
+
234
+ let pair = pairsMap.get(pairKey);
235
+ if (!pair) {
236
+ pair = { contractAddress: contract, spenderAddress: spender, tokenIds: new Set() };
237
+ pairsMap.set(pairKey, pair);
238
+ }
239
+
240
+ if (approval.tokenId && pair.tokenIds) {
241
+ pair.tokenIds.add(approval.tokenId);
242
+ }
243
+ });
244
+
245
+ approvalEvents.forEach((log) => {
246
+ if (!log.topics[2]) return;
247
+
248
+ const contract = log.address.toLowerCase();
249
+ const spender = `0x${log.topics[2].substring(26)}`.toLowerCase();
250
+
251
+ if (caseInsensitiveEqual(spender, zeroAddress)) return;
252
+
253
+ const pairKey = `${contract}_${spender}`;
254
+
255
+ let pair = pairsMap.get(pairKey);
256
+ if (!pair) {
257
+ pair = { contractAddress: contract, spenderAddress: spender, tokenIds: new Set() };
258
+ pairsMap.set(pairKey, pair);
259
+ }
260
+
261
+ if (log.topics.length === 4 && pair.tokenIds) {
262
+ const tokenId = BigInt(log.topics[3]).toString();
263
+ pair.tokenIds.add(tokenId);
264
+ }
265
+ });
266
+
267
+ if (pairsMap.size === 0) {
268
+ await this.updateLastProcessedBlock(chainId, walletAddress, latestBlock);
269
+ return;
270
+ }
271
+
272
+ const allPairs = Array.from(pairsMap.values());
273
+ const currentApprovals = await this.checkCurrentAllowances(chainId, walletAddress, allPairs);
274
+
275
+ await update(StorageKeys.EVENTS_PUBLIC_APPROVALS, (stored: Record<string, TokenApproval[]> = {}) => ({
276
+ ...stored,
277
+ [stateKey]: currentApprovals,
278
+ }));
279
+
280
+ await this.updateLastProcessedBlock(chainId, walletAddress, latestBlock);
281
+ } catch (error: unknown) {
282
+ Logger.error('Failed to sync approvals', error);
283
+ }
284
+ });
285
+ }
286
+ }
287
+
288
+ export const eventsPublicApprovalsDB = new EventsPublicApprovalsDB();
@@ -0,0 +1 @@
1
+ export * from './EventsPublicApprovalsDB';