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

如何在Aptos智能合约单交易中批量转账未知类型及数量的代币

在Aptos中实现多代币批量转账(单交易完成)

原代码的问题

你写的代码报错核心原因是:Move是静态类型语言,vector<coin::Coin<T>>中的泛型T只能指代单一代币类型,无法容纳多种不同的Coin实例,而你需要处理未知数量的不同代币,所以这个参数设计不符合需求。

正确实现思路

要在一笔交易中发送多种未知代币,需要用**代币的类型信息(TypeInfo)**标识不同代币——每个coin::Coin<T>类型都对应唯一的TypeInfo,我们可以将多个代币的TypeInfo和对应数量作为参数传入,循环执行转账操作即可。

完整代码示例

module your_address::multi_token_transfer {
    use aptos_framework::coin;
    use std::type_info::TypeInfo;
    use std::vector;
    use std::signer;

    // 自定义错误码:参数向量长度不匹配
    const E_LENGTH_MISMATCH: u64 = 0x01;
    // 自定义错误码:代币类型无效
    const E_INVALID_TOKEN_TYPE: u64 = 0x02;
    // 自定义错误码:余额不足
    const E_INSUFFICIENT_BALANCE: u64 = 0x03;

    public entry fun multisend(
        sender: &signer,
        receiver: address,
        token_types: vector<TypeInfo>,
        amounts: vector<u64>
    ) {
        // 1. 检查代币类型列表和数量列表长度一致,避免索引越界
        assert!(vector::length(&token_types) == vector::length(&amounts), E_LENGTH_MISMATCH);

        let sender_addr = signer::address_of(sender);
        let mut i = 0;
        let total_tokens = vector::length(&token_types);

        while (i < total_tokens) {
            // 获取当前代币的TypeInfo和要转账的数量
            let type_info = *vector::borrow(&token_types, i);
            let amount = *vector::borrow(&amounts, i);

            // 2. 验证余额足够
            assert!(coin::balance<phantom CoinType>(sender_addr) >= amount, E_INSUFFICIENT_BALANCE);
            // 3. 验证传入的TypeInfo与当前泛型CoinType匹配
            assert!(type_info == type_info::<CoinType>, E_INVALID_TOKEN_TYPE);

            // 4. 执行转账
            coin::transfer<phantom CoinType>(sender, receiver, amount);

            i = i + 1;
        }
    }
}

代码说明

  • 参数设计:用vector<TypeInfo>存储所有要转账的代币类型,vector<u64>存储对应代币的转账数量,两者一一对应。
  • 长度校验:先确保两个向量长度一致,防止循环时出现索引不匹配的问题。
  • 动态转账:通过泛型phantom CoinType结合TypeInfo验证,实现对不同代币类型的转账操作——每次循环都会匹配对应代币的TypeInfo,执行对应的coin::transfer。
  • 错误处理:通过自定义错误码处理长度不匹配、无效代币类型、余额不足等常见异常。

使用注意事项

  1. 调用该函数时,需要为每个要转账的代币传入对应的TypeInfo,可通过前端工具或链上查询获取代币的TypeInfo。
  2. 确保sender账户拥有足够的对应代币余额,否则交易会失败。
  3. 该函数属于entry函数,可直接通过交易调用,所有转账操作会在同一笔交易中完成。

内容的提问来源于stack exchange,提问作者I am just dude

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 19:45:10