@@ -51,3 +53,4 @@ export default (props) => (
`}
>
);
+export default ThresholdInput;
diff --git a/components/layout/Page.js b/components/layout/Page.js
index a54bf16..130bc32 100644
--- a/components/layout/Page.js
+++ b/components/layout/Page.js
@@ -1,3 +1,5 @@
+import React from "react";
+
import Head from "../head";
import StackableContainer from "./StackableContainer";
diff --git a/components/layout/StackableContainer.js b/components/layout/StackableContainer.js
index 0a54d62..5db77ec 100644
--- a/components/layout/StackableContainer.js
+++ b/components/layout/StackableContainer.js
@@ -1,3 +1,5 @@
+import React from "react";
+
const StackableContainer = (props) => (
{props.children}
diff --git a/lib/displayHelpers.js b/lib/displayHelpers.js
index 284a281..2c63b0e 100644
--- a/lib/displayHelpers.js
+++ b/lib/displayHelpers.js
@@ -47,37 +47,39 @@ const printableCoin = (coin) => {
const ticker = coin.denom.slice(1).toUpperCase();
return value + thinSpace + ticker;
}
-
+
// Fallback to plain coin display
return coin.amount + thinSpace + coin.denom;
-}
+};
const printableCoins = (coins) => {
if (coins.length !== 1) {
- throw new Error("Implementation only supports exactly one coin entry.")
+ throw new Error("Implementation only supports exactly one coin entry.");
}
return printableCoin(coins[0]);
-}
+};
/**
* Generates an example address for the configured blockchain.
- *
+ *
* `index` can be set to a small integer in order to get different addresses. Defaults to 0.
*/
const exampleAddress = (index) => {
const usedIndex = index || 0;
- let data = Bech32.decode("cosmos1vqpjljwsynsn58dugz0w8ut7kun7t8ls2qkmsq").data;
+ let data = Bech32.decode(
+ "cosmos1vqpjljwsynsn58dugz0w8ut7kun7t8ls2qkmsq"
+ ).data;
for (let i = 0; i < usedIndex; ++i) {
data = sha512(data).slice(0, data.length); // hash one time and trim to original length
}
return Bech32.encode(process.env.NEXT_PUBLIC_ADDRESS_PREFIX, data);
-}
+};
/**
* Generates an example pubkey (secp256k1, compressed).
- *
+ *
* `index` can be set to a small integer in order to get different addresses. Defaults to 0.
- *
+ *
* Note: the keys are not necessarily valid (as in points on the chain) and should only be used
* as dummy data.
*/
@@ -89,11 +91,11 @@ const examplePubkey = (index) => {
data[0] = index % 2 ? 0x02 : 0x03; // pubkeys have to start with 0x02 or 0x03
}
return toBase64(data);
-}
+};
/**
* Returns an error message for invalid addresses.
- *
+ *
* Returns null of there is no error.
*/
const checkAddress = (input) => {
@@ -102,7 +104,7 @@ const checkAddress = (input) => {
let data;
let prefix;
try {
- ({ data, prefix } = Bech32.decode(input));
+ ({ data, prefix } = Bech32.decode(input));
} catch (error) {
return error.toString();
}
@@ -116,6 +118,13 @@ const checkAddress = (input) => {
}
return null;
-}
+};
-export { abbreviateLongString, printableCoin, printableCoins, exampleAddress, examplePubkey, checkAddress };
+export {
+ abbreviateLongString,
+ printableCoin,
+ printableCoins,
+ exampleAddress,
+ examplePubkey,
+ checkAddress,
+};
diff --git a/lib/multisigHelpers.js b/lib/multisigHelpers.js
index 69d1d9e..450516d 100644
--- a/lib/multisigHelpers.js
+++ b/lib/multisigHelpers.js
@@ -1,6 +1,5 @@
import axios from "axios";
import { createMultisigThresholdPubkey, pubkeyToAddress } from "@cosmjs/amino";
-import { StargateClient } from "@cosmjs/stargate";
import { getMultisig } from "./graphqlHelpers";
@@ -16,27 +15,26 @@ const createMultisigFromCompressedSecp256k1Pubkeys = async (
compressedPubkeys,
threshold
) => {
- try {
- let pubkeys = compressedPubkeys.map((compressedPubkey) => {
- return {
- type: "tendermint/PubKeySecp256k1",
- value: compressedPubkey,
- };
- });
- const multisigPubkey = createMultisigThresholdPubkey(pubkeys, threshold);
- const multisigAddress = pubkeyToAddress(multisigPubkey, process.env.NEXT_PUBLIC_ADDRESS_PREFIX);
-
- // save multisig to fauna
- const multisig = {
- address: multisigAddress,
- pubkeyJSON: JSON.stringify(multisigPubkey),
+ const pubkeys = compressedPubkeys.map((compressedPubkey) => {
+ return {
+ type: "tendermint/PubKeySecp256k1",
+ value: compressedPubkey,
};
- const res = await axios.post("/api/multisig", multisig);
- console.log(res.data);
- return res.data.address;
- } catch (error) {
- throw error;
- }
+ });
+ const multisigPubkey = createMultisigThresholdPubkey(pubkeys, threshold);
+ const multisigAddress = pubkeyToAddress(
+ multisigPubkey,
+ process.env.NEXT_PUBLIC_ADDRESS_PREFIX
+ );
+
+ // save multisig to fauna
+ const multisig = {
+ address: multisigAddress,
+ pubkeyJSON: JSON.stringify(multisigPubkey),
+ };
+ const res = await axios.post("/api/multisig", multisig);
+ console.log(res.data);
+ return res.data.address;
};
/**
diff --git a/pages/api/multisig/index.js b/pages/api/multisig/index.js
index c89bee1..d665387 100644
--- a/pages/api/multisig/index.js
+++ b/pages/api/multisig/index.js
@@ -1,24 +1,22 @@
import { createMultisig } from "../../../lib/graphqlHelpers";
export default async function (req, res) {
- return new Promise(async (resolve) => {
- switch (req.method) {
- case "POST":
- try {
- const data = req.body;
- console.log("Function `createMultisig` invoked", data);
- const saveRes = await createMultisig(data);
- console.log("success", saveRes.data);
- res.status(200).send(saveRes.data.data.createMultisig);
- return resolve();
- } catch (err) {
- console.log(err);
- res.status(400).send(err.message);
- return resolve();
- }
- }
- // no route matched
- res.status(405).end();
- return resolve();
- });
+ switch (req.method) {
+ case "POST":
+ try {
+ const data = req.body;
+ console.log("Function `createMultisig` invoked", data);
+ const saveRes = await createMultisig(data);
+ console.log("success", saveRes.data);
+ res.status(200).send(saveRes.data.data.createMultisig);
+ return;
+ } catch (err) {
+ console.log(err);
+ res.status(400).send(err.message);
+ return;
+ }
+ }
+ // no route matched
+ res.status(405).end();
+ return;
}
diff --git a/pages/api/transaction/[transactionID]/index.js b/pages/api/transaction/[transactionID]/index.js
index b37ae38..8ea1c6d 100644
--- a/pages/api/transaction/[transactionID]/index.js
+++ b/pages/api/transaction/[transactionID]/index.js
@@ -1,25 +1,23 @@
import { updateTxHash } from "../../../../lib/graphqlHelpers";
export default async function (req, res) {
- return new Promise(async (resolve) => {
- switch (req.method) {
- case "POST":
- try {
- const { transactionID } = req.query;
- const { txHash } = req.body;
- console.log("Function `updateTransaction` invoked", txHash);
- const saveRes = await updateTxHash(transactionID, txHash);
- console.log("success", saveRes.data);
- res.status(200).send(saveRes.data.data.updateTransaction);
- return resolve();
- } catch (err) {
- console.log(err);
- res.status(400).send(err.message);
- return resolve();
- }
- }
- // no route matched
- res.status(405).end();
- return resolve();
- });
+ switch (req.method) {
+ case "POST":
+ try {
+ const { transactionID } = req.query;
+ const { txHash } = req.body;
+ console.log("Function `updateTransaction` invoked", txHash);
+ const saveRes = await updateTxHash(transactionID, txHash);
+ console.log("success", saveRes.data);
+ res.status(200).send(saveRes.data.data.updateTransaction);
+ return;
+ } catch (err) {
+ console.log(err);
+ res.status(400).send(err.message);
+ return;
+ }
+ }
+ // no route matched
+ res.status(405).end();
+ return;
}
diff --git a/pages/api/transaction/[transactionID]/signature.js b/pages/api/transaction/[transactionID]/signature.js
index b97eeba..3192175 100644
--- a/pages/api/transaction/[transactionID]/signature.js
+++ b/pages/api/transaction/[transactionID]/signature.js
@@ -1,25 +1,23 @@
import { createSignature } from "../../../../lib/graphqlHelpers";
export default async function (req, res) {
- return new Promise(async (resolve) => {
- switch (req.method) {
- case "POST":
- try {
- const { transactionID } = req.query;
- const data = req.body;
- console.log("Function `createSignature` invoked", data);
- const saveRes = await createSignature(data, transactionID);
- console.log("success", saveRes.data);
- res.status(200).send(saveRes.data.data.createSignature);
- return resolve();
- } catch (err) {
- console.log(err);
- res.status(400).send(err.message);
- return resolve();
- }
- }
- // no route matched
- res.status(405).end();
- return resolve();
- });
+ switch (req.method) {
+ case "POST":
+ try {
+ const { transactionID } = req.query;
+ const data = req.body;
+ console.log("Function `createSignature` invoked", data);
+ const saveRes = await createSignature(data, transactionID);
+ console.log("success", saveRes.data);
+ res.status(200).send(saveRes.data.data.createSignature);
+ return;
+ } catch (err) {
+ console.log(err);
+ res.status(400).send(err.message);
+ return;
+ }
+ }
+ // no route matched
+ res.status(405).end();
+ return;
}
diff --git a/pages/api/transaction/index.js b/pages/api/transaction/index.js
index 7ea4d2b..cc7ebe1 100644
--- a/pages/api/transaction/index.js
+++ b/pages/api/transaction/index.js
@@ -1,26 +1,24 @@
import { createTransaction } from "../../../lib/graphqlHelpers";
export default async function (req, res) {
- return new Promise(async (resolve) => {
- switch (req.method) {
- case "POST":
- try {
- const data = req.body;
- console.log("Function `createTransaction` invoked", data);
- const saveRes = await createTransaction(data.dataJSON);
- console.log("success", saveRes.data);
- res
- .status(200)
- .send({ transactionID: saveRes.data.data.createTransaction._id });
- return resolve();
- } catch (err) {
- console.log(err);
- res.status(400).send(err.message);
- return resolve();
- }
- }
- // no route matched
- res.status(405).end();
- return resolve();
- });
+ switch (req.method) {
+ case "POST":
+ try {
+ const data = req.body;
+ console.log("Function `createTransaction` invoked", data);
+ const saveRes = await createTransaction(data.dataJSON);
+ console.log("success", saveRes.data);
+ res
+ .status(200)
+ .send({ transactionID: saveRes.data.data.createTransaction._id });
+ return;
+ } catch (err) {
+ console.log(err);
+ res.status(400).send(err.message);
+ return;
+ }
+ }
+ // no route matched
+ res.status(405).end();
+ return;
}
diff --git a/pages/create.js b/pages/create.js
index 09d7748..0b5d8b7 100644
--- a/pages/create.js
+++ b/pages/create.js
@@ -1,8 +1,10 @@
+import React from "react";
+
import MultisigForm from "../components/forms/MultisigForm";
import Page from "../components/layout/Page";
import StackableContainer from "../components/layout/StackableContainer";
-export default () => (
+const CreatePage = () => (
@@ -12,3 +14,5 @@ export default () => (
);
+
+export default CreatePage;
diff --git a/pages/index.js b/pages/index.js
index 028b2bd..292889f 100644
--- a/pages/index.js
+++ b/pages/index.js
@@ -1,14 +1,18 @@
+import React from "react";
+
import FindMultisigForm from "../components/forms/FindMultisigForm";
import Page from "../components/layout/Page";
import StackableContainer from "../components/layout/StackableContainer";
-export default () => (
+const MultiPage = () => (
Cosmoshub Multisig Manager
-
+
);
+
+export default MultiPage;
diff --git a/pages/multi/[address]/index.js b/pages/multi/[address]/index.js
index cd9eedd..d424c5a 100644
--- a/pages/multi/[address]/index.js
+++ b/pages/multi/[address]/index.js
@@ -6,11 +6,9 @@ import Button from "../../../components/inputs/Button";
import { getMultisigAccount } from "../../../lib/multisigHelpers";
import HashView from "../../../components/dataViews/HashView";
import MultisigHoldings from "../../../components/dataViews/MultisigHoldings";
-import MultisigMembers from "../../../components/dataViews/MultisigMembers";
import Page from "../../../components/layout/Page";
import StackableContainer from "../../../components/layout/StackableContainer";
import TransactionForm from "../../../components/forms/TransactionForm";
-import TransactionList from "../../../components/dataViews/TransactionList";
export async function getServerSideProps(context) {
try {
diff --git a/pages/multi/[address]/transaction/[transactionID].js b/pages/multi/[address]/transaction/[transactionID].js
index 670024d..1f9c621 100644
--- a/pages/multi/[address]/transaction/[transactionID].js
+++ b/pages/multi/[address]/transaction/[transactionID].js
@@ -1,10 +1,9 @@
+import React from "react";
import axios from "axios";
import { StargateClient, makeMultisignedTx } from "@cosmjs/stargate";
import { TxRaw } from "cosmjs-types/cosmos/tx/v1beta1/tx";
import { useState } from "react";
import { fromBase64 } from "@cosmjs/encoding";
-import { createMultisigThresholdPubkey, pubkeyToAddress } from "@cosmjs/amino";
-import { registry } from "@cosmjs/proto-signing";
import Button from "../../../../components/inputs/Button";
import { findTransactionByID } from "../../../../lib/graphqlHelpers";
@@ -67,19 +66,12 @@ const transactionPage = ({
const [transactionHash, setTransactionHash] = useState(txHash);
const txInfo = (transactionJSON && JSON.parse(transactionJSON)) || null;
const addSignature = (signature) => {
- setCurrentSignatures((currentSignatures) => [
- ...currentSignatures,
- signature,
- ]);
+ setCurrentSignatures((prevState) => [...prevState, signature]);
};
const broadcastTx = async () => {
try {
setIsBroadcasting(true);
setBroadcastError("");
- const signatures = new Map();
- currentSignatures.forEach((signature) => {
- signatures.set(signature.address, fromBase64(signature.signature));
- });
const bodyBytes = fromBase64(currentSignatures[0].bodyBytes);
const signedTx = makeMultisignedTx(
@@ -87,14 +79,16 @@ const transactionPage = ({
txInfo.sequence,
txInfo.fee,
bodyBytes,
- signatures
+ new Map(
+ currentSignatures.map((s) => [s.address, fromBase64(s.signature)])
+ )
);
const broadcaster = await StargateClient.connect(nodeAddress);
const result = await broadcaster.broadcastTx(
Uint8Array.from(TxRaw.encode(signedTx).finish())
);
console.log(result);
- const res = await axios.post(`/api/transaction/${transactionID}`, {
+ const _res = await axios.post(`/api/transaction/${transactionID}`, {
txHash: result.transactionHash,
});
setTransactionHash(result.transactionHash);
@@ -126,7 +120,7 @@ const transactionPage = ({
/>
)}
{currentSignatures.length >=
- parseInt(accountOnChain.pubkey.value.threshold) &&
+ parseInt(accountOnChain.pubkey.value.threshold, 10) &&
!transactionHash && (
<>