diff --git a/components/dataViews/TransactionInfo/TxMsgCreateVestingAccountDetails.tsx b/components/dataViews/TransactionInfo/TxMsgCreateVestingAccountDetails.tsx
index 18efc7a..ba90256 100644
--- a/components/dataViews/TransactionInfo/TxMsgCreateVestingAccountDetails.tsx
+++ b/components/dataViews/TransactionInfo/TxMsgCreateVestingAccountDetails.tsx
@@ -20,7 +20,7 @@ const TxMsgCreateVestingAccountDetails = ({ msgValue }: TxMsgCreateVestingAccoun
- {printableCoins(msgValue.amount, chain)}
+ {printableCoins(msgValue.amount, chain) || "None"}
diff --git a/components/dataViews/TransactionInfo/TxMsgExecuteContractDetails.tsx b/components/dataViews/TransactionInfo/TxMsgExecuteContractDetails.tsx
index e1dee34..97ede4d 100644
--- a/components/dataViews/TransactionInfo/TxMsgExecuteContractDetails.tsx
+++ b/components/dataViews/TransactionInfo/TxMsgExecuteContractDetails.tsx
@@ -43,7 +43,7 @@ const TxMsgExecuteContractDetails = ({ msgValue }: TxMsgExecuteContractDetailsPr
- {printableCoins(msgValue.funds, chain)}
+ {printableCoins(msgValue.funds, chain) || "None"}
{parseError ? (
diff --git a/components/dataViews/TransactionInfo/TxMsgInstantiateContract2Details.tsx b/components/dataViews/TransactionInfo/TxMsgInstantiateContract2Details.tsx
index aad8c31..39dfc53 100644
--- a/components/dataViews/TransactionInfo/TxMsgInstantiateContract2Details.tsx
+++ b/components/dataViews/TransactionInfo/TxMsgInstantiateContract2Details.tsx
@@ -59,7 +59,7 @@ const TxMsgInstantiateContract2Details = ({ msgValue }: TxMsgInstantiateContract
- {printableCoins(msgValue.funds, chain)}
+ {printableCoins(msgValue.funds, chain) || "None"}
{parseError ? (
diff --git a/components/dataViews/TransactionInfo/TxMsgInstantiateContractDetails.tsx b/components/dataViews/TransactionInfo/TxMsgInstantiateContractDetails.tsx
index 3ad54de..105a3eb 100644
--- a/components/dataViews/TransactionInfo/TxMsgInstantiateContractDetails.tsx
+++ b/components/dataViews/TransactionInfo/TxMsgInstantiateContractDetails.tsx
@@ -55,7 +55,7 @@ const TxMsgInstantiateContractDetails = ({ msgValue }: TxMsgInstantiateContractD
- {printableCoins(msgValue.funds, chain)}
+ {printableCoins(msgValue.funds, chain) || "None"}
{parseError ? (
diff --git a/components/dataViews/TransactionInfo/TxMsgSendDetails.tsx b/components/dataViews/TransactionInfo/TxMsgSendDetails.tsx
index 8a1561f..fda8231 100644
--- a/components/dataViews/TransactionInfo/TxMsgSendDetails.tsx
+++ b/components/dataViews/TransactionInfo/TxMsgSendDetails.tsx
@@ -17,7 +17,7 @@ const TxMsgSendDetails = ({ msgValue }: TxMsgSendDetailsProps) => {
- {printableCoins(msgValue.amount, chain)}
+ {printableCoins(msgValue.amount, chain) || "None"}
diff --git a/components/dataViews/TransactionInfo/index.tsx b/components/dataViews/TransactionInfo/index.tsx
index 0819661..e0a959b 100644
--- a/components/dataViews/TransactionInfo/index.tsx
+++ b/components/dataViews/TransactionInfo/index.tsx
@@ -68,7 +68,7 @@ const TransactionInfo = ({ tx }: TransactionInfoProps) => {
- {printableCoins(tx.fee.amount, chain)}
+ {printableCoins(tx.fee.amount, chain) || "None"}
>
) : null}
diff --git a/components/forms/CreateTxForm/MsgForm/MsgCreateVestingAccountForm.tsx b/components/forms/CreateTxForm/MsgForm/MsgCreateVestingAccountForm.tsx
index f067e54..13d33a2 100644
--- a/components/forms/CreateTxForm/MsgForm/MsgCreateVestingAccountForm.tsx
+++ b/components/forms/CreateTxForm/MsgForm/MsgCreateVestingAccountForm.tsx
@@ -2,7 +2,7 @@ import { EncodeObject } from "@cosmjs/proto-signing";
import { useEffect, useState } from "react";
import { MsgGetter } from "..";
import { useChains } from "../../../../context/ChainsContext";
-import { macroCoinToMicroCoin } from "../../../../lib/coinHelpers";
+import { displayCoinToBaseCoin } from "../../../../lib/coinHelpers";
import {
datetimeLocalFromTimestamp,
timestampFromDatetimeLocal,
@@ -58,6 +58,13 @@ const MsgCreateVestingAccountForm = ({
return false;
}
+ try {
+ displayCoinToBaseCoin({ denom: chain.displayDenom, amount }, chain.assets);
+ } catch (e: unknown) {
+ setAmountError(e instanceof Error ? e.message : "Could not set decimals");
+ return false;
+ }
+
const timeoutDate = new Date(Number(timestampFromDatetimeLocal(endTime, "ms")));
if (timeoutDate <= new Date()) {
setEndTimeError("End time must be a date in the future");
@@ -69,16 +76,20 @@ const MsgCreateVestingAccountForm = ({
const microCoin = (() => {
try {
- return macroCoinToMicroCoin({ denom: chain.displayDenom, amount }, chain.assets);
+ if (!amount || amount === "0") {
+ return null;
+ }
+
+ return displayCoinToBaseCoin({ denom: chain.displayDenom, amount }, chain.assets);
} catch {
- return { denom: chain.displayDenom, amount: "0" };
+ return null;
}
})();
const msgValue = MsgCodecs[MsgTypeUrls.CreateVestingAccount].fromPartial({
fromAddress,
toAddress,
- amount: [microCoin],
+ amount: microCoin ? [microCoin] : [],
endTime: timestampFromDatetimeLocal(endTime, "s"),
delayed,
});
diff --git a/components/forms/CreateTxForm/MsgForm/MsgDelegateForm.tsx b/components/forms/CreateTxForm/MsgForm/MsgDelegateForm.tsx
index 65bb303..7a68c6e 100644
--- a/components/forms/CreateTxForm/MsgForm/MsgDelegateForm.tsx
+++ b/components/forms/CreateTxForm/MsgForm/MsgDelegateForm.tsx
@@ -2,7 +2,7 @@ import { MsgDelegateEncodeObject } from "@cosmjs/stargate";
import { useEffect, useState } from "react";
import { MsgGetter } from "..";
import { useChains } from "../../../../context/ChainsContext";
-import { macroCoinToMicroCoin } from "../../../../lib/coinHelpers";
+import { displayCoinToBaseCoin } from "../../../../lib/coinHelpers";
import { checkAddress, exampleAddress, trimStringsObj } from "../../../../lib/displayHelpers";
import { MsgCodecs, MsgTypeUrls } from "../../../../types/txMsg";
import Input from "../../../inputs/Input";
@@ -46,12 +46,19 @@ const MsgDelegateForm = ({ delegatorAddress, setMsgGetter, deleteMsg }: MsgDeleg
return false;
}
+ try {
+ displayCoinToBaseCoin({ denom: chain.displayDenom, amount }, chain.assets);
+ } catch (e: unknown) {
+ setAmountError(e instanceof Error ? e.message : "Could not set decimals");
+ return false;
+ }
+
return true;
};
const microCoin = (() => {
try {
- return macroCoinToMicroCoin({ denom: chain.displayDenom, amount }, chain.assets);
+ return displayCoinToBaseCoin({ denom: chain.displayDenom, amount }, chain.assets);
} catch {
return { denom: chain.displayDenom, amount: "0" };
}
diff --git a/components/forms/CreateTxForm/MsgForm/MsgExecuteContractForm.tsx b/components/forms/CreateTxForm/MsgForm/MsgExecuteContractForm.tsx
index f689478..ec795bc 100644
--- a/components/forms/CreateTxForm/MsgForm/MsgExecuteContractForm.tsx
+++ b/components/forms/CreateTxForm/MsgForm/MsgExecuteContractForm.tsx
@@ -5,7 +5,7 @@ import { useEffect, useRef, useState } from "react";
import { MsgGetter } from "..";
import { useChains } from "../../../../context/ChainsContext";
import { ChainInfo } from "../../../../context/ChainsContext/types";
-import { macroCoinToMicroCoin } from "../../../../lib/coinHelpers";
+import { displayCoinToBaseCoin } from "../../../../lib/coinHelpers";
import { checkAddress, exampleAddress, trimStringsObj } from "../../../../lib/displayHelpers";
import { MsgCodecs, MsgTypeUrls } from "../../../../types/txMsg";
import Input from "../../../inputs/Input";
@@ -55,6 +55,8 @@ const MsgExecuteContractForm = ({
useEffect(() => {
// eslint-disable-next-line no-shadow
const { contractAddress, customDenom, amount } = trimmedInputs;
+ const denom =
+ selectedDenom.value === customDenomOption.value ? customDenom : selectedDenom.value.symbol;
const isMsgValid = (): boolean => {
setContractAddressError("");
@@ -71,7 +73,12 @@ const MsgExecuteContractForm = ({
return false;
}
- if (selectedDenom.value === customDenomOption.value && !customDenom) {
+ if (
+ selectedDenom.value === customDenomOption.value &&
+ !customDenom &&
+ amount &&
+ amount !== "0"
+ ) {
setCustomDenomError("Custom denom must be set because of selection above");
return false;
}
@@ -86,17 +93,27 @@ const MsgExecuteContractForm = ({
return false;
}
+ if (denom && amount) {
+ try {
+ displayCoinToBaseCoin({ denom, amount }, chain.assets);
+ } catch (e: unknown) {
+ setAmountError(e instanceof Error ? e.message : "Could not set decimals");
+ return false;
+ }
+ }
+
return true;
};
- const denom =
- selectedDenom.value === customDenomOption.value ? customDenom : selectedDenom.value.symbol;
-
const microCoin = (() => {
try {
- return macroCoinToMicroCoin({ denom, amount }, chain.assets);
+ if (!denom || !amount || amount === "0") {
+ return null;
+ }
+
+ return displayCoinToBaseCoin({ denom, amount }, chain.assets);
} catch {
- return { denom, amount: "0" };
+ return null;
}
})();
@@ -113,7 +130,7 @@ const MsgExecuteContractForm = ({
sender: fromAddress,
contract: contractAddress,
msg: msgContentUtf8Array,
- funds: [microCoin],
+ funds: microCoin ? [microCoin] : [],
});
const msg: MsgExecuteContractEncodeObject = { typeUrl: MsgTypeUrls.Execute, value: msgValue };
diff --git a/components/forms/CreateTxForm/MsgForm/MsgInstantiateContract2Form.tsx b/components/forms/CreateTxForm/MsgForm/MsgInstantiateContract2Form.tsx
index a4d73cc..d2d9ab2 100644
--- a/components/forms/CreateTxForm/MsgForm/MsgInstantiateContract2Form.tsx
+++ b/components/forms/CreateTxForm/MsgForm/MsgInstantiateContract2Form.tsx
@@ -5,7 +5,7 @@ import { useEffect, useRef, useState } from "react";
import { MsgGetter } from "..";
import { useChains } from "../../../../context/ChainsContext";
import { ChainInfo } from "../../../../context/ChainsContext/types";
-import { macroCoinToMicroCoin } from "../../../../lib/coinHelpers";
+import { displayCoinToBaseCoin } from "../../../../lib/coinHelpers";
import { checkAddress, exampleAddress, trimStringsObj } from "../../../../lib/displayHelpers";
import { MsgCodecs, MsgTypeUrls } from "../../../../types/txMsg";
import Input from "../../../inputs/Input";
@@ -101,7 +101,12 @@ const MsgInstantiateContract2Form = ({
return false;
}
- if (selectedDenom.value === customDenomOption.value && !customDenom) {
+ if (
+ selectedDenom.value === customDenomOption.value &&
+ !customDenom &&
+ amount &&
+ amount !== "0"
+ ) {
setCustomDenomError("Custom denom must be set because of selection above");
return false;
}
@@ -116,6 +121,13 @@ const MsgInstantiateContract2Form = ({
return false;
}
+ try {
+ displayCoinToBaseCoin({ denom, amount }, chain.assets);
+ } catch (e: unknown) {
+ setAmountError(e instanceof Error ? e.message : "Could not set decimals");
+ return false;
+ }
+
return true;
};
@@ -124,9 +136,13 @@ const MsgInstantiateContract2Form = ({
const microCoin = (() => {
try {
- return macroCoinToMicroCoin({ denom, amount }, chain.assets);
+ if (!denom || !amount || amount === "0") {
+ return null;
+ }
+
+ return displayCoinToBaseCoin({ denom, amount }, chain.assets);
} catch {
- return { denom, amount: "0" };
+ return null;
}
})();
@@ -155,7 +171,7 @@ const MsgInstantiateContract2Form = ({
fixMsg: false,
salt: hexSalt,
msg: msgContentUtf8Array,
- funds: [microCoin],
+ funds: microCoin ? [microCoin] : [],
});
const msg: MsgInstantiateContract2EncodeObject = {
diff --git a/components/forms/CreateTxForm/MsgForm/MsgInstantiateContractForm.tsx b/components/forms/CreateTxForm/MsgForm/MsgInstantiateContractForm.tsx
index 25d03ec..256b915 100644
--- a/components/forms/CreateTxForm/MsgForm/MsgInstantiateContractForm.tsx
+++ b/components/forms/CreateTxForm/MsgForm/MsgInstantiateContractForm.tsx
@@ -5,7 +5,7 @@ import { useEffect, useRef, useState } from "react";
import { MsgGetter } from "..";
import { useChains } from "../../../../context/ChainsContext";
import { ChainInfo } from "../../../../context/ChainsContext/types";
-import { macroCoinToMicroCoin } from "../../../../lib/coinHelpers";
+import { displayCoinToBaseCoin } from "../../../../lib/coinHelpers";
import { checkAddress, exampleAddress, trimStringsObj } from "../../../../lib/displayHelpers";
import { MsgCodecs, MsgTypeUrls } from "../../../../types/txMsg";
import Input from "../../../inputs/Input";
@@ -87,7 +87,12 @@ const MsgInstantiateContractForm = ({
return false;
}
- if (selectedDenom.value === customDenomOption.value && !customDenom) {
+ if (
+ selectedDenom.value === customDenomOption.value &&
+ !customDenom &&
+ amount &&
+ amount !== "0"
+ ) {
setCustomDenomError("Custom denom must be set because of selection above");
return false;
}
@@ -102,6 +107,13 @@ const MsgInstantiateContractForm = ({
return false;
}
+ try {
+ displayCoinToBaseCoin({ denom, amount }, chain.assets);
+ } catch (e: unknown) {
+ setAmountError(e instanceof Error ? e.message : "Could not set decimals");
+ return false;
+ }
+
return true;
};
@@ -110,9 +122,13 @@ const MsgInstantiateContractForm = ({
const microCoin = (() => {
try {
- return macroCoinToMicroCoin({ denom, amount }, chain.assets);
+ if (!denom || !amount || amount === "0") {
+ return null;
+ }
+
+ return displayCoinToBaseCoin({ denom, amount }, chain.assets);
} catch {
- return { denom, amount: "0" };
+ return null;
}
})();
@@ -131,7 +147,7 @@ const MsgInstantiateContractForm = ({
label,
admin: adminAddress,
msg: msgContentUtf8Array,
- funds: [microCoin],
+ funds: microCoin ? [microCoin] : [],
});
const msg: MsgInstantiateContractEncodeObject = {
diff --git a/components/forms/CreateTxForm/MsgForm/MsgRedelegateForm.tsx b/components/forms/CreateTxForm/MsgForm/MsgRedelegateForm.tsx
index 9a90587..c0af5f0 100644
--- a/components/forms/CreateTxForm/MsgForm/MsgRedelegateForm.tsx
+++ b/components/forms/CreateTxForm/MsgForm/MsgRedelegateForm.tsx
@@ -2,7 +2,7 @@ import { EncodeObject } from "@cosmjs/proto-signing";
import { useEffect, useState } from "react";
import { MsgGetter } from "..";
import { useChains } from "../../../../context/ChainsContext";
-import { macroCoinToMicroCoin } from "../../../../lib/coinHelpers";
+import { displayCoinToBaseCoin } from "../../../../lib/coinHelpers";
import { checkAddress, exampleAddress, trimStringsObj } from "../../../../lib/displayHelpers";
import { MsgCodecs, MsgTypeUrls } from "../../../../types/txMsg";
import Input from "../../../inputs/Input";
@@ -61,12 +61,19 @@ const MsgRedelegateForm = ({
return false;
}
+ try {
+ displayCoinToBaseCoin({ denom: chain.displayDenom, amount }, chain.assets);
+ } catch (e: unknown) {
+ setAmountError(e instanceof Error ? e.message : "Could not set decimals");
+ return false;
+ }
+
return true;
};
const microCoin = (() => {
try {
- return macroCoinToMicroCoin({ denom: chain.displayDenom, amount }, chain.assets);
+ return displayCoinToBaseCoin({ denom: chain.displayDenom, amount }, chain.assets);
} catch {
return { denom: chain.displayDenom, amount: "0" };
}
diff --git a/components/forms/CreateTxForm/MsgForm/MsgSendForm.tsx b/components/forms/CreateTxForm/MsgForm/MsgSendForm.tsx
index 64f65fe..02f7c50 100644
--- a/components/forms/CreateTxForm/MsgForm/MsgSendForm.tsx
+++ b/components/forms/CreateTxForm/MsgForm/MsgSendForm.tsx
@@ -2,7 +2,7 @@ import { MsgSendEncodeObject } from "@cosmjs/stargate";
import { useEffect, useState } from "react";
import { MsgGetter } from "..";
import { useChains } from "../../../../context/ChainsContext";
-import { macroCoinToMicroCoin } from "../../../../lib/coinHelpers";
+import { displayCoinToBaseCoin } from "../../../../lib/coinHelpers";
import { checkAddress, exampleAddress, trimStringsObj } from "../../../../lib/displayHelpers";
import { RegistryAsset } from "../../../../types/chainRegistry";
import { MsgCodecs, MsgTypeUrls } from "../../../../types/txMsg";
@@ -57,7 +57,12 @@ const MsgSendForm = ({ fromAddress, setMsgGetter, deleteMsg }: MsgSendFormProps)
return false;
}
- if (selectedDenom.value === customDenomOption.value && !customDenom) {
+ if (
+ selectedDenom.value === customDenomOption.value &&
+ !customDenom &&
+ amount &&
+ amount !== "0"
+ ) {
setCustomDenomError("Custom denom must be set because of selection above");
return false;
}
@@ -72,6 +77,13 @@ const MsgSendForm = ({ fromAddress, setMsgGetter, deleteMsg }: MsgSendFormProps)
return false;
}
+ try {
+ displayCoinToBaseCoin({ denom, amount }, chain.assets);
+ } catch (e: unknown) {
+ setAmountError(e instanceof Error ? e.message : "Could not set decimals");
+ return false;
+ }
+
return true;
};
@@ -80,16 +92,20 @@ const MsgSendForm = ({ fromAddress, setMsgGetter, deleteMsg }: MsgSendFormProps)
const microCoin = (() => {
try {
- return macroCoinToMicroCoin({ denom, amount }, chain.assets);
+ if (!denom || !amount || amount === "0") {
+ return null;
+ }
+
+ return displayCoinToBaseCoin({ denom, amount }, chain.assets);
} catch {
- return { denom, amount: "0" };
+ return null;
}
})();
const msgValue = MsgCodecs[MsgTypeUrls.Send].fromPartial({
fromAddress,
toAddress,
- amount: [microCoin],
+ amount: microCoin ? [microCoin] : [],
});
const msg: MsgSendEncodeObject = { typeUrl: MsgTypeUrls.Send, value: msgValue };
diff --git a/components/forms/CreateTxForm/MsgForm/MsgUndelegateForm.tsx b/components/forms/CreateTxForm/MsgForm/MsgUndelegateForm.tsx
index d4b81e6..b665851 100644
--- a/components/forms/CreateTxForm/MsgForm/MsgUndelegateForm.tsx
+++ b/components/forms/CreateTxForm/MsgForm/MsgUndelegateForm.tsx
@@ -2,7 +2,7 @@ import { MsgUndelegateEncodeObject } from "@cosmjs/stargate";
import { useEffect, useState } from "react";
import { MsgGetter } from "..";
import { useChains } from "../../../../context/ChainsContext";
-import { macroCoinToMicroCoin } from "../../../../lib/coinHelpers";
+import { displayCoinToBaseCoin } from "../../../../lib/coinHelpers";
import { checkAddress, exampleAddress, trimStringsObj } from "../../../../lib/displayHelpers";
import { MsgCodecs, MsgTypeUrls } from "../../../../types/txMsg";
import Input from "../../../inputs/Input";
@@ -50,12 +50,19 @@ const MsgUndelegateForm = ({
return false;
}
+ try {
+ displayCoinToBaseCoin({ denom: chain.displayDenom, amount }, chain.assets);
+ } catch (e: unknown) {
+ setAmountError(e instanceof Error ? e.message : "Could not set decimals");
+ return false;
+ }
+
return true;
};
const microCoin = (() => {
try {
- return macroCoinToMicroCoin({ denom: chain.displayDenom, amount }, chain.assets);
+ return displayCoinToBaseCoin({ denom: chain.displayDenom, amount }, chain.assets);
} catch {
return { denom: chain.displayDenom, amount: "0" };
}
diff --git a/lib/coinHelpers.spec.ts b/lib/coinHelpers.spec.ts
index 61b5931..702905a 100644
--- a/lib/coinHelpers.spec.ts
+++ b/lib/coinHelpers.spec.ts
@@ -1,5 +1,5 @@
import { RegistryAsset } from "../types/chainRegistry";
-import { macroCoinToMicroCoin } from "./coinHelpers";
+import { displayCoinToBaseCoin } from "./coinHelpers";
const assets: readonly RegistryAsset[] = [
{
@@ -75,70 +75,70 @@ const assets: readonly RegistryAsset[] = [
describe("macroCoinToMicroCoin", () => {
it("works with symbol", () => {
- expect(macroCoinToMicroCoin({ denom: "JUNOX", amount: "12" }, assets)).toEqual({
+ expect(displayCoinToBaseCoin({ denom: "JUNOX", amount: "12" }, assets)).toEqual({
denom: "ujunox",
amount: "12000000",
});
- expect(macroCoinToMicroCoin({ denom: "CHEQ", amount: "34" }, assets)).toEqual({
+ expect(displayCoinToBaseCoin({ denom: "CHEQ", amount: "34" }, assets)).toEqual({
denom: "ncheq",
amount: "34000000000",
});
- expect(macroCoinToMicroCoin({ denom: "arUSD", amount: "56" }, assets)).toEqual({
+ expect(displayCoinToBaseCoin({ denom: "arUSD", amount: "56" }, assets)).toEqual({
denom: "erc20/0x2Cbea61fdfDFA520Ee99700F104D5b75ADf50B0c",
amount: "56000000000000000000",
});
- expect(macroCoinToMicroCoin({ denom: "ETH", amount: "78" }, assets)).toEqual({
+ expect(displayCoinToBaseCoin({ denom: "ETH", amount: "78" }, assets)).toEqual({
denom: "wei",
amount: "78000000000000000000",
});
});
it("works with base unit", () => {
- expect(macroCoinToMicroCoin({ denom: "ujunox", amount: "12" }, assets)).toEqual({
+ expect(displayCoinToBaseCoin({ denom: "ujunox", amount: "12" }, assets)).toEqual({
denom: "ujunox",
amount: "12",
});
- expect(macroCoinToMicroCoin({ denom: "ncheq", amount: "34" }, assets)).toEqual({
+ expect(displayCoinToBaseCoin({ denom: "ncheq", amount: "34" }, assets)).toEqual({
denom: "ncheq",
amount: "34",
});
expect(
- macroCoinToMicroCoin(
+ displayCoinToBaseCoin(
{ denom: "erc20/0x2Cbea61fdfDFA520Ee99700F104D5b75ADf50B0c", amount: "56" },
assets,
),
).toEqual({ denom: "erc20/0x2Cbea61fdfDFA520Ee99700F104D5b75ADf50B0c", amount: "56" });
- expect(macroCoinToMicroCoin({ denom: "wei", amount: "78" }, assets)).toEqual({
+ expect(displayCoinToBaseCoin({ denom: "wei", amount: "78" }, assets)).toEqual({
denom: "wei",
amount: "78",
});
});
it("works with biggest unit", () => {
- expect(macroCoinToMicroCoin({ denom: "junox", amount: "12" }, assets)).toEqual({
+ expect(displayCoinToBaseCoin({ denom: "junox", amount: "12" }, assets)).toEqual({
denom: "ujunox",
amount: "12000000",
});
- expect(macroCoinToMicroCoin({ denom: "cheq", amount: "34" }, assets)).toEqual({
+ expect(displayCoinToBaseCoin({ denom: "cheq", amount: "34" }, assets)).toEqual({
denom: "ncheq",
amount: "34000000000",
});
- expect(macroCoinToMicroCoin({ denom: "arusd", amount: "56" }, assets)).toEqual({
+ expect(displayCoinToBaseCoin({ denom: "arusd", amount: "56" }, assets)).toEqual({
denom: "erc20/0x2Cbea61fdfDFA520Ee99700F104D5b75ADf50B0c",
amount: "56000000000000000000",
});
- expect(macroCoinToMicroCoin({ denom: "eth", amount: "78" }, assets)).toEqual({
+ expect(displayCoinToBaseCoin({ denom: "eth", amount: "78" }, assets)).toEqual({
denom: "wei",
amount: "78000000000000000000",
});
});
it("works with intermediate unit", () => {
- expect(macroCoinToMicroCoin({ denom: "gwei", amount: "78" }, assets)).toEqual({
+ expect(displayCoinToBaseCoin({ denom: "gwei", amount: "78" }, assets)).toEqual({
denom: "wei",
amount: "78000000000",
});
- expect(macroCoinToMicroCoin({ denom: "GWEI", amount: "78" }, assets)).toEqual({
+ expect(displayCoinToBaseCoin({ denom: "GWEI", amount: "78" }, assets)).toEqual({
denom: "wei",
amount: "78000000000",
});
diff --git a/lib/coinHelpers.ts b/lib/coinHelpers.ts
index c20eac6..d2dc5bd 100644
--- a/lib/coinHelpers.ts
+++ b/lib/coinHelpers.ts
@@ -3,8 +3,8 @@ import { Coin } from "@cosmjs/stargate";
import { assert } from "@cosmjs/utils";
import { RegistryAsset } from "../types/chainRegistry";
-const macroCoinToMicroCoin = (macroCoin: Coin, assets: readonly RegistryAsset[]): Coin => {
- const lowerCaseDenom = macroCoin.denom.toLowerCase();
+const displayCoinToBaseCoin = (displayCoin: Coin, assets: readonly RegistryAsset[]): Coin => {
+ const lowerCaseDenom = displayCoin.denom.toLowerCase();
const asset = assets.find(
(currentAsset) =>
@@ -17,7 +17,12 @@ const macroCoinToMicroCoin = (macroCoin: Coin, assets: readonly RegistryAsset[])
),
);
- assert(asset, `An asset with the given symbol ${macroCoin.denom} was not found`);
+ // Leave IBC coins as is if not found on registry assets
+ if (!asset && displayCoin.denom.toLowerCase().startsWith("ibc/")) {
+ return displayCoin;
+ }
+
+ assert(asset, `An asset with the given symbol ${displayCoin.denom} was not found`);
const macroUnit = asset.denom_units.find(
(currentUnit) => lowerCaseDenom === currentUnit.denom.toLowerCase(),
@@ -28,9 +33,12 @@ const macroCoinToMicroCoin = (macroCoin: Coin, assets: readonly RegistryAsset[])
assert(baseUnit, `A base unit with exponent = 0 was not found`);
const denom = baseUnit.denom;
- const amount = Decimal.fromUserInput(macroCoin.amount.trim() || "0", macroUnit.exponent).atomics;
+ const amount = Decimal.fromUserInput(
+ displayCoin.amount.trim() || "0",
+ macroUnit.exponent,
+ ).atomics;
return { denom, amount };
};
-export { macroCoinToMicroCoin };
+export { displayCoinToBaseCoin };