UNPKG

bitcore-wallet-service

Version:
132 lines (117 loc) 3.86 kB
import * as _ from 'lodash'; import * as request from 'request'; import config from '../config'; import { ClientError } from '../lib/errors/clienterror'; import { checkRequired } from '../lib/server'; const Bitcore = require('bitcore-lib'); export class WyreService { request: any = request; private wyreGetKeys(req) { if (!config.wyre) throw new Error('Wyre missing credentials'); let env = 'sandbox'; if (req.body.env && req.body.env == 'production') { env = 'production'; } delete req.body.env; const keys = { API: config.wyre[env].api, API_KEY: config.wyre[env].apiKey, SECRET_API_KEY: config.wyre[env].secretApiKey, ACCOUNT_ID: config.wyre[env].appProviderAccountId }; return keys; } wyreWalletOrderQuotation(req): Promise<any> { return new Promise((resolve, reject) => { const keys = this.wyreGetKeys(req); req.body.accountId = keys.ACCOUNT_ID; if (req.body.amountIncludeFees) { if ( !checkRequired(req.body, ['sourceAmount', 'sourceCurrency', 'destCurrency', 'dest', 'country', 'walletType']) ) { return reject(new ClientError("Wyre's request missing arguments")); } } else { if (!checkRequired(req.body, ['amount', 'sourceCurrency', 'destCurrency', 'dest', 'country'])) { return reject(new ClientError("Wyre's request missing arguments")); } } const URL: string = `${keys.API}/v3/orders/quote/partner?timestamp=${Date.now().toString()}`; const XApiSignature: string = URL + JSON.stringify(req.body); const XApiSignatureHash: string = Bitcore.crypto.Hash.sha256hmac( Buffer.from(XApiSignature), Buffer.from(keys.SECRET_API_KEY) ).toString('hex'); const headers = { 'Content-Type': 'application/json', 'X-Api-Key': keys.API_KEY, 'X-Api-Signature': XApiSignatureHash }; this.request.post( URL, { headers, body: req.body, json: true }, (err, data) => { if (err) { return reject(err.body ? err.body : err); } else { return resolve(data.body); } } ); }); } wyreWalletOrderReservation(req): Promise<any> { return new Promise((resolve, reject) => { const keys = this.wyreGetKeys(req); req.body.referrerAccountId = keys.ACCOUNT_ID; if (req.body.amountIncludeFees) { if ( !checkRequired(req.body, [ 'sourceAmount', 'sourceCurrency', 'destCurrency', 'dest', 'country', 'paymentMethod' ]) ) { return reject(new ClientError("Wyre's request missing arguments")); } } else { if (!checkRequired(req.body, ['amount', 'sourceCurrency', 'destCurrency', 'dest', 'paymentMethod'])) { return reject(new ClientError("Wyre's request missing arguments")); } } const URL: string = `${keys.API}/v3/orders/reserve?timestamp=${Date.now().toString()}`; const XApiSignature: string = URL + JSON.stringify(req.body); const XApiSignatureHash: string = Bitcore.crypto.Hash.sha256hmac( Buffer.from(XApiSignature), Buffer.from(keys.SECRET_API_KEY) ).toString('hex'); const headers = { 'Content-Type': 'application/json', 'X-Api-Key': keys.API_KEY, 'X-Api-Signature': XApiSignatureHash }; this.request.post( URL, { headers, body: req.body, json: true }, (err, data) => { if (err) { return reject(err.body ? err.body : err); } else { return resolve(data.body); } } ); }); } }