package util import ( "context" "encoding/hex" "fmt" "github.com/astaxie/beego" "github.com/astaxie/beego/logs" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethclient" utilAddress "github.com/korthochain/korthochain/pkg/address" "github.com/korthochain/korthochain/pkg/block" pb "github.com/korthochain/korthochain/pkg/server/grpcserver/message" "github.com/korthochain/korthochain/pkg/transaction" "github.com/shopspring/decimal" "google.golang.org/grpc" "os" "server_fhl/dbUtil" "server_fhl/enums" "server_fhl/models" "strings" "time" ) var ktoClient pb.GreeterClient var conn *ethclient.Client var ktoRpc = beego.AppConfig.String("hostHttp_mit_kto") var ethRpc = beego.AppConfig.String("miner_eth") var IdWork *Snowflake var kx int64 func init(){ fmt.Println("a3") IdWork, _ = NewSnowflake(0) kc, err := grpc.Dial(ktoRpc,grpc.WithInsecure(),grpc.WithBlock()) if err!=nil { logs.Info(err) os.Exit(1) } ktoClient = pb.NewGreeterClient(kc) utilAddress.SetNetWork("mainnet") conn,err = ethclient.Dial(ethRpc) if err!= nil { fmt.Printf("Failed to connect to etherum client: %v\n",err) } go getNewBlock() go listenKto() go cheakWithdrawal() //go fenfa() } func listenKto(){ time.Sleep(time.Second*2) kxredis := dbUtil.GetValue(enums.USE_FHL_BLOCK,1) if kxredis.(int64)==0 { nb := dbUtil.GetValue(enums.MAX_FHL_BLOCK,1) kx = nb.(int64) }else{ kx = kxredis.(int64) } //kx =62203394 for { nb := dbUtil.GetValue(enums.MAX_FHL_BLOCK,1) fmt.Println("当前=",kx,"最新=",nb.(int64),"相差=",nb.(int64)-kx) if nb.(int64)0 || bindUser.Pid==-1{ user.Pid = bindUser.IdFlag user.RealPid = bindUser.IdFlag user.PidFlag = bindUser.PidFlag+","+fmt.Sprint(bindUser.IdFlag) }else{ user.Pid = bossUser.IdFlag user.RealPid = bindUser.IdFlag user.PidFlag = bossUser.PidFlag+","+fmt.Sprint(bossUser.IdFlag) } user.Msg = "暂无惩罚" user.BadTime =NowTimeString() user.CreateTime =NowTimeString() user.Amount,_ = da.Float64() user.Price,_= price.Float64() user.Block = block user.Hash = hash //-----------处理用户结束-------------- nt := time.Now().Unix() var sbbu,sbbo,sbpb,sbpbp models.SuccessBill //2.处理用户的直推 var isUp bool if bindUser.Pid!=-1 { te, _ := time.ParseInLocation("2006-01-02 15:04:05", bindUser.BadTime,time.Local) sbbu = models.SuccessBill{IdWork.Generate(),bindUser.Addr,0,1,0,"",addr,1,NowTimeString()} if bindUser.Level>0 && te.Unix()0 && te.Unix()0 && bossUser.TeamBoss<3 { bossUser.Level = bossUser.TeamBoss+1 } bossUser.TeamBoss = bossUser.TeamBoss+1 } } }else{ f,_:= da.Mul(decimal.NewFromFloat(0.3)).Float64() sbbo.Amount = f bossUser.UseAmount,_=decimal.NewFromFloat(bossUser.UseAmount).Add(decimal.NewFromFloat(f)).Float64() bossUser.Profit2,_ = decimal.NewFromFloat(bossUser.Profit2).Add(decimal.NewFromFloat(f)).Float64() } } //-----------处理上上级结束-------------- //4.处理原始上上级 if rb { var rpUser []models.UserAddr dbUtil.Engine.Where("real_pid=? and pid!=real_pid",bindUser.RealPid).Find(&rpUser) if realBossUser.RemovePeople == 2 { e1:= rpUser[0].RemovePeople e2:= rpUser[1].RemovePeople if bindUser.IdFlag==rpUser[0].IdFlag { e1 = e1+1 } if bindUser.IdFlag==rpUser[1].IdFlag { e2 = e2+1 } if e1+e2>1 && e1!=0 && e2!=0{ if e1>0 && e2>0 && (e1<2 || e2<2){ format := time.Now().AddDate(0, 0, 7).Format("2006-01-02 15:04:05") realBossUser.BadTime = format realBossUser.Msg = "当给上级boss转移的2位员工都成为BOSS时,您将永久解除惩罚" }else if e1>1 && e2>1{ realBossUser.BadTime = "2099-01-01 08:00:00" realBossUser.Msg = "您已永久解除惩罚" } } } } //-----------处理原始上上级结束-------------- //5.处理上上上级 if pbb { te, _ := time.ParseInLocation("2006-01-02 15:04:05", pbossUser.BadTime,time.Local) sbpb = models.SuccessBill{IdWork.Generate(),pbossUser.Addr,0,1,0,"",addr,3,NowTimeString()} if pbossUser.Pid!=-1{ if pbb { ru1:= da.Mul(decimal.NewFromFloat(0.04)) if pbossUser.Level>0 && te.Unix()0 && te.Unix()0 { suc = suc.Add(decimal.NewFromFloat(sbbu.Amount)) dbUtil.Engine.Insert(&sbbu) } if sbbo.Amount>0 { suc = suc.Add(decimal.NewFromFloat(sbbo.Amount)) dbUtil.Engine.Insert(&sbbo) } if sbpb.Amount>0 { suc = suc.Add(decimal.NewFromFloat(sbpb.Amount)) dbUtil.Engine.Insert(&sbpb) } if sbpbp.Amount>0 { suc = suc.Add(decimal.NewFromFloat(sbpbp.Amount)) dbUtil.Engine.Insert(&sbpbp) } sub := da.Sub(suc) com.Amount,_=decimal.NewFromFloat(com.Amount).Add(sub).Float64() dbUtil.Engine.ID(com.Id).Update(&com) } func Sign(amountStr,addr,timeStr string)string{ keccakA := crypto.Keccak256([]byte(amountStr),[]byte(enums.DIGIT)) keccakS := crypto.Keccak256(keccakA, []byte(timeStr),[]byte(addr)) return "0x"+hex.EncodeToString(keccakS) } //提币 func withdrawal(kx int64,hash,addr string,amount decimal.Decimal){ var ua models.UserAddr b, _ := dbUtil.Engine.Id(addr).Get(&ua) if !b { return } f,_:= amount.Float64() var wb models.WithdrawalBill bw, _ := dbUtil.Engine.Where("addr=? and status=0 and hash=?", addr, hash).Get(&wb) if !bw { bill := models.WithdrawalBill{IdWork.Generate(), addr, f, 1, kx,kx, hash, NowTimeString()} dbUtil.Engine.Insert(&bill) ua.UseAmount,_ = decimal.NewFromFloat(ua.UseAmount).Sub(amount).Float64() dbUtil.Engine.ID(ua.Addr).Cols("use_amount").Update(&ua) return } wb.Status = 1 wb.SucBlock = kx dbUtil.Engine.ID(wb.Id).Cols("status,suc_block").Update(&wb) } func cheakWithdrawal(){ for { h, _ := time.ParseDuration("-1200s") format := time.Now().AddDate(0, 0, 0).Add(h).Format("2006-01-02 15:04:05") var wb []models.WithdrawalBill dbUtil.Engine.Where("status=0 AND create_block