contract.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. package blockchain
  2. import (
  3. "errors"
  4. "ktogame/controller"
  5. "ktogame/dbUtil"
  6. "ktogame/models"
  7. "ktogame/util"
  8. "strconv"
  9. "github.com/astaxie/beego/logs"
  10. "github.com/go-xorm/xorm"
  11. )
  12. func participate(user, inviter, hash string, amount float64) error {
  13. logs.Info("into participate=====")
  14. sesion := dbUtil.Engine.NewSession()
  15. var Error error
  16. defer func() {
  17. if Error != nil {
  18. sesion.Rollback()
  19. } else {
  20. sesion.Commit()
  21. logs.Info("participate end=====")
  22. }
  23. }()
  24. var ui, dui models.UserInfo
  25. ok, Error := sesion.ID(inviter).Get(&dui)
  26. if Error != nil {
  27. logs.Info(Error)
  28. return Error
  29. }
  30. if !ok {
  31. dui.Id = -1
  32. dui.Direct = ""
  33. dui.Superiors = "-1"
  34. ui.Direct = ""
  35. } else {
  36. ui.Direct = inviter
  37. }
  38. logs.Info("inviter info:", dui.Id, dui.Direct, dui.Indirect, dui.Superiors)
  39. //insert new user info
  40. ui.Addr = user
  41. ui.Indirect = dui.Direct
  42. ui.Superiors = dui.Superiors + "," + strconv.FormatInt(dui.Id, 10)
  43. ui.ParticipateAmount = amount
  44. ui.State = 1
  45. ui.CreateTime = util.NowTimeString()
  46. ui.Hash = hash
  47. logs.Info("user info:", ui.Direct, ui.Indirect, ui.Superiors)
  48. okk, Error := sesion.ID(ui.Addr).Get(&dui)
  49. if Error != nil {
  50. logs.Info(Error)
  51. return Error
  52. }
  53. if okk {
  54. Error = errors.New("user already participated")
  55. logs.Info("%v already participated!", ui.Addr)
  56. return nil
  57. }
  58. _, Error = sesion.Insert(&ui)
  59. if Error != nil {
  60. logs.Info(Error)
  61. return Error
  62. }
  63. //insert new user Performance
  64. var uper models.Performance
  65. uper.Addr = user
  66. _, Error = sesion.Insert(&uper)
  67. if Error != nil {
  68. return Error
  69. }
  70. //update rewards pool
  71. Error = controller.UpdateRewardsPool(sesion, amount)
  72. if Error != nil {
  73. logs.Info(Error)
  74. return Error
  75. }
  76. ///update Recommendation Rewards
  77. ///update direct recommend rewards(10%)
  78. rewards := amount * 10 / 100
  79. if ui.Direct != "" {
  80. Error = controller.UpdateAvailableRewards(sesion, rewards, ui.Direct, true, true)
  81. if Error != nil {
  82. logs.Info(Error)
  83. return Error
  84. }
  85. }
  86. ///update indirect recommend rewards(10%)
  87. if ui.Indirect != "" {
  88. Error = controller.UpdateAvailableRewards(sesion, rewards, ui.Indirect, true, false)
  89. if Error != nil {
  90. logs.Info(Error)
  91. return Error
  92. }
  93. }
  94. //update all supers performance (15%)
  95. Error = controller.UpdateSuperiorsPerformance(sesion, ui.Superiors, amount)
  96. if Error != nil {
  97. logs.Info(Error)
  98. return Error
  99. }
  100. //update Community Gift(50%)
  101. Error = controller.UpdateCommunityGift(sesion, amount, inviter)
  102. if Error != nil {
  103. logs.Info(Error)
  104. return Error
  105. }
  106. //Update Community Nodes(5%)
  107. Error = controller.UpdateCommunityNodes(sesion, amount)
  108. if Error != nil {
  109. logs.Info(Error)
  110. return Error
  111. }
  112. //update Market(10%)
  113. Error = controller.UpdateMarket(sesion, amount)
  114. if Error != nil {
  115. logs.Info(Error)
  116. return Error
  117. }
  118. return nil
  119. }
  120. func checkClaim(engine *xorm.Engine, addr, hash string, height int64, amount float64, sign string) error {
  121. var tx models.ClaimedTxs
  122. ok, err := engine.Id(hash).Get(&tx)
  123. if err != nil {
  124. logs.Error(err)
  125. return err
  126. }
  127. if !ok {
  128. logs.Info("set new claim record,addr:%v,hash:%v", addr, hash)
  129. itx := models.ClaimedTxs{
  130. Addr: addr,
  131. BlockHeight: height,
  132. Hash: hash,
  133. Signature: sign,
  134. Amount: amount,
  135. State: 1,
  136. Droped: 0,
  137. CreateTime: util.NowTimeString(),
  138. }
  139. _, err := engine.Insert(&itx)
  140. if err != nil {
  141. return err
  142. }
  143. return nil
  144. }
  145. logs.Info("update record========:", addr, hash)
  146. tx.State = 1
  147. tx.BlockHeight = height
  148. _, err = engine.ID(hash).Cols("block_height,state").Update(&tx)
  149. if err != nil {
  150. return err
  151. }
  152. return nil
  153. }