@metamask/transaction-controller 40.0.0 → 41.0.0
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/CHANGELOG.md +33 -1
- package/dist/TransactionController.cjs +169 -230
- package/dist/TransactionController.cjs.map +1 -1
- package/dist/TransactionController.d.cts +98 -52
- package/dist/TransactionController.d.cts.map +1 -1
- package/dist/TransactionController.d.mts +98 -52
- package/dist/TransactionController.d.mts.map +1 -1
- package/dist/TransactionController.mjs +172 -233
- package/dist/TransactionController.mjs.map +1 -1
- package/dist/api/accounts-api.cjs +47 -0
- package/dist/api/accounts-api.cjs.map +1 -0
- package/dist/api/accounts-api.d.cts +43 -0
- package/dist/api/accounts-api.d.cts.map +1 -0
- package/dist/api/accounts-api.d.mts +43 -0
- package/dist/api/accounts-api.d.mts.map +1 -0
- package/dist/api/accounts-api.mjs +43 -0
- package/dist/api/accounts-api.mjs.map +1 -0
- package/dist/errors.cjs +8 -1
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.d.cts +4 -0
- package/dist/errors.d.cts.map +1 -1
- package/dist/errors.d.mts +4 -0
- package/dist/errors.d.mts.map +1 -1
- package/dist/errors.mjs +6 -0
- package/dist/errors.mjs.map +1 -1
- package/dist/helpers/EtherscanRemoteTransactionSource.cjs +13 -12
- package/dist/helpers/EtherscanRemoteTransactionSource.cjs.map +1 -1
- package/dist/helpers/EtherscanRemoteTransactionSource.d.cts.map +1 -1
- package/dist/helpers/EtherscanRemoteTransactionSource.d.mts.map +1 -1
- package/dist/helpers/EtherscanRemoteTransactionSource.mjs +13 -12
- package/dist/helpers/EtherscanRemoteTransactionSource.mjs.map +1 -1
- package/dist/helpers/GasFeePoller.cjs +4 -4
- package/dist/helpers/GasFeePoller.cjs.map +1 -1
- package/dist/helpers/GasFeePoller.d.cts +1 -1
- package/dist/helpers/GasFeePoller.d.cts.map +1 -1
- package/dist/helpers/GasFeePoller.d.mts +1 -1
- package/dist/helpers/GasFeePoller.d.mts.map +1 -1
- package/dist/helpers/GasFeePoller.mjs +4 -4
- package/dist/helpers/GasFeePoller.mjs.map +1 -1
- package/dist/helpers/IncomingTransactionHelper.cjs +18 -11
- package/dist/helpers/IncomingTransactionHelper.cjs.map +1 -1
- package/dist/helpers/IncomingTransactionHelper.d.cts.map +1 -1
- package/dist/helpers/IncomingTransactionHelper.d.mts.map +1 -1
- package/dist/helpers/IncomingTransactionHelper.mjs +19 -12
- package/dist/helpers/IncomingTransactionHelper.mjs.map +1 -1
- package/dist/helpers/MethodDataHelper.cjs +78 -0
- package/dist/helpers/MethodDataHelper.cjs.map +1 -0
- package/dist/helpers/MethodDataHelper.d.cts +14 -0
- package/dist/helpers/MethodDataHelper.d.cts.map +1 -0
- package/dist/helpers/MethodDataHelper.d.mts +14 -0
- package/dist/helpers/MethodDataHelper.d.mts.map +1 -0
- package/dist/helpers/MethodDataHelper.mjs +71 -0
- package/dist/helpers/MethodDataHelper.mjs.map +1 -0
- package/dist/helpers/MultichainTrackingHelper.cjs +87 -104
- package/dist/helpers/MultichainTrackingHelper.cjs.map +1 -1
- package/dist/helpers/MultichainTrackingHelper.d.cts +16 -22
- package/dist/helpers/MultichainTrackingHelper.d.cts.map +1 -1
- package/dist/helpers/MultichainTrackingHelper.d.mts +16 -22
- package/dist/helpers/MultichainTrackingHelper.d.mts.map +1 -1
- package/dist/helpers/MultichainTrackingHelper.mjs +88 -109
- package/dist/helpers/MultichainTrackingHelper.mjs.map +1 -1
- package/dist/helpers/PendingTransactionTracker.cjs +24 -22
- package/dist/helpers/PendingTransactionTracker.cjs.map +1 -1
- package/dist/helpers/PendingTransactionTracker.d.cts.map +1 -1
- package/dist/helpers/PendingTransactionTracker.d.mts.map +1 -1
- package/dist/helpers/PendingTransactionTracker.mjs +24 -22
- package/dist/helpers/PendingTransactionTracker.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +7 -3
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +7 -3
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils/etherscan.cjs +2 -1
- package/dist/utils/etherscan.cjs.map +1 -1
- package/dist/utils/etherscan.d.cts.map +1 -1
- package/dist/utils/etherscan.d.mts.map +1 -1
- package/dist/utils/etherscan.mjs +3 -2
- package/dist/utils/etherscan.mjs.map +1 -1
- package/dist/utils/validation.cjs +13 -1
- package/dist/utils/validation.cjs.map +1 -1
- package/dist/utils/validation.d.cts +7 -0
- package/dist/utils/validation.d.cts.map +1 -1
- package/dist/utils/validation.d.mts +7 -0
- package/dist/utils/validation.d.mts.map +1 -1
- package/dist/utils/validation.mjs +11 -0
- package/dist/utils/validation.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IncomingTransactionHelper.mjs","sourceRoot":"","sources":["../../src/helpers/IncomingTransactionHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountsController } from '@metamask/accounts-controller';\nimport type { BlockTracker } from '@metamask/network-controller';\nimport type { Hex } from '@metamask/utils';\nimport { Mutex } from 'async-mutex';\nimport EventEmitter from 'events';\n\nimport { incomingTransactionsLogger as log } from '../logger';\nimport type { RemoteTransactionSource, TransactionMeta } from '../types';\n\nconst RECENT_HISTORY_BLOCK_RANGE = 10;\n\n// TODO: Replace `any` with type\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst UPDATE_CHECKS: ((txMeta: TransactionMeta) => any)[] = [\n (txMeta) => txMeta.status,\n (txMeta) => txMeta.txParams.gasUsed,\n];\n\n/**\n * Configuration options for the IncomingTransactionHelper\n *\n * @property includeTokenTransfers - Whether or not to include ERC20 token transfers.\n * @property isEnabled - Whether or not incoming transaction retrieval is enabled.\n * @property queryEntireHistory - Whether to initially query the entire transaction history or only recent blocks.\n * @property updateTransactions - Whether to update local transactions using remote transaction data.\n */\nexport type IncomingTransactionOptions = {\n includeTokenTransfers?: boolean;\n isEnabled?: () => boolean;\n queryEntireHistory?: boolean;\n updateTransactions?: boolean;\n};\n\nexport class IncomingTransactionHelper {\n hub: EventEmitter;\n\n #blockTracker: BlockTracker;\n\n #getCurrentAccount: () => ReturnType<\n AccountsController['getSelectedAccount']\n >;\n\n #getLastFetchedBlockNumbers: () => Record<string, number>;\n\n #getLocalTransactions: () => TransactionMeta[];\n\n #getChainId: () => Hex;\n\n #isEnabled: () => boolean;\n\n #isRunning: boolean;\n\n #mutex = new Mutex();\n\n #onLatestBlock: (blockNumberHex: Hex) => Promise<void>;\n\n #queryEntireHistory: boolean;\n\n #remoteTransactionSource: RemoteTransactionSource;\n\n #transactionLimit?: number;\n\n #updateTransactions: boolean;\n\n constructor({\n blockTracker,\n getCurrentAccount,\n getLastFetchedBlockNumbers,\n getLocalTransactions,\n getChainId,\n isEnabled,\n queryEntireHistory,\n remoteTransactionSource,\n transactionLimit,\n updateTransactions,\n }: {\n blockTracker: BlockTracker;\n getCurrentAccount: () => ReturnType<\n AccountsController['getSelectedAccount']\n >;\n getLastFetchedBlockNumbers: () => Record<string, number>;\n getLocalTransactions?: () => TransactionMeta[];\n getChainId: () => Hex;\n isEnabled?: () => boolean;\n queryEntireHistory?: boolean;\n remoteTransactionSource: RemoteTransactionSource;\n transactionLimit?: number;\n updateTransactions?: boolean;\n }) {\n this.hub = new EventEmitter();\n\n this.#blockTracker = blockTracker;\n this.#getCurrentAccount = getCurrentAccount;\n this.#getLastFetchedBlockNumbers = getLastFetchedBlockNumbers;\n this.#getLocalTransactions = getLocalTransactions || (() => []);\n this.#getChainId = getChainId;\n this.#isEnabled = isEnabled ?? (() => true);\n this.#isRunning = false;\n this.#queryEntireHistory = queryEntireHistory ?? true;\n this.#remoteTransactionSource = remoteTransactionSource;\n this.#transactionLimit = transactionLimit;\n this.#updateTransactions = updateTransactions ?? false;\n\n // Using a property instead of a method to provide a listener reference\n // with the correct scope that we can remove later if stopped.\n this.#onLatestBlock = async (blockNumberHex: Hex) => {\n try {\n await this.update(blockNumberHex);\n } catch (error) {\n console.error('Error while checking incoming transactions', error);\n }\n };\n }\n\n start() {\n if (this.#isRunning) {\n return;\n }\n\n if (!this.#canStart()) {\n return;\n }\n\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#blockTracker.addListener('latest', this.#onLatestBlock);\n this.#isRunning = true;\n }\n\n stop() {\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#blockTracker.removeListener('latest', this.#onLatestBlock);\n this.#isRunning = false;\n }\n\n async update(latestBlockNumberHex?: Hex): Promise<void> {\n const releaseLock = await this.#mutex.acquire();\n\n log('Checking for incoming transactions');\n\n try {\n if (!this.#canStart()) {\n return;\n }\n\n const latestBlockNumber = parseInt(\n latestBlockNumberHex || (await this.#blockTracker.getLatestBlock()),\n 16,\n );\n\n const additionalLastFetchedKeys =\n this.#remoteTransactionSource.getLastBlockVariations?.() ?? [];\n\n const fromBlock = this.#getFromBlock(latestBlockNumber);\n const account = this.#getCurrentAccount();\n const currentChainId = this.#getChainId();\n\n let remoteTransactions = [];\n\n try {\n remoteTransactions =\n await this.#remoteTransactionSource.fetchTransactions({\n address: account.address,\n currentChainId,\n fromBlock,\n limit: this.#transactionLimit,\n });\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n log('Error while fetching remote transactions', error);\n return;\n }\n if (!this.#updateTransactions) {\n const address = account.address.toLowerCase();\n remoteTransactions = remoteTransactions.filter(\n (tx) => tx.txParams.to?.toLowerCase() === address,\n );\n }\n\n const localTransactions = !this.#updateTransactions\n ? []\n : this.#getLocalTransactions();\n\n const newTransactions = this.#getNewTransactions(\n remoteTransactions,\n localTransactions,\n );\n\n const updatedTransactions = this.#getUpdatedTransactions(\n remoteTransactions,\n localTransactions,\n );\n\n if (newTransactions.length > 0 || updatedTransactions.length > 0) {\n this.#sortTransactionsByTime(newTransactions);\n this.#sortTransactionsByTime(updatedTransactions);\n\n log('Found incoming transactions', {\n new: newTransactions,\n updated: updatedTransactions,\n });\n\n this.hub.emit('transactions', {\n added: newTransactions,\n updated: updatedTransactions,\n });\n }\n this.#updateLastFetchedBlockNumber(\n remoteTransactions,\n additionalLastFetchedKeys,\n );\n } finally {\n releaseLock();\n }\n }\n\n #sortTransactionsByTime(transactions: TransactionMeta[]) {\n transactions.sort((a, b) => (a.time < b.time ? -1 : 1));\n }\n\n #getNewTransactions(\n remoteTxs: TransactionMeta[],\n localTxs: TransactionMeta[],\n ): TransactionMeta[] {\n return remoteTxs.filter(\n (tx) => !localTxs.some(({ hash }) => hash === tx.hash),\n );\n }\n\n #getUpdatedTransactions(\n remoteTxs: TransactionMeta[],\n localTxs: TransactionMeta[],\n ): TransactionMeta[] {\n return remoteTxs.filter((remoteTx) =>\n localTxs.some(\n (localTx) =>\n remoteTx.hash === localTx.hash &&\n this.#isTransactionOutdated(remoteTx, localTx),\n ),\n );\n }\n\n #isTransactionOutdated(\n remoteTx: TransactionMeta,\n localTx: TransactionMeta,\n ): boolean {\n return UPDATE_CHECKS.some(\n (getValue) => getValue(remoteTx) !== getValue(localTx),\n );\n }\n\n #getLastFetchedBlockNumberDec(): number {\n const additionalLastFetchedKeys =\n this.#remoteTransactionSource.getLastBlockVariations?.() ?? [];\n const lastFetchedKey = this.#getBlockNumberKey(additionalLastFetchedKeys);\n const lastFetchedBlockNumbers = this.#getLastFetchedBlockNumbers();\n return lastFetchedBlockNumbers[lastFetchedKey];\n }\n\n #getFromBlock(latestBlockNumber: number): number | undefined {\n const lastFetchedBlockNumber = this.#getLastFetchedBlockNumberDec();\n\n if (lastFetchedBlockNumber) {\n return lastFetchedBlockNumber + 1;\n }\n\n return this.#queryEntireHistory\n ? undefined\n : latestBlockNumber - RECENT_HISTORY_BLOCK_RANGE;\n }\n\n #updateLastFetchedBlockNumber(\n remoteTxs: TransactionMeta[],\n additionalKeys: string[],\n ) {\n let lastFetchedBlockNumber = -1;\n\n for (const tx of remoteTxs) {\n const currentBlockNumberValue = tx.blockNumber\n ? parseInt(tx.blockNumber, 10)\n : -1;\n\n lastFetchedBlockNumber = Math.max(\n lastFetchedBlockNumber,\n currentBlockNumberValue,\n );\n }\n\n if (lastFetchedBlockNumber === -1) {\n return;\n }\n\n const lastFetchedKey = this.#getBlockNumberKey(additionalKeys);\n const lastFetchedBlockNumbers = this.#getLastFetchedBlockNumbers();\n const previousValue = lastFetchedBlockNumbers[lastFetchedKey];\n\n if (previousValue >= lastFetchedBlockNumber) {\n return;\n }\n\n this.hub.emit('updatedLastFetchedBlockNumbers', {\n lastFetchedBlockNumbers: {\n ...lastFetchedBlockNumbers,\n [lastFetchedKey]: lastFetchedBlockNumber,\n },\n blockNumber: lastFetchedBlockNumber,\n });\n }\n\n #getBlockNumberKey(additionalKeys: string[]): string {\n const currentChainId = this.#getChainId();\n const currentAccount = this.#getCurrentAccount()?.address.toLowerCase();\n\n return [currentChainId, currentAccount, ...additionalKeys].join('#');\n }\n\n #canStart(): boolean {\n const isEnabled = this.#isEnabled();\n const currentChainId = this.#getChainId();\n\n const isSupportedNetwork =\n this.#remoteTransactionSource.isSupportedNetwork(currentChainId);\n\n return isEnabled && isSupportedNetwork;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"IncomingTransactionHelper.mjs","sourceRoot":"","sources":["../../src/helpers/IncomingTransactionHelper.ts"],"names":[],"mappings":";;;;;;;;;;;;AAGA,OAAO,EAAE,KAAK,EAAE,oBAAoB;AACpC,OAAO,YAAY,eAAe;AAElC,OAAO,EACL,kBAAkB,EAClB,0BAA0B,IAAI,GAAG,EAClC,sBAAkB;AAGnB,MAAM,0BAA0B,GAAG,EAAE,CAAC;AAEtC,gCAAgC;AAChC,8DAA8D;AAC9D,MAAM,aAAa,GAAyC;IAC1D,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM;IACzB,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO;CACpC,CAAC;AAiBF,MAAM,OAAO,yBAAyB;IAiCpC,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,0BAA0B,EAC1B,oBAAoB,EACpB,UAAU,EACV,SAAS,EACT,kBAAkB,EAClB,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,GAcnB;;QAtDD,0DAA4B;QAE5B,+DAEE;QAEF,wEAA0D;QAE1D,kEAA+C;QAE/C,wDAAuB;QAEvB,uDAA0B;QAE1B,uDAAoB;QAEpB,iDAAqB;QAErB,2CAAS,IAAI,KAAK,EAAE,EAAC;QAErB,2DAAuD;QAEvD,gEAA6B;QAE7B,qEAAkD;QAElD,8DAA2B;QAE3B,gEAA6B;QA2B3B,IAAI,CAAC,GAAG,GAAG,IAAI,YAAY,EAAE,CAAC;QAE9B,uBAAA,IAAI,2CAAiB,YAAY,MAAA,CAAC;QAClC,uBAAA,IAAI,gDAAsB,iBAAiB,MAAA,CAAC;QAC5C,uBAAA,IAAI,yDAA+B,0BAA0B,MAAA,CAAC;QAC9D,uBAAA,IAAI,mDAAyB,oBAAoB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,MAAA,CAAC;QAChE,uBAAA,IAAI,yCAAe,UAAU,MAAA,CAAC;QAC9B,uBAAA,IAAI,wCAAc,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAA,CAAC;QAC5C,uBAAA,IAAI,wCAAc,KAAK,MAAA,CAAC;QACxB,uBAAA,IAAI,kCAAQ,kBAAkB,CAAC,GAAG,EAAE,UAAU,EAAE,CAAC,MAAA,CAAC;QAClD,uBAAA,IAAI,iDAAuB,kBAAkB,IAAI,IAAI,MAAA,CAAC;QACtD,uBAAA,IAAI,sDAA4B,uBAAuB,MAAA,CAAC;QACxD,uBAAA,IAAI,+CAAqB,gBAAgB,MAAA,CAAC;QAC1C,uBAAA,IAAI,iDAAuB,kBAAkB,IAAI,KAAK,MAAA,CAAC;QAEvD,uEAAuE;QACvE,8DAA8D;QAC9D,uBAAA,IAAI,4CAAkB,KAAK,EAAE,cAAmB,EAAE,EAAE;YAClD,IAAI;gBACF,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;aACnC;YAAC,OAAO,KAAK,EAAE;gBACd,OAAO,CAAC,KAAK,CAAC,4CAA4C,EAAE,KAAK,CAAC,CAAC;aACpE;QACH,CAAC,MAAA,CAAC;IACJ,CAAC;IAED,KAAK;QACH,IAAI,uBAAA,IAAI,4CAAW,EAAE;YACnB,OAAO;SACR;QAED,IAAI,CAAC,uBAAA,IAAI,iFAAU,MAAd,IAAI,CAAY,EAAE;YACrB,OAAO;SACR;QAED,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,kBAAkB,CAAC,CAAC;QAE9B,gFAAgF;QAChF,kEAAkE;QAClE,uBAAA,IAAI,+CAAc,CAAC,WAAW,CAAC,QAAQ,EAAE,uBAAA,IAAI,gDAAe,CAAC,CAAC;QAC9D,uBAAA,IAAI,wCAAc,IAAI,MAAA,CAAC;IACzB,CAAC;IAED,IAAI;QACF,IAAI,CAAC,uBAAA,IAAI,4CAAW,EAAE;YACpB,OAAO;SACR;QAED,gFAAgF;QAChF,kEAAkE;QAClE,uBAAA,IAAI,+CAAc,CAAC,cAAc,CAAC,QAAQ,EAAE,uBAAA,IAAI,gDAAe,CAAC,CAAC;QACjE,uBAAA,IAAI,wCAAc,KAAK,MAAA,CAAC;QAExB,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,iBAAiB,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,oBAA0B;QACrC,MAAM,WAAW,GAAG,MAAM,uBAAA,IAAI,wCAAO,CAAC,OAAO,EAAE,CAAC;QAEhD,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,UAAU,CAAC,CAAC;QAEtB,IAAI;YACF,IAAI,CAAC,uBAAA,IAAI,iFAAU,MAAd,IAAI,CAAY,EAAE;gBACrB,OAAO;aACR;YAED,MAAM,iBAAiB,GAAG,QAAQ,CAChC,oBAAoB,IAAI,CAAC,MAAM,uBAAA,IAAI,+CAAc,CAAC,cAAc,EAAE,CAAC,EACnE,EAAE,CACH,CAAC;YAEF,MAAM,yBAAyB,GAC7B,uBAAA,IAAI,0DAAyB,CAAC,sBAAsB,EAAE,EAAE,IAAI,EAAE,CAAC;YAEjE,MAAM,SAAS,GAAG,uBAAA,IAAI,qFAAc,MAAlB,IAAI,EAAe,iBAAiB,CAAC,CAAC;YACxD,MAAM,OAAO,GAAG,uBAAA,IAAI,oDAAmB,MAAvB,IAAI,CAAqB,CAAC;YAC1C,MAAM,OAAO,GAAG,uBAAA,IAAI,6CAAY,MAAhB,IAAI,CAAc,CAAC;YAEnC,IAAI,kBAAkB,GAAG,EAAE,CAAC;YAE5B,IAAI;gBACF,kBAAkB;oBAChB,MAAM,uBAAA,IAAI,0DAAyB,CAAC,iBAAiB,CAAC;wBACpD,OAAO,EAAE,OAAO,CAAC,OAAO;wBACxB,OAAO;wBACP,SAAS;wBACT,KAAK,EAAE,uBAAA,IAAI,mDAAkB;qBAC9B,CAAC,CAAC;gBACL,gCAAgC;gBAChC,8DAA8D;aAC/D;YAAC,OAAO,KAAU,EAAE;gBACnB,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,0CAA0C,EAAE,KAAK,CAAC,CAAC;gBAC7D,OAAO;aACR;YAED,IAAI,CAAC,uBAAA,IAAI,qDAAoB,EAAE;gBAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;gBAC9C,kBAAkB,GAAG,kBAAkB,CAAC,MAAM,CAC5C,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,WAAW,EAAE,KAAK,OAAO,CAClD,CAAC;aACH;YAED,MAAM,iBAAiB,GAAG,CAAC,uBAAA,IAAI,qDAAoB;gBACjD,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,uBAAA,IAAI,uDAAsB,MAA1B,IAAI,CAAwB,CAAC;YAEjC,MAAM,eAAe,GAAG,uBAAA,IAAI,2FAAoB,MAAxB,IAAI,EAC1B,kBAAkB,EAClB,iBAAiB,CAClB,CAAC;YAEF,MAAM,mBAAmB,GAAG,uBAAA,IAAI,+FAAwB,MAA5B,IAAI,EAC9B,kBAAkB,EAClB,iBAAiB,CAClB,CAAC;YAEF,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE;gBAChE,uBAAA,IAAI,+FAAwB,MAA5B,IAAI,EAAyB,eAAe,CAAC,CAAC;gBAC9C,uBAAA,IAAI,+FAAwB,MAA5B,IAAI,EAAyB,mBAAmB,CAAC,CAAC;gBAElD,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,6BAA6B,EAAE;oBACvC,GAAG,EAAE,eAAe;oBACpB,OAAO,EAAE,mBAAmB;iBAC7B,CAAC,CAAC;gBAEH,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE;oBAC5B,KAAK,EAAE,eAAe;oBACtB,OAAO,EAAE,mBAAmB;iBAC7B,CAAC,CAAC;aACJ;YACD,uBAAA,IAAI,qGAA8B,MAAlC,IAAI,EACF,kBAAkB,EAClB,yBAAyB,CAC1B,CAAC;SACH;gBAAS;YACR,WAAW,EAAE,CAAC;SACf;IACH,CAAC;CA+GF;k+BA7GyB,YAA+B;IACrD,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC,yGAGC,SAA4B,EAC5B,QAA2B;IAE3B,OAAO,SAAS,CAAC,MAAM,CACrB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,CAAC,CACvD,CAAC;AACJ,CAAC,iHAGC,SAA4B,EAC5B,QAA2B;IAE3B,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CACnC,QAAQ,CAAC,IAAI,CACX,CAAC,OAAO,EAAE,EAAE,CACV,QAAQ,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI;QAC9B,uBAAA,IAAI,8FAAuB,MAA3B,IAAI,EAAwB,QAAQ,EAAE,OAAO,CAAC,CACjD,CACF,CAAC;AACJ,CAAC,+GAGC,QAAyB,EACzB,OAAwB;IAExB,OAAO,aAAa,CAAC,IAAI,CACvB,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,OAAO,CAAC,CACvD,CAAC;AACJ,CAAC;IAGC,MAAM,yBAAyB,GAC7B,uBAAA,IAAI,0DAAyB,CAAC,sBAAsB,EAAE,EAAE,IAAI,EAAE,CAAC;IACjE,MAAM,cAAc,GAAG,uBAAA,IAAI,0FAAmB,MAAvB,IAAI,EAAoB,yBAAyB,CAAC,CAAC;IAC1E,MAAM,uBAAuB,GAAG,uBAAA,IAAI,6DAA4B,MAAhC,IAAI,CAA8B,CAAC;IACnE,OAAO,uBAAuB,CAAC,cAAc,CAAC,CAAC;AACjD,CAAC,6FAEa,iBAAyB;IACrC,MAAM,sBAAsB,GAAG,uBAAA,IAAI,qGAA8B,MAAlC,IAAI,CAAgC,CAAC;IAEpE,IAAI,sBAAsB,EAAE;QAC1B,OAAO,sBAAsB,GAAG,CAAC,CAAC;KACnC;IAED,OAAO,uBAAA,IAAI,qDAAoB;QAC7B,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,iBAAiB,GAAG,0BAA0B,CAAC;AACrD,CAAC,6HAGC,SAA4B,EAC5B,cAAwB;IAExB,IAAI,sBAAsB,GAAG,CAAC,CAAC,CAAC;IAEhC,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE;QAC1B,MAAM,uBAAuB,GAAG,EAAE,CAAC,WAAW;YAC5C,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;YAC9B,CAAC,CAAC,CAAC,CAAC,CAAC;QAEP,sBAAsB,GAAG,IAAI,CAAC,GAAG,CAC/B,sBAAsB,EACtB,uBAAuB,CACxB,CAAC;KACH;IAED,IAAI,sBAAsB,KAAK,CAAC,CAAC,EAAE;QACjC,OAAO;KACR;IAED,MAAM,cAAc,GAAG,uBAAA,IAAI,0FAAmB,MAAvB,IAAI,EAAoB,cAAc,CAAC,CAAC;IAC/D,MAAM,uBAAuB,GAAG,uBAAA,IAAI,6DAA4B,MAAhC,IAAI,CAA8B,CAAC;IACnE,MAAM,aAAa,GAAG,uBAAuB,CAAC,cAAc,CAAC,CAAC;IAE9D,IAAI,aAAa,IAAI,sBAAsB,EAAE;QAC3C,OAAO;KACR;IAED,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,gCAAgC,EAAE;QAC9C,uBAAuB,EAAE;YACvB,GAAG,uBAAuB;YAC1B,CAAC,cAAc,CAAC,EAAE,sBAAsB;SACzC;QACD,WAAW,EAAE,sBAAsB;KACpC,CAAC,CAAC;AACL,CAAC,uGAEkB,cAAwB;IACzC,MAAM,OAAO,GAAG,uBAAA,IAAI,6CAAY,MAAhB,IAAI,CAAc,CAAC;IACnC,MAAM,cAAc,GAAG,uBAAA,IAAI,oDAAmB,MAAvB,IAAI,CAAqB,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;IAExE,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChE,CAAC;IAGC,MAAM,SAAS,GAAG,uBAAA,IAAI,4CAAW,MAAf,IAAI,CAAa,CAAC;IACpC,MAAM,OAAO,GAAG,uBAAA,IAAI,6CAAY,MAAhB,IAAI,CAAc,CAAC;IAEnC,MAAM,kBAAkB,GACtB,uBAAA,IAAI,0DAAyB,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAE5D,OAAO,SAAS,IAAI,kBAAkB,CAAC;AACzC,CAAC","sourcesContent":["import type { AccountsController } from '@metamask/accounts-controller';\nimport type { BlockTracker } from '@metamask/network-controller';\nimport type { Hex } from '@metamask/utils';\nimport { Mutex } from 'async-mutex';\nimport EventEmitter from 'events';\n\nimport {\n createModuleLogger,\n incomingTransactionsLogger as log,\n} from '../logger';\nimport type { RemoteTransactionSource, TransactionMeta } from '../types';\n\nconst RECENT_HISTORY_BLOCK_RANGE = 10;\n\n// TODO: Replace `any` with type\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst UPDATE_CHECKS: ((txMeta: TransactionMeta) => any)[] = [\n (txMeta) => txMeta.status,\n (txMeta) => txMeta.txParams.gasUsed,\n];\n\n/**\n * Configuration options for the IncomingTransactionHelper\n *\n * @property includeTokenTransfers - Whether or not to include ERC20 token transfers.\n * @property isEnabled - Whether or not incoming transaction retrieval is enabled.\n * @property queryEntireHistory - Whether to initially query the entire transaction history or only recent blocks.\n * @property updateTransactions - Whether to update local transactions using remote transaction data.\n */\nexport type IncomingTransactionOptions = {\n includeTokenTransfers?: boolean;\n isEnabled?: () => boolean;\n queryEntireHistory?: boolean;\n updateTransactions?: boolean;\n};\n\nexport class IncomingTransactionHelper {\n hub: EventEmitter;\n\n #blockTracker: BlockTracker;\n\n #getCurrentAccount: () => ReturnType<\n AccountsController['getSelectedAccount']\n >;\n\n #getLastFetchedBlockNumbers: () => Record<string, number>;\n\n #getLocalTransactions: () => TransactionMeta[];\n\n #getChainId: () => Hex;\n\n #isEnabled: () => boolean;\n\n #isRunning: boolean;\n\n #log: debug.Debugger;\n\n #mutex = new Mutex();\n\n #onLatestBlock: (blockNumberHex: Hex) => Promise<void>;\n\n #queryEntireHistory: boolean;\n\n #remoteTransactionSource: RemoteTransactionSource;\n\n #transactionLimit?: number;\n\n #updateTransactions: boolean;\n\n constructor({\n blockTracker,\n getCurrentAccount,\n getLastFetchedBlockNumbers,\n getLocalTransactions,\n getChainId,\n isEnabled,\n queryEntireHistory,\n remoteTransactionSource,\n transactionLimit,\n updateTransactions,\n }: {\n blockTracker: BlockTracker;\n getCurrentAccount: () => ReturnType<\n AccountsController['getSelectedAccount']\n >;\n getLastFetchedBlockNumbers: () => Record<string, number>;\n getLocalTransactions?: () => TransactionMeta[];\n getChainId: () => Hex;\n isEnabled?: () => boolean;\n queryEntireHistory?: boolean;\n remoteTransactionSource: RemoteTransactionSource;\n transactionLimit?: number;\n updateTransactions?: boolean;\n }) {\n this.hub = new EventEmitter();\n\n this.#blockTracker = blockTracker;\n this.#getCurrentAccount = getCurrentAccount;\n this.#getLastFetchedBlockNumbers = getLastFetchedBlockNumbers;\n this.#getLocalTransactions = getLocalTransactions || (() => []);\n this.#getChainId = getChainId;\n this.#isEnabled = isEnabled ?? (() => true);\n this.#isRunning = false;\n this.#log = createModuleLogger(log, getChainId());\n this.#queryEntireHistory = queryEntireHistory ?? true;\n this.#remoteTransactionSource = remoteTransactionSource;\n this.#transactionLimit = transactionLimit;\n this.#updateTransactions = updateTransactions ?? false;\n\n // Using a property instead of a method to provide a listener reference\n // with the correct scope that we can remove later if stopped.\n this.#onLatestBlock = async (blockNumberHex: Hex) => {\n try {\n await this.update(blockNumberHex);\n } catch (error) {\n console.error('Error while checking incoming transactions', error);\n }\n };\n }\n\n start() {\n if (this.#isRunning) {\n return;\n }\n\n if (!this.#canStart()) {\n return;\n }\n\n this.#log('Starting polling');\n\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#blockTracker.addListener('latest', this.#onLatestBlock);\n this.#isRunning = true;\n }\n\n stop() {\n if (!this.#isRunning) {\n return;\n }\n\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#blockTracker.removeListener('latest', this.#onLatestBlock);\n this.#isRunning = false;\n\n this.#log('Stopped polling');\n }\n\n async update(latestBlockNumberHex?: Hex): Promise<void> {\n const releaseLock = await this.#mutex.acquire();\n\n this.#log('Checking');\n\n try {\n if (!this.#canStart()) {\n return;\n }\n\n const latestBlockNumber = parseInt(\n latestBlockNumberHex || (await this.#blockTracker.getLatestBlock()),\n 16,\n );\n\n const additionalLastFetchedKeys =\n this.#remoteTransactionSource.getLastBlockVariations?.() ?? [];\n\n const fromBlock = this.#getFromBlock(latestBlockNumber);\n const account = this.#getCurrentAccount();\n const chainId = this.#getChainId();\n\n let remoteTransactions = [];\n\n try {\n remoteTransactions =\n await this.#remoteTransactionSource.fetchTransactions({\n address: account.address,\n chainId,\n fromBlock,\n limit: this.#transactionLimit,\n });\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n this.#log('Error while fetching remote transactions', error);\n return;\n }\n\n if (!this.#updateTransactions) {\n const address = account.address.toLowerCase();\n remoteTransactions = remoteTransactions.filter(\n (tx) => tx.txParams.to?.toLowerCase() === address,\n );\n }\n\n const localTransactions = !this.#updateTransactions\n ? []\n : this.#getLocalTransactions();\n\n const newTransactions = this.#getNewTransactions(\n remoteTransactions,\n localTransactions,\n );\n\n const updatedTransactions = this.#getUpdatedTransactions(\n remoteTransactions,\n localTransactions,\n );\n\n if (newTransactions.length > 0 || updatedTransactions.length > 0) {\n this.#sortTransactionsByTime(newTransactions);\n this.#sortTransactionsByTime(updatedTransactions);\n\n this.#log('Found incoming transactions', {\n new: newTransactions,\n updated: updatedTransactions,\n });\n\n this.hub.emit('transactions', {\n added: newTransactions,\n updated: updatedTransactions,\n });\n }\n this.#updateLastFetchedBlockNumber(\n remoteTransactions,\n additionalLastFetchedKeys,\n );\n } finally {\n releaseLock();\n }\n }\n\n #sortTransactionsByTime(transactions: TransactionMeta[]) {\n transactions.sort((a, b) => (a.time < b.time ? -1 : 1));\n }\n\n #getNewTransactions(\n remoteTxs: TransactionMeta[],\n localTxs: TransactionMeta[],\n ): TransactionMeta[] {\n return remoteTxs.filter(\n (tx) => !localTxs.some(({ hash }) => hash === tx.hash),\n );\n }\n\n #getUpdatedTransactions(\n remoteTxs: TransactionMeta[],\n localTxs: TransactionMeta[],\n ): TransactionMeta[] {\n return remoteTxs.filter((remoteTx) =>\n localTxs.some(\n (localTx) =>\n remoteTx.hash === localTx.hash &&\n this.#isTransactionOutdated(remoteTx, localTx),\n ),\n );\n }\n\n #isTransactionOutdated(\n remoteTx: TransactionMeta,\n localTx: TransactionMeta,\n ): boolean {\n return UPDATE_CHECKS.some(\n (getValue) => getValue(remoteTx) !== getValue(localTx),\n );\n }\n\n #getLastFetchedBlockNumberDec(): number {\n const additionalLastFetchedKeys =\n this.#remoteTransactionSource.getLastBlockVariations?.() ?? [];\n const lastFetchedKey = this.#getBlockNumberKey(additionalLastFetchedKeys);\n const lastFetchedBlockNumbers = this.#getLastFetchedBlockNumbers();\n return lastFetchedBlockNumbers[lastFetchedKey];\n }\n\n #getFromBlock(latestBlockNumber: number): number | undefined {\n const lastFetchedBlockNumber = this.#getLastFetchedBlockNumberDec();\n\n if (lastFetchedBlockNumber) {\n return lastFetchedBlockNumber + 1;\n }\n\n return this.#queryEntireHistory\n ? undefined\n : latestBlockNumber - RECENT_HISTORY_BLOCK_RANGE;\n }\n\n #updateLastFetchedBlockNumber(\n remoteTxs: TransactionMeta[],\n additionalKeys: string[],\n ) {\n let lastFetchedBlockNumber = -1;\n\n for (const tx of remoteTxs) {\n const currentBlockNumberValue = tx.blockNumber\n ? parseInt(tx.blockNumber, 10)\n : -1;\n\n lastFetchedBlockNumber = Math.max(\n lastFetchedBlockNumber,\n currentBlockNumberValue,\n );\n }\n\n if (lastFetchedBlockNumber === -1) {\n return;\n }\n\n const lastFetchedKey = this.#getBlockNumberKey(additionalKeys);\n const lastFetchedBlockNumbers = this.#getLastFetchedBlockNumbers();\n const previousValue = lastFetchedBlockNumbers[lastFetchedKey];\n\n if (previousValue >= lastFetchedBlockNumber) {\n return;\n }\n\n this.hub.emit('updatedLastFetchedBlockNumbers', {\n lastFetchedBlockNumbers: {\n ...lastFetchedBlockNumbers,\n [lastFetchedKey]: lastFetchedBlockNumber,\n },\n blockNumber: lastFetchedBlockNumber,\n });\n }\n\n #getBlockNumberKey(additionalKeys: string[]): string {\n const chainId = this.#getChainId();\n const currentAccount = this.#getCurrentAccount()?.address.toLowerCase();\n\n return [chainId, currentAccount, ...additionalKeys].join('#');\n }\n\n #canStart(): boolean {\n const isEnabled = this.#isEnabled();\n const chainId = this.#getChainId();\n\n const isSupportedNetwork =\n this.#remoteTransactionSource.isSupportedNetwork(chainId);\n\n return isEnabled && isSupportedNetwork;\n }\n}\n"]}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
+
};
|
|
8
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
+
};
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
var _MethodDataHelper_instances, _MethodDataHelper_getProvider, _MethodDataHelper_getState, _MethodDataHelper_methodRegistryByNetworkClientId, _MethodDataHelper_mutex, _MethodDataHelper_registryLookup;
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.MethodDataHelper = void 0;
|
|
19
|
+
const utils_1 = require("@metamask/utils");
|
|
20
|
+
const async_mutex_1 = require("async-mutex");
|
|
21
|
+
const eth_method_registry_1 = require("eth-method-registry");
|
|
22
|
+
const events_1 = __importDefault(require("events"));
|
|
23
|
+
const logger_1 = require("../logger.cjs");
|
|
24
|
+
const log = (0, utils_1.createModuleLogger)(logger_1.projectLogger, 'method-data');
|
|
25
|
+
class MethodDataHelper {
|
|
26
|
+
constructor({ getProvider, getState, }) {
|
|
27
|
+
_MethodDataHelper_instances.add(this);
|
|
28
|
+
_MethodDataHelper_getProvider.set(this, void 0);
|
|
29
|
+
_MethodDataHelper_getState.set(this, void 0);
|
|
30
|
+
_MethodDataHelper_methodRegistryByNetworkClientId.set(this, void 0);
|
|
31
|
+
_MethodDataHelper_mutex.set(this, new async_mutex_1.Mutex());
|
|
32
|
+
this.hub = new events_1.default();
|
|
33
|
+
__classPrivateFieldSet(this, _MethodDataHelper_getProvider, getProvider, "f");
|
|
34
|
+
__classPrivateFieldSet(this, _MethodDataHelper_getState, getState, "f");
|
|
35
|
+
__classPrivateFieldSet(this, _MethodDataHelper_methodRegistryByNetworkClientId, new Map(), "f");
|
|
36
|
+
}
|
|
37
|
+
async lookup(fourBytePrefix, networkClientId) {
|
|
38
|
+
log('lookup', fourBytePrefix, networkClientId);
|
|
39
|
+
const releaseLock = await __classPrivateFieldGet(this, _MethodDataHelper_mutex, "f").acquire();
|
|
40
|
+
try {
|
|
41
|
+
const cachedResult = __classPrivateFieldGet(this, _MethodDataHelper_getState, "f").call(this)[fourBytePrefix];
|
|
42
|
+
if (cachedResult) {
|
|
43
|
+
log('Cached', cachedResult);
|
|
44
|
+
return cachedResult;
|
|
45
|
+
}
|
|
46
|
+
let registry = __classPrivateFieldGet(this, _MethodDataHelper_methodRegistryByNetworkClientId, "f").get(networkClientId);
|
|
47
|
+
if (!registry) {
|
|
48
|
+
const provider = __classPrivateFieldGet(this, _MethodDataHelper_getProvider, "f").call(this, networkClientId);
|
|
49
|
+
// @ts-expect-error Type in eth-method-registry is inappropriate and should be changed
|
|
50
|
+
registry = new eth_method_registry_1.MethodRegistry({ provider });
|
|
51
|
+
__classPrivateFieldGet(this, _MethodDataHelper_methodRegistryByNetworkClientId, "f").set(networkClientId, registry);
|
|
52
|
+
log('Created registry', networkClientId);
|
|
53
|
+
}
|
|
54
|
+
const methodData = await __classPrivateFieldGet(this, _MethodDataHelper_instances, "m", _MethodDataHelper_registryLookup).call(this, fourBytePrefix, registry);
|
|
55
|
+
log('Result', methodData);
|
|
56
|
+
this.hub.emit('update', { fourBytePrefix, methodData });
|
|
57
|
+
return methodData;
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
releaseLock();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.MethodDataHelper = MethodDataHelper;
|
|
65
|
+
_MethodDataHelper_getProvider = new WeakMap(), _MethodDataHelper_getState = new WeakMap(), _MethodDataHelper_methodRegistryByNetworkClientId = new WeakMap(), _MethodDataHelper_mutex = new WeakMap(), _MethodDataHelper_instances = new WeakSet(), _MethodDataHelper_registryLookup = async function _MethodDataHelper_registryLookup(fourBytePrefix, methodRegistry) {
|
|
66
|
+
const registryMethod = await methodRegistry.lookup(fourBytePrefix);
|
|
67
|
+
if (!registryMethod) {
|
|
68
|
+
log('No method found', fourBytePrefix);
|
|
69
|
+
return {
|
|
70
|
+
registryMethod: '',
|
|
71
|
+
parsedRegistryMethod: { name: undefined, args: undefined },
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
log('Parsing', registryMethod);
|
|
75
|
+
const parsedRegistryMethod = methodRegistry.parse(registryMethod);
|
|
76
|
+
return { registryMethod, parsedRegistryMethod };
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=MethodDataHelper.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MethodDataHelper.cjs","sourceRoot":"","sources":["../../src/helpers/MethodDataHelper.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AACA,2CAAqD;AACrD,6CAAoC;AACpC,6DAAqD;AACrD,oDAAkC;AAElC,0CAA0C;AAG1C,MAAM,GAAG,GAAG,IAAA,0BAAkB,EAAC,sBAAa,EAAE,aAAa,CAAC,CAAC;AAE7D,MAAa,gBAAgB;IAW3B,YAAY,EACV,WAAW,EACX,QAAQ,GAIT;;QAdD,gDAA6D;QAE7D,6CAA4C;QAE5C,oEAAuE;QAEvE,kCAAS,IAAI,mBAAK,EAAE,EAAC;QASnB,IAAI,CAAC,GAAG,GAAG,IAAI,gBAAY,EAAE,CAAC;QAE9B,uBAAA,IAAI,iCAAgB,WAAW,MAAA,CAAC;QAChC,uBAAA,IAAI,8BAAa,QAAQ,MAAA,CAAC;QAC1B,uBAAA,IAAI,qDAAoC,IAAI,GAAG,EAAE,MAAA,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,MAAM,CACV,cAAsB,EACtB,eAAgC;QAEhC,GAAG,CAAC,QAAQ,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;QAE/C,MAAM,WAAW,GAAG,MAAM,uBAAA,IAAI,+BAAO,CAAC,OAAO,EAAE,CAAC;QAEhD,IAAI;YACF,MAAM,YAAY,GAAG,uBAAA,IAAI,kCAAU,MAAd,IAAI,CAAY,CAAC,cAAc,CAAC,CAAC;YAEtD,IAAI,YAAY,EAAE;gBAChB,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;gBAC5B,OAAO,YAAY,CAAC;aACrB;YAED,IAAI,QAAQ,GAAG,uBAAA,IAAI,yDAAiC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAE1E,IAAI,CAAC,QAAQ,EAAE;gBACb,MAAM,QAAQ,GAAG,uBAAA,IAAI,qCAAa,MAAjB,IAAI,EAAc,eAAe,CAAC,CAAC;gBAEpD,sFAAsF;gBACtF,QAAQ,GAAG,IAAI,oCAAc,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAE5C,uBAAA,IAAI,yDAAiC,CAAC,GAAG,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;gBAErE,GAAG,CAAC,kBAAkB,EAAE,eAAe,CAAC,CAAC;aAC1C;YAED,MAAM,UAAU,GAAG,MAAM,uBAAA,IAAI,qEAAgB,MAApB,IAAI,EAAiB,cAAc,EAAE,QAAQ,CAAC,CAAC;YAExE,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAE1B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC,CAAC;YAExD,OAAO,UAAU,CAAC;SACnB;gBAAS;YACR,WAAW,EAAE,CAAC;SACf;IACH,CAAC;CAuBF;AAvFD,4CAuFC;uRArBC,KAAK,2CACH,cAAsB,EACtB,cAA8B;IAE9B,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAEnE,IAAI,CAAC,cAAc,EAAE;QACnB,GAAG,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;QAEvC,OAAO;YACL,cAAc,EAAE,EAAE;YAClB,oBAAoB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;SAC3D,CAAC;KACH;IAED,GAAG,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAE/B,MAAM,oBAAoB,GAAG,cAAc,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAElE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,CAAC;AAClD,CAAC","sourcesContent":["import type { NetworkClientId, Provider } from '@metamask/network-controller';\nimport { createModuleLogger } from '@metamask/utils';\nimport { Mutex } from 'async-mutex';\nimport { MethodRegistry } from 'eth-method-registry';\nimport EventEmitter from 'events';\n\nimport { projectLogger } from '../logger';\nimport type { MethodData } from '../TransactionController';\n\nconst log = createModuleLogger(projectLogger, 'method-data');\n\nexport class MethodDataHelper {\n hub: EventEmitter;\n\n #getProvider: (networkClientId: NetworkClientId) => Provider;\n\n #getState: () => Record<string, MethodData>;\n\n #methodRegistryByNetworkClientId: Map<NetworkClientId, MethodRegistry>;\n\n #mutex = new Mutex();\n\n constructor({\n getProvider,\n getState,\n }: {\n getProvider: (networkClientId: NetworkClientId) => Provider;\n getState: () => Record<string, MethodData>;\n }) {\n this.hub = new EventEmitter();\n\n this.#getProvider = getProvider;\n this.#getState = getState;\n this.#methodRegistryByNetworkClientId = new Map();\n }\n\n async lookup(\n fourBytePrefix: string,\n networkClientId: NetworkClientId,\n ): Promise<MethodData> {\n log('lookup', fourBytePrefix, networkClientId);\n\n const releaseLock = await this.#mutex.acquire();\n\n try {\n const cachedResult = this.#getState()[fourBytePrefix];\n\n if (cachedResult) {\n log('Cached', cachedResult);\n return cachedResult;\n }\n\n let registry = this.#methodRegistryByNetworkClientId.get(networkClientId);\n\n if (!registry) {\n const provider = this.#getProvider(networkClientId);\n\n // @ts-expect-error Type in eth-method-registry is inappropriate and should be changed\n registry = new MethodRegistry({ provider });\n\n this.#methodRegistryByNetworkClientId.set(networkClientId, registry);\n\n log('Created registry', networkClientId);\n }\n\n const methodData = await this.#registryLookup(fourBytePrefix, registry);\n\n log('Result', methodData);\n\n this.hub.emit('update', { fourBytePrefix, methodData });\n\n return methodData;\n } finally {\n releaseLock();\n }\n }\n\n async #registryLookup(\n fourBytePrefix: string,\n methodRegistry: MethodRegistry,\n ): Promise<MethodData> {\n const registryMethod = await methodRegistry.lookup(fourBytePrefix);\n\n if (!registryMethod) {\n log('No method found', fourBytePrefix);\n\n return {\n registryMethod: '',\n parsedRegistryMethod: { name: undefined, args: undefined },\n };\n }\n\n log('Parsing', registryMethod);\n\n const parsedRegistryMethod = methodRegistry.parse(registryMethod);\n\n return { registryMethod, parsedRegistryMethod };\n }\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import type { NetworkClientId, Provider } from "@metamask/network-controller";
|
|
3
|
+
import EventEmitter from "events";
|
|
4
|
+
import type { MethodData } from "../TransactionController.cjs";
|
|
5
|
+
export declare class MethodDataHelper {
|
|
6
|
+
#private;
|
|
7
|
+
hub: EventEmitter;
|
|
8
|
+
constructor({ getProvider, getState, }: {
|
|
9
|
+
getProvider: (networkClientId: NetworkClientId) => Provider;
|
|
10
|
+
getState: () => Record<string, MethodData>;
|
|
11
|
+
});
|
|
12
|
+
lookup(fourBytePrefix: string, networkClientId: NetworkClientId): Promise<MethodData>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=MethodDataHelper.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MethodDataHelper.d.cts","sourceRoot":"","sources":["../../src/helpers/MethodDataHelper.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,qCAAqC;AAI9E,OAAO,YAAY,eAAe;AAGlC,OAAO,KAAK,EAAE,UAAU,EAAE,qCAAiC;AAI3D,qBAAa,gBAAgB;;IAC3B,GAAG,EAAE,YAAY,CAAC;gBAUN,EACV,WAAW,EACX,QAAQ,GACT,EAAE;QACD,WAAW,EAAE,CAAC,eAAe,EAAE,eAAe,KAAK,QAAQ,CAAC;QAC5D,QAAQ,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;KAC5C;IAQK,MAAM,CACV,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,eAAe,GAC/B,OAAO,CAAC,UAAU,CAAC;CA2DvB"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import type { NetworkClientId, Provider } from "@metamask/network-controller";
|
|
3
|
+
import EventEmitter from "events";
|
|
4
|
+
import type { MethodData } from "../TransactionController.mjs";
|
|
5
|
+
export declare class MethodDataHelper {
|
|
6
|
+
#private;
|
|
7
|
+
hub: EventEmitter;
|
|
8
|
+
constructor({ getProvider, getState, }: {
|
|
9
|
+
getProvider: (networkClientId: NetworkClientId) => Provider;
|
|
10
|
+
getState: () => Record<string, MethodData>;
|
|
11
|
+
});
|
|
12
|
+
lookup(fourBytePrefix: string, networkClientId: NetworkClientId): Promise<MethodData>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=MethodDataHelper.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MethodDataHelper.d.mts","sourceRoot":"","sources":["../../src/helpers/MethodDataHelper.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,qCAAqC;AAI9E,OAAO,YAAY,eAAe;AAGlC,OAAO,KAAK,EAAE,UAAU,EAAE,qCAAiC;AAI3D,qBAAa,gBAAgB;;IAC3B,GAAG,EAAE,YAAY,CAAC;gBAUN,EACV,WAAW,EACX,QAAQ,GACT,EAAE;QACD,WAAW,EAAE,CAAC,eAAe,EAAE,eAAe,KAAK,QAAQ,CAAC;QAC5D,QAAQ,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;KAC5C;IAQK,MAAM,CACV,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,eAAe,GAC/B,OAAO,CAAC,UAAU,CAAC;CA2DvB"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
+
};
|
|
12
|
+
var _MethodDataHelper_instances, _MethodDataHelper_getProvider, _MethodDataHelper_getState, _MethodDataHelper_methodRegistryByNetworkClientId, _MethodDataHelper_mutex, _MethodDataHelper_registryLookup;
|
|
13
|
+
import { createModuleLogger } from "@metamask/utils";
|
|
14
|
+
import { Mutex } from "async-mutex";
|
|
15
|
+
import { MethodRegistry } from "eth-method-registry";
|
|
16
|
+
import EventEmitter from "events";
|
|
17
|
+
import { projectLogger } from "../logger.mjs";
|
|
18
|
+
const log = createModuleLogger(projectLogger, 'method-data');
|
|
19
|
+
export class MethodDataHelper {
|
|
20
|
+
constructor({ getProvider, getState, }) {
|
|
21
|
+
_MethodDataHelper_instances.add(this);
|
|
22
|
+
_MethodDataHelper_getProvider.set(this, void 0);
|
|
23
|
+
_MethodDataHelper_getState.set(this, void 0);
|
|
24
|
+
_MethodDataHelper_methodRegistryByNetworkClientId.set(this, void 0);
|
|
25
|
+
_MethodDataHelper_mutex.set(this, new Mutex());
|
|
26
|
+
this.hub = new EventEmitter();
|
|
27
|
+
__classPrivateFieldSet(this, _MethodDataHelper_getProvider, getProvider, "f");
|
|
28
|
+
__classPrivateFieldSet(this, _MethodDataHelper_getState, getState, "f");
|
|
29
|
+
__classPrivateFieldSet(this, _MethodDataHelper_methodRegistryByNetworkClientId, new Map(), "f");
|
|
30
|
+
}
|
|
31
|
+
async lookup(fourBytePrefix, networkClientId) {
|
|
32
|
+
log('lookup', fourBytePrefix, networkClientId);
|
|
33
|
+
const releaseLock = await __classPrivateFieldGet(this, _MethodDataHelper_mutex, "f").acquire();
|
|
34
|
+
try {
|
|
35
|
+
const cachedResult = __classPrivateFieldGet(this, _MethodDataHelper_getState, "f").call(this)[fourBytePrefix];
|
|
36
|
+
if (cachedResult) {
|
|
37
|
+
log('Cached', cachedResult);
|
|
38
|
+
return cachedResult;
|
|
39
|
+
}
|
|
40
|
+
let registry = __classPrivateFieldGet(this, _MethodDataHelper_methodRegistryByNetworkClientId, "f").get(networkClientId);
|
|
41
|
+
if (!registry) {
|
|
42
|
+
const provider = __classPrivateFieldGet(this, _MethodDataHelper_getProvider, "f").call(this, networkClientId);
|
|
43
|
+
// @ts-expect-error Type in eth-method-registry is inappropriate and should be changed
|
|
44
|
+
registry = new MethodRegistry({ provider });
|
|
45
|
+
__classPrivateFieldGet(this, _MethodDataHelper_methodRegistryByNetworkClientId, "f").set(networkClientId, registry);
|
|
46
|
+
log('Created registry', networkClientId);
|
|
47
|
+
}
|
|
48
|
+
const methodData = await __classPrivateFieldGet(this, _MethodDataHelper_instances, "m", _MethodDataHelper_registryLookup).call(this, fourBytePrefix, registry);
|
|
49
|
+
log('Result', methodData);
|
|
50
|
+
this.hub.emit('update', { fourBytePrefix, methodData });
|
|
51
|
+
return methodData;
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
releaseLock();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
_MethodDataHelper_getProvider = new WeakMap(), _MethodDataHelper_getState = new WeakMap(), _MethodDataHelper_methodRegistryByNetworkClientId = new WeakMap(), _MethodDataHelper_mutex = new WeakMap(), _MethodDataHelper_instances = new WeakSet(), _MethodDataHelper_registryLookup = async function _MethodDataHelper_registryLookup(fourBytePrefix, methodRegistry) {
|
|
59
|
+
const registryMethod = await methodRegistry.lookup(fourBytePrefix);
|
|
60
|
+
if (!registryMethod) {
|
|
61
|
+
log('No method found', fourBytePrefix);
|
|
62
|
+
return {
|
|
63
|
+
registryMethod: '',
|
|
64
|
+
parsedRegistryMethod: { name: undefined, args: undefined },
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
log('Parsing', registryMethod);
|
|
68
|
+
const parsedRegistryMethod = methodRegistry.parse(registryMethod);
|
|
69
|
+
return { registryMethod, parsedRegistryMethod };
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=MethodDataHelper.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MethodDataHelper.mjs","sourceRoot":"","sources":["../../src/helpers/MethodDataHelper.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,OAAO,EAAE,kBAAkB,EAAE,wBAAwB;AACrD,OAAO,EAAE,KAAK,EAAE,oBAAoB;AACpC,OAAO,EAAE,cAAc,EAAE,4BAA4B;AACrD,OAAO,YAAY,eAAe;AAElC,OAAO,EAAE,aAAa,EAAE,sBAAkB;AAG1C,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AAE7D,MAAM,OAAO,gBAAgB;IAW3B,YAAY,EACV,WAAW,EACX,QAAQ,GAIT;;QAdD,gDAA6D;QAE7D,6CAA4C;QAE5C,oEAAuE;QAEvE,kCAAS,IAAI,KAAK,EAAE,EAAC;QASnB,IAAI,CAAC,GAAG,GAAG,IAAI,YAAY,EAAE,CAAC;QAE9B,uBAAA,IAAI,iCAAgB,WAAW,MAAA,CAAC;QAChC,uBAAA,IAAI,8BAAa,QAAQ,MAAA,CAAC;QAC1B,uBAAA,IAAI,qDAAoC,IAAI,GAAG,EAAE,MAAA,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,MAAM,CACV,cAAsB,EACtB,eAAgC;QAEhC,GAAG,CAAC,QAAQ,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;QAE/C,MAAM,WAAW,GAAG,MAAM,uBAAA,IAAI,+BAAO,CAAC,OAAO,EAAE,CAAC;QAEhD,IAAI;YACF,MAAM,YAAY,GAAG,uBAAA,IAAI,kCAAU,MAAd,IAAI,CAAY,CAAC,cAAc,CAAC,CAAC;YAEtD,IAAI,YAAY,EAAE;gBAChB,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;gBAC5B,OAAO,YAAY,CAAC;aACrB;YAED,IAAI,QAAQ,GAAG,uBAAA,IAAI,yDAAiC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAE1E,IAAI,CAAC,QAAQ,EAAE;gBACb,MAAM,QAAQ,GAAG,uBAAA,IAAI,qCAAa,MAAjB,IAAI,EAAc,eAAe,CAAC,CAAC;gBAEpD,sFAAsF;gBACtF,QAAQ,GAAG,IAAI,cAAc,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAE5C,uBAAA,IAAI,yDAAiC,CAAC,GAAG,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;gBAErE,GAAG,CAAC,kBAAkB,EAAE,eAAe,CAAC,CAAC;aAC1C;YAED,MAAM,UAAU,GAAG,MAAM,uBAAA,IAAI,qEAAgB,MAApB,IAAI,EAAiB,cAAc,EAAE,QAAQ,CAAC,CAAC;YAExE,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAE1B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC,CAAC;YAExD,OAAO,UAAU,CAAC;SACnB;gBAAS;YACR,WAAW,EAAE,CAAC;SACf;IACH,CAAC;CAuBF;uRArBC,KAAK,2CACH,cAAsB,EACtB,cAA8B;IAE9B,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAEnE,IAAI,CAAC,cAAc,EAAE;QACnB,GAAG,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;QAEvC,OAAO;YACL,cAAc,EAAE,EAAE;YAClB,oBAAoB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;SAC3D,CAAC;KACH;IAED,GAAG,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAE/B,MAAM,oBAAoB,GAAG,cAAc,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAElE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,CAAC;AAClD,CAAC","sourcesContent":["import type { NetworkClientId, Provider } from '@metamask/network-controller';\nimport { createModuleLogger } from '@metamask/utils';\nimport { Mutex } from 'async-mutex';\nimport { MethodRegistry } from 'eth-method-registry';\nimport EventEmitter from 'events';\n\nimport { projectLogger } from '../logger';\nimport type { MethodData } from '../TransactionController';\n\nconst log = createModuleLogger(projectLogger, 'method-data');\n\nexport class MethodDataHelper {\n hub: EventEmitter;\n\n #getProvider: (networkClientId: NetworkClientId) => Provider;\n\n #getState: () => Record<string, MethodData>;\n\n #methodRegistryByNetworkClientId: Map<NetworkClientId, MethodRegistry>;\n\n #mutex = new Mutex();\n\n constructor({\n getProvider,\n getState,\n }: {\n getProvider: (networkClientId: NetworkClientId) => Provider;\n getState: () => Record<string, MethodData>;\n }) {\n this.hub = new EventEmitter();\n\n this.#getProvider = getProvider;\n this.#getState = getState;\n this.#methodRegistryByNetworkClientId = new Map();\n }\n\n async lookup(\n fourBytePrefix: string,\n networkClientId: NetworkClientId,\n ): Promise<MethodData> {\n log('lookup', fourBytePrefix, networkClientId);\n\n const releaseLock = await this.#mutex.acquire();\n\n try {\n const cachedResult = this.#getState()[fourBytePrefix];\n\n if (cachedResult) {\n log('Cached', cachedResult);\n return cachedResult;\n }\n\n let registry = this.#methodRegistryByNetworkClientId.get(networkClientId);\n\n if (!registry) {\n const provider = this.#getProvider(networkClientId);\n\n // @ts-expect-error Type in eth-method-registry is inappropriate and should be changed\n registry = new MethodRegistry({ provider });\n\n this.#methodRegistryByNetworkClientId.set(networkClientId, registry);\n\n log('Created registry', networkClientId);\n }\n\n const methodData = await this.#registryLookup(fourBytePrefix, registry);\n\n log('Result', methodData);\n\n this.hub.emit('update', { fourBytePrefix, methodData });\n\n return methodData;\n } finally {\n releaseLock();\n }\n }\n\n async #registryLookup(\n fourBytePrefix: string,\n methodRegistry: MethodRegistry,\n ): Promise<MethodData> {\n const registryMethod = await methodRegistry.lookup(fourBytePrefix);\n\n if (!registryMethod) {\n log('No method found', fourBytePrefix);\n\n return {\n registryMethod: '',\n parsedRegistryMethod: { name: undefined, args: undefined },\n };\n }\n\n log('Parsing', registryMethod);\n\n const parsedRegistryMethod = methodRegistry.parse(registryMethod);\n\n return { registryMethod, parsedRegistryMethod };\n }\n}\n"]}
|