-
Notifications
You must be signed in to change notification settings - Fork 107
/
genesis.go
98 lines (83 loc) · 2.47 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
package vault
import (
"context"
"fmt"
"github.com/cometbft/cometbft/abci/types"
abciAPI "github.com/oasisprotocol/oasis-core/go/consensus/cometbft/api"
vaultState "github.com/oasisprotocol/oasis-core/go/consensus/cometbft/apps/vault/state"
genesis "github.com/oasisprotocol/oasis-core/go/genesis/api"
staking "github.com/oasisprotocol/oasis-core/go/staking/api"
vault "github.com/oasisprotocol/oasis-core/go/vault/api"
)
func (app *vaultApplication) InitChain(ctx *abciAPI.Context, _ types.RequestInitChain, doc *genesis.Document) error {
st := doc.Vault
if st == nil {
return nil
}
state := vaultState.NewMutableState(ctx.State())
if err := state.SetConsensusParameters(ctx, &st.Parameters); err != nil {
return fmt.Errorf("cometbft/vault: failed to set consensus parameters: %w", err)
}
// Insert vaults.
for _, vault := range st.Vaults {
if err := state.SetVault(ctx, vault); err != nil {
return err
}
}
// Insert address states.
for vaultAddr, vaultStates := range st.States {
for addr, as := range vaultStates {
if err := state.SetAddressState(ctx, vaultAddr, addr, as); err != nil {
return err
}
}
}
// Insert pending actions.
for vaultAddr, pendingActions := range st.PendingActions {
for _, action := range pendingActions {
if err := state.SetPendingAction(ctx, vaultAddr, action); err != nil {
return err
}
}
}
return nil
}
// Genesis exports current state in genesis format.
func (vq *vaultQuerier) Genesis(ctx context.Context) (*vault.Genesis, error) {
params, err := vq.state.ConsensusParameters(ctx)
if err != nil {
return nil, err
}
// Vaults.
vaults, err := vq.state.Vaults(ctx)
if err != nil {
return nil, err
}
// Account states and pending actions.
pendingActions := make(map[staking.Address][]*vault.PendingAction)
states := make(map[staking.Address]map[staking.Address]*vault.AddressState)
for _, vlt := range vaults {
var actions []*vault.PendingAction
actions, err = vq.state.PendingActions(ctx, vlt.Address())
if err != nil {
return nil, err
}
var vaultStates map[staking.Address]*vault.AddressState
vaultStates, err := vq.state.AddressStates(ctx, vlt.Address())
if err != nil {
return nil, err
}
if len(actions) > 0 {
pendingActions[vlt.Address()] = actions
}
if len(vaultStates) > 0 {
states[vlt.Address()] = vaultStates
}
}
return &vault.Genesis{
Parameters: *params,
Vaults: vaults,
PendingActions: pendingActions,
States: states,
}, nil
}