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, 企业转账, 会计工作流, 区块链, 合约审计, 安全支付, 智能合约, 稳定币, 自动化支付, 自动化攻击, 角色管理, 财务自动化, 重复付款, 防错误地址