tornado-relayer/src/utils.js

86 lines
2.3 KiB
JavaScript
Raw Normal View History

2019-11-23 09:18:54 +01:00
const { isHexStrict, toBN, toWei } = require('web3-utils')
2019-11-26 16:01:37 +01:00
const { mixers, relayerServiceFee } = require('../config')
2019-09-19 17:21:57 +02:00
2019-11-14 14:24:01 +01:00
function isValidProof(proof) {
2019-07-18 14:43:26 +02:00
// validator expects `websnarkUtils.toSolidityInput(proof)` output
2019-11-14 14:24:01 +01:00
if (!(proof)) {
return { valid: false, reason: 'The proof is empty.' }
2019-07-18 14:43:26 +02:00
}
2019-11-14 14:24:01 +01:00
if (!isHexStrict(proof) || proof.length !== 2 + 2 * 8 * 32) {
2019-10-06 09:55:24 +02:00
return { valid: false, reason: 'Corrupted proof' }
2019-07-18 14:43:26 +02:00
}
2019-11-14 14:24:01 +01:00
return { valid: true }
}
function isValidArgs(args) {
if (!(args)) {
return { valid: false, reason: 'Args are empty' }
}
if (args.length !== 6) {
return { valid: false, reason: 'Length of args is lower than 6' }
2019-07-18 14:43:26 +02:00
}
2019-11-14 14:24:01 +01:00
for(let signal of args) {
2019-11-08 02:25:43 +01:00
if (!isHexStrict(signal)) {
2019-11-14 14:24:01 +01:00
return { valid: false, reason: `Corrupted signal ${signal}` }
2019-07-18 14:43:26 +02:00
}
}
2019-11-08 02:25:43 +01:00
2019-11-14 14:24:01 +01:00
if (args[0].length !== 66 ||
args[1].length !== 66 ||
args[2].length !== 42 ||
args[3].length !== 42 ||
args[4].length !== 66 ||
args[5].length !== 66) {
return { valid: false, reason: 'The length one of the signals is incorrect' }
2019-11-08 02:25:43 +01:00
}
2019-07-18 14:43:26 +02:00
return { valid: true }
}
2019-09-19 21:56:45 +02:00
function isKnownContract(contract) {
for (let i = 0; i < mixers.length; i++) {
if (mixers[i].address === contract) {
2019-11-26 16:01:37 +01:00
return { valid: true, currency: mixers[i].currency, amount: mixers[i].amount }
2019-09-19 21:56:45 +02:00
}
}
return { valid: false }
}
2019-07-23 18:43:24 +02:00
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms))
}
2019-11-26 16:01:37 +01:00
function isEnoughFee({ gas, gasPrices, currency, amount, refund, ethPrices, fee }) {
// TODO tokens can have less then 18 decimals
2019-11-28 20:04:21 +01:00
const feePercent = toBN(toWei(amount)).mul(toBN(relayerServiceFee * 10)).div(toBN('1000'))
2019-11-15 10:01:59 +01:00
const expense = toBN(toWei(gasPrices.fast.toString(), 'gwei')).mul(toBN(gas))
let desiredFee
switch (currency) {
case 'eth': {
2019-11-26 16:01:37 +01:00
desiredFee = expense.add(feePercent)
2019-11-15 10:01:59 +01:00
break
}
case 'dai': {
2019-11-23 10:20:08 +01:00
desiredFee =
expense.add(refund)
.mul(toBN(10 ** 18))
.div(toBN(ethPrices.dai))
2019-11-26 16:01:37 +01:00
desiredFee = desiredFee.add(feePercent)
2019-11-15 10:01:59 +01:00
break
}
}
2019-11-26 16:01:37 +01:00
console.log('desired fee, feePercent', desiredFee.toString(), feePercent.toString())
2019-11-15 10:01:59 +01:00
if (fee.lt(desiredFee)) {
return { isEnough: false, reason: 'Not enough fee' }
}
return { isEnough: true }
}
2019-11-23 09:18:54 +01:00
module.exports = { isValidProof, isValidArgs, sleep, isKnownContract, isEnoughFee }