本文介绍了如何使用Biconomy的MEE和AbstractJS SDK实现一键将Aave的仓位迁移到Venus协议。通过Fusion模式,用户只需一次签名即可完成包括转移利息、从Aave提款、授权Venus花费代币以及在Venus上铸造vToken等多个复杂操作,极大地简化了DeFi操作的用户体验.
本教程演示了如何利用 Biconomy 的模块化执行环境(MEE)和 AbstractJS SDK,以实现从 Aave 到 Venus Protocol 的一键式仓位迁移。该实现展示了可组合编排的强大功能,只需一个用户签名即可执行多个复杂的交易。
此实现使用户能够:
所有这些操作都在单个交易流中原子地发生,从而抽象出多个批准和跨协议交互的复杂性。
由于像 MetaMask 或 Rabby 这样的外部钱包无法直接在 EOA 上安装智能账户逻辑,因此此实现使用了 Fusion Mode - 一种透传机制,可通过 Companion 智能账户启用 MEE 编排。
这里展示的最强大的功能之一是使用 runtimeERC20BalanceOf
。此函数在执行时动态解析代币余额,而不是在签名时:
runtimeERC20BalanceOf({
targetAddress: accountAddress,
tokenAddress: position.aTokenAddress,
constraints: [greaterThanOrEqualTo(100n)],
})
这对于 DeFi 操作至关重要,因为:
让我们研究一下 Fusion 触发器和可组合指令如何协同工作:
触发器是启动整个编排的入口点:
trigger: {
chainId,
tokenAddress: position.aTokenAddress,
amount: position.userATokenBalanceMantissa,
approvalAmount: bufferAmount, // 缓冲以考虑利息
gasLimit: 500000n,
}
此触发器:
const transferInterest = await nexusAccount.buildComposable({
type: 'transferFrom',
data: {
recipient: nexusAccountAddress, // Companion Account 地址
sender: accountAddress, // 用户的 EOA
tokenAddress: position.aTokenAddress,
amount: runtimeERC20BalanceOf({
targetAddress: accountAddress,
tokenAddress: position.aTokenAddress,
constraints: [greaterThanOrEqualTo(100n)],
}),
chainId,
gasLimit: 100000n,
},
});
此指令:
const withdrawFromAave = await nexusAccount.buildComposable({
type: 'default',
data: {
to: aaveV3PoolContractAddress,
abi: aaveV3PoolAbi,
functionName: 'withdraw',
args: [\
position.tokenAddress, // 要提取的资产\
MAX_UINT256.toFixed(), // 数量(MAX = 整个仓位)\
nexusAccountAddress, // 接收者\
],
chainId,
gasLimit: 100000n,
},
});
关键见解:
MAX_UINT256
提取整个仓位,包括在交易处理期间产生的任何利息default
类型允许调用任何智能合约功能const approveVenus = await nexusAccount.buildComposable({
type: 'approve',
data: {
tokenAddress: position.tokenAddress,
spender: vToken.address,
amount: runtimeERC20BalanceOf({
targetAddress: nexusAccountAddress,
tokenAddress: position.tokenAddress,
constraints: [greaterThanOrEqualTo(100n)],
}),
chainId,
gasLimit: 100000n,
},
});
这展示了 MEE 的另一个强大功能:
const mintVTokens = await nexusAccount.buildComposable({
type: 'default',
data: {
to: vToken.address,
abi: vBep20Abi,
functionName: 'mintBehalf',
args: [\
accountAddress, // 代表用户的 EOA 进行 Mint\
runtimeERC20BalanceOf({\
targetAddress: nexusAccountAddress,\
tokenAddress: position.tokenAddress,\
constraints: [greaterThanOrEqualTo(100n)],\
}),\
],
chainId,
gasLimit: 100000n,
},
});
这里的魔力:
mintBehalf
允许 SCA 为用户的 EOA Mint 代币Fusion Quote 将所有内容与触发交易打包在一起:
// 缓冲批准金额以考虑利息增加
const approvalAmount = buffer({
amountMantissa: position.userATokenBalanceWithInterestsMantissa,
});
const fusionQuote = await meeClient.getFusionQuote({
trigger: {
chainId,
tokenAddress: position.aTokenAddress,
amount: position.userATokenBalanceMantissa,
approvalAmount, // 缓冲金额
gasLimit: 500000n,
},
instructions: [\
transferInterest,\
withdrawFromAave,\
approveVenus,\
mintVTokens\
],
sponsorship: true, // 启用 gasless 执行
});
主要特点:
buffer
函数在处理 Aave 的利息增加机制方面起着至关重要的作用。以下是需要它的原因:
将 aToken 转移到 Companion Account 时,Aave 处理利息的方式存在细微差别:
transferInterest
)然后将这些剩余的 aToken(应计利息)提取到 Companion Account缓冲可确保我们批准足够的 aToken 来覆盖:
这个两步过程确保了整个 aToken 仓位(本金 + 所有应计利息)都被捕获以进行迁移。该实现有效地允许用户将他们所有的 aToken 和所有应计利息转移到 Companion Account,从而确保 EOA 上不会留下任何价值。
此实现在一个交易中无缝桥接了两个主要的 DeFi 协议(Aave 和 Venus)。MEE 处理所有复杂性,包括:
传统的交易需要预先知道确切的金额。借助 MEE 的运行时值:
Nexus 帐户充当中间人,可以:
Companion Account 充当无状态中间人,可以:
constraints: [greaterThanOrEqualTo(100n)]
约束确保仅在满足条件时才执行操作,从而防止:
问题:5 个签名,5 次 gas 支付,部分执行的风险,复杂的 UX
优点:
此实现展示了 Biconomy 的 MEE 与 Fusion Mode 如何将复杂的 DeFi 操作转化为简单的、用户友好的体验。通过利用可组合指令、运行时值并通过 Companion Account 进行原子执行,开发人员可以构建与任何外部钱包一起使用的复杂的跨协议集成。
展示的主要创新:
这种模式可以应用于任何多步骤 DeFi 操作,从收益优化到投资组合再平衡,使其成为构建与主流钱包配合使用的高级 Web3 体验的强大工具。
- 原文链接: blog.biconomy.io/case-st...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!