NEW

The Chainlink Hackathon kicks off April 28th! Register today to compete for $450K+ in prizes.

Testnet Oracles

The Chainlink Developer Relations team maintains several testnet oracles that you can use to test your implementation quickly.

Operator Contracts

Testnet Operator contracts are deployed and maintained on the following networks:

| Testnet | Oracle Address | | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------- | | Ethereum Sepolia | 0x6090149792dAAeE9D1D568c9f9a6F6B46AA29eFD | | Ethereum Goerli | 0xCC79157eb46F5624204f47AB42b3906cAA40eaB7 | | Avalanche Fuji | 0x022EEA14A6010167ca026B32576D6686dD7e85d2 | | Polygon Mumbai | 0x40193c8518BB267228Fc409a613bDbD8eC5a97b3 | | Binance Testnet | 0xCC79157eb46F5624204f47AB42b3906cAA40eaB7 | | Fantom Testnet | 0xCC79157eb46F5624204f47AB42b3906cAA40eaB7 | | Klaytn Testnet | 0xfC3BdAbD8a6A73B40010350E2a61716a21c87610 |

Jobs

Job IDs

To make testing simple, jobs are configured with the following properties:

  • Each request on testnets costs 0.1 LINK.
  • Each oracle will wait for 1 confirmation before processing a request.
  • Jobs have the same IDs accross testnets.
  • Parameters are required. See examples for code snippets.

| Purpose | Tasks | Job ID | Required Parameters | | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | | GET>bytes:
HTTP GET to any public API
parse the response
return arbitrary-length raw byte data bytes.
The job specs can be found here | Http
JsonParse
Ethabiencode | 7da2702f37fd48e5b1b9a5715e3509b6 |

| | GET>uint256:
HTTP GET to any public API
parse the reponse
multiply the result by a multiplier
return an unsigned integer uint256 .
The job specs can be found here | Http
JsonParse
Multiply
Ethabiencode | ca98366cc7314957b8c012c72f05aeeb | | | GET>int256:
HTTP GET to any public API
parse the response
multiply the result by a multiplier
return a signed integer int256.
The job specs can be found here | Http
JsonParse
Multiply
Ethabiencode | fcf4140d696d44b687012232948bdd5d | | | GET>bool:
HTTP GET to any public API
parse the response
return a boolean bool.
The job specs can be found here | Http
JsonParse
Ethabiencode | c1c5e92880894eb6b27d3cae19670aa3 | | | GET>string:
HTTP GET to any public API
parse the response
return a sequence of characters string.
The job specs can be found here | Http
JsonParse
Ethabiencode | 7d80a6386ef543a3abb52817f6707e3b | |

Examples

Get > bytes

A full example can be found here.

Request method
function request() public {
  Chainlink.Request memory req = buildChainlinkRequest('7da2702f37fd48e5b1b9a5715e3509b6', address(this), this.fulfill.selector);
  req.add(
      'get',
      'https://ipfs.io/ipfs/QmZgsvrA1o1C8BGCrx6mHTqR1Ui1XqbCrtbMVrRLHtuPVD?filename=big-api-response.json'
  );
  req.add('path', 'image');
  sendChainlinkRequest(req, (1 * LINK_DIVISIBILITY) / 10); // 0,1*10**18 LINK
}
Callback method
bytes public data;
string public imageUrl;
function fulfill(bytes32 requestId, bytes memory bytesData) public recordChainlinkFulfillment(requestId) {
    data = bytesData;
    imageUrl = string(data);
}

Get > uint256

A full example can be found here.

Request method
function request() public {
  Chainlink.Request memory req = buildChainlinkRequest('ca98366cc7314957b8c012c72f05aeeb', address(this), this.fulfill.selector);
  req.add(
      'get',
      'https://min-api.cryptocompare.com/data/pricemultifull?fsyms=ETH&tsyms=USD'
  );
  req.add('path', 'RAW,ETH,USD,VOLUME24HOUR');
  req.addInt('times', 10**18); // Multiply by times value to remove decimals. Parameter required so pass '1' if the number returned doesn't have decimals
  sendChainlinkRequest(req, (1 * LINK_DIVISIBILITY) / 10); // 0,1*10**18 LINK
}
Callback method
uint256 public volume;
function fulfill(bytes32 _requestId, uint256 _volume) public recordChainlinkFulfillment(_requestId) {
  volume = _volume;
}

Get > int256

Request method
function request() public {
  Chainlink.Request memory req = buildChainlinkRequest('fcf4140d696d44b687012232948bdd5d', address(this), this.fulfill.selector);
  req.add(
      'get',
      'https://min-api.cryptocompare.com/data/pricemultifull?fsyms=ETH&tsyms=USD'
  );
  req.add('path', 'RAW,ETH,USD,VOLUME24HOUR');
  req.addInt('times', 10**18); // Multiply by times value to remove decimals. Parameter required so pass '1' if the number returned doesn't have decimals
  sendChainlinkRequest(req, (1 * LINK_DIVISIBILITY) / 10); // 0,1*10**18 LINK
}
Callback method
int256 public volume;
function fulfill(bytes32 _requestId, int256 _volume) public recordChainlinkFulfillment(_requestId) {
  volume = _volume;
}

Get > bool

Request method
function request() public {
  Chainlink.Request memory req = buildChainlinkRequest('c1c5e92880894eb6b27d3cae19670aa3', address(this), this.fulfill.selector);
  req.add(
      'get',
      'https://app.proofi.com/api/verify/eip155/0xCB5085214B6318aF3dd0FBbb5E74fbF6bf332151?contract=0x2f7f7E44ca1e2Ca1A54db4222cF97ab47EE026F1'
  );
  req.add('path', 'approved');
  sendChainlinkRequest(req, (1 * LINK_DIVISIBILITY) / 10); // 0,1*10**18 LINK
}
Callback method
bool public approved;
function fulfill(bytes32 _requestId, bool _approved) public recordChainlinkFulfillment(_requestId) {
  approved = _approved;
}

Get > string

A full example can be found here.

Request method
function request() public {
  Chainlink.Request memory req = buildChainlinkRequest('7d80a6386ef543a3abb52817f6707e3b', address(this), this.fulfill.selector);
  req.add(
      'get',
      'https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&per_page=10'
  );
  req.add('path', '0,id');
  sendChainlinkRequest(req, (1 * LINK_DIVISIBILITY) / 10); // 0,1*10**18 LINK
}
Callback method
string public id;
function fulfill(bytes32 _requestId, string memory _id) public recordChainlinkFulfillment(_requestId) {
  id = _id;
}

Stay updated on the latest Chainlink news