ktoFunction.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. package util
  2. import (
  3. "context"
  4. "encoding/hex"
  5. "fmt"
  6. "ktogame/dbUtil"
  7. "ktogame/enums"
  8. "ktogame/models"
  9. "os"
  10. "strings"
  11. "time"
  12. "github.com/astaxie/beego"
  13. "github.com/astaxie/beego/logs"
  14. "github.com/ethereum/go-ethereum/accounts/abi"
  15. "github.com/ethereum/go-ethereum/accounts/abi/bind"
  16. "github.com/ethereum/go-ethereum/common"
  17. "github.com/ethereum/go-ethereum/crypto"
  18. "github.com/ethereum/go-ethereum/ethclient"
  19. utilAddress "github.com/korthochain/korthochain/pkg/address"
  20. "github.com/korthochain/korthochain/pkg/block"
  21. pb "github.com/korthochain/korthochain/pkg/server/grpcserver/message"
  22. "github.com/korthochain/korthochain/pkg/transaction"
  23. "github.com/shopspring/decimal"
  24. "google.golang.org/grpc"
  25. )
  26. var ktoClient pb.GreeterClient
  27. var conn *ethclient.Client
  28. var ktoRpc = beego.AppConfig.String("hostHttp_mit_kto")
  29. var ethRpc = beego.AppConfig.String("miner_eth")
  30. var IdWork *Snowflake
  31. var kx int64
  32. func init() {
  33. fmt.Println("a3")
  34. IdWork, _ = NewSnowflake(0)
  35. kc, err := grpc.Dial(ktoRpc, grpc.WithInsecure(), grpc.WithBlock())
  36. if err != nil {
  37. logs.Info(err)
  38. os.Exit(1)
  39. }
  40. ktoClient = pb.NewGreeterClient(kc)
  41. utilAddress.SetNetWork("mainnet")
  42. conn, err = ethclient.Dial(ethRpc)
  43. if err != nil {
  44. fmt.Printf("Failed to connect to etherum client: %v\n", err)
  45. }
  46. go getNewBlock()
  47. go listenKto()
  48. go cheakWithdrawal()
  49. //go fenfa()
  50. }
  51. func listenKto() {
  52. time.Sleep(time.Second * 2)
  53. kxredis := dbUtil.GetValue(enums.USE_FHL_BLOCK, 1)
  54. if kxredis.(int64) == 0 {
  55. nb := dbUtil.GetValue(enums.MAX_FHL_BLOCK, 1)
  56. kx = nb.(int64)
  57. } else {
  58. kx = kxredis.(int64)
  59. }
  60. //kx =62203394
  61. for {
  62. nb := dbUtil.GetValue(enums.MAX_FHL_BLOCK, 1)
  63. fmt.Println("当前=", kx, "最新=", nb.(int64), "相差=", nb.(int64)-kx)
  64. if nb.(int64) < kx+1 {
  65. time.Sleep(time.Second * 10)
  66. continue
  67. }
  68. func() {
  69. reqBlock := new(pb.ReqBlockByNumber)
  70. reqBlock.Height = uint64(kx)
  71. bl, err := ktoClient.GetBlockByNum(context.Background(), reqBlock)
  72. if err != nil || bl.Code != 0 {
  73. fmt.Println("获取交易block错误=", err)
  74. time.Sleep(time.Second * 5)
  75. return
  76. }
  77. blc, errs := block.Deserialize(bl.Data)
  78. if errs != nil {
  79. time.Sleep(time.Second * 5)
  80. fmt.Println("获取交易blc错误=", errs)
  81. }
  82. for _, v := range blc.Transactions {
  83. evm, errLog := transaction.DecodeEvmData(v.Input)
  84. if errLog != nil {
  85. continue
  86. }
  87. if len(evm.Logs) != 1 {
  88. continue
  89. }
  90. for _, l := range evm.Logs {
  91. th := l.Topics[0].Hex()
  92. method := dbUtil.TopsMap[th]
  93. addr := l.Address.String()
  94. if method == enums.NEWDEPOSIT && addr == enums.USDTMINTCONTRACT {
  95. var ev models.Ihot
  96. abi, err := abi.JSON(strings.NewReader(FhlMetaData.ABI))
  97. if err != nil {
  98. logs.Error("abi err1=", err)
  99. }
  100. err = abi.UnpackIntoInterface(&ev, method, l.Data)
  101. if err != nil {
  102. logs.Error("abi err2=", err)
  103. }
  104. fmt.Printf("data=%+v\n ", ev)
  105. usdrido(ev.User.String(), ev.Referrer.String(), v.HashToString(), decimal.NewFromBigInt(ev.Amount, -11), decimal.NewFromBigInt(ev.Price, -18), kx)
  106. } else if method == enums.WITHDRAWAL && addr == enums.WITHDRAWCONTRACT {
  107. var ev models.Withdraw
  108. abi, err := abi.JSON(strings.NewReader(FhlMetaData.ABI))
  109. if err != nil {
  110. logs.Error("abi err1=", err)
  111. }
  112. err = abi.UnpackIntoInterface(&ev, method, l.Data)
  113. if err != nil {
  114. logs.Error("abi err2=", err)
  115. }
  116. fmt.Printf("data=%+v\n ", ev)
  117. withdrawal(kx, "0x"+v.HashToString(), ev.User.String(), decimal.NewFromBigInt(ev.Amount, -18))
  118. }
  119. }
  120. }
  121. }()
  122. kx++
  123. dbUtil.SetValue(enums.USE_FHL_BLOCK, kx)
  124. continue
  125. //return
  126. }
  127. }
  128. func getNewBlock() {
  129. for {
  130. number := new(pb.ReqMaxBlockHeight)
  131. num, err := ktoClient.GetMaxBlockHeight(context.Background(), number)
  132. if err != nil {
  133. logs.Info("断开重连2", err)
  134. time.Sleep(time.Second * 10)
  135. continue
  136. } else {
  137. dbUtil.SetValue(enums.MAX_FHL_BLOCK, int64(num.MaxHeight))
  138. }
  139. time.Sleep(time.Second * 10)
  140. }
  141. }
  142. func usdrido(addr, bindAddr, hash string, da, price decimal.Decimal, block int64) {
  143. fmt.Println("==进来==", addr)
  144. //当前用户
  145. var user models.UserAddr
  146. //上级
  147. var bindUser models.UserAddr
  148. dbUtil.Engine.Id(bindAddr).Get(&bindUser)
  149. //上上级
  150. var bossUser models.UserAddr
  151. bb, _ := dbUtil.Engine.Where("id_flag=?", bindUser.Pid).Get(&bossUser)
  152. //原始上上级
  153. var realBossUser models.UserAddr
  154. var rb bool
  155. if bindUser.Pid != bindUser.RealPid {
  156. rb, _ = dbUtil.Engine.Where("id_flag=?", bindUser.RealPid).Get(&realBossUser)
  157. }
  158. //上上上级
  159. var pbossUser models.UserAddr
  160. pbb, _ := dbUtil.Engine.Where("id_flag=?", bossUser.Pid).Get(&pbossUser)
  161. //上上上上级
  162. var ppbossUser models.UserAddr
  163. ppbb, _ := dbUtil.Engine.Where("id_flag=?", pbossUser.Pid).Get(&ppbossUser)
  164. var com models.CommonInfo
  165. dbUtil.Engine.Get(&com)
  166. //1.处理用户
  167. var msxSort models.UserAddr
  168. dbUtil.Engine.Desc("id_flag").Get(&msxSort) //最大序号
  169. user.Addr = addr
  170. user.IdFlag = msxSort.IdFlag + 1
  171. //上级是boss,不转移
  172. if bindUser.Level > 0 || bindUser.Pid == -1 {
  173. user.Pid = bindUser.IdFlag
  174. user.RealPid = bindUser.IdFlag
  175. user.PidFlag = bindUser.PidFlag + "," + fmt.Sprint(bindUser.IdFlag)
  176. } else {
  177. user.Pid = bossUser.IdFlag
  178. user.RealPid = bindUser.IdFlag
  179. user.PidFlag = bossUser.PidFlag + "," + fmt.Sprint(bossUser.IdFlag)
  180. }
  181. user.Msg = "暂无惩罚"
  182. user.BadTime = NowTimeString()
  183. user.CreateTime = NowTimeString()
  184. user.Amount, _ = da.Float64()
  185. user.Price, _ = price.Float64()
  186. user.Block = block
  187. user.Hash = hash
  188. //-----------处理用户结束--------------
  189. nt := time.Now().Unix()
  190. var sbbu, sbbo, sbpb, sbpbp models.SuccessBill
  191. //2.处理用户的直推
  192. var isUp bool
  193. if bindUser.Pid != -1 {
  194. te, _ := time.ParseInLocation("2006-01-02 15:04:05", bindUser.BadTime, time.Local)
  195. sbbu = models.SuccessBill{IdWork.Generate(), bindUser.Addr, 0, 1, 0, "", addr, 1, NowTimeString()}
  196. if bindUser.Level > 0 && te.Unix() < nt { //在处罚中
  197. sbbu.Amount, _ = da.Mul(decimal.NewFromFloat(0.3)).Float64()
  198. bindUser.AmountLv, _ = decimal.NewFromFloat(bindUser.AmountLv).Add(decimal.NewFromFloat(0.3)).Float64()
  199. } else {
  200. sbbu.Amount, _ = da.Mul(decimal.NewFromFloat(0.5)).Float64()
  201. bindUser.AmountLv, _ = decimal.NewFromFloat(bindUser.AmountLv).Add(decimal.NewFromFloat(0.5)).Float64()
  202. }
  203. bindUser.UseAmount, _ = decimal.NewFromFloat(bindUser.UseAmount).Add(decimal.NewFromFloat(sbbu.Amount)).Float64()
  204. bindUser.Profit1, _ = decimal.NewFromFloat(bindUser.Profit1).Add(decimal.NewFromFloat(sbbu.Amount)).Float64()
  205. if bindUser.RemovePeople == 0 {
  206. bindUser.RemovePeople = bindUser.RemovePeople + 1
  207. } else if bindUser.RemovePeople == 1 {
  208. isUp = true
  209. bindUser.RemovePeople = bindUser.RemovePeople + 1
  210. if bindUser.Level < 3 {
  211. bindUser.Level = 1
  212. }
  213. format := time.Now().AddDate(0, 0, 7).Format("2006-01-02 15:04:05")
  214. bindUser.BadTime = format
  215. bindUser.Msg = "当给上级boss转移的2位员工发生直推时,将重置惩罚时间"
  216. } else {
  217. bindUser.People = bindUser.People + 1
  218. }
  219. } else {
  220. mul, _ := da.Mul(decimal.NewFromFloat(0.5)).Float64()
  221. sbbu = models.SuccessBill{IdWork.Generate(), bindUser.Addr, mul, 1, 0, "", addr, 1, NowTimeString()}
  222. bindUser.Profit1, _ = decimal.NewFromFloat(bindUser.Profit1).Add(decimal.NewFromFloat(mul)).Float64()
  223. bindUser.UseAmount, _ = decimal.NewFromFloat(bindUser.UseAmount).Add(decimal.NewFromFloat(mul)).Float64()
  224. }
  225. //-----------处理上级结束--------------
  226. //3.处理上上级
  227. if bb {
  228. te, _ := time.ParseInLocation("2006-01-02 15:04:05", bossUser.BadTime, time.Local)
  229. sbbo = models.SuccessBill{IdWork.Generate(), bossUser.Addr, 0, 1, 0, "", addr, 2, NowTimeString()}
  230. if bossUser.Pid != -1 {
  231. if bossUser.Level > 0 && te.Unix() < nt { //在处罚中
  232. sbbo.Amount, _ = da.Mul(decimal.NewFromFloat(0.1)).Float64()
  233. bossUser.AmountLv, _ = decimal.NewFromFloat(bossUser.AmountLv).Add(decimal.NewFromFloat(0.1)).Float64()
  234. } else {
  235. sbbo.Amount, _ = da.Mul(decimal.NewFromFloat(0.3)).Float64()
  236. bossUser.AmountLv, _ = decimal.NewFromFloat(bossUser.AmountLv).Add(decimal.NewFromFloat(0.3)).Float64()
  237. }
  238. bossUser.Profit2, _ = decimal.NewFromFloat(bossUser.Profit2).Add(decimal.NewFromFloat(sbbo.Amount)).Float64()
  239. bossUser.UseAmount, _ = decimal.NewFromFloat(bossUser.UseAmount).Add(decimal.NewFromFloat(sbbo.Amount)).Float64()
  240. if isUp {
  241. if bb {
  242. if bossUser.TeamBoss > 0 && bossUser.TeamBoss < 3 {
  243. bossUser.Level = bossUser.TeamBoss + 1
  244. }
  245. bossUser.TeamBoss = bossUser.TeamBoss + 1
  246. }
  247. }
  248. } else {
  249. f, _ := da.Mul(decimal.NewFromFloat(0.3)).Float64()
  250. sbbo.Amount = f
  251. bossUser.UseAmount, _ = decimal.NewFromFloat(bossUser.UseAmount).Add(decimal.NewFromFloat(f)).Float64()
  252. bossUser.Profit2, _ = decimal.NewFromFloat(bossUser.Profit2).Add(decimal.NewFromFloat(f)).Float64()
  253. }
  254. }
  255. //-----------处理上上级结束--------------
  256. //4.处理原始上上级
  257. if rb {
  258. var rpUser []models.UserAddr
  259. dbUtil.Engine.Where("real_pid=? and pid!=real_pid", bindUser.RealPid).Find(&rpUser)
  260. if realBossUser.RemovePeople == 2 {
  261. e1 := rpUser[0].RemovePeople
  262. e2 := rpUser[1].RemovePeople
  263. if bindUser.IdFlag == rpUser[0].IdFlag {
  264. e1 = e1 + 1
  265. }
  266. if bindUser.IdFlag == rpUser[1].IdFlag {
  267. e2 = e2 + 1
  268. }
  269. if e1+e2 > 1 && e1 != 0 && e2 != 0 {
  270. if e1 > 0 && e2 > 0 && (e1 < 2 || e2 < 2) {
  271. format := time.Now().AddDate(0, 0, 7).Format("2006-01-02 15:04:05")
  272. realBossUser.BadTime = format
  273. realBossUser.Msg = "当给上级boss转移的2位员工都成为BOSS时,您将永久解除惩罚"
  274. } else if e1 > 1 && e2 > 1 {
  275. realBossUser.BadTime = "2099-01-01 08:00:00"
  276. realBossUser.Msg = "您已永久解除惩罚"
  277. }
  278. }
  279. }
  280. }
  281. //-----------处理原始上上级结束--------------
  282. //5.处理上上上级
  283. if pbb {
  284. te, _ := time.ParseInLocation("2006-01-02 15:04:05", pbossUser.BadTime, time.Local)
  285. sbpb = models.SuccessBill{IdWork.Generate(), pbossUser.Addr, 0, 1, 0, "", addr, 3, NowTimeString()}
  286. if pbossUser.Pid != -1 {
  287. if pbb {
  288. ru1 := da.Mul(decimal.NewFromFloat(0.04))
  289. if pbossUser.Level > 0 && te.Unix() < nt { //在处罚中
  290. pbossUser.LockAmount2, _ = decimal.NewFromFloat(pbossUser.LockAmount2).Add(ru1).Float64()
  291. } else {
  292. sbpb.Amount, _ = ru1.Float64()
  293. pbossUser.AmountLv, _ = decimal.NewFromFloat(pbossUser.AmountLv).Add(decimal.NewFromFloat(0.04)).Float64()
  294. }
  295. pbossUser.UseAmount, _ = decimal.NewFromFloat(pbossUser.UseAmount).Add(decimal.NewFromFloat(sbpb.Amount)).Float64()
  296. pbossUser.Profit3, _ = decimal.NewFromFloat(pbossUser.Profit3).Add(decimal.NewFromFloat(sbpb.Amount)).Float64()
  297. }
  298. } else {
  299. mul, _ := da.Mul(decimal.NewFromFloat(0.04)).Float64()
  300. sbpb.Amount = mul
  301. pbossUser.UseAmount, _ = decimal.NewFromFloat(pbossUser.UseAmount).Add(decimal.NewFromFloat(mul)).Float64()
  302. pbossUser.Profit3, _ = decimal.NewFromFloat(pbossUser.Profit3).Add(decimal.NewFromFloat(mul)).Float64()
  303. }
  304. }
  305. //5.处理上上上上级
  306. if ppbb {
  307. te, _ := time.ParseInLocation("2006-01-02 15:04:05", ppbossUser.BadTime, time.Local)
  308. sbpbp = models.SuccessBill{IdWork.Generate(), ppbossUser.Addr, 0, 1, 0, "", addr, 4, NowTimeString()}
  309. ru1 := da.Mul(decimal.NewFromFloat(0.06))
  310. if ppbossUser.Pid != -1 {
  311. if ppbb {
  312. if ppbossUser.Level > 0 && te.Unix() < nt { //在处罚中
  313. ppbossUser.LockAmount2, _ = decimal.NewFromFloat(ppbossUser.LockAmount2).Add(ru1).Float64()
  314. } else {
  315. sbpbp.Amount, _ = ru1.Float64()
  316. ppbossUser.AmountLv, _ = decimal.NewFromFloat(ppbossUser.AmountLv).Add(decimal.NewFromFloat(0.06)).Float64()
  317. }
  318. ppbossUser.UseAmount, _ = decimal.NewFromFloat(ppbossUser.UseAmount).Add(decimal.NewFromFloat(sbpbp.Amount)).Float64()
  319. ppbossUser.Profit3, _ = decimal.NewFromFloat(ppbossUser.Profit3).Add(decimal.NewFromFloat(sbpbp.Amount)).Float64()
  320. }
  321. } else {
  322. sbpbp.Amount, _ = ru1.Float64()
  323. ppbossUser.UseAmount, _ = decimal.NewFromFloat(ppbossUser.UseAmount).Add(ru1).Float64()
  324. ppbossUser.Profit3, _ = decimal.NewFromFloat(ppbossUser.Profit3).Add(ru1).Float64()
  325. }
  326. }
  327. dbUtil.Engine.Insert(&user)
  328. dbUtil.Engine.ID(bindUser.Addr).Update(&bindUser)
  329. if bb {
  330. dbUtil.Engine.ID(bossUser.Addr).Update(&bossUser)
  331. }
  332. if rb {
  333. dbUtil.Engine.ID(realBossUser.Addr).Update(&realBossUser)
  334. }
  335. if pbb {
  336. dbUtil.Engine.ID(pbossUser.Addr).Update(&pbossUser)
  337. }
  338. if ppbb {
  339. dbUtil.Engine.ID(ppbossUser.Addr).Update(&ppbossUser)
  340. }
  341. var suc decimal.Decimal
  342. if sbbu.Amount > 0 {
  343. suc = suc.Add(decimal.NewFromFloat(sbbu.Amount))
  344. dbUtil.Engine.Insert(&sbbu)
  345. }
  346. if sbbo.Amount > 0 {
  347. suc = suc.Add(decimal.NewFromFloat(sbbo.Amount))
  348. dbUtil.Engine.Insert(&sbbo)
  349. }
  350. if sbpb.Amount > 0 {
  351. suc = suc.Add(decimal.NewFromFloat(sbpb.Amount))
  352. dbUtil.Engine.Insert(&sbpb)
  353. }
  354. if sbpbp.Amount > 0 {
  355. suc = suc.Add(decimal.NewFromFloat(sbpbp.Amount))
  356. dbUtil.Engine.Insert(&sbpbp)
  357. }
  358. sub := da.Sub(suc)
  359. com.Amount, _ = decimal.NewFromFloat(com.Amount).Add(sub).Float64()
  360. dbUtil.Engine.ID(com.Id).Update(&com)
  361. }
  362. func Sign(amountStr, addr, timeStr string) string {
  363. keccakA := crypto.Keccak256([]byte(amountStr), []byte(enums.DIGIT))
  364. keccakS := crypto.Keccak256(keccakA, []byte(timeStr), []byte(addr))
  365. return "0x" + hex.EncodeToString(keccakS)
  366. }
  367. //提币
  368. func withdrawal(kx int64, hash, addr string, amount decimal.Decimal) {
  369. var ua models.UserAddr
  370. b, _ := dbUtil.Engine.Id(addr).Get(&ua)
  371. if !b {
  372. return
  373. }
  374. f, _ := amount.Float64()
  375. var wb models.WithdrawalBill
  376. bw, _ := dbUtil.Engine.Where("addr=? and status=0 and hash=?", addr, hash).Get(&wb)
  377. if !bw {
  378. bill := models.WithdrawalBill{IdWork.Generate(), addr, f, 1, kx, kx, hash, NowTimeString()}
  379. dbUtil.Engine.Insert(&bill)
  380. ua.UseAmount, _ = decimal.NewFromFloat(ua.UseAmount).Sub(amount).Float64()
  381. dbUtil.Engine.ID(ua.Addr).Cols("use_amount").Update(&ua)
  382. return
  383. }
  384. wb.Status = 1
  385. wb.SucBlock = kx
  386. dbUtil.Engine.ID(wb.Id).Cols("status,suc_block").Update(&wb)
  387. }
  388. func cheakWithdrawal() {
  389. for {
  390. h, _ := time.ParseDuration("-1200s")
  391. format := time.Now().AddDate(0, 0, 0).Add(h).Format("2006-01-02 15:04:05")
  392. var wb []models.WithdrawalBill
  393. dbUtil.Engine.Where("status=0 AND create_block<? AND create_time<?", kx-int64(30), format).Find(&wb)
  394. for _, v := range wb {
  395. req1 := new(pb.ReqTxByHash)
  396. req1.Hash = v.Hash
  397. data, err := ktoClient.GetTxByHash(context.Background(), req1)
  398. if err != nil {
  399. logs.Error("addr=", v.Addr, "block=", kx, "err=", err)
  400. continue
  401. }
  402. tx, err := transaction.DeserializeFinishedTransaction(data.Data)
  403. if err != nil {
  404. v.Status = -1
  405. dbUtil.Engine.ID(v.Id).Cols("status").Update(&v)
  406. var ua models.UserAddr
  407. dbUtil.Engine.Id(v.Addr).Get(&ua)
  408. ua.UseAmount, _ = decimal.NewFromFloat(ua.UseAmount).Add(decimal.NewFromFloat(v.Amount)).Float64()
  409. dbUtil.Engine.ID(ua.Addr).Cols("use_amount").Update(&ua)
  410. } else {
  411. v.Status = 1
  412. v.SucBlock = int64(tx.BlockNum)
  413. v.Hash = tx.HashToString()
  414. dbUtil.Engine.ID(v.Id).Cols("status,suc_block,hash").Update(&v)
  415. }
  416. }
  417. time.Sleep(time.Second * 300)
  418. }
  419. }
  420. func getAmountOut() decimal.Decimal {
  421. ic, err := NewRouter(common.HexToAddress(enums.AMOUNTCONTRACT), conn)
  422. if err != nil {
  423. logs.Error("err=", err)
  424. return decimal.Zero
  425. }
  426. amountIn := decimal.New(1, 11).BigInt()
  427. addrs := make([]common.Address, 0)
  428. gdlAddress := common.HexToAddress(enums.KTOCONTRACT)
  429. usdtAddress := common.HexToAddress(enums.USDT)
  430. addrs = append(addrs, gdlAddress, usdtAddress)
  431. b, err := ic.GetAmountsOut(&bind.CallOpts{}, amountIn, addrs)
  432. if err != nil {
  433. logs.Error("err=", err)
  434. return decimal.Zero
  435. }
  436. return decimal.NewFromBigInt(b[1], -18)
  437. }