Merge pull request #724 from cosmos/657-independent-stargate-3

Reorganise fees for Launchpad/Stargate
This commit is contained in:
Simon Warta 2021-03-23 19:28:55 +01:00 committed by GitHub
commit e5fee21b13
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 129 additions and 42 deletions

View File

@ -2,7 +2,6 @@
import { Code } from "@cosmjs/cosmwasm-launchpad";
import { sha256 } from "@cosmjs/crypto";
import { Bech32, fromAscii, fromBase64, fromHex, toAscii, toBase64 } from "@cosmjs/encoding";
import { StdFee } from "@cosmjs/launchpad";
import { Int53 } from "@cosmjs/math";
import {
DirectSecp256k1HdWallet,
@ -11,7 +10,7 @@ import {
makeSignDoc,
Registry,
} from "@cosmjs/proto-signing";
import { assertIsBroadcastTxSuccess, coins, logs } from "@cosmjs/stargate";
import { assertIsBroadcastTxSuccess, coins, logs, StdFee } from "@cosmjs/stargate";
import { TxRaw } from "@cosmjs/stargate/build/codec/cosmos/tx/v1beta1/tx";
import { assert, sleep } from "@cosmjs/utils";
import { ReadonlyDate } from "readonly-date";

View File

@ -1,7 +1,6 @@
/* eslint-disable @typescript-eslint/naming-convention */
import { sha256 } from "@cosmjs/crypto";
import { fromAscii, fromHex, toAscii, toHex } from "@cosmjs/encoding";
import { StdFee } from "@cosmjs/launchpad";
import { DirectSecp256k1HdWallet, OfflineDirectSigner, Registry } from "@cosmjs/proto-signing";
import {
assertIsBroadcastTxSuccess,
@ -11,6 +10,7 @@ import {
coins,
logs,
SigningStargateClient,
StdFee,
} from "@cosmjs/stargate";
import { assert, assertDefined } from "@cosmjs/utils";
import Long from "long";

View File

@ -2,9 +2,9 @@
import { UploadMeta } from "@cosmjs/cosmwasm-launchpad";
import { sha256 } from "@cosmjs/crypto";
import { toHex } from "@cosmjs/encoding";
import { GasPrice, MsgDelegate as LaunchpadMsgDelegate, Secp256k1HdWallet } from "@cosmjs/launchpad";
import { MsgDelegate as LaunchpadMsgDelegate, Secp256k1HdWallet } from "@cosmjs/launchpad";
import { DirectSecp256k1HdWallet, Registry } from "@cosmjs/proto-signing";
import { AminoTypes, assertIsBroadcastTxSuccess, coin, coins } from "@cosmjs/stargate";
import { AminoTypes, assertIsBroadcastTxSuccess, coin, coins, GasPrice } from "@cosmjs/stargate";
import { DeepPartial, MsgSend } from "@cosmjs/stargate/build/codec/cosmos/bank/v1beta1/tx";
import { Coin } from "@cosmjs/stargate/build/codec/cosmos/base/v1beta1/coin";
import { MsgDelegate } from "@cosmjs/stargate/build/codec/cosmos/staking/v1beta1/tx";

View File

@ -13,14 +13,7 @@ import {
} from "@cosmjs/cosmwasm-launchpad";
import { sha256 } from "@cosmjs/crypto";
import { fromBase64, toHex, toUtf8 } from "@cosmjs/encoding";
import {
buildFeeTable,
CosmosFeeTable,
GasLimits,
GasPrice,
makeSignDoc as makeSignDocAmino,
StdFee,
} from "@cosmjs/launchpad";
import { CosmosFeeTable, makeSignDoc as makeSignDocAmino } from "@cosmjs/launchpad";
import { Int53, Uint53 } from "@cosmjs/math";
import {
EncodeObject,
@ -35,10 +28,14 @@ import {
AminoTypes,
BroadcastTxFailure,
BroadcastTxResponse,
buildFeeTable,
Coin,
defaultRegistryTypes,
GasLimits,
GasPrice,
isBroadcastTxFailure,
logs,
StdFee,
} from "@cosmjs/stargate";
import { SignMode } from "@cosmjs/stargate/build/codec/cosmos/tx/signing/v1beta1/signing";
import { TxRaw } from "@cosmjs/stargate/build/codec/cosmos/tx/v1beta1/tx";

View File

@ -4,6 +4,7 @@ import { ReadonlyDate } from "readonly-date";
import { assertIsBroadcastTxSuccess, CosmosClient, PrivateCosmosClient } from "./cosmosclient";
import { makeSignDoc } from "./encoding";
import { StdFee } from "./fee";
import { findAttribute } from "./logs";
import { MsgSend } from "./msgs";
import { Secp256k1HdWallet } from "./secp256k1hdwallet";
@ -17,7 +18,6 @@ import {
unused,
} from "./testutils.spec";
import { isWrappedStdTx, makeStdTx } from "./tx";
import { StdFee } from "./types";
const blockTime = 1_000; // ms

View File

@ -2,8 +2,8 @@
import { toUtf8 } from "@cosmjs/encoding";
import { Uint53 } from "@cosmjs/math";
import { StdFee } from "./fee";
import { Msg } from "./msgs";
import { StdFee } from "./types";
function sortedObject(obj: any): any {
if (typeof obj !== "object" || obj === null) {

View File

@ -1,6 +1,6 @@
import { Decimal } from "@cosmjs/math";
import { GasPrice } from "./gas";
import { GasPrice } from "./fee";
describe("GasPrice", () => {
it("can be constructed", () => {

View File

@ -1,7 +1,11 @@
import { Decimal, Uint53 } from "@cosmjs/math";
import { coins } from "./coins";
import { StdFee } from "./types";
import { Coin, coins } from "./coins";
export interface StdFee {
readonly amount: readonly Coin[];
readonly gas: string;
}
export type FeeTable = Record<string, StdFee>;

View File

@ -43,7 +43,7 @@ export {
isSearchByTagsQuery,
} from "./cosmosclient";
export { makeSignDoc, serializeSignDoc, StdSignDoc } from "./encoding";
export { buildFeeTable, FeeTable, GasLimits, GasPrice } from "./gas";
export { buildFeeTable, FeeTable, GasLimits, GasPrice, StdFee } from "./fee";
export {
AuthAccountsResponse,
AuthExtension,
@ -145,7 +145,6 @@ export { findSequenceForSignedTx } from "./sequence";
export { AccountData, Algo, AminoSignResponse, OfflineSigner } from "./signer";
export { CosmosFeeTable, SigningCosmosClient } from "./signingcosmosclient";
export { isStdTx, isWrappedStdTx, makeStdTx, CosmosSdkTx, StdTx, WrappedStdTx, WrappedTx } from "./tx";
export { StdFee } from "./types";
export { executeKdf, KdfConfiguration } from "./wallet";
export { extractKdfConfiguration, Secp256k1HdWallet } from "./secp256k1hdwallet";
export { Secp256k1Wallet } from "./secp256k1wallet";

View File

@ -4,6 +4,7 @@ import { assert, sleep } from "@cosmjs/utils";
import { Coin } from "../coins";
import { isBroadcastTxFailure } from "../cosmosclient";
import { makeSignDoc } from "../encoding";
import { StdFee } from "../fee";
import { parseLogs } from "../logs";
import { MsgSend } from "../msgs";
import { makeCosmoshubPath } from "../paths";
@ -21,7 +22,6 @@ import {
unused,
} from "../testutils.spec";
import { isWrappedStdTx, makeStdTx, StdTx } from "../tx";
import { StdFee } from "../types";
import { setupAuthExtension } from "./auth";
import { TxsResponse } from "./base";
import { LcdApiArray, LcdClient } from "./lcdclient";

View File

@ -3,7 +3,7 @@ import { assert } from "@cosmjs/utils";
import { Coin, coin, coins } from "./coins";
import { assertIsBroadcastTxSuccess, PrivateCosmosClient } from "./cosmosclient";
import { GasPrice } from "./gas";
import { GasPrice } from "./fee";
import { MsgDelegate, MsgSend } from "./msgs";
import { makeCosmoshubPath } from "./paths";
import { Secp256k1HdWallet } from "./secp256k1hdwallet";

View File

@ -4,12 +4,11 @@ import equals from "fast-deep-equal";
import { Coin } from "./coins";
import { Account, BroadcastTxResult, CosmosClient, GetSequenceResult } from "./cosmosclient";
import { makeSignDoc } from "./encoding";
import { buildFeeTable, FeeTable, GasLimits, GasPrice } from "./gas";
import { buildFeeTable, FeeTable, GasLimits, GasPrice, StdFee } from "./fee";
import { BroadcastMode } from "./lcdapi";
import { Msg, MsgSend } from "./msgs";
import { OfflineSigner } from "./signer";
import { makeStdTx, StdTx } from "./tx";
import { StdFee } from "./types";
/**
* These fees are used by the higher level methods of SigningCosmosClient

View File

@ -3,8 +3,8 @@ import { StdSignature } from "@cosmjs/amino";
import { coins } from "./coins";
import { makeSignDoc } from "./encoding";
import { StdFee } from "./fee";
import { makeStdTx } from "./tx";
import { StdFee } from "./types";
describe("tx", () => {
describe("makeStdTx", () => {

View File

@ -1,8 +1,8 @@
import { StdSignature } from "@cosmjs/amino";
import { StdSignDoc } from "./encoding";
import { StdFee } from "./fee";
import { Msg } from "./msgs";
import { StdFee } from "./types";
/**
* A Cosmos SDK StdTx

View File

@ -1,7 +0,0 @@
/* eslint-disable @typescript-eslint/naming-convention */
import { Coin } from "./coins";
export interface StdFee {
readonly amount: readonly Coin[];
readonly gas: string;
}

View File

@ -0,0 +1,23 @@
import { Decimal } from "@cosmjs/math";
import { GasPrice } from "./fee";
describe("GasPrice", () => {
it("can be constructed", () => {
const inputs = ["3.14", "3", "0.14"];
inputs.forEach((input) => {
const gasPrice = new GasPrice(Decimal.fromUserInput(input, 18), "utest");
expect(gasPrice.amount.toString()).toEqual(input);
expect(gasPrice.denom).toEqual("utest");
});
});
it("can be constructed from a config string", () => {
const inputs = ["3.14", "3", "0.14"];
inputs.forEach((input) => {
const gasPrice = GasPrice.fromString(`${input}utest`);
expect(gasPrice.amount.toString()).toEqual(input);
expect(gasPrice.denom).toEqual("utest");
});
});
});

View File

@ -0,0 +1,77 @@
import { Decimal, Uint53 } from "@cosmjs/math";
import { Coin, coins } from "@cosmjs/proto-signing";
/**
* This is the same as StdFee from @cosmjs/launchpad but those might diverge in the future.
*/
export interface StdFee {
readonly amount: readonly Coin[];
readonly gas: string;
}
/**
* This is the same as FeeTable from @cosmjs/launchpad but those might diverge in the future.
*/
export type FeeTable = Record<string, StdFee>;
/**
* This is the same as GasPrice from @cosmjs/launchpad but those might diverge in the future.
*/
export class GasPrice {
public readonly amount: Decimal;
public readonly denom: string;
public constructor(amount: Decimal, denom: string) {
this.amount = amount;
this.denom = denom;
}
public static fromString(gasPrice: string): GasPrice {
const matchResult = gasPrice.match(/^(?<amount>.+?)(?<denom>[a-z]+)$/);
if (!matchResult) {
throw new Error("Invalid gas price string");
}
const { amount, denom } = matchResult.groups as { readonly amount: string; readonly denom: string };
if (denom.length < 3 || denom.length > 127) {
throw new Error("Gas price denomination must be between 3 and 127 characters");
}
const fractionalDigits = 18;
const decimalAmount = Decimal.fromUserInput(amount, fractionalDigits);
return new GasPrice(decimalAmount, denom);
}
}
/**
* This is the same as GasLimits from @cosmjs/launchpad but those might diverge in the future.
*/
export type GasLimits<T extends Record<string, StdFee>> = {
readonly [key in keyof T]: number;
};
/**
* This is the same as calculateFee from @cosmjs/launchpad but those might diverge in the future.
*/
function calculateFee(gasLimit: number, { denom, amount: gasPriceAmount }: GasPrice): StdFee {
const amount = Math.ceil(gasPriceAmount.multiply(new Uint53(gasLimit)).toFloatApproximation());
return {
amount: coins(amount, denom),
gas: gasLimit.toString(),
};
}
/**
* This is the same as buildFeeTable from @cosmjs/launchpad but those might diverge in the future.
*/
export function buildFeeTable<T extends Record<string, StdFee>>(
gasPrice: GasPrice,
defaultGasLimits: GasLimits<T>,
gasLimits: Partial<GasLimits<T>>,
): T {
return Object.entries(defaultGasLimits).reduce(
(feeTable, [type, defaultGasLimit]) => ({
...feeTable,
[type]: calculateFee(gasLimits[type] || defaultGasLimit, gasPrice),
}),
{} as T,
);
}

View File

@ -2,6 +2,7 @@ export { Coin, coin, coins, parseCoins } from "@cosmjs/proto-signing";
export { Account, accountFromAny } from "./accounts";
export { AminoConverter, AminoTypes } from "./aminotypes";
export { buildFeeTable, FeeTable, GasLimits, GasPrice, StdFee } from "./fee";
export * as logs from "./logs";
export {
AuthExtension,

View File

@ -1,5 +1,5 @@
/* eslint-disable @typescript-eslint/naming-convention,no-bitwise */
import { GasPrice, MsgDelegate as LaunchpadMsgDelegate, Secp256k1HdWallet } from "@cosmjs/launchpad";
import { MsgDelegate as LaunchpadMsgDelegate, Secp256k1HdWallet } from "@cosmjs/launchpad";
import { coin, coins, DirectSecp256k1HdWallet, Registry } from "@cosmjs/proto-signing";
import { assert, sleep } from "@cosmjs/utils";
import protobuf from "protobufjs/minimal";
@ -9,6 +9,7 @@ import { MsgSend } from "./codec/cosmos/bank/v1beta1/tx";
import { Coin } from "./codec/cosmos/base/v1beta1/coin";
import { DeepPartial, MsgDelegate } from "./codec/cosmos/staking/v1beta1/tx";
import { Tx } from "./codec/cosmos/tx/v1beta1/tx";
import { GasPrice } from "./fee";
import { PrivateSigningStargateClient, SigningStargateClient } from "./signingstargateclient";
import { assertIsBroadcastTxSuccess } from "./stargateclient";
import {

View File

@ -1,13 +1,6 @@
import { encodeSecp256k1Pubkey } from "@cosmjs/amino";
import { fromBase64 } from "@cosmjs/encoding";
import {
buildFeeTable,
CosmosFeeTable,
GasLimits,
GasPrice,
makeSignDoc as makeSignDocAmino,
StdFee,
} from "@cosmjs/launchpad";
import { CosmosFeeTable, makeSignDoc as makeSignDocAmino } from "@cosmjs/launchpad";
import { Int53 } from "@cosmjs/math";
import {
EncodeObject,
@ -63,6 +56,7 @@ import {
MsgConnectionOpenInit,
MsgConnectionOpenTry,
} from "./codec/ibc/core/connection/v1/tx";
import { buildFeeTable, GasLimits, GasPrice, StdFee } from "./fee";
import { BroadcastTxResponse, StargateClient } from "./stargateclient";
const defaultGasPrice = GasPrice.fromString("0.025ucosm");