@leverj/adapter
Version:
common utilities used in leverj exchange
54 lines (48 loc) • 2.43 kB
JavaScript
const affirm = require('@leverj/affirm')
const {address} = require('@leverj/gluon-plasma.common/src/utils/ethereum')
const {Pair} = require('@leverj/gluon-plasma.common.exchange/src/domain/pair')
const {Order, SignedOrder, Side, OrderType} = require('@leverj/gluon-plasma.app.spot.exchange/src/domain/v/0/order')
const ORDER_TYPE_MAP = {LMT: OrderType.limit, MKT: OrderType.market}
const mathUtil = require('./MathUtil')
module.exports = function () {
const auth = {}
auth.sign = function (order, pair, secret) {
const contractOrder = auth.getContractOrder(order, pair)
const signedContractOrder = contractOrder.signedByWithPersonalMessage(secret)
return signedContractOrder.signature
}
auth.validate = function (order, pair, apiKey) {
const personalMessageSigner = auth.getPersonalMessageSigner(order, pair)
if (personalMessageSigner === apiKey) return
const signer = auth.getSigner(order, pair)
affirm(signer === apiKey, 'M_INV_ORDSIG', 422)
}
auth.getPersonalMessageSigner = function (order, pair) {
return getSignedOrder(order, auth, pair).personalMessageSigner
}
auth.getSigner = function (order, pair) {
return getSignedOrder(order, auth, pair).signer
}
auth.getContractOrder = function (order, pair) {
affirm(ORDER_TYPE_MAP[order.orderType] > 0, 'Invalid order orderType')
affirm(Side[order.side] > 0, 'Invalid order side')
affirm(pair, 'pair missing')
affirm(pair.symbol === order.instrument, 'pair must be same as order instrument')
affirm(typeof order.timestamp === 'number', 'Invalid timestamp')
const quantity = mathUtil.toBN(order.quantity, pair.base.decimals).toFixed()
const price = mathUtil.toBN(order.price, pair.quote.decimals).toFixed()
const timestamp = order.timestamp
const id = order.uuid
const orderType = ORDER_TYPE_MAP[order.orderType]
const side = Side[order.side]
return new Order(id, timestamp, orderType, side, new Pair(pair.base.address, pair.quote.address), quantity, price, order.originator, order.accountId)
}
auth.toBN = mathUtil.toBN
function getSignedOrder(order, auth, pair) {
// setting serverTimestamp to 0 if order.entryTime is undefined
const serverTimestamp = order.entryTime ? order.entryTime : 0
const contractOrder = auth.getContractOrder(order, pair)
return new SignedOrder(contractOrder, order.signature, serverTimestamp, 0)
}
return auth
}()