uibc

package
v5.2.0 Latest Latest
Warning

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

Go to latest
Published: Aug 31, 2023 License: Apache-2.0 Imports: 35 Imported by: 0

README

IBC Transfer and Rate Limits for IBC Denoms

Abstract

The x/uibc is a Cosmos Module providing:

  • IBC Denom Metadata Tracker for ICS-20 transferred tokens to backfill denom metadata into the x/bank standard Cosmos SDK module.
  • IBC Quota is an ICS-4 middleware for the ICS-20 token transfer app to apply quota mechanism.

Content

IBC Denom Metadata Tracker

x/bank.types.Metadata is a structure which provides essential information about denom, such as display denom name, description, symbol, list of units (unit name and decimal exponent), and the default unit (Base).

ICS-20 is a x/bank token transfer protocol over IBC. The core implementation doesn't create bank Metadata when a new token is transferred for the very first time. It's worth to note that token received through IBC is identified by the port ID, channel ID and the source denom ID. The purpose of the x/uibc/ics20 module is to wrap the core IBC module and create a denom Metadata whenever it is missing. Look at the TrackDenomMetadata function for more details.

Considerations

The IBC ICS-20 doesn't carry any metadata information, so we only fill up the base denom. Importantly, we don't know about the Exponent, and we set Exponent := 0. In many cases this is wrong, and should be overwritten by chain governance.

IBC Quota

Hack or lending abuse is impossible to stop once the funds leave the chain. One mitigation is to limit the IBC inflows and outflows and be able to stop a chain and recover the funds with a migration.

Concepts

Inflow is an ICS-20 transaction of sending tokens to the Umee chain. Outflow is an ICS-20 transaction sending tokens out of the Umee chain.

IBC Quota is an upper limit in USD amount.

Design
Outflows

All outflows are measured in token average USD value using our x/oracle AvgKeeper. The AvgKeeper aggregates TVWAP prices over 16h window.

We define 2 Quotas for ICS-20 transfers. Each quota only tracks tokens x/leverage Token Registry.

  • Params.TokenQuota: upper limit of a sum of all outflows per token. Initially it's set to 0.6m USD per token. It limits the outflows value for each token. NOTE: we measure per token as defined in the x/leverage, not the IBC Denom Path (there can be multiple paths). Since creating a channel is permission less, we want to use same quota token.
  • Params.TotalQuota: upper limit of a sum of all token outflows combined. Initially it's set to 1m USD. Example of IBC outflows reaching the total quota: 300k USD worth of ATOM, 200k USD worth of STATOM, 250k USD worth of UMEE and 250k USD worth JUNO.

If a quota parameter is set to zero then we consider it as unlimited.

All quotas are reset in BeginBlocker whenever a time difference between the new block, and the previous reset is more than Params.QuotaDuration in seconds (initially set to 24h).

Transfer is reverted whenever it breaks any quota.

Transfer of tokens, which are not registered in the x/leverage Token Registry are not subject to the quota limit.

Inflows

We only allow inflows of tokens registered in x/leverage Token Registry. Other inflow transfers will be rejected.

ICS-20 Quota control

The ICS-20 quota mechanism is controlled by the Params.IbcStatus, which can have the following values:

  • DISABLED: inflow and quota outflow checks are disabled, essentially allowing all ics-20 transfers.
  • ENABLED: inflow and quota outflow checks are enabled (default value).
  • TRANSFERS_PAUSED: all ICS-20 transfers are disabled.
State

In the state we store:

  • Module parameters.
  • Running sum of total outflow values, serialized as sdk.Dec.
  • Running sum of per token outflow values, serialized as sdk.Dec.
  • Next quota expire time (after which the quota reset happens).
Messages

The RPC Messages provide an access to the x/gov to change the module parameters.

Queries

The RPC Queries allow to query module parameters and current outflow sums.

Events

All events with description are listed in the events.proto file.

Documentation

Overview

Package uibc is a reverse proxy.

It translates gRPC into RESTful JSON APIs.

Index

Constants

View Source
const (
	// ModuleName defines the module name
	ModuleName = "uibc"

	// StoreKey defines the primary module store key
	StoreKey = ModuleName
)

Variables

View Source
var (
	ErrQuotaExceeded      = errors.Register(ModuleName, 1, "quota transfer exceeded")
	ErrNoQuotaForIBCDenom = errors.Register(ModuleName, 2, "no quota for ibc denom")
)
View Source
var (
	ErrInvalidLengthEvents        = fmt.Errorf("proto: negative length found during unmarshaling")
	ErrIntOverflowEvents          = fmt.Errorf("proto: integer overflow")
	ErrUnexpectedEndOfGroupEvents = fmt.Errorf("proto: unexpected end of group")
)
View Source
var (
	ErrInvalidLengthGenesis        = fmt.Errorf("proto: negative length found during unmarshaling")
	ErrIntOverflowGenesis          = fmt.Errorf("proto: integer overflow")
	ErrUnexpectedEndOfGroupGenesis = fmt.Errorf("proto: unexpected end of group")
)
View Source
var (
	ErrInvalidLengthQuery        = fmt.Errorf("proto: negative length found during unmarshaling")
	ErrIntOverflowQuery          = fmt.Errorf("proto: integer overflow")
	ErrUnexpectedEndOfGroupQuery = fmt.Errorf("proto: unexpected end of group")
)
View Source
var (
	ErrInvalidLengthQuota        = fmt.Errorf("proto: negative length found during unmarshaling")
	ErrIntOverflowQuota          = fmt.Errorf("proto: integer overflow")
	ErrUnexpectedEndOfGroupQuota = fmt.Errorf("proto: unexpected end of group")
)
View Source
var (
	ErrInvalidLengthTx        = fmt.Errorf("proto: negative length found during unmarshaling")
	ErrIntOverflowTx          = fmt.Errorf("proto: integer overflow")
	ErrUnexpectedEndOfGroupTx = fmt.Errorf("proto: unexpected end of group")
)
View Source
var IBCTransferStatus_name = map[int32]string{
	0: "IBC_TRANSFER_STATUS_UNSPECIFIED",
	1: "IBC_TRANSFER_STATUS_QUOTA_DISABLED",
	2: "IBC_TRANSFER_STATUS_QUOTA_ENABLED",
	3: "IBC_TRANSFER_STATUS_QUOTA_OUT_DISABLED",
	4: "IBC_TRANSFER_STATUS_QUOTA_IN_DISABLED",
	5: "IBC_TRANSFER_STATUS_TRANSFERS_PAUSED",
}
View Source
var IBCTransferStatus_value = map[string]int32{
	"IBC_TRANSFER_STATUS_UNSPECIFIED":        0,
	"IBC_TRANSFER_STATUS_QUOTA_DISABLED":     1,
	"IBC_TRANSFER_STATUS_QUOTA_ENABLED":      2,
	"IBC_TRANSFER_STATUS_QUOTA_OUT_DISABLED": 3,
	"IBC_TRANSFER_STATUS_QUOTA_IN_DISABLED":  4,
	"IBC_TRANSFER_STATUS_TRANSFERS_PAUSED":   5,
}
View Source
var (

	// ModuleCdc references the global x/uibc module codec. Note, the codec
	// should ONLY be used in certain instances of tests and for JSON encoding as
	// Amino is still used for that purpose.
	ModuleCdc = codec.NewAminoCodec(amino)
)

Functions

func RegisterInterfaces

func RegisterInterfaces(registry cdctypes.InterfaceRegistry)

func RegisterLegacyAminoCodec

func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino)

RegisterLegacyAminoCodec registers the necessary x/uibc interfaces and concrete types on the provided LegacyAmino codec. These types are used for Amino JSON serialization.

func RegisterMsgServer

func RegisterMsgServer(s grpc1.Server, srv MsgServer)

func RegisterQueryHandler

func RegisterQueryHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error

RegisterQueryHandler registers the http handlers for service Query to "mux". The handlers forward requests to the grpc endpoint over "conn".

func RegisterQueryHandlerClient

func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, client QueryClient) error

RegisterQueryHandlerClient registers the http handlers for service Query to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "QueryClient". Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "QueryClient" doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in "QueryClient" to call the correct interceptors.

func RegisterQueryHandlerFromEndpoint

func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error)

RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but automatically dials to "endpoint" and closes the connection when "ctx" gets done.

func RegisterQueryHandlerServer

func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error

RegisterQueryHandlerServer registers the http handlers for service Query to "mux". UnaryRPC :call QueryServer directly. StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterQueryHandlerFromEndpoint instead.

func RegisterQueryServer

func RegisterQueryServer(s grpc1.Server, srv QueryServer)

Types

type BankKeeper

type BankKeeper interface {
	GetDenomMetaData(ctx sdk.Context, denom string) (types.Metadata, bool)
	SetDenomMetaData(ctx sdk.Context, denomMetaData types.Metadata)
	IterateAllDenomMetaData(ctx sdk.Context, cb func(types.Metadata) bool)
}

BankKeeper defines the expected x/bank keeper interface.

type EventBadRevert

type EventBadRevert struct {
	// failure event type
	FailureType string `protobuf:"bytes,1,opt,name=failure_type,json=failureType,proto3" json:"failure_type,omitempty"`
	// ibc packet data
	Packet string `protobuf:"bytes,2,opt,name=packet,proto3" json:"packet,omitempty"`
}

EventBadRevert is emitted on failure of ibc-transfer quota.

func (*EventBadRevert) Descriptor

func (*EventBadRevert) Descriptor() ([]byte, []int)

func (*EventBadRevert) Marshal

func (m *EventBadRevert) Marshal() (dAtA []byte, err error)

func (*EventBadRevert) MarshalTo

func (m *EventBadRevert) MarshalTo(dAtA []byte) (int, error)

func (*EventBadRevert) MarshalToSizedBuffer

func (m *EventBadRevert) MarshalToSizedBuffer(dAtA []byte) (int, error)

func (*EventBadRevert) ProtoMessage

func (*EventBadRevert) ProtoMessage()

func (*EventBadRevert) Reset

func (m *EventBadRevert) Reset()

func (*EventBadRevert) Size

func (m *EventBadRevert) Size() (n int)

func (*EventBadRevert) String

func (m *EventBadRevert) String() string

func (*EventBadRevert) Unmarshal

func (m *EventBadRevert) Unmarshal(dAtA []byte) error

func (*EventBadRevert) XXX_DiscardUnknown

func (m *EventBadRevert) XXX_DiscardUnknown()

func (*EventBadRevert) XXX_Marshal

func (m *EventBadRevert) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*EventBadRevert) XXX_Merge

func (m *EventBadRevert) XXX_Merge(src proto.Message)

func (*EventBadRevert) XXX_Size

func (m *EventBadRevert) XXX_Size() int

func (*EventBadRevert) XXX_Unmarshal

func (m *EventBadRevert) XXX_Unmarshal(b []byte) error

type EventIBCTransferStatus

type EventIBCTransferStatus struct {
	Status IBCTransferStatus `protobuf:"varint,1,opt,name=status,proto3,enum=umee.uibc.v1.IBCTransferStatus" json:"status,omitempty"`
}

EventIBCTransferStatus is emitted on quota tracking pause status change.

func (*EventIBCTransferStatus) Descriptor

func (*EventIBCTransferStatus) Descriptor() ([]byte, []int)

func (*EventIBCTransferStatus) Marshal

func (m *EventIBCTransferStatus) Marshal() (dAtA []byte, err error)

func (*EventIBCTransferStatus) MarshalTo

func (m *EventIBCTransferStatus) MarshalTo(dAtA []byte) (int, error)

func (*EventIBCTransferStatus) MarshalToSizedBuffer

func (m *EventIBCTransferStatus) MarshalToSizedBuffer(dAtA []byte) (int, error)

func (*EventIBCTransferStatus) ProtoMessage

func (*EventIBCTransferStatus) ProtoMessage()

func (*EventIBCTransferStatus) Reset

func (m *EventIBCTransferStatus) Reset()

func (*EventIBCTransferStatus) Size

func (m *EventIBCTransferStatus) Size() (n int)

func (*EventIBCTransferStatus) String

func (m *EventIBCTransferStatus) String() string

func (*EventIBCTransferStatus) Unmarshal

func (m *EventIBCTransferStatus) Unmarshal(dAtA []byte) error

func (*EventIBCTransferStatus) XXX_DiscardUnknown

func (m *EventIBCTransferStatus) XXX_DiscardUnknown()

func (*EventIBCTransferStatus) XXX_Marshal

func (m *EventIBCTransferStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*EventIBCTransferStatus) XXX_Merge

func (m *EventIBCTransferStatus) XXX_Merge(src proto.Message)

func (*EventIBCTransferStatus) XXX_Size

func (m *EventIBCTransferStatus) XXX_Size() int

func (*EventIBCTransferStatus) XXX_Unmarshal

func (m *EventIBCTransferStatus) XXX_Unmarshal(b []byte) error

type GenesisState

type GenesisState struct {
	Params   Params                                      `protobuf:"bytes,1,opt,name=params,proto3" json:"params"`
	Outflows github_com_cosmos_cosmos_sdk_types.DecCoins `protobuf:"bytes,2,rep,name=outflows,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.DecCoins" json:"outflows"`
	// total_outflow_sum defines the total outflow sum of ibc-transfer in USD.
	TotalOutflowSum github_com_cosmos_cosmos_sdk_types.Dec `` /* 148-byte string literal not displayed */
	// quota_expires defines quota expire time (as unix timestamp) for ibc-transfer denom.
	QuotaExpires time.Time `` /* 127-byte string literal not displayed */
}

GenesisState defines the uibc module's genesis state.

func DefaultGenesisState

func DefaultGenesisState() *GenesisState

func NewGenesisState

func NewGenesisState(params Params, outflows sdk.DecCoins, outflowSum sdk.Dec) *GenesisState

func (*GenesisState) Descriptor

func (*GenesisState) Descriptor() ([]byte, []int)

func (*GenesisState) Marshal

func (m *GenesisState) Marshal() (dAtA []byte, err error)

func (*GenesisState) MarshalTo

func (m *GenesisState) MarshalTo(dAtA []byte) (int, error)

func (*GenesisState) MarshalToSizedBuffer

func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error)

func (*GenesisState) ProtoMessage

func (*GenesisState) ProtoMessage()

func (*GenesisState) Reset

func (m *GenesisState) Reset()

func (*GenesisState) Size

func (m *GenesisState) Size() (n int)

func (*GenesisState) String

func (m *GenesisState) String() string

func (*GenesisState) Unmarshal

func (m *GenesisState) Unmarshal(dAtA []byte) error

func (GenesisState) Validate

func (gs GenesisState) Validate() error

Validate performs basic valida`tion of the interchain accounts GenesisState

func (*GenesisState) XXX_DiscardUnknown

func (m *GenesisState) XXX_DiscardUnknown()

func (*GenesisState) XXX_Marshal

func (m *GenesisState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*GenesisState) XXX_Merge

func (m *GenesisState) XXX_Merge(src proto.Message)

func (*GenesisState) XXX_Size

func (m *GenesisState) XXX_Size() int

func (*GenesisState) XXX_Unmarshal

func (m *GenesisState) XXX_Unmarshal(b []byte) error

type IBCTransferStatus

type IBCTransferStatus int32

IBCTransferStatus status of ibc-transfer quota check for inflow and outflow

const (
	// UNSPECIFIED  defines a no-op status.
	IBCTransferStatus_IBC_TRANSFER_STATUS_UNSPECIFIED IBCTransferStatus = 0
	// DISABLED: all inflow and outflow quota checks are disabled.
	IBCTransferStatus_IBC_TRANSFER_STATUS_QUOTA_DISABLED IBCTransferStatus = 1
	// ENABLED: all inflow and outflow quota checks are enabled.
	IBCTransferStatus_IBC_TRANSFER_STATUS_QUOTA_ENABLED IBCTransferStatus = 2
	// DISABLED OUT: outflow quota check is disabled, while the inflow quota check is enabled.
	IBCTransferStatus_IBC_TRANSFER_STATUS_QUOTA_OUT_DISABLED IBCTransferStatus = 3
	// DISABLED IN: inflow quota check is disabled, while the outflow quota check is enabled.
	IBCTransferStatus_IBC_TRANSFER_STATUS_QUOTA_IN_DISABLED IBCTransferStatus = 4
	// PAUSED: all IBC transfers are paused.
	IBCTransferStatus_IBC_TRANSFER_STATUS_TRANSFERS_PAUSED IBCTransferStatus = 5
)

func (IBCTransferStatus) EnumDescriptor

func (IBCTransferStatus) EnumDescriptor() ([]byte, []int)

func (IBCTransferStatus) IBCTransferEnabled

func (status IBCTransferStatus) IBCTransferEnabled() bool

IBCTransferEnabled returns true if the ibc-transfer is enabled for both inflow and outflow."

func (IBCTransferStatus) InflowQuotaEnabled

func (status IBCTransferStatus) InflowQuotaEnabled() bool

InflowQuotaEnabled returns true if inflow quota check is enabled.

func (IBCTransferStatus) OutflowQuotaEnabled

func (status IBCTransferStatus) OutflowQuotaEnabled() bool

OutflowQuotaEnabled returns true if outflow quota check is enabled.

func (IBCTransferStatus) String

func (x IBCTransferStatus) String() string

type Leverage

type Leverage interface {
	GetTokenSettings(ctx sdk.Context, baseDenom string) (ltypes.Token, error)
	ExchangeUToken(ctx sdk.Context, uToken sdk.Coin) (sdk.Coin, error)
	DeriveExchangeRate(ctx sdk.Context, denom string) sdk.Dec
}

type MsgClient

type MsgClient interface {
	// GovUpdateQuota adds new quota for ibc denoms or
	// updates the quota for existed ibc denoms.
	GovUpdateQuota(ctx context.Context, in *MsgGovUpdateQuota, opts ...grpc.CallOption) (*MsgGovUpdateQuotaResponse, error)
	// GovSetIBCStatus sets IBC ICS20 status. Must be called by x/gov.
	GovSetIBCStatus(ctx context.Context, in *MsgGovSetIBCStatus, opts ...grpc.CallOption) (*MsgGovSetIBCStatusResponse, error)
}

MsgClient is the client API for Msg service.

For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.

func NewMsgClient

func NewMsgClient(cc grpc1.ClientConn) MsgClient

type MsgGovSetIBCStatus

type MsgGovSetIBCStatus struct {
	// authority is the address of the governance account.
	Authority   string `protobuf:"bytes,1,opt,name=authority,proto3" json:"authority,omitempty"`
	Title       string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"`
	Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
	// ibc_status defines status for ibc transfers
	IbcStatus IBCTransferStatus `protobuf:"varint,4,opt,name=ibc_status,json=ibcStatus,proto3,enum=umee.uibc.v1.IBCTransferStatus" json:"ibc_status,omitempty"`
}

MsgGovSetIBCStatus defines the request type for setting the IBC quota status.

func (*MsgGovSetIBCStatus) Descriptor

func (*MsgGovSetIBCStatus) Descriptor() ([]byte, []int)

func (*MsgGovSetIBCStatus) GetDescription

func (msg *MsgGovSetIBCStatus) GetDescription() string

GetDescription implements govv1b1.Content interface.

func (*MsgGovSetIBCStatus) GetSignBytes

func (msg *MsgGovSetIBCStatus) GetSignBytes() []byte

GetSignBytes implements Msg

func (*MsgGovSetIBCStatus) GetSigners

func (msg *MsgGovSetIBCStatus) GetSigners() []sdk.AccAddress

GetSigners implements Msg

func (*MsgGovSetIBCStatus) GetTitle

func (msg *MsgGovSetIBCStatus) GetTitle() string

GetTitle implements govv1b1.Content interface.

func (*MsgGovSetIBCStatus) Marshal

func (m *MsgGovSetIBCStatus) Marshal() (dAtA []byte, err error)

func (*MsgGovSetIBCStatus) MarshalTo

func (m *MsgGovSetIBCStatus) MarshalTo(dAtA []byte) (int, error)

func (*MsgGovSetIBCStatus) MarshalToSizedBuffer

func (m *MsgGovSetIBCStatus) MarshalToSizedBuffer(dAtA []byte) (int, error)

func (*MsgGovSetIBCStatus) ProtoMessage

func (*MsgGovSetIBCStatus) ProtoMessage()

func (*MsgGovSetIBCStatus) Reset

func (m *MsgGovSetIBCStatus) Reset()

func (MsgGovSetIBCStatus) Route

func (msg MsgGovSetIBCStatus) Route() string

Route implements Msg

func (*MsgGovSetIBCStatus) Size

func (m *MsgGovSetIBCStatus) Size() (n int)

func (*MsgGovSetIBCStatus) String

func (msg *MsgGovSetIBCStatus) String() string

String implements the Stringer interface.

func (MsgGovSetIBCStatus) Type

func (msg MsgGovSetIBCStatus) Type() string

Type implements Msg

func (*MsgGovSetIBCStatus) Unmarshal

func (m *MsgGovSetIBCStatus) Unmarshal(dAtA []byte) error

func (*MsgGovSetIBCStatus) ValidateBasic

func (msg *MsgGovSetIBCStatus) ValidateBasic() error

ValidateBasic implements Msg

func (*MsgGovSetIBCStatus) XXX_DiscardUnknown

func (m *MsgGovSetIBCStatus) XXX_DiscardUnknown()

func (*MsgGovSetIBCStatus) XXX_Marshal

func (m *MsgGovSetIBCStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*MsgGovSetIBCStatus) XXX_Merge

func (m *MsgGovSetIBCStatus) XXX_Merge(src proto.Message)

func (*MsgGovSetIBCStatus) XXX_MessageName

func (*MsgGovSetIBCStatus) XXX_MessageName() string

func (*MsgGovSetIBCStatus) XXX_Size

func (m *MsgGovSetIBCStatus) XXX_Size() int

func (*MsgGovSetIBCStatus) XXX_Unmarshal

func (m *MsgGovSetIBCStatus) XXX_Unmarshal(b []byte) error

type MsgGovSetIBCStatusResponse

type MsgGovSetIBCStatusResponse struct {
}

MsgGovSetIBCStatusResponse define the response type for Msg/MsgGovSetIBCStatus with x/gov proposals.

func (*MsgGovSetIBCStatusResponse) Descriptor

func (*MsgGovSetIBCStatusResponse) Descriptor() ([]byte, []int)

func (*MsgGovSetIBCStatusResponse) Marshal

func (m *MsgGovSetIBCStatusResponse) Marshal() (dAtA []byte, err error)

func (*MsgGovSetIBCStatusResponse) MarshalTo

func (m *MsgGovSetIBCStatusResponse) MarshalTo(dAtA []byte) (int, error)

func (*MsgGovSetIBCStatusResponse) MarshalToSizedBuffer

func (m *MsgGovSetIBCStatusResponse) MarshalToSizedBuffer(dAtA []byte) (int, error)

func (*MsgGovSetIBCStatusResponse) ProtoMessage

func (*MsgGovSetIBCStatusResponse) ProtoMessage()

func (*MsgGovSetIBCStatusResponse) Reset

func (m *MsgGovSetIBCStatusResponse) Reset()

func (*MsgGovSetIBCStatusResponse) Size

func (m *MsgGovSetIBCStatusResponse) Size() (n int)

func (*MsgGovSetIBCStatusResponse) String

func (m *MsgGovSetIBCStatusResponse) String() string

func (*MsgGovSetIBCStatusResponse) Unmarshal

func (m *MsgGovSetIBCStatusResponse) Unmarshal(dAtA []byte) error

func (*MsgGovSetIBCStatusResponse) XXX_DiscardUnknown

func (m *MsgGovSetIBCStatusResponse) XXX_DiscardUnknown()

func (*MsgGovSetIBCStatusResponse) XXX_Marshal

func (m *MsgGovSetIBCStatusResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*MsgGovSetIBCStatusResponse) XXX_Merge

func (m *MsgGovSetIBCStatusResponse) XXX_Merge(src proto.Message)

func (*MsgGovSetIBCStatusResponse) XXX_MessageName

func (*MsgGovSetIBCStatusResponse) XXX_MessageName() string

func (*MsgGovSetIBCStatusResponse) XXX_Size

func (m *MsgGovSetIBCStatusResponse) XXX_Size() int

func (*MsgGovSetIBCStatusResponse) XXX_Unmarshal

func (m *MsgGovSetIBCStatusResponse) XXX_Unmarshal(b []byte) error

type MsgGovUpdateQuota

type MsgGovUpdateQuota struct {
	// authority is the address of the governance account.
	Authority   string `protobuf:"bytes,1,opt,name=authority,proto3" json:"authority,omitempty"`
	Title       string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"`
	Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
	// total quota defines the total outflow of ibc-transfer in USD
	Total github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,4,opt,name=total,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"total"`
	// per_denom quota for outflows per denom. All denoms have the same quota size.
	PerDenom github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,5,opt,name=per_denom,json=perDenom,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"per_denom"`
	// quota_duration defines quota expires per denom, All denoms have the same expire time.
	QuotaDuration time.Duration `` /* 134-byte string literal not displayed */
}

MsgGovUpdateQuota defines the Msg/GovUpdateQuota request type.

func (*MsgGovUpdateQuota) Descriptor

func (*MsgGovUpdateQuota) Descriptor() ([]byte, []int)

func (*MsgGovUpdateQuota) GetDescription

func (msg *MsgGovUpdateQuota) GetDescription() string

GetDescription implements govv1b1.Content interface.

func (*MsgGovUpdateQuota) GetSignBytes

func (msg *MsgGovUpdateQuota) GetSignBytes() []byte

GetSignBytes implements Msg

func (*MsgGovUpdateQuota) GetSigners

func (msg *MsgGovUpdateQuota) GetSigners() []sdk.AccAddress

GetSigners implements Msg

func (*MsgGovUpdateQuota) GetTitle

func (msg *MsgGovUpdateQuota) GetTitle() string

GetTitle returns the title of the proposal.

func (*MsgGovUpdateQuota) Marshal

func (m *MsgGovUpdateQuota) Marshal() (dAtA []byte, err error)

func (*MsgGovUpdateQuota) MarshalTo

func (m *MsgGovUpdateQuota) MarshalTo(dAtA []byte) (int, error)

func (*MsgGovUpdateQuota) MarshalToSizedBuffer

func (m *MsgGovUpdateQuota) MarshalToSizedBuffer(dAtA []byte) (int, error)

func (*MsgGovUpdateQuota) ProtoMessage

func (*MsgGovUpdateQuota) ProtoMessage()

func (*MsgGovUpdateQuota) Reset

func (m *MsgGovUpdateQuota) Reset()

func (MsgGovUpdateQuota) Route

func (msg MsgGovUpdateQuota) Route() string

Route implements Msg

func (*MsgGovUpdateQuota) Size

func (m *MsgGovUpdateQuota) Size() (n int)

func (*MsgGovUpdateQuota) String

func (msg *MsgGovUpdateQuota) String() string

String implements the Stringer interface.

func (MsgGovUpdateQuota) Type

func (msg MsgGovUpdateQuota) Type() string

Type implements Msg

func (*MsgGovUpdateQuota) Unmarshal

func (m *MsgGovUpdateQuota) Unmarshal(dAtA []byte) error

func (*MsgGovUpdateQuota) ValidateBasic

func (msg *MsgGovUpdateQuota) ValidateBasic() error

ValidateBasic implements Msg

func (*MsgGovUpdateQuota) XXX_DiscardUnknown

func (m *MsgGovUpdateQuota) XXX_DiscardUnknown()

func (*MsgGovUpdateQuota) XXX_Marshal

func (m *MsgGovUpdateQuota) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*MsgGovUpdateQuota) XXX_Merge

func (m *MsgGovUpdateQuota) XXX_Merge(src proto.Message)

func (*MsgGovUpdateQuota) XXX_MessageName

func (*MsgGovUpdateQuota) XXX_MessageName() string

func (*MsgGovUpdateQuota) XXX_Size

func (m *MsgGovUpdateQuota) XXX_Size() int

func (*MsgGovUpdateQuota) XXX_Unmarshal

func (m *MsgGovUpdateQuota) XXX_Unmarshal(b []byte) error

type MsgGovUpdateQuotaResponse

type MsgGovUpdateQuotaResponse struct {
}

MsgGovUpdateQuotaResponse defines response type for the Msg/GovUpdateQuota for with x/gov proposals.

func (*MsgGovUpdateQuotaResponse) Descriptor

func (*MsgGovUpdateQuotaResponse) Descriptor() ([]byte, []int)

func (*MsgGovUpdateQuotaResponse) Marshal

func (m *MsgGovUpdateQuotaResponse) Marshal() (dAtA []byte, err error)

func (*MsgGovUpdateQuotaResponse) MarshalTo

func (m *MsgGovUpdateQuotaResponse) MarshalTo(dAtA []byte) (int, error)

func (*MsgGovUpdateQuotaResponse) MarshalToSizedBuffer

func (m *MsgGovUpdateQuotaResponse) MarshalToSizedBuffer(dAtA []byte) (int, error)

func (*MsgGovUpdateQuotaResponse) ProtoMessage

func (*MsgGovUpdateQuotaResponse) ProtoMessage()

func (*MsgGovUpdateQuotaResponse) Reset

func (m *MsgGovUpdateQuotaResponse) Reset()

func (*MsgGovUpdateQuotaResponse) Size

func (m *MsgGovUpdateQuotaResponse) Size() (n int)

func (*MsgGovUpdateQuotaResponse) String

func (m *MsgGovUpdateQuotaResponse) String() string

func (*MsgGovUpdateQuotaResponse) Unmarshal

func (m *MsgGovUpdateQuotaResponse) Unmarshal(dAtA []byte) error

func (*MsgGovUpdateQuotaResponse) XXX_DiscardUnknown

func (m *MsgGovUpdateQuotaResponse) XXX_DiscardUnknown()

func (*MsgGovUpdateQuotaResponse) XXX_Marshal

func (m *MsgGovUpdateQuotaResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*MsgGovUpdateQuotaResponse) XXX_Merge

func (m *MsgGovUpdateQuotaResponse) XXX_Merge(src proto.Message)

func (*MsgGovUpdateQuotaResponse) XXX_MessageName

func (*MsgGovUpdateQuotaResponse) XXX_MessageName() string

func (*MsgGovUpdateQuotaResponse) XXX_Size

func (m *MsgGovUpdateQuotaResponse) XXX_Size() int

func (*MsgGovUpdateQuotaResponse) XXX_Unmarshal

func (m *MsgGovUpdateQuotaResponse) XXX_Unmarshal(b []byte) error

type MsgServer

type MsgServer interface {
	// GovUpdateQuota adds new quota for ibc denoms or
	// updates the quota for existed ibc denoms.
	GovUpdateQuota(context.Context, *MsgGovUpdateQuota) (*MsgGovUpdateQuotaResponse, error)
	// GovSetIBCStatus sets IBC ICS20 status. Must be called by x/gov.
	GovSetIBCStatus(context.Context, *MsgGovSetIBCStatus) (*MsgGovSetIBCStatusResponse, error)
}

MsgServer is the server API for Msg service.

type Oracle

type Oracle interface {
	Price(ctx sdk.Context, denom string) (sdk.Dec, error)
}

Oracle interface for price feed. The uibc design doesn't depend on any particular price metric (spot price, avg ...), so it's up to the integration which price should be used.

type Params

type Params struct {
	// ibc_status defines the IBC ICS20 status (transfer quota or transfers disabled).
	IbcStatus IBCTransferStatus `protobuf:"varint,1,opt,name=ibc_status,json=ibcStatus,proto3,enum=umee.uibc.v1.IBCTransferStatus" json:"ibc_status,omitempty"`
	// total_quota defines the total outflow limit of ibc-transfer in USD
	TotalQuota github_com_cosmos_cosmos_sdk_types.Dec `` /* 131-byte string literal not displayed */
	// token_quota defines the outflow limit per token in USD
	TokenQuota github_com_cosmos_cosmos_sdk_types.Dec `` /* 131-byte string literal not displayed */
	// quota_duration defines quota expires for each ibc-transfer denom in seconds
	QuotaDuration time.Duration `` /* 134-byte string literal not displayed */
}

Params of x/uibc module

func DefaultParams

func DefaultParams() Params

DefaultParams returns default genesis params

func (*Params) Descriptor

func (*Params) Descriptor() ([]byte, []int)

func (*Params) GetIbcStatus

func (m *Params) GetIbcStatus() IBCTransferStatus

func (*Params) GetQuotaDuration

func (m *Params) GetQuotaDuration() time.Duration

func (*Params) Marshal

func (m *Params) Marshal() (dAtA []byte, err error)

func (*Params) MarshalTo

func (m *Params) MarshalTo(dAtA []byte) (int, error)

func (*Params) MarshalToSizedBuffer

func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error)

func (*Params) ProtoMessage

func (*Params) ProtoMessage()

func (*Params) Reset

func (m *Params) Reset()

func (*Params) Size

func (m *Params) Size() (n int)

func (*Params) String

func (m *Params) String() string

func (*Params) Unmarshal

func (m *Params) Unmarshal(dAtA []byte) error

func (Params) Validate

func (p Params) Validate() error

func (*Params) XXX_DiscardUnknown

func (m *Params) XXX_DiscardUnknown()

func (*Params) XXX_Marshal

func (m *Params) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*Params) XXX_Merge

func (m *Params) XXX_Merge(src proto.Message)

func (*Params) XXX_Size

func (m *Params) XXX_Size() int

func (*Params) XXX_Unmarshal

func (m *Params) XXX_Unmarshal(b []byte) error

type QueryAllOutflows

type QueryAllOutflows struct {
}

QueryOutflow defines request type for query the quota of denoms

func (*QueryAllOutflows) Descriptor

func (*QueryAllOutflows) Descriptor() ([]byte, []int)

func (*QueryAllOutflows) Marshal

func (m *QueryAllOutflows) Marshal() (dAtA []byte, err error)

func (*QueryAllOutflows) MarshalTo

func (m *QueryAllOutflows) MarshalTo(dAtA []byte) (int, error)

func (*QueryAllOutflows) MarshalToSizedBuffer

func (m *QueryAllOutflows) MarshalToSizedBuffer(dAtA []byte) (int, error)

func (*QueryAllOutflows) ProtoMessage

func (*QueryAllOutflows) ProtoMessage()

func (*QueryAllOutflows) Reset

func (m *QueryAllOutflows) Reset()

func (*QueryAllOutflows) Size

func (m *QueryAllOutflows) Size() (n int)

func (*QueryAllOutflows) String

func (m *QueryAllOutflows) String() string

func (*QueryAllOutflows) Unmarshal

func (m *QueryAllOutflows) Unmarshal(dAtA []byte) error

func (*QueryAllOutflows) XXX_DiscardUnknown

func (m *QueryAllOutflows) XXX_DiscardUnknown()

func (*QueryAllOutflows) XXX_Marshal

func (m *QueryAllOutflows) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*QueryAllOutflows) XXX_Merge

func (m *QueryAllOutflows) XXX_Merge(src proto.Message)

func (*QueryAllOutflows) XXX_Size

func (m *QueryAllOutflows) XXX_Size() int

func (*QueryAllOutflows) XXX_Unmarshal

func (m *QueryAllOutflows) XXX_Unmarshal(b []byte) error

type QueryAllOutflowsResponse

type QueryAllOutflowsResponse struct {
	Outflows github_com_cosmos_cosmos_sdk_types.DecCoins `protobuf:"bytes,1,rep,name=outflows,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.DecCoins" json:"outflows"`
}

QueryOutflowResponse defines response type of Query/Outflow

func (*QueryAllOutflowsResponse) Descriptor

func (*QueryAllOutflowsResponse) Descriptor() ([]byte, []int)

func (*QueryAllOutflowsResponse) Marshal

func (m *QueryAllOutflowsResponse) Marshal() (dAtA []byte, err error)

func (*QueryAllOutflowsResponse) MarshalTo

func (m *QueryAllOutflowsResponse) MarshalTo(dAtA []byte) (int, error)

func (*QueryAllOutflowsResponse) MarshalToSizedBuffer

func (m *QueryAllOutflowsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error)

func (*QueryAllOutflowsResponse) ProtoMessage

func (*QueryAllOutflowsResponse) ProtoMessage()

func (*QueryAllOutflowsResponse) Reset

func (m *QueryAllOutflowsResponse) Reset()

func (*QueryAllOutflowsResponse) Size

func (m *QueryAllOutflowsResponse) Size() (n int)

func (*QueryAllOutflowsResponse) String

func (m *QueryAllOutflowsResponse) String() string

func (*QueryAllOutflowsResponse) Unmarshal

func (m *QueryAllOutflowsResponse) Unmarshal(dAtA []byte) error

func (*QueryAllOutflowsResponse) XXX_DiscardUnknown

func (m *QueryAllOutflowsResponse) XXX_DiscardUnknown()

func (*QueryAllOutflowsResponse) XXX_Marshal

func (m *QueryAllOutflowsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*QueryAllOutflowsResponse) XXX_Merge

func (m *QueryAllOutflowsResponse) XXX_Merge(src proto.Message)

func (*QueryAllOutflowsResponse) XXX_Size

func (m *QueryAllOutflowsResponse) XXX_Size() int

func (*QueryAllOutflowsResponse) XXX_Unmarshal

func (m *QueryAllOutflowsResponse) XXX_Unmarshal(b []byte) error

type QueryClient

type QueryClient interface {
	// Params queries the parameters of the x/uibc module.
	Params(ctx context.Context, in *QueryParams, opts ...grpc.CallOption) (*QueryParamsResponse, error)
	// Outflow returns IBC denom outflows in the current quota period.
	// If denom is not specified, returns sum of all registered outflows.
	Outflows(ctx context.Context, in *QueryOutflows, opts ...grpc.CallOption) (*QueryOutflowsResponse, error)
	// AllOutflow returns outflows for each denom in the current quota period.
	AllOutflows(ctx context.Context, in *QueryAllOutflows, opts ...grpc.CallOption) (*QueryAllOutflowsResponse, error)
}

QueryClient is the client API for Query service.

For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.

func NewQueryClient

func NewQueryClient(cc grpc1.ClientConn) QueryClient

type QueryOutflows

type QueryOutflows struct {
	Denom string `protobuf:"bytes,1,opt,name=denom,proto3" json:"denom,omitempty"`
}

QueryOutflow defines request type for query the quota of denoms

func (*QueryOutflows) Descriptor

func (*QueryOutflows) Descriptor() ([]byte, []int)

func (*QueryOutflows) Marshal

func (m *QueryOutflows) Marshal() (dAtA []byte, err error)

func (*QueryOutflows) MarshalTo

func (m *QueryOutflows) MarshalTo(dAtA []byte) (int, error)

func (*QueryOutflows) MarshalToSizedBuffer

func (m *QueryOutflows) MarshalToSizedBuffer(dAtA []byte) (int, error)

func (*QueryOutflows) ProtoMessage

func (*QueryOutflows) ProtoMessage()

func (*QueryOutflows) Reset

func (m *QueryOutflows) Reset()

func (*QueryOutflows) Size

func (m *QueryOutflows) Size() (n int)

func (*QueryOutflows) String

func (m *QueryOutflows) String() string

func (*QueryOutflows) Unmarshal

func (m *QueryOutflows) Unmarshal(dAtA []byte) error

func (*QueryOutflows) XXX_DiscardUnknown

func (m *QueryOutflows) XXX_DiscardUnknown()

func (*QueryOutflows) XXX_Marshal

func (m *QueryOutflows) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*QueryOutflows) XXX_Merge

func (m *QueryOutflows) XXX_Merge(src proto.Message)

func (*QueryOutflows) XXX_Size

func (m *QueryOutflows) XXX_Size() int

func (*QueryOutflows) XXX_Unmarshal

func (m *QueryOutflows) XXX_Unmarshal(b []byte) error

type QueryOutflowsResponse

type QueryOutflowsResponse struct {
	Amount github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,1,opt,name=amount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"amount"`
}

QueryOutflowResponse defines response type of Query/Outflow

func (*QueryOutflowsResponse) Descriptor

func (*QueryOutflowsResponse) Descriptor() ([]byte, []int)

func (*QueryOutflowsResponse) Marshal

func (m *QueryOutflowsResponse) Marshal() (dAtA []byte, err error)

func (*QueryOutflowsResponse) MarshalTo

func (m *QueryOutflowsResponse) MarshalTo(dAtA []byte) (int, error)

func (*QueryOutflowsResponse) MarshalToSizedBuffer

func (m *QueryOutflowsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error)

func (*QueryOutflowsResponse) ProtoMessage

func (*QueryOutflowsResponse) ProtoMessage()

func (*QueryOutflowsResponse) Reset

func (m *QueryOutflowsResponse) Reset()

func (*QueryOutflowsResponse) Size

func (m *QueryOutflowsResponse) Size() (n int)

func (*QueryOutflowsResponse) String

func (m *QueryOutflowsResponse) String() string

func (*QueryOutflowsResponse) Unmarshal

func (m *QueryOutflowsResponse) Unmarshal(dAtA []byte) error

func (*QueryOutflowsResponse) XXX_DiscardUnknown

func (m *QueryOutflowsResponse) XXX_DiscardUnknown()

func (*QueryOutflowsResponse) XXX_Marshal

func (m *QueryOutflowsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*QueryOutflowsResponse) XXX_Merge

func (m *QueryOutflowsResponse) XXX_Merge(src proto.Message)

func (*QueryOutflowsResponse) XXX_Size

func (m *QueryOutflowsResponse) XXX_Size() int

func (*QueryOutflowsResponse) XXX_Unmarshal

func (m *QueryOutflowsResponse) XXX_Unmarshal(b []byte) error

type QueryParams

type QueryParams struct {
}

QueryParams defines the request structure for the Params gRPC service handler.

func (*QueryParams) Descriptor

func (*QueryParams) Descriptor() ([]byte, []int)

func (*QueryParams) Marshal

func (m *QueryParams) Marshal() (dAtA []byte, err error)

func (*QueryParams) MarshalTo

func (m *QueryParams) MarshalTo(dAtA []byte) (int, error)

func (*QueryParams) MarshalToSizedBuffer

func (m *QueryParams) MarshalToSizedBuffer(dAtA []byte) (int, error)

func (*QueryParams) ProtoMessage

func (*QueryParams) ProtoMessage()

func (*QueryParams) Reset

func (m *QueryParams) Reset()

func (*QueryParams) Size

func (m *QueryParams) Size() (n int)

func (*QueryParams) String

func (m *QueryParams) String() string

func (*QueryParams) Unmarshal

func (m *QueryParams) Unmarshal(dAtA []byte) error

func (*QueryParams) XXX_DiscardUnknown

func (m *QueryParams) XXX_DiscardUnknown()

func (*QueryParams) XXX_Marshal

func (m *QueryParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*QueryParams) XXX_Merge

func (m *QueryParams) XXX_Merge(src proto.Message)

func (*QueryParams) XXX_Size

func (m *QueryParams) XXX_Size() int

func (*QueryParams) XXX_Unmarshal

func (m *QueryParams) XXX_Unmarshal(b []byte) error

type QueryParamsResponse

type QueryParamsResponse struct {
	Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"`
}

QueryParamsResponse defines the response structure for the Params gRPC service handler.

func (*QueryParamsResponse) Descriptor

func (*QueryParamsResponse) Descriptor() ([]byte, []int)

func (*QueryParamsResponse) Marshal

func (m *QueryParamsResponse) Marshal() (dAtA []byte, err error)

func (*QueryParamsResponse) MarshalTo

func (m *QueryParamsResponse) MarshalTo(dAtA []byte) (int, error)

func (*QueryParamsResponse) MarshalToSizedBuffer

func (m *QueryParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error)

func (*QueryParamsResponse) ProtoMessage

func (*QueryParamsResponse) ProtoMessage()

func (*QueryParamsResponse) Reset

func (m *QueryParamsResponse) Reset()

func (*QueryParamsResponse) Size

func (m *QueryParamsResponse) Size() (n int)

func (*QueryParamsResponse) String

func (m *QueryParamsResponse) String() string

func (*QueryParamsResponse) Unmarshal

func (m *QueryParamsResponse) Unmarshal(dAtA []byte) error

func (*QueryParamsResponse) XXX_DiscardUnknown

func (m *QueryParamsResponse) XXX_DiscardUnknown()

func (*QueryParamsResponse) XXX_Marshal

func (m *QueryParamsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*QueryParamsResponse) XXX_Merge

func (m *QueryParamsResponse) XXX_Merge(src proto.Message)

func (*QueryParamsResponse) XXX_Size

func (m *QueryParamsResponse) XXX_Size() int

func (*QueryParamsResponse) XXX_Unmarshal

func (m *QueryParamsResponse) XXX_Unmarshal(b []byte) error

type QueryServer

type QueryServer interface {
	// Params queries the parameters of the x/uibc module.
	Params(context.Context, *QueryParams) (*QueryParamsResponse, error)
	// Outflow returns IBC denom outflows in the current quota period.
	// If denom is not specified, returns sum of all registered outflows.
	Outflows(context.Context, *QueryOutflows) (*QueryOutflowsResponse, error)
	// AllOutflow returns outflows for each denom in the current quota period.
	AllOutflows(context.Context, *QueryAllOutflows) (*QueryAllOutflowsResponse, error)
}

QueryServer is the server API for Query service.

type UnimplementedMsgServer

type UnimplementedMsgServer struct {
}

UnimplementedMsgServer can be embedded to have forward compatible implementations.

func (*UnimplementedMsgServer) GovSetIBCStatus

func (*UnimplementedMsgServer) GovUpdateQuota

type UnimplementedQueryServer

type UnimplementedQueryServer struct {
}

UnimplementedQueryServer can be embedded to have forward compatible implementations.

func (*UnimplementedQueryServer) AllOutflows

func (*UnimplementedQueryServer) Outflows

func (*UnimplementedQueryServer) Params

Directories

Path Synopsis
client
cli
Package mocks is a generated GoMock package.
Package mocks is a generated GoMock package.

Jump to

Keyboard shortcuts

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