Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions 1forge/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Chainlink 1Forge External Adapter

## Input Params

- `base` or `to`: The target currency to query (required)
- `quote` or `from`: The currency to convert to (required)
- `endpoint`: The endpoint to call (optional)

## Output

```json
{
"jobRunID": "1",
"data": {
"value": 1.22687,
"text": "1.0 GBP is worth 1.22687 USD",
"timestamp": 1587489920,
"result": 1.22687
},
"result": 1.22687,
"statusCode": 200
}
```
42 changes: 42 additions & 0 deletions 1forge/adapter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
const { Requester, Validator } = require('external-adapter')

const customParams = {
base: ['base', 'from'],
quote: ['quote', 'to'],
endpoint: false,
quantity: false
}

const createRequest = (input, callback) => {
const validator = new Validator(input, customParams, callback)
const jobRunID = validator.validated.id
const endpoint = validator.validated.data.endpoint || 'convert'
const url = `https://api.1forge.com/${endpoint}`
const from = validator.validated.data.base.toUpperCase()
const to = validator.validated.data.quote.toUpperCase()
const quantity = validator.validated.data.quantity || 1
const api_key = process.env.API_KEY // eslint-disable-line camelcase

const qs = {
from,
to,
quantity,
api_key
}

const options = {
url,
qs
}

Requester.requestRetry(options)
.then(response => {
response.body.result = Requester.validateResult(response.body, ['value'])
callback(response.statusCode, Requester.success(jobRunID, response))
})
.catch(error => {
callback(500, Requester.errored(jobRunID, error))
})
}

module.exports.createRequest = createRequest
8 changes: 8 additions & 0 deletions 1forge/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"name": "1forge",
"version": "0.1.0",
"license": "MIT",
"scripts": {
"test": "yarn _mocha --timeout 0"
}
}
50 changes: 50 additions & 0 deletions 1forge/test/adapter_test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
const assert = require('chai').assert
const createRequest = require('../adapter').createRequest

describe('createRequest', () => {
const jobID = '1'

context('successful calls', () => {
const requests = [
{ name: 'id not supplied', testData: { data: { base: 'GBP', quote: 'USD' } } },
{ name: 'base/quote', testData: { id: jobID, data: { base: 'GBP', quote: 'USD' } } },
{ name: 'from/to', testData: { id: jobID, data: { from: 'GBP', to: 'USD' } } }
]

requests.forEach(req => {
it(`${req.name}`, (done) => {
createRequest(req.testData, (statusCode, data) => {
assert.equal(statusCode, 200)
assert.equal(data.jobRunID, jobID)
assert.isNotEmpty(data.data)
assert.isAbove(Number(data.result), 0)
assert.isAbove(Number(data.data.result), 0)
done()
})
})
})
})

context('error calls', () => {
const requests = [
{ name: 'empty body', testData: {} },
{ name: 'empty data', testData: { data: {} } },
{ name: 'base not supplied', testData: { id: jobID, data: { quote: 'USD' } } },
{ name: 'quote not supplied', testData: { id: jobID, data: { base: 'GBP' } } },
{ name: 'unknown base', testData: { id: jobID, data: { base: 'not_real', quote: 'USD' } } },
{ name: 'unknown quote', testData: { id: jobID, data: { base: 'GBP', quote: 'not_real' } } }
]

requests.forEach(req => {
it(`${req.name}`, (done) => {
createRequest(req.testData, (statusCode, data) => {
assert.equal(statusCode, 500)
assert.equal(data.jobRunID, jobID)
assert.equal(data.status, 'errored')
assert.isNotEmpty(data.error)
done()
})
})
})
})
})
33 changes: 33 additions & 0 deletions alphavantage/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Chainlink External Adapter for AlphaVantage

Use this adapter for connecting to AlphaVantage's API from a Chainlink node.

## Input params

- `function`: (Optional) The function to call (defaults to CURRENCY_EXCHANGE_RATE)
- `base`, `from`, or `coin`: The asset to query
- `quote`, `to`, or `market`: The currency to convert to

## Output

```json
{
"jobRunID": "1",
"data": {
"Realtime Currency Exchange Rate": {
"1. From_Currency Code": "ETH",
"2. From_Currency Name": "Ethereum",
"3. To_Currency Code": "USD",
"4. To_Currency Name": "United States Dollar",
"5. Exchange Rate": "170.88000000",
"6. Last Refreshed": "2020-04-16 19:15:01",
"7. Time Zone": "UTC",
"8. Bid Price": "170.84000000",
"9. Ask Price": "170.88000000"
},
"result": 170.88
},
"result": 170.88,
"statusCode": 200
}
```
48 changes: 48 additions & 0 deletions alphavantage/adapter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
const { Requester, Validator } = require('external-adapter')

const customError = (body) => {
if (body['Error Message']) return true
return false
}

const customParams = {
base: ['base', 'from', 'coin'],
quote: ['quote', 'to', 'market'],
function: false
}

const createRequest = (input, callback) => {
const validator = new Validator(input, customParams, callback)
const url = 'https://www.alphavantage.co/query'
const jobRunID = validator.validated.id
const func = validator.validated.data.function || 'CURRENCY_EXCHANGE_RATE'
const from = validator.validated.data.base
const to = validator.validated.data.quote

const qs = {
function: func,
from_currency: from,
to_currency: to,
from_symbol: from,
to_symbol: to,
symbol: from,
market: to,
apikey: process.env.API_KEY
}

const options = {
url,
qs
}
Requester.requestRetry(options, customError)
.then(response => {
response.body.result = JSON.parse(Requester.validateResult(
response.body, ['Realtime Currency Exchange Rate', '5. Exchange Rate']))
callback(response.statusCode, Requester.success(jobRunID, response))
})
.catch(error => {
callback(500, Requester.errored(jobRunID, error))
})
}

module.exports.createRequest = createRequest
8 changes: 8 additions & 0 deletions alphavantage/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"name": "alphavantage",
"version": "0.1.0",
"license": "MIT",
"scripts": {
"test": "yarn _mocha --timeout 0"
}
}
51 changes: 51 additions & 0 deletions alphavantage/test/adapter_test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
const assert = require('chai').assert
const createRequest = require('../adapter').createRequest

describe('createRequest', () => {
const jobID = '1'

context('successful calls', () => {
const requests = [
{ name: 'id not supplied', testData: { data: { base: 'ETH', quote: 'USD' } } },
{ name: 'base/quote', testData: { id: jobID, data: { base: 'ETH', quote: 'USD' } } },
{ name: 'from/to', testData: { id: jobID, data: { from: 'ETH', to: 'USD' } } },
{ name: 'coin/market', testData: { id: jobID, data: { coin: 'ETH', market: 'USD' } } }
]

requests.forEach(req => {
it(`${req.name}`, (done) => {
createRequest(req.testData, (statusCode, data) => {
assert.equal(statusCode, 200)
assert.equal(data.jobRunID, jobID)
assert.isNotEmpty(data.data)
assert.isAbove(Number(data.result), 0)
assert.isAbove(Number(data.data.result), 0)
done()
})
})
})
})

context('error calls', () => {
const requests = [
{ name: 'empty body', testData: {} },
{ name: 'empty data', testData: { data: {} } },
{ name: 'base not supplied', testData: { id: jobID, data: { quote: 'USD' } } },
{ name: 'quote not supplied', testData: { id: jobID, data: { base: 'ETH' } } },
{ name: 'unknown base', testData: { id: jobID, data: { base: 'not_real', quote: 'USD' } } },
{ name: 'unknown quote', testData: { id: jobID, data: { base: 'ETH', quote: 'not_real' } } }
]

requests.forEach(req => {
it(`${req.name}`, (done) => {
createRequest(req.testData, (statusCode, data) => {
assert.equal(statusCode, 500)
assert.equal(data.jobRunID, jobID)
assert.equal(data.status, 'errored')
assert.isNotEmpty(data.error)
done()
})
})
})
})
})
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
33 changes: 33 additions & 0 deletions currencylayer/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Chainlink CurrencyLayer External Adapter

## Input Params:

- `base` or `from`: Specify the currency to convert from (required)
- `quote` or `to`: Specify the currency to convert to (required)
- `endpoint`: The endpoint to call (optional)
- `amount`: Specify the amount to convert (optional)

## Output

```json
{
"jobRunID": "1",
"data": {
"success": true,
"query": {
"from": "GBP",
"to": "JPY",
"amount": 1
},
"info": {
"timestamp": 1519328414,
"rate": 148.972231
},
"historical": "",
"date": "2018-02-22",
"result": 148.972231
},
"result": 148.972231,
"statusCode": 200
}
```
42 changes: 42 additions & 0 deletions currencylayer/adapter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
const { Requester, Validator } = require('external-adapter')

const customParams = {
base: ['base', 'from'],
quote: ['quote', 'to'],
endpoint: false,
amount: false
}

const createRequest = (input, callback) => {
const validator = new Validator(input, customParams, callback)
const jobRunID = validator.validated.id
const endpoint = validator.validated.data.endpoint || 'convert'
const url = `https://apilayer.net/api/${endpoint}`
const from = validator.validated.data.base.toUpperCase()
const to = validator.validated.data.quote.toUpperCase()
const amount = validator.validated.data.amount || 1
const access_key = process.env.API_KEY // eslint-disable-line camelcase

const qs = {
from,
to,
amount,
access_key
}

const options = {
url,
qs
}

Requester.requestRetry(options)
.then(response => {
response.body.result = Requester.validateResult(response.body, ['result'])
callback(response.statusCode, Requester.success(jobRunID, response))
})
.catch(error => {
callback(500, Requester.errored(jobRunID, error))
})
}

module.exports.createRequest = createRequest
8 changes: 8 additions & 0 deletions currencylayer/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"name": "currencylayer",
"version": "0.1.0",
"license": "MIT",
"scripts": {
"test": "yarn _mocha --timeout 0"
}
}
Loading