Skip to content

Commit 1e0fe4a

Browse files
committed
Validate signature
1 parent c0ffafc commit 1e0fe4a

File tree

6 files changed

+72
-36
lines changed

6 files changed

+72
-36
lines changed

package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
"pg": "^7.4.1",
3030
"sequelize": "^4.31.2",
3131
"web3": "^0.20.4",
32-
"wyvern-js": "file:../wyvern-js",
33-
"wyvern-schemas": "file:../wyvern-schemas"
32+
"wyvern-js": "file:../wyvern-js"
3433
}
3534
}

server/db.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ const sequelize = new Sequelize('orderbook', 'postgres', 'postgres', {
1212

1313
const Order = sequelize.define('order', {
1414
hash: {type: Sequelize.TEXT, allowNull: false, primaryKey: true},
15+
title: {type: Sequelize.TEXT, allowNull: true},
16+
schema: {type: Sequelize.TEXT, allowNull: true},
1517
metadata: {type: Sequelize.JSON, allowNull: false},
1618
exchange: {type: Sequelize.TEXT, allowNull: false},
1719
maker: {type: Sequelize.TEXT, allowNull: false},
@@ -42,11 +44,14 @@ const Order = sequelize.define('order', {
4244
indexes: [
4345
{name: 'listingTime_index', method: 'BTREE', fields: ['listingTime']},
4446
{name: 'expirationTime_index', method: 'BTREE', fields: ['expirationTime']}
45-
]
47+
],
48+
version: true
4649
})
4750

4851
const encodeOrder = (order) => ({
4952
hash: order.hash,
53+
title: order.metadata.title || null,
54+
schema: order.metadata.schema || null,
5055
metadata: order.metadata,
5156
exchange: order.exchange,
5257
maker: order.maker,
@@ -102,11 +107,14 @@ const decodeOrder = (order) => ({
102107
r: order.r,
103108
s: order.s,
104109
cancelledOrFinalized: order.cancelledOrFinalized,
105-
markedInvalid: order.markedInvalid
110+
markedInvalid: order.markedInvalid,
111+
createdAt: order.createdAt,
112+
updatedAt: order.updatedAt
106113
})
107114

108115
module.exports = {
109116
sequelize: sequelize,
117+
Op: Sequelize.Op,
110118
Order: Order,
111119
encodeOrder: encodeOrder,
112120
decodeOrder: decodeOrder

server/index.js

Lines changed: 42 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,12 @@
11
const express = require('express')
22
const bodyParser = require('body-parser')
33
const helmet = require('helmet')
4-
const { WyvernProtocol } = require('wyvern-js')
54

6-
const { sequelize, Order, encodeOrder, decodeOrder } = require('./db.js')
5+
const { sequelize, Op, Order, encodeOrder, decodeOrder } = require('./db.js')
6+
const { validateOrder } = require('./validate.js')
77
const log = require('./logging.js')
88
const scan = require('./scan.js')
99

10-
const assertEqual = (a, b, msg) => {
11-
if (a !== b) throw new Error(msg + ': ' + a + ', ' + b)
12-
}
13-
1410
const fail = (req, res, status, err) => {
1511
log.warn({error: err.message, origin: 'express', path: req.path}, 'Error processing request')
1612
res.status(status)
@@ -20,19 +16,49 @@ const fail = (req, res, status, err) => {
2016
const app = express()
2117
app.use(helmet())
2218
app.use(bodyParser.json())
23-
app.use((req, res, next) => {
24-
const start = Date.now() / 1000
25-
res.header('Access-Control-Allow-Origin', '*')
26-
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept')
27-
next()
28-
const end = Date.now() / 1000
29-
log.debug({origin: 'express', diff: end - start, path: req.path, method: req.method, ip: req.headers['X-Forwarded-For']}, 'Request handled')
30-
})
3119

3220
const router = express.Router()
3321

3422
router.get('/orders', (req, res) => {
35-
return Order.findAll({where: {cancelledOrFinalized: false}}).then(orders => {
23+
var where = {
24+
markedInvalid: req.query.markedInvalid === '1',
25+
cancelledOrFinalized: req.query.cancelledOrFinalized === '1'
26+
}
27+
if (req.query.maker) {
28+
where.maker = req.query.maker
29+
}
30+
if (req.query.taker) {
31+
where.taker = req.query.taker
32+
}
33+
if (req.query.paymentToken) {
34+
where.paymentToken = req.query.paymentToken
35+
}
36+
if (req.query.side) {
37+
where.side = req.query.side
38+
}
39+
if (req.query.schema) {
40+
where.schema = req.query.schema
41+
}
42+
if (req.query.saleKind) {
43+
where.saleKind = req.query.saleKind
44+
}
45+
if (req.query.filter) {
46+
where.title = [Op.like, req.query.filter]
47+
}
48+
var order = [['createdAt', 'DESC']]
49+
if (req.query.order) {
50+
switch (req.query.order) {
51+
case '1': order = [['createdAt', 'DESC']]; break
52+
case '2': order = [['createdAt', 'ASC']]; break
53+
case '3': order = [['basePrice', 'DESC']]; break
54+
case '4': order = [['basePrice', 'ASC']]; break
55+
}
56+
}
57+
var limit = req.query.limit ? parseInt(req.query.limit) : 20
58+
limit = Math.min(100, Math.max(0, limit))
59+
var offset = req.query.offset ? parseInt(req.query.offset) : 0
60+
var query = { where, order, limit, offset }
61+
return Order.findAll(query).then(orders => {
3662
res.json({result: orders.map(decodeOrder), error: null})
3763
}).catch(err => {
3864
fail(req, res, 500, err)
@@ -47,11 +73,6 @@ router.get('/orders/:hash', (req, res) => {
4773
})
4874
})
4975

50-
const validateOrder = async (order) => {
51-
const orderHash = WyvernProtocol.getOrderHashHex(order)
52-
assertEqual(orderHash, order.hash, 'Expected provided order hash to match calculated hash')
53-
}
54-
5576
router.post('/orders/post', (req, res) => {
5677
const order = req.body
5778
return validateOrder(order).then(() => {
@@ -70,7 +91,7 @@ router.post('/orders/validate', (req, res) => {
7091
}).catch(err => fail(req, res, 400, err))
7192
})
7293

73-
app.use('/v1', router)
94+
app.use('/v0', router)
7495

7596
const go = ({ port, provider, network, production }) => {
7697
sequelize

server/scan.js

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,9 @@ const log = require('./logging.js')
66

77
const scan = (provider, network) => {
88
const protocolInstance = new WyvernProtocol(new Web3.providers.HttpProvider(provider), { network })
9-
const web3 = new Web3(provider)
9+
const web3 = new Web3(new Web3.providers.HttpProvider(provider))
1010
const scanFunc = async () => {
1111
const start = Date.now() / 1000
12-
var markedInvalid = 0
13-
var cancelledOrFinalized = 0
1412
await Order.findAll({where: {cancelledOrFinalized: false}}).then(orders => {
1513
return Promise.all(orders.map(async order => {
1614
const valid = await protocolInstance.wyvernExchange.validateOrder_.callAsync(
@@ -28,7 +26,6 @@ const scan = (provider, network) => {
2826
if (!valid) {
2927
order.cancelledOrFinalized = true
3028
return order.save().then(() => {
31-
cancelledOrFinalized++
3229
log.info('Order ' + order.hash + ' marked cancelled or finalized')
3330
})
3431
}
@@ -43,7 +40,6 @@ const scan = (provider, network) => {
4340
if (!res) {
4441
order.markedInvalid = true
4542
order.save().then(() => {
46-
markedInvalid++
4743
log.info('Order ' + order.hash + ' marked invalid')
4844
})
4945
}
@@ -52,9 +48,10 @@ const scan = (provider, network) => {
5248
})
5349
const end = Date.now() / 1000
5450
const dt = Math.round((end - start) * 1000) / 1000
55-
log.info({dt: dt + 's', markedInvalid, cancelledOrFinalized}, 'Orderbook scan completed')
51+
log.info({dt: dt + 's'}, 'Orderbook scan completed')
52+
setTimeout(scanFunc, 5000)
5653
}
57-
setInterval(scanFunc, 5000)
54+
scanFunc()
5855
}
5956

6057
module.exports = scan

server/validate.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
const { WyvernProtocol } = require('wyvern-js')
2+
3+
const assertEqual = (a, b, msg) => {
4+
if (a !== b) throw new Error(msg + ': ' + a + ', ' + b)
5+
}
6+
7+
const validateOrder = async (order) => {
8+
const orderHash = WyvernProtocol.getOrderHashHex(order)
9+
assertEqual(orderHash, order.hash, 'Expected provided order hash to match calculated hash')
10+
const validSignature = WyvernProtocol.isValidSignature(orderHash, { v: order.v, r: order.r, s: order.s }, order.maker)
11+
assertEqual(validSignature, true, 'Expected valid order signature')
12+
}
13+
14+
module.exports = { validateOrder }

yarn.lock

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3534,7 +3534,7 @@ watchpack@^1.4.0:
35343534
chokidar "^1.7.0"
35353535
graceful-fs "^4.1.2"
35363536

3537-
web3@^0.20.0, web3@^0.20.4:
3537+
web3@0.20.4, web3@^0.20.0, web3@^0.20.4:
35383538
version "0.20.4"
35393539
resolved "https://registry.yarnpkg.com/web3/-/web3-0.20.4.tgz#400e6579a65bb4a3dde71a6ebf6509afadc33a04"
35403540
dependencies:
@@ -3650,9 +3650,6 @@ wrappy@1:
36503650
web3 "^0.20.4"
36513651
webpack "^3.10.0"
36523652

3653-
"wyvern-schemas@file:../wyvern-schemas":
3654-
version "0.1.0"
3655-
36563653
36573654
version "1.0.0"
36583655
resolved "https://registry.yarnpkg.com/x-xss-protection/-/x-xss-protection-1.0.0.tgz#898afb93869b24661cf9c52f9ee8db8ed0764dd9"

0 commit comments

Comments
 (0)