Skip to content

Commit 7dc2d0c

Browse files
committed
Fix genesis import with predictable addresses
1 parent 7dba5c7 commit 7dc2d0c

File tree

2 files changed

+21
-6
lines changed

2 files changed

+21
-6
lines changed

x/wasm/keeper/genesis.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ func InitGenesis(ctx sdk.Context, keeper *Keeper, data types.GenesisState) ([]ab
4141
}
4242
}
4343

44-
var maxContractID int
4544
for i, contract := range data.Contracts {
4645
contractAddr, err := sdk.AccAddressFromBech32(contract.ContractAddress)
4746
if err != nil {
@@ -51,7 +50,6 @@ func InitGenesis(ctx sdk.Context, keeper *Keeper, data types.GenesisState) ([]ab
5150
if err != nil {
5251
return nil, errorsmod.Wrapf(err, "contract number %d", i)
5352
}
54-
maxContractID = i + 1 // not ideal but max(contractID) is not persisted otherwise
5553
}
5654

5755
for i, seq := range data.Sequences {
@@ -66,9 +64,12 @@ func InitGenesis(ctx sdk.Context, keeper *Keeper, data types.GenesisState) ([]ab
6664
if seqVal <= maxCodeID {
6765
return nil, errorsmod.Wrapf(types.ErrInvalid, "seq %s with value: %d must be greater than: %d ", string(types.KeySequenceCodeID), seqVal, maxCodeID)
6866
}
69-
seqVal = keeper.PeekAutoIncrementID(ctx, types.KeySequenceInstanceID)
70-
if seqVal <= uint64(maxContractID) {
71-
return nil, errorsmod.Wrapf(types.ErrInvalid, "seq %s with value: %d must be greater than: %d ", string(types.KeySequenceInstanceID), seqVal, maxContractID)
67+
// ensure next classic address is unused so that we know the sequence is good
68+
rCtx, _ := ctx.CacheContext()
69+
seqVal = keeper.PeekAutoIncrementID(rCtx, types.KeySequenceInstanceID)
70+
addr := keeper.ClassicAddressGenerator()(rCtx, seqVal, nil)
71+
if keeper.HasContractInfo(ctx, addr) {
72+
return nil, errorsmod.Wrapf(types.ErrInvalid, "value: %d for seq %s was used already", seqVal, string(types.KeySequenceInstanceID))
7273
}
7374
return nil, nil
7475
}

x/wasm/keeper/genesis_test.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,20 @@ func TestGenesisExportImport(t *testing.T) {
154154
}
155155
}
156156

157+
func TestGenesisExportImportWithPredictableAddress(t *testing.T) {
158+
ctx, keepers := CreateTestInput(t, false, AvailableCapabilities)
159+
k := keepers.WasmKeeper
160+
eCtx, _ := ctx.CacheContext()
161+
codeID := StoreReflectContract(t, eCtx, keepers).CodeID
162+
creator := RandomAccountAddress(t)
163+
_, _, err := keepers.ContractKeeper.Instantiate2(eCtx, codeID, creator, nil, []byte("{}"), "testing", nil, []byte("my_salt"), false)
164+
require.NoError(t, err)
165+
genesisState := ExportGenesis(eCtx, k)
166+
// when imported
167+
_, err = InitGenesis(ctx, k, *genesisState)
168+
require.NoError(t, err)
169+
}
170+
157171
func TestGenesisInit(t *testing.T) {
158172
wasmCode, err := os.ReadFile("./testdata/hackatom.wasm")
159173
require.NoError(t, err)
@@ -438,7 +452,7 @@ func TestGenesisInit(t *testing.T) {
438452
Params: types.DefaultParams(),
439453
},
440454
},
441-
"prevent contract id seq init value == count contracts": {
455+
"prevent contract id seq init value not high enough": {
442456
src: types.GenesisState{
443457
Codes: []types.Code{{
444458
CodeID: firstCodeID,

0 commit comments

Comments
 (0)