|
|
@@ -37,9 +37,14 @@ export type MethodType = "nft" | "createWrapped" | "transfer";
|
|
|
//rather than a hardcoded value.
|
|
|
const SOLANA_THRESHOLD_LAMPORTS: bigint = BigInt(300000);
|
|
|
const ETHEREUM_THRESHOLD_WEI: bigint = BigInt(35000000000000000);
|
|
|
-const TERRA_THRESHOLD_ULUNA: bigint = BigInt(500000);
|
|
|
+const TERRA_THRESHOLD_ULUNA: bigint = BigInt(100000);
|
|
|
+const TERRA_THRESHOLD_UUSD: bigint = BigInt(10000000);
|
|
|
|
|
|
-const isSufficientBalance = (chainId: ChainId, balance: bigint | undefined) => {
|
|
|
+const isSufficientBalance = (
|
|
|
+ chainId: ChainId,
|
|
|
+ balance: bigint | undefined,
|
|
|
+ terraFeeDenom?: string
|
|
|
+) => {
|
|
|
if (balance === undefined || !chainId) {
|
|
|
return true;
|
|
|
}
|
|
|
@@ -49,13 +54,33 @@ const isSufficientBalance = (chainId: ChainId, balance: bigint | undefined) => {
|
|
|
if (isEVMChain(chainId)) {
|
|
|
return balance > ETHEREUM_THRESHOLD_WEI;
|
|
|
}
|
|
|
- if (CHAIN_ID_TERRA === chainId) {
|
|
|
+ if (terraFeeDenom === "uluna") {
|
|
|
return balance > TERRA_THRESHOLD_ULUNA;
|
|
|
}
|
|
|
+ if (terraFeeDenom === "uusd") {
|
|
|
+ return balance > TERRA_THRESHOLD_UUSD;
|
|
|
+ }
|
|
|
|
|
|
return true;
|
|
|
};
|
|
|
|
|
|
+type TerraBalance = {
|
|
|
+ denom: string;
|
|
|
+ balance: bigint;
|
|
|
+};
|
|
|
+
|
|
|
+const isSufficientBalanceTerra = (balances: TerraBalance[]) => {
|
|
|
+ return balances.some(({ denom, balance }) => {
|
|
|
+ if (denom === "uluna") {
|
|
|
+ return balance > TERRA_THRESHOLD_ULUNA;
|
|
|
+ }
|
|
|
+ if (denom === "uusd") {
|
|
|
+ return balance > TERRA_THRESHOLD_UUSD;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ });
|
|
|
+};
|
|
|
+
|
|
|
//TODO move to more generic location
|
|
|
const getBalanceSolana = async (walletAddress: string) => {
|
|
|
const connection = new Connection(SOLANA_HOST);
|
|
|
@@ -77,18 +102,25 @@ const getBalanceEvm = async (walletAddress: string, provider: Provider) => {
|
|
|
return provider.getBalance(walletAddress).then((result) => result.toBigInt());
|
|
|
};
|
|
|
|
|
|
-const getBalanceTerra = async (walletAddress: string) => {
|
|
|
- const TARGET_DENOM = "uluna";
|
|
|
+const getBalancesTerra = async (walletAddress: string) => {
|
|
|
+ const TARGET_DENOMS = ["uluna", "uusd"];
|
|
|
|
|
|
const lcd = new LCDClient(TERRA_HOST);
|
|
|
return lcd.bank
|
|
|
.balance(walletAddress)
|
|
|
.then((coins) => {
|
|
|
- // coins doesn't support reduce
|
|
|
- const balancePairs = coins.map(({ amount, denom }) => [denom, amount]);
|
|
|
- const targetCoin = balancePairs.find((coin) => coin[0] === TARGET_DENOM);
|
|
|
- if (targetCoin) {
|
|
|
- return BigInt(targetCoin[1].toString());
|
|
|
+ const balances = coins
|
|
|
+ .filter(({ denom }) => {
|
|
|
+ return TARGET_DENOMS.includes(denom);
|
|
|
+ })
|
|
|
+ .map(({ amount, denom }) => {
|
|
|
+ return {
|
|
|
+ denom,
|
|
|
+ balance: BigInt(amount.toString()),
|
|
|
+ };
|
|
|
+ });
|
|
|
+ if (balances) {
|
|
|
+ return balances;
|
|
|
} else {
|
|
|
return Promise.reject();
|
|
|
}
|
|
|
@@ -115,6 +147,7 @@ export default function useTransactionFees(chainId: ChainId) {
|
|
|
const { walletAddress, isReady } = useIsWalletReady(chainId);
|
|
|
const { provider } = useEthereumProvider();
|
|
|
const [balance, setBalance] = useState<bigint | undefined>(undefined);
|
|
|
+ const [terraBalances, setTerraBalances] = useState<TerraBalance[]>([]);
|
|
|
const [isLoading, setIsLoading] = useState(false);
|
|
|
const [error, setError] = useState("");
|
|
|
|
|
|
@@ -157,12 +190,17 @@ export default function useTransactionFees(chainId: ChainId) {
|
|
|
}
|
|
|
} else if (chainId === CHAIN_ID_TERRA && isReady && walletAddress) {
|
|
|
loadStart();
|
|
|
- getBalanceTerra(walletAddress).then(
|
|
|
- (result) => {
|
|
|
- const adjustedresult =
|
|
|
- result === undefined || result === null ? BigInt(0) : result;
|
|
|
+ getBalancesTerra(walletAddress).then(
|
|
|
+ (results) => {
|
|
|
+ const adjustedResults = results.map(({ denom, balance }) => {
|
|
|
+ return {
|
|
|
+ denom,
|
|
|
+ balance:
|
|
|
+ balance === undefined || balance === null ? BigInt(0) : balance,
|
|
|
+ };
|
|
|
+ });
|
|
|
setIsLoading(false);
|
|
|
- setBalance(adjustedresult);
|
|
|
+ setTerraBalances(adjustedResults);
|
|
|
},
|
|
|
(error) => {
|
|
|
setIsLoading(false);
|
|
|
@@ -174,13 +212,16 @@ export default function useTransactionFees(chainId: ChainId) {
|
|
|
|
|
|
const results = useMemo(() => {
|
|
|
return {
|
|
|
- isSufficientBalance: isSufficientBalance(chainId, balance),
|
|
|
+ isSufficientBalance:
|
|
|
+ chainId === CHAIN_ID_TERRA
|
|
|
+ ? isSufficientBalanceTerra(terraBalances)
|
|
|
+ : isSufficientBalance(chainId, balance),
|
|
|
balance,
|
|
|
balanceString: toBalanceString(balance, chainId),
|
|
|
isLoading,
|
|
|
error,
|
|
|
};
|
|
|
- }, [balance, chainId, isLoading, error]);
|
|
|
+ }, [balance, terraBalances, chainId, isLoading, error]);
|
|
|
|
|
|
return results;
|
|
|
}
|