Merge PR #5610: proto: migrate x/distr to use hybrid codec
This commit is contained in:
parent
61c9902aae
commit
56c5868975
|
@ -83,6 +83,15 @@ for JSON encoding.
|
||||||
* Every reference of `crypto.Pubkey` in context of a `Validator` is now of type string. `GetPubKeyFromBech32` must be used to get the `crypto.Pubkey`.
|
* Every reference of `crypto.Pubkey` in context of a `Validator` is now of type string. `GetPubKeyFromBech32` must be used to get the `crypto.Pubkey`.
|
||||||
* The `Keeper` constructor now takes a `codec.Marshaler` instead of a concrete Amino codec. This exact type
|
* The `Keeper` constructor now takes a `codec.Marshaler` instead of a concrete Amino codec. This exact type
|
||||||
provided is specified by `ModuleCdc`.
|
provided is specified by `ModuleCdc`.
|
||||||
|
* (distr) [\#5610](https://github.com/cosmos/cosmos-sdk/pull/5610) Migrate the `x/distribution` module to use Protocol Buffer for state
|
||||||
|
serialization instead of Amino. The exact codec used is `codec.HybridCodec` which utilizes Protobuf for binary encoding and Amino
|
||||||
|
for JSON encoding.
|
||||||
|
* `ValidatorHistoricalRewards.ReferenceCount` is now of types `uint32` instead of `uint16`.
|
||||||
|
* `ValidatorSlashEvents` is now a struct with `slashevents`.
|
||||||
|
* `ValidatorOutstandingRewards` is now a struct with `rewards`.
|
||||||
|
* `ValidatorAccumulatedCommission` is now a struct with `commission`.
|
||||||
|
* The `Keeper` constructor now takes a `codec.Marshaler` instead of a concrete Amino codec. This exact type
|
||||||
|
provided is specified by `ModuleCdc`.
|
||||||
|
|
||||||
### Improvements
|
### Improvements
|
||||||
|
|
||||||
|
|
23
Makefile
23
Makefile
|
@ -238,4 +238,25 @@ proto-lint:
|
||||||
proto-check-breaking:
|
proto-check-breaking:
|
||||||
@buf check breaking --against-input '.git#branch=master'
|
@buf check breaking --against-input '.git#branch=master'
|
||||||
|
|
||||||
.PHONY: proto-all proto-gen proto-lint proto-check-breaking
|
# Origin
|
||||||
|
# TODO: Update to the version of Tendermint that is being used in go.mod
|
||||||
|
version_branch = v0.33.0
|
||||||
|
tendermint = https://raw.githubusercontent.com/tendermint/tendermint/$(version_branch)
|
||||||
|
|
||||||
|
# Outputs
|
||||||
|
tmkv = third_party/proto/tendermint/libs/kv/types.proto
|
||||||
|
tmmerkle = third_party/proto/tendermint/crypto/merkle/merkle.proto
|
||||||
|
tmabci = third_party/proto/tendermint/abci/types/types.proto
|
||||||
|
|
||||||
|
# You *only* need to run this to rebuild protobufs from the tendermint source
|
||||||
|
proto-update-tendermint:
|
||||||
|
@curl $(tendermint)/abci/types/types.proto > $(tmabci)
|
||||||
|
sed -i '' '8,9 s|github.com/tendermint|third_party/proto|g' $(tmabci)
|
||||||
|
sed -i '' '7 s|github.com/gogo/protobuf|third_party/proto|' $(tmabci)
|
||||||
|
@curl $(tendermint)/libs/kv/types.proto > $(tmkv)
|
||||||
|
sed -i '' 's|github.com/gogo/protobuf|third_party/proto|' $(tmkv)
|
||||||
|
@curl $(tendermint)/crypto/merkle/merkle.proto > $(tmmerkle)
|
||||||
|
sed -i '' '7 s|github.com/gogo/protobuf|third_party/proto|' $(tmmerkle)
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: proto-all proto-gen proto-lint proto-check-breaking proto-update-tendermint
|
||||||
|
|
|
@ -48,7 +48,7 @@ UNAME_M ?= $(shell uname -m)
|
||||||
GOPATH ?= $(shell $(GO) env GOPATH)
|
GOPATH ?= $(shell $(GO) env GOPATH)
|
||||||
GITHUBDIR := $(GOPATH)$(FS)src$(FS)github.com
|
GITHUBDIR := $(GOPATH)$(FS)src$(FS)github.com
|
||||||
|
|
||||||
BUF_VERSION ?= 0.4.0
|
BUF_VERSION ?= 0.7.0
|
||||||
|
|
||||||
TOOLS_DESTDIR ?= $(GOPATH)/bin
|
TOOLS_DESTDIR ?= $(GOPATH)/bin
|
||||||
STATIK = $(TOOLS_DESTDIR)/statik
|
STATIK = $(TOOLS_DESTDIR)/statik
|
||||||
|
|
|
@ -179,7 +179,7 @@ func NewSimApp(
|
||||||
app.SupplyKeeper, auth.FeeCollectorName,
|
app.SupplyKeeper, auth.FeeCollectorName,
|
||||||
)
|
)
|
||||||
app.DistrKeeper = distr.NewKeeper(
|
app.DistrKeeper = distr.NewKeeper(
|
||||||
app.cdc, keys[distr.StoreKey], app.subspaces[distr.ModuleName], app.BankKeeper, &stakingKeeper,
|
appCodec.Distribution, keys[distr.StoreKey], app.subspaces[distr.ModuleName], app.BankKeeper, &stakingKeeper,
|
||||||
app.SupplyKeeper, auth.FeeCollectorName, app.ModuleAccountAddrs(),
|
app.SupplyKeeper, auth.FeeCollectorName, app.ModuleAccountAddrs(),
|
||||||
)
|
)
|
||||||
app.SlashingKeeper = slashing.NewKeeper(
|
app.SlashingKeeper = slashing.NewKeeper(
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"github.com/cosmos/cosmos-sdk/codec"
|
"github.com/cosmos/cosmos-sdk/codec"
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
"github.com/cosmos/cosmos-sdk/x/auth/vesting"
|
"github.com/cosmos/cosmos-sdk/x/auth/vesting"
|
||||||
|
distr "github.com/cosmos/cosmos-sdk/x/distribution"
|
||||||
"github.com/cosmos/cosmos-sdk/x/staking"
|
"github.com/cosmos/cosmos-sdk/x/staking"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -12,15 +13,17 @@ import (
|
||||||
type AppCodec struct {
|
type AppCodec struct {
|
||||||
amino *codec.Codec
|
amino *codec.Codec
|
||||||
|
|
||||||
Staking *staking.Codec
|
Staking *staking.Codec
|
||||||
|
Distribution *distr.Codec
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewAppCodec() *AppCodec {
|
func NewAppCodec() *AppCodec {
|
||||||
amino := MakeCodec()
|
amino := MakeCodec()
|
||||||
|
|
||||||
return &AppCodec{
|
return &AppCodec{
|
||||||
amino: amino,
|
amino: amino,
|
||||||
Staking: staking.NewCodec(amino),
|
Staking: staking.NewCodec(amino),
|
||||||
|
Distribution: distr.NewCodec(amino),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -87,9 +87,8 @@ func (app *SimApp) prepForZeroHeightGenesis(ctx sdk.Context, jailWhiteList []str
|
||||||
|
|
||||||
// reinitialize all validators
|
// reinitialize all validators
|
||||||
app.StakingKeeper.IterateValidators(ctx, func(_ int64, val exported.ValidatorI) (stop bool) {
|
app.StakingKeeper.IterateValidators(ctx, func(_ int64, val exported.ValidatorI) (stop bool) {
|
||||||
|
|
||||||
// donate any unwithdrawn outstanding reward fraction tokens to the community pool
|
// donate any unwithdrawn outstanding reward fraction tokens to the community pool
|
||||||
scraps := app.DistrKeeper.GetValidatorOutstandingRewards(ctx, val.GetOperator())
|
scraps := app.DistrKeeper.GetValidatorOutstandingRewardsCoins(ctx, val.GetOperator())
|
||||||
feePool := app.DistrKeeper.GetFeePool(ctx)
|
feePool := app.DistrKeeper.GetFeePool(ctx)
|
||||||
feePool.CommunityPool = feePool.CommunityPool.Add(scraps...)
|
feePool.CommunityPool = feePool.CommunityPool.Add(scraps...)
|
||||||
app.DistrKeeper.SetFeePool(ctx, feePool)
|
app.DistrKeeper.SetFeePool(ctx, feePool)
|
||||||
|
|
|
@ -18,7 +18,6 @@ option (gogoproto.marshaler_all) = true;
|
||||||
option (gogoproto.unmarshaler_all) = true;
|
option (gogoproto.unmarshaler_all) = true;
|
||||||
option (gogoproto.sizer_all) = true;
|
option (gogoproto.sizer_all) = true;
|
||||||
option (gogoproto.goproto_registration) = true;
|
option (gogoproto.goproto_registration) = true;
|
||||||
|
|
||||||
// Generate tests
|
// Generate tests
|
||||||
option (gogoproto.populate_all) = true;
|
option (gogoproto.populate_all) = true;
|
||||||
option (gogoproto.equal_all) = true;
|
option (gogoproto.equal_all) = true;
|
||||||
|
@ -43,9 +42,12 @@ message Request {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
message RequestEcho { string message = 1; }
|
message RequestEcho {
|
||||||
|
string message = 1;
|
||||||
|
}
|
||||||
|
|
||||||
message RequestFlush {}
|
message RequestFlush {
|
||||||
|
}
|
||||||
|
|
||||||
message RequestInfo {
|
message RequestInfo {
|
||||||
string version = 1;
|
string version = 1;
|
||||||
|
@ -60,11 +62,10 @@ message RequestSetOption {
|
||||||
}
|
}
|
||||||
|
|
||||||
message RequestInitChain {
|
message RequestInitChain {
|
||||||
google.protobuf.Timestamp time = 1
|
google.protobuf.Timestamp time = 1 [(gogoproto.nullable)=false, (gogoproto.stdtime)=true];
|
||||||
[ (gogoproto.nullable) = false, (gogoproto.stdtime) = true ];
|
|
||||||
string chain_id = 2;
|
string chain_id = 2;
|
||||||
ConsensusParams consensus_params = 3;
|
ConsensusParams consensus_params = 3;
|
||||||
repeated ValidatorUpdate validators = 4 [ (gogoproto.nullable) = false ];
|
repeated ValidatorUpdate validators = 4 [(gogoproto.nullable)=false];
|
||||||
bytes app_state_bytes = 5;
|
bytes app_state_bytes = 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,9 +78,9 @@ message RequestQuery {
|
||||||
|
|
||||||
message RequestBeginBlock {
|
message RequestBeginBlock {
|
||||||
bytes hash = 1;
|
bytes hash = 1;
|
||||||
Header header = 2 [ (gogoproto.nullable) = false ];
|
Header header = 2 [(gogoproto.nullable)=false];
|
||||||
LastCommitInfo last_commit_info = 3 [ (gogoproto.nullable) = false ];
|
LastCommitInfo last_commit_info = 3 [(gogoproto.nullable)=false];
|
||||||
repeated Evidence byzantine_validators = 4 [ (gogoproto.nullable) = false ];
|
repeated Evidence byzantine_validators = 4 [(gogoproto.nullable)=false];
|
||||||
}
|
}
|
||||||
|
|
||||||
enum CheckTxType {
|
enum CheckTxType {
|
||||||
|
@ -92,11 +93,16 @@ message RequestCheckTx {
|
||||||
CheckTxType type = 2;
|
CheckTxType type = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
message RequestDeliverTx { bytes tx = 1; }
|
message RequestDeliverTx {
|
||||||
|
bytes tx = 1;
|
||||||
|
}
|
||||||
|
|
||||||
message RequestEndBlock { int64 height = 1; }
|
message RequestEndBlock {
|
||||||
|
int64 height = 1;
|
||||||
|
}
|
||||||
|
|
||||||
message RequestCommit {}
|
message RequestCommit {
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------
|
//----------------------------------------
|
||||||
// Response types
|
// Response types
|
||||||
|
@ -119,11 +125,16 @@ message Response {
|
||||||
}
|
}
|
||||||
|
|
||||||
// nondeterministic
|
// nondeterministic
|
||||||
message ResponseException { string error = 1; }
|
message ResponseException {
|
||||||
|
string error = 1;
|
||||||
|
}
|
||||||
|
|
||||||
message ResponseEcho { string message = 1; }
|
message ResponseEcho {
|
||||||
|
string message = 1;
|
||||||
|
}
|
||||||
|
|
||||||
message ResponseFlush {}
|
message ResponseFlush {
|
||||||
|
}
|
||||||
|
|
||||||
message ResponseInfo {
|
message ResponseInfo {
|
||||||
string data = 1;
|
string data = 1;
|
||||||
|
@ -145,13 +156,13 @@ message ResponseSetOption {
|
||||||
|
|
||||||
message ResponseInitChain {
|
message ResponseInitChain {
|
||||||
ConsensusParams consensus_params = 1;
|
ConsensusParams consensus_params = 1;
|
||||||
repeated ValidatorUpdate validators = 2 [ (gogoproto.nullable) = false ];
|
repeated ValidatorUpdate validators = 2 [(gogoproto.nullable)=false];
|
||||||
}
|
}
|
||||||
|
|
||||||
message ResponseQuery {
|
message ResponseQuery {
|
||||||
uint32 code = 1;
|
uint32 code = 1;
|
||||||
// bytes data = 2; // use "value" instead.
|
// bytes data = 2; // use "value" instead.
|
||||||
string log = 3; // nondeterministic
|
string log = 3; // nondeterministic
|
||||||
string info = 4; // nondeterministic
|
string info = 4; // nondeterministic
|
||||||
int64 index = 5;
|
int64 index = 5;
|
||||||
bytes key = 6;
|
bytes key = 6;
|
||||||
|
@ -162,48 +173,35 @@ message ResponseQuery {
|
||||||
}
|
}
|
||||||
|
|
||||||
message ResponseBeginBlock {
|
message ResponseBeginBlock {
|
||||||
repeated Event events = 1 [
|
repeated Event events = 1 [(gogoproto.nullable)=false, (gogoproto.jsontag)="events,omitempty"];
|
||||||
(gogoproto.nullable) = false,
|
|
||||||
(gogoproto.jsontag) = "events,omitempty"
|
|
||||||
];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
message ResponseCheckTx {
|
message ResponseCheckTx {
|
||||||
uint32 code = 1;
|
uint32 code = 1;
|
||||||
bytes data = 2;
|
bytes data = 2;
|
||||||
string log = 3; // nondeterministic
|
string log = 3; // nondeterministic
|
||||||
string info = 4; // nondeterministic
|
string info = 4; // nondeterministic
|
||||||
int64 gas_wanted = 5;
|
int64 gas_wanted = 5;
|
||||||
int64 gas_used = 6;
|
int64 gas_used = 6;
|
||||||
repeated Event events = 7 [
|
repeated Event events = 7 [(gogoproto.nullable)=false, (gogoproto.jsontag)="events,omitempty"];
|
||||||
(gogoproto.nullable) = false,
|
|
||||||
(gogoproto.jsontag) = "events,omitempty"
|
|
||||||
];
|
|
||||||
string codespace = 8;
|
string codespace = 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
message ResponseDeliverTx {
|
message ResponseDeliverTx {
|
||||||
uint32 code = 1;
|
uint32 code = 1;
|
||||||
bytes data = 2;
|
bytes data = 2;
|
||||||
string log = 3; // nondeterministic
|
string log = 3; // nondeterministic
|
||||||
string info = 4; // nondeterministic
|
string info = 4; // nondeterministic
|
||||||
int64 gas_wanted = 5;
|
int64 gas_wanted = 5;
|
||||||
int64 gas_used = 6;
|
int64 gas_used = 6;
|
||||||
repeated Event events = 7 [
|
repeated Event events = 7 [(gogoproto.nullable)=false, (gogoproto.jsontag)="events,omitempty"];
|
||||||
(gogoproto.nullable) = false,
|
|
||||||
(gogoproto.jsontag) = "events,omitempty"
|
|
||||||
];
|
|
||||||
string codespace = 8;
|
string codespace = 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
message ResponseEndBlock {
|
message ResponseEndBlock {
|
||||||
repeated ValidatorUpdate validator_updates = 1
|
repeated ValidatorUpdate validator_updates = 1 [(gogoproto.nullable)=false];
|
||||||
[ (gogoproto.nullable) = false ];
|
|
||||||
ConsensusParams consensus_param_updates = 2;
|
ConsensusParams consensus_param_updates = 2;
|
||||||
repeated Event events = 3 [
|
repeated Event events = 3 [(gogoproto.nullable)=false, (gogoproto.jsontag)="events,omitempty"];
|
||||||
(gogoproto.nullable) = false,
|
|
||||||
(gogoproto.jsontag) = "events,omitempty"
|
|
||||||
];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
message ResponseCommit {
|
message ResponseCommit {
|
||||||
|
@ -233,24 +231,22 @@ message BlockParams {
|
||||||
message EvidenceParams {
|
message EvidenceParams {
|
||||||
// Note: must be greater than 0
|
// Note: must be greater than 0
|
||||||
int64 max_age_num_blocks = 1;
|
int64 max_age_num_blocks = 1;
|
||||||
google.protobuf.Duration max_age_duration = 2
|
google.protobuf.Duration max_age_duration = 2 [(gogoproto.nullable)=false, (gogoproto.stdduration)=true];
|
||||||
[ (gogoproto.nullable) = false, (gogoproto.stdduration) = true ];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ValidatorParams contains limits on validators.
|
// ValidatorParams contains limits on validators.
|
||||||
message ValidatorParams { repeated string pub_key_types = 1; }
|
message ValidatorParams {
|
||||||
|
repeated string pub_key_types = 1;
|
||||||
|
}
|
||||||
|
|
||||||
message LastCommitInfo {
|
message LastCommitInfo {
|
||||||
int32 round = 1;
|
int32 round = 1;
|
||||||
repeated VoteInfo votes = 2 [ (gogoproto.nullable) = false ];
|
repeated VoteInfo votes = 2 [(gogoproto.nullable)=false];
|
||||||
}
|
}
|
||||||
|
|
||||||
message Event {
|
message Event {
|
||||||
string type = 1;
|
string type = 1;
|
||||||
repeated tendermint.libs.kv.Pair attributes = 2 [
|
repeated tendermint.libs.kv.Pair attributes = 2 [(gogoproto.nullable)=false, (gogoproto.jsontag)="attributes,omitempty"];
|
||||||
(gogoproto.nullable) = false,
|
|
||||||
(gogoproto.jsontag) = "attributes,omitempty"
|
|
||||||
];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------
|
//----------------------------------------
|
||||||
|
@ -258,26 +254,24 @@ message Event {
|
||||||
|
|
||||||
message Header {
|
message Header {
|
||||||
// basic block info
|
// basic block info
|
||||||
Version version = 1 [ (gogoproto.nullable) = false ];
|
Version version = 1 [(gogoproto.nullable)=false];
|
||||||
string chain_id = 2 [ (gogoproto.customname) = "ChainID" ];
|
string chain_id = 2 [(gogoproto.customname)="ChainID"];
|
||||||
int64 height = 3;
|
int64 height = 3;
|
||||||
google.protobuf.Timestamp time = 4
|
google.protobuf.Timestamp time = 4 [(gogoproto.nullable)=false, (gogoproto.stdtime)=true];
|
||||||
[ (gogoproto.nullable) = false, (gogoproto.stdtime) = true ];
|
|
||||||
|
|
||||||
// prev block info
|
// prev block info
|
||||||
BlockID last_block_id = 5 [ (gogoproto.nullable) = false ];
|
BlockID last_block_id = 5 [(gogoproto.nullable)=false];
|
||||||
|
|
||||||
// hashes of block data
|
// hashes of block data
|
||||||
bytes last_commit_hash = 6; // commit from validators from the last block
|
bytes last_commit_hash = 6; // commit from validators from the last block
|
||||||
bytes data_hash = 7; // transactions
|
bytes data_hash = 7; // transactions
|
||||||
|
|
||||||
// hashes from the app output from the prev block
|
// hashes from the app output from the prev block
|
||||||
bytes validators_hash = 8; // validators for the current block
|
bytes validators_hash = 8; // validators for the current block
|
||||||
bytes next_validators_hash = 9; // validators for the next block
|
bytes next_validators_hash = 9; // validators for the next block
|
||||||
bytes consensus_hash = 10; // consensus params for current block
|
bytes consensus_hash = 10; // consensus params for current block
|
||||||
bytes app_hash = 11; // state after txs from the previous block
|
bytes app_hash = 11; // state after txs from the previous block
|
||||||
bytes last_results_hash =
|
bytes last_results_hash = 12;// root hash of all results from the txs from the previous block
|
||||||
12; // root hash of all results from the txs from the previous block
|
|
||||||
|
|
||||||
// consensus info
|
// consensus info
|
||||||
bytes evidence_hash = 13; // evidence included in the block
|
bytes evidence_hash = 13; // evidence included in the block
|
||||||
|
@ -289,9 +283,10 @@ message Version {
|
||||||
uint64 App = 2;
|
uint64 App = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
message BlockID {
|
message BlockID {
|
||||||
bytes hash = 1;
|
bytes hash = 1;
|
||||||
PartSetHeader parts_header = 2 [ (gogoproto.nullable) = false ];
|
PartSetHeader parts_header = 2 [(gogoproto.nullable)=false];
|
||||||
}
|
}
|
||||||
|
|
||||||
message PartSetHeader {
|
message PartSetHeader {
|
||||||
|
@ -302,33 +297,32 @@ message PartSetHeader {
|
||||||
// Validator
|
// Validator
|
||||||
message Validator {
|
message Validator {
|
||||||
bytes address = 1;
|
bytes address = 1;
|
||||||
// PubKey pub_key = 2 [(gogoproto.nullable)=false];
|
//PubKey pub_key = 2 [(gogoproto.nullable)=false];
|
||||||
int64 power = 3;
|
int64 power = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ValidatorUpdate
|
// ValidatorUpdate
|
||||||
message ValidatorUpdate {
|
message ValidatorUpdate {
|
||||||
PubKey pub_key = 1 [ (gogoproto.nullable) = false ];
|
PubKey pub_key = 1 [(gogoproto.nullable)=false];
|
||||||
int64 power = 2;
|
int64 power = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// VoteInfo
|
// VoteInfo
|
||||||
message VoteInfo {
|
message VoteInfo {
|
||||||
Validator validator = 1 [ (gogoproto.nullable) = false ];
|
Validator validator = 1 [(gogoproto.nullable)=false];
|
||||||
bool signed_last_block = 2;
|
bool signed_last_block = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
message PubKey {
|
message PubKey {
|
||||||
string type = 1;
|
string type = 1;
|
||||||
bytes data = 2;
|
bytes data = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
message Evidence {
|
message Evidence {
|
||||||
string type = 1;
|
string type = 1;
|
||||||
Validator validator = 2 [ (gogoproto.nullable) = false ];
|
Validator validator = 2 [(gogoproto.nullable)=false];
|
||||||
int64 height = 3;
|
int64 height = 3;
|
||||||
google.protobuf.Timestamp time = 4
|
google.protobuf.Timestamp time = 4 [(gogoproto.nullable)=false, (gogoproto.stdtime)=true];
|
||||||
[ (gogoproto.nullable) = false, (gogoproto.stdtime) = true ];
|
|
||||||
int64 total_voting_power = 5;
|
int64 total_voting_power = 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -336,7 +330,7 @@ message Evidence {
|
||||||
// Service Definition
|
// Service Definition
|
||||||
|
|
||||||
service ABCIApplication {
|
service ABCIApplication {
|
||||||
rpc Echo(RequestEcho) returns (ResponseEcho);
|
rpc Echo(RequestEcho) returns (ResponseEcho) ;
|
||||||
rpc Flush(RequestFlush) returns (ResponseFlush);
|
rpc Flush(RequestFlush) returns (ResponseFlush);
|
||||||
rpc Info(RequestInfo) returns (ResponseInfo);
|
rpc Info(RequestInfo) returns (ResponseInfo);
|
||||||
rpc SetOption(RequestSetOption) returns (ResponseSetOption);
|
rpc SetOption(RequestSetOption) returns (ResponseSetOption);
|
||||||
|
|
|
@ -4,17 +4,32 @@ import (
|
||||||
"github.com/cosmos/cosmos-sdk/codec"
|
"github.com/cosmos/cosmos-sdk/codec"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Register concrete types on codec codec
|
type Codec struct {
|
||||||
|
codec.Marshaler
|
||||||
|
|
||||||
|
// Keep reference to the amino codec to allow backwards compatibility along
|
||||||
|
// with type, and interface registration.
|
||||||
|
amino *codec.Codec
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewCodec(amino *codec.Codec) *Codec {
|
||||||
|
return &Codec{Marshaler: codec.NewHybridCodec(amino), amino: amino}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// RegisterCodec registers all the necessary crisis module concrete types and
|
||||||
|
// interfaces with the provided codec reference.
|
||||||
func RegisterCodec(cdc *codec.Codec) {
|
func RegisterCodec(cdc *codec.Codec) {
|
||||||
cdc.RegisterConcrete(MsgVerifyInvariant{}, "cosmos-sdk/MsgVerifyInvariant", nil)
|
cdc.RegisterConcrete(MsgVerifyInvariant{}, "cosmos-sdk/MsgVerifyInvariant", nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
// generic sealed codec to be used throughout module
|
// ModuleCdc defines a crisis module global Amino codec.
|
||||||
var ModuleCdc *codec.Codec
|
var ModuleCdc *Codec
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
ModuleCdc = codec.New()
|
ModuleCdc = NewCodec(codec.New())
|
||||||
RegisterCodec(ModuleCdc)
|
RegisterCodec(ModuleCdc.amino)
|
||||||
codec.RegisterCrypto(ModuleCdc)
|
codec.RegisterCrypto(ModuleCdc.amino)
|
||||||
ModuleCdc.Seal()
|
ModuleCdc.amino.Seal()
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,13 +4,6 @@ import (
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MsgVerifyInvariant - message struct to verify a particular invariance
|
|
||||||
type MsgVerifyInvariant struct {
|
|
||||||
Sender sdk.AccAddress `json:"sender" yaml:"sender"`
|
|
||||||
InvariantModuleName string `json:"invariant_module_name" yaml:"invariant_module_name"`
|
|
||||||
InvariantRoute string `json:"invariant_route" yaml:"invariant_route"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ensure Msg interface compliance at compile time
|
// ensure Msg interface compliance at compile time
|
||||||
var _ sdk.Msg = &MsgVerifyInvariant{}
|
var _ sdk.Msg = &MsgVerifyInvariant{}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,435 @@
|
||||||
|
// Code generated by protoc-gen-gogo. DO NOT EDIT.
|
||||||
|
// source: x/crisis/internal/types/types.proto
|
||||||
|
|
||||||
|
package types
|
||||||
|
|
||||||
|
import (
|
||||||
|
fmt "fmt"
|
||||||
|
github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
_ "github.com/gogo/protobuf/gogoproto"
|
||||||
|
proto "github.com/gogo/protobuf/proto"
|
||||||
|
io "io"
|
||||||
|
math "math"
|
||||||
|
math_bits "math/bits"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ = proto.Marshal
|
||||||
|
var _ = fmt.Errorf
|
||||||
|
var _ = math.Inf
|
||||||
|
|
||||||
|
// This is a compile-time assertion to ensure that this generated file
|
||||||
|
// is compatible with the proto package it is being compiled against.
|
||||||
|
// A compilation error at this line likely means your copy of the
|
||||||
|
// proto package needs to be updated.
|
||||||
|
const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
|
||||||
|
|
||||||
|
// MsgVerifyInvariant - message struct to verify a particular invariance
|
||||||
|
type MsgVerifyInvariant struct {
|
||||||
|
Sender github_com_cosmos_cosmos_sdk_types.AccAddress `protobuf:"bytes,1,opt,name=sender,proto3,casttype=github.com/cosmos/cosmos-sdk/types.AccAddress" json:"sender,omitempty"`
|
||||||
|
InvariantModuleName string `protobuf:"bytes,2,opt,name=invariant_module_name,json=invariantModuleName,proto3" json:"invariant_module_name,omitempty" yaml:"invariant_module_name"`
|
||||||
|
InvariantRoute string `protobuf:"bytes,3,opt,name=invariant_route,json=invariantRoute,proto3" json:"invariant_route,omitempty" yaml:"invariant_route"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MsgVerifyInvariant) Reset() { *m = MsgVerifyInvariant{} }
|
||||||
|
func (m *MsgVerifyInvariant) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*MsgVerifyInvariant) ProtoMessage() {}
|
||||||
|
func (*MsgVerifyInvariant) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_df1c0b8e580cce76, []int{0}
|
||||||
|
}
|
||||||
|
func (m *MsgVerifyInvariant) XXX_Unmarshal(b []byte) error {
|
||||||
|
return m.Unmarshal(b)
|
||||||
|
}
|
||||||
|
func (m *MsgVerifyInvariant) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
if deterministic {
|
||||||
|
return xxx_messageInfo_MsgVerifyInvariant.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 *MsgVerifyInvariant) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_MsgVerifyInvariant.Merge(m, src)
|
||||||
|
}
|
||||||
|
func (m *MsgVerifyInvariant) XXX_Size() int {
|
||||||
|
return m.Size()
|
||||||
|
}
|
||||||
|
func (m *MsgVerifyInvariant) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_MsgVerifyInvariant.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_MsgVerifyInvariant proto.InternalMessageInfo
|
||||||
|
|
||||||
|
func (m *MsgVerifyInvariant) GetSender() github_com_cosmos_cosmos_sdk_types.AccAddress {
|
||||||
|
if m != nil {
|
||||||
|
return m.Sender
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MsgVerifyInvariant) GetInvariantModuleName() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.InvariantModuleName
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MsgVerifyInvariant) GetInvariantRoute() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.InvariantRoute
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
proto.RegisterType((*MsgVerifyInvariant)(nil), "cosmos_sdk.x.crisis.v1.MsgVerifyInvariant")
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
proto.RegisterFile("x/crisis/internal/types/types.proto", fileDescriptor_df1c0b8e580cce76)
|
||||||
|
}
|
||||||
|
|
||||||
|
var fileDescriptor_df1c0b8e580cce76 = []byte{
|
||||||
|
// 301 bytes of a gzipped FileDescriptorProto
|
||||||
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x90, 0xcf, 0x4a, 0xfb, 0x30,
|
||||||
|
0x00, 0x80, 0x97, 0xdf, 0x0f, 0x07, 0x16, 0x51, 0xa8, 0x38, 0xc6, 0x90, 0x74, 0x54, 0x90, 0x5d,
|
||||||
|
0xd6, 0x30, 0xbc, 0x79, 0xdb, 0x3c, 0xed, 0x30, 0x0f, 0x45, 0x3c, 0x78, 0x29, 0x59, 0x13, 0xbb,
|
||||||
|
0xb0, 0x25, 0x29, 0x49, 0x3a, 0xd6, 0xb7, 0xf0, 0xb1, 0x3c, 0xee, 0xe8, 0xa9, 0x48, 0xfb, 0x06,
|
||||||
|
0x3b, 0xee, 0x24, 0xa6, 0x75, 0x03, 0xf1, 0x92, 0x84, 0x8f, 0x2f, 0x5f, 0xfe, 0x38, 0x37, 0x1b,
|
||||||
|
0x14, 0x2b, 0xa6, 0x99, 0x46, 0x4c, 0x18, 0xaa, 0x04, 0x5e, 0x21, 0x93, 0xa7, 0x54, 0xd7, 0x63,
|
||||||
|
0x90, 0x2a, 0x69, 0xa4, 0xdb, 0x89, 0xa5, 0xe6, 0x52, 0x47, 0x9a, 0x2c, 0x83, 0x4d, 0x50, 0xfb,
|
||||||
|
0xc1, 0x7a, 0xd4, 0xbb, 0x35, 0x0b, 0xa6, 0x48, 0x94, 0x62, 0x65, 0x72, 0x64, 0x55, 0x94, 0xc8,
|
||||||
|
0x44, 0x1e, 0x57, 0xf5, 0x7e, 0x7f, 0x0f, 0x1c, 0x77, 0xa6, 0x93, 0x67, 0xaa, 0xd8, 0x6b, 0x3e,
|
||||||
|
0x15, 0x6b, 0xac, 0x18, 0x16, 0xc6, 0x9d, 0x3a, 0x6d, 0x4d, 0x05, 0xa1, 0xaa, 0x0b, 0xfa, 0x60,
|
||||||
|
0x70, 0x36, 0x19, 0xed, 0x0b, 0x6f, 0x98, 0x30, 0xb3, 0xc8, 0xe6, 0x41, 0x2c, 0x39, 0xaa, 0x4f,
|
||||||
|
0x6d, 0xa6, 0xa1, 0x26, 0xcb, 0xe6, 0x52, 0xe3, 0x38, 0x1e, 0x13, 0xa2, 0xa8, 0xd6, 0x61, 0x13,
|
||||||
|
0x70, 0x9f, 0x9c, 0x2b, 0xf6, 0xd3, 0x8d, 0xb8, 0x24, 0xd9, 0x8a, 0x46, 0x02, 0x73, 0xda, 0xfd,
|
||||||
|
0xd7, 0x07, 0x83, 0xd3, 0x49, 0x7f, 0x57, 0x78, 0xd7, 0x39, 0xe6, 0xab, 0x7b, 0xff, 0x4f, 0xcd,
|
||||||
|
0x0f, 0x2f, 0x0f, 0x7c, 0x66, 0xf1, 0x23, 0xe6, 0xd4, 0x7d, 0x70, 0x2e, 0x8e, 0xba, 0x92, 0x99,
|
||||||
|
0xa1, 0xdd, 0xff, 0xb6, 0xd7, 0xdb, 0x15, 0x5e, 0xe7, 0x77, 0xcf, 0x0a, 0x7e, 0x78, 0x7e, 0x20,
|
||||||
|
0xe1, 0x37, 0x98, 0x78, 0xef, 0x25, 0x04, 0xdb, 0x12, 0x82, 0xcf, 0x12, 0x82, 0xb7, 0x0a, 0xb6,
|
||||||
|
0xb6, 0x15, 0x6c, 0x7d, 0x54, 0xb0, 0xf5, 0x72, 0x62, 0x9f, 0x33, 0x6f, 0xdb, 0x4f, 0xba, 0xfb,
|
||||||
|
0x0a, 0x00, 0x00, 0xff, 0xff, 0xa7, 0xed, 0x2c, 0x98, 0x8b, 0x01, 0x00, 0x00,
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MsgVerifyInvariant) 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 *MsgVerifyInvariant) MarshalTo(dAtA []byte) (int, error) {
|
||||||
|
size := m.Size()
|
||||||
|
return m.MarshalToSizedBuffer(dAtA[:size])
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MsgVerifyInvariant) MarshalToSizedBuffer(dAtA []byte) (int, error) {
|
||||||
|
i := len(dAtA)
|
||||||
|
_ = i
|
||||||
|
var l int
|
||||||
|
_ = l
|
||||||
|
if len(m.InvariantRoute) > 0 {
|
||||||
|
i -= len(m.InvariantRoute)
|
||||||
|
copy(dAtA[i:], m.InvariantRoute)
|
||||||
|
i = encodeVarintTypes(dAtA, i, uint64(len(m.InvariantRoute)))
|
||||||
|
i--
|
||||||
|
dAtA[i] = 0x1a
|
||||||
|
}
|
||||||
|
if len(m.InvariantModuleName) > 0 {
|
||||||
|
i -= len(m.InvariantModuleName)
|
||||||
|
copy(dAtA[i:], m.InvariantModuleName)
|
||||||
|
i = encodeVarintTypes(dAtA, i, uint64(len(m.InvariantModuleName)))
|
||||||
|
i--
|
||||||
|
dAtA[i] = 0x12
|
||||||
|
}
|
||||||
|
if len(m.Sender) > 0 {
|
||||||
|
i -= len(m.Sender)
|
||||||
|
copy(dAtA[i:], m.Sender)
|
||||||
|
i = encodeVarintTypes(dAtA, i, uint64(len(m.Sender)))
|
||||||
|
i--
|
||||||
|
dAtA[i] = 0xa
|
||||||
|
}
|
||||||
|
return len(dAtA) - i, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func encodeVarintTypes(dAtA []byte, offset int, v uint64) int {
|
||||||
|
offset -= sovTypes(v)
|
||||||
|
base := offset
|
||||||
|
for v >= 1<<7 {
|
||||||
|
dAtA[offset] = uint8(v&0x7f | 0x80)
|
||||||
|
v >>= 7
|
||||||
|
offset++
|
||||||
|
}
|
||||||
|
dAtA[offset] = uint8(v)
|
||||||
|
return base
|
||||||
|
}
|
||||||
|
func (m *MsgVerifyInvariant) Size() (n int) {
|
||||||
|
if m == nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
var l int
|
||||||
|
_ = l
|
||||||
|
l = len(m.Sender)
|
||||||
|
if l > 0 {
|
||||||
|
n += 1 + l + sovTypes(uint64(l))
|
||||||
|
}
|
||||||
|
l = len(m.InvariantModuleName)
|
||||||
|
if l > 0 {
|
||||||
|
n += 1 + l + sovTypes(uint64(l))
|
||||||
|
}
|
||||||
|
l = len(m.InvariantRoute)
|
||||||
|
if l > 0 {
|
||||||
|
n += 1 + l + sovTypes(uint64(l))
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
func sovTypes(x uint64) (n int) {
|
||||||
|
return (math_bits.Len64(x|1) + 6) / 7
|
||||||
|
}
|
||||||
|
func sozTypes(x uint64) (n int) {
|
||||||
|
return sovTypes(uint64((x << 1) ^ uint64((int64(x) >> 63))))
|
||||||
|
}
|
||||||
|
func (m *MsgVerifyInvariant) 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 ErrIntOverflowTypes
|
||||||
|
}
|
||||||
|
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: MsgVerifyInvariant: wiretype end group for non-group")
|
||||||
|
}
|
||||||
|
if fieldNum <= 0 {
|
||||||
|
return fmt.Errorf("proto: MsgVerifyInvariant: illegal tag %d (wire type %d)", fieldNum, wire)
|
||||||
|
}
|
||||||
|
switch fieldNum {
|
||||||
|
case 1:
|
||||||
|
if wireType != 2 {
|
||||||
|
return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType)
|
||||||
|
}
|
||||||
|
var byteLen int
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowTypes
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
byteLen |= int(b&0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if byteLen < 0 {
|
||||||
|
return ErrInvalidLengthTypes
|
||||||
|
}
|
||||||
|
postIndex := iNdEx + byteLen
|
||||||
|
if postIndex < 0 {
|
||||||
|
return ErrInvalidLengthTypes
|
||||||
|
}
|
||||||
|
if postIndex > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
m.Sender = append(m.Sender[:0], dAtA[iNdEx:postIndex]...)
|
||||||
|
if m.Sender == nil {
|
||||||
|
m.Sender = []byte{}
|
||||||
|
}
|
||||||
|
iNdEx = postIndex
|
||||||
|
case 2:
|
||||||
|
if wireType != 2 {
|
||||||
|
return fmt.Errorf("proto: wrong wireType = %d for field InvariantModuleName", wireType)
|
||||||
|
}
|
||||||
|
var stringLen uint64
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowTypes
|
||||||
|
}
|
||||||
|
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 ErrInvalidLengthTypes
|
||||||
|
}
|
||||||
|
postIndex := iNdEx + intStringLen
|
||||||
|
if postIndex < 0 {
|
||||||
|
return ErrInvalidLengthTypes
|
||||||
|
}
|
||||||
|
if postIndex > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
m.InvariantModuleName = string(dAtA[iNdEx:postIndex])
|
||||||
|
iNdEx = postIndex
|
||||||
|
case 3:
|
||||||
|
if wireType != 2 {
|
||||||
|
return fmt.Errorf("proto: wrong wireType = %d for field InvariantRoute", wireType)
|
||||||
|
}
|
||||||
|
var stringLen uint64
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowTypes
|
||||||
|
}
|
||||||
|
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 ErrInvalidLengthTypes
|
||||||
|
}
|
||||||
|
postIndex := iNdEx + intStringLen
|
||||||
|
if postIndex < 0 {
|
||||||
|
return ErrInvalidLengthTypes
|
||||||
|
}
|
||||||
|
if postIndex > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
m.InvariantRoute = string(dAtA[iNdEx:postIndex])
|
||||||
|
iNdEx = postIndex
|
||||||
|
default:
|
||||||
|
iNdEx = preIndex
|
||||||
|
skippy, err := skipTypes(dAtA[iNdEx:])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if skippy < 0 {
|
||||||
|
return ErrInvalidLengthTypes
|
||||||
|
}
|
||||||
|
if (iNdEx + skippy) < 0 {
|
||||||
|
return ErrInvalidLengthTypes
|
||||||
|
}
|
||||||
|
if (iNdEx + skippy) > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
iNdEx += skippy
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if iNdEx > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
func skipTypes(dAtA []byte) (n int, err error) {
|
||||||
|
l := len(dAtA)
|
||||||
|
iNdEx := 0
|
||||||
|
depth := 0
|
||||||
|
for iNdEx < l {
|
||||||
|
var wire uint64
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return 0, ErrIntOverflowTypes
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return 0, io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
wire |= (uint64(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
wireType := int(wire & 0x7)
|
||||||
|
switch wireType {
|
||||||
|
case 0:
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return 0, ErrIntOverflowTypes
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return 0, io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
iNdEx++
|
||||||
|
if dAtA[iNdEx-1] < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 1:
|
||||||
|
iNdEx += 8
|
||||||
|
case 2:
|
||||||
|
var length int
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return 0, ErrIntOverflowTypes
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return 0, io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
length |= (int(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if length < 0 {
|
||||||
|
return 0, ErrInvalidLengthTypes
|
||||||
|
}
|
||||||
|
iNdEx += length
|
||||||
|
case 3:
|
||||||
|
depth++
|
||||||
|
case 4:
|
||||||
|
if depth == 0 {
|
||||||
|
return 0, ErrUnexpectedEndOfGroupTypes
|
||||||
|
}
|
||||||
|
depth--
|
||||||
|
case 5:
|
||||||
|
iNdEx += 4
|
||||||
|
default:
|
||||||
|
return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
|
||||||
|
}
|
||||||
|
if iNdEx < 0 {
|
||||||
|
return 0, ErrInvalidLengthTypes
|
||||||
|
}
|
||||||
|
if depth == 0 {
|
||||||
|
return iNdEx, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0, io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
ErrInvalidLengthTypes = fmt.Errorf("proto: negative length found during unmarshaling")
|
||||||
|
ErrIntOverflowTypes = fmt.Errorf("proto: integer overflow")
|
||||||
|
ErrUnexpectedEndOfGroupTypes = fmt.Errorf("proto: unexpected end of group")
|
||||||
|
)
|
|
@ -0,0 +1,13 @@
|
||||||
|
syntax = "proto3";
|
||||||
|
package cosmos_sdk.x.crisis.v1;
|
||||||
|
|
||||||
|
option go_package = "types";
|
||||||
|
|
||||||
|
import "third_party/proto/gogoproto/gogo.proto";
|
||||||
|
|
||||||
|
// MsgVerifyInvariant - message struct to verify a particular invariance
|
||||||
|
message MsgVerifyInvariant {
|
||||||
|
bytes sender = 1 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/types.AccAddress"];
|
||||||
|
string invariant_module_name = 2 [(gogoproto.moretags) = "yaml:\"invariant_module_name\""];
|
||||||
|
string invariant_route = 3 [(gogoproto.moretags) = "yaml:\"invariant_route\""];
|
||||||
|
}
|
|
@ -111,6 +111,7 @@ var (
|
||||||
ParamStoreKeyBonusProposerReward = types.ParamStoreKeyBonusProposerReward
|
ParamStoreKeyBonusProposerReward = types.ParamStoreKeyBonusProposerReward
|
||||||
ParamStoreKeyWithdrawAddrEnabled = types.ParamStoreKeyWithdrawAddrEnabled
|
ParamStoreKeyWithdrawAddrEnabled = types.ParamStoreKeyWithdrawAddrEnabled
|
||||||
ModuleCdc = types.ModuleCdc
|
ModuleCdc = types.ModuleCdc
|
||||||
|
NewCodec = types.NewCodec
|
||||||
EventTypeSetWithdrawAddress = types.EventTypeSetWithdrawAddress
|
EventTypeSetWithdrawAddress = types.EventTypeSetWithdrawAddress
|
||||||
EventTypeRewards = types.EventTypeRewards
|
EventTypeRewards = types.EventTypeRewards
|
||||||
EventTypeCommission = types.EventTypeCommission
|
EventTypeCommission = types.EventTypeCommission
|
||||||
|
@ -155,4 +156,5 @@ type (
|
||||||
ValidatorSlashEvent = types.ValidatorSlashEvent
|
ValidatorSlashEvent = types.ValidatorSlashEvent
|
||||||
ValidatorSlashEvents = types.ValidatorSlashEvents
|
ValidatorSlashEvents = types.ValidatorSlashEvents
|
||||||
ValidatorOutstandingRewards = types.ValidatorOutstandingRewards
|
ValidatorOutstandingRewards = types.ValidatorOutstandingRewards
|
||||||
|
Codec = types.Codec
|
||||||
)
|
)
|
||||||
|
|
|
@ -19,7 +19,7 @@ func InitGenesis(ctx sdk.Context, bk types.BankKeeper, supplyKeeper types.Supply
|
||||||
}
|
}
|
||||||
keeper.SetPreviousProposerConsAddr(ctx, data.PreviousProposer)
|
keeper.SetPreviousProposerConsAddr(ctx, data.PreviousProposer)
|
||||||
for _, rew := range data.OutstandingRewards {
|
for _, rew := range data.OutstandingRewards {
|
||||||
keeper.SetValidatorOutstandingRewards(ctx, rew.ValidatorAddress, rew.OutstandingRewards)
|
keeper.SetValidatorOutstandingRewards(ctx, rew.ValidatorAddress, types.ValidatorOutstandingRewards{Rewards: rew.OutstandingRewards})
|
||||||
moduleHoldings = moduleHoldings.Add(rew.OutstandingRewards...)
|
moduleHoldings = moduleHoldings.Add(rew.OutstandingRewards...)
|
||||||
}
|
}
|
||||||
for _, acc := range data.ValidatorAccumulatedCommissions {
|
for _, acc := range data.ValidatorAccumulatedCommissions {
|
||||||
|
@ -76,7 +76,7 @@ func ExportGenesis(ctx sdk.Context, keeper Keeper) types.GenesisState {
|
||||||
func(addr sdk.ValAddress, rewards types.ValidatorOutstandingRewards) (stop bool) {
|
func(addr sdk.ValAddress, rewards types.ValidatorOutstandingRewards) (stop bool) {
|
||||||
outstanding = append(outstanding, types.ValidatorOutstandingRewardsRecord{
|
outstanding = append(outstanding, types.ValidatorOutstandingRewardsRecord{
|
||||||
ValidatorAddress: addr,
|
ValidatorAddress: addr,
|
||||||
OutstandingRewards: rewards,
|
OutstandingRewards: rewards.Rewards,
|
||||||
})
|
})
|
||||||
return false
|
return false
|
||||||
},
|
},
|
||||||
|
|
|
@ -8,7 +8,7 @@ import (
|
||||||
|
|
||||||
// get outstanding rewards
|
// get outstanding rewards
|
||||||
func (k Keeper) GetValidatorOutstandingRewardsCoins(ctx sdk.Context, val sdk.ValAddress) sdk.DecCoins {
|
func (k Keeper) GetValidatorOutstandingRewardsCoins(ctx sdk.Context, val sdk.ValAddress) sdk.DecCoins {
|
||||||
return k.GetValidatorOutstandingRewards(ctx, val)
|
return k.GetValidatorOutstandingRewards(ctx, val).Rewards
|
||||||
}
|
}
|
||||||
|
|
||||||
// get the community coins
|
// get the community coins
|
||||||
|
|
|
@ -114,7 +114,7 @@ func (k Keeper) AllocateTokensToValidator(ctx sdk.Context, val exported.Validato
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
currentCommission := k.GetValidatorAccumulatedCommission(ctx, val.GetOperator())
|
currentCommission := k.GetValidatorAccumulatedCommission(ctx, val.GetOperator())
|
||||||
currentCommission = currentCommission.Add(commission...)
|
currentCommission.Commission = currentCommission.Commission.Add(commission...)
|
||||||
k.SetValidatorAccumulatedCommission(ctx, val.GetOperator(), currentCommission)
|
k.SetValidatorAccumulatedCommission(ctx, val.GetOperator(), currentCommission)
|
||||||
|
|
||||||
// update current rewards
|
// update current rewards
|
||||||
|
@ -131,6 +131,6 @@ func (k Keeper) AllocateTokensToValidator(ctx sdk.Context, val exported.Validato
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
outstanding := k.GetValidatorOutstandingRewards(ctx, val.GetOperator())
|
outstanding := k.GetValidatorOutstandingRewards(ctx, val.GetOperator())
|
||||||
outstanding = outstanding.Add(tokens...)
|
outstanding.Rewards = outstanding.Rewards.Add(tokens...)
|
||||||
k.SetValidatorOutstandingRewards(ctx, val.GetOperator(), outstanding)
|
k.SetValidatorOutstandingRewards(ctx, val.GetOperator(), outstanding)
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,7 +37,7 @@ func TestAllocateTokensToValidatorWithCommission(t *testing.T) {
|
||||||
expected := sdk.DecCoins{
|
expected := sdk.DecCoins{
|
||||||
{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDec(5)},
|
{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDec(5)},
|
||||||
}
|
}
|
||||||
require.Equal(t, expected, k.GetValidatorAccumulatedCommission(ctx, val.GetOperator()))
|
require.Equal(t, expected, k.GetValidatorAccumulatedCommission(ctx, val.GetOperator()).Commission)
|
||||||
|
|
||||||
// check current rewards
|
// check current rewards
|
||||||
require.Equal(t, expected, k.GetValidatorCurrentRewards(ctx, val.GetOperator()).Rewards)
|
require.Equal(t, expected, k.GetValidatorCurrentRewards(ctx, val.GetOperator()).Rewards)
|
||||||
|
@ -75,11 +75,11 @@ func TestAllocateTokensToManyValidators(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// assert initial state: zero outstanding rewards, zero community pool, zero commission, zero current rewards
|
// assert initial state: zero outstanding rewards, zero community pool, zero commission, zero current rewards
|
||||||
require.True(t, k.GetValidatorOutstandingRewards(ctx, valOpAddr1).IsZero())
|
require.True(t, k.GetValidatorOutstandingRewards(ctx, valOpAddr1).Rewards.IsZero())
|
||||||
require.True(t, k.GetValidatorOutstandingRewards(ctx, valOpAddr2).IsZero())
|
require.True(t, k.GetValidatorOutstandingRewards(ctx, valOpAddr2).Rewards.IsZero())
|
||||||
require.True(t, k.GetFeePool(ctx).CommunityPool.IsZero())
|
require.True(t, k.GetFeePool(ctx).CommunityPool.IsZero())
|
||||||
require.True(t, k.GetValidatorAccumulatedCommission(ctx, valOpAddr1).IsZero())
|
require.True(t, k.GetValidatorAccumulatedCommission(ctx, valOpAddr1).Commission.IsZero())
|
||||||
require.True(t, k.GetValidatorAccumulatedCommission(ctx, valOpAddr2).IsZero())
|
require.True(t, k.GetValidatorAccumulatedCommission(ctx, valOpAddr2).Commission.IsZero())
|
||||||
require.True(t, k.GetValidatorCurrentRewards(ctx, valOpAddr1).Rewards.IsZero())
|
require.True(t, k.GetValidatorCurrentRewards(ctx, valOpAddr1).Rewards.IsZero())
|
||||||
require.True(t, k.GetValidatorCurrentRewards(ctx, valOpAddr2).Rewards.IsZero())
|
require.True(t, k.GetValidatorCurrentRewards(ctx, valOpAddr2).Rewards.IsZero())
|
||||||
|
|
||||||
|
@ -105,14 +105,14 @@ func TestAllocateTokensToManyValidators(t *testing.T) {
|
||||||
k.AllocateTokens(ctx, 200, 200, valConsAddr2, votes)
|
k.AllocateTokens(ctx, 200, 200, valConsAddr2, votes)
|
||||||
|
|
||||||
// 98 outstanding rewards (100 less 2 to community pool)
|
// 98 outstanding rewards (100 less 2 to community pool)
|
||||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDecWithPrec(465, 1)}}, k.GetValidatorOutstandingRewards(ctx, valOpAddr1))
|
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDecWithPrec(465, 1)}}, k.GetValidatorOutstandingRewards(ctx, valOpAddr1).Rewards)
|
||||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDecWithPrec(515, 1)}}, k.GetValidatorOutstandingRewards(ctx, valOpAddr2))
|
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDecWithPrec(515, 1)}}, k.GetValidatorOutstandingRewards(ctx, valOpAddr2).Rewards)
|
||||||
// 2 community pool coins
|
// 2 community pool coins
|
||||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDec(2)}}, k.GetFeePool(ctx).CommunityPool)
|
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDec(2)}}, k.GetFeePool(ctx).CommunityPool)
|
||||||
// 50% commission for first proposer, (0.5 * 93%) * 100 / 2 = 23.25
|
// 50% commission for first proposer, (0.5 * 93%) * 100 / 2 = 23.25
|
||||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDecWithPrec(2325, 2)}}, k.GetValidatorAccumulatedCommission(ctx, valOpAddr1))
|
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDecWithPrec(2325, 2)}}, k.GetValidatorAccumulatedCommission(ctx, valOpAddr1).Commission)
|
||||||
// zero commission for second proposer
|
// zero commission for second proposer
|
||||||
require.True(t, k.GetValidatorAccumulatedCommission(ctx, valOpAddr2).IsZero())
|
require.True(t, k.GetValidatorAccumulatedCommission(ctx, valOpAddr2).Commission.IsZero())
|
||||||
// just staking.proportional for first proposer less commission = (0.5 * 93%) * 100 / 2 = 23.25
|
// just staking.proportional for first proposer less commission = (0.5 * 93%) * 100 / 2 = 23.25
|
||||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDecWithPrec(2325, 2)}}, k.GetValidatorCurrentRewards(ctx, valOpAddr1).Rewards)
|
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDecWithPrec(2325, 2)}}, k.GetValidatorCurrentRewards(ctx, valOpAddr1).Rewards)
|
||||||
// proposer reward + staking.proportional for second proposer = (5 % + 0.5 * (93%)) * 100 = 51.5
|
// proposer reward + staking.proportional for second proposer = (5 % + 0.5 * (93%)) * 100 = 51.5
|
||||||
|
@ -162,12 +162,12 @@ func TestAllocateTokensTruncation(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// assert initial state: zero outstanding rewards, zero community pool, zero commission, zero current rewards
|
// assert initial state: zero outstanding rewards, zero community pool, zero commission, zero current rewards
|
||||||
require.True(t, k.GetValidatorOutstandingRewards(ctx, valOpAddr1).IsZero())
|
require.True(t, k.GetValidatorOutstandingRewards(ctx, valOpAddr1).Rewards.IsZero())
|
||||||
require.True(t, k.GetValidatorOutstandingRewards(ctx, valOpAddr2).IsZero())
|
require.True(t, k.GetValidatorOutstandingRewards(ctx, valOpAddr2).Rewards.IsZero())
|
||||||
require.True(t, k.GetValidatorOutstandingRewards(ctx, valOpAddr3).IsZero())
|
require.True(t, k.GetValidatorOutstandingRewards(ctx, valOpAddr3).Rewards.IsZero())
|
||||||
require.True(t, k.GetFeePool(ctx).CommunityPool.IsZero())
|
require.True(t, k.GetFeePool(ctx).CommunityPool.IsZero())
|
||||||
require.True(t, k.GetValidatorAccumulatedCommission(ctx, valOpAddr1).IsZero())
|
require.True(t, k.GetValidatorAccumulatedCommission(ctx, valOpAddr1).Commission.IsZero())
|
||||||
require.True(t, k.GetValidatorAccumulatedCommission(ctx, valOpAddr2).IsZero())
|
require.True(t, k.GetValidatorAccumulatedCommission(ctx, valOpAddr2).Commission.IsZero())
|
||||||
require.True(t, k.GetValidatorCurrentRewards(ctx, valOpAddr1).Rewards.IsZero())
|
require.True(t, k.GetValidatorCurrentRewards(ctx, valOpAddr1).Rewards.IsZero())
|
||||||
require.True(t, k.GetValidatorCurrentRewards(ctx, valOpAddr2).Rewards.IsZero())
|
require.True(t, k.GetValidatorCurrentRewards(ctx, valOpAddr2).Rewards.IsZero())
|
||||||
|
|
||||||
|
@ -198,7 +198,7 @@ func TestAllocateTokensTruncation(t *testing.T) {
|
||||||
}
|
}
|
||||||
k.AllocateTokens(ctx, 31, 31, valConsAddr2, votes)
|
k.AllocateTokens(ctx, 31, 31, valConsAddr2, votes)
|
||||||
|
|
||||||
require.True(t, k.GetValidatorOutstandingRewards(ctx, valOpAddr1).IsValid())
|
require.True(t, k.GetValidatorOutstandingRewards(ctx, valOpAddr1).Rewards.IsValid())
|
||||||
require.True(t, k.GetValidatorOutstandingRewards(ctx, valOpAddr2).IsValid())
|
require.True(t, k.GetValidatorOutstandingRewards(ctx, valOpAddr2).Rewards.IsValid())
|
||||||
require.True(t, k.GetValidatorOutstandingRewards(ctx, valOpAddr3).IsValid())
|
require.True(t, k.GetValidatorOutstandingRewards(ctx, valOpAddr3).Rewards.IsValid())
|
||||||
}
|
}
|
||||||
|
|
|
@ -145,7 +145,7 @@ func (k Keeper) withdrawDelegationRewards(ctx sdk.Context, val exported.Validato
|
||||||
// end current period and calculate rewards
|
// end current period and calculate rewards
|
||||||
endingPeriod := k.incrementValidatorPeriod(ctx, val)
|
endingPeriod := k.incrementValidatorPeriod(ctx, val)
|
||||||
rewardsRaw := k.calculateDelegationRewards(ctx, val, del, endingPeriod)
|
rewardsRaw := k.calculateDelegationRewards(ctx, val, del, endingPeriod)
|
||||||
outstanding := k.GetValidatorOutstandingRewards(ctx, del.GetValidatorAddr())
|
outstanding := k.GetValidatorOutstandingRewardsCoins(ctx, del.GetValidatorAddr())
|
||||||
|
|
||||||
// defensive edge case may happen on the very final digits
|
// defensive edge case may happen on the very final digits
|
||||||
// of the decCoins due to operation order of the distribution mechanism.
|
// of the decCoins due to operation order of the distribution mechanism.
|
||||||
|
@ -171,7 +171,7 @@ func (k Keeper) withdrawDelegationRewards(ctx sdk.Context, val exported.Validato
|
||||||
|
|
||||||
// update the outstanding rewards and the community pool only if the
|
// update the outstanding rewards and the community pool only if the
|
||||||
// transaction was successful
|
// transaction was successful
|
||||||
k.SetValidatorOutstandingRewards(ctx, del.GetValidatorAddr(), outstanding.Sub(rewards))
|
k.SetValidatorOutstandingRewards(ctx, del.GetValidatorAddr(), types.ValidatorOutstandingRewards{Rewards: outstanding.Sub(rewards)})
|
||||||
feePool := k.GetFeePool(ctx)
|
feePool := k.GetFeePool(ctx)
|
||||||
feePool.CommunityPool = feePool.CommunityPool.Add(remainder...)
|
feePool.CommunityPool = feePool.CommunityPool.Add(remainder...)
|
||||||
k.SetFeePool(ctx, feePool)
|
k.SetFeePool(ctx, feePool)
|
||||||
|
|
|
@ -63,7 +63,7 @@ func TestCalculateRewardsBasic(t *testing.T) {
|
||||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDec(initial / 2)}}, rewards)
|
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDec(initial / 2)}}, rewards)
|
||||||
|
|
||||||
// commission should be the other half
|
// commission should be the other half
|
||||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDec(initial / 2)}}, k.GetValidatorAccumulatedCommission(ctx, valOpAddr1))
|
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDec(initial / 2)}}, k.GetValidatorAccumulatedCommission(ctx, valOpAddr1).Commission)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCalculateRewardsAfterSlash(t *testing.T) {
|
func TestCalculateRewardsAfterSlash(t *testing.T) {
|
||||||
|
@ -128,7 +128,7 @@ func TestCalculateRewardsAfterSlash(t *testing.T) {
|
||||||
|
|
||||||
// commission should be the other half
|
// commission should be the other half
|
||||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: initial.QuoRaw(2).ToDec()}},
|
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: initial.QuoRaw(2).ToDec()}},
|
||||||
k.GetValidatorAccumulatedCommission(ctx, valOpAddr1))
|
k.GetValidatorAccumulatedCommission(ctx, valOpAddr1).Commission)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCalculateRewardsAfterManySlashes(t *testing.T) {
|
func TestCalculateRewardsAfterManySlashes(t *testing.T) {
|
||||||
|
@ -205,7 +205,7 @@ func TestCalculateRewardsAfterManySlashes(t *testing.T) {
|
||||||
|
|
||||||
// commission should be the other half
|
// commission should be the other half
|
||||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: initial.ToDec()}},
|
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: initial.ToDec()}},
|
||||||
k.GetValidatorAccumulatedCommission(ctx, valOpAddr1))
|
k.GetValidatorAccumulatedCommission(ctx, valOpAddr1).Commission)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCalculateRewardsMultiDelegator(t *testing.T) {
|
func TestCalculateRewardsMultiDelegator(t *testing.T) {
|
||||||
|
@ -273,7 +273,7 @@ func TestCalculateRewardsMultiDelegator(t *testing.T) {
|
||||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDec(initial * 1 / 4)}}, rewards)
|
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDec(initial * 1 / 4)}}, rewards)
|
||||||
|
|
||||||
// commission should be equal to initial (50% twice)
|
// commission should be equal to initial (50% twice)
|
||||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDec(initial)}}, k.GetValidatorAccumulatedCommission(ctx, valOpAddr1))
|
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDec(initial)}}, k.GetValidatorAccumulatedCommission(ctx, valOpAddr1).Commission)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestWithdrawDelegationRewardsBasic(t *testing.T) {
|
func TestWithdrawDelegationRewardsBasic(t *testing.T) {
|
||||||
|
@ -419,7 +419,7 @@ func TestCalculateRewardsAfterManySlashesInSameBlock(t *testing.T) {
|
||||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: initial}}, rewards)
|
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: initial}}, rewards)
|
||||||
|
|
||||||
// commission should be the other half
|
// commission should be the other half
|
||||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: initial}}, k.GetValidatorAccumulatedCommission(ctx, valOpAddr1))
|
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: initial}}, k.GetValidatorAccumulatedCommission(ctx, valOpAddr1).Commission)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCalculateRewardsMultiDelegatorMultiSlash(t *testing.T) {
|
func TestCalculateRewardsMultiDelegatorMultiSlash(t *testing.T) {
|
||||||
|
@ -501,7 +501,7 @@ func TestCalculateRewardsMultiDelegatorMultiSlash(t *testing.T) {
|
||||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: initial.QuoInt64(3)}}, rewards)
|
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: initial.QuoInt64(3)}}, rewards)
|
||||||
|
|
||||||
// commission should be equal to initial (twice 50% commission, unaffected by slashing)
|
// commission should be equal to initial (twice 50% commission, unaffected by slashing)
|
||||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: initial}}, k.GetValidatorAccumulatedCommission(ctx, valOpAddr1))
|
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: initial}}, k.GetValidatorAccumulatedCommission(ctx, valOpAddr1).Commission)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCalculateRewardsMultiDelegatorMultWithdraw(t *testing.T) {
|
func TestCalculateRewardsMultiDelegatorMultWithdraw(t *testing.T) {
|
||||||
|
@ -592,7 +592,7 @@ func TestCalculateRewardsMultiDelegatorMultWithdraw(t *testing.T) {
|
||||||
require.True(t, rewards.IsZero())
|
require.True(t, rewards.IsZero())
|
||||||
|
|
||||||
// commission should be zero
|
// commission should be zero
|
||||||
require.True(t, k.GetValidatorAccumulatedCommission(ctx, valOpAddr1).IsZero())
|
require.True(t, k.GetValidatorAccumulatedCommission(ctx, valOpAddr1).Commission.IsZero())
|
||||||
|
|
||||||
// next block
|
// next block
|
||||||
ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1)
|
ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1)
|
||||||
|
@ -619,7 +619,7 @@ func TestCalculateRewardsMultiDelegatorMultWithdraw(t *testing.T) {
|
||||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDec(initial / 4)}}, rewards)
|
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDec(initial / 4)}}, rewards)
|
||||||
|
|
||||||
// commission should be half initial
|
// commission should be half initial
|
||||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDec(initial / 2)}}, k.GetValidatorAccumulatedCommission(ctx, valOpAddr1))
|
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDec(initial / 2)}}, k.GetValidatorAccumulatedCommission(ctx, valOpAddr1).Commission)
|
||||||
|
|
||||||
// next block
|
// next block
|
||||||
ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1)
|
ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1)
|
||||||
|
@ -646,5 +646,5 @@ func TestCalculateRewardsMultiDelegatorMultWithdraw(t *testing.T) {
|
||||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDec(initial / 2)}}, rewards)
|
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDec(initial / 2)}}, rewards)
|
||||||
|
|
||||||
// commission should be zero
|
// commission should be zero
|
||||||
require.True(t, k.GetValidatorAccumulatedCommission(ctx, valOpAddr1).IsZero())
|
require.True(t, k.GetValidatorAccumulatedCommission(ctx, valOpAddr1).Commission.IsZero())
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,12 +24,11 @@ func (h Hooks) AfterValidatorCreated(ctx sdk.Context, valAddr sdk.ValAddress) {
|
||||||
|
|
||||||
// cleanup for after validator is removed
|
// cleanup for after validator is removed
|
||||||
func (h Hooks) AfterValidatorRemoved(ctx sdk.Context, _ sdk.ConsAddress, valAddr sdk.ValAddress) {
|
func (h Hooks) AfterValidatorRemoved(ctx sdk.Context, _ sdk.ConsAddress, valAddr sdk.ValAddress) {
|
||||||
|
|
||||||
// fetch outstanding
|
// fetch outstanding
|
||||||
outstanding := h.k.GetValidatorOutstandingRewards(ctx, valAddr)
|
outstanding := h.k.GetValidatorOutstandingRewardsCoins(ctx, valAddr)
|
||||||
|
|
||||||
// force-withdraw commission
|
// force-withdraw commission
|
||||||
commission := h.k.GetValidatorAccumulatedCommission(ctx, valAddr)
|
commission := h.k.GetValidatorAccumulatedCommission(ctx, valAddr).Commission
|
||||||
if !commission.IsZero() {
|
if !commission.IsZero() {
|
||||||
// subtract from outstanding
|
// subtract from outstanding
|
||||||
outstanding = outstanding.Sub(commission)
|
outstanding = outstanding.Sub(commission)
|
||||||
|
|
|
@ -47,7 +47,7 @@ func NonNegativeOutstandingInvariant(k Keeper) sdk.Invariant {
|
||||||
var outstanding sdk.DecCoins
|
var outstanding sdk.DecCoins
|
||||||
|
|
||||||
k.IterateValidatorOutstandingRewards(ctx, func(addr sdk.ValAddress, rewards types.ValidatorOutstandingRewards) (stop bool) {
|
k.IterateValidatorOutstandingRewards(ctx, func(addr sdk.ValAddress, rewards types.ValidatorOutstandingRewards) (stop bool) {
|
||||||
outstanding = rewards
|
outstanding = rewards.GetRewards()
|
||||||
if outstanding.IsAnyNegative() {
|
if outstanding.IsAnyNegative() {
|
||||||
count++
|
count++
|
||||||
msg += fmt.Sprintf("\t%v has negative outstanding coins: %v\n", addr, outstanding)
|
msg += fmt.Sprintf("\t%v has negative outstanding coins: %v\n", addr, outstanding)
|
||||||
|
@ -89,7 +89,7 @@ func CanWithdrawInvariant(k Keeper) sdk.Invariant {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
remaining = k.GetValidatorOutstandingRewards(ctx, val.GetOperator())
|
remaining = k.GetValidatorOutstandingRewardsCoins(ctx, val.GetOperator())
|
||||||
if len(remaining) > 0 && remaining[0].Amount.IsNegative() {
|
if len(remaining) > 0 && remaining[0].Amount.IsNegative() {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
@ -140,7 +140,7 @@ func ModuleAccountInvariant(k Keeper) sdk.Invariant {
|
||||||
|
|
||||||
var expectedCoins sdk.DecCoins
|
var expectedCoins sdk.DecCoins
|
||||||
k.IterateValidatorOutstandingRewards(ctx, func(_ sdk.ValAddress, rewards types.ValidatorOutstandingRewards) (stop bool) {
|
k.IterateValidatorOutstandingRewards(ctx, func(_ sdk.ValAddress, rewards types.ValidatorOutstandingRewards) (stop bool) {
|
||||||
expectedCoins = expectedCoins.Add(rewards...)
|
expectedCoins = expectedCoins.Add(rewards.Rewards...)
|
||||||
return false
|
return false
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ import (
|
||||||
// Keeper of the distribution store
|
// Keeper of the distribution store
|
||||||
type Keeper struct {
|
type Keeper struct {
|
||||||
storeKey sdk.StoreKey
|
storeKey sdk.StoreKey
|
||||||
cdc *codec.Codec
|
cdc codec.Marshaler
|
||||||
paramSpace params.Subspace
|
paramSpace params.Subspace
|
||||||
bankKeeper types.BankKeeper
|
bankKeeper types.BankKeeper
|
||||||
stakingKeeper types.StakingKeeper
|
stakingKeeper types.StakingKeeper
|
||||||
|
@ -28,7 +28,7 @@ type Keeper struct {
|
||||||
|
|
||||||
// NewKeeper creates a new distribution Keeper instance
|
// NewKeeper creates a new distribution Keeper instance
|
||||||
func NewKeeper(
|
func NewKeeper(
|
||||||
cdc *codec.Codec, key sdk.StoreKey, paramSpace params.Subspace, bk types.BankKeeper,
|
cdc codec.Marshaler, key sdk.StoreKey, paramSpace params.Subspace, bk types.BankKeeper,
|
||||||
sk types.StakingKeeper, supplyKeeper types.SupplyKeeper, feeCollectorName string,
|
sk types.StakingKeeper, supplyKeeper types.SupplyKeeper, feeCollectorName string,
|
||||||
blacklistedAddrs map[string]bool,
|
blacklistedAddrs map[string]bool,
|
||||||
) Keeper {
|
) Keeper {
|
||||||
|
@ -116,16 +116,16 @@ func (k Keeper) WithdrawDelegationRewards(ctx sdk.Context, delAddr sdk.AccAddres
|
||||||
func (k Keeper) WithdrawValidatorCommission(ctx sdk.Context, valAddr sdk.ValAddress) (sdk.Coins, error) {
|
func (k Keeper) WithdrawValidatorCommission(ctx sdk.Context, valAddr sdk.ValAddress) (sdk.Coins, error) {
|
||||||
// fetch validator accumulated commission
|
// fetch validator accumulated commission
|
||||||
accumCommission := k.GetValidatorAccumulatedCommission(ctx, valAddr)
|
accumCommission := k.GetValidatorAccumulatedCommission(ctx, valAddr)
|
||||||
if accumCommission.IsZero() {
|
if accumCommission.Commission.IsZero() {
|
||||||
return nil, types.ErrNoValidatorCommission
|
return nil, types.ErrNoValidatorCommission
|
||||||
}
|
}
|
||||||
|
|
||||||
commission, remainder := accumCommission.TruncateDecimal()
|
commission, remainder := accumCommission.Commission.TruncateDecimal()
|
||||||
k.SetValidatorAccumulatedCommission(ctx, valAddr, remainder) // leave remainder to withdraw later
|
k.SetValidatorAccumulatedCommission(ctx, valAddr, types.ValidatorAccumulatedCommission{Commission: remainder}) // leave remainder to withdraw later
|
||||||
|
|
||||||
// update outstanding
|
// update outstanding
|
||||||
outstanding := k.GetValidatorOutstandingRewards(ctx, valAddr)
|
outstanding := k.GetValidatorOutstandingRewards(ctx, valAddr).Rewards
|
||||||
k.SetValidatorOutstandingRewards(ctx, valAddr, outstanding.Sub(sdk.NewDecCoinsFromCoins(commission...)))
|
k.SetValidatorOutstandingRewards(ctx, valAddr, types.ValidatorOutstandingRewards{Rewards: outstanding.Sub(sdk.NewDecCoinsFromCoins(commission...))})
|
||||||
|
|
||||||
if !commission.IsZero() {
|
if !commission.IsZero() {
|
||||||
accAddr := sdk.AccAddress(valAddr)
|
accAddr := sdk.AccAddress(valAddr)
|
||||||
|
@ -150,7 +150,7 @@ func (k Keeper) WithdrawValidatorCommission(ctx sdk.Context, valAddr sdk.ValAddr
|
||||||
func (k Keeper) GetTotalRewards(ctx sdk.Context) (totalRewards sdk.DecCoins) {
|
func (k Keeper) GetTotalRewards(ctx sdk.Context) (totalRewards sdk.DecCoins) {
|
||||||
k.IterateValidatorOutstandingRewards(ctx,
|
k.IterateValidatorOutstandingRewards(ctx,
|
||||||
func(_ sdk.ValAddress, rewards types.ValidatorOutstandingRewards) (stop bool) {
|
func(_ sdk.ValAddress, rewards types.ValidatorOutstandingRewards) (stop bool) {
|
||||||
totalRewards = totalRewards.Add(rewards...)
|
totalRewards = totalRewards.Add(rewards.Rewards...)
|
||||||
return false
|
return false
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
|
@ -8,6 +8,7 @@ import (
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/distribution/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestSetWithdrawAddr(t *testing.T) {
|
func TestSetWithdrawAddr(t *testing.T) {
|
||||||
|
@ -53,10 +54,10 @@ func TestWithdrawValidatorCommission(t *testing.T) {
|
||||||
require.Equal(t, expCoins, balance)
|
require.Equal(t, expCoins, balance)
|
||||||
|
|
||||||
// set outstanding rewards
|
// set outstanding rewards
|
||||||
keeper.SetValidatorOutstandingRewards(ctx, valOpAddr3, valCommission)
|
keeper.SetValidatorOutstandingRewards(ctx, valOpAddr3, types.ValidatorOutstandingRewards{Rewards: valCommission})
|
||||||
|
|
||||||
// set commission
|
// set commission
|
||||||
keeper.SetValidatorAccumulatedCommission(ctx, valOpAddr3, valCommission)
|
keeper.SetValidatorAccumulatedCommission(ctx, valOpAddr3, types.ValidatorAccumulatedCommission{Commission: valCommission})
|
||||||
|
|
||||||
// withdraw commission
|
// withdraw commission
|
||||||
keeper.WithdrawValidatorCommission(ctx, valOpAddr3)
|
keeper.WithdrawValidatorCommission(ctx, valOpAddr3)
|
||||||
|
@ -69,7 +70,7 @@ func TestWithdrawValidatorCommission(t *testing.T) {
|
||||||
), balance)
|
), balance)
|
||||||
|
|
||||||
// check remainder
|
// check remainder
|
||||||
remainder := keeper.GetValidatorAccumulatedCommission(ctx, valOpAddr3)
|
remainder := keeper.GetValidatorAccumulatedCommission(ctx, valOpAddr3).Commission
|
||||||
require.Equal(t, sdk.DecCoins{
|
require.Equal(t, sdk.DecCoins{
|
||||||
sdk.NewDecCoinFromDec("mytoken", sdk.NewDec(1).Quo(sdk.NewDec(4))),
|
sdk.NewDecCoinFromDec("mytoken", sdk.NewDec(1).Quo(sdk.NewDec(4))),
|
||||||
sdk.NewDecCoinFromDec("stake", sdk.NewDec(1).Quo(sdk.NewDec(2))),
|
sdk.NewDecCoinFromDec("stake", sdk.NewDec(1).Quo(sdk.NewDec(2))),
|
||||||
|
@ -86,8 +87,8 @@ func TestGetTotalRewards(t *testing.T) {
|
||||||
sdk.NewDecCoinFromDec("stake", sdk.NewDec(3).Quo(sdk.NewDec(2))),
|
sdk.NewDecCoinFromDec("stake", sdk.NewDec(3).Quo(sdk.NewDec(2))),
|
||||||
}
|
}
|
||||||
|
|
||||||
keeper.SetValidatorOutstandingRewards(ctx, valOpAddr1, valCommission)
|
keeper.SetValidatorOutstandingRewards(ctx, valOpAddr1, types.ValidatorOutstandingRewards{Rewards: valCommission})
|
||||||
keeper.SetValidatorOutstandingRewards(ctx, valOpAddr2, valCommission)
|
keeper.SetValidatorOutstandingRewards(ctx, valOpAddr2, types.ValidatorOutstandingRewards{Rewards: valCommission})
|
||||||
|
|
||||||
expectedRewards := valCommission.MulDec(sdk.NewDec(2))
|
expectedRewards := valCommission.MulDec(sdk.NewDec(2))
|
||||||
totalRewards := keeper.GetTotalRewards(ctx)
|
totalRewards := keeper.GetTotalRewards(ctx)
|
||||||
|
|
|
@ -67,8 +67,8 @@ func queryValidatorOutstandingRewards(ctx sdk.Context, path []string, req abci.R
|
||||||
}
|
}
|
||||||
|
|
||||||
rewards := k.GetValidatorOutstandingRewards(ctx, params.ValidatorAddress)
|
rewards := k.GetValidatorOutstandingRewards(ctx, params.ValidatorAddress)
|
||||||
if rewards == nil {
|
if rewards.GetRewards() == nil {
|
||||||
rewards = sdk.DecCoins{}
|
rewards.Rewards = sdk.DecCoins{}
|
||||||
}
|
}
|
||||||
|
|
||||||
bz, err := codec.MarshalJSONIndent(k.cdc, rewards)
|
bz, err := codec.MarshalJSONIndent(k.cdc, rewards)
|
||||||
|
@ -87,8 +87,8 @@ func queryValidatorCommission(ctx sdk.Context, path []string, req abci.RequestQu
|
||||||
}
|
}
|
||||||
|
|
||||||
commission := k.GetValidatorAccumulatedCommission(ctx, params.ValidatorAddress)
|
commission := k.GetValidatorAccumulatedCommission(ctx, params.ValidatorAddress)
|
||||||
if commission == nil {
|
if commission.Commission == nil {
|
||||||
commission = sdk.DecCoins{}
|
commission.Commission = sdk.DecCoins{}
|
||||||
}
|
}
|
||||||
|
|
||||||
bz, err := codec.MarshalJSONIndent(k.cdc, commission)
|
bz, err := codec.MarshalJSONIndent(k.cdc, commission)
|
||||||
|
|
|
@ -27,7 +27,7 @@ func getQueriedParams(t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier s
|
||||||
return params
|
return params
|
||||||
}
|
}
|
||||||
|
|
||||||
func getQueriedValidatorOutstandingRewards(t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier sdk.Querier, validatorAddr sdk.ValAddress) (outstandingRewards sdk.DecCoins) {
|
func getQueriedValidatorOutstandingRewards(t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier sdk.Querier, validatorAddr sdk.ValAddress) sdk.DecCoins {
|
||||||
query := abci.RequestQuery{
|
query := abci.RequestQuery{
|
||||||
Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryValidatorOutstandingRewards}, "/"),
|
Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryValidatorOutstandingRewards}, "/"),
|
||||||
Data: cdc.MustMarshalJSON(types.NewQueryValidatorOutstandingRewardsParams(validatorAddr)),
|
Data: cdc.MustMarshalJSON(types.NewQueryValidatorOutstandingRewardsParams(validatorAddr)),
|
||||||
|
@ -35,12 +35,13 @@ func getQueriedValidatorOutstandingRewards(t *testing.T, ctx sdk.Context, cdc *c
|
||||||
|
|
||||||
bz, err := querier(ctx, []string{types.QueryValidatorOutstandingRewards}, query)
|
bz, err := querier(ctx, []string{types.QueryValidatorOutstandingRewards}, query)
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
|
outstandingRewards := types.ValidatorOutstandingRewards{}
|
||||||
require.Nil(t, cdc.UnmarshalJSON(bz, &outstandingRewards))
|
require.Nil(t, cdc.UnmarshalJSON(bz, &outstandingRewards))
|
||||||
|
|
||||||
return
|
return outstandingRewards.GetRewards()
|
||||||
}
|
}
|
||||||
|
|
||||||
func getQueriedValidatorCommission(t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier sdk.Querier, validatorAddr sdk.ValAddress) (validatorCommission sdk.DecCoins) {
|
func getQueriedValidatorCommission(t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier sdk.Querier, validatorAddr sdk.ValAddress) sdk.DecCoins {
|
||||||
query := abci.RequestQuery{
|
query := abci.RequestQuery{
|
||||||
Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryValidatorCommission}, "/"),
|
Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryValidatorCommission}, "/"),
|
||||||
Data: cdc.MustMarshalJSON(types.NewQueryValidatorCommissionParams(validatorAddr)),
|
Data: cdc.MustMarshalJSON(types.NewQueryValidatorCommissionParams(validatorAddr)),
|
||||||
|
@ -48,9 +49,10 @@ func getQueriedValidatorCommission(t *testing.T, ctx sdk.Context, cdc *codec.Cod
|
||||||
|
|
||||||
bz, err := querier(ctx, []string{types.QueryValidatorCommission}, query)
|
bz, err := querier(ctx, []string{types.QueryValidatorCommission}, query)
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
|
validatorCommission := types.ValidatorAccumulatedCommission{}
|
||||||
require.Nil(t, cdc.UnmarshalJSON(bz, &validatorCommission))
|
require.Nil(t, cdc.UnmarshalJSON(bz, &validatorCommission))
|
||||||
|
|
||||||
return
|
return validatorCommission.GetCommission()
|
||||||
}
|
}
|
||||||
|
|
||||||
func getQueriedValidatorSlashes(t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier sdk.Querier, validatorAddr sdk.ValAddress, startHeight uint64, endHeight uint64) (slashes []types.ValidatorSlashEvent) {
|
func getQueriedValidatorSlashes(t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier sdk.Querier, validatorAddr sdk.ValAddress, startHeight uint64, endHeight uint64) (slashes []types.ValidatorSlashEvent) {
|
||||||
|
@ -130,13 +132,13 @@ func TestQueries(t *testing.T) {
|
||||||
|
|
||||||
// test outstanding rewards query
|
// test outstanding rewards query
|
||||||
outstandingRewards := sdk.DecCoins{{Denom: "mytoken", Amount: sdk.NewDec(3)}, {Denom: "myothertoken", Amount: sdk.NewDecWithPrec(3, 7)}}
|
outstandingRewards := sdk.DecCoins{{Denom: "mytoken", Amount: sdk.NewDec(3)}, {Denom: "myothertoken", Amount: sdk.NewDecWithPrec(3, 7)}}
|
||||||
keeper.SetValidatorOutstandingRewards(ctx, valOpAddr1, outstandingRewards)
|
keeper.SetValidatorOutstandingRewards(ctx, valOpAddr1, types.ValidatorOutstandingRewards{Rewards: outstandingRewards})
|
||||||
retOutstandingRewards := getQueriedValidatorOutstandingRewards(t, ctx, cdc, querier, valOpAddr1)
|
retOutstandingRewards := getQueriedValidatorOutstandingRewards(t, ctx, cdc, querier, valOpAddr1)
|
||||||
require.Equal(t, outstandingRewards, retOutstandingRewards)
|
require.Equal(t, outstandingRewards, retOutstandingRewards)
|
||||||
|
|
||||||
// test validator commission query
|
// test validator commission query
|
||||||
commission := sdk.DecCoins{{Denom: "token1", Amount: sdk.NewDec(4)}, {Denom: "token2", Amount: sdk.NewDec(2)}}
|
commission := sdk.DecCoins{{Denom: "token1", Amount: sdk.NewDec(4)}, {Denom: "token2", Amount: sdk.NewDec(2)}}
|
||||||
keeper.SetValidatorAccumulatedCommission(ctx, valOpAddr1, commission)
|
keeper.SetValidatorAccumulatedCommission(ctx, valOpAddr1, types.ValidatorAccumulatedCommission{Commission: commission})
|
||||||
retCommission := getQueriedValidatorCommission(t, ctx, cdc, querier, valOpAddr1)
|
retCommission := getQueriedValidatorCommission(t, ctx, cdc, querier, valOpAddr1)
|
||||||
require.Equal(t, commission, retCommission)
|
require.Equal(t, commission, retCommission)
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package keeper
|
package keeper
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
gogotypes "github.com/gogo/protobuf/types"
|
||||||
|
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
"github.com/cosmos/cosmos-sdk/x/distribution/types"
|
"github.com/cosmos/cosmos-sdk/x/distribution/types"
|
||||||
)
|
)
|
||||||
|
@ -55,26 +57,29 @@ func (k Keeper) GetFeePool(ctx sdk.Context) (feePool types.FeePool) {
|
||||||
// set the global fee pool distribution info
|
// set the global fee pool distribution info
|
||||||
func (k Keeper) SetFeePool(ctx sdk.Context, feePool types.FeePool) {
|
func (k Keeper) SetFeePool(ctx sdk.Context, feePool types.FeePool) {
|
||||||
store := ctx.KVStore(k.storeKey)
|
store := ctx.KVStore(k.storeKey)
|
||||||
b := k.cdc.MustMarshalBinaryLengthPrefixed(feePool)
|
b := k.cdc.MustMarshalBinaryLengthPrefixed(&feePool)
|
||||||
store.Set(types.FeePoolKey, b)
|
store.Set(types.FeePoolKey, b)
|
||||||
}
|
}
|
||||||
|
|
||||||
// get the proposer public key for this block
|
// GetPreviousProposerConsAddr returns the proposer consensus address for the
|
||||||
func (k Keeper) GetPreviousProposerConsAddr(ctx sdk.Context) (consAddr sdk.ConsAddress) {
|
// current block.
|
||||||
|
func (k Keeper) GetPreviousProposerConsAddr(ctx sdk.Context) sdk.ConsAddress {
|
||||||
store := ctx.KVStore(k.storeKey)
|
store := ctx.KVStore(k.storeKey)
|
||||||
b := store.Get(types.ProposerKey)
|
bz := store.Get(types.ProposerKey)
|
||||||
if b == nil {
|
if bz == nil {
|
||||||
panic("Previous proposer not set")
|
panic("previous proposer not set")
|
||||||
}
|
}
|
||||||
k.cdc.MustUnmarshalBinaryLengthPrefixed(b, &consAddr)
|
|
||||||
return
|
addrValue := gogotypes.BytesValue{}
|
||||||
|
k.cdc.MustUnmarshalBinaryLengthPrefixed(bz, &addrValue)
|
||||||
|
return sdk.ConsAddress(addrValue.GetValue())
|
||||||
}
|
}
|
||||||
|
|
||||||
// set the proposer public key for this block
|
// set the proposer public key for this block
|
||||||
func (k Keeper) SetPreviousProposerConsAddr(ctx sdk.Context, consAddr sdk.ConsAddress) {
|
func (k Keeper) SetPreviousProposerConsAddr(ctx sdk.Context, consAddr sdk.ConsAddress) {
|
||||||
store := ctx.KVStore(k.storeKey)
|
store := ctx.KVStore(k.storeKey)
|
||||||
b := k.cdc.MustMarshalBinaryLengthPrefixed(consAddr)
|
bz := k.cdc.MustMarshalBinaryLengthPrefixed(&gogotypes.BytesValue{Value: consAddr})
|
||||||
store.Set(types.ProposerKey, b)
|
store.Set(types.ProposerKey, bz)
|
||||||
}
|
}
|
||||||
|
|
||||||
// get the starting info associated with a delegator
|
// get the starting info associated with a delegator
|
||||||
|
@ -88,7 +93,7 @@ func (k Keeper) GetDelegatorStartingInfo(ctx sdk.Context, val sdk.ValAddress, de
|
||||||
// set the starting info associated with a delegator
|
// set the starting info associated with a delegator
|
||||||
func (k Keeper) SetDelegatorStartingInfo(ctx sdk.Context, val sdk.ValAddress, del sdk.AccAddress, period types.DelegatorStartingInfo) {
|
func (k Keeper) SetDelegatorStartingInfo(ctx sdk.Context, val sdk.ValAddress, del sdk.AccAddress, period types.DelegatorStartingInfo) {
|
||||||
store := ctx.KVStore(k.storeKey)
|
store := ctx.KVStore(k.storeKey)
|
||||||
b := k.cdc.MustMarshalBinaryLengthPrefixed(period)
|
b := k.cdc.MustMarshalBinaryLengthPrefixed(&period)
|
||||||
store.Set(types.GetDelegatorStartingInfoKey(val, del), b)
|
store.Set(types.GetDelegatorStartingInfoKey(val, del), b)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -130,7 +135,7 @@ func (k Keeper) GetValidatorHistoricalRewards(ctx sdk.Context, val sdk.ValAddres
|
||||||
// set historical rewards for a particular period
|
// set historical rewards for a particular period
|
||||||
func (k Keeper) SetValidatorHistoricalRewards(ctx sdk.Context, val sdk.ValAddress, period uint64, rewards types.ValidatorHistoricalRewards) {
|
func (k Keeper) SetValidatorHistoricalRewards(ctx sdk.Context, val sdk.ValAddress, period uint64, rewards types.ValidatorHistoricalRewards) {
|
||||||
store := ctx.KVStore(k.storeKey)
|
store := ctx.KVStore(k.storeKey)
|
||||||
b := k.cdc.MustMarshalBinaryLengthPrefixed(rewards)
|
b := k.cdc.MustMarshalBinaryLengthPrefixed(&rewards)
|
||||||
store.Set(types.GetValidatorHistoricalRewardsKey(val, period), b)
|
store.Set(types.GetValidatorHistoricalRewardsKey(val, period), b)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -199,7 +204,7 @@ func (k Keeper) GetValidatorCurrentRewards(ctx sdk.Context, val sdk.ValAddress)
|
||||||
// set current rewards for a validator
|
// set current rewards for a validator
|
||||||
func (k Keeper) SetValidatorCurrentRewards(ctx sdk.Context, val sdk.ValAddress, rewards types.ValidatorCurrentRewards) {
|
func (k Keeper) SetValidatorCurrentRewards(ctx sdk.Context, val sdk.ValAddress, rewards types.ValidatorCurrentRewards) {
|
||||||
store := ctx.KVStore(k.storeKey)
|
store := ctx.KVStore(k.storeKey)
|
||||||
b := k.cdc.MustMarshalBinaryLengthPrefixed(rewards)
|
b := k.cdc.MustMarshalBinaryLengthPrefixed(&rewards)
|
||||||
store.Set(types.GetValidatorCurrentRewardsKey(val), b)
|
store.Set(types.GetValidatorCurrentRewardsKey(val), b)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -240,10 +245,10 @@ func (k Keeper) SetValidatorAccumulatedCommission(ctx sdk.Context, val sdk.ValAd
|
||||||
var bz []byte
|
var bz []byte
|
||||||
|
|
||||||
store := ctx.KVStore(k.storeKey)
|
store := ctx.KVStore(k.storeKey)
|
||||||
if commission.IsZero() {
|
if commission.Commission.IsZero() {
|
||||||
bz = k.cdc.MustMarshalBinaryLengthPrefixed(types.InitialValidatorAccumulatedCommission())
|
bz = k.cdc.MustMarshalBinaryLengthPrefixed(&types.ValidatorAccumulatedCommission{})
|
||||||
} else {
|
} else {
|
||||||
bz = k.cdc.MustMarshalBinaryLengthPrefixed(commission)
|
bz = k.cdc.MustMarshalBinaryLengthPrefixed(&commission)
|
||||||
}
|
}
|
||||||
|
|
||||||
store.Set(types.GetValidatorAccumulatedCommissionKey(val), bz)
|
store.Set(types.GetValidatorAccumulatedCommissionKey(val), bz)
|
||||||
|
@ -273,15 +278,15 @@ func (k Keeper) IterateValidatorAccumulatedCommissions(ctx sdk.Context, handler
|
||||||
// get validator outstanding rewards
|
// get validator outstanding rewards
|
||||||
func (k Keeper) GetValidatorOutstandingRewards(ctx sdk.Context, val sdk.ValAddress) (rewards types.ValidatorOutstandingRewards) {
|
func (k Keeper) GetValidatorOutstandingRewards(ctx sdk.Context, val sdk.ValAddress) (rewards types.ValidatorOutstandingRewards) {
|
||||||
store := ctx.KVStore(k.storeKey)
|
store := ctx.KVStore(k.storeKey)
|
||||||
b := store.Get(types.GetValidatorOutstandingRewardsKey(val))
|
bz := store.Get(types.GetValidatorOutstandingRewardsKey(val))
|
||||||
k.cdc.MustUnmarshalBinaryLengthPrefixed(b, &rewards)
|
k.cdc.MustUnmarshalBinaryLengthPrefixed(bz, &rewards)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// set validator outstanding rewards
|
// set validator outstanding rewards
|
||||||
func (k Keeper) SetValidatorOutstandingRewards(ctx sdk.Context, val sdk.ValAddress, rewards types.ValidatorOutstandingRewards) {
|
func (k Keeper) SetValidatorOutstandingRewards(ctx sdk.Context, val sdk.ValAddress, rewards types.ValidatorOutstandingRewards) {
|
||||||
store := ctx.KVStore(k.storeKey)
|
store := ctx.KVStore(k.storeKey)
|
||||||
b := k.cdc.MustMarshalBinaryLengthPrefixed(rewards)
|
b := k.cdc.MustMarshalBinaryLengthPrefixed(&rewards)
|
||||||
store.Set(types.GetValidatorOutstandingRewardsKey(val), b)
|
store.Set(types.GetValidatorOutstandingRewardsKey(val), b)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -297,7 +302,7 @@ func (k Keeper) IterateValidatorOutstandingRewards(ctx sdk.Context, handler func
|
||||||
iter := sdk.KVStorePrefixIterator(store, types.ValidatorOutstandingRewardsPrefix)
|
iter := sdk.KVStorePrefixIterator(store, types.ValidatorOutstandingRewardsPrefix)
|
||||||
defer iter.Close()
|
defer iter.Close()
|
||||||
for ; iter.Valid(); iter.Next() {
|
for ; iter.Valid(); iter.Next() {
|
||||||
var rewards types.ValidatorOutstandingRewards
|
rewards := types.ValidatorOutstandingRewards{}
|
||||||
k.cdc.MustUnmarshalBinaryLengthPrefixed(iter.Value(), &rewards)
|
k.cdc.MustUnmarshalBinaryLengthPrefixed(iter.Value(), &rewards)
|
||||||
addr := types.GetValidatorOutstandingRewardsAddress(iter.Key())
|
addr := types.GetValidatorOutstandingRewardsAddress(iter.Key())
|
||||||
if handler(addr, rewards) {
|
if handler(addr, rewards) {
|
||||||
|
@ -320,7 +325,7 @@ func (k Keeper) GetValidatorSlashEvent(ctx sdk.Context, val sdk.ValAddress, heig
|
||||||
// set slash event for height
|
// set slash event for height
|
||||||
func (k Keeper) SetValidatorSlashEvent(ctx sdk.Context, val sdk.ValAddress, height, period uint64, event types.ValidatorSlashEvent) {
|
func (k Keeper) SetValidatorSlashEvent(ctx sdk.Context, val sdk.ValAddress, height, period uint64, event types.ValidatorSlashEvent) {
|
||||||
store := ctx.KVStore(k.storeKey)
|
store := ctx.KVStore(k.storeKey)
|
||||||
b := k.cdc.MustMarshalBinaryLengthPrefixed(event)
|
b := k.cdc.MustMarshalBinaryLengthPrefixed(&event)
|
||||||
store.Set(types.GetValidatorSlashEventKey(val, height, period), b)
|
store.Set(types.GetValidatorSlashEventKey(val, height, period), b)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -142,7 +142,7 @@ func CreateTestInputAdvanced(
|
||||||
sk := staking.NewKeeper(staking.ModuleCdc, keyStaking, bankKeeper, supplyKeeper, pk.Subspace(staking.DefaultParamspace))
|
sk := staking.NewKeeper(staking.ModuleCdc, keyStaking, bankKeeper, supplyKeeper, pk.Subspace(staking.DefaultParamspace))
|
||||||
sk.SetParams(ctx, staking.DefaultParams())
|
sk.SetParams(ctx, staking.DefaultParams())
|
||||||
|
|
||||||
keeper := NewKeeper(cdc, keyDistr, pk.Subspace(types.DefaultParamspace), bankKeeper, sk, supplyKeeper, auth.FeeCollectorName, blacklistedAddrs)
|
keeper := NewKeeper(types.ModuleCdc, keyDistr, pk.Subspace(types.DefaultParamspace), bankKeeper, sk, supplyKeeper, auth.FeeCollectorName, blacklistedAddrs)
|
||||||
|
|
||||||
initCoins := sdk.NewCoins(sdk.NewCoin(sk.BondDenom(ctx), initTokens))
|
initCoins := sdk.NewCoins(sdk.NewCoin(sk.BondDenom(ctx), initTokens))
|
||||||
totalSupply := sdk.NewCoins(sdk.NewCoin(sk.BondDenom(ctx), initTokens.MulRaw(int64(len(TestAddrs)))))
|
totalSupply := sdk.NewCoins(sdk.NewCoin(sk.BondDenom(ctx), initTokens.MulRaw(int64(len(TestAddrs)))))
|
||||||
|
|
|
@ -21,7 +21,7 @@ func (k Keeper) initializeValidator(ctx sdk.Context, val exported.ValidatorI) {
|
||||||
k.SetValidatorAccumulatedCommission(ctx, val.GetOperator(), types.InitialValidatorAccumulatedCommission())
|
k.SetValidatorAccumulatedCommission(ctx, val.GetOperator(), types.InitialValidatorAccumulatedCommission())
|
||||||
|
|
||||||
// set outstanding rewards
|
// set outstanding rewards
|
||||||
k.SetValidatorOutstandingRewards(ctx, val.GetOperator(), sdk.DecCoins{})
|
k.SetValidatorOutstandingRewards(ctx, val.GetOperator(), types.ValidatorOutstandingRewards{Rewards: sdk.DecCoins{}})
|
||||||
}
|
}
|
||||||
|
|
||||||
// increment validator period, returning the period just ended
|
// increment validator period, returning the period just ended
|
||||||
|
@ -38,7 +38,7 @@ func (k Keeper) incrementValidatorPeriod(ctx sdk.Context, val exported.Validator
|
||||||
feePool := k.GetFeePool(ctx)
|
feePool := k.GetFeePool(ctx)
|
||||||
outstanding := k.GetValidatorOutstandingRewards(ctx, val.GetOperator())
|
outstanding := k.GetValidatorOutstandingRewards(ctx, val.GetOperator())
|
||||||
feePool.CommunityPool = feePool.CommunityPool.Add(rewards.Rewards...)
|
feePool.CommunityPool = feePool.CommunityPool.Add(rewards.Rewards...)
|
||||||
outstanding = outstanding.Sub(rewards.Rewards)
|
outstanding.Rewards = outstanding.GetRewards().Sub(rewards.Rewards)
|
||||||
k.SetFeePool(ctx, feePool)
|
k.SetFeePool(ctx, feePool)
|
||||||
k.SetValidatorOutstandingRewards(ctx, val.GetOperator(), outstanding)
|
k.SetValidatorOutstandingRewards(ctx, val.GetOperator(), outstanding)
|
||||||
|
|
||||||
|
|
|
@ -36,8 +36,8 @@ func TestDecodeDistributionStore(t *testing.T) {
|
||||||
feePool := types.InitialFeePool()
|
feePool := types.InitialFeePool()
|
||||||
feePool.CommunityPool = decCoins
|
feePool.CommunityPool = decCoins
|
||||||
info := types.NewDelegatorStartingInfo(2, sdk.OneDec(), 200)
|
info := types.NewDelegatorStartingInfo(2, sdk.OneDec(), 200)
|
||||||
outstanding := types.ValidatorOutstandingRewards{decCoins[0]}
|
outstanding := types.ValidatorOutstandingRewards{Rewards: decCoins}
|
||||||
commission := types.ValidatorAccumulatedCommission{decCoins[0]}
|
commission := types.ValidatorAccumulatedCommission{Commission: decCoins}
|
||||||
historicalRewards := types.NewValidatorHistoricalRewards(decCoins, 100)
|
historicalRewards := types.NewValidatorHistoricalRewards(decCoins, 100)
|
||||||
currentRewards := types.NewValidatorCurrentRewards(decCoins, 5)
|
currentRewards := types.NewValidatorCurrentRewards(decCoins, 5)
|
||||||
slashEvent := types.NewValidatorSlashEvent(10, sdk.OneDec())
|
slashEvent := types.NewValidatorSlashEvent(10, sdk.OneDec())
|
||||||
|
|
|
@ -177,7 +177,7 @@ func SimulateMsgWithdrawValidatorCommission(ak types.AccountKeeper, bk types.Ban
|
||||||
}
|
}
|
||||||
|
|
||||||
commission := k.GetValidatorAccumulatedCommission(ctx, validator.GetOperator())
|
commission := k.GetValidatorAccumulatedCommission(ctx, validator.GetOperator())
|
||||||
if commission.IsZero() {
|
if commission.Commission.IsZero() {
|
||||||
return simulation.NoOpMsg(types.ModuleName), nil, nil
|
return simulation.NoOpMsg(types.ModuleName), nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,22 @@ import (
|
||||||
"github.com/cosmos/cosmos-sdk/codec"
|
"github.com/cosmos/cosmos-sdk/codec"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Register concrete types on codec codec
|
type Codec struct {
|
||||||
|
codec.Marshaler
|
||||||
|
|
||||||
|
// Keep reference to the amino codec to allow backwards compatibility along
|
||||||
|
// with type, and interface registration.
|
||||||
|
amino *codec.Codec
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewCodec(amino *codec.Codec) *Codec {
|
||||||
|
return &Codec{Marshaler: codec.NewHybridCodec(amino), amino: amino}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// RegisterCodec registers all the necessary crisis module concrete types and
|
||||||
|
// interfaces with the provided codec reference.
|
||||||
func RegisterCodec(cdc *codec.Codec) {
|
func RegisterCodec(cdc *codec.Codec) {
|
||||||
cdc.RegisterConcrete(MsgWithdrawDelegatorReward{}, "cosmos-sdk/MsgWithdrawDelegationReward", nil)
|
cdc.RegisterConcrete(MsgWithdrawDelegatorReward{}, "cosmos-sdk/MsgWithdrawDelegationReward", nil)
|
||||||
cdc.RegisterConcrete(MsgWithdrawValidatorCommission{}, "cosmos-sdk/MsgWithdrawValidatorCommission", nil)
|
cdc.RegisterConcrete(MsgWithdrawValidatorCommission{}, "cosmos-sdk/MsgWithdrawValidatorCommission", nil)
|
||||||
|
@ -13,11 +28,11 @@ func RegisterCodec(cdc *codec.Codec) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// generic sealed codec to be used throughout module
|
// generic sealed codec to be used throughout module
|
||||||
var ModuleCdc *codec.Codec
|
var ModuleCdc *Codec
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
ModuleCdc = codec.New()
|
ModuleCdc = NewCodec(codec.New())
|
||||||
RegisterCodec(ModuleCdc)
|
RegisterCodec(ModuleCdc.amino)
|
||||||
codec.RegisterCrypto(ModuleCdc)
|
codec.RegisterCrypto(ModuleCdc.amino)
|
||||||
ModuleCdc.Seal()
|
ModuleCdc.amino.Seal()
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,19 +4,6 @@ import (
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
// starting info for a delegator reward period
|
|
||||||
// tracks the previous validator period, the delegation's amount
|
|
||||||
// of staking token, and the creation height (to check later on
|
|
||||||
// if any slashes have occurred)
|
|
||||||
// NOTE that even though validators are slashed to whole staking tokens, the
|
|
||||||
// delegators within the validator may be left with less than a full token,
|
|
||||||
// thus sdk.Dec is used
|
|
||||||
type DelegatorStartingInfo struct {
|
|
||||||
PreviousPeriod uint64 `json:"previous_period" yaml:"previous_period"` // period at which the delegation should withdraw starting from
|
|
||||||
Stake sdk.Dec `json:"stake" yaml:"stake"` // amount of staking token delegated
|
|
||||||
Height uint64 `json:"creation_height" yaml:"creation_height"` // height at which delegation was created
|
|
||||||
}
|
|
||||||
|
|
||||||
// create a new DelegatorStartingInfo
|
// create a new DelegatorStartingInfo
|
||||||
func NewDelegatorStartingInfo(previousPeriod uint64, stake sdk.Dec, height uint64) DelegatorStartingInfo {
|
func NewDelegatorStartingInfo(previousPeriod uint64, stake sdk.Dec, height uint64) DelegatorStartingInfo {
|
||||||
return DelegatorStartingInfo{
|
return DelegatorStartingInfo{
|
||||||
|
|
|
@ -6,11 +6,6 @@ import (
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
// global fee pool for distribution
|
|
||||||
type FeePool struct {
|
|
||||||
CommunityPool sdk.DecCoins `json:"community_pool" yaml:"community_pool"` // pool for community funds yet to be spent
|
|
||||||
}
|
|
||||||
|
|
||||||
// zero fee pool
|
// zero fee pool
|
||||||
func InitialFeePool() FeePool {
|
func InitialFeePool() FeePool {
|
||||||
return FeePool{
|
return FeePool{
|
||||||
|
|
|
@ -9,12 +9,6 @@ import (
|
||||||
// Verify interface at compile time
|
// Verify interface at compile time
|
||||||
var _, _, _ sdk.Msg = &MsgSetWithdrawAddress{}, &MsgWithdrawDelegatorReward{}, &MsgWithdrawValidatorCommission{}
|
var _, _, _ sdk.Msg = &MsgSetWithdrawAddress{}, &MsgWithdrawDelegatorReward{}, &MsgWithdrawValidatorCommission{}
|
||||||
|
|
||||||
// msg struct for changing the withdraw address for a delegator (or validator self-delegation)
|
|
||||||
type MsgSetWithdrawAddress struct {
|
|
||||||
DelegatorAddress sdk.AccAddress `json:"delegator_address" yaml:"delegator_address"`
|
|
||||||
WithdrawAddress sdk.AccAddress `json:"withdraw_address" yaml:"withdraw_address"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewMsgSetWithdrawAddress(delAddr, withdrawAddr sdk.AccAddress) MsgSetWithdrawAddress {
|
func NewMsgSetWithdrawAddress(delAddr, withdrawAddr sdk.AccAddress) MsgSetWithdrawAddress {
|
||||||
return MsgSetWithdrawAddress{
|
return MsgSetWithdrawAddress{
|
||||||
DelegatorAddress: delAddr,
|
DelegatorAddress: delAddr,
|
||||||
|
@ -48,12 +42,6 @@ func (msg MsgSetWithdrawAddress) ValidateBasic() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// msg struct for delegation withdraw from a single validator
|
|
||||||
type MsgWithdrawDelegatorReward struct {
|
|
||||||
DelegatorAddress sdk.AccAddress `json:"delegator_address" yaml:"delegator_address"`
|
|
||||||
ValidatorAddress sdk.ValAddress `json:"validator_address" yaml:"validator_address"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewMsgWithdrawDelegatorReward(delAddr sdk.AccAddress, valAddr sdk.ValAddress) MsgWithdrawDelegatorReward {
|
func NewMsgWithdrawDelegatorReward(delAddr sdk.AccAddress, valAddr sdk.ValAddress) MsgWithdrawDelegatorReward {
|
||||||
return MsgWithdrawDelegatorReward{
|
return MsgWithdrawDelegatorReward{
|
||||||
DelegatorAddress: delAddr,
|
DelegatorAddress: delAddr,
|
||||||
|
@ -86,11 +74,6 @@ func (msg MsgWithdrawDelegatorReward) ValidateBasic() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// msg struct for validator withdraw
|
|
||||||
type MsgWithdrawValidatorCommission struct {
|
|
||||||
ValidatorAddress sdk.ValAddress `json:"validator_address" yaml:"validator_address"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewMsgWithdrawValidatorCommission(valAddr sdk.ValAddress) MsgWithdrawValidatorCommission {
|
func NewMsgWithdrawValidatorCommission(valAddr sdk.ValAddress) MsgWithdrawValidatorCommission {
|
||||||
return MsgWithdrawValidatorCommission{
|
return MsgWithdrawValidatorCommission{
|
||||||
ValidatorAddress: valAddr,
|
ValidatorAddress: valAddr,
|
||||||
|
@ -121,13 +104,6 @@ func (msg MsgWithdrawValidatorCommission) ValidateBasic() error {
|
||||||
|
|
||||||
const TypeMsgFundCommunityPool = "fund_community_pool"
|
const TypeMsgFundCommunityPool = "fund_community_pool"
|
||||||
|
|
||||||
// MsgFundCommunityPool defines a Msg type that allows an account to directly
|
|
||||||
// fund the community pool.
|
|
||||||
type MsgFundCommunityPool struct {
|
|
||||||
Amount sdk.Coins `json:"amount" yaml:"amount"`
|
|
||||||
Depositor sdk.AccAddress `json:"depositor" yaml:"depositor"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewMsgFundCommunityPool returns a new MsgFundCommunityPool with a sender and
|
// NewMsgFundCommunityPool returns a new MsgFundCommunityPool with a sender and
|
||||||
// a funding amount.
|
// a funding amount.
|
||||||
func NewMsgFundCommunityPool(amount sdk.Coins, depositor sdk.AccAddress) MsgFundCommunityPool {
|
func NewMsgFundCommunityPool(amount sdk.Coins, depositor sdk.AccAddress) MsgFundCommunityPool {
|
||||||
|
|
|
@ -22,14 +22,6 @@ var (
|
||||||
ParamStoreKeyWithdrawAddrEnabled = []byte("withdrawaddrenabled")
|
ParamStoreKeyWithdrawAddrEnabled = []byte("withdrawaddrenabled")
|
||||||
)
|
)
|
||||||
|
|
||||||
// Params defines the set of distribution parameters.
|
|
||||||
type Params struct {
|
|
||||||
CommunityTax sdk.Dec `json:"community_tax" yaml:"community_tax"`
|
|
||||||
BaseProposerReward sdk.Dec `json:"base_proposer_reward" yaml:"base_proposer_reward"`
|
|
||||||
BonusProposerReward sdk.Dec `json:"bonus_proposer_reward" yaml:"bonus_proposer_reward"`
|
|
||||||
WithdrawAddrEnabled bool `json:"withdraw_addr_enabled" yaml:"withdraw_addr_enabled"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ParamKeyTable returns the parameter key table.
|
// ParamKeyTable returns the parameter key table.
|
||||||
func ParamKeyTable() params.KeyTable {
|
func ParamKeyTable() params.KeyTable {
|
||||||
return params.NewKeyTable().RegisterParamSet(&Params{})
|
return params.NewKeyTable().RegisterParamSet(&Params{})
|
||||||
|
|
|
@ -21,14 +21,6 @@ func init() {
|
||||||
govtypes.RegisterProposalTypeCodec(CommunityPoolSpendProposal{}, "cosmos-sdk/CommunityPoolSpendProposal")
|
govtypes.RegisterProposalTypeCodec(CommunityPoolSpendProposal{}, "cosmos-sdk/CommunityPoolSpendProposal")
|
||||||
}
|
}
|
||||||
|
|
||||||
// CommunityPoolSpendProposal spends from the community pool
|
|
||||||
type CommunityPoolSpendProposal struct {
|
|
||||||
Title string `json:"title" yaml:"title"`
|
|
||||||
Description string `json:"description" yaml:"description"`
|
|
||||||
Recipient sdk.AccAddress `json:"recipient" yaml:"recipient"`
|
|
||||||
Amount sdk.Coins `json:"amount" yaml:"amount"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewCommunityPoolSpendProposal creates a new community pool spned proposal.
|
// NewCommunityPoolSpendProposal creates a new community pool spned proposal.
|
||||||
func NewCommunityPoolSpendProposal(title, description string, recipient sdk.AccAddress, amount sdk.Coins) CommunityPoolSpendProposal {
|
func NewCommunityPoolSpendProposal(title, description string, recipient sdk.AccAddress, amount sdk.Coins) CommunityPoolSpendProposal {
|
||||||
return CommunityPoolSpendProposal{title, description, recipient, amount}
|
return CommunityPoolSpendProposal{title, description, recipient, amount}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,182 @@
|
||||||
|
syntax = "proto3";
|
||||||
|
package cosmos_sdk.x.ditribution.v1;
|
||||||
|
|
||||||
|
option go_package = "types";
|
||||||
|
|
||||||
|
import "third_party/proto/gogoproto/gogo.proto";
|
||||||
|
import "types/types.proto";
|
||||||
|
|
||||||
|
// msg struct for changing the withdraw address for a delegator (or validator self-delegation)
|
||||||
|
message MsgSetWithdrawAddress {
|
||||||
|
bytes delegator_address = 1 [
|
||||||
|
(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/types.AccAddress",
|
||||||
|
(gogoproto.moretags) = "yaml:\"delegator_address\""
|
||||||
|
];
|
||||||
|
bytes withdraw_address = 2 [
|
||||||
|
(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/types.AccAddress",
|
||||||
|
(gogoproto.moretags) = "yaml:\"withdraw_address\""
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
// msg struct for delegation withdraw from a single validator
|
||||||
|
message MsgWithdrawDelegatorReward {
|
||||||
|
bytes delegator_address = 1 [
|
||||||
|
(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/types.AccAddress",
|
||||||
|
(gogoproto.moretags) = "yaml:\"delegator_address\""
|
||||||
|
];
|
||||||
|
bytes validator_address = 2 [
|
||||||
|
(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/types.ValAddress",
|
||||||
|
(gogoproto.moretags) = "yaml:\"validator_address\""
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
// msg struct for validator withdraw
|
||||||
|
message MsgWithdrawValidatorCommission {
|
||||||
|
bytes validator_address = 1 [
|
||||||
|
(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/types.ValAddress",
|
||||||
|
(gogoproto.moretags) = "yaml:\"validator_address\""
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
// MsgFundCommunityPool defines a Msg type that allows an account to directly
|
||||||
|
// fund the community pool.
|
||||||
|
message MsgFundCommunityPool {
|
||||||
|
repeated cosmos_sdk.v1.Coin amount = 1 [
|
||||||
|
(gogoproto.nullable) = false,
|
||||||
|
(gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"
|
||||||
|
];
|
||||||
|
bytes depositor = 2 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/types.AccAddress"];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Params defines the set of distribution parameters.
|
||||||
|
message Params {
|
||||||
|
option (gogoproto.goproto_stringer) = false;
|
||||||
|
string community_tax = 1 [
|
||||||
|
(gogoproto.moretags) = "yaml:\"community_tax\"",
|
||||||
|
(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec",
|
||||||
|
(gogoproto.nullable) = false
|
||||||
|
];
|
||||||
|
string base_proposer_reward = 2 [
|
||||||
|
(gogoproto.moretags) = "yaml:\"base_proposer_reward\"",
|
||||||
|
(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec",
|
||||||
|
(gogoproto.nullable) = false
|
||||||
|
];
|
||||||
|
string bonus_proposer_reward = 3 [
|
||||||
|
(gogoproto.moretags) = "yaml:\"bonus_proposer_reward\"",
|
||||||
|
(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec",
|
||||||
|
(gogoproto.nullable) = false
|
||||||
|
];
|
||||||
|
bool withdraw_addr_enabled = 4 [(gogoproto.moretags) = "yaml:\"withdraw_addr_enabled\""];
|
||||||
|
}
|
||||||
|
|
||||||
|
// historical rewards for a validator
|
||||||
|
// height is implicit within the store key
|
||||||
|
// cumulative reward ratio is the sum from the zeroeth period
|
||||||
|
// until this period of rewards / tokens, per the spec
|
||||||
|
// The reference count indicates the number of objects
|
||||||
|
// which might need to reference this historical entry
|
||||||
|
// at any point.
|
||||||
|
// ReferenceCount =
|
||||||
|
// number of outstanding delegations which ended the associated period (and might need to read
|
||||||
|
// that record)
|
||||||
|
// + number of slashes which ended the associated period (and might need to read that record)
|
||||||
|
// + one per validator for the zeroeth period, set on initialization
|
||||||
|
message ValidatorHistoricalRewards {
|
||||||
|
repeated cosmos_sdk.v1.DecCoin cumulative_reward_ratio = 1 [
|
||||||
|
(gogoproto.moretags) = "yaml:\"cumulative_reward_ratio\"",
|
||||||
|
(gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.DecCoins",
|
||||||
|
(gogoproto.nullable) = false
|
||||||
|
];
|
||||||
|
uint32 reference_count = 2 [(gogoproto.moretags) = "yaml:\"reference_count\""];
|
||||||
|
}
|
||||||
|
|
||||||
|
// current rewards and current period for a validator
|
||||||
|
// kept as a running counter and incremented each block
|
||||||
|
// as long as the validator's tokens remain constant
|
||||||
|
message ValidatorCurrentRewards {
|
||||||
|
repeated cosmos_sdk.v1.DecCoin rewards = 1 [
|
||||||
|
(gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.DecCoins",
|
||||||
|
(gogoproto.nullable) = false
|
||||||
|
];
|
||||||
|
uint64 period = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// accumulated commission for a validator
|
||||||
|
// kept as a running counter, can be withdrawn at any time
|
||||||
|
message ValidatorAccumulatedCommission {
|
||||||
|
repeated cosmos_sdk.v1.DecCoin commission = 1 [
|
||||||
|
(gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.DecCoins",
|
||||||
|
(gogoproto.nullable) = false
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
// outstanding (un-withdrawn) rewards for a validator
|
||||||
|
// inexpensive to track, allows simple sanity checks
|
||||||
|
message ValidatorOutstandingRewards {
|
||||||
|
repeated cosmos_sdk.v1.DecCoin rewards = 1 [
|
||||||
|
(gogoproto.moretags) = "yaml:\"rewards\"",
|
||||||
|
(gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.DecCoins",
|
||||||
|
(gogoproto.nullable) = false
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
// validator slash event
|
||||||
|
// height is implicit within the store key
|
||||||
|
// needed to calculate appropriate amounts of staking token
|
||||||
|
// for delegations which withdraw after a slash has occurred
|
||||||
|
message ValidatorSlashEvent {
|
||||||
|
uint64 validator_period = 1 [(gogoproto.moretags) = "yaml:\"validator_period\""];
|
||||||
|
string fraction = 2 [
|
||||||
|
(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec",
|
||||||
|
(gogoproto.nullable) = false
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
// ValidatorSlashEvents is a collection of ValidatorSlashEvent
|
||||||
|
message ValidatorSlashEvents {
|
||||||
|
option (gogoproto.goproto_stringer) = false;
|
||||||
|
repeated ValidatorSlashEvent validator_slash_events = 1
|
||||||
|
[(gogoproto.moretags) = "yaml:\"validator_slash_events\"", (gogoproto.nullable) = false];
|
||||||
|
}
|
||||||
|
|
||||||
|
// global fee pool for distribution
|
||||||
|
message FeePool {
|
||||||
|
repeated cosmos_sdk.v1.DecCoin community_pool = 1 [
|
||||||
|
(gogoproto.nullable) = false,
|
||||||
|
(gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.DecCoins",
|
||||||
|
(gogoproto.moretags) = "yaml:\"community_pool\""
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
// CommunityPoolSpendProposal spends from the community pool
|
||||||
|
message CommunityPoolSpendProposal {
|
||||||
|
option (gogoproto.goproto_stringer) = false;
|
||||||
|
option (gogoproto.goproto_getters) = false;
|
||||||
|
string title = 1;
|
||||||
|
string description = 2;
|
||||||
|
bytes recipient = 3 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/types.AccAddress"];
|
||||||
|
repeated cosmos_sdk.v1.Coin amount = 4 [
|
||||||
|
(gogoproto.nullable) = false,
|
||||||
|
(gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
// starting info for a delegator reward period
|
||||||
|
// tracks the previous validator period, the delegation's amount
|
||||||
|
// of staking token, and the creation height (to check later on
|
||||||
|
// if any slashes have occurred)
|
||||||
|
// NOTE that even though validators are slashed to whole staking tokens, the
|
||||||
|
// delegators within the validator may be left with less than a full token,
|
||||||
|
// thus sdk.Dec is used
|
||||||
|
message DelegatorStartingInfo {
|
||||||
|
uint64 previous_period = 1 [(gogoproto.moretags) = "yaml:\"previous_period\""];
|
||||||
|
string stake = 2 [
|
||||||
|
(gogoproto.moretags) = "yaml:\"stake\"",
|
||||||
|
(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec",
|
||||||
|
(gogoproto.nullable) = false
|
||||||
|
];
|
||||||
|
uint64 height = 3 [
|
||||||
|
(gogoproto.moretags) = "yaml:\"creation_height\"",
|
||||||
|
(gogoproto.jsontag) = "creation_height"
|
||||||
|
];
|
||||||
|
}
|
|
@ -7,38 +7,14 @@ import (
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
// historical rewards for a validator
|
|
||||||
// height is implicit within the store key
|
|
||||||
// cumulative reward ratio is the sum from the zeroeth period
|
|
||||||
// until this period of rewards / tokens, per the spec
|
|
||||||
// The reference count indicates the number of objects
|
|
||||||
// which might need to reference this historical entry
|
|
||||||
// at any point.
|
|
||||||
// ReferenceCount =
|
|
||||||
// number of outstanding delegations which ended the associated period (and might need to read that record)
|
|
||||||
// + number of slashes which ended the associated period (and might need to read that record)
|
|
||||||
// + one per validator for the zeroeth period, set on initialization
|
|
||||||
type ValidatorHistoricalRewards struct {
|
|
||||||
CumulativeRewardRatio sdk.DecCoins `json:"cumulative_reward_ratio" yaml:"cumulative_reward_ratio"`
|
|
||||||
ReferenceCount uint16 `json:"reference_count" yaml:"reference_count"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// create a new ValidatorHistoricalRewards
|
// create a new ValidatorHistoricalRewards
|
||||||
func NewValidatorHistoricalRewards(cumulativeRewardRatio sdk.DecCoins, referenceCount uint16) ValidatorHistoricalRewards {
|
func NewValidatorHistoricalRewards(cumulativeRewardRatio sdk.DecCoins, referenceCount uint32) ValidatorHistoricalRewards {
|
||||||
return ValidatorHistoricalRewards{
|
return ValidatorHistoricalRewards{
|
||||||
CumulativeRewardRatio: cumulativeRewardRatio,
|
CumulativeRewardRatio: cumulativeRewardRatio,
|
||||||
ReferenceCount: referenceCount,
|
ReferenceCount: referenceCount,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// current rewards and current period for a validator
|
|
||||||
// kept as a running counter and incremented each block
|
|
||||||
// as long as the validator's tokens remain constant
|
|
||||||
type ValidatorCurrentRewards struct {
|
|
||||||
Rewards sdk.DecCoins `json:"rewards" yaml:"rewards"` // current rewards
|
|
||||||
Period uint64 `json:"period" yaml:"period"` // current period
|
|
||||||
}
|
|
||||||
|
|
||||||
// create a new ValidatorCurrentRewards
|
// create a new ValidatorCurrentRewards
|
||||||
func NewValidatorCurrentRewards(rewards sdk.DecCoins, period uint64) ValidatorCurrentRewards {
|
func NewValidatorCurrentRewards(rewards sdk.DecCoins, period uint64) ValidatorCurrentRewards {
|
||||||
return ValidatorCurrentRewards{
|
return ValidatorCurrentRewards{
|
||||||
|
@ -47,24 +23,11 @@ func NewValidatorCurrentRewards(rewards sdk.DecCoins, period uint64) ValidatorCu
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// accumulated commission for a validator
|
|
||||||
// kept as a running counter, can be withdrawn at any time
|
|
||||||
type ValidatorAccumulatedCommission = sdk.DecCoins
|
|
||||||
|
|
||||||
// return the initial accumulated commission (zero)
|
// return the initial accumulated commission (zero)
|
||||||
func InitialValidatorAccumulatedCommission() ValidatorAccumulatedCommission {
|
func InitialValidatorAccumulatedCommission() ValidatorAccumulatedCommission {
|
||||||
return ValidatorAccumulatedCommission{}
|
return ValidatorAccumulatedCommission{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// validator slash event
|
|
||||||
// height is implicit within the store key
|
|
||||||
// needed to calculate appropriate amounts of staking token
|
|
||||||
// for delegations which withdraw after a slash has occurred
|
|
||||||
type ValidatorSlashEvent struct {
|
|
||||||
ValidatorPeriod uint64 `json:"validator_period" yaml:"validator_period"` // period when the slash occurred
|
|
||||||
Fraction sdk.Dec `json:"fraction" yaml:"fraction"` // slash fraction
|
|
||||||
}
|
|
||||||
|
|
||||||
// create a new ValidatorSlashEvent
|
// create a new ValidatorSlashEvent
|
||||||
func NewValidatorSlashEvent(validatorPeriod uint64, fraction sdk.Dec) ValidatorSlashEvent {
|
func NewValidatorSlashEvent(validatorPeriod uint64, fraction sdk.Dec) ValidatorSlashEvent {
|
||||||
return ValidatorSlashEvent{
|
return ValidatorSlashEvent{
|
||||||
|
@ -73,17 +36,9 @@ func NewValidatorSlashEvent(validatorPeriod uint64, fraction sdk.Dec) ValidatorS
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (vs ValidatorSlashEvent) String() string {
|
|
||||||
return fmt.Sprintf(`Period: %d
|
|
||||||
Fraction: %s`, vs.ValidatorPeriod, vs.Fraction)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ValidatorSlashEvents is a collection of ValidatorSlashEvent
|
|
||||||
type ValidatorSlashEvents []ValidatorSlashEvent
|
|
||||||
|
|
||||||
func (vs ValidatorSlashEvents) String() string {
|
func (vs ValidatorSlashEvents) String() string {
|
||||||
out := "Validator Slash Events:\n"
|
out := "Validator Slash Events:\n"
|
||||||
for i, sl := range vs {
|
for i, sl := range vs.ValidatorSlashEvents {
|
||||||
out += fmt.Sprintf(` Slash %d:
|
out += fmt.Sprintf(` Slash %d:
|
||||||
Period: %d
|
Period: %d
|
||||||
Fraction: %s
|
Fraction: %s
|
||||||
|
@ -91,7 +46,3 @@ func (vs ValidatorSlashEvents) String() string {
|
||||||
}
|
}
|
||||||
return strings.TrimSpace(out)
|
return strings.TrimSpace(out)
|
||||||
}
|
}
|
||||||
|
|
||||||
// outstanding (un-withdrawn) rewards for a validator
|
|
||||||
// inexpensive to track, allows simple sanity checks
|
|
||||||
type ValidatorOutstandingRewards = sdk.DecCoins
|
|
||||||
|
|
Loading…
Reference in New Issue