github.com/Finschia/finschia-sdk@v0.48.1/x/token/keeper/genesis.go (about) 1 package keeper 2 3 import ( 4 sdk "github.com/Finschia/finschia-sdk/types" 5 "github.com/Finschia/finschia-sdk/x/token" 6 ) 7 8 // InitGenesis new token genesis 9 func (k Keeper) InitGenesis(ctx sdk.Context, data *token.GenesisState) { 10 if data.ClassState == nil { 11 data.ClassState = token.DefaultClassGenesisState() 12 } 13 k.classKeeper.InitGenesis(ctx, data.ClassState) 14 15 for _, contractBalances := range data.Balances { 16 for _, balance := range contractBalances.Balances { 17 addr, err := sdk.AccAddressFromBech32(balance.Address) 18 if err != nil { 19 panic(err) 20 } 21 k.setBalance(ctx, contractBalances.ContractId, addr, balance.Amount) 22 } 23 } 24 25 for _, class := range data.Classes { 26 k.setClass(ctx, class) 27 } 28 29 for _, contractGrants := range data.Grants { 30 for _, grant := range contractGrants.Grants { 31 grantee, err := sdk.AccAddressFromBech32(grant.Grantee) 32 if err != nil { 33 panic(err) 34 } 35 k.setGrant(ctx, contractGrants.ContractId, grantee, grant.Permission) 36 } 37 } 38 39 for _, contractAuthorizations := range data.Authorizations { 40 for _, authorization := range contractAuthorizations.Authorizations { 41 holder, err := sdk.AccAddressFromBech32(authorization.Holder) 42 if err != nil { 43 panic(err) 44 } 45 operator, err := sdk.AccAddressFromBech32(authorization.Operator) 46 if err != nil { 47 panic(err) 48 } 49 k.setAuthorization(ctx, contractAuthorizations.ContractId, holder, operator) 50 } 51 } 52 53 // TODO: remove it (derive it using mints and burns) 54 for _, amount := range data.Supplies { 55 k.setSupply(ctx, amount.ContractId, amount.Amount) 56 } 57 58 for _, amount := range data.Mints { 59 k.setMinted(ctx, amount.ContractId, amount.Amount) 60 } 61 62 for _, amount := range data.Burns { 63 k.setBurnt(ctx, amount.ContractId, amount.Amount) 64 } 65 } 66 67 // ExportGenesis returns a GenesisState for a given context. 68 func (k Keeper) ExportGenesis(ctx sdk.Context) *token.GenesisState { 69 var classes []token.Contract 70 k.iterateClasses(ctx, func(class token.Contract) (stop bool) { 71 classes = append(classes, class) 72 return false 73 }) 74 75 var balances []token.ContractBalances 76 for _, class := range classes { 77 id := class.Id 78 contractBalances := token.ContractBalances{ 79 ContractId: id, 80 } 81 82 k.iterateContractBalances(ctx, id, func(balance token.Balance) (stop bool) { 83 contractBalances.Balances = append(contractBalances.Balances, balance) 84 return false 85 }) 86 if len(contractBalances.Balances) != 0 { 87 balances = append(balances, contractBalances) 88 } 89 } 90 91 var supplies []token.ContractCoin 92 k.iterateSupplies(ctx, func(contractID string, amount sdk.Int) (stop bool) { 93 supply := token.ContractCoin{ 94 ContractId: contractID, 95 Amount: amount, 96 } 97 supplies = append(supplies, supply) 98 return false 99 }) 100 101 var mints []token.ContractCoin 102 k.iterateMinteds(ctx, func(contractID string, amount sdk.Int) (stop bool) { 103 minted := token.ContractCoin{ 104 ContractId: contractID, 105 Amount: amount, 106 } 107 mints = append(mints, minted) 108 return false 109 }) 110 111 var burns []token.ContractCoin 112 k.iterateBurnts(ctx, func(contractID string, amount sdk.Int) (stop bool) { 113 burnt := token.ContractCoin{ 114 ContractId: contractID, 115 Amount: amount, 116 } 117 burns = append(burns, burnt) 118 return false 119 }) 120 121 var grants []token.ContractGrants 122 for _, class := range classes { 123 id := class.Id 124 contractGrants := token.ContractGrants{ 125 ContractId: id, 126 } 127 128 k.iterateContractGrants(ctx, id, func(grant token.Grant) (stop bool) { 129 contractGrants.Grants = append(contractGrants.Grants, grant) 130 return false 131 }) 132 if len(contractGrants.Grants) != 0 { 133 grants = append(grants, contractGrants) 134 } 135 } 136 137 var authorizations []token.ContractAuthorizations 138 for _, class := range classes { 139 id := class.Id 140 contractAuthorizations := token.ContractAuthorizations{ 141 ContractId: id, 142 } 143 144 k.iterateContractAuthorizations(ctx, id, func(authorization token.Authorization) (stop bool) { 145 contractAuthorizations.Authorizations = append(contractAuthorizations.Authorizations, authorization) 146 return false 147 }) 148 if len(contractAuthorizations.Authorizations) != 0 { 149 authorizations = append(authorizations, contractAuthorizations) 150 } 151 } 152 153 return &token.GenesisState{ 154 ClassState: k.classKeeper.ExportGenesis(ctx), 155 Balances: balances, 156 Classes: classes, 157 Grants: grants, 158 Authorizations: authorizations, 159 Supplies: supplies, 160 Mints: mints, 161 Burns: burns, 162 } 163 }