Coin balance fix (#151)

* Fix setting account balances from assuming single denom

* Set order for end blocker to not override account balances

* Panic instead of ignoring error (case should never be hit)
This commit is contained in:
Austin Abell 2019-11-12 16:07:34 -05:00 committed by GitHub
parent 1f51b73d71
commit 327abc4edf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 20 additions and 7 deletions

View File

@ -139,10 +139,11 @@ func ethAnteHandler(
// Cost calculates the fees paid to validators based on gas limit and price // Cost calculates the fees paid to validators based on gas limit and price
cost := new(big.Int).Mul(ethTxMsg.Data.Price, new(big.Int).SetUint64(ethTxMsg.Data.GasLimit)) cost := new(big.Int).Mul(ethTxMsg.Data.Price, new(big.Int).SetUint64(ethTxMsg.Data.GasLimit))
err = auth.DeductFees(sk, ctx, senderAcc, sdk.Coins{ feeAmt := sdk.Coins{
sdk.NewCoin(emint.DenomDefault, sdk.NewIntFromBigInt(cost)), sdk.NewCoin(emint.DenomDefault, sdk.NewIntFromBigInt(cost)),
}) }
err = auth.DeductFees(sk, ctx, senderAcc, feeAmt)
if err != nil { if err != nil {
return ctx, err return ctx, err
} }

View File

@ -197,9 +197,9 @@ func NewEthermintApp(
// During begin block slashing happens after distr.BeginBlocker so that // During begin block slashing happens after distr.BeginBlocker so that
// there is nothing left over in the validator fee pool, so as to keep the // there is nothing left over in the validator fee pool, so as to keep the
// CanWithdrawInvariant invariant. // CanWithdrawInvariant invariant.
app.mm.SetOrderBeginBlockers(mint.ModuleName, distr.ModuleName, slashing.ModuleName, evmtypes.ModuleName) app.mm.SetOrderBeginBlockers(evmtypes.ModuleName, mint.ModuleName, distr.ModuleName, slashing.ModuleName)
app.mm.SetOrderEndBlockers(crisis.ModuleName, gov.ModuleName, staking.ModuleName, evmtypes.ModuleName) app.mm.SetOrderEndBlockers(evmtypes.ModuleName, crisis.ModuleName, gov.ModuleName, staking.ModuleName)
// NOTE: The genutils module must occur after staking so that pools are // NOTE: The genutils module must occur after staking so that pools are
// properly initialized with tokens from genesis accounts. // properly initialized with tokens from genesis accounts.

View File

@ -47,10 +47,22 @@ func (acc Account) Balance() sdk.Int {
return acc.GetCoins().AmountOf(DenomDefault) return acc.GetCoins().AmountOf(DenomDefault)
} }
// SetBalance sets an account's balance. // SetBalance sets an account's balance of photons
func (acc Account) SetBalance(amt sdk.Int) { func (acc Account) SetBalance(amt sdk.Int) {
//nolint:gosec,errcheck coins := acc.GetCoins()
acc.SetCoins(sdk.Coins{sdk.NewCoin(DenomDefault, amt)}) diff := amt.Sub(coins.AmountOf(DenomDefault))
if diff.IsZero() {
return
} else if diff.IsPositive() {
// Increase coins to amount
coins = coins.Add(sdk.Coins{sdk.NewCoin(DenomDefault, diff)})
} else {
// Decrease coins to amount
coins = coins.Sub(sdk.Coins{sdk.NewCoin(DenomDefault, diff.Neg())})
}
if err := acc.SetCoins(coins); err != nil {
panic(fmt.Sprintf("Could not set coins for address %s", acc.GetAddress()))
}
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------