From ddf2bf1c2ffde4d94cf877e021cd3009281f8394 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 30 Jan 2020 08:17:35 +0100 Subject: [PATCH] Remove codec parameter --- .eslintrc.json | 1 + packages/faucet/README.md | 10 ++- packages/faucet/package.json | 2 +- packages/faucet/src/actions/generate.ts | 9 ++- packages/faucet/src/actions/help.ts | 6 +- packages/faucet/src/actions/start/start.ts | 21 +++--- packages/faucet/src/codec.spec.ts | 15 +---- packages/faucet/src/codec.ts | 78 ++++++---------------- packages/faucet/src/crypto.ts | 12 ---- packages/faucet/src/profile.ts | 14 ++-- 10 files changed, 46 insertions(+), 122 deletions(-) delete mode 100644 packages/faucet/src/crypto.ts diff --git a/.eslintrc.json b/.eslintrc.json index 738b64b7..dd32e924 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -27,6 +27,7 @@ "import/no-cycle": "warn", "simple-import-sort/sort": "warn", "@typescript-eslint/explicit-function-return-type": ["warn", { "allowExpressions": true }], + "@typescript-eslint/no-empty-function": "off", "@typescript-eslint/no-empty-interface": "off", "@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/no-unused-vars": ["warn", { "argsIgnorePattern": "^_", "varsIgnorePattern": "^_" }], diff --git a/packages/faucet/README.md b/packages/faucet/README.md index e600edeb..9cf560a3 100644 --- a/packages/faucet/README.md +++ b/packages/faucet/README.md @@ -21,7 +21,7 @@ FAUCET_CREDIT_AMOUNT_COSM=10 \ FAUCET_CREDIT_AMOUNT_STAKE=5 \ FAUCET_CONCURRENCY=3 \ FAUCET_MNEMONIC="economy stock theory fatal elder harbor betray wasp final emotion task crumble siren bottom lizard educate guess current outdoor pair theory focus wife stone" \ - ./bin/cosmwasm-faucet start cosmwasm "http://localhost:1317" + ./bin/cosmwasm-faucet start "http://localhost:1317" ``` ## Usage @@ -36,12 +36,10 @@ help Shows a help text and exits version Prints the version and exits generate Generates a random mnemonic, shows derived faucet addresses and exits - 1 Codec - 2 Chain ID + 1 Chain ID start Starts the faucet - 1 Codec - 2 Node base URL, e.g. wss://bov.friendnet-fast.iov.one + 1 Node base URL, e.g. http://localhost:1317 Environment variables @@ -99,7 +97,7 @@ DOCKER_HOST_IP=$(docker run --read-only --rm alpine ip route | awk 'NR==1 {print -e FAUCET_CONCURRENCY \ -p 8000:8000 \ cosmwasm/faucet:manual \ - start cosmwasm "http://$DOCKER_HOST_IP:1317" + start "http://$DOCKER_HOST_IP:1317" ``` ### Using the faucet diff --git a/packages/faucet/package.json b/packages/faucet/package.json index d051943e..dcde5915 100644 --- a/packages/faucet/package.json +++ b/packages/faucet/package.json @@ -21,7 +21,7 @@ "access": "public" }, "scripts": { - "dev-start": "FAUCET_CREDIT_AMOUNT_COSM=10 FAUCET_CREDIT_AMOUNT_STAKE=5 FAUCET_CONCURRENCY=3 FAUCET_MNEMONIC=\"economy stock theory fatal elder harbor betray wasp final emotion task crumble siren bottom lizard educate guess current outdoor pair theory focus wife stone\" ./bin/cosmwasm-faucet start cosmwasm \"http://localhost:1317\"", + "dev-start": "FAUCET_CREDIT_AMOUNT_COSM=10 FAUCET_CREDIT_AMOUNT_STAKE=5 FAUCET_CONCURRENCY=3 FAUCET_MNEMONIC=\"economy stock theory fatal elder harbor betray wasp final emotion task crumble siren bottom lizard educate guess current outdoor pair theory focus wife stone\" ./bin/cosmwasm-faucet start \"http://localhost:1317\"", "docs": "shx rm -rf docs && typedoc --options typedoc.js", "format": "prettier --write --loglevel warn \"./src/**/*.ts\"", "lint": "eslint --max-warnings 0 \"**/*.{js,ts}\" && tslint -t verbose --project .", diff --git a/packages/faucet/src/actions/generate.ts b/packages/faucet/src/actions/generate.ts index 2280bb95..e99c0262 100644 --- a/packages/faucet/src/actions/generate.ts +++ b/packages/faucet/src/actions/generate.ts @@ -2,22 +2,21 @@ import { ChainId } from "@iov/bcp"; import { Bip39, Random } from "@iov/crypto"; import { UserProfile } from "@iov/keycontrol"; -import { codecFromString } from "../codec"; import * as constants from "../constants"; import { setSecretAndCreateIdentities } from "../profile"; export async function generate(args: ReadonlyArray): Promise { - if (args.length < 2) { + if (args.length < 1) { throw Error( `Not enough arguments for action 'generate'. See '${constants.binaryName} help' or README for arguments.`, ); } - const codecName = codecFromString(args[0]); - const chainId = args[1] as ChainId; + + const chainId = args[0] as ChainId; const mnemonic = Bip39.encode(Random.getBytes(16)).toString(); console.info(`FAUCET_MNEMONIC="${mnemonic}"`); const profile = new UserProfile(); - await setSecretAndCreateIdentities(profile, mnemonic, chainId, codecName); + await setSecretAndCreateIdentities(profile, mnemonic, chainId); } diff --git a/packages/faucet/src/actions/help.ts b/packages/faucet/src/actions/help.ts index 8b7a6a5f..745e0ba3 100644 --- a/packages/faucet/src/actions/help.ts +++ b/packages/faucet/src/actions/help.ts @@ -11,12 +11,10 @@ help Shows a help text and exits version Prints the version and exits generate Generates a random mnemonic, shows derived faucet addresses and exits - 1 Codec - 2 Chain ID + 1 Chain ID start Starts the faucet - 1 Codec - 2 Node base URL, e.g. wss://bov.friendnet-fast.iov.one + 1 Node base URL, e.g. http://localhost:1317 Environment variables diff --git a/packages/faucet/src/actions/start/start.ts b/packages/faucet/src/actions/start/start.ts index fdb745fb..94396c1e 100644 --- a/packages/faucet/src/actions/start/start.ts +++ b/packages/faucet/src/actions/start/start.ts @@ -6,12 +6,7 @@ import Koa from "koa"; import bodyParser from "koa-bodyparser"; import { creditAmount, setFractionalDigits } from "../../cashflow"; -import { - codecDefaultFractionalDigits, - codecFromString, - codecImplementation, - createChainConnector, -} from "../../codec"; +import { codecDefaultFractionalDigits, codecImplementation, createChainConnector } from "../../codec"; import * as constants from "../../constants"; import { logAccountsState, logSendJob } from "../../debugging"; import { @@ -35,13 +30,13 @@ function getCount(): number { } export async function start(args: ReadonlyArray): Promise { - if (args.length < 2) { + if (args.length < 1) { throw Error( `Not enough arguments for action 'start'. See '${constants.binaryName} help' or README for arguments.`, ); } - const codec = codecFromString(args[0]); - const blockchainBaseUrl: string = args[1]; + + const blockchainBaseUrl = args[0]; const port = constants.port; @@ -51,13 +46,13 @@ export async function start(args: ReadonlyArray): Promise { } const signer = new MultiChainSigner(profile); console.info(`Connecting to blockchain ${blockchainBaseUrl} ...`); - const connection = (await signer.addChain(createChainConnector(codec, blockchainBaseUrl))).connection; + const connection = (await signer.addChain(createChainConnector(blockchainBaseUrl))).connection; const connectedChainId = connection.chainId(); console.info(`Connected to network: ${connectedChainId}`); - setFractionalDigits(codecDefaultFractionalDigits(codec)); - await setSecretAndCreateIdentities(profile, constants.mnemonic, connectedChainId, codec); + setFractionalDigits(codecDefaultFractionalDigits()); + await setSecretAndCreateIdentities(profile, constants.mnemonic, connectedChainId); const chainTokens = await tokenTickersOfFirstChain(signer); console.info("Chain tokens:", chainTokens); @@ -120,7 +115,7 @@ export async function start(args: ReadonlyArray): Promise { const requestBody = (context.request as any).body; const { address, ticker } = RequestParser.parseCreditBody(requestBody); - if (!codecImplementation(codec).isValidAddress(address)) { + if (!codecImplementation().isValidAddress(address)) { throw new HttpError(400, "Address is not in the expected format for this chain."); } diff --git a/packages/faucet/src/codec.spec.ts b/packages/faucet/src/codec.spec.ts index 5928ce09..624bf357 100644 --- a/packages/faucet/src/codec.spec.ts +++ b/packages/faucet/src/codec.spec.ts @@ -1,14 +1 @@ -import { Codec, codecFromString } from "./codec"; - -describe("Codec", () => { - it("can convert string to codec", () => { - expect(codecFromString("cosmwasm")).toEqual(Codec.CosmWasm); - - expect(() => codecFromString("")).toThrowError(/not supported/i); - expect(() => codecFromString("lisk")).toThrowError(/not supported/i); - expect(() => codecFromString("bns")).toThrowError(/not supported/i); - expect(() => codecFromString("abc")).toThrowError(/not supported/i); - expect(() => codecFromString("LISK")).toThrowError(/not supported/i); - expect(() => codecFromString("CosmWasm")).toThrowError(/not supported/i); - }); -}); +describe("codec", () => {}); diff --git a/packages/faucet/src/codec.ts b/packages/faucet/src/codec.ts index 035a3680..624a92b1 100644 --- a/packages/faucet/src/codec.ts +++ b/packages/faucet/src/codec.ts @@ -1,66 +1,28 @@ import { createCosmWasmConnector, TokenInfo } from "@cosmwasm/bcp"; import { ChainConnector, TokenTicker, TxCodec } from "@iov/bcp"; -import { Slip10RawIndex } from "@iov/crypto"; -import { HdPaths } from "@iov/keycontrol"; -export const enum Codec { - CosmWasm, +export function createChainConnector(url: string): ChainConnector { + const tokens: readonly TokenInfo[] = [ + { + fractionalDigits: 6, + tokenName: "Fee Token", + tokenTicker: "COSM" as TokenTicker, + denom: "cosm", + }, + { + fractionalDigits: 6, + tokenName: "Staking Token", + tokenTicker: "STAKE" as TokenTicker, + denom: "stake", + }, + ]; + return createCosmWasmConnector(url, "cosmos", tokens); } -export function codecFromString(input: string): Codec { - switch (input) { - case "cosmwasm": - return Codec.CosmWasm; - default: - throw new Error(`Codec '${input}' not supported`); - } +export function codecImplementation(): TxCodec { + return createChainConnector("unused dummy url").codec; } -export function createPathBuilderForCodec(codec: Codec): (derivation: number) => readonly Slip10RawIndex[] { - const pathBuilder = (accountIndex: number): readonly Slip10RawIndex[] => { - switch (codec) { - case Codec.CosmWasm: - return HdPaths.cosmos(accountIndex); - default: - throw new Error("No path builder for this codec found"); - } - }; - return pathBuilder; -} - -export function createChainConnector(codec: Codec, url: string): ChainConnector { - switch (codec) { - case Codec.CosmWasm: { - const tokens: readonly TokenInfo[] = [ - { - fractionalDigits: 6, - tokenName: "Fee Token", - tokenTicker: "COSM" as TokenTicker, - denom: "cosm", - }, - { - fractionalDigits: 6, - tokenName: "Staking Token", - tokenTicker: "STAKE" as TokenTicker, - denom: "stake", - }, - ]; - return createCosmWasmConnector(url, "cosmos", tokens); - } - default: - throw new Error("No connector for this codec found"); - } -} - -export function codecImplementation(codec: Codec): TxCodec { - return createChainConnector(codec, "unused dummy url").codec; -} - -export function codecDefaultFractionalDigits(codec: Codec): number { - switch (codec) { - case Codec.CosmWasm: - return 6; - default: - throw new Error("Unknown codec"); - } +export function codecDefaultFractionalDigits(): number { + return 6; } diff --git a/packages/faucet/src/crypto.ts b/packages/faucet/src/crypto.ts deleted file mode 100644 index a68c7d41..00000000 --- a/packages/faucet/src/crypto.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Secp256k1HdWallet, Wallet } from "@iov/keycontrol"; - -import { Codec } from "./codec"; - -export function createWalletForCodec(input: Codec, mnemonic: string): Wallet { - switch (input) { - case Codec.CosmWasm: - return Secp256k1HdWallet.fromMnemonic(mnemonic); - default: - throw new Error(`Codec '${input}' not supported`); - } -} diff --git a/packages/faucet/src/profile.ts b/packages/faucet/src/profile.ts index 36c0352e..b5c4b766 100644 --- a/packages/faucet/src/profile.ts +++ b/packages/faucet/src/profile.ts @@ -1,34 +1,30 @@ import { ChainId } from "@iov/bcp"; -import { UserProfile } from "@iov/keycontrol"; +import { HdPaths, Secp256k1HdWallet, UserProfile } from "@iov/keycontrol"; -import { Codec, codecImplementation, createPathBuilderForCodec } from "./codec"; +import { codecImplementation } from "./codec"; import * as constants from "./constants"; -import { createWalletForCodec } from "./crypto"; import { debugPath } from "./hdpaths"; export async function setSecretAndCreateIdentities( profile: UserProfile, mnemonic: string, chainId: ChainId, - codecName: Codec, ): Promise { if (profile.wallets.value.length !== 0) { throw new Error("Profile already contains wallets"); } - const wallet = profile.addWallet(createWalletForCodec(codecName, mnemonic)); - - const pathBuilder = createPathBuilderForCodec(codecName); + const wallet = profile.addWallet(Secp256k1HdWallet.fromMnemonic(mnemonic)); // first account is the token holder const numberOfIdentities = 1 + constants.concurrency; for (let i = 0; i < numberOfIdentities; i++) { // create - const path = pathBuilder(i); + const path = HdPaths.cosmos(i); const identity = await profile.createIdentity(wallet.id, chainId, path); // log const role = i === 0 ? "token holder " : `distributor ${i}`; - const address = codecImplementation(codecName).identityToAddress(identity); + const address = codecImplementation().identityToAddress(identity); console.info(`Created ${role} (${debugPath(path)}): ${address}`); } }