Solidity
將合約“價格”與美元掛鉤?
我有一個“付費玩”的契約/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' ); } }