2022-01-13 16:50:07 +01:00

60 lines
1.7 KiB
JavaScript

const { db } = require( '../modules/firebase' )
// Web3 APIs
const Web3 = require( 'web3' )
const web3 = new Web3()
/* ///////////////////////////////
// POST handler for notifier signup
// /////////////////////////////*/
exports.subscribe_address_to_notifications = async function( req, res ) {
// Parse the request
let { address } = req.params
if( !address ) return res.json( { error: `No address specified in URL` } )
// Protect against malformed input
if( !address.match( /0x.{40}/ ) ) return res.json( { error: `Malformed request` } )
// Lowercase the address
address = address.toLowerCase()
try {
// Get request data
const { message, signature, signatory } = req.body
if( !message || !signatory || !signature ) throw new Error( `Malformed request` )
// Decode message
const confirmedSignatory = web3.eth.accounts.recover( message, signature )
if( signatory.toLowerCase() !== confirmedSignatory.toLowerCase() ) throw new Error( `Bad signature` )
// Validate message
const messageObject = JSON.parse( message )
let { signer, discord_handle, chainId } = messageObject
const network = chainId == '0x1' ? 'mainnet' : 'rinkeby'
if( signer.toLowerCase() !== confirmedSignatory.toLowerCase() || !discord_handle || !network ) {
throw new Error( `Invalid subscribeToAddress message with ${ signer }, ${confirmedSignatory}, ${discord_handle}, ${chainId}, ${network}` )
}
await db.collection( `${network}Notifications` ).doc( address ).set( {
discord_handle
} )
return res.json( {
success: true
} )
} catch( e ) {
// Log error for debugging
console.error( `POST subscribeToAddress ${ address }: `, e )
// Return error to frontend
return res.json( { error: e.mesage || e.toString() } )
}
}