You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Starknet Cairo v2合约中实现ETH转账?

在Cairo v2合约中实现对Cairo v0版Starknet ETH的转账操作

要解决跨Cairo版本的ERC20调用问题,核心是处理v0和v2的ABI兼容差异,以下是具体方案:

1. 定义适配v0合约的IERC20接口

Cairo v0的ERC20合约在ABI结构和数据类型上和v2有区别,必须用#[abi(legacy_v0)]标记接口方法,让v2合约能正确解析v0的调用格式。同时注意参数和返回值的类型对齐:

#[starknet::interface]
trait IERC20V0<TContractState> {
    #[abi(legacy_v0)]
    fn transfer(self: @TContractState, recipient: ContractAddress, amount: Uint256) -> bool;
}

这里的Uint256直接用Cairo v2标准库中的starknet::core::types::Uint256即可,它和v0合约中的Uint256结构体(由low和high两个felt组成)结构完全匹配,无需额外转换。

2. 编写转账调用逻辑

调用时指定Starknet ETH的合约地址,通过生成的Dispatcher来调用transfer方法:

use starknet::core::types::Uint256;
use starknet::contract_address_const;

// Starknet主网ETH合约地址,测试网请替换对应地址
const ETH_CONTRACT_ADDR: ContractAddress = contract_address_const!(0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7);

#[external(v0)]
fn execute_eth_transfer(self: @ContractState, to: ContractAddress, value: Uint256) -> bool {
    let eth_contract = IERC20V0Dispatcher { contract_address: ETH_CONTRACT_ADDR };
    eth_contract.transfer(to, value)
}

3. 常见踩坑点

  • 忘记加#[abi(legacy_v0)]:这是跨版本调用的核心,没有这个标记,v2合约会用v2的ABI编码规则处理参数,导致和v0合约不兼容,调用失败。
  • 地址类型错误:必须使用ContractAddress类型传递接收方地址,不能直接用felt,否则会导致地址编码错误,合约无法识别。
  • 金额格式问题:确保传入的Uint256值正确,比如ETH的最小单位是wei,不要混淆单位导致金额错误。

内容的提问来源于stack exchange,提问作者antony tran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 01:52:21