解决问题
在 Solidity 中,编写一个库(library
),并将其附加到 uint256
类型上,以便在合约中方便地调用。以下是一个 PriceConverter.sol
库的示例,它将 ETH/USD 价格转换功能附加到 uint256
类型上。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
// 导入 Chainlink 的 AggregatorV3Interface 接口
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
// PriceConverter 库
library PriceConverter {
// Chainlink 价格喂价合约地址(ETH/USD)
AggregatorV3Interface internal priceFeed;
// 初始化价格喂价合约地址
function initializePriceFeed(address _priceFeedAddress) internal {
priceFeed = AggregatorV3Interface(_priceFeedAddress);
}
// 获取最新的 ETH/USD 价格
function getLatestPrice() internal view returns (int256) {
(
uint80 roundID,
int256 price,
uint256 startedAt,
uint256 updatedAt,
uint80 answeredInRound
) = priceFeed.latestRoundData();
// 返回 ETH/USD 价格
return price;
}
// 将 ETH 金额转换为 USD 金额
function getConversionRate(uint256 ethAmount) internal view returns (uint256) {
// 获取最新的 ETH/USD 价格
int256 ethPrice = getLatestPrice();
require(ethPrice > 0, "Invalid price");
// 获取价格的小数位数
uint8 decimals = priceFeed.decimals();
// 计算 USD 金额
uint256 ethAmountInUsd = (uint256(ethPrice) * ethAmount) / (10 ** uint256(decimals));
return ethAmountInUsd;
}
}
代码说明
-
getLatestPrice
函数:- 调用 Chainlink 的
latestRoundData
函数,获取最新的 ETH/USD 价格。
- 调用 Chainlink 的
-
getConversionRate
函数:-
将传入的
ethAmount
(以 wei 为单位)转换为 USD 金额。 -
计算公式:
USD = (ETH 价格 * ETH 数量) / (10^decimals)
。
-
-
库的附加:
- 该库可以附加到
uint256
类型上,方便在合约中直接调用。
- 该库可以附加到
在合约中使用 PriceConverter
库
以下是一个示例合约,展示如何使用 PriceConverter
库:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
// 导入 PriceConverter 库
import "./PriceConverter.sol";
contract EthToUsdConverter {
using PriceConverter for uint256;
// 初始化价格喂价合约地址
constructor(address _priceFeedAddress) {
PriceConverter.initializePriceFeed(_priceFeedAddress);
}
// 将 ETH 金额转换为 USD 金额
function convertEthToUsd(uint256 ethAmount) public view returns (uint256) {
// 调用 PriceConverter 库的 getConversionRate 函数
return ethAmount.getConversionRate();
}
}
代码说明
-
using PriceConverter for uint256
:将PriceConverter
库附加到uint256
类型上。这样可以直接在uint256
类型的变量上调用库中的函数。 -
convertEthToUsd
函数 :调用ethAmount.getConversionRate()
,将 ETH 金额转换为 USD 金额。