From 1a9501717b4b562f65d82511887f93c9bdbc0dea Mon Sep 17 00:00:00 2001 From: CounterFire2023 <136581895+CounterFire2023@users.noreply.github.com> Date: Mon, 9 Sep 2024 10:32:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3cec=20claim=E5=90=8E=EF=BC=8C?= =?UTF-8?q?=20=E7=8A=B6=E6=80=81=E6=B2=A1=E6=9B=B4=E6=96=B0=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- initdatas/cec_tag_holer.txt | 248 +++++++++++++++++++++++++++ package.json | 3 +- src/batch_mail.ts | 118 +++++++++++++ src/cecStatic.ts | 4 +- src/controllers/bigget.controller.ts | 26 ++- src/controllers/cec.controller.ts | 53 +++++- src/exportBitget.ts | 150 ++++++++++++++++ src/models/chain/TokenClaimRecord.ts | 2 +- src/services/chain.svr.ts | 6 +- yarn.lock | 14 ++ 10 files changed, 613 insertions(+), 11 deletions(-) create mode 100644 initdatas/cec_tag_holer.txt create mode 100644 src/batch_mail.ts create mode 100644 src/exportBitget.ts diff --git a/initdatas/cec_tag_holer.txt b/initdatas/cec_tag_holer.txt new file mode 100644 index 0000000..905fac7 --- /dev/null +++ b/initdatas/cec_tag_holer.txt @@ -0,0 +1,248 @@ +0xce3065566de9be9f7f66d40ea358ac7eaf755811 388983.0508 +0xdc6f942ccb8d20d135871eb6fb345a34991e5d47 101694.9153 +0xf14b02ce886553b754ae77abff882dc468f82b28 38135.59322 +0xe0deacd9aa484e0cb3a370da4276570c29a7ba04 35593.22034 +0x91af1d9a7d4041eba4e5cf6f4c792b1b6db6ec3b 33050.84746 +0xcd64bb95ee1b3a95586836d636849b71b871732b 30508.47458 +0x931bd858fd7bc2960f51a42489b84805881036cf 17796.61017 +0xccc1da34fa80458c4585d205857c8ea9d5ef94ea 17796.61017 +0x9fb23a9d484ee7ab3e5ec864da290e72b79716fe 15254.23729 +0x8436641d7c21540562e57abad156963e5291e22b 15254.23729 +0xeef775dec9fb448b68545ccc3a3c939fa36b1b4d 15254.23729 +0x17075c6717579318d2fafea354a23c59f31aa5c6 15254.23729 +0xe6be914865be32551793e378bccc9326d00d1a31 12711.86441 +0xddd1007d7d2272a59a2626bd92ae24bb43068db3 7627.118644 +0x05615398383d59599e30a8577bf8e23772d0d911 7627.118644 +0x4442b1f594e6cf47fad51c5ecb3d977f6ec7a66d 10169.49153 +0xc3a1717bde32c99202f56dbd0865e5f9ebb09482 10169.49153 +0x1d7cc86c28a75bb8d4f7a994a9f7775faaab1740 7627.118644 +0x061f1b164a0b5d64f553a8370842b2ece667b71a 5084.745763 +0x3c4aa4530b1351bad6ca196f418fbfce628ec6b8 5084.745763 +0x463217d8c4709d7000970126283d29fae984d307 5084.745763 +0x08edc50e8ab47649c216f5d16088708f66411541 5084.745763 +0xb67584d56580dfcb205749aee2160148dbf08741 5084.745763 +0xbd3a8c711a3e7b73efa40a12a35fa8bb92fece58 5084.745763 +0x07091fa2721bc19f5e31629af83b982777ea23d1 5084.745763 +0x53c8b1b74d31f3dc908c591fe3e491c740d67c13 5084.745763 +0x128dc7e97387477807464a1ced349de98d660020 5084.745763 +0x4572a8fe85170976c7f6046cc16e317e94b9a338 5084.745763 +0x1280b37a5fb199149e62868aa87ba7eb34f0e91d 5084.745763 +0x381921bb1c940eaecf2bc40a6dab81f970343299 5084.745763 +0x6c40630cb2bbc2982dda3768219f0a78b4bb67a6 5084.745763 +0x054573071ec476408039fed5a16333d350dd8a70 12711.86441 +0xeb3a320fcdb8efe552ee1fd2eaa2d22274a39499 12711.86441 +0xaca7ca703beb966a7e2abf8c17262509da513e78 12711.86441 +0xa741bafe0b2c28af674097fe9610ad8d816362a6 12711.86441 +0x0ba881395ae4697c58a586b4b2955d2d5c130807 12711.86441 +0xd78e9d7de29c15d982a4a0654583b59e52fd77e5 12711.86441 +0x326e77b0fee5411f21bf5064d06b793182519720 5084.745763 +0x344ad6781370af1d1a21a81b1016ce278bb24ea9 5084.745763 +0x90d4a8e0254ff8665e2311578a7355d5e3c10458 5084.745763 +0x83232fa96e47914b3367b8a9658100332251b4d7 5084.745763 +0x111ab543956d3a7b4dcf4ac8a41b303fcb19bbd6 5084.745763 +0x459cb09dc26923635623dd88aa6d101f585d8832 5084.745763 +0x15929d5e816d23a3ff8b447fe57b28cc524c1dd1 5084.745763 +0x647c96d571c1a157a02c498451c594635790c988 5084.745763 +0x1fd0368c8dd316ba3e95c6799511197c2f13392d 5084.745763 +0xe4fdc74545ce4dd153e940fa6e286f832a8d471d 5084.745763 +0x6fb04a8d70a797d2ac9ce2b6eba0fcf3f00f9e51 5084.745763 +0x709998b6cb56a467ed44f7c06082c2dd2a0ca697 5084.745763 +0xab8471472b825880d6f2865879229f547efefe30 5084.745763 +0xe123c76c7d1cf96fc05752580a4817ca1d9febde 5084.745763 +0xfa53de399971e0a05b7ed03462e63ad2c6026fce 5084.745763 +0x90cdba3a888e170a5b7fef40f525991205edfde9 5084.745763 +0xbff1ef6e9185d4fcd646552c9a206bd3ad76d600 2542.372881 +0x63e53c6226b8133db3f35865e5b44174ca674aaf 2542.372881 +0xb4c0834512e136f9a0760fda009846f8d50d79af 2542.372881 +0x1b24fe44d4b1c7fa0b5329c2a3c0ebc13967625a 2542.372881 +0x0711ce8fc0a94093eb3ad4bb422fbc26837c6399 2542.372881 +0x3045e9baa118555f1c5fd8c791ff82165aa3a7ae 2542.372881 +0x4b2289a61a5fee9d8e7fd1962335ec6086fe58e1 2542.372881 +0x422dfbb161b364b21a33cf04d1251168c49b0603 2542.372881 +0x65e5df518d7ec395256df4df598b823d17c09225 2542.372881 +0xd41797b1336e6cfa9632f347a628acf10f22e7bd 2542.372881 +0x9ac6a254ffb55022e9563f5441ad434d59a6d8b8 2542.372881 +0x60fd35191ffa774e40934efb8ed34b2ec42da320 2542.372881 +0x5513ea4be72db2f85a19281085ffd0cfaa52e692 2542.372881 +0x10c7a6e6e88441f85413e4c5290704604a04c0e1 2542.372881 +0x66da213025fd3c313a10184c97cab4f44e4e75b6 2542.372881 +0xc4a65629636ee4a1a31ce55cc32b6b1a429ca156 2542.372881 +0x40ba92d5fa03634ecb5ee70d44a8a7f2860d7561 2542.372881 +0x4133dfc1532e6e666d37099e73be00c4934e88c6 2542.372881 +0x1fff60e63d365fb485be75a6f3f9eab9db724348 2542.372881 +0xbb7c26186b783c528308b88cfd4b8c088a4a9de1 2542.372881 +0xe77b50153d64d112f0ae705d8a743f95939cb00d 2542.372881 +0x44655092bebabdf0d3e3b4f90f7f94afec904e72 2542.372881 +0xc1f298bf8e8385320a0752cc9fe1009213688186 2542.372881 +0x62f6bf824aa091266c92dce575bb2e6de6d23984 2542.372881 +0x07060eace5e1425071a13557a77312acf15ccf93 2542.372881 +0x1157261d71359053ba4373404375b5d7de0dcbac 2542.372881 +0x514ee7b24fd24cdab59703e9132d5bbdc2349b75 2542.372881 +0xcf001021fe6d8018139be807ee0542e26dcc7455 2542.372881 +0x9181ba66a0f5fbae05c46c39ad9cbeba452e6454 2542.372881 +0x8463f77cd9bd211ee7deb854d6f1c24a0b50fcce 2542.372881 +0xffbfec64e1cf52a089a971da456eb904103206c9 2542.372881 +0x110177710ad083ecfda2e73ae4ca6925dd6e9495 2542.372881 +0x3ea06201f8f7dc29ba776e6ffcdf1ef77528e8b2 2542.372881 +0x2102a9b98f899bc2ae30e00deb4efb38e1b79cde 2542.372881 +0xbb673508a9a784fb316042f57502b3d442fa3ba6 2542.372881 +0x61939bb47bb247c87e2c55c98a8fd15ee2bb56ce 2542.372881 +0xad47a5f98174cbea6934e8676d54bd36ae07d225 2542.372881 +0x8f10cf7e01345d29c4d708ca6cc36282a8add12f 2542.372881 +0xeb0939d7a8555106c187a17c9cfa8409d8cc2cb8 2542.372881 +0x441b63ca9f57f197c54e5b0f6c704758a78043c7 2542.372881 +0xef62e5468da004935d986ec149db4e37841a833b 2542.372881 +0xc5c6f9f0ea697c4727190da140bb776adae026b9 2542.372881 +0x99f5dfafb3bcd5bbcffce553e6a35fe5e1b08aca 2542.372881 +0x02aec689a094226aa529d64b1f9714901b8d6215 2542.372881 +0x82b7a1e57aec7e14801b3cecbbe38fc2335ec16c 2542.372881 +0x46f9cda8e931af33390c5e66db89a42d39f91007 2542.372881 +0xc9f51c54a7c3d26d62a8ac3a7c6bffdd5a6a9e53 2542.372881 +0xcc7079c9691d1ff5a6a82e7a1e0ef0c7c4fd859d 2542.372881 +0x36864b2234877af60b1d57c7c317df3812d9987a 2542.372881 +0x54be3a794282c030b15e43ae2bb182e14c409c5e 2542.372881 +0x481f99f02133e2e0d85f6f6248f2ad127d359659 2542.372881 +0xac59155d707121d20d803c0348eac37f8f410a46 2542.372881 +0x2d750f37415ea2cd039b8e0b20e37671e742b05f 2542.372881 +0x05adf3093237d32d5cfb0a2f7c013197ae070545 2542.372881 +0xa2f0d3582f4dbcedd0977856c528eab985d92afb 2542.372881 +0xb46bfc7d387bfc4e56bf013d4b1e2246abf456f3 2542.372881 +0x4875512ba1307729c4a767ed343e620efbbc3f77 2542.372881 +0x3fb26fdc65754fdeb3af6d5e9bb3d2de8154a988 2542.372881 +0x0166f6b0ac0900d0b7499755bf7038c4cc819b04 2542.372881 +0x9d1817d6fae6bb8b79b1113a32a6c178f6f9b8f8 2542.372881 +0x389b1930726972734b576965cd305877840cc33c 2542.372881 +0x110a929df2c3243046c562bf9d2988a340ebc584 2542.372881 +0xab8f80824fc189026cb887f22f3cd53777a374df 2542.372881 +0x2e79750671de844a2582c8ac2678a8afa6ce127c 2542.372881 +0x4f957d7e9bb1db3583e5f34774938413bc1a37ee 2542.372881 +0xcf0ef234b1917a50b7d59c10e043bbc4c80e03c1 2542.372881 +0x210b8b648220a4c7e1bbe508c7b9723e2ecdec24 2542.372881 +0x84ea3f44ecfb6c9de86df307e668a9edcd920a4d 2542.372881 +0x5c46bcd2afc105a165b6796e211be786a5c6278e 2542.372881 +0x17d36852625cd08bb7a538c17f498205cb8db537 2542.372881 +0xbdd877681a214e3b9bb280f9d40192f8e048a665 2542.372881 +0x8f3a94725a7686055d1aaba8a41be506c5dfd079 2542.372881 +0x73da1af06106a7f3ac717ef0fd637177175d98b7 2542.372881 +0x0da1ceb8c2edf88c240e259cc8a481ab340d7a55 2542.372881 +0x0a7e31ea661a6e09055e849c43848d8420e44778 2542.372881 +0x4093455e238eadeafb2da0b69b2ed61234cc8239 2542.372881 +0x94243ac3848850064511a616911c5ea7e5b25f92 2542.372881 +0xc8c311e8a266a3c6f959433df7c11a05446dad56 2542.372881 +0xc6e7a4b569d4ffa6d4a5988bb2129aae9067acfb 2542.372881 +0x1a0ed79a4742a1cbc7c2ea39bc33da9e26ee0501 2542.372881 +0x6e647959ed844044f25b8c77b34c2d0c399870cd 2542.372881 +0x8210a401239f580280ebf85082278e2266af8b2d 2542.372881 +0xa045bb2c43bfb1d4286e88ca60355e7a0d9746cb 2542.372881 +0xa215b8e30765e30f1faa78e786aa7cd119c3157b 2542.372881 +0x5cd67d75e55266be41732c1320ab077e6d8aaabb 2542.372881 +0xb2767b2646dbd09c39409fa990d582f36effc3ae 2542.372881 +0x4f0130ba51d69c8a0e70f990fc6f8638229c36a7 2542.372881 +0x6bbfa2a1faa657f95282673437b005d1838049ba 2542.372881 +0x299b54926ea6e99f0c82a2259749eea19e76c283 2542.372881 +0x9c9da552b36cc275c0fecaf508bd3327de944bff 2542.372881 +0x10ccefdd1323a0053f9bd819c1a7b8c73aebe959 2542.372881 +0x67f05ad11c67c72d8e3f0d6d3f05e2633a531b11 2542.372881 +0x6c9e3cc54248973b5e52a65348c3f89d2abb3c42 2542.372881 +0xb35d77527e9887f8343d7f44167a74ca06008c49 2542.372881 +0x32c0a4c8cb0d937c5e2f188a752ec2f591627b39 2542.372881 +0xd039b418180875f2cd413764349462b68c1c6460 2542.372881 +0xe73aec59250a38774638bf54e8a6277aac225735 2542.372881 +0x0decb04d7f0685d196beb845a62356ff2c4098fd 2542.372881 +0x68e33a587f1d697c5e0f8b8794cfa304b41a61e2 2542.372881 +0xa8b818472b0f855119481953eb696a8cfec5f6a7 2542.372881 +0xec544182ac353cc0cb632de61dee13cfda947472 2542.372881 +0x0b3be3ee356ce386592f6a944ce9dfc81d8081f8 2542.372881 +0x61bebcdc0de0c3d6ce7f7fefa795856f984d570f 2542.372881 +0x1941b936657408253f5c5dec9c7f5bbf84c760cd 2542.372881 +0x5f9e09b2243f0c950fc2f7e1eb1c681f4aa8a1f1 2542.372881 +0xaf4e4c99078be26db80f3bcd08dca89438024f4f 2542.372881 +0x44239db3d29828d05227b02c2e5b23a5c6919e44 2542.372881 +0x7c0f69d80b87b5403aca1f28e5eb95cae95cc649 2542.372881 +0xa2cad146bb7f1e72df8884539d4092bec51520a8 2542.372881 +0x70a7ff43e7dec3d1faa4db8dc7a1fc8faf45ef91 2542.372881 +0x86920e21ab0c18832369c2e09e93b27c4a5a1750 2542.372881 +0xd13a48109203ca22a0221a1a094ba8a033e112ef 2542.372881 +0x84264f134879b7ab714ab18ab653a73dd5448b16 2542.372881 +0xfa61cac2c8fd3b5a7bbfc0934284913b157e68aa 2542.372881 +0xa8078c69d2974e1a90e5aa0b3a3443742065241b 2542.372881 +0xad2dea1977055db01c66e6e53309c4604ab869b8 2542.372881 +0xdfe9c04c39a0b21929e71b43757be91ac36b0243 2542.372881 +0x46b399d3685bd5b0dadb613ed363469ffc985687 2542.372881 +0xd8e1c7e0a9dff7cded0303af9252ec8f32dd51cf 2542.372881 +0xd077bb17d13247be1227d4095fd7d790bc714132 2542.372881 +0x1487f1b080a2c726b24529676ad8ad3e5dac8eb0 2542.372881 +0x9c0171bd82e40265c146a01b278087a5947f91e1 2542.372881 +0x7ca80728e8c06482412f7ead49c0e9b1b8bbb51c 2542.372881 +0x88fd9c3b74b3559c2dc2f474f98296042ae87011 2542.372881 +0x81683af10aa7ee91f8df570726f55fd00d2915be 2542.372881 +0xe8c4170f68518c3b6bc3c6c9b33a071bea44e569 2542.372881 +0x4259efbde098e67cb45a8e23ff8f9a4b155d6100 2542.372881 +0x1aa666d676fde62ae9477c75e7f501f214d1849c 2542.372881 +0x94e403daa95675d54bfaabaf49b1730ec80fe13f 2542.372881 +0x141309877d11e6ff4302824c836675257f89f6b9 2542.372881 +0x4a92b853b30c01fb167c65bdeb9a8e6e14b74f52 2542.372881 +0xf388b107e627a47bd12ab8ad732fc1d4b9253c42 2542.372881 +0x2b65f85e81eec21eda840b8f9c4fd657f917b092 2542.372881 +0x13cf64fe5bef40e44908a6cc0aa7aaf8e35f0bbe 2542.372881 +0xc87e9dff30a7472329237c4ad222b35b529f0fb7 2542.372881 +0x88b7b36e038d4c2015d2c4419613d4ac093356e5 2542.372881 +0x9fae7ff188aaf70bdc9f0567cf1524df260dc8ee 2542.372881 +0xc196eb8d5a08fb6ce0297b2748e18137f2b431fc 2542.372881 +0x96c3a3795666d2e3909aa360dd2c4e6bed63dbd7 2542.372881 +0xf2aac76a8dc431201bf61528d99a30cfd37217dd 2542.372881 +0xaff81e3f863d19f1d2ecea1e54f4e988131a6122 2542.372881 +0xf025f82c16d5809a55cbccf3f373020b6e3b8b01 2542.372881 +0x8d6662deb08786547af2c10aa609d469e545baf8 2542.372881 +0x89d2d15bf0e3dbc0caf4620d1a694a3f7dc25c4a 2542.372881 +0x90f99fea4275ceddb169c631b5bff96781cc8dcc 2542.372881 +0xbaaf5a2178e9fa656513c27e43a393661b255332 2542.372881 +0x47954ca71620e84b0ad8212547a2f1d7d3976e3a 2542.372881 +0x5c2260103ba960d23603a7b824c80a24eae159b9 2542.372881 +0xbfe1d5893ddbb0b04e52afdbdb18842f42d733cb 2542.372881 +0x3c685d3a0e3f2b87ccfba12aef53dc00a605f797 2542.372881 +0xccede66765e2334c717280bafd5dfd0e3d7d1e32 2542.372881 +0x6a9eabbe45c28311911429e589723228c0eaeebb 2542.372881 +0xb6c4421ccd6be35937e9eda7326f8c01bd401c73 2542.372881 +0x4357637b486fe60ff11b4513e636c00f7833dd4a 2542.372881 +0x8256343b66dc32c06347673411c0e3d4bedfbb55 2542.372881 +0xab6e9887e3c6777095ae910ac7973e77b0f3a577 2542.372881 +0xbda75d5353a24f5d96c70a744a834d59af873fc3 2542.372881 +0xf1092fffdf736fce2881e16a57c3c68ac8e745d0 2542.372881 +0x6c433968265b57e74584309b2364af6d6b394ca0 2542.372881 +0xc497344dca4f96ae5d9aa2590234ea7d27fa2d59 2542.372881 +0x0722cab71aaded9ed36885c81828870f0534fcfc 2542.372881 +0x38f9ee175330828050640ee869068307770984c9 2542.372881 +0xd78519e60f29412615a256ca2dd17c7874afcf5b 2542.372881 +0x68dda17c32dc46dd13091b34a1d3108ac7b6a68b 2542.372881 +0x4ecd795a981842fd626bb6cd6bdb428d8de0a719 2542.372881 +0xb703b053556cc3f60d4a0f12813e7fd288912c7d 2542.372881 +0xb1c722ed5734d974eb5e52e77d9d4c6b5ab53de1 2542.372881 +0x9499054d02a725316d61fa896c29d58550ee4a5b 2542.372881 +0x701023a62871ad80aed12270ad5f0296cbfe8e88 2542.372881 +0xc6292599483a251a1c1c28ac5eb351061c5f69cf 2542.372881 +0xbc382148266fead8ea2762a2725de6e0f12f46b9 2542.372881 +0x8eec94936ac76db13c016a64939f3b0830dfc2fe 2542.372881 +0x1d074d446dc3c8f83390f36cab81528611ca353a 2542.372881 +0x39af18442470f2f6fd670d23466a02752ef55142 2542.372881 +0x8b6b7c70aa678e0f93808be74dc4b64bf3950e87 2542.372881 +0xd25db8c6bc09500ac7aa227a8e9d8b598d009f37 2542.372881 +0x2d7cf39e1f50efc84334ae7d5044dbc6c6241798 2542.372881 +0xb0481e4d9513924d3eef075781794ea81b14e0f7 2542.372881 +0x099af32b55a6f050f5852d2034cec92172f3f5ba 2542.372881 +0xd32baa0ae934520495f9134c3fd8a172989dc0b8 2542.372881 +0xbcc93f97e3bbe689caeb5d935fd85879e2a09aad 2542.372881 +0x14de65035af2634176876f51ab41bad38942e8f5 2542.372881 +0x9c1218103846887b469dd55b36de440cfa42045d 2542.372881 +0x4db49d1ebaa49270f252b7343cace7b95e6578d3 2542.372881 +0xeab824e199cd3bd5a657ab06d5502df66b5f87fc 2542.372881 +0x22dcb6342ef319a4d8b92b19fb280a0983940c7b 2542.372881 +0x1e676020e23255e4ff088e149e8fa047272d871b 2542.372881 +0x649b0894ce2ba6199f923f7db0c45625020c2427 2542.372881 +0x364e2aea672a791eb516999f16f510b92699a98c 2542.372881 +0x19747e0527d3f7b8bd3aa7b147d4a61435d08824 2542.372881 +0xb93b813eab11a81e52c7ff20e21b8bd8d336685c 2542.372881 +0xc5299f30c24ec5bb0d225bbcc43f50894d6c6124 2542.372881 +0x4764e2d1f34406cbfcbb91759103db97d8327e36 2542.372881 +0xbdff3294962039e9308f364e9312e1f6aec926c1 2542.372881 +0x71ce8da3f53254d414e9749ac028ea0932d58f9e 2542.372881 \ No newline at end of file diff --git a/package.json b/package.json index 8a909f9..e735a13 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "sybil": "ts-node -r tsconfig-paths/register src/removeSybil.ts", "releation": "ts-node -r tsconfig-paths/register src/updateReleation.ts", "rankquery": "ts-node -r tsconfig-paths/register src/rankquery2.ts", - "mail": "ts-node -r tsconfig-paths/register src/batchMail.ts", + "mail": "ts-node -r tsconfig-paths/register src/batch_mail.ts", "eth": "ts-node -r tsconfig-paths/register src/queryEthTx.ts -s 0 -l 10000 -k TC7Y76AS4AMQ468XXNKKF2R3TI7V844HUC", "taskid": "ts-node -r tsconfig-paths/register src/generateTaskId.ts", "token": "ts-node -r tsconfig-paths/register src/generateToken.ts", @@ -49,6 +49,7 @@ "fastify": "^4.15.0", "fastify-plugin": "^3.0.0", "fastify-xml-body-parser": "^2.2.0", + "fs-jetpack": "^5.1.0", "get-jwks": "^9.0.2", "google-auth-library": "^9.9.0", "ioredis": "^5.4.1", diff --git a/src/batch_mail.ts b/src/batch_mail.ts new file mode 100644 index 0000000..44ee232 --- /dev/null +++ b/src/batch_mail.ts @@ -0,0 +1,118 @@ + +let fs = require('fs') + +const EMAIL_LIST_FILE = 'configs/email_list.txt'; +const USED_CODE_FILE = 'mail_out/used_code.txt'; +const HISTORY_FILE = 'mail_out/mail_history.txt' +const HISTORY_FILE_FAIL = 'mail_out/mail_history_fail.txt' + +const mailText='Go claim $CEC to Bitget now with 0 gas fee and grab a share of 1M $CEC rewards!! https://counterfire.games/claim \n\nDon’t miss the chance to increase and maximize your $CEC holdings.'; + +const mailHtml = ` +

+

Go claim $CEC to Bitget now with 0 gas fee and grab a share of 1M $CEC rewards!! https://counterfire.games/claim

+

+

Don’t miss the chance to increase and maximize your $CEC holdings.

+`; + +const sleep = (ms) => { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +const file = (path) => { + if (!fs.existsSync(path)) { + fs.writeFileSync(path, ''); + } +} + +const read = (path, encoding) => { + return fs.readFileSync(path, encoding); +} + +const append = (path, data) => { + fs.writeFileSync(path, data, { flag: 'a' }); +} + +const send = async (msg) => { + const url = 'https://oauth-svr.cebggame.com/mail/mail/send'; + const headers = { + 'Content-Type': 'application/json; charset=utf8', + Authorization: 'Basic bWFpbHNlbmRlcjo3NjU0MzIxY2Yt', + }; + const options = { + method: 'POST', + headers, + body: JSON.stringify({ message: msg }), + }; + + return fetch(url, options).then((res) => res.json()); +}; + +const sendOneMail = async (to) => { + const msgData = { + from: 'Counter Fire ', + to: to, + subject: 'Counter Fire TGE confirmed! Check your CEC airdrop eligibility and earn more now!', + text: mailText, + html: mailHtml, + }; + return send(msgData); +}; + +const sendAll = async () => { + file(HISTORY_FILE); + file(HISTORY_FILE_FAIL); + const emailList = read(EMAIL_LIST_FILE, 'utf8') + .split('\n') + .filter((item) => !!item); + console.log('emailList: ', emailList.length); + const sendedList = read(HISTORY_FILE, 'utf8') + .split('\n') + .filter((item) => !!item) + .map((item) => item.toLowerCase()); + const sendFailList = read(HISTORY_FILE_FAIL, 'utf8') + .split('\n') + .filter((item) => !!item) + .map((item) => item.toLowerCase()); + const failSet = new Set(sendFailList); + const sendedSet = new Set(sendedList); + console.log('sendedCount: ', sendedSet.size); + const emailLis2 = emailList.filter((item) => !sendedSet.has(item) && !!item); + console.log('emailLis2: ', emailLis2.length); + const lsitToSend = []; + let totalSuccess = 0 + let totalFail = 0 + let i = 0; + for (let email of emailLis2) { + email = email.toLowerCase(); + i++; + try { + let { errcode, errmsg, data } = await sendOneMail(email); + if (errcode) { + append(HISTORY_FILE_FAIL, email+'\n'); + console.log('error send mail:: email: ', email, ' errcode: ', errcode, ' errmsg: ', errmsg); + continue; + } + writeHistory(email); + totalSuccess += 1; + console.log(i, 'success send mail: ', email); + } catch (e) { + totalFail += 1; + append(HISTORY_FILE_FAIL, email+'\n'); + console.log(i, 'send mail error: ', email, e); + } + await sleep(100); + } + console.log('success: ', totalSuccess); + console.log('fail: ', totalFail); + return lsitToSend; +}; + +const writeHistory = (mailAddress) => { + append(HISTORY_FILE, mailAddress+'\n'); +}; + + +(async () => { + await sendAll() +})(); diff --git a/src/cecStatic.ts b/src/cecStatic.ts index 190c7c6..1678f6f 100644 --- a/src/cecStatic.ts +++ b/src/cecStatic.ts @@ -239,12 +239,12 @@ const exportRecords = async () => { ;(async () => { try { - // await importCecEvent(); + await importCecEvent(); // await importUAW() // await loadGameSeason() // await loadHashRate() // await importGachaEvent() - await loadStake() + // await loadStake() // await loadGacha() // await exportRecords() } catch (e) { diff --git a/src/controllers/bigget.controller.ts b/src/controllers/bigget.controller.ts index 38aaee1..5ad0697 100644 --- a/src/controllers/bigget.controller.ts +++ b/src/controllers/bigget.controller.ts @@ -1,5 +1,6 @@ import { SyncLocker } from 'common/SyncLocker' import { BitgetUser } from 'models/BiggetUser' +import { BitgetBindInfo } from 'models/BitgitBindInfo' import { SiweMessage } from 'siwe' import { ZError, BaseController, ROLE_ANON, role, router } from 'zutils' import { checkParamsNeeded } from 'zutils/utils/net.util' @@ -129,7 +130,7 @@ class BiggetController extends BaseController { return {} } - @router('post /api/bigget/verify_email') + // @router('post /api/bigget/verify_email') async verifyCode(req, res) { await new SyncLocker().checkLock(req) logger.db('verify_mail_code', req) @@ -169,8 +170,8 @@ class BiggetController extends BaseController { return { token } } - @role(ROLE_ANON) - @router('get /api/bigget/remove_email') + // @role(ROLE_ANON) + // @router('get /api/bigget/remove_email') async removeEmail(req, res) { let { email } = req.params if (!debug) { @@ -190,4 +191,23 @@ class BiggetController extends BaseController { user.email = '' await user.save() } + + @role(ROLE_ANON) + @router('get /api/bitget/count_bind') + async countBind(req) { + let records = await BitgetBindInfo.aggregate([{ $group: { _id: {$dateToString: {format: "%Y-%m-%d-%H", date: "$createdAt"}}, count: {$sum: 1} }, }, {$sort:{"_id":1}} ]) + let results = [] + let countTotal = 0 + for (let record of records) { + let arr = record._id.split('-') + let time = new Date(new Date().setHours(0, 0, 0, 0)) + time.setUTCFullYear(parseInt(arr[0])) + time.setUTCMonth(parseInt(arr[1]) - 1) + time.setUTCDate(parseInt(arr[2])) + time.setUTCHours(parseInt(arr[3])) + countTotal += record.count + results.push(time.toLocaleDateString() + '-' + time.getHours() +': '+record.count + ' ' +countTotal) + } + return results + } } diff --git a/src/controllers/cec.controller.ts b/src/controllers/cec.controller.ts index 654bd07..e8e0eb0 100644 --- a/src/controllers/cec.controller.ts +++ b/src/controllers/cec.controller.ts @@ -11,11 +11,15 @@ import { Wallet } from 'models/Wallet' import { PlatEnum } from 'enums/PlatEnum' import { BitgetBindInfo } from 'models/BitgitBindInfo' import { hidePartString } from 'common/Utils' +import { FixAddress } from 'models/ctrl/FixAddress' const STAGE1_UNLOCK_TIME = Number(process.env.CEC_CLAIM_STAGE1) const STAGE2_UNLOCK_TIME = Number(process.env.CEC_CLAIM_STAGE2) const CEC_CLAIM_STAGE = Number(process.env.CEC_CLAIM_STAGE) const CEC_ADDRESS = process.env.CEC_CONTRACT +const CEC_CLAIM_CONTRACT = process.env.CLAIM_CONTRACT + +const isTest = process.env.IS_TEST === '1' const checkAddress = (address: string) => { if (!address) { @@ -27,6 +31,16 @@ const checkAddress = (address: string) => { return ethers.utils.getAddress(address).toLowerCase() } +const removeSmallNum = (val: any) => { + if (val === 0n) { + return val + } + var b = ethers.utils.formatEther(val) + b = b.substring(0, b.indexOf('.')+3) + var b1 = parseFloat(b) + return BigInt(ethers.utils.parseEther(b1+'').toString()) +} + /** * 查询cec claim状态 * 第一期是比较特殊的记录, 在预售阶段, 需要展示第一期可领取的数量, 所以要特殊处理 @@ -38,9 +52,13 @@ const queryCECClaimStatus = async (address: string) => { let available = 0n let claimed = 0n let unavailable = 0n + const fixed = await FixAddress.checkExist(address) + if (fixed) { + return { total, available, claimed, unavailable, bit: 0n, records: [], bindRecord: null } + } const records = await CECRecordTotal.find({ address }) //@ts-ignore - await updateClaimStatus({ address, token: CEC_ADDRESS, records}) + await updateClaimStatus({ address: CEC_CLAIM_CONTRACT, account: address, token: CEC_ADDRESS, records}) const bindRecord = await BitgetBindInfo.findOne({ wallet: address }) let bit = 0n for (const record of records) { @@ -71,6 +89,8 @@ const queryCECClaimStatus = async (address: string) => { } } } + total = removeSmallNum(total) + available = removeSmallNum(available) unavailable = total - available - claimed return { total, available, claimed, unavailable, bit, records, bindRecord } } @@ -163,7 +183,7 @@ class CECController extends BaseController { available: available.toString(), claimed: claimed.toString(), unavailable: unavailable.toString(), - records: records.map(record => record.toJson()), + // records: records.map(record => record.toJson()), bindUid: bindRecord ? hidePartString(bindRecord.biggetAcc) : '', bindAddress: bindRecord ? hidePartString(bindRecord.address) : '' } @@ -209,11 +229,40 @@ class CECController extends BaseController { }) return { calls: [{trans_req: data, trans_id: ''}], direct: true } } + + // @role(ROLE_ANON) + // @router('get /api/cec/add_test/:address') + async addTest(req: any) { + if (!isTest) { + throw new ZError(10, 'not allow') + } + let { address } = req.params + address = checkAddress(address) + address = address.toLowerCase() + let record = new CECRecordTotal({ + address, + num: 16, + earnTime: 'before 2024', + desc: 'test', + status: 1, + amount: '16000000000000000000', + __v: 0, + firstRate: 15, + bit: 9, + claimStatus: { + '1': { bit: 16, rate: 15, status: 1, time: 0 }, + '2': { bit: 17, rate: 85, status: 1, time: 0 } + } + }) + await record.save() + return record.toJson() + } @router('post /api/cec/bind_account') async bindAccount(req: any) { await new SyncLocker().checkLock(req) logger.db('bind_bitget_acc', req) + return new ZError(100, 'the activity has ended') const user = req.user const { accid, address } = req.body if (CEC_CLAIM_STAGE !== 0) { diff --git a/src/exportBitget.ts b/src/exportBitget.ts new file mode 100644 index 0000000..f5ded0f --- /dev/null +++ b/src/exportBitget.ts @@ -0,0 +1,150 @@ +import mongoose from 'mongoose' +import * as dotenv from 'dotenv' +import { ethers } from 'ethers' +let fs = require('fs') + +const envFile = process.env.NODE_ENV && process.env.NODE_ENV === 'production' ? `.env.production` : '.env.development' +dotenv.config({ path: envFile }) +console.log(process.env.DB_MAIN) + +import { BitgetBindInfo } from 'models/BitgitBindInfo' +import { CECRecordTotal, ClaimStatusEnum } from 'models/CECRecordTotal' +import { FixAddress } from 'models/ctrl/FixAddress' + +const CEC_CLAIM_STAGE = 1 +const dbMain = mongoose.createConnection(process.env.DB_MAIN) + +const removeSmallNum = (val: any) => { + var b = ethers.utils.formatEther(val) + b = b.substring(0, b.indexOf('.')+3) + var b1 = parseFloat(b) + return BigInt(ethers.utils.parseEther(b1+'').toString()) +} + +const queryCECClaimStatus = async (bindRecord: any) => { + let total = 0n + let available = 0n + let claimed = 0n + let unavailable = 0n + const records = await CECRecordTotal.find({ address: bindRecord.wallet }) + let bit = 0n + for (const record of records) { + let currentTotal = BigInt(record.amount) + total += currentTotal + // fetch status from claimStatus + for (const [key, val] of record.claimStatus.entries()) { + const stage = parseInt(key) + // 预充值阶段, 需要展示第一期可领取的数量 + if (stage <= CEC_CLAIM_STAGE && val.status === ClaimStatusEnum.NORMAL) { + available += (currentTotal * BigInt(val.rate)) / 100n + } + } + } + unavailable = total - available - claimed + return { total, available, claimed, unavailable, bit, records, bindRecord } +} + + + +const queryAll = async () => { + let addressCursor = BitgetBindInfo.find().cursor({ batchSize: 1000 }) + let available_all = 0n + let total_all = 0n + let results = [] + for await (let doc of addressCursor) { + if (!doc.address) { + continue + } + const { total, available } = await queryCECClaimStatus(doc) + available_all += available + total_all += total + results.push([doc.wallet, doc.address, doc.biggetAcc, available, ethers.utils.formatEther(available)]) + } + console.log('available_all: ', ethers.utils.formatEther(available_all)) + console.log('total: ', ethers.utils.formatEther(total_all)) + fs.writeFileSync('outdatas/cec_pre_charge.csv', results.map(r => r.join(',')).join('\n')) +} + +const queryFixData = async () => { + let addressCursor = FixAddress.find().cursor({ batchSize: 1000 }) + let available_all = 0n + let total_all = 0n + let results = [] + for await (let doc of addressCursor) { + if (!doc.address) { + continue + } + const { total, available } = await queryCECClaimStatus({wallet: doc.address}) + available_all += available + total_all += total + } + console.log('available_all: ', ethers.utils.formatEther(available_all)) + console.log('total: ', ethers.utils.formatEther(total_all)) + +} + +const checkFixData = async () => { + let addressCursor = FixAddress.find().cursor({ batchSize: 1000 }) + for await (let doc of addressCursor) { + if (!doc.address) { + continue + } + const bind = await BitgetBindInfo.findOne({ wallet: doc.address }) + if (bind) { + console.log('found: ', doc.address) + continue + } + } +} + +const queryRemain = async () => { + const bindRecords = await BitgetBindInfo.find({invalid: false}) + const bindSet = new Set(bindRecords.map(r => r.wallet)) + const fixRecords = await FixAddress.find() + const fixSet = new Set(fixRecords.map(r => r.address)) + let recordCursor = CECRecordTotal.find().cursor({ batchSize: 1000 }) + let available = 0n + let fix = 0n + let fixAndAba = 0n + let bind = 0n + for await (let record of recordCursor) { + if (!record.address) { + continue + } + + let currentTotal = BigInt(record.amount) + // fetch status from claimStatus + for (const [key, val] of record.claimStatus.entries()) { + const stage = parseInt(key) + // 预充值阶段, 需要展示第一期可领取的数量 + if (stage <= CEC_CLAIM_STAGE && val.status === ClaimStatusEnum.NORMAL) { + if (fixSet.has(record.address)) { + fix += (currentTotal * BigInt(val.rate)) / 100n + fixAndAba += (currentTotal * BigInt(val.rate)) / 100n + } else if (bindSet.has(record.address)) { + bind += (currentTotal * BigInt(val.rate)) / 100n + } else { + available += (currentTotal * BigInt(val.rate)) / 100n + fixAndAba += (currentTotal * BigInt(val.rate)) / 100n + } + } + } + } + console.log('bind: ', removeSmallNum(bind)) + console.log('fix: ', removeSmallNum(fix)) + console.log('available: ', removeSmallNum(available)) + console.log('fixAndAba: ', removeSmallNum(fixAndAba)) + +} + +;(async () => { + try { + // await queryFixData() + // await checkFixData() + // await queryAll() + await queryRemain() + } catch (e) { + console.log(e) + } + process.exit(0) +})() diff --git a/src/models/chain/TokenClaimRecord.ts b/src/models/chain/TokenClaimRecord.ts index 68da644..0b0cd16 100644 --- a/src/models/chain/TokenClaimRecord.ts +++ b/src/models/chain/TokenClaimRecord.ts @@ -3,7 +3,7 @@ import { dbconn } from 'decorators/dbconn' import { BaseModule } from '../Base' import { GeneralEventClass } from './GeneralEvent' -@dbconn() +@dbconn('chain2') @index({ chain: 1, address: 1, token: 1, account: 1 }, { unique: true }) @index({ chain: 1, address: 1, token: 1, user: 1 }, { unique: true }) @modelOptions({ diff --git a/src/services/chain.svr.ts b/src/services/chain.svr.ts index a379412..ed773d2 100644 --- a/src/services/chain.svr.ts +++ b/src/services/chain.svr.ts @@ -172,8 +172,8 @@ export const fetchClaimStatus = async (address: string, taskId: string) => { export const updateClaimStatus = async ( {address, account, token, records}: {address: string, account: string, token: string, records: Partial[]}) => { - const chain = process.env.CHAIN + '' - const record = await TokenClaimRecord.findOne({ chain, address, account, token }) + const chain = process.env.CLAIM_CHAIN + '' + const record = await TokenClaimRecord.findOne({ chain, address: address.toLowerCase(), token: token.toLowerCase(), account }) if (!record) { return } @@ -185,6 +185,8 @@ export const updateClaimStatus = async ( if (value.status == ClaimStatusEnum.NORMAL && (bitTotal & 1n << bit) > 0n ) { value.status = ClaimStatusEnum.CLAIMED changed = true + //@ts-ignore + item.markModified('claimStatus') } } if (changed) { diff --git a/yarn.lock b/yarn.lock index eb59a59..3c92c72 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3442,6 +3442,13 @@ fs-extra@^4.0.2: jsonfile "^4.0.0" universalify "^0.1.0" +fs-jetpack@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/fs-jetpack/-/fs-jetpack-5.1.0.tgz#dcd34d709b69007c9dc2420a6f2b9e8f986cff0d" + integrity sha512-Xn4fDhLydXkuzepZVsr02jakLlmoARPy+YWIclo4kh0GyNGUHnTqeH/w/qIsVn50dFxtp8otPL2t/HcPJBbxUA== + dependencies: + minimatch "^5.1.0" + fs-minipass@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" @@ -4870,6 +4877,13 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" +minimatch@^5.1.0: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz"