Created
January 4, 2023 20:32
-
-
Save fhofman/c73db9a33e69896ee08e14c1c8ab5430 to your computer and use it in GitHub Desktop.
Clientes de chainlink
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.8.7; | |
import "@chainlink/contracts/src/v0.8/ChainlinkClient.sol"; | |
import "@chainlink/contracts/src/v0.8/ConfirmedOwner.sol"; | |
/** | |
* Request testnet LINK and ETH here: https://faucets.chain.link/ | |
* Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: https://docs.chain.link/docs/link-token-contracts/ | |
*/ | |
/** | |
* THIS IS AN EXAMPLE CONTRACT WHICH USES HARDCODED VALUES FOR CLARITY. | |
* THIS EXAMPLE USES UN-AUDITED CODE. | |
* DO NOT USE THIS CODE IN PRODUCTION. | |
*/ | |
contract APIConsumer is ChainlinkClient, ConfirmedOwner { | |
using Chainlink for Chainlink.Request; | |
uint256 public volume; | |
bytes32 private jobId; | |
uint256 private fee; | |
event RequestVolume(bytes32 indexed requestId, uint256 volume); | |
/** | |
* @notice Initialize the link token and target oracle | |
* | |
* Goerli Testnet details: | |
* Link Token: 0x326C977E6efc84E512bB9C30f76E30c160eD06FB | |
* Oracle: 0xCC79157eb46F5624204f47AB42b3906cAA40eaB7 (Chainlink DevRel) | |
* jobId: ca98366cc7314957b8c012c72f05aeeb | |
* | |
*/ | |
constructor() ConfirmedOwner(msg.sender) { | |
setChainlinkToken(0x326C977E6efc84E512bB9C30f76E30c160eD06FB); | |
setChainlinkOracle(0x17899bA594F1bdf789c29ce145158A8Be642b9dD); | |
jobId = "0af96e06d099426ca6c5484b40b47396"; | |
fee = (1 * LINK_DIVISIBILITY) / 10; // 0,1 * 10**18 (Varies by network and job) | |
} | |
/** | |
* Create a Chainlink request to retrieve API response, find the target | |
* data, then multiply by 1000000000000000000 (to remove decimal places from data). | |
*/ | |
function requestVolumeData() public returns (bytes32 requestId) { | |
Chainlink.Request memory req = buildChainlinkRequest( | |
jobId, | |
address(this), | |
this.fulfill.selector | |
); | |
// Set the URL to perform the GET request on | |
req.add( | |
"get", | |
"https://min-api.cryptocompare.com/data/pricemultifull?fsyms=ETH&tsyms=USD" | |
); | |
// Set the path to find the desired data in the API response, where the response format is: | |
// {"RAW": | |
// {"ETH": | |
// {"USD": | |
// { | |
// "VOLUME24HOUR": xxx.xxx, | |
// } | |
// } | |
// } | |
// } | |
// request.add("path", "RAW.ETH.USD.VOLUME24HOUR"); // Chainlink nodes prior to 1.0.0 support this format | |
req.add("path", "RAW,ETH,USD,VOLUME24HOUR"); // Chainlink nodes 1.0.0 and later support this format | |
// Multiply the result by 1000000000000000000 to remove decimals | |
int256 timesAmount = 10 ** 18; | |
req.addInt("times", timesAmount); | |
// Sends the request | |
return sendChainlinkRequest(req, fee); | |
} | |
/** | |
* Receive the response in the form of uint256 | |
*/ | |
function fulfill( | |
bytes32 _requestId, | |
uint256 _volume | |
) public recordChainlinkFulfillment(_requestId) { | |
emit RequestVolume(_requestId, _volume); | |
volume = _volume; | |
} | |
/** | |
* Allow withdraw of Link tokens from the contract | |
*/ | |
function withdrawLink() public onlyOwner { | |
LinkTokenInterface link = LinkTokenInterface(chainlinkTokenAddress()); | |
require( | |
link.transfer(msg.sender, link.balanceOf(address(this))), | |
"Unable to transfer" | |
); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.8.7; | |
import "@chainlink/contracts/src/v0.8/ChainlinkClient.sol"; | |
import "@chainlink/contracts/src/v0.8/ConfirmedOwner.sol"; | |
/** | |
* THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. | |
* DO NOT USE THIS CODE IN PRODUCTION. | |
*/ | |
contract ATestnetConsumer is ChainlinkClient, ConfirmedOwner { | |
using Chainlink for Chainlink.Request; | |
uint256 private constant ORACLE_PAYMENT = (1 * LINK_DIVISIBILITY) / 10; // 0.1 * 10**18 | |
uint256 public currentPrice; | |
event RequestEthereumPriceFulfilled( | |
bytes32 indexed requestId, | |
uint256 indexed price | |
); | |
/** | |
* Goerli | |
*@dev LINK address in Goerli network: 0x326C977E6efc84E512bB9C30f76E30c160eD06FB | |
* @dev Check https://docs.chain.link/docs/link-token-contracts/ for LINK address for the right network | |
*/ | |
constructor() ConfirmedOwner(msg.sender) { | |
setChainlinkToken(0x326C977E6efc84E512bB9C30f76E30c160eD06FB); | |
} | |
function requestEthereumPrice( | |
address _oracle, | |
string memory _jobId | |
) public onlyOwner { | |
Chainlink.Request memory req = buildChainlinkRequest( | |
stringToBytes32(_jobId), | |
address(this), | |
this.fulfillEthereumPrice.selector | |
); | |
req.add( | |
"get", | |
"https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD" | |
); | |
req.add("path", "USD"); | |
req.addInt("times", 100); | |
sendChainlinkRequestTo(_oracle, req, ORACLE_PAYMENT); | |
} | |
function fulfillEthereumPrice( | |
bytes32 _requestId, | |
uint256 _price | |
) public recordChainlinkFulfillment(_requestId) { | |
emit RequestEthereumPriceFulfilled(_requestId, _price); | |
currentPrice = _price; | |
} | |
function getChainlinkToken() public view returns (address) { | |
return chainlinkTokenAddress(); | |
} | |
function withdrawLink() public onlyOwner { | |
LinkTokenInterface link = LinkTokenInterface(chainlinkTokenAddress()); | |
require( | |
link.transfer(msg.sender, link.balanceOf(address(this))), | |
"Unable to transfer" | |
); | |
} | |
function cancelRequest( | |
bytes32 _requestId, | |
uint256 _payment, | |
bytes4 _callbackFunctionId, | |
uint256 _expiration | |
) public onlyOwner { | |
cancelChainlinkRequest( | |
_requestId, | |
_payment, | |
_callbackFunctionId, | |
_expiration | |
); | |
} | |
function stringToBytes32( | |
string memory source | |
) private pure returns (bytes32 result) { | |
bytes memory tempEmptyStringTest = bytes(source); | |
if (tempEmptyStringTest.length == 0) { | |
return 0x0; | |
} | |
assembly { | |
// solhint-disable-line no-inline-assembly | |
result := mload(add(source, 32)) | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment