@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
+ import { TorExternalProvider } from '../../providers/TorExternalProvider';
2
+ import { ethers } from 'ethers';
3
+
4
+ export const createProvider = (rpcUrl: string) => {
5
+ return new ethers.providers.JsonRpcProvider(rpcUrl);
6
+ };
7
+
8
+ export const createTorRpcProvider = (rpcUrl: string) => {
9
+ const torProvider = new TorExternalProvider(rpcUrl);
10
+ return new ethers.providers.Web3Provider(torProvider);
11
+ };
@@ -0,0 +1,4 @@
1
+ import { TokenWithId } from '../../types/token-with-id.types';
2
+
3
+ export const encodeTokenWithId = (tokenWithId: TokenWithId) =>
4
+ `${tokenWithId.erc20TokenAddress.toLowerCase()}-${tokenWithId.tokenId}`;
@@ -0,0 +1,119 @@
1
+ import * as forge from 'node-forge';
2
+ import { type HandshakeResponseType } from '../../types/remote-proof.types';
3
+ import { ENCLAVE_EC2_URL } from '../snarkjs/constant';
4
+ import { ethers } from 'ethers';
5
+ import sodium from 'libsodium-wrappers';
6
+ import { httpClient } from '../../data-structures/tor';
7
+
8
+ const RSA_2048_THRESHOLD = 214;
9
+
10
+ const makeHandshakeForPublicKey = async () => {
11
+ // obtain public key used for assymetric encryption from enclave
12
+ const handshakeResponse = await httpClient.get<HandshakeResponseType>(`${ENCLAVE_EC2_URL}/handshake`);
13
+ const kmsPk = handshakeResponse.public_key;
14
+
15
+ // parse and create publickey object with forge
16
+ const pkBytes = forge.util.decode64(kmsPk);
17
+ const asn1 = forge.asn1.fromDer(pkBytes);
18
+ return forge.pki.publicKeyFromAsn1(asn1);
19
+ };
20
+
21
+ const numberishToString = (value: unknown) => {
22
+ if (typeof value === 'bigint' || typeof value === 'number') {
23
+ return value.toString();
24
+ }
25
+ return value;
26
+ };
27
+
28
+ const convertHexStringToBytes = (aHexString: string) => {
29
+ // Forge doesn't know how to handle '0x' and returns invalid value unless we remove it
30
+ return forge.util.hexToBytes(aHexString.replace('0x', ''));
31
+ };
32
+
33
+ const serializeInput = (input: Record<string, unknown>) => {
34
+ const inputCopy = structuredClone(input);
35
+
36
+ Object.entries(inputCopy).forEach(([key, value]) => {
37
+ inputCopy[key] = numberishToString(value);
38
+
39
+ if (Array.isArray(value)) {
40
+ if (Array.isArray(value[0])) {
41
+ inputCopy[key] = value.map((outer: unknown[]) => outer.map(numberishToString));
42
+ } else {
43
+ inputCopy[key] = value.map(numberishToString);
44
+ }
45
+ }
46
+ });
47
+
48
+ return inputCopy;
49
+ };
50
+
51
+ const assymetricEncrypt = (publicKey: forge.pki.rsa.PublicKey, content: Uint8Array) => {
52
+ const contentHex = ethers.utils.hexlify(content).slice(2); // forge tries to convert '0x' and silently adds random byte
53
+ const bytes = convertHexStringToBytes(contentHex);
54
+ if (bytes.length > RSA_2048_THRESHOLD) throw new Error('too many bytes passed to assymetric_encrypt');
55
+
56
+ const encrypted = publicKey.encrypt(bytes, 'RSA-OAEP', {
57
+ md: forge.md.sha1.create(),
58
+ mgf1: { md: forge.md.sha1.create() },
59
+ label: null,
60
+ });
61
+
62
+ return forge.util.encode64(encrypted);
63
+ };
64
+
65
+ const symmetricEncrypt = (key: Uint8Array, message: Uint8Array) => {
66
+ const nonce = sodium.randombytes_buf(sodium.crypto_secretbox_NONCEBYTES);
67
+ const ciphertext = sodium.crypto_secretbox_easy(message, nonce, key);
68
+
69
+ // bundle nonce with ciphertext, PyNaCL recongizes this formart when calling decrypt automatically
70
+ const nonceAndCiphertextCombinedHex = ethers.utils.hexlify(nonce) + ethers.utils.hexlify(ciphertext).slice(2);
71
+ const nonceAndCiphertextCombinedBytes = convertHexStringToBytes(nonceAndCiphertextCombinedHex);
72
+
73
+ return forge.util.encode64(nonceAndCiphertextCombinedBytes);
74
+ };
75
+
76
+ // to send data to enclave securely, we need to encrypt the data
77
+ // we use combination of assymetric and symmetric encryption to achive this.
78
+ //
79
+ // because the enclave uses AWS key management service (KMS) underneath to securly decrypt data
80
+ // we are limited in the assymetric encryption algorithms we can use
81
+ // enclave currently uses RSAES_OAEP_SHA_1 for assymetric encryption algorithm, this algorithm is supported by KMS
82
+ //
83
+ // there is 1 big issue with this algorithm, it can't decrypt more than 214 bytes at a time
84
+ // we can encrypt entire input assymetrically and decrypt it into chunks, but this would be a very slow process
85
+ //
86
+ // to work around this limitation and to make encryption and decryption faster
87
+ // instead of assymetrically encrypting the entire input
88
+ // we generate a random `key` value, which is then used to symetrically encrypt the input with libsodium
89
+ // we then assymetrically encrypt `key` using the enclave's public key
90
+ //
91
+ // after receiving encrypted `input` and `key` values
92
+ // the enclave decrypts `key` using AWS KMS and uses it to decrypt `input` with PyNaCL (sodium for python)
93
+ //
94
+ // encrypted `input` and `key` values are sent to enclave in base64 format
95
+ const encryptUint8ArrayForEnclave = (inputUint8Array: Uint8Array, publicKey: forge.pki.rsa.PublicKey) => {
96
+ const key = sodium.randombytes_buf(sodium.crypto_secretbox_KEYBYTES);
97
+
98
+ const keyCiphertext = assymetricEncrypt(publicKey, key);
99
+ const inputCiphertext = symmetricEncrypt(key, inputUint8Array);
100
+
101
+ return { keyCiphertext, inputCiphertext };
102
+ };
103
+
104
+ const encryptInputForEnclave = (input: any, publicKey: forge.pki.rsa.PublicKey) => {
105
+ const serializedInput = serializeInput(input);
106
+ const inputStr = JSON.stringify(serializedInput);
107
+ const inputUint8Array = new TextEncoder().encode(inputStr);
108
+ return encryptUint8ArrayForEnclave(inputUint8Array, publicKey);
109
+ };
110
+
111
+ export const makeEnclaveHandshakeAndEncryptInput = async (input: any) => {
112
+ const pk = await makeHandshakeForPublicKey();
113
+ return encryptInputForEnclave(input, pk);
114
+ };
115
+
116
+ export const makeEnclaveHandshakeAndEncryptUint8Array = async (inputUint8Array: Uint8Array) => {
117
+ const pk = await makeHandshakeForPublicKey();
118
+ return encryptUint8ArrayForEnclave(inputUint8Array, pk);
119
+ };
@@ -0,0 +1,30 @@
1
+ /** Verifies that the value is in the enumType specified */
2
+ export function isInEnum<T>(enumType: T, value: any): value is T[keyof T] {
3
+ return Object.values(enumType as unknown[]).includes(value as T[keyof T]);
4
+ }
5
+
6
+ /** Converts a string value to an Enum member
7
+ * If a value can't be matched to a valid option in the enum, returns undefined (or throws if throwIfInvalid = true) */
8
+ export function toEnumValue<T>(e: T, value: any, throwIfInvalid = false): T[keyof T] | undefined {
9
+ if (isInEnum<T>(e, value)) {
10
+ return value;
11
+ }
12
+ const errMsg = `Value ${JSON.stringify(value)} is not a valid member of enum ${JSON.stringify(e)}.`;
13
+ if (throwIfInvalid) {
14
+ throw new Error(errMsg);
15
+ }
16
+ // globalLogger.error(errMsg)
17
+ return undefined;
18
+ }
19
+
20
+ /** returns first item in an enum that is included somewhere in the target string
21
+ * e.g. enumInString(ErrorCode, '001-badpassword: error') => ErrorCode.BadPassword
22
+ */
23
+ export function enumInString<T extends Record<string, string>>(enumType: T, searchString: any): T[keyof T] | undefined {
24
+ if (!searchString) return undefined;
25
+ // eslint-disable-next-line no-restricted-syntax
26
+ for (const [, value] of Object.entries(enumType)) {
27
+ if (searchString?.includes(value)) return toEnumValue(enumType, value);
28
+ }
29
+ return undefined;
30
+ }
@@ -0,0 +1,110 @@
1
+ import { getERC20Registry } from '../../constants/token-data';
2
+ import { customTokenRegistry } from '../../data-structures/custom-token-registry/CustomTokenRegistry';
3
+ import { ERC20Token, TokenChanges } from '../../types/token.types';
4
+ import { getAmountInToken } from '../web3/etherFunctions';
5
+ import { fixDecimalsAmount } from './amounts.utils';
6
+ import { TokenType, zeroAddress } from '../../constants/protocol.constants';
7
+ import { PopularTokenSymbols } from '../../constants/token-data/popularTokens.constants';
8
+ import { chainIds } from '../../constants/chains.constants';
9
+
10
+ export const getErc20TokensForChain = (chainId: number) => {
11
+ const permittedRegistry = getERC20Registry(chainId);
12
+ const customTokens = customTokenRegistry.getCustomTokens(chainId);
13
+
14
+ return [...permittedRegistry, ...customTokens];
15
+ };
16
+
17
+ export const getERC20Token = (address: string, chainId: number, fromList?: ERC20Token[]) => {
18
+ return (fromList ?? getErc20TokensForChain(chainId))?.find((el) => {
19
+ if (address === undefined) {
20
+ return false;
21
+ }
22
+ return el.erc20TokenAddress.toLowerCase() === address.toLowerCase();
23
+ });
24
+ };
25
+
26
+ export const getERC20TokenBySymbol = (symbol: string, chainId: number) => {
27
+ return getErc20TokensForChain(chainId)?.find((el) => {
28
+ if (symbol === undefined) {
29
+ return false;
30
+ }
31
+ return el.symbol.toLowerCase() === symbol.toLowerCase();
32
+ });
33
+ };
34
+
35
+ export const getHToken = (token: ERC20Token, chainId: number) => {
36
+ const tokenRegistry = getERC20Registry(chainId);
37
+ if (!token.hasHToken) return undefined;
38
+ return tokenRegistry.find(
39
+ (candidate) =>
40
+ candidate.underlyingErc20TokenAddress?.toLowerCase() === token.erc20TokenAddress.toLowerCase() &&
41
+ candidate.isHToken,
42
+ );
43
+ };
44
+
45
+ export const aggregateTokenChanges = (tokenChanges: TokenChanges<bigint>[]): TokenChanges<bigint>[] => {
46
+ const aggregated = tokenChanges.reduce(
47
+ (acc, { amount, token, nftIds }) => {
48
+ const key = token.erc20TokenAddress.toLowerCase();
49
+
50
+ if (acc[key]) {
51
+ acc[key].amount += amount;
52
+ } else {
53
+ acc[key] = {
54
+ amount,
55
+ token,
56
+ nftIds,
57
+ };
58
+ }
59
+
60
+ return acc;
61
+ },
62
+ {} as Record<string, TokenChanges<bigint>>,
63
+ );
64
+
65
+ return Object.values(aggregated);
66
+ };
67
+
68
+ export const formatTokenChangesList = (tokenChanges: TokenChanges<bigint>[]) => {
69
+ return tokenChanges
70
+ .map(({ amount, token, nftIds }) => {
71
+ if (amount === 0n) return undefined; // in some cases, token amount can be zero, for example on equlibrium's USR pool on base. the transaction sends us a token which is immediatelly spent
72
+ const sign = amount > 0n ? '+' : '-';
73
+ const amountInToken = Number(getAmountInToken(token, amount));
74
+ return {
75
+ token,
76
+ amount: `${sign}${fixDecimalsAmount(amountInToken > 0 ? amountInToken : -amountInToken)}`,
77
+ nftIds,
78
+ };
79
+ })
80
+ .filter((item): item is Exclude<typeof item, undefined> => !!item);
81
+ };
82
+
83
+ export const isNFTToken = (token: ERC20Token) => {
84
+ return token.nftTokenType === TokenType.ERC721 || token.nftTokenType === TokenType.ERC1155;
85
+ };
86
+
87
+ export const isArcNativeToken = (token: ERC20Token) => {
88
+ return token.chainId === chainIds.arcTestnet && token.erc20TokenAddress === zeroAddress;
89
+ };
90
+
91
+ export const searchCompareFunction = (token: ERC20Token, searchString: string) => {
92
+ const normalizedSearch = searchString.toLowerCase();
93
+ return (
94
+ token.symbol.toLowerCase().includes(normalizedSearch) ||
95
+ token.name.toLowerCase().includes(normalizedSearch) ||
96
+ token.erc20TokenAddress.toLowerCase().startsWith(normalizedSearch)
97
+ );
98
+ };
99
+
100
+ export const sortTokens = (tokens: ERC20Token[]) => {
101
+ const popularTokens = tokens.filter((token) =>
102
+ PopularTokenSymbols.some((tokenSymbol) => tokenSymbol.symbol === token.symbol),
103
+ );
104
+ const nonPopularTokens = tokens.filter(
105
+ (token) => !PopularTokenSymbols.some((tokenSymbol) => tokenSymbol.symbol === token.symbol),
106
+ );
107
+ const sortedPopularTokens = popularTokens.sort((a, b) => a.symbol.localeCompare(b.symbol, 'en-US'));
108
+ const sortedNonPopularTokens = nonPopularTokens.sort((a, b) => a.symbol.localeCompare(b.symbol, 'en-US'));
109
+ return [...sortedPopularTokens, ...sortedNonPopularTokens];
110
+ };
@@ -0,0 +1,32 @@
1
+ import { ethers as ethersV6 } from 'ethers-v6h';
2
+ import { RelayerTransaction } from '../../types/relayer.types';
3
+
4
+ export const convertV6ReceiptToRelayer = (v6Receipt: ethersV6.TransactionReceipt): RelayerTransaction => {
5
+ const relayerTransaction: RelayerTransaction = {
6
+ to: v6Receipt.to || '',
7
+ from: v6Receipt.from,
8
+ contractAddress: v6Receipt.contractAddress,
9
+ gasUsed: {
10
+ type: 'BigNumber',
11
+ hex: v6Receipt.gasUsed.toString(),
12
+ },
13
+ logsBloom: v6Receipt.logsBloom,
14
+ blockHash: v6Receipt.blockHash,
15
+ transactionHash: v6Receipt.hash,
16
+ blockNumber: v6Receipt.blockNumber,
17
+ confirmations: 1, // Set to 1 as default
18
+ cumulativeGasUsed: {
19
+ type: 'BigNumber',
20
+ hex: v6Receipt.cumulativeGasUsed.toString(),
21
+ },
22
+ effectiveGasPrice: {
23
+ type: 'BigNumber',
24
+ hex: v6Receipt.gasPrice ? v6Receipt.gasPrice.toString() : '0x0',
25
+ },
26
+ status: v6Receipt.status !== null ? Number(v6Receipt.status) : 0,
27
+ type: v6Receipt.type !== null ? Number(v6Receipt.type) : 0,
28
+ byzantium: true,
29
+ };
30
+
31
+ return relayerTransaction;
32
+ };
@@ -0,0 +1,9 @@
1
+ import { chainIdsByType, EthereumNetworkType, networkRegistry } from '../../constants';
2
+ import { EthereumNetwork } from '../../types';
3
+
4
+ export const getNetworkObject = (chainId: number): EthereumNetwork => networkRegistry[chainId];
5
+
6
+ export const getNetworkType = (network: EthereumNetwork): EthereumNetworkType =>
7
+ Object.keys(chainIdsByType)[
8
+ Object.values(chainIdsByType).findIndex((chainIdArr) => chainIdArr.includes(network.chainId))
9
+ ] as EthereumNetworkType;
@@ -0,0 +1,15 @@
1
+ import { ethers } from 'ethers';
2
+ import { CIRCOM_P } from '../../constants/protocol.constants';
3
+ import { ExternalActionId } from '../../types/external-action.types';
4
+
5
+ export const getExternalActionIdHash = (externalActionId: ExternalActionId | 0n) => {
6
+ if (externalActionId === 0n) return 0n;
7
+ return BigInt(ethers.utils.id(externalActionId)) % CIRCOM_P;
8
+ };
9
+
10
+ export const getExternalActionIdFromNumber = (externalActionIdNumber: string | bigint) => {
11
+ if (BigInt(externalActionIdNumber) === 0n) return ExternalActionId.Transact;
12
+ return Object.values(ExternalActionId).find(
13
+ (externalActionId) => BigInt(externalActionIdNumber) === getExternalActionIdHash(externalActionId),
14
+ );
15
+ };
@@ -0,0 +1,26 @@
1
+ import { NON_NATIVE_GAS_COST_TOKEN_SYMBOL_OPTIONS } from '../../constants/fees.constants';
2
+ import { zeroAddress } from '../../constants/protocol.constants';
3
+ import { defaultFeeStructure, FeeStructure } from '../../types/hinkal.types';
4
+ import { getERC20Token } from './erc20tokenFunctions';
5
+
6
+ export const generateFeeStructure = (flatFees: bigint[], erc20TokenAddresses: string[]): FeeStructure<bigint> => {
7
+ if (flatFees.length !== erc20TokenAddresses.length) throw new Error('length mismatch');
8
+
9
+ const flatFeeIndex = flatFees.findIndex((flatFee) => flatFee !== 0n);
10
+ if (flatFeeIndex === -1) return defaultFeeStructure;
11
+
12
+ return {
13
+ feeToken: erc20TokenAddresses[flatFeeIndex],
14
+ flatFee: flatFees[flatFeeIndex],
15
+ variableRate: 0n,
16
+ };
17
+ };
18
+
19
+ export const getGasTokenSymbols = (chainId: number | undefined): string[] => {
20
+ if (!chainId) return NON_NATIVE_GAS_COST_TOKEN_SYMBOL_OPTIONS;
21
+
22
+ const nativeTokenSymbol = getERC20Token(zeroAddress, chainId)?.symbol;
23
+ return nativeTokenSymbol && !NON_NATIVE_GAS_COST_TOKEN_SYMBOL_OPTIONS.includes(nativeTokenSymbol)
24
+ ? [nativeTokenSymbol, ...NON_NATIVE_GAS_COST_TOKEN_SYMBOL_OPTIONS]
25
+ : NON_NATIVE_GAS_COST_TOKEN_SYMBOL_OPTIONS;
26
+ };
@@ -0,0 +1,36 @@
1
+ import { API } from '../../API';
2
+ import { IHinkal } from '../../data-structures/Hinkal/IHinkal';
3
+ import { ApprovedUtxoWithInteractionAddress, ERC20Token, TokenApproval } from '../../types';
4
+
5
+ export const getHinkalApprovals = async (hinkal: IHinkal): Promise<TokenApproval[]> => {
6
+ const chainId = hinkal.getCurrentChainId();
7
+
8
+ const approvedUtxos: ApprovedUtxoWithInteractionAddress[] = hinkal.getApprovedUtxos();
9
+
10
+ if (approvedUtxos.length === 0) {
11
+ return [];
12
+ }
13
+
14
+ const uniqueTokenAddresses = [...new Set(approvedUtxos.map((utxo) => utxo.tokenAddress.toLowerCase()))];
15
+
16
+ const tokens = (await API.tokensInfoCall(chainId, uniqueTokenAddresses)).filter(
17
+ (token): token is ERC20Token => !!token,
18
+ );
19
+
20
+ const tokenMap = new Map(tokens.map((token) => [token.erc20TokenAddress.toLowerCase(), token]));
21
+
22
+ const hinkalApprovals: TokenApproval[] = approvedUtxos
23
+ .map((utxo): TokenApproval | null => {
24
+ const token = tokenMap.get(utxo.tokenAddress.toLowerCase());
25
+ if (!token) return null;
26
+
27
+ return {
28
+ token,
29
+ spenderAddress: utxo.interactionAddress,
30
+ allowance: utxo.amount,
31
+ };
32
+ })
33
+ .filter((approval): approval is TokenApproval => approval !== null && approval.allowance > 0n);
34
+
35
+ return hinkalApprovals;
36
+ };
@@ -0,0 +1,5 @@
1
+ export const getSignatureHeader = (signature?: string) => ({
2
+ headers: {
3
+ 'x-user-signature': signature,
4
+ },
5
+ });
@@ -0,0 +1,14 @@
1
+ import { chainIds } from '../../constants/chains.constants';
2
+ import { mediaUrls } from '../../constants/mediaUrls.constants';
3
+
4
+ export const getBlockExplorerUrl = (nonLocalChainId: number) => {
5
+ if (nonLocalChainId === chainIds.polygon) return mediaUrls.POLY_SCAN;
6
+ if (nonLocalChainId === chainIds.arbMainnet) return mediaUrls.ARB_SCAN;
7
+ if (nonLocalChainId === chainIds.ethMainnet) return mediaUrls.ETH_SCAN;
8
+ if (nonLocalChainId === chainIds.avalanche) return mediaUrls.AVAX_SCAN;
9
+ if (nonLocalChainId === chainIds.bnbMainnet) return mediaUrls.BSC_SCAN;
10
+ if (nonLocalChainId === chainIds.base) return mediaUrls.BASE_SCAN;
11
+ if (nonLocalChainId === chainIds.optimism) return mediaUrls.OPTIMISM_SCAN;
12
+ if (nonLocalChainId === chainIds.arcTestnet) return mediaUrls.ARC_TESTNET_EXPLORER;
13
+ return mediaUrls.ETH_SCAN;
14
+ };
@@ -0,0 +1,79 @@
1
+ import { BigNumber, utils } from 'ethers';
2
+ import { DecodedTx, DecodedTxWithUtxos } from '../../types';
3
+
4
+ export const decodeTxInput = (iface: utils.Interface, input: string) => {
5
+ const parsedData = iface.parseTransaction({ data: input });
6
+ const { circomData } = parsedData.args;
7
+ const {
8
+ extraRandomization,
9
+ stealthAddress,
10
+ H0,
11
+ H1,
12
+ }: {
13
+ extraRandomization: BigNumber;
14
+ stealthAddress: BigNumber;
15
+ H0: BigNumber;
16
+ H1: BigNumber;
17
+ } = circomData.stealthAddressStructure;
18
+
19
+ const txData: DecodedTx['decodedInput'] = {
20
+ erc20TokenAddresses: circomData.erc20TokenAddresses as string[],
21
+ amountChanges: circomData.amountChanges as BigNumber[],
22
+ flatFees: circomData.flatFees as BigNumber[],
23
+ externalActionId: circomData.externalActionId as BigNumber,
24
+ externalActionMetadata: circomData.externalActionMetadata as string,
25
+ encryptedOutputs: circomData.encryptedOutputs.map((e: string[][]) => e[0]),
26
+ hookData: circomData.hookData,
27
+ stealthAddressStructure: {
28
+ extraRandomization: extraRandomization.toBigInt(),
29
+ stealthAddress: stealthAddress.toBigInt(),
30
+ H0: H0.toBigInt(),
31
+ H1: H1.toBigInt(),
32
+ },
33
+ };
34
+ return txData;
35
+ };
36
+
37
+ export const deserializeDecodedTxs = (decodedTx: DecodedTxWithUtxos<string, string>): DecodedTxWithUtxos => {
38
+ return {
39
+ ...decodedTx,
40
+ utxosArray: decodedTx.utxosArray?.map((item) => ({ ...item, amount: BigInt(item.amount) })),
41
+ decodedInput: {
42
+ ...decodedTx.decodedInput,
43
+ amountChanges: decodedTx.decodedInput.amountChanges.map(BigNumber.from),
44
+ flatFees: decodedTx.decodedInput.flatFees.map(BigNumber.from),
45
+ externalActionId: BigNumber.from(decodedTx.decodedInput.externalActionId),
46
+ stealthAddressStructure: {
47
+ ...decodedTx.decodedInput.stealthAddressStructure,
48
+ extraRandomization: BigInt(decodedTx.decodedInput.stealthAddressStructure.extraRandomization),
49
+ stealthAddress: BigInt(decodedTx.decodedInput.stealthAddressStructure.stealthAddress),
50
+ H0: BigInt(decodedTx.decodedInput.stealthAddressStructure.H0),
51
+ H1: BigInt(decodedTx.decodedInput.stealthAddressStructure.H1),
52
+ },
53
+ },
54
+ };
55
+ };
56
+
57
+ export const serializeDecodedTxs = (decodedTxs: DecodedTx[]) => {
58
+ const serializedTxs = decodedTxs.map((tx) => {
59
+ const { decodedInput } = tx;
60
+ return {
61
+ ...tx,
62
+ input: '',
63
+ decodedInput: {
64
+ ...decodedInput,
65
+ amountChanges: decodedInput.amountChanges.map((amount) => amount.toString()),
66
+ flatFees: decodedInput.flatFees.map((fee) => fee.toString()),
67
+ externalActionId: decodedInput.externalActionId.toString(),
68
+ stealthAddressStructure: {
69
+ ...decodedInput.stealthAddressStructure,
70
+ extraRandomization: String(decodedInput.stealthAddressStructure.extraRandomization),
71
+ stealthAddress: String(decodedInput.stealthAddressStructure.stealthAddress),
72
+ H0: String(decodedInput.stealthAddressStructure.H0),
73
+ H1: String(decodedInput.stealthAddressStructure.H1),
74
+ },
75
+ },
76
+ };
77
+ });
78
+ return serializedTxs;
79
+ };
@@ -0,0 +1,28 @@
1
+ import { zeroAddress } from '../../constants/protocol.constants';
2
+ import { UserKeys } from '../../data-structures/crypto-keys';
3
+ import { Utxo } from '../../data-structures/utxo/Utxo';
4
+
5
+ export const getRecipientInfoFromUserKeys = (userKeys: UserKeys) => {
6
+ const shieldedPrivateKey = userKeys.getShieldedPrivateKey();
7
+ const encryptionKey = UserKeys.getEncryptionKeyPair(shieldedPrivateKey).publicKey;
8
+
9
+ const utxo = new Utxo({ amount: 0n, erc20TokenAddress: zeroAddress, shieldedPrivateKey });
10
+ const { randomization } = utxo;
11
+ const stealthAddress = utxo.getStealthAddress();
12
+
13
+ if (!randomization || !stealthAddress || !encryptionKey) throw Error('Cannot get recipient information');
14
+
15
+ return `${randomization},${stealthAddress},${encryptionKey}`;
16
+ };
17
+
18
+ export const getExtendedRecipientInfoFromUserKeys = (userKeys: UserKeys) => {
19
+ const shieldedPrivateKey = userKeys.getShieldedPrivateKey();
20
+
21
+ const utxo = new Utxo({ amount: 0n, erc20TokenAddress: zeroAddress, shieldedPrivateKey });
22
+
23
+ const { randomization } = utxo;
24
+ const stealthAddress = utxo.getStealthAddress();
25
+ const { h0, h1 } = UserKeys.getStealthAddressCompressedPoints(randomization, shieldedPrivateKey);
26
+
27
+ return `${randomization},${stealthAddress},${h0},${h1}`;
28
+ };
@@ -0,0 +1,9 @@
1
+ import { ethers } from 'ethers';
2
+ import { ParsedInLogicMetadata } from '../../types/hinkal.types';
3
+
4
+ export const encodeParsedInLogicMetadata = (metadata: ParsedInLogicMetadata): string => {
5
+ return ethers.utils.defaultAbiCoder.encode(
6
+ ['bytes', 'uint256', 'address[]', 'bytes'],
7
+ [metadata.signature, metadata.deadline, metadata.erc20TokenAddresses, metadata.externalCallData],
8
+ );
9
+ };
@@ -0,0 +1,43 @@
1
+ export * from './amounts.utils';
2
+ export * from './cacheFunctions';
3
+ export * from './create-provider';
4
+ export * from './external-action.utils';
5
+ export * from './erc20tokenFunctions';
6
+ export * from './requireEnv';
7
+ export * from './resolve-sync.utils';
8
+ export * from './convertIntegrationProviderToExternalActionId';
9
+ export * from '../pre-transaction';
10
+ export * from './evmNetworkFunctions';
11
+ export * from './userAgent';
12
+ export * from './getDataFromTransaction';
13
+ export * from './reloadPage';
14
+ export * from './string.utils';
15
+ export * from './nickname.utils';
16
+ export * from './caseInsensitive.utils';
17
+ export * from './time.utils';
18
+ export * from './cacheDevice.utils';
19
+ export * from './process.utils';
20
+ export * from './getBlockExplorerUrl';
21
+ export * from './involves-permit2-op';
22
+ export * from './upToDateState';
23
+ export * from './serialize.utils';
24
+ export * from './processUseApprovalUtxoData';
25
+ export * from './convertEmporiumOpToCallInfo';
26
+ export * from './getRecipientInfoFromUserKeys';
27
+ export * from './publicBalance.utils';
28
+ export * from './rpc-int-encode';
29
+ export * from './token-check.utils';
30
+ export * from './arraysMatch';
31
+ export * from './addresses';
32
+ export * from './trimFieldValues';
33
+ export * from './walletBalances.utils';
34
+ export * from './mutexes.utils';
35
+ export * from './ethers-formatter.utils';
36
+ export * from './nftTokenFunctions';
37
+ export * from './inLogicMetadata';
38
+ export * from './networks.utils';
39
+ export * from './is-valid-url';
40
+ export * from './get-hinkal-approvals';
41
+ export * from './mystery-box-auction.utils';
42
+ export * from './postToOffscreen';
43
+ export * from './get-signature-header';
@@ -0,0 +1,17 @@
1
+ import { permit2Addresses, uniswapWorkaroundAddresses } from '../../constants/permit2.constants';
2
+ import { caseInsensitiveEqual } from './caseInsensitive.utils';
3
+
4
+ export const isPermit2Tx = (to: string) =>
5
+ permit2Addresses.some((permitAddress) => caseInsensitiveEqual(to, permitAddress));
6
+
7
+ /**
8
+ * Uniswap appends extra data at the end of the calldada,
9
+ * which can cause permit and V3 pool approvals to fail.
10
+ * This function checks whether a workaround is needed by detecting
11
+ * if any operation includes a known Uniswap-related address.
12
+ */
13
+ export const uniswapWorkaround = (ops: string[]) => {
14
+ return ops.some((op) =>
15
+ uniswapWorkaroundAddresses.some((permitAddress) => op.toLowerCase().includes(permitAddress.slice(2).toLowerCase())),
16
+ );
17
+ };