From 41d82a8651fe47420fef8db5d527b704dd256978 Mon Sep 17 00:00:00 2001 From: Sam Vitello Date: Tue, 28 May 2019 15:14:27 -0600 Subject: [PATCH] fix: be able to use test and main nets for justifications --- serverless.yml | 6 ++-- src/court/justifications.js | 59 ++++++++++++++++++++++++++++++++----- 2 files changed, 55 insertions(+), 10 deletions(-) diff --git a/serverless.yml b/serverless.yml index 680e938..e3dbac5 100644 --- a/serverless.yml +++ b/serverless.yml @@ -278,8 +278,10 @@ functions: events: - { http: { path: justifications, method: put, cors: true } } environment: - INFURA_URL: '${self:custom.kmsSecrets.secrets.${self:custom.environments.${self:provider.stage}}_INFURA_URL}' - KLEROS_LIQUID_ADDRESS: '${self:custom.kmsSecrets.secrets.${self:custom.environments.${self:provider.stage}}_KLEROS_LIQUID_ADDRESS}' + INFURA_URL_KOVAN: '${self:custom.kmsSecrets.secrets.STAGING_INFURA_URL}' + INFURA_URL_MAINNET: '${self:custom.kmsSecrets.secrets.PRODUCTION_INFURA_URL}' + KLEROS_LIQUID_ADDRESS_KOVAN: '${self:custom.kmsSecrets.secrets.STAGING_KLEROS_LIQUID_ADDRESS}' + KLEROS_LIQUID_ADDRESS_MAINNET: '${self:custom.kmsSecrets.secrets.PRODUCTION_KLEROS_LIQUID_ADDRESS}' iamRoleStatementsName: 'putJustifications-${self:provider.stage}-lambda-role' iamRoleStatements: - { diff --git a/src/court/justifications.js b/src/court/justifications.js index 8f2b363..8927def 100644 --- a/src/court/justifications.js +++ b/src/court/justifications.js @@ -1,4 +1,6 @@ -const _web3 = require('../utils/web3') +const Web3 = require('web3') + +const getEnvVars = require('../utils/get-env-vars') const KlerosLiquid = require('../assets/contracts/KlerosLiquid.json') const dynamoDB = require('../utils/dynamo-db') @@ -25,15 +27,51 @@ module.exports.get = async (event, _context, callback) => { } module.exports.put = async (event, _context, callback) => { - // Initialize web3 and contracts - const web3 = await _web3() - const klerosLiquid = new web3.eth.Contract( - KlerosLiquid.abi, - process.env.KLEROS_LIQUID_ADDRESS - ) - // Validate signature const payload = JSON.parse(event.body).payload + + if (!payload.network) + return callback(null, { + statusCode: 403, + headers: { 'Access-Control-Allow-Origin': '*' }, + body: JSON.stringify({ + error: + "Network not specified" + }) + }) + + let klerosLiquidAddress + let web3Uri + switch (payload.network) { + case 'mainnet': + const { + INFURA_URL_MAINNET + } = await getEnvVars(['INFURA_URL_MAINNET']) + klerosLiquidAddress = process.env.KLEROS_LIQUID_ADDRESS_MAINNET + web3Uri = INFURA_URL_MAINNET + break + case 'kovan': + const { + INFURA_URL_KOVAN + } = await getEnvVars([ + 'INFURA_URL_KOVAN' + ]) + klerosLiquidAddress = process.env.KLEROS_LIQUID_ADDRESS_KOVAN + web3Uri = INFURA_URL_KOVAN + break; + default: + return callback(null, { + statusCode: 403, + headers: { 'Access-Control-Allow-Origin': '*' }, + body: JSON.stringify({ + error: + `No Kleros Liquid address found for network ${payload.network}` + }) + }) + } + + const web3 = new Web3(new Web3.providers.HttpProvider(web3Uri)) + try { if ( (await web3.eth.accounts.recover( @@ -61,6 +99,11 @@ module.exports.put = async (event, _context, callback) => { }) } + const klerosLiquid = new web3.eth.Contract( + KlerosLiquid.abi, + klerosLiquidAddress + ) + // Verify votes belong to user for (const voteID of payload.justification.voteIDs) { const vote = await klerosLiquid.methods