mirror of
https://github.com/0glabs/0g-chain.git
synced 2025-04-01 14:26:02 +00:00
feat: distribution precompile
This commit is contained in:
parent
351c2cb132
commit
f2bd26e111
523
precompiles/distribution/IDistribution.abi
Normal file
523
precompiles/distribution/IDistribution.abi
Normal file
@ -0,0 +1,523 @@
|
||||
[
|
||||
{
|
||||
"inputs": [],
|
||||
"name": "CommunityPool",
|
||||
"outputs": [
|
||||
{
|
||||
"components": [
|
||||
{
|
||||
"internalType": "string",
|
||||
"name": "denom",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"internalType": "uint256",
|
||||
"name": "amount",
|
||||
"type": "uint256"
|
||||
}
|
||||
],
|
||||
"internalType": "struct DecCoin[]",
|
||||
"name": "pool",
|
||||
"type": "tuple[]"
|
||||
}
|
||||
],
|
||||
"stateMutability": "view",
|
||||
"type": "function"
|
||||
},
|
||||
{
|
||||
"inputs": [
|
||||
{
|
||||
"internalType": "address",
|
||||
"name": "delegatorAddress",
|
||||
"type": "address"
|
||||
},
|
||||
{
|
||||
"internalType": "address",
|
||||
"name": "validatorAddress",
|
||||
"type": "address"
|
||||
}
|
||||
],
|
||||
"name": "delegationRewards",
|
||||
"outputs": [
|
||||
{
|
||||
"components": [
|
||||
{
|
||||
"internalType": "string",
|
||||
"name": "denom",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"internalType": "uint256",
|
||||
"name": "amount",
|
||||
"type": "uint256"
|
||||
}
|
||||
],
|
||||
"internalType": "struct DecCoin[]",
|
||||
"name": "rewards",
|
||||
"type": "tuple[]"
|
||||
}
|
||||
],
|
||||
"stateMutability": "view",
|
||||
"type": "function"
|
||||
},
|
||||
{
|
||||
"inputs": [
|
||||
{
|
||||
"internalType": "address",
|
||||
"name": "delegatorAddress",
|
||||
"type": "address"
|
||||
}
|
||||
],
|
||||
"name": "delegationTotalRewards",
|
||||
"outputs": [
|
||||
{
|
||||
"components": [
|
||||
{
|
||||
"internalType": "address",
|
||||
"name": "validatorAddress",
|
||||
"type": "address"
|
||||
},
|
||||
{
|
||||
"components": [
|
||||
{
|
||||
"internalType": "string",
|
||||
"name": "denom",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"internalType": "uint256",
|
||||
"name": "amount",
|
||||
"type": "uint256"
|
||||
}
|
||||
],
|
||||
"internalType": "struct DecCoin[]",
|
||||
"name": "reward",
|
||||
"type": "tuple[]"
|
||||
}
|
||||
],
|
||||
"internalType": "struct DelegationDelegatorReward[]",
|
||||
"name": "rewards",
|
||||
"type": "tuple[]"
|
||||
},
|
||||
{
|
||||
"components": [
|
||||
{
|
||||
"internalType": "string",
|
||||
"name": "denom",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"internalType": "uint256",
|
||||
"name": "amount",
|
||||
"type": "uint256"
|
||||
}
|
||||
],
|
||||
"internalType": "struct DecCoin[]",
|
||||
"name": "total",
|
||||
"type": "tuple[]"
|
||||
}
|
||||
],
|
||||
"stateMutability": "view",
|
||||
"type": "function"
|
||||
},
|
||||
{
|
||||
"inputs": [
|
||||
{
|
||||
"internalType": "address",
|
||||
"name": "delegatorAddress",
|
||||
"type": "address"
|
||||
}
|
||||
],
|
||||
"name": "delegatorValidators",
|
||||
"outputs": [
|
||||
{
|
||||
"internalType": "address[]",
|
||||
"name": "validators",
|
||||
"type": "address[]"
|
||||
}
|
||||
],
|
||||
"stateMutability": "view",
|
||||
"type": "function"
|
||||
},
|
||||
{
|
||||
"inputs": [
|
||||
{
|
||||
"internalType": "address",
|
||||
"name": "delegatorAddress",
|
||||
"type": "address"
|
||||
}
|
||||
],
|
||||
"name": "delegatorWithdrawAddress",
|
||||
"outputs": [
|
||||
{
|
||||
"internalType": "address",
|
||||
"name": "withdrawAddress",
|
||||
"type": "address"
|
||||
}
|
||||
],
|
||||
"stateMutability": "view",
|
||||
"type": "function"
|
||||
},
|
||||
{
|
||||
"inputs": [
|
||||
{
|
||||
"internalType": "address",
|
||||
"name": "depositor",
|
||||
"type": "address"
|
||||
},
|
||||
{
|
||||
"internalType": "uint256",
|
||||
"name": "amount",
|
||||
"type": "uint256"
|
||||
}
|
||||
],
|
||||
"name": "fundCommunityPool",
|
||||
"outputs": [
|
||||
{
|
||||
"internalType": "bool",
|
||||
"name": "success",
|
||||
"type": "bool"
|
||||
}
|
||||
],
|
||||
"stateMutability": "nonpayable",
|
||||
"type": "function"
|
||||
},
|
||||
{
|
||||
"inputs": [],
|
||||
"name": "params",
|
||||
"outputs": [
|
||||
{
|
||||
"components": [
|
||||
{
|
||||
"internalType": "uint256",
|
||||
"name": "communityTax",
|
||||
"type": "uint256"
|
||||
},
|
||||
{
|
||||
"internalType": "uint256",
|
||||
"name": "baseProposerReward",
|
||||
"type": "uint256"
|
||||
},
|
||||
{
|
||||
"internalType": "uint256",
|
||||
"name": "bonusProposerReward",
|
||||
"type": "uint256"
|
||||
},
|
||||
{
|
||||
"internalType": "bool",
|
||||
"name": "withdrawAddrEnabled",
|
||||
"type": "bool"
|
||||
}
|
||||
],
|
||||
"internalType": "struct Params",
|
||||
"name": "",
|
||||
"type": "tuple"
|
||||
}
|
||||
],
|
||||
"stateMutability": "view",
|
||||
"type": "function"
|
||||
},
|
||||
{
|
||||
"inputs": [
|
||||
{
|
||||
"internalType": "address",
|
||||
"name": "delegatorAddress",
|
||||
"type": "address"
|
||||
},
|
||||
{
|
||||
"internalType": "address",
|
||||
"name": "withdrawerAddress",
|
||||
"type": "address"
|
||||
}
|
||||
],
|
||||
"name": "setWithdrawAddress",
|
||||
"outputs": [
|
||||
{
|
||||
"internalType": "bool",
|
||||
"name": "success",
|
||||
"type": "bool"
|
||||
}
|
||||
],
|
||||
"stateMutability": "nonpayable",
|
||||
"type": "function"
|
||||
},
|
||||
{
|
||||
"inputs": [
|
||||
{
|
||||
"internalType": "string",
|
||||
"name": "validatorAddress",
|
||||
"type": "string"
|
||||
}
|
||||
],
|
||||
"name": "validatorCommission",
|
||||
"outputs": [
|
||||
{
|
||||
"components": [
|
||||
{
|
||||
"internalType": "string",
|
||||
"name": "denom",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"internalType": "uint256",
|
||||
"name": "amount",
|
||||
"type": "uint256"
|
||||
}
|
||||
],
|
||||
"internalType": "struct DecCoin[]",
|
||||
"name": "commission",
|
||||
"type": "tuple[]"
|
||||
}
|
||||
],
|
||||
"stateMutability": "view",
|
||||
"type": "function"
|
||||
},
|
||||
{
|
||||
"inputs": [
|
||||
{
|
||||
"internalType": "address",
|
||||
"name": "validatorAddress",
|
||||
"type": "address"
|
||||
}
|
||||
],
|
||||
"name": "validatorDistributionInfo",
|
||||
"outputs": [
|
||||
{
|
||||
"components": [
|
||||
{
|
||||
"internalType": "address",
|
||||
"name": "operatorAddress",
|
||||
"type": "address"
|
||||
},
|
||||
{
|
||||
"components": [
|
||||
{
|
||||
"internalType": "string",
|
||||
"name": "denom",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"internalType": "uint256",
|
||||
"name": "amount",
|
||||
"type": "uint256"
|
||||
}
|
||||
],
|
||||
"internalType": "struct DecCoin[]",
|
||||
"name": "selfBondRewards",
|
||||
"type": "tuple[]"
|
||||
},
|
||||
{
|
||||
"components": [
|
||||
{
|
||||
"internalType": "string",
|
||||
"name": "denom",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"internalType": "uint256",
|
||||
"name": "amount",
|
||||
"type": "uint256"
|
||||
}
|
||||
],
|
||||
"internalType": "struct DecCoin[]",
|
||||
"name": "commission",
|
||||
"type": "tuple[]"
|
||||
}
|
||||
],
|
||||
"internalType": "struct ValidatorDistributionInfoResponse",
|
||||
"name": "distributionInfo",
|
||||
"type": "tuple"
|
||||
}
|
||||
],
|
||||
"stateMutability": "view",
|
||||
"type": "function"
|
||||
},
|
||||
{
|
||||
"inputs": [
|
||||
{
|
||||
"internalType": "address",
|
||||
"name": "validatorAddress",
|
||||
"type": "address"
|
||||
}
|
||||
],
|
||||
"name": "validatorOutstandingRewards",
|
||||
"outputs": [
|
||||
{
|
||||
"components": [
|
||||
{
|
||||
"internalType": "string",
|
||||
"name": "denom",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"internalType": "uint256",
|
||||
"name": "amount",
|
||||
"type": "uint256"
|
||||
}
|
||||
],
|
||||
"internalType": "struct DecCoin[]",
|
||||
"name": "rewards",
|
||||
"type": "tuple[]"
|
||||
}
|
||||
],
|
||||
"stateMutability": "view",
|
||||
"type": "function"
|
||||
},
|
||||
{
|
||||
"inputs": [
|
||||
{
|
||||
"internalType": "address",
|
||||
"name": "validatorAddress",
|
||||
"type": "address"
|
||||
},
|
||||
{
|
||||
"internalType": "uint64",
|
||||
"name": "startingHeight",
|
||||
"type": "uint64"
|
||||
},
|
||||
{
|
||||
"internalType": "uint64",
|
||||
"name": "endingHeight",
|
||||
"type": "uint64"
|
||||
},
|
||||
{
|
||||
"components": [
|
||||
{
|
||||
"internalType": "bytes",
|
||||
"name": "key",
|
||||
"type": "bytes"
|
||||
},
|
||||
{
|
||||
"internalType": "uint64",
|
||||
"name": "offset",
|
||||
"type": "uint64"
|
||||
},
|
||||
{
|
||||
"internalType": "uint64",
|
||||
"name": "limit",
|
||||
"type": "uint64"
|
||||
},
|
||||
{
|
||||
"internalType": "bool",
|
||||
"name": "countTotal",
|
||||
"type": "bool"
|
||||
},
|
||||
{
|
||||
"internalType": "bool",
|
||||
"name": "reverse",
|
||||
"type": "bool"
|
||||
}
|
||||
],
|
||||
"internalType": "struct PageRequest",
|
||||
"name": "pageRequest",
|
||||
"type": "tuple"
|
||||
}
|
||||
],
|
||||
"name": "validatorSlashes",
|
||||
"outputs": [
|
||||
{
|
||||
"components": [
|
||||
{
|
||||
"internalType": "uint64",
|
||||
"name": "validatorPeriod",
|
||||
"type": "uint64"
|
||||
},
|
||||
{
|
||||
"internalType": "uint256",
|
||||
"name": "fraction",
|
||||
"type": "uint256"
|
||||
}
|
||||
],
|
||||
"internalType": "struct ValidatorSlashEvent[]",
|
||||
"name": "slashes",
|
||||
"type": "tuple[]"
|
||||
},
|
||||
{
|
||||
"components": [
|
||||
{
|
||||
"internalType": "bytes",
|
||||
"name": "nextKey",
|
||||
"type": "bytes"
|
||||
},
|
||||
{
|
||||
"internalType": "uint64",
|
||||
"name": "total",
|
||||
"type": "uint64"
|
||||
}
|
||||
],
|
||||
"internalType": "struct PageResponse",
|
||||
"name": "pageResponse",
|
||||
"type": "tuple"
|
||||
}
|
||||
],
|
||||
"stateMutability": "view",
|
||||
"type": "function"
|
||||
},
|
||||
{
|
||||
"inputs": [
|
||||
{
|
||||
"internalType": "address",
|
||||
"name": "delegatorAddress",
|
||||
"type": "address"
|
||||
},
|
||||
{
|
||||
"internalType": "string",
|
||||
"name": "validatorAddress",
|
||||
"type": "string"
|
||||
}
|
||||
],
|
||||
"name": "withdrawDelegatorRewards",
|
||||
"outputs": [
|
||||
{
|
||||
"components": [
|
||||
{
|
||||
"internalType": "string",
|
||||
"name": "denom",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"internalType": "uint256",
|
||||
"name": "amount",
|
||||
"type": "uint256"
|
||||
}
|
||||
],
|
||||
"internalType": "struct Coin[]",
|
||||
"name": "amount",
|
||||
"type": "tuple[]"
|
||||
}
|
||||
],
|
||||
"stateMutability": "nonpayable",
|
||||
"type": "function"
|
||||
},
|
||||
{
|
||||
"inputs": [
|
||||
{
|
||||
"internalType": "address",
|
||||
"name": "validatorAddress",
|
||||
"type": "address"
|
||||
}
|
||||
],
|
||||
"name": "withdrawValidatorCommission",
|
||||
"outputs": [
|
||||
{
|
||||
"components": [
|
||||
{
|
||||
"internalType": "string",
|
||||
"name": "denom",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"internalType": "uint256",
|
||||
"name": "amount",
|
||||
"type": "uint256"
|
||||
}
|
||||
],
|
||||
"internalType": "struct Coin[]",
|
||||
"name": "amount",
|
||||
"type": "tuple[]"
|
||||
}
|
||||
],
|
||||
"stateMutability": "nonpayable",
|
||||
"type": "function"
|
||||
}
|
||||
]
|
602
precompiles/distribution/contract.go
Normal file
602
precompiles/distribution/contract.go
Normal file
File diff suppressed because one or more lines are too long
135
precompiles/distribution/distribution.go
Normal file
135
precompiles/distribution/distribution.go
Normal file
@ -0,0 +1,135 @@
|
||||
package distribution
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
precompiles_common "github.com/0glabs/0g-chain/precompiles/common"
|
||||
storetypes "github.com/cosmos/cosmos-sdk/store/types"
|
||||
distributionkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/vm"
|
||||
)
|
||||
|
||||
const (
|
||||
PrecompileAddress = "0x0000000000000000000000000000000000001003"
|
||||
|
||||
// tx
|
||||
DistributionFunctionSetWithdrawAddress = "setWithdrawAddress"
|
||||
DistributionFunctionWithdrawDelegatorRewards = "withdrawDelegatorRewards"
|
||||
DistributionFunctionWithdrawValidatorCommission = "withdrawValidatorCommission"
|
||||
DistributionFunctionFundCommunityPool = "fundCommunityPool"
|
||||
// query
|
||||
DistributionFunctionParams = "params"
|
||||
DistributionFunctionValidatorDistributionInfo = "validatorDistributionInfo"
|
||||
DistributionFunctionValidatorOutstandingRewards = "validatorOutstandingRewards"
|
||||
DistributionFunctionValidatorCommission = "validatorCommission"
|
||||
DistributionFunctionValidatorSlashes = "validatorSlashes"
|
||||
DistributionFunctionDelegationRewards = "delegationRewards"
|
||||
DistributionFunctionDelegationTotalRewards = "delegationTotalRewards"
|
||||
DistributionFunctionDelegatorValidators = "delegatorValidators"
|
||||
DistributionFunctionDelegatorWithdrawAddress = "delegatorWithdrawAddress"
|
||||
DistributionFunctionCommunityPool = "CommunityPool"
|
||||
)
|
||||
|
||||
var _ vm.PrecompiledContract = &DistributionPrecompile{}
|
||||
var _ precompiles_common.PrecompileCommon = &DistributionPrecompile{}
|
||||
|
||||
type DistributionPrecompile struct {
|
||||
abi abi.ABI
|
||||
distributionKeeper distributionkeeper.Keeper
|
||||
}
|
||||
|
||||
func NewDistributionPrecompile(distributionKeeper distributionkeeper.Keeper) (*DistributionPrecompile, error) {
|
||||
abi, err := abi.JSON(strings.NewReader(DistributionABI))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &DistributionPrecompile{
|
||||
abi: abi,
|
||||
distributionKeeper: distributionKeeper,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// Address implements vm.PrecompiledContract.
|
||||
func (d *DistributionPrecompile) Address() common.Address {
|
||||
return common.HexToAddress(PrecompileAddress)
|
||||
}
|
||||
|
||||
// RequiredGas implements vm.PrecompiledContract.
|
||||
func (d *DistributionPrecompile) RequiredGas(input []byte) uint64 {
|
||||
return 0
|
||||
}
|
||||
|
||||
func (d *DistributionPrecompile) Abi() *abi.ABI {
|
||||
return &d.abi
|
||||
}
|
||||
|
||||
func (d *DistributionPrecompile) IsTx(method string) bool {
|
||||
switch method {
|
||||
case DistributionFunctionSetWithdrawAddress,
|
||||
DistributionFunctionWithdrawDelegatorRewards,
|
||||
DistributionFunctionWithdrawValidatorCommission,
|
||||
DistributionFunctionFundCommunityPool:
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
func (d *DistributionPrecompile) KVGasConfig() storetypes.GasConfig {
|
||||
return storetypes.KVGasConfig()
|
||||
}
|
||||
|
||||
// Run implements vm.PrecompiledContract.
|
||||
func (d *DistributionPrecompile) Run(evm *vm.EVM, contract *vm.Contract, readonly bool) ([]byte, error) {
|
||||
ctx, stateDB, method, initialGas, args, err := precompiles_common.InitializePrecompileCall(d, evm, contract, readonly)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var bz []byte
|
||||
switch method.Name {
|
||||
// queries
|
||||
case DistributionFunctionParams:
|
||||
bz, err = d.Params(ctx, evm, method, args)
|
||||
case DistributionFunctionValidatorDistributionInfo:
|
||||
bz, err = d.ValidatorDistributionInfo(ctx, evm, method, args)
|
||||
case DistributionFunctionValidatorOutstandingRewards:
|
||||
bz, err = d.ValidatorOutstankingRewards(ctx, evm, method, args)
|
||||
case DistributionFunctionValidatorCommission:
|
||||
bz, err = d.ValidatorCommission(ctx, evm, method, args)
|
||||
case DistributionFunctionValidatorSlashes:
|
||||
bz, err = d.ValidatorSlashes(ctx, evm, method, args)
|
||||
case DistributionFunctionDelegationRewards:
|
||||
bz, err = d.DelegationRewards(ctx, evm, method, args)
|
||||
case DistributionFunctionDelegationTotalRewards:
|
||||
bz, err = d.DelegationTotalRewards(ctx, evm, method, args)
|
||||
case DistributionFunctionDelegatorValidators:
|
||||
bz, err = d.DelegatorValidators(ctx, evm, method, args)
|
||||
case DistributionFunctionDelegatorWithdrawAddress:
|
||||
bz, err = d.DelegatorWithdrawAddress(ctx, evm, method, args)
|
||||
case DistributionFunctionCommunityPool:
|
||||
bz, err = d.CommunityPool(ctx, evm, method, args)
|
||||
// txs
|
||||
case DistributionFunctionSetWithdrawAddress:
|
||||
bz, err = d.CreateValidator(ctx, evm, stateDB, contract, method, args)
|
||||
case DistributionFunctionWithdrawDelegatorRewards:
|
||||
bz, err = d.EditValidator(ctx, evm, stateDB, contract, method, args)
|
||||
case DistributionFunctionWithdrawValidatorCommission:
|
||||
bz, err = d.Delegate(ctx, evm, stateDB, contract, method, args)
|
||||
case DistributionFunctionFundCommunityPool:
|
||||
bz, err = d.BeginRedelegate(ctx, evm, stateDB, contract, method, args)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
cost := ctx.GasMeter().GasConsumed() - initialGas
|
||||
|
||||
if !contract.UseGas(cost) {
|
||||
return nil, vm.ErrOutOfGas
|
||||
}
|
||||
return bz, nil
|
||||
}
|
172
precompiles/distribution/query.go
Normal file
172
precompiles/distribution/query.go
Normal file
@ -0,0 +1,172 @@
|
||||
package distribution
|
||||
|
||||
import (
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
distributionkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
"github.com/ethereum/go-ethereum/core/vm"
|
||||
)
|
||||
|
||||
func (d *DistributionPrecompile) Params(ctx sdk.Context, _ *vm.EVM, method *abi.Method, args []interface{}) ([]byte, error) {
|
||||
req, err := NewQueryParamsRequest(args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
response, err := distributionkeeper.Querier{Keeper: d.distributionKeeper}.Params(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return method.Outputs.Pack(convertParams(response.Params))
|
||||
}
|
||||
|
||||
func (d *DistributionPrecompile) ValidatorDistributionInfo(ctx sdk.Context, _ *vm.EVM, method *abi.Method, args []interface{}) ([]byte, error) {
|
||||
req, err := NewQueryValidatorDistributionInfoRequest(args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
response, err := distributionkeeper.Querier{Keeper: d.distributionKeeper}.ValidatorDistributionInfo(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
res, err := convertValidatorDistributionInfoResponse(response)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return method.Outputs.Pack(res)
|
||||
}
|
||||
|
||||
func (d *DistributionPrecompile) ValidatorOutstankingRewards(ctx sdk.Context, _ *vm.EVM, method *abi.Method, args []interface{}) ([]byte, error) {
|
||||
req, err := NewQueryValidatorOutstankingRewardsRequest(args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
response, err := distributionkeeper.Querier{Keeper: d.distributionKeeper}.ValidatorOutstandingRewards(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return method.Outputs.Pack(convertValidatorOutstandingRewardsResponse(response))
|
||||
}
|
||||
|
||||
func (d *DistributionPrecompile) ValidatorCommission(ctx sdk.Context, _ *vm.EVM, method *abi.Method, args []interface{}) ([]byte, error) {
|
||||
req, err := NewQueryValidatorCommissionRequest(args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
response, err := distributionkeeper.Querier{Keeper: d.distributionKeeper}.ValidatorCommission(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return method.Outputs.Pack(convertValidatorCommissionResponse(response))
|
||||
}
|
||||
|
||||
func (d *DistributionPrecompile) ValidatorSlashes(ctx sdk.Context, _ *vm.EVM, method *abi.Method, args []interface{}) ([]byte, error) {
|
||||
req, err := NewQueryValidatorSlashesRequest(args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
response, err := distributionkeeper.Querier{Keeper: d.distributionKeeper}.ValidatorSlashes(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
slashes := make([]ValidatorSlashEvent, len(response.Slashes))
|
||||
for i, slash := range response.Slashes {
|
||||
slashes[i] = convertValidatorSlashEvent(slash)
|
||||
}
|
||||
paginationResult := convertPageResponse(response.Pagination)
|
||||
|
||||
return method.Outputs.Pack(slashes, paginationResult)
|
||||
}
|
||||
|
||||
func (d *DistributionPrecompile) DelegationRewards(ctx sdk.Context, _ *vm.EVM, method *abi.Method, args []interface{}) ([]byte, error) {
|
||||
req, err := NewQueryDelegationRewardsRequest(args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
response, err := distributionkeeper.Querier{Keeper: d.distributionKeeper}.DelegationRewards(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return method.Outputs.Pack(convertDelegationRewardsResponse(response))
|
||||
}
|
||||
|
||||
func (d *DistributionPrecompile) DelegationTotalRewards(ctx sdk.Context, _ *vm.EVM, method *abi.Method, args []interface{}) ([]byte, error) {
|
||||
req, err := NewQueryDelegationTotalRewardsRequest(args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
response, err := distributionkeeper.Querier{Keeper: d.distributionKeeper}.DelegationTotalRewards(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
rewards, total, err := convertDelegationTotalRewardsResponse(response)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return method.Outputs.Pack(rewards, total)
|
||||
}
|
||||
|
||||
func (d *DistributionPrecompile) DelegatorValidators(ctx sdk.Context, _ *vm.EVM, method *abi.Method, args []interface{}) ([]byte, error) {
|
||||
req, err := NewQueryDelegatorValidatorsRequest(args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
response, err := distributionkeeper.Querier{Keeper: d.distributionKeeper}.DelegatorValidators(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
validators, err := convertDelegatorValidatorsResponse(response)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return method.Outputs.Pack(validators)
|
||||
}
|
||||
|
||||
func (d *DistributionPrecompile) DelegatorWithdrawAddress(ctx sdk.Context, _ *vm.EVM, method *abi.Method, args []interface{}) ([]byte, error) {
|
||||
req, err := NewQueryDelegatorWithdrawAddressRequest(args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
response, err := distributionkeeper.Querier{Keeper: d.distributionKeeper}.DelegatorWithdrawAddress(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
withdrawAddress, err := convertWithdrawAddress(response.WithdrawAddress)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return method.Outputs.Pack(withdrawAddress)
|
||||
}
|
||||
|
||||
func (d *DistributionPrecompile) CommunityPool(ctx sdk.Context, _ *vm.EVM, method *abi.Method, args []interface{}) ([]byte, error) {
|
||||
req, err := NewQueryCommunityPoolRequest(args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
response, err := distributionkeeper.Querier{Keeper: d.distributionKeeper}.CommunityPool(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return method.Outputs.Pack(convertCommunityPoolResponse(response))
|
||||
}
|
305
precompiles/distribution/types.go
Normal file
305
precompiles/distribution/types.go
Normal file
@ -0,0 +1,305 @@
|
||||
package distribution
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/big"
|
||||
|
||||
precompiles_common "github.com/0glabs/0g-chain/precompiles/common"
|
||||
github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
"github.com/cosmos/cosmos-sdk/types/query"
|
||||
distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
)
|
||||
|
||||
// Coin is an auto generated low-level Go binding around an user-defined struct.
|
||||
type Coin = struct {
|
||||
Denom string `json:"denom"`
|
||||
Amount *big.Int `json:"amount"`
|
||||
}
|
||||
|
||||
// DecCoin is an auto generated low-level Go binding around an user-defined struct.
|
||||
type DecCoin = struct {
|
||||
Denom string `json:"denom"`
|
||||
Amount *big.Int `json:"amount"`
|
||||
}
|
||||
|
||||
// DelegationDelegatorReward is an auto generated low-level Go binding around an user-defined struct.
|
||||
type DelegationDelegatorReward = struct {
|
||||
ValidatorAddress common.Address `json:"validatorAddress"`
|
||||
Reward []DecCoin `json:"reward"`
|
||||
}
|
||||
|
||||
// PageRequest is an auto generated low-level Go binding around an user-defined struct.
|
||||
type PageRequest = struct {
|
||||
Key []byte `json:"key"`
|
||||
Offset uint64 `json:"offset"`
|
||||
Limit uint64 `json:"limit"`
|
||||
CountTotal bool `json:"countTotal"`
|
||||
Reverse bool `json:"reverse"`
|
||||
}
|
||||
|
||||
// PageResponse is an auto generated low-level Go binding around an user-defined struct.
|
||||
type PageResponse = struct {
|
||||
NextKey []byte `json:"nextKey"`
|
||||
Total uint64 `json:"total"`
|
||||
}
|
||||
|
||||
// Params is an auto generated low-level Go binding around an user-defined struct.
|
||||
type Params = struct {
|
||||
CommunityTax *big.Int `json:"communityTax"`
|
||||
BaseProposerReward *big.Int `json:"baseProposerReward"`
|
||||
BonusProposerReward *big.Int `json:"bonusProposerReward"`
|
||||
WithdrawAddrEnabled bool `json:"withdrawAddrEnabled"`
|
||||
}
|
||||
|
||||
// ValidatorDistributionInfoResponse is an auto generated low-level Go binding around an user-defined struct.
|
||||
type ValidatorDistributionInfoResponse = struct {
|
||||
OperatorAddress common.Address `json:"operatorAddress"`
|
||||
SelfBondRewards []DecCoin `json:"selfBondRewards"`
|
||||
Commission []DecCoin `json:"commission"`
|
||||
}
|
||||
|
||||
// ValidatorSlashEvent is an auto generated low-level Go binding around an user-defined struct.
|
||||
type ValidatorSlashEvent = struct {
|
||||
ValidatorPeriod uint64 `json:"validatorPeriod"`
|
||||
Fraction *big.Int `json:"fraction"`
|
||||
}
|
||||
|
||||
func NewQueryParamsRequest(args []interface{}) (*distributiontypes.QueryParamsRequest, error) {
|
||||
if len(args) != 0 {
|
||||
return nil, fmt.Errorf(precompiles_common.ErrInvalidNumberOfArgs, 0, len(args))
|
||||
}
|
||||
|
||||
return &distributiontypes.QueryParamsRequest{}, nil
|
||||
}
|
||||
|
||||
func convertParams(params distributiontypes.Params) Params {
|
||||
return Params{
|
||||
CommunityTax: params.CommunityTax.BigInt(),
|
||||
BaseProposerReward: params.BaseProposerReward.BigInt(),
|
||||
BonusProposerReward: params.BonusProposerReward.BigInt(),
|
||||
WithdrawAddrEnabled: params.WithdrawAddrEnabled,
|
||||
}
|
||||
}
|
||||
|
||||
func NewQueryValidatorDistributionInfoRequest(args []interface{}) (*distributiontypes.QueryValidatorDistributionInfoRequest, error) {
|
||||
if len(args) != 1 {
|
||||
return nil, fmt.Errorf(precompiles_common.ErrInvalidNumberOfArgs, 1, len(args))
|
||||
}
|
||||
|
||||
validator := args[0].(common.Address)
|
||||
|
||||
return &distributiontypes.QueryValidatorDistributionInfoRequest{
|
||||
ValidatorAddress: sdk.ValAddress(validator.Bytes()).String(),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func convertDecCoins(coins github_com_cosmos_cosmos_sdk_types.DecCoins) []DecCoin {
|
||||
ans := make([]DecCoin, len(coins))
|
||||
for i, coin := range coins {
|
||||
ans[i] = DecCoin{
|
||||
Denom: coin.Denom,
|
||||
Amount: coin.Amount.TruncateInt().BigInt(),
|
||||
}
|
||||
}
|
||||
return ans
|
||||
}
|
||||
|
||||
func convertValidatorDistributionInfoResponse(response *distributiontypes.QueryValidatorDistributionInfoResponse) (ValidatorDistributionInfoResponse, error) {
|
||||
operatorAddress, err := sdk.ValAddressFromBech32(response.OperatorAddress)
|
||||
if err != nil {
|
||||
return ValidatorDistributionInfoResponse{}, err
|
||||
}
|
||||
return ValidatorDistributionInfoResponse{
|
||||
OperatorAddress: common.BytesToAddress(operatorAddress.Bytes()),
|
||||
SelfBondRewards: convertDecCoins(response.SelfBondRewards),
|
||||
Commission: convertDecCoins(response.Commission),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func NewQueryValidatorOutstankingRewardsRequest(args []interface{}) (*distributiontypes.QueryValidatorOutstandingRewardsRequest, error) {
|
||||
if len(args) != 1 {
|
||||
return nil, fmt.Errorf(precompiles_common.ErrInvalidNumberOfArgs, 1, len(args))
|
||||
}
|
||||
|
||||
validator := args[0].(common.Address)
|
||||
|
||||
return &distributiontypes.QueryValidatorOutstandingRewardsRequest{
|
||||
ValidatorAddress: sdk.ValAddress(validator.Bytes()).String(),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func convertValidatorOutstandingRewardsResponse(response *distributiontypes.QueryValidatorOutstandingRewardsResponse) []DecCoin {
|
||||
return convertDecCoins(response.Rewards.Rewards)
|
||||
}
|
||||
|
||||
func NewQueryValidatorCommissionRequest(args []interface{}) (*distributiontypes.QueryValidatorCommissionRequest, error) {
|
||||
if len(args) != 1 {
|
||||
return nil, fmt.Errorf(precompiles_common.ErrInvalidNumberOfArgs, 1, len(args))
|
||||
}
|
||||
|
||||
validator := args[0].(common.Address)
|
||||
|
||||
return &distributiontypes.QueryValidatorCommissionRequest{
|
||||
ValidatorAddress: sdk.ValAddress(validator.Bytes()).String(),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func convertValidatorCommissionResponse(response *distributiontypes.QueryValidatorCommissionResponse) []DecCoin {
|
||||
return convertDecCoins(response.Commission.Commission)
|
||||
}
|
||||
|
||||
func convertQueryPageRequest(pagination PageRequest) *query.PageRequest {
|
||||
return &query.PageRequest{
|
||||
Key: pagination.Key,
|
||||
Offset: pagination.Offset,
|
||||
Limit: pagination.Limit,
|
||||
CountTotal: pagination.CountTotal,
|
||||
Reverse: pagination.Reverse,
|
||||
}
|
||||
}
|
||||
|
||||
func NewQueryValidatorSlashesRequest(args []interface{}) (*distributiontypes.QueryValidatorSlashesRequest, error) {
|
||||
if len(args) != 4 {
|
||||
return nil, fmt.Errorf(precompiles_common.ErrInvalidNumberOfArgs, 4, len(args))
|
||||
}
|
||||
|
||||
validator := args[0].(common.Address)
|
||||
|
||||
return &distributiontypes.QueryValidatorSlashesRequest{
|
||||
ValidatorAddress: sdk.ValAddress(validator.Bytes()).String(),
|
||||
StartingHeight: args[1].(uint64),
|
||||
EndingHeight: args[2].(uint64),
|
||||
Pagination: convertQueryPageRequest(args[3].(PageRequest)),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func convertValidatorSlashEvent(slash distributiontypes.ValidatorSlashEvent) ValidatorSlashEvent {
|
||||
return ValidatorSlashEvent{
|
||||
ValidatorPeriod: slash.ValidatorPeriod,
|
||||
Fraction: slash.Fraction.BigInt(),
|
||||
}
|
||||
}
|
||||
|
||||
func convertPageResponse(pagination *query.PageResponse) PageResponse {
|
||||
if pagination == nil {
|
||||
return PageResponse{
|
||||
NextKey: make([]byte, 0),
|
||||
Total: 1,
|
||||
}
|
||||
}
|
||||
return PageResponse{
|
||||
NextKey: pagination.NextKey,
|
||||
Total: pagination.Total,
|
||||
}
|
||||
}
|
||||
|
||||
func NewQueryDelegationRewardsRequest(args []interface{}) (*distributiontypes.QueryDelegationRewardsRequest, error) {
|
||||
if len(args) != 2 {
|
||||
return nil, fmt.Errorf(precompiles_common.ErrInvalidNumberOfArgs, 2, len(args))
|
||||
}
|
||||
|
||||
delegator := args[0].(common.Address)
|
||||
validator := args[1].(common.Address)
|
||||
|
||||
return &distributiontypes.QueryDelegationRewardsRequest{
|
||||
DelegatorAddress: sdk.AccAddress(delegator.Bytes()).String(),
|
||||
ValidatorAddress: sdk.ValAddress(validator.Bytes()).String(),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func convertDelegationRewardsResponse(response *distributiontypes.QueryDelegationRewardsResponse) []DecCoin {
|
||||
return convertDecCoins(response.Rewards)
|
||||
}
|
||||
|
||||
func NewQueryDelegationTotalRewardsRequest(args []interface{}) (*distributiontypes.QueryDelegationTotalRewardsRequest, error) {
|
||||
if len(args) != 1 {
|
||||
return nil, fmt.Errorf(precompiles_common.ErrInvalidNumberOfArgs, 1, len(args))
|
||||
}
|
||||
|
||||
delegator := args[0].(common.Address)
|
||||
|
||||
return &distributiontypes.QueryDelegationTotalRewardsRequest{
|
||||
DelegatorAddress: sdk.AccAddress(delegator.Bytes()).String(),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func convertDelegationDelegatorReward(reward distributiontypes.DelegationDelegatorReward) (DelegationDelegatorReward, error) {
|
||||
validatorAddress, err := sdk.ValAddressFromBech32(reward.ValidatorAddress)
|
||||
if err != nil {
|
||||
return DelegationDelegatorReward{}, err
|
||||
}
|
||||
return DelegationDelegatorReward{
|
||||
ValidatorAddress: common.BytesToAddress(validatorAddress.Bytes()),
|
||||
Reward: convertDecCoins(reward.Reward),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func convertDelegationTotalRewardsResponse(response *distributiontypes.QueryDelegationTotalRewardsResponse) ([]DelegationDelegatorReward, []DecCoin, error) {
|
||||
rewards := make([]DelegationDelegatorReward, len(response.Rewards))
|
||||
var err error
|
||||
for i, reward := range response.Rewards {
|
||||
rewards[i], err = convertDelegationDelegatorReward(reward)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
}
|
||||
return rewards, convertDecCoins(response.Total), nil
|
||||
}
|
||||
|
||||
func NewQueryDelegatorValidatorsRequest(args []interface{}) (*distributiontypes.QueryDelegatorValidatorsRequest, error) {
|
||||
if len(args) != 1 {
|
||||
return nil, fmt.Errorf(precompiles_common.ErrInvalidNumberOfArgs, 1, len(args))
|
||||
}
|
||||
|
||||
delegator := args[0].(common.Address)
|
||||
|
||||
return &distributiontypes.QueryDelegatorValidatorsRequest{
|
||||
DelegatorAddress: sdk.AccAddress(delegator.Bytes()).String(),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func convertDelegatorValidatorsResponse(response *distributiontypes.QueryDelegatorValidatorsResponse) ([]common.Address, error) {
|
||||
validators := make([]common.Address, len(response.Validators))
|
||||
for i, addr := range response.Validators {
|
||||
validatorAddress, err := sdk.ValAddressFromBech32(addr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
validators[i] = common.BytesToAddress(validatorAddress.Bytes())
|
||||
}
|
||||
return validators, nil
|
||||
}
|
||||
|
||||
func NewQueryDelegatorWithdrawAddressRequest(args []interface{}) (*distributiontypes.QueryDelegatorWithdrawAddressRequest, error) {
|
||||
if len(args) != 1 {
|
||||
return nil, fmt.Errorf(precompiles_common.ErrInvalidNumberOfArgs, 1, len(args))
|
||||
}
|
||||
|
||||
delegator := args[0].(common.Address)
|
||||
|
||||
return &distributiontypes.QueryDelegatorWithdrawAddressRequest{
|
||||
DelegatorAddress: sdk.AccAddress(delegator.Bytes()).String(),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func convertWithdrawAddress(addr string) (common.Address, error) {
|
||||
withdrawAddress, err := sdk.AccAddressFromBech32(addr)
|
||||
if err != nil {
|
||||
return common.Address{}, err
|
||||
}
|
||||
return common.Address(withdrawAddress.Bytes()), nil
|
||||
}
|
||||
|
||||
func NewQueryCommunityPoolRequest(args []interface{}) (*distributiontypes.QueryCommunityPoolRequest, error) {
|
||||
if len(args) != 0 {
|
||||
return nil, fmt.Errorf(precompiles_common.ErrInvalidNumberOfArgs, 0, len(args))
|
||||
}
|
||||
|
||||
return &distributiontypes.QueryCommunityPoolRequest{}, nil
|
||||
}
|
||||
|
||||
func convertCommunityPoolResponse(response *distributiontypes.QueryCommunityPoolResponse) []DecCoin {
|
||||
return convertDecCoins(response.Pool)
|
||||
}
|
165
precompiles/interfaces/contracts/IDistribution.sol
Normal file
165
precompiles/interfaces/contracts/IDistribution.sol
Normal file
@ -0,0 +1,165 @@
|
||||
// SPDX-License-Identifier: LGPL-3.0-only
|
||||
pragma solidity >=0.8.0;
|
||||
|
||||
import "./types.sol";
|
||||
|
||||
struct Params {
|
||||
uint communityTax;
|
||||
uint baseProposerReward;
|
||||
uint bonusProposerReward;
|
||||
bool withdrawAddrEnabled;
|
||||
}
|
||||
|
||||
struct ValidatorDistributionInfoResponse {
|
||||
address operatorAddress;
|
||||
DecCoin[] selfBondRewards;
|
||||
DecCoin[] commission;
|
||||
}
|
||||
|
||||
struct ValidatorSlashEvent {
|
||||
uint64 validatorPeriod;
|
||||
uint fraction; // 18 decimals
|
||||
}
|
||||
|
||||
struct DelegationDelegatorReward {
|
||||
address validatorAddress;
|
||||
DecCoin[] reward;
|
||||
}
|
||||
|
||||
interface IDistribution {
|
||||
/*=== events ===*/
|
||||
|
||||
/*=== cosmos tx ===*/
|
||||
|
||||
/**
|
||||
* @dev SetWithdrawAddress defines a method to change the withdraw address for a delegator (or validator self-delegation).
|
||||
* cosmos grpc: rpc SetWithdrawAddress(MsgSetWithdrawAddress) returns (MsgSetWithdrawAddressResponse);
|
||||
*/
|
||||
function setWithdrawAddress(
|
||||
address delegatorAddress,
|
||||
address withdrawerAddress
|
||||
) external returns (bool success);
|
||||
|
||||
/**
|
||||
* @dev WithdrawDelegatorReward defines a method to withdraw rewards of delegator from a single validator.
|
||||
* cosmos grpc: rpc WithdrawDelegatorReward(MsgWithdrawDelegatorReward) returns (MsgWithdrawDelegatorRewardResponse);
|
||||
*/
|
||||
function withdrawDelegatorRewards(
|
||||
address delegatorAddress,
|
||||
string memory validatorAddress
|
||||
) external returns (Coin[] calldata amount);
|
||||
|
||||
/**
|
||||
* @dev WithdrawValidatorCommission defines a method to withdraw the full commission to the validator address.
|
||||
* cosmos grpc: rpc WithdrawValidatorCommission(MsgWithdrawValidatorCommission) returns (MsgWithdrawValidatorCommissionResponse);
|
||||
*/
|
||||
function withdrawValidatorCommission(
|
||||
address validatorAddress
|
||||
) external returns (Coin[] calldata amount);
|
||||
|
||||
/**
|
||||
* @dev FundCommunityPool defines a method to allow an account to directly fund the community pool.
|
||||
* cosmos grpc: rpc FundCommunityPool(MsgFundCommunityPool) returns (MsgFundCommunityPoolResponse);
|
||||
*/
|
||||
function fundCommunityPool(
|
||||
address depositor,
|
||||
uint256 amount
|
||||
) external returns (bool success);
|
||||
|
||||
/*=== cosmos query ===*/
|
||||
|
||||
/**
|
||||
* @dev Params queries params of the distribution module.
|
||||
* cosmos grpc: rpc Params(QueryParamsRequest) returns (QueryParamsResponse);
|
||||
*/
|
||||
function params() external view returns (Params memory);
|
||||
|
||||
/**
|
||||
* @dev ValidatorDistributionInfo queries validator commission and self-delegation rewards for validator
|
||||
* cosmos grpc: rpc ValidatorDistributionInfo(QueryValidatorDistributionInfoRequest) returns (QueryValidatorDistributionInfoResponse);
|
||||
*/
|
||||
function validatorDistributionInfo(
|
||||
address validatorAddress
|
||||
)
|
||||
external
|
||||
view
|
||||
returns (ValidatorDistributionInfoResponse memory distributionInfo);
|
||||
|
||||
/**
|
||||
* @dev ValidatorOutstandingRewards queries rewards of a validator address.
|
||||
* cosmos grpc: rpc ValidatorOutstandingRewards(QueryValidatorOutstandingRewardsRequest) returns (QueryValidatorOutstandingRewardsResponse);
|
||||
*/
|
||||
function validatorOutstandingRewards(
|
||||
address validatorAddress
|
||||
) external view returns (DecCoin[] memory rewards);
|
||||
|
||||
/**
|
||||
* @dev ValidatorCommission queries accumulated commission for a validator.
|
||||
* cosmos grpc: rpc ValidatorCommission(QueryValidatorCommissionRequest) returns (QueryValidatorCommissionResponse);
|
||||
*/
|
||||
function validatorCommission(
|
||||
string memory validatorAddress
|
||||
) external view returns (DecCoin[] memory commission);
|
||||
|
||||
/**
|
||||
* @dev ValidatorSlashes queries slash events of a validator.
|
||||
* cosmos grpc: rpc ValidatorSlashes(QueryValidatorSlashesRequest) returns (QueryValidatorSlashesResponse);
|
||||
*/
|
||||
function validatorSlashes(
|
||||
address validatorAddress,
|
||||
uint64 startingHeight,
|
||||
uint64 endingHeight,
|
||||
PageRequest calldata pageRequest
|
||||
)
|
||||
external
|
||||
view
|
||||
returns (
|
||||
ValidatorSlashEvent[] memory slashes,
|
||||
PageResponse calldata pageResponse
|
||||
);
|
||||
|
||||
/**
|
||||
* @dev DelegationRewards queries the total rewards accrued by a delegation.
|
||||
* cosmos grpc: rpc DelegationRewards(QueryDelegationRewardsRequest) returns (QueryDelegationRewardsResponse);
|
||||
*/
|
||||
function delegationRewards(
|
||||
address delegatorAddress,
|
||||
address validatorAddress
|
||||
) external view returns (DecCoin[] memory rewards);
|
||||
|
||||
/**
|
||||
* @dev DelegationTotalRewards queries the total rewards accrued by a each validator.
|
||||
* cosmos grpc: rpc DelegationTotalRewards(QueryDelegationTotalRewardsRequest) returns (QueryDelegationTotalRewardsResponse);
|
||||
*/
|
||||
function delegationTotalRewards(
|
||||
address delegatorAddress
|
||||
)
|
||||
external
|
||||
view
|
||||
returns (
|
||||
DelegationDelegatorReward[] memory rewards,
|
||||
DecCoin[] memory total
|
||||
);
|
||||
|
||||
/**
|
||||
* @dev DelegatorValidators queries the validators of a delegator.
|
||||
* cosmos grpc: rpc DelegatorValidators(QueryDelegatorValidatorsRequest) returns (QueryDelegatorValidatorsResponse);
|
||||
*/
|
||||
function delegatorValidators(
|
||||
address delegatorAddress
|
||||
) external view returns (address[] memory validators);
|
||||
|
||||
/**
|
||||
* @dev DelegatorWithdrawAddress queries withdraw address of a delegator.
|
||||
* cosmos grpc: rpc DelegatorWithdrawAddress(QueryDelegatorWithdrawAddressRequest) returns (QueryDelegatorWithdrawAddressResponse);
|
||||
*/
|
||||
function delegatorWithdrawAddress(
|
||||
address delegatorAddress
|
||||
) external view returns (address withdrawAddress);
|
||||
|
||||
/**
|
||||
* @dev CommunityPool queries the community pool coins.
|
||||
* cosmos grpc: rpc CommunityPool(QueryCommunityPoolRequest) returns (QueryCommunityPoolResponse);
|
||||
*/
|
||||
function CommunityPool() external view returns (DecCoin[] memory pool);
|
||||
}
|
@ -1,6 +1,8 @@
|
||||
// SPDX-License-Identifier: LGPL-3.0-only
|
||||
pragma solidity >=0.8.0;
|
||||
|
||||
import "./types.sol";
|
||||
|
||||
/**
|
||||
* @dev Description defines a validator description
|
||||
*/
|
||||
@ -160,19 +162,6 @@ struct NullableUint {
|
||||
uint value;
|
||||
}
|
||||
|
||||
struct PageRequest {
|
||||
bytes key;
|
||||
uint64 offset;
|
||||
uint64 limit;
|
||||
bool countTotal;
|
||||
bool reverse;
|
||||
}
|
||||
|
||||
struct PageResponse {
|
||||
bytes nextKey;
|
||||
uint64 total;
|
||||
}
|
||||
|
||||
interface IStaking {
|
||||
/*=== cosmos tx ===*/
|
||||
|
||||
|
38
precompiles/interfaces/contracts/types.sol
Normal file
38
precompiles/interfaces/contracts/types.sol
Normal file
@ -0,0 +1,38 @@
|
||||
// SPDX-License-Identifier: LGPL-3.0-only
|
||||
pragma solidity >=0.8.0;
|
||||
|
||||
/**
|
||||
* @dev cosmos.base.v1beta1.Coin
|
||||
*/
|
||||
struct Coin {
|
||||
string denom;
|
||||
uint amount;
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev cosmos.base.v1beta1.DecCoin
|
||||
* 18 decimals
|
||||
*/
|
||||
struct DecCoin {
|
||||
string denom;
|
||||
uint amount;
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev cosmos.base.query.v1beta1.PageRequest
|
||||
*/
|
||||
struct PageRequest {
|
||||
bytes key;
|
||||
uint64 offset;
|
||||
uint64 limit;
|
||||
bool countTotal;
|
||||
bool reverse;
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev cosmos.base.query.v1beta1.PageResponse
|
||||
*/
|
||||
struct PageResponse {
|
||||
bytes nextKey;
|
||||
uint64 total;
|
||||
}
|
Loading…
Reference in New Issue
Block a user