Implement infrastructure proposal (#1306)

* update params

* stub out methods

* delete legacy migration test

* feat: add infrastructure inflation and payouts

* fix: load same module account blocked addrs in kavadist as app

* fix: testing edge case where period starts and ends same block

* fix: add store key for infra params, update newparams function

* fix: testing edge case where period starts and ends in same block

* add test for basic infra minting

* add test for stand-alone core, partner rewards

* fix: set time elapsed in each case

* add e2e test for infra rewards

* fix: use standard method for naming infra params key
This commit is contained in:
Kevin Davis 2022-09-29 13:27:40 -06:00 committed by GitHub
parent ef874f9913
commit b0932f7062
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 1396 additions and 224 deletions

View File

@ -518,7 +518,7 @@ func NewApp(
app.bankKeeper,
app.accountKeeper,
app.distrKeeper,
app.ModuleAccountAddrs(),
app.loadBlockedMaccAddrs(),
)
app.transferKeeper = ibctransferkeeper.NewKeeper(

View File

@ -375,7 +375,10 @@
- [Msg](#kava.issuance.v1beta1.Msg)
- [kava/kavadist/v1beta1/params.proto](#kava/kavadist/v1beta1/params.proto)
- [CoreReward](#kava.kavadist.v1beta1.CoreReward)
- [InfrastructureParams](#kava.kavadist.v1beta1.InfrastructureParams)
- [Params](#kava.kavadist.v1beta1.Params)
- [PartnerReward](#kava.kavadist.v1beta1.PartnerReward)
- [Period](#kava.kavadist.v1beta1.Period)
- [kava/kavadist/v1beta1/genesis.proto](#kava/kavadist/v1beta1/genesis.proto)
@ -5325,6 +5328,39 @@ Msg defines the issuance Msg service.
<a name="kava.kavadist.v1beta1.CoreReward"></a>
### CoreReward
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| `address` | [bytes](#bytes) | | |
| `weight` | [string](#string) | | |
<a name="kava.kavadist.v1beta1.InfrastructureParams"></a>
### InfrastructureParams
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| `infrastructure_periods` | [Period](#kava.kavadist.v1beta1.Period) | repeated | |
| `core_rewards` | [CoreReward](#kava.kavadist.v1beta1.CoreReward) | repeated | |
| `partner_rewards` | [PartnerReward](#kava.kavadist.v1beta1.PartnerReward) | repeated | |
<a name="kava.kavadist.v1beta1.Params"></a>
### Params
@ -5335,6 +5371,23 @@ Params governance parameters for kavadist module
| ----- | ---- | ----- | ----------- |
| `active` | [bool](#bool) | | |
| `periods` | [Period](#kava.kavadist.v1beta1.Period) | repeated | |
| `infrastructure_params` | [InfrastructureParams](#kava.kavadist.v1beta1.InfrastructureParams) | | |
<a name="kava.kavadist.v1beta1.PartnerReward"></a>
### PartnerReward
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| `address` | [bytes](#bytes) | | |
| `rewards_per_second` | [cosmos.base.v1beta1.Coin](#cosmos.base.v1beta1.Coin) | | |

View File

@ -2,6 +2,8 @@ syntax = "proto3";
package kava.kavadist.v1beta1;
import "gogoproto/gogo.proto";
import "cosmos/base/v1beta1/coin.proto";
import "cosmos_proto/cosmos.proto";
import "google/protobuf/timestamp.proto";
option go_package = "github.com/kava-labs/kava/x/kavadist/types";
@ -13,6 +15,36 @@ option (gogoproto.goproto_getters_all) = false;
message Params {
bool active = 1 [(gogoproto.moretags) = "yaml:\"active\""];
repeated Period periods = 3 [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"periods\""];
InfrastructureParams infrastructure_params = 4 [(gogoproto.nullable) = false];
}
message InfrastructureParams {
repeated Period infrastructure_periods = 1 [(gogoproto.castrepeated) = "Periods", (gogoproto.nullable) = false];
repeated CoreReward core_rewards = 2 [(gogoproto.castrepeated) = "CoreRewards", (gogoproto.nullable) = false];
repeated PartnerReward partner_rewards = 3 [(gogoproto.castrepeated) = "PartnerRewards", (gogoproto.nullable) = false];
option (gogoproto.goproto_stringer) = true;
}
message CoreReward {
bytes address = 1 [
(cosmos_proto.scalar) = "cosmos.AddressBytes",
(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/types.AccAddress"
];
string weight = 2 [
(cosmos_proto.scalar) = "cosmos.Dec",
(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec",
(gogoproto.nullable) = false
];
option (gogoproto.goproto_stringer) = true;
}
message PartnerReward {
bytes address = 1 [
(cosmos_proto.scalar) = "cosmos.AddressBytes",
(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/types.AccAddress"
];
cosmos.base.v1beta1.Coin rewards_per_second = 2[(gogoproto.nullable) = false];
option (gogoproto.goproto_stringer) = true;
}
// Period stores the specified start and end dates, and the inflation, expressed as a decimal
@ -35,3 +67,4 @@ message Period {
(gogoproto.moretags) = "yaml:\"inflation\""
];
}

View File

@ -0,0 +1,100 @@
package keeper
import (
"fmt"
"time"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/kava-labs/kava/x/kavadist/types"
)
func (k Keeper) mintInfrastructurePeriods(ctx sdk.Context, periods types.Periods, previousBlockTime time.Time) (sdk.Coin, sdk.Int, error) {
var err error
coinsMinted := sdk.NewCoin(types.GovDenom, sdk.ZeroInt())
timeElapsed := sdk.ZeroInt()
for _, period := range periods {
switch {
// Case 1 - period is fully expired
case period.End.Before(previousBlockTime):
continue
// Case 2 - period has ended since the previous block time
case period.End.After(previousBlockTime) && (period.End.Before(ctx.BlockTime()) || period.End.Equal(ctx.BlockTime())):
// calculate time elapsed relative to the periods end time
timeElapsed = sdk.NewInt(period.End.Unix() - previousBlockTime.Unix())
coins, errI := k.mintInflationaryCoins(ctx, period.Inflation, timeElapsed, types.GovDenom)
err = errI
if !coins.IsZero() {
coinsMinted = coinsMinted.Add(coins)
}
// update the value of previousBlockTime so that the next period starts from the end of the last
// period and not the original value of previousBlockTime
previousBlockTime = period.End
// Case 3 - period is ongoing
case (period.Start.Before(previousBlockTime) || period.Start.Equal(previousBlockTime)) && period.End.After(ctx.BlockTime()):
// calculate time elapsed relative to the current block time
timeElapsed = sdk.NewInt(ctx.BlockTime().Unix() - previousBlockTime.Unix())
coins, errI := k.mintInflationaryCoins(ctx, period.Inflation, timeElapsed, types.GovDenom)
if !coins.IsZero() {
coinsMinted = coinsMinted.Add(coins)
}
err = errI
// Case 4 - period hasn't started
case period.Start.After(ctx.BlockTime()) || period.Start.Equal(ctx.BlockTime()):
timeElapsed = sdk.NewInt(ctx.BlockTime().Unix() - previousBlockTime.Unix())
continue
}
if err != nil {
return sdk.Coin{}, sdk.Int{}, err
}
}
return coinsMinted, timeElapsed, nil
}
func (k Keeper) distributeInfrastructureCoins(ctx sdk.Context, partnerRewards types.PartnerRewards, coreRewards types.CoreRewards, timeElapsed sdk.Int, coinsToDistribute sdk.Coin) error {
if timeElapsed.IsZero() {
return nil
}
if coinsToDistribute.IsZero() {
return nil
}
for _, pr := range partnerRewards {
coinsToSend := sdk.NewCoin(types.GovDenom, pr.RewardsPerSecond.Amount.Mul(timeElapsed))
// TODO check balance, log if insufficient and return rather than error
err := k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, pr.Address, sdk.NewCoins(coinsToSend))
if err != nil {
return err
}
neg, updatedCoins := safeSub(coinsToDistribute, coinsToSend)
if neg {
return fmt.Errorf("negative coins")
}
coinsToDistribute = updatedCoins
}
for _, cr := range coreRewards {
coinsToSend := sdk.NewCoin(types.GovDenom, coinsToDistribute.Amount.ToDec().Mul(cr.Weight).RoundInt())
// TODO check balance, log if insufficient and return rather than error
err := k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, cr.Address, sdk.NewCoins(coinsToSend))
if err != nil {
return err
}
neg, updatedCoins := safeSub(coinsToDistribute, coinsToSend)
if neg {
return fmt.Errorf("negative coins")
}
coinsToDistribute = updatedCoins
}
return nil
}
func safeSub(a, b sdk.Coin) (bool, sdk.Coin) {
isNeg := a.IsLT(b)
if isNeg {
return true, sdk.Coin{}
}
return false, a.Sub(b)
}

View File

@ -1,6 +1,8 @@
package keeper
import (
"time"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/kava-labs/kava/x/kavadist/types"
@ -25,19 +27,37 @@ func (k Keeper) MintPeriodInflation(ctx sdk.Context) error {
k.SetPreviousBlockTime(ctx, previousBlockTime)
return nil
}
err := k.mintIncentivePeriods(ctx, params.Periods, previousBlockTime)
if err != nil {
return err
}
coinsToDistribute, timeElapsed, err := k.mintInfrastructurePeriods(ctx, params.InfrastructureParams.InfrastructurePeriods, previousBlockTime)
if err != nil {
return err
}
err = k.distributeInfrastructureCoins(ctx, params.InfrastructureParams.PartnerRewards, params.InfrastructureParams.CoreRewards, timeElapsed, coinsToDistribute)
if err != nil {
return err
}
k.SetPreviousBlockTime(ctx, ctx.BlockTime())
return nil
}
func (k Keeper) mintIncentivePeriods(ctx sdk.Context, periods types.Periods, previousBlockTime time.Time) error {
var err error
for _, period := range params.Periods {
for _, period := range periods {
switch {
// Case 1 - period is fully expired
case period.End.Before(previousBlockTime):
continue
// Case 2 - period has ended since the previous block time
case period.End.After(previousBlockTime) && period.End.Before(ctx.BlockTime()):
case period.End.After(previousBlockTime) && (period.End.Before(ctx.BlockTime()) || period.End.Equal(ctx.BlockTime())):
// calculate time elapsed relative to the periods end time
timeElapsed := sdk.NewInt(period.End.Unix() - previousBlockTime.Unix())
err = k.mintInflationaryCoins(ctx, period.Inflation, timeElapsed, types.GovDenom)
_, err = k.mintInflationaryCoins(ctx, period.Inflation, timeElapsed, types.GovDenom)
// update the value of previousBlockTime so that the next period starts from the end of the last
// period and not the original value of previousBlockTime
previousBlockTime = period.End
@ -46,7 +66,7 @@ func (k Keeper) MintPeriodInflation(ctx sdk.Context) error {
case (period.Start.Before(previousBlockTime) || period.Start.Equal(previousBlockTime)) && period.End.After(ctx.BlockTime()):
// calculate time elapsed relative to the current block time
timeElapsed := sdk.NewInt(ctx.BlockTime().Unix() - previousBlockTime.Unix())
err = k.mintInflationaryCoins(ctx, period.Inflation, timeElapsed, types.GovDenom)
_, err = k.mintInflationaryCoins(ctx, period.Inflation, timeElapsed, types.GovDenom)
// Case 4 - period hasn't started
case period.Start.After(ctx.BlockTime()) || period.Start.Equal(ctx.BlockTime()):
@ -57,11 +77,10 @@ func (k Keeper) MintPeriodInflation(ctx sdk.Context) error {
return err
}
}
k.SetPreviousBlockTime(ctx, ctx.BlockTime())
return nil
}
func (k Keeper) mintInflationaryCoins(ctx sdk.Context, inflationRate sdk.Dec, timePeriods sdk.Int, denom string) error {
func (k Keeper) mintInflationaryCoins(ctx sdk.Context, inflationRate sdk.Dec, timePeriods sdk.Int, denom string) (sdk.Coin, error) {
totalSupply := k.bankKeeper.GetSupply(ctx, denom)
// used to scale accumulator calculations by 10^18
scalar := sdk.NewInt(1000000000000000000)
@ -75,11 +94,11 @@ func (k Keeper) mintInflationaryCoins(ctx sdk.Context, inflationRate sdk.Dec, ti
// calculate the number of coins to mint
amountToMint := (sdk.NewDecFromInt(totalSupply.Amount).Mul(accumulator)).Sub(sdk.NewDecFromInt(totalSupply.Amount)).TruncateInt()
if amountToMint.IsZero() {
return nil
return sdk.Coin{}, nil
}
err := k.bankKeeper.MintCoins(ctx, types.KavaDistMacc, sdk.NewCoins(sdk.NewCoin(denom, amountToMint)))
if err != nil {
return err
return sdk.Coin{}, err
}
ctx.EventManager().EmitEvent(
@ -89,5 +108,5 @@ func (k Keeper) mintInflationaryCoins(ctx sdk.Context, inflationRate sdk.Dec, ti
),
)
return nil
return sdk.NewCoin(denom, amountToMint), nil
}

View File

@ -5,6 +5,7 @@ import (
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/kava-labs/kava/app"
"github.com/kava-labs/kava/x/kavadist/types"
)
@ -88,3 +89,290 @@ func (suite *keeperTestSuite) TestMintNotActive() {
finalSupply := suite.BankKeeper.GetSupply(suite.Ctx, types.GovDenom)
suite.Require().Equal(initialSupply, finalSupply)
}
func (suite *keeperTestSuite) TestInfraMinting() {
type args struct {
startTime time.Time
endTime time.Time
infraPeriods types.Periods
expectedFinalSupply sdk.Coin
marginOfError sdk.Dec
}
type errArgs struct {
expectPass bool
contains string
}
type test struct {
name string
args args
errArgs errArgs
}
testCases := []test{
{
"5% apy one year",
args{
startTime: time.Date(2022, time.October, 1, 1, 0, 0, 0, time.UTC),
endTime: time.Date(2023, time.October, 1, 1, 0, 0, 0, time.UTC),
infraPeriods: types.Periods{types.NewPeriod(time.Date(2022, time.October, 1, 1, 0, 0, 0, time.UTC), time.Date(2023, time.October, 1, 1, 0, 0, 0, time.UTC), sdk.MustNewDecFromStr("1.000000001547125958"))},
expectedFinalSupply: sdk.NewCoin(types.GovDenom, sdk.NewInt(1050000000000)),
marginOfError: sdk.MustNewDecFromStr("0.0001"),
},
errArgs{
expectPass: true,
contains: "",
},
},
{
"5% apy 10 seconds",
args{
startTime: time.Date(2022, time.October, 1, 1, 0, 0, 0, time.UTC),
endTime: time.Date(2022, time.October, 1, 1, 0, 10, 0, time.UTC),
infraPeriods: types.Periods{types.NewPeriod(time.Date(2022, time.October, 1, 1, 0, 0, 0, time.UTC), time.Date(2023, time.October, 1, 1, 0, 0, 0, time.UTC), sdk.MustNewDecFromStr("1.000000001547125958"))},
expectedFinalSupply: sdk.NewCoin(types.GovDenom, sdk.NewInt(1000000015471)),
marginOfError: sdk.MustNewDecFromStr("0.0001"),
},
errArgs{
expectPass: true,
contains: "",
},
},
}
for _, tc := range testCases {
suite.SetupTest()
params := types.NewParams(true, types.DefaultPeriods, types.NewInfraParams(tc.args.infraPeriods, types.DefaultInfraParams.PartnerRewards, types.DefaultInfraParams.CoreRewards))
ctx := suite.Ctx.WithBlockTime(tc.args.startTime)
suite.Keeper.SetParams(ctx, params)
suite.Require().NotPanics(func() {
suite.Keeper.SetPreviousBlockTime(ctx, tc.args.startTime)
})
ctx = suite.Ctx.WithBlockTime(tc.args.endTime)
err := suite.Keeper.MintPeriodInflation(ctx)
suite.Require().NoError(err)
finalSupply := suite.BankKeeper.GetSupply(ctx, types.GovDenom)
marginHigh := tc.args.expectedFinalSupply.Amount.ToDec().Mul(sdk.OneDec().Add(tc.args.marginOfError))
marginLow := tc.args.expectedFinalSupply.Amount.ToDec().Mul(sdk.OneDec().Sub(tc.args.marginOfError))
suite.Require().True(finalSupply.Amount.ToDec().LTE(marginHigh))
suite.Require().True(finalSupply.Amount.ToDec().GTE(marginLow))
}
}
func (suite *keeperTestSuite) TestInfraPayoutCore() {
type args struct {
startTime time.Time
endTime time.Time
infraPeriods types.Periods
expectedFinalSupply sdk.Coin
expectedBalanceIncrease sdk.Coin
marginOfError sdk.Dec
}
type errArgs struct {
expectPass bool
contains string
}
type test struct {
name string
args args
errArgs errArgs
}
testCases := []test{
{
"5% apy one year",
args{
startTime: time.Date(2022, time.October, 1, 1, 0, 0, 0, time.UTC),
endTime: time.Date(2023, time.October, 1, 1, 0, 0, 0, time.UTC),
infraPeriods: types.Periods{types.NewPeriod(time.Date(2022, time.October, 1, 1, 0, 0, 0, time.UTC), time.Date(2023, time.October, 1, 1, 0, 0, 0, time.UTC), sdk.MustNewDecFromStr("1.000000001547125958"))},
expectedFinalSupply: sdk.NewCoin(types.GovDenom, sdk.NewInt(1050000000000)),
expectedBalanceIncrease: sdk.NewCoin(types.GovDenom, sdk.NewInt(50000000000)),
marginOfError: sdk.MustNewDecFromStr("0.0001"),
},
errArgs{
expectPass: true,
contains: "",
},
},
}
for _, tc := range testCases {
suite.SetupTest()
coreReward := types.NewCoreReward(suite.Addrs[0], sdk.OneDec())
params := types.NewParams(true, types.DefaultPeriods, types.NewInfraParams(tc.args.infraPeriods, types.DefaultInfraParams.PartnerRewards, types.CoreRewards{coreReward}))
ctx := suite.Ctx.WithBlockTime(tc.args.startTime)
suite.Keeper.SetParams(ctx, params)
suite.Require().NotPanics(func() {
suite.Keeper.SetPreviousBlockTime(ctx, tc.args.startTime)
})
initialBalance := suite.BankKeeper.GetBalance(ctx, suite.Addrs[0], types.GovDenom)
ctx = suite.Ctx.WithBlockTime(tc.args.endTime)
err := suite.Keeper.MintPeriodInflation(ctx)
suite.Require().NoError(err)
finalSupply := suite.BankKeeper.GetSupply(ctx, types.GovDenom)
marginHigh := tc.args.expectedFinalSupply.Amount.ToDec().Mul(sdk.OneDec().Add(tc.args.marginOfError))
marginLow := tc.args.expectedFinalSupply.Amount.ToDec().Mul(sdk.OneDec().Sub(tc.args.marginOfError))
suite.Require().True(finalSupply.Amount.ToDec().LTE(marginHigh))
suite.Require().True(finalSupply.Amount.ToDec().GTE(marginLow))
finalBalance := suite.BankKeeper.GetBalance(ctx, suite.Addrs[0], types.GovDenom)
suite.Require().Equal(tc.args.expectedBalanceIncrease, finalBalance.Sub(initialBalance))
}
}
func (suite *keeperTestSuite) TestInfraPayoutPartner() {
type args struct {
startTime time.Time
endTime time.Time
infraPeriods types.Periods
expectedFinalSupply sdk.Coin
expectedBalanceIncrease sdk.Coin
marginOfError sdk.Dec
}
type errArgs struct {
expectPass bool
contains string
}
type test struct {
name string
args args
errArgs errArgs
}
testCases := []test{
{
"5% apy one year",
args{
startTime: time.Date(2022, time.October, 1, 1, 0, 0, 0, time.UTC),
endTime: time.Date(2023, time.October, 1, 1, 0, 0, 0, time.UTC),
infraPeriods: types.Periods{types.NewPeriod(time.Date(2022, time.October, 1, 1, 0, 0, 0, time.UTC), time.Date(2023, time.October, 1, 1, 0, 0, 0, time.UTC), sdk.MustNewDecFromStr("1.000000001547125958"))},
expectedFinalSupply: sdk.NewCoin(types.GovDenom, sdk.NewInt(1050000000000)),
expectedBalanceIncrease: sdk.NewCoin(types.GovDenom, sdk.NewInt(63072000)),
marginOfError: sdk.MustNewDecFromStr("0.0001"),
},
errArgs{
expectPass: true,
contains: "",
},
},
}
for _, tc := range testCases {
suite.SetupTest()
partnerReward := types.NewPartnerReward(suite.Addrs[0], sdk.NewCoin(types.GovDenom, sdk.NewInt(2)))
params := types.NewParams(true, types.DefaultPeriods, types.NewInfraParams(tc.args.infraPeriods, types.PartnerRewards{partnerReward}, types.DefaultInfraParams.CoreRewards))
ctx := suite.Ctx.WithBlockTime(tc.args.startTime)
suite.Keeper.SetParams(ctx, params)
suite.Require().NotPanics(func() {
suite.Keeper.SetPreviousBlockTime(ctx, tc.args.startTime)
})
initialBalance := suite.BankKeeper.GetBalance(ctx, suite.Addrs[0], types.GovDenom)
ctx = suite.Ctx.WithBlockTime(tc.args.endTime)
err := suite.Keeper.MintPeriodInflation(ctx)
suite.Require().NoError(err)
finalSupply := suite.BankKeeper.GetSupply(ctx, types.GovDenom)
marginHigh := tc.args.expectedFinalSupply.Amount.ToDec().Mul(sdk.OneDec().Add(tc.args.marginOfError))
marginLow := tc.args.expectedFinalSupply.Amount.ToDec().Mul(sdk.OneDec().Sub(tc.args.marginOfError))
suite.Require().True(finalSupply.Amount.ToDec().LTE(marginHigh))
suite.Require().True(finalSupply.Amount.ToDec().GTE(marginLow))
finalBalance := suite.BankKeeper.GetBalance(ctx, suite.Addrs[0], types.GovDenom)
suite.Require().Equal(tc.args.expectedBalanceIncrease, finalBalance.Sub(initialBalance))
}
}
func (suite *keeperTestSuite) TestInfraPayoutE2E() {
type balance struct {
address sdk.AccAddress
amount sdk.Coins
}
type balances []balance
type args struct {
periods types.Periods
startTime time.Time
endTime time.Time
infraPeriods types.Periods
coreRewards types.CoreRewards
partnerRewards types.PartnerRewards
expectedFinalSupply sdk.Coin
expectedBalances balances
marginOfError sdk.Dec
}
type errArgs struct {
expectPass bool
contains string
}
type test struct {
name string
args args
errArgs errArgs
}
_, addrs := app.GeneratePrivKeyAddressPairs(3)
testCases := []test{
{
"5% apy one year",
args{
periods: types.Periods{types.NewPeriod(time.Date(2022, time.October, 1, 1, 0, 0, 0, time.UTC), time.Date(2023, time.October, 1, 1, 0, 0, 0, time.UTC), sdk.MustNewDecFromStr("1.000000001547125958"))},
startTime: time.Date(2022, time.October, 1, 1, 0, 0, 0, time.UTC),
endTime: time.Date(2023, time.October, 1, 1, 0, 0, 0, time.UTC),
infraPeriods: types.Periods{types.NewPeriod(time.Date(2022, time.October, 1, 1, 0, 0, 0, time.UTC), time.Date(2023, time.October, 1, 1, 0, 0, 0, time.UTC), sdk.MustNewDecFromStr("1.000000001547125958"))},
coreRewards: types.CoreRewards{types.NewCoreReward(addrs[1], sdk.OneDec())},
partnerRewards: types.PartnerRewards{types.NewPartnerReward(addrs[2], sdk.NewCoin("ukava", sdk.NewInt(2)))},
expectedFinalSupply: sdk.NewCoin(types.GovDenom, sdk.NewInt(1102500000000)),
expectedBalances: balances{
balance{addrs[1], sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(52436928000)))},
balance{addrs[2], sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(63072000)))},
},
marginOfError: sdk.MustNewDecFromStr("0.0001"),
},
errArgs{
expectPass: true,
contains: "",
},
},
}
for _, tc := range testCases {
suite.SetupTest()
params := types.NewParams(true, tc.args.periods, types.NewInfraParams(tc.args.infraPeriods, tc.args.partnerRewards, tc.args.coreRewards))
ctx := suite.Ctx.WithBlockTime(tc.args.startTime)
suite.Keeper.SetParams(ctx, params)
suite.Require().NotPanics(func() {
suite.Keeper.SetPreviousBlockTime(ctx, tc.args.startTime)
})
ctx = suite.Ctx.WithBlockTime(tc.args.endTime)
err := suite.Keeper.MintPeriodInflation(ctx)
suite.Require().NoError(err)
finalSupply := suite.BankKeeper.GetSupply(ctx, types.GovDenom)
marginHigh := tc.args.expectedFinalSupply.Amount.ToDec().Mul(sdk.OneDec().Add(tc.args.marginOfError))
marginLow := tc.args.expectedFinalSupply.Amount.ToDec().Mul(sdk.OneDec().Sub(tc.args.marginOfError))
suite.Require().True(finalSupply.Amount.ToDec().LTE(marginHigh))
suite.Require().True(finalSupply.Amount.ToDec().GTE(marginLow))
for _, bal := range tc.args.expectedBalances {
finalBalance := suite.BankKeeper.GetAllBalances(ctx, bal.address)
suite.Require().Equal(bal.amount, finalBalance)
}
}
}

View File

@ -1,151 +0,0 @@
package v0_16
import (
"testing"
"time"
"github.com/cosmos/cosmos-sdk/codec"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/stretchr/testify/suite"
tmtime "github.com/tendermint/tendermint/types/time"
app "github.com/kava-labs/kava/app"
v015kavadist "github.com/kava-labs/kava/x/kavadist/legacy/v0_15"
v016kavadist "github.com/kava-labs/kava/x/kavadist/types"
)
type migrateTestSuite struct {
suite.Suite
addresses []sdk.AccAddress
v15genstate v015kavadist.GenesisState
cdc codec.Codec
legacyCdc *codec.LegacyAmino
}
func (s *migrateTestSuite) SetupTest() {
app.SetSDKConfig()
s.v15genstate = v015kavadist.GenesisState{
Params: v015kavadist.Params{},
PreviousBlockTime: tmtime.Canonical(time.Unix(1, 0)),
}
config := app.MakeEncodingConfig()
s.cdc = config.Marshaler
legacyCodec := codec.NewLegacyAmino()
s.legacyCdc = legacyCodec
_, accAddresses := app.GeneratePrivKeyAddressPairs(10)
s.addresses = accAddresses
}
func (s *migrateTestSuite) TestMigrate_JSON() {
// Migrate v15 kavadist to v16
data := `{
"params": {
"active": true,
"periods": [
{
"end": "2021-06-01T14:00:00Z",
"inflation": "1.000000000000000000",
"start": "2020-06-01T14:00:00Z"
},
{
"end": "2022-06-01T14:00:00Z",
"inflation": "1.000000002293273137",
"start": "2021-06-01T14:00:00Z"
},
{
"end": "2023-06-01T14:00:00Z",
"inflation": "1.000000001167363430",
"start": "2022-06-01T14:00:00Z"
},
{
"end": "2024-06-01T14:00:00Z",
"inflation": "1.000000000782997609",
"start": "2023-06-01T14:00:00Z"
}
]
},
"previous_block_time": "2021-11-05T21:13:12.85608847Z"
}`
err := s.legacyCdc.UnmarshalJSON([]byte(data), &s.v15genstate)
s.Require().NoError(err)
genstate := Migrate(s.v15genstate)
// Compare expect v16 kavadist json with migrated json
actual := s.cdc.MustMarshalJSON(genstate)
expected := `{
"params": {
"active": true,
"periods": [
{
"start": "2020-06-01T14:00:00Z",
"end": "2021-06-01T14:00:00Z",
"inflation": "1.000000000000000000"
},
{
"start": "2021-06-01T14:00:00Z",
"end": "2022-06-01T14:00:00Z",
"inflation": "1.000000002293273137"
},
{
"start": "2022-06-01T14:00:00Z",
"end": "2023-06-01T14:00:00Z",
"inflation": "1.000000001167363430"
},
{
"start": "2023-06-01T14:00:00Z",
"end": "2024-06-01T14:00:00Z",
"inflation": "1.000000000782997609"
}
]
},
"previous_block_time": "2021-11-05T21:13:12.856088470Z"
}`
s.Require().NoError(err)
s.Require().JSONEq(string(expected), string(actual))
}
func (s *migrateTestSuite) TestMigrate_Params() {
params := v015kavadist.Params{
Active: true,
Periods: v015kavadist.Periods{
{
Start: time.Date(2020, time.March, 1, 1, 0, 0, 0, time.UTC),
End: time.Date(2021, time.March, 1, 1, 0, 0, 0, time.UTC),
Inflation: sdk.MustNewDecFromStr("0.1"),
},
{
Start: time.Date(2010, time.March, 1, 1, 0, 0, 0, time.UTC),
End: time.Date(2011, time.March, 2, 1, 0, 0, 0, time.UTC),
Inflation: sdk.MustNewDecFromStr("0.01"),
},
},
}
expected := v016kavadist.Params{
Active: true,
Periods: []v016kavadist.Period{
{
Start: time.Date(2020, time.March, 1, 1, 0, 0, 0, time.UTC),
End: time.Date(2021, time.March, 1, 1, 0, 0, 0, time.UTC),
Inflation: sdk.MustNewDecFromStr("0.1"),
},
{
Start: time.Date(2010, time.March, 1, 1, 0, 0, 0, time.UTC),
End: time.Date(2011, time.March, 2, 1, 0, 0, 0, time.UTC),
Inflation: sdk.MustNewDecFromStr("0.01"),
},
},
}
s.v15genstate.Params = params
genState := Migrate(s.v15genstate)
s.Require().Equal(expected, genState.Params)
}
func TestMigrateTestSuite(t *testing.T) {
suite.Run(t, new(migrateTestSuite))
}

View File

@ -42,7 +42,7 @@ func RandomizedGenState(simState *module.SimulationState) {
func genRandomParams(simState *module.SimulationState) types.Params {
periods := genRandomPeriods(simState.Rand, simState.GenTimestamp)
params := types.NewParams(true, periods)
params := types.NewParams(true, periods, types.DefaultInfraParams)
return params
}

View File

@ -16,7 +16,7 @@ func ParamChanges(r *rand.Rand) []simtypes.ParamChange {
// Hacky way to validate periods since validation is wrapped in params
active := genRandomActive(r)
periods := genRandomPeriods(r, simtypes.RandTimestamp(r))
if err := types.NewParams(active, periods).Validate(); err != nil {
if err := types.NewParams(active, periods, types.DefaultInfraParams).Validate(); err != nil {
panic(err)
}

View File

@ -52,7 +52,7 @@ func (suite *Suite) SetupTest() {
Inflation: sdk.MustNewDecFromStr("1.000000003022265980"),
},
}
params := types.NewParams(true, testPeriods)
params := types.NewParams(true, testPeriods, types.DefaultInfraParams)
moduleGs := types.ModuleCdc.MustMarshalJSON(types.NewGenesisState(params, types.DefaultPreviousBlockTime))
gs := app.GenesisState{types.ModuleName: moduleGs}
tApp.InitializeFromGenesisStates(authGS, gs)

View File

@ -22,4 +22,5 @@ type BankKeeper interface {
GetAllBalances(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins
MintCoins(ctx sdk.Context, moduleName string, amounts sdk.Coins) error
GetSupply(ctx sdk.Context, denom string) sdk.Coin
SendCoinsFromModuleToAccount(ctx sdk.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error
}

View File

@ -15,38 +15,24 @@ import (
var (
KeyActive = []byte("Active")
KeyPeriods = []byte("Periods")
KeyInfra = []byte("InfrastructureParams")
DefaultActive = false
DefaultPeriods = []Period{}
DefaultInfraParams = InfrastructureParams{}
DefaultPreviousBlockTime = tmtime.Canonical(time.Unix(1, 0))
GovDenom = "ukava" // TODO: replace with cdptypes.DefaultGovDenom
)
// NewPeriod returns a new instance of Period
func NewPeriod(start time.Time, end time.Time, inflation sdk.Dec) Period {
return Period{
Start: start,
End: end,
Inflation: inflation,
}
}
// String implements fmt.Stringer
func (pr Period) String() string {
return fmt.Sprintf(`Period:
Start: %s
End: %s
Inflation: %s`, pr.Start, pr.End, pr.Inflation)
}
func NewParams(active bool, periods []Period) Params {
func NewParams(active bool, periods []Period, infraParams InfrastructureParams) Params {
return Params{
Active: active,
Periods: periods,
Active: active,
Periods: periods,
InfrastructureParams: infraParams,
}
}
func DefaultParams() Params {
return NewParams(DefaultActive, DefaultPeriods)
return NewParams(DefaultActive, DefaultPeriods, DefaultInfraParams)
}
func (p Params) String() string {
@ -87,6 +73,7 @@ func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs {
return paramtypes.ParamSetPairs{
paramtypes.NewParamSetPair(KeyActive, &p.Active, validateActiveParam),
paramtypes.NewParamSetPair(KeyPeriods, &p.Periods, validatePeriodsParams),
paramtypes.NewParamSetPair(KeyInfra, &p.InfrastructureParams, validateInfraParams),
}
}
@ -99,6 +86,47 @@ func (p Params) Validate() error {
return validatePeriodsParams(p.Periods)
}
// NewPeriod returns a new instance of Period
func NewPeriod(start time.Time, end time.Time, inflation sdk.Dec) Period {
return Period{
Start: start,
End: end,
Inflation: inflation,
}
}
type Periods []Period
// String implements fmt.Stringer
func (pr Period) String() string {
return fmt.Sprintf(`Period:
Start: %s
End: %s
Inflation: %s`, pr.Start, pr.End, pr.Inflation)
}
func NewInfraParams(p Periods, pr PartnerRewards, cr CoreRewards) InfrastructureParams {
return InfrastructureParams{
InfrastructurePeriods: p,
PartnerRewards: pr,
CoreRewards: cr,
}
}
func NewPartnerReward(addr sdk.AccAddress, rps sdk.Coin) PartnerReward {
return PartnerReward{
Address: addr,
RewardsPerSecond: rps,
}
}
func NewCoreReward(addr sdk.AccAddress, w sdk.Dec) CoreReward {
return CoreReward{
Address: addr,
Weight: w,
}
}
func validateActiveParam(i interface{}) error {
_, ok := i.(bool)
if !ok {
@ -134,3 +162,30 @@ func validatePeriodsParams(i interface{}) error {
return nil
}
func validateInfraParams(i interface{}) error {
infraParams, ok := i.(InfrastructureParams)
if !ok {
return fmt.Errorf("invalid parameter type: %T", i)
}
for _, pr := range infraParams.InfrastructurePeriods {
if pr.End.Before(pr.Start) {
return fmt.Errorf("end time for period is before start time: %s", pr)
}
prevEnd := tmtime.Canonical(time.Unix(0, 0))
if pr.Start.Before(prevEnd) {
return fmt.Errorf("periods must be in chronological order: %s", infraParams.InfrastructurePeriods)
}
prevEnd = pr.End
if pr.Start.Unix() <= 0 || pr.End.Unix() <= 0 {
return fmt.Errorf("start or end time cannot be zero: %s", pr)
}
// TODO: validate period Inflation?
}
return nil
}
type CoreRewards []CoreReward
type PartnerRewards []PartnerReward

View File

@ -5,7 +5,9 @@ package types
import (
fmt "fmt"
_ "github.com/cosmos/cosmos-proto"
github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types"
types "github.com/cosmos/cosmos-sdk/types"
_ "github.com/gogo/protobuf/gogoproto"
proto "github.com/gogo/protobuf/proto"
github_com_gogo_protobuf_types "github.com/gogo/protobuf/types"
@ -30,8 +32,9 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
// Params governance parameters for kavadist module
type Params struct {
Active bool `protobuf:"varint,1,opt,name=active,proto3" json:"active,omitempty" yaml:"active"`
Periods []Period `protobuf:"bytes,3,rep,name=periods,proto3" json:"periods" yaml:"periods"`
Active bool `protobuf:"varint,1,opt,name=active,proto3" json:"active,omitempty" yaml:"active"`
Periods []Period `protobuf:"bytes,3,rep,name=periods,proto3" json:"periods" yaml:"periods"`
InfrastructureParams InfrastructureParams `protobuf:"bytes,4,opt,name=infrastructure_params,json=infrastructureParams,proto3" json:"infrastructure_params"`
}
func (m *Params) Reset() { *m = Params{} }
@ -66,6 +69,121 @@ func (m *Params) XXX_DiscardUnknown() {
var xxx_messageInfo_Params proto.InternalMessageInfo
type InfrastructureParams struct {
InfrastructurePeriods Periods `protobuf:"bytes,1,rep,name=infrastructure_periods,json=infrastructurePeriods,proto3,castrepeated=Periods" json:"infrastructure_periods"`
CoreRewards CoreRewards `protobuf:"bytes,2,rep,name=core_rewards,json=coreRewards,proto3,castrepeated=CoreRewards" json:"core_rewards"`
PartnerRewards PartnerRewards `protobuf:"bytes,3,rep,name=partner_rewards,json=partnerRewards,proto3,castrepeated=PartnerRewards" json:"partner_rewards"`
}
func (m *InfrastructureParams) Reset() { *m = InfrastructureParams{} }
func (m *InfrastructureParams) String() string { return proto.CompactTextString(m) }
func (*InfrastructureParams) ProtoMessage() {}
func (*InfrastructureParams) Descriptor() ([]byte, []int) {
return fileDescriptor_2c7a7a4b0c884a4e, []int{1}
}
func (m *InfrastructureParams) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *InfrastructureParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_InfrastructureParams.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b)
if err != nil {
return nil, err
}
return b[:n], nil
}
}
func (m *InfrastructureParams) XXX_Merge(src proto.Message) {
xxx_messageInfo_InfrastructureParams.Merge(m, src)
}
func (m *InfrastructureParams) XXX_Size() int {
return m.Size()
}
func (m *InfrastructureParams) XXX_DiscardUnknown() {
xxx_messageInfo_InfrastructureParams.DiscardUnknown(m)
}
var xxx_messageInfo_InfrastructureParams proto.InternalMessageInfo
type CoreReward struct {
Address github_com_cosmos_cosmos_sdk_types.AccAddress `protobuf:"bytes,1,opt,name=address,proto3,casttype=github.com/cosmos/cosmos-sdk/types.AccAddress" json:"address,omitempty"`
Weight github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=weight,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"weight"`
}
func (m *CoreReward) Reset() { *m = CoreReward{} }
func (m *CoreReward) String() string { return proto.CompactTextString(m) }
func (*CoreReward) ProtoMessage() {}
func (*CoreReward) Descriptor() ([]byte, []int) {
return fileDescriptor_2c7a7a4b0c884a4e, []int{2}
}
func (m *CoreReward) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *CoreReward) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_CoreReward.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b)
if err != nil {
return nil, err
}
return b[:n], nil
}
}
func (m *CoreReward) XXX_Merge(src proto.Message) {
xxx_messageInfo_CoreReward.Merge(m, src)
}
func (m *CoreReward) XXX_Size() int {
return m.Size()
}
func (m *CoreReward) XXX_DiscardUnknown() {
xxx_messageInfo_CoreReward.DiscardUnknown(m)
}
var xxx_messageInfo_CoreReward proto.InternalMessageInfo
type PartnerReward struct {
Address github_com_cosmos_cosmos_sdk_types.AccAddress `protobuf:"bytes,1,opt,name=address,proto3,casttype=github.com/cosmos/cosmos-sdk/types.AccAddress" json:"address,omitempty"`
RewardsPerSecond types.Coin `protobuf:"bytes,2,opt,name=rewards_per_second,json=rewardsPerSecond,proto3" json:"rewards_per_second"`
}
func (m *PartnerReward) Reset() { *m = PartnerReward{} }
func (m *PartnerReward) String() string { return proto.CompactTextString(m) }
func (*PartnerReward) ProtoMessage() {}
func (*PartnerReward) Descriptor() ([]byte, []int) {
return fileDescriptor_2c7a7a4b0c884a4e, []int{3}
}
func (m *PartnerReward) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *PartnerReward) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_PartnerReward.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b)
if err != nil {
return nil, err
}
return b[:n], nil
}
}
func (m *PartnerReward) XXX_Merge(src proto.Message) {
xxx_messageInfo_PartnerReward.Merge(m, src)
}
func (m *PartnerReward) XXX_Size() int {
return m.Size()
}
func (m *PartnerReward) XXX_DiscardUnknown() {
xxx_messageInfo_PartnerReward.DiscardUnknown(m)
}
var xxx_messageInfo_PartnerReward proto.InternalMessageInfo
// Period stores the specified start and end dates, and the inflation, expressed as a decimal
// representing the yearly APR of KAVA tokens that will be minted during that period
type Period struct {
@ -80,7 +198,7 @@ type Period struct {
func (m *Period) Reset() { *m = Period{} }
func (*Period) ProtoMessage() {}
func (*Period) Descriptor() ([]byte, []int) {
return fileDescriptor_2c7a7a4b0c884a4e, []int{1}
return fileDescriptor_2c7a7a4b0c884a4e, []int{4}
}
func (m *Period) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -111,6 +229,9 @@ var xxx_messageInfo_Period proto.InternalMessageInfo
func init() {
proto.RegisterType((*Params)(nil), "kava.kavadist.v1beta1.Params")
proto.RegisterType((*InfrastructureParams)(nil), "kava.kavadist.v1beta1.InfrastructureParams")
proto.RegisterType((*CoreReward)(nil), "kava.kavadist.v1beta1.CoreReward")
proto.RegisterType((*PartnerReward)(nil), "kava.kavadist.v1beta1.PartnerReward")
proto.RegisterType((*Period)(nil), "kava.kavadist.v1beta1.Period")
}
@ -119,32 +240,51 @@ func init() {
}
var fileDescriptor_2c7a7a4b0c884a4e = []byte{
// 399 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x92, 0xb1, 0x8e, 0xd3, 0x30,
0x18, 0xc7, 0xe3, 0x0b, 0x04, 0xf0, 0x1d, 0x08, 0x22, 0x40, 0x51, 0x25, 0xec, 0xca, 0x03, 0x2a,
0x48, 0x67, 0xeb, 0x8e, 0xed, 0xc6, 0xe8, 0x26, 0x84, 0xc4, 0x29, 0x62, 0x62, 0xc2, 0x49, 0x7c,
0x21, 0xba, 0x24, 0x8e, 0x62, 0xb7, 0xa2, 0x2b, 0xe2, 0x01, 0xfa, 0x08, 0x3c, 0x4e, 0xc7, 0x8e,
0x15, 0x43, 0xa0, 0xed, 0xc2, 0xdc, 0x27, 0x40, 0xb1, 0x13, 0xca, 0x80, 0x74, 0x4b, 0xf2, 0x25,
0xf9, 0x7d, 0xbf, 0xef, 0xfb, 0x47, 0x86, 0xe4, 0x86, 0xcf, 0x38, 0xeb, 0x2e, 0x69, 0xae, 0x34,
0x9b, 0x9d, 0xc5, 0x42, 0xf3, 0x33, 0x56, 0xf3, 0x86, 0x97, 0x8a, 0xd6, 0x8d, 0xd4, 0xd2, 0x7f,
0xd6, 0x7d, 0xa6, 0x03, 0x43, 0x7b, 0x66, 0xf4, 0x34, 0x93, 0x99, 0x34, 0x04, 0xeb, 0x2a, 0x0b,
0x8f, 0x70, 0x26, 0x65, 0x56, 0x08, 0x66, 0x9e, 0xe2, 0xe9, 0x35, 0xd3, 0x79, 0x29, 0x94, 0xe6,
0x65, 0x6d, 0x01, 0xf2, 0x0d, 0x40, 0xef, 0xca, 0xe8, 0xfd, 0x57, 0xd0, 0xe3, 0x89, 0xce, 0x67,
0x22, 0x00, 0x63, 0x30, 0xb9, 0x1f, 0x3e, 0xd9, 0xb7, 0xf8, 0xe1, 0x9c, 0x97, 0xc5, 0x05, 0xb1,
0xef, 0x49, 0xd4, 0x03, 0xfe, 0x7b, 0x78, 0xaf, 0x16, 0x4d, 0x2e, 0x53, 0x15, 0xb8, 0x63, 0x77,
0x72, 0x7c, 0xfe, 0x82, 0xfe, 0x77, 0x2b, 0x7a, 0x65, 0xa8, 0xf0, 0xf9, 0xb2, 0xc5, 0xce, 0xbe,
0xc5, 0x8f, 0xac, 0xae, 0xef, 0x25, 0xd1, 0x60, 0x21, 0x5f, 0x8f, 0xa0, 0x67, 0x59, 0xff, 0x2d,
0xbc, 0xab, 0x34, 0x6f, 0xb4, 0xd9, 0xe2, 0xf8, 0x7c, 0x44, 0x6d, 0x04, 0x3a, 0x44, 0xa0, 0x1f,
0x86, 0x08, 0x61, 0xd0, 0x6b, 0x4f, 0xac, 0xd6, 0xb4, 0x91, 0xc5, 0x4f, 0x0c, 0x22, 0xab, 0xf0,
0x2f, 0xa1, 0x2b, 0xaa, 0x34, 0x38, 0xba, 0xd5, 0x34, 0x2c, 0x08, 0xad, 0x49, 0x54, 0xa9, 0xf5,
0x74, 0xed, 0xfe, 0x27, 0xf8, 0x20, 0xaf, 0xae, 0x0b, 0xae, 0x73, 0x59, 0x05, 0xee, 0x18, 0x4c,
0x4e, 0xc2, 0xb0, 0xe3, 0x7f, 0xb4, 0xf8, 0x65, 0x96, 0xeb, 0xcf, 0xd3, 0x98, 0x26, 0xb2, 0x64,
0x89, 0x54, 0xa5, 0x54, 0xfd, 0xed, 0x54, 0xa5, 0x37, 0x4c, 0xcf, 0x6b, 0xa1, 0xe8, 0xa5, 0x48,
0xf6, 0x2d, 0x7e, 0x6c, 0xcd, 0x7f, 0x45, 0x24, 0x3a, 0x48, 0x2f, 0xee, 0xfc, 0xfe, 0x8e, 0x41,
0xf8, 0x6e, 0xb9, 0x41, 0xce, 0x7a, 0x83, 0x9c, 0xe5, 0x16, 0x81, 0xd5, 0x16, 0x81, 0x5f, 0x5b,
0x04, 0x16, 0x3b, 0xe4, 0xac, 0x76, 0xc8, 0x59, 0xef, 0x90, 0xf3, 0xf1, 0xf5, 0x3f, 0xe3, 0xba,
0x7f, 0x7d, 0x5a, 0xf0, 0x58, 0x99, 0x8a, 0x7d, 0x39, 0x1c, 0x1b, 0x33, 0x36, 0xf6, 0x4c, 0xcc,
0x37, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xd6, 0x3b, 0xc2, 0x43, 0x54, 0x02, 0x00, 0x00,
// 696 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x54, 0xbd, 0x6f, 0xd3, 0x40,
0x14, 0xcf, 0x25, 0x21, 0xa5, 0x97, 0x7e, 0xe1, 0x7e, 0xc8, 0xad, 0x84, 0x1d, 0x2c, 0x84, 0x02,
0x28, 0xb6, 0x1a, 0xb6, 0x8a, 0xa5, 0xa6, 0x03, 0x20, 0x10, 0x95, 0xe9, 0x02, 0x4b, 0x38, 0xdb,
0x97, 0xd4, 0x6a, 0xe2, 0xb3, 0xee, 0x2e, 0x2d, 0x5d, 0xf9, 0x0b, 0x3a, 0x32, 0x76, 0x66, 0xee,
0xbf, 0x80, 0x94, 0x81, 0xa1, 0xea, 0x54, 0x31, 0xa4, 0xb4, 0x5d, 0x18, 0x98, 0x3a, 0x32, 0x21,
0xdf, 0x5d, 0x92, 0xa6, 0x6a, 0x50, 0x59, 0x58, 0x12, 0xbf, 0x8f, 0xdf, 0xef, 0xbd, 0xdf, 0xdd,
0x7b, 0x07, 0xad, 0x2d, 0xb4, 0x8d, 0x9c, 0xf4, 0x27, 0x8c, 0x18, 0x77, 0xb6, 0x97, 0x7d, 0xcc,
0xd1, 0xb2, 0x93, 0x20, 0x8a, 0x5a, 0xcc, 0x4e, 0x28, 0xe1, 0x44, 0x9b, 0x4f, 0xc3, 0x76, 0x2f,
0xc7, 0x56, 0x39, 0x4b, 0x73, 0x0d, 0xd2, 0x20, 0x22, 0xc3, 0x49, 0xbf, 0x64, 0xf2, 0x92, 0x11,
0x10, 0xd6, 0x22, 0xcc, 0xf1, 0x11, 0xc3, 0x7d, 0xba, 0x80, 0x44, 0xb1, 0x8a, 0x2f, 0xca, 0x78,
0x4d, 0x02, 0xa5, 0xa1, 0x42, 0x66, 0x83, 0x90, 0x46, 0x13, 0x3b, 0xc2, 0xf2, 0xdb, 0x75, 0x87,
0x47, 0x2d, 0xcc, 0x38, 0x6a, 0x25, 0x32, 0xc1, 0xfa, 0x05, 0x60, 0x61, 0x5d, 0x74, 0xa6, 0x3d,
0x84, 0x05, 0x14, 0xf0, 0x68, 0x1b, 0xeb, 0xa0, 0x04, 0xca, 0xb7, 0xdd, 0x3b, 0x17, 0x5d, 0x73,
0x72, 0x17, 0xb5, 0x9a, 0x2b, 0x96, 0xf4, 0x5b, 0x9e, 0x4a, 0xd0, 0xde, 0xc0, 0xb1, 0x04, 0xd3,
0x88, 0x84, 0x4c, 0xcf, 0x95, 0x72, 0xe5, 0x62, 0xf5, 0xae, 0x7d, 0xad, 0x20, 0x7b, 0x5d, 0x64,
0xb9, 0x0b, 0x9d, 0xae, 0x99, 0xb9, 0xe8, 0x9a, 0x53, 0x92, 0x4e, 0x61, 0x2d, 0xaf, 0xc7, 0xa2,
0xd5, 0xe1, 0x7c, 0x14, 0xd7, 0x29, 0x62, 0x9c, 0xb6, 0x03, 0xde, 0xa6, 0xb8, 0x26, 0x8f, 0x4b,
0xcf, 0x97, 0x40, 0xb9, 0x58, 0x7d, 0x3c, 0x82, 0xfe, 0xc5, 0x10, 0x46, 0xea, 0x70, 0xf3, 0x69,
0x31, 0x6f, 0x2e, 0xba, 0x26, 0x66, 0x7d, 0xcd, 0xc2, 0xb9, 0xeb, 0x40, 0x1a, 0x86, 0x0b, 0x57,
0x1b, 0x50, 0x02, 0xc1, 0x4d, 0x04, 0x4e, 0xa7, 0x35, 0xbf, 0x9c, 0x98, 0x63, 0xd2, 0x66, 0xde,
0x15, 0x39, 0xca, 0xad, 0xbd, 0x83, 0x13, 0x01, 0xa1, 0xb8, 0x46, 0xf1, 0x0e, 0xa2, 0x21, 0xd3,
0xb3, 0x82, 0xfc, 0xde, 0x08, 0xf2, 0x67, 0x84, 0x62, 0x4f, 0x64, 0xba, 0xb3, 0xaa, 0x40, 0x71,
0xe0, 0x63, 0x5e, 0x31, 0x18, 0x18, 0x1a, 0x86, 0xd3, 0x09, 0xa2, 0x3c, 0xc6, 0xb4, 0xcf, 0x2e,
0xef, 0xe6, 0xfe, 0xa8, 0xd6, 0x65, 0xb6, 0x2a, 0xb0, 0xa0, 0x0a, 0x4c, 0x0d, 0xb9, 0x99, 0x37,
0x95, 0x0c, 0xd9, 0x2b, 0xf9, 0xcf, 0xfb, 0x26, 0xb0, 0xbe, 0x01, 0x08, 0x07, 0x9d, 0x68, 0x3e,
0x1c, 0x43, 0x61, 0x48, 0x31, 0x63, 0x62, 0x76, 0x26, 0xdc, 0xe7, 0xbf, 0xbb, 0x66, 0xa5, 0x11,
0xf1, 0xcd, 0xb6, 0x6f, 0x07, 0xa4, 0xa5, 0x86, 0x52, 0xfd, 0x55, 0x58, 0xb8, 0xe5, 0xf0, 0xdd,
0x04, 0x33, 0x7b, 0x35, 0x08, 0x56, 0x25, 0xf0, 0xe8, 0xa0, 0x32, 0xab, 0x46, 0x57, 0x79, 0xdc,
0x5d, 0x8e, 0x99, 0xd7, 0x23, 0xd6, 0x36, 0x60, 0x61, 0x07, 0x47, 0x8d, 0x4d, 0xae, 0x67, 0x4b,
0xa0, 0x3c, 0xee, 0x3e, 0x4d, 0x1b, 0xfe, 0xde, 0x35, 0x1f, 0xdc, 0xa0, 0xcc, 0x1a, 0x0e, 0x8e,
0x0e, 0x2a, 0x50, 0xf1, 0xaf, 0xe1, 0xc0, 0x53, 0x5c, 0x4a, 0x4e, 0x07, 0xc0, 0xc9, 0x21, 0xdd,
0xff, 0x45, 0xd1, 0x6b, 0xa8, 0xa9, 0x9b, 0x4a, 0x87, 0xad, 0xc6, 0x70, 0x40, 0xe2, 0x50, 0xa8,
0x2b, 0x56, 0x17, 0x6d, 0x05, 0x4d, 0x97, 0xfe, 0xd2, 0x40, 0x44, 0xb1, 0x9a, 0xef, 0x19, 0x05,
0x5d, 0xc7, 0xf4, 0xad, 0x00, 0x2a, 0x29, 0x9f, 0xb2, 0xb0, 0x20, 0xa7, 0x4d, 0x7b, 0x09, 0x6f,
0x31, 0x8e, 0x28, 0x17, 0x0a, 0x8a, 0xd5, 0x25, 0x5b, 0x3e, 0x06, 0x76, 0xef, 0x31, 0xb0, 0x37,
0x7a, 0x8f, 0x81, 0xab, 0xab, 0x05, 0x9d, 0x90, 0x0b, 0x2a, 0x60, 0xd6, 0xde, 0x89, 0x09, 0x3c,
0x49, 0xa1, 0xad, 0xc1, 0x1c, 0xee, 0x37, 0xf7, 0x37, 0xa6, 0xde, 0xaa, 0x43, 0xc9, 0x84, 0xe3,
0x50, 0xf2, 0xa4, 0x70, 0xed, 0x03, 0x1c, 0x8f, 0xe2, 0x7a, 0x13, 0xf1, 0x88, 0xc4, 0x7a, 0x4e,
0x9c, 0xab, 0xfb, 0x6f, 0xd7, 0x78, 0xd1, 0x35, 0x67, 0x24, 0x73, 0x9f, 0xc8, 0xf2, 0x06, 0xa4,
0x2b, 0xf9, 0x9f, 0xfb, 0x26, 0x70, 0x5f, 0x75, 0x4e, 0x8d, 0xcc, 0xf1, 0xa9, 0x91, 0xe9, 0x9c,
0x19, 0xe0, 0xf0, 0xcc, 0x00, 0x3f, 0xce, 0x0c, 0xb0, 0x77, 0x6e, 0x64, 0x0e, 0xcf, 0x8d, 0xcc,
0xf1, 0xb9, 0x91, 0x79, 0xff, 0xe8, 0x52, 0xb9, 0x74, 0x33, 0x2a, 0x4d, 0xe4, 0x33, 0xf1, 0xe5,
0x7c, 0x1c, 0xbc, 0xdd, 0xa2, 0xac, 0x5f, 0x10, 0x32, 0x9f, 0xfc, 0x09, 0x00, 0x00, 0xff, 0xff,
0xb2, 0xbd, 0x98, 0xf3, 0xd9, 0x05, 0x00, 0x00,
}
func (this *Period) Equal(that interface{}) bool {
@ -197,6 +337,16 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
{
size, err := m.InfrastructureParams.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintParams(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x22
if len(m.Periods) > 0 {
for iNdEx := len(m.Periods) - 1; iNdEx >= 0; iNdEx-- {
{
@ -224,6 +374,151 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) {
return len(dAtA) - i, nil
}
func (m *InfrastructureParams) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *InfrastructureParams) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *InfrastructureParams) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
if len(m.PartnerRewards) > 0 {
for iNdEx := len(m.PartnerRewards) - 1; iNdEx >= 0; iNdEx-- {
{
size, err := m.PartnerRewards[iNdEx].MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintParams(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x1a
}
}
if len(m.CoreRewards) > 0 {
for iNdEx := len(m.CoreRewards) - 1; iNdEx >= 0; iNdEx-- {
{
size, err := m.CoreRewards[iNdEx].MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintParams(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x12
}
}
if len(m.InfrastructurePeriods) > 0 {
for iNdEx := len(m.InfrastructurePeriods) - 1; iNdEx >= 0; iNdEx-- {
{
size, err := m.InfrastructurePeriods[iNdEx].MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintParams(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0xa
}
}
return len(dAtA) - i, nil
}
func (m *CoreReward) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *CoreReward) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *CoreReward) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
{
size := m.Weight.Size()
i -= size
if _, err := m.Weight.MarshalTo(dAtA[i:]); err != nil {
return 0, err
}
i = encodeVarintParams(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x12
if len(m.Address) > 0 {
i -= len(m.Address)
copy(dAtA[i:], m.Address)
i = encodeVarintParams(dAtA, i, uint64(len(m.Address)))
i--
dAtA[i] = 0xa
}
return len(dAtA) - i, nil
}
func (m *PartnerReward) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *PartnerReward) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *PartnerReward) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
{
size, err := m.RewardsPerSecond.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintParams(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x12
if len(m.Address) > 0 {
i -= len(m.Address)
copy(dAtA[i:], m.Address)
i = encodeVarintParams(dAtA, i, uint64(len(m.Address)))
i--
dAtA[i] = 0xa
}
return len(dAtA) - i, nil
}
func (m *Period) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@ -254,20 +549,20 @@ func (m *Period) MarshalToSizedBuffer(dAtA []byte) (int, error) {
}
i--
dAtA[i] = 0x1a
n1, err1 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.End, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.End):])
if err1 != nil {
return 0, err1
n3, err3 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.End, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.End):])
if err3 != nil {
return 0, err3
}
i -= n1
i = encodeVarintParams(dAtA, i, uint64(n1))
i -= n3
i = encodeVarintParams(dAtA, i, uint64(n3))
i--
dAtA[i] = 0x12
n2, err2 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Start):])
if err2 != nil {
return 0, err2
n4, err4 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Start):])
if err4 != nil {
return 0, err4
}
i -= n2
i = encodeVarintParams(dAtA, i, uint64(n2))
i -= n4
i = encodeVarintParams(dAtA, i, uint64(n4))
i--
dAtA[i] = 0xa
return len(dAtA) - i, nil
@ -299,6 +594,65 @@ func (m *Params) Size() (n int) {
n += 1 + l + sovParams(uint64(l))
}
}
l = m.InfrastructureParams.Size()
n += 1 + l + sovParams(uint64(l))
return n
}
func (m *InfrastructureParams) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
if len(m.InfrastructurePeriods) > 0 {
for _, e := range m.InfrastructurePeriods {
l = e.Size()
n += 1 + l + sovParams(uint64(l))
}
}
if len(m.CoreRewards) > 0 {
for _, e := range m.CoreRewards {
l = e.Size()
n += 1 + l + sovParams(uint64(l))
}
}
if len(m.PartnerRewards) > 0 {
for _, e := range m.PartnerRewards {
l = e.Size()
n += 1 + l + sovParams(uint64(l))
}
}
return n
}
func (m *CoreReward) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
l = len(m.Address)
if l > 0 {
n += 1 + l + sovParams(uint64(l))
}
l = m.Weight.Size()
n += 1 + l + sovParams(uint64(l))
return n
}
func (m *PartnerReward) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
l = len(m.Address)
if l > 0 {
n += 1 + l + sovParams(uint64(l))
}
l = m.RewardsPerSecond.Size()
n += 1 + l + sovParams(uint64(l))
return n
}
@ -406,6 +760,426 @@ func (m *Params) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
case 4:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field InfrastructureParams", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowParams
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthParams
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthParams
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
if err := m.InfrastructureParams.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipParams(dAtA[iNdEx:])
if err != nil {
return err
}
if (skippy < 0) || (iNdEx+skippy) < 0 {
return ErrInvalidLengthParams
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *InfrastructureParams) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowParams
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: InfrastructureParams: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: InfrastructureParams: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field InfrastructurePeriods", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowParams
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthParams
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthParams
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.InfrastructurePeriods = append(m.InfrastructurePeriods, Period{})
if err := m.InfrastructurePeriods[len(m.InfrastructurePeriods)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
case 2:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field CoreRewards", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowParams
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthParams
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthParams
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.CoreRewards = append(m.CoreRewards, CoreReward{})
if err := m.CoreRewards[len(m.CoreRewards)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
case 3:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field PartnerRewards", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowParams
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthParams
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthParams
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.PartnerRewards = append(m.PartnerRewards, PartnerReward{})
if err := m.PartnerRewards[len(m.PartnerRewards)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipParams(dAtA[iNdEx:])
if err != nil {
return err
}
if (skippy < 0) || (iNdEx+skippy) < 0 {
return ErrInvalidLengthParams
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *CoreReward) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowParams
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: CoreReward: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: CoreReward: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType)
}
var byteLen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowParams
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
byteLen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if byteLen < 0 {
return ErrInvalidLengthParams
}
postIndex := iNdEx + byteLen
if postIndex < 0 {
return ErrInvalidLengthParams
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Address = append(m.Address[:0], dAtA[iNdEx:postIndex]...)
if m.Address == nil {
m.Address = []byte{}
}
iNdEx = postIndex
case 2:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Weight", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowParams
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthParams
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthParams
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
if err := m.Weight.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipParams(dAtA[iNdEx:])
if err != nil {
return err
}
if (skippy < 0) || (iNdEx+skippy) < 0 {
return ErrInvalidLengthParams
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *PartnerReward) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowParams
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: PartnerReward: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: PartnerReward: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType)
}
var byteLen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowParams
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
byteLen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if byteLen < 0 {
return ErrInvalidLengthParams
}
postIndex := iNdEx + byteLen
if postIndex < 0 {
return ErrInvalidLengthParams
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Address = append(m.Address[:0], dAtA[iNdEx:postIndex]...)
if m.Address == nil {
m.Address = []byte{}
}
iNdEx = postIndex
case 2:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field RewardsPerSecond", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowParams
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthParams
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthParams
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
if err := m.RewardsPerSecond.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipParams(dAtA[iNdEx:])