Skip to content

Commit beae8ea

Browse files
AryaLanjewar3005mohammeds19920xNilesh
authored
feat: pushchain/evm v0.2.0 to 0.3.2 upgrade changes (#223)
* 0.3.2 evm upgrade changes * fix: (evm 0.3.2) wrap CallEVMWithData in CacheContext to prevent gas-meter overflow on reverts * fix: go.mod and go.sum for evm-0.3.2 update * upgrade handler for 0.3.2 evm upgrade added * fix: handle EVM_CHAIN_ID when chain id needs to be replaced. * refactor: merge upgrade handlers --------- Co-authored-by: Mohammed S <shoaibmohammed92@gmail.com> Co-authored-by: Nilesh Gupta <guptanilesh2312@gmail.com>
1 parent c8ef15f commit beae8ea

14 files changed

Lines changed: 276 additions & 135 deletions

File tree

.github/workflows/release.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ jobs:
123123
- name: Patch chain ID for production
124124
run: |
125125
sed -i 's/"localchain_9000-1"/"push_42101-1"/' app/app.go
126+
sed -i 's/EVMChainID = uint64(9000)/EVMChainID = uint64(42101)/' app/app.go
126127
grep -n "ChainID" app/app.go
127128
128129
- name: Build Linux binary
@@ -247,6 +248,7 @@ jobs:
247248
- name: Patch chain ID for production
248249
run: |
249250
sed -i 's/"localchain_9000-1"/"push_42101-1"/' app/app.go
251+
sed -i 's/EVMChainID = uint64(9000)/EVMChainID = uint64(42101)/' app/app.go
250252
grep -n "ChainID" app/app.go
251253
252254
- name: Build Linux ARM64 binary
@@ -390,6 +392,7 @@ jobs:
390392
- name: Patch chain ID for production
391393
run: |
392394
sed -i '' 's/"localchain_9000-1"/"push_42101-1"/' app/app.go
395+
sed -i '' 's/EVMChainID = uint64(9000)/EVMChainID = uint64(42101)/' app/app.go
393396
grep -n "ChainID" app/app.go
394397
395398
- name: Build Mac Binary (ARM64 only - native build)

app/ante/ante_evm.go

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,36 @@
11
package ante
22

33
import (
4+
"time"
5+
46
sdk "github.com/cosmos/cosmos-sdk/types"
57
evmante "github.com/cosmos/evm/ante/evm"
8+
anteinterfaces "github.com/cosmos/evm/ante/interfaces"
69
)
710

11+
// evmAccountKeeperWrapper adapts push-chain's AccountKeeper to satisfy the
12+
// cosmos/evm interfaces.AccountKeeper, which requires unordered-tx methods not
13+
// present in cosmos-sdk v0.50.x. Stubs return safe no-op values because
14+
// unordered transactions are not enabled on this chain.
15+
type evmAccountKeeperWrapper struct {
16+
AccountKeeper
17+
}
18+
19+
var _ anteinterfaces.AccountKeeper = evmAccountKeeperWrapper{}
20+
21+
func (w evmAccountKeeperWrapper) UnorderedTransactionsEnabled() bool { return false }
22+
23+
func (w evmAccountKeeperWrapper) RemoveExpiredUnorderedNonces(_ sdk.Context) error { return nil }
24+
25+
func (w evmAccountKeeperWrapper) TryAddUnorderedNonce(_ sdk.Context, _ []byte, _ time.Time) error {
26+
return nil
27+
}
28+
829
// newMonoEVMAnteHandler creates the sdk.AnteHandler implementation for the EVM transactions.
930
func newMonoEVMAnteHandler(options HandlerOptions) sdk.AnteHandler {
1031
return sdk.ChainAnteDecorators(
1132
evmante.NewEVMMonoDecorator(
12-
options.AccountKeeper,
33+
evmAccountKeeperWrapper{options.AccountKeeper},
1334
options.FeeMarketKeeper,
1435
options.EvmKeeper,
1536
options.MaxTxGasWanted,

app/app.go

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"path/filepath"
1010
"sort"
1111
"sync"
12+
"time"
1213

1314
autocliv1 "cosmossdk.io/api/cosmos/autocli/v1"
1415
reflectionv1 "cosmossdk.io/api/cosmos/reflection/v1"
@@ -185,7 +186,8 @@ const (
185186
NodeDir = ".pchain"
186187
Bech32Prefix = "push"
187188

188-
ChainID = "localchain_9000-1"
189+
ChainID = "localchain_9000-1"
190+
EVMChainID = uint64(9000)
189191
)
190192

191193
var (
@@ -198,6 +200,20 @@ var (
198200
}
199201
)
200202

203+
// authKeeperEVMWrapper adapts cosmos-sdk v0.50.x AccountKeeper to satisfy the
204+
// cosmos/evm AccountKeeper interfaces, which require unordered-tx methods not
205+
// present in sdk v0.50. Stubs are safe no-ops because this chain does not
206+
// enable unordered transactions.
207+
type authKeeperEVMWrapper struct {
208+
authkeeper.AccountKeeper
209+
}
210+
211+
func (w authKeeperEVMWrapper) UnorderedTransactionsEnabled() bool { return false }
212+
func (w authKeeperEVMWrapper) RemoveExpiredUnorderedNonces(_ sdk.Context) error { return nil }
213+
func (w authKeeperEVMWrapper) TryAddUnorderedNonce(_ sdk.Context, _ []byte, _ time.Time) error {
214+
return nil
215+
}
216+
201217
func init() {
202218
// manually update the power reduction based on the base denom unit (10^18 [evm] or 10^6 [cosmos])
203219
sdk.DefaultPowerReduction = math.NewIntFromBigInt(new(big.Int).Exp(big.NewInt(10), big.NewInt(BaseDenomUnit), nil))
@@ -345,7 +361,7 @@ func NewChainApp(
345361

346362
// TODO: verify
347363

348-
encodingConfig := cosmosevmencoding.MakeConfig()
364+
encodingConfig := cosmosevmencoding.MakeConfig(EVMChainID)
349365
interfaceRegistry := encodingConfig.InterfaceRegistry
350366
appCodec := encodingConfig.Codec
351367
legacyAmino := encodingConfig.Amino
@@ -686,11 +702,13 @@ func NewChainApp(
686702
appCodec,
687703
keys[evmtypes.StoreKey],
688704
tkeys[evmtypes.TransientKey],
705+
keys,
689706
authtypes.NewModuleAddress(govtypes.ModuleName),
690-
app.AccountKeeper,
707+
authKeeperEVMWrapper{app.AccountKeeper},
691708
app.BankKeeper,
692709
app.StakingKeeper,
693710
app.FeeMarketKeeper,
711+
app.ConsensusParamsKeeper,
694712
&app.Erc20Keeper,
695713
tracer,
696714
)
@@ -776,6 +794,7 @@ func NewChainApp(
776794
app.GovKeeper,
777795
app.SlashingKeeper,
778796
app.EvidenceKeeper,
797+
appCodec,
779798
)
780799

781800
// Add the usigverifier precompile for Ed25519 verification (old address: 0xCA)
@@ -1027,7 +1046,7 @@ func NewChainApp(
10271046
packetforward.NewAppModule(app.PacketForwardKeeper, app.GetSubspace(packetforwardtypes.ModuleName)),
10281047
wasmlc.NewAppModule(app.WasmClientKeeper),
10291048
ratelimit.NewAppModule(appCodec, app.RatelimitKeeper),
1030-
vm.NewAppModule(app.EVMKeeper, app.AccountKeeper),
1049+
vm.NewAppModule(app.EVMKeeper, authKeeperEVMWrapper{app.AccountKeeper}, app.AccountKeeper.AddressCodec()),
10311050
feemarket.NewAppModule(app.FeeMarketKeeper),
10321051
erc20.NewAppModule(app.Erc20Keeper, app.AccountKeeper),
10331052
uexecutor.NewAppModule(appCodec, app.UexecutorKeeper, app.EVMKeeper, app.FeeMarketKeeper, app.BankKeeper, app.AccountKeeper, app.UregistryKeeper, app.UvalidatorKeeper),
@@ -1437,7 +1456,7 @@ func (a *ChainApp) DefaultGenesis() map[string]json.RawMessage {
14371456
// which is the base denomination of the chain (i.e. the WTOKEN contract)
14381457
erc20GenState := erc20types.DefaultGenesisState()
14391458
erc20GenState.TokenPairs = ExampleTokenPairs
1440-
erc20GenState.Params.NativePrecompiles = append(erc20GenState.Params.NativePrecompiles, WTokenContractMainnet)
1459+
erc20GenState.NativePrecompiles = append(erc20GenState.NativePrecompiles, WTokenContractMainnet)
14411460
genesis[erc20types.ModuleName] = a.appCodec.MustMarshalJSON(erc20GenState)
14421461

14431462
return genesis
@@ -1560,7 +1579,7 @@ func BlockedAddresses() map[string]bool {
15601579
}
15611580

15621581
for _, precompile := range blockedPrecompilesHex {
1563-
blockedAddrs[cosmosevmutils.EthHexToCosmosAddr(precompile).String()] = true
1582+
blockedAddrs[cosmosevmutils.Bech32StringFromHexAddress(precompile)] = true
15641583
}
15651584

15661585
return blockedAddrs

app/config.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func EVMAppOptions(chainID string) error {
5959
return err
6060
}
6161

62-
ethCfg := evmtypes.DefaultChainConfig(chainID)
62+
ethCfg := evmtypes.DefaultChainConfig(EVMChainID)
6363

6464
err := evmtypes.NewEVMConfigurator().
6565
WithChainConfig(ethCfg).

app/precompiles.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"maps"
66

77
evidencekeeper "cosmossdk.io/x/evidence/keeper"
8+
"github.com/cosmos/cosmos-sdk/codec"
89
distributionkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper"
910
govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper"
1011
slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper"
@@ -43,6 +44,7 @@ func NewAvailableStaticPrecompiles(
4344
govKeeper govkeeper.Keeper,
4445
slashingKeeper slashingkeeper.Keeper,
4546
evidenceKeeper evidencekeeper.Keeper,
47+
appCodec codec.Codec,
4648
) map[common.Address]vm.PrecompiledContract {
4749
// Clone the mapping from the latest EVM fork.
4850
precompiles := maps.Clone(vm.PrecompiledContractsBerlin)
@@ -55,13 +57,14 @@ func NewAvailableStaticPrecompiles(
5557
panic(fmt.Errorf("failed to instantiate bech32 precompile: %w", err))
5658
}
5759

58-
stakingPrecompile, err := stakingprecompile.NewPrecompile(stakingKeeper)
60+
stakingPrecompile, err := stakingprecompile.NewPrecompile(stakingKeeper, bankKeeper)
5961
if err != nil {
6062
panic(fmt.Errorf("failed to instantiate staking precompile: %w", err))
6163
}
6264

6365
distributionPrecompile, err := distprecompile.NewPrecompile(
6466
distributionKeeper,
67+
bankKeeper,
6568
stakingKeeper,
6669
evmKeeper,
6770
)
@@ -71,6 +74,7 @@ func NewAvailableStaticPrecompiles(
7174

7275
ibcTransferPrecompile, err := ics20precompile.NewPrecompile(
7376
stakingKeeper,
77+
bankKeeper,
7478
transferKeeper,
7579
channelKeeper,
7680
evmKeeper,
@@ -84,17 +88,17 @@ func NewAvailableStaticPrecompiles(
8488
panic(fmt.Errorf("failed to instantiate bank precompile: %w", err))
8589
}
8690

87-
govPrecompile, err := govprecompile.NewPrecompile(govKeeper)
91+
govPrecompile, err := govprecompile.NewPrecompile(govKeeper, bankKeeper, appCodec)
8892
if err != nil {
8993
panic(fmt.Errorf("failed to instantiate gov precompile: %w", err))
9094
}
9195

92-
slashingPrecompile, err := slashingprecompile.NewPrecompile(slashingKeeper)
96+
slashingPrecompile, err := slashingprecompile.NewPrecompile(slashingKeeper, bankKeeper)
9397
if err != nil {
9498
panic(fmt.Errorf("failed to instantiate slashing precompile: %w", err))
9599
}
96100

97-
evidencePrecompile, err := evidenceprecompile.NewPrecompile(evidenceKeeper)
101+
evidencePrecompile, err := evidenceprecompile.NewPrecompile(evidenceKeeper, bankKeeper)
98102
if err != nil {
99103
panic(fmt.Errorf("failed to instantiate evidence precompile: %w", err))
100104
}

app/upgrades/contract-audit-changes/upgrade.go

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,23 @@ import (
1313
"github.com/pushchain/push-chain-node/app/upgrades"
1414
)
1515

16+
// Upgrade for chain contract audit changes + evm version bump to 0.3.2
1617
// UpgradeName matches the chain-side change set that adapts the chain's
1718
// UniversalCore ABI + gas-fee read path to the post-audit smart-contract
1819
// No module ConsensusVersion is bumped for this upgrade — none of the chain
1920
// changes touch module storage schemas, so RunMigrations is a no-op for the
2021
// version map; this handler exists primarily as a coordination point so all
2122
// validators flip to the new ABI / gas-fee read at the same height.
23+
24+
// Key changes in this library bump:
25+
// - AccountKeeper now requires unordered-tx methods (satisfied via authKeeperEVMWrapper stub)
26+
// - EVMKeeper constructor takes additional params: store keys map, ConsensusParamsKeeper
27+
// - go-ethereum bumped to v1.15.11-cosmos-0; statedb.Account.Balance is now uint256.Int (not big.Int)
28+
// - erc20 module: NativePrecompiles moved from Params to a top-level genesis field
29+
// - Precompile constructors now require bankKeeper; gov precompile also requires appCodec
30+
// - vm.NewAppModule signature updated to accept AddressCodec
31+
//
32+
// RunMigrations handles the erc20 state migration automatically (consensus version bump).
2233
const UpgradeName = "contract-audit-changes"
2334

2435
func NewUpgrade() upgrades.Upgrade {
@@ -41,10 +52,12 @@ func CreateUpgradeHandler(
4152
sdkCtx := sdk.UnwrapSDKContext(ctx)
4253
logger := sdkCtx.Logger().With("upgrade", UpgradeName)
4354
logger.Info("Starting upgrade handler")
55+
logger.Info("cosmos/evm v0.2.x → v0.3.2: erc20 NativePrecompiles field migration, go-ethereum v1.15.11-cosmos-0")
56+
logger.Info("UniversalCore audit: ABI gasLimitUsed output, setGasPrice removal, gas_fee.go reads results[5]")
4457

45-
// RunMigrations is a no-op for this upgrade (no module ConsensusVersion
46-
// bumped) but we still call it so the version map is materialised
47-
// correctly for any modules whose code may have changed underneath.
58+
// erc20 module's ConsensusVersion bump (from EVM 0.3.2) drives the
59+
// only on-chain state migration this upgrade requires; RunMigrations
60+
// handles it. The chain's own modules don't bump versions here.
4861
versionMap, err := mm.RunMigrations(ctx, configurator, fromVM)
4962
if err != nil {
5063
return nil, fmt.Errorf("RunMigrations: %w", err)

0 commit comments

Comments
 (0)