@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,36 @@
1
+ import { CustomJSONStringify } from '../../functions/utils/serialize.utils';
2
+ import { BaseCacheDevice } from './BaseCacheDevice';
3
+
4
+ export class LocalStorageCacheDevice extends BaseCacheDevice {
5
+ private localDataStorage: Storage | undefined;
6
+
7
+ constructor(disableCaching?: boolean, serializedCache?: Record<string, string>) {
8
+ super();
9
+ if (!disableCaching && typeof localStorage !== 'undefined') {
10
+ this.localDataStorage = localStorage;
11
+ }
12
+ if (serializedCache) this.mergeWithSerialized(serializedCache);
13
+ }
14
+
15
+ get(key: string): string | undefined {
16
+ if (this.localDataStorage) {
17
+ return this.localDataStorage.getItem(key) ?? undefined;
18
+ } else {
19
+ return this.getInMemory(key);
20
+ }
21
+ }
22
+
23
+ set(key: string, value: string): void {
24
+ if (this.localDataStorage) {
25
+ this.localDataStorage.setItem(key, value);
26
+ } else {
27
+ this.setInMemory(key, value);
28
+ }
29
+ }
30
+
31
+ serialize(): Record<string, string> {
32
+ const keyValuePairs = this.localDataStorage ? Object.entries(localStorage) : [...this.inMemoryCache];
33
+
34
+ return Object.fromEntries(keyValuePairs.map(([key, value]) => [key, CustomJSONStringify(value)]));
35
+ }
36
+ }
@@ -0,0 +1,2 @@
1
+ export * from './FileCacheDevice';
2
+ export * from './LocalStorageCacheDevice';
@@ -0,0 +1,60 @@
1
+ import { BigNumber, ethers } from 'ethers';
2
+ import { IUtxoConstructor, Utxo } from '../utxo/Utxo';
3
+ import { UserKeys } from './keys';
4
+
5
+ export const abiDecodeUtxo = (encryptedOutput: string) => {
6
+ // UTXO {uint256 amount;address erc20Address;StealthAddressStructure stealthAddressStructure;uint256 timeStamp;uint256 tokenId; }
7
+ const decodedUtxo = ethers.utils.defaultAbiCoder.decode(
8
+ ['uint256', 'address', 'tuple(uint256, uint256, uint256, uint256)', 'uint256', 'uint256'],
9
+ encryptedOutput,
10
+ );
11
+ const amount = (decodedUtxo[0] as BigNumber).toBigInt();
12
+ const erc20TokenAddress = decodedUtxo[1] as string;
13
+
14
+ const randomization = (decodedUtxo[2][0] as BigNumber).toBigInt();
15
+ const stealthAddress = (decodedUtxo[2][1] as BigNumber).toHexString();
16
+ const H0 = (decodedUtxo[2][2] as BigNumber).toBigInt();
17
+ const H1 = (decodedUtxo[2][3] as BigNumber).toBigInt();
18
+
19
+ const timeStamp = (decodedUtxo[3] as BigNumber).toString();
20
+ const tokenId = (decodedUtxo[4] as BigNumber).toNumber();
21
+ return {
22
+ amount,
23
+ erc20TokenAddress,
24
+ randomization,
25
+ stealthAddress,
26
+ H0,
27
+ H1,
28
+ timeStamp,
29
+ tokenId,
30
+ };
31
+ };
32
+
33
+ export const decodeUtxoConstructorArgs = (encryptedOutput: string, privateKey: string): IUtxoConstructor => {
34
+ const { amount, erc20TokenAddress, timeStamp, tokenId, randomization, stealthAddress } =
35
+ abiDecodeUtxo(encryptedOutput);
36
+
37
+ return {
38
+ amount,
39
+ erc20TokenAddress,
40
+ timeStamp,
41
+ tokenId,
42
+ randomization,
43
+ shieldedPrivateKey: privateKey,
44
+ stealthAddress,
45
+ };
46
+ };
47
+
48
+ export const decodeUtxo = (encryptedOutput: string, privateKey: string): Utxo => {
49
+ return new Utxo(decodeUtxoConstructorArgs(encryptedOutput, privateKey));
50
+ };
51
+
52
+ export const checkUtxoSignature = (encryptedOutput: string, privateKey: string): boolean => {
53
+ const { randomization, H0, H1 } = abiDecodeUtxo(encryptedOutput);
54
+
55
+ const utxoBelongsToUser = UserKeys.checkSignature(randomization, H0, H1, privateKey);
56
+
57
+ if (!utxoBelongsToUser) throw new Error("UTXO doesn't belong to user");
58
+
59
+ return utxoBelongsToUser;
60
+ };
@@ -0,0 +1,74 @@
1
+ import { ethers } from 'ethers';
2
+ import sodium from 'libsodium-wrappers'; // added * as for jest
3
+ import { IUtxoConstructor, Utxo } from '../utxo/Utxo';
4
+ import { UserKeys } from './keys';
5
+
6
+ /**
7
+ * encrypt data for the UTXO
8
+ * @param amount UTXO amount
9
+ * @param blinding UTXO blinding
10
+ * @param publicKey sender's encryption public key
11
+ * @returns returns encrypted data {Uint8Array}
12
+ */
13
+ export const encryptUtxo = (utxo: Utxo, forceZeroAmount: boolean): Uint8Array => {
14
+ // converting data to Uint8Array
15
+ // all data is in hex format
16
+ const arrayToEncrypt = [
17
+ Buffer.from(ethers.utils.hexlify(forceZeroAmount ? 0n : utxo.amount)),
18
+ Buffer.from(ethers.utils.hexlify(utxo.erc20TokenAddress)),
19
+ Buffer.from(ethers.utils.hexlify(utxo.randomization)),
20
+ Buffer.from(utxo.getStealthAddress()),
21
+ Buffer.from(ethers.utils.hexlify(BigInt(utxo.timeStamp))),
22
+ ];
23
+ if (utxo.tokenId > 0) arrayToEncrypt.push(Buffer.from(ethers.utils.hexlify(utxo.tokenId)));
24
+ const bytes = Buffer.concat(arrayToEncrypt);
25
+
26
+ // encrypting with encryptionPublicKey
27
+ const encryptedData = sodium.crypto_box_seal(bytes, ethers.utils.arrayify(utxo.getEncryptionKey()));
28
+
29
+ return encryptedData;
30
+ };
31
+
32
+ export const decryptUtxoConstructorArgs = (encryptedData: Uint8Array, userKeys: UserKeys): IUtxoConstructor => {
33
+ // decrypting data into Uint8Array
34
+
35
+ const { publicKey, privateKey } = UserKeys.getEncryptionKeyPair(userKeys.getShieldedPrivateKey());
36
+
37
+ const bufferData = sodium.crypto_box_seal_open(
38
+ encryptedData,
39
+ ethers.utils.arrayify(publicKey),
40
+ ethers.utils.arrayify(privateKey),
41
+ );
42
+
43
+ // converting from Uint8Array into decimals
44
+ const decryptedData = Buffer.from(bufferData)
45
+ .toString('utf-8')
46
+ .split('0x')
47
+ .filter((e) => e.length !== 0)
48
+ .map((e, index) => {
49
+ let field;
50
+ if ([0, 2, 4, 5].includes(index))
51
+ field = BigInt(`0x${e}`); // amount, timestamp, tokenId
52
+ else if ([1, 3].includes(index)) field = `0x${e}`; // erc20TokenAddress and public key
53
+ return field;
54
+ });
55
+
56
+ return {
57
+ amount: decryptedData[0] as bigint,
58
+ erc20TokenAddress: decryptedData[1] as string,
59
+ randomization: decryptedData[2] as bigint,
60
+ stealthAddress: decryptedData[3] as string,
61
+ shieldedPrivateKey: userKeys.getShieldedPrivateKey(),
62
+ timeStamp: (decryptedData[4] as bigint).toString(),
63
+ tokenId: decryptedData[5] ? Number(decryptedData[5] as bigint) : 0, // tokenId
64
+ };
65
+ };
66
+
67
+ /**
68
+ * decrypt UTXO data from events
69
+ * @param encryptedData encrypted UTXO data {Uint8Array}
70
+ * @param publicKey/privateKey sender's encryption keys
71
+ * @returns decrypted UTXO data Object {amount, blinding}
72
+ */
73
+ export const decryptUtxo = (encryptedData: Uint8Array, userKeys: UserKeys) =>
74
+ new Utxo(decryptUtxoConstructorArgs(encryptedData, userKeys));
@@ -0,0 +1,4 @@
1
+ export * from './decodeUTXO';
2
+ export * from './encryptDecryptUtxo';
3
+ export * from './keys';
4
+ export * from './keyUtils';
@@ -0,0 +1,8 @@
1
+ import { CIRCOM_P, CIRCOM_P_HALF } from '../../constants/protocol.constants';
2
+
3
+ export const isCircomNegative = (n: bigint) => {
4
+ if (n < 0n || n >= CIRCOM_P) throw new RangeError();
5
+ return n > CIRCOM_P_HALF;
6
+ };
7
+
8
+ export const getCircomSign = (n: bigint) => (isCircomNegative(n) ? 1n : 0n);
@@ -0,0 +1,203 @@
1
+ import { ethers, utils } from 'ethers';
2
+ import sodium from 'libsodium-wrappers'; // added * as for jest
3
+ import { CIRCOM_P } from '../../constants/protocol.constants';
4
+ import { babyJubInstance, JubPoint } from '../../crypto/babyJub';
5
+ import { poseidonHash } from '../../crypto/poseidon';
6
+ import { getCircomSign } from './keyUtils';
7
+ import { AttachableMemoryCacheDevice } from '../cacheDevices/AttachableMemoryCacheDevice';
8
+ import { keccak256, toUtf8Bytes } from 'ethers/lib/utils';
9
+ import { ethers as ethersV6 } from 'ethers-v6h';
10
+ import { networkRegistry } from '../../constants/chains.constants';
11
+
12
+ export const stealthPairCacheDevice = new AttachableMemoryCacheDevice<{ H0: [bigint, bigint]; H1: [bigint, bigint] }>();
13
+ export const stealthAddressCacheDevice = new AttachableMemoryCacheDevice<string>();
14
+
15
+ export interface EncryptionKeyPair {
16
+ privateKey: string;
17
+ publicKey: string;
18
+ }
19
+
20
+ export const EncryptionKeyPairDefaultValue: EncryptionKeyPair = {
21
+ privateKey: '',
22
+ publicKey: '',
23
+ };
24
+
25
+ export class UserKeys {
26
+ private signature: string | undefined;
27
+
28
+ constructor(_signature?: string) {
29
+ this.signature = _signature;
30
+ }
31
+
32
+ public getSignature(): string {
33
+ this.requireSignature();
34
+ return this.signature!;
35
+ }
36
+
37
+ public setSignature(_signature: string) {
38
+ this.signature = _signature;
39
+ }
40
+
41
+ private requireSignature() {
42
+ if (!this.signature) throw Error('No signature provided');
43
+ }
44
+
45
+ public verifyMessage(signingMessage: string) {
46
+ this.requireSignature();
47
+ const signerAddress = utils.verifyMessage(signingMessage, this.signature!);
48
+ return signerAddress;
49
+ }
50
+
51
+ /**
52
+ * get shielded private key from message signature used to login to the application,
53
+ * this private key is used to generate encryption keypairs as well as public key
54
+ * @retuns 0x-prefixed shielded private key
55
+ */
56
+ public getShieldedPrivateKey = () => {
57
+ this.requireSignature();
58
+ return ethers.utils.keccak256(this.signature!);
59
+ };
60
+
61
+ /**
62
+ * generate shielded public key from private key
63
+ * @param privateKey the key used to generate the shielded public key, this should be the signature
64
+ * that the user provided
65
+ * @retuns shielded public key in hexstring with 0x prefixed
66
+ */
67
+ public getShieldedPublicKey = () => {
68
+ this.requireSignature();
69
+ return poseidonHash(this.getShieldedPrivateKey());
70
+ };
71
+
72
+ /**
73
+ * generate access token, this accessKey is what should be sent to the server for signing
74
+ * @returns accessKey in hexstring with 0x prefixed
75
+ */
76
+ public getAccessKey = () => {
77
+ this.requireSignature();
78
+ return poseidonHash(this.getShieldedPrivateKey(), this.getShieldedPublicKey());
79
+ };
80
+
81
+ public static getSignerAddressFromPrivateKey(privateKey: string): string {
82
+ const wallet = new ethersV6.Wallet(privateKey);
83
+ return wallet.address;
84
+ }
85
+
86
+ public static deriveSignerFromNonce(userKeys: UserKeys, walletNonce: bigint): ethersV6.Wallet {
87
+ const str = poseidonHash(walletNonce, userKeys.getShieldedPrivateKey(), userKeys.getShieldedPublicKey());
88
+ const hash = keccak256(toUtf8Bytes(str));
89
+ return new ethersV6.Wallet(hash);
90
+ }
91
+
92
+ public static async signMessageFromPrivateKey(privateKey: string, message: string): Promise<string> {
93
+ const wallet = new ethersV6.Wallet(privateKey);
94
+ const messageToSign = utils.isHexString(message) ? utils.arrayify(message) : message;
95
+ return wallet.signMessage(messageToSign);
96
+ }
97
+
98
+ public static signTypedDataFromPrivateKey(
99
+ privateKey: string,
100
+ domain: ethers.TypedDataDomain,
101
+ types: Record<string, Array<ethers.TypedDataField>>,
102
+ value: Record<string, any>,
103
+ ): Promise<string> {
104
+ const wallet = new ethersV6.Wallet(privateKey);
105
+ return wallet.signTypedData(domain as any, types, value);
106
+ }
107
+
108
+ public static async authorizeDelegationFromPrivateKey(
109
+ privateKey: string,
110
+ chainId: number,
111
+ implementation: string,
112
+ nonce?: number,
113
+ ) {
114
+ const wallet = new ethersV6.Wallet(privateKey);
115
+ const provider = new ethersV6.JsonRpcProvider(networkRegistry[chainId].fetchRpcUrl);
116
+ const connected = wallet.connect(provider);
117
+ return connected.authorize({
118
+ address: implementation,
119
+ ...(nonce !== undefined && { nonce }),
120
+ });
121
+ }
122
+
123
+ public getWalletSalt = (walletNonce: bigint) => {
124
+ this.requireSignature();
125
+ return poseidonHash(this.getShieldedPublicKey(), this.getShieldedPrivateKey(), walletNonce);
126
+ };
127
+
128
+ /**
129
+ * generate inHinkalAddress - a user unique address linking him with a specific app
130
+ * @returns inHinkalAddress in bigint
131
+ */
132
+ public getInHinkalAddress = (interactionAddress: string) => {
133
+ this.requireSignature();
134
+ const addressString = poseidonHash(this.getShieldedPrivateKey(), interactionAddress);
135
+ return BigInt(addressString);
136
+ };
137
+
138
+ /**
139
+ * generate backend token, which is used for access control on backend
140
+ * @returns accessKey in hexstring with 0x prefixed
141
+ */
142
+ public getBackendToken = () => {
143
+ this.requireSignature();
144
+ return poseidonHash(this.getAccessKey(), this.getShieldedPublicKey());
145
+ };
146
+
147
+ public static getRandomizedStealthPair = stealthPairCacheDevice.attach(
148
+ (s: bigint, privateKey: string): { H0: JubPoint; H1: JubPoint } => {
149
+ const babyJub = babyJubInstance();
150
+ const privateKeyAdjusted = BigInt(privateKey) % CIRCOM_P; // there should not be a difference between circom and client privKey
151
+
152
+ const multiplier = (s * privateKeyAdjusted) % CIRCOM_P;
153
+
154
+ const h0: [Uint8Array, Uint8Array] = babyJub.mulPointEscalar(babyJub.Base8, s);
155
+ const h1: [Uint8Array, Uint8Array] = babyJub.mulPointEscalar(babyJub.Base8, multiplier);
156
+
157
+ const H0: [bigint, bigint] = [BigInt(babyJub.F.toString(h0[0])), BigInt(babyJub.F.toString(h0[1]))];
158
+ const H1: [bigint, bigint] = [BigInt(babyJub.F.toString(h1[0])), BigInt(babyJub.F.toString(h1[1]))];
159
+ return { H0, H1 };
160
+ },
161
+ );
162
+
163
+ public static getStealthAddressCompressedPoints = (s: bigint, privateKey: string) => {
164
+ const { H0, H1 } = this.getRandomizedStealthPair(s, privateKey);
165
+ const [h0, h1] = [H0, H1].map((point) => BigInt(point[1]) + 2n ** 255n * getCircomSign(point[0]));
166
+ return { h0, h1 };
167
+ };
168
+
169
+ public static getStealthAddress = stealthAddressCacheDevice.attach((s: bigint, privateKey: string) => {
170
+ const { H0, H1 } = this.getRandomizedStealthPair(s, privateKey);
171
+ const signs = 2n * getCircomSign(H0[0]) + getCircomSign(H1[0]);
172
+ const arrayToHash = [signs, H0[1], H1[1]];
173
+ return poseidonHash(...arrayToHash);
174
+ });
175
+
176
+ public static getStealthAddressWithEKey = (s: bigint, privateKey: string) => {
177
+ const stealthAddress = this.getStealthAddress(s, privateKey);
178
+ return { stealthAddress, encryptionKey: this.getEncryptionKeyPair(privateKey).publicKey };
179
+ };
180
+
181
+ public static checkSignature = (
182
+ s: bigint,
183
+ stealthAddressH0: bigint,
184
+ stealthAddressH1: bigint,
185
+ privateKey: string,
186
+ ): boolean => {
187
+ const { h0, h1 } = this.getStealthAddressCompressedPoints(s, privateKey);
188
+ return stealthAddressH0 === h0 && stealthAddressH1 === h1;
189
+ };
190
+
191
+ /**
192
+ * generate private and public keypair
193
+ * @param seed seed to use to deterministically generate key, must be in DataHexString format
194
+ * and must correspond to 32 bytes
195
+ */
196
+ public static getEncryptionKeyPair = (privateKey: string): EncryptionKeyPair => {
197
+ const keyPair = sodium.crypto_box_seed_keypair(ethers.utils.arrayify(privateKey));
198
+ return {
199
+ privateKey: ethers.utils.hexlify(keyPair.privateKey),
200
+ publicKey: ethers.utils.hexlify(keyPair.publicKey),
201
+ };
202
+ };
203
+ }
@@ -0,0 +1,49 @@
1
+ import { ERC20Token } from '../../types';
2
+
3
+ // TODO: the contents of this class are used in hooks
4
+ // this should be written as a store.
5
+ class CustomTokenRegistry {
6
+ tokenRegistry: ERC20Token[];
7
+
8
+ constructor() {
9
+ this.tokenRegistry = [];
10
+ }
11
+
12
+ public setTokensFromCache(newTokenRegistries: ERC20Token[]) {
13
+ this.tokenRegistry = newTokenRegistries;
14
+ }
15
+
16
+ public getCustomTokens(chainId: number): ERC20Token[] {
17
+ return this.tokenRegistry.filter((token) => token.chainId === chainId);
18
+ }
19
+
20
+ public tokenExists(registry: ERC20Token[], tokenToCheck: ERC20Token) {
21
+ return registry.find(
22
+ (token) =>
23
+ token.erc20TokenAddress === tokenToCheck.erc20TokenAddress ||
24
+ token.symbol === tokenToCheck.symbol ||
25
+ token.name === tokenToCheck.name,
26
+ );
27
+ }
28
+
29
+ public addCustomToken(token: ERC20Token) {
30
+ const { chainId } = token;
31
+
32
+ const currRegistry = this.getCustomTokens(chainId);
33
+
34
+ if (!this.tokenExists(currRegistry, token)) {
35
+ this.tokenRegistry.push(token);
36
+ }
37
+ }
38
+
39
+ public removeCustomToken(tokenToRemove: ERC20Token) {
40
+ const { chainId } = tokenToRemove;
41
+
42
+ const currRegistry = this.getCustomTokens(chainId);
43
+
44
+ const newRegistry = currRegistry.filter((token) => token.erc20TokenAddress !== tokenToRemove.erc20TokenAddress);
45
+ this.tokenRegistry = newRegistry;
46
+ }
47
+ }
48
+
49
+ export const customTokenRegistry = new CustomTokenRegistry();
@@ -0,0 +1,142 @@
1
+ import { zeroAddress } from '../../constants/protocol.constants';
2
+ import { poseidonFunction } from '../../crypto';
3
+ import { toBigInt } from '../../functions/utils/amounts.utils';
4
+ import { MerkleTree, MerkleTreeJson } from '../merkle-tree';
5
+ import { AccessTokenEvent } from '../../types';
6
+ import { AbstractSnapshotService, Snapshot } from './AbstractSnapshotService';
7
+ import { contructMerkleTreeFromSerialized } from '../../functions/utils/merkleTree.utils';
8
+ import { BlockchainEventEmitter } from './BlockchainEventEmitter';
9
+
10
+ export type SenderAddressIndexMapJson = {
11
+ address: string;
12
+ index: number;
13
+ }[];
14
+
15
+ export type AccessTokenSnapshotPayload = {
16
+ readonly merkleTree: MerkleTree<bigint>;
17
+ readonly senderAddresses: string[];
18
+ readonly senderAddressIndexMap: Map<string, number>;
19
+ };
20
+
21
+ export type AccessTokenSerializedSnapshot = {
22
+ latestBlockNumber?: number;
23
+ merkleTree?: MerkleTreeJson;
24
+ senderAddresses?: string[];
25
+ senderAddressIndexMap?: SenderAddressIndexMapJson;
26
+ };
27
+
28
+ export abstract class AbstractAccessTokenSnapshotService extends AbstractSnapshotService<
29
+ AccessTokenEvent<bigint>,
30
+ AccessTokenEvent,
31
+ AccessTokenSnapshotPayload,
32
+ AccessTokenSerializedSnapshot
33
+ > {
34
+ constructor(accessTokenEventFetcher: BlockchainEventEmitter) {
35
+ super(accessTokenEventFetcher, 'NewAccessKeyAdded');
36
+ }
37
+
38
+ private _merkleTree!: MerkleTree<bigint>;
39
+
40
+ private _senderAddresses!: string[];
41
+
42
+ private _senderAddressIndexMap!: Map<string, number>;
43
+
44
+ get merkleTree() {
45
+ return this._merkleTree;
46
+ }
47
+
48
+ get senderAddresses() {
49
+ return this._senderAddresses;
50
+ }
51
+
52
+ get senderAddressIndexMap() {
53
+ return this._senderAddressIndexMap;
54
+ }
55
+
56
+ protected override serializeSnapshot(snapshot: Snapshot<AccessTokenSnapshotPayload>): AccessTokenSerializedSnapshot {
57
+ return {
58
+ merkleTree: snapshot.payload.merkleTree.toJSON(),
59
+ senderAddresses: Array.from(snapshot.payload.senderAddresses),
60
+ latestBlockNumber: snapshot.latestBlockNumber,
61
+ senderAddressIndexMap: Array.from(snapshot.payload.senderAddressIndexMap).map(([address, index]) => ({
62
+ address,
63
+ index,
64
+ })),
65
+ };
66
+ }
67
+
68
+ protected override deserializeSnapshot(
69
+ serializedSnapshot: AccessTokenSerializedSnapshot,
70
+ ): Snapshot<AccessTokenSnapshotPayload> {
71
+ let merkleTree: MerkleTree<bigint>;
72
+ let senderAddressIndexMap: Map<string, number>;
73
+ if (serializedSnapshot.latestBlockNumber && serializedSnapshot.merkleTree) {
74
+ merkleTree = contructMerkleTreeFromSerialized(serializedSnapshot.merkleTree);
75
+ } else {
76
+ merkleTree = MerkleTree.create(poseidonFunction, 0n);
77
+ }
78
+
79
+ if (serializedSnapshot.latestBlockNumber && serializedSnapshot.senderAddressIndexMap) {
80
+ senderAddressIndexMap = new Map<string, number>(
81
+ serializedSnapshot.senderAddressIndexMap.map(({ address, index }): [string, number] => [address, index]),
82
+ );
83
+ } else {
84
+ senderAddressIndexMap = new Map<string, number>();
85
+ }
86
+
87
+ return {
88
+ latestBlockNumber: serializedSnapshot.latestBlockNumber ?? 0,
89
+ payload: {
90
+ merkleTree,
91
+ senderAddresses: serializedSnapshot.senderAddresses ?? [],
92
+ senderAddressIndexMap,
93
+ },
94
+ };
95
+ }
96
+
97
+ protected acceptEvent(event: AccessTokenEvent<bigint>, _blockNumber: number): boolean {
98
+ try {
99
+ // merkleTree.insert won't override if it is already inserted.
100
+ this._merkleTree.insert(event.accessKey, event.index);
101
+ this._senderAddressIndexMap.set(
102
+ event.senderAddress,
103
+ Math.max(Number(event.index), this._senderAddressIndexMap.get(event.senderAddress) ?? 0),
104
+ );
105
+ if (!this._senderAddresses.includes(event.senderAddress)) {
106
+ this._senderAddresses.push(event.senderAddress);
107
+ }
108
+ if (event.accessKey === 0n && event.senderAddress === zeroAddress) {
109
+ this._merkleTree.remove(event.index);
110
+ }
111
+ return true;
112
+ } catch (err) {
113
+ console.error(err);
114
+ return false;
115
+ }
116
+ }
117
+
118
+ protected override mapEvent(event: AccessTokenEvent): AccessTokenEvent<bigint> {
119
+ const { accessKey, index, senderAddress } = event;
120
+ return {
121
+ accessKey: toBigInt(accessKey),
122
+ index: toBigInt(index),
123
+ senderAddress,
124
+ };
125
+ }
126
+
127
+ protected override getSnapshotPayload(): AccessTokenSnapshotPayload {
128
+ return {
129
+ merkleTree: this._merkleTree,
130
+ senderAddresses: this._senderAddresses,
131
+ senderAddressIndexMap: this._senderAddressIndexMap,
132
+ };
133
+ }
134
+
135
+ protected override populateSnapshot({
136
+ payload: { merkleTree, senderAddresses, senderAddressIndexMap },
137
+ }: Snapshot<AccessTokenSnapshotPayload>) {
138
+ this._merkleTree = merkleTree;
139
+ this._senderAddresses = senderAddresses;
140
+ this._senderAddressIndexMap = senderAddressIndexMap;
141
+ }
142
+ }