package blockchain import ( "ktogame/controller" "ktogame/models" "ktogame/util" "strconv" "github.com/astaxie/beego/logs" "github.com/go-xorm/xorm" ) func participate(engine *xorm.Engine, user, inviter, hash string, amount float64) error { var ui, dui models.UserInfo ok, err := engine.Id(inviter).Get(&dui) if err != nil { logs.Info(err) return err } if !ok { dui.Id = -1 dui.Direct = "" dui.Superiors = "-1" ui.Direct = "" } else { ui.Direct = inviter } logs.Info("inviter info:", dui.Id, dui.Direct, dui.Indirect, dui.Superiors) //insert new user info ui.Addr = user ui.Indirect = dui.Direct ui.Superiors = dui.Superiors + "," + strconv.FormatInt(dui.Id, 10) ui.ParticipateAmount = amount ui.State = 1 ui.CreateTime = util.NowTimeString() ui.Hash = hash logs.Info("user info:", ui.Direct, ui.Indirect, ui.Superiors) okk, err := engine.Id(ui.Addr).Get(&dui) if err != nil { logs.Info(err) return err } if okk { logs.Info("%v already participated!", ui.Addr) return nil } _, err = engine.Insert(&ui) if err != nil { logs.Info(err) return err } //insert new user Performance var uper models.Performance uper.Addr = user _, err = engine.Insert(&uper) if err != nil { return err } //update rewards pool err = controller.UpdateRewardsPool(engine, amount) if err != nil { logs.Info(err) return err } ///update Recommendation Rewards ///update direct recommend rewards(10%) rewards := amount * 10 / 100 if ui.Direct != "" { err := controller.UpdateAvailableRewards(rewards, ui.Direct, true, true) if err != nil { logs.Info(err) return err } } ///update indirect recommend rewards(10%) if ui.Indirect != "" { err := controller.UpdateAvailableRewards(rewards, ui.Indirect, true, false) if err != nil { logs.Info(err) return err } } //update all supers performance (15%) err = controller.UpdateSuperiorsPerformance(engine, ui.Superiors, amount) if err != nil { logs.Info(err) return err } //update Community Gift(50%) err = controller.UpdateCommunityGift(engine, amount, inviter) if err != nil { logs.Info(err) return err } //Update Community Nodes(5%) err = controller.UpdateCommunityNodes(engine, amount) if err != nil { logs.Info(err) return err } //update Market(10%) err = controller.UpdateMarket(engine, amount) if err != nil { logs.Info(err) return err } logs.Info("participate end") return nil } func checkClaim(engine *xorm.Engine, addr, hash string, height int64, amount float64, sign string) error { var tx models.ClaimedTxs ok, err := engine.Id(hash).Get(&tx) if err != nil { logs.Error(err) return err } if !ok { logs.Info("set new claim record,addr:%v,hash:%v", addr, hash) itx := models.ClaimedTxs{ Addr: addr, BlockHeight: height, Hash: hash, Signature: sign, Amount: amount, State: 1, Droped: 0, CreateTime: util.NowTimeString(), } _, err := engine.Insert(&itx) if err != nil { return err } return nil } logs.Info("update record========:", addr, hash) tx.State = 1 tx.BlockHeight = height _, err = engine.ID(hash).Cols("block_height,state").Update(&tx) if err != nil { return err } return nil }