2019-11-23 11:18:54 +03:00
|
|
|
const { isHexStrict, toBN, toWei } = require('web3-utils')
|
2019-12-02 15:49:24 +03:00
|
|
|
const { netId, mixers, relayerServiceFee } = require('../config')
|
2019-09-19 18:21:57 +03:00
|
|
|
|
2019-11-14 16:24:01 +03:00
|
|
|
function isValidProof(proof) {
|
2019-07-18 15:43:26 +03:00
|
|
|
// validator expects `websnarkUtils.toSolidityInput(proof)` output
|
|
|
|
|
2019-11-14 16:24:01 +03:00
|
|
|
if (!(proof)) {
|
|
|
|
return { valid: false, reason: 'The proof is empty.' }
|
2019-07-18 15:43:26 +03:00
|
|
|
}
|
|
|
|
|
2019-11-14 16:24:01 +03:00
|
|
|
if (!isHexStrict(proof) || proof.length !== 2 + 2 * 8 * 32) {
|
2019-10-06 10:55:24 +03:00
|
|
|
return { valid: false, reason: 'Corrupted proof' }
|
2019-07-18 15:43:26 +03:00
|
|
|
}
|
|
|
|
|
2019-11-14 16:24:01 +03: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 15:43:26 +03:00
|
|
|
}
|
|
|
|
|
2019-11-14 16:24:01 +03:00
|
|
|
for(let signal of args) {
|
2019-11-08 04:25:43 +03:00
|
|
|
if (!isHexStrict(signal)) {
|
2019-11-14 16:24:01 +03:00
|
|
|
return { valid: false, reason: `Corrupted signal ${signal}` }
|
2019-07-18 15:43:26 +03:00
|
|
|
}
|
|
|
|
}
|
2019-11-08 04:25:43 +03:00
|
|
|
|
2019-11-14 16:24:01 +03: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 04:25:43 +03:00
|
|
|
}
|
|
|
|
|
2019-07-18 15:43:26 +03:00
|
|
|
return { valid: true }
|
|
|
|
}
|
|
|
|
|
2019-09-19 22:56:45 +03:00
|
|
|
function isKnownContract(contract) {
|
2019-12-02 15:49:24 +03:00
|
|
|
const mixers = getMixers()
|
|
|
|
for (let currency of Object.keys(mixers)) {
|
|
|
|
for (let amount of Object.keys(mixers[currency].mixerAddress)) {
|
|
|
|
if (mixers[currency].mixerAddress[amount] === contract) {
|
|
|
|
return { valid: true, currency, amount }
|
|
|
|
}
|
2019-09-19 22:56:45 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return { valid: false }
|
|
|
|
}
|
|
|
|
|
2019-07-23 19:43:24 +03:00
|
|
|
function sleep(ms) {
|
|
|
|
return new Promise(resolve => setTimeout(resolve, ms))
|
|
|
|
}
|
|
|
|
|
2019-11-26 18:01:37 +03:00
|
|
|
function isEnoughFee({ gas, gasPrices, currency, amount, refund, ethPrices, fee }) {
|
|
|
|
// TODO tokens can have less then 18 decimals
|
2019-11-28 22:04:21 +03:00
|
|
|
const feePercent = toBN(toWei(amount)).mul(toBN(relayerServiceFee * 10)).div(toBN('1000'))
|
2019-11-15 12:01:59 +03:00
|
|
|
const expense = toBN(toWei(gasPrices.fast.toString(), 'gwei')).mul(toBN(gas))
|
|
|
|
let desiredFee
|
|
|
|
switch (currency) {
|
|
|
|
case 'eth': {
|
2019-11-26 18:01:37 +03:00
|
|
|
desiredFee = expense.add(feePercent)
|
2019-11-15 12:01:59 +03:00
|
|
|
break
|
|
|
|
}
|
|
|
|
case 'dai': {
|
2019-11-23 12:20:08 +03:00
|
|
|
desiredFee =
|
|
|
|
expense.add(refund)
|
|
|
|
.mul(toBN(10 ** 18))
|
|
|
|
.div(toBN(ethPrices.dai))
|
2019-11-26 18:01:37 +03:00
|
|
|
desiredFee = desiredFee.add(feePercent)
|
2019-11-15 12:01:59 +03:00
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
2019-11-26 18:01:37 +03:00
|
|
|
console.log('desired fee, feePercent', desiredFee.toString(), feePercent.toString())
|
2019-11-15 12:01:59 +03:00
|
|
|
if (fee.lt(desiredFee)) {
|
|
|
|
return { isEnough: false, reason: 'Not enough fee' }
|
|
|
|
}
|
|
|
|
return { isEnough: true }
|
|
|
|
}
|
|
|
|
|
2019-12-02 15:49:24 +03:00
|
|
|
function getMainnetTokens() {
|
|
|
|
const tokens = mixers['netId1']
|
|
|
|
const tokenAddresses = []
|
|
|
|
const currencyLookup = {}
|
|
|
|
Object.entries(tokens).map(([currency, data]) => {
|
|
|
|
if (currency !== 'eth') {
|
|
|
|
tokenAddresses.push(data.tokenAddress)
|
2019-12-18 19:08:33 +03:00
|
|
|
currencyLookup[data.tokenAddress.toLowerCase()] = currency
|
2019-12-02 15:49:24 +03:00
|
|
|
}
|
|
|
|
})
|
|
|
|
return { tokenAddresses, currencyLookup }
|
|
|
|
}
|
|
|
|
|
|
|
|
function getMixers() {
|
|
|
|
return mixers[`netId${netId}`]
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = { isValidProof, isValidArgs, sleep, isKnownContract, isEnoughFee, getMixers, getMainnetTokens }
|