123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- /* Import modules. */
- import {
- randomBytes,
- ripemd160,
- } from '@nexajs/crypto'
- import { decodeAddress } from '@nexajs/address'
- import {
- sha256,
- sha512,
- } from '@nexajs/crypto'
- import { entropyToMnemonic } from '@nexajs/hdnode'
- import moment from 'moment'
- import PouchDB from 'pouchdb'
- import { subscribeAddress } from '@nexajs/rostrum'
- import { v4 as uuidv4 } from 'uuid'
- import { binToHex } from '@nexajs/utils'
- import { Wallet } from '@nexajs/wallet'
- import hiLoHandler from './play/hi_lo.ts'
- /* Initialize databases. */
- const playsDb = new PouchDB(`http://${process.env.COUCHDB_USER}:${process.env.COUCHDB_PASSWORD}@127.0.0.1:5984/plays`)
- const logsDb = new PouchDB(`http://${process.env.COUCHDB_USER}:${process.env.COUCHDB_PASSWORD}@127.0.0.1:5984/logs`)
- const sleep = ms => new Promise(r => setTimeout(r, ms))
- export default defineEventHandler(async (event) => {
- /* Set (request) body. */
- const body = await readBody(event)
- /* Set player seed. */
- // FIXME WE MUST PERFORM PROPER DATA SANITIZATION!!!
- const playerSeed = body?.seed
- console.log('PLAYER SEED', playerSeed)
- // TODO Perform data validation for seed
- const treasuryAddress = process.env.TREASURY_ADDRESS
- console.log('TREASURY ADDRESS', treasuryAddress)
- /* Set vault mnemonic (from env). */
- const vaultMnemonic = process.env.MNEMONIC
- console.log('MNEMONIC', vaultMnemonic)
- /* Initialize wallet. */
- const vaultWallet = new Wallet(vaultMnemonic)
- console.log('WALLET', vaultWallet)
- /* Wait for wallet to initialize. */
- await sleep(100)
- /* Request (receiving) address. */
- const vaultAddress = vaultWallet.address
- // -------------------------------------------------------------------------
- const entropy = binToHex(randomBytes(32))
- /* Calculate mnemonic. */
- const mnemonic = entropyToMnemonic(entropy)
- /* Initialize wallet. */
- const wallet = new Wallet(mnemonic)
- /* Request (receiving) address. */
- const address = wallet.address
- /* Decode address. */
- const decoded = decodeAddress(address)
- /* Parse public key hash. */
- const pubKeyHash = binToHex(decoded.hash).slice(8)
- /* Create play id. */
- const _id = pubKeyHash
- /* Start monitoring address. */
- const cleanup = await subscribeAddress(address, hiLoHandler.bind(playerSeed))
- // console.log('CLEANUP', cleanup)
- /* Set creation date. */
- const createdAt = moment().valueOf()
- /* Set expiration date. */
- const expiresAt = moment().add(15, 'minutes').valueOf()
- /* Calculate db play. */
- const dbPlay = {
- _id,
- address,
- entropy,
- ...body,
- createdAt,
- expiresAt,
- }
- // console.log('DATABASE PLAY', dbPlay)
- /* Update plays db. */
- const response = await playsDb
- .put(dbPlay)
- .catch(err => console.error(err))
- // console.log('PLAY (api):', response)
- /* Calculate (server) key hash (for client). */
- const keyHash = sha512(sha512(entropy))
- const auth = {
- id: _id,
- //
- //
- //
- playerSeed,
- keyHash,
- }
- // TODO Calculate "authorization" hash
- const authHash = binToHex(ripemd160(sha256(JSON.stringify(auth)), 'binary'))
- /* Build play package. */
- const playPkg = {
- playid: _id,
- address,
- keyHash,
- authHash,
- createdAt,
- expiresAt,
- }
- /* Return package. */
- return playPkg
- })
|