keeper

package
v0.0.0-...-e02ddd6 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 31, 2022 License: Apache-2.0 Imports: 63 Imported by: 0

Documentation

Index

Constants

View Source
const (

	// This retrieves a specific validator set by it's nonce
	// used to compare what's on Ethereum with what's in Cosmos
	// to perform slashing / validation of system consistency
	QueryValsetRequest = "valsetRequest"
	// Gets all the confirmation signatures for a given validator
	// set, used by the relayer to package the validator set and
	// it's signatures into an Ethereum transaction
	QueryValsetConfirmsByNonce = "valsetConfirms"
	// Gets the last N (where N is currently 5) validator sets that
	// have been produced by the chain. Useful to see if any recently
	// signed requests can be submitted.
	QueryLastValsetRequests = "lastValsetRequests"
	// Gets a list of unsigned valsets for a given validators delegate
	// orchestrator address. Up to 100 are sent at a time
	QueryLastPendingValsetRequestByAddr = "lastPendingValsetRequest"

	QueryCurrentValset = "currentValset"
	// TODO remove this, it's not used, getting one confirm at a time
	// is mostly useless
	QueryValsetConfirm = "valsetConfirm"

	// used by the contract deployer script. GravityID is set in the Genesis
	// file, then read by the contract deployer and deployed to Ethereum
	// a unique GravityID ensures that even if the same validator set with
	// the same keys is running on two chains these chains can have independent
	// bridges
	QueryGravityID = "gravityID"

	// This retrieves a specific batch by it's nonce and token contract
	// or in the case of a Cosmos originated address it's denom
	QueryBatch = "batch"
	// Get the last unsigned batch (of any denom) for the validators
	// orchestrator to sign
	QueryLastPendingBatchRequestByAddr = "lastPendingBatchRequest"
	// gets the last 100 outgoing batches, regardless of denom, useful
	// for a relayer to see what is available to relay
	QueryOutgoingTxBatches = "lastBatches"
	// Used by the relayer to package a batch with signatures required
	// to submit to Ethereum
	QueryBatchConfirms = "batchConfirms"
	// Used to query all pending SendToEth transactions and fees available for each
	// token type, a relayer can then estimate their potential profit when requesting
	// a batch
	QueryBatchFees = "batchFees"

	// This retrieves a specific logic call by it's nonce and token contract
	// or in the case of a Cosmos originated address it's denom
	QueryLogicCall = "logicCall"
	// Get the last unsigned logic call for the validators orchestrator
	// to sign
	QueryLastPendingLogicCallByAddr = "lastPendingLogicCall"
	// gets the last 5 outgoing logic calls, regardless of denom, useful
	// for a relayer to see what is available to relay
	QueryOutgoingLogicCalls = "lastLogicCalls"
	// Used by the relayer to package a logic call with signatures required
	// to submit to Ethereum
	QueryLogicCallConfirms = "logicCallConfirms"

	// Token mapping
	// This retrieves the denom which is represented by a given ERC20 contract
	QueryERC20ToDenom = "ERC20ToDenom"
	// This retrieves the ERC20 contract which represents a given denom
	QueryDenomToERC20 = "DenomToERC20"

	// Query pending transactions
	QueryPendingSendToEth = "PendingSendToEth"
)
View Source
const OutgoingTxBatchSize = 50
View Source
const QUERY_ATTESTATIONS_LIMIT uint64 = 1000

Variables

View Source
var (
	// ConsPrivKeys generate ed25519 ConsPrivKeys to be used for validator operator keys
	ConsPrivKeys = []ccrypto.PrivKey{
		ed25519.GenPrivKey(),
		ed25519.GenPrivKey(),
		ed25519.GenPrivKey(),
		ed25519.GenPrivKey(),
		ed25519.GenPrivKey(),
	}

	// ConsPubKeys holds the consensus public keys to be used for validator operator keys
	ConsPubKeys = []ccrypto.PubKey{
		ConsPrivKeys[0].PubKey(),
		ConsPrivKeys[1].PubKey(),
		ConsPrivKeys[2].PubKey(),
		ConsPrivKeys[3].PubKey(),
		ConsPrivKeys[4].PubKey(),
	}

	// AccPrivKeys generate secp256k1 pubkeys to be used for account pub keys
	AccPrivKeys = []ccrypto.PrivKey{
		secp256k1.GenPrivKey(),
		secp256k1.GenPrivKey(),
		secp256k1.GenPrivKey(),
		secp256k1.GenPrivKey(),
		secp256k1.GenPrivKey(),
	}

	// AccPubKeys holds the pub keys for the account keys
	AccPubKeys = []ccrypto.PubKey{
		AccPrivKeys[0].PubKey(),
		AccPrivKeys[1].PubKey(),
		AccPrivKeys[2].PubKey(),
		AccPrivKeys[3].PubKey(),
		AccPrivKeys[4].PubKey(),
	}

	// AccAddrs holds the sdk.AccAddresses
	AccAddrs = []sdk.AccAddress{
		sdk.AccAddress(AccPubKeys[0].Address()),
		sdk.AccAddress(AccPubKeys[1].Address()),
		sdk.AccAddress(AccPubKeys[2].Address()),
		sdk.AccAddress(AccPubKeys[3].Address()),
		sdk.AccAddress(AccPubKeys[4].Address()),
	}

	// ValAddrs holds the sdk.ValAddresses
	ValAddrs = []sdk.ValAddress{
		sdk.ValAddress(AccPubKeys[0].Address()),
		sdk.ValAddress(AccPubKeys[1].Address()),
		sdk.ValAddress(AccPubKeys[2].Address()),
		sdk.ValAddress(AccPubKeys[3].Address()),
		sdk.ValAddress(AccPubKeys[4].Address()),
	}

	// EthAddrs holds etheruem addresses
	EthAddrs = []gethcommon.Address{
		gethcommon.BytesToAddress(bytes.Repeat([]byte{byte(1)}, 20)),
		gethcommon.BytesToAddress(bytes.Repeat([]byte{byte(2)}, 20)),
		gethcommon.BytesToAddress(bytes.Repeat([]byte{byte(3)}, 20)),
		gethcommon.BytesToAddress(bytes.Repeat([]byte{byte(4)}, 20)),
		gethcommon.BytesToAddress(bytes.Repeat([]byte{byte(5)}, 20)),
	}

	// TokenContractAddrs holds example token contract addresses
	TokenContractAddrs = []string{
		"0x6b175474e89094c44da98b954eedeac495271d0f",
		"0x0bc529c00c6401aef6d220be8c6ea1667f6ad93e",
		"0x1f9840a85d5af5bf1d1762f925bdaddc4201f984",
		"0xc00e94cb662c3520282e6f5717214004a7f26888",
		"0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f",
	}

	// InitTokens holds the number of tokens to initialize an account with
	InitTokens = sdk.TokensFromConsensusPower(110)

	// InitCoins holds the number of coins to initialize an account with
	InitCoins = sdk.NewCoins(sdk.NewCoin(TestingStakeParams.BondDenom, InitTokens))

	// StakingAmount holds the staking power to start a validator with
	StakingAmount = sdk.TokensFromConsensusPower(10)

	// StakingCoins holds the staking coins to start a validator with
	StakingCoins = sdk.NewCoins(sdk.NewCoin(TestingStakeParams.BondDenom, StakingAmount))

	// TestingStakeParams is a set of staking params for testing
	TestingStakeParams = stakingtypes.Params{
		UnbondingTime:     100,
		MaxValidators:     10,
		MaxEntries:        10,
		HistoricalEntries: 10000,
		BondDenom:         "stake",
	}

	// TestingGravityParams is a set of gravity params for testing
	TestingGravityParams = types.Params{
		GravityId:                    "testgravityid",
		ContractSourceHash:           "62328f7bc12efb28f86111d08c29b39285680a906ea0e524e0209d6f6657b713",
		BridgeEthereumAddress:        "0x8858eeb3dfffa017d4bce9801d340d36cf895ccf",
		BridgeChainId:                11,
		SignedValsetsWindow:          10,
		SignedBatchesWindow:          10,
		SignedLogicCallsWindow:       10,
		TargetBatchTimeout:           60001,
		AverageBlockTime:             5000,
		AverageEthereumBlockTime:     15000,
		SlashFractionValset:          sdk.NewDecWithPrec(1, 2),
		SlashFractionBatch:           sdk.NewDecWithPrec(1, 2),
		SlashFractionLogicCall:       sdk.Dec{},
		UnbondSlashingValsetsWindow:  15,
		SlashFractionBadEthSignature: sdk.NewDecWithPrec(1, 2),
		ValsetReward:                 sdk.Coin{Denom: "", Amount: sdk.ZeroInt()},
	}
)

Functions

func ExportGenesis

func ExportGenesis(ctx sdk.Context, k Keeper) types.GenesisState

ExportGenesis exports all the state needed to restart the chain from the current state of the chain

func InitGenesis

func InitGenesis(ctx sdk.Context, k Keeper, data types.GenesisState)

InitGenesis starts a chain from a genesis state

func MakeTestCodec

func MakeTestCodec() *codec.LegacyAmino

MakeTestCodec creates a legacy amino codec for testing

func MakeTestMarshaler

func MakeTestMarshaler() codec.Marshaler

MakeTestMarshaler creates a proto codec for use in testing

func MintVouchersFromAir

func MintVouchersFromAir(t *testing.T, ctx sdk.Context, k Keeper, dest sdk.AccAddress, amount types.ERC20Token) sdk.Coin

MintVouchersFromAir creates new gravity vouchers given erc20tokens

func NewMsgServerImpl

func NewMsgServerImpl(keeper Keeper) types.MsgServer

NewMsgServerImpl returns an implementation of the gov MsgServer interface for the provided Keeper.

func NewQuerier

func NewQuerier(keeper Keeper) sdk.Querier

NewQuerier is the module level router for state queries

func NewTestMsgCreateValidator

func NewTestMsgCreateValidator(address sdk.ValAddress, pubKey ccrypto.PubKey, amt sdk.Int) *stakingtypes.MsgCreateValidator

func NewTestMsgUnDelegateValidator

func NewTestMsgUnDelegateValidator(address sdk.ValAddress, amt sdk.Int) *stakingtypes.MsgUndelegate

Types

type AlwaysPanicStakingMock

type AlwaysPanicStakingMock struct{}

AlwaysPanicStakingMock is a mock staking keeper that panics on usage

func (AlwaysPanicStakingMock) GetBondedValidatorsByPower

func (s AlwaysPanicStakingMock) GetBondedValidatorsByPower(ctx sdk.Context) []stakingtypes.Validator

GetBondedValidatorsByPower implements the interface for staking keeper required by gravity

func (AlwaysPanicStakingMock) GetLastTotalPower

func (s AlwaysPanicStakingMock) GetLastTotalPower(ctx sdk.Context) (power sdk.Int)

GetLastTotalPower implements the interface for staking keeper required by gravity

func (AlwaysPanicStakingMock) GetLastValidatorPower

func (s AlwaysPanicStakingMock) GetLastValidatorPower(ctx sdk.Context, operator sdk.ValAddress) int64

GetLastValidatorPower implements the interface for staking keeper required by gravity

func (AlwaysPanicStakingMock) IterateBondedValidatorsByPower

func (s AlwaysPanicStakingMock) IterateBondedValidatorsByPower(sdk.Context, func(index int64, validator stakingtypes.ValidatorI) (stop bool))

IterateBondedValidatorsByPower staisfies the interface

func (AlwaysPanicStakingMock) IterateLastValidators

func (s AlwaysPanicStakingMock) IterateLastValidators(sdk.Context, func(index int64, validator stakingtypes.ValidatorI) (stop bool))

IterateLastValidators staisfies the interface

func (AlwaysPanicStakingMock) IterateValidators

func (s AlwaysPanicStakingMock) IterateValidators(sdk.Context, func(index int64, validator stakingtypes.ValidatorI) (stop bool))

IterateValidators staisfies the interface

func (AlwaysPanicStakingMock) Jail

Jail staisfies the interface

func (AlwaysPanicStakingMock) Slash

Slash staisfies the interface

func (AlwaysPanicStakingMock) Validator

Validator staisfies the interface

func (AlwaysPanicStakingMock) ValidatorByConsAddr

ValidatorByConsAddr staisfies the interface

type AttestationHandler

type AttestationHandler struct {
	// contains filtered or unexported fields
}

AttestationHandler processes `observed` Attestations

func (AttestationHandler) Handle

Handle is the entry point for Attestation processing.

type Hooks

type Hooks struct {
	// contains filtered or unexported fields
}

Wrapper struct

func (Hooks) AfterDelegationModified

func (h Hooks) AfterDelegationModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress)

func (Hooks) AfterValidatorBeginUnbonding

func (h Hooks) AfterValidatorBeginUnbonding(ctx sdk.Context, _ sdk.ConsAddress, _ sdk.ValAddress)

func (Hooks) AfterValidatorBonded

func (h Hooks) AfterValidatorBonded(_ sdk.Context, _ sdk.ConsAddress, _ sdk.ValAddress)

func (Hooks) AfterValidatorCreated

func (h Hooks) AfterValidatorCreated(ctx sdk.Context, valAddr sdk.ValAddress)

func (Hooks) AfterValidatorRemoved

func (h Hooks) AfterValidatorRemoved(ctx sdk.Context, _ sdk.ConsAddress, valAddr sdk.ValAddress)

func (Hooks) BeforeDelegationCreated

func (h Hooks) BeforeDelegationCreated(_ sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress)

func (Hooks) BeforeDelegationRemoved

func (h Hooks) BeforeDelegationRemoved(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress)

func (Hooks) BeforeDelegationSharesModified

func (h Hooks) BeforeDelegationSharesModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress)

func (Hooks) BeforeValidatorModified

func (h Hooks) BeforeValidatorModified(_ sdk.Context, _ sdk.ValAddress)

func (Hooks) BeforeValidatorSlashed

func (h Hooks) BeforeValidatorSlashed(ctx sdk.Context, valAddr sdk.ValAddress, fraction sdk.Dec)

type Keeper

type Keeper struct {
	StakingKeeper types.StakingKeeper

	SlashingKeeper types.SlashingKeeper

	AttestationHandler interface {
		Handle(sdk.Context, types.Attestation, types.EthereumClaim) error
	}
	// contains filtered or unexported fields
}

Keeper maintains the link to storage and exposes getter/setter methods for the various parts of the state machine

func NewKeeper

func NewKeeper(cdc codec.BinaryMarshaler, storeKey sdk.StoreKey, paramSpace paramtypes.Subspace, stakingKeeper types.StakingKeeper, bankKeeper types.BankKeeper, slashingKeeper types.SlashingKeeper) Keeper

NewKeeper returns a new instance of the gravity keeper

func (Keeper) AddToOutgoingPool

func (k Keeper) AddToOutgoingPool(
	ctx sdk.Context,
	sender sdk.AccAddress,
	counterpartReceiver string,
	amount sdk.Coin,
	fee sdk.Coin,
) (uint64, error)

AddToOutgoingPool - checks a counterpart denominator exists for the given voucher type - burns the voucher for transfer amount and fees - persists an OutgoingTx - adds the TX to the `available` TX pool

func (Keeper) Attest

func (k Keeper) Attest(
	ctx sdk.Context,
	claim types.EthereumClaim,
	anyClaim *codectypes.Any,
) (*types.Attestation, error)

TODO-JT: carefully look at atomicity of this function

func (Keeper) BatchConfirms

BatchConfirms returns the batch confirmations by nonce and token contract

func (Keeper) BatchFees

BatchFees queries the batch fees from unbatched pool

func (Keeper) BatchRequestByNonce

BatchRequestByNonce queries the BatchRequestByNonce of the gravity module

func (Keeper) BuildOutgoingTXBatch

func (k Keeper) BuildOutgoingTXBatch(
	ctx sdk.Context,
	contractAddress string,
	maxElements uint) (*types.OutgoingTxBatch, error)

BuildOutgoingTXBatch starts the following process chain:

  • find bridged denominator for given voucher type
  • determine if a an unexecuted batch is already waiting for this token type, if so confirm the new batch would have a higher total fees. If not exit withtout creating a batch
  • select available transactions from the outgoing transaction pool sorted by fee desc
  • persist an outgoing batch object with an incrementing ID = nonce
  • emit an event

func (Keeper) CancelOutgoingLogicCall

func (k Keeper) CancelOutgoingLogicCall(ctx sdk.Context, invalidationId []byte, invalidationNonce uint64) error

CancelOutgoingLogicCalls releases all TX in the batch and deletes the batch

func (Keeper) CancelOutgoingTXBatch

func (k Keeper) CancelOutgoingTXBatch(ctx sdk.Context, tokenContract string, nonce uint64) error

CancelOutgoingTXBatch releases all TX in the batch and deletes the batch

func (Keeper) CheckBadSignatureEvidence

func (k Keeper) CheckBadSignatureEvidence(
	ctx sdk.Context,
	msg *types.MsgSubmitBadSignatureEvidence) error

func (Keeper) CurrentValset

CurrentValset queries the CurrentValset of the gravity module

func (Keeper) DeleteAttestation

func (k Keeper) DeleteAttestation(ctx sdk.Context, att types.Attestation)

DeleteAttestation deletes the given attestation

func (Keeper) DeleteBatch

func (k Keeper) DeleteBatch(ctx sdk.Context, batch types.OutgoingTxBatch)

DeleteBatch deletes an outgoing transaction batch

func (Keeper) DeleteLogicCallConfirm

func (k Keeper) DeleteLogicCallConfirm(
	ctx sdk.Context,
	invalidationID []byte,
	invalidationNonce uint64,
	val sdk.AccAddress)

DeleteLogicCallConfirm deletes a logic confirm from the store

func (Keeper) DeleteOutgoingLogicCall

func (k Keeper) DeleteOutgoingLogicCall(ctx sdk.Context, invalidationID []byte, invalidationNonce uint64)

DeleteOutgoingLogicCall deletes outgoing logic calls

func (Keeper) DeleteValset

func (k Keeper) DeleteValset(ctx sdk.Context, nonce uint64)

DeleteValset deletes the valset at a given nonce from state

func (Keeper) DenomToERC20

DenomToERC20 queries the Cosmos Denom that maps to an Ethereum ERC20

func (Keeper) DenomToERC20Lookup

func (k Keeper) DenomToERC20Lookup(ctx sdk.Context, denom string) (bool, string, error)

DenomToERC20 returns (bool isCosmosOriginated, string ERC20, err) Using this information, you can see if an asset is native to Cosmos or Ethereum, and get its corresponding ERC20 address. This will return an error if it cant parse the denom as a gravity denom, and then also can't find the denom in an index of ERC20 contracts deployed on Ethereum to serve as synthetic Cosmos assets.

func (Keeper) DeserializeValidatorIterator

func (k Keeper) DeserializeValidatorIterator(vals []byte) stakingtypes.ValAddresses

DeserializeValidatorIterator returns validators from the validator iterator. Adding here in gravity keeper as cdc is not available inside endblocker.

func (Keeper) ERC20ToDenom

ERC20ToDenom queries the ERC20 contract that maps to an Ethereum ERC20 if any

func (Keeper) ERC20ToDenomLookup

func (k Keeper) ERC20ToDenomLookup(ctx sdk.Context, tokenContract string) (bool, string)

ERC20ToDenom returns (bool isCosmosOriginated, string denom, err) Using this information, you can see if an ERC20 address representing an asset is native to Cosmos or Ethereum, and get its corresponding denom

func (Keeper) GetAllBatchFees

func (k Keeper) GetAllBatchFees(ctx sdk.Context, maxElements uint) (batchFees []*types.BatchFees)

GetAllBatchFees creates a fee entry for every batch type currently in the store this can be used by relayers to determine what batch types are desireable to request

func (Keeper) GetAttestation

func (k Keeper) GetAttestation(ctx sdk.Context, eventNonce uint64, claimHash []byte) *types.Attestation

GetAttestation return an attestation given a nonce

func (Keeper) GetAttestationMapping

func (k Keeper) GetAttestationMapping(ctx sdk.Context) (out map[uint64][]types.Attestation)

GetAttestationMapping returns a mapping of eventnonce -> attestations at that nonce

func (Keeper) GetAttestations

GetAttestations queries the attestation map

func (Keeper) GetBatchConfirm

func (k Keeper) GetBatchConfirm(ctx sdk.Context, nonce uint64, tokenContract string, validator sdk.AccAddress) *types.MsgConfirmBatch

GetBatchConfirm returns a batch confirmation given its nonce, the token contract, and a validator address

func (Keeper) GetBatchConfirmByNonceAndTokenContract

func (k Keeper) GetBatchConfirmByNonceAndTokenContract(ctx sdk.Context, nonce uint64, tokenContract string) (out []types.MsgConfirmBatch)

GetBatchConfirmByNonceAndTokenContract returns the batch confirms

func (Keeper) GetBatchFeeByTokenType

func (k Keeper) GetBatchFeeByTokenType(ctx sdk.Context, tokenContractAddr string, maxElements uint) *types.BatchFees

GetBatchFeeByTokenType gets the fee the next batch of a given token type would have if created right now. This info is both presented to relayers for the purpose of determining when to request batches and also used by the batch creation process to decide not to create a new batch (fees must be increasing)

func (Keeper) GetBridgeChainID

func (k Keeper) GetBridgeChainID(ctx sdk.Context) uint64

GetBridgeChainID returns the chain id of the ETH chain we are running against

func (Keeper) GetBridgeContractAddress

func (k Keeper) GetBridgeContractAddress(ctx sdk.Context) string

GetBridgeContractAddress returns the bridge contract address on ETH

func (Keeper) GetCosmosOriginatedDenom

func (k Keeper) GetCosmosOriginatedDenom(ctx sdk.Context, tokenContract string) (string, bool)

func (Keeper) GetCosmosOriginatedERC20

func (k Keeper) GetCosmosOriginatedERC20(ctx sdk.Context, denom string) (string, bool)

func (Keeper) GetCurrentValset

func (k Keeper) GetCurrentValset(ctx sdk.Context) *types.Valset

GetCurrentValset gets powers from the store and normalizes them into an integer percentage with a resolution of uint32 Max meaning a given validators 'gravity power' is computed as Cosmos power for that validator / total cosmos power = x / uint32 Max where x is the voting power on the gravity contract. This allows us to only use integer division which produces a known rounding error from truncation equal to the ratio of the validators Cosmos power / total cosmos power ratio, leaving us at uint32 Max - 1 total voting power. This is an acceptable rounding error since floating point may cause consensus problems if different floating point unit implementations are involved.

'total cosmos power' has an edge case, if a validator has not set their Ethereum key they are not included in the total. If they where control of the bridge could be lost in the following situation.

If we have 100 total power, and 100 total power joins the validator set the new validators hold more than 33% of the bridge power, if we generate and submit a valset and they don't have their eth keys set they can never update the validator set again and the bridge and all its' funds are lost. For this reason we exclude validators with unset eth keys from validator sets

The function is intended to return what the valset would look like if you made one now you should call this function, evaluate if you want to save this new valset, and discard it or save

func (Keeper) GetDelegateKeys

func (k Keeper) GetDelegateKeys(ctx sdk.Context) []*types.MsgSetOrchestratorAddress

GetDelegateKeys iterates both the EthAddress and Orchestrator address indexes to produce a vector of MsgSetOrchestratorAddress entires containing all the delgate keys for state export / import. This may seem at first glance to be excessively complicated, why not combine the EthAddress and Orchestrator address indexes and simply iterate one thing? The answer is that even though we set the Eth and Orchestrator address in the same place we use them differently we always go from Orchestrator address to Validator address and from validator address to Ethereum address we want to keep looking up the validator address for various reasons, so a direct Orchestrator to Ethereum address mapping will mean having to keep two of the same data around just to provide lookups.

For the time being this will serve

func (Keeper) GetEthAddressByValidator

func (k Keeper) GetEthAddressByValidator(ctx sdk.Context, validator sdk.ValAddress) (ethAddress string, found bool)

GetEthAddressByValidator returns the eth address for a given gravity validator

func (Keeper) GetGravityID

func (k Keeper) GetGravityID(ctx sdk.Context) string

GetGravityID returns the GravityID the GravityID is essentially a salt value for bridge signatures, provided each chain running Gravity has a unique ID it won't be possible to play back signatures from one bridge onto another even if they share a validator set.

The lifecycle of the GravityID is that it is set in the Genesis file read from the live chain for the contract deployment, once a Gravity contract is deployed the GravityID CAN NOT BE CHANGED. Meaning that it can't just be the same as the chain id since the chain id may be changed many times with each successive chain in charge of the same bridge

func (Keeper) GetLastEventNonceByValidator

func (k Keeper) GetLastEventNonceByValidator(ctx sdk.Context, validator sdk.ValAddress) uint64

GetLastEventNonceByValidator returns the latest event nonce for a given validator

func (Keeper) GetLastObservedEthereumBlockHeight

func (k Keeper) GetLastObservedEthereumBlockHeight(ctx sdk.Context) types.LastObservedEthereumBlockHeight

GetLastObservedEthereumBlockHeight height gets the block height to of the last observed attestation from the store

func (Keeper) GetLastObservedEventNonce

func (k Keeper) GetLastObservedEventNonce(ctx sdk.Context) uint64

GetLastObservedEventNonce returns the latest observed event nonce

func (Keeper) GetLastObservedValset

func (k Keeper) GetLastObservedValset(ctx sdk.Context) *types.Valset

GetLastObservedValset retrieves the last observed validator set from the store WARNING: This value is not an up to date validator set on Ethereum, it is a validator set that AT ONE POINT was the one in the Gravity bridge on Ethereum. If you assume that it's up to date you may break the bridge

func (Keeper) GetLastOutgoingBatchByTokenType

func (k Keeper) GetLastOutgoingBatchByTokenType(ctx sdk.Context, token string) *types.OutgoingTxBatch

GetLastOutgoingBatchByTokenType gets the latest outgoing tx batch by token type

func (Keeper) GetLastSlashedBatchBlock

func (k Keeper) GetLastSlashedBatchBlock(ctx sdk.Context) uint64

GetLastSlashedBatchBlock returns the latest slashed Batch block

func (Keeper) GetLastSlashedLogicCallBlock

func (k Keeper) GetLastSlashedLogicCallBlock(ctx sdk.Context) uint64

GetLastSlashedLogicCallBlock returns the latest slashed logic call block

func (Keeper) GetLastSlashedValsetNonce

func (k Keeper) GetLastSlashedValsetNonce(ctx sdk.Context) uint64

GetLastSlashedValsetNonce returns the latest slashed valset nonce

func (Keeper) GetLastUnBondingBlockHeight

func (k Keeper) GetLastUnBondingBlockHeight(ctx sdk.Context) uint64

GetLastUnBondingBlockHeight returns the last unbonding block height

func (Keeper) GetLatestValset

func (k Keeper) GetLatestValset(ctx sdk.Context) (out *types.Valset)

GetLatestValset returns the latest validator set in store. This is different from the CurrrentValset because this one has been saved and is therefore *the* valset for this nonce. GetCurrentValset shows you what could be, if you chose to save it, this function shows you what is the latest valset that was saved.

func (Keeper) GetLatestValsetNonce

func (k Keeper) GetLatestValsetNonce(ctx sdk.Context) uint64

GetLatestValsetNonce returns the latest valset nonce

func (Keeper) GetLogicCallConfirm

func (k Keeper) GetLogicCallConfirm(ctx sdk.Context, invalidationId []byte, invalidationNonce uint64, val sdk.AccAddress) *types.MsgConfirmLogicCall

GetLogicCallConfirm gets a logic confirm from the store

func (Keeper) GetLogicConfirmByInvalidationIDAndNonce

func (k Keeper) GetLogicConfirmByInvalidationIDAndNonce(ctx sdk.Context, invalidationId []byte, invalidationNonce uint64) (out []types.MsgConfirmLogicCall)

GetLogicConfirmsByInvalidationIdAndNonce returns the logic call confirms

func (Keeper) GetMostRecentAttestations

func (k Keeper) GetMostRecentAttestations(ctx sdk.Context, limit uint64) []*types.Attestation

GetMostRecentAttestations returns sorted (by nonce) attestations up to a provided limit number of attestations Note: calls GetAttestationMapping in the hopes that there are potentially many attestations which are distributed between few nonces to minimize sorting time

func (Keeper) GetOrchestratorValidator

func (k Keeper) GetOrchestratorValidator(ctx sdk.Context, orch sdk.AccAddress) (validator stakingtypes.Validator, found bool)

GetOrchestratorValidator returns the validator key associated with an orchestrator key

func (Keeper) GetOutgoingLogicCall

func (k Keeper) GetOutgoingLogicCall(ctx sdk.Context, invalidationID []byte, invalidationNonce uint64) *types.OutgoingLogicCall

GetOutgoingLogicCall gets an outgoing logic call

func (Keeper) GetOutgoingLogicCalls

func (k Keeper) GetOutgoingLogicCalls(ctx sdk.Context) (out []*types.OutgoingLogicCall)

GetOutgoingLogicCalls returns the outgoing logic calls

func (Keeper) GetOutgoingTXBatch

func (k Keeper) GetOutgoingTXBatch(ctx sdk.Context, tokenContract string, nonce uint64) *types.OutgoingTxBatch

GetOutgoingTXBatch loads a batch object. Returns nil when not exists.

func (Keeper) GetOutgoingTxBatches

func (k Keeper) GetOutgoingTxBatches(ctx sdk.Context) (out []*types.OutgoingTxBatch)

GetOutgoingTxBatches returns the outgoing tx batches

func (Keeper) GetParams

func (k Keeper) GetParams(ctx sdk.Context) (params types.Params)

GetParams returns the parameters from the store

func (Keeper) GetPastEthSignatureCheckpoint

func (k Keeper) GetPastEthSignatureCheckpoint(ctx sdk.Context, checkpoint []byte) (found bool)

GetPastEthSignatureCheckpoint tells you whether a given checkpoint has ever existed

func (Keeper) GetUnSlashedBatches

func (k Keeper) GetUnSlashedBatches(ctx sdk.Context, maxHeight uint64) (out []*types.OutgoingTxBatch)

GetUnSlashedBatches returns all the unslashed batches in state

func (Keeper) GetUnSlashedLogicCalls

func (k Keeper) GetUnSlashedLogicCalls(ctx sdk.Context, maxHeight uint64) (out []*types.OutgoingLogicCall)

GetUnSlashedLogicCalls returns all the unslashed logic calls in state

func (Keeper) GetUnSlashedValsets

func (k Keeper) GetUnSlashedValsets(ctx sdk.Context, signedValsetsWindow uint64) (out []*types.Valset)

GetUnSlashedValsets returns all the "ready-to-slash" unslashed validator sets in state (valsets at least signedValsetsWindow blocks old)

func (Keeper) GetUnbatchedTransactions

func (k Keeper) GetUnbatchedTransactions(ctx sdk.Context) []*types.OutgoingTransferTx

GetPoolTransactions, grabs all transactions from the tx pool, useful for queries or genesis save/load

func (Keeper) GetUnbatchedTransactionsByContract

func (k Keeper) GetUnbatchedTransactionsByContract(ctx sdk.Context, contractAddress string) []*types.OutgoingTransferTx

GetUnbatchedTransactionsByContract, grabs all unbatched transactions from the tx pool for the given contract unbatched transactions are sorted by fee amount in DESC order

func (Keeper) GetUnbatchedTxByFeeAndId

func (k Keeper) GetUnbatchedTxByFeeAndId(ctx sdk.Context, fee types.ERC20Token, txID uint64) (*types.OutgoingTransferTx, error)

GetUnbatchedTxByFeeAndId grabs a tx from the pool given its fee and txID

func (Keeper) GetUnbatchedTxById

func (k Keeper) GetUnbatchedTxById(ctx sdk.Context, txID uint64) (*types.OutgoingTransferTx, error)

GetUnbatchedTxById grabs a tx from the pool given only the txID note that due to the way unbatched txs are indexed, the GetUnbatchedTxByFeeAndId method is much faster

func (Keeper) GetValidatorByEthAddress

func (k Keeper) GetValidatorByEthAddress(ctx sdk.Context, ethAddr string) (validator stakingtypes.Validator, found bool)

GetValidatorByEthAddress returns the validator for a given eth address

func (Keeper) GetValset

func (k Keeper) GetValset(ctx sdk.Context, nonce uint64) *types.Valset

GetValset returns a valset by nonce

func (Keeper) GetValsetConfirm

func (k Keeper) GetValsetConfirm(ctx sdk.Context, nonce uint64, validator sdk.AccAddress) *types.MsgValsetConfirm

GetValsetConfirm returns a valset confirmation by a nonce and validator address

func (Keeper) GetValsetConfirms

func (k Keeper) GetValsetConfirms(ctx sdk.Context, nonce uint64) (confirms []*types.MsgValsetConfirm)

GetValsetConfirms returns all validator set confirmations by nonce

func (Keeper) GetValsets

func (k Keeper) GetValsets(ctx sdk.Context) (out []*types.Valset)

GetValsets returns all the validator sets in state

func (Keeper) HasValsetRequest

func (k Keeper) HasValsetRequest(ctx sdk.Context, nonce uint64) bool

HasValsetRequest returns true if a valset defined by a nonce exists

func (Keeper) Hooks

func (k Keeper) Hooks() Hooks

Create new gravity hooks

func (Keeper) IterateAttestaions

func (k Keeper) IterateAttestaions(ctx sdk.Context, cb func([]byte, types.Attestation) bool)

IterateAttestaions iterates through all attestations

func (Keeper) IterateBatchBySlashedBatchBlock

func (k Keeper) IterateBatchBySlashedBatchBlock(
	ctx sdk.Context,
	lastSlashedBatchBlock uint64,
	maxHeight uint64,
	cb func([]byte, *types.OutgoingTxBatch) bool)

IterateBatchBySlashedBatchBlock iterates through all Batch by last slashed Batch block in ASC order

func (Keeper) IterateBatchConfirmByNonceAndTokenContract

func (k Keeper) IterateBatchConfirmByNonceAndTokenContract(ctx sdk.Context, nonce uint64, tokenContract string, cb func([]byte, types.MsgConfirmBatch) bool)

IterateBatchConfirmByNonceAndTokenContract iterates through all batch confirmations MARK finish-batches: this is where the key is iterated in the old (presumed working) code TODO: specify which nonce this is

func (Keeper) IterateERC20ToDenom

func (k Keeper) IterateERC20ToDenom(ctx sdk.Context, cb func([]byte, *types.ERC20ToDenom) bool)

IterateERC20ToDenom iterates over erc20 to denom relations

func (Keeper) IterateLogicConfirmByInvalidationIDAndNonce

func (k Keeper) IterateLogicConfirmByInvalidationIDAndNonce(
	ctx sdk.Context,
	invalidationID []byte,
	invalidationNonce uint64,
	cb func([]byte, *types.MsgConfirmLogicCall) bool)

IterateLogicConfirmByInvalidationIDAndNonce iterates over all logic confirms stored by nonce

func (Keeper) IterateOutgoingLogicCalls

func (k Keeper) IterateOutgoingLogicCalls(ctx sdk.Context, cb func([]byte, *types.OutgoingLogicCall) bool)

IterateOutgoingLogicCalls iterates over outgoing logic calls

func (Keeper) IterateOutgoingTXBatches

func (k Keeper) IterateOutgoingTXBatches(ctx sdk.Context, cb func(key []byte, batch *types.OutgoingTxBatch) bool)

IterateOutgoingTXBatches iterates through all outgoing batches in DESC order.

func (Keeper) IterateUnbatchedTransactions

func (k Keeper) IterateUnbatchedTransactions(ctx sdk.Context, prefixKey []byte, cb func(key []byte, tx *types.OutgoingTransferTx) bool)

IterateUnbatchedTransactions iterates through all unbatched transactions whose keys begin with prefixKey in DESC order

func (Keeper) IterateUnbatchedTransactionsByContract

func (k Keeper) IterateUnbatchedTransactionsByContract(ctx sdk.Context, contractAddress string, cb func(key []byte, tx *types.OutgoingTransferTx) bool)

IterateUnbatchedTransactionsByContract, iterates through unbatched transactions from the tx pool for the given contract unbatched transactions are sorted by fee amount in DESC order

func (Keeper) IterateValsetBySlashedValsetNonce

func (k Keeper) IterateValsetBySlashedValsetNonce(ctx sdk.Context, lastSlashedValsetNonce uint64, cb func([]byte, *types.Valset) bool)

IterateValsetBySlashedValsetNonce iterates through all valset by last slashed valset nonce in ASC order

func (Keeper) IterateValsetConfirmByNonce

func (k Keeper) IterateValsetConfirmByNonce(ctx sdk.Context, nonce uint64, cb func([]byte, types.MsgValsetConfirm) bool)

IterateValsetConfirmByNonce iterates through all valset confirms by validator set nonce in ASC order

func (Keeper) IterateValsets

func (k Keeper) IterateValsets(ctx sdk.Context, cb func(key []byte, val *types.Valset) bool)

IterateValsets retruns all valsetRequests

func (Keeper) LastEventNonceByAddr

LastEventNonceByAddr returns the last event nonce for the given validator address, this allows eth oracles to figure out where they left off

func (Keeper) LastPendingBatchRequestByAddr

LastPendingBatchRequestByAddr queries the LastPendingBatchRequestByAddr of the gravity module

func (Keeper) LastPendingValsetRequestByAddr

LastPendingValsetRequestByAddr queries the LastPendingValsetRequestByAddr of the gravity module

func (Keeper) LastValsetRequests

LastValsetRequests queries the LastValsetRequests of the gravity module

func (Keeper) LogicConfirms

LogicConfirms returns the Logic confirmations by nonce and token contract

func (Keeper) OutgoingLogicCalls

OutgoingLogicCalls queries the OutgoingLogicCalls of the gravity module

func (Keeper) OutgoingTxBatchExecuted

func (k Keeper) OutgoingTxBatchExecuted(ctx sdk.Context, tokenContract string, nonce uint64)

OutgoingTxBatchExecuted is run when the Cosmos chain detects that a batch has been executed on Ethereum It frees all the transactions in the batch, then cancels all earlier batches, this function panics instead of returning errors because any failure will cause a double spend.

func (Keeper) OutgoingTxBatches

OutgoingTxBatches queries the OutgoingTxBatches of the gravity module

func (Keeper) Params

Params queries the params of the gravity module

func (Keeper) RemoveFromOutgoingPoolAndRefund

func (k Keeper) RemoveFromOutgoingPoolAndRefund(ctx sdk.Context, txId uint64, sender sdk.AccAddress) error

RemoveFromOutgoingPoolAndRefund - checks that the provided tx actually exists - deletes the unbatched tx from the pool - issues the tokens back to the sender

func (Keeper) RewardToERC20Lookup

func (k Keeper) RewardToERC20Lookup(ctx sdk.Context, coin sdk.Coin) (string, sdk.Int)

RewardToERC20Lookup is a specialized function wrapping DenomToERC20Lookup designed to validate the validator set reward any time we generate a validator set

func (Keeper) SetAttestation

func (k Keeper) SetAttestation(ctx sdk.Context, eventNonce uint64, claimHash []byte, att *types.Attestation)

SetAttestation sets the attestation in the store

func (Keeper) SetBatchConfirm

func (k Keeper) SetBatchConfirm(ctx sdk.Context, batch *types.MsgConfirmBatch) []byte

SetBatchConfirm sets a batch confirmation by a validator

func (Keeper) SetEthAddressForValidator

func (k Keeper) SetEthAddressForValidator(ctx sdk.Context, validator sdk.ValAddress, ethAddr string)

SetEthAddress sets the ethereum address for a given validator

func (Keeper) SetGravityID

func (k Keeper) SetGravityID(ctx sdk.Context, v string)

Set GravityID sets the GravityID the GravityID is essentially a salt value for bridge signatures, provided each chain running Gravity has a unique ID it won't be possible to play back signatures from one bridge onto another even if they share a validator set.

The lifecycle of the GravityID is that it is set in the Genesis file read from the live chain for the contract deployment, once a Gravity contract is deployed the GravityID CAN NOT BE CHANGED. Meaning that it can't just be the same as the chain id since the chain id may be changed many times with each successive chain in charge of the same bridge

func (Keeper) SetLastObservedEthereumBlockHeight

func (k Keeper) SetLastObservedEthereumBlockHeight(ctx sdk.Context, ethereumHeight uint64)

SetLastObservedEthereumBlockHeight sets the block height in the store.

func (Keeper) SetLastObservedValset

func (k Keeper) SetLastObservedValset(ctx sdk.Context, valset types.Valset)

SetLastObservedValset updates the last observed validator set in the store

func (Keeper) SetLastSlashedBatchBlock

func (k Keeper) SetLastSlashedBatchBlock(ctx sdk.Context, blockHeight uint64)

SetLastSlashedBatchBlock sets the latest slashed Batch block height

func (Keeper) SetLastSlashedLogicCallBlock

func (k Keeper) SetLastSlashedLogicCallBlock(ctx sdk.Context, blockHeight uint64)

SetLastSlashedLogicCallBlock sets the latest slashed logic call block height

func (Keeper) SetLastSlashedValsetNonce

func (k Keeper) SetLastSlashedValsetNonce(ctx sdk.Context, nonce uint64)

setLastSlashedValsetNonce sets the latest slashed valset nonce

func (Keeper) SetLastUnBondingBlockHeight

func (k Keeper) SetLastUnBondingBlockHeight(ctx sdk.Context, unbondingBlockHeight uint64)

SetLastUnBondingBlockHeight sets the last unbonding block height

func (Keeper) SetLatestValsetNonce

func (k Keeper) SetLatestValsetNonce(ctx sdk.Context, nonce uint64)

SetLatestValsetNonce sets the latest valset nonce

func (Keeper) SetLogicCallConfirm

func (k Keeper) SetLogicCallConfirm(ctx sdk.Context, msg *types.MsgConfirmLogicCall)

SetLogicCallConfirm sets a logic confirm in the store

func (Keeper) SetOrchestratorValidator

func (k Keeper) SetOrchestratorValidator(ctx sdk.Context, val sdk.ValAddress, orch sdk.AccAddress)

SetOrchestratorValidator sets the Orchestrator key for a given validator

func (Keeper) SetOutgoingLogicCall

func (k Keeper) SetOutgoingLogicCall(ctx sdk.Context, call *types.OutgoingLogicCall)

SetOutogingLogicCall sets an outgoing logic call

func (Keeper) SetParams

func (k Keeper) SetParams(ctx sdk.Context, ps types.Params)

SetParams sets the parameters in the store

func (Keeper) SetPastEthSignatureCheckpoint

func (k Keeper) SetPastEthSignatureCheckpoint(ctx sdk.Context, checkpoint []byte)

SetPastEthSignatureCheckpoint puts the checkpoint of a valset, batch, or logic call into a set in order to prove later that it existed at one point.

func (Keeper) SetValsetConfirm

func (k Keeper) SetValsetConfirm(ctx sdk.Context, valsetConf types.MsgValsetConfirm) []byte

SetValsetConfirm sets a valset confirmation

func (Keeper) SetValsetRequest

func (k Keeper) SetValsetRequest(ctx sdk.Context) *types.Valset

SetValsetRequest returns a new instance of the Gravity BridgeValidatorSet by taking a snapshot of the current set i.e. {"nonce": 1, "memebers": [{"eth_addr": "foo", "power": 11223}]}

func (Keeper) StoreBatch

func (k Keeper) StoreBatch(ctx sdk.Context, batch *types.OutgoingTxBatch)

StoreBatch stores a transaction batch

func (Keeper) StoreBatchUnsafe

func (k Keeper) StoreBatchUnsafe(ctx sdk.Context, batch *types.OutgoingTxBatch)

StoreBatchUnsafe stores a transaction batch w/o setting the height

func (Keeper) StoreValset

func (k Keeper) StoreValset(ctx sdk.Context, valset *types.Valset)

StoreValset is for storing a valiator set at a given height

func (Keeper) StoreValsetUnsafe

func (k Keeper) StoreValsetUnsafe(ctx sdk.Context, valset *types.Valset)

StoreValsetUnsafe is for storing a valiator set at a given height

func (Keeper) TryAttestation

func (k Keeper) TryAttestation(ctx sdk.Context, att *types.Attestation)

TryAttestation checks if an attestation has enough votes to be applied to the consensus state and has not already been marked Observed, then calls processAttestation to actually apply it to the state, and then marks it Observed and emits an event.

func (Keeper) UnpackAttestationClaim

func (k Keeper) UnpackAttestationClaim(att *types.Attestation) (types.EthereumClaim, error)

func (Keeper) ValsetConfirm

ValsetConfirm queries the ValsetConfirm of the gravity module

func (Keeper) ValsetConfirmsByNonce

ValsetConfirmsByNonce queries the ValsetConfirmsByNonce of the gravity module

func (Keeper) ValsetRequest

ValsetRequest queries the ValsetRequest of the gravity module

type MockStakingValidatorData

type MockStakingValidatorData struct {
	Operator sdk.ValAddress
	Power    int64
}

MockStakingValidatorData creates mock validator data

type MultiSigUpdateResponse

type MultiSigUpdateResponse struct {
	Valset     types.Valset `json:"valset"`
	Signatures [][]byte     `json:"signatures,omitempty"`
}

type StakingKeeperMock

type StakingKeeperMock struct {
	BondedValidators []stakingtypes.Validator
	ValidatorPower   map[string]int64
}

StakingKeeperMock is a mock staking keeper for use in the tests

func NewStakingKeeperMock

func NewStakingKeeperMock(operators ...sdk.ValAddress) *StakingKeeperMock

NewStakingKeeperMock creates a new mock staking keeper

func NewStakingKeeperWeightedMock

func NewStakingKeeperWeightedMock(t ...MockStakingValidatorData) *StakingKeeperMock

NewStakingKeeperWeightedMock creates a new mock staking keeper with some mock validator data

func (*StakingKeeperMock) GetBondedValidatorsByPower

func (s *StakingKeeperMock) GetBondedValidatorsByPower(ctx sdk.Context) []stakingtypes.Validator

GetBondedValidatorsByPower implements the interface for staking keeper required by gravity

func (*StakingKeeperMock) GetLastTotalPower

func (s *StakingKeeperMock) GetLastTotalPower(ctx sdk.Context) (power sdk.Int)

GetLastTotalPower implements the interface for staking keeper required by gravity

func (*StakingKeeperMock) GetLastValidatorPower

func (s *StakingKeeperMock) GetLastValidatorPower(ctx sdk.Context, operator sdk.ValAddress) int64

GetLastValidatorPower implements the interface for staking keeper required by gravity

func (*StakingKeeperMock) GetParams

func (s *StakingKeeperMock) GetParams(ctx sdk.Context) stakingtypes.Params

func (*StakingKeeperMock) GetValidator

func (s *StakingKeeperMock) GetValidator(ctx sdk.Context, addr sdk.ValAddress) (validator stakingtypes.Validator, found bool)

func (*StakingKeeperMock) IterateBondedValidatorsByPower

func (s *StakingKeeperMock) IterateBondedValidatorsByPower(ctx sdk.Context, cb func(index int64, validator stakingtypes.ValidatorI) (stop bool))

IterateBondedValidatorsByPower staisfies the interface

func (*StakingKeeperMock) IterateLastValidators

func (s *StakingKeeperMock) IterateLastValidators(ctx sdk.Context, cb func(index int64, validator stakingtypes.ValidatorI) (stop bool))

IterateLastValidators staisfies the interface

func (*StakingKeeperMock) IterateValidators

func (s *StakingKeeperMock) IterateValidators(ctx sdk.Context, cb func(index int64, validator stakingtypes.ValidatorI) (stop bool))

IterateValidators staisfies the interface

func (*StakingKeeperMock) Jail

Jail staisfies the interface

func (*StakingKeeperMock) Slash

Slash staisfies the interface

func (*StakingKeeperMock) Validator

Validator satisfies the interface

func (*StakingKeeperMock) ValidatorByConsAddr

func (s *StakingKeeperMock) ValidatorByConsAddr(ctx sdk.Context, addr sdk.ConsAddress) stakingtypes.ValidatorI

ValidatorByConsAddr staisfies the interface

func (*StakingKeeperMock) ValidatorQueueIterator

func (s *StakingKeeperMock) ValidatorQueueIterator(ctx sdk.Context, endTime time.Time, endHeight int64) sdk.Iterator

type TestInput

type TestInput struct {
	GravityKeeper  Keeper
	AccountKeeper  authkeeper.AccountKeeper
	StakingKeeper  stakingkeeper.Keeper
	SlashingKeeper slashingkeeper.Keeper
	DistKeeper     distrkeeper.Keeper
	BankKeeper     bankkeeper.BaseKeeper
	GovKeeper      govkeeper.Keeper
	Context        sdk.Context
	Marshaler      codec.Marshaler
	LegacyAmino    *codec.LegacyAmino
}

TestInput stores the various keepers required to test gravity

func CreateTestEnv

func CreateTestEnv(t *testing.T) TestInput

CreateTestEnv creates the keeper testing environment for gravity

func SetupFiveValChain

func SetupFiveValChain(t *testing.T) (TestInput, sdk.Context)

SetupFiveValChain does all the initialization for a 5 Validator chain using the keys here

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL