使用合约实现了传统中心化交易所,订单簿模式交易所
由于原来的代码版本比较老 solidity 0.4.9
,hardhat
不支持,所以将合约及测试文件升级到了 solidity 0.8.0
(老版本升级真的太多坑了……)。
原来的代码在 ./backup
yarn install
yarn build
或
npx hardhat compile
yarn test
或
npx hardhat test
EtherDelta 实现了简单的 token 合约,类似 ERC20 标准合约,用于交易所内的 token 交易(非 eth)
内部维护一张用户 vip 等级列表,管理员可以设置用户的 vip 等级。
交易所核心合约
用户交易用的资产必须先存入 (deposit()
) 交易所合约,交易完成后,可以提现 (withdraw()
) 到自己的钱包,基本和中心化交易所流程相同。
- 卖家挂单
order()
,以挂单信息转换为 hash,作为键,存入orders
合约变量 - 买家吃单
trade()
,传入指定的挂单 hash
constructor(
address admin_, // 创建者
address feeAccount_, // 手续费受益人
address accountLevelsAddr_, // AccountLevelsTest 合约地址
uint256 feeMake_, // 买入手续费率
uint256 feeTake_, // 卖出手续费率
uint256 feeRebate_ // vip佣金回扣费率
)
...
mapping(address => mapping(address => uint256)) public tokens; // token 用户持有每种token数量的列表 (0地址 代表 Ether)
mapping(address => mapping(bytes32 => bool)) public orders; // 挂单列表 (true = 用户提交的挂单, 需要验证离线签名)
mapping(address => mapping(bytes32 => uint256)) public orderFills; // 每一笔挂单完成的数量 (amount of order that has been filled)
目前只实现了核心功能的测试,还有部分测试流程未升级,老测试文件参见 ./backup/test.old.js
老版测试文件部分测试有误,建议以当前测试文件为准
EtherDelta github 仓库: https://github.com/etherdelta/smart_contract