Solidity

將合約“價格”與美元掛鉤?

  • March 25, 2021

我有一個“付費玩”的契約/dapp。你發送 X 數量的 Eth,你就可以玩了。

我有一個通過 Chainlink 工作的價格資訊,但我想將 Eth 金額與美元掛鉤。

契約現在的樣子..

uint public price = 0.15 ether;

我想讓它更有活力。

uint public price = <$2.00 USD expressed as Eth>;

我不確定這是否可能,因為 Eth 的價格波動很大。一個 tx 可能會觸發,而在記憶體池中,Eth 的價格可能會上漲,一旦 tx 達到函式,它將被拒絕。

function play() external payable returns(bool) {
   require(
     msg.value == price,
     'Please send the correct amount of ETH'
   );

而是價格如此密切地跟隨 Eth 的波動,也許它可以每小時左右改變價格?

我的另一個想法是製作一個更改價格的功能,僅供契約作者使用。

function changePrice(uint memory price) external ownerAddressOnly() {
   this.price = price;
 }

我可以在選擇時手動更改價格,而無需重新部署新契約。

在 Solidity / Chainlink 中通常如何處理此類操作?

只需除以Chainklink 提要的價格。價格饋送是穩定的,當價格饋送更新時,您很少會收到拒絕。這樣,您可以將成本設置為$2 in terms of ETH.

假設 ETH 是 $ 600, and we want to set the price to $ 2 在 ETH。然後我們有這個:

$600/1 ETH = $2/X ETH

然後我們只做一些代數並得到這個:

$2/$600 = X ETH

這樣,您將獲得以美元計價的 ETH 的去中心化價格。然後,你的 UI 可以在那個時候總是發送正確數量的 ETH。

對於 Kovan,您的契約可能如下所示:

pragma solidity ^0.6.7;

import "@chainlink/contracts/src/v0.6/interfaces/AggregatorV3Interface.sol";

contract PayToPlay {
   uint256 public cost;

   AggregatorV3Interface internal priceFeed;

   /**
    * Network: Kovan
    * Aggregator: ETH/USD
    * Address: 0x9326BFA02ADD2366b30bacB125260Af641031331
    */
   constructor() public {
       priceFeed = AggregatorV3Interface(0x9326BFA02ADD2366b30bacB125260Af641031331);
   }

   function getLatestPrice() public view returns (int) {
       (
           uint80 roundID, 
           int price,
           uint startedAt,
           uint timeStamp,
           uint80 answeredInRound
       ) = priceFeed.latestRoundData();
       return price;// <== feed return is with 8 or 18 decimals to ensure conversion factor
   }

   function play() external payable returns(bool) {

       require(
         msg.value == cost / getLatestPrice(),
         'Please send the correct amount of ETH'
       );
   }
}

引用自:https://ethereum.stackexchange.com/questions/91507