Skip to content

Commit 68b9b71

Browse files
feat(evm): Overwrite ERC20 metadata for stNIBI on Nibiru Testnet 2, and make the contract upgradeable. (#2381)
* wip!: save for now to implement this feature after [feat(evm): Implement a state (ctx) serializable EVM StateDB to make asynchronous access more safe](#2378) * revert precompile edits to do them in a future upgrade * fix(evm): robustness improvments on metadata constructor * fix(funtoken_from_erc20): add robustness checks against ERC20.symbols with deterministic display denom during bank.Metadata generation * fix(funtoken_from_erc20): pass through ERC20 name and symbol in raw form to allow bank.Metadata.Validate to protect against empty values * feat(evm): Overwrite ERC20 metadata for stNIBI on Nibiru Testnet 2, and make the contract upgradeable. * feat(evmtest): create an upgrade runner function and remove panics
1 parent 2748fe2 commit 68b9b71

File tree

10 files changed

+597
-38
lines changed

10 files changed

+597
-38
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ handling for NIBI via WNIBI.
5757
- [#2372](https://github.com/NibiruChain/nibiru/pull/2372) - feat(tokenfactory-cli): add CLI commands for set denom functions
5858
- [#2375](https://github.com/NibiruChain/nibiru/pull/2375) - feat(evm): Inject WNIBI.sol for non-mainnet networks in the v2.7.0 upgrade handler
5959
- [#2379](https://github.com/NibiruChain/nibiru/pull/2379) - fix(evm): disallow permissionless creation of FunToken mappings when tokens do not already have metadata.
60+
- [#2381](https://github.com/NibiruChain/nibiru/pull/2381) - feat(evm): Overwrite
61+
ERC20 metadata for stNIBI on Nibiru Testnet 2, and make the contract upgradeable.
6062

6163
### Dependencies
6264
- Bump `base-x` from 3.0.10 to 3.0.11 ([#2355](https://github.com/NibiruChain/nibiru/pull/2355))

app/upgrades/v2_5_0/v2_5_0.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,9 @@ var Upgrade = upgrades.Upgrade{
4141
plan upgradetypes.Plan,
4242
fromVM module.VersionMap,
4343
) (module.VersionMap, error) {
44-
err := UpgradeStNibiContractOnMainnet(nibiru, ctx, appconst.MAINNET_STNIBI_ADDR)
44+
err := UpgradeStNibiEvmMetadata(nibiru, ctx, appconst.MAINNET_STNIBI_ADDR)
4545
if err != nil {
46-
panic(fmt.Errorf("v2.5.0 upgrade failure: %w", err))
46+
return fromVM, fmt.Errorf("v2.5.0 upgrade failure: %w", err)
4747
}
4848

4949
return mm.RunMigrations(ctx, cfg, fromVM)
@@ -52,7 +52,7 @@ var Upgrade = upgrades.Upgrade{
5252
StoreUpgrades: storetypes.StoreUpgrades{},
5353
}
5454

55-
func UpgradeStNibiContractOnMainnet(
55+
func UpgradeStNibiEvmMetadata(
5656
keepers *keepers.PublicKeepers,
5757
ctx sdk.Context,
5858
// erc20Addr is the hex address of stNIBI on mainnet

app/upgrades/v2_5_0/v2_5_0_test.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -176,26 +176,28 @@ func (s *Suite) TestUpgrade() {
176176
s.Run(fmt.Sprintf("Perform upgrade on stNIBI ERC20 address: %s", funtoken.Erc20Addr.Address), func() {
177177
s.T().Log("IMPORTANT: Schedule the upgrade")
178178
deps.EvmKeeper.Bank.StateDB = nil // IMPORTANT: make sure to clear the StateDB before running the upgrade
179-
s.Require().True(deps.App.UpgradeKeeper.HasHandler(v2_5_0.Upgrade.UpgradeName))
179+
s.Require().True(
180+
deps.App.UpgradeKeeper.HasHandler(v2_5_0.Upgrade.UpgradeName),
181+
)
180182

181-
beforeEvents := deps.Ctx.EventManager().Events()
182-
err := v2_5_0.UpgradeStNibiContractOnMainnet(
183+
eventsBeforeUpgrade := deps.Ctx.EventManager().Events()
184+
err := v2_5_0.UpgradeStNibiEvmMetadata(
183185
&deps.App.PublicKeepers, deps.Ctx, funtoken.Erc20Addr.Address,
184186
)
185187
s.Require().NoError(err)
186-
upgradeEvents := testutil.FilterNewEvents(beforeEvents, deps.Ctx.EventManager().Events())
188+
eventsInUpgrade := testutil.FilterNewEvents(eventsBeforeUpgrade, deps.Ctx.EventManager().Events())
187189

188-
err = testutil.AssertEventPresent(upgradeEvents,
190+
err = testutil.AssertEventPresent(eventsInUpgrade,
189191
gogoproto.MessageName(new(evm.EventContractDeployed)),
190192
)
191193
s.Require().NoError(err)
192194

193-
err = testutil.AssertEventPresent(upgradeEvents,
195+
err = testutil.AssertEventPresent(eventsInUpgrade,
194196
gogoproto.MessageName(new(tf.EventSetDenomMetadata)),
195197
)
196198
s.Require().NoError(err)
197199

198-
err = testutil.AssertEventPresent(upgradeEvents,
200+
err = testutil.AssertEventPresent(eventsInUpgrade,
199201
gogoproto.MessageName(new(evm.EventTxLog)),
200202
)
201203
s.Require().NoError(err)
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package v2_7_0
2+
3+
import (
4+
"math/big"
5+
6+
sdk "github.com/cosmos/cosmos-sdk/types"
7+
bank "github.com/cosmos/cosmos-sdk/x/bank/types"
8+
gethcommon "github.com/ethereum/go-ethereum/common"
9+
10+
"github.com/NibiruChain/nibiru/v2/app/appconst"
11+
"github.com/NibiruChain/nibiru/v2/app/keepers"
12+
"github.com/NibiruChain/nibiru/v2/app/upgrades/v2_5_0"
13+
)
14+
15+
// TESTNET_STNIBI_ADDR is the (real) hex address of stNIBI on testnet.
16+
// Produced from `nibid q evm funtoken | jq`
17+
// ```
18+
//
19+
// {
20+
// "fun_token": {
21+
// "erc20_addr": "0xb6Ec473BeE85DC99B1B350510f592b80F034b5DD",
22+
// "bank_denom": "tf/nibi1keqw4dllsczlldd7pmzp25wyl04fw5anh3wxljhg4fjuqj9xnxuqa82rpg/ampNIBIT2",
23+
// "is_made_from_coin": true
24+
// }
25+
// }
26+
//
27+
// ```
28+
var TESTNET_STNIBI_ADDR = gethcommon.HexToAddress("0xb6Ec473BeE85DC99B1B350510f592b80F034b5DD")
29+
30+
// Queried from Testnet (ETH Chain ID 6911) on 2025-09-10.
31+
func OldTestnetStnibi() bank.Metadata {
32+
stnibiDenomTestnet := "tf/nibi1keqw4dllsczlldd7pmzp25wyl04fw5anh3wxljhg4fjuqj9xnxuqa82rpg/ampNIBIT2"
33+
return bank.Metadata{
34+
Description: "",
35+
DenomUnits: []*bank.DenomUnit{
36+
{
37+
Denom: stnibiDenomTestnet,
38+
Exponent: 0,
39+
},
40+
},
41+
Base: stnibiDenomTestnet,
42+
Display: stnibiDenomTestnet,
43+
Name: stnibiDenomTestnet,
44+
Symbol: stnibiDenomTestnet,
45+
URI: "",
46+
URIHash: "",
47+
}
48+
}
49+
50+
func UpgradeStNibiContractOnTestnet(
51+
keepers *keepers.PublicKeepers,
52+
ctx sdk.Context,
53+
) error {
54+
// Only run this for testnet (6911).
55+
if keepers.EvmKeeper.EthChainID(ctx).
56+
Cmp(big.NewInt(appconst.ETH_CHAIN_ID_TESTNET_2)) != 0 {
57+
return nil // Early return success
58+
}
59+
60+
// This is safe to run because we've used this function to upgrade mainnet
61+
// already.
62+
return v2_5_0.UpgradeStNibiEvmMetadata(keepers, ctx, TESTNET_STNIBI_ADDR)
63+
}

0 commit comments

Comments
 (0)