90 lines
3.3 KiB
Plaintext
90 lines
3.3 KiB
Plaintext
///! DeFi中文标准测试
|
|
///! 测试DeFi模块的所有功能
|
|
|
|
使用 ../defi/defi;
|
|
|
|
合约 DeFi测试 {
|
|
私有 流动性池: 流动性池基础;
|
|
|
|
构造函数() {
|
|
让 代币A = 地址::从十六进制("0x1234567890123456789012345678901234567890");
|
|
让 代币B = 地址::从十六进制("0x2345678901234567890123456789012345678901");
|
|
流动性池 = 流动性池基础::新建(代币A, 代币B);
|
|
}
|
|
|
|
// 测试1: 添加流动性
|
|
函数 测试添加流动性() {
|
|
让 提供者 = 消息::发送者();
|
|
让 数量A = 1000 * (10 ** 18);
|
|
让 数量B = 2000 * (10 ** 18);
|
|
|
|
// 添加前
|
|
让 (储备A前, 储备B前) = 流动性池.获取储备();
|
|
要求(储备A前 == 0 && 储备B前 == 0, "初始储备应为0");
|
|
|
|
// 执行添加
|
|
流动性池.添加流动性(数量A, 数量B, 0, 0, 提供者, 区块::时间戳() + 3600);
|
|
|
|
// 添加后
|
|
让 (储备A后, 储备B后) = 流动性池.获取储备();
|
|
要求(储备A后 == 数量A, "储备A错误");
|
|
要求(储备B后 == 数量B, "储备B错误");
|
|
要求(流动性池.LP余额(提供者) > 0, "LP代币余额应大于0");
|
|
}
|
|
|
|
// 测试2: 移除流动性
|
|
函数 测试移除流动性() {
|
|
让 提供者 = 消息::发送者();
|
|
|
|
// 先添加流动性
|
|
流动性池.添加流动性(1000 * (10 ** 18), 2000 * (10 ** 18), 0, 0, 提供者, 区块::时间戳() + 3600);
|
|
|
|
// 移除前
|
|
让 LP余额前 = 流动性池.LP余额(提供者);
|
|
让 (储备A前, 储备B前) = 流动性池.获取储备();
|
|
|
|
// 执行移除(移除一半)
|
|
让 移除数量 = LP余额前 / 2;
|
|
流动性池.移除流动性(移除数量, 0, 0, 提供者, 区块::时间戳() + 3600);
|
|
|
|
// 移除后
|
|
让 LP余额后 = 流动性池.LP余额(提供者);
|
|
让 (储备A后, 储备B后) = 流动性池.获取储备();
|
|
|
|
要求(LP余额后 < LP余额前, "LP余额应减少");
|
|
要求(储备A后 < 储备A前, "储备A应减少");
|
|
要求(储备B后 < 储备B前, "储备B应减少");
|
|
}
|
|
|
|
// 测试3: 兑换代币
|
|
函数 测试兑换() {
|
|
让 交易者 = 消息::发送者();
|
|
|
|
// 先添加流动性
|
|
流动性池.添加流动性(1000 * (10 ** 18), 2000 * (10 ** 18), 0, 0, 交易者, 区块::时间戳() + 3600);
|
|
|
|
// 兑换前
|
|
让 (储备A前, 储备B前) = 流动性池.获取储备();
|
|
让 输入数量 = 100 * (10 ** 18);
|
|
|
|
// 计算输出数量
|
|
让 输出数量 = 流动性池.获取输出数量(输入数量, 储备A前, 储备B前);
|
|
要求(输出数量 > 0, "输出数量应大于0");
|
|
|
|
// 执行兑换
|
|
流动性池.兑换(输入数量, 0, 交易者, 区块::时间戳() + 3600);
|
|
|
|
// 兑换后
|
|
让 (储备A后, 储备B后) = 流动性池.获取储备();
|
|
要求(储备A后 > 储备A前, "储备A应增加");
|
|
要求(储备B后 < 储备B前, "储备B应减少");
|
|
}
|
|
|
|
// 运行所有测试
|
|
函数 运行所有测试() {
|
|
测试添加流动性();
|
|
测试移除流动性();
|
|
测试兑换();
|
|
}
|
|
}
|