首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从硬件主干网叉修改Kyber池中的ETH价格?

如何从硬件主干网叉修改Kyber池中的ETH价格?
EN

Ethereum用户
提问于 2022-03-12 22:27:17
回答 1查看 115关注 0票数 0

我正在编写一个安全帽测试,我用KyberSwap的主网叉在ETH上交换DAI,目的是改变Eth在池中的价格。交易是成功的,因为测试钱包收到DAI在最后,但不幸的是,ETH在池中的价格没有变化。

从我的测试结果来看:

代码语言:javascript
复制
Initial ETH price was:  2567000000000000000000
ETH price after was:  2567000000000000000000

考虑到在编写本报告时池中只有0.3 ETH,ETH应该足以改变价格。我甚至试着交换900 ETH,但还是没有改变。为什么ETH对Kyber的价格不受影响?

这是我的测试:

代码语言:javascript
复制
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的稳固契约:

代码语言:javascript
复制
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挂钩。

代码语言:javascript
复制
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池?

EN

回答 1

Ethereum用户

回答已采纳

发布于 2022-03-26 18:33:38

经过一些阅读,我很确定这是不可能的,因为KyberSwap被设计成一个多DEX聚合器。从他们的医生那里

KyberSwap交易通过不同的DEX进行最优分割和路由,在同一链/网络中以最佳价格进行交易。

除非我错过了一些文档中的内容,否则关闭多个DEX交易不是一种选择,因此我认为我无法通过执行掉期来修改KyberSwap令牌价格。

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/123689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档