UNPKG

@tevm/tx

Version:

A custom implementation of ethereumjs tx

1 lines 4.25 kB
{"version":3,"sources":["../src/createImpersonatedTx.js"],"names":["tx","FeeMarket1559Tx","InternalError","InvalidGasLimitError","keccak256"],"mappings":";;;;;;;AAoBO,IAAM,oBAAA,GAAuB,CAAC,MAAA,EAAQ,IAAA,KAAS;AAIrD,EAAA,IAAIA,IAAA;AACJ,EAAA,IAAI;AACH,IAAAA,IAAA,GAAK,IAAIC,kBAAA,CAAgB,MAAA,EAAQ,IAAI,CAAA;AAAA,EACtC,SAAS,CAAA,EAAG;AACX,IAAA,IAAI,EAAE,aAAa,KAAA,CAAA,EAAQ;AAC1B,MAAA,MAAM,IAAIC,oBAAA,CAAc,eAAA,EAAiB,EAAE,KAAA;AAAA;AAAA,QAAwB;AAAA,OAAA,EAAI,CAAA;AAAA,IACxE;AACA,IAAA,IAAI,CAAA,CAAE,OAAA,CAAQ,QAAA,CAAS,gCAAgC,CAAA,EAAG;AACzD,MAAA,MAAM,IAAIA,oBAAA;AAAA,QACT,0GAAA;AAAA,QACA,EAAE,OAAO,CAAA;AAAE,OACZ;AAAA,IACD;AACA,IAAA,IACC,CAAA,CAAE,QAAQ,QAAA,CAAS,4CAA4C,KAC/D,CAAA,CAAE,OAAA,CAAQ,QAAA,CAAS,6DAA6D,CAAA,EAC/E;AACD,MAAA,MAAM,IAAIC,2BAAA,CAAqB,CAAA,CAAE,SAAS,EAAE,KAAA,EAAO,GAAG,CAAA;AAAA,IACvD;AACA,IAAA,IACC,EAAE,OAAA,CAAQ,QAAA;AAAA,MACT;AAAA,KACD,EACC;AACD,MAAA,MAAM,IAAIA,2BAAA,CAAqB,CAAA,CAAE,SAAS,EAAE,KAAA,EAAO,GAAG,CAAA;AAAA,IACvD;AACA,IAAA,MAAM,IAAID,oBAAA,CAAc,CAAA,CAAE,SAAS,EAAE,KAAA,EAAO,GAAG,CAAA;AAAA,EAChD;AACA,EAAA;AAAA;AAAA,IACC,IAAI,MAAMF,IAAA,EAAI;AAAA,MACb,GAAA,CAAI,QAAQ,IAAA,EAAM;AACjB,QAAA,IAAI,SAAS,gBAAA,EAAkB;AAC9B,UAAA,OAAO,IAAA;AAAA,QACR;AACA,QAAA,IAAI,SAAS,MAAA,EAAQ;AACpB,UAAA,OAAO,MAAM;AACZ,YAAA,IAAI;AACH,cAAA,OAAO,OAAO,IAAA,EAAK;AAAA,YACpB,SAAS,EAAA,EAAI;AACZ,cAAA,OAAOI,eAAA,CAAU,MAAA,CAAO,sBAAA,EAAuB,EAAG,OAAO,CAAA;AAAA,YAC1D;AAAA,UACD,CAAA;AAAA,QACD;AACA,QAAA,IAAI,SAAS,UAAA,EAAY;AACxB,UAAA,OAAO,MAAM,IAAA;AAAA,QACd;AACA,QAAA,IAAI,SAAS,kBAAA,EAAoB;AAChC,UAAA,OAAO,MAAM,MAAA,CAAO,mBAAA;AAAA,QACrB;AACA,QAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA;AAAA,MAChC;AAAA,KACA;AAAA;AAEH","file":"index.cjs","sourcesContent":["import { FeeMarket1559Tx } from '@ethereumjs/tx'\nimport { InternalError, InvalidGasLimitError } from '@tevm/errors'\nimport { EthjsAddress, keccak256 } from '@tevm/utils'\n\n/**\n * @typedef {InternalError | InvalidGasLimitError} CreateImpersonatedTxError\n */\n\n/**\n * Creates an impersonated tx that wraps {@link FeeMarket1559Tx}.\n * Wraps following methods\n * - 'isImpersonated'\n * - 'hash'\n * - 'isSigned'\n * - 'getSenderAddress'\n * @throws {CreateImpersonatedTxError} Error if the constructor for {@link FeeMarket1559Tx} throws\n * @param {import(\"@ethereumjs/tx\").FeeMarketEIP1559TxData & {impersonatedAddress: EthjsAddress}} txData\n * @param {import(\"@ethereumjs/tx\").TxOptions} [opts]\n * @returns {import('./ImpersonatedTx.js').ImpersonatedTx}\n */\nexport const createImpersonatedTx = (txData, opts) => {\n\t/**\n\t * @type {FeeMarket1559Tx}\n\t */\n\tlet tx\n\ttry {\n\t\ttx = new FeeMarket1559Tx(txData, opts)\n\t} catch (e) {\n\t\tif (!(e instanceof Error)) {\n\t\t\tthrow new InternalError('Unknown Error', { cause: /** @type any*/ (e) })\n\t\t}\n\t\tif (e.message.includes('EIP-1559 not enabled on Common')) {\n\t\t\tthrow new InternalError(\n\t\t\t\t'EIP-1559 is not enabled on Common. Tevm currently only supports 1559 and it should be enabled by default',\n\t\t\t\t{ cause: e },\n\t\t\t)\n\t\t}\n\t\tif (\n\t\t\te.message.includes('gasLimit cannot exceed MAX_UINT64 (2^64-1)') ||\n\t\t\te.message.includes('gasLimit * maxFeePerGas cannot exceed MAX_INTEGER (2^256-1)')\n\t\t) {\n\t\t\tthrow new InvalidGasLimitError(e.message, { cause: e })\n\t\t}\n\t\tif (\n\t\t\te.message.includes(\n\t\t\t\t'maxFeePerGas cannot be less than maxPriorityFeePerGas (The total must be the larger of the two)',\n\t\t\t)\n\t\t) {\n\t\t\tthrow new InvalidGasLimitError(e.message, { cause: e })\n\t\t}\n\t\tthrow new InternalError(e.message, { cause: e })\n\t}\n\treturn /** @type {import('./ImpersonatedTx.js').ImpersonatedTx}*/ (\n\t\tnew Proxy(tx, {\n\t\t\tget(target, prop) {\n\t\t\t\tif (prop === 'isImpersonated') {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\tif (prop === 'hash') {\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\treturn target.hash()\n\t\t\t\t\t\t} catch (_e) {\n\t\t\t\t\t\t\treturn keccak256(target.getHashedMessageToSign(), 'bytes')\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (prop === 'isSigned') {\n\t\t\t\t\treturn () => true\n\t\t\t\t}\n\t\t\t\tif (prop === 'getSenderAddress') {\n\t\t\t\t\treturn () => txData.impersonatedAddress\n\t\t\t\t}\n\t\t\t\treturn Reflect.get(target, prop)\n\t\t\t},\n\t\t})\n\t)\n}\n"]}