bitcore-wallet-service
Version:
A service for Mutisig HD Bitcoin Wallets
132 lines (117 loc) • 3.86 kB
text/typescript
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);
}
}
);
});
}
}