Merge branch 'master' into adr-epoched-staking
This commit is contained in:
@@ -42,6 +42,10 @@ module.exports = {
|
||||
"label": "v0.39",
|
||||
"key": "v0.39"
|
||||
},
|
||||
{
|
||||
"label": "v0.41",
|
||||
"key": "v0.41"
|
||||
},
|
||||
{
|
||||
"label": "master",
|
||||
"key": "master"
|
||||
|
||||
@@ -72,6 +72,7 @@ Read about the [PROCESS](./PROCESS.md).
|
||||
- [ADR 027: Deterministic Protobuf Serialization](./adr-027-deterministic-protobuf-serialization.md)
|
||||
- [ADR 028: Public Key Addresses](./adr-028-public-key-addresses.md)
|
||||
- [ADR 032: Typed Events](./adr-032-typed-events.md)
|
||||
- [ADR 033: Inter-module RPC](./adr-033-protobuf-inter-module-comm.md)
|
||||
- [ADR 035: Rosetta API Support](./adr-035-rosetta-api-support.md)
|
||||
- [ADR 037: Governance Split Votes](./adr-037-gov-split-vote.md)
|
||||
- [ADR 038: State Listening](./adr-038-state-listening.md)
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
- 2020 Apr 27: Convert usages of `oneof` for interfaces to `Any`
|
||||
- 2020 May 15: Describe `cosmos_proto` extensions and amino compatibility
|
||||
- 2020 Dec 4: Move and rename `MarshalAny` and `UnmarshalAny` into the `codec.Marshaler` interface.
|
||||
- 2021 Feb 24: Remove mentions of `HybridCodec`, which has been abandoned in [#6843](https://github.com/cosmos/cosmos-sdk/pull/6843).
|
||||
|
||||
## Status
|
||||
|
||||
@@ -59,24 +60,26 @@ We will adopt [Protocol Buffers](https://developers.google.com/protocol-buffers)
|
||||
persisted structured data in the Cosmos SDK while providing a clean mechanism and developer UX for
|
||||
applications wishing to continue to use Amino. We will provide this mechanism by updating modules to
|
||||
accept a codec interface, `Marshaler`, instead of a concrete Amino codec. Furthermore, the Cosmos SDK
|
||||
will provide three concrete implementations of the `Marshaler` interface: `AminoCodec`, `ProtoCodec`,
|
||||
and `HybridCodec`.
|
||||
will provide two concrete implementations of the `Marshaler` interface: `AminoCodec` and `ProtoCodec`.
|
||||
|
||||
- `AminoCodec`: Uses Amino for both binary and JSON encoding.
|
||||
- `ProtoCodec`: Uses Protobuf for or both binary and JSON encoding.
|
||||
- `HybridCodec`: Uses Amino for JSON encoding and Protobuf for binary encoding.
|
||||
- `ProtoCodec`: Uses Protobuf for both binary and JSON encoding.
|
||||
|
||||
Until the client migration landscape is fully understood and designed, modules will use a `HybridCodec`
|
||||
as the concrete codec it accepts and/or extends. This means that all client JSON encoding, including
|
||||
genesis state, will still use Amino. The ultimate goal will be to replace Amino JSON encoding with
|
||||
Protbuf encoding and thus have modules accept and/or extend `ProtoCodec`.
|
||||
Modules will use whichever codec that is instantiated in the app. By default, the SDK's `simapp`
|
||||
instantiates a `ProtoCodec` as the concrete implementation of `Marshaler`, inside the `MakeTestEncodingConfig`
|
||||
function. This can be easily overwritten by app developers if they so desire.
|
||||
|
||||
The ultimate goal will be to replace Amino JSON encoding with Protobuf encoding and thus have
|
||||
modules accept and/or extend `ProtoCodec`. Until then, Amino JSON is still provided for legacy use-cases.
|
||||
A handful of places in the SDK still have Amino JSON hardcoded, such as the Legacy API REST endpoints
|
||||
and the `x/params` store. They are planned to be converted to Protobuf in a gradual manner.
|
||||
|
||||
### Module Codecs
|
||||
|
||||
Modules that do not require the ability to work with and serialize interfaces, the path to Protobuf
|
||||
migration is pretty straightforward. These modules are to simply migrate any existing types that
|
||||
are encoded and persisted via their concrete Amino codec to Protobuf and have their keeper accept a
|
||||
`Marshaler` that will be a `HybridCodec`. This migration is simple as things will just work as-is.
|
||||
`Marshaler` that will be a `ProtoCodec`. This migration is simple as things will just work as-is.
|
||||
|
||||
Note, any business logic that needs to encode primitive types like `bool` or `int64` should use
|
||||
[gogoprotobuf](https://github.com/gogo/protobuf) Value types.
|
||||
@@ -207,7 +210,7 @@ Note that `InterfaceRegistry` usage does not deviate from standard protobuf
|
||||
usage of `Any`, it just introduces a security and introspection layer for
|
||||
golang usage.
|
||||
|
||||
`InterfaceRegistry` will be a member of `ProtoCodec` and `HybridCodec` as
|
||||
`InterfaceRegistry` will be a member of `ProtoCodec`
|
||||
described above. In order for modules to register interface types, app modules
|
||||
can optionally implement the following interface:
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
- 2020 August 19: Move sequence field from `SignDoc` to `SignerInfo`, as discussed in [#6966](https://github.com/cosmos/cosmos-sdk/issues/6966).
|
||||
- 2020 September 25: Remove `PublicKey` type in favor of `secp256k1.PubKey`, `ed25519.PubKey` and `multisig.LegacyAminoPubKey`.
|
||||
- 2020 October 15: Add `GetAccount` and `GetAccountWithHeight` methods to the `AccountRetriever` interface.
|
||||
- 2021 Feb 24: The SDK does not use Tendermint's `PubKey` interface anymore, but its own `cryptotypes.PubKey`. Updates to reflect this.
|
||||
|
||||
## Status
|
||||
|
||||
@@ -286,7 +287,7 @@ and `FileDescriptor`s and returns a boolean result.
|
||||
|
||||
### Public Key Encoding
|
||||
|
||||
Public keys in the Cosmos SDK implement Tendermint's `crypto.PubKey` interface.
|
||||
Public keys in the Cosmos SDK implement the `cryptotypes.PubKey` interface.
|
||||
We propose to use `Any` for protobuf encoding as we are doing with other interfaces (e.g. in `BaseAccount` `PubKey` or `SignerInfo` `PublicKey`).
|
||||
Following public keys are implemented: secp256k1, ed25519 and multisignature.
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ We elect not to deal with chains which have actually halted, which is necessaril
|
||||
1. Add a new governance proposal type, `ClientUpdateProposal`, in the `x/ibc` module
|
||||
1. Extend the base `Proposal` with two client identifiers (`string`) and an initial height ('exported.Height').
|
||||
1. The first client identifier is the proposed client to be updated. This client must be either frozen or expired.
|
||||
1. The second client is a substitute client. It carries all the state for the client which may be updated. It must have identitical client and chain parameters to the client which may be updated (except for latest height and frozen height). It should be continually updated during the voting period.
|
||||
1. The second client is a substitute client. It carries all the state for the client which may be updated. It must have identitical client and chain parameters to the client which may be updated (except for latest height, frozen height, and chain-id). It should be continually updated during the voting period.
|
||||
1. The initial height represents the starting height consensus states which will be copied from the substitute client to the frozen/expired client.
|
||||
1. If this governance proposal passes, the client on trial will be updated with all the state of the substitute, if and only if:
|
||||
1. `allow_governance_override_after_expiry` is true and the client has expired (`Expired()` returns true)
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
- 2019-11-06: Initial Draft
|
||||
- 2020-10-12: Updated Draft
|
||||
- 2021-11-13: Accepted
|
||||
- 2020-11-13: Accepted
|
||||
|
||||
## Status
|
||||
|
||||
@@ -55,7 +55,7 @@ type Authorization interface {
|
||||
MethodName() string
|
||||
|
||||
// Accept determines whether this grant permits the provided sdk.ServiceMsg to be performed, and if
|
||||
// so provides an upgraded authorization instance.
|
||||
// so provides an upgraded authorization instance.
|
||||
// Returns:
|
||||
// + allow: true if msg is authorized
|
||||
// + updated: new Authorization instance which should overwrite the current one with new state
|
||||
@@ -146,7 +146,7 @@ to the router based on `Authorization` grants:
|
||||
```go
|
||||
type Keeper interface {
|
||||
// DispatchActions routes the provided msgs to their respective handlers if the grantee was granted an authorization
|
||||
// to send those messages by the first (and only) signer of each msg.
|
||||
// to send those messages by the first (and only) signer of each msg.
|
||||
DispatchActions(ctx sdk.Context, grantee sdk.AccAddress, msgs []sdk.ServiceMsg) sdk.Result`
|
||||
}
|
||||
```
|
||||
@@ -216,7 +216,7 @@ message GenericAuthorization {
|
||||
- Users will be able to authorize arbitrary actions on behalf of their accounts to other
|
||||
users, improving key management for many use cases
|
||||
- The solution is more generic than previously considered approaches and the
|
||||
`Authorization` interface approach can be extended to cover other use cases by
|
||||
`Authorization` interface approach can be extended to cover other use cases by
|
||||
SDK users
|
||||
|
||||
### Negative
|
||||
|
||||
@@ -0,0 +1,395 @@
|
||||
# ADR 033: Protobuf-based Inter-Module Communication
|
||||
|
||||
## Changelog
|
||||
|
||||
- 2020-10-05: Initial Draft
|
||||
|
||||
## Status
|
||||
|
||||
Proposed
|
||||
|
||||
## Abstract
|
||||
|
||||
This ADR introduces a system for permissioned inter-module communication leveraging the protobuf `Query` and `Msg`
|
||||
service definitions defined in [ADR 021](./adr-021-protobuf-query-encoding.md) and
|
||||
[ADR 031](./adr-031-msg-service.md) which provides:
|
||||
- stable protobuf based module interfaces to potentially later replace the keeper paradigm
|
||||
- stronger inter-module object capabilities (OCAPs) guarantees
|
||||
- module accounts and sub-account authorization
|
||||
|
||||
## Context
|
||||
|
||||
In the current Cosmos SDK documentation on the [Object-Capability Model](../docs/core/ocap.md), it is stated that:
|
||||
|
||||
> We assume that a thriving ecosystem of Cosmos-SDK modules that are easy to compose into a blockchain application will contain faulty or malicious modules.
|
||||
|
||||
There is currently not a thriving ecosystem of Cosmos SDK modules. We hypothesize that this is in part due to:
|
||||
1. lack of a stable v1.0 Cosmos SDK to build modules off of. Module interfaces are changing, sometimes dramatically, from
|
||||
point release to point release, often for good reasons, but this does not create a stable foundation to build on.
|
||||
2. lack of a properly implemented object capability or even object-oriented encapsulation system which makes refactors
|
||||
of module keeper interfaces inevitable because the current interfaces are poorly constrained.
|
||||
|
||||
### `x/bank` Case Study
|
||||
|
||||
Currently the `x/bank` keeper gives pretty much unrestricted access to any module which references it. For instance, the
|
||||
`SetBalance` method allows the caller to set the balance of any account to anything, bypassing even proper tracking of supply.
|
||||
|
||||
There appears to have been some later attempts to implement some semblance of OCAPs using module-level minting, staking
|
||||
and burning permissions. These permissions allow a module to mint, burn or delegate tokens with reference to the module’s
|
||||
own account. These permissions are actually stored as a `[]string` array on the `ModuleAccount` type in state.
|
||||
|
||||
However, these permissions don’t really do much. They control what modules can be referenced in the `MintCoins`,
|
||||
`BurnCoins` and `DelegateCoins***` methods, but for one there is no unique object capability token that controls access —
|
||||
just a simple string. So the `x/upgrade` module could mint tokens for the `x/staking` module simple by calling
|
||||
`MintCoins(“staking”)`. Furthermore, all modules which have access to these keeper methods, also have access to
|
||||
`SetBalance` negating any other attempt at OCAPs and breaking even basic object-oriented encapsulation.
|
||||
|
||||
## Decision
|
||||
|
||||
Based on [ADR-021](./adr-021-protobuf-query-encoding.md) and [ADR-031](./adr-031-msg-service.md), we introduce the
|
||||
Inter-Module Communication framework for secure module authorization and OCAPs.
|
||||
When implemented, this could also serve as an alternative to the existing paradigm of passing keepers between
|
||||
modules. The approach outlined here-in is intended to form the basis of a Cosmos SDK v1.0 that provides the necessary
|
||||
stability and encapsulation guarantees that allow a thriving module ecosystem to emerge.
|
||||
|
||||
Of particular note — the decision is to _enable_ this functionality for modules to adopt at their own discretion.
|
||||
Proposals to migrate existing modules to this new paradigm will have to be a separate conversation, potentially
|
||||
addressed as amendments to this ADR.
|
||||
|
||||
### New "Keeper" Paradigm
|
||||
|
||||
In [ADR 021](./adr-021-protobuf-query-encoding.md), a mechanism for using protobuf service definitions to define queriers
|
||||
was introduced and in [ADR 31](./adr-031-msg-service.md), a mechanism for using protobuf service to define `Msg`s was added.
|
||||
Protobuf service definitions generate two golang interfaces representing the client and server sides of a service plus
|
||||
some helper code. Here is a minimal example for the bank `cosmos.bank.Msg/Send` message type:
|
||||
|
||||
```go
|
||||
package bank
|
||||
|
||||
type MsgClient interface {
|
||||
Send(context.Context, *MsgSend, opts ...grpc.CallOption) (*MsgSendResponse, error)
|
||||
}
|
||||
|
||||
type MsgServer interface {
|
||||
Send(context.Context, *MsgSend) (*MsgSendResponse, error)
|
||||
}
|
||||
```
|
||||
|
||||
[ADR 021](./adr-021-protobuf-query-encoding.md) and [ADR 31](./adr-031-msg-service.md) specifies how modules can implement the generated `QueryServer`
|
||||
and `MsgServer` interfaces as replacements for the legacy queriers and `Msg` handlers respectively.
|
||||
|
||||
In this ADR we explain how modules can make queries and send `Msg`s to other modules using the generated `QueryClient`
|
||||
and `MsgClient` interfaces and propose this mechanism as a replacement for the existing `Keeper` paradigm. To be clear,
|
||||
this ADR does not necessitate the creation of new protobuf definitions or services. Rather, it leverages the same proto
|
||||
based service interfaces already used by clients for inter-module communication.
|
||||
|
||||
Using this `QueryClient`/`MsgClient` approach has the following key benefits over exposing keepers to external modules:
|
||||
1. Protobuf types are checked for breaking changes using [buf](https://buf.build/docs/breaking-overview) and because of
|
||||
the way protobuf is designed this will give us strong backwards compatibility guarantees while allowing for forward
|
||||
evolution.
|
||||
2. The separation between the client and server interfaces will allow us to insert permission checking code in between
|
||||
the two which checks if one module is authorized to send the specified `Msg` to the other module providing a proper
|
||||
object capability system (see below).
|
||||
3. The router for inter-module communication gives us a convenient place to handle rollback of transactions,
|
||||
enabling atomicy of operations ([currently a problem](https://github.com/cosmos/cosmos-sdk/issues/8030)). Any failure within a module-to-module call would result in a failure of the entire
|
||||
transaction
|
||||
|
||||
This mechanism has the added benefits of:
|
||||
- reducing boilerplate through code generation, and
|
||||
- allowing for modules in other languages either via a VM like CosmWasm or sub-processes using gRPC
|
||||
|
||||
### Inter-module Communication
|
||||
|
||||
To use the `Client` generated by the protobuf compiler we need a `grpc.ClientConn` [interface](https://github.com/regen-network/protobuf/blob/cosmos/grpc/types.go#L12)
|
||||
implementation. For this we introduce
|
||||
a new type, `ModuleKey`, which implements the `grpc.ClientConn` interface. `ModuleKey` can be thought of as the "private
|
||||
key" corresponding to a module account, where authentication is provided through use of a special `Invoker()` function,
|
||||
described in more detail below.
|
||||
|
||||
Blockchain users (external clients) use their account's private key to sign transactions containing `Msg`s where they are listed as signers (each
|
||||
message specifies required signers with `Msg.GetSigner`). The authentication checks is performed by `AnteHandler`.
|
||||
|
||||
Here, we extend this process, by allowing modules to be identified in `Msg.GetSigners`. When a module wants to trigger the execution a `Msg` in another module,
|
||||
its `ModuleKey` acts as the sender (through the `ClientConn` interface we describe below) and is set as a sole "signer". It's worth to note
|
||||
that we don't use any cryptographic signature in this case.
|
||||
For example, module `A` could use its `A.ModuleKey` to create `MsgSend` object for `/cosmos.bank.Msg/Send` transaction. `MsgSend` validation
|
||||
will assure that the `from` account (`A.ModuleKey` in this case) is the signer.
|
||||
|
||||
Here's an example of a hypothetical module `foo` interacting with `x/bank`:
|
||||
```go
|
||||
package foo
|
||||
|
||||
|
||||
type FooMsgServer {
|
||||
// ...
|
||||
|
||||
bankQuery bank.QueryClient
|
||||
bankMsg bank.MsgClient
|
||||
}
|
||||
|
||||
func NewFooMsgServer(moduleKey RootModuleKey, ...) FooMsgServer {
|
||||
// ...
|
||||
|
||||
return FooMsgServer {
|
||||
// ...
|
||||
modouleKey: moduleKey,
|
||||
bankQuery: bank.NewQueryClient(moduleKey),
|
||||
bankMsg: bank.NewMsgClient(moduleKey),
|
||||
}
|
||||
}
|
||||
|
||||
func (foo *FooMsgServer) Bar(ctx context.Context, req *MsgBarRequest) (*MsgBarResponse, error) {
|
||||
balance, err := foo.bankQuery.Balance(&bank.QueryBalanceRequest{Address: fooMsgServer.moduleKey.Address(), Denom: "foo"})
|
||||
|
||||
...
|
||||
|
||||
res, err := foo.bankMsg.Send(ctx, &bank.MsgSendRequest{FromAddress: fooMsgServer.moduleKey.Address(), ...})
|
||||
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
This design is also intended to be extensible to cover use cases of more fine grained permissioning like minting by
|
||||
denom prefix being restricted to certain modules (as discussed in
|
||||
[#7459](https://github.com/cosmos/cosmos-sdk/pull/7459#discussion_r529545528)).
|
||||
|
||||
### `ModuleKey`s and `ModuleID`s
|
||||
|
||||
A `ModuleKey` can be thought of as a "private key" for a module account and a `ModuleID` can be thought of as the
|
||||
corresponding "public key". From the [ADR 028](./adr-028-public-key-addresses.md), modules can have both a root module account and any number of sub-accounts
|
||||
or derived accounts that can be used for different pools (ex. staking pools) or managed accounts (ex. group
|
||||
accounts). We can also think of module sub-accounts as similar to derived keys - there is a root key and then some
|
||||
derivation path. `ModuleID` is a simple struct which contains the module name and optional "derivation" path,
|
||||
and forms its address based on the `AddressHash` method from [the ADR-028](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-028-public-key-addresses.md):
|
||||
|
||||
```go
|
||||
type ModuleID struct {
|
||||
ModuleName string
|
||||
Path []byte
|
||||
}
|
||||
|
||||
func (key ModuleID) Address() []byte {
|
||||
return AddressHash(key.ModuleName, key.Path)
|
||||
}
|
||||
```
|
||||
|
||||
In addition to being able to generate a `ModuleID` and address, a `ModuleKey` contains a special function called
|
||||
`Invoker` which is the key to safe inter-module access. The `Invoker` creates an `InvokeFn` closure which is used as an `Invoke` method in
|
||||
the `grpc.ClientConn` interface and under the hood is able to route messages to the appropriate `Msg` and `Query` handlers
|
||||
performing appropriate security checks on `Msg`s. This allows for even safer inter-module access than keeper's whose
|
||||
private member variables could be manipulated through reflection. Golang does not support reflection on a function
|
||||
closure's captured variables and direct manipulation of memory would be needed for a truly malicious module to bypass
|
||||
the `ModuleKey` security.
|
||||
|
||||
The two `ModuleKey` types are `RootModuleKey` and `DerivedModuleKey`:
|
||||
|
||||
```go
|
||||
type Invoker func(callInfo CallInfo) func(ctx context.Context, request, response interface{}, opts ...interface{}) error
|
||||
|
||||
type CallInfo {
|
||||
Method string
|
||||
Caller ModuleID
|
||||
}
|
||||
|
||||
type RootModuleKey struct {
|
||||
moduleName string
|
||||
invoker Invoker
|
||||
}
|
||||
|
||||
func (rm RootModuleKey) Derive(path []byte) DerivedModuleKey { /* ... */}
|
||||
|
||||
type DerivedModuleKey struct {
|
||||
moduleName string
|
||||
path []byte
|
||||
invoker Invoker
|
||||
}
|
||||
```
|
||||
|
||||
A module can get access to a `DerivedModuleKey`, using the `Derive(path []byte)` method on `RootModuleKey` and then
|
||||
would use this key to authenticate `Msg`s from a sub-account. Ex:
|
||||
|
||||
```go
|
||||
package foo
|
||||
|
||||
func (fooMsgServer *MsgServer) Bar(ctx context.Context, req *MsgBar) (*MsgBarResponse, error) {
|
||||
derivedKey := fooMsgServer.moduleKey.Derive(req.SomePath)
|
||||
bankMsgClient := bank.NewMsgClient(derivedKey)
|
||||
res, err := bankMsgClient.Balance(ctx, &bank.MsgSend{FromAddress: derivedKey.Address(), ...})
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
In this way, a module can gain permissioned access to a root account and any number of sub-accounts and send
|
||||
authenticated `Msg`s from these accounts. The `Invoker` `callInfo.Caller` parameter is used under the hood to
|
||||
distinguish between different module accounts, but either way the function returned by `Invoker` only allows `Msg`s
|
||||
from either the root or a derived module account to pass through.
|
||||
|
||||
Note that `Invoker` itself returns a function closure based on the `CallInfo` passed in. This will allow client implementations
|
||||
in the future that cache the invoke function for each method type avoiding the overhead of hash table lookup.
|
||||
This would reduce the performance overhead of this inter-module communication method to the bare minimum required for
|
||||
checking permissions.
|
||||
|
||||
To re-iterate, the closure only allows access to authorized calls. There is no access to anything else regardless of any
|
||||
name impersonation.
|
||||
|
||||
Below is a rough sketch of the implementation of `grpc.ClientConn.Invoke` for `RootModuleKey`:
|
||||
|
||||
```go
|
||||
func (key RootModuleKey) Invoke(ctx context.Context, method string, args, reply interface{}, opts ...grpc.CallOption) error {
|
||||
f := key.invoker(CallInfo {Method: method, Caller: ModuleID {ModuleName: key.moduleName}})
|
||||
return f(ctx, args, reply)
|
||||
}
|
||||
```
|
||||
|
||||
### `AppModule` Wiring and Requirements
|
||||
|
||||
In [ADR 031](./adr-031-msg-service.md), the `AppModule.RegisterService(Configurator)` method was introduced. To support
|
||||
inter-module communication, we extend the `Configurator` interface to pass in the `ModuleKey` and to allow modules to
|
||||
specify their dependencies on other modules using `RequireServer()`:
|
||||
|
||||
|
||||
```go
|
||||
type Configurator interface {
|
||||
MsgServer() grpc.Server
|
||||
QueryServer() grpc.Server
|
||||
|
||||
ModuleKey() ModuleKey
|
||||
RequireServer(msgServer interface{})
|
||||
}
|
||||
```
|
||||
|
||||
The `ModuleKey` is passed to modules in the `RegisterService` method itself so that `RegisterServices` serves as a single
|
||||
entry point for configuring module services. This is intended to also have the side-effect of greatly reducing boilerplate in
|
||||
`app.go`. For now, `ModuleKey`s will be created based on `AppModuleBasic.Name()`, but a more flexible system may be
|
||||
introduced in the future. The `ModuleManager` will handle creation of module accounts behind the scenes.
|
||||
|
||||
Because modules do not get direct access to each other anymore, modules may have unfulfilled dependencies. To make sure
|
||||
that module dependencies are resolved at startup, the `Configurator.RequireServer` method should be added. The `ModuleManager`
|
||||
will make sure that all dependencies declared with `RequireServer` can be resolved before the app starts. An example
|
||||
module `foo` could declare it's dependency on `x/bank` like this:
|
||||
|
||||
```go
|
||||
package foo
|
||||
|
||||
func (am AppModule) RegisterServices(cfg Configurator) {
|
||||
cfg.RequireServer((*bank.QueryServer)(nil))
|
||||
cfg.RequireServer((*bank.MsgServer)(nil))
|
||||
}
|
||||
```
|
||||
|
||||
### Security Considerations
|
||||
|
||||
In addition to checking for `ModuleKey` permissions, a few additional security precautions will need to be taken by
|
||||
the underlying router infrastructure.
|
||||
|
||||
#### Recursion and Re-entry
|
||||
|
||||
Recursive or re-entrant method invocations pose a potential security threat. This can be a problem if Module A
|
||||
calls Module B and Module B calls module A again in the same call.
|
||||
|
||||
One basic way for the router system to deal with this is to maintain a call stack which prevents a module from
|
||||
being referenced more than once in the call stack so that there is no re-entry. A `map[string]interface{}` table
|
||||
in the router could be used to perform this security check.
|
||||
|
||||
#### Queries
|
||||
|
||||
Queries in Cosmos SDK are generally un-permissioned so allowing one module to query another module should not pose
|
||||
any major security threats assuming basic precautions are taken. The basic precaution that the router system will
|
||||
need to take is making sure that the `sdk.Context` passed to query methods does not allow writing to the store. This
|
||||
can be done for now with a `CacheMultiStore` as is currently done for `BaseApp` queries.
|
||||
|
||||
### Internal Methods
|
||||
|
||||
In many cases, we may wish for modules to call methods on other modules which are not exposed to clients at all. For this
|
||||
purpose, we add the `InternalServer` method to `Configurator`:
|
||||
|
||||
```go
|
||||
type Configurator interface {
|
||||
MsgServer() grpc.Server
|
||||
QueryServer() grpc.Server
|
||||
InternalServer() grpc.Server
|
||||
}
|
||||
```
|
||||
|
||||
As an example, x/slashing's Slash must call x/staking's Slash, but we don't want to expose x/staking's Slash to end users
|
||||
and clients.
|
||||
|
||||
Internal protobuf services will be defined in a corresponding `internal.proto` file in the given module's
|
||||
proto package.
|
||||
|
||||
Services registered against `InternalServer` will be callable from other modules but not by external clients.
|
||||
|
||||
An alternative solution to internal-only methods could involve hooks / plugins as discussed [here](https://github.com/cosmos/cosmos-sdk/pull/7459#issuecomment-733807753).
|
||||
A more detailed evaluation of a hooks / plugin system will be addressed later in follow-ups to this ADR or as a separate
|
||||
ADR.
|
||||
|
||||
### Authorization
|
||||
|
||||
By default, the inter-module router requires that messages are sent by the first signer returned by `GetSigners`. The
|
||||
inter-module router should also accept authorization middleware such as that provided by [ADR 030](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-030-authz-module.md).
|
||||
This middleware will allow accounts to otherwise specific module accounts to perform actions on their behalf.
|
||||
Authorization middleware should take into account the need to grant certain modules effectively "admin" privileges to
|
||||
other modules. This will be addressed in separate ADRs or updates to this ADR.
|
||||
|
||||
### Future Work
|
||||
|
||||
Other future improvements may include:
|
||||
* custom code generation that:
|
||||
* simplifies interfaces (ex. generates code with `sdk.Context` instead of `context.Context`)
|
||||
* optimizes inter-module calls - for instance caching resolved methods after first invocation
|
||||
* combining `StoreKey`s and `ModuleKey`s into a single interface so that modules have a single OCAPs handle
|
||||
* code generation which makes inter-module communication more performant
|
||||
* decoupling `ModuleKey` creation from `AppModuleBasic.Name()` so that app's can override root module account names
|
||||
* inter-module hooks and plugins
|
||||
|
||||
## Alternatives
|
||||
|
||||
### MsgServices vs `x/capability`
|
||||
|
||||
The `x/capability` module does provide a proper object-capability implementation that can be used by any module in the
|
||||
SDK and could even be used for inter-module OCAPs as described in [\#5931](https://github.com/cosmos/cosmos-sdk/issues/5931).
|
||||
|
||||
The advantages of the approach described in this ADR are mostly around how it integrates with other parts of the SDK,
|
||||
specifically:
|
||||
|
||||
* protobuf so that:
|
||||
* code generation of interfaces can be leveraged for a better dev UX
|
||||
* module interfaces are versioned and checked for breakage using [buf](https://docs.buf.build/breaking-overview)
|
||||
* sub-module accounts as per ADR 028
|
||||
* the general `Msg` passing paradigm and the way signers are specified by `GetSigners`
|
||||
|
||||
Also, this is a complete replacement for keepers and could be applied to _all_ inter-module communication whereas the
|
||||
`x/capability` approach in #5931 would need to be applied method by method.
|
||||
|
||||
## Consequences
|
||||
|
||||
### Backwards Compatibility
|
||||
|
||||
This ADR is intended to provide a pathway to a scenario where there is greater long term compatibility between modules.
|
||||
In the short-term, this will likely result in breaking certain `Keeper` interfaces which are too permissive and/or
|
||||
replacing `Keeper` interfaces altogether.
|
||||
|
||||
### Positive
|
||||
|
||||
- an alternative to keepers which can more easily lead to stable inter-module interfaces
|
||||
- proper inter-module OCAPs
|
||||
- improved module developer DevX, as commented on by several particpants on
|
||||
[Architecture Review Call, Dec 3](https://hackmd.io/E0wxxOvRQ5qVmTf6N_k84Q)
|
||||
- lays the groundwork for what can be a greatly simplified `app.go`
|
||||
- router can be setup to enforce atomic transactions for moule-to-module calls
|
||||
|
||||
### Negative
|
||||
|
||||
- modules which adopt this will need significant refactoring
|
||||
|
||||
### Neutral
|
||||
|
||||
## Test Cases [optional]
|
||||
|
||||
## References
|
||||
|
||||
- [ADR 021](./adr-021-protobuf-query-encoding.md)
|
||||
- [ADR 031](./adr-031-msg-service.md)
|
||||
- [ADR 028](./adr-028-public-key-addresses.md)
|
||||
- [ADR 030 draft](https://github.com/cosmos/cosmos-sdk/pull/7105)
|
||||
- [Object-Capability Model](../docs/core/ocap.md)
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
## Status
|
||||
|
||||
Proposed
|
||||
Accepted
|
||||
|
||||
## Abstract
|
||||
|
||||
@@ -35,7 +35,7 @@ type Vote struct {
|
||||
}
|
||||
```
|
||||
|
||||
And for backwards compatibility, we introduce `MsgWeightedVote` while keeping `MsgVote`.
|
||||
And for backwards compatibility, we introduce `MsgVoteWeighted` while keeping `MsgVote`.
|
||||
```
|
||||
type MsgVote struct {
|
||||
ProposalID int64
|
||||
@@ -43,14 +43,14 @@ type MsgVote struct {
|
||||
Option Option
|
||||
}
|
||||
|
||||
type MsgWeightedVote struct {
|
||||
type MsgVoteWeighted struct {
|
||||
ProposalID int64
|
||||
Voter sdk.Address
|
||||
Options []WeightedVoteOption
|
||||
}
|
||||
```
|
||||
|
||||
The `ValidateBasic` of a `MsgWeightedVote` struct would require that
|
||||
The `ValidateBasic` of a `MsgVoteWeighted` struct would require that
|
||||
1. The sum of all the Rates is equal to 1.0
|
||||
2. No Option is repeated
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ The blockchain full-node presents itself as a binary, generally suffixed by `-d`
|
||||
Once the main binary is built, the node can be started by running the [`start` command](../core/node.md#start-command). This command function primarily does three things:
|
||||
|
||||
1. Create an instance of the state-machine defined in [`app.go`](#core-application-file).
|
||||
2. Initialize the state-machine with the latest known state, extracted from the `db` stored in the `~/.appd/data` folder. At this point, the state-machine is at height `appBlockHeight`.
|
||||
2. Initialize the state-machine with the latest known state, extracted from the `db` stored in the `~/.app/data` folder. At this point, the state-machine is at height `appBlockHeight`.
|
||||
3. Create and start a new Tendermint instance. Among other things, the node will perform a handshake with its peers. It will get the latest `blockHeight` from them, and replay blocks to sync to this height if it is greater than the local `appBlockHeight`. If `appBlockHeight` is `0`, the node is starting from genesis and Tendermint sends an `InitChain` message via the ABCI to the `app`, which triggers the [`InitChainer`](#initchainer).
|
||||
|
||||
## Core Application File
|
||||
@@ -77,7 +77,7 @@ Here are the main actions performed by this function:
|
||||
- Mount the stores.
|
||||
- Return the application.
|
||||
|
||||
Note that this function only creates an instance of the app, while the actual state is either carried over from the `~/.appd/data` folder if the node is restarted, or generated from the genesis file if the node is started for the first time.
|
||||
Note that this function only creates an instance of the app, while the actual state is either carried over from the `~/.app/data` folder if the node is restarted, or generated from the genesis file if the node is started for the first time.
|
||||
|
||||
See an example of application constructor from `simapp`:
|
||||
|
||||
@@ -237,6 +237,18 @@ See an example of an application's main command-line file from the [nameservice
|
||||
|
||||
## Dependencies and Makefile
|
||||
|
||||
::: warning
|
||||
A patch introduced in `go-grpc v1.34.0` made gRPC incompatible with the `gogoproto` library, making some [gRPC queries](https://github.com/cosmos/cosmos-sdk/issues/8426) panic. As such, the SDK requires that `go-grpc <=v1.33.2` is installed in your `go.mod`.
|
||||
|
||||
To make sure that gRPC is working properly, it is **highly recommended** to add the following line in your application's `go.mod`:
|
||||
|
||||
```
|
||||
replace google.golang.org/grpc => google.golang.org/grpc v1.33.2
|
||||
```
|
||||
|
||||
Please see [issue #8392](https://github.com/cosmos/cosmos-sdk/issues/8392) for more info.
|
||||
:::
|
||||
|
||||
This section is optional, as developers are free to choose their dependency manager and project building method. That said, the current most used framework for versioning control is [`go.mod`](https://github.com/golang/go/wiki/Modules). It ensures each of the libraries used throughout the application are imported with the correct version. See an example from the [nameservice tutorial](https://github.com/cosmos/sdk-tutorials/tree/master/nameservice):
|
||||
|
||||
+++ https://github.com/cosmos/sdk-tutorials/blob/c6754a1e313eb1ed973c5c91dcc606f2fd288811/go.mod#L1-L18
|
||||
|
||||
@@ -38,6 +38,18 @@ The CLI understands a specific set of commands, defined in a hierarchical struct
|
||||
|
||||
### gRPC
|
||||
|
||||
::: warning
|
||||
A patch introduced in `go-grpc v1.34.0` made gRPC incompatible with the `gogoproto` library, making some [gRPC queries](https://github.com/cosmos/cosmos-sdk/issues/8426) panic. As such, the SDK requires that `go-grpc <=v1.33.2` is installed in your `go.mod`.
|
||||
|
||||
To make sure that gRPC is working properly, it is **highly recommended** to add the following line in your application's `go.mod`:
|
||||
|
||||
```
|
||||
replace google.golang.org/grpc => google.golang.org/grpc v1.33.2
|
||||
```
|
||||
|
||||
Please see [issue #8392](https://github.com/cosmos/cosmos-sdk/issues/8392) for more info.
|
||||
:::
|
||||
|
||||
Another interface through which users can make queries, introduced in Cosmos SDK v0.40, is [gRPC](https://grpc.io) requests to a [gRPC server](../core/grpc_rest.md#grpc-server). The endpoints are defined as [Protocol Buffers](https://developers.google.com/protocol-buffers) service methods inside `.proto` files, written in Protobuf's own language-agnostic interface definition language (IDL). The Protobuf ecosystem developed tools for code-generation from `*.proto` files into various languages. These tools allow to build gRPC clients easily.
|
||||
|
||||
One such tool is [grpcurl](https://github.com/fullstorydev/grpcurl), and a gRPC request for `MyQuery` using this client looks like:
|
||||
|
||||
@@ -28,7 +28,7 @@ Blockchain Node | | Consensus | |
|
||||
|
||||
1. [`app.go`] 创建了一个状态机实例。
|
||||
|
||||
2. 用最新的已知状态初始化状态机,该状态机是从存储在 `~/.appd/data` 文件夹中的 db 中提取的。 此时,状态机的高度为:`appBlockHeight`。
|
||||
2. 用最新的已知状态初始化状态机,该状态机是从存储在 `~/.app/data` 文件夹中的 db 中提取的。 此时,状态机的高度为:`appBlockHeight`。
|
||||
|
||||
3. 创建并启动一个新的 Tendermint 实例。 该节点将与对等节点进行连接交换信息。 它将从他们那里获取最新的 `blockHeight`,如果它大于本地的 `appBlockHeight`,则重播块以同步到该高度。 如果 `appBlockHeight` 为 `0`,则该节点从创世开始,并且 Tendermint 通过 ABCI 接口向 `app` 发送 `InitChain` 初始化链命令,从而触发 [`InitChainer`](https://docs.cosmos.network/master/basics/app-anatomy.html#initchainer)。
|
||||
|
||||
@@ -73,7 +73,7 @@ Blockchain Node | | Consensus | |
|
||||
- 挂载存储.
|
||||
- 返回应用实例.
|
||||
|
||||
请注意,此函数仅创建该应用的一个实例,而如果重新启动节点,则状态将从 `〜/.appd/data` 文件夹中保留下来状态加载,如果节点是第一次启动,则从创世文件生成。See an example of application constructor from [`gaia`](https://github.com/cosmos/gaia):
|
||||
请注意,此函数仅创建该应用的一个实例,而如果重新启动节点,则状态将从 `〜/.app/data` 文件夹中保留下来状态加载,如果节点是第一次启动,则从创世文件生成。See an example of application constructor from [`gaia`](https://github.com/cosmos/gaia):
|
||||
|
||||
+++ https://github.com/cosmos/gaia/blob/f41a660cdd5bea173139965ade55bd25d1ee3429/app/app.go#L110-L222
|
||||
|
||||
|
||||
@@ -286,7 +286,7 @@ Before the first transaction of a given block is processed, a [volatile state](#
|
||||
1. The `AnteHandler` does **not** check that the transaction's `gas-prices` is sufficient. That is because the `min-gas-prices` value `gas-prices` is checked against is local to the node, and therefore what is enough for one full-node might not be for another. This means that the proposer can potentially include transactions for free, although they are not incentivised to do so, as they earn a bonus on the total fee of the block they propose.
|
||||
2. For each `Msg` in the transaction, route to the appropriate module's [`Msg` service](../building-modules/msg-services.md). Additional _stateful_ checks are performed, and the branched multistore held in `deliverState`'s `context` is updated by the module's `keeper`. If the `Msg` service returns successfully, the branched multistore held in `context` is written to `deliverState` `CacheMultiStore`.
|
||||
|
||||
During step 5., each read/write to the store increases the value of `GasConsumed`. You can find the default cost of each operation:
|
||||
During the additional fifth step outlined in (2), each read/write to the store increases the value of `GasConsumed`. You can find the default cost of each operation:
|
||||
|
||||
+++ https://github.com/cosmos/cosmos-sdk/blob/v0.40.0-rc3/store/types/gas.go#L153-L162
|
||||
|
||||
|
||||
+1
-1
@@ -96,7 +96,7 @@ This `queryCmd` function adds all the queries available to end-users for the app
|
||||
|
||||
Here is an example of a `queryCmd` aggregating subcommands from the `simapp` application:
|
||||
|
||||
+++ https://github.com/cosmos/cosmos-sdk/blob/0.40.0/simapp/simd/cmd/root.go#L99-L121
|
||||
+++ https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/simapp/simd/cmd/root.go#L99-L121
|
||||
|
||||
## Flags
|
||||
|
||||
|
||||
+1
-1
@@ -19,7 +19,7 @@ take the form of: `{eventType}.{eventAttribute}={value}`.
|
||||
|
||||
Events contain:
|
||||
|
||||
- A `type`, which is meant to categorize an event at a high-level (e.g. by module or action).
|
||||
- A `type`, which is meant to categorize an event at a high-level (e.g. by module (e.g. `module=bank`) or action (e.g. `action=/cosmos.bank.v1beta1.Msg/Send`)).
|
||||
- A list of `attributes`, which are key-value pairs that give more information about
|
||||
the categorized `event`.
|
||||
+++ https://github.com/cosmos/cosmos-sdk/blob/7d7821b9af132b0f6131640195326aa02b6751db/types/events.go#L51-L56
|
||||
|
||||
+16
-4
@@ -20,16 +20,28 @@ The node also exposes some other endpoints, such as the Tendermint P2P endpoint,
|
||||
|
||||
## gRPC Server
|
||||
|
||||
::: warning
|
||||
A patch introduced in `go-grpc v1.34.0` made gRPC incompatible with the `gogoproto` library, making some [gRPC queries](https://github.com/cosmos/cosmos-sdk/issues/8426) panic. As such, the SDK requires that `go-grpc <=v1.33.2` is installed in your `go.mod`.
|
||||
|
||||
To make sure that gRPC is working properly, it is **highly recommended** to add the following line in your application's `go.mod`:
|
||||
|
||||
```
|
||||
replace google.golang.org/grpc => google.golang.org/grpc v1.33.2
|
||||
```
|
||||
|
||||
Please see [issue #8392](https://github.com/cosmos/cosmos-sdk/issues/8392) for more info.
|
||||
:::
|
||||
|
||||
Cosmos SDK v0.40 introduced Protobuf as the main [encoding](./encoding) library, and this brings a wide range of Protobuf-based tools that can be plugged into the SDK. One such tool is [gRPC](https://grpc.io), a modern open source high performance RPC framework that has decent client support in several languages.
|
||||
|
||||
Each module exposes [`Msg` and `Query` Protobuf services](../building-modules/messages-and-queries.md) to define state transitions and state queries. These services are hooked up to gRPC via the following function inside the application:
|
||||
|
||||
https://github.com/cosmos/cosmos-sdk/blob/v0.40.0-rc4/server/types/app.go#L39-L41
|
||||
<https://github.com/cosmos/cosmos-sdk/blob/v0.41.0/server/types/app.go#L39-L41>
|
||||
|
||||
The `grpc.Server` is a concrete gRPC server, which spawns and serves any gRPC requests. This server can be configured inside `~/.simapp/config/app.toml`:
|
||||
|
||||
- `grpc.enable = true|false` field defines if the gRPC server should be enabled. Defaults to `true`.
|
||||
- `grpc.address = {string}` field defines the address (really, the port, since the host should be kept at `0.0.0.0`) the server should bind to. Defaults to `0.0.0.0:9000`.
|
||||
- `grpc.address = {string}` field defines the address (really, the port, since the host should be kept at `0.0.0.0`) the server should bind to. Defaults to `0.0.0.0:9090`.
|
||||
|
||||
::tip
|
||||
`~/.simapp` is the directory where the node's configuration and databases are stored. By default, it's set to `~/.{app_name}`.
|
||||
@@ -45,7 +57,7 @@ In Cosmos SDK v0.40, the node continues to serve a REST server. However, the exi
|
||||
|
||||
All routes are configured under the following fields in `~/.simapp/config/app.toml`:
|
||||
|
||||
- `api.enable = true|false` field defines if the REST server should be enabled. Defaults to `true`.
|
||||
- `api.enable = true|false` field defines if the REST server should be enabled. Defaults to `false`.
|
||||
- `api.address = {string}` field defines the address (really, the port, since the host should be kept at `0.0.0.0`) the server should bind to. Defaults to `tcp://0.0.0.0:1317`.
|
||||
- some additional API configuration options are defined in `~/.simapp/config/app.toml`, along with comments, please refer to that file directly.
|
||||
|
||||
@@ -55,7 +67,7 @@ If, for various reasons, you cannot use gRPC (for example, you are building a we
|
||||
|
||||
[gRPC-gateway](https://grpc-ecosystem.github.io/grpc-gateway/) is a tool to expose gRPC endpoints as REST endpoints. For each RPC endpoint defined in a Protobuf service, the SDK offers a REST equivalent. For instance, querying a balance could be done via the `/cosmos.bank.v1beta1.Query/AllBalances` gRPC endpoint, or alternatively via the gRPC-gateway `"/cosmos/bank/v1beta1/balances/{address}"` REST endpoint: both will return the same result. For each RPC method defined in a Protobuf service, the corresponding REST endpoint is defined as an option:
|
||||
|
||||
+++ https://github.com/cosmos/cosmos-sdk/blob/v0.40.0-rc4/proto/cosmos/bank/v1beta1/query.proto#L19-L22
|
||||
+++ <https://github.com/cosmos/cosmos-sdk/blob/v0.41.0/proto/cosmos/bank/v1beta1/query.proto#L19-L22>
|
||||
|
||||
For application developers, gRPC-gateway REST routes needs to be wired up to the REST server, this is done by calling the `RegisterGRPCGatewayRoutes` function on the ModuleManager.
|
||||
|
||||
|
||||
+438
-264
@@ -12,24 +12,35 @@
|
||||
- [cosmos/auth/v1beta1/genesis.proto](#cosmos/auth/v1beta1/genesis.proto)
|
||||
- [GenesisState](#cosmos.auth.v1beta1.GenesisState)
|
||||
|
||||
- [cosmos/base/query/v1beta1/pagination.proto](#cosmos/base/query/v1beta1/pagination.proto)
|
||||
- [PageRequest](#cosmos.base.query.v1beta1.PageRequest)
|
||||
- [PageResponse](#cosmos.base.query.v1beta1.PageResponse)
|
||||
|
||||
- [cosmos/auth/v1beta1/query.proto](#cosmos/auth/v1beta1/query.proto)
|
||||
- [QueryAccountRequest](#cosmos.auth.v1beta1.QueryAccountRequest)
|
||||
- [QueryAccountResponse](#cosmos.auth.v1beta1.QueryAccountResponse)
|
||||
- [QueryAccountsRequest](#cosmos.auth.v1beta1.QueryAccountsRequest)
|
||||
- [QueryAccountsResponse](#cosmos.auth.v1beta1.QueryAccountsResponse)
|
||||
- [QueryParamsRequest](#cosmos.auth.v1beta1.QueryParamsRequest)
|
||||
- [QueryParamsResponse](#cosmos.auth.v1beta1.QueryParamsResponse)
|
||||
|
||||
- [Query](#cosmos.auth.v1beta1.Query)
|
||||
|
||||
- [cosmos/base/v1beta1/coin.proto](#cosmos/base/v1beta1/coin.proto)
|
||||
- [Coin](#cosmos.base.v1beta1.Coin)
|
||||
- [DecCoin](#cosmos.base.v1beta1.DecCoin)
|
||||
- [DecProto](#cosmos.base.v1beta1.DecProto)
|
||||
- [IntProto](#cosmos.base.v1beta1.IntProto)
|
||||
|
||||
- [cosmos/authz/v1beta1/authz.proto](#cosmos/authz/v1beta1/authz.proto)
|
||||
- [AuthorizationGrant](#cosmos.authz.v1beta1.AuthorizationGrant)
|
||||
- [GenericAuthorization](#cosmos.authz.v1beta1.GenericAuthorization)
|
||||
- [SendAuthorization](#cosmos.authz.v1beta1.SendAuthorization)
|
||||
|
||||
- [cosmos/authz/v1beta1/genesis.proto](#cosmos/authz/v1beta1/genesis.proto)
|
||||
- [GenesisState](#cosmos.authz.v1beta1.GenesisState)
|
||||
- [GrantAuthorization](#cosmos.authz.v1beta1.GrantAuthorization)
|
||||
|
||||
- [cosmos/authz/v1beta1/query.proto](#cosmos/authz/v1beta1/query.proto)
|
||||
- [QueryAuthorizationRequest](#cosmos.authz.v1beta1.QueryAuthorizationRequest)
|
||||
- [QueryAuthorizationResponse](#cosmos.authz.v1beta1.QueryAuthorizationResponse)
|
||||
- [QueryAuthorizationsRequest](#cosmos.authz.v1beta1.QueryAuthorizationsRequest)
|
||||
- [QueryAuthorizationsResponse](#cosmos.authz.v1beta1.QueryAuthorizationsResponse)
|
||||
|
||||
- [Query](#cosmos.authz.v1beta1.Query)
|
||||
|
||||
- [cosmos/base/abci/v1beta1/abci.proto](#cosmos/base/abci/v1beta1/abci.proto)
|
||||
- [ABCIMessageLog](#cosmos.base.abci.v1beta1.ABCIMessageLog)
|
||||
@@ -53,21 +64,14 @@
|
||||
|
||||
- [Msg](#cosmos.authz.v1beta1.Msg)
|
||||
|
||||
- [cosmos/authz/v1beta1/genesis.proto](#cosmos/authz/v1beta1/genesis.proto)
|
||||
- [GenesisState](#cosmos.authz.v1beta1.GenesisState)
|
||||
- [GrantAuthorization](#cosmos.authz.v1beta1.GrantAuthorization)
|
||||
- [cosmos/base/v1beta1/coin.proto](#cosmos/base/v1beta1/coin.proto)
|
||||
- [Coin](#cosmos.base.v1beta1.Coin)
|
||||
- [DecCoin](#cosmos.base.v1beta1.DecCoin)
|
||||
- [DecProto](#cosmos.base.v1beta1.DecProto)
|
||||
- [IntProto](#cosmos.base.v1beta1.IntProto)
|
||||
|
||||
- [cosmos/base/query/v1beta1/pagination.proto](#cosmos/base/query/v1beta1/pagination.proto)
|
||||
- [PageRequest](#cosmos.base.query.v1beta1.PageRequest)
|
||||
- [PageResponse](#cosmos.base.query.v1beta1.PageResponse)
|
||||
|
||||
- [cosmos/authz/v1beta1/query.proto](#cosmos/authz/v1beta1/query.proto)
|
||||
- [QueryAuthorizationRequest](#cosmos.authz.v1beta1.QueryAuthorizationRequest)
|
||||
- [QueryAuthorizationResponse](#cosmos.authz.v1beta1.QueryAuthorizationResponse)
|
||||
- [QueryAuthorizationsRequest](#cosmos.authz.v1beta1.QueryAuthorizationsRequest)
|
||||
- [QueryAuthorizationsResponse](#cosmos.authz.v1beta1.QueryAuthorizationsResponse)
|
||||
|
||||
- [Query](#cosmos.authz.v1beta1.Query)
|
||||
- [cosmos/bank/v1beta1/authz.proto](#cosmos/bank/v1beta1/authz.proto)
|
||||
- [SendAuthorization](#cosmos.bank.v1beta1.SendAuthorization)
|
||||
|
||||
- [cosmos/bank/v1beta1/bank.proto](#cosmos/bank/v1beta1/bank.proto)
|
||||
- [DenomUnit](#cosmos.bank.v1beta1.DenomUnit)
|
||||
@@ -302,6 +306,7 @@
|
||||
- [TextProposal](#cosmos.gov.v1beta1.TextProposal)
|
||||
- [Vote](#cosmos.gov.v1beta1.Vote)
|
||||
- [VotingParams](#cosmos.gov.v1beta1.VotingParams)
|
||||
- [WeightedVoteOption](#cosmos.gov.v1beta1.WeightedVoteOption)
|
||||
|
||||
- [ProposalStatus](#cosmos.gov.v1beta1.ProposalStatus)
|
||||
- [VoteOption](#cosmos.gov.v1beta1.VoteOption)
|
||||
@@ -336,6 +341,8 @@
|
||||
- [MsgSubmitProposalResponse](#cosmos.gov.v1beta1.MsgSubmitProposalResponse)
|
||||
- [MsgVote](#cosmos.gov.v1beta1.MsgVote)
|
||||
- [MsgVoteResponse](#cosmos.gov.v1beta1.MsgVoteResponse)
|
||||
- [MsgVoteWeighted](#cosmos.gov.v1beta1.MsgVoteWeighted)
|
||||
- [MsgVoteWeightedResponse](#cosmos.gov.v1beta1.MsgVoteWeightedResponse)
|
||||
|
||||
- [Msg](#cosmos.gov.v1beta1.Msg)
|
||||
|
||||
@@ -392,6 +399,12 @@
|
||||
|
||||
- [Msg](#cosmos.slashing.v1beta1.Msg)
|
||||
|
||||
- [cosmos/staking/v1beta1/authz.proto](#cosmos/staking/v1beta1/authz.proto)
|
||||
- [StakeAuthorization](#cosmos.staking.v1beta1.StakeAuthorization)
|
||||
- [StakeAuthorization.Validators](#cosmos.staking.v1beta1.StakeAuthorization.Validators)
|
||||
|
||||
- [AuthorizationType](#cosmos.staking.v1beta1.AuthorizationType)
|
||||
|
||||
- [cosmos/staking/v1beta1/staking.proto](#cosmos/staking/v1beta1/staking.proto)
|
||||
- [Commission](#cosmos.staking.v1beta1.Commission)
|
||||
- [CommissionRates](#cosmos.staking.v1beta1.CommissionRates)
|
||||
@@ -837,6 +850,68 @@ GenesisState defines the auth module's genesis state.
|
||||
|
||||
|
||||
|
||||
<!-- end messages -->
|
||||
|
||||
<!-- end enums -->
|
||||
|
||||
<!-- end HasExtensions -->
|
||||
|
||||
<!-- end services -->
|
||||
|
||||
|
||||
|
||||
<a name="cosmos/base/query/v1beta1/pagination.proto"></a>
|
||||
<p align="right"><a href="#top">Top</a></p>
|
||||
|
||||
## cosmos/base/query/v1beta1/pagination.proto
|
||||
|
||||
|
||||
|
||||
<a name="cosmos.base.query.v1beta1.PageRequest"></a>
|
||||
|
||||
### PageRequest
|
||||
PageRequest is to be embedded in gRPC request messages for efficient
|
||||
pagination. Ex:
|
||||
|
||||
message SomeRequest {
|
||||
Foo some_parameter = 1;
|
||||
PageRequest pagination = 2;
|
||||
}
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| `key` | [bytes](#bytes) | | key is a value returned in PageResponse.next_key to begin querying the next page most efficiently. Only one of offset or key should be set. |
|
||||
| `offset` | [uint64](#uint64) | | offset is a numeric offset that can be used when key is unavailable. It is less efficient than using key. Only one of offset or key should be set. |
|
||||
| `limit` | [uint64](#uint64) | | limit is the total number of results to be returned in the result page. If left empty it will default to a value to be set by each app. |
|
||||
| `count_total` | [bool](#bool) | | count_total is set to true to indicate that the result set should include a count of the total number of items available for pagination in UIs. count_total is only respected when offset is used. It is ignored when key is set. |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a name="cosmos.base.query.v1beta1.PageResponse"></a>
|
||||
|
||||
### PageResponse
|
||||
PageResponse is to be embedded in gRPC response messages where the
|
||||
corresponding request message has used PageRequest.
|
||||
|
||||
message SomeResponse {
|
||||
repeated Bar results = 1;
|
||||
PageResponse page = 2;
|
||||
}
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| `next_key` | [bytes](#bytes) | | next_key is the key to be passed to PageRequest.key to query the next page most efficiently |
|
||||
| `total` | [uint64](#uint64) | | total is total number of results available if PageRequest.count_total was set, its value is undefined otherwise |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- end messages -->
|
||||
|
||||
<!-- end enums -->
|
||||
@@ -884,6 +959,37 @@ QueryAccountResponse is the response type for the Query/Account RPC method.
|
||||
|
||||
|
||||
|
||||
<a name="cosmos.auth.v1beta1.QueryAccountsRequest"></a>
|
||||
|
||||
### QueryAccountsRequest
|
||||
QueryAccountsRequest is the request type for the Query/Accounts RPC method.
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| `pagination` | [cosmos.base.query.v1beta1.PageRequest](#cosmos.base.query.v1beta1.PageRequest) | | pagination defines an optional pagination for the request. |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a name="cosmos.auth.v1beta1.QueryAccountsResponse"></a>
|
||||
|
||||
### QueryAccountsResponse
|
||||
QueryAccountsResponse is the response type for the Query/Accounts RPC method.
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| `accounts` | [google.protobuf.Any](#google.protobuf.Any) | repeated | accounts are the existing accounts |
|
||||
| `pagination` | [cosmos.base.query.v1beta1.PageResponse](#cosmos.base.query.v1beta1.PageResponse) | | pagination defines the pagination in the response. |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a name="cosmos.auth.v1beta1.QueryParamsRequest"></a>
|
||||
|
||||
### QueryParamsRequest
|
||||
@@ -922,6 +1028,7 @@ Query defines the gRPC querier service.
|
||||
|
||||
| Method Name | Request Type | Response Type | Description | HTTP Verb | Endpoint |
|
||||
| ----------- | ------------ | ------------- | ------------| ------- | -------- |
|
||||
| `Accounts` | [QueryAccountsRequest](#cosmos.auth.v1beta1.QueryAccountsRequest) | [QueryAccountsResponse](#cosmos.auth.v1beta1.QueryAccountsResponse) | Accounts returns all the existing accounts | GET|/cosmos/auth/v1beta1/accounts|
|
||||
| `Account` | [QueryAccountRequest](#cosmos.auth.v1beta1.QueryAccountRequest) | [QueryAccountResponse](#cosmos.auth.v1beta1.QueryAccountResponse) | Account returns account details based on address. | GET|/cosmos/auth/v1beta1/accounts/{address}|
|
||||
| `Params` | [QueryParamsRequest](#cosmos.auth.v1beta1.QueryParamsRequest) | [QueryParamsResponse](#cosmos.auth.v1beta1.QueryParamsResponse) | Params queries all parameters. | GET|/cosmos/auth/v1beta1/params|
|
||||
|
||||
@@ -929,90 +1036,6 @@ Query defines the gRPC querier service.
|
||||
|
||||
|
||||
|
||||
<a name="cosmos/base/v1beta1/coin.proto"></a>
|
||||
<p align="right"><a href="#top">Top</a></p>
|
||||
|
||||
## cosmos/base/v1beta1/coin.proto
|
||||
|
||||
|
||||
|
||||
<a name="cosmos.base.v1beta1.Coin"></a>
|
||||
|
||||
### Coin
|
||||
Coin defines a token with a denomination and an amount.
|
||||
|
||||
NOTE: The amount field is an Int which implements the custom method
|
||||
signatures required by gogoproto.
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| `denom` | [string](#string) | | |
|
||||
| `amount` | [string](#string) | | |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a name="cosmos.base.v1beta1.DecCoin"></a>
|
||||
|
||||
### DecCoin
|
||||
DecCoin defines a token with a denomination and a decimal amount.
|
||||
|
||||
NOTE: The amount field is an Dec which implements the custom method
|
||||
signatures required by gogoproto.
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| `denom` | [string](#string) | | |
|
||||
| `amount` | [string](#string) | | |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a name="cosmos.base.v1beta1.DecProto"></a>
|
||||
|
||||
### DecProto
|
||||
DecProto defines a Protobuf wrapper around a Dec object.
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| `dec` | [string](#string) | | |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a name="cosmos.base.v1beta1.IntProto"></a>
|
||||
|
||||
### IntProto
|
||||
IntProto defines a Protobuf wrapper around an Int object.
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| `int` | [string](#string) | | |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- end messages -->
|
||||
|
||||
<!-- end enums -->
|
||||
|
||||
<!-- end HasExtensions -->
|
||||
|
||||
<!-- end services -->
|
||||
|
||||
|
||||
|
||||
<a name="cosmos/authz/v1beta1/authz.proto"></a>
|
||||
<p align="right"><a href="#top">Top</a></p>
|
||||
|
||||
@@ -1052,17 +1075,50 @@ the provided method on behalf of the granter's account.
|
||||
|
||||
|
||||
|
||||
<!-- end messages -->
|
||||
|
||||
<a name="cosmos.authz.v1beta1.SendAuthorization"></a>
|
||||
<!-- end enums -->
|
||||
|
||||
### SendAuthorization
|
||||
SendAuthorization allows the grantee to spend up to spend_limit coins from
|
||||
the granter's account.
|
||||
<!-- end HasExtensions -->
|
||||
|
||||
<!-- end services -->
|
||||
|
||||
|
||||
|
||||
<a name="cosmos/authz/v1beta1/genesis.proto"></a>
|
||||
<p align="right"><a href="#top">Top</a></p>
|
||||
|
||||
## cosmos/authz/v1beta1/genesis.proto
|
||||
|
||||
|
||||
|
||||
<a name="cosmos.authz.v1beta1.GenesisState"></a>
|
||||
|
||||
### GenesisState
|
||||
GenesisState defines the authz module's genesis state.
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| `spend_limit` | [cosmos.base.v1beta1.Coin](#cosmos.base.v1beta1.Coin) | repeated | |
|
||||
| `authorization` | [GrantAuthorization](#cosmos.authz.v1beta1.GrantAuthorization) | repeated | |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a name="cosmos.authz.v1beta1.GrantAuthorization"></a>
|
||||
|
||||
### GrantAuthorization
|
||||
GrantAuthorization defines the GenesisState/GrantAuthorization type.
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| `granter` | [string](#string) | | |
|
||||
| `grantee` | [string](#string) | | |
|
||||
| `authorization` | [google.protobuf.Any](#google.protobuf.Any) | | |
|
||||
| `expiration` | [google.protobuf.Timestamp](#google.protobuf.Timestamp) | | |
|
||||
|
||||
|
||||
|
||||
@@ -1078,6 +1134,98 @@ the granter's account.
|
||||
|
||||
|
||||
|
||||
<a name="cosmos/authz/v1beta1/query.proto"></a>
|
||||
<p align="right"><a href="#top">Top</a></p>
|
||||
|
||||
## cosmos/authz/v1beta1/query.proto
|
||||
|
||||
|
||||
|
||||
<a name="cosmos.authz.v1beta1.QueryAuthorizationRequest"></a>
|
||||
|
||||
### QueryAuthorizationRequest
|
||||
QueryAuthorizationRequest is the request type for the Query/Authorization RPC method.
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| `granter` | [string](#string) | | |
|
||||
| `grantee` | [string](#string) | | |
|
||||
| `method_name` | [string](#string) | | |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a name="cosmos.authz.v1beta1.QueryAuthorizationResponse"></a>
|
||||
|
||||
### QueryAuthorizationResponse
|
||||
QueryAuthorizationResponse is the response type for the Query/Authorization RPC method.
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| `authorization` | [AuthorizationGrant](#cosmos.authz.v1beta1.AuthorizationGrant) | | authorization is a authorization granted for grantee by granter. |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a name="cosmos.authz.v1beta1.QueryAuthorizationsRequest"></a>
|
||||
|
||||
### QueryAuthorizationsRequest
|
||||
QueryAuthorizationsRequest is the request type for the Query/Authorizations RPC method.
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| `granter` | [string](#string) | | |
|
||||
| `grantee` | [string](#string) | | |
|
||||
| `pagination` | [cosmos.base.query.v1beta1.PageRequest](#cosmos.base.query.v1beta1.PageRequest) | | pagination defines an pagination for the request. |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a name="cosmos.authz.v1beta1.QueryAuthorizationsResponse"></a>
|
||||
|
||||
### QueryAuthorizationsResponse
|
||||
QueryAuthorizationsResponse is the response type for the Query/Authorizations RPC method.
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| `authorizations` | [AuthorizationGrant](#cosmos.authz.v1beta1.AuthorizationGrant) | repeated | authorizations is a list of grants granted for grantee by granter. |
|
||||
| `pagination` | [cosmos.base.query.v1beta1.PageResponse](#cosmos.base.query.v1beta1.PageResponse) | | pagination defines an pagination for the response. |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- end messages -->
|
||||
|
||||
<!-- end enums -->
|
||||
|
||||
<!-- end HasExtensions -->
|
||||
|
||||
|
||||
<a name="cosmos.authz.v1beta1.Query"></a>
|
||||
|
||||
### Query
|
||||
Query defines the gRPC querier service.
|
||||
|
||||
| Method Name | Request Type | Response Type | Description | HTTP Verb | Endpoint |
|
||||
| ----------- | ------------ | ------------- | ------------| ------- | -------- |
|
||||
| `Authorization` | [QueryAuthorizationRequest](#cosmos.authz.v1beta1.QueryAuthorizationRequest) | [QueryAuthorizationResponse](#cosmos.authz.v1beta1.QueryAuthorizationResponse) | Returns any `Authorization` (or `nil`), with the expiration time, granted to the grantee by the granter for the provided msg type. | GET|/cosmos/authz/v1beta1/granters/{granter}/grantees/{grantee}/grant|
|
||||
| `Authorizations` | [QueryAuthorizationsRequest](#cosmos.authz.v1beta1.QueryAuthorizationsRequest) | [QueryAuthorizationsResponse](#cosmos.authz.v1beta1.QueryAuthorizationsResponse) | Returns list of `Authorization`, granted to the grantee by the granter. | GET|/cosmos/authz/v1beta1/granters/{granter}/grantees/{grantee}/grants|
|
||||
|
||||
<!-- end services -->
|
||||
|
||||
|
||||
|
||||
<a name="cosmos/base/abci/v1beta1/abci.proto"></a>
|
||||
<p align="right"><a href="#top">Top</a></p>
|
||||
|
||||
@@ -1393,40 +1541,75 @@ Msg defines the authz Msg service.
|
||||
|
||||
|
||||
|
||||
<a name="cosmos/authz/v1beta1/genesis.proto"></a>
|
||||
<a name="cosmos/base/v1beta1/coin.proto"></a>
|
||||
<p align="right"><a href="#top">Top</a></p>
|
||||
|
||||
## cosmos/authz/v1beta1/genesis.proto
|
||||
## cosmos/base/v1beta1/coin.proto
|
||||
|
||||
|
||||
|
||||
<a name="cosmos.authz.v1beta1.GenesisState"></a>
|
||||
<a name="cosmos.base.v1beta1.Coin"></a>
|
||||
|
||||
### GenesisState
|
||||
GenesisState defines the authz module's genesis state.
|
||||
### Coin
|
||||
Coin defines a token with a denomination and an amount.
|
||||
|
||||
NOTE: The amount field is an Int which implements the custom method
|
||||
signatures required by gogoproto.
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| `authorization` | [GrantAuthorization](#cosmos.authz.v1beta1.GrantAuthorization) | repeated | |
|
||||
| `denom` | [string](#string) | | |
|
||||
| `amount` | [string](#string) | | |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a name="cosmos.authz.v1beta1.GrantAuthorization"></a>
|
||||
<a name="cosmos.base.v1beta1.DecCoin"></a>
|
||||
|
||||
### GrantAuthorization
|
||||
GrantAuthorization defines the GenesisState/GrantAuthorization type.
|
||||
### DecCoin
|
||||
DecCoin defines a token with a denomination and a decimal amount.
|
||||
|
||||
NOTE: The amount field is an Dec which implements the custom method
|
||||
signatures required by gogoproto.
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| `granter` | [string](#string) | | |
|
||||
| `grantee` | [string](#string) | | |
|
||||
| `authorization` | [google.protobuf.Any](#google.protobuf.Any) | | |
|
||||
| `expiration` | [google.protobuf.Timestamp](#google.protobuf.Timestamp) | | |
|
||||
| `denom` | [string](#string) | | |
|
||||
| `amount` | [string](#string) | | |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a name="cosmos.base.v1beta1.DecProto"></a>
|
||||
|
||||
### DecProto
|
||||
DecProto defines a Protobuf wrapper around a Dec object.
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| `dec` | [string](#string) | | |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a name="cosmos.base.v1beta1.IntProto"></a>
|
||||
|
||||
### IntProto
|
||||
IntProto defines a Protobuf wrapper around an Int object.
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| `int` | [string](#string) | | |
|
||||
|
||||
|
||||
|
||||
@@ -1442,53 +1625,23 @@ GrantAuthorization defines the GenesisState/GrantAuthorization type.
|
||||
|
||||
|
||||
|
||||
<a name="cosmos/base/query/v1beta1/pagination.proto"></a>
|
||||
<a name="cosmos/bank/v1beta1/authz.proto"></a>
|
||||
<p align="right"><a href="#top">Top</a></p>
|
||||
|
||||
## cosmos/base/query/v1beta1/pagination.proto
|
||||
## cosmos/bank/v1beta1/authz.proto
|
||||
|
||||
|
||||
|
||||
<a name="cosmos.base.query.v1beta1.PageRequest"></a>
|
||||
<a name="cosmos.bank.v1beta1.SendAuthorization"></a>
|
||||
|
||||
### PageRequest
|
||||
PageRequest is to be embedded in gRPC request messages for efficient
|
||||
pagination. Ex:
|
||||
|
||||
message SomeRequest {
|
||||
Foo some_parameter = 1;
|
||||
PageRequest pagination = 2;
|
||||
}
|
||||
### SendAuthorization
|
||||
SendAuthorization allows the grantee to spend up to spend_limit coins from
|
||||
the granter's account.
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| `key` | [bytes](#bytes) | | key is a value returned in PageResponse.next_key to begin querying the next page most efficiently. Only one of offset or key should be set. |
|
||||
| `offset` | [uint64](#uint64) | | offset is a numeric offset that can be used when key is unavailable. It is less efficient than using key. Only one of offset or key should be set. |
|
||||
| `limit` | [uint64](#uint64) | | limit is the total number of results to be returned in the result page. If left empty it will default to a value to be set by each app. |
|
||||
| `count_total` | [bool](#bool) | | count_total is set to true to indicate that the result set should include a count of the total number of items available for pagination in UIs. count_total is only respected when offset is used. It is ignored when key is set. |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a name="cosmos.base.query.v1beta1.PageResponse"></a>
|
||||
|
||||
### PageResponse
|
||||
PageResponse is to be embedded in gRPC response messages where the
|
||||
corresponding request message has used PageRequest.
|
||||
|
||||
message SomeResponse {
|
||||
repeated Bar results = 1;
|
||||
PageResponse page = 2;
|
||||
}
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| `next_key` | [bytes](#bytes) | | next_key is the key to be passed to PageRequest.key to query the next page most efficiently |
|
||||
| `total` | [uint64](#uint64) | | total is total number of results available if PageRequest.count_total was set, its value is undefined otherwise |
|
||||
| `spend_limit` | [cosmos.base.v1beta1.Coin](#cosmos.base.v1beta1.Coin) | repeated | |
|
||||
|
||||
|
||||
|
||||
@@ -1504,98 +1657,6 @@ corresponding request message has used PageRequest.
|
||||
|
||||
|
||||
|
||||
<a name="cosmos/authz/v1beta1/query.proto"></a>
|
||||
<p align="right"><a href="#top">Top</a></p>
|
||||
|
||||
## cosmos/authz/v1beta1/query.proto
|
||||
|
||||
|
||||
|
||||
<a name="cosmos.authz.v1beta1.QueryAuthorizationRequest"></a>
|
||||
|
||||
### QueryAuthorizationRequest
|
||||
QueryAuthorizationRequest is the request type for the Query/Authorization RPC method.
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| `granter` | [string](#string) | | |
|
||||
| `grantee` | [string](#string) | | |
|
||||
| `method_name` | [string](#string) | | |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a name="cosmos.authz.v1beta1.QueryAuthorizationResponse"></a>
|
||||
|
||||
### QueryAuthorizationResponse
|
||||
QueryAuthorizationResponse is the response type for the Query/Authorization RPC method.
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| `authorization` | [AuthorizationGrant](#cosmos.authz.v1beta1.AuthorizationGrant) | | authorization is a authorization granted for grantee by granter. |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a name="cosmos.authz.v1beta1.QueryAuthorizationsRequest"></a>
|
||||
|
||||
### QueryAuthorizationsRequest
|
||||
QueryAuthorizationsRequest is the request type for the Query/Authorizations RPC method.
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| `granter` | [string](#string) | | |
|
||||
| `grantee` | [string](#string) | | |
|
||||
| `pagination` | [cosmos.base.query.v1beta1.PageRequest](#cosmos.base.query.v1beta1.PageRequest) | | pagination defines an pagination for the request. |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a name="cosmos.authz.v1beta1.QueryAuthorizationsResponse"></a>
|
||||
|
||||
### QueryAuthorizationsResponse
|
||||
QueryAuthorizationsResponse is the response type for the Query/Authorizations RPC method.
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| `authorizations` | [AuthorizationGrant](#cosmos.authz.v1beta1.AuthorizationGrant) | repeated | authorizations is a list of grants granted for grantee by granter. |
|
||||
| `pagination` | [cosmos.base.query.v1beta1.PageResponse](#cosmos.base.query.v1beta1.PageResponse) | | pagination defines an pagination for the response. |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- end messages -->
|
||||
|
||||
<!-- end enums -->
|
||||
|
||||
<!-- end HasExtensions -->
|
||||
|
||||
|
||||
<a name="cosmos.authz.v1beta1.Query"></a>
|
||||
|
||||
### Query
|
||||
Query defines the gRPC querier service.
|
||||
|
||||
| Method Name | Request Type | Response Type | Description | HTTP Verb | Endpoint |
|
||||
| ----------- | ------------ | ------------- | ------------| ------- | -------- |
|
||||
| `Authorization` | [QueryAuthorizationRequest](#cosmos.authz.v1beta1.QueryAuthorizationRequest) | [QueryAuthorizationResponse](#cosmos.authz.v1beta1.QueryAuthorizationResponse) | Returns any `Authorization` (or `nil`), with the expiration time, granted to the grantee by the granter for the provided msg type. | GET|/cosmos/authz/v1beta1/granters/{granter}/grantees/{grantee}/grant|
|
||||
| `Authorizations` | [QueryAuthorizationsRequest](#cosmos.authz.v1beta1.QueryAuthorizationsRequest) | [QueryAuthorizationsResponse](#cosmos.authz.v1beta1.QueryAuthorizationsResponse) | Returns list of `Authorization`, granted to the grantee by the granter. | GET|/cosmos/authz/v1beta1/granters/{granter}/grantees/{grantee}/grants|
|
||||
|
||||
<!-- end services -->
|
||||
|
||||
|
||||
|
||||
<a name="cosmos/bank/v1beta1/bank.proto"></a>
|
||||
<p align="right"><a href="#top">Top</a></p>
|
||||
|
||||
@@ -1650,6 +1711,8 @@ a basic token.
|
||||
| `denom_units` | [DenomUnit](#cosmos.bank.v1beta1.DenomUnit) | repeated | denom_units represents the list of DenomUnit's for a given coin |
|
||||
| `base` | [string](#string) | | base represents the base denom (should be the DenomUnit with exponent = 0). |
|
||||
| `display` | [string](#string) | | display indicates the suggested denom that should be displayed in clients. |
|
||||
| `name` | [string](#string) | | name defines the name of the token (eg: Cosmos Atom) |
|
||||
| `symbol` | [string](#string) | | symbol is the token symbol usually shown on exchanges (eg: ATOM). This can be the same as the display. |
|
||||
|
||||
|
||||
|
||||
@@ -2882,7 +2945,8 @@ Msg defines the bank Msg service.
|
||||
<a name="cosmos.crypto.ed25519.PrivKey"></a>
|
||||
|
||||
### PrivKey
|
||||
PrivKey defines a ed25519 private key.
|
||||
Deprecated: PrivKey defines a ed25519 private key.
|
||||
NOTE: ed25519 keys must not be used in SDK apps except in a tendermint validator context.
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
@@ -2897,11 +2961,11 @@ PrivKey defines a ed25519 private key.
|
||||
<a name="cosmos.crypto.ed25519.PubKey"></a>
|
||||
|
||||
### PubKey
|
||||
PubKey defines a ed25519 public key
|
||||
Key is the compressed form of the pubkey. The first byte depends is a 0x02 byte
|
||||
if the y-coordinate is the lexicographically largest of the two associated with
|
||||
the x-coordinate. Otherwise the first byte is a 0x03.
|
||||
This prefix is followed with the x-coordinate.
|
||||
PubKey is an ed25519 public key for handling Tendermint keys in SDK.
|
||||
It's needed for Any serialization and SDK compatibility.
|
||||
It must not be used in a non Tendermint key context because it doesn't implement
|
||||
ADR-28. Nevertheless, you will like to use ed25519 in app user level
|
||||
then you must create a new proto message and follow ADR-28 for Address construction.
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
@@ -4587,7 +4651,7 @@ A Vote consists of a proposal ID, the voter, and the vote option.
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| `proposal_id` | [uint64](#uint64) | | |
|
||||
| `voter` | [string](#string) | | |
|
||||
| `option` | [VoteOption](#cosmos.gov.v1beta1.VoteOption) | | |
|
||||
| `options` | [WeightedVoteOption](#cosmos.gov.v1beta1.WeightedVoteOption) | repeated | |
|
||||
|
||||
|
||||
|
||||
@@ -4608,6 +4672,22 @@ VotingParams defines the params for voting on governance proposals.
|
||||
|
||||
|
||||
|
||||
|
||||
<a name="cosmos.gov.v1beta1.WeightedVoteOption"></a>
|
||||
|
||||
### WeightedVoteOption
|
||||
WeightedVoteOption defines a unit of vote for vote split.
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| `option` | [VoteOption](#cosmos.gov.v1beta1.VoteOption) | | |
|
||||
| `weight` | [string](#string) | | |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- end messages -->
|
||||
|
||||
|
||||
@@ -5065,6 +5145,33 @@ MsgVoteResponse defines the Msg/Vote response type.
|
||||
|
||||
|
||||
|
||||
|
||||
<a name="cosmos.gov.v1beta1.MsgVoteWeighted"></a>
|
||||
|
||||
### MsgVoteWeighted
|
||||
MsgVote defines a message to cast a vote.
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| `proposal_id` | [uint64](#uint64) | | |
|
||||
| `voter` | [string](#string) | | |
|
||||
| `options` | [WeightedVoteOption](#cosmos.gov.v1beta1.WeightedVoteOption) | repeated | |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a name="cosmos.gov.v1beta1.MsgVoteWeightedResponse"></a>
|
||||
|
||||
### MsgVoteWeightedResponse
|
||||
MsgVoteWeightedResponse defines the Msg/VoteWeighted response type.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- end messages -->
|
||||
|
||||
<!-- end enums -->
|
||||
@@ -5081,6 +5188,7 @@ Msg defines the bank Msg service.
|
||||
| ----------- | ------------ | ------------- | ------------| ------- | -------- |
|
||||
| `SubmitProposal` | [MsgSubmitProposal](#cosmos.gov.v1beta1.MsgSubmitProposal) | [MsgSubmitProposalResponse](#cosmos.gov.v1beta1.MsgSubmitProposalResponse) | SubmitProposal defines a method to create new proposal given a content. | |
|
||||
| `Vote` | [MsgVote](#cosmos.gov.v1beta1.MsgVote) | [MsgVoteResponse](#cosmos.gov.v1beta1.MsgVoteResponse) | Vote defines a method to add a vote on a specific proposal. | |
|
||||
| `VoteWeighted` | [MsgVoteWeighted](#cosmos.gov.v1beta1.MsgVoteWeighted) | [MsgVoteWeightedResponse](#cosmos.gov.v1beta1.MsgVoteWeightedResponse) | WeightedVote defines a method to add a weighted vote on a specific proposal. | |
|
||||
| `Deposit` | [MsgDeposit](#cosmos.gov.v1beta1.MsgDeposit) | [MsgDepositResponse](#cosmos.gov.v1beta1.MsgDepositResponse) | Deposit defines a method to add deposit on a specific proposal. | |
|
||||
|
||||
<!-- end services -->
|
||||
@@ -5692,6 +5800,69 @@ Msg defines the slashing Msg service.
|
||||
|
||||
|
||||
|
||||
<a name="cosmos/staking/v1beta1/authz.proto"></a>
|
||||
<p align="right"><a href="#top">Top</a></p>
|
||||
|
||||
## cosmos/staking/v1beta1/authz.proto
|
||||
|
||||
|
||||
|
||||
<a name="cosmos.staking.v1beta1.StakeAuthorization"></a>
|
||||
|
||||
### StakeAuthorization
|
||||
StakeAuthorization defines authorization for delegate/undelegate/redelegate.
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| `max_tokens` | [cosmos.base.v1beta1.Coin](#cosmos.base.v1beta1.Coin) | | max_tokens specifies the maximum amount of tokens can be delegate to a validator. If it is empty, there is no spend limit and any amount of coins can be delegated. |
|
||||
| `allow_list` | [StakeAuthorization.Validators](#cosmos.staking.v1beta1.StakeAuthorization.Validators) | | allow_list specifies list of validator addresses to whom grantee can delegate tokens on behalf of granter's account. |
|
||||
| `deny_list` | [StakeAuthorization.Validators](#cosmos.staking.v1beta1.StakeAuthorization.Validators) | | deny_list specifies list of validator addresses to whom grantee can not delegate tokens. |
|
||||
| `authorization_type` | [AuthorizationType](#cosmos.staking.v1beta1.AuthorizationType) | | authorization_type defines one of AuthorizationType. |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a name="cosmos.staking.v1beta1.StakeAuthorization.Validators"></a>
|
||||
|
||||
### StakeAuthorization.Validators
|
||||
Validators defines list of validator addresses.
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| `address` | [string](#string) | repeated | |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- end messages -->
|
||||
|
||||
|
||||
<a name="cosmos.staking.v1beta1.AuthorizationType"></a>
|
||||
|
||||
### AuthorizationType
|
||||
AuthorizationType defines the type of staking module authorization type
|
||||
|
||||
| Name | Number | Description |
|
||||
| ---- | ------ | ----------- |
|
||||
| AUTHORIZATION_TYPE_UNSPECIFIED | 0 | AUTHORIZATION_TYPE_UNSPECIFIED specifies an unknown authorization type |
|
||||
| AUTHORIZATION_TYPE_DELEGATE | 1 | AUTHORIZATION_TYPE_DELEGATE defines an authorization type for Msg/Delegate |
|
||||
| AUTHORIZATION_TYPE_UNDELEGATE | 2 | AUTHORIZATION_TYPE_UNDELEGATE defines an authorization type for Msg/Undelegate |
|
||||
| AUTHORIZATION_TYPE_REDELEGATE | 3 | AUTHORIZATION_TYPE_REDELEGATE defines an authorization type for Msg/BeginRedelegate |
|
||||
|
||||
|
||||
<!-- end enums -->
|
||||
|
||||
<!-- end HasExtensions -->
|
||||
|
||||
<!-- end services -->
|
||||
|
||||
|
||||
|
||||
<a name="cosmos/staking/v1beta1/staking.proto"></a>
|
||||
<p align="right"><a href="#top">Top</a></p>
|
||||
|
||||
@@ -7901,17 +8072,20 @@ client.
|
||||
<a name="ibc.core.client.v1.ClientUpdateProposal"></a>
|
||||
|
||||
### ClientUpdateProposal
|
||||
ClientUpdateProposal is a governance proposal. If it passes, the client is
|
||||
updated with the provided header. The update may fail if the header is not
|
||||
valid given certain conditions specified by the client implementation.
|
||||
ClientUpdateProposal is a governance proposal. If it passes, the substitute client's
|
||||
consensus states starting from the 'initial height' are copied over to the subjects
|
||||
client state. The proposal handler may fail if the subject and the substitute do not
|
||||
match in client and chain parameters (with exception to latest height, frozen height, and chain-id).
|
||||
The updated client must also be valid (cannot be expired).
|
||||
|
||||
|
||||
| Field | Type | Label | Description |
|
||||
| ----- | ---- | ----- | ----------- |
|
||||
| `title` | [string](#string) | | the title of the update proposal |
|
||||
| `description` | [string](#string) | | the description of the proposal |
|
||||
| `client_id` | [string](#string) | | the client identifier for the client to be updated if the proposal passes |
|
||||
| `header` | [google.protobuf.Any](#google.protobuf.Any) | | the header used to update the client if the proposal passes |
|
||||
| `subject_client_id` | [string](#string) | | the client identifier for the client to be updated if the proposal passes |
|
||||
| `substitute_client_id` | [string](#string) | | the substitute client identifier for the client standing in for the subject client |
|
||||
| `initial_height` | [Height](#ibc.core.client.v1.Height) | | the intital height to copy consensus states from the substitute to the subject |
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@ This repository contains reference documentation for the IBC protocol integratio
|
||||
2. [Integration](./integration.md)
|
||||
3. [Customization](./custom.md)
|
||||
4. [Relayer](./relayer.md)
|
||||
5. [Governance Proposals](./proposals.md)
|
||||
|
||||
After reading about IBC, head on to the [Building Modules
|
||||
documentation](../building-modules/README.md) to learn more about the process of building modules.
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
<!--
|
||||
order: 5
|
||||
-->
|
||||
|
||||
# Governance Proposals
|
||||
|
||||
In uncommon situations, a highly valued client may become frozen due to uncontrollable
|
||||
circumstances. A highly valued client might have hundreds of channels being actively used.
|
||||
Some of those channels might have a significant amount of locked tokens used for ICS 20.
|
||||
|
||||
If the one third of the validator set of the chain the client represents decides to collude,
|
||||
they can sign off on two valid but conflicting headers each signed by the other one third
|
||||
of the honest validator set. The light client can now be updated with two valid, but conflicting
|
||||
headers at the same height. The light client cannot know which header is trustworthy and therefore
|
||||
evidence of such misbehaviour is likely to be submitted resulting in a frozen light client.
|
||||
|
||||
Frozen light clients cannot be updated under any circumstance except via a governance proposal.
|
||||
Since a quorum of validators can sign arbitrary state roots which may not be valid executions
|
||||
of the state machine, a governance proposal has been added to ease the complexity of unfreezing
|
||||
or updating clients which have become "stuck". Without this mechanism, validator sets would need
|
||||
to construct a state root to unfreeze the client. Unfreezing clients, re-enables all of the channels
|
||||
built upon that client. This may result in recovery of otherwise lost funds.
|
||||
|
||||
Tendermint light clients may become expired if the trusting period has passed since their
|
||||
last update. This may occur if relayers stop submitting headers to update the clients.
|
||||
|
||||
An unplanned upgrade by the counterparty chain may also result in expired clients. If the counterparty
|
||||
chain undergoes an unplanned upgrade, there may be no commitment to that upgrade signed by the validator
|
||||
set before the chain-id changes. In this situation, the validator set of the last valid update for the
|
||||
light client is never expected to produce another valid header since the chain-id has changed, which will
|
||||
ultimately lead the on-chain light client to become expired.
|
||||
|
||||
In the case that a highly valued light client is frozen, expired, or rendered non-updateable, a
|
||||
governance proposal may be submitted to update this client, known as the subject client. The
|
||||
proposal includes the client identifier for the subject, the client identifier for a substitute
|
||||
client, and an initial height to reference the substitute client from. Light client implementations
|
||||
may implement custom updating logic, but in most cases, the subject will be updated with information
|
||||
from the substitute client, if the proposal passes. The substitute client is used as a "stand in"
|
||||
while the subject is on trial. It is best practice to create a substitute client *after* the subject
|
||||
has become frozen to avoid the substitute from also becoming frozen. An active substitute client
|
||||
allows headers to be submitted during the voting period to prevent accidental expiry once the proposal
|
||||
passes.
|
||||
@@ -32,11 +32,11 @@ Some important information concerning all legacy REST endpoints:
|
||||
|
||||
## Migrating to New REST Endpoints
|
||||
|
||||
Thanks to the Protocol Buffers migration in v0.40, we are able to take advantage of a vast number of gRPC tools and solutions. For most of the legacy REST endpoints, Cosmos SDK v0.40 provides new REST endpoints generated from [gRPC `Query` services](../building-modules/query-services.md) using [grpc-gateway](https://grpc-ecosystem.github.io/grpc-gateway/). We usually call them _gGPC-gateway REST endpoints_.
|
||||
Thanks to the Protocol Buffers migration in v0.40, we are able to take advantage of a vast number of gRPC tools and solutions. For most of the legacy REST endpoints, Cosmos SDK v0.40 provides new REST endpoints generated from [gRPC `Query` services](../building-modules/query-services.md) using [grpc-gateway](https://grpc-ecosystem.github.io/grpc-gateway/). We usually call them _gRPC-gateway REST endpoints_.
|
||||
|
||||
Some modules expose legacy `POST` endpoints to generate unsigned transactions for their `Msg`s. These `POST` endpoints have been removed. We recommend to use [service `Msg`s](../building-modules/msg-services.md) directly, and use Protobuf to do client-side transaction generation. A guide can be found [here](../run-node/txs.md).
|
||||
|
||||
| Legacy REST Endpoint | Description | New gGPC-gateway REST Endpoint |
|
||||
| Legacy REST Endpoint | Description | New gRPC-gateway REST Endpoint |
|
||||
| ------------------------------------------------------------------------------- | ------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
|
||||
| `GET /txs/{hash}` | Query tx by hash | `GET /cosmos/tx/v1beta1/txs/{hash}` |
|
||||
| `GET /txs` | Query tx by events | `GET /cosmos/tx/v1beta1/txs` |
|
||||
@@ -44,7 +44,7 @@ Some modules expose legacy `POST` endpoints to generate unsigned transactions fo
|
||||
| `POST /txs/encode` | Encodes an Amino JSON tx to an Amino binary tx | N/A, use Protobuf directly |
|
||||
| `POST /txs/decode` | Decodes an Amino binary tx into an Amino JSON tx | N/A, use Protobuf directly |
|
||||
| `POST /bank/*` | Create unsigned `Msg`s for bank tx | N/A, use Protobuf directly |
|
||||
| `GET /bank/balances/{address}` | Get the balance of an address | `GET /cosmos/bank/v1beta1/balances/{address}/{denom}` |
|
||||
| `GET /bank/balances/{address}` | Get the balance of an address | `GET /cosmos/bank/v1beta1/balances/{address}` |
|
||||
| `GET /bank/total` | Get the total supply of all coins | `GET /cosmos/bank/v1beta1/supply` |
|
||||
| `GET /bank/total/{denom}` | Get the total supply of one coin | `GET /cosmos/bank/v1beta1/supply/{denom}` |
|
||||
| `POST /distribution/delegators/{delegatorAddr}/rewards` | Withdraw all delegator rewards | N/A, use Protobuf directly |
|
||||
@@ -52,8 +52,8 @@ Some modules expose legacy `POST` endpoints to generate unsigned transactions fo
|
||||
| `GET /distribution/delegators/{delegatorAddr}/rewards` | Get the total rewards balance from all delegations | `GET /cosmos/distribution/v1beta1/v1beta1/delegators/{delegator_address}/rewards` |
|
||||
| `GET /distribution/delegators/{delegatorAddr}/rewards/{validatorAddr}` | Query a delegation reward | `GET /cosmos/distribution/v1beta1/delegators/{delegatorAddr}/rewards/{validatorAddr}` |
|
||||
| `GET /distribution/delegators/{delegatorAddr}/withdraw_address` | Get the rewards withdrawal address | `GET /cosmos/distribution/v1beta1/delegators/{delegatorAddr}/withdraw_address` |
|
||||
| `GET /distribution/validators/{validatorAddr}` | Validator distribution information | `GET /cosmos/distribution/v1beta1/validators/{validatorAddr}` |
|
||||
| `GET /distribution/validators/{validatorAddr}/rewards` | Commission and self-delegation rewards of a single a validator | `GET /cosmos/distribution/v1beta1/validators/{validatorAddr}/rewards` |
|
||||
| `GET /distribution/validators/{validatorAddr}` | Validator distribution information | N/A |
|
||||
| `GET /distribution/validators/{validatorAddr}/rewards` | Commission and outstanding rewards of a single a validator | `GET /cosmos/distribution/v1beta1/validators/{validatorAddr}/commission` <br> `GET /cosmos/distribution/v1beta1/validators/{validatorAddr}/outstanding_rewards` |
|
||||
| `GET /distribution/validators/{validatorAddr}/outstanding_rewards` | Outstanding rewards of a single validator | `GET /cosmos/distribution/v1beta1/validators/{validatorAddr}/outstanding_rewards` |
|
||||
| `GET /distribution/parameters` | Get the current distribution parameter values | `GET /cosmos/distribution/v1beta1/params` |
|
||||
| `GET /distribution/community_pool` | Get the amount held in the community pool | `GET /cosmos/distribution/v1beta1/community_pool` |
|
||||
@@ -77,12 +77,12 @@ Some modules expose legacy `POST` endpoints to generate unsigned transactions fo
|
||||
| `GET /slashing/signing_infos` | Get all signing infos | `GET /cosmos/slashing/v1beta1/signing_infos` |
|
||||
| `GET /slashing/parameters` | Get slashing parameters | `GET /cosmos/slashing/v1beta1/params` |
|
||||
| `POST /staking/*` | Create unsigned `Msg`s for staking | N/A, use Protobuf directly |
|
||||
| `GET /staking/delegators/{delegatorAddr}/delegations` | Get all delegations from a delegator | `GET /cosmos/staking/v1beta1/delegators/{delegatorAddr}/delegations` |
|
||||
| `GET /staking/delegators/{delegatorAddr}/delegations` | Get all delegations from a delegator | `GET /cosmos/staking/v1beta1/delegations/{delegatorAddr}` |
|
||||
| `GET /staking/delegators/{delegatorAddr}/unbonding_delegations` | Get all unbonding delegations from a delegator | `GET /cosmos/staking/v1beta1/delegators/{delegatorAddr}/unbonding_delegations` |
|
||||
| `GET /staking/delegators/{delegatorAddr}/txs` | Get all staking txs (i.e msgs) from a delegator | Removed |
|
||||
| `GET /staking/delegators/{delegatorAddr}/validators` | Query all validators that a delegator is bonded to | `GET /cosmos/staking/v1beta1/delegators/{delegatorAddr}/validators` |
|
||||
| `GET /staking/delegators/{delegatorAddr}/validators/{validatorAddr}` | Query a validator that a delegator is bonded to | `GET /cosmos/staking/v1beta1/delegators/{delegatorAddr}/validators/{validatorAddr}` |
|
||||
| `GET /staking/delegators/{delegatorAddr}/delegations/{validatorAddr}` | Query a delegation between a delegator and a validator | `GET /cosmos/staking/v1beta1/delegators/{delegatorAddr}/delegations/{validatorAddr}` |
|
||||
| `GET /staking/delegators/{delegatorAddr}/delegations/{validatorAddr}` | Query a delegation between a delegator and a validator | `GET /cosmos/staking/v1beta1/validators/{validatorAddr}/delegations/{delegatorAddr}` |
|
||||
| `GET /staking/delegators/{delegatorAddr}/unbonding_delegations/{validatorAddr}` | Query all unbonding delegations between a delegator and a validator | `GET /cosmos/staking/v1beta1/delegators/{delegatorAddr}/unbonding_delegations/{validatorAddr}` |
|
||||
| `GET /staking/redelegations` | Query redelegations | `GET /cosmos/staking/v1beta1/v1beta1/delegators/{delegator_addr}/redelegations` |
|
||||
| `GET /staking/validators` | Get all validators | `GET /cosmos/staking/v1beta1/validators` |
|
||||
|
||||
Generated
+107
-107
@@ -5,118 +5,118 @@
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
"@algolia/cache-browser-local-storage": {
|
||||
"version": "4.8.3",
|
||||
"resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.8.3.tgz",
|
||||
"integrity": "sha512-Cwc03hikHSUI+xvgUdN+H+f6jFyoDsC9fegzXzJ2nPn1YSN9EXzDMBnbrgl0sbl9iLGXe0EIGMYqR2giCv1wMQ==",
|
||||
"version": "4.8.4",
|
||||
"resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.8.4.tgz",
|
||||
"integrity": "sha512-qSS3VMP3oMhcLrYIFveRyt3F5XB6MqWogF4Vooj8KvOvqv6jBmYwkAueSXCF5pkJEaA72VL9+9NbBpfC8ez2ww==",
|
||||
"requires": {
|
||||
"@algolia/cache-common": "4.8.3"
|
||||
"@algolia/cache-common": "4.8.4"
|
||||
}
|
||||
},
|
||||
"@algolia/cache-common": {
|
||||
"version": "4.8.3",
|
||||
"resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.8.3.tgz",
|
||||
"integrity": "sha512-Cf7zZ2i6H+tLSBTkFePHhYvlgc9fnMPKsF9qTmiU38kFIGORy/TN2Fx5n1GBuRLIzaSXvcf+oHv1HvU0u1gE1g=="
|
||||
"version": "4.8.4",
|
||||
"resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.8.4.tgz",
|
||||
"integrity": "sha512-5+dLmj6qFy4WOtnNQuFRfWTIIDdpUigv+dXaKMFplNPBvZHGFy3hcRjWqYzGcqaeLqcXbN8cU5r75mvrlJIxcw=="
|
||||
},
|
||||
"@algolia/cache-in-memory": {
|
||||
"version": "4.8.3",
|
||||
"resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.8.3.tgz",
|
||||
"integrity": "sha512-+N7tkvmijXiDy2E7u1mM73AGEgGPWFmEmPeJS96oT46I98KXAwVPNYbcAqBE79YlixdXpkYJk41cFcORzNh+Iw==",
|
||||
"version": "4.8.4",
|
||||
"resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.8.4.tgz",
|
||||
"integrity": "sha512-PBN4YKxn/L+HjVKqUE5rtLiFKqzm4qnUoF7QvCFFmFAViCdYwZSMFVmDobstqWY3KULfsEqaeD4eU4jxZbKhEA==",
|
||||
"requires": {
|
||||
"@algolia/cache-common": "4.8.3"
|
||||
"@algolia/cache-common": "4.8.4"
|
||||
}
|
||||
},
|
||||
"@algolia/client-account": {
|
||||
"version": "4.8.3",
|
||||
"resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.8.3.tgz",
|
||||
"integrity": "sha512-Uku8LqnXBwfDCtsTCDYTUOz2/2oqcAQCKgaO0uGdIR8DTQENBXFQvzziambHdn9KuFuY+6Et9k1+cjpTPBDTBg==",
|
||||
"version": "4.8.4",
|
||||
"resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.8.4.tgz",
|
||||
"integrity": "sha512-mrsOnGV4O2b+t1CumUH72+Psw9d9qwngBEp2le7IMSceJQywQvNCyJ4B4qyoozHsIGapXfcVAOhRxqUsNQ6U6g==",
|
||||
"requires": {
|
||||
"@algolia/client-common": "4.8.3",
|
||||
"@algolia/client-search": "4.8.3",
|
||||
"@algolia/transporter": "4.8.3"
|
||||
"@algolia/client-common": "4.8.4",
|
||||
"@algolia/client-search": "4.8.4",
|
||||
"@algolia/transporter": "4.8.4"
|
||||
}
|
||||
},
|
||||
"@algolia/client-analytics": {
|
||||
"version": "4.8.3",
|
||||
"resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.8.3.tgz",
|
||||
"integrity": "sha512-9ensIWmjYJprZ+YjAVSZdWUG05xEnbytENXp508X59tf34IMIX8BR2xl0RjAQODtxBdAteGxuKt5THX6U9tQLA==",
|
||||
"version": "4.8.4",
|
||||
"resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.8.4.tgz",
|
||||
"integrity": "sha512-Xy70njSUgG/QTv5+rPjsTIzBF/bjxseS5h9SawrQGzovTosbJbu9JBlg4YwVJnYvjovzpr7S39+gPIPc8M7+Rg==",
|
||||
"requires": {
|
||||
"@algolia/client-common": "4.8.3",
|
||||
"@algolia/client-search": "4.8.3",
|
||||
"@algolia/requester-common": "4.8.3",
|
||||
"@algolia/transporter": "4.8.3"
|
||||
"@algolia/client-common": "4.8.4",
|
||||
"@algolia/client-search": "4.8.4",
|
||||
"@algolia/requester-common": "4.8.4",
|
||||
"@algolia/transporter": "4.8.4"
|
||||
}
|
||||
},
|
||||
"@algolia/client-common": {
|
||||
"version": "4.8.3",
|
||||
"resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.8.3.tgz",
|
||||
"integrity": "sha512-TU3623AEFAWUQlDTznkgAMSYo8lfS9pNs5QYDQzkvzWdqK0GBDWthwdRfo9iIsfxiR9qdCMHqwEu+AlZMVhNSA==",
|
||||
"version": "4.8.4",
|
||||
"resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.8.4.tgz",
|
||||
"integrity": "sha512-sQlRa+KWFn+D8AOEZb4kj6RE/i6DnPwVOF4AnNf9IjNB0mUUhLWw96cQN6GDx0KE4lhW67t+qR39ZuuDBgR9ww==",
|
||||
"requires": {
|
||||
"@algolia/requester-common": "4.8.3",
|
||||
"@algolia/transporter": "4.8.3"
|
||||
"@algolia/requester-common": "4.8.4",
|
||||
"@algolia/transporter": "4.8.4"
|
||||
}
|
||||
},
|
||||
"@algolia/client-recommendation": {
|
||||
"version": "4.8.3",
|
||||
"resolved": "https://registry.npmjs.org/@algolia/client-recommendation/-/client-recommendation-4.8.3.tgz",
|
||||
"integrity": "sha512-qysGbmkcc6Agt29E38KWJq9JuxjGsyEYoKuX9K+P5HyQh08yR/BlRYrA8mB7vT/OIUHRGFToGO6Vq/rcg0NIOQ==",
|
||||
"version": "4.8.4",
|
||||
"resolved": "https://registry.npmjs.org/@algolia/client-recommendation/-/client-recommendation-4.8.4.tgz",
|
||||
"integrity": "sha512-CE0CVqLGWotVOaUXyU33FVD9FZ/7rqcbwFPH5MgSjVdE0B1YWVedhR0s2BNKodXLcIGVLVYfXR05CLdvOlTw+A==",
|
||||
"requires": {
|
||||
"@algolia/client-common": "4.8.3",
|
||||
"@algolia/requester-common": "4.8.3",
|
||||
"@algolia/transporter": "4.8.3"
|
||||
"@algolia/client-common": "4.8.4",
|
||||
"@algolia/requester-common": "4.8.4",
|
||||
"@algolia/transporter": "4.8.4"
|
||||
}
|
||||
},
|
||||
"@algolia/client-search": {
|
||||
"version": "4.8.3",
|
||||
"resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.8.3.tgz",
|
||||
"integrity": "sha512-rAnvoy3GAhbzOQVniFcKVn1eM2NX77LearzYNCbtFrFYavG+hJI187bNVmajToiuGZ10FfJvK99X2OB1AzzezQ==",
|
||||
"version": "4.8.4",
|
||||
"resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.8.4.tgz",
|
||||
"integrity": "sha512-eH2tRPnDU3tqpp0BSqP6coRRQe8fceqsupuf/1ho+Mcs5DM13mEuFmNOyPywHRlYLVPmbbCPRhDr5rB8QoN7XQ==",
|
||||
"requires": {
|
||||
"@algolia/client-common": "4.8.3",
|
||||
"@algolia/requester-common": "4.8.3",
|
||||
"@algolia/transporter": "4.8.3"
|
||||
"@algolia/client-common": "4.8.4",
|
||||
"@algolia/requester-common": "4.8.4",
|
||||
"@algolia/transporter": "4.8.4"
|
||||
}
|
||||
},
|
||||
"@algolia/logger-common": {
|
||||
"version": "4.8.3",
|
||||
"resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.8.3.tgz",
|
||||
"integrity": "sha512-03wksHRbhl2DouEKnqWuUb64s1lV6kDAAabMCQ2Du1fb8X/WhDmxHC4UXMzypeOGlH5BZBsgVwSB7vsZLP3MZg=="
|
||||
"version": "4.8.4",
|
||||
"resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.8.4.tgz",
|
||||
"integrity": "sha512-6hOaFG75Onmant9adcaeCZgvPYfnif7n0H1ycbixm6/WH3SmxqPMG+CMiW8mTNTRrrAEceQVrq6tDHD8jdnOOw=="
|
||||
},
|
||||
"@algolia/logger-console": {
|
||||
"version": "4.8.3",
|
||||
"resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.8.3.tgz",
|
||||
"integrity": "sha512-Npt+hI4UF8t3TLMluL5utr9Gc11BjL5kDnGZOhDOAz5jYiSO2nrHMFmnpLT4Cy/u7a5t7EB5dlypuC4/AGStkA==",
|
||||
"version": "4.8.4",
|
||||
"resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.8.4.tgz",
|
||||
"integrity": "sha512-+9T3t/eB9vseANFz9YbFHG0cHjzVP/DVfGqzTAkeSlvMHP69JzJga9Wb0Ai6J3xXE3d4k9K+k6t+kkjCQjzEqg==",
|
||||
"requires": {
|
||||
"@algolia/logger-common": "4.8.3"
|
||||
"@algolia/logger-common": "4.8.4"
|
||||
}
|
||||
},
|
||||
"@algolia/requester-browser-xhr": {
|
||||
"version": "4.8.3",
|
||||
"resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.8.3.tgz",
|
||||
"integrity": "sha512-/LTTIpgEmEwkyhn8yXxDdBWqXqzlgw5w2PtTpIwkSlP2/jDwdR/9w1TkFzhNbJ81ki6LAEQM5mSwoTTnbIIecg==",
|
||||
"version": "4.8.4",
|
||||
"resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.8.4.tgz",
|
||||
"integrity": "sha512-BYa8O/pht0UL2bcm0ZkLZiyC+5dHrbc6gvKIo+OgqxmDb/K4KrVo6RIof3BVpR8fgcfxQJohjNVHKXHxEUhBCQ==",
|
||||
"requires": {
|
||||
"@algolia/requester-common": "4.8.3"
|
||||
"@algolia/requester-common": "4.8.4"
|
||||
}
|
||||
},
|
||||
"@algolia/requester-common": {
|
||||
"version": "4.8.3",
|
||||
"resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.8.3.tgz",
|
||||
"integrity": "sha512-+Yo9vBkofoKR1SCqqtMnmnfq9yt/BiaDewY/6bYSMNxSYCnu2Fw1JKSIaf/4zos09PMSsxGpLohZwGas3+0GDQ=="
|
||||
"version": "4.8.4",
|
||||
"resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.8.4.tgz",
|
||||
"integrity": "sha512-br3LXb6srfAy7F04axwExmrkPOlXCDckgTFoLFv/RT9Oo28SpoyvHqktyBovQLdzdTs+Laglf+LtOHr0iUrZJg=="
|
||||
},
|
||||
"@algolia/requester-node-http": {
|
||||
"version": "4.8.3",
|
||||
"resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.8.3.tgz",
|
||||
"integrity": "sha512-k2fiKIeMIFqgC01FnzII6kqC2GQBAfbNaUX4k7QCPa6P8t4sp2xE6fImOUiztLnnL3C9X9ZX6Fw3L+cudi7jvQ==",
|
||||
"version": "4.8.4",
|
||||
"resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.8.4.tgz",
|
||||
"integrity": "sha512-o5Cc4UxYPn3IBHQSDBNFFhq1LQLv40eYvCvK0FPJ8xZkrnNXhjPvaLCu/lQTHpk/HX7DaE6fQ/KboU0OSPKevQ==",
|
||||
"requires": {
|
||||
"@algolia/requester-common": "4.8.3"
|
||||
"@algolia/requester-common": "4.8.4"
|
||||
}
|
||||
},
|
||||
"@algolia/transporter": {
|
||||
"version": "4.8.3",
|
||||
"resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.8.3.tgz",
|
||||
"integrity": "sha512-nU7fy2iU8snxATlsks0MjMyv97QJWQmOVwTjDc+KZ4+nue8CLcgm4LA4dsTBqvxeCQIoEtt3n72GwXcaqiJSjQ==",
|
||||
"version": "4.8.4",
|
||||
"resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.8.4.tgz",
|
||||
"integrity": "sha512-EvXFYICxrr9QEO6m6awUeNOBstOxePQ2Fy0jtYlS1v9TY2P5HqKRzkxmaZjeYRBsXOImpVjgQIzTzj1Au4br2w==",
|
||||
"requires": {
|
||||
"@algolia/cache-common": "4.8.3",
|
||||
"@algolia/logger-common": "4.8.3",
|
||||
"@algolia/requester-common": "4.8.3"
|
||||
"@algolia/cache-common": "4.8.4",
|
||||
"@algolia/logger-common": "4.8.4",
|
||||
"@algolia/requester-common": "4.8.4"
|
||||
}
|
||||
},
|
||||
"@babel/code-frame": {
|
||||
@@ -1241,9 +1241,9 @@
|
||||
}
|
||||
},
|
||||
"@types/json-schema": {
|
||||
"version": "7.0.6",
|
||||
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz",
|
||||
"integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw=="
|
||||
"version": "7.0.7",
|
||||
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz",
|
||||
"integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA=="
|
||||
},
|
||||
"@types/minimatch": {
|
||||
"version": "3.0.3",
|
||||
@@ -1251,9 +1251,9 @@
|
||||
"integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA=="
|
||||
},
|
||||
"@types/node": {
|
||||
"version": "14.14.21",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.21.tgz",
|
||||
"integrity": "sha512-cHYfKsnwllYhjOzuC5q1VpguABBeecUp24yFluHpn/BQaVxB1CuQ1FSRZCzrPxrkIfWISXV2LbeoBthLWg0+0A=="
|
||||
"version": "14.14.22",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.22.tgz",
|
||||
"integrity": "sha512-g+f/qj/cNcqKkc3tFqlXOYjrmZA+jNBiDzbP3kH+B+otKFqAdPgVTGP1IeKRdMml/aE69as5S4FqtxAbl+LaMw=="
|
||||
},
|
||||
"@types/q": {
|
||||
"version": "1.5.4",
|
||||
@@ -1337,9 +1337,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"core-js": {
|
||||
"version": "3.8.2",
|
||||
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.2.tgz",
|
||||
"integrity": "sha512-FfApuSRgrR6G5s58casCBd9M2k+4ikuu4wbW6pJyYU7bd9zvFc9qf7vr5xmrZOhT9nn+8uwlH1oRR9jTnFoA3A=="
|
||||
"version": "3.8.3",
|
||||
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.3.tgz",
|
||||
"integrity": "sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q=="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1510,9 +1510,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"core-js": {
|
||||
"version": "3.8.2",
|
||||
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.2.tgz",
|
||||
"integrity": "sha512-FfApuSRgrR6G5s58casCBd9M2k+4ikuu4wbW6pJyYU7bd9zvFc9qf7vr5xmrZOhT9nn+8uwlH1oRR9jTnFoA3A=="
|
||||
"version": "3.8.3",
|
||||
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.3.tgz",
|
||||
"integrity": "sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q=="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1861,24 +1861,24 @@
|
||||
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="
|
||||
},
|
||||
"algoliasearch": {
|
||||
"version": "4.8.3",
|
||||
"resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.8.3.tgz",
|
||||
"integrity": "sha512-pljX9jEE2TQ3i1JayhG8afNdE8UuJg3O9c7unW6QO67yRWCKr6b0t5aKC3hSVtjt7pA2TQXLKoAISb4SHx9ozQ==",
|
||||
"version": "4.8.4",
|
||||
"resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.8.4.tgz",
|
||||
"integrity": "sha512-QbXpFvBKj/QhKWE7xBoqaWOWyw7ni6W6THSuFJHOcADRrInhjFCBYjrv+YsIhv9huCepKXWpfV4UJup9BslVhQ==",
|
||||
"requires": {
|
||||
"@algolia/cache-browser-local-storage": "4.8.3",
|
||||
"@algolia/cache-common": "4.8.3",
|
||||
"@algolia/cache-in-memory": "4.8.3",
|
||||
"@algolia/client-account": "4.8.3",
|
||||
"@algolia/client-analytics": "4.8.3",
|
||||
"@algolia/client-common": "4.8.3",
|
||||
"@algolia/client-recommendation": "4.8.3",
|
||||
"@algolia/client-search": "4.8.3",
|
||||
"@algolia/logger-common": "4.8.3",
|
||||
"@algolia/logger-console": "4.8.3",
|
||||
"@algolia/requester-browser-xhr": "4.8.3",
|
||||
"@algolia/requester-common": "4.8.3",
|
||||
"@algolia/requester-node-http": "4.8.3",
|
||||
"@algolia/transporter": "4.8.3"
|
||||
"@algolia/cache-browser-local-storage": "4.8.4",
|
||||
"@algolia/cache-common": "4.8.4",
|
||||
"@algolia/cache-in-memory": "4.8.4",
|
||||
"@algolia/client-account": "4.8.4",
|
||||
"@algolia/client-analytics": "4.8.4",
|
||||
"@algolia/client-common": "4.8.4",
|
||||
"@algolia/client-recommendation": "4.8.4",
|
||||
"@algolia/client-search": "4.8.4",
|
||||
"@algolia/logger-common": "4.8.4",
|
||||
"@algolia/logger-console": "4.8.4",
|
||||
"@algolia/requester-browser-xhr": "4.8.4",
|
||||
"@algolia/requester-common": "4.8.4",
|
||||
"@algolia/requester-node-http": "4.8.4",
|
||||
"@algolia/transporter": "4.8.4"
|
||||
}
|
||||
},
|
||||
"align-text": {
|
||||
@@ -2864,9 +2864,9 @@
|
||||
}
|
||||
},
|
||||
"caniuse-lite": {
|
||||
"version": "1.0.30001178",
|
||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001178.tgz",
|
||||
"integrity": "sha512-VtdZLC0vsXykKni8Uztx45xynytOi71Ufx9T8kHptSw9AL4dpqailUJJHavttuzUe1KYuBYtChiWv+BAb7mPmQ=="
|
||||
"version": "1.0.30001179",
|
||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001179.tgz",
|
||||
"integrity": "sha512-blMmO0QQujuUWZKyVrD1msR4WNDAqb/UPO1Sw2WWsQ7deoM5bJiicKnWJ1Y0NS/aGINSnKPIWBMw5luX+NDUCA=="
|
||||
},
|
||||
"caseless": {
|
||||
"version": "0.12.0",
|
||||
@@ -3406,11 +3406,11 @@
|
||||
"integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="
|
||||
},
|
||||
"core-js-compat": {
|
||||
"version": "3.8.2",
|
||||
"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.2.tgz",
|
||||
"integrity": "sha512-LO8uL9lOIyRRrQmZxHZFl1RV+ZbcsAkFWTktn5SmH40WgLtSNYN4m4W2v9ONT147PxBY/XrRhrWq8TlvObyUjQ==",
|
||||
"version": "3.8.3",
|
||||
"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.3.tgz",
|
||||
"integrity": "sha512-1sCb0wBXnBIL16pfFG1Gkvei6UzvKyTNYpiC41yrdjEv0UoJoq9E/abTMzyYJ6JpTkAj15dLjbqifIzEBDVvog==",
|
||||
"requires": {
|
||||
"browserslist": "^4.16.0",
|
||||
"browserslist": "^4.16.1",
|
||||
"semver": "7.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
@@ -4123,9 +4123,9 @@
|
||||
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
|
||||
},
|
||||
"electron-to-chromium": {
|
||||
"version": "1.3.641",
|
||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.641.tgz",
|
||||
"integrity": "sha512-b0DLhsHSHESC1I+Nx6n4w4Lr61chMd3m/av1rZQhS2IXTzaS5BMM5N+ldWdMIlni9CITMRM09m8He4+YV/92TA=="
|
||||
"version": "1.3.642",
|
||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.642.tgz",
|
||||
"integrity": "sha512-cev+jOrz/Zm1i+Yh334Hed6lQVOkkemk2wRozfMF4MtTR7pxf3r3L5Rbd7uX1zMcEqVJ7alJBnJL7+JffkC6FQ=="
|
||||
},
|
||||
"elliptic": {
|
||||
"version": "6.5.3",
|
||||
@@ -6515,9 +6515,9 @@
|
||||
}
|
||||
},
|
||||
"node-releases": {
|
||||
"version": "1.1.69",
|
||||
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.69.tgz",
|
||||
"integrity": "sha512-DGIjo79VDEyAnRlfSqYTsy+yoHd2IOjJiKUozD2MV2D85Vso6Bug56mb9tT/fY5Urt0iqk01H7x+llAruDR2zA=="
|
||||
"version": "1.1.70",
|
||||
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.70.tgz",
|
||||
"integrity": "sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw=="
|
||||
},
|
||||
"nopt": {
|
||||
"version": "1.0.10",
|
||||
|
||||
+1
-1
@@ -1,3 +1,3 @@
|
||||
master master
|
||||
launchpad/backports v0.39
|
||||
release/v0.40.x v0.40
|
||||
release/v0.41.x v0.41
|
||||
|
||||
Reference in New Issue
Block a user