123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468 |
- package util
- import (
- "context"
- "encoding/hex"
- "fmt"
- "ktogame/dbUtil"
- "ktogame/enums"
- "ktogame/models"
- "os"
- "strings"
- "time"
- "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"
- )
- 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) < kx+1 {
- time.Sleep(time.Second * 10)
- continue
- }
- func() {
- reqBlock := new(pb.ReqBlockByNumber)
- reqBlock.Height = uint64(kx)
- bl, err := ktoClient.GetBlockByNum(context.Background(), reqBlock)
- if err != nil || bl.Code != 0 {
- fmt.Println("获取交易block错误=", err)
- time.Sleep(time.Second * 5)
- return
- }
- blc, errs := block.Deserialize(bl.Data)
- if errs != nil {
- time.Sleep(time.Second * 5)
- fmt.Println("获取交易blc错误=", errs)
- }
- for _, v := range blc.Transactions {
- evm, errLog := transaction.DecodeEvmData(v.Input)
- if errLog != nil {
- continue
- }
- if len(evm.Logs) != 1 {
- continue
- }
- for _, l := range evm.Logs {
- th := l.Topics[0].Hex()
- method := dbUtil.TopsMap[th]
- addr := l.Address.String()
- if method == enums.NEWDEPOSIT && addr == enums.USDTMINTCONTRACT {
- var ev models.Ihot
- abi, err := abi.JSON(strings.NewReader(FhlMetaData.ABI))
- if err != nil {
- logs.Error("abi err1=", err)
- }
- err = abi.UnpackIntoInterface(&ev, method, l.Data)
- if err != nil {
- logs.Error("abi err2=", err)
- }
- fmt.Printf("data=%+v\n ", ev)
- usdrido(ev.User.String(), ev.Referrer.String(), v.HashToString(), decimal.NewFromBigInt(ev.Amount, -11), decimal.NewFromBigInt(ev.Price, -18), kx)
- } else if method == enums.WITHDRAWAL && addr == enums.WITHDRAWCONTRACT {
- var ev models.Withdraw
- abi, err := abi.JSON(strings.NewReader(FhlMetaData.ABI))
- if err != nil {
- logs.Error("abi err1=", err)
- }
- err = abi.UnpackIntoInterface(&ev, method, l.Data)
- if err != nil {
- logs.Error("abi err2=", err)
- }
- fmt.Printf("data=%+v\n ", ev)
- withdrawal(kx, "0x"+v.HashToString(), ev.User.String(), decimal.NewFromBigInt(ev.Amount, -18))
- }
- }
- }
- }()
- kx++
- dbUtil.SetValue(enums.USE_FHL_BLOCK, kx)
- continue
- //return
- }
- }
- func getNewBlock() {
- for {
- number := new(pb.ReqMaxBlockHeight)
- num, err := ktoClient.GetMaxBlockHeight(context.Background(), number)
- if err != nil {
- logs.Info("断开重连2", err)
- time.Sleep(time.Second * 10)
- continue
- } else {
- dbUtil.SetValue(enums.MAX_FHL_BLOCK, int64(num.MaxHeight))
- }
- time.Sleep(time.Second * 10)
- }
- }
- func usdrido(addr, bindAddr, hash string, da, price decimal.Decimal, block int64) {
- fmt.Println("==进来==", addr)
- //当前用户
- var user models.UserAddr
- //上级
- var bindUser models.UserAddr
- dbUtil.Engine.Id(bindAddr).Get(&bindUser)
- //上上级
- var bossUser models.UserAddr
- bb, _ := dbUtil.Engine.Where("id_flag=?", bindUser.Pid).Get(&bossUser)
- //原始上上级
- var realBossUser models.UserAddr
- var rb bool
- if bindUser.Pid != bindUser.RealPid {
- rb, _ = dbUtil.Engine.Where("id_flag=?", bindUser.RealPid).Get(&realBossUser)
- }
- //上上上级
- var pbossUser models.UserAddr
- pbb, _ := dbUtil.Engine.Where("id_flag=?", bossUser.Pid).Get(&pbossUser)
- //上上上上级
- var ppbossUser models.UserAddr
- ppbb, _ := dbUtil.Engine.Where("id_flag=?", pbossUser.Pid).Get(&ppbossUser)
- var com models.CommonInfo
- dbUtil.Engine.Get(&com)
- //1.处理用户
- var msxSort models.UserAddr
- dbUtil.Engine.Desc("id_flag").Get(&msxSort) //最大序号
- user.Addr = addr
- user.IdFlag = msxSort.IdFlag + 1
- //上级是boss,不转移
- if bindUser.Level > 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() < nt { //在处罚中
- sbbu.Amount, _ = da.Mul(decimal.NewFromFloat(0.3)).Float64()
- bindUser.AmountLv, _ = decimal.NewFromFloat(bindUser.AmountLv).Add(decimal.NewFromFloat(0.3)).Float64()
- } else {
- sbbu.Amount, _ = da.Mul(decimal.NewFromFloat(0.5)).Float64()
- bindUser.AmountLv, _ = decimal.NewFromFloat(bindUser.AmountLv).Add(decimal.NewFromFloat(0.5)).Float64()
- }
- bindUser.UseAmount, _ = decimal.NewFromFloat(bindUser.UseAmount).Add(decimal.NewFromFloat(sbbu.Amount)).Float64()
- bindUser.Profit1, _ = decimal.NewFromFloat(bindUser.Profit1).Add(decimal.NewFromFloat(sbbu.Amount)).Float64()
- if bindUser.RemovePeople == 0 {
- bindUser.RemovePeople = bindUser.RemovePeople + 1
- } else if bindUser.RemovePeople == 1 {
- isUp = true
- bindUser.RemovePeople = bindUser.RemovePeople + 1
- if bindUser.Level < 3 {
- bindUser.Level = 1
- }
- format := time.Now().AddDate(0, 0, 7).Format("2006-01-02 15:04:05")
- bindUser.BadTime = format
- bindUser.Msg = "当给上级boss转移的2位员工发生直推时,将重置惩罚时间"
- } else {
- bindUser.People = bindUser.People + 1
- }
- } else {
- mul, _ := da.Mul(decimal.NewFromFloat(0.5)).Float64()
- sbbu = models.SuccessBill{IdWork.Generate(), bindUser.Addr, mul, 1, 0, "", addr, 1, NowTimeString()}
- bindUser.Profit1, _ = decimal.NewFromFloat(bindUser.Profit1).Add(decimal.NewFromFloat(mul)).Float64()
- bindUser.UseAmount, _ = decimal.NewFromFloat(bindUser.UseAmount).Add(decimal.NewFromFloat(mul)).Float64()
- }
- //-----------处理上级结束--------------
- //3.处理上上级
- if bb {
- te, _ := time.ParseInLocation("2006-01-02 15:04:05", bossUser.BadTime, time.Local)
- sbbo = models.SuccessBill{IdWork.Generate(), bossUser.Addr, 0, 1, 0, "", addr, 2, NowTimeString()}
- if bossUser.Pid != -1 {
- if bossUser.Level > 0 && te.Unix() < nt { //在处罚中
- sbbo.Amount, _ = da.Mul(decimal.NewFromFloat(0.1)).Float64()
- bossUser.AmountLv, _ = decimal.NewFromFloat(bossUser.AmountLv).Add(decimal.NewFromFloat(0.1)).Float64()
- } else {
- sbbo.Amount, _ = da.Mul(decimal.NewFromFloat(0.3)).Float64()
- bossUser.AmountLv, _ = decimal.NewFromFloat(bossUser.AmountLv).Add(decimal.NewFromFloat(0.3)).Float64()
- }
- bossUser.Profit2, _ = decimal.NewFromFloat(bossUser.Profit2).Add(decimal.NewFromFloat(sbbo.Amount)).Float64()
- bossUser.UseAmount, _ = decimal.NewFromFloat(bossUser.UseAmount).Add(decimal.NewFromFloat(sbbo.Amount)).Float64()
- if isUp {
- if bb {
- if bossUser.TeamBoss > 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() < nt { //在处罚中
- pbossUser.LockAmount2, _ = decimal.NewFromFloat(pbossUser.LockAmount2).Add(ru1).Float64()
- } else {
- sbpb.Amount, _ = ru1.Float64()
- pbossUser.AmountLv, _ = decimal.NewFromFloat(pbossUser.AmountLv).Add(decimal.NewFromFloat(0.04)).Float64()
- }
- pbossUser.UseAmount, _ = decimal.NewFromFloat(pbossUser.UseAmount).Add(decimal.NewFromFloat(sbpb.Amount)).Float64()
- pbossUser.Profit3, _ = decimal.NewFromFloat(pbossUser.Profit3).Add(decimal.NewFromFloat(sbpb.Amount)).Float64()
- }
- } else {
- mul, _ := da.Mul(decimal.NewFromFloat(0.04)).Float64()
- sbpb.Amount = mul
- pbossUser.UseAmount, _ = decimal.NewFromFloat(pbossUser.UseAmount).Add(decimal.NewFromFloat(mul)).Float64()
- pbossUser.Profit3, _ = decimal.NewFromFloat(pbossUser.Profit3).Add(decimal.NewFromFloat(mul)).Float64()
- }
- }
- //5.处理上上上上级
- if ppbb {
- te, _ := time.ParseInLocation("2006-01-02 15:04:05", ppbossUser.BadTime, time.Local)
- sbpbp = models.SuccessBill{IdWork.Generate(), ppbossUser.Addr, 0, 1, 0, "", addr, 4, NowTimeString()}
- ru1 := da.Mul(decimal.NewFromFloat(0.06))
- if ppbossUser.Pid != -1 {
- if ppbb {
- if ppbossUser.Level > 0 && te.Unix() < nt { //在处罚中
- ppbossUser.LockAmount2, _ = decimal.NewFromFloat(ppbossUser.LockAmount2).Add(ru1).Float64()
- } else {
- sbpbp.Amount, _ = ru1.Float64()
- ppbossUser.AmountLv, _ = decimal.NewFromFloat(ppbossUser.AmountLv).Add(decimal.NewFromFloat(0.06)).Float64()
- }
- ppbossUser.UseAmount, _ = decimal.NewFromFloat(ppbossUser.UseAmount).Add(decimal.NewFromFloat(sbpbp.Amount)).Float64()
- ppbossUser.Profit3, _ = decimal.NewFromFloat(ppbossUser.Profit3).Add(decimal.NewFromFloat(sbpbp.Amount)).Float64()
- }
- } else {
- sbpbp.Amount, _ = ru1.Float64()
- ppbossUser.UseAmount, _ = decimal.NewFromFloat(ppbossUser.UseAmount).Add(ru1).Float64()
- ppbossUser.Profit3, _ = decimal.NewFromFloat(ppbossUser.Profit3).Add(ru1).Float64()
- }
- }
- dbUtil.Engine.Insert(&user)
- dbUtil.Engine.ID(bindUser.Addr).Update(&bindUser)
- if bb {
- dbUtil.Engine.ID(bossUser.Addr).Update(&bossUser)
- }
- if rb {
- dbUtil.Engine.ID(realBossUser.Addr).Update(&realBossUser)
- }
- if pbb {
- dbUtil.Engine.ID(pbossUser.Addr).Update(&pbossUser)
- }
- if ppbb {
- dbUtil.Engine.ID(ppbossUser.Addr).Update(&ppbossUser)
- }
- var suc decimal.Decimal
- if sbbu.Amount > 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<? AND create_time<?", kx-int64(30), format).Find(&wb)
- for _, v := range wb {
- req1 := new(pb.ReqTxByHash)
- req1.Hash = v.Hash
- data, err := ktoClient.GetTxByHash(context.Background(), req1)
- if err != nil {
- logs.Error("addr=", v.Addr, "block=", kx, "err=", err)
- continue
- }
- tx, err := transaction.DeserializeFinishedTransaction(data.Data)
- if err != nil {
- v.Status = -1
- dbUtil.Engine.ID(v.Id).Cols("status").Update(&v)
- var ua models.UserAddr
- dbUtil.Engine.Id(v.Addr).Get(&ua)
- ua.UseAmount, _ = decimal.NewFromFloat(ua.UseAmount).Add(decimal.NewFromFloat(v.Amount)).Float64()
- dbUtil.Engine.ID(ua.Addr).Cols("use_amount").Update(&ua)
- } else {
- v.Status = 1
- v.SucBlock = int64(tx.BlockNum)
- v.Hash = tx.HashToString()
- dbUtil.Engine.ID(v.Id).Cols("status,suc_block,hash").Update(&v)
- }
- }
- time.Sleep(time.Second * 300)
- }
- }
- func getAmountOut() decimal.Decimal {
- ic, err := NewRouter(common.HexToAddress(enums.AMOUNTCONTRACT), conn)
- if err != nil {
- logs.Error("err=", err)
- return decimal.Zero
- }
- amountIn := decimal.New(1, 11).BigInt()
- addrs := make([]common.Address, 0)
- gdlAddress := common.HexToAddress(enums.KTOCONTRACT)
- usdtAddress := common.HexToAddress(enums.USDT)
- addrs = append(addrs, gdlAddress, usdtAddress)
- b, err := ic.GetAmountsOut(&bind.CallOpts{}, amountIn, addrs)
- if err != nil {
- logs.Error("err=", err)
- return decimal.Zero
- }
- return decimal.NewFromBigInt(b[1], -18)
- }
|