_gameplay.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. /* Import modules. */
  2. import moment from 'moment'
  3. import PouchDB from 'pouchdb'
  4. import { Wallet } from '@nexajs/wallet'
  5. /* Initialize databases. */
  6. const playsDb = new PouchDB(`http://${process.env.COUCHDB_USER}:${process.env.COUCHDB_PASSWORD}@127.0.0.1:5984/plays`)
  7. const walletDb = new PouchDB(`http://${process.env.COUCHDB_USER}:${process.env.COUCHDB_PASSWORD}@127.0.0.1:5984/wallet`)
  8. const GAME_ENGINE_FEE = 0.5 // as a percentage (eg. 1/2%)
  9. const TREASURY_ADDRESS = process.env.TREASURY_ADDRESS
  10. const VAULT_MNEMONIC = process.env.MNEMONIC
  11. /* Initialize wallet. */
  12. const vaultWallet = new Wallet(VAULT_MNEMONIC)
  13. // TODO Replace with @nexajs/utils
  14. const jsonStringify = (_data, _transform = true) => {
  15. let data
  16. data = JSON.stringify(_data, (key, value) =>
  17. typeof value === 'bigint' ? value.toString() + 'n' : value
  18. )
  19. if (!_transform) {
  20. data = JSON.parse(data)
  21. }
  22. return data
  23. }
  24. export default async (_game, _play, _sender) => {
  25. const receivers = []
  26. let address
  27. let take
  28. let rate
  29. let latestDb
  30. let updatedDb
  31. let response
  32. let satoshis
  33. let share
  34. latestDb = await playsDb
  35. .get(_play._id)
  36. .catch(err => console.err(err))
  37. // console.log('LATEST (play)', latestDb)
  38. updatedDb = {
  39. ...latestDb,
  40. txidem: 'INQUEUE',
  41. updatedAt: moment().valueOf(),
  42. updatedBy: 'GAMEPLAY',
  43. }
  44. // console.log('UPDATED (play)', updatedDb)
  45. response = await playsDb
  46. .put(updatedDb)
  47. .catch(err => console.error(err))
  48. // console.log('UPDATE (play) RESPONSE', response)
  49. if (_play.playerJoy === true) {
  50. /* Send Sender (total) winnings. */
  51. address = _sender.address
  52. satoshis = BigInt(parseInt(_play.satoshis * _play.payout))
  53. receivers.push({
  54. address,
  55. satoshis,
  56. })
  57. } else {
  58. /* Send player (DUST). */
  59. // NOTE: Blocking DUST transactions to prevent accidental "token" sends.
  60. address = _sender.address
  61. satoshis = BigInt(888) // GOOD LUCK!
  62. receivers.push({
  63. address,
  64. satoshis,
  65. })
  66. /* Send gamemakers (share) winnings. */
  67. address = TREASURY_ADDRESS
  68. rate = GAME_ENGINE_FEE / 100.0
  69. // console.log('GAME ENGINE RATE', rate)
  70. satoshis = BigInt(parseInt(_play.satoshis * rate))
  71. // console.log('GAME ENGINE SATS', satoshis)
  72. receivers.push({
  73. address,
  74. satoshis,
  75. })
  76. /* Send gamemakers (share) winnings. */
  77. address = _game.gamemakers.members[0]
  78. share = _game.gamemakers.share
  79. // console.log('GAMEMAKERS SHARE', share)
  80. rate = (100 - _game.rtp - GAME_ENGINE_FEE) / 100.0
  81. // console.log('HOUSE RATE', rate)
  82. take = (_play.satoshis * rate)
  83. // console.log('HOUSE TAKE', take)
  84. satoshis = BigInt(parseInt(take * (share * 0.01)))
  85. // console.log('GAMEMAKERS SATS', satoshis)
  86. receivers.push({
  87. address,
  88. satoshis,
  89. })
  90. /* Send promoters (share) winnings. */
  91. address = _game.promoters.members[0]
  92. share = _game.promoters.share
  93. // console.log('PROMOTERS SHARE', share)
  94. rate = (100 - _game.rtp - GAME_ENGINE_FEE) / 100.0
  95. // console.log('HOUSE RATE', rate)
  96. take = (_play.satoshis * rate)
  97. // console.log('HOUSE TAKE', take)
  98. satoshis = BigInt(parseInt(take * (share * 0.01)))
  99. // console.log('PROMOTERS SATS', satoshis)
  100. receivers.push({
  101. address,
  102. satoshis,
  103. })
  104. }
  105. const walletPkg = {
  106. _id: _play._id,
  107. entropy: _play.entropy,
  108. unspent: _play.unspent,
  109. receivers: jsonStringify(receivers, false),
  110. txidem: null,
  111. createdAt: moment().valueOf(),
  112. }
  113. response = await walletDb
  114. .put(walletPkg)
  115. .catch(err => console.error(err))
  116. // console.log('RESPONSE (wallet):', response)
  117. return response
  118. }