Skip to content

Commit

Permalink
Enable LPT support by bridge (#209)
Browse files Browse the repository at this point in the history
* liquidity token denom and disable lpt transfers

* lp removing from balance and supply

* enable new lp related functions

* UNIT tests fix, go mods update

* Module dependencies update

Co-authored-by: Mikhail Kornilov <[email protected]>
  • Loading branch information
borispovod and Mikhail Kornilov authored Oct 5, 2020
1 parent 48ad862 commit fe0d2a9
Show file tree
Hide file tree
Showing 13 changed files with 70 additions and 56 deletions.
20 changes: 11 additions & 9 deletions app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ var (
auth.FeeCollectorName: {supply.Burner},
staking.BondedPoolName: {supply.Burner, supply.Staking},
staking.NotBondedPoolName: {supply.Burner, supply.Staking},
staking.LiquidityPoolName: {supply.Staking},
mint.ModuleName: {supply.Minter},
distribution.ModuleName: nil,
distribution.RewardsBankPoolName: nil,
Expand Down Expand Up @@ -326,15 +327,6 @@ func NewDnServiceApp(logger log.Logger, db dbm.DB, config *config.VMConfig, invC
app.paramsKeeper.Subspace(staking.DefaultParamspace),
)

// MintKeeper adds inflation.
app.mintKeeper = mint.NewKeeper(
cdc, keys[mint.StoreKey],
app.paramsKeeper.Subspace(mint.DefaultParamspace),
&stakingKeeper,
app.supplyKeeper,
auth.FeeCollectorName,
)

// DistributionKeeper distributes rewards between Proof-of-Stake validators and delegators.
app.distrKeeper = distribution.NewKeeper(
cdc,
Expand All @@ -346,6 +338,16 @@ func NewDnServiceApp(logger log.Logger, db dbm.DB, config *config.VMConfig, invC
app.ModuleAccountAddrs(),
)

// MintKeeper adds inflation.
app.mintKeeper = mint.NewKeeper(
cdc, keys[mint.StoreKey],
app.paramsKeeper.Subspace(mint.DefaultParamspace),
&stakingKeeper,
app.distrKeeper,
app.supplyKeeper,
auth.FeeCollectorName,
)

// SlashingKeeper adds disincentivize and penalty to Proof-of_Stake mechanism.
app.slashingKeeper = slashing.NewKeeper(
cdc,
Expand Down
6 changes: 3 additions & 3 deletions app/rest_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,7 @@ func TestCurrencyMultisig_REST(t *testing.T) {
func TestMS_Damir(t *testing.T) {
t.Parallel()

ct := cliTester.New(t, false)
ct := cliTester.New(t, true)
defer ct.Close()
ct.StartRestServer(false)

Expand All @@ -297,12 +297,12 @@ func TestMS_Damir(t *testing.T) {
// wait for call to appear (poll by uniqueID)
var callID dnTypes.ID
for i := 0; i < 100; i++ {
time.Sleep(5 * time.Millisecond)
time.Sleep(10 * time.Millisecond)

// call by uniqueID
req, callByUnique := ct.RestQueryMultiSigUnique(issueID)
if err := req.Execute(); err != nil {
t.Logf("call receive skipped")
t.Logf("call receive skipped: %v", err)
continue
}
callID = callByUnique.Call.ID
Expand Down
23 changes: 12 additions & 11 deletions cmd/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,18 @@ import (
)

const (
MainDenom = "xfi"
StakingDenom = "sxfi"
DefaultFeeAmount = "100000000000000"
DefaultFee = DefaultFeeAmount + MainDenom
MainPrefix = "wallet" // Main prefix for all addresses.
Bech32PrefixAccAddr = MainPrefix // Bech32 prefix for account addresses.
Bech32PrefixAccPub = MainPrefix + sdk.PrefixPublic // Bech32 prefix for accounts pub keys.
Bech32PrefixValAddr = MainPrefix + sdk.PrefixValidator + sdk.PrefixOperator // Bech32 prefix for validators addresses.
Bech32PrefixValPub = MainPrefix + sdk.PrefixValidator + sdk.PrefixOperator + sdk.PrefixPublic // Bech32 prefix for validator pub keys.
Bech32PrefixConsAddr = MainPrefix + sdk.PrefixValidator + sdk.PrefixConsensus // Bech32 prefix for consensus addresses.
Bech32PrefixConsPub = MainPrefix + sdk.PrefixValidator + sdk.PrefixConsensus + sdk.PrefixPublic // Bech32 prefix for consensus pub keys.
LiquidityProviderDenom = "lpt"
MainDenom = "xfi"
StakingDenom = "sxfi"
DefaultFeeAmount = "100000000000000"
DefaultFee = DefaultFeeAmount + MainDenom
MainPrefix = "wallet" // Main prefix for all addresses.
Bech32PrefixAccAddr = MainPrefix // Bech32 prefix for account addresses.
Bech32PrefixAccPub = MainPrefix + sdk.PrefixPublic // Bech32 prefix for accounts pub keys.
Bech32PrefixValAddr = MainPrefix + sdk.PrefixValidator + sdk.PrefixOperator // Bech32 prefix for validators addresses.
Bech32PrefixValPub = MainPrefix + sdk.PrefixValidator + sdk.PrefixOperator + sdk.PrefixPublic // Bech32 prefix for validator pub keys.
Bech32PrefixConsAddr = MainPrefix + sdk.PrefixValidator + sdk.PrefixConsensus // Bech32 prefix for consensus addresses.
Bech32PrefixConsPub = MainPrefix + sdk.PrefixValidator + sdk.PrefixConsensus + sdk.PrefixPublic // Bech32 prefix for consensus pub keys.

VMConfigFile = "vm.toml" // Default file to store config.
ConfigDir = "config" // Default directory to store all configurations.
Expand Down
1 change: 1 addition & 0 deletions cmd/config/gen_init.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ func InitCmd(ctx *server.Context, cdc *codec.Codec, mbm module.BasicManager,

cdc.MustUnmarshalJSON(stakingDataBz, &stakingGenState)
stakingGenState.Params.BondDenom = StakingDenom
stakingGenState.Params.LPDenom = LiquidityProviderDenom
stakingGenState.Params.MinSelfDelegationLvl = minSelfDelegation
appGenState[staking.ModuleName] = cdc.MustMarshalJSON(stakingGenState)

Expand Down
4 changes: 2 additions & 2 deletions cmd/config/restrictions/restrictions.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,8 @@ func GetAppRestrictions() AppRestrictions {
switch msg := msg.(type) {
case bank.MsgSend:
for i := range msg.Amount {
if msg.Amount.GetDenomByIndex(i) == config.StakingDenom {
return sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "bank transactions are disallowed for %s token", config.StakingDenom)
if msg.Amount.GetDenomByIndex(i) == config.StakingDenom || msg.Amount.GetDenomByIndex(i) == config.LiquidityProviderDenom {
return sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "bank transactions are disallowed for %s token", msg.Amount.GetDenomByIndex(i))
}
}
case gov.MsgDeposit:
Expand Down
3 changes: 2 additions & 1 deletion docs/genesis_generation.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,8 @@ It should be done before the next commands, refer to the tutorial **[how to init
The following commands might be omitted as [`xfi`, `eth`, `usdt`, `btc`] currencies already exist in the default generated genesis above.
Currencies can be added to the chain later using `gov` proposals.

dnode set-currency sxfi 18
dnode set-currency sxfi 18
dnode set-currency lpt 18
dnode set-currency xfi 18
dnode set-currency eth 18
dnode set-currency usdt 6
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ module github.com/dfinance/dnode

go 1.14

replace github.com/cosmos/cosmos-sdk => github.com/dfinance/cosmos-sdk v0.38.4-0.20200923132321-0b40b40d3bf8
replace github.com/cosmos/cosmos-sdk => github.com/dfinance/cosmos-sdk v0.38.4-0.20201002151830-6c83c28b89f4

// Local development option
//replace github.com/cosmos/cosmos-sdk => /Users/boris/go/src/github.com/dfinance/cosmos-sdk
Expand Down
4 changes: 4 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,10 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dfinance/cosmos-sdk v0.38.4-0.20200923132321-0b40b40d3bf8 h1:yrj9oPb69gZhSa8Q8637HsRrN/5q4WhK20XUNLPyLig=
github.com/dfinance/cosmos-sdk v0.38.4-0.20200923132321-0b40b40d3bf8/go.mod h1:6A7WcR5vEsVN5MSi5gkMJmJIMulHZftD7q63tBdt2r0=
github.com/dfinance/cosmos-sdk v0.38.4-0.20201002002655-db666862c14b h1:0z853VXVM/TAUaSAjNNlh5YdevVKfSjXxvuYHmhGsSs=
github.com/dfinance/cosmos-sdk v0.38.4-0.20201002002655-db666862c14b/go.mod h1:6A7WcR5vEsVN5MSi5gkMJmJIMulHZftD7q63tBdt2r0=
github.com/dfinance/cosmos-sdk v0.38.4-0.20201002151830-6c83c28b89f4 h1:sUQDCT0ddxJH14HssQkmA+TbX4PqEhHXK/py/RmaucU=
github.com/dfinance/cosmos-sdk v0.38.4-0.20201002151830-6c83c28b89f4/go.mod h1:6A7WcR5vEsVN5MSi5gkMJmJIMulHZftD7q63tBdt2r0=
github.com/dfinance/dvm-proto/go v0.0.0-20200819065410-6b70956c85de h1:PZfrjeOs9epAU0n+FpX/JAr/e+5m5/GdfUsgtO8gCOY=
github.com/dfinance/dvm-proto/go v0.0.0-20200819065410-6b70956c85de/go.mod h1:Vt1T0G56AYXbsduNKzSkq1RDTNa8PFraSqB9DaTCV0U=
github.com/dfinance/glav v0.0.0-20200814081332-c4701f6c12a6 h1:fZIYncA5BRad0+YnP88cfBfo0ZPgxPSVeuh/jvoGrLc=
Expand Down
1 change: 1 addition & 0 deletions helpers/tests/module_accs.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ var (
"orders": {supply.Burner},
staking.BondedPoolName: {supply.Burner, supply.Staking},
staking.NotBondedPoolName: {supply.Burner, supply.Staking},
staking.LiquidityPoolName: {supply.Staking},
}
)

Expand Down
13 changes: 7 additions & 6 deletions helpers/tests/simulator/sim_helpers.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package simulator

import (
"math/rand"
"sort"

sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/distribution"
"github.com/cosmos/cosmos-sdk/x/staking"
"github.com/stretchr/testify/require"
"math/rand"
"sort"
)

func (s *Simulator) GetRandomAccount() *SimAccount {
Expand Down Expand Up @@ -43,8 +44,8 @@ func (s *Simulator) UpdateValidator(val *staking.Validator) {
updVal := s.QueryStakeValidator(val.OperatorAddress)
val.Status = updVal.Status
val.Jailed = updVal.Jailed
val.Tokens = updVal.Tokens
val.DelegatorShares = updVal.DelegatorShares
val.Bonding = updVal.Bonding
val.LP = updVal.LP
val.UnbondingHeight = updVal.UnbondingHeight
val.UnbondingCompletionTime = updVal.UnbondingCompletionTime
}
Expand Down Expand Up @@ -130,7 +131,7 @@ func (s *Simulator) FormatDecDecimals(value sdk.Dec, decRatio sdk.Dec) string {
// GetSortedByStakeValidator returns validators sorted by stake.
func GetSortedByStakeValidator(validators []*staking.Validator, desc bool) []*staking.Validator {
sort.Slice(validators, func(i, j int) bool {
if validators[i].Tokens.GT(validators[j].Tokens) {
if validators[i].Bonding.Tokens.GT(validators[j].Bonding.Tokens) {
return desc
}
return !desc
Expand All @@ -142,7 +143,7 @@ func GetSortedByStakeValidator(validators []*staking.Validator, desc bool) []*st
// GetSortedDelegation returns delegation sorted list.
func GetSortedDelegation(responses staking.DelegationResponses, desc bool) staking.DelegationResponses {
sort.Slice(responses, func(i, j int) bool {
if responses[i].Balance.Amount.GT(responses[j].Balance.Amount) {
if responses[i].BondingBalance.Amount.GT(responses[j].BondingBalance.Amount) {
return desc
}
return !desc
Expand Down
10 changes: 5 additions & 5 deletions helpers/tests/simulator/sim_ops.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ func NewCreateValidatorOp(period time.Duration) *SimOperation {
s.UpdateAccount(simAcc)
simAcc.OperatedValidator = &validator

s.logger.Info(fmt.Sprintf("ValidatorOp: %s (%s) created for %s", validator.OperatorAddress, validator.ConsAddress(), simAcc.Address))
s.logger.Info(fmt.Sprintf("ValidatorOp: %s (%s) created for %s", validator.OperatorAddress, validator.GetConsAddr(), simAcc.Address))

return true
}
Expand Down Expand Up @@ -179,14 +179,14 @@ func NewRedelegateOp(period time.Duration, redelegateRatio sdk.Dec) *SimOperatio
}

// estimate redelegation amount
rdAmtDec := sdk.NewDecFromInt(delegation.Balance.Amount)
rdAmtDec := sdk.NewDecFromInt(delegation.BondingBalance.Amount)
rdAmt := rdAmtDec.Mul(redelegateRatio).TruncateInt()
if rdAmt.IsZero() {
continue
}

// redelegate
coin := sdk.NewCoin(delegation.Balance.Denom, rdAmt)
coin := sdk.NewCoin(delegation.BondingBalance.Denom, rdAmt)
s.TxStakingRedelegate(acc, srcValidator.OperatorAddress, dstValidator.OperatorAddress, coin)

// update validators
Expand Down Expand Up @@ -246,14 +246,14 @@ func NewUndelegateOp(period time.Duration, undelegateRatio sdk.Dec) *SimOperatio
}

// estimate undelegation amount
udAmtDec := sdk.NewDecFromInt(delegation.Balance.Amount)
udAmtDec := sdk.NewDecFromInt(delegation.BondingBalance.Amount)
udAmt := udAmtDec.Mul(undelegateRatio).TruncateInt()
if udAmt.IsZero() {
continue
}

// undelegate
coin := sdk.NewCoin(delegation.Balance.Denom, udAmt)
coin := sdk.NewCoin(delegation.BondingBalance.Denom, udAmt)
s.TxStakingUndelegate(acc, validator.OperatorAddress, coin)

// update validator
Expand Down
18 changes: 9 additions & 9 deletions helpers/tests/simulator/sim_report_debug.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,18 +39,18 @@ func (r SimDebugReportItem) String() string {
}

str.WriteString(fmt.Sprintf("[%03d] %s\n", i, valData.Validator.OperatorAddress))
str.WriteString(fmt.Sprintf(" Address: %s\n", valData.Validator.OperatorAddress))
str.WriteString(fmt.Sprintf(" Status: %s\n", valData.Validator.Status))
str.WriteString(fmt.Sprintf(" Jailed: %v\n", valData.Validator.Jailed))
str.WriteString(fmt.Sprintf(" Tokens: %s\n", valData.Validator.Tokens))
str.WriteString(fmt.Sprintf(" MinSDel: %s\n", valData.Validator.MinSelfDelegation))
str.WriteString(fmt.Sprintf(" DelShares: %s\n", valData.Validator.DelegatorShares))
str.WriteString(fmt.Sprintf(" UBTime: %s\n", valData.Validator.UnbondingCompletionTime))
str.WriteString(fmt.Sprintf(" Address: %s\n", valData.Validator.OperatorAddress))
str.WriteString(fmt.Sprintf(" Status: %s\n", valData.Validator.Status))
str.WriteString(fmt.Sprintf(" Jailed: %v\n", valData.Validator.Jailed))
str.WriteString(fmt.Sprintf(" BTokens: %s\n", valData.Validator.Bonding.Tokens))
str.WriteString(fmt.Sprintf(" BDelShares: %s\n", valData.Validator.Bonding.DelegatorShares))
str.WriteString(fmt.Sprintf(" MinSDel: %s\n", valData.Validator.MinSelfDelegation))
str.WriteString(fmt.Sprintf(" UBTime: %s\n", valData.Validator.UnbondingCompletionTime))
//
str.WriteString(fmt.Sprintf(" Dels: count: %d\n", len(valData.Delegations)))
if selfDelegation != nil {
str.WriteString(fmt.Sprintf(" Dels: SelfAmt: %s\n", selfDelegation.Balance.Amount))
str.WriteString(fmt.Sprintf(" Dels: SelfShr: %s\n", selfDelegation.Shares))
str.WriteString(fmt.Sprintf(" Dels: SelfAmt: %s\n", selfDelegation.BondingBalance.Amount))
str.WriteString(fmt.Sprintf(" Dels: SelfShr: %s\n", selfDelegation.BondingShares))
str.WriteString(fmt.Sprintf(" Dels: SelfAdr: %s\n", selfDelegation.DelegatorAddress))
} else {
str.WriteString(" Dels: SelfAmt: nil\n")
Expand Down
21 changes: 12 additions & 9 deletions x/currencies/internal/keeper/unstake.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,36 +10,39 @@ import (
func (k Keeper) UnstakeCurrency(ctx sdk.Context, staker sdk.AccAddress) error {
// Get staking denom (usually sxfi).
stakingDenom := k.stakingKeeper.BondDenom(ctx)
liquidityDenom := k.stakingKeeper.LPDenom(ctx)

// Call ForceRemoveDelegator to remove all delegations.
if err := k.stakingKeeper.ForceRemoveDelegator(ctx, staker); err != nil {
return sdkErrors.Wrapf(types.ErrForceUnstake, "error during force unstake delegations for %s: %v", staker, err)

}

// Check balance and remove sxfi.
// Check balance and remove staking/liquidity coins.
balances := k.bankKeeper.GetCoins(ctx, staker)
curSupply := k.supplyKeeper.GetSupply(ctx)

for _, balance := range balances {
if balance.Denom == stakingDenom {
if balance.Denom == stakingDenom || balance.Denom == liquidityDenom {
// Remove sxfi from balance.
if err := k.bankKeeper.SetCoins(ctx, staker, balances.Sub(sdk.Coins{balance})); err != nil {
return sdkErrors.Wrapf(types.ErrNulifyBalance, "error during nullify user sxfi balance for %s: %v", staker, err)

}
balances = balances.Sub(sdk.Coins{balance})

// Reducing supply.
// Both keepers (ccs and supply).
if err := k.ccsKeeper.DecreaseCurrencySupply(ctx, balance); err != nil {
return sdkErrors.Wrapf(types.ErrInternal, "can't decrease supply with ccsKeeper for %s: %v", staker, err)
}

curSupply := k.supplyKeeper.GetSupply(ctx)
curSupply = curSupply.SetTotal(curSupply.GetTotal().Sub(sdk.Coins{balance}))
k.supplyKeeper.SetSupply(ctx, curSupply)
}
}

if err := k.bankKeeper.SetCoins(ctx, staker, balances); err != nil {
return sdkErrors.Wrapf(types.ErrNulifyBalance, "error during nullify user staking/liquidty coins for %s: %v", staker, err)
}

// Set new total supply.
k.supplyKeeper.SetSupply(ctx, curSupply)

// Ban account.
k.stakingKeeper.BanAccount(ctx, staker, ctx.BlockHeight())

Expand Down

0 comments on commit fe0d2a9

Please sign in to comment.