Solidity

使用chainlink ETHUSD 價格進行價格轉換

  • January 17, 2022

我將產品的美元價值儲存在契約中。 mapping (string => uint256) productUSD;

例如,如果它是 52 美元,我會將其儲存為productUSD[_product] = 52;

現在,當人們用 ETH 付款時,我想確保他們發送正確的轉換金額。

IE0.013 ETH

ChainlinkgetThePrice()返回最新ETH/USD價格,發現它是這樣返回的。price = 348365740274

   function getThePrice() public view returns (int) {
       (
           uint80 roundID, 
           int price,
           uint startedAt,
           uint timeStamp,
           uint80 answeredInRound
       ) = priceFeed.latestRoundData();
       return price;
   }

簡單的數學運算,我可以去掉 8 位小數3483657402743483用來獲得轉換後的 ETH 金額

IE52 / 3483 = 0.0149296583405111 ETH

  1. 我如何計算這個堅固性?不知道如何從348365740274
  2. 如何驗證使用者是否發送了正確的 eth 金額?IErequire(msg.value >= ...)

就 chainlink 價格饋送而言,ETH 對(USD/ETH、AAVE/ETH、UNI/ETH 等)有 18 位小數,而非 ETH 對(ETH/USD 等)有 8 位小數。來源

solidity 整數除法會自動向 0 舍入。(文件參考),因此您可以price/10**8對錶示 8 位小數的被除數進行舍入整數。

當 ETH 與 USD 相比時,要驗證交易發送的價值大於某個門檻值,您可以將 USD 中的最低要求值除以每 ETH 的美元,例如:

int min_required = 50; // minimum required in USD
int _price = getThePrice() / 10 ** 8; // price of 1 ether in USD

require(msg.value >= min_required / _price, "NOT ENOUGH ETHER");

您可以省略使用變數來節省氣體並直接使用值,這只是為了更清楚地解釋。

如果您使用低於 0.8.x 的 Solidity 編譯器版本,則使用 SafeMath 處理整數溢出和下溢

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