From da4648374a3ed61cd94bf7c45a5a2c65b5574207 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 11 Aug 2020 09:03:22 +0200 Subject: [PATCH] Add parseBankToken/parseBankTokens --- packages/faucet/src/tokens.spec.ts | 70 ++++++++++++++++++++++++++++++ packages/faucet/src/tokens.ts | 25 +++++++++++ 2 files changed, 95 insertions(+) create mode 100644 packages/faucet/src/tokens.spec.ts diff --git a/packages/faucet/src/tokens.spec.ts b/packages/faucet/src/tokens.spec.ts new file mode 100644 index 0000000000..d0a57ee2a0 --- /dev/null +++ b/packages/faucet/src/tokens.spec.ts @@ -0,0 +1,70 @@ +import { parseBankToken, parseBankTokens } from "./tokens"; + +describe("tokens", () => { + describe("parseBankToken", () => { + it("works", () => { + expect(parseBankToken("COSM=10^6ucosm")).toEqual({ + tickerSymbol: "COSM", + fractionalDigits: 6, + denom: "ucosm", + }); + }); + }); + + describe("parseBankTokens", () => { + it("works for one", () => { + expect(parseBankTokens("COSM=10^6ucosm")).toEqual([ + { + tickerSymbol: "COSM", + fractionalDigits: 6, + denom: "ucosm", + }, + ]); + }); + + it("works for two", () => { + expect(parseBankTokens("COSM=10^6ucosm,STAKE=10^3mstake")).toEqual([ + { + tickerSymbol: "COSM", + fractionalDigits: 6, + denom: "ucosm", + }, + { + tickerSymbol: "STAKE", + fractionalDigits: 3, + denom: "mstake", + }, + ]); + }); + + it("ignores whitespace", () => { + expect(parseBankTokens("COSM=10^6ucosm, STAKE=10^3mstake\n")).toEqual([ + { + tickerSymbol: "COSM", + fractionalDigits: 6, + denom: "ucosm", + }, + { + tickerSymbol: "STAKE", + fractionalDigits: 3, + denom: "mstake", + }, + ]); + }); + + it("ignores empty elements", () => { + expect(parseBankTokens("COSM=10^6ucosm,STAKE=10^3mstake,")).toEqual([ + { + tickerSymbol: "COSM", + fractionalDigits: 6, + denom: "ucosm", + }, + { + tickerSymbol: "STAKE", + fractionalDigits: 3, + denom: "mstake", + }, + ]); + }); + }); +}); diff --git a/packages/faucet/src/tokens.ts b/packages/faucet/src/tokens.ts index c2d88a722d..011e861dd9 100644 --- a/packages/faucet/src/tokens.ts +++ b/packages/faucet/src/tokens.ts @@ -1,3 +1,5 @@ +import { Uint53 } from "@cosmjs/math"; + export interface BankTokenMeta { readonly denom: string; /** @@ -15,3 +17,26 @@ export interface BankTokenMeta { */ readonly fractionalDigits: number; } + +const parseBankTokenPattern = /^([a-zA-Z]{2,20})=10\^([0-9]+)([a-zA-Z]{2,20})$/; + +export function parseBankToken(input: string): BankTokenMeta { + const match = input.match(parseBankTokenPattern); + if (!match) { + throw new Error("Token could not be parsed. Format: DISPLAY=10^DIGITSbase, e.g. ATOM=10^6uatom"); + } + return { + tickerSymbol: match[1], + fractionalDigits: Uint53.fromString(match[2]).toNumber(), + denom: match[3], + }; +} + +export function parseBankTokens(input: string): BankTokenMeta[] { + return input + .trim() + .split(",") + .map((part) => part.trim()) + .filter((part) => part !== "") + .map((part) => parseBankToken(part)); +}