@molecularlabs/nucleus-frontend
Version:
Nucleus BoringVault Frontend SDK
80 lines • 2.64 kB
JavaScript
import { getVaultByKey } from ".";
import { getPreviewFee } from "../api/teller";
import { toChainId } from "../api/vault-config";
import { NATIVE_TOKEN_FOR_BRIDGE_FEE } from "../constants";
import { CrossChainTellerBaseAbi } from "../contracts/cross-chain-teller-base-abi";
const prepareBridgeContractArg = ({
bridgeChainIdentifier,
userAddress,
nativeTokenForBridgeFee = NATIVE_TOKEN_FOR_BRIDGE_FEE
}) => {
return {
chainSelector: bridgeChainIdentifier,
destinationChainReceiver: userAddress,
bridgeFeeToken: nativeTokenForBridgeFee,
messageGas: BigInt(1e5),
data: "0x"
};
};
const prepareBridgeTransactionData = async ({
vaultKey,
bridgeAmount,
sourceChainId,
destinationChainId,
userAddress
}) => {
const nativeTokenForBridgeFee = NATIVE_TOKEN_FOR_BRIDGE_FEE;
const vault = await getVaultByKey(vaultKey);
if (!vault) {
throw new Error(`Invalid vault key: ${vaultKey}`);
}
if (!vault.contracts) {
throw new Error(`Contracts not configured for vault ${vaultKey}`);
}
if (!vault.contracts.boringVault) {
throw new Error(
`BoringVault contract not configured for vault ${vaultKey}`
);
}
if (!vault.contracts.accountant) {
throw new Error(`Accountant contract not configured for vault ${vaultKey}`);
}
if (!vault.contracts.teller) {
throw new Error(`Teller contract not configured for vault ${vaultKey}`);
}
const normalizedSourceChainId = toChainId(sourceChainId);
const sourceChain = vault.withdraw.sourceChains[normalizedSourceChainId];
if (!sourceChain) {
throw new Error(`Source chain not configured for vault ${vaultKey}`);
}
const normalizedDestinationChainId = toChainId(destinationChainId);
const destinationChain = sourceChain.destinationChains[normalizedDestinationChainId];
if (!destinationChain) {
throw new Error(`Destination chain not configured for vault ${vaultKey}`);
}
const bridgeChainIdentifier = destinationChain.bridge.chainIdentifier;
const bridgeContractArg = prepareBridgeContractArg({
bridgeChainIdentifier,
userAddress,
nativeTokenForBridgeFee
});
const previewFee = await getPreviewFee({
shareAmount: bridgeAmount,
bridgeData: bridgeContractArg,
contractAddress: vault.contracts.teller,
chainId: normalizedSourceChainId
});
return {
abi: CrossChainTellerBaseAbi,
address: vault.contracts.teller,
functionName: "bridge",
args: [bridgeAmount, bridgeContractArg],
chainId: normalizedSourceChainId,
value: previewFee
};
};
export {
prepareBridgeContractArg,
prepareBridgeTransactionData
};
//# sourceMappingURL=bridge.mjs.map