contract.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  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. ui.BackNum = 0
  48. logs.Info("user info:", ui.Direct, ui.Indirect, ui.Superiors)
  49. okk, Error := sesion.ID(ui.Addr).Get(&dui)
  50. if Error != nil {
  51. logs.Info(Error)
  52. return Error
  53. }
  54. if okk {
  55. Error = errors.New("user already participated")
  56. logs.Info("%v already participated!", ui.Addr)
  57. return nil
  58. }
  59. _, Error = sesion.Insert(&ui)
  60. if Error != nil {
  61. logs.Info(Error)
  62. return Error
  63. }
  64. {
  65. var newUser models.UserInfo
  66. ok, Error := sesion.ID(ui.Addr).Get(&newUser)
  67. if Error != nil {
  68. logs.Info(Error)
  69. return Error
  70. }
  71. if !ok {
  72. Error = errors.New("new user not exist")
  73. return Error
  74. }
  75. var backUsers string
  76. backUsers = strconv.FormatInt(newUser.Id, 10)
  77. for id := 11; id <= 25; id++ {
  78. backUsers = backUsers + "," + strconv.FormatInt(newUser.Id+int64(id), 10)
  79. }
  80. newUser.BackUsers = backUsers
  81. _, Error = sesion.ID(newUser.Addr).Cols("back_users").Update(&newUser)
  82. if Error != nil {
  83. logs.Info(Error)
  84. return Error
  85. }
  86. }
  87. //insert new user Performance
  88. var uper models.Performance
  89. uper.Addr = user
  90. _, Error = sesion.Insert(&uper)
  91. if Error != nil {
  92. return Error
  93. }
  94. //update rewards pool
  95. Error = controller.UpdateRewardsPool(sesion, amount)
  96. if Error != nil {
  97. logs.Info(Error)
  98. return Error
  99. }
  100. ///update Recommendation Rewards
  101. ///update direct recommend rewards(10%)
  102. rewards := amount * 10 / 100
  103. if ui.Direct != "" {
  104. Error = controller.UpdateAvailableRewards(sesion, rewards, ui.Direct, true, true)
  105. if Error != nil {
  106. logs.Info(Error)
  107. return Error
  108. }
  109. }
  110. ///update indirect recommend rewards(10%)
  111. if ui.Indirect != "" {
  112. Error = controller.UpdateAvailableRewards(sesion, rewards, ui.Indirect, true, false)
  113. if Error != nil {
  114. logs.Info(Error)
  115. return Error
  116. }
  117. }
  118. //update all supers performance (15%)
  119. Error = controller.UpdateSuperiorsPerformance(sesion, ui.Superiors, amount)
  120. if Error != nil {
  121. logs.Info(Error)
  122. return Error
  123. }
  124. //update Community Gift(50%)
  125. Error = controller.UpdateCommunityGift(sesion, amount, inviter)
  126. if Error != nil {
  127. logs.Info(Error)
  128. return Error
  129. }
  130. //Update Community Nodes(5%)
  131. Error = controller.UpdateCommunityNodes(sesion, amount)
  132. if Error != nil {
  133. logs.Info(Error)
  134. return Error
  135. }
  136. //update Market(10%) tuan dui fu dao
  137. Error = controller.UpdateMarket(sesion, amount)
  138. if Error != nil {
  139. logs.Info(Error)
  140. return Error
  141. }
  142. return nil
  143. }
  144. func checkClaim(engine *xorm.Engine, addr, hash string, height int64, amount float64, sign string) error {
  145. var tx models.ClaimedTxs
  146. ok, err := engine.Id(hash).Get(&tx)
  147. if err != nil {
  148. logs.Error(err)
  149. return err
  150. }
  151. if !ok {
  152. logs.Info("set new claim record,addr:%v,hash:%v", addr, hash)
  153. itx := models.ClaimedTxs{
  154. Addr: addr,
  155. BlockHeight: height,
  156. Hash: hash,
  157. Signature: sign,
  158. Amount: amount,
  159. State: 1,
  160. Droped: 0,
  161. CreateTime: util.NowTimeString(),
  162. }
  163. _, err := engine.Insert(&itx)
  164. if err != nil {
  165. return err
  166. }
  167. return nil
  168. }
  169. logs.Info("update record========:", addr, hash)
  170. tx.State = 1
  171. tx.BlockHeight = height
  172. _, err = engine.ID(hash).Cols("block_height,state").Update(&tx)
  173. if err != nil {
  174. return err
  175. }
  176. return nil
  177. }