stargate: Simplify Amino type checks

This commit is contained in:
willclarktech 2021-01-13 16:41:51 +00:00
parent 4624e68590
commit 6433173303
No known key found for this signature in database
GPG Key ID: 551A86E2E398ADF7

View File

@ -1,7 +1,6 @@
/* eslint-disable @typescript-eslint/naming-convention */ /* eslint-disable @typescript-eslint/naming-convention */
import { fromBase64, toBase64 } from "@cosmjs/encoding"; import { fromBase64, toBase64 } from "@cosmjs/encoding";
import { import {
Coin,
decodeBech32Pubkey, decodeBech32Pubkey,
encodeBech32Pubkey, encodeBech32Pubkey,
Msg, Msg,
@ -14,11 +13,11 @@ import {
MsgUndelegate, MsgUndelegate,
} from "@cosmjs/launchpad"; } from "@cosmjs/launchpad";
import { EncodeObject } from "@cosmjs/proto-signing"; import { EncodeObject } from "@cosmjs/proto-signing";
import { assert } from "@cosmjs/utils"; import { assertDefinedAndNotNull } from "@cosmjs/utils";
import { cosmos } from "./codec"; import { cosmos } from "./codec";
import { coinFromProto } from "./stargateclient";
type ICoin = cosmos.base.v1beta1.ICoin;
type IMsgSend = cosmos.bank.v1beta1.IMsgSend; type IMsgSend = cosmos.bank.v1beta1.IMsgSend;
type IMsgMultiSend = cosmos.bank.v1beta1.IMsgMultiSend; type IMsgMultiSend = cosmos.bank.v1beta1.IMsgMultiSend;
type IMsgBeginRedelegate = cosmos.staking.v1beta1.IMsgBeginRedelegate; type IMsgBeginRedelegate = cosmos.staking.v1beta1.IMsgBeginRedelegate;
@ -33,29 +32,18 @@ export interface AminoConverter {
readonly fromAmino: (value: any) => any; readonly fromAmino: (value: any) => any;
} }
function checkAmount(amount: readonly ICoin[] | undefined | null): readonly Coin[] {
assert(amount, "missing amount");
return amount.map((a) => {
assert(a.amount, "missing amount");
assert(a.denom, "missing denom");
return {
amount: a.amount,
denom: a.denom,
};
});
}
function createDefaultTypes(prefix: string): Record<string, AminoConverter> { function createDefaultTypes(prefix: string): Record<string, AminoConverter> {
return { return {
"/cosmos.bank.v1beta1.MsgSend": { "/cosmos.bank.v1beta1.MsgSend": {
aminoType: "cosmos-sdk/MsgSend", aminoType: "cosmos-sdk/MsgSend",
toAmino: ({ fromAddress, toAddress, amount }: IMsgSend): MsgSend["value"] => { toAmino: ({ fromAddress, toAddress, amount }: IMsgSend): MsgSend["value"] => {
assert(fromAddress, "missing fromAddress"); assertDefinedAndNotNull(fromAddress, "missing fromAddress");
assert(toAddress, "missing toAddress"); assertDefinedAndNotNull(toAddress, "missing toAddress");
assertDefinedAndNotNull(amount, "missing amount");
return { return {
from_address: fromAddress, from_address: fromAddress,
to_address: toAddress, to_address: toAddress,
amount: checkAmount(amount), amount: amount.map(coinFromProto),
}; };
}, },
fromAmino: ({ from_address, to_address, amount }: MsgSend["value"]): IMsgSend => ({ fromAmino: ({ from_address, to_address, amount }: MsgSend["value"]): IMsgSend => ({
@ -67,21 +55,23 @@ function createDefaultTypes(prefix: string): Record<string, AminoConverter> {
"/cosmos.bank.v1beta1.MsgMultiSend": { "/cosmos.bank.v1beta1.MsgMultiSend": {
aminoType: "cosmos-sdk/MsgMultiSend", aminoType: "cosmos-sdk/MsgMultiSend",
toAmino: ({ inputs, outputs }: IMsgMultiSend): MsgMultiSend["value"] => { toAmino: ({ inputs, outputs }: IMsgMultiSend): MsgMultiSend["value"] => {
assert(inputs, "missing inputs"); assertDefinedAndNotNull(inputs, "missing inputs");
assert(outputs, "missing outputs"); assertDefinedAndNotNull(outputs, "missing outputs");
return { return {
inputs: inputs.map((input) => { inputs: inputs.map((input) => {
assert(input.address, "missing input.address"); assertDefinedAndNotNull(input.address, "missing input.address");
assertDefinedAndNotNull(input.coins, "missing input.amount");
return { return {
address: input.address, address: input.address,
coins: checkAmount(input.coins), coins: input.coins.map(coinFromProto),
}; };
}), }),
outputs: outputs.map((output) => { outputs: outputs.map((output) => {
assert(output.address, "missing output.address"); assertDefinedAndNotNull(output.address, "missing output.address");
assertDefinedAndNotNull(output.coins, "missing output.coins");
return { return {
address: output.address, address: output.address,
coins: checkAmount(output.coins), coins: output.coins.map(coinFromProto),
}; };
}), }),
}; };
@ -105,20 +95,15 @@ function createDefaultTypes(prefix: string): Record<string, AminoConverter> {
validatorDstAddress, validatorDstAddress,
amount, amount,
}: IMsgBeginRedelegate): MsgBeginRedelegate["value"] => { }: IMsgBeginRedelegate): MsgBeginRedelegate["value"] => {
assert(delegatorAddress, "missing delegatorAddress"); assertDefinedAndNotNull(delegatorAddress, "missing delegatorAddress");
assert(validatorSrcAddress, "missing validatorSrcAddress"); assertDefinedAndNotNull(validatorSrcAddress, "missing validatorSrcAddress");
assert(validatorDstAddress, "missing validatorDstAddress"); assertDefinedAndNotNull(validatorDstAddress, "missing validatorDstAddress");
assert(amount, "missing amount"); assertDefinedAndNotNull(amount, "missing amount");
assert(amount.amount, "missing amount.amount");
assert(amount.denom, "missing amount.denom");
return { return {
delegator_address: delegatorAddress, delegator_address: delegatorAddress,
validator_src_address: validatorSrcAddress, validator_src_address: validatorSrcAddress,
validator_dst_address: validatorDstAddress, validator_dst_address: validatorDstAddress,
amount: { amount: coinFromProto(amount),
amount: amount.amount,
denom: amount.denom,
},
}; };
}, },
fromAmino: ({ fromAmino: ({
@ -144,24 +129,22 @@ function createDefaultTypes(prefix: string): Record<string, AminoConverter> {
pubkey, pubkey,
value, value,
}: IMsgCreateValidator): MsgCreateValidator["value"] => { }: IMsgCreateValidator): MsgCreateValidator["value"] => {
assert(description, "missing description"); assertDefinedAndNotNull(description, "missing description");
assert(description.moniker, "missing description.moniker"); assertDefinedAndNotNull(description.moniker, "missing description.moniker");
assert(description.identity, "missing description.identity"); assertDefinedAndNotNull(description.identity, "missing description.identity");
assert(description.website, "missing description.website"); assertDefinedAndNotNull(description.website, "missing description.website");
assert(description.securityContact, "missing description.securityContact"); assertDefinedAndNotNull(description.securityContact, "missing description.securityContact");
assert(description.details, "missing description.details"); assertDefinedAndNotNull(description.details, "missing description.details");
assert(commission, "missing commission"); assertDefinedAndNotNull(commission, "missing commission");
assert(commission.rate, "missing commission.rate"); assertDefinedAndNotNull(commission.rate, "missing commission.rate");
assert(commission.maxRate, "missing commission.maxRate"); assertDefinedAndNotNull(commission.maxRate, "missing commission.maxRate");
assert(commission.maxChangeRate, "missing commission.maxChangeRate"); assertDefinedAndNotNull(commission.maxChangeRate, "missing commission.maxChangeRate");
assert(minSelfDelegation, "missing minSelfDelegation"); assertDefinedAndNotNull(minSelfDelegation, "missing minSelfDelegation");
assert(delegatorAddress, "missing delegatorAddress"); assertDefinedAndNotNull(delegatorAddress, "missing delegatorAddress");
assert(validatorAddress, "missing validatorAddress"); assertDefinedAndNotNull(validatorAddress, "missing validatorAddress");
assert(pubkey, "missing pubkey"); assertDefinedAndNotNull(pubkey, "missing pubkey");
assert(pubkey.value, "missing pubkey.value"); assertDefinedAndNotNull(pubkey.value, "missing pubkey.value");
assert(value, "missing value"); assertDefinedAndNotNull(value, "missing value");
assert(value.amount, "missing value.amount");
assert(value.denom, "missing value.denom");
return { return {
description: { description: {
moniker: description.moniker, moniker: description.moniker,
@ -185,10 +168,7 @@ function createDefaultTypes(prefix: string): Record<string, AminoConverter> {
}, },
prefix, prefix,
), ),
value: { value: coinFromProto(value),
amount: value.amount,
denom: value.denom,
},
}; };
}, },
fromAmino: ({ fromAmino: ({
@ -231,18 +211,13 @@ function createDefaultTypes(prefix: string): Record<string, AminoConverter> {
"/cosmos.staking.v1beta1.MsgDelegate": { "/cosmos.staking.v1beta1.MsgDelegate": {
aminoType: "cosmos-sdk/MsgDelegate", aminoType: "cosmos-sdk/MsgDelegate",
toAmino: ({ delegatorAddress, validatorAddress, amount }: IMsgDelegate): MsgDelegate["value"] => { toAmino: ({ delegatorAddress, validatorAddress, amount }: IMsgDelegate): MsgDelegate["value"] => {
assert(delegatorAddress, "missing delegatorAddress"); assertDefinedAndNotNull(delegatorAddress, "missing delegatorAddress");
assert(validatorAddress, "missing validatorAddress"); assertDefinedAndNotNull(validatorAddress, "missing validatorAddress");
assert(amount, "missing amount"); assertDefinedAndNotNull(amount, "missing amount");
assert(amount.amount, "missing amount.amount");
assert(amount.denom, "missing amount.denom");
return { return {
delegator_address: delegatorAddress, delegator_address: delegatorAddress,
validator_address: validatorAddress, validator_address: validatorAddress,
amount: { amount: coinFromProto(amount),
amount: amount.amount,
denom: amount.denom,
},
}; };
}, },
fromAmino: ({ delegator_address, validator_address, amount }: MsgDelegate["value"]): IMsgDelegate => ({ fromAmino: ({ delegator_address, validator_address, amount }: MsgDelegate["value"]): IMsgDelegate => ({
@ -259,15 +234,15 @@ function createDefaultTypes(prefix: string): Record<string, AminoConverter> {
minSelfDelegation, minSelfDelegation,
validatorAddress, validatorAddress,
}: IMsgEditValidator): MsgEditValidator["value"] => { }: IMsgEditValidator): MsgEditValidator["value"] => {
assert(description, "missing description"); assertDefinedAndNotNull(description, "missing description");
assert(description.moniker, "missing description.moniker"); assertDefinedAndNotNull(description.moniker, "missing description.moniker");
assert(description.identity, "missing description.identity"); assertDefinedAndNotNull(description.identity, "missing description.identity");
assert(description.website, "missing description.website"); assertDefinedAndNotNull(description.website, "missing description.website");
assert(description.securityContact, "missing description.securityContact"); assertDefinedAndNotNull(description.securityContact, "missing description.securityContact");
assert(description.details, "missing description.details"); assertDefinedAndNotNull(description.details, "missing description.details");
assert(commissionRate, "missing commissionRate"); assertDefinedAndNotNull(commissionRate, "missing commissionRate");
assert(minSelfDelegation, "missing minSelfDelegation"); assertDefinedAndNotNull(minSelfDelegation, "missing minSelfDelegation");
assert(validatorAddress, "missing validatorAddress"); assertDefinedAndNotNull(validatorAddress, "missing validatorAddress");
return { return {
description: { description: {
moniker: description.moniker, moniker: description.moniker,
@ -302,18 +277,13 @@ function createDefaultTypes(prefix: string): Record<string, AminoConverter> {
"/cosmos.staking.v1beta1.MsgUndelegate": { "/cosmos.staking.v1beta1.MsgUndelegate": {
aminoType: "cosmos-sdk/MsgUndelegate", aminoType: "cosmos-sdk/MsgUndelegate",
toAmino: ({ delegatorAddress, validatorAddress, amount }: IMsgUndelegate): MsgUndelegate["value"] => { toAmino: ({ delegatorAddress, validatorAddress, amount }: IMsgUndelegate): MsgUndelegate["value"] => {
assert(delegatorAddress, "missing delegatorAddress"); assertDefinedAndNotNull(delegatorAddress, "missing delegatorAddress");
assert(validatorAddress, "missing validatorAddress"); assertDefinedAndNotNull(validatorAddress, "missing validatorAddress");
assert(amount, "missing amount"); assertDefinedAndNotNull(amount, "missing amount");
assert(amount.amount, "missing amount.amount");
assert(amount.denom, "missing amount.denom");
return { return {
delegator_address: delegatorAddress, delegator_address: delegatorAddress,
validator_address: validatorAddress, validator_address: validatorAddress,
amount: { amount: coinFromProto(amount),
amount: amount.amount,
denom: amount.denom,
},
}; };
}, },
fromAmino: ({ fromAmino: ({