Merge pull request #793 from cosmos/bucky/coin-sort
sort coins in genesis
This commit is contained in:
commit
7e649c3d6b
|
@ -36,6 +36,7 @@ var (
|
||||||
addr4 = priv4.PubKey().Address()
|
addr4 = priv4.PubKey().Address()
|
||||||
coins = sdk.Coins{{"foocoin", 10}}
|
coins = sdk.Coins{{"foocoin", 10}}
|
||||||
halfCoins = sdk.Coins{{"foocoin", 5}}
|
halfCoins = sdk.Coins{{"foocoin", 5}}
|
||||||
|
manyCoins = sdk.Coins{{"foocoin", 1}, {"barcoin", 1}}
|
||||||
fee = sdk.StdFee{
|
fee = sdk.StdFee{
|
||||||
sdk.Coins{{"foocoin", 0}},
|
sdk.Coins{{"foocoin", 0}},
|
||||||
0,
|
0,
|
||||||
|
@ -73,6 +74,15 @@ var (
|
||||||
bank.NewOutput(addr1, coins),
|
bank.NewOutput(addr1, coins),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sendMsg5 = bank.SendMsg{
|
||||||
|
Inputs: []bank.Input{
|
||||||
|
bank.NewInput(addr1, manyCoins),
|
||||||
|
},
|
||||||
|
Outputs: []bank.Output{
|
||||||
|
bank.NewOutput(addr2, manyCoins),
|
||||||
|
},
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
func loggerAndDBs() (log.Logger, map[string]dbm.DB) {
|
func loggerAndDBs() (log.Logger, map[string]dbm.DB) {
|
||||||
|
@ -131,6 +141,48 @@ func TestMsgs(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSortGenesis(t *testing.T) {
|
||||||
|
logger, dbs := loggerAndDBs()
|
||||||
|
bapp := NewBasecoinApp(logger, dbs)
|
||||||
|
|
||||||
|
// Note the order: the coins are unsorted!
|
||||||
|
coinDenom1, coinDenom2 := "foocoin", "barcoin"
|
||||||
|
|
||||||
|
genState := fmt.Sprintf(`{
|
||||||
|
"accounts": [{
|
||||||
|
"address": "%s",
|
||||||
|
"coins": [
|
||||||
|
{
|
||||||
|
"denom": "%s",
|
||||||
|
"amount": 10
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"denom": "%s",
|
||||||
|
"amount": 20
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}]
|
||||||
|
}`, addr1.String(), coinDenom1, coinDenom2)
|
||||||
|
|
||||||
|
// Initialize the chain
|
||||||
|
vals := []abci.Validator{}
|
||||||
|
bapp.InitChain(abci.RequestInitChain{vals, []byte(genState)})
|
||||||
|
bapp.Commit()
|
||||||
|
|
||||||
|
// Unsorted coins means invalid
|
||||||
|
err := sendMsg5.ValidateBasic()
|
||||||
|
require.Equal(t, sdk.CodeInvalidCoins, err.ABCICode(), err.ABCILog())
|
||||||
|
|
||||||
|
// Sort coins, should be valid
|
||||||
|
sendMsg5.Inputs[0].Coins.Sort()
|
||||||
|
sendMsg5.Outputs[0].Coins.Sort()
|
||||||
|
err = sendMsg5.ValidateBasic()
|
||||||
|
require.Nil(t, err)
|
||||||
|
|
||||||
|
// Ensure we can send
|
||||||
|
SignCheckDeliver(t, bapp, sendMsg5, []int64{0}, true, priv1)
|
||||||
|
}
|
||||||
|
|
||||||
func TestGenesis(t *testing.T) {
|
func TestGenesis(t *testing.T) {
|
||||||
logger, dbs := loggerAndDBs()
|
logger, dbs := loggerAndDBs()
|
||||||
bapp := NewBasecoinApp(logger, dbs)
|
bapp := NewBasecoinApp(logger, dbs)
|
||||||
|
|
|
@ -55,7 +55,7 @@ func NewGenesisAccount(aa *AppAccount) *GenesisAccount {
|
||||||
return &GenesisAccount{
|
return &GenesisAccount{
|
||||||
Name: aa.Name,
|
Name: aa.Name,
|
||||||
Address: aa.Address,
|
Address: aa.Address,
|
||||||
Coins: aa.Coins,
|
Coins: aa.Coins.Sort(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,7 +63,7 @@ func NewGenesisAccount(aa *AppAccount) *GenesisAccount {
|
||||||
func (ga *GenesisAccount) ToAppAccount() (acc *AppAccount, err error) {
|
func (ga *GenesisAccount) ToAppAccount() (acc *AppAccount, err error) {
|
||||||
baseAcc := auth.BaseAccount{
|
baseAcc := auth.BaseAccount{
|
||||||
Address: ga.Address,
|
Address: ga.Address,
|
||||||
Coins: ga.Coins,
|
Coins: ga.Coins.Sort(),
|
||||||
}
|
}
|
||||||
return &AppAccount{
|
return &AppAccount{
|
||||||
BaseAccount: baseAcc,
|
BaseAccount: baseAcc,
|
||||||
|
|
|
@ -55,7 +55,7 @@ func NewGenesisAccount(aa *AppAccount) *GenesisAccount {
|
||||||
return &GenesisAccount{
|
return &GenesisAccount{
|
||||||
Name: aa.Name,
|
Name: aa.Name,
|
||||||
Address: aa.Address,
|
Address: aa.Address,
|
||||||
Coins: aa.Coins,
|
Coins: aa.Coins.Sort(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,7 +63,7 @@ func NewGenesisAccount(aa *AppAccount) *GenesisAccount {
|
||||||
func (ga *GenesisAccount) ToAppAccount() (acc *AppAccount, err error) {
|
func (ga *GenesisAccount) ToAppAccount() (acc *AppAccount, err error) {
|
||||||
baseAcc := auth.BaseAccount{
|
baseAcc := auth.BaseAccount{
|
||||||
Address: ga.Address,
|
Address: ga.Address,
|
||||||
Coins: ga.Coins,
|
Coins: ga.Coins.Sort(),
|
||||||
}
|
}
|
||||||
return &AppAccount{
|
return &AppAccount{
|
||||||
BaseAccount: baseAcc,
|
BaseAccount: baseAcc,
|
||||||
|
|
|
@ -257,7 +257,10 @@ func (coins Coins) Swap(i, j int) { coins[i], coins[j] = coins[j], coins[i]
|
||||||
var _ sort.Interface = Coins{}
|
var _ sort.Interface = Coins{}
|
||||||
|
|
||||||
// Sort is a helper function to sort the set of coins inplace
|
// Sort is a helper function to sort the set of coins inplace
|
||||||
func (coins Coins) Sort() { sort.Sort(coins) }
|
func (coins Coins) Sort() Coins {
|
||||||
|
sort.Sort(coins)
|
||||||
|
return coins
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------
|
//----------------------------------------
|
||||||
// Parsing
|
// Parsing
|
||||||
|
|
Loading…
Reference in New Issue