/
genesis_currencies_process.go
75 lines (63 loc) · 1.86 KB
/
genesis_currencies_process.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
package currency
import (
"github.com/spikeekips/mitum/base/operation"
"github.com/spikeekips/mitum/base/state"
"github.com/spikeekips/mitum/util/valuehash"
)
func (op GenesisCurrencies) Process(
getState func(key string) (state.State, bool, error),
setState func(valuehash.Hash, ...state.State) error,
) error {
fact := op.Fact().(GenesisCurrenciesFact)
newAddress, err := fact.Address()
if err != nil {
return operation.NewBaseReasonErrorFromError(err)
}
ns, err := notExistsState(StateKeyAccount(newAddress), "key of genesis", getState)
if err != nil {
return err
}
cs := make([]CurrencyDesign, len(fact.cs))
gas := map[CurrencyID]state.State{}
sts := map[CurrencyID]state.State{}
for i := range fact.cs {
c := fact.cs[i]
c.genesisAccount = newAddress
cs[i] = c
st, err := notExistsState(StateKeyCurrencyDesign(c.Currency()), "currency", getState)
if err != nil {
return err
}
sts[c.Currency()] = st
st, err = notExistsState(StateKeyBalance(newAddress, c.Currency()), "balance of genesis", getState)
if err != nil {
return err
}
gas[c.Currency()] = NewAmountState(st, c.Currency())
}
var states []state.State
if ac, err := NewAccount(newAddress, fact.keys); err != nil {
return err
} else if st, err := SetStateAccountValue(ns, ac); err != nil {
return operation.NewBaseReasonErrorFromError(err)
} else {
states = append(states, st)
}
for i := range cs {
c := cs[i]
am := NewAmount(c.Big(), c.Currency())
if gst, err := SetStateBalanceValue(gas[c.Currency()], am); err != nil {
return err
} else if dst, err := SetStateCurrencyDesignValue(sts[c.Currency()], c); err != nil {
return err
} else {
states = append(states, gst, dst)
}
sts, err := createZeroAccount(c.Currency(), getState)
if err != nil {
return err
}
states = append(states, sts...)
}
return setState(fact.Hash(), states...)
}