Deposit

Interface

/**
 * Parameters required for preparing a deposit transaction
 * @interface PrepareDepositTransactionDataParams
 * @property {VaultKey} vaultKey - Unique identifier for the target vault
 * @property {Address} userAddress - Ethereum address of the user making the deposit
 * @property {string} depositTokenSymbol - Symbol of the token being deposited (e.g., 'WETH', 'USDC')
 * @property {string} depositAmount - Amount of assets to deposit as a decimal string (e.g., "1.5")
 * @property {number | string} chainId - ID of the chain where the deposit will occur
 * @property {number} [slippage] - Maximum acceptable slippage percentage as a decimal (e.g., 0.01 for 1%)
 */
interface PrepareDepositTransactionDataParams {
  vaultKey: VaultKey;
  userAddress: Address;
  depositTokenSymbol: string;
  depositAmount: string;
  chainId: number | string;
  slippage?: number;
}

/**
 * Result object containing transaction data for a deposit operation
 * @interface DepositTransactionData
 * @property {typeof TellerAbi} abi - ABI for the Teller contract
 * @property {Address} address - Address of the Teller contract
 * @property {'deposit'} functionName - Name of the function to call
 * @property {[Address, bigint, bigint]} args - Arguments for the deposit function:
 *   [depositAsset, depositAmount, minimumMint]
 * @property {number} chainId - ID of the chain where the transaction should be executed
 */
interface DepositTransactionData {
  abi: typeof TellerAbi;
  address: Address;
  functionName: 'deposit';
  args: [Address, bigint, bigint];
  chainId: number;
}

Function Overview

import { prepareDepositTransactionData, getVaultByKey, VaultKeys } from '@molecularlabs/nucleus-frontend';

const COOLVAULT_VAULT_KEY = VaultKeys.COOLVAULT;

// Prepare deposit transaction data
const depositTransactionData = await prepareDepositTransactionData({
  vaultKey: COOLVAULT_VAULT_KEY,
  userAddress: '0x1234...',
  depositTokenSymbol: 'WETH', // WETH address
  depositAmount: '1', // 1 WETH
  slippage: 0.01, // 1% slippage (optional)
});

const {
  abi,
  address,
  functionName,
  args,
  chainId
} = depositTransactionData;

Viem Example

import { createPublicClient, http, createWalletClient, custom } from 'viem';
import { mainnet } from 'viem/chains';
import { prepareDepositTransactionData, getVaultByKey, VaultKeys } from '@molecularlabs/nucleus-frontend';

// Example using Viem with MetaMask
const publicClient = createPublicClient({
  chain: mainnet,
  transport: http()
});

const walletClient = createWalletClient({
  chain: mainnet,
  transport: custom(window.ethereum)
});

const COOLVAULT_VAULT_KEY = VaultKeys.COOLVAULT;

async function depositToVault() {
  try {
    // Get user's address
    const [address] = await walletClient.requestAddresses();

    // Prepare deposit data
    const depositTxData = await prepareDepositTransactionData({
      vaultKey: COOLVAULT_VAULT_KEY,
      userAddress: address,
      depositTokenSymbol: 'WETH',
      depositAmount: '1.0', // Depositing 1 WETH
      chainId: 1, // Mainnet
      slippage: 0.01 // 1% slippage
    });

    // Send the transaction
    const hash = await walletClient.writeContract(depositTxData);
    
    // Wait for transaction
    const receipt = await publicClient.waitForTransactionReceipt({ hash });
    
    console.log('Deposit successful:', receipt);
  } catch (error) {
    console.error('Deposit failed:', error);
  }
}

Wagmi Example


import { useAccount, useContractWrite, usePrepareContractWrite, useNetwork } from 'wagmi';
import { useQuery } from '@tanstack/react-query';
import { prepareDepositTransactionData, getVaultByKey, VaultKeys } from '@molecularlabs/nucleus-frontend';

const COOLVAULT_VAULT_KEY = VaultKeys.COOLVAULT;

function DepositComponent() {
  const { address } = useAccount();
  const { chain } = useNetwork();
  const [amount, setAmount] = useState('');

  const isValidAmount = useMemo(() => {
    try {
      return parseFloat(amount) > 0;
    } catch {
      return false;
    }
  }, [amount]);

  const {
    data: depositTxData,
    isLoading: isPreparing,
    error: prepareError
  } = useQuery({
    queryKey: ['prepareDeposit', COOLVAULT_VAULT_KEY, amount],
    queryFn: async () => {
      return prepareDepositTransactionData({
        vaultKey: COOLVAULT_VAULT_KEY,
        userAddress: address,
        depositTokenSymbol: 'WETH',
        depositAmount: amount,
        chainId: chain.id,
        slippage: 0.01
      });
    },
    enabled: !!address && !!chain?.id && isValidAmount
  });

  const { config } = usePrepareContractWrite({
    address: depositData?.address,
    abi: depositData?.abi,
    functionName: depositData?.functionName,
    args: depositData?.args,
    chainId: depositData?.chainId,
    enabled: !!depositData && isValidAmount
  });

  const {
    write: deposit,
    data: depositHash,
    isLoading: isWriting,
    isSuccess,
    isError
  } = useContractWrite(config);
  
  // Handle transaction status
  const { isLoading: isTransactionPending, isSuccess } = useWaitForTransaction({
    hash: depositHash?.hash,
  });

  /**
  /* Additional Code...
  */
  return (
    <div>
      <input 
        type="number" 
        value={amount} 
        onChange={(e) => setAmount(e.target.value)}
        placeholder="Amount to deposit"
      />
      <button 
        onClick={() => deposit?.()} 
        disabled={!deposit || isWriting || isPreparing}
      >
        {isWriting ? 'Depositing...' : `Deposit ${amount} WETH`}
      </button>
      
      {isSuccess && (
        <div>
          Deposit successful! Transaction: {data?.hash}
        </div>
      )}
      
      {isError && prepareError && (
        <div>
          Error: {prepareError.message}
        </div>
      )}
    </div>
  );
}

export { DepositComponent };

Last updated