Is there is any other oracles other than provable or oraclize to communicate with external api via smart contract.

  • 1
    Yes, you have ChainLink for example.
    – Ismael
    Commented Jun 22, 2020 at 16:33

1 Answer 1

  1. Chainlink
  2. Tellor
  3. Bandchain

Please note, you can get started with a single centralized way to pull data from an API, but for your contract to be decentralized you'd want to pull data from multiple sources via multiple nodes.

You can, for example, pull data from a single Chainlink node just to start developing, however for a production grade system you'd want to pull data from a network of nodes.

Here is a complete example of pulling data from a single chainlink node. This job returns a Uint256. For different data types to return, look at the chainlink adapters.

To call the requestEthereumPrice funciton, you have to pick an oracle and a job. You could use the following linkpool oracle/job.

address ORACLE = 0x83F00b902cbf06E316C95F51cbEeD9D2572a349a;

string constant JOB = "c179a8180e034cf5a341488406c32827";

pragma solidity ^0.4.24;

import "@chainlink/contracts/src/v0.4/ChainlinkClient.sol";

// MyContract inherits the ChainlinkClient contract to gain the
// functionality of creating Chainlink requests
contract ChainlinkExample is ChainlinkClient {
  // Stores the answer from the Chainlink oracle
  uint256 public currentPrice;
  address public owner;

  constructor() public {
    // Set the address for the LINK token for the network
    owner = msg.sender;

  // Creates a Chainlink request with the uint256 multiplier job
  function requestEthereumPrice(address _oracle, bytes32 _jobId, uint256 _payment) 
    // newRequest takes a JobID, a callback address, and callback function as input
    Chainlink.Request memory req = buildChainlinkRequest(_jobId, address(this), this.fulfill.selector);
    // Adds a URL with the key "get" to the request parameters
    req.add("get", "https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD");
    // Uses input param (dot-delimited string) as the "path" in the request parameters
    req.add("path", "USD");
    // Adds an integer with the key "times" to the request parameters
    req.addInt("times", 100);
    // Sends the request with the amount of payment specified to the oracle
    sendChainlinkRequestTo(_oracle, req, _payment);

  // fulfill receives a uint256 data type
  function fulfill(bytes32 _requestId, uint256 _price)
    // Use recordChainlinkFulfillment to ensure only the requesting oracle can fulfill
    currentPrice = _price;
  // cancelRequest allows the owner to cancel an unfulfilled request
  function cancelRequest(
    bytes32 _requestId,
    uint256 _payment,
    bytes4 _callbackFunctionId,
    uint256 _expiration
    cancelChainlinkRequest(_requestId, _payment, _callbackFunctionId, _expiration);

  // withdrawLink allows the owner to withdraw any extra LINK on the contract
  function withdrawLink()
    LinkTokenInterface link = LinkTokenInterface(chainlinkTokenAddress());
    require(link.transfer(msg.sender, link.balanceOf(address(this))), "Unable to transfer");
  modifier onlyOwner() {
    require(msg.sender == owner);

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.