我有一个合同,必须通过chainlink节省eth的时间和价格。时间工作,没有问题。另一方面,价格既不能用数组记录,也不能用映射记录。我尝试了几种解决方案,其中包括push()
。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.6;
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
interface EACAggregatorProxy {
function latestAnswer() external view returns (int256);
}
contract oracleLink {
uint256 deadline;
uint256 startTime = startTimes[block.timestamp];
mapping(uint => uint) startTimes;
address public chainLinkETHUSDAddress = 0x9326BFA02ADD2366b30bacB125260Af641031331;
uint public ethPrice = 0;
uint256 price = ethPrice;
mapping(uint => uint) ethPrice;
function priceOnTime() public payable {
deadline = block.timestamp + (numberOfSeconds * 1 seconds);
int256 chainLinkEthPrice = EACAggregatorProxy(chainLinkETHUSDAddress).latestAnswer();
ethPrice = uint(chainLinkEthPrice / 100000000);
return ethPrice;
}
}
源代码中硬编码的chainLinkETHUSDAddress地址仅包含Kovan测试网上的合约。也就是说,这段代码只在这个测试网络或它的分支上工作,在其他网络上失败。
如果你想在Remix中使用返回值,你需要创建Kovan测试网的一个本地分支,然后使用Remix中的环境选择框连接到这个本地网络。
您的代码没有正确使用映射。I映射就像一个数组,只是在某些方面更有效,但也有一些限制。
所以要使用你的映射你需要使用
ethPrice[x] = y;
其中x和y都是int(如您指定的映射)。使用uint)。因此,每个唯一的单元映射(引用)到另一个单元。
ethPrice[x] = uint(chainLinkEthPrice/100000000);
其中x是一个int,稍后使用。
查找值。您错误地存储了映射。映射必须存储为variable[key]=value
。
https://www.tutorialspoint.com/solidity/solidity_mappings.htm