@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.
- package/.env.example +5 -0
- package/.eslintrc.json +18 -0
- package/README.md +164 -0
- package/copyPackageJson.js +81 -0
- package/handleCDNWorkers.js +92 -0
- package/jest.config.ts +10 -0
- package/package.json +101 -0
- package/polyfillWorker.ts +15 -0
- package/project.json +32 -0
- package/src/API/API.ts +203 -0
- package/src/API/admin-calls.ts +8 -0
- package/src/API/ai-calls.ts +48 -0
- package/src/API/brotherhoodCalls.ts +184 -0
- package/src/API/callLifiAPI.ts +41 -0
- package/src/API/callMonitor.ts +9 -0
- package/src/API/callOdosAPI.ts +89 -0
- package/src/API/callOneInchAPI.ts +47 -0
- package/src/API/callRelayer.ts +23 -0
- package/src/API/checkRisk.ts +7 -0
- package/src/API/duneAPI.ts +26 -0
- package/src/API/enclaveCalls.ts +23 -0
- package/src/API/fetchCommitmentsCache.ts +63 -0
- package/src/API/generate-trading-points.ts +77 -0
- package/src/API/get-token-data.ts +12 -0
- package/src/API/getBridgeProtocols.ts +16 -0
- package/src/API/getCoingeckoPrice.ts +59 -0
- package/src/API/getGasEstimates.ts +30 -0
- package/src/API/getLifiStatus.ts +35 -0
- package/src/API/getRelayerURL.ts +27 -0
- package/src/API/getServerURL.ts +116 -0
- package/src/API/getTokenPrice.ts +39 -0
- package/src/API/getWebsiteURL.ts +58 -0
- package/src/API/index.ts +19 -0
- package/src/API/is-tx-stateless.ts +32 -0
- package/src/API/kycCalls.ts +81 -0
- package/src/API/leaderboardCalls.ts +32 -0
- package/src/API/mysteryBoxesCalls.ts +141 -0
- package/src/API/passwordCalls.ts +34 -0
- package/src/API/proxyAccountsCalls.ts +40 -0
- package/src/API/referralsCalls.ts +52 -0
- package/src/API/relayCalls.ts +14 -0
- package/src/API/restoreSnapshots.ts +7 -0
- package/src/API/rewardsUserCalls.ts +124 -0
- package/src/API/send-telegram-callback.ts +17 -0
- package/src/API/simulate-batch-tx.ts +19 -0
- package/src/API/tenderly.api.ts +96 -0
- package/src/API/token-calls.ts +19 -0
- package/src/API/weeklyAnalyticCalls.ts +43 -0
- package/src/constants/activity.constants.ts +10 -0
- package/src/constants/addresses.constants.ts +74 -0
- package/src/constants/assets.constants.ts +15 -0
- package/src/constants/backend.constants.ts +16 -0
- package/src/constants/balance.constants.ts +1 -0
- package/src/constants/bridging.constants.ts +5 -0
- package/src/constants/chains.constants.ts +194 -0
- package/src/constants/coingecko.constants.ts +67 -0
- package/src/constants/contracts.constants.ts +106 -0
- package/src/constants/conversion.constants.ts +1 -0
- package/src/constants/deploy-data/deploy-data-arbMainnet.json +5685 -0
- package/src/constants/deploy-data/deploy-data-arcTestnet.json +6157 -0
- package/src/constants/deploy-data/deploy-data-avalanche.json +5921 -0
- package/src/constants/deploy-data/deploy-data-base.json +5695 -0
- package/src/constants/deploy-data/deploy-data-bnbMainnet.json +5921 -0
- package/src/constants/deploy-data/deploy-data-ethMainnet.json +5922 -0
- package/src/constants/deploy-data/deploy-data-localhost.json +5921 -0
- package/src/constants/deploy-data/deploy-data-optimism.json +5687 -0
- package/src/constants/deploy-data/deploy-data-polygon.json +5695 -0
- package/src/constants/deploy-data/index.ts +21 -0
- package/src/constants/events.constants.ts +10 -0
- package/src/constants/fees.constants.ts +4 -0
- package/src/constants/function-signatures.constants.ts +6 -0
- package/src/constants/index.ts +30 -0
- package/src/constants/kyc.constants.ts +202 -0
- package/src/constants/lifi.constants.ts +1 -0
- package/src/constants/mediaUrls.constants.ts +25 -0
- package/src/constants/mystery-boxes.constants.ts +402 -0
- package/src/constants/oauthUrls.constants.ts +7 -0
- package/src/constants/permit2.constants.ts +28 -0
- package/src/constants/presale.constants.ts +503 -0
- package/src/constants/protocol.constants.ts +65 -0
- package/src/constants/reorg-depths.constants.ts +13 -0
- package/src/constants/rewards.constants.ts +27 -0
- package/src/constants/save-depths.ts +13 -0
- package/src/constants/server.constants.ts +233 -0
- package/src/constants/tasks.constants.ts +205 -0
- package/src/constants/token-data/ERC20Registry.ts +90 -0
- package/src/constants/token-data/arbMainnetRegistry.json +1841 -0
- package/src/constants/token-data/arbMainnetRegistryFixed.json +1841 -0
- package/src/constants/token-data/arcTestnetRegistry.json +436 -0
- package/src/constants/token-data/avalancheRegistry.json +729 -0
- package/src/constants/token-data/avalancheRegistryFixed.json +729 -0
- package/src/constants/token-data/baseRegistry.json +1134 -0
- package/src/constants/token-data/baseRegistryFixed.json +1134 -0
- package/src/constants/token-data/bnbMainnetRegistry.json +900 -0
- package/src/constants/token-data/bnbMainnetRegistryFixed.json +900 -0
- package/src/constants/token-data/ethMainnetRegistry.json +4298 -0
- package/src/constants/token-data/ethMainnetRegistryFixed.json +4298 -0
- package/src/constants/token-data/index.ts +60 -0
- package/src/constants/token-data/localhostRegistry.json +2784 -0
- package/src/constants/token-data/optimismRegistry.json +701 -0
- package/src/constants/token-data/optimismRegistryFixed.json +701 -0
- package/src/constants/token-data/polygonRegistry.json +2309 -0
- package/src/constants/token-data/polygonRegistryFixed.json +2309 -0
- package/src/constants/token-data/popularTokens.constants.ts +11 -0
- package/src/constants/token-data/tokenPricing.consts.ts +2 -0
- package/src/constants/token.limits.constants.ts +31 -0
- package/src/constants/vite.constants.ts +74 -0
- package/src/constants/wallet.constants.ts +9 -0
- package/src/crypto/babyJub.ts +31 -0
- package/src/crypto/index.ts +3 -0
- package/src/crypto/poseidon.ts +36 -0
- package/src/crypto/preProcessing.ts +20 -0
- package/src/data-structures/ApprovalDBs/EventsPublicApprovalsDB.ts +288 -0
- package/src/data-structures/ApprovalDBs/index.ts +1 -0
- package/src/data-structures/Hinkal/Hinkal.ts +746 -0
- package/src/data-structures/Hinkal/IHinkal.ts +315 -0
- package/src/data-structures/Hinkal/handleAutoDepositBack.ts +138 -0
- package/src/data-structures/Hinkal/hinkalActionFundApproveAndTransact.ts +64 -0
- package/src/data-structures/Hinkal/hinkalActionReceive.ts +65 -0
- package/src/data-structures/Hinkal/hinkalActionStake.ts +152 -0
- package/src/data-structures/Hinkal/hinkalApprove.ts +170 -0
- package/src/data-structures/Hinkal/hinkalCheckTokenRegistry.ts +26 -0
- package/src/data-structures/Hinkal/hinkalDeposit.ts +199 -0
- package/src/data-structures/Hinkal/hinkalGetRecipientInfo.ts +12 -0
- package/src/data-structures/Hinkal/hinkalGetZkMeProvider.ts +31 -0
- package/src/data-structures/Hinkal/hinkalInsideTransact.ts +190 -0
- package/src/data-structures/Hinkal/hinkalMultiSend.ts +26 -0
- package/src/data-structures/Hinkal/hinkalPrivateWallet.ts +198 -0
- package/src/data-structures/Hinkal/hinkalProoflessDeposit.ts +91 -0
- package/src/data-structures/Hinkal/hinkalProxySwap.ts +91 -0
- package/src/data-structures/Hinkal/hinkalSignSubAccount.ts +28 -0
- package/src/data-structures/Hinkal/hinkalSwap.ts +157 -0
- package/src/data-structures/Hinkal/hinkalTransfer.ts +171 -0
- package/src/data-structures/Hinkal/hinkalWithdraw.ts +161 -0
- package/src/data-structures/Hinkal/index.ts +9 -0
- package/src/data-structures/Hinkal/resetMerkleTrees.ts +64 -0
- package/src/data-structures/IndexedDB/activity-db.ts +204 -0
- package/src/data-structures/IndexedDB/balances-db.ts +97 -0
- package/src/data-structures/IndexedDB/contact-db.ts +81 -0
- package/src/data-structures/IndexedDB/index.ts +6 -0
- package/src/data-structures/IndexedDB/prices-db.ts +89 -0
- package/src/data-structures/IndexedDB/private-balances-db.ts +31 -0
- package/src/data-structures/IndexedDB/signatures-db.ts +62 -0
- package/src/data-structures/MultiThreadedUtxoUtils/MultiThreadedUtxoUtils.ts +152 -0
- package/src/data-structures/TokenDBs/AlchemyPublicTokensDB.ts +224 -0
- package/src/data-structures/TokenDBs/ArcPublicTokensDB.ts +198 -0
- package/src/data-structures/TokenDBs/EventsPublicTokensDB.ts +216 -0
- package/src/data-structures/TokenDBs/IPublicTokensDB.ts +7 -0
- package/src/data-structures/TokenDBs/PrivateTokensDB.ts +96 -0
- package/src/data-structures/TokenDBs/PublicTokensDB.ts +49 -0
- package/src/data-structures/TokenDBs/index.ts +4 -0
- package/src/data-structures/TokenDBs/token-visibility-db.ts +154 -0
- package/src/data-structures/ValueCache/ValueCache.ts +29 -0
- package/src/data-structures/ValueCache/index.ts +1 -0
- package/src/data-structures/cacheDevices/AttachableMemoryCacheDevice.ts +33 -0
- package/src/data-structures/cacheDevices/BaseCacheDevice.ts +30 -0
- package/src/data-structures/cacheDevices/FileCacheDevice.ts +59 -0
- package/src/data-structures/cacheDevices/LocalStorageCacheDevice.ts +36 -0
- package/src/data-structures/cacheDevices/index.ts +2 -0
- package/src/data-structures/crypto-keys/decodeUTXO.ts +60 -0
- package/src/data-structures/crypto-keys/encryptDecryptUtxo.ts +74 -0
- package/src/data-structures/crypto-keys/index.ts +4 -0
- package/src/data-structures/crypto-keys/keyUtils.ts +8 -0
- package/src/data-structures/crypto-keys/keys.ts +203 -0
- package/src/data-structures/custom-token-registry/CustomTokenRegistry.ts +49 -0
- package/src/data-structures/event-service/AbstractAccessTokenSnapshotService.ts +142 -0
- package/src/data-structures/event-service/AbstractApprovalsSnapshotService.ts +152 -0
- package/src/data-structures/event-service/AbstractCommitmentsSnapshotService.ts +116 -0
- package/src/data-structures/event-service/AbstractEventService.ts +44 -0
- package/src/data-structures/event-service/AbstractNullifierSnapshotService.ts +76 -0
- package/src/data-structures/event-service/AbstractSnapshotService.ts +63 -0
- package/src/data-structures/event-service/BlockchainEventEmitter.ts +132 -0
- package/src/data-structures/event-service/index.ts +7 -0
- package/src/data-structures/index.ts +18 -0
- package/src/data-structures/merkle-tree/MerkleTree.test.ts +77 -0
- package/src/data-structures/merkle-tree/MerkleTree.ts +253 -0
- package/src/data-structures/merkle-tree/MerkleTreeIncompleteError.ts +6 -0
- package/src/data-structures/merkle-tree/getPatchedAccessTokenMerkleTree.ts +24 -0
- package/src/data-structures/merkle-tree/index.ts +3 -0
- package/src/data-structures/presale/PresaleContractWrapper.ts +80 -0
- package/src/data-structures/presale/index.ts +1 -0
- package/src/data-structures/provider-adapter/IProviderAdapter.ts +43 -0
- package/src/data-structures/snapshot/ClientAccessTokenSnapshotService.ts +41 -0
- package/src/data-structures/snapshot/ClientApprovalsSnapshotService.ts +36 -0
- package/src/data-structures/snapshot/ClientCommitmentsSnapshotService.ts +30 -0
- package/src/data-structures/snapshot/ClientNullifierSnapshotService.ts +28 -0
- package/src/data-structures/snapshot/SnapshotFetcherService.ts +68 -0
- package/src/data-structures/snapshot/index.ts +1 -0
- package/src/data-structures/token-price-fetcher/TokenChecker.ts +45 -0
- package/src/data-structures/token-price-fetcher/index.ts +1 -0
- package/src/data-structures/tor/HttpClient.ts +118 -0
- package/src/data-structures/tor/TorAdapter.ts +94 -0
- package/src/data-structures/tor/TorClient.ts +283 -0
- package/src/data-structures/tor/WebSocketDuplex.ts +32 -0
- package/src/data-structures/tor/index.ts +3 -0
- package/src/data-structures/transactions-manager/history/history.types.ts +14 -0
- package/src/data-structures/transactions-manager/index.ts +1 -0
- package/src/data-structures/utxo/Utxo.ts +189 -0
- package/src/error-handling/customErrors/ErrorWithAmount.ts +8 -0
- package/src/error-handling/customErrors/ErrorWithTx.ts +10 -0
- package/src/error-handling/customErrors/FeeOverTransactionValueError.ts +16 -0
- package/src/error-handling/customErrors/SimulationFailureError.ts +9 -0
- package/src/error-handling/customErrors/customErrors.helpers.ts +39 -0
- package/src/error-handling/customErrors/index.ts +5 -0
- package/src/error-handling/error-codes.constants.ts +214 -0
- package/src/error-handling/get-error.message.ts +149 -0
- package/src/error-handling/handleErrorRestore.ts +25 -0
- package/src/error-handling/index.ts +7 -0
- package/src/error-handling/logError.ts +8 -0
- package/src/error-handling/logger.ts +21 -0
- package/src/error-handling/types.ts +10 -0
- package/src/externalABIs/BUSD.ts +516 -0
- package/src/externalABIs/BabPassport.json +24 -0
- package/src/externalABIs/DAI.ts +331 -0
- package/src/externalABIs/ERC1155.json +316 -0
- package/src/externalABIs/ERC20.json +297 -0
- package/src/externalABIs/ERC20.ts +1 -0
- package/src/externalABIs/ERC721.json +205 -0
- package/src/externalABIs/GalxePassport.json +23 -0
- package/src/externalABIs/IQuoterV2.json +211 -0
- package/src/externalABIs/ISwapRouter.json +568 -0
- package/src/externalABIs/IUniswapV3Factory.json +207 -0
- package/src/externalABIs/IUniswapV3Pool.json +999 -0
- package/src/externalABIs/NodeInterfaceABI.json +1 -0
- package/src/externalABIs/OptimismGasPriceOracle.json +1 -0
- package/src/externalABIs/PoLidoNftAbi.json +307 -0
- package/src/externalABIs/SanctionsList.ts +86 -0
- package/src/externalABIs/USDC.ts +718 -0
- package/src/externalABIs/USDR.ts +343 -0
- package/src/externalABIs/USDR3CRV.ts +539 -0
- package/src/externalABIs/USDT.ts +390 -0
- package/src/externalABIs/UniswapV2PoolAbi.json +66 -0
- package/src/externalABIs/WETH.ts +153 -0
- package/src/externalABIs/amToken.ts +347 -0
- package/src/externalABIs/index.ts +53 -0
- package/src/externalABIs/swapAbi.ts +442 -0
- package/src/externalABIs/transactionsProver.json +45 -0
- package/src/functions/index.ts +16 -0
- package/src/functions/kyc/aiPriseHelper.ts +0 -0
- package/src/functions/kyc/authentoHelper.ts +44 -0
- package/src/functions/kyc/index.ts +3 -0
- package/src/functions/kyc/openDefaultPassportWindow.ts +9 -0
- package/src/functions/kyc/passportHelper.ts +13 -0
- package/src/functions/kyc/zkMeHelper.ts +69 -0
- package/src/functions/pre-transaction/constructAdminData.ts +21 -0
- package/src/functions/pre-transaction/getExternalSwapAddress.ts +30 -0
- package/src/functions/pre-transaction/getFeeStructure.ts +44 -0
- package/src/functions/pre-transaction/getFlatFees.ts +88 -0
- package/src/functions/pre-transaction/getSignatureDataForTransact.ts +16 -0
- package/src/functions/pre-transaction/getVolatileTransferAmount.ts +56 -0
- package/src/functions/pre-transaction/index.ts +7 -0
- package/src/functions/pre-transaction/interaction-to-action.ts +17 -0
- package/src/functions/pre-transaction/merge-with-fee-structure-emporium.ts +50 -0
- package/src/functions/pre-transaction/merge-with-fee-structure.ts +35 -0
- package/src/functions/pre-transaction/outputApprovalDataProcessing.ts +95 -0
- package/src/functions/pre-transaction/outputUtxoProcessing.ts +52 -0
- package/src/functions/pre-transaction/process-gas-estimates.ts +36 -0
- package/src/functions/pre-transaction/shouldPatchAccessTokenMerkleTree.ts +15 -0
- package/src/functions/private-wallet/emporium.helpers.ts +296 -0
- package/src/functions/private-wallet/emporium.swap.helpers.ts +284 -0
- package/src/functions/private-wallet/index.ts +3 -0
- package/src/functions/private-wallet/opProducer.ts +33 -0
- package/src/functions/snarkjs/common.snarkjs.ts +377 -0
- package/src/functions/snarkjs/constant.ts +490 -0
- package/src/functions/snarkjs/constructEmporiumProof.ts +301 -0
- package/src/functions/snarkjs/constructGeneralZkProof.ts +281 -0
- package/src/functions/snarkjs/generateCircomData.ts +81 -0
- package/src/functions/snarkjs/generateZkProof.ts +21 -0
- package/src/functions/snarkjs/generateZkProofEnclave.ts +45 -0
- package/src/functions/snarkjs/generateZkProofSelf.ts +29 -0
- package/src/functions/snarkjs/getOriginalSender.ts +4 -0
- package/src/functions/snarkjs/getZKFiles.ts +29 -0
- package/src/functions/snarkjs/index.ts +4 -0
- package/src/functions/staking/index.ts +78 -0
- package/src/functions/utils/addresses.ts +37 -0
- package/src/functions/utils/amounts.utils.test.ts +91 -0
- package/src/functions/utils/amounts.utils.ts +119 -0
- package/src/functions/utils/arraysMatch.ts +4 -0
- package/src/functions/utils/cacheDevice.utils.ts +21 -0
- package/src/functions/utils/cacheFunctions.ts +154 -0
- package/src/functions/utils/caseInsensitive.utils.ts +10 -0
- package/src/functions/utils/convertEmporiumOpToCallInfo.ts +19 -0
- package/src/functions/utils/convertIntegrationProviderToExternalActionId.ts +14 -0
- package/src/functions/utils/create-provider.ts +11 -0
- package/src/functions/utils/encodeTokenWithId.ts +4 -0
- package/src/functions/utils/encryptInputForEnclave.ts +119 -0
- package/src/functions/utils/enum.utils.ts +30 -0
- package/src/functions/utils/erc20tokenFunctions.ts +110 -0
- package/src/functions/utils/ethers-formatter.utils.ts +32 -0
- package/src/functions/utils/evmNetworkFunctions.ts +9 -0
- package/src/functions/utils/external-action.utils.ts +15 -0
- package/src/functions/utils/fees.utils.ts +26 -0
- package/src/functions/utils/get-hinkal-approvals.ts +36 -0
- package/src/functions/utils/get-signature-header.ts +5 -0
- package/src/functions/utils/getBlockExplorerUrl.ts +14 -0
- package/src/functions/utils/getDataFromTransaction.ts +79 -0
- package/src/functions/utils/getRecipientInfoFromUserKeys.ts +28 -0
- package/src/functions/utils/inLogicMetadata.ts +9 -0
- package/src/functions/utils/index.ts +43 -0
- package/src/functions/utils/involves-permit2-op.ts +17 -0
- package/src/functions/utils/ipfs.ts +74 -0
- package/src/functions/utils/is-valid-url.ts +5 -0
- package/src/functions/utils/lifi.utils.ts +3 -0
- package/src/functions/utils/memoize.utils.ts +23 -0
- package/src/functions/utils/merkleTree.utils.ts +27 -0
- package/src/functions/utils/mutexes.utils.ts +3 -0
- package/src/functions/utils/mystery-box-auction.utils.ts +61 -0
- package/src/functions/utils/networks.utils.ts +6 -0
- package/src/functions/utils/nftTokenFunctions.ts +25 -0
- package/src/functions/utils/nickname.utils.ts +4 -0
- package/src/functions/utils/postToOffscreen.ts +6 -0
- package/src/functions/utils/prepareHinkal.ts +78 -0
- package/src/functions/utils/process.utils.ts +23 -0
- package/src/functions/utils/processUseApprovalUtxoData.ts +26 -0
- package/src/functions/utils/publicBalance.utils.ts +131 -0
- package/src/functions/utils/reloadPage.ts +1 -0
- package/src/functions/utils/replaceAddressInCalldata.ts +6 -0
- package/src/functions/utils/requireEnv.ts +10 -0
- package/src/functions/utils/resolve-sync.utils.ts +40 -0
- package/src/functions/utils/rpc-int-encode.ts +7 -0
- package/src/functions/utils/serialize.utils.ts +12 -0
- package/src/functions/utils/string.utils.ts +92 -0
- package/src/functions/utils/time.utils.ts +80 -0
- package/src/functions/utils/token-check.utils.ts +12 -0
- package/src/functions/utils/trimFieldValues.ts +24 -0
- package/src/functions/utils/upToDateState.ts +12 -0
- package/src/functions/utils/userAgent.ts +26 -0
- package/src/functions/utils/walletBalances.utils.ts +117 -0
- package/src/functions/web3/EIP-712.test.ts +302 -0
- package/src/functions/web3/EIP-712.ts +243 -0
- package/src/functions/web3/etherFunctions.test.ts +129 -0
- package/src/functions/web3/etherFunctions.ts +84 -0
- package/src/functions/web3/events/balanceChangedCustomHandler.ts +13 -0
- package/src/functions/web3/events/balanceChangedHandler.ts +10 -0
- package/src/functions/web3/events/getApprovedBalance.ts +154 -0
- package/src/functions/web3/events/getInputUtxoAndBalance.ts +305 -0
- package/src/functions/web3/events/getInputUtxosEnclave.ts +40 -0
- package/src/functions/web3/events/getShieldedBalance.ts +163 -0
- package/src/functions/web3/events/getTransactionLogEvents.ts +55 -0
- package/src/functions/web3/events/index.ts +7 -0
- package/src/functions/web3/events/web3RetrieveEvents.ts +33 -0
- package/src/functions/web3/functionCalls/accessTokenCalls.ts +27 -0
- package/src/functions/web3/functionCalls/approveToken.ts +180 -0
- package/src/functions/web3/functionCalls/approveTokensToHinkal.ts +21 -0
- package/src/functions/web3/functionCalls/estimateGasRelayer.ts +40 -0
- package/src/functions/web3/functionCalls/getRootHash.ts +7 -0
- package/src/functions/web3/functionCalls/inHinkalApprovalCalls.ts +60 -0
- package/src/functions/web3/functionCalls/relayFunctions.ts +12 -0
- package/src/functions/web3/functionCalls/transactCallDirect.ts +71 -0
- package/src/functions/web3/functionCalls/transactCallRelayer.ts +57 -0
- package/src/functions/web3/getContractMetadata.ts +43 -0
- package/src/functions/web3/getPublicAddressBalance.ts +17 -0
- package/src/functions/web3/getTokenHolder.ts +53 -0
- package/src/functions/web3/index.ts +9 -0
- package/src/functions/web3/lifiAPI.ts +41 -0
- package/src/functions/web3/odosAPI.ts +50 -0
- package/src/functions/web3/oneInchAPI.ts +47 -0
- package/src/functions/web3/runContractFunction.ts +116 -0
- package/src/functions/web3/uniswapAPI.ts +156 -0
- package/src/index.ts +9 -0
- package/src/mutexes/index.ts +1 -0
- package/src/mutexes/mutex.ts +3 -0
- package/src/providers/EthersProviderAdapter.ts +230 -0
- package/src/providers/TorExternalProvider.ts +36 -0
- package/src/providers/WagmiProviderAdapter.ts +311 -0
- package/src/providers/exportProviers.ts +11 -0
- package/src/providers/prepareEthersHinkal.ts +18 -0
- package/src/providers/prepareWagmiHinkal.ts +16 -0
- package/src/types/API.types.ts +23 -0
- package/src/types/ICacheDevice.ts +5 -0
- package/src/types/IMultiThreadedUtxoUtils.ts +16 -0
- package/src/types/RewardUserEnums.ts +12 -0
- package/src/types/TransactionSimulator.types.ts +30 -0
- package/src/types/WeeklyAnalytics.types.ts +44 -0
- package/src/types/activities.types.ts +90 -0
- package/src/types/admin.types.ts +30 -0
- package/src/types/all-points.types.ts +8 -0
- package/src/types/approvals.types.ts +45 -0
- package/src/types/balances.types.ts +20 -0
- package/src/types/big-intable.types.ts +3 -0
- package/src/types/bridging.types.ts +30 -0
- package/src/types/brotherhood-user.types.ts +13 -0
- package/src/types/cache.types.ts +42 -0
- package/src/types/circom-data.types.ts +120 -0
- package/src/types/coingecko.types.ts +216 -0
- package/src/types/commitments.types.ts +39 -0
- package/src/types/confirmation-request.types.ts +10 -0
- package/src/types/contacts.types.ts +6 -0
- package/src/types/crypto.types.ts +8 -0
- package/src/types/duneAPI.types.ts +9 -0
- package/src/types/eip5792.types.ts +31 -0
- package/src/types/ethereum-network.types.ts +70 -0
- package/src/types/external-action.types.ts +19 -0
- package/src/types/fee.types.ts +11 -0
- package/src/types/generatePoints.ts +14 -0
- package/src/types/hinkal.stake.types.ts +12 -0
- package/src/types/hinkal.types.ts +150 -0
- package/src/types/index.ts +50 -0
- package/src/types/kyc.types.ts +49 -0
- package/src/types/merch-order.types.ts +18 -0
- package/src/types/message.types.ts +6 -0
- package/src/types/mystery-boxes.types.ts +50 -0
- package/src/types/new-rewards.type.ts +181 -0
- package/src/types/offscreen.types.ts +8 -0
- package/src/types/presaleReferral.types.ts +4 -0
- package/src/types/proxy.types.ts +11 -0
- package/src/types/referral.types.ts +13 -0
- package/src/types/relayer.types.ts +16 -0
- package/src/types/remote-proof.types.ts +18 -0
- package/src/types/rewards.types.ts +53 -0
- package/src/types/routing.types.ts +7 -0
- package/src/types/sandbox.types.ts +246 -0
- package/src/types/session.types.ts +12 -0
- package/src/types/signature.types.ts +11 -0
- package/src/types/slippage.types.ts +3 -0
- package/src/types/snark.types.ts +43 -0
- package/src/types/tenderly.api.types.ts +200 -0
- package/src/types/token-prices.types.ts +8 -0
- package/src/types/token-with-id.types.ts +4 -0
- package/src/types/token.types.ts +86 -0
- package/src/types/transactions.types.ts +120 -0
- package/src/types/wc.types.ts +83 -0
- package/src/types/with-id.types.ts +1 -0
- package/src/webworker/performTaskWithWorker.ts +50 -0
- package/src/webworker/snarkjsWorker/snarkjs.d.ts +2 -0
- package/src/webworker/snarkjsWorker/snarkjsWorker.types.ts +18 -0
- package/src/webworker/snarkjsWorker/snarkjsWorkerLauncher.ts +19 -0
- package/src/webworker/snarkjsWorker/snarkjsWorkerLogic.ts +90 -0
- package/src/webworker/utxoWorker/utxoWorker.types.ts +41 -0
- package/src/webworker/utxoWorker/utxoWorkerLauncher.ts +19 -0
- package/src/webworker/utxoWorker/utxoWorkerLogic.ts +107 -0
- package/src/webworker/viteWorkerURL.constant.ts +25 -0
- package/src/webworker/worker.registry.ts +11 -0
- package/src/webworker/worker.types.ts +35 -0
- package/src/webworker/workerErrorHandler.ts +10 -0
- package/src/webworker/workerFactory.ts +47 -0
- package/src/webworker/workerProxy.ts +88 -0
- package/src/webworker/zkProofWorker/zkProofWorker.types.ts +52 -0
- package/src/webworker/zkProofWorker/zkProofWorkerLauncher.ts +19 -0
- package/src/webworker/zkProofWorker/zkProofWorkerLogic.ts +84 -0
- package/tsconfig.json +23 -0
- package/tsconfig.lib.json +10 -0
- package/tsconfig.spec.json +15 -0
- package/vite.config.ts +97 -0
- package/vite.config.workers.ts +51 -0
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { AbstractSnapshotService, Snapshot } from './AbstractSnapshotService';
|
|
2
|
+
import { NewApprovedUtxoEvent } from '../../types/commitments.types';
|
|
3
|
+
import { BlockchainEventEmitter } from './BlockchainEventEmitter';
|
|
4
|
+
import { ApprovedUtxo } from '../../types/hinkal.types';
|
|
5
|
+
import { toBigInt } from '../../functions/utils/amounts.utils';
|
|
6
|
+
import { caseInsensitiveEqual } from '../../functions/utils/caseInsensitive.utils';
|
|
7
|
+
|
|
8
|
+
export type ApprovalsSnapshotPayload = {
|
|
9
|
+
readonly approvals: Map<string, ApprovedUtxo[]>;
|
|
10
|
+
readonly events: Set<string>;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export type ApprovalsSerializedSnapshot = {
|
|
14
|
+
latestBlockNumber?: number;
|
|
15
|
+
approvals: Record<string, ApprovedUtxo<string>[]>;
|
|
16
|
+
events: string[];
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export abstract class AbstractApprovalsSnapshotService extends AbstractSnapshotService<
|
|
20
|
+
NewApprovedUtxoEvent,
|
|
21
|
+
NewApprovedUtxoEvent<string>,
|
|
22
|
+
ApprovalsSnapshotPayload,
|
|
23
|
+
ApprovalsSerializedSnapshot
|
|
24
|
+
> {
|
|
25
|
+
constructor(hinkalEventEmitter: BlockchainEventEmitter) {
|
|
26
|
+
super(hinkalEventEmitter, 'NewApprovedUtxo');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
private _approvals = new Map<string, ApprovedUtxo[]>();
|
|
30
|
+
|
|
31
|
+
public events = new Set<string>();
|
|
32
|
+
|
|
33
|
+
get approvals() {
|
|
34
|
+
return this._approvals;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
private getEventKey(inHinkalAddress: bigint, tokenAddress: string, txHash: string) {
|
|
38
|
+
if (typeof inHinkalAddress !== 'bigint' || typeof txHash !== 'string' || typeof tokenAddress !== 'string')
|
|
39
|
+
return null;
|
|
40
|
+
return `${txHash}-${tokenAddress}-${inHinkalAddress}`;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
protected override serializeSnapshot(snapshot: Snapshot<ApprovalsSnapshotPayload>): ApprovalsSerializedSnapshot {
|
|
44
|
+
const approvalObject = Object.fromEntries(snapshot.payload.approvals);
|
|
45
|
+
|
|
46
|
+
const serializedApprovalsArray = Object.entries<ApprovedUtxo[]>(approvalObject).map(([address, utxos]) => {
|
|
47
|
+
const newUtxos = utxos.map<ApprovedUtxo<string>>((utxo) => ({
|
|
48
|
+
amount: utxo.amount.toString(),
|
|
49
|
+
tokenAddress: utxo.tokenAddress,
|
|
50
|
+
inHinkalAddress: utxo.inHinkalAddress.toString(),
|
|
51
|
+
}));
|
|
52
|
+
return [address, newUtxos] as [string, ApprovedUtxo<string>[]];
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
const serializedApprovals = Object.fromEntries(serializedApprovalsArray) as Record<string, ApprovedUtxo<string>[]>;
|
|
56
|
+
|
|
57
|
+
return {
|
|
58
|
+
latestBlockNumber: snapshot.latestBlockNumber,
|
|
59
|
+
approvals: serializedApprovals,
|
|
60
|
+
events: [...this.events],
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
protected override deserializeSnapshot(
|
|
65
|
+
serializedSnapshot: ApprovalsSerializedSnapshot,
|
|
66
|
+
): Snapshot<ApprovalsSnapshotPayload> {
|
|
67
|
+
const serializedApprovalsObject = serializedSnapshot.approvals;
|
|
68
|
+
const deserializedApprovalsArray = Object.entries<ApprovedUtxo<string>[]>(serializedApprovalsObject).map(
|
|
69
|
+
([address, utxos]) => {
|
|
70
|
+
const newUtxos = utxos.map<ApprovedUtxo<bigint>>((utxo) => ({
|
|
71
|
+
amount: BigInt(utxo.amount),
|
|
72
|
+
tokenAddress: utxo.tokenAddress,
|
|
73
|
+
inHinkalAddress: BigInt(utxo.inHinkalAddress),
|
|
74
|
+
}));
|
|
75
|
+
return [address, newUtxos] as [string, ApprovedUtxo<bigint>[]];
|
|
76
|
+
},
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
const deserializedApprovals = new Map<string, ApprovedUtxo<bigint>[]>(deserializedApprovalsArray);
|
|
80
|
+
|
|
81
|
+
return {
|
|
82
|
+
latestBlockNumber: serializedSnapshot.latestBlockNumber ?? 0,
|
|
83
|
+
payload: {
|
|
84
|
+
approvals: deserializedApprovals,
|
|
85
|
+
events: new Set(serializedSnapshot.events),
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
protected override getSnapshotPayload() {
|
|
91
|
+
return {
|
|
92
|
+
approvals: this._approvals,
|
|
93
|
+
events: this.events,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
protected override populateSnapshot({ payload: { approvals, events } }: Snapshot<ApprovalsSnapshotPayload>) {
|
|
98
|
+
this._approvals = approvals;
|
|
99
|
+
this.events = events;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
protected override mapEvent(event: NewApprovedUtxoEvent<string>): NewApprovedUtxoEvent {
|
|
103
|
+
const { approveTo, tokenAddress, amount, inHinkalAddress } = event;
|
|
104
|
+
return {
|
|
105
|
+
approveTo,
|
|
106
|
+
tokenAddress,
|
|
107
|
+
amount: toBigInt(amount),
|
|
108
|
+
inHinkalAddress: toBigInt(inHinkalAddress),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
protected acceptEvent(event: NewApprovedUtxoEvent, _blockNumber: number, txHash: string): boolean {
|
|
113
|
+
const eventKey = this.getEventKey(event.inHinkalAddress, event.tokenAddress, txHash);
|
|
114
|
+
if (eventKey && !this.events.has(eventKey)) {
|
|
115
|
+
const { amount, tokenAddress, inHinkalAddress } = event;
|
|
116
|
+
const value: ApprovedUtxo = {
|
|
117
|
+
amount,
|
|
118
|
+
tokenAddress,
|
|
119
|
+
inHinkalAddress,
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
let existingApprovals = this.approvals.get(event.approveTo) || [];
|
|
123
|
+
|
|
124
|
+
let foundEntry = false;
|
|
125
|
+
for (let i = 0; i < existingApprovals.length; i += 1) {
|
|
126
|
+
if (
|
|
127
|
+
caseInsensitiveEqual(tokenAddress, existingApprovals[i].tokenAddress) &&
|
|
128
|
+
inHinkalAddress === existingApprovals[i].inHinkalAddress
|
|
129
|
+
) {
|
|
130
|
+
existingApprovals[i].amount += amount;
|
|
131
|
+
foundEntry = true;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// clearing out zero amount entries from approvals
|
|
136
|
+
existingApprovals = existingApprovals.filter((el) => el.amount !== 0n);
|
|
137
|
+
|
|
138
|
+
if (foundEntry && existingApprovals.length === 0) {
|
|
139
|
+
this.approvals.delete(event.approveTo);
|
|
140
|
+
} else {
|
|
141
|
+
const newApprovals: ApprovedUtxo[] = foundEntry ? existingApprovals : [...existingApprovals, value];
|
|
142
|
+
this.approvals.set(event.approveTo, newApprovals);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (txHash) {
|
|
146
|
+
this.events.add(eventKey);
|
|
147
|
+
}
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { poseidonFunction } from '../../crypto';
|
|
2
|
+
import { MerkleTree, MerkleTreeJson } from '../merkle-tree';
|
|
3
|
+
import { CommitmentEvent, EncryptedOutputWithSign } from '../../types';
|
|
4
|
+
import { toBigInt } from '../../functions/utils/amounts.utils';
|
|
5
|
+
import { AbstractSnapshotService, Snapshot } from './AbstractSnapshotService';
|
|
6
|
+
import { contructMerkleTreeFromSerialized } from '../../functions/utils/merkleTree.utils';
|
|
7
|
+
import { BlockchainEventEmitter } from './BlockchainEventEmitter';
|
|
8
|
+
|
|
9
|
+
export type CommitmentsSnapshotPayload = {
|
|
10
|
+
readonly merkleTree: MerkleTree<bigint>;
|
|
11
|
+
readonly encryptedOutputs: EncryptedOutputWithSign[];
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export type CommitmentsSerializedSnapshot = {
|
|
15
|
+
latestBlockNumber?: number;
|
|
16
|
+
merkleTree?: MerkleTreeJson;
|
|
17
|
+
encryptedOutputs?: EncryptedOutputWithSign<string>[];
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export abstract class AbstractCommitmentsSnapshotService extends AbstractSnapshotService<
|
|
21
|
+
CommitmentEvent<bigint>,
|
|
22
|
+
CommitmentEvent,
|
|
23
|
+
CommitmentsSnapshotPayload,
|
|
24
|
+
CommitmentsSerializedSnapshot
|
|
25
|
+
> {
|
|
26
|
+
constructor(hinkalEventEmitter: BlockchainEventEmitter) {
|
|
27
|
+
super(hinkalEventEmitter, 'NewCommitment');
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
private _merkleTree!: MerkleTree<bigint>;
|
|
31
|
+
|
|
32
|
+
private _encryptedOutputs!: EncryptedOutputWithSign[];
|
|
33
|
+
|
|
34
|
+
get merkleTree() {
|
|
35
|
+
return this._merkleTree;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
get encryptedOutputs() {
|
|
39
|
+
return this._encryptedOutputs;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
protected override serializeSnapshot(snapshot: Snapshot<CommitmentsSnapshotPayload>): CommitmentsSerializedSnapshot {
|
|
43
|
+
return {
|
|
44
|
+
merkleTree: snapshot.payload.merkleTree.toJSON(),
|
|
45
|
+
latestBlockNumber: snapshot.latestBlockNumber,
|
|
46
|
+
encryptedOutputs: snapshot.payload.encryptedOutputs.map((output) => ({
|
|
47
|
+
value: output.value,
|
|
48
|
+
isPositive: String(output.isPositive),
|
|
49
|
+
})),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
protected override deserializeSnapshot(
|
|
54
|
+
serializedSnapshot: CommitmentsSerializedSnapshot,
|
|
55
|
+
): Snapshot<CommitmentsSnapshotPayload> {
|
|
56
|
+
let merkleTree: MerkleTree<bigint>;
|
|
57
|
+
if (serializedSnapshot.latestBlockNumber && serializedSnapshot.merkleTree) {
|
|
58
|
+
merkleTree = contructMerkleTreeFromSerialized(serializedSnapshot.merkleTree);
|
|
59
|
+
} else {
|
|
60
|
+
merkleTree = MerkleTree.create(poseidonFunction, 0n);
|
|
61
|
+
}
|
|
62
|
+
const encryptedOutputsWithSign = serializedSnapshot.encryptedOutputs?.map((output) => ({
|
|
63
|
+
value: output.value,
|
|
64
|
+
isPositive: JSON.parse(output.isPositive) as boolean,
|
|
65
|
+
}));
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
latestBlockNumber: serializedSnapshot.latestBlockNumber ?? 0,
|
|
69
|
+
payload: {
|
|
70
|
+
merkleTree,
|
|
71
|
+
encryptedOutputs: encryptedOutputsWithSign || [],
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
protected override getSnapshotPayload() {
|
|
77
|
+
return {
|
|
78
|
+
merkleTree: this._merkleTree,
|
|
79
|
+
encryptedOutputs: this._encryptedOutputs,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
protected override populateSnapshot({
|
|
84
|
+
payload: { merkleTree, encryptedOutputs },
|
|
85
|
+
}: Snapshot<CommitmentsSnapshotPayload>) {
|
|
86
|
+
this._merkleTree = merkleTree;
|
|
87
|
+
this._encryptedOutputs = encryptedOutputs;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
protected override mapEvent(event: CommitmentEvent): CommitmentEvent<bigint> {
|
|
91
|
+
const { commitment, index, encryptedOutput } = event;
|
|
92
|
+
return {
|
|
93
|
+
commitment: toBigInt(commitment),
|
|
94
|
+
index: toBigInt(index),
|
|
95
|
+
encryptedOutput,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
protected acceptEvent(event: CommitmentEvent<bigint>, _blockNumber: number): boolean {
|
|
100
|
+
if (!this.encryptedOutputs.map((output) => output.value).includes(event.encryptedOutput)) {
|
|
101
|
+
const success = this._merkleTree.insert(event.commitment, event.index >= 0 ? event.index : -1n * event.index);
|
|
102
|
+
if (!success) {
|
|
103
|
+
// could not insert: because of mt having that node index
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const encryptedOutputWithSign: EncryptedOutputWithSign = {
|
|
108
|
+
value: event.encryptedOutput,
|
|
109
|
+
isPositive: event.index >= 0n,
|
|
110
|
+
};
|
|
111
|
+
this._encryptedOutputs.push(encryptedOutputWithSign);
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { ethers } from 'ethers';
|
|
2
|
+
import { resolveSync } from '../../functions/utils/resolve-sync.utils';
|
|
3
|
+
import { BlockchainEventEmitter } from './BlockchainEventEmitter';
|
|
4
|
+
|
|
5
|
+
export abstract class AbstractEventService<EventType, SerializedEventType = unknown> {
|
|
6
|
+
protected blockchainEventEmitter: BlockchainEventEmitter;
|
|
7
|
+
|
|
8
|
+
protected readonly eventName: string;
|
|
9
|
+
|
|
10
|
+
protected constructor(blockchainEventEmitter: BlockchainEventEmitter, eventName: string) {
|
|
11
|
+
this.blockchainEventEmitter = blockchainEventEmitter;
|
|
12
|
+
this.eventName = eventName;
|
|
13
|
+
blockchainEventEmitter.addEventProcessorFunction(this.processEventsPage.bind(this));
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
get latestBlockNumber() {
|
|
17
|
+
return this.blockchainEventEmitter.latestBlockNumber;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
intervalClear() {
|
|
21
|
+
this.blockchainEventEmitter.intervalClear();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
private async processEventsPage(events: ethers.Event[]): Promise<number> {
|
|
25
|
+
const mappedEvents: EventType[] = [];
|
|
26
|
+
await resolveSync(
|
|
27
|
+
events.map((event) => async () => {
|
|
28
|
+
if (event.event !== this.eventName) return;
|
|
29
|
+
const { args, blockNumber, transactionHash } = event;
|
|
30
|
+
if (!args) throw new Error('Wrong event structure');
|
|
31
|
+
const mappedEvent = this.mapEvent(args as SerializedEventType);
|
|
32
|
+
const success = await this.acceptEvent(mappedEvent, blockNumber, transactionHash);
|
|
33
|
+
if (success) mappedEvents.push(mappedEvent);
|
|
34
|
+
}),
|
|
35
|
+
);
|
|
36
|
+
const eventsCount = mappedEvents.length;
|
|
37
|
+
await this.afterEventsAccepted(eventsCount);
|
|
38
|
+
return mappedEvents.length;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
protected abstract acceptEvent(event: EventType, blockNumber: number, txHash?: string): boolean | Promise<boolean>;
|
|
42
|
+
protected abstract mapEvent(event: SerializedEventType): EventType;
|
|
43
|
+
protected abstract afterEventsAccepted(eventsCount: number): Promise<void>;
|
|
44
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { BigNumber } from 'ethers';
|
|
2
|
+
import { NullifierEvent } from '../../types/commitments.types';
|
|
3
|
+
import { AbstractSnapshotService, Snapshot } from './AbstractSnapshotService';
|
|
4
|
+
import { BlockchainEventEmitter } from './BlockchainEventEmitter';
|
|
5
|
+
|
|
6
|
+
export type NullifierSnapshotPayload = {
|
|
7
|
+
readonly nullifiers: Set<string>;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export type NullifierSerializedSnapshot = {
|
|
11
|
+
latestBlockNumber?: number;
|
|
12
|
+
nullifiers?: string[];
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export abstract class AbstractNullifierSnapshotService extends AbstractSnapshotService<
|
|
16
|
+
NullifierEvent<string>,
|
|
17
|
+
NullifierEvent<BigNumber>,
|
|
18
|
+
NullifierSnapshotPayload,
|
|
19
|
+
NullifierSerializedSnapshot
|
|
20
|
+
> {
|
|
21
|
+
constructor(hinkalEventEmitter: BlockchainEventEmitter) {
|
|
22
|
+
super(hinkalEventEmitter, 'Nullified');
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
private _nullifiers!: Set<string>;
|
|
26
|
+
|
|
27
|
+
get nullifiers() {
|
|
28
|
+
return this._nullifiers;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
protected override serializeSnapshot(snapshot: Snapshot<NullifierSnapshotPayload>): NullifierSerializedSnapshot {
|
|
32
|
+
return {
|
|
33
|
+
nullifiers: Array.from(snapshot.payload.nullifiers).map((value) => value.toString()),
|
|
34
|
+
latestBlockNumber: snapshot.latestBlockNumber,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
protected override deserializeSnapshot(
|
|
39
|
+
serializedSnapshot: NullifierSerializedSnapshot,
|
|
40
|
+
): Snapshot<NullifierSnapshotPayload> {
|
|
41
|
+
return {
|
|
42
|
+
latestBlockNumber: serializedSnapshot.latestBlockNumber ?? 0,
|
|
43
|
+
payload: {
|
|
44
|
+
nullifiers: new Set(serializedSnapshot.nullifiers ?? []),
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
protected acceptEvent(event: NullifierEvent<string>, _blockNumber: number): boolean {
|
|
50
|
+
try {
|
|
51
|
+
if (this._nullifiers.has(event.nullifier)) return false;
|
|
52
|
+
this._nullifiers.add(event.nullifier);
|
|
53
|
+
return true;
|
|
54
|
+
} catch (err) {
|
|
55
|
+
console.error(err);
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
protected override mapEvent(event: NullifierEvent<BigNumber>): NullifierEvent<string> {
|
|
61
|
+
const { nullifier } = event;
|
|
62
|
+
return {
|
|
63
|
+
nullifier: nullifier.toHexString(),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
protected override getSnapshotPayload(): NullifierSnapshotPayload {
|
|
68
|
+
return {
|
|
69
|
+
nullifiers: this._nullifiers,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
protected override populateSnapshot({ payload: { nullifiers } }: Snapshot<NullifierSnapshotPayload>) {
|
|
74
|
+
this._nullifiers = nullifiers;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { saveDepths } from '../../constants/save-depths';
|
|
2
|
+
import { AbstractEventService } from './AbstractEventService';
|
|
3
|
+
import { BlockchainEventEmitter } from './BlockchainEventEmitter';
|
|
4
|
+
|
|
5
|
+
export interface Snapshot<SnapshotPayloadType> {
|
|
6
|
+
readonly latestBlockNumber: number;
|
|
7
|
+
readonly payload: SnapshotPayloadType;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export abstract class AbstractSnapshotService<
|
|
11
|
+
EventType,
|
|
12
|
+
SerializedEventType,
|
|
13
|
+
SnapshotPayloadType,
|
|
14
|
+
SerializedSnapshotType,
|
|
15
|
+
> extends AbstractEventService<EventType, SerializedEventType> {
|
|
16
|
+
private savedLatestBlockNumber = 0;
|
|
17
|
+
|
|
18
|
+
private chainId = 0;
|
|
19
|
+
|
|
20
|
+
protected constructor(blockchainEventEmitter: BlockchainEventEmitter, eventName: string) {
|
|
21
|
+
super(blockchainEventEmitter, eventName);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async init() {
|
|
25
|
+
await this.loadSnapshot();
|
|
26
|
+
this.chainId = (await this.blockchainEventEmitter.contract.provider.getNetwork()).chainId;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async retrieveEventsFromLatestBlock() {
|
|
30
|
+
await this.blockchainEventEmitter.retrieveEvents(this.latestBlockNumber);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
private async loadSnapshot() {
|
|
34
|
+
const fetchedSnapshot = await this.fetchSnapshot();
|
|
35
|
+
const snapshot = this.deserializeSnapshot(fetchedSnapshot);
|
|
36
|
+
this.populateSnapshot(snapshot);
|
|
37
|
+
this.blockchainEventEmitter.syncFromAtMost(snapshot.latestBlockNumber);
|
|
38
|
+
this.savedLatestBlockNumber = snapshot.latestBlockNumber;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
protected saveSnapshot(): Promise<unknown> {
|
|
42
|
+
this.savedLatestBlockNumber = this.latestBlockNumber;
|
|
43
|
+
return this.persistSnapshot(
|
|
44
|
+
this.serializeSnapshot({
|
|
45
|
+
latestBlockNumber: this.latestBlockNumber,
|
|
46
|
+
payload: this.getSnapshotPayload(),
|
|
47
|
+
}),
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
protected override async afterEventsAccepted(eventsCount: number): Promise<void> {
|
|
52
|
+
if (eventsCount > 0 || this.savedLatestBlockNumber + saveDepths[this.chainId] < this.latestBlockNumber)
|
|
53
|
+
await this.saveSnapshot();
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
protected abstract getSnapshotPayload(): SnapshotPayloadType;
|
|
57
|
+
protected abstract populateSnapshot(snapshot: Snapshot<SnapshotPayloadType>): void;
|
|
58
|
+
protected abstract serializeSnapshot(snapshot: Snapshot<SnapshotPayloadType>): SerializedSnapshotType;
|
|
59
|
+
protected abstract deserializeSnapshot(serializedSnapshot: SerializedSnapshotType): Snapshot<SnapshotPayloadType>;
|
|
60
|
+
|
|
61
|
+
protected abstract fetchSnapshot(): Promise<SerializedSnapshotType>;
|
|
62
|
+
protected abstract persistSnapshot(serializedSnapshot: SerializedSnapshotType): Promise<unknown>;
|
|
63
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { ethers } from 'ethers';
|
|
2
|
+
import { blockReorgDepth } from '../../constants/reorg-depths.constants';
|
|
3
|
+
import { getSequence, resolveSync } from '../../functions/utils/resolve-sync.utils';
|
|
4
|
+
import { balanceFetchingMutex } from '../../functions/utils/mutexes.utils';
|
|
5
|
+
|
|
6
|
+
export type EventProcessorFunction = (events: ethers.Event[]) => Promise<number> | number;
|
|
7
|
+
|
|
8
|
+
export class BlockchainEventEmitter {
|
|
9
|
+
public readonly contract: ethers.Contract;
|
|
10
|
+
|
|
11
|
+
private _latestBlockNumber: number | undefined;
|
|
12
|
+
|
|
13
|
+
private _initialBlockNumber;
|
|
14
|
+
|
|
15
|
+
public onEventsProcessed?: (acceptedEventCount: number) => void;
|
|
16
|
+
|
|
17
|
+
private eventProcessors = new Set<EventProcessorFunction>();
|
|
18
|
+
|
|
19
|
+
private readonly maxPageSize?: number;
|
|
20
|
+
|
|
21
|
+
private isReady = false;
|
|
22
|
+
|
|
23
|
+
private isServer: boolean;
|
|
24
|
+
|
|
25
|
+
private intervalId?: any;
|
|
26
|
+
|
|
27
|
+
private inProgress: boolean; // to remove race conditions
|
|
28
|
+
|
|
29
|
+
public constructor(contract: ethers.Contract, initialBlockNumber: number, isServer: boolean, maxPageSize?: number) {
|
|
30
|
+
this.contract = contract;
|
|
31
|
+
this._initialBlockNumber = initialBlockNumber;
|
|
32
|
+
this.maxPageSize = maxPageSize;
|
|
33
|
+
this.isServer = isServer;
|
|
34
|
+
this.inProgress = false;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
public get latestBlockNumber() {
|
|
38
|
+
return this._latestBlockNumber ?? this._initialBlockNumber;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
public syncFromAtMost(blockNumber: number) {
|
|
42
|
+
// since multiple services may want to sync from differing block numbers we sync from the lowest value provided
|
|
43
|
+
if (this._latestBlockNumber === undefined || blockNumber < this._latestBlockNumber) {
|
|
44
|
+
this._latestBlockNumber = blockNumber;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public intervalClear() {
|
|
49
|
+
this.isReady = false;
|
|
50
|
+
this.eventProcessors = new Set<EventProcessorFunction>();
|
|
51
|
+
clearInterval(this.intervalId);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
public async init() {
|
|
55
|
+
if (this.isReady) {
|
|
56
|
+
throw new Error('Already initialized');
|
|
57
|
+
}
|
|
58
|
+
this.isReady = true;
|
|
59
|
+
await this.retrieveEvents(this.latestBlockNumber + 1);
|
|
60
|
+
|
|
61
|
+
this.intervalId = setInterval(async () => {
|
|
62
|
+
await this.retrieveEvents(this.latestBlockNumber);
|
|
63
|
+
}, 3500);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
private requireReady() {
|
|
67
|
+
if (!this.isReady) {
|
|
68
|
+
throw new Error('Not ready');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
public addEventProcessorFunction(eventProcessorFunction: EventProcessorFunction) {
|
|
73
|
+
if (this.isReady) throw new Error("Can't add event processor after event emitter initialized");
|
|
74
|
+
this.eventProcessors.add(eventProcessorFunction);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
private async getLastBlockNumberForEventRequest() {
|
|
78
|
+
const lastBlockchainBlockNumber = await this.contract.provider.getBlockNumber();
|
|
79
|
+
if (!this.isServer) return lastBlockchainBlockNumber;
|
|
80
|
+
// lastBlockchainBlockNumber is blocknumber of the latest confirmed block
|
|
81
|
+
// the events/transactions in the latest block will have block confirmation of 1
|
|
82
|
+
// as such we need to add + 1 here.
|
|
83
|
+
// Math.max used here since the snapshot file may contain latest block information already
|
|
84
|
+
const { chainId } = await this.contract.provider.getNetwork();
|
|
85
|
+
return Math.max(this.latestBlockNumber, lastBlockchainBlockNumber - blockReorgDepth[chainId] + 1);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
public async retrieveEvents(fromBlockNumber: number, useForce = false): Promise<boolean> {
|
|
89
|
+
this.requireReady();
|
|
90
|
+
const result = await balanceFetchingMutex.runExclusive(async () => {
|
|
91
|
+
try {
|
|
92
|
+
if (this.inProgress && !useForce) return false;
|
|
93
|
+
this.inProgress = true;
|
|
94
|
+
let acceptedEventCount = 0;
|
|
95
|
+
|
|
96
|
+
const lastBlockNumber = await this.getLastBlockNumberForEventRequest();
|
|
97
|
+
|
|
98
|
+
if (lastBlockNumber < fromBlockNumber) {
|
|
99
|
+
this.inProgress = false;
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
const requestSequence = getSequence(fromBlockNumber, lastBlockNumber, this.maxPageSize);
|
|
103
|
+
|
|
104
|
+
const allEvents: ethers.Event[] = [];
|
|
105
|
+
|
|
106
|
+
await resolveSync(
|
|
107
|
+
requestSequence.map(({ from, to }) => async () => {
|
|
108
|
+
const events: ethers.Event[] = await this.contract.queryFilter('*', from, to);
|
|
109
|
+
allEvents.push(...events);
|
|
110
|
+
}),
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
const accepetedEventsArray = await Promise.all(
|
|
114
|
+
[...this.eventProcessors].map((eventProcessor) => {
|
|
115
|
+
return eventProcessor(allEvents);
|
|
116
|
+
}),
|
|
117
|
+
);
|
|
118
|
+
this._latestBlockNumber = lastBlockNumber;
|
|
119
|
+
acceptedEventCount += accepetedEventsArray.reduce((prev, cur) => prev + cur, 0);
|
|
120
|
+
|
|
121
|
+
this.onEventsProcessed?.(acceptedEventCount);
|
|
122
|
+
this.inProgress = false;
|
|
123
|
+
return true;
|
|
124
|
+
} catch (err: unknown) {
|
|
125
|
+
console.log('retrieveEvents error:', { err });
|
|
126
|
+
this.inProgress = false;
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
return result;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './AbstractAccessTokenSnapshotService';
|
|
2
|
+
export * from './AbstractCommitmentsSnapshotService';
|
|
3
|
+
export * from './AbstractApprovalsSnapshotService';
|
|
4
|
+
export * from './AbstractNullifierSnapshotService';
|
|
5
|
+
export * from './AbstractSnapshotService';
|
|
6
|
+
export * from './AbstractEventService';
|
|
7
|
+
export * from './BlockchainEventEmitter';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export * from './ValueCache';
|
|
2
|
+
export * from './crypto-keys';
|
|
3
|
+
export * from './Hinkal';
|
|
4
|
+
export * from './merkle-tree';
|
|
5
|
+
export * from './provider-adapter/IProviderAdapter';
|
|
6
|
+
export * from './event-service';
|
|
7
|
+
export * from './utxo/Utxo';
|
|
8
|
+
export * from './custom-token-registry/CustomTokenRegistry';
|
|
9
|
+
export * from './token-price-fetcher';
|
|
10
|
+
export * from './transactions-manager';
|
|
11
|
+
export * from './MultiThreadedUtxoUtils/MultiThreadedUtxoUtils';
|
|
12
|
+
export * from './cacheDevices';
|
|
13
|
+
export * from './IndexedDB';
|
|
14
|
+
export * from './TokenDBs';
|
|
15
|
+
export * from './presale';
|
|
16
|
+
export * from './snapshot';
|
|
17
|
+
export * from './tor';
|
|
18
|
+
export * from './ApprovalDBs';
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { MerkleTree } from './MerkleTree';
|
|
2
|
+
import { MerkleTreeIncompleteError } from './MerkleTreeIncompleteError';
|
|
3
|
+
|
|
4
|
+
const testHashFunction = (a: string, b: string) => JSON.stringify([a, b]);
|
|
5
|
+
|
|
6
|
+
describe('MerkleTree', () => {
|
|
7
|
+
test('should calculate root hash for 2 elements correctly', async () => {
|
|
8
|
+
const merkleTree = MerkleTree.create(testHashFunction, '', 2n);
|
|
9
|
+
const startIndex = merkleTree.getStartIndex();
|
|
10
|
+
merkleTree.insert('a', startIndex);
|
|
11
|
+
merkleTree.insert('b', startIndex + 1n);
|
|
12
|
+
|
|
13
|
+
expect(merkleTree.getRootHash()).toEqual(testHashFunction('a', 'b'));
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
test('should calculate root hash for multiple elements correctly', async () => {
|
|
17
|
+
const merkleTree = MerkleTree.create(testHashFunction, '', 3n);
|
|
18
|
+
const startIndex = merkleTree.getStartIndex();
|
|
19
|
+
merkleTree.insert('a', startIndex);
|
|
20
|
+
merkleTree.insert('b', startIndex + 1n);
|
|
21
|
+
merkleTree.insert('c', startIndex + 2n);
|
|
22
|
+
merkleTree.insert('d', startIndex + 3n);
|
|
23
|
+
|
|
24
|
+
expect(merkleTree.getRootHash()).toEqual(testHashFunction(testHashFunction('a', 'b'), testHashFunction('c', 'd')));
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test('should calculate root hash correctly if elements are passed out of order', async () => {
|
|
28
|
+
const merkleTree = MerkleTree.create(testHashFunction, '', 3n);
|
|
29
|
+
const startIndex = merkleTree.getStartIndex();
|
|
30
|
+
merkleTree.insert('d', startIndex + 3n);
|
|
31
|
+
merkleTree.insert('c', startIndex + 2n);
|
|
32
|
+
merkleTree.insert('b', startIndex + 1n);
|
|
33
|
+
merkleTree.insert('a', startIndex);
|
|
34
|
+
|
|
35
|
+
expect(merkleTree.getRootHash()).toEqual(testHashFunction(testHashFunction('a', 'b'), testHashFunction('c', 'd')));
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test('should throw when getting root hash if it is incomplete', async () => {
|
|
39
|
+
const merkleTree = MerkleTree.create(testHashFunction, '', 3n);
|
|
40
|
+
const startIndex = merkleTree.getStartIndex();
|
|
41
|
+
merkleTree.insert('a', startIndex + 1n);
|
|
42
|
+
expect(() => merkleTree.getRootHash()).toThrow(MerkleTreeIncompleteError);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test('should throw when getting underlying data if it is incomplete', async () => {
|
|
46
|
+
const merkleTree = MerkleTree.create(testHashFunction, '', 3n);
|
|
47
|
+
const startIndex = merkleTree.getStartIndex();
|
|
48
|
+
merkleTree.insert('a', startIndex + 1n);
|
|
49
|
+
expect(() => merkleTree.getRootHash()).toThrow(MerkleTreeIncompleteError);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
test("should return sibling's side indexes", async () => {
|
|
53
|
+
const merkleTree = MerkleTree.create(testHashFunction, '', 20n);
|
|
54
|
+
const startIndex = merkleTree.getStartIndex();
|
|
55
|
+
merkleTree.insert('a', startIndex);
|
|
56
|
+
merkleTree.insert('b', startIndex + 1n);
|
|
57
|
+
merkleTree.insert('c', startIndex + 2n);
|
|
58
|
+
merkleTree.insert('d', startIndex + 3n);
|
|
59
|
+
merkleTree.insert('e', startIndex + 4n);
|
|
60
|
+
|
|
61
|
+
expect(merkleTree.getSiblingSides('a')[0]).toEqual(0n);
|
|
62
|
+
expect(merkleTree.getSiblingSides('d')[0]).toEqual(1n);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
test('should work with large indexes', async () => {
|
|
66
|
+
const merkleTree = MerkleTree.create(testHashFunction, '', 20n);
|
|
67
|
+
const startIndex = merkleTree.getStartIndex();
|
|
68
|
+
merkleTree.insert('a', startIndex);
|
|
69
|
+
let lastRootHash = merkleTree.getRootHash();
|
|
70
|
+
for (let i = 1n; i < 1000n; i += 1n) {
|
|
71
|
+
merkleTree.insert('a', startIndex + i);
|
|
72
|
+
const rootHash = merkleTree.getRootHash();
|
|
73
|
+
expect(rootHash).not.toEqual(lastRootHash);
|
|
74
|
+
lastRootHash = rootHash;
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
});
|