我正在编写一个安全帽测试,我用KyberSwap的主网叉在ETH上交换DAI,目的是改变Eth在池中的价格。交易是成功的,因为测试钱包收到DAI在最后,但不幸的是,ETH在池中的价格没有变化。
从我的测试结果来看:
Initial ETH price was: 2567000000000000000000
ETH price after was: 2567000000000000000000考虑到在编写本报告时池中只有0.3 ETH,ETH应该足以改变价格。我甚至试着交换900 ETH,但还是没有改变。为什么ETH对Kyber的价格不受影响?
这是我的测试:
require('dotenv').config()
const { assert } = require("chai");
const { ethers } = require("hardhat");
// Contains ABi for balanceOf() method
const ERC20ABI = [{ "constant": true, "inputs": [{ "name": "_owner", "type": "address" }], "name": "balanceOf", "outputs": [{ "name": "balance", "type": "uint256" }], "payable": false, "stateMutability": "view", "type": "function" }]
// Contains ABI for Kyber's getExpectedRate() method
const kyberNetworkProxyABI = [{ "constant": true, "inputs": [{ "name": "src", "type": "address" }, { "name": "dest", "type": "address" }, { "name": "srcQty", "type": "uint256" }], "name": "getExpectedRate", "outputs": [{ "name": "expectedRate", "type": "uint256" }, { "name": "slippageRate", "type": "uint256" }], "payable": false, "stateMutability": "view", "type": "function" }]
const KYBER_NETWORK_PROXY_ADDRESS = "0x818E6FECD516Ecc3849DAf6845e3EC868087B755";
const KYBER_ETH_ADDRESS = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
const DAI_ADDRESS = "0x6b175474e89094c44da98b954eedeac495271d0f";
describe("kyber-eth-price-test", function () {
it("Test that eth price is altered", async function () {
const provider = ethers.provider;
const [owner, addr1] = await ethers.getSigners();
signer = await provider.getSigner(process.env.ETH_PUBLIC_KEY)
// Get DAI contract
const DAI = new ethers.Contract(DAI_ADDRESS, ERC20ABI, provider);
// Get kyberNetworkProxy contract
let kyberNetworkProxy = new ethers.Contract(
KYBER_NETWORK_PROXY_ADDRESS,
kyberNetworkProxyABI,
signer,
);
// Deploy KyberTradeExample contract
const kyberTradeExample =
await ethers.getContractFactory("KyberTradeExample")
.then(contract => contract.deploy(
KYBER_NETWORK_PROXY_ADDRESS,
DAI_ADDRESS
));
await kyberTradeExample.deployed();
// Assert addr1 DAI balance is initially 0
addr1Dai = await DAI.balanceOf(addr1.address);
assert(addr1Dai.isZero());
// Get initial price from pegged block
let ethPriceInitial
const updateEthPrice = async () => {
const results = await kyberNetworkProxy.getExpectedRate(
KYBER_ETH_ADDRESS,
DAI_ADDRESS,
1 // 1 ETH
)
ethPriceInitial = results.expectedRate
}
await updateEthPrice()
console.log("Initial ETH price was: ", ethPriceInitial.toString());
// Swap 1 ETH for DAI
await kyberTradeExample.connect(addr1).swapEthForDaiOnKyber(
{ value: ethers.utils.parseEther("999") }
);
// Assert DAI balance increased
addr1Dai = await DAI.balanceOf(addr1.address);
assert(addr1Dai.gt(ethers.BigNumber.from("0")));
// Get Eth price after
let ethPriceAfter
const updateEthPrice2 = async () => {
const results = await kyberNetworkProxy.getExpectedRate(
KYBER_ETH_ADDRESS,
DAI_ADDRESS,
1 // 1 ETH
)
ethPriceAfter = results.expectedRate
}
await updateEthPrice2()
console.log("ETH price after was: ", ethPriceAfter.toString());
// Assert that Eth price has been altered
assert.isFalse(ethPriceInitial.eq(ethPriceAfter), "Eth price did not change");
});
});这里是我用来从KyberSwap用ETH交换DAI的稳固契约:
pragma solidity ^0.5.0;
import { KyberNetworkProxy as IKyberNetworkProxy } from '@studydefi/money-legos/kyber/contracts/KyberNetworkProxy.sol';
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
contract KyberTradeExample {
IKyberNetworkProxy kyber;
IERC20 dai;
address constant KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
constructor(
address kyberAddress,
address daiAddress
) public {
kyber = IKyberNetworkProxy(kyberAddress);
dai = IERC20(daiAddress);
}
function swapEthForDaiOnKyber() external payable {
(, uint minRate) = kyber.getExpectedRate(
IERC20(KYBER_ETH_ADDRESS),
dai,
msg.value
);
// will send back tokens to this contract's address
uint destAmount = kyber.swapEtherToToken.value(msg.value)(
dai,
minRate
);
// send received tokens back to caller
require(dai.transfer(msg.sender, destAmount));
}
function() external payable {}
}在我的hardhat.config.js中,我使用炼金术创建了一个分叉,并将其与块#14368910挂钩。
module.exports = {
solidity: "0.5.0",
networks: {
hardhat: {
forking: {
url: process.env.ALCHEMY_URL,
blockNumber: 14368910
}
}
}
};我现在相当肯定这是因为Kyber正在通过多个DEX进行交易,如果我用直接使用Kyber池的KNC来交换ETH,我的测试将成功地改变ETH的价格。
因此,我现在的问题是:我是否可以要求Kyber避免使用多个交换,并直接使用Kyber的ETH/DAI池?
发布于 2022-03-26 18:33:38
经过一些阅读,我很确定这是不可能的,因为KyberSwap被设计成一个多DEX聚合器。从他们的医生那里:
KyberSwap交易通过不同的DEX进行最优分割和路由,在同一链/网络中以最佳价格进行交易。
除非我错过了一些文档中的内容,否则关闭多个DEX交易不是一种选择,因此我认为我无法通过执行掉期来修改KyberSwap令牌价格。
https://ethereum.stackexchange.com/questions/123689
复制相似问题