This DeFi project showcases a simple yet effective cross-chain investment strategy using Chainlink's CCIP and the ERC4626 Tokenized Vaults standard. Users deposit tokens into a contract on one blockchain and use Chainlink CCIP to transfer them to another blockchain's vault. The vault issues shares equal to the token value. Later, users can redeem these shares to get back their original tokens, potentially with added yield if the tokens have increased in value. This approach offers a user-friendly way to manage assets across different blockchains and benefit from yield-generating opportunities.
- StakeAcrossSender.sol: This is the Sender Contract deployed on Fuji, the source chain.
- StakeAcrossVaultProtocol: Operating on Sepolia, the destination chain, this contract is a key component of the protocol.
The StakeAcrossVaultProtocol
is an extension of both the CrossChainReceiver
Contract and the ERC4626Vault
Contract. It leverages the functionality of CrossChainReceiver
for sending and receiving messages and tokens across blockchain networks, while also incorporating the features of the ERC4626Vault
contract, which adheres to the ERC4626 standard. The ERC4626 standard represents a tokenized vault framework, where ERC20 tokens are used to signify shares in an asset pool.
Note: In this example, we use the CCIP-BnM token for sending and receiving via CCIP, as it is one of the two available tokens on the testnet for testing purposes. For more information, please refer to CCIP Test Tokens.
Note: The CCIP-BnM token serves as a placeholder for any other ERC20 token that we might want to use on the mainnet in the future. To find out which tokens are currently available on various mainnet networks and how to add your own, check out this resource: CCIP Mainnet Tokens.
- Token Deposit: A DeFi user deposits tokens into the
StakeAcrossSender
contract on the source chain. - Cross-Chain Transfer: The user then employs Chainlink CCIP to transfer these tokens, along with accompanying message data, to the
StakeAcrossVaultProtocol
on the destination chain. - Share Minting and Transfer: The
StakeAcrossVaultProtocol
mints shares equivalent to the deposited token value and transfers these shares to the user's account on the destination chain. - Asset Redemption: At a subsequent time, the user can redeem these token shares through the
StakeAcrossVaultProtocol
contract. This enables the user to reclaim the original asset tokens on the source chain via CCIP. - Yield Benefits: If the asset tokens in the vault have appreciated (due to a successful investment strategy), the user can withdraw a greater amount of asset tokens than the initial deposit, benefiting from the yield generated by the protocol.
This use case demonstrates the integration of cross-chain capabilities with yield-generating strategies in DeFi, utilizing the robustness of Chainlink's CCIP and the efficiency of the ERC4626 standard for a comprehensive DeFi solution.
Chainlink CCIP fees are paid using LINK tokens. They can also be paid in the chain's native token but in this example we pay CCIP fees in LINK.
This project leverages Hardhat tasks for streamlined operations. This is because we interact directly with the CCIP contracts deployed on the testnet. The task files are conveniently named with sequential number prefixes, indicating the order in which they should be executed for this specific use case.
- Clone the Repository: Start by cloning the project repository to your local machine.
- Install Dependencies: Run
npm install
in your project directory to install necessary dependencies.
For the source chain, where StakeAcrossSender.sol
is deployed, you will need:
- LINK Tokens: Acquire LINK tokens for the Fuji chain. Detailed instructions can be found here.
- CCIP-BnM Tokens: Obtain Burn & Mint Tokens for the Fuji chain using the
drip()
function. More information is available here. - Fuji AVAX: A small amount of Fuji AVAX is required, which can be obtained from this faucet.
For the destination chain, where StakeAcrossVaultProtocol
is deployed, you will need:
- LINK Tokens: Similar to the Fuji chain, acquire LINK tokens for Sepolia. Ensure you switch networks and interact with the correct LINK token contract. The same URL as above can be used.
- Sepolia ETH: A small amount of Sepolia ETH is necessary, available from this faucet.
- Network Configurations: The
./networks.js
file contains all the configuration details. This file exports configurations used by the tasks in./tasks
.
For enhanced security:
- Avoid Human-Readable Storage: We advise against storing environment variables in a
.env
file or any human-readable format. - Encrypted Environment Variables: Utilize the @chainlink/env-enc NPM package for encryption.
- Required Variables:
PRIVATE_KEY1
: Your development wallet's private key for deployment.PRIVATE_KEY2
: Additional account to test deposits from a different one.SEPOLIA_RPC_URL
: The JSON-RPC URL from services like Alchemy or Infura for Sepolia.AVALANCHE_FUJI_RPC_URL
: The RPC URL for the Avalanche Fuji test network, typicallyhttps://api.avax-test.network/ext/bc/C/rpc
.
This guide outlines the process of deploying and interacting with the StakeAcrossSender.sol
and StakeAcrossVaultProtocol
contracts for our use case, using the Avalanche Fuji C Chain as the source chain and Sepolia as the destination chain.
- Task: Deploy the
StakeAcrossSender.sol
contract to the Avalanche Fuji C Chain. - Command:
npx hardhat setup-sender --network fuji
- Note: Record the contract address from the console output. This step also funds your contract if your environment variables are correctly set up.
- Task: Deploy the
StakeAcrossVaultProtocol
contract to Sepolia. - Command:
npx hardhat setup-protocol --network sepolia
- Note: Take note of the contract address.
StakeAcrossVaultProtocol
also manages the vSTA ERC20 tokens that represent Platform Shares. With this address the tokens can be imported into the user's wallet
- Task: Send tokens and data from
StakeAcrossSender.sol
toStakeAcrossVaultProtocol
. Amount in "wei" units - i.e. 500000000000000000 = 0.5 CCIP-BnM tokens. - Command:
npx hardhat transfer-token --network fuji --sender <<Sender Contract Address on Fuji>> --protocol <<Protocol Contract Address on Sepolia>> --dest-chain sepolia \ // Sepolia destination chain selector --amount 500000000000000000 // Units of BnM
- Note: Record the Source Tx Hash from your console. The transfer can take between 5 to 15 minutes due to the cross-chain nature of CCIP.
- Task: Check if the message has been successfully received on Sepolia.
- Tools: Use the CCIP explorer page to monitor the transaction status. Wait for it to show "Success".
- Note: Record the message Id when successful.
- Command:
npx hardhat read-protocol \ --network <<network>> \ --address <<Protocol contract address>> --user <<user address>>
- Note: This task will provide the following information: Total Assets deposited in the protocol, Total Shares minted, Number of vSTA Shares allocated to the user, and Preview the current value of Assets that the user is entitled to if they redeem all their Shares. This amount varies based on the outcomes of the investment strategy."
Vault Total Assets: 1.32 Vault Total Supply: 1.1636 User vSTA Balance: 0.8 Preview Redeem for User: 0.9075
- Task: Redeem shares for equivalent assets, which are then transferred back to the user's EOA on the source chain via CCIP.
- Command:
npx hardhat redeem-protocol \ --network <<network>> \ --address <<Protocol contract address>> \ --dest-chain <<Sender contract address>> \ --receiver <<Reciever EOA address>> \ --amount 800000000000000000 // amount of shares to redeem
- Note: These tasks, which are optional and only relevant during testing, allow us to retrieve the remaining balances of the various tokens used to fund contracts for testing purposes, enabling their reuse in subsequent tests.
- Withdraw from Sender:
`npx hardhat withdraw-sender-funds --network fuji --address <<Sender contract address on Fuji>>`
- Withdraw from Protocol:
`npx hardhat withdraw-protocol-funds --network sepolia --address <<Protocol address on Sepolia>>`
Each step in this process is a Hardhat Task, located in separate, sequentially numbered files in ./tasks
. Follow the sequence and pay attention to the console outputs for a smooth execution of the use case.
As part of our ongoing efforts to enhance and optimize our project, we have identified key areas for improvement and expansion. The following items are prioritized in our development roadmap:
-
Development of Dynamic NFT System:
- We plan to create a dynamic Non-Fungible Token (NFT) system. This system will track and represent each user's reputation, investment history, and earnings, serving as a unique digital asset that reflects the user's engagement and success within the platform.
-
Strategy Protocol Deployment:
- We aim to deploy the Protocol on a blockchain network that strikes an optimal balance between cost-efficiency and reliability. The chosen network should minimize transaction costs while maintaining high standards of performance and security.
-
Expanding Sender Contract Deployment:
- To enhance the protocol’s reach and interoperability, we will deploy the
Sender
contract across all Ethereum Virtual Machine (EVM) compatible networks supported by Chainlink's Cross-Chain Interoperability Protocol (CCIP). This expansion will significantly increase the protocol's accessibility across diverse blockchain ecosystems.
- To enhance the protocol’s reach and interoperability, we will deploy the
-
Best Practices:
- Complete the addition of the recommended CCIP Best Practices, particularly those related to security: CCIP Best Practices
These initiatives are integral to the project's advancement and will be actively pursued in our development cycle. We look forward to updating our community as we achieve these milestones.