Share Dialog
Share Dialog
Subscribe to Untitled
Subscribe to Untitled
本次操作都在Rinkeby测试网络完成,所以先把metamask切换到以太坊的Rinkeby测试网。
然后进入https://faucets.chain.link/连接你的钱包,点击发送请求获取测试以太坊和链接代币。
获取测试代币结束后,通过连接链接https ://v的钱包,点击订阅链接链接你家乡的,需要/来加油费。
订阅成功,回到主页vrf.link/自己的号,以后可以关注这个ID号,可以在主页看到。
然后点击 ID 号,添加资金添加一些链接来点击给每个人需要的然后链接,然后点击一些链接,链接。链接都点击进入这个确认来确认。
进入https://remix.ethereum.org/新建工作区名称随意
然后把Contracts和Test文件夹里的文件全部删除
然后在合同下面新建文件,注意为牛&最好的(也可以是其他人),不一样的和最好的代码,然后在新建文件,在下面
// SPDX 许可证:GPL-3.0
编译指示^0.8.4;
导入“@openzeppelin/contracts/token/ERC721/ERC721.sol”;
导入“@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol”;
导入“@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol”;
导入“@openzeppelin/contracts/access/Ownable.sol”;
导入“@openzeppelin/contracts/utils/Counters.sol”;
导入“@openzeppelin/contracts/utils/Strings.sol”;
// Chainlink 导入
导入“@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol”;
//这个导入包括来自 ./KeeperBase.sol 和
// ./interfaces/KeeperCompatibleInterface.sol
导入“@chainlink/contracts/src/v0.8/KeeperCompatible.sol”;
导入“@chainlink/contracts/src/v0.8/interfaces/VRFCoordinatorV2Interface.sol”;
导入“@chainlink/contracts/src/v0.8/VRFConsumerBaseV2.sol”;
// 开发导入。这仅适用于本地开发网络
// 并且不会在测试或主要的 livenets 上工作。
导入“安全帽/console.sol”;
合约 BullBear 是 ERC721, ERC721Enumerable, ERC721URIStorage, Ownable, VRFConsumerBaseV2, KeeperCompatibleInterface {
使用 Counters.Counter 的波动率;
Counters.Counter 私有_tokenIdCounter;
uint 公共区间;
uint public lastTimeStamp;
聚合器V3接口公开价格Feed;
int256公共当前价格;
// 动态 nft 图形/元数据的 IPFS URI。
// 注意:这些连接到我的 IPFS Companion 节点。
// 您应该将 /ipfs 文件夹的内容上传到您自己的节点进行开发。
字符串 [] 公牛UrisIpfs = [
“https://ipfs.io/ipfs/QmRXyfi3oNZCubDxiVFre3kLZ8XeGt6pQsnAQRZ7akhSNs?filename=gamer_bull.json”,
"https://ipfs.io/ipfs/QmRJVFeMrtYS2CUVUM2cHJpBV5aX2xurpnsfZxLTTQbiD3?filename=party_bull.json",
“https://ipfs.io/ipfs/QmdcURmN1kEEtKgnbkVJJ8hrmsSWHpZvLkRgsKKoiWvW9g?filename=simple_bull.json”
];
字符串[] 熊UrisIpfs = [
"https://ipfs.io/ipfs/Qmdx9Hx7FCDZGExyjLR6vYcnutUR8KhBZBnZfAPHiUommN?filename=beanie_bear.json",
"https://ipfs.io/ipfs/QmTVLyTSuiKGUEmb88BgXG3qNC8YgpHZiFbjHrXKH3QHEu?filename=coolio_bear.json",
“https://ipfs.io/ipfs/QmbKhBXVWmwrYsTPFYfroR2N7NAekAMxHUVg2CWks7i9qj?filename=simple_bear.json”
];
// 随机的
VRFCoordinatorV2接口协调器;
// 您的订阅 ID。
uint64 s_subscriptionId;
// Goerli 协调器。对于其他网络,
// 见 https://docs.chain.link/docs/vrf-contracts/#configurations
地址 vrfCoordinator = 0x6168499c0cFfCaCD319c818142124B7A15E857ab;
// 要使用的 gas lane,它指定要达到的最高 gas 价格。
// 对于每个网络上可用的气体通道列表,
// 见 https://docs.chain.link/docs/vrf-contracts/#configurations
bytes32 keyHash = 0xd89b2bf150e3b9e13446986e571fb9cab24b13cea0a43ea20a6049a85cc807cc;
// 取决于要发送到的请求值的数量
// 完成RandomWords() 函数。存储每个单词大约需要 20,000 gas,
// 所以 100,000 是这个示例合约的安全默认值。测试和调整
// 此限制基于您选择的网络、请求的大小、
// 以及fulfillRandomWords()中回调请求的处理
// 功能。
uint32 回调GasLimit = 100000;
// 默认值为 3,但您可以将其设置得更高。
uint16 requestConfirmations = 3;
// 对于本例,在一个请求中检索 2 个随机值。
// 不能超过 VRCoordinatorV2.MAX_NUM_WORDS。
uint32 numWords = 2;
uint256[] 公共 s_randomWords;
uint256 公共 s_requestId;
事件 TokensUpdated(字符串市场趋势);
构造函数(uint updateInterval,地址 _priceFeed,uint64 subscriptionId)ERC721(“Bull&Bear”,“BBTK”)VRFConsumerBaseV2(vrfCoordinator){
间隔 = 更新间隔;
lastTimeStamp = block.timestamp;
// https://rinkeby.etherscan.io/address/0xECe365B379E1dD183B20fc5f022230C044d51404
priceFeed = AggregatorV3Interface(_priceFeed);
currentPrice = getLatestPrice();
协调员 = VRFCoordinatorV2Interface(vrfCoordinator);
s_subscriptionId = 订阅 ID;
}
功能safeMint(地址)公共{
// 当前计数器值将是铸造代币的代币 ID。
uint256 tokenId = _tokenIdCounter.current();
// 增加它,以便下次调用 .current() 时它是正确的
_tokenIdCounter.increment();
// 铸造代币
_safeMint(to, tokenId);
// 默认为牛市 NFT
字符串内存 defaultUri = BullUrisIpfs[s_randomWords[0]%3];
_setTokenURI(tokenId, defaultUri);
控制台日志(
“完成!!!铸造代币”,
令牌ID,
" 并分配令牌 url: ",
默认Uri
);
}
函数 checkUpkeep(bytes calldata) 外部视图覆盖返回 (bool upkeepNeeded, bytes memory /*performData*/){
upkeepNeeded = (block.timestamp - lastTimeStamp) > 间隔;
}
函数 performUpkeep(bytes calldata) 外部覆盖{
if((block.timestamp - lastTimeStamp) > 间隔){
lastTimeStamp = block.timestamp;
int latestPrice = getLatestPrice();
如果(最新价格 == 当前价格){
返回;
}否则如果(最新价格<当前价格){
updateAllTokenUris("熊");
}别的{
updateAllTokenUris("公牛");
}
当前价格 = 最新价格;
}
}
函数 getLatestPrice() 公共视图返回(int256){
(,
国际价格,
,
,) = priceFeed.latestRoundData();
退货价格;
}
函数 updateAllTokenUris(字符串内存趋势) internal{
如果(比较字符串(“熊”,趋势)){
for(uint i=0; i< _tokenIdCounter.current(); i++){
_setTokenURI(i,bearUrisIpfs[s_randomWords[0]%3]);
}
}别的 {
for(uint i=0; i< _tokenIdCounter.current(); i++){
_setTokenURI(i,bullUrisIpfs[s_randomWords[0]%3]);
}
}
发出 TokensUpdated(趋势);
}
函数 setInterval(uint256 newInterval) public onlyOwner{
间隔 = 新间隔;
}
函数 setPriceFeed(address newFeed) public onlyOwner{
priceFeed = AggregatorV3Interface(newFeed);
}
function compareStrings(string memory a, string memory b) 内部纯返回 (bool){
返回 keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b));
}
// 以下函数是 Solidity 需要的重写。
函数_beforeTokenTransfer(
地址来自,
写给,
uint256 令牌ID
)内部覆盖(ERC721,ERC721Enumerable){
super._beforeTokenTransfer(from, to, tokenId);
}
函数 _burn(uint256 tokenId)
内部的
覆盖(ERC721,ERC721URIStorage)
{
super._burn(tokenId);
}
函数 tokenURI(uint256 tokenId)
上市
查看
覆盖(ERC721,ERC721URIStorage)
返回(字符串内存)
{
返回 super.tokenURI(tokenId);
}
函数支持接口(bytes4 interfaceId)
上市
查看
覆盖(ERC721,ERC721Enumerable)
返回(布尔值)
{
返回 super.supportsInterface(interfaceId);
}
// 假冒订阅多余的内容。
函数 requestRandomWords() 外部 onlyOwner {
// 如果订阅未设置和资助,将恢复。
s_requestId = COORDINATOR.requestRandomWords(
哈希,哈希
s_subscriptionId,
请求确认,
对GasLimit,
numWords
);
}
功能完成词(
uint256, /* requestId */
uint256[] 临时词
) 内部覆盖 {
s_randomWords = 任意词;
}
}
然后点击编译,编译完成之后会有一个警告,可以触发
部署的参数 ENVIRONMENT 选择 Metamask,说选择你 Metamask 里面有测试以太坊我们的账号,Contract 选择写的 Bull&Bear 合约
部署的参数UPDATEINTERVAL 10,_PRICEFEED为申请链接测试BTCxECe366自己的源地址地址机0 0 0C044d51404(合约https: //的/docs/ethereum-addresses/),SUBSCRIPD为你号。
部署成功以后,复制你的合同地址。
然后是第一个部分的https://vr.chain.link.link/rinkeby/,你总是把合同地址添加到链接地址的机子添加订阅中,如果不这样,通过链接节点机获取的方法执行失败。
然后我们点击请求获取当前数据,然后等Metamask交易完成。因为获取然后的会比较长,所以交易成功的时间以后也需要等2分钟。
然后我们点击它的_random Words后面把输入0(0是因为我们每天的第一个连接点获取2个数字,我们当时取了一个数据),调用了,我们把这个出现的好,等下一次先收集记录这个每天的数据。
然后我们的重复操作,点击请求重新获取实时数据。
等交易成功等2分钟左右,我们在s_randomwords可以继续输入0,已经再次数据了。 数字会更新的速度比较慢一点,着急待话再过来看。
然后我们在safemint里面的ETH地址,给自己的mint一个NFT。
等NFT mint成功,以后我们在tokenURI这样输入0,点击call,来获取我们mint的NFT的元数据信息。
json,filename=simple_bull.json 这三个中的一个。
然后在设置PriceFeed里输入慢鸡方法因为以太坊价格的操作方法,通过测试版更新以太坊的方法变成了原来的。
这是更新的,以后我们看到最新的价格,可以看到后面不是最新的以太坊点击价格,前位的价格,后面没有八位小数字,因为以太坊当时中国当地的还触发更新一次。(因为测试网btc价格1天更新,eth1小时更新)
然后我们在维护的参数中输入“执行[]”,调用价格,手动来更新触发方法,这一步也获得了我们的 NFT 元数据。
然后你再点击获取Token I为0的NFT的元数据,就可以看到元数据会变成这三个中的一个。
另外几个地址链接机BNB合于0xcf0f51ca2cDAecb464eeE4227f5295F2384F84ED,可以用这几个本地机的合同试价,NFT的动态。
填表地址https://alchemyapi.typeform.com/roadtoweekfive
重新填写表最后一个可以重新开始你的合同的部署地址https://rinkeby.etherscan.io/address/你的合同
有兴趣的可以自己去https://testnets.opensea.io/看自己mint的nft,刷新几下元数据看看
本次操作都在Rinkeby测试网络完成,所以先把metamask切换到以太坊的Rinkeby测试网。
然后进入https://faucets.chain.link/连接你的钱包,点击发送请求获取测试以太坊和链接代币。
获取测试代币结束后,通过连接链接https ://v的钱包,点击订阅链接链接你家乡的,需要/来加油费。
订阅成功,回到主页vrf.link/自己的号,以后可以关注这个ID号,可以在主页看到。
然后点击 ID 号,添加资金添加一些链接来点击给每个人需要的然后链接,然后点击一些链接,链接。链接都点击进入这个确认来确认。
进入https://remix.ethereum.org/新建工作区名称随意
然后把Contracts和Test文件夹里的文件全部删除
然后在合同下面新建文件,注意为牛&最好的(也可以是其他人),不一样的和最好的代码,然后在新建文件,在下面
// SPDX 许可证:GPL-3.0
编译指示^0.8.4;
导入“@openzeppelin/contracts/token/ERC721/ERC721.sol”;
导入“@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol”;
导入“@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol”;
导入“@openzeppelin/contracts/access/Ownable.sol”;
导入“@openzeppelin/contracts/utils/Counters.sol”;
导入“@openzeppelin/contracts/utils/Strings.sol”;
// Chainlink 导入
导入“@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol”;
//这个导入包括来自 ./KeeperBase.sol 和
// ./interfaces/KeeperCompatibleInterface.sol
导入“@chainlink/contracts/src/v0.8/KeeperCompatible.sol”;
导入“@chainlink/contracts/src/v0.8/interfaces/VRFCoordinatorV2Interface.sol”;
导入“@chainlink/contracts/src/v0.8/VRFConsumerBaseV2.sol”;
// 开发导入。这仅适用于本地开发网络
// 并且不会在测试或主要的 livenets 上工作。
导入“安全帽/console.sol”;
合约 BullBear 是 ERC721, ERC721Enumerable, ERC721URIStorage, Ownable, VRFConsumerBaseV2, KeeperCompatibleInterface {
使用 Counters.Counter 的波动率;
Counters.Counter 私有_tokenIdCounter;
uint 公共区间;
uint public lastTimeStamp;
聚合器V3接口公开价格Feed;
int256公共当前价格;
// 动态 nft 图形/元数据的 IPFS URI。
// 注意:这些连接到我的 IPFS Companion 节点。
// 您应该将 /ipfs 文件夹的内容上传到您自己的节点进行开发。
字符串 [] 公牛UrisIpfs = [
“https://ipfs.io/ipfs/QmRXyfi3oNZCubDxiVFre3kLZ8XeGt6pQsnAQRZ7akhSNs?filename=gamer_bull.json”,
"https://ipfs.io/ipfs/QmRJVFeMrtYS2CUVUM2cHJpBV5aX2xurpnsfZxLTTQbiD3?filename=party_bull.json",
“https://ipfs.io/ipfs/QmdcURmN1kEEtKgnbkVJJ8hrmsSWHpZvLkRgsKKoiWvW9g?filename=simple_bull.json”
];
字符串[] 熊UrisIpfs = [
"https://ipfs.io/ipfs/Qmdx9Hx7FCDZGExyjLR6vYcnutUR8KhBZBnZfAPHiUommN?filename=beanie_bear.json",
"https://ipfs.io/ipfs/QmTVLyTSuiKGUEmb88BgXG3qNC8YgpHZiFbjHrXKH3QHEu?filename=coolio_bear.json",
“https://ipfs.io/ipfs/QmbKhBXVWmwrYsTPFYfroR2N7NAekAMxHUVg2CWks7i9qj?filename=simple_bear.json”
];
// 随机的
VRFCoordinatorV2接口协调器;
// 您的订阅 ID。
uint64 s_subscriptionId;
// Goerli 协调器。对于其他网络,
// 见 https://docs.chain.link/docs/vrf-contracts/#configurations
地址 vrfCoordinator = 0x6168499c0cFfCaCD319c818142124B7A15E857ab;
// 要使用的 gas lane,它指定要达到的最高 gas 价格。
// 对于每个网络上可用的气体通道列表,
// 见 https://docs.chain.link/docs/vrf-contracts/#configurations
bytes32 keyHash = 0xd89b2bf150e3b9e13446986e571fb9cab24b13cea0a43ea20a6049a85cc807cc;
// 取决于要发送到的请求值的数量
// 完成RandomWords() 函数。存储每个单词大约需要 20,000 gas,
// 所以 100,000 是这个示例合约的安全默认值。测试和调整
// 此限制基于您选择的网络、请求的大小、
// 以及fulfillRandomWords()中回调请求的处理
// 功能。
uint32 回调GasLimit = 100000;
// 默认值为 3,但您可以将其设置得更高。
uint16 requestConfirmations = 3;
// 对于本例,在一个请求中检索 2 个随机值。
// 不能超过 VRCoordinatorV2.MAX_NUM_WORDS。
uint32 numWords = 2;
uint256[] 公共 s_randomWords;
uint256 公共 s_requestId;
事件 TokensUpdated(字符串市场趋势);
构造函数(uint updateInterval,地址 _priceFeed,uint64 subscriptionId)ERC721(“Bull&Bear”,“BBTK”)VRFConsumerBaseV2(vrfCoordinator){
间隔 = 更新间隔;
lastTimeStamp = block.timestamp;
// https://rinkeby.etherscan.io/address/0xECe365B379E1dD183B20fc5f022230C044d51404
priceFeed = AggregatorV3Interface(_priceFeed);
currentPrice = getLatestPrice();
协调员 = VRFCoordinatorV2Interface(vrfCoordinator);
s_subscriptionId = 订阅 ID;
}
功能safeMint(地址)公共{
// 当前计数器值将是铸造代币的代币 ID。
uint256 tokenId = _tokenIdCounter.current();
// 增加它,以便下次调用 .current() 时它是正确的
_tokenIdCounter.increment();
// 铸造代币
_safeMint(to, tokenId);
// 默认为牛市 NFT
字符串内存 defaultUri = BullUrisIpfs[s_randomWords[0]%3];
_setTokenURI(tokenId, defaultUri);
控制台日志(
“完成!!!铸造代币”,
令牌ID,
" 并分配令牌 url: ",
默认Uri
);
}
函数 checkUpkeep(bytes calldata) 外部视图覆盖返回 (bool upkeepNeeded, bytes memory /*performData*/){
upkeepNeeded = (block.timestamp - lastTimeStamp) > 间隔;
}
函数 performUpkeep(bytes calldata) 外部覆盖{
if((block.timestamp - lastTimeStamp) > 间隔){
lastTimeStamp = block.timestamp;
int latestPrice = getLatestPrice();
如果(最新价格 == 当前价格){
返回;
}否则如果(最新价格<当前价格){
updateAllTokenUris("熊");
}别的{
updateAllTokenUris("公牛");
}
当前价格 = 最新价格;
}
}
函数 getLatestPrice() 公共视图返回(int256){
(,
国际价格,
,
,) = priceFeed.latestRoundData();
退货价格;
}
函数 updateAllTokenUris(字符串内存趋势) internal{
如果(比较字符串(“熊”,趋势)){
for(uint i=0; i< _tokenIdCounter.current(); i++){
_setTokenURI(i,bearUrisIpfs[s_randomWords[0]%3]);
}
}别的 {
for(uint i=0; i< _tokenIdCounter.current(); i++){
_setTokenURI(i,bullUrisIpfs[s_randomWords[0]%3]);
}
}
发出 TokensUpdated(趋势);
}
函数 setInterval(uint256 newInterval) public onlyOwner{
间隔 = 新间隔;
}
函数 setPriceFeed(address newFeed) public onlyOwner{
priceFeed = AggregatorV3Interface(newFeed);
}
function compareStrings(string memory a, string memory b) 内部纯返回 (bool){
返回 keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b));
}
// 以下函数是 Solidity 需要的重写。
函数_beforeTokenTransfer(
地址来自,
写给,
uint256 令牌ID
)内部覆盖(ERC721,ERC721Enumerable){
super._beforeTokenTransfer(from, to, tokenId);
}
函数 _burn(uint256 tokenId)
内部的
覆盖(ERC721,ERC721URIStorage)
{
super._burn(tokenId);
}
函数 tokenURI(uint256 tokenId)
上市
查看
覆盖(ERC721,ERC721URIStorage)
返回(字符串内存)
{
返回 super.tokenURI(tokenId);
}
函数支持接口(bytes4 interfaceId)
上市
查看
覆盖(ERC721,ERC721Enumerable)
返回(布尔值)
{
返回 super.supportsInterface(interfaceId);
}
// 假冒订阅多余的内容。
函数 requestRandomWords() 外部 onlyOwner {
// 如果订阅未设置和资助,将恢复。
s_requestId = COORDINATOR.requestRandomWords(
哈希,哈希
s_subscriptionId,
请求确认,
对GasLimit,
numWords
);
}
功能完成词(
uint256, /* requestId */
uint256[] 临时词
) 内部覆盖 {
s_randomWords = 任意词;
}
}
然后点击编译,编译完成之后会有一个警告,可以触发
部署的参数 ENVIRONMENT 选择 Metamask,说选择你 Metamask 里面有测试以太坊我们的账号,Contract 选择写的 Bull&Bear 合约
部署的参数UPDATEINTERVAL 10,_PRICEFEED为申请链接测试BTCxECe366自己的源地址地址机0 0 0C044d51404(合约https: //的/docs/ethereum-addresses/),SUBSCRIPD为你号。
部署成功以后,复制你的合同地址。
然后是第一个部分的https://vr.chain.link.link/rinkeby/,你总是把合同地址添加到链接地址的机子添加订阅中,如果不这样,通过链接节点机获取的方法执行失败。
然后我们点击请求获取当前数据,然后等Metamask交易完成。因为获取然后的会比较长,所以交易成功的时间以后也需要等2分钟。
然后我们点击它的_random Words后面把输入0(0是因为我们每天的第一个连接点获取2个数字,我们当时取了一个数据),调用了,我们把这个出现的好,等下一次先收集记录这个每天的数据。
然后我们的重复操作,点击请求重新获取实时数据。
等交易成功等2分钟左右,我们在s_randomwords可以继续输入0,已经再次数据了。 数字会更新的速度比较慢一点,着急待话再过来看。
然后我们在safemint里面的ETH地址,给自己的mint一个NFT。
等NFT mint成功,以后我们在tokenURI这样输入0,点击call,来获取我们mint的NFT的元数据信息。
json,filename=simple_bull.json 这三个中的一个。
然后在设置PriceFeed里输入慢鸡方法因为以太坊价格的操作方法,通过测试版更新以太坊的方法变成了原来的。
这是更新的,以后我们看到最新的价格,可以看到后面不是最新的以太坊点击价格,前位的价格,后面没有八位小数字,因为以太坊当时中国当地的还触发更新一次。(因为测试网btc价格1天更新,eth1小时更新)
然后我们在维护的参数中输入“执行[]”,调用价格,手动来更新触发方法,这一步也获得了我们的 NFT 元数据。
然后你再点击获取Token I为0的NFT的元数据,就可以看到元数据会变成这三个中的一个。
另外几个地址链接机BNB合于0xcf0f51ca2cDAecb464eeE4227f5295F2384F84ED,可以用这几个本地机的合同试价,NFT的动态。
填表地址https://alchemyapi.typeform.com/roadtoweekfive
重新填写表最后一个可以重新开始你的合同的部署地址https://rinkeby.etherscan.io/address/你的合同
有兴趣的可以自己去https://testnets.opensea.io/看自己mint的nft,刷新几下元数据看看
<100 subscribers
<100 subscribers
No activity yet