cosmos / cosmjs

The Swiss Army knife to power JavaScript based client solutions ranging from Web apps/explorers over browser extensions to server-side clients like faucets/scrapers.
https://cosmos.github.io/cosmjs/
Apache License 2.0
645 stars 330 forks source link

Things that don't scale #1440

Open webmaster128 opened 1 year ago

webmaster128 commented 1 year ago

CosmJS made a few design decisions early on that are not great anymore. Part of the reason is that the protobuf API is getting more and more usable directly due to improvements in both Cosmos SDK and proto -> .ts code generation with Telescope. The other part is that the amount of messages and queries is getting a lot.

The group module alone adds 14 message types, more than all relevant modules combined when this was designed.

Instead of trying to catch up here, we should conceptually rething how those things should be done better.

Encode objects

We maintain types like

export interface MsgDepositEncodeObject extends EncodeObject {
  readonly typeUrl: "/cosmos.gov.v1beta1.MsgDeposit";
  readonly value: Partial<MsgDeposit>;
}

to combine the message type and the typeUrl in a type-safe way. We have 20 of them right now already but I am sure a lot of message types are missing

git grep "extends EncodeObject" | cat -n
     1  packages/cosmwasm-stargate/src/modules/wasm/messages.ts:export interface MsgStoreCodeEncodeObject extends EncodeObject {
     2  packages/cosmwasm-stargate/src/modules/wasm/messages.ts:export interface MsgInstantiateContractEncodeObject extends EncodeObject {
     3  packages/cosmwasm-stargate/src/modules/wasm/messages.ts:export interface MsgInstantiateContract2EncodeObject extends EncodeObject {
     4  packages/cosmwasm-stargate/src/modules/wasm/messages.ts:export interface MsgUpdateAdminEncodeObject extends EncodeObject {
     5  packages/cosmwasm-stargate/src/modules/wasm/messages.ts:export interface MsgClearAdminEncodeObject extends EncodeObject {
     6  packages/cosmwasm-stargate/src/modules/wasm/messages.ts:export interface MsgMigrateContractEncodeObject extends EncodeObject {
     7  packages/cosmwasm-stargate/src/modules/wasm/messages.ts:export interface MsgExecuteContractEncodeObject extends EncodeObject {
     8  packages/proto-signing/src/registry.ts:export interface TxBodyEncodeObject extends EncodeObject {
     9  packages/stargate/src/modules/bank/messages.ts:export interface MsgSendEncodeObject extends EncodeObject {
    10  packages/stargate/src/modules/distribution/messages.ts:export interface MsgWithdrawDelegatorRewardEncodeObject extends EncodeObject {
    11  packages/stargate/src/modules/gov/messages.ts:export interface MsgDepositEncodeObject extends EncodeObject {
    12  packages/stargate/src/modules/gov/messages.ts:export interface MsgSubmitProposalEncodeObject extends EncodeObject {
    13  packages/stargate/src/modules/gov/messages.ts:export interface MsgVoteEncodeObject extends EncodeObject {
    14  packages/stargate/src/modules/gov/messages.ts:export interface MsgVoteWeightedEncodeObject extends EncodeObject {
    15  packages/stargate/src/modules/ibc/messages.ts:export interface MsgTransferEncodeObject extends EncodeObject {
    16  packages/stargate/src/modules/staking/messages.ts:export interface MsgBeginRedelegateEncodeObject extends EncodeObject {
    17  packages/stargate/src/modules/staking/messages.ts:export interface MsgCreateValidatorEncodeObject extends EncodeObject {
    18  packages/stargate/src/modules/staking/messages.ts:export interface MsgDelegateEncodeObject extends EncodeObject {
    19  packages/stargate/src/modules/staking/messages.ts:export interface MsgEditValidatorEncodeObject extends EncodeObject {
    20  packages/stargate/src/modules/staking/messages.ts:export interface MsgUndelegateEncodeObject extends EncodeObject {

Amino converters

The fromAmino/toAmino have to be written by hand (and ideally tested) for every message type supported.

We have those types right now but not for all of them the converters are actually implemented:

git grep "extends AminoMsg" | cat -n
     1  packages/stargate/src/modules/bank/aminomessages.ts:export interface AminoMsgSend extends AminoMsg {
     2  packages/stargate/src/modules/bank/aminomessages.ts:export interface AminoMsgMultiSend extends AminoMsg {
     3  packages/stargate/src/modules/crisis/aminomessages.ts:export interface AminoMsgVerifyInvariant extends AminoMsg {
     4  packages/stargate/src/modules/distribution/aminomessages.ts:export interface AminoMsgSetWithdrawAddress extends AminoMsg {
     5  packages/stargate/src/modules/distribution/aminomessages.ts:export interface AminoMsgWithdrawDelegatorReward extends AminoMsg {
     6  packages/stargate/src/modules/distribution/aminomessages.ts:export interface AminoMsgWithdrawValidatorCommission extends AminoMsg {
     7  packages/stargate/src/modules/distribution/aminomessages.ts:export interface AminoMsgFundCommunityPool extends AminoMsg {
     8  packages/stargate/src/modules/evidence/aminomessages.ts:export interface AminoMsgSubmitEvidence extends AminoMsg {
     9  packages/stargate/src/modules/gov/aminomessages.ts:export interface AminoMsgSubmitProposal extends AminoMsg {
    10  packages/stargate/src/modules/gov/aminomessages.ts:export interface AminoMsgVote extends AminoMsg {
    11  packages/stargate/src/modules/gov/aminomessages.ts:export interface AminoMsgVoteWeighted extends AminoMsg {
    12  packages/stargate/src/modules/gov/aminomessages.ts:export interface AminoMsgDeposit extends AminoMsg {
    13  packages/stargate/src/modules/ibc/aminomessages.ts:export interface AminoMsgTransfer extends AminoMsg {
    14  packages/stargate/src/modules/slashing/aminomessages.ts:export interface AminoMsgUnjail extends AminoMsg {
    15  packages/stargate/src/modules/staking/aminomessages.ts:export interface AminoMsgCreateValidator extends AminoMsg {
    16  packages/stargate/src/modules/staking/aminomessages.ts:export interface AminoMsgEditValidator extends AminoMsg {
    17  packages/stargate/src/modules/staking/aminomessages.ts:export interface AminoMsgDelegate extends AminoMsg {
    18  packages/stargate/src/modules/staking/aminomessages.ts:export interface AminoMsgBeginRedelegate extends AminoMsg {
    19  packages/stargate/src/modules/staking/aminomessages.ts:export interface AminoMsgUndelegate extends AminoMsg {
    20  packages/stargate/src/modules/vesting/aminomessages.ts:export interface AminoMsgCreateVestingAccount extends AminoMsg {

Query wrappers

The extensible QueryClient is a nice idea in general, but someone has to write query wrappers for each query. Missing queries have been a source of frustration for users before. Also limited access to advanced setting like query height or pagination settings is an issue.

pyramation commented 1 year ago

example for Telescope-generated objects

pyramation commented 1 year ago

for decimal issues, we've added an option into Telescope

prototypes.typingsFormat.customTypes.useCosmosSDKDec is the option, that will get embedded into decode so RPC queries get fixed.