-
Notifications
You must be signed in to change notification settings - Fork 805
/
genesis.go
102 lines (90 loc) · 3.2 KB
/
genesis.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package keeper
import (
"fmt"
"github.com/cosmos/cosmos-sdk/store/prefix"
sdk "github.com/cosmos/cosmos-sdk/types"
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/rawdb"
"github.com/ethereum/go-ethereum/core/state"
ethtypes "github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/trie"
"github.com/ethereum/go-ethereum/trie/triedb/hashdb"
"github.com/ethereum/go-ethereum/trie/triedb/pathdb"
"github.com/sei-protocol/sei-chain/x/evm/artifacts/erc20"
"github.com/sei-protocol/sei-chain/x/evm/artifacts/erc721"
artifactsutils "github.com/sei-protocol/sei-chain/x/evm/artifacts/utils"
"github.com/sei-protocol/sei-chain/x/evm/types"
)
var ethReplayInitialied = false
func (k *Keeper) InitGenesis(ctx sdk.Context, genState types.GenesisState) {
moduleAcc := authtypes.NewEmptyModuleAccount(types.ModuleName, authtypes.Minter, authtypes.Burner)
k.accountKeeper.SetModuleAccount(ctx, moduleAcc)
k.SetParams(ctx, genState.Params)
seiAddrFc := k.accountKeeper.GetModuleAddress(authtypes.FeeCollectorName) // feeCollector == coinbase
k.SetAddressMapping(ctx, seiAddrFc, GetCoinbaseAddress())
for _, addr := range genState.AddressAssociations {
k.SetAddressMapping(ctx, sdk.MustAccAddressFromBech32(addr.SeiAddress), common.HexToAddress(addr.EthAddress))
}
erc20CodeID, err := k.wasmKeeper.Create(ctx, k.accountKeeper.GetModuleAddress(types.ModuleName), erc20.GetBin(), nil)
if err != nil {
panic(err)
}
prefix.NewStore(k.PrefixStore(ctx, types.PointerCWCodePrefix), types.PointerCW20ERC20Prefix).Set(
artifactsutils.GetVersionBz(erc20.CurrentVersion),
artifactsutils.GetCodeIDBz(erc20CodeID),
)
erc721CodeID, err := k.wasmKeeper.Create(ctx, k.accountKeeper.GetModuleAddress(types.ModuleName), erc721.GetBin(), nil)
if err != nil {
panic(err)
}
prefix.NewStore(k.PrefixStore(ctx, types.PointerCWCodePrefix), types.PointerCW721ERC721Prefix).Set(
artifactsutils.GetVersionBz(erc721.CurrentVersion),
artifactsutils.GetCodeIDBz(erc721CodeID),
)
if k.EthReplayConfig.Enabled && !ethReplayInitialied {
header := k.OpenEthDatabase()
k.SetReplayInitialHeight(ctx, header.Number.Int64())
ethReplayInitialied = true
}
}
func (k *Keeper) OpenEthDatabase() *ethtypes.Header {
db, err := rawdb.Open(rawdb.OpenOptions{
Type: "pebble",
Directory: k.EthReplayConfig.EthDataDir,
AncientsDirectory: fmt.Sprintf("%s/ancient", k.EthReplayConfig.EthDataDir),
Namespace: "",
Cache: 256,
Handles: 256,
ReadOnly: true,
})
if err != nil {
panic(err)
}
config := &trie.Config{
Preimages: true,
IsVerkle: false,
}
scheme, err := rawdb.ParseStateScheme(rawdb.ReadStateScheme(db), db)
if err != nil {
panic(err)
}
var triedb *trie.Database
if scheme == rawdb.HashScheme {
config.HashDB = hashdb.Defaults
triedb = trie.NewDatabase(db, config)
} else {
config.PathDB = pathdb.ReadOnly
triedb = trie.NewDatabase(db, config)
}
header := rawdb.ReadHeadHeader(db)
sdb := state.NewDatabaseWithNodeDB(db, triedb)
tr, err := sdb.OpenTrie(header.Root)
if err != nil {
panic(err)
}
k.Root = header.Root
k.DB = sdb
k.Trie = tr
return header
}