# Broadcast Sign Transfer

> 支持 EVM 多链的原生代币和 ERC20 转账，自动构造交易、本地签名并通过 OKX API 广播上链

- Skill: `modbender/broadcast-sign-transfer` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add modbender/broadcast-sign-transfer`
- Raw SKILL.md: https://api.skillmd.com/api/skills/modbender/broadcast-sign-transfer/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Integrations & APIs
- License: MIT
- Author: modbender (https://skillmd.com/u/modbender)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/modbender/broadcast-sign-transfer

---


# Broadcast Sign Transfer Skill

## 什么是这个 Skill？

这个 Skill 实现了完整的 EVM 链转账流程：

```
用户输入（私钥/地址/金额）
    ↓
构造交易（自动获取 nonce、gas）
    ↓
本地签名（私钥不离开本机）
    ↓
通过 OKX API 广播到链上
    ↓
返回 tx_hash 和区块浏览器链接
```

支持两种转账类型：
- **原生代币转账**：ETH、BNB、MATIC 等
- **ERC20 Token 转账**：USDT、USDC 等任意 ERC20

---

## 什么时候该用这个 Skill？

满足以下条件时使用：
1. 用户想发起一笔链上转账
2. 用户提供了接收方地址和转账金额
3. 私钥已通过环境变量配置好

**不适用的情况：**
- 用户想做 Swap（代币兑换）→ 使用 Swap Skill
- 用户只想查询余额或交易状态 → 使用查询工具
- 用户没有配置私钥环境变量 → 先引导配置环境变量

---

## 执行流程（Step by Step）

```
Step 1: 检查输入参数
        ├── chain_index 是否在支持列表？
        ├── to_address 是否以 0x 开头？
        └── amount 是否大于 0？

Step 2: 获取链上数据
        ├── 获取当前 nonce
        └── 获取当前 gas price（Legacy 或 EIP-1559）

Step 3: 构造交易
        ├── 原生代币：直接构造 tx，gas 固定 21000
        └── ERC20：调用 transfer()，动态估算 gas × 1.2 安全系数

Step 4: 本地签名
        └── 使用私钥对交易签名，私钥不离开本机

Step 5: 广播到链上
        └── 调用 OKX Broadcast API 发送签名交易

Step 6: 返回结果
        ├── 成功 → 返回 tx_hash 和 explorer_url
        └── 失败 → 返回具体错误原因
```

---

## 输入参数

### chain_index（必填）
- **类型**：字符串 string
- **说明**：区块链链 ID
- **当前支持**：

  | chain_index | 链名 | Gas 类型 | 支持 MEV |
  |-------------|------|---------|---------|
  | `"56"` | BSC | Legacy | ✅ |

- **示例**：`"56"`
- **注意**：必须是字符串，`56` ❌ `"56"` ✅

---

### to_address（必填）
- **类型**：字符串 string
- **说明**：接收方钱包地址
- **格式**：0x 开头，42 位十六进制字符
- **示例**：`"0xaF3e6407073b2793271dA3d45A393397517ee3d9"`

---

### amount（必填）
- **类型**：浮点数 float
- **说明**：转账金额，人类可读单位
- **示例**：`0.01`（表示 0.01 BNB），`100.0`（表示 100 USDT）
- **注意**：脚本内部自动转换为链上精度（wei / raw units）

---

### token_address（ERC20 转账时必填）
- **类型**：字符串 string
- **说明**：ERC20 Token 的合约地址
- **格式**：0x 开头
- **示例**：`"0x55d398326f99059fF775485246999027B3197955"`（BSC 上的 USDT）

---

### enable_mev_protection（选填）
- **类型**：布尔值 boolean
- **默认值**：`false`
- **说明**：是否开启 MEV 保护，防止三明治攻击
- **注意**：仅支持 MEV 的链才能开启，否则报错

---

## 输出结果

### 成功时

| 字段 | 类型 | 说明 |
|------|------|------|
| order_id | string | OKX 平台订单 ID |
| tx_hash | string | 链上交易哈希 |
| explorer_url | string | 区块浏览器链接 |

**成功输出示例：**
```
✅ BSC 广播成功
Order ID: 1234567890
Tx Hash:  0xabc123...
浏览器:   https://bscscan.com/tx/0xabc123...
```

### 失败时

返回具体错误原因，见下方错误处理章节。

---

## 环境变量（必须配置）

| 变量名 | 说明 |
|--------|------|
| `WALLET_PRIVATE_KEY` | 钱包私钥（0x 开头） |
| `OKX_ACCESS_KEY` | OKX Web3 API Key |
| `OKX_SECRET_KEY` | OKX Secret Key |
| `OKX_PASSPHRASE` | OKX Passphrase |

> ⚠️ 必须使用 **OKX Web3 API Key**，普通交易 API Key 会返回 401 错误。

**配置方式（写入 ~/.zshrc 永久生效）：**
```bash
export WALLET_PRIVATE_KEY="0x你的私钥"
export OKX_ACCESS_KEY="你的Key"
export OKX_SECRET_KEY="你的Secret"
export OKX_PASSPHRASE="你的Passphrase"
```
```bash
source ~/.zshrc
```

---

## 调用示例

### 代码调用

```python
from scripts.broadcast_sign_transfer import BroadcastTransaction

bt = BroadcastTransaction(chain_index="56")

# 原生代币转账
result = bt.transfer_native(
    to_address="0xRecipient...",
    amount=0.01,
    enable_mev_protection=False,
)
print(result.summary())

# ERC20 转账
result = bt.transfer_token(
    token_address="0x55d398326f99059fF775485246999027B3197955",  # BSC USDT
    to_address="0xRecipient...",
    amount=100.0,
    enable_mev_protection=False,
)
print(result.summary())
```

### 命令行调用

```bash
# 原生代币转账
python3 scripts/broadcast_sign_transfer.py --chain 56 native \
  --to 0xRecipient... \
  --amount 0.01

# ERC20 转账
python3 scripts/broadcast_sign_transfer.py --chain 56 token \
  --token 0x55d398326f99059fF775485246999027B3197955 \
  --to 0xRecipient... \
  --amount 100

# 开启 MEV 保护
python3 scripts/broadcast_sign_transfer.py --chain 56 native \
  --to 0xRecipient... \
  --amount 0.01 \
  --mev
```

---

## Gas 处理机制

| 转账类型 | Gas 处理方式 |
|----------|-------------|
| 原生代币 | 固定 21000（EVM 协议层常量） |
| ERC20 Token | `eth_estimateGas` 动态估算 × 1.2 安全系数 |

Gas 价格根据链类型自动切换：
- **Legacy**（BSC）：使用 `gasPrice`
- **EIP-1559**（ETH/Polygon 等）：使用 `maxFeePerGas` + `maxPriorityFeePerGas`

---

## 错误处理

| 错误信息 | 原因 | 解决方法 |
|----------|------|----------|
| `暂不支持链 {chain_index}` | 链未在支持列表中 | 检查 chain_index 是否正确 |
| `to_address 格式错误` | 地址不以 0x 开头 | 检查地址格式 |
| `amount 必须大于 0` | 金额为负数或 0 | 输入正确金额 |
| `余额不足` | ERC20 余额不够 | 检查钱包余额 |
| `链 {chain_index} 不支持 MEV 保护` | 该链不支持 MEV | 关闭 enable_mev_protection |
| `401 Unauthorized` | 使用了普通 API Key | 确认使用 OKX Web3 API Key |
| `广播失败（code=xxx）` | OKX API 返回错误 | 检查 API 凭证和交易数据 |
| `缺少 OKX API 凭证` | 环境变量未配置 | 配置四个环境变量后重试 |
| `缺少钱包私钥` | WALLET_PRIVATE_KEY 未配置 | 配置私钥环境变量 |

---

## 安全注意事项

- ⚠️ 私钥通过环境变量传入，**不要硬编码在代码里**
- ⚠️ 广播成功不代表交易成功，需通过 `explorer_url` 确认链上状态
- ⚠️ 广播后的交易**无法撤销**，请在调用前确认地址和金额正确
- ⚠️ `~/.zshrc` 是明文存储，确保只有自己能访问该文件

---

## 依赖安装

```bash
pip3 install requests web3
```

---

## 文件结构

```
broadcast-sign-transfer/
├── broadcast_sign_transfer.md     ← 当前文件，AI 技能说明书
└── scripts/
    └── broadcast_sign_transfer.py ← 可执行的 Python 客户端
```

---

## 当前支持的链（v1.0.0）

| chain_index | 链名 | Gas 类型 | MEV 保护 | 浏览器 |
|-------------|------|---------|---------|--------|
| `56` | BSC | Legacy | ✅ | bscscan.com |

> v1.0.0 仅支持 BSC，更多链将在后续版本中陆续支持。
