解决问题
在 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 金额。