-
Notifications
You must be signed in to change notification settings - Fork 0
/
genesis.go
57 lines (48 loc) · 1.67 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
package keeper
import (
"fmt"
"strings"
sdk "github.com/cosmos/cosmos-sdk/types"
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
blackfury "github.com/fanfury-sports/blackfury/types"
)
func (k Keeper) InitGenesis(ctx sdk.Context, genState *banktypes.GenesisState) {
// 1. Init balances, set denom metadata, and set supply
k.BaseKeeper.InitGenesis(ctx, genState)
// 2. Set denom metadata for predefined stable coins
blackfury.SetDenomMetaDataForStableCoins(ctx, k)
// 3. Register erc20 for coins, and set erc20 balance
for _, balance := range genState.Balances {
addr, err := sdk.AccAddressFromBech32(balance.Address)
if err != nil {
panic(err)
}
for _, coin := range balance.Coins {
if strings.Contains(coin.Denom, blackfury.DisplayDenom) {
// skip gas token
continue
}
// register erc20 for coins
if !k.erc20Keeper().IsDenomRegistered(ctx, coin.Denom) {
_, err := k.erc20Keeper().RegisterCoin(ctx, coin.Denom)
if err != nil {
panic(fmt.Sprintf("register native coin to erc20 module: %s", err))
}
}
// balance alignment
erc20Balance := k.erc20Keeper().GetBalance(ctx, addr, coin.Denom)
if erc20Balance.IsLT(coin) {
// mint missing
k.erc20Keeper().SendCoins(ctx, nil, addr, sdk.NewCoins(coin.Sub(erc20Balance)), nil)
} else if coin.IsLT(erc20Balance) {
// burn excess
k.erc20Keeper().SendCoins(ctx, addr, nil, sdk.NewCoins(erc20Balance.Sub(coin)), nil)
}
// check balance again
erc20Balance = k.erc20Keeper().GetBalance(ctx, addr, coin.Denom)
if !erc20Balance.IsEqual(coin) {
panic(fmt.Sprintf("unequal balance of coin and erc20 representations: %s, %s", coin, erc20Balance))
}
}
}
}