From 9da9225345db48a176f331ac3a183b61a9c12a8f Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Sat, 1 Feb 2020 17:09:27 +0100 Subject: [PATCH] Move decimalToCoin and coinToDecimal into SDK --- packages/bcp/src/decode.ts | 4 ++-- packages/bcp/src/encode.ts | 4 ++-- packages/bcp/src/types.ts | 27 --------------------------- packages/bcp/types/types.d.ts | 11 ----------- packages/sdk/package.json | 1 + packages/sdk/src/decoding.ts | 13 +++++++++++++ packages/sdk/src/encoding.ts | 20 ++++++++++++++++++++ packages/sdk/src/index.ts | 2 ++ packages/sdk/types/decoding.d.ts | 7 +++++++ packages/sdk/types/encoding.d.ts | 8 ++++++++ packages/sdk/types/index.d.ts | 2 ++ 11 files changed, 57 insertions(+), 42 deletions(-) create mode 100644 packages/sdk/src/decoding.ts create mode 100644 packages/sdk/src/encoding.ts create mode 100644 packages/sdk/types/decoding.d.ts create mode 100644 packages/sdk/types/encoding.d.ts diff --git a/packages/bcp/src/decode.ts b/packages/bcp/src/decode.ts index 002cc5b3..31712fc0 100644 --- a/packages/bcp/src/decode.ts +++ b/packages/bcp/src/decode.ts @@ -1,4 +1,4 @@ -import { isAminoStdTx, TxsResponse } from "@cosmwasm/sdk"; +import { coinToDecimal, isAminoStdTx, TxsResponse } from "@cosmwasm/sdk"; import { Address, Algorithm, @@ -20,7 +20,7 @@ import { import { Encoding } from "@iov/encoding"; import amino from "@tendermint/amino-js"; -import { coinToDecimal, TokenInfos } from "./types"; +import { TokenInfos } from "./types"; const { fromBase64 } = Encoding; diff --git a/packages/bcp/src/encode.ts b/packages/bcp/src/encode.ts index 3ce2ebcf..5fb4b842 100644 --- a/packages/bcp/src/encode.ts +++ b/packages/bcp/src/encode.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/camelcase */ -import { AminoTx } from "@cosmwasm/sdk"; +import { AminoTx, decimalToCoin } from "@cosmwasm/sdk"; import { Algorithm, Amount, @@ -14,7 +14,7 @@ import { Secp256k1 } from "@iov/crypto"; import { Decimal, Encoding } from "@iov/encoding"; import amino from "@tendermint/amino-js"; -import { decimalToCoin, TokenInfos } from "./types"; +import { TokenInfos } from "./types"; const { toBase64 } = Encoding; diff --git a/packages/bcp/src/types.ts b/packages/bcp/src/types.ts index c2f5edd1..07003e90 100644 --- a/packages/bcp/src/types.ts +++ b/packages/bcp/src/types.ts @@ -1,35 +1,8 @@ import { TokenInfo } from "@cosmwasm/sdk"; import { Nonce } from "@iov/bcp"; -import { Decimal } from "@iov/encoding"; -import amino from "@tendermint/amino-js"; export type TokenInfos = ReadonlyArray; -export function decimalToCoin(lookup: readonly TokenInfo[], value: Decimal, ticker: string): amino.Coin { - const match = lookup.find(token => token.ticker === ticker); - if (!match) { - throw Error(`unknown ticker: ${ticker}`); - } - if (match.fractionalDigits !== value.fractionalDigits) { - throw new Error( - "Mismatch in fractional digits between token and value. If you really want, implement a conversion here. However, this indicates a bug in the caller code.", - ); - } - return { - denom: match.denom, - amount: value.atomics, - }; -} - -export function coinToDecimal(tokens: readonly TokenInfo[], coin: amino.Coin): readonly [Decimal, string] { - const match = tokens.find(({ denom }) => denom === coin.denom); - if (!match) { - throw Error(`unknown denom: ${coin.denom}`); - } - const value = Decimal.fromAtomics(coin.amount, match.fractionalDigits); - return [value, match.ticker]; -} - // tslint:disable-next-line:no-bitwise const maxAcct = 1 << 23; // tslint:disable-next-line:no-bitwise diff --git a/packages/bcp/types/types.d.ts b/packages/bcp/types/types.d.ts index 6a8f6f49..8bdcbf3b 100644 --- a/packages/bcp/types/types.d.ts +++ b/packages/bcp/types/types.d.ts @@ -1,17 +1,6 @@ import { TokenInfo } from "@cosmwasm/sdk"; import { Nonce } from "@iov/bcp"; -import { Decimal } from "@iov/encoding"; -import amino from "@tendermint/amino-js"; export declare type TokenInfos = ReadonlyArray; -export declare function decimalToCoin( - lookup: readonly TokenInfo[], - value: Decimal, - ticker: string, -): amino.Coin; -export declare function coinToDecimal( - tokens: readonly TokenInfo[], - coin: amino.Coin, -): readonly [Decimal, string]; export interface NonceInfo { readonly account_number: string; readonly sequence: string; diff --git a/packages/sdk/package.json b/packages/sdk/package.json index d69de11a..e3a7ccf6 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -38,6 +38,7 @@ "pack-web": "yarn build-or-skip && webpack --mode development --config webpack.web.config.js" }, "dependencies": { + "@iov/encoding": "^2.0.0-alpha.7", "@tendermint/amino-js": "^0.7.0-alpha.1", "axios": "^0.19.0" }, diff --git a/packages/sdk/src/decoding.ts b/packages/sdk/src/decoding.ts new file mode 100644 index 00000000..701e1e69 --- /dev/null +++ b/packages/sdk/src/decoding.ts @@ -0,0 +1,13 @@ +import { Decimal } from "@iov/encoding"; +import amino from "@tendermint/amino-js"; + +import { TokenInfo } from "./types"; + +export function coinToDecimal(tokens: readonly TokenInfo[], coin: amino.Coin): readonly [Decimal, string] { + const match = tokens.find(({ denom }) => denom === coin.denom); + if (!match) { + throw Error(`unknown denom: ${coin.denom}`); + } + const value = Decimal.fromAtomics(coin.amount, match.fractionalDigits); + return [value, match.ticker]; +} diff --git a/packages/sdk/src/encoding.ts b/packages/sdk/src/encoding.ts new file mode 100644 index 00000000..c4bed170 --- /dev/null +++ b/packages/sdk/src/encoding.ts @@ -0,0 +1,20 @@ +import { Decimal } from "@iov/encoding"; +import amino from "@tendermint/amino-js"; + +import { TokenInfo } from "./types"; + +export function decimalToCoin(lookup: readonly TokenInfo[], value: Decimal, ticker: string): amino.Coin { + const match = lookup.find(token => token.ticker === ticker); + if (!match) { + throw Error(`unknown ticker: ${ticker}`); + } + if (match.fractionalDigits !== value.fractionalDigits) { + throw new Error( + "Mismatch in fractional digits between token and value. If you really want, implement a conversion here. However, this indicates a bug in the caller code.", + ); + } + return { + denom: match.denom, + amount: value.atomics, + }; +} diff --git a/packages/sdk/src/index.ts b/packages/sdk/src/index.ts index d4162d90..888fb6c3 100644 --- a/packages/sdk/src/index.ts +++ b/packages/sdk/src/index.ts @@ -1,2 +1,4 @@ +export { coinToDecimal } from "./decoding"; +export { decimalToCoin } from "./encoding"; export { RestClient, TxsResponse } from "./restclient"; export { AminoTx, isAminoStdTx, TokenInfo } from "./types"; diff --git a/packages/sdk/types/decoding.d.ts b/packages/sdk/types/decoding.d.ts new file mode 100644 index 00000000..6c1552eb --- /dev/null +++ b/packages/sdk/types/decoding.d.ts @@ -0,0 +1,7 @@ +import { Decimal } from "@iov/encoding"; +import amino from "@tendermint/amino-js"; +import { TokenInfo } from "./types"; +export declare function coinToDecimal( + tokens: readonly TokenInfo[], + coin: amino.Coin, +): readonly [Decimal, string]; diff --git a/packages/sdk/types/encoding.d.ts b/packages/sdk/types/encoding.d.ts new file mode 100644 index 00000000..c8e3334e --- /dev/null +++ b/packages/sdk/types/encoding.d.ts @@ -0,0 +1,8 @@ +import { Decimal } from "@iov/encoding"; +import amino from "@tendermint/amino-js"; +import { TokenInfo } from "./types"; +export declare function decimalToCoin( + lookup: readonly TokenInfo[], + value: Decimal, + ticker: string, +): amino.Coin; diff --git a/packages/sdk/types/index.d.ts b/packages/sdk/types/index.d.ts index d4162d90..888fb6c3 100644 --- a/packages/sdk/types/index.d.ts +++ b/packages/sdk/types/index.d.ts @@ -1,2 +1,4 @@ +export { coinToDecimal } from "./decoding"; +export { decimalToCoin } from "./encoding"; export { RestClient, TxsResponse } from "./restclient"; export { AminoTx, isAminoStdTx, TokenInfo } from "./types";