mirror of
https://github.com/Xahau/xahau.js.git
synced 2025-11-21 20:55:48 +00:00
96 lines
2.5 KiB
JavaScript
96 lines
2.5 KiB
JavaScript
/* @flow */
|
|
'use strict';
|
|
const _ = require('lodash');
|
|
const BigNumber = require('bignumber.js');
|
|
const errors = require('./errors');
|
|
const keypairs = require('ripple-keypairs');
|
|
|
|
import type {Amount, RippledAmount} from './types.js';
|
|
|
|
function dropsToXrp(drops: string): string {
|
|
return (new BigNumber(drops)).dividedBy(1000000.0).toString();
|
|
}
|
|
|
|
function xrpToDrops(xrp: string): string {
|
|
return (new BigNumber(xrp)).times(1000000.0).floor().toString();
|
|
}
|
|
|
|
function toRippledAmount(amount: Amount): RippledAmount {
|
|
if (amount.currency === 'XRP') {
|
|
return xrpToDrops(amount.value);
|
|
}
|
|
return {
|
|
currency: amount.currency,
|
|
issuer: amount.counterparty ? amount.counterparty :
|
|
(amount.issuer ? amount.issuer : undefined),
|
|
value: amount.value
|
|
};
|
|
}
|
|
|
|
function generateAddress(options?: Object): Object {
|
|
const secret = keypairs.generateSeed(options);
|
|
const keypair = keypairs.deriveKeypair(secret);
|
|
const address = keypairs.deriveAddress(keypair.publicKey);
|
|
return {secret, address};
|
|
}
|
|
|
|
function generateAddressAPI(options?: Object): Object {
|
|
try {
|
|
return generateAddress(options);
|
|
} catch (error) {
|
|
throw new errors.ApiError(error.message);
|
|
}
|
|
}
|
|
|
|
const FINDSNAKE = /([a-zA-Z]_[a-zA-Z])/g;
|
|
function convertKeysFromSnakeCaseToCamelCase(obj: any): any {
|
|
if (typeof obj === 'object') {
|
|
let newKey;
|
|
return _.reduce(obj, (result, value, key) => {
|
|
newKey = key;
|
|
if (FINDSNAKE.test(key)) {
|
|
newKey = key.replace(FINDSNAKE, r => r[0] + r[2].toUpperCase());
|
|
}
|
|
result[newKey] = convertKeysFromSnakeCaseToCamelCase(value);
|
|
return result;
|
|
}, {});
|
|
}
|
|
return obj;
|
|
}
|
|
|
|
function removeUndefined(obj: Object): Object {
|
|
return _.omit(obj, _.isUndefined);
|
|
}
|
|
|
|
/**
|
|
* @param {Number} rpepoch (seconds since 1/1/2000 GMT)
|
|
* @return {Number} ms since unix epoch
|
|
*
|
|
*/
|
|
function rippleToUnixTimestamp(rpepoch: number): number {
|
|
return (rpepoch + 0x386D4380) * 1000;
|
|
}
|
|
|
|
/**
|
|
* @param {Number|Date} timestamp (ms since unix epoch)
|
|
* @return {Number} seconds since ripple epoch ( 1/1/2000 GMT)
|
|
*/
|
|
function unixToRippleTimestamp(timestamp: number | Date): number {
|
|
const timestamp_ = timestamp instanceof Date ?
|
|
timestamp.getTime() :
|
|
timestamp;
|
|
return Math.round(timestamp_ / 1000) - 0x386D4380;
|
|
}
|
|
|
|
module.exports = {
|
|
dropsToXrp,
|
|
xrpToDrops,
|
|
toRippledAmount,
|
|
generateAddress,
|
|
generateAddressAPI,
|
|
convertKeysFromSnakeCaseToCamelCase,
|
|
removeUndefined,
|
|
rippleToUnixTimestamp,
|
|
unixToRippleTimestamp
|
|
};
|