跳到内容

Web3 Transfer Starter

受众:开发者 摘要:EVM 原生交易签名 / 广播 / 批量转账 / 多钱包资金归集,写交易统一使用 preview / sign-only / broadcast 执行模式。

何时使用

场景建议
单笔签名 + 广播 / 仅签名Web3.signAndBroadcast(...) / signOnly(...)
批量转账(顺序 nonce、失败跳过)Web3.bulkTransfer(...)
多钱包资金归集(计划 / 可选广播)Web3.consolidate(...)
支付转账事件匹配(结算 / 审计 / 补偿)Web3PaymentTransferMatcher

交易签名与广播

Web3 starter 已提供 EVM 原生交易签名、广播和“签名后立即广播”入口。私钥只在本次请求内参与签名,框架不会持久化、打印或写入日志:

java
Web3SignedTransaction signed = Web3.signTransaction(Web3TransactionRequest.builder()
        .chainName("bsc")
        .privateKey("...")
        .fromAddress("0x...")
        .toAddress("0x...")
        .value(BigInteger.valueOf(1000000000000000L))
        .build());

Web3BroadcastResult broadcast = Web3.broadcastTransaction("bsc", signed.getRawTransaction());

noncegasPricegasLimitchainId 都可以显式传入;未传时会按链配置和 RPC 兜底。普通原生转账默认 gasLimit=21000,带 data 的交易会在缺省时尝试预估 Gas。

批量转账和资金归集

批量转账适合一个付款钱包向多个地址转账。写交易统一使用 executionMode 控制执行方式:

模式说明
preview默认模式,只生成计划,不签名、不广播;适合大额、多钱包、首次配置和人工审核前预览
sign-only签名但不广播,返回 rawTransaction;适合人工复核或离线广播
broadcast签名并立即广播到链上;适合小额、低风险和系统自动执行场景
java
Web3BatchTransferResult result = Web3.batchTransfer(Web3BatchTransferRequest.builder()
        .chainName("bsc")
        .privateKey("...")
        .fromAddress("0x...")
        .executionMode("broadcast")
        .transfers(List.of(
                Web3BatchTransferItem.builder()
                        .toAddress("0x...")
                        .value(BigInteger.valueOf(1000000000000000L))
                        .build()))
        .build());

资金归集适合多个钱包向统一收款地址归集原生代币。未指定单钱包金额时,会按余额扣除 Gas 和预留金额后尽量归集。默认 preview 可以只用钱包地址计算计划;sign-only / broadcast 需要提供私钥:

java
Web3FundCollectionResult result = Web3.collectFunds(Web3FundCollectionRequest.builder()
        .chainName("bsc")
        .receiverAddress("0x...")
        .executionMode("sign-only")
        .reserveAmount(BigInteger.valueOf(1000000000000000L))
        .wallets(List.of(Web3FundCollectionWallet.builder()
                .privateKey("...")
                .fromAddress("0x...")
                .build()))
        .build());

为了兼容已有调用,旧字段 broadcast=true 会被识别为 executionMode=broadcast;新代码建议直接使用 executionMode,语义更清楚。

当前 Web3 开发期统一使用 JDK 17 做主验证。依赖升级时必须确认第三方字节码不高于 Java 17。

Web3 支付转账事件匹配

Web3 starter 提供 Web3PaymentTransferMatcher,用于把已解码的 ERC-20 Transfer 事件和支付期望做只读匹配:

java
Web3PaymentTransferExpectation expectation = Web3PaymentTransferExpectation.builder()
        .chainName("bsc")
        .transactionHash("0x...")
        .receiverAddress("0x...")
        .tokenContract("0x...")
        .amountRaw(Web3TokenAmounts.toRaw(new BigDecimal("1.23"), 18))
        .build();

Web3PaymentTransferMatchResult result =
        Web3PaymentTransferMatcher.match(expectation, transfer);

相关

Released under the Apache License 2.0.