Skip to content

Commit b339b13

Browse files
committed
feat(token-sale): locales and begining of unsubscribe
1 parent 9b7dd87 commit b339b13

File tree

8 files changed

+1796
-174
lines changed

8 files changed

+1796
-174
lines changed

kms-secrets.us-east-2.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
secrets:
22
STAGING_INFURA_URL: AQICAHhGgAvqeSMcTOp7YDYdu8nxhCZ9sP3Pe3A4o55JsQLjZQH9ef886xSGwCkOVOqZXEflAAAAizCBiAYJKoZIhvcNAQcGoHsweQIBADB0BgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDLmDi148/wofuMLZfgIBEIBH/avGPWRsCg8+SOHctvUs1oG/vDRbtqg0eXOO4JSfQpIL17MGm2TvA3A916WGI1jZLyumxLxAZSAqRpcm5MHYhZkYZbRH9HI=
33
PRODUCTION_INFURA_URL: AQICAHhGgAvqeSMcTOp7YDYdu8nxhCZ9sP3Pe3A4o55JsQLjZQGtRxJO1I4ll5do7xSgQRlXAAAAjTCBigYJKoZIhvcNAQcGoH0wewIBADB2BgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDGEx9BRbqOVUdlAHJAIBEIBJXSXRCLwOTP86qdELUyZy2j+B8njcZV+IdBUjZxuduULh2dLzXSyL1fsQmtzxjpjRgwOZ28wI4Z0asmFLAttbBu5XRcJc4lDRGA==
4+
ENTROPY: AQICAHhGgAvqeSMcTOp7YDYdu8nxhCZ9sP3Pe3A4o55JsQLjZQGQSkjVNLZC528fa4nZnED+AAAAdjB0BgkqhkiG9w0BBwagZzBlAgEAMGAGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMJxF+4vAVYDOoNKc8AgEQgDPnGbrenflh1UUs/SwyQPD7Jxbf+MEQjEdppwY0nt8ROUazArparZ+p5Re9kgxrXZVNSOY=
45
STAGING_ARBITRABLE_PERMISSION_LIST_ADDRESS: '0xbefd40cd43072694555b5ec77120ce4a3a65a5d6'
56
PRODUCTION_ARBITRABLE_PERMISSION_LIST_ADDRESS: '0xb7faddf3ecd2402a7e48cea6d2637d90eeb5a7e6'
67
STAGING_ARBITRABLE_PERMISSION_LIST_BLOCK_BLOCK_NUMBER: '8784036'
78
PRODUCTION_ARBITRABLE_PERMISSION_LIST_BLOCK_BLOCK_NUMBER: '6361634'
89
STAGING_KLEROS_LIQUID_ADDRESS: '0x60b2abfdfad9c0873242f59f2a8c32a3cc682f80'
910
PRODUCTION_KLEROS_LIQUID_ADDRESS: '0x988b3a538b618c7a603e1c11ab82cd16dbe28069'
11+
STAGING_TOKEN_SALE_CONTRACT_ADDRESS: '0xC74348B7c4D9f25C26591a40AA2b712bC38F4f14'
12+
PRODUCTION_TOKEN_SALE_CONTRACT_ADDRESS: '0x5EdF42Ce9DA28d0B1790C6093103526e3bb88eF3'
1013
keyArn: 'arn:aws:kms:us-east-2:547511976516:key/bca002a4-c1d9-40e3-a251-6ccea1ce02f0'

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"commitmsg": "kleros-scripts commitmsg",
1414
"cz": "kleros-scripts cz",
1515
"invoke": "env-cmd ./.env serverless invoke -l -f",
16-
"build": "docker run --rm -v $PWD:/data -w /data node:8 npm rebuild scrypt",
16+
"build": "docker run --rm -v $PWD:/data -w /data node:10 npm rebuild scrypt",
1717
"deploy:function": "env-cmd ./.env serverless deploy function -f",
1818
"deploy:staging": "env-cmd ./.env serverless deploy",
1919
"deploy": "env-cmd ./.env serverless deploy -s production"
@@ -36,6 +36,6 @@
3636
"aws-sdk": "^2.266.1",
3737
"data-uri-to-buffer": "^2.0.0",
3838
"image-size": "^0.6.3",
39-
"web3": "^1.0.0-beta.34"
39+
"web3": "^1.2.4"
4040
}
4141
}

serverless.yml

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
service: kleros-microservices
22
provider:
33
name: aws
4-
runtime: nodejs8.10
4+
runtime: nodejs10.x
55
stage: '${opt:stage, self:custom.defaultStage}'
66
region: us-east-2
77
package:
@@ -319,3 +319,63 @@ functions:
319319
responseModels: { application/json: ErrorResponse },
320320
},
321321
]
322+
putTokenSaleOrder:
323+
handler: src/token-sale/locales.put
324+
events:
325+
- { http: { path: token-sale, method: put, cors: true } }
326+
environment:
327+
INFURA_URL: '${self:custom.kmsSecrets.secrets.${self:custom.environments.${self:provider.stage}}_INFURA_URL}'
328+
INFURA_URL_KOVAN: '${self:custom.kmsSecrets.secrets.STAGING_INFURA_URL}'
329+
INFURA_URL_MAINNET: '${self:custom.kmsSecrets.secrets.PRODUCTION_INFURA_URL}'
330+
TOKEN_SALE_CONTRACT_ADDRESS_KOVAN: '${self:custom.kmsSecrets.secrets.STAGING_TOKEN_SALE_CONTRACT_ADDRESS}'
331+
TOKEN_SALE_CONTRACT_ADDRESS: '${self:custom.kmsSecrets.secrets.PRODUCTION_TOKEN_SALE_CONTRACT_ADDRESS}'
332+
iamRoleStatementsName: 'putTokenSaleOrder-${self:provider.stage}-lambda-role'
333+
iamRoleStatements:
334+
- {
335+
Effect: Allow,
336+
Action: ['KMS:Decrypt'],
337+
Resource: '${self:custom.kmsSecrets.keyArn}',
338+
}
339+
- {
340+
Effect: Allow,
341+
Action: ['dynamodb:GetItem'],
342+
Resource: 'arn:aws:dynamodb:us-east-2:547511976516:table/token-sale-locales-kovan',
343+
}
344+
- {
345+
Effect: Allow,
346+
Action: ['dynamodb:GetItem'],
347+
Resource: 'arn:aws:dynamodb:us-east-2:547511976516:table/token-sale-locales',
348+
}
349+
- {
350+
Effect: Allow,
351+
Action: ['dynamodb:PutItem'],
352+
Resource: 'arn:aws:dynamodb:us-east-2:547511976516:table/token-sale-locales-kovan',
353+
}
354+
- {
355+
Effect: Allow,
356+
Action: ['dynamodb:PutItem'],
357+
Resource: 'arn:aws:dynamodb:us-east-2:547511976516:table/token-sale-locales',
358+
}
359+
postUnsubscribe:
360+
handler: src/global/unsubscribe
361+
events:
362+
- { http: { path: unsubscribe, method: post, cors: true } }
363+
environment:
364+
ENTROPY: '${self:custom.kmsSecrets.secrets.ENTROPY}'
365+
iamRoleStatementsName: 'postUnsubscribe-${self:provider.stage}-lambda-role'
366+
iamRoleStatements:
367+
- {
368+
Effect: Allow,
369+
Action: ['KMS:Decrypt'],
370+
Resource: '${self:custom.kmsSecrets.keyArn}',
371+
}
372+
- {
373+
Effect: Allow,
374+
Action: ['dynamodb:GetItem'],
375+
Resource: 'arn:aws:dynamodb:us-east-2:547511976516:table/user-settings',
376+
}
377+
- {
378+
Effect: Allow,
379+
Action: ['dynamodb:PutItem'],
380+
Resource: 'arn:aws:dynamodb:us-east-2:547511976516:table/user-settings',
381+
}

src/global/unsubscribe.js

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
const _web3 = require('../utils/web3')
2+
const dynamoDB = require('../utils/dynamo-db')
3+
const getEnvVars = require('../get-env-vars')
4+
const whitelist = require('../utils/whitelist')
5+
6+
module.exports.post = async (event, _context, callback) => {
7+
// Initialize web3
8+
const web3 = await _web3()
9+
10+
// Validate signature
11+
const payload = JSON.parse(event.body).payload
12+
try {
13+
const account = await web3.eth.accounts.recover(
14+
JSON.stringify(payload.email),
15+
payload.signature
16+
)
17+
const { ENTROPY } = await getEnvVars(['ENTROPY'])
18+
const lambdaAccount = web3.eth.accounts.create(ENTROPY)
19+
if (
20+
account !== lambdaAccount.address
21+
)
22+
throw new Error('Signature does not match for this email address. Email contact.kleros.io.')
23+
} catch (err) {
24+
console.error(err)
25+
return callback(null, {
26+
statusCode: 403,
27+
headers: { 'Access-Control-Allow-Origin': '*' },
28+
body: JSON.stringify({
29+
error: 'Signature does not match for this email address. Email contact.kleros.io.'
30+
})
31+
})
32+
}
33+
34+
// Update settings for DApp
35+
const updateKeys = whitelist.filter(k => {
36+
if (payload.dapp)
37+
return k.includes(payload.dapp)
38+
return false
39+
})
40+
await dynamoDB.updateItem({
41+
Key: { address: { S: payload.address } },
42+
TableName: 'user-settings',
43+
UpdateExpression: `SET ${updateKeys
44+
.map(k => `${k} = :_${k}`)
45+
.join(', ')}`,
46+
ExpressionAttributeValues: updateKeys.reduce((acc, k) => {
47+
acc[`:_${k}`] = false
48+
return acc
49+
}, {})
50+
})
51+
52+
callback(null, {
53+
statusCode: 200,
54+
headers: { 'Access-Control-Allow-Origin': '*' },
55+
body: JSON.stringify({
56+
payload: `Unsubscribed from Kleros ${payload.dapp} notifications.`
57+
})
58+
})
59+
}

src/token-sale/locales.js

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
const { promisify } = require('util')
2+
3+
const AWS = require('aws-sdk')
4+
5+
const _web3 = require('../utils/web3')
6+
const dynamoDB = require('../utils/dynamo-db')
7+
const getEnvVars = require('../utils/get-env-vars')
8+
9+
module.exports.put = async (event, _context, callback) => {
10+
// Initialize web3 and contract
11+
12+
// Check that the image has been added to the contract
13+
const body = JSON.parse(event.body)
14+
const transactionHash = body.txHash
15+
const country = body.country
16+
const ip = body.ip
17+
18+
if (!transactionHash)
19+
return callback(null, {
20+
statusCode: 403,
21+
headers: { 'Access-Control-Allow-Origin': '*' },
22+
body: JSON.stringify({
23+
error: 'Invalid transaction'
24+
})
25+
})
26+
27+
const web3 = await _web3()
28+
let transaction = await web3.eth.getTransaction(transactionHash)
29+
let verified = false
30+
// If node hasn't gotten tx yet we cannot verify it. Add to db with unverified flag so we can do later dilligence on it if necessary
31+
if (transaction) {
32+
const contract_var = body.network ? `TOKEN_SALE_CONTRACT_ADDRESS_${body.network.toUpperCase()}` : `TOKEN_SALE_CONTRACT_ADDRESS`
33+
34+
if (transaction.to !== process.env[contract_var]) {
35+
return callback(null, {
36+
statusCode: 403,
37+
headers: { 'Access-Control-Allow-Origin': '*' },
38+
body: JSON.stringify({
39+
error: 'Invalid transaction'
40+
})
41+
})
42+
}
43+
44+
if (transaction.value === '0') {
45+
return callback(null, {
46+
statusCode: 403,
47+
headers: { 'Access-Control-Allow-Origin': '*' },
48+
body: JSON.stringify({
49+
error: 'Invalid transaction'
50+
})
51+
})
52+
}
53+
verified = true
54+
}
55+
56+
// Save tx and country
57+
await dynamoDB.putItem({
58+
Item: {
59+
transactionHash: {
60+
S: `${transactionHash}`
61+
},
62+
country: {
63+
S: `${country}`
64+
},
65+
ip: {
66+
S: `${ip}`
67+
},
68+
verified: {
69+
BOOL: verified
70+
}
71+
},
72+
TableName: `${body.network ? `token-sale-locales-${body.network}` : 'token-sale-locales'}`
73+
})
74+
75+
// Return image URL
76+
callback(null, {
77+
statusCode: 200,
78+
headers: { 'Access-Control-Allow-Origin': '*' }
79+
})
80+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
{
2+
"post": {
3+
"request": {
4+
"type": "object",
5+
"properties": {
6+
"payload": {
7+
"type": "object",
8+
"properties": {
9+
"imageFileDataURL": {
10+
"type": "string",
11+
"description": "The base64 encoded image data URL."
12+
}
13+
}
14+
}
15+
}
16+
},
17+
"response": {
18+
"type": "object",
19+
"properties": {
20+
"payload": {
21+
"type": "object",
22+
"properties": {
23+
"imageURL": {
24+
"type": "string",
25+
"description": "The uploaded image's URL."
26+
}
27+
}
28+
}
29+
}
30+
}
31+
}
32+
}

src/utils/whitelist.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
const whitelist = [
2+
'email',
3+
'dogecoinAddress',
4+
'fullName',
5+
'phone',
6+
'derivedAccountAddress',
7+
'courtNotificationSettingAppeal',
8+
'courtNotificationSettingDraw',
9+
'courtNotificationSettingLose',
10+
'courtNotificationSettingWin',
11+
'centralizedArbitratorDashboardNotificationSettingDisputes',
12+
'centralizedArbitratorDashboardNotificationSettingEvidence',
13+
't2crNotificationSettingDispute',
14+
't2crNotificationSettingRulingGiven',
15+
'escrowNotificationSettingDispute',
16+
'escrowNotificationSettingAppeal',
17+
'escrowNotificationSettingRulingGiven'
18+
]
19+
20+
const emailWhitelist = [
21+
22+
]
23+
24+
export default whitelist

0 commit comments

Comments
 (0)