types

package
v0.0.0-...-7868e01 Latest Latest
Warning

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

Go to latest
Published: May 17, 2021 License: Apache-2.0 Imports: 28 Imported by: 0

Documentation

Overview

Package types is a reverse proxy.

It translates gRPC into RESTful JSON APIs.

Index

Constants

View Source
const (
	EventTypeClaim = "claim"

	AttributeValueCategory = ModuleName
)

claim module event typs

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

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

	// RouterKey is the message route for slashing
	RouterKey = ModuleName

	// QuerierRoute defines the module's query routing key
	QuerierRoute = ModuleName

	// ClaimableStoreKey defines the store key for claimable amounts
	ClaimableStoreKey = "claimable"

	// ParamsKey defines the store key for claim module parameters
	ParamsKey = "params"

	// ActionKey defines the store key to store user accomplished actions
	ActionKey = "action"
)
View Source
const DefaultIndex uint64 = 1

DefaultIndex is the default capability global index

Variables

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 (
	DefaultOsmoBondDenom          = "uosmo"
	DefaultDurationUntilDecay     = time.Hour
	DefaultClaimModuleAcctBalance = sdk.NewCoins(sdk.NewCoin(DefaultOsmoBondDenom, sdk.NewInt(1e6))) // 1 OSMO = 10^6 uosmo
	DefaultDurationOfDecay        = time.Hour * 5
)
View Source
var (
	ErrInvalidLengthParams        = fmt.Errorf("proto: negative length found during unmarshaling")
	ErrIntOverflowParams          = fmt.Errorf("proto: integer overflow")
	ErrUnexpectedEndOfGroupParams = 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 Action_name = map[int32]string{
	0: "ActionAddLiquidity",
	1: "ActionSwap",
	2: "ActionVote",
	3: "ActionDelegateStake",
}
View Source
var Action_value = map[string]int32{
	"ActionAddLiquidity":  0,
	"ActionSwap":          1,
	"ActionVote":          2,
	"ActionDelegateStake": 3,
}
View Source
var (
	ErrSample = sdkerrors.Register(ModuleName, 1100, "sample error")
)

x/claim module sentinel errors

View Source
var (
	ModuleCdc = codec.NewAminoCodec(amino)
)

Functions

func ActionToNames

func ActionToNames(actions []Action) []string

func RegisterCodec

func RegisterCodec(cdc *codec.LegacyAmino)

func RegisterInterfaces

func RegisterInterfaces(registry cdctypes.InterfaceRegistry)

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 (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead.

func RegisterQueryServer

func RegisterQueryServer(s grpc1.Server, srv QueryServer)

Types

type AccountKeeper

type AccountKeeper interface {
	GetModuleAddress(name string) sdk.AccAddress
}

AccountKeeper defines the expected account keeper used for simulations (noalias)

type Action

type Action int32
const (
	ActionAddLiquidity  Action = 0
	ActionSwap          Action = 1
	ActionVote          Action = 2
	ActionDelegateStake Action = 3
)

func (Action) EnumDescriptor

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

func (Action) String

func (x Action) String() string

type Actions

type Actions []Action

type ActivitiesRequest

type ActivitiesRequest struct {
	Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty" yaml:"sender"`
}

func (*ActivitiesRequest) Descriptor

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

func (*ActivitiesRequest) GetSender

func (m *ActivitiesRequest) GetSender() string

func (*ActivitiesRequest) Marshal

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

func (*ActivitiesRequest) MarshalTo

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

func (*ActivitiesRequest) MarshalToSizedBuffer

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

func (*ActivitiesRequest) ProtoMessage

func (*ActivitiesRequest) ProtoMessage()

func (*ActivitiesRequest) Reset

func (m *ActivitiesRequest) Reset()

func (*ActivitiesRequest) Size

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

func (*ActivitiesRequest) String

func (m *ActivitiesRequest) String() string

func (*ActivitiesRequest) Unmarshal

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

func (*ActivitiesRequest) XXX_DiscardUnknown

func (m *ActivitiesRequest) XXX_DiscardUnknown()

func (*ActivitiesRequest) XXX_Marshal

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

func (*ActivitiesRequest) XXX_Merge

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

func (*ActivitiesRequest) XXX_Size

func (m *ActivitiesRequest) XXX_Size() int

func (*ActivitiesRequest) XXX_Unmarshal

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

type ActivitiesResponse

type ActivitiesResponse struct {
	Sender    string   `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty" yaml:"sender"`
	All       []string `protobuf:"bytes,2,rep,name=all,proto3" json:"all,omitempty"`
	Completed []string `protobuf:"bytes,3,rep,name=completed,proto3" json:"completed,omitempty"`
}

func (*ActivitiesResponse) Descriptor

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

func (*ActivitiesResponse) GetAll

func (m *ActivitiesResponse) GetAll() []string

func (*ActivitiesResponse) GetCompleted

func (m *ActivitiesResponse) GetCompleted() []string

func (*ActivitiesResponse) GetSender

func (m *ActivitiesResponse) GetSender() string

func (*ActivitiesResponse) Marshal

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

func (*ActivitiesResponse) MarshalTo

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

func (*ActivitiesResponse) MarshalToSizedBuffer

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

func (*ActivitiesResponse) ProtoMessage

func (*ActivitiesResponse) ProtoMessage()

func (*ActivitiesResponse) Reset

func (m *ActivitiesResponse) Reset()

func (*ActivitiesResponse) Size

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

func (*ActivitiesResponse) String

func (m *ActivitiesResponse) String() string

func (*ActivitiesResponse) Unmarshal

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

func (*ActivitiesResponse) XXX_DiscardUnknown

func (m *ActivitiesResponse) XXX_DiscardUnknown()

func (*ActivitiesResponse) XXX_Marshal

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

func (*ActivitiesResponse) XXX_Merge

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

func (*ActivitiesResponse) XXX_Size

func (m *ActivitiesResponse) XXX_Size() int

func (*ActivitiesResponse) XXX_Unmarshal

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

type BankKeeper

type BankKeeper interface {
	SendCoinsFromModuleToAccount(ctx sdk.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error
	SendCoinsFromModuleToModule(ctx sdk.Context, senderPool, recipientPool string, amt sdk.Coins) error
	SetBalances(ctx sdk.Context, addr sdk.AccAddress, balances sdk.Coins) error
	GetBalance(ctx sdk.Context, addr sdk.AccAddress, denom string) sdk.Coin
}

BankKeeper defines the banking contract that must be fulfilled when creating a x/claim keeper.

type ClaimableRequest

type ClaimableRequest struct {
	Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty" yaml:"sender"`
}

func (*ClaimableRequest) Descriptor

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

func (*ClaimableRequest) GetSender

func (m *ClaimableRequest) GetSender() string

func (*ClaimableRequest) Marshal

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

func (*ClaimableRequest) MarshalTo

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

func (*ClaimableRequest) MarshalToSizedBuffer

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

func (*ClaimableRequest) ProtoMessage

func (*ClaimableRequest) ProtoMessage()

func (*ClaimableRequest) Reset

func (m *ClaimableRequest) Reset()

func (*ClaimableRequest) Size

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

func (*ClaimableRequest) String

func (m *ClaimableRequest) String() string

func (*ClaimableRequest) Unmarshal

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

func (*ClaimableRequest) XXX_DiscardUnknown

func (m *ClaimableRequest) XXX_DiscardUnknown()

func (*ClaimableRequest) XXX_Marshal

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

func (*ClaimableRequest) XXX_Merge

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

func (*ClaimableRequest) XXX_Size

func (m *ClaimableRequest) XXX_Size() int

func (*ClaimableRequest) XXX_Unmarshal

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

type ClaimableResponse

type ClaimableResponse struct {
	Coins []types.Coin `protobuf:"bytes,1,rep,name=coins,proto3" json:"coins" yaml:"coins"`
}

func (*ClaimableResponse) Descriptor

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

func (*ClaimableResponse) GetCoins

func (m *ClaimableResponse) GetCoins() []types.Coin

func (*ClaimableResponse) Marshal

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

func (*ClaimableResponse) MarshalTo

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

func (*ClaimableResponse) MarshalToSizedBuffer

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

func (*ClaimableResponse) ProtoMessage

func (*ClaimableResponse) ProtoMessage()

func (*ClaimableResponse) Reset

func (m *ClaimableResponse) Reset()

func (*ClaimableResponse) Size

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

func (*ClaimableResponse) String

func (m *ClaimableResponse) String() string

func (*ClaimableResponse) Unmarshal

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

func (*ClaimableResponse) XXX_DiscardUnknown

func (m *ClaimableResponse) XXX_DiscardUnknown()

func (*ClaimableResponse) XXX_Marshal

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

func (*ClaimableResponse) XXX_Merge

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

func (*ClaimableResponse) XXX_Size

func (m *ClaimableResponse) XXX_Size() int

func (*ClaimableResponse) XXX_Unmarshal

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

type DistrKeeper

type DistrKeeper interface {
	FundCommunityPool(ctx sdk.Context, amount sdk.Coins, sender sdk.AccAddress) error
}

DistrKeeper is the keeper of the distribution store

type GenesisState

type GenesisState struct {
	// balance of the claim module's account
	ModuleAccountBalance types.Coin `` /* 143-byte string literal not displayed */
	// airdrop start time
	AirdropStartTime time.Time `` /* 135-byte string literal not displayed */
	// duration until decay start to happen from airdrop start time
	DurationUntilDecay time.Duration `` /* 157-byte string literal not displayed */
	// duration of decay from decay start time
	DurationOfDecay time.Duration `` /* 145-byte string literal not displayed */
	// this is the initial amount that is claimable per address
	// because the claimable amount decays over time, this is also the maximum
	// claimable amount
	// [(account_string, max_claimable), (account_string, max_claimable) ... ]
	InitialClaimables []types1.Balance `protobuf:"bytes,5,rep,name=initial_claimables,json=initialClaimables,proto3" json:"initial_claimables"`
	// the actions done per address
	// [(account_string, [done_action1, done_action2]), (account_string,
	// [done_action1]) ... ]
	Activities []UserActions `protobuf:"bytes,6,rep,name=activities,proto3" json:"activities"`
}

GenesisState defines the claim module's genesis state.

func DefaultGenesis

func DefaultGenesis() *GenesisState

DefaultGenesis returns the default Capability genesis state

func GetGenesisStateFromAppState

func GetGenesisStateFromAppState(cdc codec.JSONMarshaler, appState map[string]json.RawMessage) *GenesisState

GetGenesisStateFromAppState returns x/claims GenesisState given raw application genesis state.

func (*GenesisState) Descriptor

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

func (*GenesisState) GetActivities

func (m *GenesisState) GetActivities() []UserActions

func (*GenesisState) GetAirdropStartTime

func (m *GenesisState) GetAirdropStartTime() time.Time

func (*GenesisState) GetDurationOfDecay

func (m *GenesisState) GetDurationOfDecay() time.Duration

func (*GenesisState) GetDurationUntilDecay

func (m *GenesisState) GetDurationUntilDecay() time.Duration

func (*GenesisState) GetInitialClaimables

func (m *GenesisState) GetInitialClaimables() []types1.Balance

func (*GenesisState) GetModuleAccountBalance

func (m *GenesisState) GetModuleAccountBalance() types.Coin

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 genesis state validation returning an error upon any failure.

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 Params

type Params struct {
	AirdropStart       time.Time     `protobuf:"bytes,1,opt,name=airdrop_start,json=airdropStart,proto3,stdtime" json:"airdrop_start" yaml:"airdrop_start"`
	DurationUntilDecay time.Duration `` /* 157-byte string literal not displayed */
	DurationOfDecay    time.Duration `` /* 145-byte string literal not displayed */
}

Params defines the claim module's parameters.

func (*Params) Descriptor

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

func (*Params) GetAirdropStart

func (m *Params) GetAirdropStart() time.Time

func (*Params) GetDurationOfDecay

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

func (*Params) GetDurationUntilDecay

func (m *Params) GetDurationUntilDecay() 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) 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 QueryClient

type QueryClient interface {
	Claimable(ctx context.Context, in *ClaimableRequest, opts ...grpc.CallOption) (*ClaimableResponse, error)
	Activities(ctx context.Context, in *ActivitiesRequest, opts ...grpc.CallOption) (*ActivitiesResponse, 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 QueryServer

type QueryServer interface {
	Claimable(context.Context, *ClaimableRequest) (*ClaimableResponse, error)
	Activities(context.Context, *ActivitiesRequest) (*ActivitiesResponse, error)
}

QueryServer is the server API for Query service.

type StakingKeeper

type StakingKeeper interface {
	// BondDenom - Bondable coin denomination
	BondDenom(sdk.Context) string
}

StakingKeeper expected staking keeper (noalias)

type UnimplementedQueryServer

type UnimplementedQueryServer struct {
}

UnimplementedQueryServer can be embedded to have forward compatible implementations.

func (*UnimplementedQueryServer) Activities

func (*UnimplementedQueryServer) Claimable

type UserAction

type UserAction struct {
	User   string `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"`
	Action Action `protobuf:"varint,2,opt,name=action,proto3,enum=osmosis.claim.v1beta1.Action" json:"action,omitempty"`
}

func (*UserAction) Descriptor

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

func (*UserAction) GetAction

func (m *UserAction) GetAction() Action

func (*UserAction) GetUser

func (m *UserAction) GetUser() string

func (*UserAction) Marshal

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

func (*UserAction) MarshalTo

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

func (*UserAction) MarshalToSizedBuffer

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

func (*UserAction) ProtoMessage

func (*UserAction) ProtoMessage()

func (*UserAction) Reset

func (m *UserAction) Reset()

func (*UserAction) Size

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

func (*UserAction) String

func (m *UserAction) String() string

func (*UserAction) Unmarshal

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

func (*UserAction) XXX_DiscardUnknown

func (m *UserAction) XXX_DiscardUnknown()

func (*UserAction) XXX_Marshal

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

func (*UserAction) XXX_Merge

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

func (*UserAction) XXX_Size

func (m *UserAction) XXX_Size() int

func (*UserAction) XXX_Unmarshal

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

type UserActions

type UserActions struct {
	User    string   `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"`
	Actions []Action `protobuf:"varint,2,rep,packed,name=actions,proto3,enum=osmosis.claim.v1beta1.Action" json:"actions,omitempty"`
}

func (*UserActions) Descriptor

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

func (*UserActions) GetActions

func (m *UserActions) GetActions() []Action

func (*UserActions) GetUser

func (m *UserActions) GetUser() string

func (*UserActions) Marshal

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

func (*UserActions) MarshalTo

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

func (*UserActions) MarshalToSizedBuffer

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

func (*UserActions) ProtoMessage

func (*UserActions) ProtoMessage()

func (*UserActions) Reset

func (m *UserActions) Reset()

func (*UserActions) Size

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

func (*UserActions) String

func (m *UserActions) String() string

func (*UserActions) Unmarshal

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

func (*UserActions) XXX_DiscardUnknown

func (m *UserActions) XXX_DiscardUnknown()

func (*UserActions) XXX_Marshal

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

func (*UserActions) XXX_Merge

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

func (*UserActions) XXX_Size

func (m *UserActions) XXX_Size() int

func (*UserActions) XXX_Unmarshal

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

Jump to

Keyboard shortcuts

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