jpdnft/corporate-safe-transfer-arc
GitHub: jpdnft/corporate-safe-transfer-arc
基于 Arc 区块链的企业级 USDC 定期转账智能合约和 dApp 参考实现,通过预授权地址和结构化支付记录降低转账风险。
Stars: 0 | Forks: 0
# Arc 上的企业安全转账
一个面向 Arc 的企业级安全 USDC 转账工作流的公开参考实现和概念验证。
该演示展示了一家公司如何使用兼容 EVM 的智能合约来使定期企业稳定币转账更安全、更可审计,并且更不容易出现付款地址错误。
## 业务用例
XYZ 公司设有一个美国财务团队和一个海外子公司。公司定期向子公司发送 USDC。授权所有者只需配置一次批准的付款人和收款人,而无需让会计人员每次手动粘贴收款人钱包地址。
之后:
- 美国会计师 Ralph 只能从经批准的付款人钱包向合约注入资金。
- Ralph 在付款时无需输入 Rita 的收款人地址。
- 悉尼会计师 Rita 只能从经批准的收款人钱包提取资金。
- 每笔转账都会单独记录金额、备注、参考编号、时间戳和提取状态。
这减少了一种常见的操作故障模式:合法的财务用户因剪贴板错误、过时的指示、钓鱼攻击或手动路由错误而将资金发送到错误地址。
## 为什么选择 Arc
Arc 是一条兼容 EVM 的 Layer 1 区块链。可以使用标准的 Solidity、Hardhat、OpenZeppelin、Ethers.js 和钱包工具来实现此概念验证。
Arc 特有的业务框架对企业工作流尤其有用,因为 USDC 是 Arc 上的原生 Gas 代币。用户无需持有独立的波动性资产(如 ETH)来支付交易费用。
USDC 作为 Gas 的重要性:
- 财务和会计用户的入门更简单。
- 需要获取、托管和对账的财资资产更少。
- 成本核算更直观,因为运营资产和 Gas 资产都是 USDC。
- 对于常规运营支付,减少了波动性 Gas 代币余额的风险。
## 角色
Mary - CFO / 所有者 / 部署者
- 部署合约。
- 拥有合约。
- 设置或更新授权的付款人钱包。
- 设置或更新授权的收款人钱包。
Ralph - 美国会计师 / 付款人
- 连接钱包。
- 授权 USDC 花费。
- 仅当他的钱包与授权的付款人地址匹配时,才将 USDC 存入合约。
- 创建包含金额、备注和内部参考编号的支付记录。
- 从不手动输入收款人钱包地址。
Rita - 悉尼会计师 / 收款人
- 连接钱包。
- 查看可用和已完成的转账。
- 仅当她的钱包与授权的收款人地址匹配时,才提取可用的 USDC 转账。
## 仓库结构
```
contracts/CorporateSafeTransfer.sol Solidity reference contract
contracts/test/MockUSDC.sol Local mock token with 6 decimals
scripts/deploy.ts Hardhat deployment script
test/CorporateSafeTransfer.ts Smart contract tests
src/app/ Next.js dApp
src/contracts/ Frontend ABI definitions
src/lib/config.ts Frontend environment config
```
## 合约摘要
`CorporateSafeTransfer` 存储:
- owner
- payer
- recipient
- USDC 代币地址
- transfer counter
- 转账 ID 到转账记录的映射
每笔转账包含:
```
struct Transfer {
uint256 id;
uint256 amount;
string memo;
string internalReference;
address fundedBy;
bool withdrawn;
uint256 createdAt;
uint256 withdrawnAt;
}
```
产品语言在 UI 和文档中一致使用“reference”。在 Solidity 中,结构体字段命名为 `internalReference`,因为 `reference` 被编译器保留。
所有者功能:
- `setPayer(address newPayer)`
- `setRecipient(address newRecipient)`
- `getConfig()`
- `recoverUntrackedUSDC(address to, uint256 amount)`
救援功能只能恢复未分配给待处理转账记录的 USDC。这涵盖了意外直接向合约地址发送 ERC-20 转账的情况,同时不允许所有者提取分配给 Rita 可用转账的资金。
付款人功能:
- `deposit(uint256 amount, string calldata memo, string calldata internalReference)`
收款人功能:
- `withdraw(uint256 transferId)`
读取功能:
- `getTransfer(uint256 transferId)`
- `getTransferCount()`
- `getAvailableTransfers()`
- `getCompletedTransfers()`
从实际前端考虑,可用和已完成转账的读取返回转账 ID 数组。dApp 随后通过 ID 获取每条转账记录。
## dApp 面板
管理面板 - Mary
- 显示已连接钱包、合约所有者、当前付款人、当前收款人和 USDC 代币地址。
- 允许所有者设置付款人和收款人地址。
- 当已连接钱包不是所有者时,禁用所有者操作。
支付面板 - Ralph
- 显示已连接钱包、付款人授权状态、收款人地址、USDC 余额和 USDC 授权额度。
- 允许付款人授权 USDC 花费。
- 允许付款人存入 USDC,并填写金额、备注和内部参考编号。
- 不包含任何收款人地址输入框。
收款面板 - Rita
- 显示已连接钱包和收款人授权状态。
- 列出可用转账和已完成转账。
- 允许收款人提取可用转账。
## 本地搭建
安装依赖:
```
npm install
```
复制环境模板:
```
cp .env.example .env
```
在 Windows PowerShell 中:
```
Copy-Item .env.example .env
```
## 环境变量
Hardhat 部署:
```
PRIVATE_KEY=
ARC_RPC_URL=
ARC_CHAIN_ID=
USDC_CONTRACT_ADDRESS=
PAYER_ADDRESS=
RECIPIENT_ADDRESS=
ARCSCAN_API_KEY=
ARCSCAN_API_URL=
ARCSCAN_BROWSER_URL=
```
前端:
```
NEXT_PUBLIC_CONTRACT_ADDRESS=
NEXT_PUBLIC_USDC_ADDRESS=
NEXT_PUBLIC_ARC_CHAIN_ID=
```
注意:
- 部署脚本使用 `USDC_CONTRACT_ADDRESS`。
- Arc 演示部署脚本使用 `PAYER_ADDRESS` 和 `RECIPIENT_ADDRESS`。
- `ARCSCAN_API_KEY`、`ARCSCAN_API_URL` 和 `ARCSCAN_BROWSER_URL` 是可选的验证设置。默认指向 Arc 测试网 Arcscan。
- `NEXT_PUBLIC_CONTRACT_ADDRESS` 是已部署的 `CorporateSafeTransfer` 合约。
- `NEXT_PUBLIC_USDC_ADDRESS` 应与部署合约使用的 USDC 代币一致。
- 由于公共 Arc 测试网详情可能变化,`ARC_CHAIN_ID` 和 `NEXT_PUBLIC_ARC_CHAIN_ID` 保留可配置。
## 编译
```
npm run compile
```
## 运行测试
```
npm test
```
智能合约测试覆盖:
- 部署者成为 owner
- owner 可以设置 payer
- owner 可以设置 recipient
- 非 owner 不能设置 payer 或 recipient
- 只有 payer 可以存款
- 未授权时存款失败
- 存款创建转账记录
- 只有 recipient 可以提款
- 转账不能重复提取
- 合约内仍有资金时 owner 可以更新 payer 和 recipient
- 被替换后的前 payer 无法再存款
- 被替换后的前 recipient 无法再提款
## 本地部署
启动本地 Hardhat 节点:
```
npx hardhat node
```
在另一个中,部署一个模拟 USDC 代币,或者将 `USDC_CONTRACT_ADDRESS` 设置为已有的本地代币地址,然后运行:
```
npm run deploy:local
```
为了更丰富的本地演示,部署 `MockUSDC`,向 Ralph 铸造代币,并将部署的模拟代币地址用作 `USDC_CONTRACT_ADDRESS`。
## Arc 测试网部署
设置:
```
PRIVATE_KEY=
ARC_RPC_URL=https://rpc.testnet.arc.network
ARC_CHAIN_ID=5042002
USDC_CONTRACT_ADDRESS=0x3600000000000000000000000000000000000000
PAYER_ADDRESS=
RECIPIENT_ADDRESS=
```
`PRIVATE_KEY` 应为 Mary 的部署者钱包。`PAYER_ADDRESS` 应为 Ralph 的钱包,`RECIPIENT_ADDRESS` 应为 Rita 的钱包。
Mary 需要 Arc 测试网 USDC 用于部署 Gas 和角色配置交易。Ralph 需要 Arc 测试网 USDC 用于存款和 Gas。Rita 需要 Arc 测试网 USDC 用于提款 Gas。
一步部署并配置角色:
```
npm run deploy:arc:demo
```
脚本会打印部署的合约地址和前端环境变量。
在 Arcscan 上验证合约源码:
```
npx hardhat verify --network arc 0x3600000000000000000000000000000000000000
```
Arcscan 基于 Blockscout。如果自动 Hardhat 验证不可用或暂时不稳定,请使用 Arcscan 合约验证 UI 并传递相同的构造参数。
## 前端使用
设置:
```
NEXT_PUBLIC_CONTRACT_ADDRESS=
NEXT_PUBLIC_USDC_ADDRESS=
NEXT_PUBLIC_ARC_CHAIN_ID=
```
启动应用:
```
npm run dev
```
打开终端中显示的本地 Next.js URL,通常为:
```
http://localhost:3000
```
操作步骤:
1. Mary 连接所有者钱包,将 Ralph 设为付款人,Rita 设为收款人。
2. Ralph 连接付款人钱包,授权 USDC 花费,并存入带备注和内部参考编号的 USDC。
3. Rita 连接收款人钱包,查看可用转账,并提取资金。
## 安全限制
本仓库是一个概念验证,并非生产就绪的金融软件。
重要限制:
- 单所有者管理。
- 无多签要求。
- 无合规或制裁筛查。
- 无交易限额。
- 无取消或退款流程。
- 无紧急暂停。
- 无升级策略。
- 无索引会计导出管道。
- 无前端域名或钱包风险保护。
- 无合约审计。
- 救援功能的范围有意设窄,且仍依赖受信任的所有者。
## 生产环境考虑
生产版本应考虑:
- 使用多签所有权而非单个所有者钱包
- 更强的访问控制和角色管理
- 合约审计
- 合规筛查
- 制裁筛查
- 交易限额
- 取消和退款逻辑
- 紧急暂停
- 更丰富的会计导出
- 更好的事件索引
- 酌情进行形式化验证
- 安全的密钥管理
- 前端防钓鱼保护
- 监控与告警
## 免责声明
本软件仅用于教育和演示目的。不构成财务、法律、税务、会计、合规或安全建议。
请自行承担使用风险。未经独立工程审查、法律审查、合规审查和专业智能合约审计,请勿使用此概念验证来托管或转移生产资金。
标签:Arc区块链, EVM, Gas代币, Hardhat, OpenZeppelin, Solidity, USDC, 企业转账, 会计工作流, 区块链, 合约审计, 安全支付, 智能合约, 稳定币, 自动化支付, 自动化攻击, 角色管理, 财务自动化, 重复付款, 防错误地址