@metamask/transaction-controller 61.0.0 → 61.2.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 +25 -1
- package/dist/TransactionController.cjs +2 -1
- 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 +2 -1
- package/dist/TransactionController.mjs.map +1 -1
- package/dist/api/accounts-api.cjs +9 -9
- package/dist/api/accounts-api.cjs.map +1 -1
- package/dist/api/accounts-api.mjs +9 -9
- package/dist/api/accounts-api.mjs.map +1 -1
- package/dist/api/simulation-api.cjs.map +1 -1
- package/dist/api/simulation-api.mjs.map +1 -1
- package/dist/gas-flows/DefaultGasFeeFlow.cjs.map +1 -1
- package/dist/gas-flows/DefaultGasFeeFlow.mjs.map +1 -1
- package/dist/gas-flows/LineaGasFeeFlow.cjs.map +1 -1
- package/dist/gas-flows/LineaGasFeeFlow.mjs.map +1 -1
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.cjs +26 -7
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.cjs.map +1 -1
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.d.cts +7 -2
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.d.cts.map +1 -1
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.d.mts +7 -2
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.d.mts.map +1 -1
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.mjs +26 -7
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.mjs.map +1 -1
- package/dist/gas-flows/OracleLayer1GasFeeFlow.cjs +99 -25
- package/dist/gas-flows/OracleLayer1GasFeeFlow.cjs.map +1 -1
- package/dist/gas-flows/OracleLayer1GasFeeFlow.d.cts +20 -2
- package/dist/gas-flows/OracleLayer1GasFeeFlow.d.cts.map +1 -1
- package/dist/gas-flows/OracleLayer1GasFeeFlow.d.mts +20 -2
- package/dist/gas-flows/OracleLayer1GasFeeFlow.d.mts.map +1 -1
- package/dist/gas-flows/OracleLayer1GasFeeFlow.mjs +104 -26
- package/dist/gas-flows/OracleLayer1GasFeeFlow.mjs.map +1 -1
- package/dist/gas-flows/RandomisedEstimationsGasFeeFlow.cjs.map +1 -1
- package/dist/gas-flows/RandomisedEstimationsGasFeeFlow.mjs.map +1 -1
- package/dist/gas-flows/ScrollLayer1GasFeeFlow.cjs +6 -3
- package/dist/gas-flows/ScrollLayer1GasFeeFlow.cjs.map +1 -1
- package/dist/gas-flows/ScrollLayer1GasFeeFlow.d.cts +4 -2
- package/dist/gas-flows/ScrollLayer1GasFeeFlow.d.cts.map +1 -1
- package/dist/gas-flows/ScrollLayer1GasFeeFlow.d.mts +4 -2
- package/dist/gas-flows/ScrollLayer1GasFeeFlow.d.mts.map +1 -1
- package/dist/gas-flows/ScrollLayer1GasFeeFlow.mjs +6 -3
- package/dist/gas-flows/ScrollLayer1GasFeeFlow.mjs.map +1 -1
- package/dist/gas-flows/TestGasFeeFlow.cjs.map +1 -1
- package/dist/gas-flows/TestGasFeeFlow.mjs.map +1 -1
- package/dist/helpers/AccountsApiRemoteTransactionSource.cjs.map +1 -1
- package/dist/helpers/AccountsApiRemoteTransactionSource.mjs.map +1 -1
- package/dist/helpers/GasFeePoller.cjs.map +1 -1
- package/dist/helpers/GasFeePoller.mjs.map +1 -1
- package/dist/helpers/IncomingTransactionHelper.cjs.map +1 -1
- package/dist/helpers/IncomingTransactionHelper.mjs.map +1 -1
- package/dist/helpers/MethodDataHelper.cjs.map +1 -1
- package/dist/helpers/MethodDataHelper.mjs.map +1 -1
- package/dist/helpers/MultichainTrackingHelper.cjs.map +1 -1
- package/dist/helpers/MultichainTrackingHelper.mjs.map +1 -1
- package/dist/helpers/PendingTransactionTracker.cjs +19 -12
- 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 +19 -12
- package/dist/helpers/PendingTransactionTracker.mjs.map +1 -1
- package/dist/helpers/ResimulateHelper.cjs +0 -1
- package/dist/helpers/ResimulateHelper.cjs.map +1 -1
- package/dist/helpers/ResimulateHelper.d.cts.map +1 -1
- package/dist/helpers/ResimulateHelper.d.mts.map +1 -1
- package/dist/helpers/ResimulateHelper.mjs +0 -1
- package/dist/helpers/ResimulateHelper.mjs.map +1 -1
- package/dist/helpers/TransactionPoller.cjs.map +1 -1
- package/dist/helpers/TransactionPoller.mjs.map +1 -1
- package/dist/hooks/CollectPublishHook.cjs.map +1 -1
- package/dist/hooks/CollectPublishHook.mjs.map +1 -1
- package/dist/hooks/ExtraTransactionsPublishHook.cjs.map +1 -1
- package/dist/hooks/ExtraTransactionsPublishHook.mjs.map +1 -1
- package/dist/hooks/SequentialPublishBatchHook.cjs.map +1 -1
- package/dist/hooks/SequentialPublishBatchHook.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +8 -2
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +8 -2
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils/balance-changes.cjs.map +1 -1
- package/dist/utils/balance-changes.mjs.map +1 -1
- package/dist/utils/batch.cjs +1 -0
- package/dist/utils/batch.cjs.map +1 -1
- package/dist/utils/batch.mjs +1 -0
- package/dist/utils/batch.mjs.map +1 -1
- package/dist/utils/eip7702.cjs.map +1 -1
- package/dist/utils/eip7702.mjs.map +1 -1
- package/dist/utils/external-transactions.cjs.map +1 -1
- package/dist/utils/external-transactions.mjs.map +1 -1
- package/dist/utils/first-time-interaction.cjs.map +1 -1
- package/dist/utils/first-time-interaction.mjs.map +1 -1
- package/dist/utils/gas-fee-tokens.cjs.map +1 -1
- package/dist/utils/gas-fee-tokens.mjs.map +1 -1
- package/dist/utils/gas-fees.cjs.map +1 -1
- package/dist/utils/gas-fees.mjs.map +1 -1
- package/dist/utils/gas-flow.cjs.map +1 -1
- package/dist/utils/gas-flow.mjs.map +1 -1
- package/dist/utils/gas.cjs.map +1 -1
- package/dist/utils/gas.mjs.map +1 -1
- package/dist/utils/history.cjs.map +1 -1
- package/dist/utils/history.mjs.map +1 -1
- package/dist/utils/layer1-gas-fee-flow.cjs +12 -6
- package/dist/utils/layer1-gas-fee-flow.cjs.map +1 -1
- package/dist/utils/layer1-gas-fee-flow.d.cts.map +1 -1
- package/dist/utils/layer1-gas-fee-flow.d.mts.map +1 -1
- package/dist/utils/layer1-gas-fee-flow.mjs +12 -6
- package/dist/utils/layer1-gas-fee-flow.mjs.map +1 -1
- package/dist/utils/nonce.cjs.map +1 -1
- package/dist/utils/nonce.mjs.map +1 -1
- package/dist/utils/prepare.cjs.map +1 -1
- package/dist/utils/prepare.mjs.map +1 -1
- package/dist/utils/retry.cjs.map +1 -1
- package/dist/utils/retry.mjs.map +1 -1
- package/dist/utils/signature.cjs.map +1 -1
- package/dist/utils/signature.mjs.map +1 -1
- package/dist/utils/swaps.cjs.map +1 -1
- package/dist/utils/swaps.mjs.map +1 -1
- package/dist/utils/transaction-type.cjs.map +1 -1
- package/dist/utils/transaction-type.mjs.map +1 -1
- package/dist/utils/utils.cjs +54 -1
- package/dist/utils/utils.cjs.map +1 -1
- package/dist/utils/utils.d.cts +17 -1
- package/dist/utils/utils.d.cts.map +1 -1
- package/dist/utils/utils.d.mts +17 -1
- package/dist/utils/utils.d.mts.map +1 -1
- package/dist/utils/utils.mjs +51 -0
- package/dist/utils/utils.mjs.map +1 -1
- package/dist/utils/validation.cjs.map +1 -1
- package/dist/utils/validation.mjs.map +1 -1
- package/package.json +5 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResimulateHelper.mjs","sourceRoot":"","sources":["../../src/helpers/ResimulateHelper.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,OAAO,EAAE,QAAQ,EAAE,wBAAwB;AAC3C,OAAO,EAAE,EAAE,EAAE,cAAc;;;AAG3B,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,sBAAkB;AAC9D,OAAO,EAAE,iBAAiB,EAAE,qBAAiB;AAO7C,OAAO,EAAE,mBAAmB,EAAE,2BAAuB;AAErD,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC;AAEnE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAU,CAAC;AAClE,MAAM,CAAC,MAAM,8BAA8B,GAAG,WAAW,CAAC;AAC1D,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAAC,CAAC;AACpD,MAAM,CAAC,MAAM,6BAA6B,GAAG,EAAE,CAAC;AAChD,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAa3C,MAAM,OAAO,gBAAgB;IAU3B,YAAY,EACV,eAAe,EACf,mBAAmB,EACnB,oBAAoB,GACI;;QAb1B,qCAAqC;QAC5B,uCAA2C,IAAI,GAAG,EAAE,EAAC;QAErD,oDAA0C;QAE1C,wDAEU;QAOjB,uBAAA,IAAI,qCAAoB,eAAe,MAAA,CAAC;QACxC,uBAAA,IAAI,yCAAwB,mBAAmB,MAAA,CAAC;QAEhD,oBAAoB,CAAC,uBAAA,IAAI,2EAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9D,CAAC;CAiFF;;IA9EG,MAAM,sBAAsB,GAAG,uBAAA,IAAI,yCAAiB,MAArB,IAAI,CAAmB,CAAC,MAAM,CAC3D,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,KAAK,iBAAiB,CAAC,UAAU,CACnD,CAAC;IAEF,MAAM,wBAAwB,GAAG,IAAI,GAAG,CACtC,sBAAsB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAC1C,CAAC;IAEF,wEAAwE;IACxE,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;QAChC,GAAG,wBAAwB;QAC3B,GAAG,uBAAA,IAAI,oCAAY,CAAC,IAAI,EAAE;KAC3B,CAAC,CAAC;IAEH,iBAAiB,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,EAAE;QAC1C,MAAM,eAAe,GAAG,sBAAsB,CAAC,IAAI,CACjD,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,aAAa,CACb,CAAC;QAErB,IAAI,eAAe,EAAE,QAAQ,EAAE;YAC7B,uBAAA,IAAI,4DAAO,MAAX,IAAI,EAAQ,eAAe,CAAC,CAAC;SAC9B;aAAM;YACL,uBAAA,IAAI,2DAAM,MAAV,IAAI,EAAO,aAAa,CAAC,CAAC;SAC3B;IACH,CAAC,CAAC,CAAC;AACL,CAAC,6DAEM,eAAgC;IACrC,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,GAAG,eAAe,CAAC;IAC9C,IAAI,uBAAA,IAAI,oCAAY,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE;QACvC,OAAO;KACR;IAED,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,mDAAmD;QACnD,uBAAA,IAAI,6CAAqB,MAAzB,IAAI,EAAsB,eAAe,CAAC;aACvC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,0BAA0B;YAC1B,GAAG,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;QACtD,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,8BAA8B;YAC9B,IAAI,uBAAA,IAAI,oCAAY,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE;gBACvC,uBAAA,IAAI,kEAAa,MAAjB,IAAI,EAAc,aAAa,EAAE,QAAQ,CAAC,CAAC;aAC5C;QACH,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,4BAA4B;IAC5B,uBAAA,IAAI,kEAAa,MAAjB,IAAI,EAAc,aAAa,EAAE,QAAQ,CAAC,CAAC;IAC3C,GAAG,CACD,oCAAoC,aAAa,UAAU,sBAAsB,eAAe,CACjG,CAAC;AACJ,CAAC,yEAEY,aAAqB,EAAE,QAAoB;IACtD,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC;IAC/D,uBAAA,IAAI,oCAAY,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;AACjD,CAAC,2DAEK,aAAqB;IACzB,IAAI,CAAC,uBAAA,IAAI,oCAAY,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE;QACxC,OAAO;KACR;IAED,uBAAA,IAAI,qEAAgB,MAApB,IAAI,EAAiB,aAAa,CAAC,CAAC;IACpC,GAAG,CACD,oCAAoC,aAAa,UAAU,sBAAsB,eAAe,CACjG,CAAC;AACJ,CAAC,+EAEe,EAAU;IACxB,MAAM,SAAS,GAAG,uBAAA,IAAI,oCAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3C,IAAI,SAAS,EAAE;QACb,YAAY,CAAC,SAAS,CAAC,CAAC;QACxB,uBAAA,IAAI,oCAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;KAC7B;AACH,CAAC;AAGH;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,uBAAwC,EACxC,kBAAmC;IAEnC,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,GAAG,kBAAkB,CAAC;IAEjD,MAAM,iBAAiB,GAAG,mBAAmB,CAC3C,uBAAuB,EACvB,kBAAkB,CACnB,CAAC;IAEF,MAAM,aAAa,GAAG,mBAAmB,CACvC,uBAAuB,EACvB,kBAAkB,CACnB,CAAC;IAEF,MAAM,6BAA6B,GAAG,gCAAgC,CACpE,uBAAuB,EACvB,kBAAkB,CACnB,CAAC;IAEF,MAAM,UAAU,GACd,iBAAiB,IAAI,aAAa,IAAI,6BAA6B,CAAC;IAEtE,IAAI,SAA6B,CAAC;IAElC,IAAI,aAAa,IAAI,6BAA6B,EAAE;QAClD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QACjD,SAAS,GAAG,UAAU,GAAG,6BAA6B,CAAC;KACxD;IAED,IAAI,UAAU,EAAE;QACd,GAAG,CAAC,mCAAmC,EAAE;YACvC,aAAa;YACb,SAAS;YACT,iBAAiB;YACjB,aAAa;YACb,6BAA6B;SAC9B,CAAC,CAAC;KACJ;IAED,OAAO;QACL,SAAS;QACT,UAAU;KACX,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CACtC,sBAAsC,EACtC,iBAAiC;IAEjC,IAAI,OAAO,CAAC,sBAAsB,EAAE,iBAAiB,CAAC,EAAE;QACtD,OAAO,KAAK,CAAC;KACd;IAED,IACE,sBAAsB,CACpB,sBAAsB,EAAE,mBAAmB,EAC3C,iBAAiB,EAAE,mBAAmB,CACvC,EACD;QACA,GAAG,CAAC,wCAAwC,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC;KACb;IAED,IACE,sBAAsB,CAAC,mBAAmB,CAAC,MAAM;QACjD,iBAAiB,CAAC,mBAAmB,CAAC,MAAM,EAC5C;QACA,OAAO,IAAI,CAAC;KACb;IAED,KAAK,MAAM,0BAA0B,IAAI,sBAAsB,CAAC,mBAAmB,EAAE;QACnF,MAAM,qBAAqB,GAAG,iBAAiB,CAAC,mBAAmB,CAAC,IAAI,CACtE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAClB,OAAO,KAAK,0BAA0B,CAAC,OAAO;YAC9C,EAAE,KAAK,0BAA0B,CAAC,EAAE,CACvC,CAAC;QAEF,IAAI,CAAC,qBAAqB,EAAE;YAC1B,GAAG,CAAC,2BAA2B,EAAE;gBAC/B,OAAO,EAAE,0BAA0B,CAAC,OAAO;gBAC3C,EAAE,EAAE,0BAA0B,CAAC,EAAE;aAClC,CAAC,CAAC;YAEH,OAAO,IAAI,CAAC;SACb;QAED,IACE,sBAAsB,CAAC,0BAA0B,EAAE,qBAAqB,CAAC,EACzE;YACA,GAAG,CAAC,uCAAuC,EAAE;gBAC3C,0BAA0B;gBAC1B,qBAAqB;aACtB,CAAC,CAAC;YAEH,OAAO,IAAI,CAAC;SACb;KACF;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,SAAS,mBAAmB,CAC1B,uBAAwC,EACxC,kBAAmC;IAEnC,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,kBAAkB,CAAC;IACtE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,uBAAuB,CAAC;IAE7D,IAAI,CAAC,cAAc,IAAI,OAAO,CAAC,cAAc,EAAE,SAAS,CAAC,EAAE;QACzD,OAAO,KAAK,CAAC;KACd;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAgC,CAAC;IAErE,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CACrC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,cAAc,CAAC,KAAK,CAAC,CACtD,CAAC;IAEF,GAAG,CAAC,gCAAgC,EAAE;QACpC,aAAa;QACb,iBAAiB;QACjB,cAAc;QACd,SAAS;KACV,CAAC,CAAC;IAEH,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED;;;;;;GAMG;AACH,SAAS,mBAAmB,CAC1B,uBAAwC,EACxC,kBAAmC;IAEnC,MAAM,EAAE,qBAAqB,EAAE,6BAA6B,EAAE,GAC5D,uBAAuB,CAAC;IAE1B,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,GAC1E,kBAAkB,CAAC;IAErB,IAAI,OAAO,CAAC,6BAA6B,EAAE,wBAAwB,CAAC,EAAE;QACpE,OAAO,KAAK,CAAC;KACd;IAED,GAAG,CAAC,wBAAwB,EAAE;QAC5B,aAAa;QACb,6BAA6B;QAC7B,wBAAwB;KACzB,CAAC,CAAC;IAEH,OAAO,CACL,wBAAwB,EAAE,WAAW,KAAK,8BAA8B,CACzE,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,gCAAgC,CACvC,uBAAwC,EACxC,kBAAmC;IAEnC,MAAM,EAAE,cAAc,EAAE,sBAAsB,EAAE,GAAG,uBAAuB,CAAC;IAE3E,MAAM,EAAE,cAAc,EAAE,iBAAiB,EAAE,QAAQ,EAAE,WAAW,EAAE,GAChE,kBAAkB,CAAC;IAErB,IACE,CAAC,iBAAiB;QAClB,OAAO,CAAC,sBAAsB,EAAE,iBAAiB,CAAC,EAClD;QACA,OAAO,KAAK,CAAC;KACd;IAED,MAAM,QAAQ,GAAG,WAAW,EAAE,KAAK,IAAI,KAAK,CAAC;IAE7C,MAAM,0BAA0B,GAC9B,iBAAiB,EAAE,mBAAmB,EAAE,UAAU,IAAI,KAAK,CAAC;IAE9D,OAAO,CAAC,+BAA+B,CACrC,QAAe,EACf,0BAA0B,EAC1B,KAAK,EACL,iBAAiB,EAAE,mBAAmB,EAAE,UAAU,KAAK,KAAK,CAC7D,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,sBAAsB,CAC7B,qBAA+C,EAC/C,gBAA0C;IAE1C,OAAO,CAAC,+BAA+B,CACrC,qBAAqB,EAAE,UAAU,IAAI,KAAK,EAC1C,gBAAgB,EAAE,UAAU,IAAI,KAAK,EACrC,qBAAqB,EAAE,UAAU,KAAK,KAAK,EAC3C,gBAAgB,EAAE,UAAU,KAAK,KAAK,CACvC,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,+BAA+B,CACtC,aAAkB,EAClB,QAAa,EACb,gBAA0B,EAC1B,WAAqB;IAErB,IAAI,eAAe,GAAG,IAAI,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC,CAAC;IAC7D,IAAI,UAAU,GAAG,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;IAEnD,IAAI,gBAAgB,EAAE;QACpB,eAAe,GAAG,eAAe,CAAC,GAAG,EAAE,CAAC;KACzC;IAED,IAAI,WAAW,EAAE;QACf,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;KAC/B;IAED,OAAO,CACL,mBAAmB,CAAC,eAAe,EAAE,UAAU,CAAC;QAChD,kCAAkC,CACnC,CAAC;AACJ,CAAC","sourcesContent":["import type { Hex } from '@metamask/utils';\nimport { remove0x } from '@metamask/utils';\nimport { BN } from 'bn.js';\nimport { isEqual } from 'lodash';\n\nimport { createModuleLogger, projectLogger } from '../logger';\nimport { TransactionStatus } from '../types';\nimport type {\n SimulationBalanceChange,\n SimulationData,\n TransactionMeta,\n TransactionParams,\n} from '../types';\nimport { getPercentageChange } from '../utils/utils';\n\nconst log = createModuleLogger(projectLogger, 'resimulate-helper');\n\nexport const RESIMULATE_PARAMS = ['to', 'value', 'data'] as const;\nexport const BLOCKAID_RESULT_TYPE_MALICIOUS = 'Malicious';\nexport const VALUE_COMPARISON_PERCENT_THRESHOLD = 5;\nexport const BLOCK_TIME_ADDITIONAL_SECONDS = 60;\nexport const RESIMULATE_INTERVAL_MS = 3000;\n\nexport type ResimulateResponse = {\n blockTime?: number;\n resimulate: boolean;\n};\n\nexport type ResimulateHelperOptions = {\n getTransactions: () => TransactionMeta[];\n onTransactionsUpdate: (listener: () => void) => void;\n simulateTransaction: (transactionMeta: TransactionMeta) => Promise<void>;\n};\n\nexport class ResimulateHelper {\n // Map of transactionId <=> timeoutId\n readonly #timeoutIds: Map<string, NodeJS.Timeout> = new Map();\n\n readonly #getTransactions: () => TransactionMeta[];\n\n readonly #simulateTransaction: (\n transactionMeta: TransactionMeta,\n ) => Promise<void>;\n\n constructor({\n getTransactions,\n simulateTransaction,\n onTransactionsUpdate,\n }: ResimulateHelperOptions) {\n this.#getTransactions = getTransactions;\n this.#simulateTransaction = simulateTransaction;\n\n onTransactionsUpdate(this.#onTransactionsUpdate.bind(this));\n }\n\n #onTransactionsUpdate() {\n const unapprovedTransactions = this.#getTransactions().filter(\n (tx) => tx.status === TransactionStatus.unapproved,\n );\n\n const unapprovedTransactionIds = new Set(\n unapprovedTransactions.map((tx) => tx.id),\n );\n\n // Combine unapproved transaction IDs and currently active resimulations\n const allTransactionIds = new Set([\n ...unapprovedTransactionIds,\n ...this.#timeoutIds.keys(),\n ]);\n\n allTransactionIds.forEach((transactionId) => {\n const transactionMeta = unapprovedTransactions.find(\n (tx) => tx.id === transactionId,\n ) as TransactionMeta;\n\n if (transactionMeta?.isActive) {\n this.#start(transactionMeta);\n } else {\n this.#stop(transactionId);\n }\n });\n }\n\n #start(transactionMeta: TransactionMeta) {\n const { id: transactionId } = transactionMeta;\n if (this.#timeoutIds.has(transactionId)) {\n return;\n }\n\n const listener = () => {\n // eslint-disable-next-line promise/catch-or-return\n this.#simulateTransaction(transactionMeta)\n .catch((error) => {\n /* istanbul ignore next */\n log('Error during transaction resimulation', error);\n })\n .finally(() => {\n // Schedule the next execution\n if (this.#timeoutIds.has(transactionId)) {\n this.#queueUpdate(transactionId, listener);\n }\n });\n };\n\n // Start the first execution\n this.#queueUpdate(transactionId, listener);\n log(\n `Started resimulating transaction ${transactionId} every ${RESIMULATE_INTERVAL_MS} milliseconds`,\n );\n }\n\n #queueUpdate(transactionId: string, listener: () => void) {\n const timeoutId = setTimeout(listener, RESIMULATE_INTERVAL_MS);\n this.#timeoutIds.set(transactionId, timeoutId);\n }\n\n #stop(transactionId: string) {\n if (!this.#timeoutIds.has(transactionId)) {\n return;\n }\n\n this.#removeListener(transactionId);\n log(\n `Stopped resimulating transaction ${transactionId} every ${RESIMULATE_INTERVAL_MS} milliseconds`,\n );\n }\n\n #removeListener(id: string) {\n const timeoutId = this.#timeoutIds.get(id);\n if (timeoutId) {\n clearTimeout(timeoutId);\n this.#timeoutIds.delete(id);\n }\n }\n}\n\n/**\n * Determine if a transaction should be resimulated.\n *\n * @param originalTransactionMeta - The original transaction metadata.\n * @param newTransactionMeta - The new transaction metadata.\n * @returns Whether the transaction should be resimulated.\n */\nexport function shouldResimulate(\n originalTransactionMeta: TransactionMeta,\n newTransactionMeta: TransactionMeta,\n) {\n const { id: transactionId } = newTransactionMeta;\n\n const parametersUpdated = isParametersUpdated(\n originalTransactionMeta,\n newTransactionMeta,\n );\n\n const securityAlert = hasNewSecurityAlert(\n originalTransactionMeta,\n newTransactionMeta,\n );\n\n const valueAndNativeBalanceMismatch = hasValueAndNativeBalanceMismatch(\n originalTransactionMeta,\n newTransactionMeta,\n );\n\n const resimulate =\n parametersUpdated || securityAlert || valueAndNativeBalanceMismatch;\n\n let blockTime: number | undefined;\n\n if (securityAlert || valueAndNativeBalanceMismatch) {\n const nowSeconds = Math.floor(Date.now() / 1000);\n blockTime = nowSeconds + BLOCK_TIME_ADDITIONAL_SECONDS;\n }\n\n if (resimulate) {\n log('Transaction should be resimulated', {\n transactionId,\n blockTime,\n parametersUpdated,\n securityAlert,\n valueAndNativeBalanceMismatch,\n });\n }\n\n return {\n blockTime,\n resimulate,\n };\n}\n\n/**\n * Determine if the simulation data has changed.\n *\n * @param originalSimulationData - The original simulation data.\n * @param newSimulationData - The new simulation data.\n * @returns Whether the simulation data has changed.\n */\nexport function hasSimulationDataChanged(\n originalSimulationData: SimulationData,\n newSimulationData: SimulationData,\n): boolean {\n if (isEqual(originalSimulationData, newSimulationData)) {\n return false;\n }\n\n if (\n isBalanceChangeUpdated(\n originalSimulationData?.nativeBalanceChange,\n newSimulationData?.nativeBalanceChange,\n )\n ) {\n log('Simulation data native balance changed');\n return true;\n }\n\n if (\n originalSimulationData.tokenBalanceChanges.length !==\n newSimulationData.tokenBalanceChanges.length\n ) {\n return true;\n }\n\n for (const originalTokenBalanceChange of originalSimulationData.tokenBalanceChanges) {\n const newTokenBalanceChange = newSimulationData.tokenBalanceChanges.find(\n ({ address, id }) =>\n address === originalTokenBalanceChange.address &&\n id === originalTokenBalanceChange.id,\n );\n\n if (!newTokenBalanceChange) {\n log('Missing new token balance', {\n address: originalTokenBalanceChange.address,\n id: originalTokenBalanceChange.id,\n });\n\n return true;\n }\n\n if (\n isBalanceChangeUpdated(originalTokenBalanceChange, newTokenBalanceChange)\n ) {\n log('Simulation data token balance changed', {\n originalTokenBalanceChange,\n newTokenBalanceChange,\n });\n\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Determine if the transaction parameters have been updated.\n *\n * @param originalTransactionMeta - The original transaction metadata.\n * @param newTransactionMeta - The new transaction metadata.\n * @returns Whether the transaction parameters have been updated.\n */\nfunction isParametersUpdated(\n originalTransactionMeta: TransactionMeta,\n newTransactionMeta: TransactionMeta,\n): boolean {\n const { id: transactionId, txParams: newParams } = newTransactionMeta;\n const { txParams: originalParams } = originalTransactionMeta;\n\n if (!originalParams || isEqual(originalParams, newParams)) {\n return false;\n }\n\n const params = Object.keys(newParams) as (keyof TransactionParams)[];\n\n const updatedProperties = params.filter(\n (param) => newParams[param] !== originalParams[param],\n );\n\n log('Transaction parameters updated', {\n transactionId,\n updatedProperties,\n originalParams,\n newParams,\n });\n\n return RESIMULATE_PARAMS.some((param) => updatedProperties.includes(param));\n}\n\n/**\n * Determine if a transaction has a new security alert.\n *\n * @param originalTransactionMeta - The original transaction metadata.\n * @param newTransactionMeta - The new transaction metadata.\n * @returns Whether the transaction has a new security alert.\n */\nfunction hasNewSecurityAlert(\n originalTransactionMeta: TransactionMeta,\n newTransactionMeta: TransactionMeta,\n): boolean {\n const { securityAlertResponse: originalSecurityAlertResponse } =\n originalTransactionMeta;\n\n const { id: transactionId, securityAlertResponse: newSecurityAlertResponse } =\n newTransactionMeta;\n\n if (isEqual(originalSecurityAlertResponse, newSecurityAlertResponse)) {\n return false;\n }\n\n log('Security alert updated', {\n transactionId,\n originalSecurityAlertResponse,\n newSecurityAlertResponse,\n });\n\n return (\n newSecurityAlertResponse?.result_type === BLOCKAID_RESULT_TYPE_MALICIOUS\n );\n}\n\n/**\n * Determine if a transaction has a value and simulation native balance mismatch.\n *\n * @param originalTransactionMeta - The original transaction metadata.\n * @param newTransactionMeta - The new transaction metadata.\n * @returns Whether the transaction has a value and simulation native balance mismatch.\n */\nfunction hasValueAndNativeBalanceMismatch(\n originalTransactionMeta: TransactionMeta,\n newTransactionMeta: TransactionMeta,\n): boolean {\n const { simulationData: originalSimulationData } = originalTransactionMeta;\n\n const { simulationData: newSimulationData, txParams: newTxParams } =\n newTransactionMeta;\n\n if (\n !newSimulationData ||\n isEqual(originalSimulationData, newSimulationData)\n ) {\n return false;\n }\n\n const newValue = newTxParams?.value ?? '0x0';\n\n const newNativeBalanceDifference =\n newSimulationData?.nativeBalanceChange?.difference ?? '0x0';\n\n return !percentageChangeWithinThreshold(\n newValue as Hex,\n newNativeBalanceDifference,\n false,\n newSimulationData?.nativeBalanceChange?.isDecrease === false,\n );\n}\n\n/**\n * Determine if a balance change has been updated.\n *\n * @param originalBalanceChange - The original balance change.\n * @param newBalanceChange - The new balance change.\n * @returns Whether the balance change has been updated.\n */\nfunction isBalanceChangeUpdated(\n originalBalanceChange?: SimulationBalanceChange,\n newBalanceChange?: SimulationBalanceChange,\n): boolean {\n return !percentageChangeWithinThreshold(\n originalBalanceChange?.difference ?? '0x0',\n newBalanceChange?.difference ?? '0x0',\n originalBalanceChange?.isDecrease === false,\n newBalanceChange?.isDecrease === false,\n );\n}\n\n/**\n * Determine if the percentage change between two values is within a threshold.\n *\n * @param originalValue - The original value.\n * @param newValue - The new value.\n * @param originalNegative - Whether the original value is negative.\n * @param newNegative - Whether the new value is negative.\n * @returns Whether the percentage change between the two values is within a threshold.\n */\nfunction percentageChangeWithinThreshold(\n originalValue: Hex,\n newValue: Hex,\n originalNegative?: boolean,\n newNegative?: boolean,\n): boolean {\n let originalValueBN = new BN(remove0x(originalValue), 'hex');\n let newValueBN = new BN(remove0x(newValue), 'hex');\n\n if (originalNegative) {\n originalValueBN = originalValueBN.neg();\n }\n\n if (newNegative) {\n newValueBN = newValueBN.neg();\n }\n\n return (\n getPercentageChange(originalValueBN, newValueBN) <=\n VALUE_COMPARISON_PERCENT_THRESHOLD\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ResimulateHelper.mjs","sourceRoot":"","sources":["../../src/helpers/ResimulateHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Hex } from '@metamask/utils';\nimport { remove0x } from '@metamask/utils';\nimport { BN } from 'bn.js';\nimport { isEqual } from 'lodash';\n\nimport { createModuleLogger, projectLogger } from '../logger';\nimport { TransactionStatus } from '../types';\nimport type {\n SimulationBalanceChange,\n SimulationData,\n TransactionMeta,\n TransactionParams,\n} from '../types';\nimport { getPercentageChange } from '../utils/utils';\n\nconst log = createModuleLogger(projectLogger, 'resimulate-helper');\n\nexport const RESIMULATE_PARAMS = ['to', 'value', 'data'] as const;\nexport const BLOCKAID_RESULT_TYPE_MALICIOUS = 'Malicious';\nexport const VALUE_COMPARISON_PERCENT_THRESHOLD = 5;\nexport const BLOCK_TIME_ADDITIONAL_SECONDS = 60;\nexport const RESIMULATE_INTERVAL_MS = 3000;\n\nexport type ResimulateResponse = {\n blockTime?: number;\n resimulate: boolean;\n};\n\nexport type ResimulateHelperOptions = {\n getTransactions: () => TransactionMeta[];\n onTransactionsUpdate: (listener: () => void) => void;\n simulateTransaction: (transactionMeta: TransactionMeta) => Promise<void>;\n};\n\nexport class ResimulateHelper {\n // Map of transactionId <=> timeoutId\n readonly #timeoutIds: Map<string, NodeJS.Timeout> = new Map();\n\n readonly #getTransactions: () => TransactionMeta[];\n\n readonly #simulateTransaction: (\n transactionMeta: TransactionMeta,\n ) => Promise<void>;\n\n constructor({\n getTransactions,\n simulateTransaction,\n onTransactionsUpdate,\n }: ResimulateHelperOptions) {\n this.#getTransactions = getTransactions;\n this.#simulateTransaction = simulateTransaction;\n\n onTransactionsUpdate(this.#onTransactionsUpdate.bind(this));\n }\n\n #onTransactionsUpdate() {\n const unapprovedTransactions = this.#getTransactions().filter(\n (tx) => tx.status === TransactionStatus.unapproved,\n );\n\n const unapprovedTransactionIds = new Set(\n unapprovedTransactions.map((tx) => tx.id),\n );\n\n // Combine unapproved transaction IDs and currently active resimulations\n const allTransactionIds = new Set([\n ...unapprovedTransactionIds,\n ...this.#timeoutIds.keys(),\n ]);\n\n allTransactionIds.forEach((transactionId) => {\n const transactionMeta = unapprovedTransactions.find(\n (tx) => tx.id === transactionId,\n ) as TransactionMeta;\n\n if (transactionMeta?.isActive) {\n this.#start(transactionMeta);\n } else {\n this.#stop(transactionId);\n }\n });\n }\n\n #start(transactionMeta: TransactionMeta) {\n const { id: transactionId } = transactionMeta;\n if (this.#timeoutIds.has(transactionId)) {\n return;\n }\n\n const listener = () => {\n this.#simulateTransaction(transactionMeta)\n .catch((error) => {\n /* istanbul ignore next */\n log('Error during transaction resimulation', error);\n })\n .finally(() => {\n // Schedule the next execution\n if (this.#timeoutIds.has(transactionId)) {\n this.#queueUpdate(transactionId, listener);\n }\n });\n };\n\n // Start the first execution\n this.#queueUpdate(transactionId, listener);\n log(\n `Started resimulating transaction ${transactionId} every ${RESIMULATE_INTERVAL_MS} milliseconds`,\n );\n }\n\n #queueUpdate(transactionId: string, listener: () => void) {\n const timeoutId = setTimeout(listener, RESIMULATE_INTERVAL_MS);\n this.#timeoutIds.set(transactionId, timeoutId);\n }\n\n #stop(transactionId: string) {\n if (!this.#timeoutIds.has(transactionId)) {\n return;\n }\n\n this.#removeListener(transactionId);\n log(\n `Stopped resimulating transaction ${transactionId} every ${RESIMULATE_INTERVAL_MS} milliseconds`,\n );\n }\n\n #removeListener(id: string) {\n const timeoutId = this.#timeoutIds.get(id);\n if (timeoutId) {\n clearTimeout(timeoutId);\n this.#timeoutIds.delete(id);\n }\n }\n}\n\n/**\n * Determine if a transaction should be resimulated.\n *\n * @param originalTransactionMeta - The original transaction metadata.\n * @param newTransactionMeta - The new transaction metadata.\n * @returns Whether the transaction should be resimulated.\n */\nexport function shouldResimulate(\n originalTransactionMeta: TransactionMeta,\n newTransactionMeta: TransactionMeta,\n) {\n const { id: transactionId } = newTransactionMeta;\n\n const parametersUpdated = isParametersUpdated(\n originalTransactionMeta,\n newTransactionMeta,\n );\n\n const securityAlert = hasNewSecurityAlert(\n originalTransactionMeta,\n newTransactionMeta,\n );\n\n const valueAndNativeBalanceMismatch = hasValueAndNativeBalanceMismatch(\n originalTransactionMeta,\n newTransactionMeta,\n );\n\n const resimulate =\n parametersUpdated || securityAlert || valueAndNativeBalanceMismatch;\n\n let blockTime: number | undefined;\n\n if (securityAlert || valueAndNativeBalanceMismatch) {\n const nowSeconds = Math.floor(Date.now() / 1000);\n blockTime = nowSeconds + BLOCK_TIME_ADDITIONAL_SECONDS;\n }\n\n if (resimulate) {\n log('Transaction should be resimulated', {\n transactionId,\n blockTime,\n parametersUpdated,\n securityAlert,\n valueAndNativeBalanceMismatch,\n });\n }\n\n return {\n blockTime,\n resimulate,\n };\n}\n\n/**\n * Determine if the simulation data has changed.\n *\n * @param originalSimulationData - The original simulation data.\n * @param newSimulationData - The new simulation data.\n * @returns Whether the simulation data has changed.\n */\nexport function hasSimulationDataChanged(\n originalSimulationData: SimulationData,\n newSimulationData: SimulationData,\n): boolean {\n if (isEqual(originalSimulationData, newSimulationData)) {\n return false;\n }\n\n if (\n isBalanceChangeUpdated(\n originalSimulationData?.nativeBalanceChange,\n newSimulationData?.nativeBalanceChange,\n )\n ) {\n log('Simulation data native balance changed');\n return true;\n }\n\n if (\n originalSimulationData.tokenBalanceChanges.length !==\n newSimulationData.tokenBalanceChanges.length\n ) {\n return true;\n }\n\n for (const originalTokenBalanceChange of originalSimulationData.tokenBalanceChanges) {\n const newTokenBalanceChange = newSimulationData.tokenBalanceChanges.find(\n ({ address, id }) =>\n address === originalTokenBalanceChange.address &&\n id === originalTokenBalanceChange.id,\n );\n\n if (!newTokenBalanceChange) {\n log('Missing new token balance', {\n address: originalTokenBalanceChange.address,\n id: originalTokenBalanceChange.id,\n });\n\n return true;\n }\n\n if (\n isBalanceChangeUpdated(originalTokenBalanceChange, newTokenBalanceChange)\n ) {\n log('Simulation data token balance changed', {\n originalTokenBalanceChange,\n newTokenBalanceChange,\n });\n\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Determine if the transaction parameters have been updated.\n *\n * @param originalTransactionMeta - The original transaction metadata.\n * @param newTransactionMeta - The new transaction metadata.\n * @returns Whether the transaction parameters have been updated.\n */\nfunction isParametersUpdated(\n originalTransactionMeta: TransactionMeta,\n newTransactionMeta: TransactionMeta,\n): boolean {\n const { id: transactionId, txParams: newParams } = newTransactionMeta;\n const { txParams: originalParams } = originalTransactionMeta;\n\n if (!originalParams || isEqual(originalParams, newParams)) {\n return false;\n }\n\n const params = Object.keys(newParams) as (keyof TransactionParams)[];\n\n const updatedProperties = params.filter(\n (param) => newParams[param] !== originalParams[param],\n );\n\n log('Transaction parameters updated', {\n transactionId,\n updatedProperties,\n originalParams,\n newParams,\n });\n\n return RESIMULATE_PARAMS.some((param) => updatedProperties.includes(param));\n}\n\n/**\n * Determine if a transaction has a new security alert.\n *\n * @param originalTransactionMeta - The original transaction metadata.\n * @param newTransactionMeta - The new transaction metadata.\n * @returns Whether the transaction has a new security alert.\n */\nfunction hasNewSecurityAlert(\n originalTransactionMeta: TransactionMeta,\n newTransactionMeta: TransactionMeta,\n): boolean {\n const { securityAlertResponse: originalSecurityAlertResponse } =\n originalTransactionMeta;\n\n const { id: transactionId, securityAlertResponse: newSecurityAlertResponse } =\n newTransactionMeta;\n\n if (isEqual(originalSecurityAlertResponse, newSecurityAlertResponse)) {\n return false;\n }\n\n log('Security alert updated', {\n transactionId,\n originalSecurityAlertResponse,\n newSecurityAlertResponse,\n });\n\n return (\n newSecurityAlertResponse?.result_type === BLOCKAID_RESULT_TYPE_MALICIOUS\n );\n}\n\n/**\n * Determine if a transaction has a value and simulation native balance mismatch.\n *\n * @param originalTransactionMeta - The original transaction metadata.\n * @param newTransactionMeta - The new transaction metadata.\n * @returns Whether the transaction has a value and simulation native balance mismatch.\n */\nfunction hasValueAndNativeBalanceMismatch(\n originalTransactionMeta: TransactionMeta,\n newTransactionMeta: TransactionMeta,\n): boolean {\n const { simulationData: originalSimulationData } = originalTransactionMeta;\n\n const { simulationData: newSimulationData, txParams: newTxParams } =\n newTransactionMeta;\n\n if (\n !newSimulationData ||\n isEqual(originalSimulationData, newSimulationData)\n ) {\n return false;\n }\n\n const newValue = newTxParams?.value ?? '0x0';\n\n const newNativeBalanceDifference =\n newSimulationData?.nativeBalanceChange?.difference ?? '0x0';\n\n return !percentageChangeWithinThreshold(\n newValue as Hex,\n newNativeBalanceDifference,\n false,\n newSimulationData?.nativeBalanceChange?.isDecrease === false,\n );\n}\n\n/**\n * Determine if a balance change has been updated.\n *\n * @param originalBalanceChange - The original balance change.\n * @param newBalanceChange - The new balance change.\n * @returns Whether the balance change has been updated.\n */\nfunction isBalanceChangeUpdated(\n originalBalanceChange?: SimulationBalanceChange,\n newBalanceChange?: SimulationBalanceChange,\n): boolean {\n return !percentageChangeWithinThreshold(\n originalBalanceChange?.difference ?? '0x0',\n newBalanceChange?.difference ?? '0x0',\n originalBalanceChange?.isDecrease === false,\n newBalanceChange?.isDecrease === false,\n );\n}\n\n/**\n * Determine if the percentage change between two values is within a threshold.\n *\n * @param originalValue - The original value.\n * @param newValue - The new value.\n * @param originalNegative - Whether the original value is negative.\n * @param newNegative - Whether the new value is negative.\n * @returns Whether the percentage change between the two values is within a threshold.\n */\nfunction percentageChangeWithinThreshold(\n originalValue: Hex,\n newValue: Hex,\n originalNegative?: boolean,\n newNegative?: boolean,\n): boolean {\n let originalValueBN = new BN(remove0x(originalValue), 'hex');\n let newValueBN = new BN(remove0x(newValue), 'hex');\n\n if (originalNegative) {\n originalValueBN = originalValueBN.neg();\n }\n\n if (newNegative) {\n newValueBN = newValueBN.neg();\n }\n\n return (\n getPercentageChange(originalValueBN, newValueBN) <=\n VALUE_COMPARISON_PERCENT_THRESHOLD\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionPoller.cjs","sourceRoot":"","sources":["../../src/helpers/TransactionPoller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,2CAA+D;AAC/D,mCAAiC;AAEjC,0CAA0C;AAG1C,8DAAqE;AAErE,MAAM,GAAG,GAAG,IAAA,0BAAkB,EAAC,sBAAa,EAAE,oBAAoB,CAAC,CAAC;AAEpE;;;;GAIG;AACH,MAAa,iBAAiB;IAmB5B,YAAY,EACV,YAAY,EACZ,OAAO,EACP,SAAS,GAKV;;QA1BD,8CAAoB,CAAC,EAAC;QAEb,kDAA4B;QAE5B,6CAAc;QAEd,+CAA2C;QAEpD,0DAA4D;QAE5D,8CAAyD;QAEzD,yDAAyC;QAEzC,qCAAW,KAAK,EAAC;QAEjB,6CAA0B;QAWxB,uBAAA,IAAI,mCAAiB,YAAY,MAAA,CAAC;QAClC,uBAAA,IAAI,8BAAY,OAAO,MAAA,CAAC;QACxB,uBAAA,IAAI,gCAAc,SAAS,MAAA,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAsD;QAC1D,IAAI,uBAAA,IAAI,kCAAS,EAAE;
|
|
1
|
+
{"version":3,"file":"TransactionPoller.cjs","sourceRoot":"","sources":["../../src/helpers/TransactionPoller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,2CAA+D;AAC/D,mCAAiC;AAEjC,0CAA0C;AAG1C,8DAAqE;AAErE,MAAM,GAAG,GAAG,IAAA,0BAAkB,EAAC,sBAAa,EAAE,oBAAoB,CAAC,CAAC;AAEpE;;;;GAIG;AACH,MAAa,iBAAiB;IAmB5B,YAAY,EACV,YAAY,EACZ,OAAO,EACP,SAAS,GAKV;;QA1BD,8CAAoB,CAAC,EAAC;QAEb,kDAA4B;QAE5B,6CAAc;QAEd,+CAA2C;QAEpD,0DAA4D;QAE5D,8CAAyD;QAEzD,yDAAyC;QAEzC,qCAAW,KAAK,EAAC;QAEjB,6CAA0B;QAWxB,uBAAA,IAAI,mCAAiB,YAAY,MAAA,CAAC;QAClC,uBAAA,IAAI,8BAAY,OAAO,MAAA,CAAC;QACxB,uBAAA,IAAI,gCAAc,SAAS,MAAA,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAsD;QAC1D,IAAI,uBAAA,IAAI,kCAAS,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QAED,uBAAA,IAAI,+BAAa,QAAQ,MAAA,CAAC;QAC1B,uBAAA,IAAI,8BAAY,IAAI,MAAA,CAAC;QAErB,uBAAA,IAAI,8DAAO,MAAX,IAAI,CAAS,CAAC;QAEd,GAAG,CAAC,SAAS,CAAC,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,IAAI;QACF,IAAI,CAAC,uBAAA,IAAI,kCAAS,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,uBAAA,IAAI,8BAAY,KAAK,MAAA,CAAC;QACtB,uBAAA,IAAI,+BAAa,SAAS,MAAA,CAAC;QAC3B,uBAAA,IAAI,uCAAqB,CAAC,MAAA,CAAC;QAC3B,uBAAA,IAAI,0CAAwB,SAAS,MAAA,CAAC;QAEtC,uBAAA,IAAI,oEAAa,MAAjB,IAAI,CAAe,CAAC;QACpB,uBAAA,IAAI,yEAAkB,MAAtB,IAAI,CAAoB,CAAC;QAEzB,GAAG,CAAC,SAAS,CAAC,CAAC;IACjB,CAAC;IAED;;;;;;OAMG;IACH,sBAAsB,CAAC,mBAAsC;QAC3D,MAAM,4BAA4B,GAAG,CAAC,uBAAA,IAAI,8CAAqB,IAAI,EAAE,CAAC,CAAC,GAAG,CACxE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CACd,CAAC;QAEF,uBAAA,IAAI,0CAAwB,mBAAmB,MAAA,CAAC;QAEhD,MAAM,wBAAwB,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAExE,MAAM,aAAa,GAAG,CAAC,IAAA,gBAAO,EAC5B,4BAA4B,EAC5B,wBAAwB,CACzB,CAAC;QAEF,IAAI,CAAC,uBAAA,IAAI,kCAAS,IAAI,CAAC,aAAa,EAAE,CAAC;YACrC,OAAO;QACT,CAAC;QAED,GAAG,CAAC,mCAAmC,EAAE,wBAAwB,CAAC,CAAC;QAEnE,uBAAA,IAAI,uCAAqB,CAAC,MAAA,CAAC;QAE3B,IAAI,uBAAA,IAAI,+CAAsB,EAAE,CAAC;YAC/B,uBAAA,IAAI,yEAAkB,MAAtB,IAAI,CAAoB,CAAC;YACzB,uBAAA,IAAI,8DAAO,MAAX,IAAI,CAAS,CAAC;QAChB,CAAC;IACH,CAAC;CAmEF;AA3KD,8CA2KC;;IAhEG,IAAI,CAAC,uBAAA,IAAI,kCAAS,EAAE,CAAC;QACnB,OAAO;IACT,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,IAAA,2CAA2B,EAC1D,uBAAA,IAAI,kCAAS,EACb,uBAAA,IAAI,oCAAW,CAChB,CAAC;IAEF,IAAI,uBAAA,IAAI,2CAAkB,IAAI,QAAQ,EAAE,CAAC;QACvC,kEAAkE;QAClE,uBAAA,IAAI,2CAAyB,CAAC,iBAAiB,EAAE,EAAE,CACjD,uBAAA,IAAI,iEAAU,MAAd,IAAI,EAAW,KAAK,EAAE,iBAAiB,CAAC,MAAA,CAAC;QAE3C,uBAAA,IAAI,uCAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,uBAAA,IAAI,+CAAsB,CAAC,CAAC;QAE5D,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAEpC,OAAO;IACT,CAAC;IAED,uBAAA,IAAI,oEAAa,MAAjB,IAAI,CAAe,CAAC;IAEpB,kEAAkE;IAClE,uBAAA,IAAI,8BAAY,UAAU,CAAC,KAAK,IAAI,EAAE;QACpC,MAAM,uBAAA,IAAI,iEAAU,MAAd,IAAI,EAAW,IAAI,CAAC,CAAC;QAC3B,uBAAA,IAAI,8DAAO,MAAX,IAAI,CAAS,CAAC;IAChB,CAAC,EAAE,UAAU,CAAC,MAAA,CAAC;AACjB,CAAC,gCAED,KAAK,sCAAW,aAAsB,EAAE,iBAA0B;IAChE,IAAI,aAAa,EAAE,CAAC;QAClB,GAAG,CAAC,sBAAsB,EAAE,uBAAA,IAAI,2CAAkB,GAAG,CAAC,CAAC,CAAC;IAC1D,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,wBAAwB,EAAE,iBAAiB,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,sBAAsB,GAC1B,iBAAiB,IAAI,CAAC,MAAM,uBAAA,IAAI,uCAAc,CAAC,cAAc,EAAE,CAAC,CAAC;IAEnE,MAAM,uBAAA,IAAI,mCAAU,EAAE,KAAhB,IAAI,EAAa,sBAAsB,CAAC,CAAC;IAE/C,IAAI,aAAa,IAAI,uBAAA,IAAI,kCAAS,EAAE,CAAC;QACnC,2IAA0B,CAAC,MAAA,CAAC;IAC9B,CAAC;AACH,CAAC;IAGC,IAAI,CAAC,uBAAA,IAAI,kCAAS,EAAE,CAAC;QACnB,OAAO;IACT,CAAC;IAED,YAAY,CAAC,uBAAA,IAAI,kCAAS,CAAC,CAAC;IAC5B,uBAAA,IAAI,8BAAY,SAAS,MAAA,CAAC;AAC5B,CAAC;IAGC,IAAI,CAAC,uBAAA,IAAI,+CAAsB,EAAE,CAAC;QAChC,OAAO;IACT,CAAC;IAED,uBAAA,IAAI,uCAAc,CAAC,cAAc,CAAC,QAAQ,EAAE,uBAAA,IAAI,+CAAsB,CAAC,CAAC;IACxE,uBAAA,IAAI,2CAAyB,SAAS,MAAA,CAAC;AACzC,CAAC","sourcesContent":["import type { BlockTracker } from '@metamask/network-controller';\nimport { createModuleLogger, type Hex } from '@metamask/utils';\nimport { isEqual } from 'lodash';\n\nimport { projectLogger } from '../logger';\nimport type { TransactionControllerMessenger } from '../TransactionController';\nimport type { TransactionMeta } from '../types';\nimport { getAcceleratedPollingParams } from '../utils/feature-flags';\n\nconst log = createModuleLogger(projectLogger, 'transaction-poller');\n\n/**\n * Helper class to orchestrate when to poll pending transactions.\n * Initially starts polling via a timeout chain every 2 seconds up to 5 times.\n * Following that, it will poll on every new block via the block tracker.\n */\nexport class TransactionPoller {\n #acceleratedCount = 0;\n\n readonly #blockTracker: BlockTracker;\n\n readonly #chainId: Hex;\n\n readonly #messenger: TransactionControllerMessenger;\n\n #blockTrackerListener?: (latestBlockNumber: string) => void;\n\n #listener?: (latestBlockNumber: string) => Promise<void>;\n\n #pendingTransactions?: TransactionMeta[];\n\n #running = false;\n\n #timeout?: NodeJS.Timeout;\n\n constructor({\n blockTracker,\n chainId,\n messenger,\n }: {\n blockTracker: BlockTracker;\n chainId: Hex;\n messenger: TransactionControllerMessenger;\n }) {\n this.#blockTracker = blockTracker;\n this.#chainId = chainId;\n this.#messenger = messenger;\n }\n\n /**\n * Start the poller with a listener that will be called on every interval.\n *\n * @param listener - The listener to call on every interval.\n */\n start(listener: (latestBlockNumber: string) => Promise<void>) {\n if (this.#running) {\n return;\n }\n\n this.#listener = listener;\n this.#running = true;\n\n this.#queue();\n\n log('Started');\n }\n\n /**\n * Stop the poller.\n * Remove all timeouts and block tracker listeners.\n */\n stop() {\n if (!this.#running) {\n return;\n }\n\n this.#running = false;\n this.#listener = undefined;\n this.#acceleratedCount = 0;\n this.#pendingTransactions = undefined;\n\n this.#stopTimeout();\n this.#stopBlockTracker();\n\n log('Stopped');\n }\n\n /**\n * Notify the poller of the pending transactions being monitored.\n * This will reset to the accelerated polling and reset the count\n * when new transactions are added or removed.\n *\n * @param pendingTransactions - The pending transactions to poll.\n */\n setPendingTransactions(pendingTransactions: TransactionMeta[]) {\n const currentPendingTransactionIds = (this.#pendingTransactions ?? []).map(\n (tx) => tx.id,\n );\n\n this.#pendingTransactions = pendingTransactions;\n\n const newPendingTransactionIds = pendingTransactions.map((tx) => tx.id);\n\n const hasUpdatedIds = !isEqual(\n currentPendingTransactionIds,\n newPendingTransactionIds,\n );\n\n if (!this.#running || !hasUpdatedIds) {\n return;\n }\n\n log('Detected new pending transactions', newPendingTransactionIds);\n\n this.#acceleratedCount = 0;\n\n if (this.#blockTrackerListener) {\n this.#stopBlockTracker();\n this.#queue();\n }\n }\n\n #queue() {\n if (!this.#running) {\n return;\n }\n\n const { countMax, intervalMs } = getAcceleratedPollingParams(\n this.#chainId,\n this.#messenger,\n );\n\n if (this.#acceleratedCount >= countMax) {\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#blockTrackerListener = (latestBlockNumber) =>\n this.#interval(false, latestBlockNumber);\n\n this.#blockTracker.on('latest', this.#blockTrackerListener);\n\n log('Added block tracker listener');\n\n return;\n }\n\n this.#stopTimeout();\n\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#timeout = setTimeout(async () => {\n await this.#interval(true);\n this.#queue();\n }, intervalMs);\n }\n\n async #interval(isAccelerated: boolean, latestBlockNumber?: string) {\n if (isAccelerated) {\n log('Accelerated interval', this.#acceleratedCount + 1);\n } else {\n log('Block tracker interval', latestBlockNumber);\n }\n\n const latestBlockNumberFinal =\n latestBlockNumber ?? (await this.#blockTracker.getLatestBlock());\n\n await this.#listener?.(latestBlockNumberFinal);\n\n if (isAccelerated && this.#running) {\n this.#acceleratedCount += 1;\n }\n }\n\n #stopTimeout() {\n if (!this.#timeout) {\n return;\n }\n\n clearTimeout(this.#timeout);\n this.#timeout = undefined;\n }\n\n #stopBlockTracker() {\n if (!this.#blockTrackerListener) {\n return;\n }\n\n this.#blockTracker.removeListener('latest', this.#blockTrackerListener);\n this.#blockTrackerListener = undefined;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionPoller.mjs","sourceRoot":"","sources":["../../src/helpers/TransactionPoller.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,OAAO,EAAE,kBAAkB,EAAY,wBAAwB;;;AAG/D,OAAO,EAAE,aAAa,EAAE,sBAAkB;AAG1C,OAAO,EAAE,2BAA2B,EAAE,mCAA+B;AAErE,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;AAEpE;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IAmB5B,YAAY,EACV,YAAY,EACZ,OAAO,EACP,SAAS,GAKV;;QA1BD,8CAAoB,CAAC,EAAC;QAEb,kDAA4B;QAE5B,6CAAc;QAEd,+CAA2C;QAEpD,0DAA4D;QAE5D,8CAAyD;QAEzD,yDAAyC;QAEzC,qCAAW,KAAK,EAAC;QAEjB,6CAA0B;QAWxB,uBAAA,IAAI,mCAAiB,YAAY,MAAA,CAAC;QAClC,uBAAA,IAAI,8BAAY,OAAO,MAAA,CAAC;QACxB,uBAAA,IAAI,gCAAc,SAAS,MAAA,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAsD;QAC1D,IAAI,uBAAA,IAAI,kCAAS,EAAE;
|
|
1
|
+
{"version":3,"file":"TransactionPoller.mjs","sourceRoot":"","sources":["../../src/helpers/TransactionPoller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BlockTracker } from '@metamask/network-controller';\nimport { createModuleLogger, type Hex } from '@metamask/utils';\nimport { isEqual } from 'lodash';\n\nimport { projectLogger } from '../logger';\nimport type { TransactionControllerMessenger } from '../TransactionController';\nimport type { TransactionMeta } from '../types';\nimport { getAcceleratedPollingParams } from '../utils/feature-flags';\n\nconst log = createModuleLogger(projectLogger, 'transaction-poller');\n\n/**\n * Helper class to orchestrate when to poll pending transactions.\n * Initially starts polling via a timeout chain every 2 seconds up to 5 times.\n * Following that, it will poll on every new block via the block tracker.\n */\nexport class TransactionPoller {\n #acceleratedCount = 0;\n\n readonly #blockTracker: BlockTracker;\n\n readonly #chainId: Hex;\n\n readonly #messenger: TransactionControllerMessenger;\n\n #blockTrackerListener?: (latestBlockNumber: string) => void;\n\n #listener?: (latestBlockNumber: string) => Promise<void>;\n\n #pendingTransactions?: TransactionMeta[];\n\n #running = false;\n\n #timeout?: NodeJS.Timeout;\n\n constructor({\n blockTracker,\n chainId,\n messenger,\n }: {\n blockTracker: BlockTracker;\n chainId: Hex;\n messenger: TransactionControllerMessenger;\n }) {\n this.#blockTracker = blockTracker;\n this.#chainId = chainId;\n this.#messenger = messenger;\n }\n\n /**\n * Start the poller with a listener that will be called on every interval.\n *\n * @param listener - The listener to call on every interval.\n */\n start(listener: (latestBlockNumber: string) => Promise<void>) {\n if (this.#running) {\n return;\n }\n\n this.#listener = listener;\n this.#running = true;\n\n this.#queue();\n\n log('Started');\n }\n\n /**\n * Stop the poller.\n * Remove all timeouts and block tracker listeners.\n */\n stop() {\n if (!this.#running) {\n return;\n }\n\n this.#running = false;\n this.#listener = undefined;\n this.#acceleratedCount = 0;\n this.#pendingTransactions = undefined;\n\n this.#stopTimeout();\n this.#stopBlockTracker();\n\n log('Stopped');\n }\n\n /**\n * Notify the poller of the pending transactions being monitored.\n * This will reset to the accelerated polling and reset the count\n * when new transactions are added or removed.\n *\n * @param pendingTransactions - The pending transactions to poll.\n */\n setPendingTransactions(pendingTransactions: TransactionMeta[]) {\n const currentPendingTransactionIds = (this.#pendingTransactions ?? []).map(\n (tx) => tx.id,\n );\n\n this.#pendingTransactions = pendingTransactions;\n\n const newPendingTransactionIds = pendingTransactions.map((tx) => tx.id);\n\n const hasUpdatedIds = !isEqual(\n currentPendingTransactionIds,\n newPendingTransactionIds,\n );\n\n if (!this.#running || !hasUpdatedIds) {\n return;\n }\n\n log('Detected new pending transactions', newPendingTransactionIds);\n\n this.#acceleratedCount = 0;\n\n if (this.#blockTrackerListener) {\n this.#stopBlockTracker();\n this.#queue();\n }\n }\n\n #queue() {\n if (!this.#running) {\n return;\n }\n\n const { countMax, intervalMs } = getAcceleratedPollingParams(\n this.#chainId,\n this.#messenger,\n );\n\n if (this.#acceleratedCount >= countMax) {\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#blockTrackerListener = (latestBlockNumber) =>\n this.#interval(false, latestBlockNumber);\n\n this.#blockTracker.on('latest', this.#blockTrackerListener);\n\n log('Added block tracker listener');\n\n return;\n }\n\n this.#stopTimeout();\n\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#timeout = setTimeout(async () => {\n await this.#interval(true);\n this.#queue();\n }, intervalMs);\n }\n\n async #interval(isAccelerated: boolean, latestBlockNumber?: string) {\n if (isAccelerated) {\n log('Accelerated interval', this.#acceleratedCount + 1);\n } else {\n log('Block tracker interval', latestBlockNumber);\n }\n\n const latestBlockNumberFinal =\n latestBlockNumber ?? (await this.#blockTracker.getLatestBlock());\n\n await this.#listener?.(latestBlockNumberFinal);\n\n if (isAccelerated && this.#running) {\n this.#acceleratedCount += 1;\n }\n }\n\n #stopTimeout() {\n if (!this.#timeout) {\n return;\n }\n\n clearTimeout(this.#timeout);\n this.#timeout = undefined;\n }\n\n #stopBlockTracker() {\n if (!this.#blockTrackerListener) {\n return;\n }\n\n this.#blockTracker.removeListener('latest', this.#blockTrackerListener);\n this.#blockTrackerListener = undefined;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollectPublishHook.cjs","sourceRoot":"","sources":["../../src/hooks/CollectPublishHook.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,2CAA4E;AAC5E,mCAAgC;AAEhC,0CAA0C;AAG1C,MAAM,GAAG,GAAG,IAAA,0BAAkB,EAAC,sBAAa,EAAE,sBAAsB,CAAC,CAAC;AAMtE;;;GAGG;AACH,MAAa,kBAAkB;IAW7B,YAAY,gBAAwB;;QAVpC,8CAII;QAEK,uDAA0B;QAE1B,mDAAyD;QAGhE,uBAAA,IAAI,oCAAiB,IAAA,6BAAqB,GAAE,MAAA,CAAC;QAC7C,uBAAA,IAAI,+BAAY,EAAE,MAAA,CAAC;QACnB,uBAAA,IAAI,wCAAqB,gBAAgB,MAAA,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,uBAAA,IAAI,+DAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,OAAO,uBAAA,IAAI,wCAAc,CAAC,OAAO,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,iBAAwB;QAC9B,GAAG,CAAC,SAAS,EAAE,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAEtC,IAAI,iBAAiB,CAAC,MAAM,KAAK,uBAAA,IAAI,4CAAkB,EAAE;
|
|
1
|
+
{"version":3,"file":"CollectPublishHook.cjs","sourceRoot":"","sources":["../../src/hooks/CollectPublishHook.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DeferredPromise, Hex } from '@metamask/utils';\nimport { createDeferredPromise, createModuleLogger } from '@metamask/utils';\nimport { sortBy } from 'lodash';\n\nimport { projectLogger } from '../logger';\nimport type { PublishHook, PublishHookResult, TransactionMeta } from '../types';\n\nconst log = createModuleLogger(projectLogger, 'collect-publish-hook');\n\nexport type CollectPublishHookResult = {\n signedTransactions: Hex[];\n};\n\n/**\n * Custom publish logic that collects multiple signed transactions until a specific number is reached.\n * Used by batch transactions to publish multiple transactions at once.\n */\nexport class CollectPublishHook {\n #results: {\n nonce: number;\n promise: DeferredPromise<PublishHookResult>;\n signedTransaction: Hex;\n }[];\n\n readonly #transactionCount: number;\n\n readonly #readyPromise: DeferredPromise<CollectPublishHookResult>;\n\n constructor(transactionCount: number) {\n this.#readyPromise = createDeferredPromise();\n this.#results = [];\n this.#transactionCount = transactionCount;\n }\n\n /**\n * @returns The publish hook function to be passed to `addTransaction`.\n */\n getHook(): PublishHook {\n return this.#hook.bind(this);\n }\n\n /**\n * @returns A promise that resolves when all transactions are signed.\n */\n ready(): Promise<CollectPublishHookResult> {\n return this.#readyPromise.promise;\n }\n\n /**\n * Resolve all publish promises with the provided transaction hashes.\n *\n * @param transactionHashes - The transaction hashes to pass to the original publish promises.\n */\n success(transactionHashes: Hex[]) {\n log('Success', { transactionHashes });\n\n if (transactionHashes.length !== this.#transactionCount) {\n throw new Error('Transaction hash count mismatch');\n }\n\n for (let i = 0; i < this.#results.length; i++) {\n const result = this.#results[i];\n const transactionHash = transactionHashes[i];\n\n result.promise.resolve({ transactionHash });\n }\n }\n\n error(error: unknown) {\n log('Error', { error });\n\n for (const result of this.#results) {\n result.promise.reject(error);\n }\n }\n\n #hook(\n transactionMeta: TransactionMeta,\n signedTx: string,\n ): Promise<PublishHookResult> {\n const nonceHex = transactionMeta.txParams.nonce ?? '0x0';\n const nonceDecimal = parseInt(nonceHex, 16);\n\n log('Processing transaction', {\n nonce: nonceDecimal,\n signedTx,\n transactionMeta,\n });\n\n const publishPromise = createDeferredPromise<PublishHookResult>();\n\n this.#results.push({\n nonce: nonceDecimal,\n promise: publishPromise,\n signedTransaction: signedTx as Hex,\n });\n\n this.#results = sortBy(this.#results, (r) => r.nonce);\n\n if (this.#results.length === this.#transactionCount) {\n log('All transactions signed');\n\n const signedTransactions = this.#results.map(\n (result) => result.signedTransaction,\n );\n\n this.#readyPromise.resolve({\n signedTransactions,\n });\n }\n\n return publishPromise.promise;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollectPublishHook.mjs","sourceRoot":"","sources":["../../src/hooks/CollectPublishHook.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,wBAAwB;;;AAG5E,OAAO,EAAE,aAAa,EAAE,sBAAkB;AAG1C,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,sBAAsB,CAAC,CAAC;AAMtE;;;GAGG;AACH,MAAM,OAAO,kBAAkB;IAW7B,YAAY,gBAAwB;;QAVpC,8CAII;QAEK,uDAA0B;QAE1B,mDAAyD;QAGhE,uBAAA,IAAI,oCAAiB,qBAAqB,EAAE,MAAA,CAAC;QAC7C,uBAAA,IAAI,+BAAY,EAAE,MAAA,CAAC;QACnB,uBAAA,IAAI,wCAAqB,gBAAgB,MAAA,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,uBAAA,IAAI,+DAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,OAAO,uBAAA,IAAI,wCAAc,CAAC,OAAO,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,iBAAwB;QAC9B,GAAG,CAAC,SAAS,EAAE,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAEtC,IAAI,iBAAiB,CAAC,MAAM,KAAK,uBAAA,IAAI,4CAAkB,EAAE;
|
|
1
|
+
{"version":3,"file":"CollectPublishHook.mjs","sourceRoot":"","sources":["../../src/hooks/CollectPublishHook.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DeferredPromise, Hex } from '@metamask/utils';\nimport { createDeferredPromise, createModuleLogger } from '@metamask/utils';\nimport { sortBy } from 'lodash';\n\nimport { projectLogger } from '../logger';\nimport type { PublishHook, PublishHookResult, TransactionMeta } from '../types';\n\nconst log = createModuleLogger(projectLogger, 'collect-publish-hook');\n\nexport type CollectPublishHookResult = {\n signedTransactions: Hex[];\n};\n\n/**\n * Custom publish logic that collects multiple signed transactions until a specific number is reached.\n * Used by batch transactions to publish multiple transactions at once.\n */\nexport class CollectPublishHook {\n #results: {\n nonce: number;\n promise: DeferredPromise<PublishHookResult>;\n signedTransaction: Hex;\n }[];\n\n readonly #transactionCount: number;\n\n readonly #readyPromise: DeferredPromise<CollectPublishHookResult>;\n\n constructor(transactionCount: number) {\n this.#readyPromise = createDeferredPromise();\n this.#results = [];\n this.#transactionCount = transactionCount;\n }\n\n /**\n * @returns The publish hook function to be passed to `addTransaction`.\n */\n getHook(): PublishHook {\n return this.#hook.bind(this);\n }\n\n /**\n * @returns A promise that resolves when all transactions are signed.\n */\n ready(): Promise<CollectPublishHookResult> {\n return this.#readyPromise.promise;\n }\n\n /**\n * Resolve all publish promises with the provided transaction hashes.\n *\n * @param transactionHashes - The transaction hashes to pass to the original publish promises.\n */\n success(transactionHashes: Hex[]) {\n log('Success', { transactionHashes });\n\n if (transactionHashes.length !== this.#transactionCount) {\n throw new Error('Transaction hash count mismatch');\n }\n\n for (let i = 0; i < this.#results.length; i++) {\n const result = this.#results[i];\n const transactionHash = transactionHashes[i];\n\n result.promise.resolve({ transactionHash });\n }\n }\n\n error(error: unknown) {\n log('Error', { error });\n\n for (const result of this.#results) {\n result.promise.reject(error);\n }\n }\n\n #hook(\n transactionMeta: TransactionMeta,\n signedTx: string,\n ): Promise<PublishHookResult> {\n const nonceHex = transactionMeta.txParams.nonce ?? '0x0';\n const nonceDecimal = parseInt(nonceHex, 16);\n\n log('Processing transaction', {\n nonce: nonceDecimal,\n signedTx,\n transactionMeta,\n });\n\n const publishPromise = createDeferredPromise<PublishHookResult>();\n\n this.#results.push({\n nonce: nonceDecimal,\n promise: publishPromise,\n signedTransaction: signedTx as Hex,\n });\n\n this.#results = sortBy(this.#results, (r) => r.nonce);\n\n if (this.#results.length === this.#transactionCount) {\n log('All transactions signed');\n\n const signedTransactions = this.#results.map(\n (result) => result.signedTransaction,\n );\n\n this.#readyPromise.resolve({\n signedTransactions,\n });\n }\n\n return publishPromise.promise;\n }\n}\n"]}
|
|
@@ -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;IAOvC,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,mBAAmB,GAKpB;;QAdQ,oEAAmE;QAEnE,+DAA4D;QAE5D,oEAAkC;QAWzC,uBAAA,IAAI,qDAAwB,mBAAmB,MAAA,CAAC;QAChD,uBAAA,IAAI,gDAAmB,cAAc,MAAA,CAAC;QACtC,uBAAA,IAAI,qDAAwB,mBAAmB,MAAA,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,uBAAA,IAAI,mFAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;CA8HF;AAxJD,oEAwJC;kSA5HC,KAAK,6CACH,eAAgC,EAChC,QAAgB;IAEhB,GAAG,CAAC,iCAAiC,EAAE,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,CAAC;IAEtE,MAAM,EACJ,iBAAiB,EACjB,wBAAwB,EACxB,EAAE,EAAE,aAAa,EACjB,eAAe,EACf,QAAQ,GACT,GAAG,eAAe,CAAC;IAEpB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAW,CAAC;IAClC,MAAM,EAAE,GAAG,QAAQ,CAAC,EAAqB,CAAC;IAC1C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAuB,CAAC;IAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAwB,CAAC;IAChD,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAsB,CAAC;IAC5C,MAAM,YAAY,GAAG,QAAQ,CAAC,YAA+B,CAAC;IAE9D,MAAM,oBAAoB,GAAG,QAAQ,CAAC,oBAEzB,CAAC;IAEd,MAAM,iBAAiB,GAAG,QAAe,CAAC;IAC1C,MAAM,aAAa,GAAG,IAAA,6BAAqB,GAAqB,CAAC;IAEjE,MAAM,SAAS,GAAG,CAAC,EACjB,YAAY,EACZ,eAAe,GAIhB,EAAE,EAAE;QACH,IAAI,YAAY,EAAE;
|
|
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 +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;IAOvC,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,mBAAmB,GAKpB;;QAdQ,oEAAmE;QAEnE,+DAA4D;QAE5D,oEAAkC;QAWzC,uBAAA,IAAI,qDAAwB,mBAAmB,MAAA,CAAC;QAChD,uBAAA,IAAI,gDAAmB,cAAc,MAAA,CAAC;QACtC,uBAAA,IAAI,qDAAwB,mBAAmB,MAAA,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,uBAAA,IAAI,mFAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;CA8HF;kSA5HC,KAAK,6CACH,eAAgC,EAChC,QAAgB;IAEhB,GAAG,CAAC,iCAAiC,EAAE,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,CAAC;IAEtE,MAAM,EACJ,iBAAiB,EACjB,wBAAwB,EACxB,EAAE,EAAE,aAAa,EACjB,eAAe,EACf,QAAQ,GACT,GAAG,eAAe,CAAC;IAEpB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAW,CAAC;IAClC,MAAM,EAAE,GAAG,QAAQ,CAAC,EAAqB,CAAC;IAC1C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAuB,CAAC;IAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAwB,CAAC;IAChD,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAsB,CAAC;IAC5C,MAAM,YAAY,GAAG,QAAQ,CAAC,YAA+B,CAAC;IAE9D,MAAM,oBAAoB,GAAG,QAAQ,CAAC,oBAEzB,CAAC;IAEd,MAAM,iBAAiB,GAAG,QAAe,CAAC;IAC1C,MAAM,aAAa,GAAG,qBAAqB,EAAqB,CAAC;IAEjE,MAAM,SAAS,GAAG,CAAC,EACjB,YAAY,EACZ,eAAe,GAIhB,EAAE,EAAE;QACH,IAAI,YAAY,EAAE;
|
|
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;IAOvC,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,mBAAmB,GAKpB;;QAdQ,oEAAmE;QAEnE,+DAA4D;QAE5D,oEAAkC;QAWzC,uBAAA,IAAI,qDAAwB,mBAAmB,MAAA,CAAC;QAChD,uBAAA,IAAI,gDAAmB,cAAc,MAAA,CAAC;QACtC,uBAAA,IAAI,qDAAwB,mBAAmB,MAAA,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,uBAAA,IAAI,mFAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;CA8HF;kSA5HC,KAAK,6CACH,eAAgC,EAChC,QAAgB;IAEhB,GAAG,CAAC,iCAAiC,EAAE,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,CAAC;IAEtE,MAAM,EACJ,iBAAiB,EACjB,wBAAwB,EACxB,EAAE,EAAE,aAAa,EACjB,eAAe,EACf,QAAQ,GACT,GAAG,eAAe,CAAC;IAEpB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAW,CAAC;IAClC,MAAM,EAAE,GAAG,QAAQ,CAAC,EAAqB,CAAC;IAC1C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAuB,CAAC;IAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAwB,CAAC;IAChD,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAsB,CAAC;IAC5C,MAAM,YAAY,GAAG,QAAQ,CAAC,YAA+B,CAAC;IAE9D,MAAM,oBAAoB,GAAG,QAAQ,CAAC,oBAEzB,CAAC;IAEd,MAAM,iBAAiB,GAAG,QAAe,CAAC;IAC1C,MAAM,aAAa,GAAG,qBAAqB,EAAqB,CAAC;IAEjE,MAAM,SAAS,GAAG,CAAC,EACjB,YAAY,EACZ,eAAe,GAIhB,EAAE,EAAE;QACH,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,qBAAqB,GAAG,uBAAA,IAAI,oDAAgB,MAApB,IAAI,EAAiB,aAAa,CAAC,CAAC;YAElE,GAAG,CAAC,kDAAkD,EAAE;gBACtD,qBAAqB;gBACrB,YAAY;aACb,CAAC,CAAC;YAEH,uBAAA,IAAI,yDAAqB,MAAzB,IAAI,EAAsB,qBAAqB,EAAE,YAAY,CAAC;iBAC3D,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;iBAC3B,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAE/B,OAAO;QACT,CAAC;QAED,aAAa,CAAC,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC;IAC7C,CAAC,CAAC;IAEF,MAAM,WAAW,GAA2B;QAC1C,IAAI;QACJ,GAAG;QACH,YAAY;QACZ,oBAAoB;QACpB,EAAE;QACF,KAAK;KACN,CAAC;IAEF,MAAM,eAAe,GAAkC;QACrD,mBAAmB,EAAE;YACnB,EAAE,EAAE,aAAa;YACjB,SAAS;YACT,iBAAiB;SAClB;QACD,MAAM,EAAE,WAAW;KACpB,CAAC;IAEF,MAAM,iBAAiB,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE;QACtE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,WAAW,CAAC;QAC/C,OAAO;YACL,OAAO;YACP,MAAM,EAAE,IAAI;YACZ,IAAI;SACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,kBAAkB,GACtB,iBAAiB;SACd,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,KAAK,KAAK,CAAC;SACtD,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9B,GAAG,IAAI;KACR,CAAC,CAAC,CAAC;IAER,MAAM,iBAAiB,GAAoC,iBAAiB;SACzE,MAAM,CACL,CAAC,WAAW,EAAE,EAAE,CACd,WAAW,CAAC,OAAO,KAAK,SAAS,IAAI,WAAW,CAAC,OAAO,CAC3D;SACA,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9B,GAAG,IAAI;KACR,CAAC,CAAC,CAAC;IAEN,MAAM,YAAY,GAAoC;QACpD,GAAG,kBAAkB;QACrB,eAAe;QACf,GAAG,iBAAiB;KACrB,CAAC;IAEF,GAAG,CAAC,0BAA0B,EAAE;QAC9B,IAAI;QACJ,eAAe;QACf,YAAY;KACb,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,wBAAwB,IAAI;QAC1C,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,KAAK;QAClB,iBAAiB,EAAE,IAAI;KACxB,CAAC;IAEF,MAAM,uBAAA,IAAI,yDAAqB,MAAzB,IAAI,EAAsB;QAC9B,IAAI;QACJ,eAAe;QACf,eAAe,EAAE,KAAK;QACtB,YAAY;QACZ,GAAG,OAAO;KACX,CAAC,CAAC;IAEH,OAAO,aAAa,CAAC,OAAO,CAAC;AAC/B,CAAC","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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SequentialPublishBatchHook.cjs","sourceRoot":"","sources":["../../src/hooks/SequentialPublishBatchHook.ts"],"names":[],"mappings":"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","sourcesContent":["import type EthQuery from '@metamask/eth-query';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { createModuleLogger } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\n\nimport type { PendingTransactionTracker } from '../helpers/PendingTransactionTracker';\nimport { projectLogger } from '../logger';\nimport {\n type PublishBatchHook,\n type PublishBatchHookRequest,\n type PublishBatchHookResult,\n type TransactionMeta,\n} from '../types';\n\nconst log = createModuleLogger(projectLogger, 'sequential-publish-batch-hook');\n\ntype SequentialPublishBatchHookOptions = {\n publishTransaction: (\n ethQuery: EthQuery,\n transactionMeta: TransactionMeta,\n ) => Promise<Hex>;\n getTransaction: (id: string) => TransactionMeta;\n getEthQuery: (networkClientId: string) => EthQuery;\n getPendingTransactionTracker: (\n networkClientId: string,\n ) => PendingTransactionTracker;\n};\n\n/**\n * Custom publish logic that also publishes additional sequential transactions in a batch.\n * Requires the batch to be successful to resolve.\n */\nexport class SequentialPublishBatchHook {\n readonly #publishTransaction: (\n ethQuery: EthQuery,\n transactionMeta: TransactionMeta,\n ) => Promise<Hex>;\n\n readonly #getTransaction: (id: string) => TransactionMeta;\n\n readonly #getEthQuery: (networkClientId: string) => EthQuery;\n\n readonly #getPendingTransactionTracker: (\n networkClientId: string,\n ) => PendingTransactionTracker;\n\n #boundListeners: Record<\n string,\n {\n onConfirmed: (txMeta: TransactionMeta) => void;\n onFailedOrDropped: (txMeta: TransactionMeta, error?: Error) => void;\n }\n > = {};\n\n constructor({\n publishTransaction,\n getTransaction,\n getPendingTransactionTracker,\n getEthQuery,\n }: SequentialPublishBatchHookOptions) {\n this.#publishTransaction = publishTransaction;\n this.#getTransaction = getTransaction;\n this.#getEthQuery = getEthQuery;\n this.#getPendingTransactionTracker = getPendingTransactionTracker;\n }\n\n /**\n * @returns The publish batch hook function.\n */\n getHook(): PublishBatchHook {\n return this.#hook.bind(this);\n }\n\n async #hook({\n from,\n networkClientId,\n transactions,\n }: PublishBatchHookRequest): Promise<PublishBatchHookResult> {\n log('Starting sequential publish batch hook', { from, networkClientId });\n\n const pendingTransactionTracker =\n this.#getPendingTransactionTracker(networkClientId);\n const results = [];\n\n for (const transaction of transactions) {\n try {\n const transactionMeta = this.#getTransaction(String(transaction.id));\n\n const transactionHash = await this.#publishTransaction(\n this.#getEthQuery(networkClientId),\n transactionMeta,\n );\n log('Transaction published', { transactionHash });\n\n const transactionUpdated = {\n ...transactionMeta,\n hash: transactionHash,\n };\n\n const confirmationPromise = this.#waitForTransactionEvent(\n pendingTransactionTracker,\n transactionUpdated.id,\n transactionUpdated.hash,\n );\n\n pendingTransactionTracker.addTransactionToPoll(transactionUpdated);\n\n await confirmationPromise;\n results.push({ transactionHash });\n } catch (error) {\n log('Batch transaction failed', { transaction, error });\n pendingTransactionTracker.stop();\n throw rpcErrors.internal(`Failed to publish batch transaction`);\n }\n }\n\n log('Sequential publish batch hook completed', { results });\n pendingTransactionTracker.stop();\n\n return { results };\n }\n\n /**\n * Waits for a transaction event (confirmed, failed, or dropped) and resolves/rejects accordingly.\n *\n * @param pendingTransactionTracker - The tracker instance to subscribe to events.\n * @param transactionId - The transaction ID.\n * @param transactionHash - The hash of the transaction.\n * @returns A promise that resolves when the transaction is confirmed or rejects if it fails or is dropped.\n */\n async #waitForTransactionEvent(\n pendingTransactionTracker: PendingTransactionTracker,\n transactionId: string,\n transactionHash: string,\n ): Promise<TransactionMeta> {\n return new Promise((resolve, reject) => {\n const onConfirmed = this.#onConfirmed.bind(\n this,\n transactionId,\n transactionHash,\n resolve,\n pendingTransactionTracker,\n );\n\n const onFailedOrDropped = this.#onFailedOrDropped.bind(\n this,\n transactionId,\n transactionHash,\n reject,\n pendingTransactionTracker,\n );\n\n this.#boundListeners[transactionId] = {\n onConfirmed,\n onFailedOrDropped,\n };\n\n pendingTransactionTracker.hub.on('transaction-confirmed', onConfirmed);\n pendingTransactionTracker.hub.on('transaction-failed', onFailedOrDropped);\n pendingTransactionTracker.hub.on(\n 'transaction-dropped',\n onFailedOrDropped,\n );\n });\n }\n\n #onConfirmed(\n transactionId: string,\n transactionHash: string,\n resolve: (txMeta: TransactionMeta) => void,\n pendingTransactionTracker: PendingTransactionTracker,\n txMeta: TransactionMeta,\n ): void {\n if (txMeta.id !== transactionId) {\n return;\n }\n\n log('Transaction confirmed', { transactionHash });\n this.#removeListeners(pendingTransactionTracker, transactionId);\n resolve(txMeta);\n }\n\n #onFailedOrDropped(\n transactionId: string,\n transactionHash: string,\n reject: (error: Error) => void,\n pendingTransactionTracker: PendingTransactionTracker,\n txMeta: TransactionMeta,\n error?: Error,\n ): void {\n if (txMeta.id !== transactionId) {\n return;\n }\n\n log('Transaction failed or dropped', { transactionHash, error });\n this.#removeListeners(pendingTransactionTracker, transactionId);\n reject(new Error(`Transaction ${transactionHash} failed or dropped.`));\n }\n\n #removeListeners(\n pendingTransactionTracker: PendingTransactionTracker,\n transactionId: string,\n ): void {\n const listeners = this.#boundListeners[transactionId];\n\n pendingTransactionTracker.hub.off(\n 'transaction-confirmed',\n listeners.onConfirmed,\n );\n pendingTransactionTracker.hub.off(\n 'transaction-failed',\n listeners.onFailedOrDropped,\n );\n pendingTransactionTracker.hub.off(\n 'transaction-dropped',\n listeners.onFailedOrDropped,\n );\n\n delete this.#boundListeners[transactionId];\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"SequentialPublishBatchHook.cjs","sourceRoot":"","sources":["../../src/hooks/SequentialPublishBatchHook.ts"],"names":[],"mappings":"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","sourcesContent":["import type EthQuery from '@metamask/eth-query';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { createModuleLogger } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\n\nimport type { PendingTransactionTracker } from '../helpers/PendingTransactionTracker';\nimport { projectLogger } from '../logger';\nimport {\n type PublishBatchHook,\n type PublishBatchHookRequest,\n type PublishBatchHookResult,\n type TransactionMeta,\n} from '../types';\n\nconst log = createModuleLogger(projectLogger, 'sequential-publish-batch-hook');\n\ntype SequentialPublishBatchHookOptions = {\n publishTransaction: (\n ethQuery: EthQuery,\n transactionMeta: TransactionMeta,\n ) => Promise<Hex>;\n getTransaction: (id: string) => TransactionMeta;\n getEthQuery: (networkClientId: string) => EthQuery;\n getPendingTransactionTracker: (\n networkClientId: string,\n ) => PendingTransactionTracker;\n};\n\n/**\n * Custom publish logic that also publishes additional sequential transactions in a batch.\n * Requires the batch to be successful to resolve.\n */\nexport class SequentialPublishBatchHook {\n readonly #publishTransaction: (\n ethQuery: EthQuery,\n transactionMeta: TransactionMeta,\n ) => Promise<Hex>;\n\n readonly #getTransaction: (id: string) => TransactionMeta;\n\n readonly #getEthQuery: (networkClientId: string) => EthQuery;\n\n readonly #getPendingTransactionTracker: (\n networkClientId: string,\n ) => PendingTransactionTracker;\n\n #boundListeners: Record<\n string,\n {\n onConfirmed: (txMeta: TransactionMeta) => void;\n onFailedOrDropped: (txMeta: TransactionMeta, error?: Error) => void;\n }\n > = {};\n\n constructor({\n publishTransaction,\n getTransaction,\n getPendingTransactionTracker,\n getEthQuery,\n }: SequentialPublishBatchHookOptions) {\n this.#publishTransaction = publishTransaction;\n this.#getTransaction = getTransaction;\n this.#getEthQuery = getEthQuery;\n this.#getPendingTransactionTracker = getPendingTransactionTracker;\n }\n\n /**\n * @returns The publish batch hook function.\n */\n getHook(): PublishBatchHook {\n return this.#hook.bind(this);\n }\n\n async #hook({\n from,\n networkClientId,\n transactions,\n }: PublishBatchHookRequest): Promise<PublishBatchHookResult> {\n log('Starting sequential publish batch hook', { from, networkClientId });\n\n const pendingTransactionTracker =\n this.#getPendingTransactionTracker(networkClientId);\n const results = [];\n\n for (const transaction of transactions) {\n try {\n const transactionMeta = this.#getTransaction(String(transaction.id));\n\n const transactionHash = await this.#publishTransaction(\n this.#getEthQuery(networkClientId),\n transactionMeta,\n );\n log('Transaction published', { transactionHash });\n\n const transactionUpdated = {\n ...transactionMeta,\n hash: transactionHash,\n };\n\n const confirmationPromise = this.#waitForTransactionEvent(\n pendingTransactionTracker,\n transactionUpdated.id,\n transactionUpdated.hash,\n );\n\n pendingTransactionTracker.addTransactionToPoll(transactionUpdated);\n\n await confirmationPromise;\n results.push({ transactionHash });\n } catch (error) {\n log('Batch transaction failed', { transaction, error });\n pendingTransactionTracker.stop();\n throw rpcErrors.internal(`Failed to publish batch transaction`);\n }\n }\n\n log('Sequential publish batch hook completed', { results });\n pendingTransactionTracker.stop();\n\n return { results };\n }\n\n /**\n * Waits for a transaction event (confirmed, failed, or dropped) and resolves/rejects accordingly.\n *\n * @param pendingTransactionTracker - The tracker instance to subscribe to events.\n * @param transactionId - The transaction ID.\n * @param transactionHash - The hash of the transaction.\n * @returns A promise that resolves when the transaction is confirmed or rejects if it fails or is dropped.\n */\n async #waitForTransactionEvent(\n pendingTransactionTracker: PendingTransactionTracker,\n transactionId: string,\n transactionHash: string,\n ): Promise<TransactionMeta> {\n return new Promise((resolve, reject) => {\n const onConfirmed = this.#onConfirmed.bind(\n this,\n transactionId,\n transactionHash,\n resolve,\n pendingTransactionTracker,\n );\n\n const onFailedOrDropped = this.#onFailedOrDropped.bind(\n this,\n transactionId,\n transactionHash,\n reject,\n pendingTransactionTracker,\n );\n\n this.#boundListeners[transactionId] = {\n onConfirmed,\n onFailedOrDropped,\n };\n\n pendingTransactionTracker.hub.on('transaction-confirmed', onConfirmed);\n pendingTransactionTracker.hub.on('transaction-failed', onFailedOrDropped);\n pendingTransactionTracker.hub.on(\n 'transaction-dropped',\n onFailedOrDropped,\n );\n });\n }\n\n #onConfirmed(\n transactionId: string,\n transactionHash: string,\n resolve: (txMeta: TransactionMeta) => void,\n pendingTransactionTracker: PendingTransactionTracker,\n txMeta: TransactionMeta,\n ): void {\n if (txMeta.id !== transactionId) {\n return;\n }\n\n log('Transaction confirmed', { transactionHash });\n this.#removeListeners(pendingTransactionTracker, transactionId);\n resolve(txMeta);\n }\n\n #onFailedOrDropped(\n transactionId: string,\n transactionHash: string,\n reject: (error: Error) => void,\n pendingTransactionTracker: PendingTransactionTracker,\n txMeta: TransactionMeta,\n error?: Error,\n ): void {\n if (txMeta.id !== transactionId) {\n return;\n }\n\n log('Transaction failed or dropped', { transactionHash, error });\n this.#removeListeners(pendingTransactionTracker, transactionId);\n reject(new Error(`Transaction ${transactionHash} failed or dropped.`));\n }\n\n #removeListeners(\n pendingTransactionTracker: PendingTransactionTracker,\n transactionId: string,\n ): void {\n const listeners = this.#boundListeners[transactionId];\n\n pendingTransactionTracker.hub.off(\n 'transaction-confirmed',\n listeners.onConfirmed,\n );\n pendingTransactionTracker.hub.off(\n 'transaction-failed',\n listeners.onFailedOrDropped,\n );\n pendingTransactionTracker.hub.off(\n 'transaction-dropped',\n listeners.onFailedOrDropped,\n );\n\n delete this.#boundListeners[transactionId];\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SequentialPublishBatchHook.mjs","sourceRoot":"","sources":["../../src/hooks/SequentialPublishBatchHook.ts"],"names":[],"mappings":"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","sourcesContent":["import type EthQuery from '@metamask/eth-query';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { createModuleLogger } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\n\nimport type { PendingTransactionTracker } from '../helpers/PendingTransactionTracker';\nimport { projectLogger } from '../logger';\nimport {\n type PublishBatchHook,\n type PublishBatchHookRequest,\n type PublishBatchHookResult,\n type TransactionMeta,\n} from '../types';\n\nconst log = createModuleLogger(projectLogger, 'sequential-publish-batch-hook');\n\ntype SequentialPublishBatchHookOptions = {\n publishTransaction: (\n ethQuery: EthQuery,\n transactionMeta: TransactionMeta,\n ) => Promise<Hex>;\n getTransaction: (id: string) => TransactionMeta;\n getEthQuery: (networkClientId: string) => EthQuery;\n getPendingTransactionTracker: (\n networkClientId: string,\n ) => PendingTransactionTracker;\n};\n\n/**\n * Custom publish logic that also publishes additional sequential transactions in a batch.\n * Requires the batch to be successful to resolve.\n */\nexport class SequentialPublishBatchHook {\n readonly #publishTransaction: (\n ethQuery: EthQuery,\n transactionMeta: TransactionMeta,\n ) => Promise<Hex>;\n\n readonly #getTransaction: (id: string) => TransactionMeta;\n\n readonly #getEthQuery: (networkClientId: string) => EthQuery;\n\n readonly #getPendingTransactionTracker: (\n networkClientId: string,\n ) => PendingTransactionTracker;\n\n #boundListeners: Record<\n string,\n {\n onConfirmed: (txMeta: TransactionMeta) => void;\n onFailedOrDropped: (txMeta: TransactionMeta, error?: Error) => void;\n }\n > = {};\n\n constructor({\n publishTransaction,\n getTransaction,\n getPendingTransactionTracker,\n getEthQuery,\n }: SequentialPublishBatchHookOptions) {\n this.#publishTransaction = publishTransaction;\n this.#getTransaction = getTransaction;\n this.#getEthQuery = getEthQuery;\n this.#getPendingTransactionTracker = getPendingTransactionTracker;\n }\n\n /**\n * @returns The publish batch hook function.\n */\n getHook(): PublishBatchHook {\n return this.#hook.bind(this);\n }\n\n async #hook({\n from,\n networkClientId,\n transactions,\n }: PublishBatchHookRequest): Promise<PublishBatchHookResult> {\n log('Starting sequential publish batch hook', { from, networkClientId });\n\n const pendingTransactionTracker =\n this.#getPendingTransactionTracker(networkClientId);\n const results = [];\n\n for (const transaction of transactions) {\n try {\n const transactionMeta = this.#getTransaction(String(transaction.id));\n\n const transactionHash = await this.#publishTransaction(\n this.#getEthQuery(networkClientId),\n transactionMeta,\n );\n log('Transaction published', { transactionHash });\n\n const transactionUpdated = {\n ...transactionMeta,\n hash: transactionHash,\n };\n\n const confirmationPromise = this.#waitForTransactionEvent(\n pendingTransactionTracker,\n transactionUpdated.id,\n transactionUpdated.hash,\n );\n\n pendingTransactionTracker.addTransactionToPoll(transactionUpdated);\n\n await confirmationPromise;\n results.push({ transactionHash });\n } catch (error) {\n log('Batch transaction failed', { transaction, error });\n pendingTransactionTracker.stop();\n throw rpcErrors.internal(`Failed to publish batch transaction`);\n }\n }\n\n log('Sequential publish batch hook completed', { results });\n pendingTransactionTracker.stop();\n\n return { results };\n }\n\n /**\n * Waits for a transaction event (confirmed, failed, or dropped) and resolves/rejects accordingly.\n *\n * @param pendingTransactionTracker - The tracker instance to subscribe to events.\n * @param transactionId - The transaction ID.\n * @param transactionHash - The hash of the transaction.\n * @returns A promise that resolves when the transaction is confirmed or rejects if it fails or is dropped.\n */\n async #waitForTransactionEvent(\n pendingTransactionTracker: PendingTransactionTracker,\n transactionId: string,\n transactionHash: string,\n ): Promise<TransactionMeta> {\n return new Promise((resolve, reject) => {\n const onConfirmed = this.#onConfirmed.bind(\n this,\n transactionId,\n transactionHash,\n resolve,\n pendingTransactionTracker,\n );\n\n const onFailedOrDropped = this.#onFailedOrDropped.bind(\n this,\n transactionId,\n transactionHash,\n reject,\n pendingTransactionTracker,\n );\n\n this.#boundListeners[transactionId] = {\n onConfirmed,\n onFailedOrDropped,\n };\n\n pendingTransactionTracker.hub.on('transaction-confirmed', onConfirmed);\n pendingTransactionTracker.hub.on('transaction-failed', onFailedOrDropped);\n pendingTransactionTracker.hub.on(\n 'transaction-dropped',\n onFailedOrDropped,\n );\n });\n }\n\n #onConfirmed(\n transactionId: string,\n transactionHash: string,\n resolve: (txMeta: TransactionMeta) => void,\n pendingTransactionTracker: PendingTransactionTracker,\n txMeta: TransactionMeta,\n ): void {\n if (txMeta.id !== transactionId) {\n return;\n }\n\n log('Transaction confirmed', { transactionHash });\n this.#removeListeners(pendingTransactionTracker, transactionId);\n resolve(txMeta);\n }\n\n #onFailedOrDropped(\n transactionId: string,\n transactionHash: string,\n reject: (error: Error) => void,\n pendingTransactionTracker: PendingTransactionTracker,\n txMeta: TransactionMeta,\n error?: Error,\n ): void {\n if (txMeta.id !== transactionId) {\n return;\n }\n\n log('Transaction failed or dropped', { transactionHash, error });\n this.#removeListeners(pendingTransactionTracker, transactionId);\n reject(new Error(`Transaction ${transactionHash} failed or dropped.`));\n }\n\n #removeListeners(\n pendingTransactionTracker: PendingTransactionTracker,\n transactionId: string,\n ): void {\n const listeners = this.#boundListeners[transactionId];\n\n pendingTransactionTracker.hub.off(\n 'transaction-confirmed',\n listeners.onConfirmed,\n );\n pendingTransactionTracker.hub.off(\n 'transaction-failed',\n listeners.onFailedOrDropped,\n );\n pendingTransactionTracker.hub.off(\n 'transaction-dropped',\n listeners.onFailedOrDropped,\n );\n\n delete this.#boundListeners[transactionId];\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"SequentialPublishBatchHook.mjs","sourceRoot":"","sources":["../../src/hooks/SequentialPublishBatchHook.ts"],"names":[],"mappings":"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","sourcesContent":["import type EthQuery from '@metamask/eth-query';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { createModuleLogger } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\n\nimport type { PendingTransactionTracker } from '../helpers/PendingTransactionTracker';\nimport { projectLogger } from '../logger';\nimport {\n type PublishBatchHook,\n type PublishBatchHookRequest,\n type PublishBatchHookResult,\n type TransactionMeta,\n} from '../types';\n\nconst log = createModuleLogger(projectLogger, 'sequential-publish-batch-hook');\n\ntype SequentialPublishBatchHookOptions = {\n publishTransaction: (\n ethQuery: EthQuery,\n transactionMeta: TransactionMeta,\n ) => Promise<Hex>;\n getTransaction: (id: string) => TransactionMeta;\n getEthQuery: (networkClientId: string) => EthQuery;\n getPendingTransactionTracker: (\n networkClientId: string,\n ) => PendingTransactionTracker;\n};\n\n/**\n * Custom publish logic that also publishes additional sequential transactions in a batch.\n * Requires the batch to be successful to resolve.\n */\nexport class SequentialPublishBatchHook {\n readonly #publishTransaction: (\n ethQuery: EthQuery,\n transactionMeta: TransactionMeta,\n ) => Promise<Hex>;\n\n readonly #getTransaction: (id: string) => TransactionMeta;\n\n readonly #getEthQuery: (networkClientId: string) => EthQuery;\n\n readonly #getPendingTransactionTracker: (\n networkClientId: string,\n ) => PendingTransactionTracker;\n\n #boundListeners: Record<\n string,\n {\n onConfirmed: (txMeta: TransactionMeta) => void;\n onFailedOrDropped: (txMeta: TransactionMeta, error?: Error) => void;\n }\n > = {};\n\n constructor({\n publishTransaction,\n getTransaction,\n getPendingTransactionTracker,\n getEthQuery,\n }: SequentialPublishBatchHookOptions) {\n this.#publishTransaction = publishTransaction;\n this.#getTransaction = getTransaction;\n this.#getEthQuery = getEthQuery;\n this.#getPendingTransactionTracker = getPendingTransactionTracker;\n }\n\n /**\n * @returns The publish batch hook function.\n */\n getHook(): PublishBatchHook {\n return this.#hook.bind(this);\n }\n\n async #hook({\n from,\n networkClientId,\n transactions,\n }: PublishBatchHookRequest): Promise<PublishBatchHookResult> {\n log('Starting sequential publish batch hook', { from, networkClientId });\n\n const pendingTransactionTracker =\n this.#getPendingTransactionTracker(networkClientId);\n const results = [];\n\n for (const transaction of transactions) {\n try {\n const transactionMeta = this.#getTransaction(String(transaction.id));\n\n const transactionHash = await this.#publishTransaction(\n this.#getEthQuery(networkClientId),\n transactionMeta,\n );\n log('Transaction published', { transactionHash });\n\n const transactionUpdated = {\n ...transactionMeta,\n hash: transactionHash,\n };\n\n const confirmationPromise = this.#waitForTransactionEvent(\n pendingTransactionTracker,\n transactionUpdated.id,\n transactionUpdated.hash,\n );\n\n pendingTransactionTracker.addTransactionToPoll(transactionUpdated);\n\n await confirmationPromise;\n results.push({ transactionHash });\n } catch (error) {\n log('Batch transaction failed', { transaction, error });\n pendingTransactionTracker.stop();\n throw rpcErrors.internal(`Failed to publish batch transaction`);\n }\n }\n\n log('Sequential publish batch hook completed', { results });\n pendingTransactionTracker.stop();\n\n return { results };\n }\n\n /**\n * Waits for a transaction event (confirmed, failed, or dropped) and resolves/rejects accordingly.\n *\n * @param pendingTransactionTracker - The tracker instance to subscribe to events.\n * @param transactionId - The transaction ID.\n * @param transactionHash - The hash of the transaction.\n * @returns A promise that resolves when the transaction is confirmed or rejects if it fails or is dropped.\n */\n async #waitForTransactionEvent(\n pendingTransactionTracker: PendingTransactionTracker,\n transactionId: string,\n transactionHash: string,\n ): Promise<TransactionMeta> {\n return new Promise((resolve, reject) => {\n const onConfirmed = this.#onConfirmed.bind(\n this,\n transactionId,\n transactionHash,\n resolve,\n pendingTransactionTracker,\n );\n\n const onFailedOrDropped = this.#onFailedOrDropped.bind(\n this,\n transactionId,\n transactionHash,\n reject,\n pendingTransactionTracker,\n );\n\n this.#boundListeners[transactionId] = {\n onConfirmed,\n onFailedOrDropped,\n };\n\n pendingTransactionTracker.hub.on('transaction-confirmed', onConfirmed);\n pendingTransactionTracker.hub.on('transaction-failed', onFailedOrDropped);\n pendingTransactionTracker.hub.on(\n 'transaction-dropped',\n onFailedOrDropped,\n );\n });\n }\n\n #onConfirmed(\n transactionId: string,\n transactionHash: string,\n resolve: (txMeta: TransactionMeta) => void,\n pendingTransactionTracker: PendingTransactionTracker,\n txMeta: TransactionMeta,\n ): void {\n if (txMeta.id !== transactionId) {\n return;\n }\n\n log('Transaction confirmed', { transactionHash });\n this.#removeListeners(pendingTransactionTracker, transactionId);\n resolve(txMeta);\n }\n\n #onFailedOrDropped(\n transactionId: string,\n transactionHash: string,\n reject: (error: Error) => void,\n pendingTransactionTracker: PendingTransactionTracker,\n txMeta: TransactionMeta,\n error?: Error,\n ): void {\n if (txMeta.id !== transactionId) {\n return;\n }\n\n log('Transaction failed or dropped', { transactionHash, error });\n this.#removeListeners(pendingTransactionTracker, transactionId);\n reject(new Error(`Transaction ${transactionHash} failed or dropped.`));\n }\n\n #removeListeners(\n pendingTransactionTracker: PendingTransactionTracker,\n transactionId: string,\n ): void {\n const listeners = this.#boundListeners[transactionId];\n\n pendingTransactionTracker.hub.off(\n 'transaction-confirmed',\n listeners.onConfirmed,\n );\n pendingTransactionTracker.hub.off(\n 'transaction-failed',\n listeners.onFailedOrDropped,\n );\n pendingTransactionTracker.hub.off(\n 'transaction-dropped',\n listeners.onFailedOrDropped,\n );\n\n delete this.#boundListeners[transactionId];\n }\n}\n"]}
|