@molecularlabs/nucleus-frontend
Version:
Nucleus BoringVault Frontend SDK
103 lines • 3.27 kB
JavaScript
import { formatUnits } from "viem";
import { getErc20AllowanceWithDecimals } from "../api/erc20";
import { toChainId } from "../api/vault-config";
import { ATOMIC_QUEUE_CONTRACT_ADDRESS } from "../constants";
import { tryCatch } from "../utils/try-catch";
import { getVaultByKey } from "../vaults";
const isDepositSpendApproved = async ({
vaultKey,
sourceChainId,
depositTokenSymbol,
userAddress
}) => {
const {
data: vault,
error: vaultError,
success: vaultSuccess
} = await tryCatch(getVaultByKey(vaultKey));
if (!vaultSuccess) {
throw new Error(`Vault not found for ${vaultKey}: ${vaultError.message}`);
}
if (!vault.contracts) {
throw new Error(`Contracts not found: ${vaultKey}`);
}
const normalizedSourceChainId = toChainId(sourceChainId);
const depositAssetAddress = vault.deposit.sourceChains[normalizedSourceChainId].depositTokens[depositTokenSymbol].address;
if (!depositAssetAddress) {
throw new Error(`Deposit asset address not found: ${depositTokenSymbol}`);
}
const { deposit } = vault;
const { sourceChains } = deposit;
const sourceChain = sourceChains[normalizedSourceChainId];
if (!sourceChain) {
throw new Error(`Source chain not found: ${normalizedSourceChainId}`);
}
const [allowance, decimals] = await getErc20AllowanceWithDecimals({
chainId: normalizedSourceChainId,
tokenAddress: depositAssetAddress,
userAddress,
spenderAddress: vault.contracts.boringVault
});
if (allowance.status === "failure" || decimals.status === "failure") {
return {
isApproved: false,
allowance: "0",
allowanceAsBigInt: "0",
decimals: "0",
error: allowance.error || decimals.error
};
}
return {
isApproved: allowance.result > 0n,
allowance: formatUnits(allowance.result, decimals.result),
allowanceAsBigInt: allowance.result.toString(),
decimals: decimals.result,
error: null
};
};
const isWithdrawalSpendApproved = async ({
vaultKey,
destinationChainId,
userAddress
}) => {
const {
data: vault,
error: vaultError,
success: vaultSuccess
} = await tryCatch(getVaultByKey(vaultKey));
if (!vaultSuccess) {
throw new Error(`Vault not found for ${vaultKey}: ${vaultError.message}`);
}
if (!vault.contracts) {
throw new Error(`Contracts not found for ${vaultKey}`);
}
const normalizedDestinationChainId = toChainId(destinationChainId);
const boringVaultAddress = vault.contracts.boringVault;
const [allowance, decimals] = await getErc20AllowanceWithDecimals({
chainId: normalizedDestinationChainId,
tokenAddress: boringVaultAddress,
userAddress,
spenderAddress: ATOMIC_QUEUE_CONTRACT_ADDRESS
});
if (allowance.status === "failure" || decimals.status === "failure") {
return {
isApproved: false,
allowance: "0",
allowanceAsBigInt: "0",
decimals: "0",
error: allowance.error || decimals.error
};
}
return {
isApproved: allowance.result > 0n,
allowance: formatUnits(allowance.result, decimals.result),
allowanceAsBigInt: allowance.result.toString(),
decimals: decimals.result,
error: null
};
};
export {
isDepositSpendApproved,
isWithdrawalSpendApproved
};
//# sourceMappingURL=approvals.mjs.map