{"record":{"id":"b3f4a6107ebf9549","repo":"shardeum/shardeum","slug":"cannot-run-transaction-eip-2930-is-not-activated","errorCode":null,"errorMessage":"Cannot run transaction: EIP 2930 is not activated.","messagePattern":"Cannot run transaction: EIP 2930 is not activated\\.","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/vm_v7/runTx.ts","lineNumber":116,"sourceCode":"  await evm.journal.cleanup()\n\n  if (opts.reportAccessList === true) {\n    evm.journal.startReportingAccessList()\n  }\n\n  await evm.journal.checkpoint()\n  if (this.DEBUG) {\n    debug('-'.repeat(100))\n    debug(`tx checkpoint`)\n  }\n\n  // Typed transaction specific setup tasks\n  if (opts.tx.supports(Capability.EIP2718TypedTransaction) && this.common.isActivatedEIP(2718) === true) {\n    // Is it an Access List transaction?\n    if (this.common.isActivatedEIP(2930) === false) {\n      await evm.journal.revert('runTx: EIP 2930 not activated')\n      const msg = _errorMsg('Cannot run transaction: EIP 2930 is not activated.', this, opts.block, opts.tx)\n      throw new Error(msg)\n    }\n    if (opts.tx.supports(Capability.EIP1559FeeMarket) && this.common.isActivatedEIP(1559) === false) {\n      await evm.journal.revert('runTx: EIP 1559 not activated')\n      const msg = _errorMsg('Cannot run transaction: EIP 1559 is not activated.', this, opts.block, opts.tx)\n      throw new Error(msg)\n    }\n\n    const castedTx = <AccessListEIP2930Transaction>opts.tx\n\n    for (const accessListItem of castedTx.AccessListJSON) {\n      evm.journal.addAlwaysWarmAddress(accessListItem.address, true)\n      for (const storageKey of accessListItem.storageKeys) {\n        evm.journal.addAlwaysWarmSlot(accessListItem.address, storageKey, true)\n      }\n    }\n  }\n\n  // chainId validation","sourceCodeStart":98,"sourceCodeEnd":134,"githubUrl":"https://github.com/shardeum/shardeum/blob/0c454caf067f7b896569eabdd5f47cb8b61738b3/src/vm_v7/runTx.ts#L98-L134","documentation":"runTx detected an access-list (type-1, EIP-2930) typed transaction but the chain's common does not have EIP-2930 activated at the current block. Typed tx support requires the corresponding hardfork (Berlin) to be active.","triggerScenarios":"Submitting a type-1 access-list tx on a chain whose common hardfork is pre-Berlin; genesis config missing the Berlin fork block; passing a custom Common with wrong fork schedule.","commonSituations":"Custom chain genesis that skips/omits Berlin; using a stale Common object after a hardfork config change; test commons built with default mainnet settings but a lower fork block.","solutions":["Activate EIP-2930/Berlin in the chain's common/genesis config for the executing block height","Send a legacy (type-0) tx instead if the chain intentionally stays pre-Berlin","Verify common.isActivatedEIP(2930) before routing typed txs into runTx"],"exampleFix":"// before\nconst common = Common.custom({ chainId, genesis }, { hardfork: 'Istanbul' })\n\n// after\nconst common = Common.custom({ chainId, genesis, hardforkHistory: { ...defaults, berlin: 0 } })","handlingStrategy":"validation","validationCode":"if (tx.supports(Capability.EIP2930AccessList) && !common.isActivatedEIP(2930)) {\n  downgradeToLegacyTx(tx)\n}","typeGuard":"const isAccessListTx = (tx: TypedTransaction): tx is AccessListEIP2930Transaction =>\n  tx.supports(Capability.EIP2930AccessList)","tryCatchPattern":null,"preventionTips":["Align tx types with chain fork schedule","Test typed txs against the activated hardfork"],"tags":["eip-2930","hardfork","access-list","evm"],"backgroundTag":"eip-not-activated","analyzedSha":"0c454caf067f7b896569eabdd5f47cb8b61738b3","analyzedAt":"2026-08-28T11:43:29.666Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}