@metamask/transaction-controller 60.6.1 → 60.8.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 +24 -1
- package/dist/TransactionController.cjs +31 -15
- package/dist/TransactionController.cjs.map +1 -1
- package/dist/TransactionController.d.cts.map +1 -1
- package/dist/TransactionController.d.mts.map +1 -1
- package/dist/TransactionController.mjs +31 -15
- package/dist/TransactionController.mjs.map +1 -1
- package/dist/api/accounts-api.cjs +2 -1
- package/dist/api/accounts-api.cjs.map +1 -1
- package/dist/api/accounts-api.d.cts.map +1 -1
- package/dist/api/accounts-api.d.mts.map +1 -1
- package/dist/api/accounts-api.mjs +2 -1
- package/dist/api/accounts-api.mjs.map +1 -1
- package/dist/constants.cjs +1 -0
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.d.cts +1 -0
- package/dist/constants.d.cts.map +1 -1
- package/dist/constants.d.mts +1 -0
- package/dist/constants.d.mts.map +1 -1
- package/dist/constants.mjs +1 -0
- package/dist/constants.mjs.map +1 -1
- package/dist/helpers/AccountsApiRemoteTransactionSource.cjs +1 -0
- package/dist/helpers/AccountsApiRemoteTransactionSource.cjs.map +1 -1
- package/dist/helpers/AccountsApiRemoteTransactionSource.d.cts.map +1 -1
- package/dist/helpers/AccountsApiRemoteTransactionSource.d.mts.map +1 -1
- package/dist/helpers/AccountsApiRemoteTransactionSource.mjs +1 -0
- package/dist/helpers/AccountsApiRemoteTransactionSource.mjs.map +1 -1
- package/dist/hooks/ExtraTransactionsPublishHook.cjs +21 -6
- package/dist/hooks/ExtraTransactionsPublishHook.cjs.map +1 -1
- package/dist/hooks/ExtraTransactionsPublishHook.d.cts +4 -2
- package/dist/hooks/ExtraTransactionsPublishHook.d.cts.map +1 -1
- package/dist/hooks/ExtraTransactionsPublishHook.d.mts +4 -2
- package/dist/hooks/ExtraTransactionsPublishHook.d.mts.map +1 -1
- package/dist/hooks/ExtraTransactionsPublishHook.mjs +21 -6
- package/dist/hooks/ExtraTransactionsPublishHook.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +5 -1
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +5 -1
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils/batch.cjs +89 -22
- package/dist/utils/batch.cjs.map +1 -1
- package/dist/utils/batch.d.cts +1 -0
- package/dist/utils/batch.d.cts.map +1 -1
- package/dist/utils/batch.d.mts +1 -0
- package/dist/utils/batch.d.mts.map +1 -1
- package/dist/utils/batch.mjs +89 -22
- package/dist/utils/batch.mjs.map +1 -1
- package/dist/utils/swaps.cjs +6 -0
- package/dist/utils/swaps.cjs.map +1 -1
- package/dist/utils/swaps.d.cts +1 -0
- package/dist/utils/swaps.d.cts.map +1 -1
- package/dist/utils/swaps.d.mts +1 -0
- package/dist/utils/swaps.d.mts.map +1 -1
- package/dist/utils/swaps.mjs +6 -0
- package/dist/utils/swaps.mjs.map +1 -1
- package/package.json +5 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccountsApiRemoteTransactionSource.mjs","sourceRoot":"","sources":["../../src/helpers/AccountsApiRemoteTransactionSource.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,OAAO,EAAE,mCAAmC;AAErD,OAAO,GAAE,cAAc;;AACvB,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,aAAa;AAEpC,OAAO,EAAE,wBAAwB,EAAE,qBAAW;AAK9C,OAAO,EAAE,sBAAsB,EAAE,gCAA4B;AAC7D,OAAO,EAAE,SAAS,EAAE,yBAAqB;AACzC,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,sBAAkB;AAO3E,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,qBAAiB;AAE9D,MAAM,CAAC,MAAM,mBAAmB,GAAU;IACxC,SAAS,CAAC,OAAO;IACjB,SAAS,CAAC,OAAO;IACjB,SAAS,CAAC,GAAG;IACb,SAAS,CAAC,aAAa;IACvB,SAAS,CAAC,IAAI;IACd,SAAS,CAAC,QAAQ;IAClB,SAAS,CAAC,QAAQ;IAClB,SAAS,CAAC,MAAM;IAChB,SAAS,CAAC,GAAG;CACd,CAAC;AAEF,MAAM,GAAG,GAAG,kBAAkB,CAC5B,0BAA0B,EAC1B,qBAAqB,CACtB,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,kCAAkC;IAA/C;;IA4LA,CAAC;IAzLC,kBAAkB;QAChB,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,OAAuC;QAEvC,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAE5B,MAAM,oBAAoB,GAAG,MAAM,uBAAA,IAAI,4GAAmB,MAAvB,IAAI,EACrC,OAAO,EACP,mBAAmB,CACpB,CAAC;QAEF,GAAG,CACD,sBAAsB,EACtB,oBAAoB,CAAC,MAAM,EAC3B,oBAAoB,CACrB,CAAC;QAEF,MAAM,sBAAsB,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9C,oBAAoB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,uBAAA,IAAI,+GAAsB,MAA1B,IAAI,EAAuB,OAAO,EAAE,EAAE,CAAC,CAAC,CAC1E,CAAC;QAEF,GAAG,CAAC,yBAAyB,EAAE,sBAAsB,CAAC,CAAC;QAEvD,MAAM,oBAAoB,GAAG,uBAAA,IAAI,6GAAoB,MAAxB,IAAI,EAC/B,OAAO,EACP,sBAAsB,CACvB,CAAC;QAEF,GAAG,CACD,uBAAuB,EACvB,oBAAoB,CAAC,MAAM,EAC3B,oBAAoB,CACrB,CAAC;QAEF,OAAO,oBAAoB,CAAC;IAC9B,CAAC;CAmJF;uHAjJC,KAAK,gEACH,OAAuC,EACvC,QAAe;IAEf,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAClC,MAAM,YAAY,GAA0B,EAAE,CAAC;IAE/C,IAAI;QACF,MAAM,QAAQ,GAAG,MAAM,sBAAsB,CAAC;YAC5C,OAAO;YACP,QAAQ;YACR,aAAa,EAAE,MAAM;YACrB,IAAI;SACL,CAAC,CAAC;QAEH,IAAI,QAAQ,EAAE,IAAI,EAAE;YAClB,YAAY,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;SACrC;KACF;IAAC,OAAO,KAAK,EAAE;QACd,GAAG,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;KACjD;IAED,OAAO,YAAY,CAAC;AACtB,CAAC,2HAGC,OAAuC,EACvC,YAA+B;IAE/B,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC;IAEvE,IAAI,oBAAoB,GAAG,YAAY,CAAC;IAExC,IAAI,CAAC,kBAAkB,EAAE;QACvB,oBAAoB,GAAG,oBAAoB,CAAC,MAAM,CAChD,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,OAAO,CACnC,CAAC;KACH;IAED,IAAI,CAAC,qBAAqB,EAAE;QAC1B,oBAAoB,GAAG,oBAAoB,CAAC,MAAM,CAChD,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,CACvB,CAAC;KACH;IAED,OAAO,oBAAoB,CAAC;AAC9B,CAAC,6DAED,KAAK,mEACH,OAAY,EACZ,mBAA8D;IAE9D,MAAM,WAAW,GAAG,MAAM,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,KAAK,mBAAmB,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAS,CAAC;IACvE,MAAM,EAAE,IAAI,EAAE,GAAG,mBAAmB,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IAC/D,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnC,MAAM,EAAE,IAAI,EAAE,GAAG,mBAAmB,CAAC;IACrC,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,mBAAmB,CAAC,QAAQ,CAAC;IAC1C,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC;IACtC,MAAM,oBAAoB,GAAG,KAAK,CAAC;IAEnC,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO;QACxC,CAAC,CAAC,iBAAiB,CAAC,MAAM;QAC1B,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC;IAEhC,MAAM,aAAa,GAAG,mBAAmB,CAAC,cAAc,CAAC,IAAI,CAC3D,CAAC,EAAE,EAAE,EAAE,CACL,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,WAAW,EAAE;QAC5C,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC;QAClD,EAAE,CAAC,eAAe,CACrB,CAAC;IAEF,MAAM,uBAAuB,GAC3B,aAAa,EAAE,EAAE,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,WAAW,EAAE;QACzD,IAAI,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC;IAE/C,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC;IAChE,MAAM,MAAM,GAAG,aAAa,EAAE,MAAM,CAAC;IACrC,MAAM,eAAe,GAAG,aAAa,EAAE,eAAyB,CAAC;IACjE,MAAM,QAAQ,GAAG,aAAa,EAAE,OAAiB,CAAC;IAClD,MAAM,MAAM,GAAG,aAAa,EAAE,MAAgB,CAAC;IAE/C,MAAM,KAAK,GAAG,OAAO,CACnB,IAAI,EAAE,CACJ,uBAAuB;QACrB,CAAC,CAAC,CAAC,aAAa,EAAE,MAAM,IAAI,mBAAmB,CAAC,KAAK,CAAC;QACtD,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAC9B,CACF,CAAC;IAEF,MAAM,EAAE,GAAG,uBAAuB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAC;IAEtE,MAAM,KAAK,GACT,MAAM,KAAK,iBAAiB,CAAC,MAAM;QACjC,CAAC,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC;QACjC,CAAC,CAAE,SAAyC,CAAC;IAEjD,MAAM,mBAAmB,GAAG,aAAa;QACvC,CAAC,CAAC;YACE,MAAM;YACN,eAAe;YACf,QAAQ;YACR,MAAM;SACP;QACH,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,IAAI,GAAoB;QAC5B,WAAW;QACX,OAAO;QACP,KAAK;QACL,IAAI;QACJ,EAAE;QACF,UAAU,EAAE,uBAAuB;QACnC,yDAAyD;QACzD,eAAe,EAAE,EAAE;QACnB,MAAM;QACN,IAAI;QACJ,eAAe,EAAE,KAAK;QACtB,mBAAmB;QACnB,QAAQ,EAAE;YACR,OAAO;YACP,IAAI;YACJ,IAAI;YACJ,GAAG;YACH,QAAQ;YACR,OAAO;YACP,KAAK;YACL,EAAE;YACF,KAAK;SACN;QACD,IAAI;QACJ,oBAAoB;KACrB,CAAC;IAEF,IAAI,UAAU,EAAE;QACd,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;KAClE;IAED,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import { BNToHex } from '@metamask/controller-utils';\nimport type { Hex } from '@metamask/utils';\nimport BN from 'bn.js';\nimport { v1 as random } from 'uuid';\n\nimport { determineTransactionType } from '..';\nimport type {\n GetAccountTransactionsResponse,\n TransactionResponse,\n} from '../api/accounts-api';\nimport { getAccountTransactions } from '../api/accounts-api';\nimport { CHAIN_IDS } from '../constants';\nimport { createModuleLogger, incomingTransactionsLogger } from '../logger';\nimport type {\n RemoteTransactionSource,\n RemoteTransactionSourceRequest,\n TransactionError,\n TransactionMeta,\n} from '../types';\nimport { TransactionStatus, TransactionType } from '../types';\n\nexport const SUPPORTED_CHAIN_IDS: Hex[] = [\n CHAIN_IDS.MAINNET,\n CHAIN_IDS.POLYGON,\n CHAIN_IDS.BSC,\n CHAIN_IDS.LINEA_MAINNET,\n CHAIN_IDS.BASE,\n CHAIN_IDS.OPTIMISM,\n CHAIN_IDS.ARBITRUM,\n CHAIN_IDS.SCROLL,\n CHAIN_IDS.SEI,\n];\n\nconst log = createModuleLogger(\n incomingTransactionsLogger,\n 'accounts-api-source',\n);\n\n/**\n * A RemoteTransactionSource that fetches incoming transactions using the Accounts API.\n */\nexport class AccountsApiRemoteTransactionSource\n implements RemoteTransactionSource\n{\n getSupportedChains(): Hex[] {\n return SUPPORTED_CHAIN_IDS;\n }\n\n async fetchTransactions(\n request: RemoteTransactionSourceRequest,\n ): Promise<TransactionMeta[]> {\n const { address } = request;\n\n const responseTransactions = await this.#queryTransactions(\n request,\n SUPPORTED_CHAIN_IDS,\n );\n\n log(\n 'Fetched transactions',\n responseTransactions.length,\n responseTransactions,\n );\n\n const normalizedTransactions = await Promise.all(\n responseTransactions.map((tx) => this.#normalizeTransaction(address, tx)),\n );\n\n log('Normalized transactions', normalizedTransactions);\n\n const filteredTransactions = this.#filterTransactions(\n request,\n normalizedTransactions,\n );\n\n log(\n 'Filtered transactions',\n filteredTransactions.length,\n filteredTransactions,\n );\n\n return filteredTransactions;\n }\n\n async #queryTransactions(\n request: RemoteTransactionSourceRequest,\n chainIds: Hex[],\n ): Promise<TransactionResponse[]> {\n const { address, tags } = request;\n const transactions: TransactionResponse[] = [];\n\n try {\n const response = await getAccountTransactions({\n address,\n chainIds,\n sortDirection: 'DESC',\n tags,\n });\n\n if (response?.data) {\n transactions.push(...response.data);\n }\n } catch (error) {\n log('Error while fetching transactions', error);\n }\n\n return transactions;\n }\n\n #filterTransactions(\n request: RemoteTransactionSourceRequest,\n transactions: TransactionMeta[],\n ) {\n const { address, includeTokenTransfers, updateTransactions } = request;\n\n let filteredTransactions = transactions;\n\n if (!updateTransactions) {\n filteredTransactions = filteredTransactions.filter(\n (tx) => tx.txParams.to === address,\n );\n }\n\n if (!includeTokenTransfers) {\n filteredTransactions = filteredTransactions.filter(\n (tx) => !tx.isTransfer,\n );\n }\n\n return filteredTransactions;\n }\n\n async #normalizeTransaction(\n address: Hex,\n responseTransaction: GetAccountTransactionsResponse['data'][0],\n ): Promise<TransactionMeta> {\n const blockNumber = String(responseTransaction.blockNumber);\n const chainId = `0x${responseTransaction.chainId.toString(16)}` as Hex;\n const { hash } = responseTransaction;\n const time = new Date(responseTransaction.timestamp).getTime();\n const id = random({ msecs: time });\n const { from } = responseTransaction;\n const gas = BNToHex(new BN(responseTransaction.gas));\n const gasPrice = BNToHex(new BN(responseTransaction.gasPrice));\n const gasUsed = BNToHex(new BN(responseTransaction.gasUsed));\n const nonce = BNToHex(new BN(responseTransaction.nonce));\n const data = responseTransaction.methodId;\n const type = TransactionType.incoming;\n const verifiedOnBlockchain = false;\n\n const status = responseTransaction.isError\n ? TransactionStatus.failed\n : TransactionStatus.confirmed;\n\n const valueTransfer = responseTransaction.valueTransfers.find(\n (vt) =>\n (vt.to.toLowerCase() === address.toLowerCase() ||\n vt.from.toLowerCase() === address.toLowerCase()) &&\n vt.contractAddress,\n );\n\n const isIncomingTokenTransfer =\n valueTransfer?.to.toLowerCase() === address.toLowerCase() &&\n from.toLowerCase() !== address.toLowerCase();\n\n const isOutgoing = from.toLowerCase() === address.toLowerCase();\n const amount = valueTransfer?.amount;\n const contractAddress = valueTransfer?.contractAddress as string;\n const decimals = valueTransfer?.decimal as number;\n const symbol = valueTransfer?.symbol as string;\n\n const value = BNToHex(\n new BN(\n isIncomingTokenTransfer\n ? (valueTransfer?.amount ?? responseTransaction.value)\n : responseTransaction.value,\n ),\n );\n\n const to = isIncomingTokenTransfer ? address : responseTransaction.to;\n\n const error =\n status === TransactionStatus.failed\n ? new Error('Transaction failed')\n : (undefined as unknown as TransactionError);\n\n const transferInformation = valueTransfer\n ? {\n amount,\n contractAddress,\n decimals,\n symbol,\n }\n : undefined;\n\n const meta: TransactionMeta = {\n blockNumber,\n chainId,\n error,\n hash,\n id,\n isTransfer: isIncomingTokenTransfer,\n // Populated by TransactionController when added to state\n networkClientId: '',\n status,\n time,\n toSmartContract: false,\n transferInformation,\n txParams: {\n chainId,\n data,\n from,\n gas,\n gasPrice,\n gasUsed,\n nonce,\n to,\n value,\n },\n type,\n verifiedOnBlockchain,\n };\n\n if (isOutgoing) {\n meta.type = (await determineTransactionType(meta.txParams)).type;\n }\n\n return meta;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"AccountsApiRemoteTransactionSource.mjs","sourceRoot":"","sources":["../../src/helpers/AccountsApiRemoteTransactionSource.ts"],"names":[],"mappings":"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","sourcesContent":["import { BNToHex } from '@metamask/controller-utils';\nimport type { Hex } from '@metamask/utils';\nimport BN from 'bn.js';\nimport { v1 as random } from 'uuid';\n\nimport { determineTransactionType } from '..';\nimport type {\n GetAccountTransactionsResponse,\n TransactionResponse,\n} from '../api/accounts-api';\nimport { getAccountTransactions } from '../api/accounts-api';\nimport { CHAIN_IDS } from '../constants';\nimport { createModuleLogger, incomingTransactionsLogger } from '../logger';\nimport type {\n RemoteTransactionSource,\n RemoteTransactionSourceRequest,\n TransactionError,\n TransactionMeta,\n} from '../types';\nimport { TransactionStatus, TransactionType } from '../types';\n\nexport const SUPPORTED_CHAIN_IDS: Hex[] = [\n CHAIN_IDS.MAINNET,\n CHAIN_IDS.POLYGON,\n CHAIN_IDS.BSC,\n CHAIN_IDS.LINEA_MAINNET,\n CHAIN_IDS.BASE,\n CHAIN_IDS.OPTIMISM,\n CHAIN_IDS.ARBITRUM,\n CHAIN_IDS.SCROLL,\n CHAIN_IDS.SEI,\n CHAIN_IDS.MONAD,\n];\n\nconst log = createModuleLogger(\n incomingTransactionsLogger,\n 'accounts-api-source',\n);\n\n/**\n * A RemoteTransactionSource that fetches incoming transactions using the Accounts API.\n */\nexport class AccountsApiRemoteTransactionSource\n implements RemoteTransactionSource\n{\n getSupportedChains(): Hex[] {\n return SUPPORTED_CHAIN_IDS;\n }\n\n async fetchTransactions(\n request: RemoteTransactionSourceRequest,\n ): Promise<TransactionMeta[]> {\n const { address } = request;\n\n const responseTransactions = await this.#queryTransactions(\n request,\n SUPPORTED_CHAIN_IDS,\n );\n\n log(\n 'Fetched transactions',\n responseTransactions.length,\n responseTransactions,\n );\n\n const normalizedTransactions = await Promise.all(\n responseTransactions.map((tx) => this.#normalizeTransaction(address, tx)),\n );\n\n log('Normalized transactions', normalizedTransactions);\n\n const filteredTransactions = this.#filterTransactions(\n request,\n normalizedTransactions,\n );\n\n log(\n 'Filtered transactions',\n filteredTransactions.length,\n filteredTransactions,\n );\n\n return filteredTransactions;\n }\n\n async #queryTransactions(\n request: RemoteTransactionSourceRequest,\n chainIds: Hex[],\n ): Promise<TransactionResponse[]> {\n const { address, tags } = request;\n const transactions: TransactionResponse[] = [];\n\n try {\n const response = await getAccountTransactions({\n address,\n chainIds,\n sortDirection: 'DESC',\n tags,\n });\n\n if (response?.data) {\n transactions.push(...response.data);\n }\n } catch (error) {\n log('Error while fetching transactions', error);\n }\n\n return transactions;\n }\n\n #filterTransactions(\n request: RemoteTransactionSourceRequest,\n transactions: TransactionMeta[],\n ) {\n const { address, includeTokenTransfers, updateTransactions } = request;\n\n let filteredTransactions = transactions;\n\n if (!updateTransactions) {\n filteredTransactions = filteredTransactions.filter(\n (tx) => tx.txParams.to === address,\n );\n }\n\n if (!includeTokenTransfers) {\n filteredTransactions = filteredTransactions.filter(\n (tx) => !tx.isTransfer,\n );\n }\n\n return filteredTransactions;\n }\n\n async #normalizeTransaction(\n address: Hex,\n responseTransaction: GetAccountTransactionsResponse['data'][0],\n ): Promise<TransactionMeta> {\n const blockNumber = String(responseTransaction.blockNumber);\n const chainId = `0x${responseTransaction.chainId.toString(16)}` as Hex;\n const { hash } = responseTransaction;\n const time = new Date(responseTransaction.timestamp).getTime();\n const id = random({ msecs: time });\n const { from } = responseTransaction;\n const gas = BNToHex(new BN(responseTransaction.gas));\n const gasPrice = BNToHex(new BN(responseTransaction.gasPrice));\n const gasUsed = BNToHex(new BN(responseTransaction.gasUsed));\n const nonce = BNToHex(new BN(responseTransaction.nonce));\n const data = responseTransaction.methodId;\n const type = TransactionType.incoming;\n const verifiedOnBlockchain = false;\n\n const status = responseTransaction.isError\n ? TransactionStatus.failed\n : TransactionStatus.confirmed;\n\n const valueTransfer = responseTransaction.valueTransfers.find(\n (vt) =>\n (vt.to.toLowerCase() === address.toLowerCase() ||\n vt.from.toLowerCase() === address.toLowerCase()) &&\n vt.contractAddress,\n );\n\n const isIncomingTokenTransfer =\n valueTransfer?.to.toLowerCase() === address.toLowerCase() &&\n from.toLowerCase() !== address.toLowerCase();\n\n const isOutgoing = from.toLowerCase() === address.toLowerCase();\n const amount = valueTransfer?.amount;\n const contractAddress = valueTransfer?.contractAddress as string;\n const decimals = valueTransfer?.decimal as number;\n const symbol = valueTransfer?.symbol as string;\n\n const value = BNToHex(\n new BN(\n isIncomingTokenTransfer\n ? (valueTransfer?.amount ?? responseTransaction.value)\n : responseTransaction.value,\n ),\n );\n\n const to = isIncomingTokenTransfer ? address : responseTransaction.to;\n\n const error =\n status === TransactionStatus.failed\n ? new Error('Transaction failed')\n : (undefined as unknown as TransactionError);\n\n const transferInformation = valueTransfer\n ? {\n amount,\n contractAddress,\n decimals,\n symbol,\n }\n : undefined;\n\n const meta: TransactionMeta = {\n blockNumber,\n chainId,\n error,\n hash,\n id,\n isTransfer: isIncomingTokenTransfer,\n // Populated by TransactionController when added to state\n networkClientId: '',\n status,\n time,\n toSmartContract: false,\n transferInformation,\n txParams: {\n chainId,\n data,\n from,\n gas,\n gasPrice,\n gasUsed,\n nonce,\n to,\n value,\n },\n type,\n verifiedOnBlockchain,\n };\n\n if (isOutgoing) {\n meta.type = (await determineTransactionType(meta.txParams)).type;\n }\n\n return meta;\n }\n}\n"]}
|
|
@@ -10,7 +10,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
10
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
11
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
12
|
};
|
|
13
|
-
var _ExtraTransactionsPublishHook_instances, _ExtraTransactionsPublishHook_addTransactionBatch, _ExtraTransactionsPublishHook_hook;
|
|
13
|
+
var _ExtraTransactionsPublishHook_instances, _ExtraTransactionsPublishHook_addTransactionBatch, _ExtraTransactionsPublishHook_getTransaction, _ExtraTransactionsPublishHook_originalPublishHook, _ExtraTransactionsPublishHook_hook;
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
exports.ExtraTransactionsPublishHook = void 0;
|
|
16
16
|
const utils_1 = require("@metamask/utils");
|
|
@@ -21,10 +21,14 @@ const log = (0, utils_1.createModuleLogger)(logger_1.projectLogger, 'extra-trans
|
|
|
21
21
|
* Requires the batch to be successful to resolve.
|
|
22
22
|
*/
|
|
23
23
|
class ExtraTransactionsPublishHook {
|
|
24
|
-
constructor({ addTransactionBatch, }) {
|
|
24
|
+
constructor({ addTransactionBatch, getTransaction, originalPublishHook, }) {
|
|
25
25
|
_ExtraTransactionsPublishHook_instances.add(this);
|
|
26
26
|
_ExtraTransactionsPublishHook_addTransactionBatch.set(this, void 0);
|
|
27
|
+
_ExtraTransactionsPublishHook_getTransaction.set(this, void 0);
|
|
28
|
+
_ExtraTransactionsPublishHook_originalPublishHook.set(this, void 0);
|
|
27
29
|
__classPrivateFieldSet(this, _ExtraTransactionsPublishHook_addTransactionBatch, addTransactionBatch, "f");
|
|
30
|
+
__classPrivateFieldSet(this, _ExtraTransactionsPublishHook_getTransaction, getTransaction, "f");
|
|
31
|
+
__classPrivateFieldSet(this, _ExtraTransactionsPublishHook_originalPublishHook, originalPublishHook, "f");
|
|
28
32
|
}
|
|
29
33
|
/**
|
|
30
34
|
* @returns The publish hook function.
|
|
@@ -34,9 +38,9 @@ class ExtraTransactionsPublishHook {
|
|
|
34
38
|
}
|
|
35
39
|
}
|
|
36
40
|
exports.ExtraTransactionsPublishHook = ExtraTransactionsPublishHook;
|
|
37
|
-
_ExtraTransactionsPublishHook_addTransactionBatch = new WeakMap(), _ExtraTransactionsPublishHook_instances = new WeakSet(), _ExtraTransactionsPublishHook_hook = async function _ExtraTransactionsPublishHook_hook(transactionMeta, signedTx) {
|
|
41
|
+
_ExtraTransactionsPublishHook_addTransactionBatch = new WeakMap(), _ExtraTransactionsPublishHook_getTransaction = new WeakMap(), _ExtraTransactionsPublishHook_originalPublishHook = new WeakMap(), _ExtraTransactionsPublishHook_instances = new WeakSet(), _ExtraTransactionsPublishHook_hook = async function _ExtraTransactionsPublishHook_hook(transactionMeta, signedTx) {
|
|
38
42
|
log('Publishing transaction as batch', { transactionMeta, signedTx });
|
|
39
|
-
const { batchTransactions, batchTransactionsOptions, id, networkClientId, txParams, } = transactionMeta;
|
|
43
|
+
const { batchTransactions, batchTransactionsOptions, id: transactionId, networkClientId, txParams, } = transactionMeta;
|
|
40
44
|
const from = txParams.from;
|
|
41
45
|
const to = txParams.to;
|
|
42
46
|
const data = txParams.data;
|
|
@@ -46,7 +50,18 @@ _ExtraTransactionsPublishHook_addTransactionBatch = new WeakMap(), _ExtraTransac
|
|
|
46
50
|
const maxPriorityFeePerGas = txParams.maxPriorityFeePerGas;
|
|
47
51
|
const signedTransaction = signedTx;
|
|
48
52
|
const resultPromise = (0, utils_1.createDeferredPromise)();
|
|
49
|
-
const onPublish = ({ transactionHash }) => {
|
|
53
|
+
const onPublish = ({ newSignature, transactionHash, }) => {
|
|
54
|
+
if (newSignature) {
|
|
55
|
+
const latestTransactionMeta = __classPrivateFieldGet(this, _ExtraTransactionsPublishHook_getTransaction, "f").call(this, transactionId);
|
|
56
|
+
log('Calling original publish hook with new signature', {
|
|
57
|
+
latestTransactionMeta,
|
|
58
|
+
newSignature,
|
|
59
|
+
});
|
|
60
|
+
__classPrivateFieldGet(this, _ExtraTransactionsPublishHook_originalPublishHook, "f").call(this, latestTransactionMeta, newSignature)
|
|
61
|
+
.then(resultPromise.resolve)
|
|
62
|
+
.catch(resultPromise.reject);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
50
65
|
resultPromise.resolve({ transactionHash });
|
|
51
66
|
};
|
|
52
67
|
const firstParams = {
|
|
@@ -59,7 +74,7 @@ _ExtraTransactionsPublishHook_addTransactionBatch = new WeakMap(), _ExtraTransac
|
|
|
59
74
|
};
|
|
60
75
|
const mainTransaction = {
|
|
61
76
|
existingTransaction: {
|
|
62
|
-
id,
|
|
77
|
+
id: transactionId,
|
|
63
78
|
onPublish,
|
|
64
79
|
signedTransaction,
|
|
65
80
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExtraTransactionsPublishHook.cjs","sourceRoot":"","sources":["../../src/hooks/ExtraTransactionsPublishHook.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAIyB;AAGzB,0CAA0C;AAS1C,MAAM,GAAG,GAAG,IAAA,0BAAkB,EAC5B,sBAAa,EACb,iCAAiC,CAClC,CAAC;AAEF;;;GAGG;AACH,MAAa,4BAA4B;
|
|
1
|
+
{"version":3,"file":"ExtraTransactionsPublishHook.cjs","sourceRoot":"","sources":["../../src/hooks/ExtraTransactionsPublishHook.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createDeferredPromise,\n createModuleLogger,\n type Hex,\n} from '@metamask/utils';\n\nimport type { TransactionController } from '..';\nimport { projectLogger } from '../logger';\nimport type {\n BatchTransactionParams,\n PublishHook,\n PublishHookResult,\n TransactionBatchSingleRequest,\n TransactionMeta,\n} from '../types';\n\nconst log = createModuleLogger(\n projectLogger,\n 'extra-transactions-publish-hook',\n);\n\n/**\n * Custom publish logic that also publishes additional transactions in an batch.\n * Requires the batch to be successful to resolve.\n */\nexport class ExtraTransactionsPublishHook {\n readonly #addTransactionBatch: TransactionController['addTransactionBatch'];\n\n readonly #getTransaction: (transactionId: string) => TransactionMeta;\n\n readonly #originalPublishHook: PublishHook;\n\n constructor({\n addTransactionBatch,\n getTransaction,\n originalPublishHook,\n }: {\n addTransactionBatch: TransactionController['addTransactionBatch'];\n getTransaction: (transactionId: string) => TransactionMeta;\n originalPublishHook: PublishHook;\n }) {\n this.#addTransactionBatch = addTransactionBatch;\n this.#getTransaction = getTransaction;\n this.#originalPublishHook = originalPublishHook;\n }\n\n /**\n * @returns The publish hook function.\n */\n getHook(): PublishHook {\n return this.#hook.bind(this);\n }\n\n async #hook(\n transactionMeta: TransactionMeta,\n signedTx: string,\n ): Promise<PublishHookResult> {\n log('Publishing transaction as batch', { transactionMeta, signedTx });\n\n const {\n batchTransactions,\n batchTransactionsOptions,\n id: transactionId,\n networkClientId,\n txParams,\n } = transactionMeta;\n\n const from = txParams.from as Hex;\n const to = txParams.to as Hex | undefined;\n const data = txParams.data as Hex | undefined;\n const value = txParams.value as Hex | undefined;\n const gas = txParams.gas as Hex | undefined;\n const maxFeePerGas = txParams.maxFeePerGas as Hex | undefined;\n\n const maxPriorityFeePerGas = txParams.maxPriorityFeePerGas as\n | Hex\n | undefined;\n\n const signedTransaction = signedTx as Hex;\n const resultPromise = createDeferredPromise<PublishHookResult>();\n\n const onPublish = ({\n newSignature,\n transactionHash,\n }: {\n newSignature?: Hex;\n transactionHash?: string;\n }) => {\n if (newSignature) {\n const latestTransactionMeta = this.#getTransaction(transactionId);\n\n log('Calling original publish hook with new signature', {\n latestTransactionMeta,\n newSignature,\n });\n\n this.#originalPublishHook(latestTransactionMeta, newSignature)\n .then(resultPromise.resolve)\n .catch(resultPromise.reject);\n\n return;\n }\n\n resultPromise.resolve({ transactionHash });\n };\n\n const firstParams: BatchTransactionParams = {\n data,\n gas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n to,\n value,\n };\n\n const mainTransaction: TransactionBatchSingleRequest = {\n existingTransaction: {\n id: transactionId,\n onPublish,\n signedTransaction,\n },\n params: firstParams,\n };\n\n const extraTransactions = (batchTransactions ?? []).map((transaction) => {\n const { isAfter, type, ...rest } = transaction;\n return {\n isAfter,\n params: rest,\n type,\n };\n });\n\n const beforeTransactions: TransactionBatchSingleRequest[] =\n extraTransactions\n .filter((transaction) => transaction.isAfter === false)\n .map(({ isAfter, ...rest }) => ({\n ...rest,\n }));\n\n const afterTransactions: TransactionBatchSingleRequest[] = extraTransactions\n .filter(\n (transaction) =>\n transaction.isAfter === undefined || transaction.isAfter,\n )\n .map(({ isAfter, ...rest }) => ({\n ...rest,\n }));\n\n const transactions: TransactionBatchSingleRequest[] = [\n ...beforeTransactions,\n mainTransaction,\n ...afterTransactions,\n ];\n\n log('Adding transaction batch', {\n from,\n networkClientId,\n transactions,\n });\n\n const options = batchTransactionsOptions ?? {\n disable7702: true,\n disableHook: false,\n disableSequential: true,\n };\n\n await this.#addTransactionBatch({\n from,\n networkClientId,\n requireApproval: false,\n transactions,\n ...options,\n });\n\n return resultPromise.promise;\n }\n}\n"]}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import type { TransactionController } from "../index.cjs";
|
|
2
|
-
import type { PublishHook } from "../types.cjs";
|
|
2
|
+
import type { PublishHook, TransactionMeta } from "../types.cjs";
|
|
3
3
|
/**
|
|
4
4
|
* Custom publish logic that also publishes additional transactions in an batch.
|
|
5
5
|
* Requires the batch to be successful to resolve.
|
|
6
6
|
*/
|
|
7
7
|
export declare class ExtraTransactionsPublishHook {
|
|
8
8
|
#private;
|
|
9
|
-
constructor({ addTransactionBatch, }: {
|
|
9
|
+
constructor({ addTransactionBatch, getTransaction, originalPublishHook, }: {
|
|
10
10
|
addTransactionBatch: TransactionController['addTransactionBatch'];
|
|
11
|
+
getTransaction: (transactionId: string) => TransactionMeta;
|
|
12
|
+
originalPublishHook: PublishHook;
|
|
11
13
|
});
|
|
12
14
|
/**
|
|
13
15
|
* @returns The publish hook function.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExtraTransactionsPublishHook.d.cts","sourceRoot":"","sources":["../../src/hooks/ExtraTransactionsPublishHook.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,qBAAqB,EAAE,qBAAW;AAEhD,OAAO,KAAK,EAEV,WAAW,
|
|
1
|
+
{"version":3,"file":"ExtraTransactionsPublishHook.d.cts","sourceRoot":"","sources":["../../src/hooks/ExtraTransactionsPublishHook.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,qBAAqB,EAAE,qBAAW;AAEhD,OAAO,KAAK,EAEV,WAAW,EAGX,eAAe,EAChB,qBAAiB;AAOlB;;;GAGG;AACH,qBAAa,4BAA4B;;gBAO3B,EACV,mBAAmB,EACnB,cAAc,EACd,mBAAmB,GACpB,EAAE;QACD,mBAAmB,EAAE,qBAAqB,CAAC,qBAAqB,CAAC,CAAC;QAClE,cAAc,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,eAAe,CAAC;QAC3D,mBAAmB,EAAE,WAAW,CAAC;KAClC;IAMD;;OAEG;IACH,OAAO,IAAI,WAAW;CAgIvB"}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import type { TransactionController } from "../index.mjs";
|
|
2
|
-
import type { PublishHook } from "../types.mjs";
|
|
2
|
+
import type { PublishHook, TransactionMeta } from "../types.mjs";
|
|
3
3
|
/**
|
|
4
4
|
* Custom publish logic that also publishes additional transactions in an batch.
|
|
5
5
|
* Requires the batch to be successful to resolve.
|
|
6
6
|
*/
|
|
7
7
|
export declare class ExtraTransactionsPublishHook {
|
|
8
8
|
#private;
|
|
9
|
-
constructor({ addTransactionBatch, }: {
|
|
9
|
+
constructor({ addTransactionBatch, getTransaction, originalPublishHook, }: {
|
|
10
10
|
addTransactionBatch: TransactionController['addTransactionBatch'];
|
|
11
|
+
getTransaction: (transactionId: string) => TransactionMeta;
|
|
12
|
+
originalPublishHook: PublishHook;
|
|
11
13
|
});
|
|
12
14
|
/**
|
|
13
15
|
* @returns The publish hook function.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExtraTransactionsPublishHook.d.mts","sourceRoot":"","sources":["../../src/hooks/ExtraTransactionsPublishHook.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,qBAAqB,EAAE,qBAAW;AAEhD,OAAO,KAAK,EAEV,WAAW,
|
|
1
|
+
{"version":3,"file":"ExtraTransactionsPublishHook.d.mts","sourceRoot":"","sources":["../../src/hooks/ExtraTransactionsPublishHook.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,qBAAqB,EAAE,qBAAW;AAEhD,OAAO,KAAK,EAEV,WAAW,EAGX,eAAe,EAChB,qBAAiB;AAOlB;;;GAGG;AACH,qBAAa,4BAA4B;;gBAO3B,EACV,mBAAmB,EACnB,cAAc,EACd,mBAAmB,GACpB,EAAE;QACD,mBAAmB,EAAE,qBAAqB,CAAC,qBAAqB,CAAC,CAAC;QAClE,cAAc,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,eAAe,CAAC;QAC3D,mBAAmB,EAAE,WAAW,CAAC;KAClC;IAMD;;OAEG;IACH,OAAO,IAAI,WAAW;CAgIvB"}
|
|
@@ -9,7 +9,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
9
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
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
11
|
};
|
|
12
|
-
var _ExtraTransactionsPublishHook_instances, _ExtraTransactionsPublishHook_addTransactionBatch, _ExtraTransactionsPublishHook_hook;
|
|
12
|
+
var _ExtraTransactionsPublishHook_instances, _ExtraTransactionsPublishHook_addTransactionBatch, _ExtraTransactionsPublishHook_getTransaction, _ExtraTransactionsPublishHook_originalPublishHook, _ExtraTransactionsPublishHook_hook;
|
|
13
13
|
import { createDeferredPromise, createModuleLogger } from "@metamask/utils";
|
|
14
14
|
import { projectLogger } from "../logger.mjs";
|
|
15
15
|
const log = createModuleLogger(projectLogger, 'extra-transactions-publish-hook');
|
|
@@ -18,10 +18,14 @@ const log = createModuleLogger(projectLogger, 'extra-transactions-publish-hook')
|
|
|
18
18
|
* Requires the batch to be successful to resolve.
|
|
19
19
|
*/
|
|
20
20
|
export class ExtraTransactionsPublishHook {
|
|
21
|
-
constructor({ addTransactionBatch, }) {
|
|
21
|
+
constructor({ addTransactionBatch, getTransaction, originalPublishHook, }) {
|
|
22
22
|
_ExtraTransactionsPublishHook_instances.add(this);
|
|
23
23
|
_ExtraTransactionsPublishHook_addTransactionBatch.set(this, void 0);
|
|
24
|
+
_ExtraTransactionsPublishHook_getTransaction.set(this, void 0);
|
|
25
|
+
_ExtraTransactionsPublishHook_originalPublishHook.set(this, void 0);
|
|
24
26
|
__classPrivateFieldSet(this, _ExtraTransactionsPublishHook_addTransactionBatch, addTransactionBatch, "f");
|
|
27
|
+
__classPrivateFieldSet(this, _ExtraTransactionsPublishHook_getTransaction, getTransaction, "f");
|
|
28
|
+
__classPrivateFieldSet(this, _ExtraTransactionsPublishHook_originalPublishHook, originalPublishHook, "f");
|
|
25
29
|
}
|
|
26
30
|
/**
|
|
27
31
|
* @returns The publish hook function.
|
|
@@ -30,9 +34,9 @@ export class ExtraTransactionsPublishHook {
|
|
|
30
34
|
return __classPrivateFieldGet(this, _ExtraTransactionsPublishHook_instances, "m", _ExtraTransactionsPublishHook_hook).bind(this);
|
|
31
35
|
}
|
|
32
36
|
}
|
|
33
|
-
_ExtraTransactionsPublishHook_addTransactionBatch = new WeakMap(), _ExtraTransactionsPublishHook_instances = new WeakSet(), _ExtraTransactionsPublishHook_hook = async function _ExtraTransactionsPublishHook_hook(transactionMeta, signedTx) {
|
|
37
|
+
_ExtraTransactionsPublishHook_addTransactionBatch = new WeakMap(), _ExtraTransactionsPublishHook_getTransaction = new WeakMap(), _ExtraTransactionsPublishHook_originalPublishHook = new WeakMap(), _ExtraTransactionsPublishHook_instances = new WeakSet(), _ExtraTransactionsPublishHook_hook = async function _ExtraTransactionsPublishHook_hook(transactionMeta, signedTx) {
|
|
34
38
|
log('Publishing transaction as batch', { transactionMeta, signedTx });
|
|
35
|
-
const { batchTransactions, batchTransactionsOptions, id, networkClientId, txParams, } = transactionMeta;
|
|
39
|
+
const { batchTransactions, batchTransactionsOptions, id: transactionId, networkClientId, txParams, } = transactionMeta;
|
|
36
40
|
const from = txParams.from;
|
|
37
41
|
const to = txParams.to;
|
|
38
42
|
const data = txParams.data;
|
|
@@ -42,7 +46,18 @@ _ExtraTransactionsPublishHook_addTransactionBatch = new WeakMap(), _ExtraTransac
|
|
|
42
46
|
const maxPriorityFeePerGas = txParams.maxPriorityFeePerGas;
|
|
43
47
|
const signedTransaction = signedTx;
|
|
44
48
|
const resultPromise = createDeferredPromise();
|
|
45
|
-
const onPublish = ({ transactionHash }) => {
|
|
49
|
+
const onPublish = ({ newSignature, transactionHash, }) => {
|
|
50
|
+
if (newSignature) {
|
|
51
|
+
const latestTransactionMeta = __classPrivateFieldGet(this, _ExtraTransactionsPublishHook_getTransaction, "f").call(this, transactionId);
|
|
52
|
+
log('Calling original publish hook with new signature', {
|
|
53
|
+
latestTransactionMeta,
|
|
54
|
+
newSignature,
|
|
55
|
+
});
|
|
56
|
+
__classPrivateFieldGet(this, _ExtraTransactionsPublishHook_originalPublishHook, "f").call(this, latestTransactionMeta, newSignature)
|
|
57
|
+
.then(resultPromise.resolve)
|
|
58
|
+
.catch(resultPromise.reject);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
46
61
|
resultPromise.resolve({ transactionHash });
|
|
47
62
|
};
|
|
48
63
|
const firstParams = {
|
|
@@ -55,7 +70,7 @@ _ExtraTransactionsPublishHook_addTransactionBatch = new WeakMap(), _ExtraTransac
|
|
|
55
70
|
};
|
|
56
71
|
const mainTransaction = {
|
|
57
72
|
existingTransaction: {
|
|
58
|
-
id,
|
|
73
|
+
id: transactionId,
|
|
59
74
|
onPublish,
|
|
60
75
|
signedTransaction,
|
|
61
76
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExtraTransactionsPublishHook.mjs","sourceRoot":"","sources":["../../src/hooks/ExtraTransactionsPublishHook.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAEnB,wBAAwB;AAGzB,OAAO,EAAE,aAAa,EAAE,sBAAkB;AAS1C,MAAM,GAAG,GAAG,kBAAkB,CAC5B,aAAa,EACb,iCAAiC,CAClC,CAAC;AAEF;;;GAGG;AACH,MAAM,OAAO,4BAA4B;
|
|
1
|
+
{"version":3,"file":"ExtraTransactionsPublishHook.mjs","sourceRoot":"","sources":["../../src/hooks/ExtraTransactionsPublishHook.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createDeferredPromise,\n createModuleLogger,\n type Hex,\n} from '@metamask/utils';\n\nimport type { TransactionController } from '..';\nimport { projectLogger } from '../logger';\nimport type {\n BatchTransactionParams,\n PublishHook,\n PublishHookResult,\n TransactionBatchSingleRequest,\n TransactionMeta,\n} from '../types';\n\nconst log = createModuleLogger(\n projectLogger,\n 'extra-transactions-publish-hook',\n);\n\n/**\n * Custom publish logic that also publishes additional transactions in an batch.\n * Requires the batch to be successful to resolve.\n */\nexport class ExtraTransactionsPublishHook {\n readonly #addTransactionBatch: TransactionController['addTransactionBatch'];\n\n readonly #getTransaction: (transactionId: string) => TransactionMeta;\n\n readonly #originalPublishHook: PublishHook;\n\n constructor({\n addTransactionBatch,\n getTransaction,\n originalPublishHook,\n }: {\n addTransactionBatch: TransactionController['addTransactionBatch'];\n getTransaction: (transactionId: string) => TransactionMeta;\n originalPublishHook: PublishHook;\n }) {\n this.#addTransactionBatch = addTransactionBatch;\n this.#getTransaction = getTransaction;\n this.#originalPublishHook = originalPublishHook;\n }\n\n /**\n * @returns The publish hook function.\n */\n getHook(): PublishHook {\n return this.#hook.bind(this);\n }\n\n async #hook(\n transactionMeta: TransactionMeta,\n signedTx: string,\n ): Promise<PublishHookResult> {\n log('Publishing transaction as batch', { transactionMeta, signedTx });\n\n const {\n batchTransactions,\n batchTransactionsOptions,\n id: transactionId,\n networkClientId,\n txParams,\n } = transactionMeta;\n\n const from = txParams.from as Hex;\n const to = txParams.to as Hex | undefined;\n const data = txParams.data as Hex | undefined;\n const value = txParams.value as Hex | undefined;\n const gas = txParams.gas as Hex | undefined;\n const maxFeePerGas = txParams.maxFeePerGas as Hex | undefined;\n\n const maxPriorityFeePerGas = txParams.maxPriorityFeePerGas as\n | Hex\n | undefined;\n\n const signedTransaction = signedTx as Hex;\n const resultPromise = createDeferredPromise<PublishHookResult>();\n\n const onPublish = ({\n newSignature,\n transactionHash,\n }: {\n newSignature?: Hex;\n transactionHash?: string;\n }) => {\n if (newSignature) {\n const latestTransactionMeta = this.#getTransaction(transactionId);\n\n log('Calling original publish hook with new signature', {\n latestTransactionMeta,\n newSignature,\n });\n\n this.#originalPublishHook(latestTransactionMeta, newSignature)\n .then(resultPromise.resolve)\n .catch(resultPromise.reject);\n\n return;\n }\n\n resultPromise.resolve({ transactionHash });\n };\n\n const firstParams: BatchTransactionParams = {\n data,\n gas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n to,\n value,\n };\n\n const mainTransaction: TransactionBatchSingleRequest = {\n existingTransaction: {\n id: transactionId,\n onPublish,\n signedTransaction,\n },\n params: firstParams,\n };\n\n const extraTransactions = (batchTransactions ?? []).map((transaction) => {\n const { isAfter, type, ...rest } = transaction;\n return {\n isAfter,\n params: rest,\n type,\n };\n });\n\n const beforeTransactions: TransactionBatchSingleRequest[] =\n extraTransactions\n .filter((transaction) => transaction.isAfter === false)\n .map(({ isAfter, ...rest }) => ({\n ...rest,\n }));\n\n const afterTransactions: TransactionBatchSingleRequest[] = extraTransactions\n .filter(\n (transaction) =>\n transaction.isAfter === undefined || transaction.isAfter,\n )\n .map(({ isAfter, ...rest }) => ({\n ...rest,\n }));\n\n const transactions: TransactionBatchSingleRequest[] = [\n ...beforeTransactions,\n mainTransaction,\n ...afterTransactions,\n ];\n\n log('Adding transaction batch', {\n from,\n networkClientId,\n transactions,\n });\n\n const options = batchTransactionsOptions ?? {\n disable7702: true,\n disableHook: false,\n disableSequential: true,\n };\n\n await this.#addTransactionBatch({\n from,\n networkClientId,\n requireApproval: false,\n transactions,\n ...options,\n });\n\n return resultPromise.promise;\n }\n}\n"]}
|