Browse Source

Initial commit

windowdog 6 months ago
commit
ec6786ed0e
100 changed files with 21023 additions and 0 deletions
  1. 5 0
      .gitignore
  2. 8 0
      LICENSE
  3. 3 0
      README.md
  4. 66 0
      geckodriver.log
  5. 916 0
      package-lock.json
  6. 21 0
      package.json
  7. 17 0
      require_python.txt
  8. 5 0
      requirements.txt
  9. 37 0
      src/code/000.json
  10. 25 0
      src/code/0000.py
  11. 104 0
      src/code/00000_test_dexscreener_playwright_chrome.py
  12. 104 0
      src/code/00000_test_dexscreener_playwright_edge.py
  13. 25 0
      src/code/0000_test_df.py
  14. 106 0
      src/code/000_01_test_dexscreener_playwright.py
  15. 9 0
      src/code/000_test.py
  16. 37 0
      src/code/001_merge_newpair.py
  17. 74 0
      src/code/002_01_notuse_handle_dalao_tran_pump.py
  18. 370 0
      src/code/002_02_filter_dalao_tran_dexscreener.py
  19. 115 0
      src/code/002_02_othermethod_get_gongtong_dalao.py
  20. 81 0
      src/code/002_02_zzz_01_get_onetokenprofit_dalao.py
  21. 47 0
      src/code/002_02_zzz_02_get_dalao_solscan.py
  22. 74 0
      src/code/002_03_unhandle_dalao_drop0balance_notuse.py
  23. 259 0
      src/code/002_04_get_dalaotokentransfer_find_relationship.py
  24. 127 0
      src/code/002_05_find_dalaotokentransfer_relationship.py
  25. 273 0
      src/code/002_06_filter_replation_dalao_tran_dexscreener.py
  26. 42 0
      src/code/002_06_get_new_dalao_profit.py
  27. 226 0
      src/code/002_filter_dalao_tran_dexscreener_old.py
  28. 61 0
      src/code/002_filter_simple_topdalao.py
  29. 50 0
      src/code/003_get_onhand_dalao_notuse.py
  30. 45 0
      src/code/003_new_get_onhand_dalao.py
  31. 137 0
      src/code/004_01_get_tokentransfer_txhash_bysolscan_playwright.py
  32. 82 0
      src/code/004_02_get_dalaotxhash_solscan.py
  33. 247 0
      src/code/004_03_get_dalaotransfer_solanafm_txhash.py
  34. 300 0
      src/code/004_notuse_get_dalaotransfer_solanafm_byaccount.py
  35. 89 0
      src/code/005_dalaotransfer_dropduplicate_solanafm.py
  36. 170 0
      src/code/006_get_transaction_st_solanafm.py
  37. 326 0
      src/code/007_get_configtoken_st_solanafm.py
  38. 230 0
      src/code/007_get_configtoken_st_solanafm_old.py
  39. 308 0
      src/code/007_zzz_02_merge_relation_configtoken_st_solanafm.py
  40. 1088 0
      src/code/008_get_profit_st_solanafm.py
  41. 114 0
      src/code/009_handle_analysis_solanafm.py
  42. 208 0
      src/code/010_add_forselecteddalao_get_sametoken_dalao.py
  43. 263 0
      src/code/010_add_forselecteddalao_get_sametoken_dalao_dropsometoken.py
  44. 231 0
      src/code/010_get_sametoken_dalao.py
  45. 247 0
      src/code/010_get_sametoken_dalao_dropsometoken.py
  46. 486 0
      src/code/011_01_new_get_profit_st_solanafm.py
  47. 78 0
      src/code/011_02_get_increase_totalana_anaing_dalao.py
  48. 359 0
      src/code/011_nouse_3dalao_new_get_profit_st_solanafm.py
  49. 156 0
      src/code/012_new_3dalao_get_onetoken_profit.py
  50. 154 0
      src/code/012_new_get_onetoken_profit.py
  51. 121 0
      src/code/021_01_selected_get_tokentransfer_txhash_bysolscan_playwright.py
  52. 87 0
      src/code/021_02_get_dalaotxhash_solscan.py
  53. 249 0
      src/code/021_03_get_dalaotransfer_solanafm_txhash.py
  54. 309 0
      src/code/021_nouse_get_selected_dalaotransfer_solanafm.py
  55. 90 0
      src/code/022_selected_dalaotransfer_dropduplicate_solanafm.py
  56. 171 0
      src/code/023_seleted_get_transaction_st_solanafm.py
  57. 327 0
      src/code/024_selected_get_configtoken_st_solanafm.py
  58. 1010 0
      src/code/025_selected_get_profit_st_solanafm.py
  59. 185 0
      src/code/031_get_dalao_kuisun_per.py
  60. 36 0
      src/code/032_add_get_somedalao_totalana.py
  61. 423 0
      src/code/1101_get_activities_bysolscan_playwright.py
  62. 378 0
      src/code/1101_get_activities_bysolscan_py
  63. 381 0
      src/code/1101_get_activities_bysolscan_selenium_py
  64. 152 0
      src/code/1102_get_config_transaction.py
  65. 540 0
      src/code/1103_get_profit_st_solscan.py
  66. 110 0
      src/code/1104_handle_analysis_solscan.py
  67. 132 0
      src/code/2000_get_dalao_tran_defined.py
  68. 85 0
      src/code/2001_add_merge_defined.py
  69. 70 0
      src/code/2001_getbalance_eth.py
  70. 135 0
      src/code/2001_getbalance_usdc.py
  71. 440 0
      src/code/2002_gmgn_playwright_chrome.py
  72. 78 0
      src/code/2003_check_dalao_tokens_ispump.py
  73. 247 0
      src/code/2004_gmgn_handle_ori_pnl.py
  74. 1 0
      src/code/aa.html
  75. 41 0
      src/code/aa.json
  76. 45 0
      src/code/aa02.html
  77. 191 0
      src/code/aft_whole_page.html
  78. 56 0
      src/code/base_class.js
  79. 368 0
      src/code/base_class.py
  80. 12 0
      src/code/base_library.json
  81. 149 0
      src/code/bef_whole_page.html
  82. 15 0
      src/code/get_pageselect_element_solscan.js
  83. 137 0
      src/code/get_swapactivaties.js
  84. 128 0
      src/code/get_swapactivaties_thead_body_dom.js
  85. 2435 0
      src/code/nohup.out
  86. 190 0
      src/code/ori_dextools_sel_py
  87. 33 0
      src/code/set_utctime_solscan.js
  88. 152 0
      src/code/tamper_dexscreen_getnewpair_test.js
  89. 313 0
      src/code/tamper_dexscreener_gettop.js
  90. 296 0
      src/code/tamper_dexscreengetitran_solana.js
  91. 297 0
      src/code/tamper_get_pump_trader.js
  92. 379 0
      src/code/tamper_get_tran_scroll_defined.js
  93. 340 0
      src/code/tamper_has_startdate_dexscreengetitran_solana_scroll.js
  94. 238 0
      src/code/tamper_listen_dexscreener_token_long.js
  95. 240 0
      src/code/tamper_listen_dexscreener_token_short.js
  96. 318 0
      src/code/tamper_notuse_solscan_swapactivaties copy.js
  97. 128 0
      src/code/tamper_nouse_solscan_swapactivaties.js
  98. 1 0
      src/code/tempCodeRunnerFile.py
  99. 73 0
      src/code/test_get_tokenchanges.py
  100. 86 0
      src/code/zzzzzzzzzzzz_test_defined_playwright_chrome.py

+ 5 - 0
.gitignore

@@ -0,0 +1,5 @@
+/node_modules
+__pycache__/
+*.pyc
+.history/
+src/library/browsercookie/

+ 8 - 0
LICENSE

@@ -0,0 +1,8 @@
+MIT License
+Copyright (c) <year> <copyright holders>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ 3 - 0
README.md

@@ -0,0 +1,3 @@
+# finddalao_sol
+
+finddalao_sol

File diff suppressed because it is too large
+ 66 - 0
geckodriver.log


+ 916 - 0
package-lock.json

@@ -0,0 +1,916 @@
+{
+  "name": "solana",
+  "version": "1.0.0",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "solana",
+      "version": "1.0.0",
+      "license": "ISC",
+      "dependencies": {
+        "@debridge-finance/solana-transaction-parser": "^2.0.1",
+        "@solana/spl-token": "^0.4.1",
+        "@solana/web3.js": "^1.91.1",
+        "axios": "^1.6.8",
+        "fs-extra": "^11.2.0",
+        "jsonrpc": "^0.1.1",
+        "node-cron": "^3.0.3"
+      }
+    },
+    "node_modules/@babel/runtime": {
+      "version": "7.24.0",
+      "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.24.0.tgz",
+      "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==",
+      "dependencies": {
+        "regenerator-runtime": "^0.14.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@coral-xyz/anchor": {
+      "version": "0.29.0",
+      "resolved": "https://registry.npmmirror.com/@coral-xyz/anchor/-/anchor-0.29.0.tgz",
+      "integrity": "sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA==",
+      "dependencies": {
+        "@coral-xyz/borsh": "^0.29.0",
+        "@noble/hashes": "^1.3.1",
+        "@solana/web3.js": "^1.68.0",
+        "bn.js": "^5.1.2",
+        "bs58": "^4.0.1",
+        "buffer-layout": "^1.2.2",
+        "camelcase": "^6.3.0",
+        "cross-fetch": "^3.1.5",
+        "crypto-hash": "^1.3.0",
+        "eventemitter3": "^4.0.7",
+        "pako": "^2.0.3",
+        "snake-case": "^3.0.4",
+        "superstruct": "^0.15.4",
+        "toml": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=11"
+      }
+    },
+    "node_modules/@coral-xyz/anchor/node_modules/superstruct": {
+      "version": "0.15.5",
+      "resolved": "https://registry.npmmirror.com/superstruct/-/superstruct-0.15.5.tgz",
+      "integrity": "sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ=="
+    },
+    "node_modules/@coral-xyz/borsh": {
+      "version": "0.29.0",
+      "resolved": "https://registry.npmmirror.com/@coral-xyz/borsh/-/borsh-0.29.0.tgz",
+      "integrity": "sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ==",
+      "dependencies": {
+        "bn.js": "^5.1.2",
+        "buffer-layout": "^1.2.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "@solana/web3.js": "^1.68.0"
+      }
+    },
+    "node_modules/@coral-xyz/spl-token": {
+      "version": "0.29.0",
+      "resolved": "https://registry.npmmirror.com/@coral-xyz/spl-token/-/spl-token-0.29.0.tgz",
+      "integrity": "sha512-NgkbBGI87pUPmf0FNuPoizwQImKLVt1hc28ylxTvszbRg19azqeLs1hBK7WGHV2RXDN+RqH8dASb+7Gj1aXJMw==",
+      "dependencies": {
+        "@coral-xyz/anchor": "=0.29.0",
+        "@native-to-anchor/buffer-layout": "=0.1.0"
+      }
+    },
+    "node_modules/@debridge-finance/solana-transaction-parser": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/@debridge-finance/solana-transaction-parser/-/solana-transaction-parser-2.0.1.tgz",
+      "integrity": "sha512-jV0TOwQQSVvFqKfNgHmlzyO7054QkscYHkOhLIgdJdoWI6TQbZht/6So+sMCkvBvAEo9fC50JdZRfzmJZIF8JA==",
+      "dependencies": {
+        "@coral-xyz/anchor": "^0.29.0",
+        "@coral-xyz/spl-token": "^0.29.0",
+        "@solana/spl-token": "^0.3.8",
+        "@solana/web3.js": "^1.87.0",
+        "buffer": "6.0.3"
+      },
+      "peerDependencies": {
+        "@solana/buffer-layout": "^4.0.0",
+        "@solana/buffer-layout-utils": "^0.2.0"
+      }
+    },
+    "node_modules/@debridge-finance/solana-transaction-parser/node_modules/@solana/spl-token": {
+      "version": "0.3.11",
+      "resolved": "https://registry.npmmirror.com/@solana/spl-token/-/spl-token-0.3.11.tgz",
+      "integrity": "sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ==",
+      "dependencies": {
+        "@solana/buffer-layout": "^4.0.0",
+        "@solana/buffer-layout-utils": "^0.2.0",
+        "@solana/spl-token-metadata": "^0.1.2",
+        "buffer": "^6.0.3"
+      },
+      "engines": {
+        "node": ">=16"
+      },
+      "peerDependencies": {
+        "@solana/web3.js": "^1.88.0"
+      }
+    },
+    "node_modules/@native-to-anchor/buffer-layout": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmmirror.com/@native-to-anchor/buffer-layout/-/buffer-layout-0.1.0.tgz",
+      "integrity": "sha512-7Ykz9KRAm53XqHj5blDUKPX+OXAPO4GZBW4zJhfHGIAbzmqsUFh9kMqR66Bak3mp6wyv1OVTwSr8ZGHKswPxDg==",
+      "dependencies": {
+        "@solana/buffer-layout": "=4.0.0",
+        "@solana/buffer-layout-utils": "=0.2.0"
+      }
+    },
+    "node_modules/@native-to-anchor/buffer-layout/node_modules/@solana/buffer-layout": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/@solana/buffer-layout/-/buffer-layout-4.0.0.tgz",
+      "integrity": "sha512-lR0EMP2HC3+Mxwd4YcnZb0smnaDw7Bl2IQWZiTevRH5ZZBZn6VRWn3/92E3qdU4SSImJkA6IDHawOHAnx/qUvQ==",
+      "dependencies": {
+        "buffer": "~6.0.3"
+      },
+      "engines": {
+        "node": ">=5.10"
+      }
+    },
+    "node_modules/@noble/curves": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmmirror.com/@noble/curves/-/curves-1.4.0.tgz",
+      "integrity": "sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==",
+      "dependencies": {
+        "@noble/hashes": "1.4.0"
+      }
+    },
+    "node_modules/@noble/hashes": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmmirror.com/@noble/hashes/-/hashes-1.4.0.tgz",
+      "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==",
+      "engines": {
+        "node": ">= 16"
+      }
+    },
+    "node_modules/@solana/buffer-layout": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmmirror.com/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz",
+      "integrity": "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==",
+      "dependencies": {
+        "buffer": "~6.0.3"
+      },
+      "engines": {
+        "node": ">=5.10"
+      }
+    },
+    "node_modules/@solana/buffer-layout-utils": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmmirror.com/@solana/buffer-layout-utils/-/buffer-layout-utils-0.2.0.tgz",
+      "integrity": "sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==",
+      "dependencies": {
+        "@solana/buffer-layout": "^4.0.0",
+        "@solana/web3.js": "^1.32.0",
+        "bigint-buffer": "^1.1.5",
+        "bignumber.js": "^9.0.1"
+      },
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@solana/codecs-core": {
+      "version": "2.0.0-experimental.8618508",
+      "resolved": "https://registry.npmmirror.com/@solana/codecs-core/-/codecs-core-2.0.0-experimental.8618508.tgz",
+      "integrity": "sha512-JCz7mKjVKtfZxkuDtwMAUgA7YvJcA2BwpZaA1NOLcted4OMC4Prwa3DUe3f3181ixPYaRyptbF0Ikq2MbDkYEA=="
+    },
+    "node_modules/@solana/codecs-data-structures": {
+      "version": "2.0.0-experimental.8618508",
+      "resolved": "https://registry.npmmirror.com/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-experimental.8618508.tgz",
+      "integrity": "sha512-sLpjL9sqzaDdkloBPV61Rht1tgaKq98BCtIKRuyscIrmVPu3wu0Bavk2n/QekmUzaTsj7K1pVSniM0YqCdnEBw==",
+      "dependencies": {
+        "@solana/codecs-core": "2.0.0-experimental.8618508",
+        "@solana/codecs-numbers": "2.0.0-experimental.8618508"
+      }
+    },
+    "node_modules/@solana/codecs-numbers": {
+      "version": "2.0.0-experimental.8618508",
+      "resolved": "https://registry.npmmirror.com/@solana/codecs-numbers/-/codecs-numbers-2.0.0-experimental.8618508.tgz",
+      "integrity": "sha512-EXQKfzFr3CkKKNzKSZPOOOzchXsFe90TVONWsSnVkonO9z+nGKALE0/L9uBmIFGgdzhhU9QQVFvxBMclIDJo2Q==",
+      "dependencies": {
+        "@solana/codecs-core": "2.0.0-experimental.8618508"
+      }
+    },
+    "node_modules/@solana/codecs-strings": {
+      "version": "2.0.0-experimental.8618508",
+      "resolved": "https://registry.npmmirror.com/@solana/codecs-strings/-/codecs-strings-2.0.0-experimental.8618508.tgz",
+      "integrity": "sha512-b2yhinr1+oe+JDmnnsV0641KQqqDG8AQ16Z/x7GVWO+AWHMpRlHWVXOq8U1yhPMA4VXxl7i+D+C6ql0VGFp0GA==",
+      "dependencies": {
+        "@solana/codecs-core": "2.0.0-experimental.8618508",
+        "@solana/codecs-numbers": "2.0.0-experimental.8618508"
+      },
+      "peerDependencies": {
+        "fastestsmallesttextencoderdecoder": "^1.0.22"
+      }
+    },
+    "node_modules/@solana/options": {
+      "version": "2.0.0-experimental.8618508",
+      "resolved": "https://registry.npmmirror.com/@solana/options/-/options-2.0.0-experimental.8618508.tgz",
+      "integrity": "sha512-fy/nIRAMC3QHvnKi63KEd86Xr/zFBVxNW4nEpVEU2OT0gCEKwHY4Z55YHf7XujhyuM3PNpiBKg/YYw5QlRU4vg==",
+      "dependencies": {
+        "@solana/codecs-core": "2.0.0-experimental.8618508",
+        "@solana/codecs-numbers": "2.0.0-experimental.8618508"
+      }
+    },
+    "node_modules/@solana/spl-token": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmmirror.com/@solana/spl-token/-/spl-token-0.4.1.tgz",
+      "integrity": "sha512-DEe15GI0l+XLHwtau/3GUwGQJ9YY/VWNE0k/QuXaaGKo4adMZLEAIQUktRc/S2sRqPjvUdR5anZGxQ9p5khWZw==",
+      "dependencies": {
+        "@solana/buffer-layout": "^4.0.0",
+        "@solana/buffer-layout-utils": "^0.2.0",
+        "@solana/spl-token-metadata": "^0.1.2",
+        "buffer": "^6.0.3"
+      },
+      "engines": {
+        "node": ">=16"
+      },
+      "peerDependencies": {
+        "@solana/web3.js": "^1.90.0"
+      }
+    },
+    "node_modules/@solana/spl-token-metadata": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmmirror.com/@solana/spl-token-metadata/-/spl-token-metadata-0.1.2.tgz",
+      "integrity": "sha512-hJYnAJNkDrtkE2Q41YZhCpeOGU/0JgRFXbtrtOuGGeKc3pkEUHB9DDoxZAxx+XRno13GozUleyBi0qypz4c3bw==",
+      "dependencies": {
+        "@solana/codecs-core": "2.0.0-experimental.8618508",
+        "@solana/codecs-data-structures": "2.0.0-experimental.8618508",
+        "@solana/codecs-numbers": "2.0.0-experimental.8618508",
+        "@solana/codecs-strings": "2.0.0-experimental.8618508",
+        "@solana/options": "2.0.0-experimental.8618508",
+        "@solana/spl-type-length-value": "0.1.0"
+      },
+      "engines": {
+        "node": ">=16"
+      },
+      "peerDependencies": {
+        "@solana/web3.js": "^1.87.6"
+      }
+    },
+    "node_modules/@solana/spl-type-length-value": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmmirror.com/@solana/spl-type-length-value/-/spl-type-length-value-0.1.0.tgz",
+      "integrity": "sha512-JBMGB0oR4lPttOZ5XiUGyvylwLQjt1CPJa6qQ5oM+MBCndfjz2TKKkw0eATlLLcYmq1jBVsNlJ2cD6ns2GR7lA==",
+      "dependencies": {
+        "buffer": "^6.0.3"
+      },
+      "engines": {
+        "node": ">=16"
+      }
+    },
+    "node_modules/@solana/web3.js": {
+      "version": "1.91.1",
+      "resolved": "https://registry.npmmirror.com/@solana/web3.js/-/web3.js-1.91.1.tgz",
+      "integrity": "sha512-cPgjZXm688oM9cULvJ8u2VH6Qp5rvptE1N1VODVxn2mAbpZsWrvWNPjmASkMYT/HzyrtqFkPvFdSHg8Xjt7aQA==",
+      "dependencies": {
+        "@babel/runtime": "^7.23.4",
+        "@noble/curves": "^1.2.0",
+        "@noble/hashes": "^1.3.3",
+        "@solana/buffer-layout": "^4.0.1",
+        "agentkeepalive": "^4.5.0",
+        "bigint-buffer": "^1.1.5",
+        "bn.js": "^5.2.1",
+        "borsh": "^0.7.0",
+        "bs58": "^4.0.1",
+        "buffer": "6.0.3",
+        "fast-stable-stringify": "^1.0.0",
+        "jayson": "^4.1.0",
+        "node-fetch": "^2.7.0",
+        "rpc-websockets": "^7.5.1",
+        "superstruct": "^0.14.2"
+      }
+    },
+    "node_modules/@types/connect": {
+      "version": "3.4.38",
+      "resolved": "https://registry.npmmirror.com/@types/connect/-/connect-3.4.38.tgz",
+      "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
+      "dependencies": {
+        "@types/node": "*"
+      }
+    },
+    "node_modules/@types/node": {
+      "version": "12.20.55",
+      "resolved": "https://registry.npmmirror.com/@types/node/-/node-12.20.55.tgz",
+      "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="
+    },
+    "node_modules/@types/ws": {
+      "version": "7.4.7",
+      "resolved": "https://registry.npmmirror.com/@types/ws/-/ws-7.4.7.tgz",
+      "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==",
+      "dependencies": {
+        "@types/node": "*"
+      }
+    },
+    "node_modules/agentkeepalive": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz",
+      "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==",
+      "dependencies": {
+        "humanize-ms": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 8.0.0"
+      }
+    },
+    "node_modules/asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+    },
+    "node_modules/axios": {
+      "version": "1.6.8",
+      "resolved": "https://registry.npmmirror.com/axios/-/axios-1.6.8.tgz",
+      "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==",
+      "dependencies": {
+        "follow-redirects": "^1.15.6",
+        "form-data": "^4.0.0",
+        "proxy-from-env": "^1.1.0"
+      }
+    },
+    "node_modules/base-x": {
+      "version": "3.0.9",
+      "resolved": "https://registry.npmmirror.com/base-x/-/base-x-3.0.9.tgz",
+      "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==",
+      "dependencies": {
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "node_modules/base64-js": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz",
+      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
+    },
+    "node_modules/bigint-buffer": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmmirror.com/bigint-buffer/-/bigint-buffer-1.1.5.tgz",
+      "integrity": "sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==",
+      "hasInstallScript": true,
+      "dependencies": {
+        "bindings": "^1.3.0"
+      },
+      "engines": {
+        "node": ">= 10.0.0"
+      }
+    },
+    "node_modules/bignumber.js": {
+      "version": "9.1.2",
+      "resolved": "https://registry.npmmirror.com/bignumber.js/-/bignumber.js-9.1.2.tgz",
+      "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/bindings": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmmirror.com/bindings/-/bindings-1.5.0.tgz",
+      "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+      "dependencies": {
+        "file-uri-to-path": "1.0.0"
+      }
+    },
+    "node_modules/bn.js": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-5.2.1.tgz",
+      "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ=="
+    },
+    "node_modules/borsh": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmmirror.com/borsh/-/borsh-0.7.0.tgz",
+      "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==",
+      "dependencies": {
+        "bn.js": "^5.2.0",
+        "bs58": "^4.0.0",
+        "text-encoding-utf-8": "^1.0.2"
+      }
+    },
+    "node_modules/bs58": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmmirror.com/bs58/-/bs58-4.0.1.tgz",
+      "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==",
+      "dependencies": {
+        "base-x": "^3.0.2"
+      }
+    },
+    "node_modules/buffer": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmmirror.com/buffer/-/buffer-6.0.3.tgz",
+      "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+      "dependencies": {
+        "base64-js": "^1.3.1",
+        "ieee754": "^1.2.1"
+      }
+    },
+    "node_modules/buffer-layout": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/buffer-layout/-/buffer-layout-1.2.2.tgz",
+      "integrity": "sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA==",
+      "engines": {
+        "node": ">=4.5"
+      }
+    },
+    "node_modules/bufferutil": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmmirror.com/bufferutil/-/bufferutil-4.0.8.tgz",
+      "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==",
+      "hasInstallScript": true,
+      "optional": true,
+      "dependencies": {
+        "node-gyp-build": "^4.3.0"
+      },
+      "engines": {
+        "node": ">=6.14.2"
+      }
+    },
+    "node_modules/camelcase": {
+      "version": "6.3.0",
+      "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz",
+      "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "dependencies": {
+        "delayed-stream": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/commander": {
+      "version": "2.20.3",
+      "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz",
+      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+    },
+    "node_modules/cross-fetch": {
+      "version": "3.1.8",
+      "resolved": "https://registry.npmmirror.com/cross-fetch/-/cross-fetch-3.1.8.tgz",
+      "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==",
+      "dependencies": {
+        "node-fetch": "^2.6.12"
+      }
+    },
+    "node_modules/crypto-hash": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/crypto-hash/-/crypto-hash-1.3.0.tgz",
+      "integrity": "sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/delay": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/delay/-/delay-5.0.0.tgz",
+      "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/dot-case": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmmirror.com/dot-case/-/dot-case-3.0.4.tgz",
+      "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+      "dependencies": {
+        "no-case": "^3.0.4",
+        "tslib": "^2.0.3"
+      }
+    },
+    "node_modules/es6-promise": {
+      "version": "4.2.8",
+      "resolved": "https://registry.npmmirror.com/es6-promise/-/es6-promise-4.2.8.tgz",
+      "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w=="
+    },
+    "node_modules/es6-promisify": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/es6-promisify/-/es6-promisify-5.0.0.tgz",
+      "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==",
+      "dependencies": {
+        "es6-promise": "^4.0.3"
+      }
+    },
+    "node_modules/eventemitter3": {
+      "version": "4.0.7",
+      "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz",
+      "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
+    },
+    "node_modules/eyes": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmmirror.com/eyes/-/eyes-0.1.8.tgz",
+      "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==",
+      "engines": {
+        "node": "> 0.1.90"
+      }
+    },
+    "node_modules/fast-stable-stringify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz",
+      "integrity": "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag=="
+    },
+    "node_modules/fastestsmallesttextencoderdecoder": {
+      "version": "1.0.22",
+      "resolved": "https://registry.npmmirror.com/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz",
+      "integrity": "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==",
+      "peer": true
+    },
+    "node_modules/file-uri-to-path": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="
+    },
+    "node_modules/follow-redirects": {
+      "version": "1.15.6",
+      "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.6.tgz",
+      "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
+      "engines": {
+        "node": ">=4.0"
+      },
+      "peerDependenciesMeta": {
+        "debug": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/form-data": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz",
+      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+      "dependencies": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.8",
+        "mime-types": "^2.1.12"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/fs-extra": {
+      "version": "11.2.0",
+      "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.2.0.tgz",
+      "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
+      "dependencies": {
+        "graceful-fs": "^4.2.0",
+        "jsonfile": "^6.0.1",
+        "universalify": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=14.14"
+      }
+    },
+    "node_modules/graceful-fs": {
+      "version": "4.2.11",
+      "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
+      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
+    },
+    "node_modules/humanize-ms": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/humanize-ms/-/humanize-ms-1.2.1.tgz",
+      "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==",
+      "dependencies": {
+        "ms": "^2.0.0"
+      }
+    },
+    "node_modules/ieee754": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz",
+      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
+    },
+    "node_modules/isomorphic-ws": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmmirror.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz",
+      "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==",
+      "peerDependencies": {
+        "ws": "*"
+      }
+    },
+    "node_modules/jayson": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmmirror.com/jayson/-/jayson-4.1.0.tgz",
+      "integrity": "sha512-R6JlbyLN53Mjku329XoRT2zJAE6ZgOQ8f91ucYdMCD4nkGCF9kZSrcGXpHIU4jeKj58zUZke2p+cdQchU7Ly7A==",
+      "dependencies": {
+        "@types/connect": "^3.4.33",
+        "@types/node": "^12.12.54",
+        "@types/ws": "^7.4.4",
+        "commander": "^2.20.3",
+        "delay": "^5.0.0",
+        "es6-promisify": "^5.0.0",
+        "eyes": "^0.1.8",
+        "isomorphic-ws": "^4.0.1",
+        "json-stringify-safe": "^5.0.1",
+        "JSONStream": "^1.3.5",
+        "uuid": "^8.3.2",
+        "ws": "^7.4.5"
+      },
+      "bin": {
+        "jayson": "bin/jayson.js"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/json-stringify-safe": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+      "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="
+    },
+    "node_modules/jsonfile": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz",
+      "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+      "dependencies": {
+        "universalify": "^2.0.0"
+      },
+      "optionalDependencies": {
+        "graceful-fs": "^4.1.6"
+      }
+    },
+    "node_modules/jsonparse": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmmirror.com/jsonparse/-/jsonparse-1.3.1.tgz",
+      "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
+      "engines": [
+        "node >= 0.2.0"
+      ]
+    },
+    "node_modules/jsonrpc": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmmirror.com/jsonrpc/-/jsonrpc-0.1.1.tgz",
+      "integrity": "sha512-UOm/1TlbCZRNe2Z4RjLePDoS5aNOw6+nyYp/9oqgCycpPVbryPEukTY4b352UsemgccCV+mWhsAHwEOto8MYzQ==",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/JSONStream": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmmirror.com/JSONStream/-/JSONStream-1.3.5.tgz",
+      "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
+      "dependencies": {
+        "jsonparse": "^1.2.0",
+        "through": ">=2.2.7 <3"
+      },
+      "bin": {
+        "JSONStream": "bin.js"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/lower-case": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/lower-case/-/lower-case-2.0.2.tgz",
+      "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+      "dependencies": {
+        "tslib": "^2.0.3"
+      }
+    },
+    "node_modules/mime-db": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mime-types": {
+      "version": "2.1.35",
+      "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
+      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+      "dependencies": {
+        "mime-db": "1.52.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/ms": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+    },
+    "node_modules/no-case": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmmirror.com/no-case/-/no-case-3.0.4.tgz",
+      "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+      "dependencies": {
+        "lower-case": "^2.0.2",
+        "tslib": "^2.0.3"
+      }
+    },
+    "node_modules/node-cron": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmmirror.com/node-cron/-/node-cron-3.0.3.tgz",
+      "integrity": "sha512-dOal67//nohNgYWb+nWmg5dkFdIwDm8EpeGYMekPMrngV3637lqnX0lbUcCtgibHTz6SEz7DAIjKvKDFYCnO1A==",
+      "dependencies": {
+        "uuid": "8.3.2"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/node-fetch": {
+      "version": "2.7.0",
+      "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.7.0.tgz",
+      "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+      "dependencies": {
+        "whatwg-url": "^5.0.0"
+      },
+      "engines": {
+        "node": "4.x || >=6.0.0"
+      },
+      "peerDependencies": {
+        "encoding": "^0.1.0"
+      },
+      "peerDependenciesMeta": {
+        "encoding": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/node-gyp-build": {
+      "version": "4.8.0",
+      "resolved": "https://registry.npmmirror.com/node-gyp-build/-/node-gyp-build-4.8.0.tgz",
+      "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==",
+      "optional": true,
+      "bin": {
+        "node-gyp-build": "bin.js",
+        "node-gyp-build-optional": "optional.js",
+        "node-gyp-build-test": "build-test.js"
+      }
+    },
+    "node_modules/pako": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/pako/-/pako-2.1.0.tgz",
+      "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug=="
+    },
+    "node_modules/proxy-from-env": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+    },
+    "node_modules/regenerator-runtime": {
+      "version": "0.14.1",
+      "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+      "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
+    },
+    "node_modules/rpc-websockets": {
+      "version": "7.9.0",
+      "resolved": "https://registry.npmmirror.com/rpc-websockets/-/rpc-websockets-7.9.0.tgz",
+      "integrity": "sha512-DwKewQz1IUA5wfLvgM8wDpPRcr+nWSxuFxx5CbrI2z/MyyZ4nXLM86TvIA+cI1ZAdqC8JIBR1mZR55dzaLU+Hw==",
+      "dependencies": {
+        "@babel/runtime": "^7.17.2",
+        "eventemitter3": "^4.0.7",
+        "uuid": "^8.3.2",
+        "ws": "^8.5.0"
+      },
+      "optionalDependencies": {
+        "bufferutil": "^4.0.1",
+        "utf-8-validate": "^5.0.2"
+      }
+    },
+    "node_modules/rpc-websockets/node_modules/ws": {
+      "version": "8.16.0",
+      "resolved": "https://registry.npmmirror.com/ws/-/ws-8.16.0.tgz",
+      "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==",
+      "engines": {
+        "node": ">=10.0.0"
+      },
+      "peerDependencies": {
+        "bufferutil": "^4.0.1",
+        "utf-8-validate": ">=5.0.2"
+      },
+      "peerDependenciesMeta": {
+        "bufferutil": {
+          "optional": true
+        },
+        "utf-8-validate": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/safe-buffer": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+    },
+    "node_modules/snake-case": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmmirror.com/snake-case/-/snake-case-3.0.4.tgz",
+      "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==",
+      "dependencies": {
+        "dot-case": "^3.0.4",
+        "tslib": "^2.0.3"
+      }
+    },
+    "node_modules/superstruct": {
+      "version": "0.14.2",
+      "resolved": "https://registry.npmmirror.com/superstruct/-/superstruct-0.14.2.tgz",
+      "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ=="
+    },
+    "node_modules/text-encoding-utf-8": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz",
+      "integrity": "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg=="
+    },
+    "node_modules/through": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmmirror.com/through/-/through-2.3.8.tgz",
+      "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="
+    },
+    "node_modules/toml": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/toml/-/toml-3.0.0.tgz",
+      "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w=="
+    },
+    "node_modules/tr46": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz",
+      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+    },
+    "node_modules/tslib": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.6.2.tgz",
+      "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
+    },
+    "node_modules/universalify": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz",
+      "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+      "engines": {
+        "node": ">= 10.0.0"
+      }
+    },
+    "node_modules/utf-8-validate": {
+      "version": "5.0.10",
+      "resolved": "https://registry.npmmirror.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz",
+      "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==",
+      "hasInstallScript": true,
+      "optional": true,
+      "dependencies": {
+        "node-gyp-build": "^4.3.0"
+      },
+      "engines": {
+        "node": ">=6.14.2"
+      }
+    },
+    "node_modules/uuid": {
+      "version": "8.3.2",
+      "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz",
+      "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+      "bin": {
+        "uuid": "dist/bin/uuid"
+      }
+    },
+    "node_modules/webidl-conversions": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
+    },
+    "node_modules/whatwg-url": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz",
+      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+      "dependencies": {
+        "tr46": "~0.0.3",
+        "webidl-conversions": "^3.0.0"
+      }
+    },
+    "node_modules/ws": {
+      "version": "7.5.9",
+      "resolved": "https://registry.npmmirror.com/ws/-/ws-7.5.9.tgz",
+      "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
+      "engines": {
+        "node": ">=8.3.0"
+      },
+      "peerDependencies": {
+        "bufferutil": "^4.0.1",
+        "utf-8-validate": "^5.0.2"
+      },
+      "peerDependenciesMeta": {
+        "bufferutil": {
+          "optional": true
+        },
+        "utf-8-validate": {
+          "optional": true
+        }
+      }
+    }
+  }
+}

+ 21 - 0
package.json

@@ -0,0 +1,21 @@
+{
+  "name": "solana",
+  "version": "1.0.0",
+  "description": "",
+  "main": "test.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "keywords": [],
+  "author": "",
+  "license": "ISC",
+  "dependencies": {
+    "@debridge-finance/solana-transaction-parser": "^2.0.1",
+    "@solana/spl-token": "^0.4.1",
+    "@solana/web3.js": "^1.91.1",
+    "axios": "^1.6.8",
+    "fs-extra": "^11.2.0",
+    "jsonrpc": "^0.1.1",
+    "node-cron": "^3.0.3"
+  }
+}

+ 17 - 0
require_python.txt

@@ -0,0 +1,17 @@
+
+
+
+
+python 导出 使用项目依赖 
+
+
+
+pip install pipreqs
+
+
+
+pipreqs . --encoding=utf8 --force
+
+根据依赖安装包
+
+ pip install -r requriements.txt

+ 5 - 0
requirements.txt

@@ -0,0 +1,5 @@
+numpy==1.24.2
+openpyxl==3.1.2
+pandas==2.0.0
+playwright==1.44.0
+Requests==2.32.3

+ 37 - 0
src/code/000.json

@@ -0,0 +1,37 @@
+{
+    "status": "success",
+    "message": "Retrieved Transactions Info",
+    "result": {
+      "transactionHash": "2864BG9SeEyzPswkrDMbfUw1mXZH288DtWAFJN5UyMA2MUK6F9JusgKjD3rHs2LuX91nWVJJdHsLECsNCm8KUexZ",
+      "data": [
+  
+        {
+          "instructionIndex": 2,
+          "innerInstructionIndex": 1,
+          "action": "transfer",
+          "status": "Successful",
+          "source": "Fq8CxaXJ3t9ojtSrX94NSPjzfhHXbsxtFT77fGmmtFNx",
+          "sourceAssociation": "DfddZGftz9WoUuKTgyQ63EtYoJELGBMcfwBfqjyJ5gX3",
+          "destination": "5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1",
+          "destinationAssociation": "GALkLzmmPJ4SxckkF6dpXu9KHHsGeQMdk8uuu5z1FkJQ",
+          "token": "91twohwRxx7krutYJDhvXvLcSkK4WoT4rfz41QJ3pump",
+          "amount": 9159112223885,
+          "timestamp": 1719736924
+        },
+        {
+          "instructionIndex": 2,
+          "innerInstructionIndex": 2,
+          "action": "transfer",
+          "status": "Successful",
+          "source": "5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1",
+          "sourceAssociation": "FGqTsGZfVWPJ66bxjPQs9UtoN9d6knYCPzVcncWNVaAm",
+          "destination": "Fq8CxaXJ3t9ojtSrX94NSPjzfhHXbsxtFT77fGmmtFNx",
+          "destinationAssociation": "84sGnBkZUvntRbLFa3bu7V6zgPauz4BHYqeSzKtnGuih",
+          "token": "So11111111111111111111111111111111111111112",
+          "amount": 2979813161,
+          "timestamp": 1719736924
+        },
+ 
+      ]
+    }
+  }

+ 25 - 0
src/code/0000.py

@@ -0,0 +1,25 @@
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+ 
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+string="111.55K"
+
+string  = string.replace(r' ', '')
+
+print(string)
+
+
+ 

+ 104 - 0
src/code/00000_test_dexscreener_playwright_chrome.py

@@ -0,0 +1,104 @@
+
+# from datetime import datetime, timezone
+# from playwright.async_api import async_playwright, Playwright
+# from playwright.sync_api import expect
+from playwright.async_api import Playwright, async_playwright, expect
+import random
+import time
+import datetime
+import asyncio
+import pathlib
+import shutil
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+print('\n'*5)
+print(f"{'{:<6}'.format('enter')}  ----------------NOTE-----------NOTE---------------")
+
+
+def makedirpath(   folder):
+    pathlib.Path(folder).mkdir(exist_ok=True)
+
+def rmfolder(  folder):
+    if pathlib.Path(folder).exists():
+        shutil.rmtree(folder)
+
+
+# Python中windows路径的3种写法
+# 可以是以下这样写:
+utc_timeto = int(time.time())
+utc_timefrom = int(utc_timeto - 17*24*3600)
+utc_timeto = int(utc_timeto + 2*24*3600)
+
+ 
+
+
+async def do_some_thing(playwright      ):
+
+    # browser =  playwright.chromium.launch(headless=True)
+    context = await playwright.chromium.launch_persistent_context(user_data_dir=USER_DIR_PATH, accept_downloads=True, headless=False)
+    # context = await playwright.firefox.launch_persistent_context(user_data_dir=USER_DIR_PATH, accept_downloads=True, headless=False)
+    # context = browser.new_context()
+    context.set_default_timeout(9000)
+    # context = await browser.new_context()
+    arr_page = [None]*2
+    arr_page[0] = await context.new_page()
+    page = arr_page[0]
+    await arr_page[0].goto(
+        "https://dexscreener.com/new-pairs?rankBy=trendingScoreH6&order=desc&chainIds=solana&dexIds=raydium&minLiq=40000&minAge=36&min5MChg=3" , timeout=100000)
+    cur_arr_str_dalaoAddress =[15]
+
+    print(context.pages)
+    await page.wait_for_timeout(100000)
+    time.sleep(5.5)
+    await page.close()
+    # for str_dalaoAddress_idx in range(0, len(cur_arr_str_dalaoAddress)):
+
+    #     arr_page[1] = await context.new_page()
+    #     page = arr_page[1]
+    #     await page.goto(  "https://dexscreener.com/new-pairs?rankBy=trendingScoreH6&order=desc&chainIds=solana&dexIds=raydium&minLiq=40000&minAge=36&min5MChg=3" 
+    #                     , timeout=10000)
+
+    #     # async with page.expect_download() as download_info:
+    #     #     try:
+    #     #         await page.goto(str_dalaoTransferUrl, timeout=0)
+    #     #     except:
+    #     #         # Wait for the download to start
+    #     #         download = await download_info.value
+    #     #         # Wait for the download process to complete
+    #     #         print(await download.path())
+    #     #         # Save downloaded file somewhere
+    #     #         await download.save_as(baseclass.dalao_ori_tran_txhash_solscan_path / f"ori_txhash_{str_dalaoAddress}.csv")
+    #     #     await page.wait_for_timeout(200)
+    #     await page.wait_for_timeout(10000)
+    #     time.sleep(5.5)
+    #     await page.close()
+
+    await context.close()
+
+
+async def get_onedriver_swapactivities(    ):
+    async with async_playwright() as playwright:
+        # playwright = Playwright().start()
+        await do_some_thing(playwright )
+
+
+async def main():
+    print("enter main()")
+
+    await get_onedriver_swapactivities(        )
+
+
+ 
+ 
+USER_DIR_PATH =    "./browsercookie_path"
+makedirpath(USER_DIR_PATH)
+asyncio.run(main())
+# main()
+print(f"{'{:<6}'.format('END')}  ----------------NOTE-----------NOTE---------------")

+ 104 - 0
src/code/00000_test_dexscreener_playwright_edge.py

@@ -0,0 +1,104 @@
+
+# from datetime import datetime, timezone
+# from playwright.async_api import async_playwright, Playwright
+# from playwright.sync_api import expect
+from playwright.async_api import Playwright, async_playwright, expect
+import random
+import time
+import datetime
+import asyncio
+import pathlib
+import shutil
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+print('\n'*5)
+print(f"{'{:<6}'.format('enter')}  ----------------NOTE-----------NOTE---------------")
+
+
+def makedirpath(   folder):
+    pathlib.Path(folder).mkdir(exist_ok=True)
+
+def rmfolder(  folder):
+    if pathlib.Path(folder).exists():
+        shutil.rmtree(folder)
+
+
+# Python中windows路径的3种写法
+# 可以是以下这样写:
+utc_timeto = int(time.time())
+utc_timefrom = int(utc_timeto - 17*24*3600)
+utc_timeto = int(utc_timeto + 2*24*3600)
+
+ 
+
+
+async def do_some_thing(playwright      ):
+
+    # browser =  playwright.chromium.launch(headless=True)
+    context = await playwright.chromium.launch_persistent_context(  channel="msedge",user_data_dir=USER_DIR_PATH, accept_downloads=True, headless=False)
+    # context = await playwright.firefox.launch_persistent_context(user_data_dir=USER_DIR_PATH, accept_downloads=True, headless=False)
+    # context = browser.new_context()
+    context.set_default_timeout(9000)
+    # context = await browser.new_context()
+    arr_page = [None]*2
+    arr_page[0] = await context.new_page()
+    page = arr_page[0]
+    await arr_page[0].goto(
+        "https://dexscreener.com/new-pairs?rankBy=trendingScoreH6&order=desc&chainIds=solana&dexIds=raydium&minLiq=40000&minAge=36&min5MChg=3" , timeout=100000)
+    cur_arr_str_dalaoAddress =[15]
+
+    print(context.pages)
+    await page.wait_for_timeout(100000)
+    time.sleep(5.5)
+    await page.close()
+    # for str_dalaoAddress_idx in range(0, len(cur_arr_str_dalaoAddress)):
+
+    #     arr_page[1] = await context.new_page()
+    #     page = arr_page[1]
+    #     await page.goto(  "https://dexscreener.com/new-pairs?rankBy=trendingScoreH6&order=desc&chainIds=solana&dexIds=raydium&minLiq=40000&minAge=36&min5MChg=3" 
+    #                     , timeout=10000)
+
+    #     # async with page.expect_download() as download_info:
+    #     #     try:
+    #     #         await page.goto(str_dalaoTransferUrl, timeout=0)
+    #     #     except:
+    #     #         # Wait for the download to start
+    #     #         download = await download_info.value
+    #     #         # Wait for the download process to complete
+    #     #         print(await download.path())
+    #     #         # Save downloaded file somewhere
+    #     #         await download.save_as(baseclass.dalao_ori_tran_txhash_solscan_path / f"ori_txhash_{str_dalaoAddress}.csv")
+    #     #     await page.wait_for_timeout(200)
+    #     await page.wait_for_timeout(10000)
+    #     time.sleep(5.5)
+    #     await page.close()
+
+    await context.close()
+
+
+async def get_onedriver_swapactivities(    ):
+    async with async_playwright() as playwright:
+        # playwright = Playwright().start()
+        await do_some_thing(playwright )
+
+
+async def main():
+    print("enter main()")
+
+    await get_onedriver_swapactivities(        )
+
+
+ 
+ 
+USER_DIR_PATH =    "./browsercookie_path"
+makedirpath(USER_DIR_PATH)
+asyncio.run(main())
+# main()
+print(f"{'{:<6}'.format('END')}  ----------------NOTE-----------NOTE---------------")

+ 25 - 0
src/code/0000_test_df.py

@@ -0,0 +1,25 @@
+import pandas as pd
+
+# df = pd.read_csv("aaaa.csv",dtype=object)
+# df=df.head(10)
+
+# df=df[["swap_tokenaddress","platform","datetime"]]
+# df["datetime"] = pd.to_datetime(df["datetime"] )
+# print(df)
+
+# arr_time= df["datetime"].tolist()
+# print(arr_time)
+# print(arr_time[0].timestamp())
+# dif = arr_time[1].timestamp()-arr_time[0].timestamp()
+# print(dif)
+
+
+import pandas as pd
+
+# 2D list
+data = [[1, 2, 3,7], [4, 5, 6], [7, 8, 9]]
+
+# Convert to Pandas DataFrame
+df = pd.DataFrame(data)
+
+print(df)

+ 106 - 0
src/code/000_01_test_dexscreener_playwright.py

@@ -0,0 +1,106 @@
+
+# from datetime import datetime, timezone
+# from playwright.async_api import async_playwright, Playwright
+# from playwright.sync_api import expect
+from playwright.async_api import Playwright, async_playwright, expect
+import random
+
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+
+baseclass.makedirpath(baseclass.browsercookie_path)
+baseclass.makedirpath(baseclass.dalao_ori_tran_txhash_solscan_path)
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+# Python中windows路径的3种写法
+# 可以是以下这样写:
+utc_timeto = int(time.time())
+utc_timefrom = int(utc_timeto - 17*24*3600)
+utc_timeto = int(utc_timeto + 2*24*3600)
+
+def get_dalao_historysign_solscan(df):
+
+    utc_timeto = int(time.time())
+    utc_timefrom = int(utc_timeto - 17*24*3600)
+    utc_timeto = int(utc_timeto + 2*24*3600)
+    # 示例   https://api.solscan.io/v2/account/txs/export?address=2D4dLL47vA1k1EN4421aM9DzKp3VBDAqKj8iUTSBLktw&type=tokenchange&timefrom=1711900800&timeto=1714492799.999&account_type=account_main
+        # https://api-v2.solscan.io/v2/account/transfer/export?address=5bTgWQQE5Tb34BQQtUArj62PmFcVsaht2SGotAdq5fbt&activity_type[]=ACTIVITY_SPL_TRANSFER
+    # https://api-v2.solscan.io/v2/account/balance_change/export?address=Cft4hKtC3dVftfqmL2MCALpeCq7oWM7qpftNfVVUzA7h&time_from=1719763200&time_to=1721051816.123&account_type=account_main
+    
+    df['SolscanTransferUrl'] = df.apply(lambda ser: (
+        f"https://api-v2.solscan.io/v2/account/balance_change/export?address={ser['dalaoAddress']}&time_from={utc_timefrom}&time_to={utc_timeto}&account_type=account_main"), axis=1)
+
+    
+    return df
+
+
+async def do_some_thing(playwright      ):
+
+    # browser =  playwright.chromium.launch(headless=True)
+    # context = await playwright.chromium.launch_persistent_context(user_data_dir=USER_DIR_PATH, accept_downloads=True, headless=False)
+    context = await playwright.firefox.launch_persistent_context(user_data_dir=USER_DIR_PATH, accept_downloads=True, headless=False)
+    # context = browser.new_context()
+    context.set_default_timeout(9000)
+    # context = await browser.new_context()
+    arr_page = [None]*2
+    arr_page[0] = await context.new_page()
+    await arr_page[0].goto(
+        "https://dexscreener.com/new-pairs?rankBy=trendingScoreH6&order=desc&chainIds=solana&dexIds=raydium&minLiq=40000&minAge=36&min5MChg=3")
+    cur_arr_str_dalaoAddress =[1,2,3,4,5]
+
+    print(context.pages)
+
+    for str_dalaoAddress_idx in range(0, len(cur_arr_str_dalaoAddress)):
+
+        arr_page[1] = await context.new_page()
+        page = arr_page[1]
+        await page.goto(  "https://dexscreener.com/new-pairs?rankBy=trendingScoreH6&order=desc&chainIds=solana&dexIds=raydium&minLiq=40000&minAge=36&min5MChg=3" 
+                        , timeout=10000)
+
+        # async with page.expect_download() as download_info:
+        #     try:
+        #         await page.goto(str_dalaoTransferUrl, timeout=0)
+        #     except:
+        #         # Wait for the download to start
+        #         download = await download_info.value
+        #         # Wait for the download process to complete
+        #         print(await download.path())
+        #         # Save downloaded file somewhere
+        #         await download.save_as(baseclass.dalao_ori_tran_txhash_solscan_path / f"ori_txhash_{str_dalaoAddress}.csv")
+        #     await page.wait_for_timeout(200)
+        await page.wait_for_timeout(10000)
+        time.sleep(5.5)
+        await page.close()
+
+    await context.close()
+
+
+async def get_onedriver_swapactivities(    ):
+    async with async_playwright() as playwright:
+        # playwright = Playwright().start()
+
+        await do_some_thing(playwright )
+
+
+async def main():
+    print("enter main()")
+
+    await get_onedriver_swapactivities(        )
+
+
+ 
+ 
+USER_DIR_PATH = baseclass.browsercookie_path
+asyncio.run(main())
+# main()
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 9 - 0
src/code/000_test.py

@@ -0,0 +1,9 @@
+
+
+
+aa = "-$6.9-3.21%"
+
+res = aa.split("-")
+
+print(res)
+

+ 37 - 0
src/code/001_merge_newpair.py

@@ -0,0 +1,37 @@
+# https://dexscreener.com/new-pairs?rankBy=pairAge&order=asc&chainIds=solana&minLiq=1000&minAge=4&maxAge=24&min24HTxns=600&min24HBuys=300&min24HSells=300
+# filter已定义好的 的网址
+
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+
+baseclass.makedirpath(baseclass.newpair_merge_path)
+
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+df = baseclass.readcsvfiles_2df(baseclass.newpair_from_dexscreener_path)
+ 
+
+def makescreenurl( urlname,urlparam):
+    # pairAddress = series[address_str]
+    urlname = urlname + urlparam
+    return '=HYPERLINK("{}","{}")'.format(urlname, urlname)
+
+
+
+df["isNormal"] = -1
+df['DexScreenURL'] = df.apply(lambda ser: makescreenurl(
+     "https://dexscreener.com/solana/" ,ser["PairAddress"]), axis=1)
+
+ 
+
+df['TokenIdx'] = df['TokenIdx'].astype(int)
+df['Buys'] = df['Buys'].astype(int)
+df['Sells'] = df['Sells'].astype(int)
+df['Makers'] = df['Makers'].astype(int)
+df = df.sort_values(by=["TokenIdx"], ascending=[True])
+df.to_excel(baseclass.newpair_merge_path/"un_filter_pairs.xlsx", index=False)
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+ 

+ 74 - 0
src/code/002_01_notuse_handle_dalao_tran_pump.py

@@ -0,0 +1,74 @@
+
+# https://dexscreener.com/?rankBy=volume&order=desc&chainIds=solana&maxAge=24&min24HTxns=500&min24HSells=200&min24HChg=100
+
+# 将油猴脚本获取的top trader
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+baseclass.makedirpath(baseclass.dalao_tran_dexscreen_path)
+baseclass.makedirpath(baseclass.dalao_merge_path)
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+def make_pump_url(urlname, urlparam):
+    urlname = urlname + urlparam
+    return '=HYPERLINK("{}","{}")'.format(urlname, urlname)
+
+
+
+def filter_simple_dalao():
+
+    csv_file_list = [f for f in os.listdir(
+        baseclass.dalao_ori_tran_dexscreen_path) if f.endswith(".csv")]
+    arr_token_address = [tokenadd.split("_")[0] for tokenadd in csv_file_list  ]
+    arr_token_address=list(set(arr_token_address))
+ 
+    res_df = None
+    big_amount_df = None
+    # csv_file_list=csv_file_list[0:1]
+    # print("csv_file_list=",csv_file_list)
+
+    for tokenadd in arr_token_address:
+        df_pump =None
+        df_raydium =None
+
+        if ( baseclass.dalao_ori_tran_dexscreen_path / f"{tokenadd}_pump.csv").exists():
+            df_pump = pd.read_csv(
+            baseclass.dalao_ori_tran_dexscreen_path / f"{tokenadd}_pump.csv", dtype=object)
+
+            arr_maker = df_pump["MAKER"].drop_duplicates().tolist()
+            arr_special_maker = [maker for maker in arr_maker if len(maker)<15]
+            print(f"tokenadd= {tokenadd}",arr_special_maker)
+            special_df_pump = df_pump[df_pump["MAKER"].isin(arr_special_maker)]
+            df_pump =   pd.concat([special_df_pump, df_pump], ignore_index=True)
+            df_pump=df_pump.drop_duplicates(keep="first")
+
+            df_pump['PumpURL'] = df_pump.apply(lambda ser: make_pump_url(
+                "https://pump.fun/profile/", f"{ser['MAKER']}"), axis=1)
+            df_pump.to_excel(baseclass.dalao_ori_tran_dexscreen_path / f"new_{tokenadd}_pump.xlsx",index=False)
+
+
+    
+ 
+
+        continue
+  
+ 
+ 
+ 
+    return
+
+
+filter_simple_dalao()
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 370 - 0
src/code/002_02_filter_dalao_tran_dexscreener.py

@@ -0,0 +1,370 @@
+
+
+# https://dexscreener.com/solana?rankBy=trendingScoreH24&order=desc&minLiq=50000&minAge=36
+
+# 将油猴脚本获取的top trader
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+ 
+baseclass.makedirpath(baseclass.dalao_merge_path)
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+def makescreenurl( urlname,urlparam):
+    # pairAddress = series[address_str]
+    urlname = urlname + urlparam
+    return '=HYPERLINK("{}","{}")'.format(urlname, urlname)
+
+def get_fir_swap_info(gdf):
+    # 未来使用
+    arr_firswap_type = gdf["TYPE"].tolist()
+    arr_firswap_token_amount = gdf["Token"].tolist()
+    arr_firswap_eth_amount = gdf["SOL"].tolist()
+    arr_firswap_token_amount = [decimal.Decimal( token_amount) for token_amount in arr_firswap_token_amount  ]
+    arr_firswap_eth_amount = [decimal.Decimal( token_amount) for token_amount in arr_firswap_eth_amount  ]
+    while len(arr_firswap_eth_amount) > 0:
+        if arr_firswap_type[0]=="Buy":
+            break
+        else:
+            arr_firswap_eth_amount.pop(0)
+            arr_firswap_token_amount.pop(0)
+            arr_firswap_type.pop(0)
+    if len(arr_firswap_eth_amount) == 0:
+        return "0","-10"
+    
+    fir_swap_tokenamount = arr_firswap_token_amount[0]
+    fir_swap_costmain = arr_firswap_eth_amount[0]
+    fir_swap_earntmain = -fir_swap_costmain
+    while len(arr_firswap_eth_amount) > 0:
+        # 去除 type为buy的交易 
+        if arr_firswap_type[0]=="Buy":
+            arr_firswap_eth_amount.pop(0)
+            arr_firswap_token_amount.pop(0)
+            arr_firswap_type.pop(0)
+            continue
+        # 现在  全是sell token earn eth
+        cur_swap_tokenamount = arr_firswap_token_amount[0]
+        cur_swap_eth = arr_firswap_eth_amount[0]
+        arr_firswap_eth_amount.pop(0)
+        arr_firswap_token_amount.pop(0)
+        arr_firswap_type.pop(0)
+        if fir_swap_tokenamount>=cur_swap_tokenamount:
+            fir_swap_earntmain+=cur_swap_eth
+            fir_swap_tokenamount-=cur_swap_tokenamount
+        else:
+            fir_swap_earntmain = fir_swap_earntmain+  fir_swap_tokenamount/cur_swap_tokenamount * cur_swap_eth
+            fir_swap_tokenamount=decimal.Decimal(0)
+        if fir_swap_tokenamount==0:
+            break
+     
+    fir_cost_main =('{0:.2f}'.format(fir_swap_costmain) ) 
+    fir_earn_percent=  ('{0:.2f}'.format(fir_swap_earntmain / fir_swap_costmain) )    if fir_swap_costmain != 0 else "-10"
+
+    return fir_cost_main , fir_earn_percent
+def fun(gdf, tokenadd):
+      
+    gdf=gdf[gdf['TYPE'].isin(["Buy", "Sell"])].reset_index(drop=True)
+
+    if len(gdf)==0:
+        return  None
+    
+    Maker = gdf['MAKER'].tolist()[0]
+    buy_mask =  gdf["TYPE"].isin(["Buy"])
+    FirstSwaptime =  pd.Timestamp('1970-01-01 01:01:01')
+    MinBuyPrice = 0
+    if len(gdf[buy_mask])>0:
+        # return None
+ 
+        FirstSwaptime =  gdf[buy_mask ]['DATE'].min()
+        MinBuyPrice = gdf[buy_mask ]['PRICE'].min()
+
+    arr_type = gdf['TYPE'].drop_duplicates().tolist()
+    # if ('Buy' not in arr_type or 'Sell' not in arr_type):
+    #     return None
+    Maker_isNormal ="1"
+    if arr_type[0] =="Sell":
+        Maker_isNormal = "0"
+        # return None
+    
+    fir_cost_main , fir_earn_percent = get_fir_swap_info(gdf=gdf)
+    if float(fir_cost_main) ==0 :
+        Maker_isNormal ="0"
+ 
+    buy_mask = gdf['TYPE'].isin(["Buy"]) 
+    sell_mask = gdf['TYPE'].isin(["Sell"])   
+    arr_buymoney = gdf[buy_mask]['SOL'].tolist()
+    arr_sellmoney = gdf[sell_mask]['SOL'].tolist()
+    arr_buytokenamount = gdf[buy_mask]['Token'].tolist()
+    arr_selltokenamount = gdf[sell_mask]['Token'].tolist()
+    Selltokenamount_dec = sum(
+        [decimal.Decimal(token_dec) for token_dec in arr_selltokenamount])
+    Buytokenamount_dec = sum(
+        [decimal.Decimal(token_dec) for token_dec in arr_buytokenamount])
+    Sellmoney_dec = sum(
+        [decimal.Decimal(token_dec) for token_dec in arr_sellmoney])
+    Buymoney_dec = sum(
+        [decimal.Decimal(token_dec) for token_dec in arr_buymoney])
+    Earn_dec = Sellmoney_dec - Buymoney_dec
+    Earnper_dec = Earn_dec / \
+        Buymoney_dec if Buymoney_dec != 0 else decimal.Decimal(
+            -10)
+    Amountper_dec = Selltokenamount_dec / Buytokenamount_dec if Buytokenamount_dec != 0 else decimal.Decimal(
+        -10)
+
+    Buymoney = '{0:.2f}'.format(Buymoney_dec)
+    Sellmoney = '{0:.2f}'.format(Sellmoney_dec)
+    Earn = '{0:.2f}'.format(Earn_dec)
+    Earnper = '{0:.2f}'.format(Earnper_dec)
+    Buyamount = '{0:.2f}'.format(Buytokenamount_dec)
+    Sellamount = '{0:.2f}'.format(Selltokenamount_dec)
+    Amountper = '{0:.2f}'.format(Amountper_dec)
+    Buycount = len(gdf[buy_mask]['TXN'].drop_duplicates())
+    Sellcount = len(gdf[sell_mask]['TXN'].drop_duplicates())
+
+    return pd.DataFrame([[Maker,
+                          Maker_isNormal,
+                        FirstSwaptime,
+                         MinBuyPrice,
+                          Buymoney,
+                          Sellmoney,
+                          Earn,
+                          Earnper,
+                          Buycount,
+                          Sellcount,
+                          Buyamount,
+                          Sellamount,
+                          Amountper,
+                          tokenadd,
+                          fir_cost_main,
+                          fir_earn_percent
+                          ]])
+
+import re
+def filter_simple_dalao():
+
+    res_df = None
+    big_amount_df = None
+    global arr_token_address
+
+    for tokenadd in arr_token_address:
+        df_pump =None
+        df_raydium =None
+        if  ( baseclass.dalao_merge_path /f"buytoken_df_{tokenadd}.xlsx").exists():
+            continue
+
+        # if ( baseclass.dalao_ori_tran_dexscreen_path / f"{tokenadd}_pump.csv").exists():
+        #     df_pump = pd.read_csv(
+        #     baseclass.dalao_ori_tran_dexscreen_path / f"{tokenadd}_pump.csv", dtype=object)
+
+        #     arr_maker = df_pump["MAKER"].drop_duplicates().tolist()
+        #     arr_special_maker = [maker for maker in arr_maker if len(maker)<15]
+ 
+        #     special_df_pump = df_pump[df_pump["MAKER"].isin(arr_special_maker)]
+        #     df_pump =   pd.concat([special_df_pump, df_pump], ignore_index=True)
+        #     df_pump=df_pump.drop_duplicates(keep="first")
+        #     df_pump.to_csv(baseclass.dalao_ori_tran_dexscreen_path / f"new_{tokenadd}_pump.csv",index=False)
+
+        #     df_pump = df_pump[~df_pump["MAKER"].isin(arr_special_maker)].reset_index(drop=True)
+        #     df_pump=df_pump[['DATE',
+        #          'TYPE',
+        #         'SOL',
+        #          'Token',
+        #          'MAKER',
+        #          'TXN',
+        #          ]]
+        #     df_pump["DATE"] = pd.to_datetime(df_pump["DATE"], format='%m-%d %H:%M:%S')
+
+
+        if ( baseclass.dalao_ori_tran_dexscreen_path / f"{tokenadd}_raydium.csv").exists():
+            df_raydium =  pd.read_csv(
+            baseclass.dalao_ori_tran_dexscreen_path / f"{tokenadd}_raydium.csv", dtype=object)
+            df_raydium =df_raydium.drop_duplicates().reset_index(drop=True)
+            df_raydium["DATE"] = pd.to_datetime(df_raydium["DATE"], format='%Y-%m-%d %H:%M:%S')
+            
+            df_raydium=df_raydium.sort_values(by=["DATE"],ascending=[True])
+            df_raydium.to_csv(baseclass.dalao_ori_tran_dexscreen_path / f"{tokenadd}_raydium.csv", index=False)
+            df_raydium=df_raydium[['DATE',
+                 'TYPE',
+                'SOL',
+                 'Token',
+                 'MAKER',
+                 'TXN',
+                 "PRICE",
+                 ]]
+                    
+        # if df_pump is not None:
+        # #     # pump 肯定小于 dexscreener 的 DATE 但是 dexscreener的Date 拿不到年月日 只能额外加时间 
+        # #     实际上可以 不用 因为 在自己的电脑获取 date pump 和 dexscreen 的date 都是 当前utc+8 的时间
+        #     df_raydium["DATE"] + pd.Timedelta(days=30)
+        df = pd.concat([df_pump, df_raydium], ignore_index=True)
+        df["PRICE"] = df["PRICE"].astype(float)
+    
+        df=df.sort_values(by=["DATE"],ascending=[True])
+        df = df[df['TYPE'].isin(['Buy', 'Sell'])].reset_index(drop=True)
+        # df.to_excel(baseclass.dalao_merge_path/f"total_dalao_txn_{tokenadd}.xlsx",index=False)
+        
+        print(f"enter {tokenadd}")
+
+        # df["DATE"] = pd.to_datetime(df["DATE"], format='%m-%d %H:%M:%S')  
+        # 去除 打新
+        # min_date = df['DATE'].min()
+        # daxin_max_date = min_date + pd.Timedelta(seconds=10)
+        # daxin_mask = (df['DATE'] >= min_date) & (df['DATE'] <= daxin_max_date)
+        # arr_daxin_dalaoadd = df[daxin_mask]['MAKER'].drop_duplicates().tolist()
+        # drop_daxin_dalao_mask = (~ df['MAKER'].isin(arr_daxin_dalaoadd))
+        # df = df[drop_daxin_dalao_mask].reset_index(drop=True)
+        # df =df.sort_values(by=['DATE'],ascending=True)
+        df["Maker_isNormal"] = "1"
+        pattern = r"^00"
+        new_tokenadd = tokenadd
+
+        matches = re.findall(pattern, tokenadd)
+        if len(matches) > 0:
+            new_tokenadd=new_tokenadd[3:]
+
+
+        df = df.groupby(by=['MAKER']).apply(
+            lambda gdf: fun(gdf, new_tokenadd)).reset_index(drop=True)
+
+        if (len(df) == 0):
+            print("no transaction")
+            continue
+        df.columns = ['Maker',
+                      "Maker_isNormal",
+                      "FirstSwaptime",
+                      "MinBuyPrice",
+                      'Buymoney',
+                      'Sellmoney',
+                      'Earn',
+                      'Earnper',
+                      'Buycount',
+                      'Sellcount',
+                      'Buyamount',
+                      'Sellamount',
+                      'Amountper',
+                      'TokenAddress',
+                    'FirBuymoney',
+                    'FirEarnper'
+                      ]
+
+        # Rank,Maker,Buymoney,Sellmoney,Earn,Earnper,Buycount,Sellcount,Buyamount,Sellamount,Amountper,TokenAddress
+  
+
+        df['FirstSwaptime'] = df['FirstSwaptime'].dt.strftime('%Y-%m-%d %H:%M:%S')
+
+        df["Amountper"] = df["Amountper"].astype(float)
+        df["Buymoney"] = df["Buymoney"].astype(float)
+        df["Sellmoney"] = df["Sellmoney"].astype(float)
+        df["Earn"] = df["Earn"].astype(float)
+        df["Earnper"] = df["Earnper"].astype(float)
+        df["Buycount"] = df["Buycount"].astype(int)
+        df["Sellcount"] = df["Sellcount"].astype(int)
+        df["Earnper"] = df['Earnper'].round(2)
+        df["Amountper"] = df['Amountper'].round(2)
+        df["FirBuymoney"] = df["FirBuymoney"].astype(float)
+        df["FirEarnper"] = df["FirEarnper"].astype(float)
+        df.insert(12, 'isNormal', -1)
+        df.insert(1, 'DexScreenURL', -1)
+
+        df["DexScreenURL"] = df.apply(lambda ser: makescreenurl(
+            "https://dexscreener.com/solana/" , f"{new_tokenadd }?maker={ser['Maker']}" ), axis=1)
+        df = df.sort_values(by=[ "FirstSwaptime"], ascending=[True])
+     
+        # df.to_excel(baseclass.dalao_merge_path/f"overview_{tokenadd}.xlsx",index=False)
+        
+
+        buytoken_mask  = (
+        (df["Buymoney"] >= 0.3)
+        # &(df["Amountper"] <=1)
+        & (   ~(  ( df["Earnper"]<=0.4 )
+            & (df["Amountper"]>=0.9)
+            ) 
+            )
+        )
+ 
+
+        buytoken_df = df[buytoken_mask].reset_index(drop=True)
+
+        buytoken_df.to_excel(baseclass.dalao_merge_path /
+                        f"buytoken_df_{tokenadd}.xlsx", index=False)
+        # 基本到这一步就可以了
+
+        # res_df = pd.concat([res_df, df], ignore_index=True)
+
+    return
+
+    res_df.to_excel(baseclass.dalao_merge_path /
+                    "ori_merge.xlsx", index=False)
+    
+    
+    nor_filter_mask = (
+        (res_df["Amountper"] <= 1.01)
+        & (res_df["FirEarnper"] >= 1)
+        & (res_df["FirBuymoney"] >= 0.3)
+        & ((res_df["Buycount"] <= 4) )
+    )
+    # nor_filter_mask = nor_filter_mask & False
+    fir_big1_filter_mask = (
+        (res_df["Amountper"] <= 1.1)
+        & (res_df["FirEarnper"] >= 0.4)
+        & (res_df["FirBuymoney"] >= 0.5)
+        # & ((res_df["Buycount"] <= 4) )
+    )
+    big1_filter_mask = (
+        (res_df["Amountper"] <= 1.1)
+        & (res_df["Earnper"] >= 0.4)
+        & (res_df["Buymoney"] >= 0.5)
+        # & ((res_df["Buycount"] <= 4) )
+    )
+ 
+
+    filter_mask = (
+        big1_filter_mask
+        | fir_big1_filter_mask
+        # nor_filter_mask
+        # | big1_filter_mask
+                     
+                   )
+    # add_filter_mask = ((res_df["Buymoney"] <= 400))
+    
+    
+   
+    res_df = res_df[filter_mask].reset_index(drop=True)
+    res_df = res_df.sort_values(by=["TokenAddress","FirstSwaptime"], ascending=[True,True])
+    # multiple_df = multiple_df.sort_values(by=["TokenAddress","FirstSwaptime"], ascending=[True,True])
+    print(f"len df ={len(res_df)}")
+
+    # 示例 获取结果如下https://dexscreener.com/solana/9s9sgqskfyzbygm45qblje4rt6calfa2dbhjrevlszrc?maker=47TwqZwwMGHc9CkJJxvVgFNGLDqBuSPy95KwUSTcLSti
+
+    res_df['DexScreenURL'] = res_df.apply(lambda ser: makescreenurl(
+        "https://dexscreener.com/solana/", f"{ser['TokenAddress']}?maker={ser['Maker']}"), axis=1)
+
+    
+    res_df.to_excel(baseclass.dalao_merge_path /
+                    "un_onhand_dalao.xlsx", index=False)
+ 
+    return
+
+csv_file_list = [f for f in os.listdir(
+    baseclass.dalao_ori_tran_dexscreen_path) if f.endswith(".csv") ]
+arr_token_address = [tokenadd.split("_")[0] for tokenadd in csv_file_list  if "new_" not in tokenadd]
+arr_token_address=list(set(arr_token_address))
+
+
+
+print("arr_token_address= ",arr_token_address)
+
+filter_simple_dalao()
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 115 - 0
src/code/002_02_othermethod_get_gongtong_dalao.py

@@ -0,0 +1,115 @@
+
+
+
+# https://dexscreener.com/?rankBy=volume&order=desc&chainIds=solana&maxAge=24&min24HTxns=500&min24HSells=200&min24HChg=100
+
+# 将油猴脚本获取的top trader
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+ 
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+def makescreenurl( urlname,urlparam):
+    # pairAddress = series[address_str]
+    urlname = urlname + urlparam
+    return '=HYPERLINK("{}","{}")'.format(urlname, urlname)
+
+buytoken_df_file_list = [f for f in os.listdir(
+    baseclass.dalao_merge_path) if f.startswith("buytoken_df_") ]
+arr_token_address = [tokenadd.split("_")[-1].replace(".xlsx","") for tokenadd in buytoken_df_file_list   ]
+arr_token_address=list(set(arr_token_address))
+print(arr_token_address)
+df = None
+for tokenadd in arr_token_address:
+    cur_buytoken_df = pd.read_excel(baseclass.dalao_merge_path /
+                    f"buytoken_df_{tokenadd}.xlsx", dtype=object)
+    cur_buytoken_df["TokenAddress"] = tokenadd
+    df = pd.concat([df,cur_buytoken_df])
+
+
+old_token_df = pd.read_excel(baseclass.dalao_merge_path /"old_token.xlsx" , dtype=object)
+arr_old_token =  old_token_df["token"].tolist()
+
+arr_duplicates_dalao = df[df.duplicated(subset=["Maker"])]["Maker"].tolist()
+df = df[df["Maker"].isin(arr_duplicates_dalao)]
+
+df["DexScreenURL"] = df.apply(lambda ser: makescreenurl(
+    "https://dexscreener.com/solana/" , f"{ser['TokenAddress'] }?maker={ser['Maker']}" ), axis=1)
+
+df["freq"] = 1
+freq = df['Maker'].value_counts()
+ 
+df['freq'] = df['Maker'].map(freq)
+df = df.astype({
+    "MinBuyPrice":float,
+    "Amountper":float,
+    "Earnper":float,
+    "Buycount":int,
+
+})
+# df = df[df["Buycount"]<=5]
+# df = df[df["Amountper"]<=1]
+
+df = df[ 
+ ~(  ( df["Earnper"]<=0.4 )
+    & (df["Amountper"]>=0.9) 
+     & (df["Amountper"] <=1) 
+     &(df["Buycount"]<=2)
+    )
+   
+    ]
+
+
+
+def filter_buycount(gdf):
+    cur_freq = gdf["freq"].tolist()[0]
+    if cur_freq == 2:
+        if len(gdf["Maker"])==1:
+            return None
+    elif  cur_freq == 3:
+        if len(gdf["Maker"])==1:
+            return None
+    # elif  cur_freq >=4:
+    #     if len(gdf["Maker"]) / cur_freq <0.4:
+    #         return None
+    elif  cur_freq >=4:
+        if len(gdf["Maker"])>=2:
+            return None
+        
+    return gdf
+
+def filter_oldtoken(gdf):
+    cur_freq = gdf["freq"].tolist()[0]
+    # 获取当前dalao 含有的old token 的数量
+    cur_old_token_count = len(gdf[gdf["is_old_token"]==1])
+    if  ( cur_old_token_count)==cur_freq:
+        # 如果全是 old token  不要这个dalao  pass
+        return None
+        
+    return gdf
+
+df = df.groupby(by=["Maker"],group_keys=False).apply(lambda gdf : filter_buycount(gdf))
+df["is_old_token"] = 0
+df.loc[df["TokenAddress"].isin(arr_old_token) , "is_old_token"]  = 1
+
+df = df.groupby(by=["Maker"],group_keys=False).apply(lambda gdf : filter_oldtoken(gdf))
+df = df.reset_index(drop=True)
+ 
+df=df.sort_values(by=["freq","Maker"],ascending=[False,True])
+cur_datetime = int(time.time())
+df.to_excel(baseclass.dalao_merge_path /f"{cur_datetime}_repeat_dalao.xlsx",index=False)
+
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 81 - 0
src/code/002_02_zzz_01_get_onetokenprofit_dalao.py

@@ -0,0 +1,81 @@
+
+
+
+# https://dexscreener.com/?rankBy=volume&order=desc&chainIds=solana&maxAge=24&min24HTxns=500&min24HSells=200&min24HChg=100
+
+# 将油猴脚本获取的top trader
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+ 
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+def makescreenurl( urlname,urlparam):
+    # pairAddress = series[address_str]
+    urlname = urlname + urlparam
+    return '=HYPERLINK("{}","{}")'.format(urlname, urlname)
+
+buytoken_df_file_list = [f for f in os.listdir(
+    baseclass.dalao_merge_path) if f.startswith("buytoken_df_") ]
+arr_token_address = [tokenadd.split("_")[-1].replace(".xlsx","") for tokenadd in buytoken_df_file_list   ]
+arr_token_address=list(set(arr_token_address))
+print(arr_token_address)
+df = None
+for tokenadd in arr_token_address:
+    cur_buytoken_df = pd.read_excel(baseclass.dalao_merge_path /
+                    f"buytoken_df_{tokenadd}.xlsx", dtype=object)
+    cur_buytoken_df["TokenAddress"] = tokenadd
+    df = pd.concat([df,cur_buytoken_df])
+
+
+ 
+
+
+df["DexScreenURL"] = df.apply(lambda ser: makescreenurl(
+    "https://dexscreener.com/solana/" , f"{ser['TokenAddress'] }?maker={ser['Maker']}" ), axis=1)
+ 
+ 
+df = df.astype({
+    "MinBuyPrice":float,
+    "Amountper":float,
+    "Earnper":float,
+    "Buycount":int,
+
+})
+
+
+df = df[df["Buycount"]<=3]
+# df = df[df["Amountper"]<=1]
+df = df [df["Buymoney"] >= 0.3]
+df = df[df["Amountper"]<=1]
+
+df = df[ 
+ ~(  ( df["Earnper"]<=0.3 )
+    & (df["Amountper"]>=0.7) 
+     & (df["Amountper"] <=1) 
+     
+    )
+   
+    ]
+
+
+ 
+df = df.reset_index(drop=True)
+ 
+df=df.sort_values(by=["Maker"],ascending=[True])
+cur_datetime = int(time.time())
+df.to_excel(baseclass.dalao_merge_path /f"{cur_datetime}_onetoken_profit_dalao.xlsx",index=False)
+
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 47 - 0
src/code/002_02_zzz_02_get_dalao_solscan.py

@@ -0,0 +1,47 @@
+
+
+
+# https://dexscreener.com/?rankBy=volume&order=desc&chainIds=solana&maxAge=24&min24HTxns=500&min24HSells=200&min24HChg=100
+
+# 将油猴脚本获取的top trader
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+ 
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+def makescreenurl( urlname,urlparam):
+    # pairAddress = series[address_str]
+    urlname = urlname + urlparam
+    return '=HYPERLINK("{}","{}")'.format(urlname, urlname)
+
+
+
+df = pd.read_excel( baseclass.dalao_merge_path/"res_dalao.xlsx",dtype=object)
+ 
+
+# df["url"] = df.apply(lambda ser: makescreenurl(
+#     "https://solscan.io/account/" , f"{ser['Maker'] }#defiactivities" ), axis=1)
+ 
+df["url"] = df.apply(lambda ser: makescreenurl(
+    "https://solscan.io/account/" , f"{ser['Maker'] }?flow=in&exclude_token=So11111111111111111111111111111111111111111#transfers" ), axis=1)
+ 
+
+ 
+
+ 
+df.to_excel(baseclass.dalao_merge_path /f"res_dalao.xlsx",index=False)
+
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 74 - 0
src/code/002_03_unhandle_dalao_drop0balance_notuse.py

@@ -0,0 +1,74 @@
+
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+
+
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+url = "https://solana-mainnet.g.alchemy.com/v2/pxF-cEkEE1JxzxgotGyww5ra5w1IvAkJ"
+ 
+getBalance_payload = {
+  
+    "id": 1,
+    "jsonrpc": "2.0",
+    "method": "getBalance",
+    "params": [  ]
+}
+ 
+
+def filter_onhand_dalao():
+
+    df = pd.read_excel(baseclass.dalao_merge_path /
+                       "un_onhand_dalao.xlsx", dtype=object)
+
+    df["Maker_isNormal"] = df["Maker_isNormal"].astype(int)
+    
+    filter_mask_not_Maker_isNormal = df["Maker_isNormal"]==0
+    arr_not_Maker_isNormal = df[filter_mask_not_Maker_isNormal]["Maker"].drop_duplicates().tolist()
+    arr_drop_Maker=[]
+    while len(arr_not_Maker_isNormal)>0:
+        if len(arr_not_Maker_isNormal)%10==0:
+            print(f"remainder len = {len(arr_not_Maker_isNormal)}")
+        
+        str_maker =arr_not_Maker_isNormal[0]
+        getBalance_payload["params"] = [str_maker]
+        
+        req_response = requests.post(url, json=getBalance_payload, headers=baseclass.headers,timeout=5)
+        if req_response.status_code != 200:
+            print(" req_response.status_code=", req_response.status_code)
+            time.sleep(2)
+            continue
+        arr_not_Maker_isNormal.pop(0)
+        response = json.loads(
+            req_response.text)
+        dalao_balance = int(response["result"]['value'])/10**9
+        
+        if dalao_balance<0.3:
+            arr_drop_Maker.append(str_maker)
+        if len(arr_drop_Maker)%10==0:
+            df = df[~df["Maker"].isin(arr_drop_Maker)].reset_index(drop=True)
+            df.to_excel(baseclass.dalao_merge_path /
+              "un_onhand_dalao.xlsx", index=False)
+ 
+    # https://dexscreener.com/solana/9s9sgqskfyzbygm45qblje4rt6calfa2dbhjrevlszrc?maker=47TwqZwwMGHc9CkJJxvVgFNGLDqBuSPy95KwUSTcLSti
+ 
+    df.to_excel(baseclass.dalao_merge_path /
+              "un_onhand_dalao.xlsx", index=False)
+
+    return
+
+
+filter_onhand_dalao()
+
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 259 - 0
src/code/002_04_get_dalaotokentransfer_find_relationship.py

@@ -0,0 +1,259 @@
+
+# 获取 dalao所有关于此token的transfer记录 获取dalao的相关关系 例如 A buy token B sell token A transfer B 认为 A。B有关系 对于transfer 多个地址 路径长的 暂不考虑
+from base_class import *
+from base_class import BaseVariableFunction
+import urllib.parse
+import shutil
+import random
+import json
+baseclass = BaseVariableFunction(__file__)
+
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+baseclass.makedirpath(baseclass.dalao_tokentransfer_solanafm_path)
+
+
+def request_onetime(req_dict_total, key_idx,  loop):
+    global is_global_sleep 
+    if is_global_sleep:
+        return
+    requests_dict = req_dict_total.get(key_idx)
+    if requests_dict is None:
+        return
+    elif requests_dict['isrequseting'] == True:
+        return
+    elif requests_dict['need_remove'] == True:
+        print(f"key_idx {key_idx} need_remove\n", end='')
+        if req_dict_total.get(key_idx) is not None:
+            print(f"remove  {cur_conadd} {key_idx}\n", end='')
+            del req_dict_total[key_idx]
+        return
+    requests_dict['isrequseting'] = True
+
+    cur_conadd = requests_dict["req_params"]["address"]
+    print(f"enter key_idx={key_idx} cur_conadd={cur_conadd}\n", end='')
+
+    req_response = None
+     
+            # # url = "https://api.solana.fm/v0/accounts/Hkx63X6mf8t2fn96dUYGd9t6mfC2cKWAYWnLcza2aHE2/transfers?utcFrom=1719822469&utcTo=1720031899&mint=3psH1Mj1f7yUfaD5gh6Zj7epE8hhrMkMETgv5TshQA4o&page=1"
+            # req_dict = {
+            #     "req_params": {"address": address, 
+            #                    "mint":str_token_address,
+            #                    "utcFrom":0,
+            #                    "utcTo":99999,
+            #                    "page":1
+            #                    },
+
+    req_url = f"https://api.solana.fm/v0/accounts/{requests_dict['req_params']['address']}/transfers?utcFrom={requests_dict['req_params']['startrange']}&utcTo={requests_dict['req_params']['endrange']}&mint={requests_dict['req_params']['mint']}&page=1"
+ 
+    
+    try:
+        req_response = requests.get(
+            req_url,timeout=requests_dict['timeout'], headers=baseclass.pick_random_user_agent())
+        time.sleep(0.2)
+
+    except Exception as e:
+        print(f"cur_conadd= {cur_conadd} errmsg={ str(e)}")
+        if (" Max retries exceeded" in str(e)):
+            time.sleep(2+random.random())
+        requests_dict['timeout'] = 15
+        requests_dict['isrequseting'] = False
+        return
+    requests_dict["req_response"] = req_response
+    baseclass.makedirpath(baseclass.dalao_tokentransfer_solanafm_path/str_token_address)
+    write_tokens_path_name = baseclass.dalao_tokentransfer_solanafm_path / str_token_address/f"{cur_conadd}.json"
+    # 请求结果不成功
+    if requests_dict["req_response"].status_code != 200:
+        print(
+            f"cur_conadd= {cur_conadd} response status_code= {requests_dict['req_response'].status_code}")
+        if requests_dict["req_response"].status_code == 429:
+            is_global_sleep = True
+            time.sleep(2)
+            is_global_sleep = False
+        elif requests_dict["req_response"].status_code == 400:
+            print("error 400 req_url=",req_url )
+            raise Exception("400 error")
+             
+        requests_dict['isrequseting'] = False
+        return
+
+    # 如果請求結果為成功
+    tokenresponse = json.loads(
+        requests_dict["req_response"].text)
+    # 結果不正常  continue
+    if tokenresponse["status"] != "success":
+        print(f"key_idx= {key_idx} response is 200 but status not success")
+        requests_dict["remainder_retry_times"] -= 1
+        requests_dict['isrequseting'] = False
+        if requests_dict["remainder_retry_times"] < 0:
+            raise Exception(f"key_idx={key_idx} retrytimes<0")
+        return
+
+    # 結果正常 獲取txlist
+    txlist = None
+    txlist = tokenresponse["results"]
+    if (txlist == None or len(txlist) == 0):
+        print(f"loop={loop} add={cur_conadd} txlist={txlist}")
+
+        requests_dict["need_remove"] = True
+        if req_dict_total.get(key_idx) is not None:
+            print(f"remove {cur_conadd} {key_idx}\n", end='')
+            del req_dict_total[key_idx]
+        requests_dict['isrequseting'] = False
+        return
+
+    # requests_dict["offsettimes"] += 1
+    # if requests_dict["offsettimes"] == 1:
+    #     requests_dict["isfirstreq"] = True
+    # else:
+    #     requests_dict["isfirstreq"] = False
+    # if requests_dict["isfirstreq"] == True:
+    #     # 如果是第一次请求 删除过去的csv文件
+    #     # 如果有这个csv文件 删除
+    #     if os.path.exists(write_tokens_path_name):
+    #         write_tokens_path_name.unlink()
+    cur_zero_timestamp = txlist[0]['data'][0]["timestamp"]
+    cur_last_timestamp = txlist[len(txlist)-1]['data'][0]["timestamp"]
+    print(
+        f"loop={loop} add={cur_conadd}  range={requests_dict['req_params']['startrange'] } {requests_dict['req_params']['endrange']}  len={len(txlist)} cur_zero_timestamp={cur_zero_timestamp} cur_last_timestamp={cur_last_timestamp}")
+ 
+    if True:
+        # 不用在乎数目 只要不为0 就一直请求下去
+        # # 如果此次請求結果為最大offset,請求結果不全,如果沒到最大請求次數,繼續請求
+        requests_dict["need_remove"] = False
+        # 更換 end
+        cur_minrange = txlist[len(txlist)-1]["data"][0]["timestamp"]
+        cur_maxrange = txlist[0]["data"][0]["timestamp"]
+
+        # 如果没有这个csv文件 直接写入
+        cur_file = []
+        if not write_tokens_path_name.exists():
+            print(f"loop={loop} {cur_conadd} 第一次文件\n", end='')
+
+        else:
+            with write_tokens_path_name.open(mode="r") as f:
+                cur_file = json.load(f)
+
+        cur_file = cur_file + txlist
+        print(f"{cur_conadd} 写入\n", end='')
+        with write_tokens_path_name.open(mode='w') as f:
+            json.dump(cur_file, f)
+
+        requests_dict["req_params"]["endrange"] = int(
+            cur_minrange-1)
+
+        baseclass.judge_req_completed(requests_dict=requests_dict,
+                                      key_idx=key_idx, cur_conadd=cur_conadd, req_dict_total=req_dict_total)
+        requests_dict['isrequseting'] = False
+    return
+
+     
+
+
+
+def getonetran(address_list):
+    global str_token_address
+    global startrange , endrange
+
+    print(f"enter getonetran  ")
+    req_dict_total = {}
+    number_key_idx = 0
+ 
+   
+  
+    for address in address_list:
+  
+        number_key_idx += 1
+        key_idx = str(number_key_idx) 
+        req_dict = {
+            "req_params": {"address": address, 
+                            "mint":str_token_address,
+                            "startrange":startrange,
+                            "endrange":endrange,
+                            
+                            },
+            "timeout": 10,
+            "key_idx": key_idx,
+            "remainder_retry_times": 3,
+            "isrequseting": False,
+            "need_remove": False,
+        }
+        req_dict_total[key_idx] = req_dict
+
+    loop = 0
+    while (len(req_dict_total.keys()) > 0):
+        loop += 1
+        # 獲取可以同步請求的address長度 ,traders 長都可能小於 requests_dict定義的長度
+        # grequest_len 為 requests_dict長度和實際tokencontracts長度取最小值
+        print(
+            f"remainder_address_len :{len(req_dict_total.keys())}")
+
+        temp_split_req_dict_total_list = list(req_dict_total.keys())
+        temp_split_req_dict_total_list = temp_split_req_dict_total_list[0:10]
+
+        temp_req_dict_total_keys_list = []
+        for key_idx in temp_split_req_dict_total_list:
+            temp_req_dict_total_keys_list.append(key_idx)
+        i = 0
+
+        for key_idx in temp_req_dict_total_keys_list:
+            i += 1
+            request_onetime(req_dict_total,  key_idx,   loop)
+            time.sleep(0.15)
+
+        time.sleep(0.3)
+
+    return
+
+
+def get_3trans_byScan(address_list):
+
+ 
+    print("enter get_3trans_byScan_()")
+    contractadd_tokentx_list = copy.deepcopy(address_list)
+    getonetran(address_list=contractadd_tokentx_list,
+               )
+
+    return
+
+
+is_global_sleep = False
+str_token_address=baseclass.str_token_address
+
+df = pd.read_excel(baseclass.dalao_merge_path /
+                  f"buytoken_df_{str_token_address}.xlsx",  dtype=object)
+
+arr_str_dalaoaddress = []
+arr_str_dalaoaddress=df["Maker"].drop_duplicates().tolist()
+# arr_str_dalaoaddress=arr_str_dalaoaddress[1000:]
+
+df["FirstSwaptime"] = pd.to_datetime(df["FirstSwaptime"] )
+
+min_timestamp = int(df['FirstSwaptime'].min().timestamp() )
+
+
+print(f"arr_str_dalaoaddress_len= {len(arr_str_dalaoaddress)}")
+ 
+
+startrange =min_timestamp - 1*3600
+endrange = startrange + 30*24*3600
+
+print(f"startrange= {startrange} endrange= {endrange}")
+ 
+
+
+get_3trans_byScan(address_list=arr_str_dalaoaddress,
+                  )
+
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 127 - 0
src/code/002_05_find_dalaotokentransfer_relationship.py

@@ -0,0 +1,127 @@
+
+# 获取 dalao所有关于此token的transfer记录 获取dalao的相关关系 例如 A buy token B sell token A transfer B 认为 A。B有关系 对于transfer 多个地址 路径长的 暂不考虑
+from base_class import *
+from base_class import BaseVariableFunction
+import urllib.parse
+import shutil
+import random
+import json
+baseclass = BaseVariableFunction(__file__)
+
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+
+ 
+ 
+str_token_address=baseclass.str_token_address
+
+df = pd.read_excel(baseclass.dalao_merge_path /
+                  f"buytoken_df_{str_token_address}.xlsx",  dtype=object)
+
+arr_str_dalaoaddress = []
+arr_str_dalaoaddress=df["Maker"].drop_duplicates().tolist()
+
+# arr_str_dalaoaddress=arr_str_dalaoaddress[0:100]
+print(f"arr_str_dalaoaddress_len= {len(arr_str_dalaoaddress)}")
+
+
+
+df =pd.DataFrame(
+                columns=["timestamp", "sign", "source", 
+                        "destination", "token", "amount"
+                        ])
+for str_dalao_address in arr_str_dalaoaddress:
+
+    dalao_tokentransfer_solanafm_file = baseclass.dalao_tokentransfer_solanafm_path / str_token_address /f"{str_dalao_address}.json"
+    new_dalao_tokentransfer_solanafm_file = baseclass.dalao_tokentransfer_solanafm_path / str_token_address /f"new_{str_dalao_address}.json"
+    if not dalao_tokentransfer_solanafm_file.exists():
+        continue
+    
+    new_arr_obj_dalao_transaction = []
+    arr_obj_dalao_transaction =[]
+    with dalao_tokentransfer_solanafm_file.open(mode='r') as f:
+        arr_obj_dalao_transaction = json.load(f)
+
+    for obj_dalao_transaction in arr_obj_dalao_transaction:
+    
+        sign = obj_dalao_transaction["transactionHash"]
+        arr_obj_instruction_data = obj_dalao_transaction["data"]
+        if len(arr_obj_instruction_data)!=1:
+            continue
+        obj_instruction_data = arr_obj_instruction_data[0]
+        # for obj_instruction_data in arr_obj_instruction_data:
+        if (obj_instruction_data["status"] != "Successful"):
+            continue
+
+        if obj_instruction_data["source"] in baseclass.arr_pub_address or obj_instruction_data["destination"] in baseclass.arr_pub_address :
+            continue
+
+        if (obj_instruction_data["action"] in ["transfer", "transferChecked","unknownTransfer"]):
+            obj_instruction_data["sign"] = sign
+            new_arr_obj_dalao_transaction.append(obj_instruction_data)
+
+    if len(new_arr_obj_dalao_transaction)!=0 :
+        with new_dalao_tokentransfer_solanafm_file.open(mode='w') as f:
+            json.dump(new_arr_obj_dalao_transaction,f)
+    cur_df = pd.DataFrame(new_arr_obj_dalao_transaction)
+    if (len(cur_df) == 0):
+        cur_df = pd.DataFrame(
+            columns=["timestamp", "sign", "source", 
+                    "destination", "token", "amount"
+                    ])
+        
+    cur_df = cur_df[["timestamp", "sign",  "source",
+            "destination", "token", "amount",
+            ]]
+    df = pd.concat([df,cur_df])
+df.to_excel(baseclass.dalao_merge_path /f"relationship_{str_token_address}.xlsx",index=False )
+
+
+total_dalao_txn_df = pd.read_excel(baseclass.dalao_merge_path /
+                f"total_dalao_txn_{str_token_address}.xlsx", dtype=object)
+relationship_df = pd.read_excel(baseclass.dalao_merge_path /
+                f"relationship_{str_token_address}.xlsx", dtype=object)
+relationship_df=relationship_df[["source",	"destination","token"]].drop_duplicates().reset_index(drop=True)
+arr_dalao_relationship =[]
+for index, row in relationship_df.iterrows():
+    arr_cur_dalao = row.tolist()
+    cur_source = row["source"]
+    cur_destination = row["destination"]
+    isin_set_dalao = False
+    for set_dalao in arr_dalao_relationship:
+        if (cur_source in set_dalao) or (cur_destination in set_dalao):
+            set_dalao.add(cur_source)
+            set_dalao.add(cur_destination)
+            isin_set_dalao = True
+            break
+    if not isin_set_dalao:
+        arr_dalao_relationship.append(set([ cur_source,cur_destination]))
+    
+
+arr_dalao_relationship = [list(set_dalao) for set_dalao in arr_dalao_relationship ] 
+print(arr_dalao_relationship)
+
+new_relationship_df = pd.DataFrame(arr_dalao_relationship)
+
+new_relationship_df.to_excel( baseclass.dalao_merge_path/  f"new_relationship_{str_token_address}.xlsx",index=False )
+
+total_dalao_txn_df["Maker_isrelation"] = 0
+for arr_dalao in arr_dalao_relationship:
+    total_dalao_txn_df.loc[total_dalao_txn_df["MAKER"].isin(arr_dalao), "MAKER"]= arr_dalao[0]
+    total_dalao_txn_df.loc[total_dalao_txn_df["MAKER"].isin(arr_dalao), "Maker_isrelation"]= 1
+
+total_dalao_txn_df.to_excel(baseclass.dalao_merge_path /
+                f"rep_relationship_total_dalao_txn_{str_token_address}.xlsx", index=False)
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 273 - 0
src/code/002_06_filter_replation_dalao_tran_dexscreener.py

@@ -0,0 +1,273 @@
+
+# https://dexscreener.com/?rankBy=volume&order=desc&chainIds=solana&maxAge=24&min24HTxns=500&min24HSells=200&min24HChg=100
+
+# 将油猴脚本获取的top trader
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+ 
+baseclass.makedirpath(baseclass.dalao_merge_path)
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+def makescreenurl( urlname,urlparam):
+    # pairAddress = series[address_str]
+    urlname = urlname + urlparam
+    return '=HYPERLINK("{}","{}")'.format(urlname, urlname)
+
+def get_fir_swap_info(gdf):
+    # 未来使用
+    arr_firswap_type = gdf["TYPE"].tolist()
+    arr_firswap_token_amount = gdf["Token"].tolist()
+    arr_firswap_eth_amount = gdf["SOL"].tolist()
+    arr_firswap_token_amount = [decimal.Decimal( token_amount) for token_amount in arr_firswap_token_amount  ]
+    arr_firswap_eth_amount = [decimal.Decimal( token_amount) for token_amount in arr_firswap_eth_amount  ]
+    while len(arr_firswap_eth_amount) > 0:
+        if arr_firswap_type[0]=="Buy":
+            break
+        else:
+            arr_firswap_eth_amount.pop(0)
+            arr_firswap_token_amount.pop(0)
+            arr_firswap_type.pop(0)
+    if len(arr_firswap_eth_amount) == 0:
+        return "0","-10"
+    
+    fir_swap_tokenamount = arr_firswap_token_amount[0]
+    fir_swap_costmain = arr_firswap_eth_amount[0]
+    fir_swap_earntmain = -fir_swap_costmain
+    while len(arr_firswap_eth_amount) > 0:
+        # 去除 type为buy的交易 
+        if arr_firswap_type[0]=="Buy":
+            arr_firswap_eth_amount.pop(0)
+            arr_firswap_token_amount.pop(0)
+            arr_firswap_type.pop(0)
+            continue
+        # 现在  全是sell token earn eth
+        cur_swap_tokenamount = arr_firswap_token_amount[0]
+        cur_swap_eth = arr_firswap_eth_amount[0]
+        arr_firswap_eth_amount.pop(0)
+        arr_firswap_token_amount.pop(0)
+        arr_firswap_type.pop(0)
+        if fir_swap_tokenamount>=cur_swap_tokenamount:
+            fir_swap_earntmain+=cur_swap_eth
+            fir_swap_tokenamount-=cur_swap_tokenamount
+        else:
+            fir_swap_earntmain = fir_swap_earntmain+  fir_swap_tokenamount/cur_swap_tokenamount * cur_swap_eth
+            fir_swap_tokenamount=decimal.Decimal(0)
+        if fir_swap_tokenamount==0:
+            break
+     
+    fir_cost_main =('{0:.2f}'.format(fir_swap_costmain) ) 
+    fir_earn_percent=  ('{0:.2f}'.format(fir_swap_earntmain / fir_swap_costmain) )    if fir_swap_costmain != 0 else "-10"
+
+    return fir_cost_main , fir_earn_percent
+def fun(gdf, tokenadd):
+      
+    gdf=gdf[gdf['TYPE'].isin(["Buy", "Sell"])].reset_index(drop=True)
+    if len(gdf)==0:
+        return  None
+    
+    Maker = gdf['MAKER'].tolist()[0]
+    FirstSwaptime = gdf['DATE'].min()
+    arr_type = gdf['TYPE'].drop_duplicates().tolist()
+    # if ('Buy' not in arr_type or 'Sell' not in arr_type):
+    #     return None
+    Maker_isNormal =" 1"
+    if arr_type[0] =="Sell":
+        Maker_isNormal = "0"
+  
+    Maker_isrelation = gdf['Maker_isrelation'].tolist()[0]
+ 
+ 
+    fir_cost_main , fir_earn_percent = get_fir_swap_info(gdf=gdf)
+    if float(fir_cost_main) ==0 :
+        Maker_isNormal ="0"
+ 
+    buy_mask = gdf['TYPE'].isin(["Buy"]) 
+    sell_mask = gdf['TYPE'].isin(["Sell"])   
+    arr_buymoney = gdf[buy_mask]['SOL'].tolist()
+    arr_sellmoney = gdf[sell_mask]['SOL'].tolist()
+    arr_buytokenamount = gdf[buy_mask]['Token'].tolist()
+    arr_selltokenamount = gdf[sell_mask]['Token'].tolist()
+    Selltokenamount_dec = sum(
+        [decimal.Decimal(token_dec) for token_dec in arr_selltokenamount])
+    Buytokenamount_dec = sum(
+        [decimal.Decimal(token_dec) for token_dec in arr_buytokenamount])
+    Sellmoney_dec = sum(
+        [decimal.Decimal(token_dec) for token_dec in arr_sellmoney])
+    Buymoney_dec = sum(
+        [decimal.Decimal(token_dec) for token_dec in arr_buymoney])
+    Earn_dec = Sellmoney_dec - Buymoney_dec
+    Earnper_dec = Earn_dec / \
+        Buymoney_dec if Buymoney_dec != 0 else decimal.Decimal(
+            -10)
+    Amountper_dec = Selltokenamount_dec / Buytokenamount_dec if Buytokenamount_dec != 0 else decimal.Decimal(
+        10)
+
+    Buymoney = '{0:.2f}'.format(Buymoney_dec)
+    Sellmoney = '{0:.2f}'.format(Sellmoney_dec)
+    Earn = '{0:.2f}'.format(Earn_dec)
+    Earnper = '{0:.2f}'.format(Earnper_dec)
+    Buyamount = '{0:.2f}'.format(Buytokenamount_dec)
+    Sellamount = '{0:.2f}'.format(Selltokenamount_dec)
+    Amountper = '{0:.2f}'.format(Amountper_dec)
+    
+    Buycount = len(gdf[buy_mask]['TXN'].drop_duplicates())
+    Sellcount = len(gdf[sell_mask]['TXN'].drop_duplicates())
+
+    return pd.DataFrame([[Maker,
+                          Maker_isNormal,
+                          Maker_isrelation,
+                        FirstSwaptime,
+                          Buymoney,
+                          Sellmoney,
+                          Earn,
+                          Earnper,
+                          Buycount,
+                          Sellcount,
+                          Buyamount,
+                          Sellamount,
+                          Amountper,
+                          tokenadd,
+                          fir_cost_main,
+                          fir_earn_percent
+                          ]])
+
+
+def filter_simple_dalao():
+
+    res_df = None
+    big_amount_df = None
+    global arr_token_address
+
+    for tokenadd in arr_token_address:
+   
+ 
+        df = pd.read_excel( baseclass.dalao_merge_path/ f"rep_relationship_total_dalao_txn_{tokenadd}.xlsx",dtype=object)
+        df["DATE"] = pd.to_datetime(df["DATE"])
+    
+        df=df.sort_values(by=["DATE"],ascending=[True])
+        df = df[df['TYPE'].isin(['Buy', 'Sell'])].reset_index(drop=True)
+
+        print(f"enter {tokenadd}")
+
+        df["Maker_isNormal"] = "1"
+
+        df = df.groupby(by=['MAKER']).apply(
+            lambda gdf: fun(gdf, tokenadd)).reset_index(drop=True)
+
+        if (len(df) == 0):
+            print("no transaction")
+            continue
+        df.columns = ['Maker',
+                      "Maker_isNormal",
+                      "Maker_isrelation",
+                      "FirstSwaptime",
+                      'Buymoney',
+                      'Sellmoney',
+                      'Earn',
+                      'Earnper',
+                      'Buycount',
+                      'Sellcount',
+                      'Buyamount',
+                      'Sellamount',
+                      'Amountper',
+                      'TokenAddress',
+                    'FirBuymoney',
+                    'FirEarnper'
+                      ]
+
+        # Rank,Maker,Buymoney,Sellmoney,Earn,Earnper,Buycount,Sellcount,Buyamount,Sellamount,Amountper,TokenAddress
+        #  isrelation
+        df['FirstSwaptime'] = df['FirstSwaptime'].dt.strftime('%Y-%m-%d %H:%M:%S')
+
+        df["Amountper"] = df["Amountper"].astype(float)
+        df["Buymoney"] = df["Buymoney"].astype(float)
+        df["Sellmoney"] = df["Sellmoney"].astype(float)
+        df["Earn"] = df["Earn"].astype(float)
+        df["Earnper"] = df["Earnper"].astype(float)
+        df["Buycount"] = df["Buycount"].astype(int)
+        df["Sellcount"] = df["Sellcount"].astype(int)
+        df["Earnper"] = df['Earnper'].round(2)
+        df["Amountper"] = df['Amountper'].round(2)
+        df["FirBuymoney"] = df["FirBuymoney"].astype(float)
+        df["FirEarnper"] = df["FirEarnper"].astype(float)
+        df.insert(12, 'isNormal', -1)
+        df.insert(1, 'DexScreenURL', -1)
+
+        df["DexScreenURL"] = df.apply(lambda ser: makescreenurl(
+            "https://dexscreener.com/solana/" , f"{tokenadd }?maker={ser['Maker']}" ), axis=1)
+     
+        df.to_excel(baseclass.dalao_merge_path/f"relation_overview_{tokenadd}.xlsx",index=False)
+        
+        res_df = pd.concat([res_df, df], ignore_index=True)
+
+
+    res_df.to_excel(baseclass.dalao_merge_path /
+                    "ori_relation_dalao_merge.xlsx", index=False)
+    
+    
+    nor_filter_mask = (
+        (res_df["Amountper"] <= 1.01)
+        & (res_df["FirEarnper"] >= 1)
+        & (res_df["FirBuymoney"] >= 0.3)
+        & ((res_df["Buycount"] <= 4) )
+    )
+    fir_big1_filter_mask = (
+        (res_df["Amountper"] <= 1.1)
+        & (res_df["FirEarnper"] >= 0.4)
+        & (res_df["FirBuymoney"] >= 0.5)
+        # & ((res_df["Buycount"] <= 4) )
+    )
+    big1_filter_mask = (
+        (res_df["Amountper"] <= 1.1)
+        & (res_df["Earnper"] >= 0.4)
+        & (res_df["Buymoney"] >= 0.5)
+        # & ((res_df["Buycount"] <= 4) )
+    )
+ 
+
+    filter_mask = (
+        big1_filter_mask
+        | fir_big1_filter_mask
+        # nor_filter_mask
+        # | big1_filter_mask
+                     
+                   )  
+    
+   
+    res_df = res_df[filter_mask].reset_index(drop=True)
+    res_df = res_df.sort_values(by=["TokenAddress","FirstSwaptime"], ascending=[True,True])
+    print(f"len df ={len(res_df)}")
+
+    # 示例 获取结果如下https://dexscreener.com/solana/9s9sgqskfyzbygm45qblje4rt6calfa2dbhjrevlszrc?maker=47TwqZwwMGHc9CkJJxvVgFNGLDqBuSPy95KwUSTcLSti
+
+    res_df['DexScreenURL'] = res_df.apply(lambda ser: makescreenurl(
+        "https://dexscreener.com/solana/", f"{ser['TokenAddress']}?maker={ser['Maker']}"), axis=1)
+
+    
+    res_df.to_excel(baseclass.dalao_merge_path /
+                    "un_onhand_dalao.xlsx", index=False)
+ 
+    return
+
+file_list = [f for f in os.listdir(
+    baseclass.dalao_merge_path) if f.startswith("rep_relationship_total_dalao_txn_") ]
+arr_token_address = [file.split("_")[-1].replace(".xlsx","") for file in file_list  ]
+arr_token_address=list(set(arr_token_address))
+
+print("arr_token_address= ",arr_token_address)
+ 
+filter_simple_dalao()
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 42 - 0
src/code/002_06_get_new_dalao_profit.py

@@ -0,0 +1,42 @@
+
+# 获取 dalao所有关于此token的transfer记录 获取dalao的相关关系 例如 A buy token B sell token A transfer B 认为 A。B有关系 对于transfer 多个地址 路径长的 暂不考虑
+from base_class import *
+from base_class import BaseVariableFunction
+import urllib.parse
+import shutil
+import random
+import json
+baseclass = BaseVariableFunction(__file__)
+
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+
+ 
+ 
+
+str_token_address=baseclass.str_token_address
+
+df = pd.read_excel(baseclass.dalao_merge_path /
+                f"total_dalao_txn_{str_token_address}.xlsx", dtype=object)
+
+arr_str_dalaoaddress=[]
+arr_str_dalaoaddress=df["MAKER"].drop_duplicates().tolist()
+arr_str_dalaoaddress=arr_str_dalaoaddress[0:15]
+print(f"arr_str_dalaoaddress_len= {len(arr_str_dalaoaddress)}")
+
+ 
+new_relationship_df = pd.read_excel( baseclass.dalao_merge_path/  f"new_relationship_{str_token_address}.xlsx",dtype=object )
+
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 226 - 0
src/code/002_filter_dalao_tran_dexscreener_old.py

@@ -0,0 +1,226 @@
+
+# 将油猴脚本获取的top trader
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+baseclass.makedirpath(baseclass.dalao_tran_dexscreen_path)
+baseclass.makedirpath(baseclass.dalao_merge_path)
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+
+def makescreenurl(urlname, urlparam):
+    urlname = urlname + urlparam
+    return '=HYPERLINK("{}","{}")'.format(urlname, urlname)
+
+
+def fun(gdf, tokenadd):
+    # gdf = pd.DataFrame()
+    arr_type = gdf['TYPE'].drop_duplicates().tolist()
+    if ('Buy' not in arr_type or 'Sell' not in arr_type):
+        return None
+        # return pd.Series([])
+    buy_mask = gdf['TYPE'] == 'Buy'
+    sell_mask = gdf['TYPE'] == 'Sell'
+
+    arr_buymoney = gdf[buy_mask]['SOL'].tolist()
+    arr_sellmoney = gdf[sell_mask]['SOL'].tolist()
+    arr_buytoken = gdf[buy_mask]['Token'].tolist()
+    arr_selltoken = gdf[sell_mask]['Token'].tolist()
+    Selltoken_dec = sum(
+        [decimal.Decimal(token_dec) for token_dec in arr_selltoken])
+    Buytoken_dec = sum(
+        [decimal.Decimal(token_dec) for token_dec in arr_buytoken])
+    Sellmoney_dec = sum(
+        [decimal.Decimal(token_dec) for token_dec in arr_sellmoney])
+    Buymoney_dec = sum(
+        [decimal.Decimal(token_dec) for token_dec in arr_buymoney])
+    Earn_dec = Sellmoney_dec - Buymoney_dec
+    Earnper_dec = Earn_dec / \
+        Buymoney_dec if Buymoney_dec != 0 else decimal.Decimal(
+            -10)
+    Amountper_dec = Selltoken_dec / Buytoken_dec if Buytoken_dec != 0 else decimal.Decimal(
+        10)
+
+    Buymoney = '{0:.2f}'.format(Buymoney_dec)
+    Sellmoney = '{0:.2f}'.format(Sellmoney_dec)
+    Earn = '{0:.2f}'.format(Earn_dec)
+    Earnper = '{0:.2f}'.format(Earnper_dec)
+    Buyamount = '{0:.2f}'.format(Buytoken_dec)
+    Sellamount = '{0:.2f}'.format(Selltoken_dec)
+    Amountper = '{0:.2f}'.format(Amountper_dec)
+    Buycount = len(gdf[buy_mask]['TXN'].drop_duplicates())
+    Sellcount = len(gdf[sell_mask]['TXN'].drop_duplicates())
+    Maker = gdf['MAKER'].tolist()[0]
+    FirstSwaptime = gdf['DATE'].min()
+    return pd.DataFrame([[Maker,
+                        FirstSwaptime,
+                          Buymoney,
+                          Sellmoney,
+                          Earn,
+                          Earnper,
+                          Buycount,
+                          Sellcount,
+                          Buyamount,
+                          Sellamount,
+                          Amountper,
+                          tokenadd]])
+
+
+def filter_simple_dalao():
+
+    csv_file_list = [f for f in os.listdir(
+        baseclass.dalao_ori_tran_dexscreen_path) if f.endswith(".csv")]
+    res_df = None
+    big_amount_df = None
+
+    for csv_file in csv_file_list:
+
+        df = pd.read_csv(
+            baseclass.dalao_ori_tran_dexscreen_path / csv_file, dtype=object)
+        tokenadd = csv_file.split('_')[0]
+        print(f"enter {tokenadd}")
+
+        df = df[['DATE',
+                 'TYPE',
+                'SOL',
+                 'Token',
+                 'MAKER',
+                 'TXN',
+                 ]]
+
+        df = df[df['TYPE'].isin(['Buy', 'Sell'])].reset_index(drop=True)
+        df["DATE"] = pd.to_datetime(df["DATE"], format='%m-%d %H:%M:%S')
+        min_date = df['DATE'].min()
+        daxin_max_date = min_date + pd.Timedelta(seconds=2)
+        daxin_mask = (df['DATE'] >= min_date) & (df['DATE'] <= daxin_max_date)
+        arr_daxin_dalaoadd = df[daxin_mask]['MAKER'].drop_duplicates().tolist()
+        drop_daxin_dalao_mask = (~ df['MAKER'].isin(arr_daxin_dalaoadd))
+        df = df[drop_daxin_dalao_mask].reset_index(drop=True)
+
+        df = df.groupby(by=['MAKER']).apply(
+            lambda gdf: fun(gdf, tokenadd)).reset_index(drop=True)
+
+        if (len(df) == 0):
+            print("no transaction")
+            return
+        df.columns = ['Maker',
+                      "FirstSwaptime",
+                      'Buymoney',
+                      'Sellmoney',
+                      'Earn',
+                      'Earnper',
+                      'Buycount',
+                      'Sellcount',
+                      'Buyamount',
+                      'Sellamount',
+                      'Amountper',
+                      'TokenAddress']
+
+        # Rank,Maker,Buymoney,Sellmoney,Earn,Earnper,Buycount,Sellcount,Buyamount,Sellamount,Amountper,TokenAddress
+
+        df['FirstSwaptime'] = df['FirstSwaptime'].dt.strftime('%m-%d %H:%M:%S')
+
+        df["Amountper"] = df["Amountper"].astype(float)
+        df["Buymoney"] = df["Buymoney"].astype(float)
+        df["Sellmoney"] = df["Sellmoney"].astype(float)
+        df["Earn"] = df["Earn"].astype(float)
+        df["Earnper"] = df["Earnper"].astype(float)
+        df["Buycount"] = df["Buycount"].astype(int)
+        df["Sellcount"] = df["Sellcount"].astype(int)
+        df["Earnper"] = df['Earnper'].round(2)
+        df["Amountper"] = df['Amountper'].round(2)
+        df.insert(12, 'isNormal', -1)
+        df.to_excel(baseclass.dalao_tran_dexscreen_path / f"{tokenadd}.xlsx",
+                    index=False)
+
+        res_df = pd.concat([res_df, df], ignore_index=True)
+
+
+
+    nor_filter_mask = (
+        (res_df["Amountper"] <= 1.01)
+        & (res_df["Earnper"] >= 0.8)
+        & (res_df["Buymoney"] >= 0.1)
+        # & ~((res_df["Buycount"] >= 2) )
+    )
+    # nor_filter_mask = nor_filter_mask & False
+    big1_filter_mask = (
+        (res_df["Amountper"] <= 1.01)
+        & (res_df["Earnper"] >= 1)
+        & (res_df["Buymoney"] >= 0.8)
+        # & ~((res_df["Buycount"] >= 2) )
+    )
+    big2_filter_mask = (
+        (res_df["Amountper"] <= 1.01)
+        & (res_df["Earnper"] >= 0.7)
+        & (res_df["Buymoney"] >= 1.5)
+        # & ~((res_df["Buycount"] >= 3) )
+    )
+    # big2_filter_mask = big2_filter_mask & False
+  
+    big3_filter_mask = (
+        (res_df["Amountper"] <= 1.01)
+        & (res_df["Earnper"] >= 0.5)
+        & (res_df["Buymoney"] >= 2)
+        # & ~((res_df["Buycount"] >= 3) )
+    )
+    # big3_filter_mask = big3_filter_mask & False
+ 
+
+    multiple_filter_mask = (
+        (res_df["Amountper"] <= 1.01)
+        & (res_df["Earnper"] >= 2)
+        & (res_df["Buymoney"] >= 0.05)
+        # & ~((res_df["Buycount"] >= 2) )
+    )
+    multiple_df = res_df[multiple_filter_mask].reset_index(drop=True)
+    
+    print(f"len multiple_df ={len(multiple_df)}")
+
+
+    filter_mask = (
+        multiple_filter_mask
+        | nor_filter_mask
+        # | big1_filter_mask 
+        # |  big2_filter_mask
+        #  | big3_filter_mask 
+      
+                 
+                   )
+    # add_filter_mask = ((res_df["Buymoney"] <= 400))
+    
+   
+    res_df = res_df[filter_mask].reset_index(drop=True)
+    res_df = res_df.sort_values(by=["TokenAddress","FirstSwaptime"], ascending=[True,True])
+    multiple_df = multiple_df.sort_values(by=["TokenAddress","FirstSwaptime"], ascending=[True,True])
+    print(f"len df ={len(res_df)}")
+
+    # 示例 获取结果如下https://dexscreener.com/solana/9s9sgqskfyzbygm45qblje4rt6calfa2dbhjrevlszrc?maker=47TwqZwwMGHc9CkJJxvVgFNGLDqBuSPy95KwUSTcLSti
+
+    res_df['DexScreenURL'] = res_df.apply(lambda ser: makescreenurl(
+        "https://dexscreener.com/solana/", f"{ser['TokenAddress']}?maker={ser['Maker']}"), axis=1)
+    
+    multiple_df['DexScreenURL'] = multiple_df.apply(lambda ser: makescreenurl(
+        "https://dexscreener.com/solana/", f"{ser['TokenAddress']}?maker={ser['Maker']}"), axis=1)
+
+    res_df.to_excel(baseclass.dalao_merge_path /
+                    "un_onhand_dalao.xlsx", index=False)
+    multiple_df.to_excel(baseclass.dalao_merge_path /
+                    "multiple_df.xlsx", index=False)
+    return
+
+
+filter_simple_dalao()
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 61 - 0
src/code/002_filter_simple_topdalao.py

@@ -0,0 +1,61 @@
+
+# 将油猴脚本获取的top trader
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+
+def makescreenurl(urlname, urlparam):
+    # pairAddress = series[address_str]
+    urlname = urlname + urlparam
+    return '=HYPERLINK("{}","{}")'.format(urlname, urlname)
+
+
+def filter_simple_dalao():
+
+    df = baseclass.readcsvfiles_2df(baseclass.topdalao_from_dexscreener_path)
+    df["Amountper"] = df["Amountper"].astype(float)
+    df["Buymoney"] = df["Buymoney"].astype(float)
+    df["Earnper"] = df["Earnper"].astype(float)
+    df["Buycount"] = df["Buycount"].astype(int)
+    df["Sellcount"] = df["Sellcount"].astype(int)
+    df["Earnper"] = df['Earnper'].round(2)
+    df["Amountper"] = df['Amountper'].round(2)
+    df.insert(11, 'isNormal', -1)
+
+    filter_mask = (
+        (df["Amountper"] <= 1.3)
+        & (df["Earnper"] >= 1.1)
+        & (df["Buymoney"] > 3)
+        & ~((df["Buycount"] >= 5) & (df["Sellcount"] >= 5))
+    )
+
+    df = df[filter_mask].reset_index(drop=True)
+
+    # 示例 获取结果如下https://dexscreener.com/solana/9s9sgqskfyzbygm45qblje4rt6calfa2dbhjrevlszrc?maker=47TwqZwwMGHc9CkJJxvVgFNGLDqBuSPy95KwUSTcLSti
+
+    df['DexScreenURL'] = df.apply(lambda ser: makescreenurl(
+        "https://dexscreener.com/solana/", f"{ser['TokenAddress']}?maker={ser['Maker']}"), axis=1)
+
+    df.to_excel(baseclass.dalao_merge_path /
+                "un_onhand_dalao.xlsx", index=False)
+
+    return
+
+
+filter_simple_dalao()
+
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 50 - 0
src/code/003_get_onhand_dalao_notuse.py

@@ -0,0 +1,50 @@
+
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+
+
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+
+def filter_onhand_dalao():
+
+    df = pd.read_excel(baseclass.dalao_merge_path /
+                       "un_onhand_dalao.xlsx", dtype=object)
+    
+    print(f"pre un_onhand_dalao_df= {len(df)}")
+
+    df["isNormal"] = df["isNormal"].astype(int)
+    filter_mask = (
+        (df["isNormal"] == 1) | (df["isNormal"] == -1)
+    )
+    df = df[filter_mask].drop_duplicates().reset_index(drop=True)
+    df = df[["Maker"]].drop_duplicates().reset_index(drop=True)
+    df.columns = ["dalaoAddress"]
+    print(f"filter_dalao len= {len(df)}")
+    df.loc[len(df) ] = [baseclass.mywalletaddress]
+    print(f"aft un_onhand_dalao_df= {len(df)}")
+ 
+    # https://dexscreener.com/solana/9s9sgqskfyzbygm45qblje4rt6calfa2dbhjrevlszrc?maker=47TwqZwwMGHc9CkJJxvVgFNGLDqBuSPy95KwUSTcLSti
+
+    df.to_csv(baseclass.dalao_merge_path /
+              "filter_dalao.csv", index=False)
+    
+
+    return
+
+
+filter_onhand_dalao()
+
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 45 - 0
src/code/003_new_get_onhand_dalao.py

@@ -0,0 +1,45 @@
+
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+
+
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+
+def filter_onhand_dalao():
+
+    filter_dalao_df = pd.read_excel(baseclass.dalao_merge_path /
+                       "filter_dalao.xlsx", dtype=object)
+    arr_new_filter_dalao = []
+    
+    for index, row in filter_dalao_df.iterrows():
+        arr_cur_dalao = row.dropna().tolist()
+        arr_new_filter_dalao.extend(arr_cur_dalao)
+
+    # print(arr_new_filter_dalao)
+ 
+    df = pd.DataFrame(arr_new_filter_dalao, columns=["dalaoAddress"])
+    
+ 
+    df.to_csv(baseclass.dalao_merge_path /
+              "filter_dalao.csv", index=False)
+    
+
+    return
+
+
+filter_onhand_dalao()
+
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 137 - 0
src/code/004_01_get_tokentransfer_txhash_bysolscan_playwright.py

@@ -0,0 +1,137 @@
+
+# from datetime import datetime, timezone
+# from playwright.async_api import async_playwright, Playwright
+# from playwright.sync_api import expect
+from playwright.async_api import Playwright, async_playwright, expect
+import random
+
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+
+baseclass.makedirpath(baseclass.browsercookie_path)
+baseclass.makedirpath(baseclass.dalao_ori_tran_txhash_solscan_path)
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+# Python中windows路径的3种写法
+# 可以是以下这样写:
+utc_timeto = int(time.time())
+utc_timefrom = int(utc_timeto - 17*24*3600)
+utc_timeto = int(utc_timeto + 2*24*3600)
+
+def get_dalao_historysign_solscan(df):
+
+    utc_timeto = int(time.time())
+    utc_timefrom = int(utc_timeto - 17*24*3600)
+    utc_timeto = int(utc_timeto + 2*24*3600)
+    # 示例   https://api.solscan.io/v2/account/txs/export?address=2D4dLL47vA1k1EN4421aM9DzKp3VBDAqKj8iUTSBLktw&type=tokenchange&timefrom=1711900800&timeto=1714492799.999&account_type=account_main
+        # https://api-v2.solscan.io/v2/account/transfer/export?address=5bTgWQQE5Tb34BQQtUArj62PmFcVsaht2SGotAdq5fbt&activity_type[]=ACTIVITY_SPL_TRANSFER
+    # https://api-v2.solscan.io/v2/account/balance_change/export?address=Cft4hKtC3dVftfqmL2MCALpeCq7oWM7qpftNfVVUzA7h&time_from=1719763200&time_to=1721051816.123&account_type=account_main
+    
+    df['SolscanTransferUrl'] = df.apply(lambda ser: (
+        f"https://api-v2.solscan.io/v2/account/balance_change/export?address={ser['dalaoAddress']}&time_from={utc_timefrom}&time_to={utc_timeto}&account_type=account_main"), axis=1)
+
+    
+    return df
+
+
+async def do_some_thing(playwright, cur_arr_str_dalaoAddress, cur_arr_str_dalaoSwapUrl):
+
+    # browser =  playwright.chromium.launch(headless=True)
+    context = await playwright.chromium.launch_persistent_context(user_data_dir=USER_DIR_PATH, accept_downloads=True, headless=True)
+    # context = browser.new_context()
+    context.set_default_timeout(9000)
+    # context = await browser.new_context()
+    arr_page = [None]*2
+    arr_page[0] = await context .new_page()
+    await arr_page[0].goto(
+        "https://solscan.io/")
+
+    print(context .pages)
+
+    for str_dalaoAddress_idx in range(0, len(cur_arr_str_dalaoAddress)):
+
+        str_dalaoAddress = arr_str_dalaoAddress[str_dalaoAddress_idx]
+        str_dalaoTransferUrl = arr_str_dalaoSwapUrl[str_dalaoAddress_idx]
+        print(f"enter str_dalaoAddress= {str_dalaoAddress}")
+        print(f"enter str_dalaoTransferUrl= {str_dalaoTransferUrl}")
+        print(f"cur_arr_str_dalaoAddress remainder = {len(cur_arr_str_dalaoAddress)-str_dalaoAddress_idx}")
+        arr_page[1] = await context.new_page()
+        page = arr_page[1]
+
+        async with page.expect_download() as download_info:
+            try:
+                await page.goto(str_dalaoTransferUrl, timeout=0)
+            except:
+                # Wait for the download to start
+                download = await download_info.value
+                # Wait for the download process to complete
+                print(await download.path())
+                # Save downloaded file somewhere
+                await download.save_as(baseclass.dalao_ori_tran_txhash_solscan_path / f"ori_txhash_{str_dalaoAddress}.csv")
+            await page.wait_for_timeout(200)
+        time.sleep(0.5)
+        await page.close()
+
+    await context.close()
+
+
+async def get_onedriver_swapactivities(cur_arr_str_dalaoAddress, cur_arr_str_dalaoSwapUrl):
+    async with async_playwright() as playwright:
+        # playwright = Playwright().start()
+
+        await do_some_thing(playwright, cur_arr_str_dalaoAddress,
+                            cur_arr_str_dalaoSwapUrl)
+
+
+async def main():
+    print("enter main()")
+
+    await get_onedriver_swapactivities(
+        cur_arr_str_dalaoAddress=arr_str_dalaoAddress, cur_arr_str_dalaoSwapUrl=arr_str_dalaoSwapUrl)
+
+
+utc_timeto = int(time.time())
+utc_timefrom = int(utc_timeto - 17*24*3600)
+utc_timeto = int(utc_timeto + 2*24*3600)
+df = pd.read_csv(baseclass.dalao_merge_path /
+                 "filter_dalao.csv", dtype=object)
+
+arr_str_dalaoAddress = df['dalaoAddress'].tolist()
+temp_arr_str_dalaoAddress = arr_str_dalaoAddress.copy()
+arr_str_dalaoAddress=[]
+now_time = time.time()
+
+for str_dalaoAddress in temp_arr_str_dalaoAddress:
+    file = baseclass.dalao_ori_tran_txhash_solscan_path / f"ori_txhash_{str_dalaoAddress}.csv"
+    if file.exists():
+        modified_time  =  file.stat().st_mtime
+        # 60分钟内不会在获取
+        if(now_time -modified_time >60*60):
+            arr_str_dalaoAddress.append(str_dalaoAddress)
+        continue
+    else:
+        arr_str_dalaoAddress.append(str_dalaoAddress)
+
+ 
+arr_str_dalaoAddress.append(baseclass.mywalletaddress)
+
+arr_str_dalaoSwapUrl = [ f"https://api-v2.solscan.io/v2/account/balance_change/export?address={str_address}"
+                        for str_address in arr_str_dalaoAddress]
+
+print('arr_str_dalaoAddress', len(arr_str_dalaoAddress))
+if len(arr_str_dalaoAddress)==0:
+    raise("dalao txhash has get recently ,dont need get")
+downloads_path = baseclass.dalao_ori_tran_txhash_solscan_path
+USER_DIR_PATH = baseclass.browsercookie_path
+asyncio.run(main())
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 82 - 0
src/code/004_02_get_dalaotxhash_solscan.py

@@ -0,0 +1,82 @@
+
+
+import random
+
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+
+
+baseclass.makedirpath(baseclass.dalao_tran_txhash_path)
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+# Python中windows路径的3种写法
+# 可以是以下这样写:
+utc_timeto = int(time.time())
+utc_timefrom = int(utc_timeto - 17*24*3600)
+
+
+df = pd.read_csv(baseclass.dalao_merge_path /
+                 "filter_dalao.csv", dtype=object)
+
+arr_str_dalaoAddress = df['dalaoAddress'].tolist()
+
+print('arr_str_dalaoAddress', len(arr_str_dalaoAddress))
+
+for str_dalaoaddress in arr_str_dalaoAddress:
+    print("str_dalaoaddress=", str_dalaoaddress)
+    if not (baseclass.dalao_ori_tran_txhash_solscan_path/f"ori_txhash_{str_dalaoaddress}.csv").exists():
+        continue
+    obj_txhash_timestamp = {
+        "txhash": [],
+        "timestamp": [],
+    }
+    with open(baseclass.dalao_ori_tran_txhash_solscan_path /
+              f"ori_txhash_{str_dalaoaddress}.csv", mode="r", encoding="utf-8") as f:
+        arr_line = f.read().strip().split("\n")
+        arr_line.pop(0)
+        arr_line.pop()
+        
+        line =None
+        try:
+            for line in arr_line:
+                if line.strip() == '':
+                    continue 
+                arr_split_line = line.split(",")
+                if  " " in  arr_split_line[0] :
+                    arr_split_line[0]= arr_split_line[0].strip()[1:]
+                
+                obj_txhash_timestamp["txhash"].append(arr_split_line[0])
+                obj_txhash_timestamp["timestamp"].append(arr_split_line[1])
+        except Exception as e:
+            print("error line=",line)
+            raise
+    new_df = pd.DataFrame(obj_txhash_timestamp)
+
+    df = None
+    if (baseclass.dalao_tran_txhash_path/f"txhash_{str_dalaoaddress}.csv").exists():
+        df = pd.read_csv(baseclass.dalao_tran_txhash_path /
+                         f"txhash_{str_dalaoaddress}.csv", dtype=object)
+    df = pd.concat([new_df, df])
+    df =df.replace('',np.nan)
+    df =df.dropna(axis=0,how='any')
+    df["timestamp"] = df["timestamp"].astype(int)
+    df = df[df["timestamp"] >= utc_timefrom]
+
+    df = df.drop_duplicates().reset_index(drop=True)
+    df = df.sort_values(by=["timestamp"], ascending=[False])
+    df.to_csv(baseclass.dalao_tran_txhash_path /
+              f"txhash_{str_dalaoaddress}.csv", index=False)
+
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+ 

+ 247 - 0
src/code/004_03_get_dalaotransfer_solanafm_txhash.py

@@ -0,0 +1,247 @@
+
+
+from base_class import *
+from base_class import BaseVariableFunction
+import urllib.parse
+import shutil
+import random
+import json
+baseclass = BaseVariableFunction(__file__)
+
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+baseclass.makedirpath(baseclass.dalao_transfer_solanafm_path)
+
+
+def request_onetime(req_dict_total, key_idx,  loop):
+    requests_dict = req_dict_total.get(key_idx)
+    if requests_dict is None:
+        return
+    elif requests_dict['isrequseting'] == True:
+        return
+    elif requests_dict['need_remove'] == True:
+        print(f"key_idx {key_idx} need_remove\n", end='')
+        if req_dict_total.get(key_idx) is not None:
+            print(f"remove  {cur_conadd} {key_idx}\n", end='')
+            del req_dict_total[key_idx]
+        return
+    requests_dict['isrequseting'] = True
+
+    cur_conadd = requests_dict["req_params"]["address"]
+    print(f"enter key_idx={key_idx} cur_conadd={cur_conadd}\n", end='')
+
+    req_response = None
+    arr_cur_txhash = requests_dict["arr_txhash"]
+
+    req_url = "https://api.solana.fm/v0/transfers"
+    payload = {
+        "transactionHashes": arr_cur_txhash
+    }
+    try:
+        req_response = requests.post(
+            req_url,  json=payload, timeout=requests_dict['timeout'], headers=baseclass.solana_fm_headers)
+        time.sleep(0.2)
+
+    except Exception as e:
+        print(f"cur_conadd= {cur_conadd} errmsg={ str(e)}")
+        if (" Max retries exceeded" in str(e)):
+            time.sleep(2+random.random())
+        requests_dict['timeout'] = 15
+        requests_dict['isrequseting'] = False
+        return
+    requests_dict["req_response"] = req_response
+    write_tokens_path_name = baseclass.dalao_transfer_solanafm_path / \
+        f"{cur_conadd}.json"
+    # 请求结果不成功
+    if requests_dict["req_response"].status_code != 200:
+        print(
+            f"cur_conadd= {cur_conadd} response status_code= {requests_dict['req_response'].status_code}")
+        if requests_dict["req_response"].status_code == 429:
+            time.sleep(0.6)
+        elif requests_dict["req_response"].status_code == 400:
+            print("error 400 payload=",payload )
+            raise Exception("400 error")
+             
+
+        requests_dict['isrequseting'] = False
+
+        return
+
+    # 如果請求結果為成功
+    tokenresponse = json.loads(
+        requests_dict["req_response"].text)
+    # 結果不正常  continue
+    if tokenresponse["status"] != "success":
+        print(f"key_idx= {key_idx} response is 200 but status not success")
+        requests_dict["remainder_retry_times"] -= 1
+        requests_dict['isrequseting'] = False
+        if requests_dict["remainder_retry_times"] < 0:
+            raise Exception(f"key_idx={key_idx} retrytimes<0")
+        return
+
+    # 結果正常 獲取txlist
+    txlist = None
+    txlist = tokenresponse["result"]
+    if (txlist == None or len(txlist) == 0):
+        print(f"loop={loop} add={cur_conadd} txlist={txlist} arr_cur_txhash={arr_cur_txhash}")
+
+        requests_dict["need_remove"] = True
+        if req_dict_total.get(key_idx) is not None:
+            print(f"remove {cur_conadd} {key_idx}\n", end='')
+            del req_dict_total[key_idx]
+        requests_dict['isrequseting'] = False
+        return
+
+    print(
+        f"loop={loop} add={cur_conadd}  txhash_len={len(arr_cur_txhash)} real_len={len(txlist)} diflen={len(arr_cur_txhash) -len(txlist)  }")
+    if True:
+        # 如果此次請求結果不是最大offset,請求了全部結果,保存文本
+        requests_dict["need_remove"] = True
+        if req_dict_total.get(key_idx) is not None:
+            print(f"remove {cur_conadd} {key_idx}\n", end='')
+            del req_dict_total[key_idx]
+
+        if (len(txlist) == 0):
+            requests_dict['isrequseting'] = False
+            return
+
+        cur_file = []
+        if not write_tokens_path_name.exists():
+            print(f"loop={loop} {cur_conadd} 第一次文件\n", end='')
+
+        else:
+            with write_tokens_path_name.open(mode="r") as f:
+                cur_file = json.load(f)
+
+        cur_file = cur_file + txlist
+        print(f"{cur_conadd} 全部写入\n", end='')
+        with write_tokens_path_name.open(mode='w') as f:
+            json.dump(cur_file, f)
+
+        requests_dict['isrequseting'] = False
+        return
+
+    return
+
+
+def getonetran(address_list):
+
+    print(f"enter getonetran  ")
+    req_dict_total = {}
+    number_key_idx = 0
+    for address in (address_list):
+        arr_txhash = obj_dalao_2_txhash[address]
+        while (len(arr_txhash) > 0):
+            cur_arr_txhash = arr_txhash[0:50]
+            arr_txhash = arr_txhash[50:]
+            number_key_idx += 1
+            key_idx = str(number_key_idx)
+            req_dict = {
+                "req_params": {"address": address, },
+                "timeout": 10,
+
+                "key_idx": key_idx,
+                "arr_txhash": cur_arr_txhash,
+                "remainder_retry_times": 3,
+                "isrequseting": False,
+                "need_remove": False,
+            }
+            req_dict_total[key_idx] = req_dict
+
+    loop = 0
+    while (len(req_dict_total.keys()) > 0):
+        loop += 1
+        # 獲取可以同步請求的address長度 ,traders 長都可能小於 requests_dict定義的長度
+        # grequest_len 為 requests_dict長度和實際tokencontracts長度取最小值
+        print(
+            f"remainder_address_len :{len(req_dict_total.keys())}")
+
+        temp_split_req_dict_total_list = list(req_dict_total.keys())
+        temp_split_req_dict_total_list = temp_split_req_dict_total_list[0:10]
+
+        temp_req_dict_total_keys_list = []
+        for key_idx in temp_split_req_dict_total_list:
+            temp_req_dict_total_keys_list.append(key_idx)
+        # 進行異步請求
+        i = 0
+
+        for key_idx in temp_req_dict_total_keys_list:
+            i += 1
+            request_onetime(req_dict_total,  key_idx,   loop)
+            time.sleep(0.2)
+
+        time.sleep(0.3)
+
+    return
+
+
+def get_3trans_byScan(address_list):
+
+    # 此方法獲取 從bscapi獲取的 的3trans
+    # 有 requests_3trans_dict 和requests_tokenadd_dict兩種類型對應contractaddress和address
+    # 使用grequests 進行異步請求獲取
+    # offsettimes_max 為請求的數據次數,最大總數為 offsettimes_max*offset (offset 為params的offset)
+    # param_sort 為請求參數params 的sort
+    print("enter get_3trans_byScan_()")
+    contractadd_tokentx_list = copy.deepcopy(address_list)
+    getonetran(address_list=contractadd_tokentx_list,
+               )
+
+    return
+
+
+df = pd.read_csv(baseclass.dalao_merge_path /
+                 "filter_dalao.csv", dtype=object)
+obj_dalao_2_txhash = {
+
+}
+temp_arr_str_dalaoaddress = df["dalaoAddress"].tolist()
+# temp_arr_str_dalaoaddress=temp_arr_str_dalaoaddress[0:450]
+arr_str_dalaoaddress = []
+for str_dalaoaddress in temp_arr_str_dalaoaddress:
+
+    if not (baseclass.dalao_tran_txhash_path/f"txhash_{str_dalaoaddress}.csv").exists():
+        continue
+    arr_str_dalaoaddress.append(str_dalaoaddress)
+    df = pd.read_csv(baseclass.dalao_tran_txhash_path /
+                     f"txhash_{str_dalaoaddress}.csv", dtype=object)
+    arr_txhash = df["txhash"].tolist()
+    obj_dalao_2_txhash[str_dalaoaddress] = arr_txhash
+    arr_exist_txhash = []
+    dalao_transfere_fm_file = baseclass.dalao_transfer_solanafm_path / \
+        f"{str_dalaoaddress}.json"
+    if not dalao_transfere_fm_file.exists():
+        continue
+    try:
+        with dalao_transfere_fm_file.open(mode='r',encoding='utf-8') as f:
+            arr_obj_dalao_transaction = json.load(f)
+    except Exception as e:
+        print(f"json_read_error str_dalaoaddress={str_dalaoaddress}")
+        raise
+    for obj_dalao_transaction in arr_obj_dalao_transaction:
+        txhash = obj_dalao_transaction["transactionHash"]
+        arr_exist_txhash.append(txhash)
+    arr_txhash = list(set(arr_txhash) - set(arr_exist_txhash))
+    if len(arr_txhash)==0:
+        del obj_dalao_2_txhash[str_dalaoaddress]
+        arr_str_dalaoaddress.remove(str_dalaoaddress)
+        
+        continue
+    obj_dalao_2_txhash[str_dalaoaddress] = arr_txhash
+
+print(f"arr_str_dalaoaddress_len= {len(arr_str_dalaoaddress)}")
+get_3trans_byScan(address_list=arr_str_dalaoaddress,
+                  )
+
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 300 - 0
src/code/004_notuse_get_dalaotransfer_solanafm_byaccount.py

@@ -0,0 +1,300 @@
+
+
+from base_class import *
+from base_class import BaseVariableFunction
+import urllib.parse
+import shutil
+import random
+
+
+import json
+
+
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+baseclass = BaseVariableFunction(__file__)
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+baseclass.makedirpath(baseclass.dalao_transfer_solanafm_path)
+
+
+def request_onetime(req_dict_total, key_idx, write_tokens_path, loop):
+    requests_dict = req_dict_total.get(key_idx)
+    if requests_dict is None:
+        return
+    elif requests_dict['isrequseting'] == True:
+        return
+    elif requests_dict['need_remove'] == True:
+        print(f"key_idx {key_idx} need_remove\n", end='')
+        if req_dict_total.get(key_idx) is not None:
+            print(f"remove  {cur_conadd} {key_idx}\n", end='')
+            del req_dict_total[key_idx]
+        return
+    requests_dict['isrequseting'] = True
+
+    cur_conadd = requests_dict["req_params"]["address"]
+    print(f"enter key_idx={key_idx} cur_conadd={cur_conadd}\n", end='')
+    # 如果此次請求結果為最大offset,請求結果不全,如果沒到最大請求次數,繼續請求,
+    # 否則保存錯誤 但不删除这个token的csv
+    if requests_dict["offsettimes"] >= requests_dict["offsettimes_max"]:
+        requests_dict["need_remove"] = True
+        if req_dict_total.get(key_idx) is not None:
+            print(f"remove  {cur_conadd} {key_idx}\n", end='')
+            del req_dict_total[key_idx]
+        print(
+            f"{cur_conadd} length to max\n", end='')
+
+        return
+
+    req_response = None
+    req_url = f"https://api.solana.fm/v0/accounts/{requests_dict['req_params']['address']}/transfers?utcFrom={requests_dict['req_params']['startrange']}&utcTo={requests_dict['req_params']['endrange']}&limit=100&page=1"
+    
+    try:
+        req_response = requests.get(
+            req_url, timeout=requests_dict['timeout'], headers=baseclass.solana_fm_headers)
+        time.sleep(0.2)
+
+    except Exception as e:
+        print(f"cur_conadd= {cur_conadd} errmsg={ str(e)}")
+        if (" Max retries exceeded" in str(e)):
+            time.sleep(2+random.random())
+        requests_dict['timeout'] = 15
+        requests_dict['isrequseting'] = False
+        return
+    requests_dict["req_response"] = req_response
+    write_tokens_path_name = baseclass.dalao_transfer_solanafm_path / \
+        f"{cur_conadd}.json"
+    # 请求结果不成功
+    if requests_dict["req_response"].status_code != 200:
+        print(
+            f"cur_conadd= {cur_conadd} response status_code= {requests_dict['req_response'].status_code}")
+        if requests_dict["req_response"].status_code == 429:
+            time.sleep(0.4)
+
+        requests_dict['isrequseting'] = False
+
+        return
+
+    # 如果請求結果為成功
+    tokenresponse = json.loads(
+        requests_dict["req_response"].text)
+    # 結果不正常  continue
+    if tokenresponse["status"] != "success":
+        baseclass.handle_IF_tokenresponse_NOTOK(tokenresponse=tokenresponse,
+
+                                                cur_conadd=cur_conadd,
+                                                key_idx=key_idx,
+                                                requests_dict=requests_dict,
+                                                req_dict_total=req_dict_total)
+        requests_dict['isrequseting'] = False
+        return
+
+    # 結果正常 獲取txlist
+    txlist = None
+    txlist = tokenresponse["results"]
+    if (txlist == None or len(txlist) == 0):
+        print(f"loop={loop} add={cur_conadd} txlisst={txlist}")
+
+        requests_dict["need_remove"] = True
+        if req_dict_total.get(key_idx) is not None:
+            print(f"remove {cur_conadd} {key_idx}\n", end='')
+            del req_dict_total[key_idx]
+        requests_dict['isrequseting'] = False
+        return
+
+    requests_dict["offsettimes"] += 1
+    if requests_dict["offsettimes"] == 1:
+        requests_dict["isfirstreq"] = True
+    else:
+        requests_dict["isfirstreq"] = False
+    if requests_dict["isfirstreq"] == True:
+        # 如果是第一次请求 删除过去的csv文件
+        # 如果有这个csv文件 删除
+        if os.path.exists(write_tokens_path_name):
+            write_tokens_path_name.unlink()
+    cur_zero_txhash = txlist[0]['transactionHash']
+    cur_last_txhash = txlist[len(txlist)-1]['transactionHash']
+    print(
+        f"loop={loop} add={cur_conadd}  range={requests_dict['req_params']['startrange'] } {requests_dict['req_params']['endrange']}  len={len(txlist)} zero_txhash={cur_zero_txhash} last_txhash={cur_last_txhash}")
+    if (len(txlist) < 100):
+        # 如果此次請求結果不是最大offset,請求了全部結果,保存文本
+        requests_dict["need_remove"] = True
+        if req_dict_total.get(key_idx) is not None:
+            print(f"remove {cur_conadd} {key_idx}\n", end='')
+            del req_dict_total[key_idx]
+
+        if (len(txlist) == 0):
+            requests_dict['isrequseting'] = False
+            return
+        cur_minrange = txlist[len(txlist)-1]["data"][0]["timestamp"]
+        cur_maxrange = txlist[0]["data"][0]["timestamp"]
+
+        # 如果没有这个csv文件 直接写入
+        cur_file = []
+        if not write_tokens_path_name.exists():
+            print(f"loop={loop} {cur_conadd} 第一次文件\n", end='')
+
+        else:
+            with write_tokens_path_name.open(mode="r") as f:
+                cur_file = json.load(f)
+
+        cur_file = cur_file + txlist
+        print(f"{cur_conadd} 全部写入\n", end='')
+        with write_tokens_path_name.open(mode='w') as f:
+            json.dump(cur_file, f)
+
+        requests_dict['isrequseting'] = False
+        return
+    elif (len(txlist) >= 100):
+        # # 如果此次請求結果為最大offset,請求結果不全,如果沒到最大請求次數,繼續請求,
+        # # 否則保存錯誤 但不删除这个token的csv
+        requests_dict["need_remove"] = False
+        # 更換 start
+        cur_minrange = txlist[len(txlist)-1]["data"][0]["timestamp"]
+        cur_maxrange = txlist[0]["data"][0]["timestamp"]
+
+        while (True):
+            if (txlist[len(txlist)-1]["data"][0]["timestamp"] < cur_minrange+1):
+                txlist.pop(len(txlist)-1)
+                continue
+            else:
+                break
+
+        # 如果没有这个csv文件 直接写入
+        cur_file = []
+        if not write_tokens_path_name.exists():
+            print(f"loop={loop} {cur_conadd} 第一次文件\n", end='')
+
+        else:
+            with write_tokens_path_name.open(mode="r") as f:
+                cur_file = json.load(f)
+
+        cur_file = cur_file + txlist
+        print(f"{cur_conadd} 全部写入\n", end='')
+        with write_tokens_path_name.open(mode='w') as f:
+            json.dump(cur_file, f)
+
+        requests_dict["req_params"]["endrange"] = int(
+            cur_minrange+1)
+
+        baseclass.judge_req_completed(requests_dict=requests_dict,
+                                      key_idx=key_idx, cur_conadd=cur_conadd, req_dict_total=req_dict_total)
+        requests_dict['isrequseting'] = False
+        return
+
+    return
+
+
+def getonetran(address_list,  write_tokens_path,    offsettimes_max):
+    global startrange
+    global endrange
+    print(f"enter getonetran  ")
+    req_dict_total = {}
+    for idx, address in enumerate(address_list):
+        key_idx = str(idx)
+        req_dict = baseclass.init_req_dict(
+            startrange=startrange,
+            endrange=endrange,
+            address=address,
+            key_idx=key_idx,
+            offsettimes_max=offsettimes_max,
+            remainder_retry_times_max=5,
+            timeout=20)
+        req_dict_total[key_idx] = req_dict
+
+    loop = 0
+    while (len(req_dict_total.keys()) > 0):
+        loop += 1
+        # 獲取可以同步請求的address長度 ,traders 長都可能小於 requests_dict定義的長度
+        # grequest_len 為 requests_dict長度和實際tokencontracts長度取最小值
+        print(
+            f"remainder_address_len :{len(req_dict_total.keys())}")
+
+        # temp_req_dict_total = {}
+        temp_split_req_dict_total_list = list(req_dict_total.keys())
+        temp_split_req_dict_total_list = temp_split_req_dict_total_list[0:20]
+
+        temp_req_dict_total_keys_list = []
+        for key in temp_split_req_dict_total_list:
+            temp_req_dict_total_keys_list.append(key)
+        # 進行異步請求
+        i = 0
+        thread_list = []
+        for key in temp_req_dict_total_keys_list:
+            i += 1
+            request_onetime(req_dict_total, key, write_tokens_path,  loop)
+            time.sleep(0.1)
+            # thread = threading.Thread(
+            #     target=request_onetime,
+            #     args=(
+            #         req_dict_total, key, write_tokens_path,  loop)
+            # )
+            # thread_list.append(thread)
+            # if (i % 4 == 0):
+            #     #  总数4个,查询一遍
+            #     for thread in thread_list:
+            #         thread.start()
+            #     for thread in thread_list:
+            #         thread.join()
+            #     thread_list = []
+            #     time.sleep(0.8)
+            # elif i == len(temp_req_dict_total_keys_list):
+            #     #  总数不足10个,把剩下的也查询一遍
+            #     print('remainder len less 5', datetime.datetime.now())
+            #     for thread in thread_list:
+            #         thread.start()
+            #     for thread in thread_list:
+            #         thread.join()
+            #     thread_list = []
+
+        time.sleep(0.3)
+
+    return
+
+
+def get_3trans_byScan(address_list, write_tokens_path,):
+
+    # 此方法獲取 從bscapi獲取的 的3trans
+    # 有 requests_3trans_dict 和requests_tokenadd_dict兩種類型對應contractaddress和address
+    # 使用grequests 進行異步請求獲取
+    # offsettimes_max 為請求的數據次數,最大總數為 offsettimes_max*offset (offset 為params的offset)
+    # param_sort 為請求參數params 的sort
+    print("enter get_3trans_byScan_()")
+    contractadd_tokentx_list = copy.deepcopy(address_list)
+    getonetran(address_list=contractadd_tokentx_list,
+               write_tokens_path=write_tokens_path,
+               offsettimes_max=6
+               )
+
+    return
+
+
+now_timestamp = baseclass.get_current_timestamp()
+
+startrange = now_timestamp - 17*24*3600
+# startrange = now_timestamp - 2*24*3600
+
+endrange = now_timestamp+2*24*3600
+print(f"startrang= {startrange} endrange= {endrange}")
+
+df = pd.read_csv(baseclass.dalao_merge_path /
+                 "filter_dalao.csv", dtype=object)
+
+arr_str_dalao = df["dalaoAddress"].tolist()
+print('token_contracts_list', len(arr_str_dalao))
+
+
+get_3trans_byScan(address_list=arr_str_dalao,
+                  write_tokens_path=baseclass.dalao_transfer_solanafm_path
+                  )
+
+
+print(f"startrang= {startrange} endrange= {endrange}")
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 89 - 0
src/code/005_dalaotransfer_dropduplicate_solanafm.py

@@ -0,0 +1,89 @@
+
+
+import json
+
+
+import shutil
+
+import urllib.parse
+from base_class import BaseVariableFunction
+from base_class import *
+
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+baseclass = BaseVariableFunction(__file__)
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+utc_timeto = int(time.time())
+utc_timefrom = int(utc_timeto - 17*24*3600)
+
+def one_dalaotransfer_dropduplicate(str_dalao_address, success_address_list):
+    try:
+        # for str_dalao_address in arr_str_dalaoaddress:
+        # print(f"enter str_dalao_address= {str_dalao_address}")
+        dalao_file = baseclass.dalao_transfer_solanafm_path / \
+            f"{str_dalao_address}.json"
+        if not dalao_file.exists():
+            return
+        new_arr_obj_dalao_transaction = []
+        new_arr_txhash = []
+        try:
+            with dalao_file.open(mode='r', encoding='utf-8') as f:
+                arr_obj_dalao_transaction = json.load(f)
+        except Exception as e:
+            print(f"read_json_error str_dalao_address={str_dalao_address}")
+            raise
+        for obj_dalao_transaction in arr_obj_dalao_transaction:
+            txhash = obj_dalao_transaction["transactionHash"]
+            timestamp = obj_dalao_transaction["data"][0]["timestamp"]
+            if txhash in new_arr_txhash:
+                continue
+            if timestamp <= utc_timefrom  :
+                continue
+            new_arr_txhash.append(txhash)
+            new_arr_obj_dalao_transaction.append(obj_dalao_transaction)
+        with dalao_file.open(mode='w', encoding='utf-8') as f:
+            json.dump(new_arr_obj_dalao_transaction, f)
+        success_address_list.remove(str_dalao_address)
+        print(
+            f"str_dalao_address= {str_dalao_address} prelen= {len(arr_obj_dalao_transaction)} aftlen= {len(new_arr_obj_dalao_transaction)} remainder= {len(success_address_list)} \n", end='')
+    except Exception as e:
+        print(f"error_str_dalao_address={str_dalao_address}")
+        raise
+
+def mul_dalaotransfer_dropduplicate():
+    success_address_list = arr_str_dalaoaddress.copy()
+    for idx in range(0, len(arr_str_dalaoaddress), batchSize):
+        thread_list = []
+        for cur_idx in range(idx, min(idx+batchSize, len(arr_str_dalaoaddress))):
+            thread = threading.Thread(
+                target=one_dalaotransfer_dropduplicate,
+                args=(arr_str_dalaoaddress[cur_idx],
+                      success_address_list)
+            )
+            thread_list.append(thread)
+        for thread in thread_list:
+            thread.start()
+        for thread in thread_list:
+            thread.join()
+        time.sleep(1)
+    return
+
+
+arr_str_dalaoaddress = []
+
+df = pd.read_csv(baseclass.dalao_merge_path /
+                 "filter_dalao.csv", dtype=object)
+
+arr_str_dalaoaddress = df["dalaoAddress"].tolist()
+print('arr_str_dalaoaddress', len(arr_str_dalaoaddress))
+batchSize = 170
+mul_dalaotransfer_dropduplicate()
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 170 - 0
src/code/006_get_transaction_st_solanafm.py

@@ -0,0 +1,170 @@
+
+
+import json
+
+
+import shutil
+
+import urllib.parse
+from base_class import BaseVariableFunction
+from base_class import *
+
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+baseclass = BaseVariableFunction(__file__)
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+baseclass.makedirpath(baseclass.dalao_transaction_st_solanafm_path)
+
+# Pump.fun  6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P
+
+# Raydium_Authority_V4 = "5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1"
+# WSOL_Token = "So11111111111111111111111111111111111111112"
+
+
+def eheck_one_transaction_isswap(gdf, str_dalaoaddress):
+    sign = gdf["sign"].tolist()[0]
+    # if (sign == "2JBTiuHr1tpZ4abbwn4JP6vqm2CYmd1NoGjxkjPiv9y5MYan2D9NDsKTZMPw3fSzJegR64T8N1HcGUuZ45Jt3DWe"):
+    #     print("gdf=", gdf)
+    #     raise
+    # 之前的是针对 raydium 平台并且 自己发送token/sol 自己接收token/sol
+    # if gdf["source"].isin([Raydium_Authority_V4]).any() and gdf["destination"].isin([Raydium_Authority_V4]).any() and gdf["source"].isin([str_dalaoaddress]).any() and gdf["destination"].isin([str_dalaoaddress]).any():
+    #     return gdf
+    # 现在是自己发送token/sol 接收token/sol 不需要 raydium平台
+    if gdf["source"].isin([str_dalaoaddress]).any() and gdf["destination"].isin([str_dalaoaddress]).any():
+        return gdf
+    else:
+        return None
+
+
+def get_multransaction_st():
+    success_address_list = arr_str_dalaoaddress.copy()
+    for idx in range(0, len(arr_str_dalaoaddress), batchSize):
+        thread_list = []
+        for cur_idx in range(idx, min(idx+batchSize, len(arr_str_dalaoaddress))):
+            thread = threading.Thread(
+                target=get_onetransaction_st,
+                args=(arr_str_dalaoaddress[cur_idx],
+                      success_address_list)
+            )
+            thread_list.append(thread)
+        for thread in thread_list:
+            thread.start()
+        for thread in thread_list:
+            thread.join()
+        time.sleep(1)
+    return
+
+
+def get_onetransaction_st(str_dalaoaddress, success_address_list):
+    print(f"enter {str_dalaoaddress}")
+    try:
+        # 不存在此dalao的文件 直接跳过
+        if not (baseclass.dalao_transfer_solanafm_path/f"{str_dalaoaddress}.json").exists():
+            return
+        new_arr_obj_dalao_transaction = []
+        with (baseclass.dalao_transfer_solanafm_path/f"{str_dalaoaddress}.json").open(mode='r') as f:
+            arr_obj_dalao_transaction = json.load(f)
+        # 构造新的结果 方便后续转为csv格式 
+        # ori 为
+            # {
+            # "transactionHash": "53SSVoVwQwoBJCFg17WVoj1bis7xPXDx6LD88VHnNn3TDPKJwuCzBqcVvVw1DtRptf7WMdmCVijrdAC8UzxT7aas",
+            # "data": [
+            # {
+            # "instructionIndex": -1,
+            # "innerInstructionIndex": -1,
+            # "action": "unknownTransfer",
+            # "status": "Successful",
+            # "source": "unknowned",
+            # "sourceAssociation": null,
+            # "destination": "2xgeeA8T9AkYKPh5k7zDTpVLWisSu7eou6opsGKjm5mr",
+            # "destinationAssociation": null,
+            # "token": "",
+            # "amount": 326931586,
+            # "timestamp": 1720643298
+            # },
+            # xxxx
+            # }
+        # 新的结构为
+        # new_arr_obj_dalao_transaction [
+        # sign:"xxxx"
+        # "instructionIndex": -1,
+        # "innerInstructionIndex": -1,
+        # "action": "unknownTransfer",
+        # "status": "Successful",
+        # "source": "unknowned",
+        # "sourceAssociation": null,
+        # "destination": "2xgeeA8T9AkYKPh5k7zDTpVLWisSu7eou6opsGKjm5mr",
+        # "destinationAssociation": null,
+        # "token": "",
+        # "amount": 326931586,
+        # "timestamp": 1720643298
+        # ]
+
+        for obj_dalao_transaction in arr_obj_dalao_transaction:
+            sign = obj_dalao_transaction["transactionHash"]
+            arr_obj_instruction_data = obj_dalao_transaction["data"]
+            for obj_instruction_data in arr_obj_instruction_data:
+                # if (obj_instruction_data["instructionIndex"] == -1):
+                #     continue
+                if (obj_instruction_data["status"] != "Successful"):
+                    continue
+                if (obj_instruction_data["action"] in ["transfer", "transferChecked","unknownTransfer"]
+                    # and ((obj_instruction_data["source"] in [Raydium_Authority_V4, str_dalaoaddress])
+                    #     or (obj_instruction_data["destination"] in [Raydium_Authority_V4, str_dalaoaddress]))):
+                    and ((obj_instruction_data["source"] in [ str_dalaoaddress])
+                        or (obj_instruction_data["destination"] in [ str_dalaoaddress]))):
+                    obj_instruction_data["sign"] = sign
+                    new_arr_obj_dalao_transaction.append(obj_instruction_data)
+
+                else:
+                    continue
+
+        df = pd.DataFrame(new_arr_obj_dalao_transaction)
+        if (len(df) == 0):
+            df = pd.DataFrame(
+                columns=["timestamp", "sign", "source", 
+                        "destination", "token", "amount",
+                        "instructionIndex", "innerInstructionIndex"
+                        ])
+        df = df[["timestamp", "sign",  "source",
+                "destination", "token", "amount",
+                    "instructionIndex", "innerInstructionIndex"
+                ]]
+
+        df = df.groupby(by=["sign"]).apply(
+            lambda gdf: eheck_one_transaction_isswap(gdf, str_dalaoaddress))
+        if (len(df) == 0):
+            df = pd.DataFrame(
+                columns=["timestamp", "sign", "source",
+                         "destination", "token", "amount",
+                          "instructionIndex", "innerInstructionIndex"
+                         
+                         ])
+        df.to_csv(baseclass.dalao_transaction_st_solanafm_path /
+                f"{str_dalaoaddress}.csv", index=False)
+
+        success_address_list.remove(str_dalaoaddress)
+        print(f"{str_dalaoaddress} success remainder= {len(success_address_list)} \n", end='')
+    except Exception as e:
+        print(f"error_str_dalaoaddress={str_dalaoaddress} ",e)
+        raise
+# 9XvTzh7udehQMaQLikViwfXa5GpiDU4spw6BZYppsNJn 调用另一个router 对于raydium pool 进行交换
+
+
+df = pd.read_csv(baseclass.dalao_merge_path /
+                 "filter_dalao.csv", dtype=object)
+
+arr_str_dalaoaddress = df["dalaoAddress"].tolist()
+
+# arr_str_dalaoaddress=arr_str_dalaoaddress[0:10]
+batchSize = 170
+get_multransaction_st()
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 326 - 0
src/code/007_get_configtoken_st_solanafm.py

@@ -0,0 +1,326 @@
+
+
+import json
+
+
+import shutil
+
+import urllib.parse
+from base_class import BaseVariableFunction
+from base_class import *
+
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+baseclass = BaseVariableFunction(__file__)
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+baseclass.makedirpath(baseclass.dalao_configtoken_st_solanafm_path)
+
+Raydium_Authority_V4 = "5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1"
+WSOL_Token = "So11111111111111111111111111111111111111112"
+
+def checkgdfisswap(gdf, str_dalaoaddress):
+    is_raydium =False
+    # 保留与raudium 有关的token 的transfer 即只参与了swap的token
+    raydium_mask = ((gdf["source"] == Raydium_Authority_V4) | (
+        gdf["destination"] == Raydium_Authority_V4))
+    filter_dalao_mask = ((gdf["source"] == str_dalaoaddress) | (
+        gdf["destination"] == str_dalaoaddress))
+    if raydium_mask.any():
+        is_raydium =True
+        gdf["platform"]="raydium"
+ 
+    arr_raydium_token =None
+    arr_dalao_token =None
+
+    if is_raydium:
+        arr_raydium_token = gdf[raydium_mask]["token"].drop_duplicates().tolist()
+        gdf = gdf[gdf["token"].isin(arr_raydium_token)]
+    else:
+        arr_dalao_token = gdf[filter_dalao_mask]["token"].drop_duplicates().tolist()
+        gdf = gdf[gdf["token"].isin(arr_dalao_token)]
+    if not is_raydium:
+
+        dalao_intoken_mask = gdf["destination"] == str_dalaoaddress
+        dalao_outtoken_mask = gdf["source"] == str_dalaoaddress
+        arr_dalao_intoken = gdf[dalao_intoken_mask]["token"].drop_duplicates(
+        ).tolist()
+        arr_dalao_outtoken = gdf[dalao_outtoken_mask]["token"].drop_duplicates(
+        ).tolist()
+        if (len(arr_dalao_intoken) == 0 or len(arr_dalao_outtoken) == 0):
+            # dalao 没有token in 或者out 有问题 此sign 不是swap
+            return None
+        arr_dalao_token = list(set(arr_dalao_intoken) | set(arr_dalao_outtoken))
+        if (len(arr_dalao_token) != 2):
+            # dalao 的token数目不对 除了 sol token 还有其他的token 不是我想要的sign return
+            return None
+        if WSOL_Token not in arr_dalao_token:
+            # 没有sol 不是我想要的
+            return None
+        arr_dalao_token.remove(WSOL_Token)
+        # token in ,wsol out 或者 token out ,wsol in
+        str_token_address = arr_dalao_token[0]
+        # if str_token_address in arr_dalao_intoken and 
+        if WSOL_Token in arr_dalao_intoken:
+            arr_dalao_intoken.remove(WSOL_Token)
+        if WSOL_Token in arr_dalao_outtoken:
+            arr_dalao_outtoken.remove(WSOL_Token)
+        # if str_token_address in arr_dalao_intoken and 
+        if len(arr_dalao_intoken) +len(arr_dalao_outtoken)!=1:
+            return None
+        if str_token_address in arr_dalao_outtoken:
+            gdf["swap_type"] = "sell"
+        else:
+            gdf["swap_type"] = "buy"
+
+        gdf["swap_tokenaddress"] = str_token_address
+    else:
+        
+        raydium_intoken_mask = gdf["destination"] == Raydium_Authority_V4
+        raydium_outtoken_mask = gdf["source"] == Raydium_Authority_V4
+        arr_raydium_intoken = gdf[raydium_intoken_mask]["token"].drop_duplicates(
+        ).tolist()
+        arr_raydium_outtoken = gdf[raydium_outtoken_mask]["token"].drop_duplicates(
+        ).tolist()
+        if (len(arr_raydium_intoken) == 0 or len(arr_raydium_outtoken) == 0):
+            # raydium 没有token in 或者out 有问题 此sign 不是swap
+            return None
+        arr_raydiumtoken = list(set(arr_raydium_intoken) | set(arr_raydium_outtoken))
+        if (len(arr_raydiumtoken) != 2):
+            # raydium 的token数目不对 除了 sol token 还有其他的token 不是我想要的sign return
+            return None
+        if WSOL_Token not in arr_raydiumtoken:
+            # 没有sol 不是我想要的
+            return None
+        arr_raydiumtoken.remove(WSOL_Token)
+        # token in ,wsol out 或者 token out ,wsol in
+        str_token_address = arr_raydiumtoken[0]
+        # if str_token_address in arr_raydiumintoken and 
+        if WSOL_Token in arr_raydium_intoken:
+            arr_raydium_intoken.remove(WSOL_Token)
+        if WSOL_Token in arr_raydium_outtoken:
+            arr_raydium_outtoken.remove(WSOL_Token)
+        # if str_token_address in arr_raydiumintoken and 
+        if len(arr_raydium_intoken) +len(arr_raydium_outtoken)!=1:
+            return None
+        if str_token_address in arr_raydium_outtoken:
+            gdf["swap_type"] = "buy"
+        else:
+            gdf["swap_type"] = "sell"
+        gdf["swap_tokenaddress"] = str_token_address
+			
+
+
+    return gdf
+
+
+def setswaptoken(gdf, str_dalaoaddress):
+    arr_dalao_token =gdf["token"].drop_duplicate().tolist()
+    # dalao_intoken_mask = gdf["destination"] == str_dalaoaddress
+    # dalao_outtoken_mask = gdf["source"] == str_dalaoaddress
+    # arr_dalao_intoken = gdf[dalao_intoken_mask]["token"].drop_duplicates(
+    # ).tolist()
+    # arr_dalao_outtoken = gdf[dalao_outtoken_mask]["token"].drop_duplicates(
+    # ).tolist()
+    # arr_dalao_token = list(set(arr_dalao_intoken) | set(arr_dalao_outtoken))
+    arr_dalao_token.remove(WSOL_Token)
+    swapTokenAddress = arr_dalao_token[0]
+    gdf["swap_tokenaddress"] = swapTokenAddress
+    return gdf
+
+
+pow_ten_list = [
+    '1', '10', '100', '1000',
+    '10000', '100000', '1000000',
+    '10000000', '100000000', '1000000000',
+    '10000000000', '100000000000', '1000000000000',
+    '10000000000000', '100000000000000', '1000000000000000',
+    '10000000000000000', '100000000000000000', '1000000000000000000',
+    '10000000000000000000', '100000000000000000000', '1000000000000000000000',
+    '10000000000000000000000', '100000000000000000000000', '1000000000000000000000000'
+]
+
+
+# swap_ethamount	swap_tokenamount
+
+
+def compute_eth_amount_onerow(row, str_dalaoaddress):
+    row = row.copy()
+    if (row["token"] != WSOL_Token):
+        return row
+    amount = decimal.Decimal(row['amount'])
+    row['amount'] = '{0:.4f}'.format(
+        amount / decimal.Decimal(pow_ten_list[9]))
+    platform = row["platform"]
+    if platform=="raydium":
+        if (row['source'] == Raydium_Authority_V4):
+            row['swap_eth_amount'] = '{0:.4f}'.format(decimal.Decimal(
+                row['swap_eth_amount']) + decimal.Decimal(row['amount']))
+        if (row['destination'] == Raydium_Authority_V4):
+            row['swap_eth_amount'] = '{0:.4f}'.format(decimal.Decimal(
+                row['swap_eth_amount']) - decimal.Decimal(row['amount']))
+    else:
+        if (row['source'] == str_dalaoaddress):
+            if row['swap_type']=="sell":
+                # sell token 只关注 获取eth 不关注其他
+                return row
+            else:
+                row['swap_eth_amount'] = '{0:.4f}'.format(decimal.Decimal(
+                    row['swap_eth_amount']) - decimal.Decimal(row['amount']))
+            
+        if (row['destination'] == str_dalaoaddress):
+            row['swap_eth_amount'] = '{0:.4f}'.format(decimal.Decimal(
+                row['swap_eth_amount']) + decimal.Decimal(row['amount']))
+        
+
+    return row
+
+# def compute_eth_amount_gdf(gdf  ):
+#     # 判断此hash 是buy 还是 sell
+#     ,,,,
+#     return
+
+def compute_eth_amount(df, str_dalaoaddress):
+    # 將主流幣全部替換為wbnb,amount 以及 token 都替換,
+    # 添加swap_ethamount 列
+    # 计算每条hash 的 bnb 的value
+     
+    df["swap_eth_amount"]="0"
+   
+    # 待添加
+    # df = df.groupby(by=["sign"], group_keys=False).apply(
+    # lambda gdf: compute_eth_amount_gdf(gdf))
+
+    df = df.apply(lambda row: compute_eth_amount_onerow(
+        row, str_dalaoaddress), axis=1)
+    return df
+
+
+def compute_token_amount_onerow(row, str_dalaoaddress):
+    row = row.copy()
+    if (row["token"] == WSOL_Token):
+        return row
+    amount = decimal.Decimal(row['amount'])
+    row['amount'] = '{0:.0f}'.format(
+        amount / decimal.Decimal(pow_ten_list[6]))
+    platform = row["platform"]
+    if platform=="raydium":
+        if (row['source'] == Raydium_Authority_V4):
+            row['swap_token_amount'] = '{0:.0f}'.format(decimal.Decimal(
+                row['swap_token_amount']) + decimal.Decimal(row['amount']))
+        if (row['destination'] == Raydium_Authority_V4):
+            row['swap_token_amount'] = '{0:.0f}'.format(decimal.Decimal(
+                row['swap_token_amount']) - decimal.Decimal(row['amount']))
+    else:
+        if (row['source'] == str_dalaoaddress):
+            row['swap_token_amount'] = '{0:.0f}'.format(decimal.Decimal(
+            row['swap_token_amount']) - decimal.Decimal(row['amount']))
+        if (row['destination'] == str_dalaoaddress):
+            row['swap_token_amount'] = '{0:.0f}'.format(decimal.Decimal(
+            row['swap_token_amount']) + decimal.Decimal(row['amount']))
+    return row
+
+
+def compute_token_amount(df, str_dalaoaddress):
+
+    df = df.apply(lambda row: compute_token_amount_onerow(
+        row, str_dalaoaddress), axis=1)
+
+    return df
+
+
+def get_mul_configtoken_st():
+    success_address_list = arr_str_dalaoaddress.copy()
+    for idx in range(0, len(arr_str_dalaoaddress), batchSize):
+        thread_list = []
+        for cur_idx in range(idx, min(idx+batchSize, len(arr_str_dalaoaddress))):
+            thread = threading.Thread(
+                target=get_one_configtoken_st,
+                args=(arr_str_dalaoaddress[cur_idx],
+                      success_address_list)
+            )
+            thread_list.append(thread)
+        for thread in thread_list:
+            thread.start()
+        for thread in thread_list:
+            thread.join()
+    return
+
+
+def get_one_configtoken_st(str_dalaoaddress, success_address_list):
+    print(f"enter str_dalaoaddress= {str_dalaoaddress}")
+    if not (baseclass.dalao_transaction_st_solanafm_path /
+            f"{str_dalaoaddress}.csv").exists():
+        return
+    df = pd.read_csv(baseclass.dalao_transaction_st_solanafm_path /
+                     f"{str_dalaoaddress}.csv", dtype=object)
+    if (len(df) == 0):
+        return
+    # token可能为kong 代表sol相关 用wsol填充
+    df["token"] = df["token"].fillna(WSOL_Token)
+    prelen = len(df)
+    df["platform"]="unknown"
+    df["swap_type"]="unknow"
+    df["swap_tokenaddress"] = ""
+    df = df.groupby(by=["sign"], group_keys=False).apply(
+        lambda gdf: checkgdfisswap(gdf, str_dalaoaddress))
+    # 屏蔽pump 只考虑raydium 
+    # df =df[ df["platform"]=="raydium"].reset_index(drop=True)
+    aftlen = len(df)
+    if prelen != aftlen:
+        print(f"{str_dalaoaddress} pre= {prelen} aft= {aftlen}")
+    if aftlen == 0:
+        return
+
+    # df = df.groupby(by=["sign"], group_keys=False).apply(
+    #     lambda gdf: setswaptoken(gdf, str_dalaoaddress))
+    df["swap_eth_amount"] = "0"
+    df = compute_eth_amount(df=df, str_dalaoaddress=str_dalaoaddress)
+
+    df["swap_token_amount"] = "0"
+    df = compute_token_amount(df=df, str_dalaoaddress=str_dalaoaddress)
+
+    df["timestamp"] = df["timestamp"].astype(int)
+    df["token_idx"] = -1
+ 
+
+    gettokenidx_df = df[["timestamp", "swap_tokenaddress"]].copy()
+    gettokenidx_df = gettokenidx_df.sort_values(
+        by=["timestamp"], ascending=[True])
+    list_tokenaddress = gettokenidx_df["swap_tokenaddress"].drop_duplicates(
+    ).tolist()
+    for str_tokenaddress_idx in range(0, len(list_tokenaddress)):
+        str_tokenaddress = list_tokenaddress[str_tokenaddress_idx]
+        df.loc[df["swap_tokenaddress"] == str_tokenaddress,
+               "token_idx"] = str_tokenaddress_idx+1
+
+    df["dalaofirsttimestamp"] = df.groupby("token_idx")[
+        "timestamp"].transform("min")
+    df['dalaofirsttimestamp'] = pd.to_datetime(
+        df['dalaofirsttimestamp'], unit='s')
+
+    df = df.sort_values(by=["dalaofirsttimestamp", "token_idx", "timestamp"], ascending=[
+        False, True, True]).reset_index(drop=True)
+    df.to_csv(baseclass.dalao_configtoken_st_solanafm_path /
+              f"configtoken_{str_dalaoaddress}.csv", index=False)
+    success_address_list.remove(str_dalaoaddress)
+    print(
+        f"{str_dalaoaddress} success remainder_len={len(success_address_list)}\n", end='')
+
+
+batchSize = 170
+df = pd.read_csv(baseclass.dalao_merge_path /
+                 "filter_dalao.csv", dtype=object)
+
+arr_str_dalaoaddress = df["dalaoAddress"].tolist()
+print('arr_str_dalaoaddress', len(arr_str_dalaoaddress))
+# arr_str_dalaoaddress=arr_str_dalaoaddress[0:10]
+get_mul_configtoken_st()
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 230 - 0
src/code/007_get_configtoken_st_solanafm_old.py

@@ -0,0 +1,230 @@
+
+
+import json
+
+
+import shutil
+
+import urllib.parse
+from base_class import BaseVariableFunction
+from base_class import *
+
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+baseclass = BaseVariableFunction(__file__)
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+baseclass.makedirpath(baseclass.dalao_configtoken_st_solanafm_path)
+
+Raydium_Authority_V4 = "5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1"
+WSOL_Token = "So11111111111111111111111111111111111111112"
+
+
+def checkgdfisswap(gdf, str_dalaoaddress):
+
+    # 保留与raudium 有关的token 的transfer 即只参与了swap的token
+    raydium_mask = ((gdf["source"] == Raydium_Authority_V4) | (
+        gdf["destination"] == Raydium_Authority_V4))
+    list_raydium_token = gdf[raydium_mask]["token"].drop_duplicates().tolist()
+    gdf = gdf[gdf["token"].isin(list_raydium_token)]
+    dalao_intoken_mask = gdf["destination"] == str_dalaoaddress
+    dalao_outtoken_mask = gdf["source"] == str_dalaoaddress
+    list_dalao_intoken = gdf[dalao_intoken_mask]["token"].drop_duplicates(
+    ).tolist()
+    list_dalao_outtoken = gdf[dalao_outtoken_mask]["token"].drop_duplicates(
+    ).tolist()
+    if (len(list_dalao_intoken) == 0 or len(list_dalao_outtoken) == 0):
+        # dalao 没有token in 或者out 有问题 此sign 不是swap
+        return None
+    list_dalao_token = list(set(list_dalao_intoken) | set(list_dalao_outtoken))
+    if (len(list_dalao_token) != 2):
+        # dalao 的token数目不对 除了 sol token 还有其他的token 不是我想要的sign return
+        return None
+    if WSOL_Token not in list_dalao_token:
+        # 没有sol 不是我想要的
+        return None
+    return gdf
+
+
+def setswaptoken(gdf, str_dalaoaddress):
+    dalao_intoken_mask = gdf["destination"] == str_dalaoaddress
+    dalao_outtoken_mask = gdf["source"] == str_dalaoaddress
+    list_dalao_intoken = gdf[dalao_intoken_mask]["token"].drop_duplicates(
+    ).tolist()
+    list_dalao_outtoken = gdf[dalao_outtoken_mask]["token"].drop_duplicates(
+    ).tolist()
+    list_dalao_token = list(set(list_dalao_intoken) | set(list_dalao_outtoken))
+    list_dalao_token.remove(WSOL_Token)
+    swapTokenAddress = list_dalao_token[0]
+    gdf["swap_tokenaddress"] = swapTokenAddress
+    return gdf
+
+
+pow_ten_list = [
+    '1', '10', '100', '1000',
+    '10000', '100000', '1000000',
+    '10000000', '100000000', '1000000000',
+    '10000000000', '100000000000', '1000000000000',
+    '10000000000000', '100000000000000', '1000000000000000',
+    '10000000000000000', '100000000000000000', '1000000000000000000',
+    '10000000000000000000', '100000000000000000000', '1000000000000000000000',
+    '10000000000000000000000', '100000000000000000000000', '1000000000000000000000000'
+]
+
+
+# swap_ethamount	swap_tokenamount
+
+
+def compute_eth_amount_onerow(row, str_dalaoaddress):
+    row = row.copy()
+    if (row["token"] != WSOL_Token):
+        return row
+    amount = decimal.Decimal(row['amount'])
+    row['amount'] = '{0:.4f}'.format(
+        amount / decimal.Decimal(pow_ten_list[9]))
+    if (row['source'] == str_dalaoaddress):
+        row['swap_eth_amount'] = '{0:.4f}'.format(decimal.Decimal(
+            row['swap_eth_amount']) - decimal.Decimal(row['amount']))
+    if (row['destination'] == str_dalaoaddress):
+        row['swap_eth_amount'] = '{0:.4f}'.format(decimal.Decimal(
+            row['swap_eth_amount']) + decimal.Decimal(row['amount']))
+    return row
+
+# def compute_eth_amount_gdf(gdf  ):
+#     # 判断此hash 是buy 还是 sell
+#     ,,,,
+#     return
+
+def compute_eth_amount(df, str_dalaoaddress):
+    # 將主流幣全部替換為wbnb,amount 以及 token 都替換,
+    # 添加swap_ethamount 列
+    # 计算每条hash 的 bnb 的value
+     
+    df["swap_eth_amount"]="0"
+    df["actiontype"]=None
+    # 待添加
+    # df = df.groupby(by=["sign"], group_keys=False).apply(
+    # lambda gdf: compute_eth_amount_gdf(gdf))
+
+    df = df.apply(lambda row: compute_eth_amount_onerow(
+        row, str_dalaoaddress), axis=1)
+    return df
+
+
+def compute_token_amount_onerow(row, str_dalaoaddress):
+    row = row.copy()
+    if (row["token"] == WSOL_Token):
+        return row
+    amount = decimal.Decimal(row['amount'])
+    row['amount'] = '{0:.0f}'.format(
+        amount / decimal.Decimal(pow_ten_list[6]))
+    if (row['source'] == str_dalaoaddress):
+        row['swap_token_amount'] = '{0:.0f}'.format(decimal.Decimal(
+            row['swap_token_amount']) - decimal.Decimal(row['amount']))
+    if (row['destination'] == str_dalaoaddress):
+        row['swap_token_amount'] = '{0:.0f}'.format(decimal.Decimal(
+            row['swap_token_amount']) + decimal.Decimal(row['amount']))
+    return row
+
+
+def compute_token_amount(df, str_dalaoaddress):
+
+    df = df.apply(lambda row: compute_token_amount_onerow(
+        row, str_dalaoaddress), axis=1)
+
+    return df
+
+
+def get_mul_configtoken_st():
+    success_address_list = arr_str_dalaoaddress.copy()
+    for idx in range(0, len(arr_str_dalaoaddress), batchSize):
+        thread_list = []
+        for cur_idx in range(idx, min(idx+batchSize, len(arr_str_dalaoaddress))):
+            thread = threading.Thread(
+                target=get_one_configtoken_st,
+                args=(arr_str_dalaoaddress[cur_idx],
+                      success_address_list)
+            )
+            thread_list.append(thread)
+        for thread in thread_list:
+            thread.start()
+        for thread in thread_list:
+            thread.join()
+    return
+
+
+def get_one_configtoken_st(str_dalaoaddress, success_address_list):
+    print(f"enter str_dalaoaddress= {str_dalaoaddress}")
+    if not (baseclass.dalao_transaction_st_solanafm_path /
+            f"{str_dalaoaddress}.csv").exists():
+        return
+    df = pd.read_csv(baseclass.dalao_transaction_st_solanafm_path /
+                     f"{str_dalaoaddress}.csv", dtype=object)
+    if (len(df) == 0):
+        return
+    df["token"] = df["token"].fillna(WSOL_Token)
+    prelen = len(df)
+    df = df.groupby(by=["sign"], group_keys=False).apply(
+        lambda gdf: checkgdfisswap(gdf, str_dalaoaddress))
+
+    aftlen = len(df)
+    if prelen != aftlen:
+        print(f"{str_dalaoaddress} pre= {prelen} aft= {aftlen}")
+    if aftlen == 0:
+        return
+
+    df["swap_tokenaddress"] = ""
+    df = df.groupby(by=["sign"], group_keys=False).apply(
+        lambda gdf: setswaptoken(gdf, str_dalaoaddress))
+    df["swap_eth_amount"] = "0"
+    df = compute_eth_amount(df=df, str_dalaoaddress=str_dalaoaddress)
+
+    df["swap_token_amount"] = "0"
+    df = compute_token_amount(df=df, str_dalaoaddress=str_dalaoaddress)
+
+    df["timestamp"] = df["timestamp"].astype(int)
+    df["token_idx"] = -1
+    # df["TokenFirstTime"] = df.groupby("swap_tokenaddress")[
+    #     "timestamp"].transform("min")
+
+    gettokenidx_df = df[["timestamp", "swap_tokenaddress"]].copy()
+    gettokenidx_df = gettokenidx_df.sort_values(
+        by=["timestamp"], ascending=[True])
+    list_tokenaddress = gettokenidx_df["swap_tokenaddress"].drop_duplicates(
+    ).tolist()
+    for str_tokenaddress_idx in range(0, len(list_tokenaddress)):
+        str_tokenaddress = list_tokenaddress[str_tokenaddress_idx]
+        df.loc[df["swap_tokenaddress"] == str_tokenaddress,
+               "token_idx"] = str_tokenaddress_idx+1
+
+    df["dalaofirsttimestamp"] = df.groupby("token_idx")[
+        "timestamp"].transform("min")
+    df['dalaofirsttimestamp'] = pd.to_datetime(
+        df['dalaofirsttimestamp'], unit='s')
+
+    df = df.sort_values(by=["dalaofirsttimestamp", "token_idx", "timestamp"], ascending=[
+        False, True, True]).reset_index(drop=True)
+    df.to_csv(baseclass.dalao_configtoken_st_solanafm_path /
+              f"configtoken_{str_dalaoaddress}.csv", index=False)
+    success_address_list.remove(str_dalaoaddress)
+    print(
+        f"{str_dalaoaddress} success remainder_len={len(success_address_list)}\n", end='')
+
+
+batchSize = 170
+df = pd.read_csv(baseclass.dalao_merge_path /
+                 "filter_dalao.csv", dtype=object)
+
+arr_str_dalaoaddress = df["dalaoAddress"].tolist()
+
+print('arr_str_dalaoaddress', len(arr_str_dalaoaddress))
+
+get_mul_configtoken_st()
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 308 - 0
src/code/007_zzz_02_merge_relation_configtoken_st_solanafm.py

@@ -0,0 +1,308 @@
+
+
+import json
+
+
+import shutil
+
+import urllib.parse
+from base_class import BaseVariableFunction
+from base_class import *
+
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+baseclass = BaseVariableFunction(__file__)
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+baseclass.makedirpath(baseclass.dalao_configtoken_st_solanafm_path)
+
+Raydium_Authority_V4 = "5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1"
+WSOL_Token = "So11111111111111111111111111111111111111112"
+
+def checkgdfisswap(gdf, str_dalaoaddress):
+    is_raydium =False
+    # 保留与raudium 有关的token 的transfer 即只参与了swap的token
+    raydium_mask = ((gdf["source"] == Raydium_Authority_V4) | (
+        gdf["destination"] == Raydium_Authority_V4))
+    filter_dalao_mask = ((gdf["source"] == str_dalaoaddress) | (
+        gdf["destination"] == str_dalaoaddress))
+    if raydium_mask.any():
+        is_raydium =True
+        gdf["platform"]="raydium"
+ 
+    arr_raydium_token =None
+    arr_dalao_token =None
+
+    if is_raydium:
+        arr_raydium_token = gdf[raydium_mask]["token"].drop_duplicates().tolist()
+        gdf = gdf[gdf["token"].isin(arr_raydium_token)]
+    else:
+        arr_dalao_token = gdf[filter_dalao_mask]["token"].drop_duplicates().tolist()
+        gdf = gdf[gdf["token"].isin(arr_dalao_token)]
+    if not is_raydium:
+
+        dalao_intoken_mask = gdf["destination"] == str_dalaoaddress
+        dalao_outtoken_mask = gdf["source"] == str_dalaoaddress
+        arr_dalao_intoken = gdf[dalao_intoken_mask]["token"].drop_duplicates(
+        ).tolist()
+        arr_dalao_outtoken = gdf[dalao_outtoken_mask]["token"].drop_duplicates(
+        ).tolist()
+        if (len(arr_dalao_intoken) == 0 or len(arr_dalao_outtoken) == 0):
+            # dalao 没有token in 或者out 有问题 此sign 不是swap
+            return None
+        arr_dalao_token = list(set(arr_dalao_intoken) | set(arr_dalao_outtoken))
+        if (len(arr_dalao_token) != 2):
+            # dalao 的token数目不对 除了 sol token 还有其他的token 不是我想要的sign return
+            return None
+        if WSOL_Token not in arr_dalao_token:
+            # 没有sol 不是我想要的
+            return None
+        arr_dalao_token.remove(WSOL_Token)
+        # token in ,wsol out 或者 token out ,wsol in
+        str_token_address = arr_dalao_token[0]
+        # if str_token_address in arr_dalao_intoken and 
+        if WSOL_Token in arr_dalao_intoken:
+            arr_dalao_intoken.remove(WSOL_Token)
+        if WSOL_Token in arr_dalao_outtoken:
+            arr_dalao_outtoken.remove(WSOL_Token)
+        # if str_token_address in arr_dalao_intoken and 
+        if len(arr_dalao_intoken) +len(arr_dalao_outtoken)!=1:
+            return None
+        if str_token_address in arr_dalao_outtoken:
+            gdf["swap_type"] = "sell"
+        else:
+            gdf["swap_type"] = "buy"
+
+        gdf["swap_tokenaddress"] = str_token_address
+    else:
+        
+        raydium_intoken_mask = gdf["destination"] == Raydium_Authority_V4
+        raydium_outtoken_mask = gdf["source"] == Raydium_Authority_V4
+        arr_raydium_intoken = gdf[raydium_intoken_mask]["token"].drop_duplicates(
+        ).tolist()
+        arr_raydium_outtoken = gdf[raydium_outtoken_mask]["token"].drop_duplicates(
+        ).tolist()
+        if (len(arr_raydium_intoken) == 0 or len(arr_raydium_outtoken) == 0):
+            # raydium 没有token in 或者out 有问题 此sign 不是swap
+            return None
+        arr_raydiumtoken = list(set(arr_raydium_intoken) | set(arr_raydium_outtoken))
+        if (len(arr_raydiumtoken) != 2):
+            # raydium 的token数目不对 除了 sol token 还有其他的token 不是我想要的sign return
+            return None
+        if WSOL_Token not in arr_raydiumtoken:
+            # 没有sol 不是我想要的
+            return None
+        arr_raydiumtoken.remove(WSOL_Token)
+        # token in ,wsol out 或者 token out ,wsol in
+        str_token_address = arr_raydiumtoken[0]
+        # if str_token_address in arr_raydiumintoken and 
+        if WSOL_Token in arr_raydium_intoken:
+            arr_raydium_intoken.remove(WSOL_Token)
+        if WSOL_Token in arr_raydium_outtoken:
+            arr_raydium_outtoken.remove(WSOL_Token)
+        # if str_token_address in arr_raydiumintoken and 
+        if len(arr_raydium_intoken) +len(arr_raydium_outtoken)!=1:
+            return None
+        if str_token_address in arr_raydium_outtoken:
+            gdf["swap_type"] = "buy"
+        else:
+            gdf["swap_type"] = "sell"
+        gdf["swap_tokenaddress"] = str_token_address
+			
+
+
+    return gdf
+
+
+def setswaptoken(gdf, str_dalaoaddress):
+    arr_dalao_token =gdf["token"].drop_duplicate().tolist()
+    # dalao_intoken_mask = gdf["destination"] == str_dalaoaddress
+    # dalao_outtoken_mask = gdf["source"] == str_dalaoaddress
+    # arr_dalao_intoken = gdf[dalao_intoken_mask]["token"].drop_duplicates(
+    # ).tolist()
+    # arr_dalao_outtoken = gdf[dalao_outtoken_mask]["token"].drop_duplicates(
+    # ).tolist()
+    # arr_dalao_token = list(set(arr_dalao_intoken) | set(arr_dalao_outtoken))
+    arr_dalao_token.remove(WSOL_Token)
+    swapTokenAddress = arr_dalao_token[0]
+    gdf["swap_tokenaddress"] = swapTokenAddress
+    return gdf
+
+
+pow_ten_list = [
+    '1', '10', '100', '1000',
+    '10000', '100000', '1000000',
+    '10000000', '100000000', '1000000000',
+    '10000000000', '100000000000', '1000000000000',
+    '10000000000000', '100000000000000', '1000000000000000',
+    '10000000000000000', '100000000000000000', '1000000000000000000',
+    '10000000000000000000', '100000000000000000000', '1000000000000000000000',
+    '10000000000000000000000', '100000000000000000000000', '1000000000000000000000000'
+]
+
+
+# swap_ethamount	swap_tokenamount
+
+
+def compute_eth_amount_onerow(row, str_dalaoaddress):
+    row = row.copy()
+    if (row["token"] != WSOL_Token):
+        return row
+    amount = decimal.Decimal(row['amount'])
+    row['amount'] = '{0:.4f}'.format(
+        amount / decimal.Decimal(pow_ten_list[9]))
+    platform = row["platform"]
+    if platform=="raydium":
+        if (row['source'] == Raydium_Authority_V4):
+            row['swap_eth_amount'] = '{0:.4f}'.format(decimal.Decimal(
+                row['swap_eth_amount']) + decimal.Decimal(row['amount']))
+        if (row['destination'] == Raydium_Authority_V4):
+            row['swap_eth_amount'] = '{0:.4f}'.format(decimal.Decimal(
+                row['swap_eth_amount']) - decimal.Decimal(row['amount']))
+    else:
+        if (row['source'] == str_dalaoaddress):
+            if row['swap_type']=="sell":
+                # sell token 只关注 获取eth 不关注其他
+                return row
+            else:
+                row['swap_eth_amount'] = '{0:.4f}'.format(decimal.Decimal(
+                    row['swap_eth_amount']) - decimal.Decimal(row['amount']))
+            
+        if (row['destination'] == str_dalaoaddress):
+            row['swap_eth_amount'] = '{0:.4f}'.format(decimal.Decimal(
+                row['swap_eth_amount']) + decimal.Decimal(row['amount']))
+        
+
+    return row
+
+# def compute_eth_amount_gdf(gdf  ):
+#     # 判断此hash 是buy 还是 sell
+#     ,,,,
+#     return
+
+def compute_eth_amount(df, str_dalaoaddress):
+    # 將主流幣全部替換為wbnb,amount 以及 token 都替換,
+    # 添加swap_ethamount 列
+    # 计算每条hash 的 bnb 的value
+     
+    df["swap_eth_amount"]="0"
+   
+    # 待添加
+    # df = df.groupby(by=["sign"], group_keys=False).apply(
+    # lambda gdf: compute_eth_amount_gdf(gdf))
+
+    df = df.apply(lambda row: compute_eth_amount_onerow(
+        row, str_dalaoaddress), axis=1)
+    return df
+
+
+
+
+
+
+
+def get_one_configtoken_st(str_dalaoaddress, success_address_list):
+    print(f"enter str_dalaoaddress= {str_dalaoaddress}")
+    if not (baseclass.dalao_transaction_st_solanafm_path /
+            f"{str_dalaoaddress}.csv").exists():
+        return
+    df = pd.read_csv(baseclass.dalao_transaction_st_solanafm_path /
+                     f"{str_dalaoaddress}.csv", dtype=object)
+    if (len(df) == 0):
+        return
+    # token可能为kong 代表sol相关 用wsol填充
+    df["token"] = df["token"].fillna(WSOL_Token)
+    prelen = len(df)
+    df["platform"]="unknown"
+    df["swap_type"]="unknow"
+    df["swap_tokenaddress"] = ""
+    df = df.groupby(by=["sign"], group_keys=False).apply(
+        lambda gdf: checkgdfisswap(gdf, str_dalaoaddress))
+    # 屏蔽pump 只考虑raydium 
+    # df =df[ df["platform"]=="raydium"].reset_index(drop=True)
+    aftlen = len(df)
+    if prelen != aftlen:
+        print(f"{str_dalaoaddress} pre= {prelen} aft= {aftlen}")
+    if aftlen == 0:
+        return
+
+    # df = df.groupby(by=["sign"], group_keys=False).apply(
+    #     lambda gdf: setswaptoken(gdf, str_dalaoaddress))
+    df["swap_eth_amount"] = "0"
+    df = compute_eth_amount(df=df, str_dalaoaddress=str_dalaoaddress)
+
+    df["swap_token_amount"] = "0"
+    df = compute_token_amount(df=df, str_dalaoaddress=str_dalaoaddress)
+
+    df["timestamp"] = df["timestamp"].astype(int)
+    df["token_idx"] = -1
+ 
+
+    gettokenidx_df = df[["timestamp", "swap_tokenaddress"]].copy()
+    gettokenidx_df = gettokenidx_df.sort_values(
+        by=["timestamp"], ascending=[True])
+    list_tokenaddress = gettokenidx_df["swap_tokenaddress"].drop_duplicates(
+    ).tolist()
+    for str_tokenaddress_idx in range(0, len(list_tokenaddress)):
+        str_tokenaddress = list_tokenaddress[str_tokenaddress_idx]
+        df.loc[df["swap_tokenaddress"] == str_tokenaddress,
+               "token_idx"] = str_tokenaddress_idx+1
+
+    df["dalaofirsttimestamp"] = df.groupby("token_idx")[
+        "timestamp"].transform("min")
+    df['dalaofirsttimestamp'] = pd.to_datetime(
+        df['dalaofirsttimestamp'], unit='s')
+
+    df = df.sort_values(by=["dalaofirsttimestamp", "token_idx", "timestamp"], ascending=[
+        False, True, True]).reset_index(drop=True)
+    df.to_csv(baseclass.dalao_configtoken_st_solanafm_path /
+              f"configtoken_{str_dalaoaddress}.csv", index=False)
+    success_address_list.remove(str_dalaoaddress)
+    print(
+        f"{str_dalaoaddress} success remainder_len={len(success_address_list)}\n", end='')
+
+
+batchSize = 170
+filter_dalao_df = pd.read_excel(baseclass.dalao_merge_path /
+                 "filter_dalao.xlsx", dtype=object)
+
+arr_str_dalaoaddress = []
+
+for index, row in filter_dalao_df.iterrows():
+    arr_cur_dalao = row.dropna().tolist()
+    arr_str_dalaoaddress.append(arr_cur_dalao)
+
+ 
+print('arr_str_dalaoaddress', len(arr_str_dalaoaddress))
+# arr_str_dalaoaddress=arr_str_dalaoaddress[0:10]
+
+def merge_relation_conigtoken_st():
+    for arr_relation_dalao in arr_str_dalaoaddress:
+        print(arr_relation_dalao)
+        dalao_df = None
+       
+        for str_dalaoaddress in arr_relation_dalao:
+            if not (baseclass.dalao_configtoken_st_solanafm_path /
+                    f"configtoken_{str_dalaoaddress}.csv").exists():
+                continue
+            cur_df = pd.read_csv( baseclass.dalao_configtoken_st_solanafm_path /
+                    f"configtoken_{str_dalaoaddress}.csv", dtype=object)
+            dalao_df = pd.concat[dalao_df,cur_df]
+        dalao_df.to_csv( baseclass.dalao_configtoken_st_solanafm_path /
+                    f"relation_configtoken_{str_dalaoaddress}.csv", index=False)
+
+        
+    return
+
+merge_relation_conigtoken_st()
+
+ 
+# get_mul_configtoken_st()
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 1088 - 0
src/code/008_get_profit_st_solanafm.py

@@ -0,0 +1,1088 @@
+
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+baseclass.makedirpath(baseclass.dalao_profit_st_fm_path)
+baseclass.makedirpath(baseclass.dalao_ana_fm_path)
+
+
+baseclass.makedirpath(baseclass.dalao_total_ana_fm_path)
+baseclass.open_base_library()
+decimal.getcontext().prec = 100
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+onedalao_ana_columns = ['TokenFirstTime', 'swap_tokenaddress', "issellfir", 'buy_counts', 'sell_counts',
+                        'outtoken_per', 'cost_main', 'earn_main', 'earn_percent' ,
+                        'diffdays','fir_cost_main','fir_earn_percent' , 'fir_noadd_earn_percent']
+
+    
+onetxhash_onerow_ana_cols= [
+"sign","swap_tokenaddress","dexurl","platform","datetime",
+"dalaofirsttimestamp","diffdays",
+"fir_cost_main","fir_earn_percent","issellfir",
+"fir_noadd_earn_percent","token_price", "buy_sell_diftime",
+
+"swap_type",
+"outtoken_per",
+"buy_counts","sell_counts",
+"timestamp","TokenFirstTime",
+"swap_eth_amount","swap_token_amount",
+"cost_main","earn_main","earn_percent",
+"intoken_amount","outtoken_amount",
+    ]
+    
+
+TotalAnalysis_columns = [
+    "add",
+    # "whichcontract",
+    "url",
+    "beizhu",
+
+    "03d_cost",
+    "03d_earn",
+    "03d_earnper",
+    "03d_difcost",
+    "03d_difearn",
+    "03d_difper",
+    "03d_costmedian",
+    "03d_costmean",
+    "03d_cost_noaddouttoken",
+    "03d_earn_noaddouttoken",
+    "03d_earnper_noaddouttoken",
+    # "03d_difcost_noaddouttoken",
+    # "03d_difearn_noaddouttoken",
+    # "03d_difper_noaddouttoken",
+    # "03d_costmedian_noaddouttoken",
+    # "03d_costmean_noaddouttoken",
+    "03d_mine_fir_earnper",
+    "03d_mine_fir_earnper_dropmax",
+    "03d_mine_fir_earnper_droptwomax",
+    "03d_mine_noadd_fir_earnper" , 
+    "03d_mine_noadd_fir_earnper_dropmax" , 
+    "03d_mine_noadd_fir_earnper_droptwomax" ,
+
+    "03d_trans",
+
+
+    "07d_cost",
+    "07d_earn",
+    "07d_earnper",
+    "07d_difcost",
+    "07d_difearn",
+    "07d_difper",
+    "07d_costmedian",
+    "07d_costmean",
+    "07d_cost_noaddouttoken",
+    "07d_earn_noaddouttoken",
+    "07d_earnper_noaddouttoken",
+    # "07d_difcost_noaddouttoken",
+    # "07d_difearn_noaddouttoken",
+    # "07d_difper_noaddouttoken",
+    # "07d_costmedian_noaddouttoken",
+    # "07d_costmean_noaddouttoken",
+    "07d_mine_fir_earnper",
+    "07d_mine_fir_earnper_dropmax",
+    "07d_mine_fir_earnper_droptwomax",
+    "07d_mine_noadd_fir_earnper" , 
+    "07d_mine_noadd_fir_earnper_dropmax" , 
+    "07d_mine_noadd_fir_earnper_droptwomax" ,
+    "07d_trans",
+
+
+    # "11d_cost",
+    # "11d_earn",
+    # "11d_earnper",
+    # "11d_difcost",
+    # "11d_difearn",
+    # "11d_difper",
+    # "11d_costmedian",
+    # "11d_costmean",
+    # "11d_cost_noaddouttoken",
+    # "11d_earn_noaddouttoken",
+    # "11d_earnper_noaddouttoken",
+    # # "11d_difcost_noaddouttoken",
+    # # "11d_difearn_noaddouttoken",
+    # # "11d_difper_noaddouttoken",
+    # # "11d_costmedian_noaddouttoken",
+    # # "11d_costmean_noaddouttoken",
+    # "11d_mine_fir_earnper",
+    # "11d_mine_fir_earnper_dropmax",
+    # "11d_mine_fir_earnper_droptwomax",
+    # "11d_mine_noadd_fir_earnper" , 
+    # "11d_mine_noadd_fir_earnper_dropmax" , 
+    # "11d_mine_noadd_fir_earnper_droptwomax" ,
+    # "11d_trans",
+
+
+    "15d_cost",
+    "15d_earn",
+    "15d_earnper",
+    "15d_difcost",
+    "15d_difearn",
+    "15d_difper",
+    "15d_costmedian",
+    "15d_costmean",
+    "15d_cost_noaddouttoken",
+    "15d_earn_noaddouttoken",
+    "15d_earnper_noaddouttoken",
+    # "15d_difcost_noaddouttoken",
+    # "15d_difearn_noaddouttoken",
+    # "15d_difper_noaddouttoken",
+    # "15d_costmedian_noaddouttoken",
+    # "15d_costmean_noaddouttoken",
+    "15d_mine_fir_earnper",
+    "15d_mine_fir_earnper_dropmax",
+    "15d_mine_fir_earnper_droptwomax",
+    "15d_mine_noadd_fir_earnper" , 
+    "15d_mine_noadd_fir_earnper_dropmax" , 
+    "15d_mine_noadd_fir_earnper_droptwomax" ,
+    "15d_trans",
+
+ 
+    "30d_cost",
+    "30d_earn",
+    "30d_earnper",
+    "30d_difcost",
+    "30d_difearn",
+    "30d_difper",
+    "30d_costmedian",
+    "30d_costmean",
+    "30d_cost_noaddouttoken",
+    "30d_earn_noaddouttoken",
+    "30d_earnper_noaddouttoken",
+    # "30d_difcost_noaddouttoken",
+    # "30d_difearn_noaddouttoken",
+    # "30d_difper_noaddouttoken",
+    # "30d_costmedian_noaddouttoken",
+    # "30d_costmean_noaddouttoken",
+    "30d_mine_fir_earnper",
+    "30d_mine_fir_earnper_dropmax",
+    "30d_mine_fir_earnper_droptwomax",
+    "30d_mine_noadd_fir_earnper" , 
+    "30d_mine_noadd_fir_earnper_dropmax" , 
+    "30d_mine_noadd_fir_earnper_droptwomax" ,
+    "30d_trans",
+
+    "30dearn_dif",
+   "30d_mine_fir_earnper_dif",
+]
+
+
+
+earn_kuisun_columns=[
+      "add",
+       "url",
+    "beizhu",
+
+    "03d_bigbig_earn_counts"  , "03d_big_earn_counts"   , "03d_nor_earn_counts"  ,
+    "03d_nor_kuisun_counts"  , "03d_big_kuisun_counts"   , "03d_bigbig_kuisun_counts"  ,
+    "03d_bigbig_earn_per"  , "03d_big_earn_per"   , "03d_nor_earn_per"  ,
+    "03d_nor_kuisun_per"  , "03d_big_kuisun_per"   , "03d_bigbig_kuisun_per"  ,
+    "03d_total_counts",
+
+    "07d_bigbig_earn_counts"  , "07d_big_earn_counts"   , "07d_nor_earn_counts"  ,
+    "07d_nor_kuisun_counts"  , "07d_big_kuisun_counts"   , "07d_bigbig_kuisun_counts"  ,
+    "07d_bigbig_earn_per"  , "07d_big_earn_per"   , "07d_nor_earn_per"  ,
+    "07d_nor_kuisun_per"  , "07d_big_kuisun_per"   , "07d_bigbig_kuisun_per"  ,
+    "07d_total_counts",
+
+    # "11d_bigbig_earn_counts"  , "11d_big_earn_counts"   , "11d_nor_earn_counts"  ,
+    # "11d_nor_kuisun_counts"  , "11d_big_kuisun_counts"   , "11d_bigbig_kuisun_counts"  ,
+    # "11d_bigbig_earn_per"  , "11d_big_earn_per"   , "11d_nor_earn_per"  ,
+    # "11d_nor_kuisun_per"  , "11d_big_kuisun_per"   , "11d_bigbig_kuisun_per"  ,
+    # "11d_total_counts",
+
+    "15d_bigbig_earn_counts"  , "15d_big_earn_counts"   , "15d_nor_earn_counts"  ,
+    "15d_nor_kuisun_counts"  , "15d_big_kuisun_counts"   , "15d_bigbig_kuisun_counts"  ,
+    "15d_bigbig_earn_per"  , "15d_big_earn_per"   , "15d_nor_earn_per"  ,
+    "15d_nor_kuisun_per"  , "15d_big_kuisun_per"   , "15d_bigbig_kuisun_per"  ,
+    "15d_total_counts",
+
+
+
+    "30d_bigbig_earn_counts"  , "30d_big_earn_counts"   , "30d_nor_earn_counts"  ,
+    "30d_nor_kuisun_counts"  , "30d_big_kuisun_counts"   , "30d_bigbig_kuisun_counts"  ,
+    "30d_bigbig_earn_per"  , "30d_big_earn_per"   , "30d_nor_earn_per"  ,
+    "30d_nor_kuisun_per"  , "30d_big_kuisun_per"   , "30d_bigbig_kuisun_per"  ,
+    "30d_total_counts",
+
+]
+
+def get_txhash_tokenswap_amount(df):
+    def get_txhash_cost(gdf):
+        token_amount_list = gdf['swap_token_amount'].to_list()
+        arr_token_amount = [(decimal.Decimal(
+            token_amount)) for token_amount in token_amount_list]
+        token_amount = sum(arr_token_amount)
+        token_amount_str = '{0:.4f}'.format(token_amount)
+        gdf[['swap_token_amount']] = [token_amount_str]
+        # gdf['swap_token_amount'] = token_amount_str
+        return gdf
+
+    df = df.groupby(["sign"], group_keys=False).apply(
+        lambda gdf:  get_txhash_cost(gdf))
+    df = df.reset_index(drop=True)
+    return df
+
+
+def get_tokenswap_amount(df):
+    def get_cost(gdf):
+        arr_token_amount = gdf['swap_token_amount'].to_list()
+        isfirstsell = False
+        while len(arr_token_amount) > 0:
+            if (decimal.Decimal(arr_token_amount[0]) < 0):
+                arr_token_amount.pop(0)
+                isfirstsell = True
+            else:
+                break
+        if len(arr_token_amount) == 0:
+            return gdf
+        arr_out_token_amount = [abs(decimal.Decimal(
+            token_amount)) for token_amount in arr_token_amount if decimal.Decimal(token_amount) < 0]
+        arr_in_token_amount = [decimal.Decimal(
+            token_amount) for token_amount in arr_token_amount if decimal.Decimal(token_amount) > 0]
+        buy_counts = len(arr_in_token_amount)
+        sell_counts = len(arr_out_token_amount)
+
+        out_token_amount = sum(arr_out_token_amount)
+        in_token_amount = sum(arr_in_token_amount)
+
+        out_token_amount_str = '{0:.2f}'.format(out_token_amount)
+        in_token_amount_str = '{0:.2f}'.format(in_token_amount)
+        if isfirstsell:
+            outtoken_per = "1.01"
+        else:
+            outtoken_per = '{0:.2f}'.format(
+                out_token_amount/in_token_amount) if in_token_amount != 0 else '-10'
+        gdf[['buy_counts', 'sell_counts', 'intoken_amount', 'outtoken_amount', 'outtoken_per']] = [buy_counts, sell_counts,
+                                                                                                   in_token_amount_str, out_token_amount_str, outtoken_per]
+        return gdf
+    df[['buy_counts', 'sell_counts', 'intoken_amount',
+        'outtoken_amount', 'outtoken_per']] = [0, 0, '0', '0', '0']
+    # 如果全是sell token 那么 在get_cost()将会在中途返回gdf 不会赋值 如上变量全为0
+    df = df.groupby(["swap_tokenaddress"], group_keys=False).apply(
+        lambda gdf:  get_cost(gdf))
+    df = df.reset_index(drop=True)
+    return df
+
+
+def get_sol_profit(df):
+    # 計算利潤
+    df['cost_main'] = 0
+    df['earn_main'] = 0
+    df['earn_percent'] = -10
+    df['fir_cost_main'] = 0
+    df['fir_earn_percent']=-10
+    df["issellfir"] = 0
+    df["fir_noadd_earn_percent"] = -10
+    df["token_price"]=-10
+    df["buy_sell_diftime"]=-1
+   
+    df = df.astype({'swap_eth_amount': float})
+    df = df.astype({'swap_token_amount': float})
+    df = df.astype({'outtoken_per': float})
+    df = df.astype({'timestamp': int})
+
+     
+
+ 
+    df["token_price"] = np.where(
+        df['swap_token_amount'] != 0,
+        -df['swap_eth_amount'] / df['swap_token_amount'],
+        -10,
+    )
+ 
+
+    def get_one_sol_profit(gdf):
+        issellfir = False
+        arr_eth_amount = gdf['swap_eth_amount'].to_list()
+        arr_token_amount = gdf['swap_token_amount'].to_list()
+        arr_timestamp = gdf["timestamp"].to_list()
+        
+        while len(arr_eth_amount) > 0:
+            # 如果 arr_eth_amount[0]>0 则此交易为卖出 pass
+
+            if (arr_eth_amount[0] >= 0):
+                gdf["issellfir"] = 1
+                arr_eth_amount.pop(0)
+                arr_token_amount.pop(0)
+                arr_timestamp.pop(0)
+                continue
+            else:
+                break
+        if len(arr_eth_amount) == 0:
+            return gdf
+        number_cost_main = sum(
+            [abs(eth_amount) for eth_amount in arr_eth_amount if eth_amount < 0])
+        number_earn_main = sum(arr_eth_amount)
+
+        number_earn_percent = number_earn_main / \
+            number_cost_main if number_cost_main != 0 else -10
+        gdf["cost_main"] = number_cost_main
+        gdf["earn_main"] = number_earn_main
+        gdf["earn_percent"] = number_earn_percent
+
+        arr_firswap_token_amount = arr_token_amount.copy()
+        arr_firswap_eth_amount = arr_eth_amount.copy()
+
+        # swap_tokenaddress
+        small_sol_counts = 0
+        # 获取第一笔cost_eth
+         # 如果 arr_eth_amount[0]>0 则此交易为卖出 pass
+         # 如果 0>arr_eth_amount[0]>-0.04 此交易金额较小 pass
+        while len(arr_firswap_eth_amount) > 0:
+            if arr_firswap_eth_amount[0]>=0:
+                arr_firswap_eth_amount.pop(0)
+                arr_firswap_token_amount.pop(0)
+                arr_timestamp.pop(0)
+                continue
+            elif arr_firswap_eth_amount[0]<0 and arr_firswap_eth_amount[0]>-0.04:
+                arr_firswap_eth_amount.pop(0)
+                arr_firswap_token_amount.pop(0)
+                arr_timestamp.pop(0)
+                small_sol_counts+=1
+                if small_sol_counts==2:
+                    break
+                continue
+            else :
+                break
+        if small_sol_counts==2:
+            return gdf
+        if len(arr_firswap_eth_amount) == 0:
+            return gdf  
+
+        fir_swap_tokenamount = arr_firswap_token_amount[0]
+        fir_swap_costmain = abs(arr_firswap_eth_amount[0])
+        fir_swap_earntmain = -fir_swap_costmain
+        fir_buy_timestamp =int(arr_timestamp[0])
+        fir_sell_timestamp = 0
+
+        while len(arr_firswap_eth_amount) > 0:
+            if arr_firswap_eth_amount[0]<=0:
+                arr_firswap_eth_amount.pop(0)
+                arr_firswap_token_amount.pop(0)
+                arr_timestamp.pop(0)
+                continue
+            # 现在 swap_token 为负 , eth为正 代表 sell token
+            cur_swap_tokenamount = abs(arr_firswap_token_amount[0])
+            cur_swap_eth = arr_firswap_eth_amount[0]
+            fir_sell_timestamp = int(arr_timestamp[0])
+            arr_firswap_eth_amount.pop(0)
+            arr_firswap_token_amount.pop(0)
+            arr_timestamp.pop(0)
+            if fir_swap_tokenamount>=cur_swap_tokenamount:
+                fir_swap_earntmain+=cur_swap_eth
+                fir_swap_tokenamount-=cur_swap_tokenamount
+            else:
+                fir_swap_earntmain = fir_swap_earntmain+  fir_swap_tokenamount/cur_swap_tokenamount * cur_swap_eth
+                fir_swap_tokenamount=0
+            if fir_swap_tokenamount==0:
+                break
+        gdf['fir_cost_main'] = fir_swap_costmain
+        gdf["fir_earn_percent"] = fir_swap_earntmain / fir_swap_costmain  if fir_swap_costmain != 0 else -10
+        gdf["fir_noadd_earn_percent"] = fir_swap_earntmain / fir_swap_costmain  if fir_swap_costmain != 0 else -10
+        if issellfir==1 or gdf["outtoken_per"].tolist()[0]>1:
+            gdf["fir_noadd_earn_percent"] = -10
+        gdf["buy_sell_diftime"] = fir_sell_timestamp - fir_buy_timestamp
+        return gdf
+
+    df = df.groupby(["swap_tokenaddress"], group_keys=False).apply(
+        lambda gdf:  get_one_sol_profit(gdf))
+
+    return df
+
+
+
+
+def analysis_lastdays( df, now_unix_time, intervaldays=30):
+    if len(df) == 0:
+        return 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0,0
+    # need consider df may null if use iloc
+    lastdf = df[df["TokenFirstTime"] >=
+                now_unix_time - 3600*24*intervaldays]
+    # 去除那些earnper为-10的
+    lastdf = lastdf[lastdf['cost_main'] != 0]
+    # 去除 cost_main 过小的 <0.04  sol 理论上 同时fir_cost_main!=0
+    lastdf = lastdf[lastdf['cost_main'] >= 0.04]
+    lastdf = lastdf[lastdf['fir_cost_main'] != 0]
+    lastdf = lastdf[lastdf['issellfir'] ==0]
+
+
+    lastdf = lastdf.reset_index(drop=True)
+    if len(lastdf) == 0:
+        return 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0
+    last_mine_fir_earnper =  lastdf['fir_earn_percent'].sum()
+    last_mine_fir_earnper_dropmax = last_mine_fir_earnper- lastdf['fir_earn_percent'].max()
+    last_mine_fir_earnper_droptwomax = last_mine_fir_earnper - sum( lastdf['fir_earn_percent'].nlargest(2).tolist())
+
+    last_cost_sum = lastdf['cost_main'].sum()
+    last_earn_sum = lastdf['earn_main'].sum()
+    last_cost_median = lastdf['cost_main'].median()
+    last_cost_mean = lastdf['cost_main'].mean()
+    last_earnper = last_earn_sum / last_cost_sum if last_cost_sum != 0 else -10
+    last_trans_amount = len(lastdf)
+    lastdf['earn_percent'] = np.where(
+        lastdf['cost_main'] != 0,
+        lastdf['earn_main'] / lastdf['cost_main'],
+        -10,
+    )
+    earnmain_max = lastdf['earn_main'].max()
+    last_earn_difmax_sum = last_earn_sum - earnmain_max
+    last_cost_difmax_sum = last_cost_sum - \
+        lastdf[lastdf['earn_main'] == earnmain_max]['cost_main'].to_list()[0]
+    last_dif_earnper = (
+        last_earn_difmax_sum / last_cost_difmax_sum if last_cost_difmax_sum != 0 else -10
+    )
+    return (
+        last_cost_sum,
+        last_earn_sum,
+        last_earnper,
+        last_cost_difmax_sum,
+        last_earn_difmax_sum,
+        last_dif_earnper,
+        last_cost_median,
+        last_cost_mean,
+        # last_earncount_per,
+        last_trans_amount,
+        last_mine_fir_earnper,
+        last_mine_fir_earnper_dropmax,
+        last_mine_fir_earnper_droptwomax,
+    )
+
+def analysis_lastdays_noaddouttoken( df, now_unix_time, intervaldays=30):
+    if len(df) == 0:
+        return 0, 0, 0, 0, 0,  0, 0, 0, 0,0,0,0
+    # need consider df may null if use iloc
+    lastdf = df[df["TokenFirstTime"] >=
+                now_unix_time - 3600*24*intervaldays]
+    # 去除那些earnper为-10的
+    lastdf = lastdf[lastdf['cost_main'] != 0]
+    # 去除 cost_main 过小的 <0.04  sol 理论上 同时fir_cost_main!=0
+    lastdf = lastdf[lastdf['cost_main'] >= 0.04] 
+    lastdf = lastdf[lastdf['fir_cost_main'] != 0]
+    # fir_noadd_earn_percent
+    # 去除 第一笔交易是sell
+    lastdf = lastdf[lastdf['fir_noadd_earn_percent'] !=-10]
+    lastdf = lastdf[lastdf['issellfir'] ==0]
+    lastdf = lastdf.reset_index(drop=True)
+    if len(lastdf) == 0:
+        return 0, 0, 0, 0, 0,  0, 0, 0, 0,0,0,0
+    
+    last_mine_noadd_fir_earnper =  lastdf['fir_noadd_earn_percent'].sum()
+    last_mine_noadd_fir_earnper_dropmax = last_mine_noadd_fir_earnper- lastdf['fir_noadd_earn_percent'].max()
+    last_mine_noadd_fir_earnper_droptwomax = last_mine_noadd_fir_earnper - sum( lastdf['fir_noadd_earn_percent'].nlargest(2).tolist())
+    last_cost_sum = lastdf['cost_main'].sum()
+    last_earn_sum = lastdf['earn_main'].sum()
+    # last_earn_sum = lastdf["earn_main_noaddouttoken"].sum()
+    last_cost_median = lastdf['cost_main'].median()
+    last_cost_mean = lastdf['cost_main'].mean()
+    last_earnper = last_earn_sum / last_cost_sum if last_cost_sum != 0 else -10
+    last_trans_amount = len(lastdf)
+    lastdf['earn_percent'] = np.where(
+        lastdf['cost_main'] != 0,
+        lastdf["earn_main"] / lastdf['cost_main'],
+        -10,
+    )
+
+    earnmain_max = lastdf["earn_main"].max()
+    last_earn_difmax_sum = last_earn_sum - earnmain_max
+    last_cost_difmax_sum = last_cost_sum - \
+        lastdf[lastdf['earn_main'] == earnmain_max]['cost_main'].to_list()[
+            0]
+    last_dif_earnper = (
+        last_earn_difmax_sum / last_cost_difmax_sum if last_cost_difmax_sum != 0 else -10
+    )
+    return (
+        last_cost_sum,
+        last_earn_sum,
+        last_earnper,
+        last_cost_difmax_sum,
+        last_earn_difmax_sum,
+        last_dif_earnper,
+        last_cost_median,
+        last_cost_mean,
+        # last_earncount_per,
+        last_trans_amount,
+        last_mine_noadd_fir_earnper , 
+        last_mine_noadd_fir_earnper_dropmax ,
+        last_mine_noadd_fir_earnper_droptwomax
+    )
+
+def analysis_lastdays_earn_kuisun_counts(df ,now_unix_time,intervaldays ):
+    if len(df) == 0:
+        return 0, 0, 0, 0, 0, 0, 0 ,0,0,0,0,0,0
+    # need consider df may null if use iloc
+    lastdf = df[df["TokenFirstTime"] >=
+                now_unix_time - 3600*24*intervaldays]
+    # 去除那些earnper为-10的
+    lastdf = lastdf[lastdf['cost_main'] != 0]
+    # 去除 cost_main 过小的 <0.04  sol 理论上 同时fir_cost_main!=0
+    lastdf = lastdf[lastdf['cost_main'] >= 0.04] 
+    lastdf = lastdf[lastdf['fir_cost_main'] != 0]
+    # fir_noadd_earn_percent
+    # 去除 第一笔交易是sell
+    lastdf = lastdf[lastdf['fir_noadd_earn_percent'] !=-10]
+    lastdf = lastdf[lastdf['issellfir'] ==0]
+    lastdf = lastdf.reset_index(drop=True)
+    if len(lastdf) == 0:
+        return 0, 0, 0, 0, 0, 0, 0 ,0,0,0,0,0,0
+    
+
+    last_bigbig_earn_counts = len( lastdf[lastdf['fir_noadd_earn_percent']>=1])
+    last_big_earn_counts = len( lastdf[(lastdf['fir_noadd_earn_percent']>=0.5 )& (lastdf['fir_noadd_earn_percent']<1 ) ])
+    last_nor_earn_counts = len( lastdf[(lastdf['fir_noadd_earn_percent']>=0.05 )& (lastdf['fir_noadd_earn_percent']<0.5 ) ])
+
+    last_nor_kuisun_counts = len( lastdf[(lastdf['fir_noadd_earn_percent']>=-0.2 )& (lastdf['fir_noadd_earn_percent']<0.05 ) ])
+    last_big_kuisun_counts = len( lastdf[(lastdf['fir_noadd_earn_percent']>=-0.5 )& (lastdf['fir_noadd_earn_percent']<-0.2 ) ])
+    last_bigbig_kuisun_counts = len( lastdf[ (lastdf['fir_noadd_earn_percent']<-0.5 ) ])
+
+    last_total_counts = len( lastdf)
+    last_bigbig_earn_per = last_bigbig_earn_counts /last_total_counts  if last_total_counts!=0 else -10
+    last_big_earn_per = last_big_earn_counts / last_total_counts  if last_total_counts!=0 else -10
+    last_nor_earn_per = last_nor_earn_counts / last_total_counts if last_total_counts!=0 else -10
+    last_nor_kuisun_per = last_nor_kuisun_counts /last_total_counts  if last_total_counts!=0 else -10
+    last_big_kuisun_per= last_big_kuisun_counts / last_total_counts  if last_total_counts!=0 else -10
+    last_bigbig_kuisun_per = last_bigbig_kuisun_counts / last_total_counts if last_total_counts!=0 else -10
+
+    return (
+        last_bigbig_earn_counts,
+        last_big_earn_counts,
+        last_nor_earn_counts,
+        last_nor_kuisun_counts,
+        last_big_kuisun_counts,
+        last_bigbig_kuisun_counts,
+        last_total_counts,
+        last_bigbig_earn_per ,
+        last_big_earn_per ,
+        last_nor_earn_per ,
+        last_nor_kuisun_per ,
+        last_big_kuisun_per,
+        last_bigbig_kuisun_per ,
+    ) 
+
+
+
+    
+    return
+def get_analyres(df,  dalao_address, now_unix_time):
+    (last_03d_cost, last_03d_earn, last_03d_earnper, last_03d_difcost, last_03d_difearn, last_03d_difper, last_03d_costmedian, last_03d_costmean,    last_03d_trans , last_03d_mine_fir_earnper ,last_03d_mine_fir_earnper_dropmax, last_03d_mine_fir_earnper_droptwomax   ) = analysis_lastdays(
+        df, now_unix_time=now_unix_time, intervaldays=3
+    )
+    (last_07d_cost, last_07d_earn, last_07d_earnper, last_07d_difcost, last_07d_difearn, last_07d_difper, last_07d_costmedian, last_07d_costmean,   last_07d_trans , last_07d_mine_fir_earnper ,last_07d_mine_fir_earnper_dropmax, last_07d_mine_fir_earnper_droptwomax  ) = analysis_lastdays(
+        df, now_unix_time=now_unix_time, intervaldays=7
+    )
+    # (last_11d_cost, last_11d_earn, last_11d_earnper, last_11d_difcost, last_11d_difearn, last_11d_difper, last_11d_costmedian, last_11d_costmean,  last_11d_trans , last_11d_mine_fir_earnper ,last_11d_mine_fir_earnper_dropmax , last_11d_mine_fir_earnper_droptwomax ) = analysis_lastdays(
+    #     df, now_unix_time=now_unix_time, intervaldays=11
+    # )
+    (last_15d_cost, last_15d_earn, last_15d_earnper, last_15d_difcost, last_15d_difearn, last_15d_difper, last_15d_costmedian, last_15d_costmean,   last_15d_trans , last_15d_mine_fir_earnper ,last_15d_mine_fir_earnper_dropmax , last_15d_mine_fir_earnper_droptwomax ) = analysis_lastdays(
+        df, now_unix_time=now_unix_time, intervaldays=15
+    )
+    (last_30d_cost, last_30d_earn, last_30d_earnper, last_30d_difcost, last_30d_difearn, last_30d_difper, last_30d_costmedian, last_30d_costmean,  last_30d_trans , last_30d_mine_fir_earnper ,last_30d_mine_fir_earnper_dropmax , last_30d_mine_fir_earnper_droptwomax ) = analysis_lastdays(
+        df, now_unix_time=now_unix_time, intervaldays=30
+    )
+	
+    # # 去除所有daxin
+    # df = df[df["isdaxin"] == "0"].reset_index(drop=True)
+
+    (last_03d_cost_noaddouttoken, last_03d_earn_noaddouttoken, last_03d_earnper_noaddouttoken, last_03d_difcost_noaddouttoken, last_03d_difearn_noaddouttoken, last_03d_difper_noaddouttoken, last_03d_costmedian_noaddouttoken, last_03d_costmean_noaddouttoken,   last_03d_trans ,
+     last_03d_mine_noadd_fir_earnper , last_03d_mine_noadd_fir_earnper_dropmax , last_03d_mine_noadd_fir_earnper_droptwomax ) = analysis_lastdays_noaddouttoken(
+        df, now_unix_time=now_unix_time, intervaldays=3
+    )
+    (last_07d_cost_noaddouttoken, last_07d_earn_noaddouttoken, last_07d_earnper_noaddouttoken, last_07d_difcost_noaddouttoken, last_07d_difearn_noaddouttoken, last_07d_difper_noaddouttoken, last_07d_costmedian_noaddouttoken, last_07d_costmean_noaddouttoken,   last_07d_trans,
+     last_07d_mine_noadd_fir_earnper , last_07d_mine_noadd_fir_earnper_dropmax , last_07d_mine_noadd_fir_earnper_droptwomax) = analysis_lastdays_noaddouttoken(
+        df, now_unix_time=now_unix_time, intervaldays=7
+    )
+    # (last_11d_cost_noaddouttoken, last_11d_earn_noaddouttoken, last_11d_earnper_noaddouttoken, last_11d_difcost_noaddouttoken, last_11d_difearn_noaddouttoken, last_11d_difper_noaddouttoken, last_11d_costmedian_noaddouttoken, last_11d_costmean_noaddouttoken,    last_11d_trans,
+    #  last_11d_mine_noadd_fir_earnper , last_11d_mine_noadd_fir_earnper_dropmax , last_11d_mine_noadd_fir_earnper_droptwomax) = analysis_lastdays_noaddouttoken(
+    #     df, now_unix_time=now_unix_time, intervaldays=11
+    # )
+    (last_15d_cost_noaddouttoken, last_15d_earn_noaddouttoken, last_15d_earnper_noaddouttoken, last_15d_difcost_noaddouttoken, last_15d_difearn_noaddouttoken, last_15d_difper_noaddouttoken, last_15d_costmedian_noaddouttoken, last_15d_costmean_noaddouttoken,   last_15d_trans,
+     last_15d_mine_noadd_fir_earnper , last_15d_mine_noadd_fir_earnper_dropmax , last_15d_mine_noadd_fir_earnper_droptwomax) = analysis_lastdays_noaddouttoken(
+        df, now_unix_time=now_unix_time, intervaldays=15
+    )
+
+    (last_30d_cost_noaddouttoken, last_30d_earn_noaddouttoken, last_30d_earnper_noaddouttoken, last_30d_difcost_noaddouttoken, last_30d_difearn_noaddouttoken, last_30d_difper_noaddouttoken, last_30d_costmedian_noaddouttoken, last_30d_costmean_noaddouttoken,    last_30d_trans,
+     last_30d_mine_noadd_fir_earnper , last_30d_mine_noadd_fir_earnper_dropmax , last_30d_mine_noadd_fir_earnper_droptwomax) = analysis_lastdays_noaddouttoken(
+        df, now_unix_time=now_unix_time, intervaldays=30
+    )
+    (last_03d_bigbig_earn_counts, last_03d_big_earn_counts, last_03d_nor_earn_counts, last_03d_nor_kuisun_counts,last_03d_big_kuisun_counts,last_03d_bigbig_kuisun_counts ,last_03d_total_counts, 
+    last_03d_bigbig_earn_per , last_03d_big_earn_per ,    last_03d_nor_earn_per ,    last_03d_nor_kuisun_per ,    last_03d_big_kuisun_per,    last_03d_bigbig_kuisun_per
+      )  = analysis_lastdays_earn_kuisun_counts(
+        df, now_unix_time=now_unix_time, intervaldays=3
+    )
+    (last_07d_bigbig_earn_counts, last_07d_big_earn_counts, last_07d_nor_earn_counts, last_07d_nor_kuisun_counts,last_07d_big_kuisun_counts,last_07d_bigbig_kuisun_counts ,last_07d_total_counts,
+      last_07d_bigbig_earn_per , last_07d_big_earn_per , last_07d_nor_earn_per , last_07d_nor_kuisun_per , last_07d_big_kuisun_per, last_07d_bigbig_kuisun_per
+    )  = analysis_lastdays_earn_kuisun_counts(
+        df, now_unix_time=now_unix_time, intervaldays=7
+    )
+    # (last_11d_bigbig_earn_counts, last_11d_big_earn_counts, last_11d_nor_earn_counts, last_11d_nor_kuisun_counts,last_11d_big_kuisun_counts,last_11d_bigbig_kuisun_counts ,last_11d_total_counts,
+    #  last_11d_bigbig_earn_per , last_11d_big_earn_per , last_11d_nor_earn_per , last_11d_nor_kuisun_per , last_11d_big_kuisun_per, last_11d_bigbig_kuisun_per
+    #     ) = analysis_lastdays_earn_kuisun_counts(
+    #     df, now_unix_time=now_unix_time, intervaldays=11
+    # )
+    (last_15d_bigbig_earn_counts, last_15d_big_earn_counts, last_15d_nor_earn_counts, last_15d_nor_kuisun_counts,last_15d_big_kuisun_counts,last_15d_bigbig_kuisun_counts ,last_15d_total_counts,
+     last_15d_bigbig_earn_per ,  last_15d_big_earn_per , last_15d_nor_earn_per , last_15d_nor_kuisun_per , last_15d_big_kuisun_per, last_15d_bigbig_kuisun_per
+        ) = analysis_lastdays_earn_kuisun_counts(
+        df, now_unix_time=now_unix_time, intervaldays=15
+    )
+
+    (last_30d_bigbig_earn_counts, last_30d_big_earn_counts, last_30d_nor_earn_counts, last_30d_nor_kuisun_counts,last_30d_big_kuisun_counts,last_30d_bigbig_kuisun_counts ,last_30d_total_counts,
+     last_30d_bigbig_earn_per , last_30d_big_earn_per , last_30d_nor_earn_per , last_30d_nor_kuisun_per , last_30d_big_kuisun_per, last_30d_bigbig_kuisun_per
+        ) = analysis_lastdays_earn_kuisun_counts(
+        df, now_unix_time=now_unix_time, intervaldays=30
+    )
+    dalao_rul =  f"https://solscan.io/account/{dalao_address}"
+    
+    analist = [
+        dalao_address,
+        dalao_rul,
+        "",
+        last_03d_cost,
+        last_03d_earn,
+        last_03d_earnper,
+        last_03d_difcost,
+        last_03d_difearn,
+        last_03d_difper,
+        last_03d_costmedian,
+        last_03d_costmean,
+
+        last_03d_cost_noaddouttoken,
+        last_03d_earn_noaddouttoken,
+        last_03d_earnper_noaddouttoken,
+        # last_03d_difcost_noaddouttoken,
+        # last_03d_difearn_noaddouttoken,
+        # last_03d_difper_noaddouttoken,
+        # last_03d_costmedian_noaddouttoken,
+        # last_03d_costmean_noaddouttoken,
+        last_03d_mine_fir_earnper,
+        last_03d_mine_fir_earnper_dropmax,
+        last_03d_mine_fir_earnper_droptwomax,
+        last_03d_mine_noadd_fir_earnper ,
+        last_03d_mine_noadd_fir_earnper_dropmax ,
+        last_03d_mine_noadd_fir_earnper_droptwomax,
+        last_03d_trans,
+
+        last_07d_cost,
+        last_07d_earn,
+        last_07d_earnper,
+        last_07d_difcost,
+        last_07d_difearn,
+        last_07d_difper,
+        last_07d_costmedian,
+        last_07d_costmean,
+
+        last_07d_cost_noaddouttoken,
+        last_07d_earn_noaddouttoken,
+        last_07d_earnper_noaddouttoken,
+        # last_07d_difcost_noaddouttoken,
+        # last_07d_difearn_noaddouttoken,
+        # last_07d_difper_noaddouttoken,
+        # last_07d_costmedian_noaddouttoken,
+        # last_07d_costmean_noaddouttoken,
+        last_07d_mine_fir_earnper,
+        last_07d_mine_fir_earnper_dropmax,
+        last_07d_mine_fir_earnper_droptwomax,
+        last_07d_mine_noadd_fir_earnper ,
+        last_07d_mine_noadd_fir_earnper_dropmax ,
+        last_07d_mine_noadd_fir_earnper_droptwomax,
+        last_07d_trans,
+
+        # last_11d_cost,
+        # last_11d_earn,
+        # last_11d_earnper,
+        # last_11d_difcost,
+        # last_11d_difearn,
+        # last_11d_difper,
+        # last_11d_costmedian,
+        # last_11d_costmean,
+
+        # last_11d_cost_noaddouttoken,
+        # last_11d_earn_noaddouttoken,
+        # last_11d_earnper_noaddouttoken,
+        # # last_11d_difcost_noaddouttoken,
+        # # last_11d_difearn_noaddouttoken,
+        # # last_11d_difper_noaddouttoken,
+        # # last_11d_costmedian_noaddouttoken,
+        # # last_11d_costmean_noaddouttoken,
+        # last_11d_mine_fir_earnper,
+        # last_11d_mine_fir_earnper_dropmax,
+        # last_11d_mine_fir_earnper_droptwomax,
+        # last_11d_mine_noadd_fir_earnper , 
+        # last_11d_mine_noadd_fir_earnper_dropmax , 
+        # last_11d_mine_noadd_fir_earnper_droptwomax ,
+        # last_11d_trans,
+
+
+        last_15d_cost,
+        last_15d_earn,
+        last_15d_earnper,
+        last_15d_difcost,
+        last_15d_difearn,
+        last_15d_difper,
+        last_15d_costmedian,
+        last_15d_costmean,
+
+        last_15d_cost_noaddouttoken,
+        last_15d_earn_noaddouttoken,
+        last_15d_earnper_noaddouttoken,
+        # last_15d_difcost_noaddouttoken,
+        # last_15d_difearn_noaddouttoken,
+        # last_15d_difper_noaddouttoken,
+        # last_15d_costmedian_noaddouttoken,
+        # last_15d_costmean_noaddouttoken,
+        last_15d_mine_fir_earnper,
+        last_15d_mine_fir_earnper_dropmax,
+        last_15d_mine_fir_earnper_droptwomax,
+        last_15d_mine_noadd_fir_earnper , 
+        last_15d_mine_noadd_fir_earnper_dropmax , 
+        last_15d_mine_noadd_fir_earnper_droptwomax,
+        last_15d_trans,
+
+        last_30d_cost,
+        last_30d_earn,
+        last_30d_earnper,
+        last_30d_difcost,
+        last_30d_difearn,
+        last_30d_difper,
+        last_30d_costmedian,
+        last_30d_costmean,
+
+        last_30d_cost_noaddouttoken,
+        last_30d_earn_noaddouttoken,
+        last_30d_earnper_noaddouttoken,
+        # last_30d_difcost_noaddouttoken,
+        # last_30d_difearn_noaddouttoken,
+        # last_30d_difper_noaddouttoken,
+        # last_30d_costmedian_noaddouttoken,
+        # last_30d_costmean_noaddouttoken,
+        last_30d_mine_fir_earnper,
+        last_30d_mine_fir_earnper_dropmax,
+        last_30d_mine_fir_earnper_droptwomax,
+        last_30d_mine_noadd_fir_earnper , 
+        last_30d_mine_noadd_fir_earnper_dropmax , 
+        last_30d_mine_noadd_fir_earnper_droptwomax ,
+        last_30d_trans,
+
+
+        last_30d_earn-last_30d_earn_noaddouttoken,
+        last_30d_mine_fir_earnper - last_30d_mine_noadd_fir_earnper,
+    ]
+
+    arr_earn_kuisun_counts=[
+     dalao_address,
+    dalao_rul,
+    "",
+    last_03d_bigbig_earn_counts, last_03d_big_earn_counts, last_03d_nor_earn_counts,
+    last_03d_nor_kuisun_counts,last_03d_big_kuisun_counts,last_03d_bigbig_kuisun_counts ,
+    last_03d_bigbig_earn_per,  last_03d_big_earn_per ,    last_03d_nor_earn_per ,    
+    last_03d_nor_kuisun_per ,    last_03d_big_kuisun_per,    last_03d_bigbig_kuisun_per,
+    last_03d_total_counts ,  
+
+    last_07d_bigbig_earn_counts, last_07d_big_earn_counts, last_07d_nor_earn_counts, 
+    last_07d_nor_kuisun_counts,last_07d_big_kuisun_counts,last_07d_bigbig_kuisun_counts ,
+    last_07d_bigbig_earn_per , last_07d_big_earn_per , last_07d_nor_earn_per ,
+    last_07d_nor_kuisun_per , last_07d_big_kuisun_per, last_07d_bigbig_kuisun_per,
+    last_07d_total_counts  , 
+
+    # last_11d_bigbig_earn_counts, last_11d_big_earn_counts, last_11d_nor_earn_counts,
+    # last_11d_nor_kuisun_counts,last_11d_big_kuisun_counts,last_11d_bigbig_kuisun_counts ,
+    # last_11d_bigbig_earn_per , last_11d_big_earn_per , last_11d_nor_earn_per ,
+    # last_11d_nor_kuisun_per , last_11d_big_kuisun_per, last_11d_bigbig_kuisun_per,
+	 
+    # last_11d_total_counts   ,
+
+    last_15d_bigbig_earn_counts, last_15d_big_earn_counts, last_15d_nor_earn_counts,
+    last_15d_nor_kuisun_counts,last_15d_big_kuisun_counts,last_15d_bigbig_kuisun_counts ,
+    last_15d_bigbig_earn_per ,  last_15d_big_earn_per , last_15d_nor_earn_per , 
+    last_15d_nor_kuisun_per , last_15d_big_kuisun_per, last_15d_bigbig_kuisun_per,
+    last_15d_total_counts  ,
+
+    
+    last_30d_bigbig_earn_counts, last_30d_big_earn_counts, last_30d_nor_earn_counts,
+    last_30d_nor_kuisun_counts,last_30d_big_kuisun_counts,last_30d_bigbig_kuisun_counts ,
+    last_30d_bigbig_earn_per , last_30d_big_earn_per , last_30d_nor_earn_per ,
+    last_30d_nor_kuisun_per , last_30d_big_kuisun_per, last_30d_bigbig_kuisun_per,
+	 
+    last_30d_total_counts   ,
+
+    ]
+
+
+
+    global TotalAnalysis_list
+    global total_arr_earn_kuisun
+    TotalAnalysis_list.append(analist)
+    total_arr_earn_kuisun.append(arr_earn_kuisun_counts)
+
+
+def calute_days(df, now_unix_time):
+    df["diffdays"] = 0
+    # intervaldays_list = [15, 11, 7, 3]
+    intervaldays_list = [30, 15, 7, 3]
+    for intervaldays in intervaldays_list:
+        df.loc[df["TokenFirstTime"] >=
+               now_unix_time - 3600*24*intervaldays, "diffdays"] = intervaldays
+    return df
+
+
+def calucate_earnmain_dropoutoken(row):
+    earnmain_amount_dropoutoken = decimal.Decimal(row['earn_main'])
+    outtoken_per = decimal.Decimal(row["outtoken_per"])
+    issellfir = row["issellfir"]
+
+    # if outtoken_per >= 1.1 or outtoken_per == -10 
+    if outtoken_per > 1 or issellfir==0:
+        earnmain_amount_dropoutoken = decimal.Decimal(0)
+    earnmain_amount_dropoutoken_str = '{0:.4f}'.format(
+        earnmain_amount_dropoutoken)
+    return float(earnmain_amount_dropoutoken_str)
+
+
+def makeDexurl(row, dalao_address):
+    tokenAddress = row['swap_tokenaddress']
+    urlname = f"https://dexscreener.com/solana/{tokenAddress}?maker={dalao_address}"
+    return '=HYPERLINK("{}","{}")'.format(urlname, "DEX/"+tokenAddress)
+
+
+def get_ana_df(dalao_address, df, success_address_list, onetxhash_onerow_ana_df):
+    onedalao_ana_df = df[onedalao_ana_columns].drop_duplicates(
+    ).reset_index(drop=True)
+    onedalao_ana_df.insert(
+        loc=2, column="swap_tokenadd_dexurl", value="")
+
+    onedalao_ana_df['swap_tokenadd_dexurl'] = onedalao_ana_df.apply(
+        lambda row: makeDexurl(row, dalao_address), axis=1)
+    onedalao_ana_df["FirstDateTime"] = pd.to_datetime(
+        onedalao_ana_df['TokenFirstTime'], unit='s')
+    # 如果outoken超了,earn_main_noaddouttoken 的值有两种处理方式
+    # 一种设置为0 即为不亏不赚
+    # 一种为全负  即为全亏了
+    # onedalao_ana_df["earn_main_noaddouttoken"] = onedalao_ana_df.apply(
+    #     lambda row: calucate_earnmain_dropoutoken(row), axis=1)
+
+    get_analyres(df=onedalao_ana_df, dalao_address=dalao_address,
+                 now_unix_time=now_unix_time)
+
+    onedalao_ana_df = calute_days(
+        df=onedalao_ana_df, now_unix_time=now_unix_time)
+
+    handle_onedalao_ana_df = onedalao_ana_df[onedalao_ana_df['cost_main'] != 0].reset_index(
+        drop=True)
+
+    baseclass.makedirpath(baseclass.dalao_ana_fm_path / dalao_address)
+
+    onedalao_ana_df.to_csv(baseclass.dalao_ana_fm_path /
+                           dalao_address/f"analysisprofit_{dalao_address}.csv", index=False)
+    handle_onedalao_ana_df.to_csv(baseclass.dalao_ana_fm_path /
+                                  dalao_address/f"analysisprofit_handle_{dalao_address}.csv", index=False)
+    onetxhash_onerow_ana_df.to_csv(baseclass.dalao_ana_fm_path /
+                                   dalao_address/f"onetxhash_onerow_profit_{dalao_address}.csv", index=False)
+
+    success_address_list.remove(dalao_address)
+
+
+def get_profit_st(str_dalao_address):
+
+    if not (baseclass.dalao_configtoken_st_solanafm_path /
+            f"configtoken_{str_dalao_address}.csv").exists():
+        return None
+    # print(f"enter get_profit_st dalao_address= {str_dalao_address} \n", end='')
+    df = pd.read_csv(baseclass.dalao_configtoken_st_solanafm_path /
+                     f"configtoken_{str_dalao_address}.csv", dtype=object)
+    #  timestamp	sign	source	destination	token	amount	swap_tokenadd	swap_eth_amount	swap_token_amount	token_idx  dalaofirsttimestamp
+    df["timestamp"] = df["timestamp"].astype(int)
+    df['dalaofirsttimestamp'] = pd.to_datetime(
+        df['dalaofirsttimestamp'] )
+    df["dexurl"] = df.apply(lambda ser: (f'https://dexscreener.com/solana/{ser["swap_tokenaddress"]}?maker={str_dalao_address}' ), axis=1)
+    df["TokenFirstTime"] = df.groupby("token_idx")[
+        "timestamp"].transform("min")
+    df = calute_days(
+        df=df, now_unix_time=now_unix_time)
+    df = df.sort_values(by=["dalaofirsttimestamp", 'swap_tokenaddress', 'timestamp'], ascending=[
+        False, True, True]).reset_index(drop=True)
+    onetxhash_onerow_ana_df = df.copy()
+    onetxhash_onerow_ana_df = onetxhash_onerow_ana_df[["timestamp", "TokenFirstTime", 
+                                                       "sign", "swap_tokenaddress","dexurl","platform","swap_type",
+                                                       "swap_eth_amount", "swap_token_amount",
+                                                       "dalaofirsttimestamp","diffdays"]]
+
+    onetxhash_onerow_ana_df = onetxhash_onerow_ana_df.astype(
+        {'swap_eth_amount': float})
+    # 计算一个txhash的 tokenamount swap 数目
+    onetxhash_onerow_ana_df = get_txhash_tokenswap_amount(
+        df=onetxhash_onerow_ana_df)
+    # 计算一个txhash的sol swap 数目
+    earnMain_df = (
+        onetxhash_onerow_ana_df
+        .groupby('sign')["swap_eth_amount"]
+        .sum()
+    )
+    onetxhash_onerow_ana_df['swap_eth_amount'] = onetxhash_onerow_ana_df["sign"].map(
+        earnMain_df)
+
+    onetxhash_onerow_ana_df = onetxhash_onerow_ana_df.drop_duplicates().reset_index(drop=True)
+    onetxhash_onerow_ana_df = get_tokenswap_amount(df=onetxhash_onerow_ana_df)
+    onetxhash_onerow_ana_df = onetxhash_onerow_ana_df.sort_values(by=["dalaofirsttimestamp", 'swap_tokenaddress', 'timestamp'], ascending=[
+        False, True, True]).reset_index(drop=True)
+    onetxhash_onerow_ana_df = get_sol_profit(df=onetxhash_onerow_ana_df)
+
+    onetxhash_onerow_ana_df["datetime"] = pd.to_datetime(
+        onetxhash_onerow_ana_df["timestamp"], unit='s')
+
+    onetxhash_onerow_ana_df=onetxhash_onerow_ana_df[onetxhash_onerow_ana_cols]
+    onetxhash_onerow_ana_df.to_csv(
+        baseclass.dalao_profit_st_fm_path / f"onetxhash_onerow_profit_{str_dalao_address}.csv", index=False)
+    # onetxhash_onerow_ana_df=pd.DataFrame()
+    def set_platform(gdf):
+        if  "unknown" in  gdf["platform"]:
+            gdf["platform"] =  "unknown" 
+            print("unknow in plat")
+        return gdf
+    
+    onetxhash_onerow_ana_df.groupby(by=["swap_tokenaddress"]).apply(lambda gdf : set_platform(gdf))                                                                  
+
+    onetxhash_onerow_ana_dropdup_df = onetxhash_onerow_ana_df.drop_duplicates(subset=["swap_tokenaddress"]).reset_index(drop=True)
+ 
+    onetxhash_onerow_ana_dropdup_df.to_csv(
+        baseclass.dalao_profit_st_fm_path / f"onetxhash_onerow_profit_dropdup_{str_dalao_address}.csv", index=False)
+    
+    return onetxhash_onerow_ana_df
+
+
+def get_dalaoaddress_list():
+    df = pd.read_csv(baseclass.dalao_merge_path /
+                     "filter_dalao.csv", dtype=object)
+    arr_dalao_address = df["dalaoAddress"].tolist()
+    return arr_dalao_address
+
+
+def save_earn_kuisun_df():
+     
+    global total_arr_earn_kuisun
+    totalana_earn_kuisun_df = pd.DataFrame(
+        data=total_arr_earn_kuisun, columns=earn_kuisun_columns
+    )
+    totalana_earn_kuisun_df = totalana_earn_kuisun_df.round(4)
+    totalana_earn_kuisun_df = totalana_earn_kuisun_df.sort_values(by=["add"], ascending=[
+        True]).reset_index(drop=True)
+    totalana_earn_kuisun_df.to_excel(
+        baseclass.dalao_total_ana_fm_path/f"totalana_earn_kuisun_df.xlsx", index=False)
+    
+    return
+def save_total_ana_df():
+    global TotalAnalysis_list
+    TotalAnalysis_df = pd.DataFrame(
+        data=TotalAnalysis_list, columns=TotalAnalysis_columns
+    )
+
+    TotalAnalysis_df = TotalAnalysis_df.round(4)
+    TotalAnalysis_df = TotalAnalysis_df.sort_values(by=["add"], ascending=[
+        True]).reset_index(drop=True)
+ 
+    TotalAnalysis_df.to_csv(
+        baseclass.dalao_total_ana_fm_path/f"totalana.csv", index=False)
+
+    TotalAnalysis_df.to_excel(
+        baseclass.dalao_total_ana_fm_path/f"totalana.xlsx", index=False)
+
+    # mine_fir_earnper_filter_mask = (
+    #     (TotalAnalysis_df["15d_mine_fir_earnper"] >=
+    #      0.8*TotalAnalysis_df["11d_mine_fir_earnper"])
+    #     & (TotalAnalysis_df["11d_mine_fir_earnper"] >= 0.8*TotalAnalysis_df["07d_mine_fir_earnper"])
+    # )
+    # mine_fir_earnper_dropmax_filter_mask = (
+    #     (TotalAnalysis_df["15d_mine_fir_earnper_dropmax"] >=
+    #      0.8*TotalAnalysis_df["11d_mine_fir_earnper_dropmax"])
+    #     & (TotalAnalysis_df["11d_mine_fir_earnper_dropmax"] >= 0.8*TotalAnalysis_df["07d_mine_fir_earnper_dropmax"])
+    # )
+    
+    mine_noadd_fir_earnper_filter_mask = (
+        (TotalAnalysis_df["30d_mine_noadd_fir_earnper"] >=
+         0.8*TotalAnalysis_df["15d_mine_noadd_fir_earnper"])
+        & (TotalAnalysis_df["15d_mine_noadd_fir_earnper"] >= 0.8*TotalAnalysis_df["07d_mine_noadd_fir_earnper"])
+    )
+   
+    mine_noadd_fir_earnper_dropmax_filter_mask = (
+        (TotalAnalysis_df["30d_mine_noadd_fir_earnper_dropmax"] >=
+         0.8*TotalAnalysis_df["15d_mine_noadd_fir_earnper_dropmax"])
+        & (TotalAnalysis_df["15d_mine_noadd_fir_earnper_dropmax"] >= 0.8*TotalAnalysis_df["07d_mine_noadd_fir_earnper_dropmax"])
+    )
+
+    filter_mask = (
+
+        # mine_fir_earnper_filter_mask
+        # | mine_fir_earnper_dropmax_filter_mask
+          mine_noadd_fir_earnper_filter_mask
+        | mine_noadd_fir_earnper_dropmax_filter_mask
+    )
+    increase_TotalAnalysis_df = TotalAnalysis_df[filter_mask].reset_index(
+        drop=True)
+    increase_TotalAnalysis_df.to_excel(
+        baseclass.dalao_total_ana_fm_path/f"increase_totalana.xlsx", index=False)
+    # last_07d_has_mask = (increase_TotalAnalysis_df["07d_trans"]== increase_TotalAnalysis_df["11d_trans"])
+    # last_07d_increase_TotalAnalysis_df = increase_TotalAnalysis_df[last_07d_has_mask]
+    increase_TotalAnalysis_df.to_excel(
+        baseclass.dalao_total_ana_fm_path/f"increase_totalana_07d.xlsx", index=False)
+
+def get_mul_profit_st():
+    global arr_str_dalaoaddress
+    success_address_list = arr_str_dalaoaddress.copy()
+    for idx in range(0, len(arr_str_dalaoaddress), batchSize):
+        thread_list = []
+        for cur_idx in range(idx, min(idx+batchSize, len(arr_str_dalaoaddress))):
+            thread = threading.Thread(
+                target=get_one_profit_st,
+                args=(arr_str_dalaoaddress[cur_idx],
+                      success_address_list, cur_idx)
+            )
+            thread_list.append(thread)
+        for thread in thread_list:
+            thread.start()
+        for thread in thread_list:
+            thread.join()
+
+
+def get_one_profit_st(dalao_address, success_address_list, cur_idx):
+    try:
+        df = None
+        onetxhash_onerow_ana_df = None
+        print(f"get_one_profit_st cur_idx={cur_idx} dalao_address={dalao_address}\n", end='')
+
+        onetxhash_onerow_ana_df = get_profit_st(
+            str_dalao_address=dalao_address)
+        if onetxhash_onerow_ana_df is None:
+            print(f"get_one_profit_st cur_idx={cur_idx} is None \n", end='')
+            return
+        get_ana_df(dalao_address=dalao_address, df=onetxhash_onerow_ana_df,
+                success_address_list=success_address_list, onetxhash_onerow_ana_df=onetxhash_onerow_ana_df)
+        print(f"cur_idx={cur_idx} end \n", end='')
+        return
+    except Exception as e:
+        print(f"error_dalao_address={dalao_address}")
+        raise
+
+batchSize = 5
+TotalAnalysis_list = []
+total_arr_earn_kuisun =[]
+now_unix_time = int(time.time())
+arr_str_dalaoaddress = get_dalaoaddress_list()
+arr_str_dalaoaddress = arr_str_dalaoaddress[0:450]
+arr_str_dalaoaddress.append(baseclass.mywalletaddress)
+# arr_str_dalaoaddress = ['H5P5xig8WjcDQrzyR4HaKcrg4hd2vh5DLPnFs4ypNE1X']
+print(f"arr_str_dalaoaddress len= {len(arr_str_dalaoaddress)}")
+get_mul_profit_st()
+save_total_ana_df()
+save_earn_kuisun_df()
+print(f"arr_str_dalaoaddress len= {len(arr_str_dalaoaddress)} \n", end='')
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 114 - 0
src/code/009_handle_analysis_solanafm.py

@@ -0,0 +1,114 @@
+
+from base_class import *
+from base_class import BaseVariableFunction
+from openpyxl.utils import get_column_letter, column_index_from_string
+from openpyxl.styles import PatternFill
+import openpyxl
+import shutil
+
+
+# # openpyxl填充色说明
+# # 调用openpyxl中PatternFill
+# # 纯色填充使用solid
+
+
+baseclass = BaseVariableFunction(__file__)
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+
+def analysisprofit_handle_sum(read_excel_pathname):
+    wb = openpyxl.load_workbook(read_excel_pathname)
+    ws = wb.active
+    col_range = ws.max_column
+    row_range = ws.max_row
+    for col_idx in range(1, col_range+1):
+     # 设置列宽
+        if col_idx == 1:
+            ws.column_dimensions[get_column_letter(col_idx)].width = 11
+    wb.save(read_excel_pathname)
+
+
+def modify_excel_style(read_excel_pathname):
+    # 使用openpyxl读取xlsx文件,创建workbook
+    wb = openpyxl.load_workbook(read_excel_pathname)
+    ws = wb.active
+    col_range = ws.max_column
+    row_range = ws.max_row
+    for col_idx in range(1, col_range+1):
+     # 设置列宽
+        ws.column_dimensions[get_column_letter(col_idx)].width = 5
+        col_header = ws.cell(row=1, column=col_idx).value
+        col_header_list = col_header.split("_")
+        if col_header_list[0] not in ["03d", "07d", "11d", "15d"]:
+            continue
+        col_header_list.pop(0)
+        coltype = "_".join(col_header_list)
+        match coltype:
+            # case "earnper":
+            #     fill = PatternFill('darkDown', fgColor='80C530')
+            #     for row_idx in range(1, row_range+1):
+            #         ws.cell(row=row_idx, column=col_idx).fill = fill
+            # case "difper":
+            #     fill = PatternFill('darkDown', fgColor='00B050')
+            #     for row_idx in range(1, row_range+1):
+            #         ws.cell(row=row_idx, column=col_idx).fill = fill
+            # case "cost_noaddouttoken":
+            #     fill = PatternFill('solid', fgColor='FEB8B8')
+            #     for row_idx in range(1, row_range+1):
+            #         ws.cell(row=row_idx, column=col_idx).fill = fill
+            # case "earn_noaddouttoken":
+            #     fill = PatternFill('solid', fgColor='9FF3A0')
+            #     for row_idx in range(1, row_range+1):
+            #         ws.cell(row=row_idx, column=col_idx).fill = fill
+            # case "earnper_noaddouttoken":
+            #     fill = PatternFill('solid', fgColor='80C530')
+            #     for row_idx in range(1, row_range+1):
+            #         ws.cell(row=row_idx, column=col_idx).fill = fill
+            # case "difcost_noaddouttoken":
+            #     fill = PatternFill('solid', fgColor='FF0000')
+            #     for row_idx in range(1, row_range+1):
+            #         ws.cell(row=row_idx, column=col_idx).fill = fill
+            # case "difearn_noaddouttoken":
+            #     fill = PatternFill('solid', fgColor='C4D79B')
+            #     for row_idx in range(1, row_range+1):
+            #         ws.cell(row=row_idx, column=col_idx).fill = fill
+            # case "difper_noaddouttoken":
+            #     fill = PatternFill('solid', fgColor='00B050')
+            #     for row_idx in range(1, row_range+1):
+            #         ws.cell(row=row_idx, column=col_idx).fill = fill
+            case "mine_noadd_fir_earnper":
+                fill = PatternFill('solid', fgColor='00FF00')
+                for row_idx in range(1, row_range+1):
+                    ws.cell(row=row_idx, column=col_idx).fill = fill
+            case "mine_noadd_fir_earnper_dropmax":
+                fill = PatternFill('solid', fgColor='008000')
+                for row_idx in range(1, row_range+1):
+                    ws.cell(row=row_idx, column=col_idx).fill = fill
+            case "trans":
+                fill = PatternFill('solid', fgColor='FFFF00')
+                for row_idx in range(1, row_range+1):
+                    ws.cell(row=row_idx, column=col_idx).fill = fill
+    wb.save(read_excel_pathname)
+
+
+modify_excel_style(
+    read_excel_pathname=baseclass.dalao_total_ana_fm_path/f"totalana.xlsx")
+
+modify_excel_style(
+    read_excel_pathname=baseclass.dalao_total_ana_fm_path/f"increase_totalana.xlsx")
+
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+# =IF(BJ2-BS2<=0.01,0,BJ2-BS2)

+ 208 - 0
src/code/010_add_forselecteddalao_get_sametoken_dalao.py

@@ -0,0 +1,208 @@
+
+from base_class import *
+from base_class import BaseVariableFunction
+
+
+baseclass = BaseVariableFunction(__file__)
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+obj_dalao_2_profit_df = {
+
+}
+
+obj_dalao_2_arr_token = {
+
+}
+
+
+obj_token_2_arr_dalao = {
+
+}
+arr_total_str_tokenaddress = []
+
+obj_dalao_2_buycounts = {
+
+}
+
+
+def makescreenurl(urlname, urlparam):
+    urlname = urlname + urlparam
+    return '=HYPERLINK("{}","{}")'.format(urlname, urlname)
+
+
+df = pd.read_excel(baseclass.dalao_total_ana_fm_path /
+                   "anaing_dalao.xlsx", dtype=object)
+
+
+arr_str_dalaoaddress = df["add"].tolist()
+for str_dalaoaddress in arr_str_dalaoaddress:
+    if not (baseclass.dalao_ana_fm_path/str_dalaoaddress/f"onetxhash_onerow_profit_{str_dalaoaddress}.csv").exists():
+        continue
+    cur_df = pd.read_csv(baseclass.dalao_ana_fm_path / str_dalaoaddress /
+                         f"onetxhash_onerow_profit_{str_dalaoaddress}.csv", dtype=object)
+    cur_df = cur_df.astype({
+        'timestamp': int,
+        'buy_counts': int,
+        'sell_counts': int,
+        'swap_eth_amount': float,
+        'outtoken_per': float,
+        'cost_main': float,
+        'earn_main': float,
+        'earn_percent': float
+    })
+    cur_df = cur_df[cur_df["cost_main"] != 0].reset_index(drop=True)
+    obj_dalao_2_profit_df[str_dalaoaddress] = cur_df
+
+    obj_dalao_2_arr_token[str_dalaoaddress] = cur_df["swap_tokenaddress"].drop_duplicates(
+    ).tolist()
+    arr_total_str_tokenaddress.extend(cur_df["swap_tokenaddress"].tolist())
+
+
+arr_total_str_tokenaddress = list(set(arr_total_str_tokenaddress))
+print("arr_total_str_tokenaddress len=", len(arr_total_str_tokenaddress))
+
+for str_tokenaddress in arr_total_str_tokenaddress:
+    # print("enter ", str_tokenaddress)
+    obj_token_2_arr_dalao[str_tokenaddress] = []
+    for str_dalaoaddress in arr_str_dalaoaddress:
+        if str_tokenaddress in obj_dalao_2_arr_token[str_dalaoaddress]:
+            # dexurl = f"https://dexscreener.com/solana/{str_tokenaddress}?maker={str_dalaoaddress}"
+            obj_token_2_arr_dalao[str_tokenaddress].append(
+                str_dalaoaddress)
+
+# 获取 dalao持有的所有token 以及 token->持有该token的所有dalao 的df
+df = pd.DataFrame.from_dict(obj_token_2_arr_dalao, orient='index')
+
+
+df = df.reset_index(names=['add'], drop=False)
+df.insert(
+    loc=1, column="DexScreenURL", value="")
+
+df['DexScreenURL'] = df.apply(lambda ser: makescreenurl(
+    "https://dexscreener.com/solana/", f"{ser['add']}"), axis=1)
+
+
+df.to_excel(baseclass.dalao_total_ana_fm_path /
+            "anaed_token_2_dalao.xlsx", index=False)
+
+# 获得很多个dalao都持有的token->持有该token的多有dalao df
+repeat_token_df = df[~(df[1].isna())].reset_index(drop=True)
+
+repeat_token_df.to_excel(
+    baseclass.dalao_total_ana_fm_path/"repeat_token_df.xlsx", index=False)
+
+arr_str_dalaoaddress_repeat_token = arr_str_dalaoaddress
+new_arr_str_dalaoaddress_repeat_token = arr_str_dalaoaddress_repeat_token
+
+
+# 获取dalao列表中有两个共同购买的token new_arr_token
+
+for idx_df in repeat_token_df.index:
+    cur_row = repeat_token_df.loc[idx_df,]
+    cur_str_tokenaddress = cur_row['add']
+    # print(f"cur_str_tokenaddress= {cur_str_tokenaddress}")
+    dexscreenurl = cur_row['DexScreenURL']
+    arr_cur_row = cur_row.tolist()
+    arr_cur_row.remove(cur_str_tokenaddress)
+    arr_cur_row.remove(dexscreenurl)
+    arr_cur_row = set(arr_cur_row)
+    arr_cur_row.discard(None)
+    arr_cur_row = list(arr_cur_row)
+    if len(set(arr_cur_row) & set(new_arr_str_dalaoaddress_repeat_token)) >= 2:
+        new_arr_str_dalaoaddress_repeat_token.append(cur_str_tokenaddress)
+
+# 获取包含 new_arr_token 的df
+new_repeat_token_df = repeat_token_df[repeat_token_df["add"].isin(
+    new_arr_str_dalaoaddress_repeat_token)].reset_index(drop=True)
+
+
+new_repeat_token_df = new_repeat_token_df.sort_values(
+    by=['add'], ascending=[True]).reset_index(drop=True)
+
+new_repeat_token_df.to_excel(
+    baseclass.dalao_total_ana_fm_path/"new_repeat_token_df.xlsx", index=False)
+print(f"new_repeat_token_df len= {len(new_repeat_token_df)}")
+
+# 将拥dalao 关于此tokne的protfi汇总,保存为total_dalao_profit_df
+total_dalao_profit_df = None
+for idx_df in new_repeat_token_df.index:
+    cur_row = new_repeat_token_df.loc[idx_df,]
+    cur_str_tokenaddress = cur_row['add']
+    dexscreenurl = cur_row['DexScreenURL']
+    arr_cur_row = cur_row.tolist()
+    arr_cur_row.remove(cur_str_tokenaddress)
+    arr_cur_row.remove(dexscreenurl)
+    arr_cur_row = set(arr_cur_row)
+    arr_cur_row.discard(None)
+    arr_cur_row = list(arr_cur_row)
+    for str_dalaoaddress in arr_cur_row:
+        # obj_str_dalaoaddress_repeat_token_2_buytokennum[str_dalaoaddress][0] += 1
+        cur_dalao_df = obj_dalao_2_profit_df[str_dalaoaddress]
+        cur_dalao_gdf = cur_dalao_df[cur_dalao_df["swap_tokenaddress"]
+                                     == cur_str_tokenaddress].reset_index(drop=True)
+        cur_dalao_gdf['dalaoaddress'] = str_dalaoaddress
+        total_dalao_profit_df = pd.concat(
+            [total_dalao_profit_df, cur_dalao_gdf])
+
+
+def get_dalaofirsttimestamp(gdf):
+    gdf["dalaofirsttimestamp"] = gdf["datetime"].min()
+    return gdf
+
+
+total_dalao_profit_df['datetime'] = pd.to_datetime(
+    total_dalao_profit_df['timestamp'], unit='s')
+
+total_dalao_profit_df["dalaofirsttimestamp"] = None
+total_dalao_profit_df = total_dalao_profit_df.groupby(['swap_tokenaddress', 'dalaoaddress']).apply(
+    lambda gdf: get_dalaofirsttimestamp(gdf)).reset_index(drop=True)
+
+
+# total_dalao_profit_df.insert(
+#     loc=2, column="DexScreenURL", value="")
+
+
+total_dalao_profit_df['DexScreenURL'] = total_dalao_profit_df.apply(lambda ser: makescreenurl(
+    "https://dexscreener.com/solana/", f"{ser['swap_tokenaddress']}?maker={ser['dalaoaddress']}"), axis=1)
+
+
+total_dalao_profit_df = total_dalao_profit_df.sort_values(
+    by=["dalaofirsttimestamp", "swap_tokenaddress", "dalaoaddress", "datetime"], ascending=[True, True, True, True]).reset_index(drop=True)
+
+
+total_dalao_profit_df["idx_dalao"] = -1
+
+
+def get_dalaobuyidx(gdf):
+
+    cur_gdf = gdf[["dalaoaddress", "dalaofirsttimestamp"]].drop_duplicates(
+    ).sort_values(by=["dalaofirsttimestamp"], ascending=[True])
+    arr_str_dalaoaddress = cur_gdf["dalaoaddress"].tolist()
+    obj_dalaoaddress_2_idx = {}
+    for idx_str_dalaoaddress in range(0, len(arr_str_dalaoaddress)):
+        str_dalaoaddress = arr_str_dalaoaddress[idx_str_dalaoaddress]
+        obj_dalaoaddress_2_idx[str_dalaoaddress] = idx_str_dalaoaddress
+    gdf["idx_dalao"] = gdf["dalaoaddress"].map(obj_dalaoaddress_2_idx)
+    return gdf
+
+
+total_dalao_profit_df = total_dalao_profit_df.groupby(['swap_tokenaddress']).apply(
+    lambda gdf: get_dalaobuyidx(gdf)).reset_index(drop=True)
+
+
+total_dalao_profit_df.to_excel(
+    baseclass.dalao_total_ana_fm_path/"total_dalao_profit_df.xlsx", index=False)
+# 计算 所有 outtokenper小于=1 的 dalaoaddress的盈利  并且计算总盈利 和 去重第一次购买的总盈利
+
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 263 - 0
src/code/010_add_forselecteddalao_get_sametoken_dalao_dropsometoken.py

@@ -0,0 +1,263 @@
+
+from base_class import *
+from base_class import BaseVariableFunction
+
+
+baseclass = BaseVariableFunction(__file__)
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+def drop_special_token(df , arr_drop_token):
+    drop_mask = df["add"].isin(arr_drop_token)
+    df=df[~drop_mask].reset_index(drop=True)
+    return df
+obj_dalao_2_profit_df = {
+
+}
+
+obj_dalao_2_arr_token = {
+
+}
+
+
+obj_token_2_arr_dalao = {
+
+}
+arr_total_str_tokenaddress = []
+
+obj_dalao_2_buycounts = {
+
+}
+
+
+def makescreenurl(urlname, urlparam):
+    urlname = urlname + urlparam
+    return '=HYPERLINK("{}","{}")'.format(urlname, urlname)
+
+
+df = pd.read_excel(baseclass.dalao_total_ana_fm_path /
+                   "anaing_dalao.xlsx", dtype=object)
+
+
+# 读取dalao的 onetxhash_onerow_profit_ 交易信息
+arr_str_dalaoaddress = df["add"].tolist()
+for str_dalaoaddress in arr_str_dalaoaddress:
+    if not (baseclass.dalao_ana_fm_path/str_dalaoaddress/f"onetxhash_onerow_profit_{str_dalaoaddress}.csv").exists():
+        continue
+    cur_df = pd.read_csv(baseclass.dalao_ana_fm_path / str_dalaoaddress /
+                         f"onetxhash_onerow_profit_{str_dalaoaddress}.csv", dtype=object)
+    cur_df = cur_df.astype({
+        'timestamp': int,
+        'buy_counts': int,
+        'sell_counts': int,
+        'swap_eth_amount': float,
+        'outtoken_per': float,
+        'cost_main': float,
+        'earn_main': float,
+        'earn_percent': float,
+        'fir_cost_main':float,
+        'fir_earn_percent':float,
+    })
+    cur_df = cur_df[cur_df["cost_main"] != 0].reset_index(drop=True)
+    cur_df = cur_df[cur_df["fir_cost_main"] != 0].reset_index(drop=True)
+    obj_dalao_2_profit_df[str_dalaoaddress] = cur_df
+    # obj_dalao_2_arr_token 保存dalao的 onetxhash_onerow_profit_ 信息
+
+    obj_dalao_2_arr_token[str_dalaoaddress] = cur_df["swap_tokenaddress"].drop_duplicates(
+    ).tolist()
+    # arr_total_str_tokenaddress 获取所有dalao的所有   swap_tokenaddress
+    arr_total_str_tokenaddress.extend(cur_df["swap_tokenaddress"].tolist())
+ 
+arr_total_str_tokenaddress = list(set(arr_total_str_tokenaddress))
+print("arr_total_str_tokenaddress len=", len(arr_total_str_tokenaddress))
+
+for str_tokenaddress in arr_total_str_tokenaddress:
+    # print("enter ", str_tokenaddress)
+    obj_token_2_arr_dalao[str_tokenaddress] = []
+    for str_dalaoaddress in arr_str_dalaoaddress:
+        if str_tokenaddress in obj_dalao_2_arr_token[str_dalaoaddress]:
+            # dexurl = f"https://dexscreener.com/solana/{str_tokenaddress}?maker={str_dalaoaddress}"
+            obj_token_2_arr_dalao[str_tokenaddress].append(
+                str_dalaoaddress)
+
+# 获取 dalao持有的所有token 以及 token->持有该token的所有dalao 的df
+df = pd.DataFrame.from_dict(obj_token_2_arr_dalao, orient='index')
+
+
+df = df.reset_index(names=['add'], drop=False)
+df.insert(
+    loc=1, column="DexScreenURL", value="")
+
+df['DexScreenURL'] = df.apply(lambda ser: makescreenurl(
+    "https://dexscreener.com/solana/", f"{ser['add']}"), axis=1)
+
+
+df.to_excel(baseclass.dalao_total_ana_fm_path /
+            "anaed_token_2_dalao.xlsx", index=False)
+
+# # 去除特定的token
+df=drop_special_token(df=df,arr_drop_token=baseclass.arr_drop_token_froselecteddalao)
+
+# 获得很多个dalao都持有的token->持有该token的多有dalao df
+repeat_token_df = df[~(df[1].isna())].reset_index(drop=True)
+
+repeat_token_df.to_excel(
+    baseclass.dalao_total_ana_fm_path/"repeat_token_df.xlsx", index=False)
+
+arr_str_dalaoaddress_repeat_token = arr_str_dalaoaddress
+new_arr_str_dalaoaddress_repeat_token = arr_str_dalaoaddress_repeat_token
+
+
+# 获取dalao列表中有两个共同购买的token new_arr_token
+
+for idx_df in repeat_token_df.index:
+    cur_row = repeat_token_df.loc[idx_df,]
+    cur_str_tokenaddress = cur_row['add']
+    # print(f"cur_str_tokenaddress= {cur_str_tokenaddress}")
+    dexscreenurl = cur_row['DexScreenURL']
+    arr_cur_row = cur_row.tolist()
+    arr_cur_row.remove(cur_str_tokenaddress)
+    arr_cur_row.remove(dexscreenurl)
+    arr_cur_row = set(arr_cur_row)
+    arr_cur_row.discard(None)
+    arr_cur_row = list(arr_cur_row)
+    if len(set(arr_cur_row) & set(new_arr_str_dalaoaddress_repeat_token)) >= 2:
+        new_arr_str_dalaoaddress_repeat_token.append(cur_str_tokenaddress)
+
+# 获取包含 new_arr_token 的df
+new_repeat_token_df = repeat_token_df[repeat_token_df["add"].isin(
+    new_arr_str_dalaoaddress_repeat_token)].reset_index(drop=True)
+
+
+new_repeat_token_df = new_repeat_token_df.sort_values(
+    by=['add'], ascending=[True]).reset_index(drop=True)
+
+new_repeat_token_df.to_excel(
+    baseclass.dalao_total_ana_fm_path/"new_repeat_token_df.xlsx", index=False)
+print(f"new_repeat_token_df len= {len(new_repeat_token_df)}")
+
+# 将拥dalao 关于此tokne的protfi汇总,保存为total_dalao_profit_df
+total_dalao_profit_df = None
+for idx_df in new_repeat_token_df.index:
+    cur_row = new_repeat_token_df.loc[idx_df,]
+    cur_str_tokenaddress = cur_row['add']
+    dexscreenurl = cur_row['DexScreenURL']
+    arr_cur_row = cur_row.tolist()
+    arr_cur_row.remove(cur_str_tokenaddress)
+    arr_cur_row.remove(dexscreenurl)
+    arr_cur_row = set(arr_cur_row)
+    arr_cur_row.discard(None)
+    arr_cur_row = list(arr_cur_row)
+    for str_dalaoaddress in arr_cur_row:
+        # obj_str_dalaoaddress_repeat_token_2_buytokennum[str_dalaoaddress][0] += 1
+        cur_dalao_df = obj_dalao_2_profit_df[str_dalaoaddress]
+        cur_dalao_gdf = cur_dalao_df[cur_dalao_df["swap_tokenaddress"]
+                                     == cur_str_tokenaddress].reset_index(drop=True)
+        cur_dalao_gdf['dalaoaddress'] = str_dalaoaddress
+        total_dalao_profit_df = pd.concat(
+            [total_dalao_profit_df, cur_dalao_gdf])
+
+
+def get_dalaofirsttimestamp(gdf):
+    gdf["dalaofirsttimestamp"] = gdf["datetime"].min()
+    return gdf
+
+
+total_dalao_profit_df['datetime'] = pd.to_datetime(
+    total_dalao_profit_df['timestamp'], unit='s')
+
+total_dalao_profit_df["dalaofirsttimestamp"] = None
+total_dalao_profit_df = total_dalao_profit_df.groupby(['swap_tokenaddress', 'dalaoaddress']).apply(
+    lambda gdf: get_dalaofirsttimestamp(gdf)).reset_index(drop=True)
+
+
+# total_dalao_profit_df.insert(
+#     loc=2, column="DexScreenURL", value="")
+
+
+total_dalao_profit_df['DexScreenURL'] = total_dalao_profit_df.apply(lambda ser: makescreenurl(
+    "https://dexscreener.com/solana/", f"{ser['swap_tokenaddress']}?maker={ser['dalaoaddress']}"), axis=1)
+
+
+total_dalao_profit_df = total_dalao_profit_df.sort_values(
+    by=["dalaofirsttimestamp", "swap_tokenaddress", "dalaoaddress", "datetime"], ascending=[False, True, True, True]).reset_index(drop=True)
+
+
+total_dalao_profit_df["idx_dalao"] = -1
+
+
+def get_dalaobuyidx(gdf):
+
+    cur_gdf = gdf[["dalaoaddress", "dalaofirsttimestamp"]].drop_duplicates(
+    ).sort_values(by=["dalaofirsttimestamp"], ascending=[True])
+    arr_str_dalaoaddress = cur_gdf["dalaoaddress"].tolist()
+    obj_dalaoaddress_2_idx = {}
+    for idx_str_dalaoaddress in range(0, len(arr_str_dalaoaddress)):
+        str_dalaoaddress = arr_str_dalaoaddress[idx_str_dalaoaddress]
+        obj_dalaoaddress_2_idx[str_dalaoaddress] = idx_str_dalaoaddress
+    gdf["idx_dalao"] = gdf["dalaoaddress"].map(obj_dalaoaddress_2_idx)
+    return gdf
+
+
+total_dalao_profit_df = total_dalao_profit_df.groupby(['swap_tokenaddress']).apply(
+    lambda gdf: get_dalaobuyidx(gdf)).reset_index(drop=True)
+
+total_dalao_profit_df["mine_earn"]=total_dalao_profit_df["earn_percent"]*1
+total_dalao_profit_df["mine_fir_earn"]=total_dalao_profit_df["fir_earn_percent"]*1
+
+now_unix_time = int(time.time())
+# def calute_days(df, now_unix_time):
+#     df["diffdays"] = 0
+#     intervaldays_list = [15, 11, 7, 3]
+#     for intervaldays in intervaldays_list:
+#         df.loc[df["TokenFirstTime"] >=
+#                now_unix_time - 3600*24*intervaldays, "diffdays"] = intervaldays
+#     return df
+# total_dalao_profit_df["TokenFirstTime"] = total_dalao_profit_df.groupby(by=["swap_tokenaddress","dalaoaddress"])[
+#     "timestamp"].transform("min")
+# total_dalao_profit_df = calute_days(
+#     df=total_dalao_profit_df, now_unix_time=now_unix_time)
+ 
+# total_dalao_profit_df= total_dalao_profit_df.drop(columns=["TokenFirstTime"])
+
+
+total_dalao_profit_df = total_dalao_profit_df.sort_values(
+    by=["dalaofirsttimestamp", "swap_tokenaddress", "dalaoaddress", "datetime"], ascending=[False, True, True, True]).reset_index(drop=True)
+
+
+
+
+total_dalao_profit_df.to_excel(
+    baseclass.dalao_total_ana_fm_path/"total_dalao_profit_df.xlsx", index=False)
+
+
+
+
+# 一个dalao 一个token 只保留一行 
+ 
+ 
+total_dalao_profit_dropdup_df = total_dalao_profit_df.drop_duplicates(subset=['swap_tokenaddress', 'dalaoaddress']).reset_index(drop=True)
+total_dalao_profit_dropdup_df.to_excel(
+    baseclass.dalao_total_ana_fm_path/"total_dalao_profit_dropdup_df.xlsx", index=False)
+
+# 计算 所有 outtokenper小于=1 的 dalaoaddress的盈利  并且计算总盈利 和 去重第一次购买的总盈利
+
+# 将 total_dalao_profit_df 拆分成每个dalao 的 dalao_profit_df 保存到 dalao_ana_fm_path
+ 
+
+# arr_str_dalaoaddress_of_total_dalao_profit = total_dalao_profit_df["dalaoaddress"].drop_duplicates().tolist()
+# for str_dalaoaddress  in arr_str_dalaoaddress_of_total_dalao_profit:
+
+
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 231 - 0
src/code/010_get_sametoken_dalao.py

@@ -0,0 +1,231 @@
+
+from base_class import *
+from base_class import BaseVariableFunction
+
+
+baseclass = BaseVariableFunction(__file__)
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+obj_dalao_2_profit_df = {
+
+}
+
+obj_dalao_2_arr_token = {
+
+}
+
+
+obj_token_2_arr_dalao = {
+
+}
+arr_total_str_tokenaddress = []
+
+obj_dalao_2_buycounts = {
+
+}
+
+
+def makescreenurl(urlname, urlparam):
+    urlname = urlname + urlparam
+    return '=HYPERLINK("{}","{}")'.format(urlname, urlname)
+
+
+df = pd.read_excel(baseclass.dalao_total_ana_fm_path /
+                   "anaing_dalao.xlsx", dtype=object)
+
+
+# 读取dalao的 onetxhash_onerow_profit_ 交易信息
+arr_str_dalaoaddress = df["add"].tolist()
+for str_dalaoaddress in arr_str_dalaoaddress:
+    if not (baseclass.dalao_ana_fm_path/str_dalaoaddress/f"onetxhash_onerow_profit_{str_dalaoaddress}.csv").exists():
+        continue
+    cur_df = pd.read_csv(baseclass.dalao_ana_fm_path / str_dalaoaddress /
+                         f"onetxhash_onerow_profit_{str_dalaoaddress}.csv", dtype=object)
+    cur_df = cur_df.astype({
+        'timestamp': int,
+        'buy_counts': int,
+        'sell_counts': int,
+        'swap_eth_amount': float,
+        'outtoken_per': float,
+        'cost_main': float,
+        'earn_main': float,
+        'earn_percent': float
+    })
+    cur_df = cur_df[cur_df["cost_main"] != 0].reset_index(drop=True)
+    obj_dalao_2_profit_df[str_dalaoaddress] = cur_df
+    # obj_dalao_2_arr_token 保存dalao的 onetxhash_onerow_profit_ 信息
+
+    obj_dalao_2_arr_token[str_dalaoaddress] = cur_df["swap_tokenaddress"].drop_duplicates(
+    ).tolist()
+    # arr_total_str_tokenaddress 获取所有dalao的所有   swap_tokenaddress
+    arr_total_str_tokenaddress.extend(cur_df["swap_tokenaddress"].tolist())
+
+
+arr_total_str_tokenaddress = list(set(arr_total_str_tokenaddress))
+print("arr_total_str_tokenaddress len=", len(arr_total_str_tokenaddress))
+
+for str_tokenaddress in arr_total_str_tokenaddress:
+    # print("enter ", str_tokenaddress)
+    obj_token_2_arr_dalao[str_tokenaddress] = []
+    for str_dalaoaddress in arr_str_dalaoaddress:
+        if str_tokenaddress in obj_dalao_2_arr_token[str_dalaoaddress]:
+            # dexurl = f"https://dexscreener.com/solana/{str_tokenaddress}?maker={str_dalaoaddress}"
+            obj_token_2_arr_dalao[str_tokenaddress].append(
+                str_dalaoaddress)
+
+# 获取 dalao持有的所有token 以及 token->持有该token的所有dalao 的df
+df = pd.DataFrame.from_dict(obj_token_2_arr_dalao, orient='index')
+
+
+df = df.reset_index(names=['add'], drop=False)
+df.insert(
+    loc=1, column="DexScreenURL", value="")
+
+df['DexScreenURL'] = df.apply(lambda ser: makescreenurl(
+    "https://dexscreener.com/solana/", f"{ser['add']}"), axis=1)
+
+
+df.to_excel(baseclass.dalao_total_ana_fm_path /
+            "anaed_token_2_dalao.xlsx", index=False)
+
+# 获得很多个dalao都持有的token->持有该token的多有dalao df
+repeat_token_df = df[~(df[3].isna())].reset_index(drop=True)
+
+repeat_token_df.to_excel(
+    baseclass.dalao_total_ana_fm_path/"repeat_token_df.xlsx", index=False)
+# repeat_token_df = repeat_token_df.drop(columns=['DexScreenURL'])
+arr_str_tokenaddress = repeat_token_df['add'].tolist()
+
+arr_str_dalaoaddress_repeat_token = []
+obj_str_dalaoaddress_repeat_token_2_buytokennum = {
+}
+
+for idx_df in repeat_token_df.index:
+    cur_row = repeat_token_df.loc[idx_df,]
+    cur_str_tokenaddress = cur_row['add']
+    dexscreenurl = cur_row['DexScreenURL']
+    arr_cur_row = cur_row.tolist()
+    arr_cur_row.remove(cur_str_tokenaddress)
+    arr_cur_row.remove(dexscreenurl)
+    arr_str_dalaoaddress_repeat_token.extend(arr_cur_row)
+
+arr_str_dalaoaddress_repeat_token = set(arr_str_dalaoaddress_repeat_token)
+arr_str_dalaoaddress_repeat_token.discard(None)
+arr_str_dalaoaddress_repeat_token = list(arr_str_dalaoaddress_repeat_token)
+
+new_arr_str_dalaoaddress_repeat_token = arr_str_dalaoaddress_repeat_token
+
+
+# 获取dalao列表中有两个共同购买的token new_arr_token
+
+for idx_df in repeat_token_df.index:
+    cur_row = repeat_token_df.loc[idx_df,]
+    cur_str_tokenaddress = cur_row['add']
+    # print(f"cur_str_tokenaddress= {cur_str_tokenaddress}")
+    dexscreenurl = cur_row['DexScreenURL']
+    arr_cur_row = cur_row.tolist()
+    arr_cur_row.remove(cur_str_tokenaddress)
+    arr_cur_row.remove(dexscreenurl)
+    arr_cur_row = set(arr_cur_row)
+    arr_cur_row.discard(None)
+    arr_cur_row = list(arr_cur_row)
+    if len(set(arr_cur_row) & set(new_arr_str_dalaoaddress_repeat_token)) >= 2:
+        new_arr_str_dalaoaddress_repeat_token.append(cur_str_tokenaddress)
+
+# 获取包含 new_arr_token 的df
+new_repeat_token_df = repeat_token_df[repeat_token_df["add"].isin(
+    new_arr_str_dalaoaddress_repeat_token)].reset_index(drop=True)
+
+
+new_repeat_token_df = new_repeat_token_df.sort_values(
+    by=['add'], ascending=[True]).reset_index(drop=True)
+
+new_repeat_token_df.to_excel(
+    baseclass.dalao_total_ana_fm_path/"new_repeat_token_df.xlsx", index=False)
+print(f"new_repeat_token_df len= {len(new_repeat_token_df)}")
+
+# 将拥dalao 关于此tokne的protfi汇总,
+total_dalao_profit_df = None
+for idx_df in new_repeat_token_df.index:
+    cur_row = new_repeat_token_df.loc[idx_df,]
+    cur_str_tokenaddress = cur_row['add']
+    dexscreenurl = cur_row['DexScreenURL']
+    arr_cur_row = cur_row.tolist()
+    arr_cur_row.remove(cur_str_tokenaddress)
+    arr_cur_row.remove(dexscreenurl)
+    arr_cur_row = set(arr_cur_row)
+    arr_cur_row.discard(None)
+    arr_cur_row = list(arr_cur_row)
+    for str_dalaoaddress in arr_cur_row:
+        # obj_str_dalaoaddress_repeat_token_2_buytokennum[str_dalaoaddress][0] += 1
+        cur_dalao_df = obj_dalao_2_profit_df[str_dalaoaddress]
+        cur_dalao_gdf = cur_dalao_df[cur_dalao_df["swap_tokenaddress"]
+                                     == cur_str_tokenaddress].reset_index(drop=True)
+        cur_dalao_gdf['dalaoaddress'] = str_dalaoaddress
+        total_dalao_profit_df = pd.concat(
+            [total_dalao_profit_df, cur_dalao_gdf])
+
+
+def get_dalaofirsttimestamp(gdf):
+    gdf["dalaofirsttimestamp"] = gdf["datetime"].min()
+    return gdf
+
+
+total_dalao_profit_df['datetime'] = pd.to_datetime(
+    total_dalao_profit_df['timestamp'], unit='s')
+
+total_dalao_profit_df["dalaofirsttimestamp"] = None
+total_dalao_profit_df = total_dalao_profit_df.groupby(['swap_tokenaddress', 'dalaoaddress']).apply(
+    lambda gdf: get_dalaofirsttimestamp(gdf)).reset_index(drop=True)
+
+
+# total_dalao_profit_df.insert(
+#     loc=2, column="DexScreenURL", value="")
+
+
+total_dalao_profit_df['DexScreenURL'] = total_dalao_profit_df.apply(lambda ser: makescreenurl(
+    "https://dexscreener.com/solana/", f"{ser['swap_tokenaddress']}?maker={ser['dalaoaddress']}"), axis=1)
+
+
+total_dalao_profit_df = total_dalao_profit_df.sort_values(
+    by=["dalaofirsttimestamp", "swap_tokenaddress", "dalaoaddress", "datetime"], ascending=[True, True, True, True]).reset_index(drop=True)
+
+
+total_dalao_profit_df["idx_dalao"] = -1
+
+
+def get_dalaobuyidx(gdf):
+
+    cur_gdf = gdf[["dalaoaddress", "dalaofirsttimestamp"]].drop_duplicates(
+    ).sort_values(by=["dalaofirsttimestamp"], ascending=[True])
+    arr_str_dalaoaddress = cur_gdf["dalaoaddress"].tolist()
+    obj_dalaoaddress_2_idx = {}
+    for idx_str_dalaoaddress in range(0, len(arr_str_dalaoaddress)):
+        str_dalaoaddress = arr_str_dalaoaddress[idx_str_dalaoaddress]
+        obj_dalaoaddress_2_idx[str_dalaoaddress] = idx_str_dalaoaddress
+    gdf["idx_dalao"] = gdf["dalaoaddress"].map(obj_dalaoaddress_2_idx)
+    return gdf
+
+
+total_dalao_profit_df = total_dalao_profit_df.groupby(['swap_tokenaddress']).apply(
+    lambda gdf: get_dalaobuyidx(gdf)).reset_index(drop=True)
+
+
+total_dalao_profit_df.to_excel(
+    baseclass.dalao_total_ana_fm_path/"fir_total_dalao_profit_df.xlsx", index=False)
+total_dalao_profit_df.to_excel(
+    baseclass.dalao_total_ana_fm_path/"total_dalao_profit_df.xlsx", index=False)
+# 计算 所有 outtokenper小于=1 的 dalaoaddress的盈利  并且计算总盈利 和 去重第一次购买的总盈利
+
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 247 - 0
src/code/010_get_sametoken_dalao_dropsometoken.py

@@ -0,0 +1,247 @@
+
+from base_class import *
+from base_class import BaseVariableFunction
+
+
+baseclass = BaseVariableFunction(__file__)
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+def drop_special_token(df , arr_drop_token):
+    drop_mask = df["add"].isin(arr_drop_token)
+    df=df[~drop_mask].reset_index(drop=True)
+    return df
+obj_dalao_2_profit_df = {
+
+}
+
+obj_dalao_2_arr_token = {
+
+}
+
+
+obj_token_2_arr_dalao = {
+
+}
+arr_total_str_tokenaddress = []
+
+obj_dalao_2_buycounts = {
+
+}
+
+
+def makescreenurl(urlname, urlparam):
+    urlname = urlname + urlparam
+    return '=HYPERLINK("{}","{}")'.format(urlname, urlname)
+
+
+df = pd.read_excel(baseclass.dalao_total_ana_fm_path /
+                   "anaing_dalao.xlsx", dtype=object)
+
+
+# 读取dalao的 onetxhash_onerow_profit_ 交易信息
+arr_str_dalaoaddress = df["add"].tolist()
+for str_dalaoaddress in arr_str_dalaoaddress:
+    if not (baseclass.dalao_ana_fm_path/str_dalaoaddress/f"onetxhash_onerow_profit_{str_dalaoaddress}.csv").exists():
+        continue
+    cur_df = pd.read_csv(baseclass.dalao_ana_fm_path / str_dalaoaddress /
+                         f"onetxhash_onerow_profit_{str_dalaoaddress}.csv", dtype=object)
+    cur_df = cur_df.astype({
+        'timestamp': int,
+        'buy_counts': int,
+        'sell_counts': int,
+        'swap_eth_amount': float,
+        'outtoken_per': float,
+        'cost_main': float,
+        'earn_main': float,
+        'earn_percent': float,
+        'fir_earn_percent':float,
+    })
+    cur_df = cur_df[cur_df["cost_main"] != 0].reset_index(drop=True)
+    obj_dalao_2_profit_df[str_dalaoaddress] = cur_df
+    # obj_dalao_2_arr_token 保存dalao的 onetxhash_onerow_profit_ 信息
+
+    obj_dalao_2_arr_token[str_dalaoaddress] = cur_df["swap_tokenaddress"].drop_duplicates(
+    ).tolist()
+    # arr_total_str_tokenaddress 获取所有dalao的所有   swap_tokenaddress
+    arr_total_str_tokenaddress.extend(cur_df["swap_tokenaddress"].tolist())
+
+
+arr_total_str_tokenaddress = list(set(arr_total_str_tokenaddress))
+print("arr_total_str_tokenaddress len=", len(arr_total_str_tokenaddress))
+
+for str_tokenaddress in arr_total_str_tokenaddress:
+    # print("enter ", str_tokenaddress)
+    obj_token_2_arr_dalao[str_tokenaddress] = []
+    for str_dalaoaddress in arr_str_dalaoaddress:
+        if str_tokenaddress in obj_dalao_2_arr_token[str_dalaoaddress]:
+            # dexurl = f"https://dexscreener.com/solana/{str_tokenaddress}?maker={str_dalaoaddress}"
+            obj_token_2_arr_dalao[str_tokenaddress].append(
+                str_dalaoaddress)
+
+# 获取 dalao持有的所有token 以及 token->持有该token的所有dalao 的df
+df = pd.DataFrame.from_dict(obj_token_2_arr_dalao, orient='index')
+
+
+df = df.reset_index(names=['add'], drop=False)
+df.insert(
+    loc=1, column="DexScreenURL", value="")
+
+df['DexScreenURL'] = df.apply(lambda ser: makescreenurl(
+    "https://dexscreener.com/solana/", f"{ser['add']}"), axis=1)
+
+
+df.to_excel(baseclass.dalao_total_ana_fm_path /
+            "anaed_token_2_dalao.xlsx", index=False)
+
+# # 去除特定的token
+df=drop_special_token(df=df,arr_drop_token=baseclass.arr_drop_token_froselecteddalao)
+
+# 获得很多个dalao都持有的token->持有该token的多有dalao df
+repeat_token_df = df[~(df[2].isna())].reset_index(drop=True)
+
+repeat_token_df.to_excel(
+    baseclass.dalao_total_ana_fm_path/"repeat_token_df.xlsx", index=False)
+# repeat_token_df = repeat_token_df.drop(columns=['DexScreenURL'])
+arr_str_tokenaddress = repeat_token_df['add'].tolist()
+
+arr_str_dalaoaddress_repeat_token = []
+obj_str_dalaoaddress_repeat_token_2_buytokennum = {
+}
+
+for idx_df in repeat_token_df.index:
+    cur_row = repeat_token_df.loc[idx_df,]
+    cur_str_tokenaddress = cur_row['add']
+    dexscreenurl = cur_row['DexScreenURL']
+    arr_cur_row = cur_row.tolist()
+    arr_cur_row.remove(cur_str_tokenaddress)
+    arr_cur_row.remove(dexscreenurl)
+    arr_str_dalaoaddress_repeat_token.extend(arr_cur_row)
+
+arr_str_dalaoaddress_repeat_token = set(arr_str_dalaoaddress_repeat_token)
+arr_str_dalaoaddress_repeat_token.discard(None)
+arr_str_dalaoaddress_repeat_token = list(arr_str_dalaoaddress_repeat_token)
+
+new_arr_str_dalaoaddress_repeat_token = arr_str_dalaoaddress_repeat_token
+
+
+# 获取dalao列表中有两个共同购买的token new_arr_token
+
+for idx_df in repeat_token_df.index:
+    cur_row = repeat_token_df.loc[idx_df,]
+    cur_str_tokenaddress = cur_row['add']
+    # print(f"cur_str_tokenaddress= {cur_str_tokenaddress}")
+    dexscreenurl = cur_row['DexScreenURL']
+    arr_cur_row = cur_row.tolist()
+    arr_cur_row.remove(cur_str_tokenaddress)
+    arr_cur_row.remove(dexscreenurl)
+    arr_cur_row = set(arr_cur_row)
+    arr_cur_row.discard(None)
+    arr_cur_row = list(arr_cur_row)
+    if len(set(arr_cur_row) & set(new_arr_str_dalaoaddress_repeat_token)) >= 2:
+        new_arr_str_dalaoaddress_repeat_token.append(cur_str_tokenaddress)
+
+# 获取包含 new_arr_token 的df
+new_repeat_token_df = repeat_token_df[repeat_token_df["add"].isin(
+    new_arr_str_dalaoaddress_repeat_token)].reset_index(drop=True)
+
+
+new_repeat_token_df = new_repeat_token_df.sort_values(
+    by=['add'], ascending=[True]).reset_index(drop=True)
+
+new_repeat_token_df.to_excel(
+    baseclass.dalao_total_ana_fm_path/"new_repeat_token_df.xlsx", index=False)
+print(f"new_repeat_token_df len= {len(new_repeat_token_df)}")
+
+# 将拥dalao 关于此tokne的protfi汇总,保存为total_dalao_profit_df
+total_dalao_profit_df = None
+for idx_df in new_repeat_token_df.index:
+    cur_row = new_repeat_token_df.loc[idx_df,]
+    cur_str_tokenaddress = cur_row['add']
+    dexscreenurl = cur_row['DexScreenURL']
+    arr_cur_row = cur_row.tolist()
+    arr_cur_row.remove(cur_str_tokenaddress)
+    arr_cur_row.remove(dexscreenurl)
+    arr_cur_row = set(arr_cur_row)
+    arr_cur_row.discard(None)
+    arr_cur_row = list(arr_cur_row)
+    for str_dalaoaddress in arr_cur_row:
+        # obj_str_dalaoaddress_repeat_token_2_buytokennum[str_dalaoaddress][0] += 1
+        cur_dalao_df = obj_dalao_2_profit_df[str_dalaoaddress]
+        cur_dalao_gdf = cur_dalao_df[cur_dalao_df["swap_tokenaddress"]
+                                     == cur_str_tokenaddress].reset_index(drop=True)
+        cur_dalao_gdf['dalaoaddress'] = str_dalaoaddress
+        total_dalao_profit_df = pd.concat(
+            [total_dalao_profit_df, cur_dalao_gdf])
+
+
+def get_dalaofirsttimestamp(gdf):
+    gdf["dalaofirsttimestamp"] = gdf["datetime"].min()
+    return gdf
+
+
+total_dalao_profit_df['datetime'] = pd.to_datetime(
+    total_dalao_profit_df['timestamp'], unit='s')
+
+total_dalao_profit_df["dalaofirsttimestamp"] = None
+total_dalao_profit_df = total_dalao_profit_df.groupby(['swap_tokenaddress', 'dalaoaddress']).apply(
+    lambda gdf: get_dalaofirsttimestamp(gdf)).reset_index(drop=True)
+
+
+# total_dalao_profit_df.insert(
+#     loc=2, column="DexScreenURL", value="")
+
+
+total_dalao_profit_df['DexScreenURL'] = total_dalao_profit_df.apply(lambda ser: makescreenurl(
+    "https://dexscreener.com/solana/", f"{ser['swap_tokenaddress']}?maker={ser['dalaoaddress']}"), axis=1)
+
+
+total_dalao_profit_df = total_dalao_profit_df.sort_values(
+    by=["dalaofirsttimestamp", "swap_tokenaddress", "dalaoaddress", "datetime"], ascending=[False, True, True, True]).reset_index(drop=True)
+
+
+total_dalao_profit_df["idx_dalao"] = -1
+
+
+def get_dalaobuyidx(gdf):
+
+    cur_gdf = gdf[["dalaoaddress", "dalaofirsttimestamp"]].drop_duplicates(
+    ).sort_values(by=["dalaofirsttimestamp"], ascending=[True])
+    arr_str_dalaoaddress = cur_gdf["dalaoaddress"].tolist()
+    obj_dalaoaddress_2_idx = {}
+    for idx_str_dalaoaddress in range(0, len(arr_str_dalaoaddress)):
+        str_dalaoaddress = arr_str_dalaoaddress[idx_str_dalaoaddress]
+        obj_dalaoaddress_2_idx[str_dalaoaddress] = idx_str_dalaoaddress
+    gdf["idx_dalao"] = gdf["dalaoaddress"].map(obj_dalaoaddress_2_idx)
+    return gdf
+
+
+total_dalao_profit_df = total_dalao_profit_df.groupby(['swap_tokenaddress']).apply(
+    lambda gdf: get_dalaobuyidx(gdf)).reset_index(drop=True)
+
+total_dalao_profit_df["mine_earn"]=total_dalao_profit_df["earn_percent"]*1
+total_dalao_profit_df["mine_fir_earn"]=total_dalao_profit_df["fir_earn_percent"]*1
+
+
+total_dalao_profit_df = total_dalao_profit_df.sort_values(
+    by=["dalaofirsttimestamp", "swap_tokenaddress", "dalaoaddress", "datetime"], ascending=[False, True, True, True]).reset_index(drop=True)
+
+
+total_dalao_profit_df.to_excel(
+    baseclass.dalao_total_ana_fm_path/"fir_total_dalao_profit_df.xlsx", index=False)
+total_dalao_profit_df.to_excel(
+    baseclass.dalao_total_ana_fm_path/"total_dalao_profit_df.xlsx", index=False)
+# 计算 所有 outtokenper小于=1 的 dalaoaddress的盈利  并且计算总盈利 和 去重第一次购买的总盈利
+
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 486 - 0
src/code/011_01_new_get_profit_st_solanafm.py

@@ -0,0 +1,486 @@
+
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+baseclass.makedirpath(baseclass.new_dalao_ana_fm_path)
+
+baseclass.open_base_library()
+decimal.getcontext().prec = 100
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+onedalao_ana_columns = ['TokenFirstTime', 'swap_tokenaddress',  'buy_counts', 'sell_counts',
+                        'outtoken_per', 'cost_main', 'earn_main', 'earn_percent' ,'fir_cost_main','mine_earn', 'mine_fir_earn']
+
+TotalAnalysis_columns = [
+    "add",
+    # "whichcontract",
+    "beizhu",
+
+    "03d_cost_noaddouttoken",
+    "03d_earn_noaddouttoken",
+    "03d_earnper_noaddouttoken",
+    "03d_cost_dropfirsttimetx",
+    "03d_earn_dropfirsttimetx",
+    "03d_earnper_dropfirsttimetx",
+
+    # "03d_difcost_noaddouttoken",
+    # "03d_difearn_noaddouttoken",
+    # "03d_difper_noaddouttoken",
+    "03d_trans",
+    "03d_mine_fir_earn_sum" ,
+    "03d_mine_fir_earn_sum_dropmax",
+    "03d_mine_fir_earn_sum_dropfirsttimetx",
+    "03d_mine_earn_sum",
+    "03d_mine_earn_sum_dropmax",
+    "03d_mine_earn_sum_dropfirsttimetx",
+
+
+ 
+
+    "07d_cost_noaddouttoken",
+    "07d_earn_noaddouttoken",
+    "07d_earnper_noaddouttoken",
+    "07d_cost_dropfirsttimetx",
+    "07d_earn_dropfirsttimetx",
+    "07d_earnper_dropfirsttimetx",
+
+    # "07d_difcost_noaddouttoken",
+    # "07d_difearn_noaddouttoken",
+    # "07d_difper_noaddouttoken",
+    "07d_trans",
+    "07d_mine_fir_earn_sum" ,
+    "07d_mine_fir_earn_sum_dropmax",
+    "07d_mine_fir_earn_sum_dropfirsttimetx",
+    "07d_mine_earn_sum",
+    "07d_mine_earn_sum_dropmax",
+    "07d_mine_earn_sum_dropfirsttimetx",
+
+
+    "11d_cost_noaddouttoken",
+    "11d_earn_noaddouttoken",
+    "11d_earnper_noaddouttoken",
+    "11d_cost_dropfirsttimetx",
+    "11d_earn_dropfirsttimetx",
+    "11d_earnper_dropfirsttimetx",
+
+    # "11d_difcost_noaddouttoken",
+    # "11d_difearn_noaddouttoken",
+    # "11d_difper_noaddouttoken",
+    "11d_trans",
+    "11d_mine_fir_earn_sum" ,
+    "11d_mine_fir_earn_sum_dropmax",
+    "11d_mine_fir_earn_sum_dropfirsttimetx",
+    "11d_mine_earn_sum",
+    "11d_mine_earn_sum_dropmax",
+    "11d_mine_earn_sum_dropfirsttimetx",
+
+
+
+    "15d_cost_noaddouttoken",
+    "15d_earn_noaddouttoken",
+    "15d_earnper_noaddouttoken",
+    "15d_cost_dropfirsttimetx", 
+    "15d_earn_dropfirsttimetx", 
+    "15d_earnper_dropfirsttimetx",
+    # "15d_difcost_noaddouttoken",
+    # "15d_difearn_noaddouttoken",
+    # "15d_difper_noaddouttoken",
+    "15d_trans",
+    "15d_mine_fir_earn_sum" ,
+    "15d_mine_fir_earn_sum_dropmax",
+    "15d_mine_fir_earn_sum_dropfirsttimetx",
+    "15d_mine_earn_sum",
+    "15d_mine_earn_sum_dropmax",
+    "15d_mine_earn_sum_dropfirsttimetx",
+
+
+    "15dearn_dif",
+    "15dtxs_dif"
+]
+
+
+def analysis_lastdays_noaddouttoken( df, now_unix_time, intervaldays=30):
+    if len(df) == 0:
+        return 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+    # need consider df may null if use iloc
+    lastdf = df[df["TokenFirstTime"] >=
+                now_unix_time - 3600*24*intervaldays]
+    # 去除那些earnper为-10的
+    lastdf = lastdf[lastdf['cost_main'] != 0]
+    # 去除 cost_main 过小的 <0.04  sol 理论上 同时fir_cost_main!=0
+    lastdf = lastdf[lastdf['cost_main'] >= 0.04] 
+    lastdf = lastdf[lastdf['fir_cost_main'] != 0]
+    lastdf = lastdf.reset_index(drop=True)
+    if len(lastdf) == 0:
+        return 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0
+    
+    
+    mine_earn_df = lastdf[["swap_tokenaddress","mine_earn","mine_fir_earn"]].drop_duplicates().reset_index(drop=True)
+    last_mine_earn_sum = mine_earn_df['mine_earn'].sum()
+    last_mine_earn_sum_dropmax = last_mine_earn_sum - mine_earn_df['mine_earn'].max()
+    last_mine_fir_earn_sum = mine_earn_df['mine_fir_earn'].sum()
+    last_mine_fir_earn_sum_dropmax = last_mine_fir_earn_sum - mine_earn_df['mine_fir_earn'].max()
+
+    last_cost_sum = lastdf['cost_main'].sum()
+    last_earn_sum = lastdf["earn_main_noaddouttoken"].sum()
+    last_cost_median = lastdf['cost_main'].median()
+    last_cost_mean = lastdf['cost_main'].mean()
+    last_earnper = last_earn_sum / last_cost_sum if last_cost_sum != 0 else -10
+    last_trans_amount = len(lastdf)
+    lastdf['earn_percent'] = np.where(
+        lastdf['cost_main'] != 0,
+        lastdf["earn_main_noaddouttoken"] / lastdf['cost_main'],
+        -10,
+    )
+
+    earnmain_max = lastdf["earn_main_noaddouttoken"].max()
+    last_earn_difmax_sum = last_earn_sum - earnmain_max
+    last_cost_difmax_sum = last_cost_sum - \
+        lastdf[lastdf['earn_main_noaddouttoken'] == earnmain_max]['cost_main'].to_list()[
+            0]
+    last_dif_earnper = (
+        last_earn_difmax_sum / last_cost_difmax_sum if last_cost_difmax_sum != 0 else -10
+    )
+
+
+    return (
+        last_cost_sum,
+        last_earn_sum,
+        last_earnper,
+        last_cost_difmax_sum,
+        last_earn_difmax_sum,
+        last_dif_earnper,
+        last_cost_median,
+        last_cost_mean,
+        # last_earncount_per,
+        last_trans_amount,
+        # last_mine_cost_sum,
+        last_mine_earn_sum,
+        last_mine_earn_sum_dropmax,
+        last_mine_fir_earn_sum ,
+        last_mine_fir_earn_sum_dropmax,
+
+    )
+
+
+def analysis_lastdays_dropfisttimetx(df, now_unix_time, intervaldays=30):
+
+    if len(df) == 0:
+        return 0, 0, 0, 0, 0, 0,  0, 0, 0,0,0
+
+    # need consider df may null if use iloc
+    lastdf = df[df["TokenFirstTime"] >= now_unix_time - 3600*24*intervaldays]
+    # 去除那些earnper为-10的
+    lastdf = lastdf[lastdf['cost_main'] != 0]
+    # 去除 cost_main 过小的 <0.04  sol 理论上 同时fir_cost_main!=0
+    lastdf = lastdf[lastdf['cost_main'] >= 0.04] 
+    lastdf = lastdf[lastdf['fir_cost_main'] != 0]
+    lastdf = lastdf.reset_index(drop=True)
+    if len(lastdf) == 0:
+        return 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0
+
+    mine_earn_df = lastdf[["swap_tokenaddress","mine_earn","mine_fir_earn"]].drop_duplicates().reset_index(drop=True)
+    last_mine_earn_sum = mine_earn_df['mine_earn'].sum()
+    last_mine_fir_earn_sum = mine_earn_df['mine_fir_earn'].sum()
+
+    last_cost_sum = lastdf['cost_main'].sum()
+    last_earn_sum = lastdf['earn_main'].sum()
+    last_cost_median = lastdf['cost_main'].median()
+    last_cost_mean = lastdf['cost_main'].mean()
+    last_earnper = last_earn_sum / last_cost_sum if last_cost_sum != 0 else -10
+    last_trans_amount = len(lastdf)
+    lastdf['earn_percent'] = np.where(
+        lastdf['cost_main'] != 0,
+        lastdf['earn_main'] / lastdf['cost_main'],
+        -10,
+    )
+    earnmain_max = lastdf['earn_main'].max()
+    last_earn_difmax_sum = last_earn_sum - earnmain_max
+    last_cost_difmax_sum = last_cost_sum - \
+        lastdf[lastdf['earn_main'] == earnmain_max]['cost_main'].to_list()[0]
+    last_dif_earnper = (
+        last_earn_difmax_sum / last_cost_difmax_sum if last_cost_difmax_sum != 0 else -10
+    )
+    return (
+        last_cost_sum,
+        last_earn_sum,
+        last_earnper,
+        last_cost_difmax_sum,
+        last_earn_difmax_sum,
+        last_dif_earnper,
+        last_cost_median,
+        last_cost_mean,
+        # last_earncount_per,
+        last_trans_amount,
+        last_mine_earn_sum,
+        last_mine_fir_earn_sum
+
+    )
+
+
+def get_analyres(df,  dalao_address, now_unix_time, dropfirsttime_df):
+    (last_03d_cost_noaddouttoken, last_03d_earn_noaddouttoken, last_03d_earnper_noaddouttoken, last_03d_difcost_noaddouttoken, last_03d_difearn_noaddouttoken, last_03d_difper_noaddouttoken, last_03d_costmedian_noaddouttoken, last_03d_costmean_noaddouttoken, last_03d_trans,  last_03d_mine_earn_sum , last_03d_mine_earn_sum_dropmax  , last_03d_mine_fir_earn_sum ,last_03d_mine_fir_earn_sum_dropmax ) = analysis_lastdays_noaddouttoken(
+        df, now_unix_time=now_unix_time, intervaldays=3
+    )
+    (last_07d_cost_noaddouttoken, last_07d_earn_noaddouttoken, last_07d_earnper_noaddouttoken, last_07d_difcost_noaddouttoken, last_07d_difearn_noaddouttoken, last_07d_difper_noaddouttoken, last_07d_costmedian_noaddouttoken, last_07d_costmean_noaddouttoken, last_07d_trans, last_07d_mine_earn_sum,last_07d_mine_earn_sum_dropmax  , last_07d_mine_fir_earn_sum ,last_07d_mine_fir_earn_sum_dropmax ) = analysis_lastdays_noaddouttoken(
+        df, now_unix_time=now_unix_time, intervaldays=7
+    )
+    (last_11d_cost_noaddouttoken, last_11d_earn_noaddouttoken, last_11d_earnper_noaddouttoken, last_11d_difcost_noaddouttoken, last_11d_difearn_noaddouttoken, last_11d_difper_noaddouttoken, last_11d_costmedian_noaddouttoken, last_11d_costmean_noaddouttoken, last_11d_trans, last_11d_mine_earn_sum,last_11d_mine_earn_sum_dropmax  , last_11d_mine_fir_earn_sum ,last_11d_mine_fir_earn_sum_dropmax ) = analysis_lastdays_noaddouttoken(
+        df, now_unix_time=now_unix_time, intervaldays=11
+    )
+    (last_15d_cost_noaddouttoken, last_15d_earn_noaddouttoken, last_15d_earnper_noaddouttoken, last_15d_difcost_noaddouttoken, last_15d_difearn_noaddouttoken, last_15d_difper_noaddouttoken, last_15d_costmedian_noaddouttoken, last_15d_costmean_noaddouttoken, last_15d_trans, last_15d_mine_earn_sum,last_15d_mine_earn_sum_dropmax  , last_15d_mine_fir_earn_sum ,last_15d_mine_fir_earn_sum_dropmax ) = analysis_lastdays_noaddouttoken(
+        df, now_unix_time=now_unix_time, intervaldays=15
+    )
+    (last_03d_cost_dropfirsttimetx, last_03d_earn_dropfirsttimetx, last_03d_earnper_dropfirsttimetx, last_03d_difcost_dropfirsttimetx, last_03d_difearn_dropfirsttimetx, last_03d_difper_dropfirsttimetx, last_03d_costmedian_dropfirsttimetx, last_03d_costmean_dropfirsttimetx, last_03d_trans_dropfirsttimetx ,last_03d_mine_earn_sum_dropfirsttimetx   , last_03d_mine_fir_earn_sum_dropfirsttimetx     ) = analysis_lastdays_dropfisttimetx(
+        df=dropfirsttime_df, now_unix_time=now_unix_time, intervaldays=3
+    )
+    (last_07d_cost_dropfirsttimetx, last_07d_earn_dropfirsttimetx, last_07d_earnper_dropfirsttimetx, last_07d_difcost_dropfirsttimetx, last_07d_difearn_dropfirsttimetx, last_07d_difper_dropfirsttimetx, last_07d_costmedian_dropfirsttimetx, last_07d_costmean_dropfirsttimetx,    last_07d_trans_dropfirsttimetx ,last_07d_mine_earn_sum_dropfirsttimetx, last_07d_mine_fir_earn_sum_dropfirsttimetx  ) = analysis_lastdays_dropfisttimetx(
+        df=dropfirsttime_df, now_unix_time=now_unix_time, intervaldays=7
+    )
+    (last_11d_cost_dropfirsttimetx, last_11d_earn_dropfirsttimetx, last_11d_earnper_dropfirsttimetx, last_11d_difcost_dropfirsttimetx, last_11d_difearn_dropfirsttimetx, last_11d_difper_dropfirsttimetx, last_11d_costmedian_dropfirsttimetx, last_11d_costmean_dropfirsttimetx, last_11d_trans_dropfirsttimetx ,last_11d_mine_earn_sum_dropfirsttimetx, last_11d_mine_fir_earn_sum_dropfirsttimetx  ) = analysis_lastdays_dropfisttimetx(
+        df=dropfirsttime_df, now_unix_time=now_unix_time, intervaldays=11
+    )
+    (last_15d_cost_dropfirsttimetx, last_15d_earn_dropfirsttimetx, last_15d_earnper_dropfirsttimetx, last_15d_difcost_dropfirsttimetx, last_15d_difearn_dropfirsttimetx, last_15d_difper_dropfirsttimetx, last_15d_costmedian_dropfirsttimetx, last_15d_costmean_dropfirsttimetx, last_15d_trans_dropfirsttimetx ,last_15d_mine_earn_sum_dropfirsttimetx, last_15d_mine_fir_earn_sum_dropfirsttimetx  ) = analysis_lastdays_dropfisttimetx(
+        df=dropfirsttime_df, now_unix_time=now_unix_time, intervaldays=15
+    )
+    analist = [
+        dalao_address,
+        "",
+        last_03d_cost_noaddouttoken,
+        last_03d_earn_noaddouttoken,
+        last_03d_earnper_noaddouttoken,
+        last_03d_cost_dropfirsttimetx, 
+        last_03d_earn_dropfirsttimetx,
+          last_03d_earnper_dropfirsttimetx,
+        # last_03d_difcost_noaddouttoken,
+        # last_03d_difearn_noaddouttoken,
+        # last_03d_difper_noaddouttoken,
+        last_03d_trans,
+        last_03d_mine_fir_earn_sum ,
+        last_03d_mine_fir_earn_sum_dropmax,
+        last_03d_mine_fir_earn_sum_dropfirsttimetx,
+        last_03d_mine_earn_sum,
+        last_03d_mine_earn_sum_dropmax,
+        last_03d_mine_earn_sum_dropfirsttimetx,
+
+
+        last_07d_cost_noaddouttoken,
+        last_07d_earn_noaddouttoken,
+        last_07d_earnper_noaddouttoken,
+        last_07d_cost_dropfirsttimetx, 
+        last_07d_earn_dropfirsttimetx, 
+        last_07d_earnper_dropfirsttimetx,
+        # last_07d_difcost_noaddouttoken,
+        # last_07d_difearn_noaddouttoken,
+        # last_07d_difper_noaddouttoken,
+        last_07d_trans,
+        last_07d_mine_fir_earn_sum ,
+        last_07d_mine_fir_earn_sum_dropmax,
+        last_07d_mine_fir_earn_sum_dropfirsttimetx,
+        last_07d_mine_earn_sum,
+        last_07d_mine_earn_sum_dropmax,
+        last_07d_mine_earn_sum_dropfirsttimetx,
+
+
+
+        last_11d_cost_noaddouttoken,
+        last_11d_earn_noaddouttoken,
+        last_11d_earnper_noaddouttoken,
+        last_11d_cost_dropfirsttimetx, 
+        last_11d_earn_dropfirsttimetx, 
+        last_11d_earnper_dropfirsttimetx,
+        # last_11d_difcost_noaddouttoken,
+        # last_11d_difearn_noaddouttoken,
+        # last_11d_difper_noaddouttoken,
+        last_11d_trans,
+        last_11d_mine_fir_earn_sum ,
+        last_11d_mine_fir_earn_sum_dropmax,
+        last_11d_mine_fir_earn_sum_dropfirsttimetx,
+        last_11d_mine_earn_sum,
+        last_11d_mine_earn_sum_dropmax,
+        last_11d_mine_earn_sum_dropfirsttimetx,
+
+
+
+
+        last_15d_cost_noaddouttoken,
+        last_15d_earn_noaddouttoken,
+        last_15d_earnper_noaddouttoken,
+        last_15d_cost_dropfirsttimetx,
+          last_15d_earn_dropfirsttimetx, 
+          last_15d_earnper_dropfirsttimetx,
+        # last_15d_difcost_noaddouttoken,
+        # last_15d_difearn_noaddouttoken,
+        # last_15d_difper_noaddouttoken,
+        last_15d_trans,
+        last_15d_mine_fir_earn_sum ,
+        last_15d_mine_fir_earn_sum_dropmax,
+        last_15d_mine_fir_earn_sum_dropfirsttimetx,
+        last_15d_mine_earn_sum,
+        last_15d_mine_earn_sum_dropmax,
+        last_15d_mine_earn_sum_dropfirsttimetx,
+
+
+        last_15d_cost_noaddouttoken-last_15d_cost_dropfirsttimetx,
+        last_15d_trans-last_15d_trans_dropfirsttimetx
+    ]
+
+    global TotalAnalysis_list
+    TotalAnalysis_list.append(analist)
+
+
+def calute_days(df, now_unix_time):
+    df["diffdays"] = 0
+    intervaldays_list = [15, 11, 7, 3]
+    for intervaldays in intervaldays_list:
+        df.loc[df["TokenFirstTime"] >=
+               now_unix_time - 3600*24*intervaldays, "diffdays"] = intervaldays
+    return df
+
+
+def calucate_earnmain_dropoutoken(row):
+    earnmain_amount_dropoutoken = decimal.Decimal(row['earn_main'])
+    outtoken_per = decimal.Decimal(row["outtoken_per"])
+
+    if outtoken_per >= 1.1 or outtoken_per == -10:
+        earnmain_amount_dropoutoken = decimal.Decimal(0)
+    earnmain_amount_dropoutoken_str = '{0:.4f}'.format(
+        earnmain_amount_dropoutoken)
+    return float(earnmain_amount_dropoutoken_str)
+
+
+def makeDexurl(row, dalao_address):
+    tokenAddress = row['swap_tokenaddress']
+    urlname = f"https://dexscreener.com/solana/{tokenAddress}?maker={dalao_address}"
+    return '=HYPERLINK("{}","{}")'.format(urlname, "DEX/"+tokenAddress)
+
+
+def new_get_ana_df(dalao_address, df, dropfirsttime_df):
+    onedalao_ana_df = df[onedalao_ana_columns].drop_duplicates(
+    ).reset_index(drop=True)
+    onedalao_ana_df.insert(
+        loc=2, column="swap_tokenadd_dexurl", value="")
+    onedalao_ana_df['swap_tokenadd_dexurl'] = onedalao_ana_df.apply(
+        lambda row: makeDexurl(row, dalao_address), axis=1)
+    # 如果outoken超了,earn_main_noaddouttoken 的值有两种处理方式
+    # 一种设置为0 即为不亏不赚
+    # 一种为全负  即为全亏了
+    onedalao_ana_df["earn_main_noaddouttoken"] = onedalao_ana_df.apply(
+        lambda row: calucate_earnmain_dropoutoken(row), axis=1)
+
+    dropfirsttime_df = dropfirsttime_df[onedalao_ana_columns].drop_duplicates(
+    ).reset_index(drop=True)
+
+    get_analyres(df=onedalao_ana_df, dalao_address=dalao_address,
+                 now_unix_time=now_unix_time, dropfirsttime_df=dropfirsttime_df)
+
+    onedalao_ana_df = calute_days(
+        df=onedalao_ana_df, now_unix_time=now_unix_time)
+    onedalao_ana_df['TokenFirstTime'] = pd.to_datetime(
+        onedalao_ana_df['TokenFirstTime'], unit='s')
+
+    handle_onedalao_ana_df = onedalao_ana_df[onedalao_ana_df['cost_main'] != 0].reset_index(
+        drop=True)
+
+    baseclass.makedirpath(baseclass.new_dalao_ana_fm_path / dalao_address)
+
+    onedalao_ana_df.to_csv(baseclass.new_dalao_ana_fm_path /
+                           dalao_address/f"new_analysisprofit_{dalao_address}.csv", index=False)
+    handle_onedalao_ana_df.to_csv(baseclass.new_dalao_ana_fm_path /
+                                  dalao_address/f"new_analysisprofit_handle_{dalao_address}.csv", index=False)
+
+
+def save_total_ana_df():
+    global TotalAnalysis_list
+    TotalAnalysis_df = pd.DataFrame(
+        data=TotalAnalysis_list, columns=TotalAnalysis_columns
+    )
+
+    TotalAnalysis_df = TotalAnalysis_df.round(4)
+    TotalAnalysis_df = TotalAnalysis_df.sort_values(by=["add"], ascending=[
+        True]).reset_index(drop=True)
+
+    TotalAnalysis_df.to_excel(
+        baseclass.dalao_total_ana_fm_path/f"totalana_anaing_dalao.xlsx", index=False)
+
+
+def get_firsttimestamp(gdf):
+    gdf["TokenFirstTime"] = gdf["timestamp"].min()
+    return gdf
+
+
+def get_dropfirsttimestamp_df(gdf):
+    gdf = gdf[gdf["dalaofirsttimestamp"] > gdf["dalaofirsttimestamp"].min()]
+    return gdf
+
+
+batchSize = 5
+TotalAnalysis_list = []
+now_unix_time = int(time.time())
+
+# 读取 total_dalao_profit_df 转换为 totalana_anaing_dalao
+df = pd.read_excel(baseclass.dalao_total_ana_fm_path /
+                   f"total_dalao_profit_df.xlsx", dtype=object)
+
+df['datetime'] = pd.to_datetime(
+    df['datetime'])
+
+df['dalaofirsttimestamp'] = pd.to_datetime(
+    df['dalaofirsttimestamp'])
+
+df = df.astype({
+    'timestamp': int,
+    'buy_counts': int,
+    'sell_counts': int,
+    'swap_eth_amount': float,
+    'outtoken_per': float,
+    'cost_main': float,
+    'fir_cost_main':float,
+    'earn_main': float,
+    'earn_percent': float,
+    'mine_earn':float,
+    'mine_fir_earn':float,
+})
+
+
+# df = df[(df["outtoken_per"] <= 1.1)].reset_index(drop=True)
+df = df[df['cost_main'] != 0].reset_index(drop=True)
+df = df[df['fir_cost_main'] != 0].reset_index(drop=True)
+ 
+
+df["TokenFirstTime"] = None
+df = df.groupby(['swap_tokenaddress', 'dalaoaddress']).apply(
+    lambda gdf: get_firsttimestamp(gdf)).reset_index(drop=True)
+
+
+dropfirsttime_df = df.groupby(['swap_tokenaddress']).apply(
+    lambda gdf: get_dropfirsttimestamp_df(gdf)).reset_index(drop=True)
+
+dropfirsttime_df = dropfirsttime_df.sort_values(
+    by=['swap_tokenaddress', 'dalaofirsttimestamp', 'dalaoaddress', 'timestamp'])
+
+
+arr_str_dalao = df["dalaoaddress"].drop_duplicates().tolist()
+print(f"arr_str_dalao len= {len(arr_str_dalao)}")
+for str_dalao_address in arr_str_dalao:
+    cur_df = df[df["dalaoaddress"] == str_dalao_address].reset_index(drop=True)
+    cur_dropfirsttime_df = dropfirsttime_df[dropfirsttime_df["dalaoaddress"]
+                                            == str_dalao_address].reset_index(drop=True)
+    new_get_ana_df(dalao_address=str_dalao_address, df=cur_df,
+                   dropfirsttime_df=cur_dropfirsttime_df)
+
+
+save_total_ana_df()
+
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 78 - 0
src/code/011_02_get_increase_totalana_anaing_dalao.py

@@ -0,0 +1,78 @@
+# 对 total_anaing_dalao 进行筛选  获取递增的
+
+
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+
+
+baseclass.makedirpath(baseclass.new_dalao_ana_fm_path)
+
+baseclass.open_base_library()
+decimal.getcontext().prec = 100
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+totalana_anaing_dalao_df = pd.read_excel(
+    baseclass.dalao_total_ana_fm_path/f"totalana_anaing_dalao.xlsx", dtype=object )
+
+ 
+ 
+totalana_anaing_dalao_df = totalana_anaing_dalao_df.astype({
+ 
+    '03d_mine_fir_earn_sum':float,
+    '07d_mine_fir_earn_sum':float,
+    '11d_mine_fir_earn_sum':float,
+    '15d_mine_fir_earn_sum':float,
+
+    '03d_mine_fir_earn_sum_dropmax':float,
+    '07d_mine_fir_earn_sum_dropmax':float,
+    '11d_mine_fir_earn_sum_dropmax':float,
+    '15d_mine_fir_earn_sum_dropmax':float,
+
+   '03d_mine_fir_earn_sum_dropfirsttimetx':float,
+    '07d_mine_fir_earn_sum_dropfirsttimetx':float,
+    '11d_mine_fir_earn_sum_dropfirsttimetx':float,
+    '15d_mine_fir_earn_sum_dropfirsttimetx':float,
+})
+
+mine_fir_earn_sum_filter_mask = (
+    (totalana_anaing_dalao_df["15d_mine_fir_earn_sum"] >=
+        0.8*totalana_anaing_dalao_df["11d_mine_fir_earn_sum"])
+    & (totalana_anaing_dalao_df["11d_mine_fir_earn_sum"] >= 0.8*totalana_anaing_dalao_df["07d_mine_fir_earn_sum"])
+ & (totalana_anaing_dalao_df["07d_mine_fir_earn_sum"] >= 0.8*totalana_anaing_dalao_df["03d_mine_fir_earn_sum"])
+)
+
+mine_fir_earn_sum_dropmax_filter_mask = (
+    (totalana_anaing_dalao_df["15d_mine_fir_earn_sum_dropmax"] >=
+        0.8*totalana_anaing_dalao_df["11d_mine_fir_earn_sum_dropmax"])
+    & (totalana_anaing_dalao_df["11d_mine_fir_earn_sum_dropmax"] >= 0.8*totalana_anaing_dalao_df["07d_mine_fir_earn_sum_dropmax"])
+ & (totalana_anaing_dalao_df["07d_mine_fir_earn_sum_dropmax"] >= 0.8*totalana_anaing_dalao_df["03d_mine_fir_earn_sum_dropmax"])
+)
+mine_fir_earn_sum_dropfirsttimetx_filter_mask = (
+    (totalana_anaing_dalao_df["15d_mine_fir_earn_sum_dropfirsttimetx"] >=
+        0.8*totalana_anaing_dalao_df["11d_mine_fir_earn_sum_dropfirsttimetx"])
+    & (totalana_anaing_dalao_df["11d_mine_fir_earn_sum_dropfirsttimetx"] >= 0.8*totalana_anaing_dalao_df["07d_mine_fir_earn_sum_dropfirsttimetx"])
+ & (totalana_anaing_dalao_df["07d_mine_fir_earn_sum_dropfirsttimetx"] >= 0.8*totalana_anaing_dalao_df["03d_mine_fir_earn_sum_dropfirsttimetx"])
+)
+filter_mask = (
+    mine_fir_earn_sum_filter_mask
+    | mine_fir_earn_sum_dropmax_filter_mask
+    | mine_fir_earn_sum_dropfirsttimetx_filter_mask
+)
+increase_totalana_anaing_dalao_df = totalana_anaing_dalao_df[   filter_mask ].reset_index(
+    drop=True)
+increase_totalana_anaing_dalao_df.to_excel(
+    baseclass.dalao_total_ana_fm_path/f"increase_totalana_anaing_dalao.xlsx", index=False)
+
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 359 - 0
src/code/011_nouse_3dalao_new_get_profit_st_solanafm.py

@@ -0,0 +1,359 @@
+ # 去除前两次购买
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+
+
+baseclass.makedirpath(baseclass.new_dalao_ana_fm_path)
+
+baseclass.open_base_library()
+decimal.getcontext().prec = 100
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+
+TotalAnalysis_columns = [
+    "add",
+    # "whichcontract",
+    "beizhu",
+
+
+    "03d_cost_noaddouttoken",
+    "03d_earn_noaddouttoken",
+    "03d_earnper_noaddouttoken",
+
+    "03d_cost_dropfirsttimetx", "03d_earn_dropfirsttimetx", "03d_earnper_dropfirsttimetx",
+
+    # "03d_difcost_noaddouttoken",
+    # "03d_difearn_noaddouttoken",
+    # "03d_difper_noaddouttoken",
+    "03d_trans",
+
+
+
+    "07d_cost_noaddouttoken",
+    "07d_earn_noaddouttoken",
+    "07d_earnper_noaddouttoken",
+    "07d_cost_dropfirsttimetx", "07d_earn_dropfirsttimetx", "07d_earnper_dropfirsttimetx",
+
+    # "07d_difcost_noaddouttoken",
+    # "07d_difearn_noaddouttoken",
+    # "07d_difper_noaddouttoken",
+    "07d_trans",
+
+
+
+    "11d_cost_noaddouttoken",
+    "11d_earn_noaddouttoken",
+    "11d_earnper_noaddouttoken",
+    "11d_cost_dropfirsttimetx", "11d_earn_dropfirsttimetx", "11d_earnper_dropfirsttimetx",
+
+    # "11d_difcost_noaddouttoken",
+    # "11d_difearn_noaddouttoken",
+    # "11d_difper_noaddouttoken",
+    "11d_trans",
+
+
+
+    "15d_cost_noaddouttoken",
+    "15d_earn_noaddouttoken",
+    "15d_earnper_noaddouttoken",
+    "15d_cost_dropfirsttimetx", "15d_earn_dropfirsttimetx", "15d_earnper_dropfirsttimetx",
+    # "15d_difcost_noaddouttoken",
+    # "15d_difearn_noaddouttoken",
+    # "15d_difper_noaddouttoken",
+    "15d_trans",
+
+    "15dearn_dif",
+    "15dtxs_dif"
+]
+
+
+onedalao_ana_columns = ['TokenFirstTime', 'swap_tokenaddress',  'buy_counts', 'sell_counts',
+                        'outtoken_per', 'cost_main', 'earn_main', 'earn_percent']
+
+
+def analysis_lastdays_dropfisttimetx(df, now_unix_time, intervaldays=30):
+
+    if len(df) == 0:
+        return 0, 0, 0, 0, 0, 0,  0, 0, 0
+
+    # need consider df may null if use iloc
+    lastdf = df[df["TokenFirstTime"] >= now_unix_time - 3600*24*intervaldays]
+    # 去除那些earnper为-10的
+    lastdf = lastdf[lastdf['cost_main'] != 0]
+    # 去除 cost_main 过小的 <0.04  sol 理论上 同时fir_cost_main!=0
+    lastdf = lastdf[lastdf['cost_main'] >= 0.04] 
+    lastdf = lastdf[lastdf['fir_cost_main'] != 0]
+    lastdf = lastdf.reset_index(drop=True)
+    if len(lastdf) == 0:
+        return 0, 0, 0, 0, 0, 0, 0,  0, 0
+    last_cost_sum = lastdf['cost_main'].sum()
+    last_earn_sum = lastdf['earn_main'].sum()
+    last_cost_median = lastdf['cost_main'].median()
+    last_cost_mean = lastdf['cost_main'].mean()
+    last_earnper = last_earn_sum / last_cost_sum if last_cost_sum != 0 else -10
+    last_trans_amount = len(lastdf)
+    lastdf['earn_percent'] = np.where(
+        lastdf['cost_main'] != 0,
+        lastdf['earn_main'] / lastdf['cost_main'],
+        -10,
+    )
+    # last_earncount_per = (len(lastdf[(
+    #     lastdf['earn_percent'] >= 0.05)]) / len(lastdf) if len(lastdf) != 0 else 0)
+    earnmain_max = lastdf['earn_main'].max()
+    last_earn_difmax_sum = last_earn_sum - earnmain_max
+    last_cost_difmax_sum = last_cost_sum - \
+        lastdf[lastdf['earn_main'] == earnmain_max]['cost_main'].to_list()[0]
+    last_dif_earnper = (
+        last_earn_difmax_sum / last_cost_difmax_sum if last_cost_difmax_sum != 0 else -10
+    )
+    return (
+        last_cost_sum,
+        last_earn_sum,
+        last_earnper,
+        last_cost_difmax_sum,
+        last_earn_difmax_sum,
+        last_dif_earnper,
+        last_cost_median,
+        last_cost_mean,
+        # last_earncount_per,
+        last_trans_amount
+    )
+
+
+def get_analyres(df,  dalao_address, now_unix_time, dropfirsttime_df):
+
+    # # 去除所有daxin
+    # df = df[df["isdaxin"] == "0"].reset_index(drop=True)
+    # df = df[]
+
+    (last_03d_cost_noaddouttoken, last_03d_earn_noaddouttoken, last_03d_earnper_noaddouttoken, last_03d_difcost_noaddouttoken, last_03d_difearn_noaddouttoken, last_03d_difper_noaddouttoken, last_03d_costmedian_noaddouttoken, last_03d_costmean_noaddouttoken, last_03d_trans) = baseclass.analysis_lastdays_noaddouttoken(
+        df, now_unix_time=now_unix_time, intervaldays=3
+    )
+    (last_07d_cost_noaddouttoken, last_07d_earn_noaddouttoken, last_07d_earnper_noaddouttoken, last_07d_difcost_noaddouttoken, last_07d_difearn_noaddouttoken, last_07d_difper_noaddouttoken, last_07d_costmedian_noaddouttoken, last_07d_costmean_noaddouttoken, last_07d_trans) = baseclass.analysis_lastdays_noaddouttoken(
+        df, now_unix_time=now_unix_time, intervaldays=7
+    )
+    (last_11d_cost_noaddouttoken, last_11d_earn_noaddouttoken, last_11d_earnper_noaddouttoken, last_11d_difcost_noaddouttoken, last_11d_difearn_noaddouttoken, last_11d_difper_noaddouttoken, last_11d_costmedian_noaddouttoken, last_11d_costmean_noaddouttoken, last_11d_trans) = baseclass.analysis_lastdays_noaddouttoken(
+        df, now_unix_time=now_unix_time, intervaldays=11
+    )
+    (last_15d_cost_noaddouttoken, last_15d_earn_noaddouttoken, last_15d_earnper_noaddouttoken, last_15d_difcost_noaddouttoken, last_15d_difearn_noaddouttoken, last_15d_difper_noaddouttoken, last_15d_costmedian_noaddouttoken, last_15d_costmean_noaddouttoken, last_15d_trans) = baseclass.analysis_lastdays_noaddouttoken(
+        df, now_unix_time=now_unix_time, intervaldays=15
+    )
+    (last_03d_cost_dropfirsttimetx, last_03d_earn_dropfirsttimetx, last_03d_earnper_dropfirsttimetx, last_03d_difcost_dropfirsttimetx, last_03d_difearn_dropfirsttimetx, last_03d_difper_dropfirsttimetx, last_03d_costmedian_dropfirsttimetx, last_03d_costmean_dropfirsttimetx, last_03d_trans_dropfirsttimetx) = analysis_lastdays_dropfisttimetx(
+        df=dropfirsttime_df, now_unix_time=now_unix_time, intervaldays=3
+    )
+    (last_07d_cost_dropfirsttimetx, last_07d_earn_dropfirsttimetx, last_07d_earnper_dropfirsttimetx, last_07d_difcost_dropfirsttimetx, last_07d_difearn_dropfirsttimetx, last_07d_difper_dropfirsttimetx, last_07d_costmedian_dropfirsttimetx, last_07d_costmean_dropfirsttimetx,    last_07d_trans_dropfirsttimetx) = analysis_lastdays_dropfisttimetx(
+        df=dropfirsttime_df, now_unix_time=now_unix_time, intervaldays=7
+    )
+    (last_11d_cost_dropfirsttimetx, last_11d_earn_dropfirsttimetx, last_11d_earnper_dropfirsttimetx, last_11d_difcost_dropfirsttimetx, last_11d_difearn_dropfirsttimetx, last_11d_difper_dropfirsttimetx, last_11d_costmedian_dropfirsttimetx, last_11d_costmean_dropfirsttimetx, last_11d_trans_dropfirsttimetx) = analysis_lastdays_dropfisttimetx(
+        df=dropfirsttime_df, now_unix_time=now_unix_time, intervaldays=11
+    )
+    (last_15d_cost_dropfirsttimetx, last_15d_earn_dropfirsttimetx, last_15d_earnper_dropfirsttimetx, last_15d_difcost_dropfirsttimetx, last_15d_difearn_dropfirsttimetx, last_15d_difper_dropfirsttimetx, last_15d_costmedian_dropfirsttimetx, last_15d_costmean_dropfirsttimetx, last_15d_trans_dropfirsttimetx) = analysis_lastdays_dropfisttimetx(
+        df=dropfirsttime_df, now_unix_time=now_unix_time, intervaldays=15
+    )
+
+    analist = [
+        dalao_address,
+        "",
+        last_03d_cost_noaddouttoken,
+        last_03d_earn_noaddouttoken,
+        last_03d_earnper_noaddouttoken,
+        last_03d_cost_dropfirsttimetx, last_03d_earn_dropfirsttimetx, last_03d_earnper_dropfirsttimetx,
+        # last_03d_difcost_noaddouttoken,
+        # last_03d_difearn_noaddouttoken,
+        # last_03d_difper_noaddouttoken,
+        last_03d_trans_dropfirsttimetx,
+
+
+
+        last_07d_cost_noaddouttoken,
+        last_07d_earn_noaddouttoken,
+        last_07d_earnper_noaddouttoken,
+        last_07d_cost_dropfirsttimetx, last_07d_earn_dropfirsttimetx, last_07d_earnper_dropfirsttimetx,
+        # last_07d_difcost_noaddouttoken,
+        # last_07d_difearn_noaddouttoken,
+        # last_07d_difper_noaddouttoken,
+        last_07d_trans_dropfirsttimetx,
+
+
+        last_11d_cost_noaddouttoken,
+        last_11d_earn_noaddouttoken,
+        last_11d_earnper_noaddouttoken,
+        last_11d_cost_dropfirsttimetx, last_11d_earn_dropfirsttimetx, last_11d_earnper_dropfirsttimetx,
+        # last_11d_difcost_noaddouttoken,
+        # last_11d_difearn_noaddouttoken,
+        # last_11d_difper_noaddouttoken,
+        last_11d_trans_dropfirsttimetx,
+
+
+        last_15d_cost_noaddouttoken,
+        last_15d_earn_noaddouttoken,
+        last_15d_earnper_noaddouttoken,
+        last_15d_cost_dropfirsttimetx, last_15d_earn_dropfirsttimetx, last_15d_earnper_dropfirsttimetx,
+        # last_15d_difcost_noaddouttoken,
+        # last_15d_difearn_noaddouttoken,
+        # last_15d_difper_noaddouttoken,
+        last_15d_trans_dropfirsttimetx,
+
+        last_15d_cost_noaddouttoken-last_15d_cost_dropfirsttimetx,
+        last_15d_trans-last_15d_trans_dropfirsttimetx
+
+    ]
+
+    global TotalAnalysis_list
+    TotalAnalysis_list.append(analist)
+
+
+def calute_days(df, now_unix_time):
+    df["diffdays"] = 0
+    intervaldays_list = [15, 11, 7, 3]
+    for intervaldays in intervaldays_list:
+        df.loc[df["TokenFirstTime"] >=
+               now_unix_time - 3600*24*intervaldays, "diffdays"] = intervaldays
+    return df
+
+
+def calucate_earnmain_dropoutoken(row):
+    earnmain_amount_dropoutoken = decimal.Decimal(row['earn_main'])
+    outtoken_per = decimal.Decimal(row["outtoken_per"])
+    if outtoken_per >= 1.1 or outtoken_per == -10:
+        earnmain_amount_dropoutoken = decimal.Decimal(0)
+    earnmain_amount_dropoutoken_str = '{0:.4f}'.format(
+        earnmain_amount_dropoutoken)
+    return float(earnmain_amount_dropoutoken_str)
+
+
+def makeDexurl(row, dalao_address):
+    tokenAddress = row['swap_tokenaddress']
+    urlname = f"https://dexscreener.com/solana/{tokenAddress}?maker={dalao_address}"
+    return '=HYPERLINK("{}","{}")'.format(urlname, "DEX/"+tokenAddress)
+
+
+def new_get_ana_df(dalao_address, df, dropfirsttime_df):
+    onedalao_ana_df = df[onedalao_ana_columns].drop_duplicates(
+    ).reset_index(drop=True)
+
+    onedalao_ana_df.insert(
+        loc=2, column="swap_tokenadd_dexurl", value="")
+
+    onedalao_ana_df['swap_tokenadd_dexurl'] = onedalao_ana_df.apply(
+        lambda row: makeDexurl(row, dalao_address), axis=1)
+    # 如果outoken超了,earn_main_noaddouttoken 的值有两种处理方式
+    # 一种设置为0 即为不亏不赚
+    # 一种为全负  即为全亏了
+    onedalao_ana_df["earn_main_noaddouttoken"] = onedalao_ana_df.apply(
+        lambda row: calucate_earnmain_dropoutoken(row), axis=1)
+    now_unix_time = int(time.time())
+
+    dropfirsttime_df = dropfirsttime_df[onedalao_ana_columns].drop_duplicates(
+    ).reset_index(drop=True)
+
+    get_analyres(df=onedalao_ana_df, dalao_address=dalao_address,
+                 now_unix_time=now_unix_time, dropfirsttime_df=dropfirsttime_df)
+
+    onedalao_ana_df = calute_days(
+        df=onedalao_ana_df, now_unix_time=now_unix_time)
+    onedalao_ana_df['TokenFirstTime'] = pd.to_datetime(
+        onedalao_ana_df['TokenFirstTime'], unit='s')
+
+    handle_onedalao_ana_df = onedalao_ana_df[onedalao_ana_df['cost_main'] != 0].reset_index(
+        drop=True)
+
+    baseclass.makedirpath(baseclass.new_dalao_ana_fm_path / dalao_address)
+
+    onedalao_ana_df.to_csv(baseclass.new_dalao_ana_fm_path /
+                           dalao_address/f"new_analysisprofit_{dalao_address}.csv", index=False)
+    handle_onedalao_ana_df.to_csv(baseclass.new_dalao_ana_fm_path /
+                                  dalao_address/f"new_analysisprofit_handle_{dalao_address}.csv", index=False)
+
+
+def save_total_ana_df():
+    global TotalAnalysis_list
+    TotalAnalysis_df = pd.DataFrame(
+        data=TotalAnalysis_list, columns=TotalAnalysis_columns
+    )
+
+    TotalAnalysis_df = TotalAnalysis_df.round(4)
+    TotalAnalysis_df = TotalAnalysis_df.sort_values(by=["add"], ascending=[
+        True]).reset_index(drop=True)
+
+    TotalAnalysis_df.to_excel(
+        baseclass.dalao_total_ana_fm_path/f"totalana_anaing_dalao_3dalao.xlsx", index=False)
+
+
+batchSize = 5
+TotalAnalysis_list = []
+
+ 
+df = pd.read_excel(baseclass.dalao_total_ana_fm_path /
+                   f"total_dalao_profit_df_3dalao.xlsx", dtype=object)
+
+df['datetime'] = pd.to_datetime(
+    df['datetime'])
+
+df['dalaofirsttimestamp'] = pd.to_datetime(
+    df['dalaofirsttimestamp'])
+
+df = df.astype({
+    'timestamp': int,
+    'buy_counts': int,
+    'sell_counts': int,
+    'swap_eth_amount': float,
+    'outtoken_per': float,
+    'cost_main': float,
+    'earn_main': float,
+    'earn_percent': float
+})
+
+# df = df[(df["outtoken_per"] <= 1.1)].reset_index(drop=True)
+df = df[df['cost_main'] != 0].reset_index(drop=True)
+
+
+def get_firsttimestamp(gdf):
+    gdf["TokenFirstTime"] = gdf["timestamp"].min()
+    return gdf
+
+
+def get_droptime_0102time_df(gdf):
+    # 去除前两次购买
+    gdf = gdf[gdf["dalaofirsttimestamp"] > gdf["dalaofirsttimestamp"].min()]
+    gdf = gdf[gdf["dalaofirsttimestamp"] > gdf["dalaofirsttimestamp"].min()]
+    return gdf
+
+
+df["TokenFirstTime"] = None
+df = df.groupby(['swap_tokenaddress', 'dalaoaddress']).apply(
+    lambda gdf: get_firsttimestamp(gdf)).reset_index(drop=True)
+
+
+dropfirsttime_df = df.groupby(['swap_tokenaddress']).apply(
+    lambda gdf: get_droptime_0102time_df(gdf)).reset_index(drop=True)
+
+dropfirsttime_df = dropfirsttime_df.sort_values(
+    by=['swap_tokenaddress', 'dalaofirsttimestamp', 'dalaoaddress', 'timestamp'])
+
+
+arr_str_dalao = df["dalaoaddress"].drop_duplicates().tolist()
+print(f"arr_str_dalao len= {len(arr_str_dalao)}")
+for str_dalao_address in arr_str_dalao:
+    cur_df = df[df["dalaoaddress"] == str_dalao_address].reset_index(drop=True)
+    cur_dropfirsttime_df = dropfirsttime_df[dropfirsttime_df["dalaoaddress"]
+                                            == str_dalao_address].reset_index(drop=True)
+    new_get_ana_df(dalao_address=str_dalao_address, df=cur_df,
+                   dropfirsttime_df=cur_dropfirsttime_df)
+
+
+save_total_ana_df()
+
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 156 - 0
src/code/012_new_3dalao_get_onetoken_profit.py

@@ -0,0 +1,156 @@
+
+# 去除每个token的前两次购买 计算利润
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+
+
+baseclass.makedirpath(baseclass.new_dalao_ana_fm_path)
+
+baseclass.open_base_library()
+decimal.getcontext().prec = 100
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+
+batchSize = 5
+token_TotalAnalysis_list = []
+
+token_TotalAnalysis_list_columns = [
+    "tokenadd",
+
+    "beizhu",
+
+    "cost_main",
+    "earn_main",
+    "earn_percent",
+    "nofir_cost_main",
+    "nofir_earn_main",
+    "nofir_earn_percent",
+    "dalao_counts",
+    "dalaofirsttimestamp",
+
+
+]
+
+
+df = pd.read_excel(baseclass.dalao_total_ana_fm_path /
+                   f"total_dalao_profit_df_3dalao.xlsx", dtype=object)
+df['datetime'] = pd.to_datetime(
+    df['datetime'])
+
+df = df.astype({
+    'buy_counts': int,
+    'sell_counts': int,
+    'swap_eth_amount': float,
+    'outtoken_per': float,
+    'cost_main': float,
+    'earn_main': float,
+    'earn_percent': float
+})
+
+# df = df[df["outtoken_per"] <= 1.1].reset_index(drop=True)
+df = df[df['cost_main'] != 0].reset_index(drop=True)
+
+
+def get_droptime_0102time_df(gdf):
+    # 去除前两次购买
+    gdf = gdf[gdf["dalaofirsttimestamp"] > gdf["dalaofirsttimestamp"].min()]
+    gdf = gdf[gdf["dalaofirsttimestamp"] > gdf["dalaofirsttimestamp"].min()]
+    return gdf
+
+
+dropfirsttime_df = df.groupby(['swap_tokenaddress']).apply(
+    lambda gdf: get_droptime_0102time_df(gdf)).reset_index(drop=True)
+
+dropfirsttime_df = dropfirsttime_df.sort_values(
+    by=['swap_tokenaddress', 'dalaofirsttimestamp', 'dalaoaddress', 'timestamp'])
+
+# TotalAnalysis_list.append(analist)
+# ["cost_main",	"earn_main", "earn_percent",	"dalaoaddress", "dalaofirsttimestamp"]
+
+df = df[["swap_tokenaddress", "cost_main",	"earn_main", "earn_percent",	"dalaoaddress",
+         "dalaofirsttimestamp"]].drop_duplicates().reset_index(drop=True)
+
+dropfirsttime_df = dropfirsttime_df[["swap_tokenaddress", "cost_main",	"earn_main", "earn_percent",
+                                     "dalaoaddress", "dalaofirsttimestamp"]].drop_duplicates().reset_index(drop=True)
+
+
+arr_str_tokenaddress = df["swap_tokenaddress"].drop_duplicates().tolist()
+
+print(f"arr_str_tokenaddress len= {len(arr_str_tokenaddress)}")
+# obj_repeattoken_2_arrdalao = {
+
+# }
+for str_tokenaddress in arr_str_tokenaddress:
+    cur_df = df[df["swap_tokenaddress"] ==
+                str_tokenaddress].reset_index(drop=True)
+    cur_dropfirsttime_df = dropfirsttime_df[dropfirsttime_df["swap_tokenaddress"]
+                                            == str_tokenaddress].reset_index(drop=True)
+    number_dalao_counts = len(cur_df)
+
+    # obj_repeattoken_2_arrdalao[str_tokenaddress] = cur_df["dalaoaddress"].drop_duplicates(
+    # ).tolist()
+
+    number_sum_cost_main = cur_df["cost_main"].sum()
+    number_sum_earn_main = cur_df["earn_main"].sum()
+    number_earn_percent = number_sum_earn_main/number_sum_cost_main
+    number_dalaofirsttimestamp = cur_df["dalaofirsttimestamp"].min()
+
+    number_sum_nofir_cost_main = cur_dropfirsttime_df["cost_main"].sum()
+    number_sum_nofir_earn_main = cur_dropfirsttime_df["earn_main"].sum()
+    # 理论上肯定会有一个dalao的交易记录 不会出现number_sum_nofir_cost_main=0
+    # 但是如果多个dalao在都是firsttime 购买了 就可能出现 number_sum_nofir_cost_main=0
+    number_nofir_earn_percent = number_sum_nofir_earn_main/number_sum_nofir_cost_main
+
+    cur_arr_ana = [
+        str_tokenaddress,
+        "",
+        number_sum_cost_main,
+        number_sum_earn_main,
+        number_earn_percent,
+        number_sum_nofir_cost_main,
+        number_sum_nofir_earn_main,
+        number_nofir_earn_percent,
+        number_dalao_counts,
+        number_dalaofirsttimestamp
+    ]
+    token_TotalAnalysis_list.append(cur_arr_ana)
+
+
+token_TotalAnalysis_df = pd.DataFrame(
+    data=token_TotalAnalysis_list, columns=token_TotalAnalysis_list_columns
+)
+
+token_TotalAnalysis_df = token_TotalAnalysis_df.round(4)
+token_TotalAnalysis_df = token_TotalAnalysis_df.sort_values(by=["tokenadd"], ascending=[
+    True]).reset_index(drop=True)
+
+
+def makescreenurl(urlname, urlparam):
+    # pairAddress = series[address_str]
+    urlname = urlname + urlparam
+    return '=HYPERLINK("{}","{}")'.format(urlname, urlname)
+
+
+token_TotalAnalysis_df.insert(
+    loc=2, column="DexScreenURL", value="")
+
+token_TotalAnalysis_df['DexScreenURL'] = token_TotalAnalysis_df.apply(lambda ser: makescreenurl(
+    "https://dexscreener.com/solana/", f"{ser['tokenadd']}"), axis=1)
+
+
+token_TotalAnalysis_df.to_excel(
+    baseclass.dalao_total_ana_fm_path/f"token_TotalAnalysis_3dalao.xlsx", index=False)
+
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 154 - 0
src/code/012_new_get_onetoken_profit.py

@@ -0,0 +1,154 @@
+
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+
+
+baseclass.makedirpath(baseclass.new_dalao_ana_fm_path)
+
+baseclass.open_base_library()
+decimal.getcontext().prec = 100
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+
+batchSize = 5
+token_TotalAnalysis_list = []
+
+token_TotalAnalysis_list_columns = [
+    "tokenadd",
+
+    "beizhu",
+
+    "cost_main",
+    "earn_main",
+    "earn_percent",
+    "nofir_cost_main",
+    "nofir_earn_main",
+    "nofir_earn_percent",
+    "dalao_counts",
+    "dalaofirsttimestamp",
+
+
+]
+
+
+df = pd.read_excel(baseclass.dalao_total_ana_fm_path /
+                   f"total_dalao_profit_df.xlsx", dtype=object)
+df['datetime'] = pd.to_datetime(
+    df['datetime'])
+
+df = df.astype({
+    'buy_counts': int,
+    'sell_counts': int,
+    'swap_eth_amount': float,
+    'outtoken_per': float,
+    'cost_main': float,
+    'earn_main': float,
+    'earn_percent': float
+})
+
+# df = df[df["outtoken_per"] <= 1.1].reset_index(drop=True)
+df = df[df['cost_main'] != 0].reset_index(drop=True)
+
+
+def get_dropfirsttimestamp_df(gdf):
+
+    gdf = gdf[gdf["dalaofirsttimestamp"] > gdf["dalaofirsttimestamp"].min()]
+    return gdf
+
+
+dropfirsttime_df = df.groupby(['swap_tokenaddress']).apply(
+    lambda gdf: get_dropfirsttimestamp_df(gdf)).reset_index(drop=True)
+
+dropfirsttime_df = dropfirsttime_df.sort_values(
+    by=['swap_tokenaddress', 'dalaofirsttimestamp', 'dalaoaddress', 'timestamp'])
+
+# TotalAnalysis_list.append(analist)
+# ["cost_main",	"earn_main", "earn_percent",	"dalaoaddress", "dalaofirsttimestamp"]
+
+df = df[["swap_tokenaddress", "cost_main",	"earn_main", "earn_percent",	"dalaoaddress",
+         "dalaofirsttimestamp"]].drop_duplicates().reset_index(drop=True)
+
+dropfirsttime_df = dropfirsttime_df[["swap_tokenaddress", "cost_main",	"earn_main", "earn_percent",
+                                     "dalaoaddress", "dalaofirsttimestamp"]].drop_duplicates().reset_index(drop=True)
+
+
+arr_str_tokenaddress = df["swap_tokenaddress"].drop_duplicates().tolist()
+
+print(f"arr_str_tokenaddress len= {len(arr_str_tokenaddress)}")
+# obj_repeattoken_2_arrdalao = {
+
+# }
+for str_tokenaddress in arr_str_tokenaddress:
+    cur_df = df[df["swap_tokenaddress"] ==
+                str_tokenaddress].reset_index(drop=True)
+    cur_dropfirsttime_df = dropfirsttime_df[dropfirsttime_df["swap_tokenaddress"]
+                                            == str_tokenaddress].reset_index(drop=True)
+    number_dalao_counts = len(cur_df)
+
+    # obj_repeattoken_2_arrdalao[str_tokenaddress] = cur_df["dalaoaddress"].drop_duplicates(
+    # ).tolist()
+
+    number_sum_cost_main = cur_df["cost_main"].sum()
+    number_sum_earn_main = cur_df["earn_main"].sum()
+    number_earn_percent = number_sum_earn_main/number_sum_cost_main
+    number_dalaofirsttimestamp = cur_df["dalaofirsttimestamp"].min()
+
+    number_sum_nofir_cost_main = cur_dropfirsttime_df["cost_main"].sum()
+    number_sum_nofir_earn_main = cur_dropfirsttime_df["earn_main"].sum()
+    # 理论上肯定会有一个dalao的交易记录 不会出现number_sum_nofir_cost_main=0
+    # 但是如果多个dalao在都是firsttime 购买了 就可能出现 number_sum_nofir_cost_main=0
+    number_nofir_earn_percent = number_sum_nofir_earn_main/number_sum_nofir_cost_main
+
+    cur_arr_ana = [
+        str_tokenaddress,
+        "",
+        number_sum_cost_main,
+        number_sum_earn_main,
+        number_earn_percent,
+        number_sum_nofir_cost_main,
+        number_sum_nofir_earn_main,
+        number_nofir_earn_percent,
+        number_dalao_counts,
+        number_dalaofirsttimestamp
+    ]
+    token_TotalAnalysis_list.append(cur_arr_ana)
+
+
+token_TotalAnalysis_df = pd.DataFrame(
+    data=token_TotalAnalysis_list, columns=token_TotalAnalysis_list_columns
+)
+
+token_TotalAnalysis_df = token_TotalAnalysis_df.round(4)
+token_TotalAnalysis_df = token_TotalAnalysis_df.sort_values(by=["tokenadd"], ascending=[
+    True]).reset_index(drop=True)
+
+
+def makescreenurl(urlname, urlparam):
+    # pairAddress = series[address_str]
+    urlname = urlname + urlparam
+    return '=HYPERLINK("{}","{}")'.format(urlname, urlname)
+
+
+token_TotalAnalysis_df.insert(
+    loc=2, column="DexScreenURL", value="")
+
+token_TotalAnalysis_df['DexScreenURL'] = token_TotalAnalysis_df.apply(lambda ser: makescreenurl(
+    "https://dexscreener.com/solana/", f"{ser['tokenadd']}"), axis=1)
+
+
+token_TotalAnalysis_df.to_excel(
+    baseclass.dalao_total_ana_fm_path/f"token_TotalAnalysis.xlsx", index=False)
+
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 121 - 0
src/code/021_01_selected_get_tokentransfer_txhash_bysolscan_playwright.py

@@ -0,0 +1,121 @@
+
+# from datetime import datetime, timezone
+# from playwright.async_api import async_playwright, Playwright
+# from playwright.sync_api import expect
+from playwright.async_api import Playwright, async_playwright, expect
+import random
+
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+
+baseclass.makedirpath(baseclass.browsercookie_path)
+baseclass.makedirpath(baseclass.dalao_ori_tran_txhash_solscan_path)
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+# Python中windows路径的3种写法
+# 可以是以下这样写:
+utc_timeto = int(time.time())
+utc_timefrom = int(utc_timeto - 17*24*3600)
+utc_timeto = int(utc_timeto + 2*24*3600)
+
+def get_dalao_historysign_solscan(df):
+
+    utc_timeto = int(time.time())
+    utc_timefrom = int(utc_timeto - 17*24*3600)
+    utc_timeto = int(utc_timeto + 2*24*3600)
+    # 示例   https://api.solscan.io/v2/account/txs/export?address=2D4dLL47vA1k1EN4421aM9DzKp3VBDAqKj8iUTSBLktw&type=tokenchange&timefrom=1711900800&timeto=1714492799.999&account_type=account_main
+        # https://api-v2.solscan.io/v2/account/transfer/export?address=5bTgWQQE5Tb34BQQtUArj62PmFcVsaht2SGotAdq5fbt&activity_type[]=ACTIVITY_SPL_TRANSFER
+    # https://api-v2.solscan.io/v2/account/balance_change/export?address=Cft4hKtC3dVftfqmL2MCALpeCq7oWM7qpftNfVVUzA7h&time_from=1719763200&time_to=1721051816.123&account_type=account_main
+    
+    df['SolscanTransferUrl'] = df.apply(lambda ser: (
+        f"https://api-v2.solscan.io/v2/account/balance_change/export?address={ser['dalaoAddress']}&time_from={utc_timefrom}&time_to={utc_timeto}&account_type=account_main"), axis=1)
+
+    
+    return df
+
+
+async def do_some_thing(playwright, cur_arr_str_dalaoAddress, cur_arr_str_dalaoSwapUrl):
+
+    # browser =  playwright.chromium.launch(headless=True)
+    context = await playwright.chromium.launch_persistent_context(user_data_dir=USER_DIR_PATH, accept_downloads=True, headless=True)
+    # context = browser.new_context()
+    context.set_default_timeout(9000)
+    # context = await browser.new_context()
+    arr_page = [None]*2
+    arr_page[0] = await context .new_page()
+    await arr_page[0].goto(
+        "https://solscan.io/")
+
+    print(context .pages)
+
+    for str_dalaoAddress_idx in range(0, len(cur_arr_str_dalaoAddress)):
+
+        str_dalaoAddress = arr_str_dalaoAddress[str_dalaoAddress_idx]
+        str_dalaoTransferUrl = arr_str_dalaoSwapUrl[str_dalaoAddress_idx]
+        print(f"enter str_dalaoAddress= {str_dalaoAddress}")
+        print(f"enter str_dalaoTransferUrl= {str_dalaoTransferUrl}")
+        print(f"cur_arr_str_dalaoAddress remainder = {len(cur_arr_str_dalaoAddress)-str_dalaoAddress_idx}")
+        arr_page[1] = await context.new_page()
+        page = arr_page[1]
+
+        async with page.expect_download() as download_info:
+            try:
+                await page.goto(str_dalaoTransferUrl, timeout=0)
+            except:
+                # Wait for the download to start
+                download = await download_info.value
+                # Wait for the download process to complete
+                print(await download.path())
+                # Save downloaded file somewhere
+                await download.save_as(baseclass.dalao_ori_tran_txhash_solscan_path / f"ori_txhash_{str_dalaoAddress}.csv")
+            await page.wait_for_timeout(200)
+        time.sleep(0.5)
+        await page.close()
+
+    await context.close()
+
+
+async def get_onedriver_swapactivities(cur_arr_str_dalaoAddress, cur_arr_str_dalaoSwapUrl):
+    async with async_playwright() as playwright:
+        # playwright = Playwright().start()
+
+        await do_some_thing(playwright, cur_arr_str_dalaoAddress,
+                            cur_arr_str_dalaoSwapUrl)
+
+
+async def main():
+    print("enter main()")
+
+    await get_onedriver_swapactivities(
+        cur_arr_str_dalaoAddress=arr_str_dalaoAddress, cur_arr_str_dalaoSwapUrl=arr_str_dalaoSwapUrl)
+
+
+utc_timeto = int(time.time())
+utc_timefrom = int(utc_timeto - 17*24*3600)
+utc_timeto = int(utc_timeto + 2*24*3600)
+df = pd.read_excel(baseclass.dalao_total_ana_fm_path /
+                 "anaing_dalao.xlsx", dtype=object)
+
+arr_str_dalaoAddress = df['add'].tolist()
+arr_str_dalaoAddress.append(baseclass.mywalletaddress)
+
+arr_str_dalaoSwapUrl = [ f"https://api-v2.solscan.io/v2/account/balance_change/export?address={str_address}"
+                        for str_address in arr_str_dalaoAddress]
+
+print('arr_str_dalaoAddress', len(arr_str_dalaoAddress))
+if len(arr_str_dalaoAddress)==0:
+    raise("dalao txhash has get recently ,dont need get")
+downloads_path = baseclass.dalao_ori_tran_txhash_solscan_path
+USER_DIR_PATH = baseclass.browsercookie_path
+asyncio.run(main())
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 87 - 0
src/code/021_02_get_dalaotxhash_solscan.py

@@ -0,0 +1,87 @@
+
+
+import random
+
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+
+
+baseclass.makedirpath(baseclass.dalao_tran_txhash_path)
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+# Python中windows路径的3种写法
+# 可以是以下这样写:
+utc_timeto = int(time.time())
+utc_timefrom = int(utc_timeto - 17*24*3600)
+
+
+df = pd.read_excel(baseclass.dalao_total_ana_fm_path /
+                 "anaing_dalao.xlsx", dtype=object)
+
+arr_str_dalaoAddress = df['add'].tolist()
+arr_str_dalaoAddress.append(baseclass.mywalletaddress)
+print('arr_str_dalaoAddress', len(arr_str_dalaoAddress))
+
+for str_dalaoaddress in arr_str_dalaoAddress:
+    print("str_dalaoaddress=", str_dalaoaddress)
+    if not (baseclass.dalao_ori_tran_txhash_solscan_path/f"ori_txhash_{str_dalaoaddress}.csv").exists():
+        continue
+    obj_txhash_timestamp = {
+        "txhash": [],
+        "timestamp": [],
+        "TokenAccount":[],
+    }
+    with open(baseclass.dalao_ori_tran_txhash_solscan_path /
+              f"ori_txhash_{str_dalaoaddress}.csv", mode="r", encoding="utf-8") as f:
+        arr_line = f.read().strip().split("\n")
+        arr_line.pop(0)
+        arr_line.pop()
+        
+        line =None
+        try:
+            for line in arr_line:
+                if line.strip() == '':
+                    continue 
+                arr_split_line = line.split(",")
+                if  " " in  arr_split_line[0] :
+                    arr_split_line[0]= arr_split_line[0].strip()[1:]
+                str_TokenAccount = arr_split_line[4].strip()
+                if str_TokenAccount== str_dalaoaddress:
+                    continue
+                
+                obj_txhash_timestamp["txhash"].append(arr_split_line[0])
+                obj_txhash_timestamp["timestamp"].append(arr_split_line[1])
+                obj_txhash_timestamp["TokenAccount"].append( str_TokenAccount)
+        except Exception as e:
+            print("error line=",line)
+            raise
+    new_df = pd.DataFrame(obj_txhash_timestamp)
+
+    df = None
+    if (baseclass.dalao_tran_txhash_path/f"txhash_{str_dalaoaddress}.csv").exists():
+        df = pd.read_csv(baseclass.dalao_tran_txhash_path /
+                         f"txhash_{str_dalaoaddress}.csv", dtype=object)
+    df = pd.concat([new_df, df])
+    df =df.replace('',np.nan)
+    df =df.dropna(axis=0,how='any')
+    df["timestamp"] = df["timestamp"].astype(int)
+    df = df[df["timestamp"] >= utc_timefrom]
+
+    df = df.drop_duplicates(subset=["txhash"]).reset_index(drop=True)
+    df = df.sort_values(by=["timestamp"], ascending=[False])
+    df.to_csv(baseclass.dalao_tran_txhash_path /
+              f"txhash_{str_dalaoaddress}.csv", index=False)
+
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+ 

+ 249 - 0
src/code/021_03_get_dalaotransfer_solanafm_txhash.py

@@ -0,0 +1,249 @@
+
+
+from base_class import *
+from base_class import BaseVariableFunction
+import urllib.parse
+import shutil
+import random
+import json
+baseclass = BaseVariableFunction(__file__)
+
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+baseclass.makedirpath(baseclass.dalao_transfer_solanafm_path)
+
+
+def request_onetime(req_dict_total, key_idx,  loop):
+    requests_dict = req_dict_total.get(key_idx)
+    if requests_dict is None:
+        return
+    elif requests_dict['isrequseting'] == True:
+        return
+    elif requests_dict['need_remove'] == True:
+        print(f"key_idx {key_idx} need_remove\n", end='')
+        if req_dict_total.get(key_idx) is not None:
+            print(f"remove  {cur_conadd} {key_idx}\n", end='')
+            del req_dict_total[key_idx]
+        return
+    requests_dict['isrequseting'] = True
+
+    cur_conadd = requests_dict["req_params"]["address"]
+    print(f"enter key_idx={key_idx} cur_conadd={cur_conadd}\n", end='')
+
+    req_response = None
+    arr_cur_txhash = requests_dict["arr_txhash"]
+
+    req_url = "https://api.solana.fm/v0/transfers"
+    payload = {
+        "transactionHashes": arr_cur_txhash
+    }
+    try:
+        req_response = requests.post(
+            req_url,  json=payload, timeout=requests_dict['timeout'], headers=baseclass.solana_fm_headers)
+        time.sleep(0.2)
+
+    except Exception as e:
+        print(f"cur_conadd= {cur_conadd} errmsg={ str(e)}")
+        if (" Max retries exceeded" in str(e)):
+            time.sleep(2+random.random())
+        requests_dict['timeout'] = 15
+        requests_dict['isrequseting'] = False
+        return
+    requests_dict["req_response"] = req_response
+    write_tokens_path_name = baseclass.dalao_transfer_solanafm_path / \
+        f"{cur_conadd}.json"
+    # 请求结果不成功
+    if requests_dict["req_response"].status_code != 200:
+        print(
+            f"cur_conadd= {cur_conadd} response status_code= {requests_dict['req_response'].status_code}")
+        if requests_dict["req_response"].status_code == 429:
+            time.sleep(0.6)
+        elif requests_dict["req_response"].status_code == 400:
+            print("error 400 payload=",payload )
+            raise Exception("400 error")
+             
+
+        requests_dict['isrequseting'] = False
+
+        return
+
+    # 如果請求結果為成功
+    tokenresponse = json.loads(
+        requests_dict["req_response"].text)
+    # 結果不正常  continue
+    if tokenresponse["status"] != "success":
+        print(f"key_idx= {key_idx} response is 200 but status not success")
+        requests_dict["remainder_retry_times"] -= 1
+        requests_dict['isrequseting'] = False
+        if requests_dict["remainder_retry_times"] < 0:
+            raise Exception(f"key_idx={key_idx} retrytimes<0")
+        return
+
+    # 結果正常 獲取txlist
+    txlist = None
+    txlist = tokenresponse["result"]
+    if (txlist == None or len(txlist) == 0):
+        print(f"loop={loop} add={cur_conadd} txlist={txlist} arr_cur_txhash={arr_cur_txhash}")
+
+        requests_dict["need_remove"] = True
+        if req_dict_total.get(key_idx) is not None:
+            print(f"remove {cur_conadd} {key_idx}\n", end='')
+            del req_dict_total[key_idx]
+        requests_dict['isrequseting'] = False
+        return
+
+    print(
+        f"loop={loop} add={cur_conadd}  txhash_len={len(arr_cur_txhash)} real_len={len(txlist)} diflen={len(arr_cur_txhash) -len(txlist)  }")
+    if True:
+        # 如果此次請求結果不是最大offset,請求了全部結果,保存文本
+        requests_dict["need_remove"] = True
+        if req_dict_total.get(key_idx) is not None:
+            print(f"remove {cur_conadd} {key_idx}\n", end='')
+            del req_dict_total[key_idx]
+
+        if (len(txlist) == 0):
+            requests_dict['isrequseting'] = False
+            return
+
+        cur_file = []
+        if not write_tokens_path_name.exists():
+            print(f"loop={loop} {cur_conadd} 第一次文件\n", end='')
+
+        else:
+            with write_tokens_path_name.open(mode="r") as f:
+                cur_file = json.load(f)
+
+        cur_file = cur_file + txlist
+        print(f"{cur_conadd} 全部写入\n", end='')
+        with write_tokens_path_name.open(mode='w') as f:
+            json.dump(cur_file, f)
+
+        requests_dict['isrequseting'] = False
+        return
+
+    return
+
+
+def getonetran(address_list):
+
+    print(f"enter getonetran  ")
+    req_dict_total = {}
+    number_key_idx = 0
+    for address in (address_list):
+        arr_txhash = obj_dalao_2_txhash[address]
+        while (len(arr_txhash) > 0):
+            cur_arr_txhash = arr_txhash[0:50]
+            arr_txhash = arr_txhash[50:]
+            number_key_idx += 1
+            key_idx = str(number_key_idx)
+            req_dict = {
+                "req_params": {"address": address, },
+                "timeout": 10,
+
+                "key_idx": key_idx,
+                "arr_txhash": cur_arr_txhash,
+                "remainder_retry_times": 3,
+                "isrequseting": False,
+                "need_remove": False,
+            }
+            req_dict_total[key_idx] = req_dict
+
+    loop = 0
+    while (len(req_dict_total.keys()) > 0):
+        loop += 1
+        # 獲取可以同步請求的address長度 ,traders 長都可能小於 requests_dict定義的長度
+        # grequest_len 為 requests_dict長度和實際tokencontracts長度取最小值
+        print(
+            f"remainder_address_len :{len(req_dict_total.keys())}")
+
+        temp_split_req_dict_total_list = list(req_dict_total.keys())
+        temp_split_req_dict_total_list = temp_split_req_dict_total_list[0:10]
+
+        temp_req_dict_total_keys_list = []
+        for key_idx in temp_split_req_dict_total_list:
+            temp_req_dict_total_keys_list.append(key_idx)
+        # 進行異步請求
+        i = 0
+
+        for key_idx in temp_req_dict_total_keys_list:
+            i += 1
+            request_onetime(req_dict_total,  key_idx,   loop)
+            time.sleep(0.2)
+
+        time.sleep(0.3)
+
+    return
+
+
+def get_3trans_byScan(address_list):
+
+    # 此方法獲取 從bscapi獲取的 的3trans
+    # 有 requests_3trans_dict 和requests_tokenadd_dict兩種類型對應contractaddress和address
+    # 使用grequests 進行異步請求獲取
+    # offsettimes_max 為請求的數據次數,最大總數為 offsettimes_max*offset (offset 為params的offset)
+    # param_sort 為請求參數params 的sort
+    print("enter get_3trans_byScan_()")
+    contractadd_tokentx_list = copy.deepcopy(address_list)
+    getonetran(address_list=contractadd_tokentx_list,
+               )
+
+    return
+
+
+df = pd.read_excel(baseclass.dalao_total_ana_fm_path /
+                 "anaing_dalao.xlsx", dtype=object)
+
+temp_arr_str_dalaoaddress = df['add'].tolist()
+temp_arr_str_dalaoaddress.append(baseclass.mywalletaddress)
+obj_dalao_2_txhash = {
+
+}
+arr_str_dalaoaddress = []
+for str_dalaoaddress in temp_arr_str_dalaoaddress:
+
+    if not (baseclass.dalao_tran_txhash_path/f"txhash_{str_dalaoaddress}.csv").exists():
+        continue
+    arr_str_dalaoaddress.append(str_dalaoaddress)
+    df = pd.read_csv(baseclass.dalao_tran_txhash_path /
+                     f"txhash_{str_dalaoaddress}.csv", dtype=object)
+    arr_txhash = df["txhash"].tolist()
+    obj_dalao_2_txhash[str_dalaoaddress] = arr_txhash
+    arr_exist_txhash = []
+    dalao_transfere_fm_file = baseclass.dalao_transfer_solanafm_path / \
+        f"{str_dalaoaddress}.json"
+    if not dalao_transfere_fm_file.exists():
+        continue
+    try:
+        with dalao_transfere_fm_file.open(mode='r',encoding='utf-8') as f:
+            arr_obj_dalao_transaction = json.load(f)
+    except Exception as e:
+        print(f"json_read_error str_dalaoaddress={str_dalaoaddress}")
+        raise
+    for obj_dalao_transaction in arr_obj_dalao_transaction:
+        txhash = obj_dalao_transaction["transactionHash"]
+        arr_exist_txhash.append(txhash)
+    arr_txhash = list(set(arr_txhash) - set(arr_exist_txhash))
+    print("arr_txhash=",str_dalaoaddress,len(arr_txhash))
+    if len(arr_txhash)==0:
+        del obj_dalao_2_txhash[str_dalaoaddress]
+        arr_str_dalaoaddress.remove(str_dalaoaddress)
+        
+        continue
+    obj_dalao_2_txhash[str_dalaoaddress] = arr_txhash
+
+# print(f"arr_str_dalaoaddress_len= {len(arr_str_dalaoaddress)}")
+get_3trans_byScan(address_list=arr_str_dalaoaddress,
+                  )
+
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 309 - 0
src/code/021_nouse_get_selected_dalaotransfer_solanafm.py

@@ -0,0 +1,309 @@
+
+
+from base_class import *
+from base_class import BaseVariableFunction
+import urllib.parse
+import shutil
+import random
+
+
+import json
+
+
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+baseclass = BaseVariableFunction(__file__)
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+baseclass.makedirpath(baseclass.dalao_transfer_solanafm_path)
+
+
+def request_onetime(req_dict_total, key_idx, write_tokens_path, loop):
+    global arr_len_too_max_dalaoaddress
+    requests_dict = req_dict_total.get(key_idx)
+    if requests_dict is None:
+        return
+    elif requests_dict['isrequseting'] == True:
+        return
+    elif requests_dict['need_remove'] == True:
+        print(f"key_idx {key_idx} need_remove\n", end='')
+        if req_dict_total.get(key_idx) is not None:
+            print(f"remove  {cur_conadd} {key_idx}\n", end='')
+            del req_dict_total[key_idx]
+        return
+    requests_dict['isrequseting'] = True
+
+    cur_conadd = requests_dict["req_params"]["address"]
+    print(f"enter key_idx={key_idx} cur_conadd={cur_conadd}\n", end='')
+    # 如果此次請求結果為最大offset,請求結果不全,如果沒到最大請求次數,繼續請求,
+    # 否則保存錯誤 但不删除这个token的csv
+    if requests_dict["offsettimes"] >= requests_dict["offsettimes_max"]:
+        requests_dict["need_remove"] = True
+        if req_dict_total.get(key_idx) is not None:
+            print(f"remove  {cur_conadd} {key_idx}\n", end='')
+            del req_dict_total[key_idx]
+        print(
+            f"{cur_conadd} length to max\n", end='')
+        arr_len_too_max_dalaoaddress.append(cur_conadd)
+        arr_len_too_max_dalaoaddress.append(
+            requests_dict['req_params']['endrange'])
+
+        return
+
+    req_response = None
+    req_url = f"https://api.solana.fm/v0/accounts/{requests_dict['req_params']['address']}/transfers?utcFrom={requests_dict['req_params']['startrange']}&utcTo={requests_dict['req_params']['endrange']}&limit=100&page=1"
+    try:
+        req_response = requests.get(
+            req_url, timeout=requests_dict['timeout'], headers=baseclass.solana_fm_headers)
+        time.sleep(0.2)
+    except Exception as e:
+        print(f"cur_conadd= {cur_conadd} errmsg={ str(e)}")
+        if (" Max retries exceeded" in str(e)):
+            time.sleep(2+random.random())
+        requests_dict['timeout'] = 15
+        requests_dict['isrequseting'] = False
+        return
+    requests_dict["req_response"] = req_response
+    write_tokens_path_name = baseclass.dalao_transfer_solanafm_path / \
+        f"{cur_conadd}.json"
+    # 请求结果不成功
+    if requests_dict["req_response"].status_code != 200:
+        print(
+            f"cur_conadd= {cur_conadd} response status_code= {requests_dict['req_response'].status_code}")
+        if requests_dict["req_response"].status_code == 429:
+            time.sleep(0.4)
+
+        requests_dict['isrequseting'] = False
+
+        return
+
+    # 如果請求結果為成功
+    tokenresponse = json.loads(
+        requests_dict["req_response"].text)
+    # 結果不正常  continue
+    if tokenresponse["status"] != "success":
+        baseclass.handle_IF_tokenresponse_NOTOK(tokenresponse=tokenresponse,
+
+                                                cur_conadd=cur_conadd,
+                                                key_idx=key_idx,
+                                                requests_dict=requests_dict,
+                                                req_dict_total=req_dict_total)
+        requests_dict['isrequseting'] = False
+        return
+
+    # 結果正常 獲取txlist
+    txlist = None
+    txlist = tokenresponse["results"]
+    if (txlist == None or len(txlist) == 0):
+        print(f"loop={loop} add={cur_conadd} txlisst={txlist}")
+
+        requests_dict["need_remove"] = True
+        if req_dict_total.get(key_idx) is not None:
+            print(f"remove {cur_conadd} {key_idx}\n", end='')
+            del req_dict_total[key_idx]
+        requests_dict['isrequseting'] = False
+        return
+
+    requests_dict["offsettimes"] += 1
+    if requests_dict["offsettimes"] == 1:
+        requests_dict["isfirstreq"] = True
+    else:
+        requests_dict["isfirstreq"] = False
+    # 因为只运行一次可能不全 ,会多运行几次 所以不能删除
+    # if requests_dict["isfirstreq"] == True:
+        # 如果是第一次请求 删除过去的csv文件
+        # 如果有这个csv文件 删除
+        # if os.path.exists(write_tokens_path_name):
+        #     write_tokens_path_name.unlink()
+    cur_zero_txhash = txlist[0]['transactionHash']
+    cur_last_txhash = txlist[len(txlist)-1]['transactionHash']
+    print(
+        f"loop={loop} add={cur_conadd}  range={requests_dict['req_params']['startrange'] } {requests_dict['req_params']['endrange']}  len={len(txlist)} zero_txhash={cur_zero_txhash} last_txhash={cur_last_txhash}")
+    if (len(txlist) < 100):
+        # 如果此次請求結果不是最大offset,請求了全部結果,保存文本
+        requests_dict["need_remove"] = True
+        if req_dict_total.get(key_idx) is not None:
+            print(f"remove {cur_conadd} {key_idx}\n", end='')
+            del req_dict_total[key_idx]
+
+        if (len(txlist) == 0):
+            requests_dict['isrequseting'] = False
+            return
+        cur_minrange = txlist[len(txlist)-1]["data"][0]["timestamp"]
+        cur_maxrange = txlist[0]["data"][0]["timestamp"]
+
+        # 如果没有这个csv文件 直接写入
+        cur_file = []
+        if not write_tokens_path_name.exists():
+            print(f"loop={loop} {cur_conadd} 第一次文件\n", end='')
+
+        else:
+            with write_tokens_path_name.open(mode="r") as f:
+                cur_file = json.load(f)
+
+        cur_file = cur_file + txlist
+        print(f"{cur_conadd} 全部写入\n", end='')
+        with write_tokens_path_name.open(mode='w') as f:
+            json.dump(cur_file, f)
+
+        requests_dict['isrequseting'] = False
+        return
+    elif (len(txlist) >= 100):
+        # # 如果此次請求結果為最大offset,請求結果不全,如果沒到最大請求次數,繼續請求,
+        # # 否則保存錯誤 但不删除这个token的csv
+        requests_dict["need_remove"] = False
+        # 更換 start
+        cur_minrange = txlist[len(txlist)-1]["data"][0]["timestamp"]
+        cur_maxrange = txlist[0]["data"][0]["timestamp"]
+        if (cur_maxrange == cur_minrange):
+            cur_minrange -= 1
+        print("cur_minrange", cur_minrange, cur_maxrange)
+
+        # while (True):
+        #     if (txlist[len(txlist)-1]["data"][0]["timestamp"] < cur_minrange+1):
+        #         txlist.pop(len(txlist)-1)
+        #         continue
+        #     else:
+        #         break
+
+        # 如果没有这个csv文件 直接写入
+        cur_file = []
+        if not write_tokens_path_name.exists():
+            print(f"loop={loop} {cur_conadd} 第一次文件\n", end='')
+        else:
+            with write_tokens_path_name.open(mode="r", encoding='utf-8') as f:
+                cur_file = json.load(f)
+
+        cur_file = cur_file + txlist
+        print(f"{cur_conadd} 全部写入\n", end='')
+        try:
+            with write_tokens_path_name.open(mode='w', encoding='utf-8') as f:
+                json.dump(cur_file, f)
+        except Exception as e:
+            print("txlist=", txlist)
+            raise
+        requests_dict["req_params"]["endrange"] = int(
+            cur_minrange)
+
+        baseclass.judge_req_completed(requests_dict=requests_dict,
+                                      key_idx=key_idx, cur_conadd=cur_conadd, req_dict_total=req_dict_total)
+        requests_dict['isrequseting'] = False
+        return
+
+    return
+
+
+def getonetran(address_list,  write_tokens_path,    offsettimes_max):
+    global startrange
+    global endrange
+    print(f"enter getonetran  ")
+    req_dict_total = {}
+    for idx, address in enumerate(address_list):
+        key_idx = str(idx)
+        req_dict = baseclass.init_req_dict(
+            startrange=startrange,
+            endrange=endrange,
+            address=address,
+            key_idx=key_idx,
+            offsettimes_max=offsettimes_max,
+            remainder_retry_times_max=5,
+            timeout=10)
+        req_dict_total[key_idx] = req_dict
+
+    loop = 0
+    while (len(req_dict_total.keys()) > 0):
+        loop += 1
+        # 獲取可以同步請求的address長度 ,traders 長都可能小於 requests_dict定義的長度
+        # grequest_len 為 requests_dict長度和實際tokencontracts長度取最小值
+        print(
+            f"remainder_address_len :{len(req_dict_total.keys())}")
+
+        # temp_req_dict_total = {}
+        temp_split_req_dict_total_list = list(req_dict_total.keys())
+        temp_split_req_dict_total_list = temp_split_req_dict_total_list[0:20]
+
+        temp_req_dict_total_keys_list = []
+        for key in temp_split_req_dict_total_list:
+            temp_req_dict_total_keys_list.append(key)
+        # 進行異步請求
+        i = 0
+        thread_list = []
+        for key in temp_req_dict_total_keys_list:
+            i += 1
+            request_onetime(req_dict_total, key, write_tokens_path,  loop)
+            # thread = threading.Thread(
+            #     target=request_onetime,
+            #     args=(
+            #         req_dict_total, key, write_tokens_path,  loop)
+            # )
+            # thread_list.append(thread)
+            # if (i % 4 == 0):
+            #     #  总数4个,查询一遍
+            #     for thread in thread_list:
+            #         thread.start()
+            #     for thread in thread_list:
+            #         thread.join()
+            #     thread_list = []
+            #     time.sleep(0.8)
+            # elif i == len(temp_req_dict_total_keys_list):
+            #     #  总数不足10个,把剩下的也查询一遍
+            #     print('remainder len less 5', datetime.datetime.now())
+            #     for thread in thread_list:
+            #         thread.start()
+            #     for thread in thread_list:
+            #         thread.join()
+            #     thread_list = []
+
+        time.sleep(0.3)
+
+    return
+
+
+def get_3trans_byScan(address_list, write_tokens_path,):
+
+    # 此方法獲取 從bscapi獲取的 的3trans
+    # 有 requests_3trans_dict 和requests_tokenadd_dict兩種類型對應contractaddress和address
+    # 使用grequests 進行異步請求獲取
+    # offsettimes_max 為請求的數據次數,最大總數為 offsettimes_max*offset (offset 為params的offset)
+    # param_sort 為請求參數params 的sort
+    print("enter get_3trans_byScan_()")
+    contractadd_tokentx_list = copy.deepcopy(address_list)
+    getonetran(address_list=contractadd_tokentx_list,
+               write_tokens_path=write_tokens_path,
+               offsettimes_max=5
+               )
+
+    return
+
+
+now_timestamp = baseclass.get_current_timestamp()
+
+startrange = now_timestamp - 3*24*3600
+
+endrange = now_timestamp+2*24*3600
+endrange = 1717323091
+print(f"startrang= {startrange} endrange= {endrange}")
+
+df = pd.read_excel(baseclass.dalao_total_ana_fm_path /
+                   "anaing_dalao.xlsx", dtype=object)
+
+arr_str_dalao = df["add"].tolist()
+
+ 
+
+print('token_contracts_list', len(arr_str_dalao))
+arr_len_too_max_dalaoaddress = []
+get_3trans_byScan(address_list=arr_str_dalao,
+                  write_tokens_path=baseclass.dalao_transfer_solanafm_path
+                  )
+
+print("arr_len_too_max_dalaoaddress=", arr_len_too_max_dalaoaddress)
+print(f"startrang= {startrange} endrange= {endrange}")
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 90 - 0
src/code/022_selected_dalaotransfer_dropduplicate_solanafm.py

@@ -0,0 +1,90 @@
+
+
+import json
+
+
+import shutil
+
+import urllib.parse
+from base_class import BaseVariableFunction
+from base_class import *
+
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+baseclass = BaseVariableFunction(__file__)
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+utc_timeto = int(time.time())
+utc_timefrom = int(utc_timeto - 17*24*3600)
+
+def one_dalaotransfer_dropduplicate(str_dalao_address, success_address_list):
+    try:
+        # for str_dalao_address in arr_str_dalaoaddress:
+        # print(f"enter str_dalao_address= {str_dalao_address}")
+        dalao_file = baseclass.dalao_transfer_solanafm_path / \
+            f"{str_dalao_address}.json"
+        if not dalao_file.exists():
+            return
+        new_arr_obj_dalao_transaction = []
+        new_arr_txhash = []
+        try:
+            with dalao_file.open(mode='r', encoding='utf-8') as f:
+                arr_obj_dalao_transaction = json.load(f)
+        except Exception as e:
+            print(f"read_json_error str_dalao_address={str_dalao_address}")
+            raise
+        for obj_dalao_transaction in arr_obj_dalao_transaction:
+            txhash = obj_dalao_transaction["transactionHash"]
+            timestamp = obj_dalao_transaction["data"][0]["timestamp"]
+            if txhash in new_arr_txhash:
+                continue
+            if timestamp <= utc_timefrom  :
+                continue
+            new_arr_txhash.append(txhash)
+            new_arr_obj_dalao_transaction.append(obj_dalao_transaction)
+        with dalao_file.open(mode='w', encoding='utf-8') as f:
+            json.dump(new_arr_obj_dalao_transaction, f)
+        success_address_list.remove(str_dalao_address)
+        print(
+            f"str_dalao_address= {str_dalao_address} prelen= {len(arr_obj_dalao_transaction)} aftlen= {len(new_arr_obj_dalao_transaction)} remainder= {len(success_address_list)} \n", end='')
+    except Exception as e:
+        print(f"error_str_dalao_address={str_dalao_address}")
+        raise
+
+def mul_dalaotransfer_dropduplicate():
+    success_address_list = arr_str_dalaoaddress.copy()
+    for idx in range(0, len(arr_str_dalaoaddress), batchSize):
+        thread_list = []
+        for cur_idx in range(idx, min(idx+batchSize, len(arr_str_dalaoaddress))):
+            thread = threading.Thread(
+                target=one_dalaotransfer_dropduplicate,
+                args=(arr_str_dalaoaddress[cur_idx],
+                      success_address_list)
+            )
+            thread_list.append(thread)
+        for thread in thread_list:
+            thread.start()
+        for thread in thread_list:
+            thread.join()
+        time.sleep(1)
+    return
+
+
+arr_str_dalaoaddress = []
+
+df = pd.read_excel(baseclass.dalao_total_ana_fm_path /
+                   "anaing_dalao.xlsx", dtype=object)
+
+arr_str_dalaoaddress = df["add"].tolist()
+arr_str_dalaoaddress.append(baseclass.mywalletaddress)
+print('arr_str_dalaoaddress', len(arr_str_dalaoaddress))
+batchSize = 170
+mul_dalaotransfer_dropduplicate()
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 171 - 0
src/code/023_seleted_get_transaction_st_solanafm.py

@@ -0,0 +1,171 @@
+
+
+import json
+
+
+import shutil
+
+import urllib.parse
+from base_class import BaseVariableFunction
+from base_class import *
+
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+baseclass = BaseVariableFunction(__file__)
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+baseclass.makedirpath(baseclass.dalao_transaction_st_solanafm_path)
+
+# Pump.fun  6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P
+
+# Raydium_Authority_V4 = "5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1"
+# WSOL_Token = "So11111111111111111111111111111111111111112"
+
+
+def eheck_one_transaction_isswap(gdf, str_dalaoaddress):
+    sign = gdf["sign"].tolist()[0]
+    # if (sign == "2JBTiuHr1tpZ4abbwn4JP6vqm2CYmd1NoGjxkjPiv9y5MYan2D9NDsKTZMPw3fSzJegR64T8N1HcGUuZ45Jt3DWe"):
+    #     print("gdf=", gdf)
+    #     raise
+    # 之前的是针对 raydium 平台并且 自己发送token/sol 自己接收token/sol
+    # if gdf["source"].isin([Raydium_Authority_V4]).any() and gdf["destination"].isin([Raydium_Authority_V4]).any() and gdf["source"].isin([str_dalaoaddress]).any() and gdf["destination"].isin([str_dalaoaddress]).any():
+    #     return gdf
+    # 现在是自己发送token/sol 接收token/sol 不需要 raydium平台
+    if gdf["source"].isin([str_dalaoaddress]).any() and gdf["destination"].isin([str_dalaoaddress]).any():
+        return gdf
+    else:
+        return None
+
+
+def get_multransaction_st():
+    success_address_list = arr_str_dalaoaddress.copy()
+    for idx in range(0, len(arr_str_dalaoaddress), batchSize):
+        thread_list = []
+        for cur_idx in range(idx, min(idx+batchSize, len(arr_str_dalaoaddress))):
+            thread = threading.Thread(
+                target=get_onetransaction_st,
+                args=(arr_str_dalaoaddress[cur_idx],
+                      success_address_list)
+            )
+            thread_list.append(thread)
+        for thread in thread_list:
+            thread.start()
+        for thread in thread_list:
+            thread.join()
+        time.sleep(1)
+    return
+
+
+def get_onetransaction_st(str_dalaoaddress, success_address_list):
+    print(f"enter {str_dalaoaddress}")
+    try:
+        # 不存在此dalao的文件 直接跳过
+        if not (baseclass.dalao_transfer_solanafm_path/f"{str_dalaoaddress}.json").exists():
+            return
+        new_arr_obj_dalao_transaction = []
+        with (baseclass.dalao_transfer_solanafm_path/f"{str_dalaoaddress}.json").open(mode='r') as f:
+            arr_obj_dalao_transaction = json.load(f)
+        # 构造新的结果 方便后续转为csv格式 
+        # ori 为
+            # {
+            # "transactionHash": "53SSVoVwQwoBJCFg17WVoj1bis7xPXDx6LD88VHnNn3TDPKJwuCzBqcVvVw1DtRptf7WMdmCVijrdAC8UzxT7aas",
+            # "data": [
+            # {
+            # "instructionIndex": -1,
+            # "innerInstructionIndex": -1,
+            # "action": "unknownTransfer",
+            # "status": "Successful",
+            # "source": "unknowned",
+            # "sourceAssociation": null,
+            # "destination": "2xgeeA8T9AkYKPh5k7zDTpVLWisSu7eou6opsGKjm5mr",
+            # "destinationAssociation": null,
+            # "token": "",
+            # "amount": 326931586,
+            # "timestamp": 1720643298
+            # },
+            # xxxx
+            # }
+        # 新的结构为
+        # new_arr_obj_dalao_transaction [
+        # sign:"xxxx"
+        # "instructionIndex": -1,
+        # "innerInstructionIndex": -1,
+        # "action": "unknownTransfer",
+        # "status": "Successful",
+        # "source": "unknowned",
+        # "sourceAssociation": null,
+        # "destination": "2xgeeA8T9AkYKPh5k7zDTpVLWisSu7eou6opsGKjm5mr",
+        # "destinationAssociation": null,
+        # "token": "",
+        # "amount": 326931586,
+        # "timestamp": 1720643298
+        # ]
+
+        for obj_dalao_transaction in arr_obj_dalao_transaction:
+            sign = obj_dalao_transaction["transactionHash"]
+            arr_obj_instruction_data = obj_dalao_transaction["data"]
+            for obj_instruction_data in arr_obj_instruction_data:
+                # if (obj_instruction_data["instructionIndex"] == -1):
+                #     continue
+                if (obj_instruction_data["status"] != "Successful"):
+                    continue
+                if (obj_instruction_data["action"] in ["transfer", "transferChecked","unknownTransfer"]
+                    # and ((obj_instruction_data["source"] in [Raydium_Authority_V4, str_dalaoaddress])
+                    #     or (obj_instruction_data["destination"] in [Raydium_Authority_V4, str_dalaoaddress]))):
+                    and ((obj_instruction_data["source"] in [ str_dalaoaddress])
+                        or (obj_instruction_data["destination"] in [ str_dalaoaddress]))):
+                    obj_instruction_data["sign"] = sign
+                    new_arr_obj_dalao_transaction.append(obj_instruction_data)
+
+                else:
+                    continue
+
+        df = pd.DataFrame(new_arr_obj_dalao_transaction)
+        if (len(df) == 0):
+            df = pd.DataFrame(
+                columns=["timestamp", "sign", "source", 
+                        "destination", "token", "amount"
+                        "instructionIndex", "innerInstructionIndex"
+                        ])
+        df = df[["timestamp", "sign",  "source",
+                "destination", "token", "amount",
+                    "instructionIndex", "innerInstructionIndex"
+                ]]
+
+        df = df.groupby(by=["sign"]).apply(
+            lambda gdf: eheck_one_transaction_isswap(gdf, str_dalaoaddress))
+        if (len(df) == 0):
+            df = pd.DataFrame(
+                columns=["timestamp", "sign", "source",
+                         "destination", "token", "amount",
+                          "instructionIndex", "innerInstructionIndex"
+                         
+                         ])
+        df.to_csv(baseclass.dalao_transaction_st_solanafm_path /
+                f"{str_dalaoaddress}.csv", index=False)
+
+        success_address_list.remove(str_dalaoaddress)
+        print(f"{str_dalaoaddress} success remainder= {len(success_address_list)} \n", end='')
+    except Exception as e:
+        print(f"error_str_dalaoaddress={str_dalaoaddress} ",e)
+        raise
+# 9XvTzh7udehQMaQLikViwfXa5GpiDU4spw6BZYppsNJn 调用另一个router 对于raydium pool 进行交换
+
+
+df = pd.read_excel(baseclass.dalao_total_ana_fm_path /
+                   "anaing_dalao.xlsx", dtype=object)
+
+arr_str_dalaoaddress = df["add"].tolist()
+arr_str_dalaoaddress.append(baseclass.mywalletaddress)
+
+# arr_str_dalaoaddress=arr_str_dalaoaddress[0:10]
+batchSize = 170
+get_multransaction_st()
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 327 - 0
src/code/024_selected_get_configtoken_st_solanafm.py

@@ -0,0 +1,327 @@
+
+
+import json
+
+
+import shutil
+
+import urllib.parse
+from base_class import BaseVariableFunction
+from base_class import *
+
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+baseclass = BaseVariableFunction(__file__)
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+baseclass.makedirpath(baseclass.dalao_configtoken_st_solanafm_path)
+
+Raydium_Authority_V4 = "5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1"
+WSOL_Token = "So11111111111111111111111111111111111111112"
+
+def checkgdfisswap(gdf, str_dalaoaddress):
+    is_raydium =False
+    # 保留与raudium 有关的token 的transfer 即只参与了swap的token
+    raydium_mask = ((gdf["source"] == Raydium_Authority_V4) | (
+        gdf["destination"] == Raydium_Authority_V4))
+    filter_dalao_mask = ((gdf["source"] == str_dalaoaddress) | (
+        gdf["destination"] == str_dalaoaddress))
+    if raydium_mask.any():
+        is_raydium =True
+        gdf["platform"]="raydium"
+ 
+    arr_raydium_token =None
+    arr_dalao_token =None
+
+    if is_raydium:
+        arr_raydium_token = gdf[raydium_mask]["token"].drop_duplicates().tolist()
+        gdf = gdf[gdf["token"].isin(arr_raydium_token)]
+    else:
+        arr_dalao_token = gdf[filter_dalao_mask]["token"].drop_duplicates().tolist()
+        gdf = gdf[gdf["token"].isin(arr_dalao_token)]
+    if not is_raydium:
+
+        dalao_intoken_mask = gdf["destination"] == str_dalaoaddress
+        dalao_outtoken_mask = gdf["source"] == str_dalaoaddress
+        arr_dalao_intoken = gdf[dalao_intoken_mask]["token"].drop_duplicates(
+        ).tolist()
+        arr_dalao_outtoken = gdf[dalao_outtoken_mask]["token"].drop_duplicates(
+        ).tolist()
+        if (len(arr_dalao_intoken) == 0 or len(arr_dalao_outtoken) == 0):
+            # dalao 没有token in 或者out 有问题 此sign 不是swap
+            return None
+        arr_dalao_token = list(set(arr_dalao_intoken) | set(arr_dalao_outtoken))
+        if (len(arr_dalao_token) != 2):
+            # dalao 的token数目不对 除了 sol token 还有其他的token 不是我想要的sign return
+            return None
+        if WSOL_Token not in arr_dalao_token:
+            # 没有sol 不是我想要的
+            return None
+        arr_dalao_token.remove(WSOL_Token)
+        # token in ,wsol out 或者 token out ,wsol in
+        str_token_address = arr_dalao_token[0]
+        # if str_token_address in arr_dalao_intoken and 
+        if WSOL_Token in arr_dalao_intoken:
+            arr_dalao_intoken.remove(WSOL_Token)
+        if WSOL_Token in arr_dalao_outtoken:
+            arr_dalao_outtoken.remove(WSOL_Token)
+        # if str_token_address in arr_dalao_intoken and 
+        if len(arr_dalao_intoken) +len(arr_dalao_outtoken)!=1:
+            return None
+        if str_token_address in arr_dalao_outtoken:
+            gdf["swap_type"] = "sell"
+        else:
+            gdf["swap_type"] = "buy"
+
+        gdf["swap_tokenaddress"] = str_token_address
+    else:
+        
+        raydium_intoken_mask = gdf["destination"] == Raydium_Authority_V4
+        raydium_outtoken_mask = gdf["source"] == Raydium_Authority_V4
+        arr_raydium_intoken = gdf[raydium_intoken_mask]["token"].drop_duplicates(
+        ).tolist()
+        arr_raydium_outtoken = gdf[raydium_outtoken_mask]["token"].drop_duplicates(
+        ).tolist()
+        if (len(arr_raydium_intoken) == 0 or len(arr_raydium_outtoken) == 0):
+            # raydium 没有token in 或者out 有问题 此sign 不是swap
+            return None
+        arr_raydiumtoken = list(set(arr_raydium_intoken) | set(arr_raydium_outtoken))
+        if (len(arr_raydiumtoken) != 2):
+            # raydium 的token数目不对 除了 sol token 还有其他的token 不是我想要的sign return
+            return None
+        if WSOL_Token not in arr_raydiumtoken:
+            # 没有sol 不是我想要的
+            return None
+        arr_raydiumtoken.remove(WSOL_Token)
+        # token in ,wsol out 或者 token out ,wsol in
+        str_token_address = arr_raydiumtoken[0]
+        # if str_token_address in arr_raydiumintoken and 
+        if WSOL_Token in arr_raydium_intoken:
+            arr_raydium_intoken.remove(WSOL_Token)
+        if WSOL_Token in arr_raydium_outtoken:
+            arr_raydium_outtoken.remove(WSOL_Token)
+        # if str_token_address in arr_raydiumintoken and 
+        if len(arr_raydium_intoken) +len(arr_raydium_outtoken)!=1:
+            return None
+        if str_token_address in arr_raydium_outtoken:
+            gdf["swap_type"] = "buy"
+        else:
+            gdf["swap_type"] = "sell"
+        gdf["swap_tokenaddress"] = str_token_address
+			
+
+
+    return gdf
+
+
+def setswaptoken(gdf, str_dalaoaddress):
+    arr_dalao_token =gdf["token"].drop_duplicate().tolist()
+    # dalao_intoken_mask = gdf["destination"] == str_dalaoaddress
+    # dalao_outtoken_mask = gdf["source"] == str_dalaoaddress
+    # arr_dalao_intoken = gdf[dalao_intoken_mask]["token"].drop_duplicates(
+    # ).tolist()
+    # arr_dalao_outtoken = gdf[dalao_outtoken_mask]["token"].drop_duplicates(
+    # ).tolist()
+    # arr_dalao_token = list(set(arr_dalao_intoken) | set(arr_dalao_outtoken))
+    arr_dalao_token.remove(WSOL_Token)
+    swapTokenAddress = arr_dalao_token[0]
+    gdf["swap_tokenaddress"] = swapTokenAddress
+    return gdf
+
+
+pow_ten_list = [
+    '1', '10', '100', '1000',
+    '10000', '100000', '1000000',
+    '10000000', '100000000', '1000000000',
+    '10000000000', '100000000000', '1000000000000',
+    '10000000000000', '100000000000000', '1000000000000000',
+    '10000000000000000', '100000000000000000', '1000000000000000000',
+    '10000000000000000000', '100000000000000000000', '1000000000000000000000',
+    '10000000000000000000000', '100000000000000000000000', '1000000000000000000000000'
+]
+
+
+# swap_ethamount	swap_tokenamount
+
+
+def compute_eth_amount_onerow(row, str_dalaoaddress):
+    row = row.copy()
+    if (row["token"] != WSOL_Token):
+        return row
+    amount = decimal.Decimal(row['amount'])
+    row['amount'] = '{0:.4f}'.format(
+        amount / decimal.Decimal(pow_ten_list[9]))
+    platform = row["platform"]
+    if platform=="raydium":
+        if (row['source'] == Raydium_Authority_V4):
+            row['swap_eth_amount'] = '{0:.4f}'.format(decimal.Decimal(
+                row['swap_eth_amount']) + decimal.Decimal(row['amount']))
+        if (row['destination'] == Raydium_Authority_V4):
+            row['swap_eth_amount'] = '{0:.4f}'.format(decimal.Decimal(
+                row['swap_eth_amount']) - decimal.Decimal(row['amount']))
+    else:
+        if (row['source'] == str_dalaoaddress):
+            if row['swap_type']=="sell":
+                # sell token 只关注 获取eth 不关注其他
+                return row
+            else:
+                row['swap_eth_amount'] = '{0:.4f}'.format(decimal.Decimal(
+                    row['swap_eth_amount']) - decimal.Decimal(row['amount']))
+            
+        if (row['destination'] == str_dalaoaddress):
+            row['swap_eth_amount'] = '{0:.4f}'.format(decimal.Decimal(
+                row['swap_eth_amount']) + decimal.Decimal(row['amount']))
+        
+
+    return row
+
+# def compute_eth_amount_gdf(gdf  ):
+#     # 判断此hash 是buy 还是 sell
+#     ,,,,
+#     return
+
+def compute_eth_amount(df, str_dalaoaddress):
+    # 將主流幣全部替換為wbnb,amount 以及 token 都替換,
+    # 添加swap_ethamount 列
+    # 计算每条hash 的 bnb 的value
+     
+    df["swap_eth_amount"]="0"
+   
+    # 待添加
+    # df = df.groupby(by=["sign"], group_keys=False).apply(
+    # lambda gdf: compute_eth_amount_gdf(gdf))
+
+    df = df.apply(lambda row: compute_eth_amount_onerow(
+        row, str_dalaoaddress), axis=1)
+    return df
+
+
+def compute_token_amount_onerow(row, str_dalaoaddress):
+    row = row.copy()
+    if (row["token"] == WSOL_Token):
+        return row
+    amount = decimal.Decimal(row['amount'])
+    row['amount'] = '{0:.0f}'.format(
+        amount / decimal.Decimal(pow_ten_list[6]))
+    platform = row["platform"]
+    if platform=="raydium":
+        if (row['source'] == Raydium_Authority_V4):
+            row['swap_token_amount'] = '{0:.0f}'.format(decimal.Decimal(
+                row['swap_token_amount']) + decimal.Decimal(row['amount']))
+        if (row['destination'] == Raydium_Authority_V4):
+            row['swap_token_amount'] = '{0:.0f}'.format(decimal.Decimal(
+                row['swap_token_amount']) - decimal.Decimal(row['amount']))
+    else:
+        if (row['source'] == str_dalaoaddress):
+            row['swap_token_amount'] = '{0:.0f}'.format(decimal.Decimal(
+            row['swap_token_amount']) - decimal.Decimal(row['amount']))
+        if (row['destination'] == str_dalaoaddress):
+            row['swap_token_amount'] = '{0:.0f}'.format(decimal.Decimal(
+            row['swap_token_amount']) + decimal.Decimal(row['amount']))
+    return row
+
+
+def compute_token_amount(df, str_dalaoaddress):
+
+    df = df.apply(lambda row: compute_token_amount_onerow(
+        row, str_dalaoaddress), axis=1)
+
+    return df
+
+
+def get_mul_configtoken_st():
+    success_address_list = arr_str_dalaoaddress.copy()
+    for idx in range(0, len(arr_str_dalaoaddress), batchSize):
+        thread_list = []
+        for cur_idx in range(idx, min(idx+batchSize, len(arr_str_dalaoaddress))):
+            thread = threading.Thread(
+                target=get_one_configtoken_st,
+                args=(arr_str_dalaoaddress[cur_idx],
+                      success_address_list)
+            )
+            thread_list.append(thread)
+        for thread in thread_list:
+            thread.start()
+        for thread in thread_list:
+            thread.join()
+    return
+
+
+def get_one_configtoken_st(str_dalaoaddress, success_address_list):
+    print(f"enter str_dalaoaddress= {str_dalaoaddress}")
+    if not (baseclass.dalao_transaction_st_solanafm_path /
+            f"{str_dalaoaddress}.csv").exists():
+        return
+    df = pd.read_csv(baseclass.dalao_transaction_st_solanafm_path /
+                     f"{str_dalaoaddress}.csv", dtype=object)
+    if (len(df) == 0):
+        return
+    # token可能为kong 代表sol相关 用wsol填充
+    df["token"] = df["token"].fillna(WSOL_Token)
+    prelen = len(df)
+    df["platform"]="unknown"
+    df["swap_type"]="unknow"
+    df["swap_tokenaddress"] = ""
+    df = df.groupby(by=["sign"], group_keys=False).apply(
+        lambda gdf: checkgdfisswap(gdf, str_dalaoaddress))
+    # 屏蔽pump 只考虑raydium 
+    # df =df[ df["platform"]=="raydium"].reset_index(drop=True)
+    aftlen = len(df)
+    if prelen != aftlen:
+        print(f"{str_dalaoaddress} pre= {prelen} aft= {aftlen}")
+    if aftlen == 0:
+        return
+
+    # df = df.groupby(by=["sign"], group_keys=False).apply(
+    #     lambda gdf: setswaptoken(gdf, str_dalaoaddress))
+    df["swap_eth_amount"] = "0"
+    df = compute_eth_amount(df=df, str_dalaoaddress=str_dalaoaddress)
+
+    df["swap_token_amount"] = "0"
+    df = compute_token_amount(df=df, str_dalaoaddress=str_dalaoaddress)
+
+    df["timestamp"] = df["timestamp"].astype(int)
+    df["token_idx"] = -1
+ 
+
+    gettokenidx_df = df[["timestamp", "swap_tokenaddress"]].copy()
+    gettokenidx_df = gettokenidx_df.sort_values(
+        by=["timestamp"], ascending=[True])
+    list_tokenaddress = gettokenidx_df["swap_tokenaddress"].drop_duplicates(
+    ).tolist()
+    for str_tokenaddress_idx in range(0, len(list_tokenaddress)):
+        str_tokenaddress = list_tokenaddress[str_tokenaddress_idx]
+        df.loc[df["swap_tokenaddress"] == str_tokenaddress,
+               "token_idx"] = str_tokenaddress_idx+1
+
+    df["dalaofirsttimestamp"] = df.groupby("token_idx")[
+        "timestamp"].transform("min")
+    df['dalaofirsttimestamp'] = pd.to_datetime(
+        df['dalaofirsttimestamp'], unit='s')
+
+    df = df.sort_values(by=["dalaofirsttimestamp", "token_idx", "timestamp"], ascending=[
+        False, True, True]).reset_index(drop=True)
+    df.to_csv(baseclass.dalao_configtoken_st_solanafm_path /
+              f"configtoken_{str_dalaoaddress}.csv", index=False)
+    success_address_list.remove(str_dalaoaddress)
+    print(
+        f"{str_dalaoaddress} success remainder_len={len(success_address_list)}\n", end='')
+
+
+batchSize = 170
+df = pd.read_excel(baseclass.dalao_total_ana_fm_path /
+                   "anaing_dalao.xlsx", dtype=object)
+
+arr_str_dalaoaddress = df["add"].tolist()
+arr_str_dalaoaddress.append(baseclass.mywalletaddress)
+print('arr_str_dalaoaddress', len(arr_str_dalaoaddress))
+# arr_str_dalaoaddress=arr_str_dalaoaddress[0:10]
+get_mul_configtoken_st()
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 1010 - 0
src/code/025_selected_get_profit_st_solanafm.py

@@ -0,0 +1,1010 @@
+
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+baseclass.makedirpath(baseclass.dalao_profit_st_fm_path)
+baseclass.makedirpath(baseclass.dalao_ana_fm_path)
+
+
+baseclass.makedirpath(baseclass.dalao_total_ana_fm_path)
+baseclass.open_base_library()
+decimal.getcontext().prec = 100
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+onedalao_ana_columns = ['TokenFirstTime', 'swap_tokenaddress', "issellfir", 'buy_counts', 'sell_counts',
+                        'outtoken_per', 'cost_main', 'earn_main', 'earn_percent' ,
+                        'diffdays','fir_cost_main','fir_earn_percent' , 'fir_noadd_earn_percent']
+
+    
+onetxhash_onerow_ana_cols= [
+"sign","swap_tokenaddress","dexurl","platform","datetime",
+"dalaofirsttimestamp","diffdays",
+"fir_cost_main","fir_earn_percent","issellfir",
+"fir_noadd_earn_percent","token_price", "buy_sell_diftime",
+
+"swap_type",
+"outtoken_per",
+"buy_counts","sell_counts",
+"timestamp","TokenFirstTime",
+"swap_eth_amount","swap_token_amount",
+"cost_main","earn_main","earn_percent",
+"intoken_amount","outtoken_amount",
+    ]
+    
+
+TotalAnalysis_columns = [
+    "add",
+    # "whichcontract",
+    "url",
+    "beizhu",
+
+    "03d_cost",
+    "03d_earn",
+    "03d_earnper",
+    "03d_difcost",
+    "03d_difearn",
+    "03d_difper",
+    "03d_costmedian",
+    "03d_costmean",
+    "03d_cost_noaddouttoken",
+    "03d_earn_noaddouttoken",
+    "03d_earnper_noaddouttoken",
+    # "03d_difcost_noaddouttoken",
+    # "03d_difearn_noaddouttoken",
+    # "03d_difper_noaddouttoken",
+    # "03d_costmedian_noaddouttoken",
+    # "03d_costmean_noaddouttoken",
+    "03d_mine_fir_earnper",
+    "03d_mine_fir_earnper_dropmax",
+    "03d_mine_fir_earnper_droptwomax",
+    "03d_mine_noadd_fir_earnper" , 
+    "03d_mine_noadd_fir_earnper_dropmax" , 
+    "03d_mine_noadd_fir_earnper_droptwomax" ,
+
+    "03d_trans",
+
+
+    "07d_cost",
+    "07d_earn",
+    "07d_earnper",
+    "07d_difcost",
+    "07d_difearn",
+    "07d_difper",
+    "07d_costmedian",
+    "07d_costmean",
+    "07d_cost_noaddouttoken",
+    "07d_earn_noaddouttoken",
+    "07d_earnper_noaddouttoken",
+    # "07d_difcost_noaddouttoken",
+    # "07d_difearn_noaddouttoken",
+    # "07d_difper_noaddouttoken",
+    # "07d_costmedian_noaddouttoken",
+    # "07d_costmean_noaddouttoken",
+    "07d_mine_fir_earnper",
+    "07d_mine_fir_earnper_dropmax",
+    "07d_mine_fir_earnper_droptwomax",
+    "07d_mine_noadd_fir_earnper" , 
+    "07d_mine_noadd_fir_earnper_dropmax" , 
+    "07d_mine_noadd_fir_earnper_droptwomax" ,
+    "07d_trans",
+
+
+    "11d_cost",
+    "11d_earn",
+    "11d_earnper",
+    "11d_difcost",
+    "11d_difearn",
+    "11d_difper",
+    "11d_costmedian",
+    "11d_costmean",
+    "11d_cost_noaddouttoken",
+    "11d_earn_noaddouttoken",
+    "11d_earnper_noaddouttoken",
+    # "11d_difcost_noaddouttoken",
+    # "11d_difearn_noaddouttoken",
+    # "11d_difper_noaddouttoken",
+    # "11d_costmedian_noaddouttoken",
+    # "11d_costmean_noaddouttoken",
+    "11d_mine_fir_earnper",
+    "11d_mine_fir_earnper_dropmax",
+    "11d_mine_fir_earnper_droptwomax",
+    "11d_mine_noadd_fir_earnper" , 
+    "11d_mine_noadd_fir_earnper_dropmax" , 
+    "11d_mine_noadd_fir_earnper_droptwomax" ,
+    "11d_trans",
+
+
+    "15d_cost",
+    "15d_earn",
+    "15d_earnper",
+    "15d_difcost",
+    "15d_difearn",
+    "15d_difper",
+    "15d_costmedian",
+    "15d_costmean",
+    "15d_cost_noaddouttoken",
+    "15d_earn_noaddouttoken",
+    "15d_earnper_noaddouttoken",
+    # "15d_difcost_noaddouttoken",
+    # "15d_difearn_noaddouttoken",
+    # "15d_difper_noaddouttoken",
+    # "15d_costmedian_noaddouttoken",
+    # "15d_costmean_noaddouttoken",
+    "15d_mine_fir_earnper",
+    "15d_mine_fir_earnper_dropmax",
+    "15d_mine_fir_earnper_droptwomax",
+    "15d_mine_noadd_fir_earnper" , 
+    "15d_mine_noadd_fir_earnper_dropmax" , 
+    "15d_mine_noadd_fir_earnper_droptwomax" ,
+    "15d_trans",
+
+    "15dearn_dif",
+   "15d_mine_fir_earnper_dif",
+]
+
+
+
+earn_kuisun_columns=[
+      "add",
+       "url",
+    "beizhu",
+
+    "03d_bigbig_earn_counts"  , "03d_big_earn_counts"   , "03d_nor_earn_counts"  ,
+    "03d_nor_kuisun_counts"  , "03d_big_kuisun_counts"   , "03d_bigbig_kuisun_counts"  ,
+    "03d_bigbig_earn_per"  , "03d_big_earn_per"   , "03d_nor_earn_per"  ,
+    "03d_nor_kuisun_per"  , "03d_big_kuisun_per"   , "03d_bigbig_kuisun_per"  ,
+    "03d_total_counts",
+
+    "07d_bigbig_earn_counts"  , "07d_big_earn_counts"   , "07d_nor_earn_counts"  ,
+    "07d_nor_kuisun_counts"  , "07d_big_kuisun_counts"   , "07d_bigbig_kuisun_counts"  ,
+    "07d_bigbig_earn_per"  , "07d_big_earn_per"   , "07d_nor_earn_per"  ,
+    "07d_nor_kuisun_per"  , "07d_big_kuisun_per"   , "07d_bigbig_kuisun_per"  ,
+    "07d_total_counts",
+
+    "11d_bigbig_earn_counts"  , "11d_big_earn_counts"   , "11d_nor_earn_counts"  ,
+    "11d_nor_kuisun_counts"  , "11d_big_kuisun_counts"   , "11d_bigbig_kuisun_counts"  ,
+    "11d_bigbig_earn_per"  , "11d_big_earn_per"   , "11d_nor_earn_per"  ,
+    "11d_nor_kuisun_per"  , "11d_big_kuisun_per"   , "11d_bigbig_kuisun_per"  ,
+    "11d_total_counts",
+
+    "15d_bigbig_earn_counts"  , "15d_big_earn_counts"   , "15d_nor_earn_counts"  ,
+    "15d_nor_kuisun_counts"  , "15d_big_kuisun_counts"   , "15d_bigbig_kuisun_counts"  ,
+    "15d_bigbig_earn_per"  , "15d_big_earn_per"   , "15d_nor_earn_per"  ,
+    "15d_nor_kuisun_per"  , "15d_big_kuisun_per"   , "15d_bigbig_kuisun_per"  ,
+    "15d_total_counts",
+
+]
+
+def get_txhash_tokenswap_amount(df):
+    def get_txhash_cost(gdf):
+        token_amount_list = gdf['swap_token_amount'].to_list()
+        arr_token_amount = [(decimal.Decimal(
+            token_amount)) for token_amount in token_amount_list]
+        token_amount = sum(arr_token_amount)
+        token_amount_str = '{0:.4f}'.format(token_amount)
+        gdf[['swap_token_amount']] = [token_amount_str]
+        # gdf['swap_token_amount'] = token_amount_str
+        return gdf
+
+    df = df.groupby(["sign"], group_keys=False).apply(
+        lambda gdf:  get_txhash_cost(gdf))
+    df = df.reset_index(drop=True)
+    return df
+
+
+def get_tokenswap_amount(df):
+    def get_cost(gdf):
+        arr_token_amount = gdf['swap_token_amount'].to_list()
+        isfirstsell = False
+        while len(arr_token_amount) > 0:
+            if (decimal.Decimal(arr_token_amount[0]) < 0):
+                arr_token_amount.pop(0)
+                isfirstsell = True
+            else:
+                break
+        if len(arr_token_amount) == 0:
+            return gdf
+        arr_out_token_amount = [abs(decimal.Decimal(
+            token_amount)) for token_amount in arr_token_amount if decimal.Decimal(token_amount) < 0]
+        arr_in_token_amount = [decimal.Decimal(
+            token_amount) for token_amount in arr_token_amount if decimal.Decimal(token_amount) > 0]
+        buy_counts = len(arr_in_token_amount)
+        sell_counts = len(arr_out_token_amount)
+
+        out_token_amount = sum(arr_out_token_amount)
+        in_token_amount = sum(arr_in_token_amount)
+
+        out_token_amount_str = '{0:.2f}'.format(out_token_amount)
+        in_token_amount_str = '{0:.2f}'.format(in_token_amount)
+        if isfirstsell:
+            outtoken_per = "1.01"
+        else:
+            outtoken_per = '{0:.2f}'.format(
+                out_token_amount/in_token_amount) if in_token_amount != 0 else '-10'
+        gdf[['buy_counts', 'sell_counts', 'intoken_amount', 'outtoken_amount', 'outtoken_per']] = [buy_counts, sell_counts,
+                                                                                                   in_token_amount_str, out_token_amount_str, outtoken_per]
+        return gdf
+    df[['buy_counts', 'sell_counts', 'intoken_amount',
+        'outtoken_amount', 'outtoken_per']] = [0, 0, '0', '0', '0']
+    # 如果全是sell token 那么 在get_cost()将会在中途返回gdf 不会赋值 如上变量全为0
+    df = df.groupby(["swap_tokenaddress"], group_keys=False).apply(
+        lambda gdf:  get_cost(gdf))
+    df = df.reset_index(drop=True)
+    return df
+
+
+def get_sol_profit(df):
+    # 計算利潤
+    df['cost_main'] = 0
+    df['earn_main'] = 0
+    df['earn_percent'] = -10
+    df['fir_cost_main'] = 0
+    df['fir_earn_percent']=-10
+    df["issellfir"] = 0
+    df["fir_noadd_earn_percent"] = -10
+    df["token_price"]=-10
+    df["buy_sell_diftime"]=-1
+   
+    df = df.astype({'swap_eth_amount': float})
+    df = df.astype({'swap_token_amount': float})
+    df = df.astype({'outtoken_per': float})
+    df = df.astype({'timestamp': int})
+
+     
+
+ 
+    df["token_price"] = np.where(
+        df['swap_token_amount'] != 0,
+        -df['swap_eth_amount'] / df['swap_token_amount'],
+        -10,
+    )
+ 
+
+    def get_one_sol_profit(gdf):
+        issellfir = False
+        arr_eth_amount = gdf['swap_eth_amount'].to_list()
+        arr_token_amount = gdf['swap_token_amount'].to_list()
+        arr_timestamp = gdf["timestamp"].to_list()
+        
+        while len(arr_eth_amount) > 0:
+            # 如果 arr_eth_amount[0]>0 则此交易为卖出 pass
+
+            if (arr_eth_amount[0] >= 0):
+                gdf["issellfir"] = 1
+                arr_eth_amount.pop(0)
+                arr_token_amount.pop(0)
+                arr_timestamp.pop(0)
+                continue
+            else:
+                break
+        if len(arr_eth_amount) == 0:
+            return gdf
+        number_cost_main = sum(
+            [abs(eth_amount) for eth_amount in arr_eth_amount if eth_amount < 0])
+        number_earn_main = sum(arr_eth_amount)
+
+        number_earn_percent = number_earn_main / \
+            number_cost_main if number_cost_main != 0 else -10
+        gdf["cost_main"] = number_cost_main
+        gdf["earn_main"] = number_earn_main
+        gdf["earn_percent"] = number_earn_percent
+
+        arr_firswap_token_amount = arr_token_amount.copy()
+        arr_firswap_eth_amount = arr_eth_amount.copy()
+
+        # swap_tokenaddress
+        small_sol_counts = 0
+        # 获取第一笔cost_eth
+         # 如果 arr_eth_amount[0]>0 则此交易为卖出 pass
+         # 如果 0>arr_eth_amount[0]>-0.04 此交易金额较小 pass
+        while len(arr_firswap_eth_amount) > 0:
+            if arr_firswap_eth_amount[0]>=0:
+                arr_firswap_eth_amount.pop(0)
+                arr_firswap_token_amount.pop(0)
+                arr_timestamp.pop(0)
+                continue
+            elif arr_firswap_eth_amount[0]<0 and arr_firswap_eth_amount[0]>-0.04:
+                arr_firswap_eth_amount.pop(0)
+                arr_firswap_token_amount.pop(0)
+                arr_timestamp.pop(0)
+                small_sol_counts+=1
+                if small_sol_counts==2:
+                    break
+                continue
+            else :
+                break
+        if small_sol_counts==2:
+            return gdf
+        if len(arr_firswap_eth_amount) == 0:
+            return gdf  
+
+        fir_swap_tokenamount = arr_firswap_token_amount[0]
+        fir_swap_costmain = abs(arr_firswap_eth_amount[0])
+        fir_swap_earntmain = -fir_swap_costmain
+        fir_buy_timestamp =int(arr_timestamp[0])
+        fir_sell_timestamp = 0
+
+        while len(arr_firswap_eth_amount) > 0:
+            if arr_firswap_eth_amount[0]<=0:
+                arr_firswap_eth_amount.pop(0)
+                arr_firswap_token_amount.pop(0)
+                arr_timestamp.pop(0)
+                continue
+            # 现在 swap_token 为负 , eth为正 代表 sell token
+            cur_swap_tokenamount = abs(arr_firswap_token_amount[0])
+            cur_swap_eth = arr_firswap_eth_amount[0]
+            fir_sell_timestamp = int(arr_timestamp[0])
+            arr_firswap_eth_amount.pop(0)
+            arr_firswap_token_amount.pop(0)
+            arr_timestamp.pop(0)
+            if fir_swap_tokenamount>=cur_swap_tokenamount:
+                fir_swap_earntmain+=cur_swap_eth
+                fir_swap_tokenamount-=cur_swap_tokenamount
+            else:
+                fir_swap_earntmain = fir_swap_earntmain+  fir_swap_tokenamount/cur_swap_tokenamount * cur_swap_eth
+                fir_swap_tokenamount=0
+            if fir_swap_tokenamount==0:
+                break
+        gdf['fir_cost_main'] = fir_swap_costmain
+        gdf["fir_earn_percent"] = fir_swap_earntmain / fir_swap_costmain  if fir_swap_costmain != 0 else -10
+        gdf["fir_noadd_earn_percent"] = fir_swap_earntmain / fir_swap_costmain  if fir_swap_costmain != 0 else -10
+        if issellfir==1 or gdf["outtoken_per"].tolist()[0]>1:
+            gdf["fir_noadd_earn_percent"] = -10
+        gdf["buy_sell_diftime"] = fir_sell_timestamp - fir_buy_timestamp
+        return gdf
+
+    df = df.groupby(["swap_tokenaddress"], group_keys=False).apply(
+        lambda gdf:  get_one_sol_profit(gdf))
+
+    return df
+
+
+
+
+def analysis_lastdays( df, now_unix_time, intervaldays=30):
+    if len(df) == 0:
+        return 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0,0
+    # need consider df may null if use iloc
+    lastdf = df[df["TokenFirstTime"] >=
+                now_unix_time - 3600*24*intervaldays]
+    # 去除那些earnper为-10的
+    lastdf = lastdf[lastdf['cost_main'] != 0]
+    # 去除 cost_main 过小的 <0.04  sol 理论上 同时fir_cost_main!=0
+    lastdf = lastdf[lastdf['cost_main'] >= 0.04]
+    lastdf = lastdf[lastdf['fir_cost_main'] != 0]
+    lastdf = lastdf[lastdf['issellfir'] ==0]
+
+
+    lastdf = lastdf.reset_index(drop=True)
+    if len(lastdf) == 0:
+        return 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0
+    last_mine_fir_earnper =  lastdf['fir_earn_percent'].sum()
+    last_mine_fir_earnper_dropmax = last_mine_fir_earnper- lastdf['fir_earn_percent'].max()
+    last_mine_fir_earnper_droptwomax = last_mine_fir_earnper - sum( lastdf['fir_earn_percent'].nlargest(2).tolist())
+
+    last_cost_sum = lastdf['cost_main'].sum()
+    last_earn_sum = lastdf['earn_main'].sum()
+    last_cost_median = lastdf['cost_main'].median()
+    last_cost_mean = lastdf['cost_main'].mean()
+    last_earnper = last_earn_sum / last_cost_sum if last_cost_sum != 0 else -10
+    last_trans_amount = len(lastdf)
+    lastdf['earn_percent'] = np.where(
+        lastdf['cost_main'] != 0,
+        lastdf['earn_main'] / lastdf['cost_main'],
+        -10,
+    )
+    earnmain_max = lastdf['earn_main'].max()
+    last_earn_difmax_sum = last_earn_sum - earnmain_max
+    last_cost_difmax_sum = last_cost_sum - \
+        lastdf[lastdf['earn_main'] == earnmain_max]['cost_main'].to_list()[0]
+    last_dif_earnper = (
+        last_earn_difmax_sum / last_cost_difmax_sum if last_cost_difmax_sum != 0 else -10
+    )
+    return (
+        last_cost_sum,
+        last_earn_sum,
+        last_earnper,
+        last_cost_difmax_sum,
+        last_earn_difmax_sum,
+        last_dif_earnper,
+        last_cost_median,
+        last_cost_mean,
+        # last_earncount_per,
+        last_trans_amount,
+        last_mine_fir_earnper,
+        last_mine_fir_earnper_dropmax,
+        last_mine_fir_earnper_droptwomax,
+    )
+
+def analysis_lastdays_noaddouttoken( df, now_unix_time, intervaldays=30):
+    if len(df) == 0:
+        return 0, 0, 0, 0, 0,  0, 0, 0, 0,0,0,0
+    # need consider df may null if use iloc
+    lastdf = df[df["TokenFirstTime"] >=
+                now_unix_time - 3600*24*intervaldays]
+    # 去除那些earnper为-10的
+    lastdf = lastdf[lastdf['cost_main'] != 0]
+    # 去除 cost_main 过小的 <0.04  sol 理论上 同时fir_cost_main!=0
+    lastdf = lastdf[lastdf['cost_main'] >= 0.04] 
+    lastdf = lastdf[lastdf['fir_cost_main'] != 0]
+    # fir_noadd_earn_percent
+    # 去除 第一笔交易是sell
+    lastdf = lastdf[lastdf['fir_noadd_earn_percent'] !=-10]
+    lastdf = lastdf[lastdf['issellfir'] ==0]
+    lastdf = lastdf.reset_index(drop=True)
+    if len(lastdf) == 0:
+        return 0, 0, 0, 0, 0,  0, 0, 0, 0,0,0,0
+    
+    last_mine_noadd_fir_earnper =  lastdf['fir_noadd_earn_percent'].sum()
+    last_mine_noadd_fir_earnper_dropmax = last_mine_noadd_fir_earnper- lastdf['fir_noadd_earn_percent'].max()
+    last_mine_noadd_fir_earnper_droptwomax = last_mine_noadd_fir_earnper - sum( lastdf['fir_noadd_earn_percent'].nlargest(2).tolist())
+    last_cost_sum = lastdf['cost_main'].sum()
+    last_earn_sum = lastdf['earn_main'].sum()
+    # last_earn_sum = lastdf["earn_main_noaddouttoken"].sum()
+    last_cost_median = lastdf['cost_main'].median()
+    last_cost_mean = lastdf['cost_main'].mean()
+    last_earnper = last_earn_sum / last_cost_sum if last_cost_sum != 0 else -10
+    last_trans_amount = len(lastdf)
+    lastdf['earn_percent'] = np.where(
+        lastdf['cost_main'] != 0,
+        lastdf["earn_main"] / lastdf['cost_main'],
+        -10,
+    )
+
+    earnmain_max = lastdf["earn_main"].max()
+    last_earn_difmax_sum = last_earn_sum - earnmain_max
+    last_cost_difmax_sum = last_cost_sum - \
+        lastdf[lastdf['earn_main'] == earnmain_max]['cost_main'].to_list()[
+            0]
+    last_dif_earnper = (
+        last_earn_difmax_sum / last_cost_difmax_sum if last_cost_difmax_sum != 0 else -10
+    )
+    return (
+        last_cost_sum,
+        last_earn_sum,
+        last_earnper,
+        last_cost_difmax_sum,
+        last_earn_difmax_sum,
+        last_dif_earnper,
+        last_cost_median,
+        last_cost_mean,
+        # last_earncount_per,
+        last_trans_amount,
+        last_mine_noadd_fir_earnper , 
+        last_mine_noadd_fir_earnper_dropmax ,
+        last_mine_noadd_fir_earnper_droptwomax
+    )
+
+def analysis_lastdays_earn_kuisun_counts(df ,now_unix_time,intervaldays ):
+    if len(df) == 0:
+        return 0, 0, 0, 0, 0, 0, 0 ,0,0,0,0,0,0
+    # need consider df may null if use iloc
+    lastdf = df[df["TokenFirstTime"] >=
+                now_unix_time - 3600*24*intervaldays]
+    # 去除那些earnper为-10的
+    lastdf = lastdf[lastdf['cost_main'] != 0]
+    # 去除 cost_main 过小的 <0.04  sol 理论上 同时fir_cost_main!=0
+    lastdf = lastdf[lastdf['cost_main'] >= 0.04] 
+    lastdf = lastdf[lastdf['fir_cost_main'] != 0]
+    # fir_noadd_earn_percent
+    # 去除 第一笔交易是sell
+    lastdf = lastdf[lastdf['fir_noadd_earn_percent'] !=-10]
+    lastdf = lastdf[lastdf['issellfir'] ==0]
+    lastdf = lastdf.reset_index(drop=True)
+    if len(lastdf) == 0:
+        return 0, 0, 0, 0, 0, 0, 0 ,0,0,0,0,0,0
+    
+
+    last_bigbig_earn_counts = len( lastdf[lastdf['fir_noadd_earn_percent']>=1])
+    last_big_earn_counts = len( lastdf[(lastdf['fir_noadd_earn_percent']>=0.5 )& (lastdf['fir_noadd_earn_percent']<1 ) ])
+    last_nor_earn_counts = len( lastdf[(lastdf['fir_noadd_earn_percent']>=0.05 )& (lastdf['fir_noadd_earn_percent']<0.5 ) ])
+
+    last_nor_kuisun_counts = len( lastdf[(lastdf['fir_noadd_earn_percent']>=-0.2 )& (lastdf['fir_noadd_earn_percent']<0.05 ) ])
+    last_big_kuisun_counts = len( lastdf[(lastdf['fir_noadd_earn_percent']>=-0.5 )& (lastdf['fir_noadd_earn_percent']<-0.2 ) ])
+    last_bigbig_kuisun_counts = len( lastdf[ (lastdf['fir_noadd_earn_percent']<-0.5 ) ])
+
+    last_total_counts = len( lastdf)
+    last_bigbig_earn_per = last_bigbig_earn_counts /last_total_counts  if last_total_counts!=0 else -10
+    last_big_earn_per = last_big_earn_counts / last_total_counts  if last_total_counts!=0 else -10
+    last_nor_earn_per = last_nor_earn_counts / last_total_counts if last_total_counts!=0 else -10
+    last_nor_kuisun_per = last_nor_kuisun_counts /last_total_counts  if last_total_counts!=0 else -10
+    last_big_kuisun_per= last_big_kuisun_counts / last_total_counts  if last_total_counts!=0 else -10
+    last_bigbig_kuisun_per = last_bigbig_kuisun_counts / last_total_counts if last_total_counts!=0 else -10
+
+    return (
+        last_bigbig_earn_counts,
+        last_big_earn_counts,
+        last_nor_earn_counts,
+        last_nor_kuisun_counts,
+        last_big_kuisun_counts,
+        last_bigbig_kuisun_counts,
+        last_total_counts,
+        last_bigbig_earn_per ,
+        last_big_earn_per ,
+        last_nor_earn_per ,
+        last_nor_kuisun_per ,
+        last_big_kuisun_per,
+        last_bigbig_kuisun_per ,
+    ) 
+
+
+
+    
+    return
+def get_analyres(df,  dalao_address, now_unix_time):
+    (last_03d_cost, last_03d_earn, last_03d_earnper, last_03d_difcost, last_03d_difearn, last_03d_difper, last_03d_costmedian, last_03d_costmean,    last_03d_trans , last_03d_mine_fir_earnper ,last_03d_mine_fir_earnper_dropmax, last_03d_mine_fir_earnper_droptwomax   ) = analysis_lastdays(
+        df, now_unix_time=now_unix_time, intervaldays=3
+    )
+    (last_07d_cost, last_07d_earn, last_07d_earnper, last_07d_difcost, last_07d_difearn, last_07d_difper, last_07d_costmedian, last_07d_costmean,   last_07d_trans , last_07d_mine_fir_earnper ,last_07d_mine_fir_earnper_dropmax, last_07d_mine_fir_earnper_droptwomax  ) = analysis_lastdays(
+        df, now_unix_time=now_unix_time, intervaldays=7
+    )
+    (last_11d_cost, last_11d_earn, last_11d_earnper, last_11d_difcost, last_11d_difearn, last_11d_difper, last_11d_costmedian, last_11d_costmean,  last_11d_trans , last_11d_mine_fir_earnper ,last_11d_mine_fir_earnper_dropmax , last_11d_mine_fir_earnper_droptwomax ) = analysis_lastdays(
+        df, now_unix_time=now_unix_time, intervaldays=11
+    )
+    (last_15d_cost, last_15d_earn, last_15d_earnper, last_15d_difcost, last_15d_difearn, last_15d_difper, last_15d_costmedian, last_15d_costmean,   last_15d_trans , last_15d_mine_fir_earnper ,last_15d_mine_fir_earnper_dropmax , last_15d_mine_fir_earnper_droptwomax ) = analysis_lastdays(
+        df, now_unix_time=now_unix_time, intervaldays=15
+    )
+    # # 去除所有daxin
+    # df = df[df["isdaxin"] == "0"].reset_index(drop=True)
+
+    (last_03d_cost_noaddouttoken, last_03d_earn_noaddouttoken, last_03d_earnper_noaddouttoken, last_03d_difcost_noaddouttoken, last_03d_difearn_noaddouttoken, last_03d_difper_noaddouttoken, last_03d_costmedian_noaddouttoken, last_03d_costmean_noaddouttoken,   last_03d_trans ,
+     last_03d_mine_noadd_fir_earnper , last_03d_mine_noadd_fir_earnper_dropmax , last_03d_mine_noadd_fir_earnper_droptwomax ) = analysis_lastdays_noaddouttoken(
+        df, now_unix_time=now_unix_time, intervaldays=3
+    )
+    (last_07d_cost_noaddouttoken, last_07d_earn_noaddouttoken, last_07d_earnper_noaddouttoken, last_07d_difcost_noaddouttoken, last_07d_difearn_noaddouttoken, last_07d_difper_noaddouttoken, last_07d_costmedian_noaddouttoken, last_07d_costmean_noaddouttoken,   last_07d_trans,
+     last_07d_mine_noadd_fir_earnper , last_07d_mine_noadd_fir_earnper_dropmax , last_07d_mine_noadd_fir_earnper_droptwomax) = analysis_lastdays_noaddouttoken(
+        df, now_unix_time=now_unix_time, intervaldays=7
+    )
+    (last_11d_cost_noaddouttoken, last_11d_earn_noaddouttoken, last_11d_earnper_noaddouttoken, last_11d_difcost_noaddouttoken, last_11d_difearn_noaddouttoken, last_11d_difper_noaddouttoken, last_11d_costmedian_noaddouttoken, last_11d_costmean_noaddouttoken,    last_11d_trans,
+     last_11d_mine_noadd_fir_earnper , last_11d_mine_noadd_fir_earnper_dropmax , last_11d_mine_noadd_fir_earnper_droptwomax) = analysis_lastdays_noaddouttoken(
+        df, now_unix_time=now_unix_time, intervaldays=11
+    )
+    (last_15d_cost_noaddouttoken, last_15d_earn_noaddouttoken, last_15d_earnper_noaddouttoken, last_15d_difcost_noaddouttoken, last_15d_difearn_noaddouttoken, last_15d_difper_noaddouttoken, last_15d_costmedian_noaddouttoken, last_15d_costmean_noaddouttoken,   last_15d_trans,
+     last_15d_mine_noadd_fir_earnper , last_15d_mine_noadd_fir_earnper_dropmax , last_15d_mine_noadd_fir_earnper_droptwomax) = analysis_lastdays_noaddouttoken(
+        df, now_unix_time=now_unix_time, intervaldays=15
+    )
+
+    (last_03d_bigbig_earn_counts, last_03d_big_earn_counts, last_03d_nor_earn_counts, last_03d_nor_kuisun_counts,last_03d_big_kuisun_counts,last_03d_bigbig_kuisun_counts ,last_03d_total_counts, 
+    last_03d_bigbig_earn_per , last_03d_big_earn_per ,    last_03d_nor_earn_per ,    last_03d_nor_kuisun_per ,    last_03d_big_kuisun_per,    last_03d_bigbig_kuisun_per
+      )  = analysis_lastdays_earn_kuisun_counts(
+        df, now_unix_time=now_unix_time, intervaldays=3
+    )
+    (last_07d_bigbig_earn_counts, last_07d_big_earn_counts, last_07d_nor_earn_counts, last_07d_nor_kuisun_counts,last_07d_big_kuisun_counts,last_07d_bigbig_kuisun_counts ,last_07d_total_counts,
+      last_07d_bigbig_earn_per , last_07d_big_earn_per , last_07d_nor_earn_per , last_07d_nor_kuisun_per , last_07d_big_kuisun_per, last_07d_bigbig_kuisun_per
+    )  = analysis_lastdays_earn_kuisun_counts(
+        df, now_unix_time=now_unix_time, intervaldays=7
+    )
+    (last_11d_bigbig_earn_counts, last_11d_big_earn_counts, last_11d_nor_earn_counts, last_11d_nor_kuisun_counts,last_11d_big_kuisun_counts,last_11d_bigbig_kuisun_counts ,last_11d_total_counts,
+     last_11d_bigbig_earn_per , last_11d_big_earn_per , last_11d_nor_earn_per , last_11d_nor_kuisun_per , last_11d_big_kuisun_per, last_11d_bigbig_kuisun_per
+        ) = analysis_lastdays_earn_kuisun_counts(
+        df, now_unix_time=now_unix_time, intervaldays=11
+    )
+    (last_15d_bigbig_earn_counts, last_15d_big_earn_counts, last_15d_nor_earn_counts, last_15d_nor_kuisun_counts,last_15d_big_kuisun_counts,last_15d_bigbig_kuisun_counts ,last_15d_total_counts,
+     last_15d_bigbig_earn_per ,  last_15d_big_earn_per , last_15d_nor_earn_per , last_15d_nor_kuisun_per , last_15d_big_kuisun_per, last_15d_bigbig_kuisun_per
+        ) = analysis_lastdays_earn_kuisun_counts(
+        df, now_unix_time=now_unix_time, intervaldays=15
+    )
+    dalao_rul =  f"https://solscan.io/account/{dalao_address}"
+    
+    analist = [
+        dalao_address,
+        dalao_rul,
+        "",
+        last_03d_cost,
+        last_03d_earn,
+        last_03d_earnper,
+        last_03d_difcost,
+        last_03d_difearn,
+        last_03d_difper,
+        last_03d_costmedian,
+        last_03d_costmean,
+
+        last_03d_cost_noaddouttoken,
+        last_03d_earn_noaddouttoken,
+        last_03d_earnper_noaddouttoken,
+        # last_03d_difcost_noaddouttoken,
+        # last_03d_difearn_noaddouttoken,
+        # last_03d_difper_noaddouttoken,
+        # last_03d_costmedian_noaddouttoken,
+        # last_03d_costmean_noaddouttoken,
+        last_03d_mine_fir_earnper,
+        last_03d_mine_fir_earnper_dropmax,
+        last_03d_mine_fir_earnper_droptwomax,
+        last_03d_mine_noadd_fir_earnper ,
+        last_03d_mine_noadd_fir_earnper_dropmax ,
+        last_03d_mine_noadd_fir_earnper_droptwomax,
+        last_03d_trans,
+
+        last_07d_cost,
+        last_07d_earn,
+        last_07d_earnper,
+        last_07d_difcost,
+        last_07d_difearn,
+        last_07d_difper,
+        last_07d_costmedian,
+        last_07d_costmean,
+
+        last_07d_cost_noaddouttoken,
+        last_07d_earn_noaddouttoken,
+        last_07d_earnper_noaddouttoken,
+        # last_07d_difcost_noaddouttoken,
+        # last_07d_difearn_noaddouttoken,
+        # last_07d_difper_noaddouttoken,
+        # last_07d_costmedian_noaddouttoken,
+        # last_07d_costmean_noaddouttoken,
+        last_07d_mine_fir_earnper,
+        last_07d_mine_fir_earnper_dropmax,
+        last_07d_mine_fir_earnper_droptwomax,
+        last_07d_mine_noadd_fir_earnper ,
+        last_07d_mine_noadd_fir_earnper_dropmax ,
+        last_07d_mine_noadd_fir_earnper_droptwomax,
+        last_07d_trans,
+
+        last_11d_cost,
+        last_11d_earn,
+        last_11d_earnper,
+        last_11d_difcost,
+        last_11d_difearn,
+        last_11d_difper,
+        last_11d_costmedian,
+        last_11d_costmean,
+
+        last_11d_cost_noaddouttoken,
+        last_11d_earn_noaddouttoken,
+        last_11d_earnper_noaddouttoken,
+        # last_11d_difcost_noaddouttoken,
+        # last_11d_difearn_noaddouttoken,
+        # last_11d_difper_noaddouttoken,
+        # last_11d_costmedian_noaddouttoken,
+        # last_11d_costmean_noaddouttoken,
+        last_11d_mine_fir_earnper,
+        last_11d_mine_fir_earnper_dropmax,
+        last_11d_mine_fir_earnper_droptwomax,
+        last_11d_mine_noadd_fir_earnper , 
+        last_11d_mine_noadd_fir_earnper_dropmax , 
+        last_11d_mine_noadd_fir_earnper_droptwomax ,
+        last_11d_trans,
+
+
+        last_15d_cost,
+        last_15d_earn,
+        last_15d_earnper,
+        last_15d_difcost,
+        last_15d_difearn,
+        last_15d_difper,
+        last_15d_costmedian,
+        last_15d_costmean,
+
+        last_15d_cost_noaddouttoken,
+        last_15d_earn_noaddouttoken,
+        last_15d_earnper_noaddouttoken,
+        # last_15d_difcost_noaddouttoken,
+        # last_15d_difearn_noaddouttoken,
+        # last_15d_difper_noaddouttoken,
+        # last_15d_costmedian_noaddouttoken,
+        # last_15d_costmean_noaddouttoken,
+        last_15d_mine_fir_earnper,
+        last_15d_mine_fir_earnper_dropmax,
+        last_15d_mine_fir_earnper_droptwomax,
+        last_15d_mine_noadd_fir_earnper , 
+        last_15d_mine_noadd_fir_earnper_dropmax , 
+        last_15d_mine_noadd_fir_earnper_droptwomax,
+        last_15d_trans,
+
+        last_15d_earn-last_15d_earn_noaddouttoken,
+        last_15d_mine_fir_earnper - last_15d_mine_noadd_fir_earnper,
+    ]
+
+    arr_earn_kuisun_counts=[
+     dalao_address,
+    dalao_rul,
+    "",
+    last_03d_bigbig_earn_counts, last_03d_big_earn_counts, last_03d_nor_earn_counts,
+    last_03d_nor_kuisun_counts,last_03d_big_kuisun_counts,last_03d_bigbig_kuisun_counts ,
+    last_03d_bigbig_earn_per,  last_03d_big_earn_per ,    last_03d_nor_earn_per ,    
+    last_03d_nor_kuisun_per ,    last_03d_big_kuisun_per,    last_03d_bigbig_kuisun_per,
+    last_03d_total_counts ,  
+
+    last_07d_bigbig_earn_counts, last_07d_big_earn_counts, last_07d_nor_earn_counts, 
+    last_07d_nor_kuisun_counts,last_07d_big_kuisun_counts,last_07d_bigbig_kuisun_counts ,
+    last_07d_bigbig_earn_per , last_07d_big_earn_per , last_07d_nor_earn_per ,
+    last_07d_nor_kuisun_per , last_07d_big_kuisun_per, last_07d_bigbig_kuisun_per,
+    last_07d_total_counts  , 
+
+    last_11d_bigbig_earn_counts, last_11d_big_earn_counts, last_11d_nor_earn_counts,
+    last_11d_nor_kuisun_counts,last_11d_big_kuisun_counts,last_11d_bigbig_kuisun_counts ,
+    last_11d_bigbig_earn_per , last_11d_big_earn_per , last_11d_nor_earn_per ,
+    last_11d_nor_kuisun_per , last_11d_big_kuisun_per, last_11d_bigbig_kuisun_per,
+	 
+    last_11d_total_counts   ,
+
+    last_15d_bigbig_earn_counts, last_15d_big_earn_counts, last_15d_nor_earn_counts,
+    last_15d_nor_kuisun_counts,last_15d_big_kuisun_counts,last_15d_bigbig_kuisun_counts ,
+    last_15d_bigbig_earn_per ,  last_15d_big_earn_per , last_15d_nor_earn_per , 
+    last_15d_nor_kuisun_per , last_15d_big_kuisun_per, last_15d_bigbig_kuisun_per,
+    last_15d_total_counts  ,
+
+    ]
+
+
+
+    global TotalAnalysis_list
+    global total_arr_earn_kuisun
+    TotalAnalysis_list.append(analist)
+    total_arr_earn_kuisun.append(arr_earn_kuisun_counts)
+
+
+def calute_days(df, now_unix_time):
+    df["diffdays"] = 0
+    intervaldays_list = [15, 11, 7, 3]
+    for intervaldays in intervaldays_list:
+        df.loc[df["TokenFirstTime"] >=
+               now_unix_time - 3600*24*intervaldays, "diffdays"] = intervaldays
+    return df
+
+
+def calucate_earnmain_dropoutoken(row):
+    earnmain_amount_dropoutoken = decimal.Decimal(row['earn_main'])
+    outtoken_per = decimal.Decimal(row["outtoken_per"])
+    issellfir = row["issellfir"]
+
+    # if outtoken_per >= 1.1 or outtoken_per == -10 
+    if outtoken_per > 1 or issellfir==0:
+        earnmain_amount_dropoutoken = decimal.Decimal(0)
+    earnmain_amount_dropoutoken_str = '{0:.4f}'.format(
+        earnmain_amount_dropoutoken)
+    return float(earnmain_amount_dropoutoken_str)
+
+
+def makeDexurl(row, dalao_address):
+    tokenAddress = row['swap_tokenaddress']
+    urlname = f"https://dexscreener.com/solana/{tokenAddress}?maker={dalao_address}"
+    return '=HYPERLINK("{}","{}")'.format(urlname, "DEX/"+tokenAddress)
+
+
+def get_ana_df(dalao_address, df, success_address_list, onetxhash_onerow_ana_df):
+    onedalao_ana_df = df[onedalao_ana_columns].drop_duplicates(
+    ).reset_index(drop=True)
+    onedalao_ana_df.insert(
+        loc=2, column="swap_tokenadd_dexurl", value="")
+
+    onedalao_ana_df['swap_tokenadd_dexurl'] = onedalao_ana_df.apply(
+        lambda row: makeDexurl(row, dalao_address), axis=1)
+    onedalao_ana_df["FirstDateTime"] = pd.to_datetime(
+        onedalao_ana_df['TokenFirstTime'], unit='s')
+    # 如果outoken超了,earn_main_noaddouttoken 的值有两种处理方式
+    # 一种设置为0 即为不亏不赚
+    # 一种为全负  即为全亏了
+    # onedalao_ana_df["earn_main_noaddouttoken"] = onedalao_ana_df.apply(
+    #     lambda row: calucate_earnmain_dropoutoken(row), axis=1)
+
+    get_analyres(df=onedalao_ana_df, dalao_address=dalao_address,
+                 now_unix_time=now_unix_time)
+
+    onedalao_ana_df = calute_days(
+        df=onedalao_ana_df, now_unix_time=now_unix_time)
+
+    handle_onedalao_ana_df = onedalao_ana_df[onedalao_ana_df['cost_main'] != 0].reset_index(
+        drop=True)
+
+    baseclass.makedirpath(baseclass.dalao_ana_fm_path / dalao_address)
+
+    onedalao_ana_df.to_csv(baseclass.dalao_ana_fm_path /
+                           dalao_address/f"analysisprofit_{dalao_address}.csv", index=False)
+    handle_onedalao_ana_df.to_csv(baseclass.dalao_ana_fm_path /
+                                  dalao_address/f"analysisprofit_handle_{dalao_address}.csv", index=False)
+    onetxhash_onerow_ana_df.to_csv(baseclass.dalao_ana_fm_path /
+                                   dalao_address/f"onetxhash_onerow_profit_{dalao_address}.csv", index=False)
+
+    success_address_list.remove(dalao_address)
+
+
+def get_profit_st(str_dalao_address):
+
+    if not (baseclass.dalao_configtoken_st_solanafm_path /
+            f"configtoken_{str_dalao_address}.csv").exists():
+        return None
+    # print(f"enter get_profit_st dalao_address= {str_dalao_address} \n", end='')
+    df = pd.read_csv(baseclass.dalao_configtoken_st_solanafm_path /
+                     f"configtoken_{str_dalao_address}.csv", dtype=object)
+    #  timestamp	sign	source	destination	token	amount	swap_tokenadd	swap_eth_amount	swap_token_amount	token_idx  dalaofirsttimestamp
+    df["timestamp"] = df["timestamp"].astype(int)
+    df['dalaofirsttimestamp'] = pd.to_datetime(
+        df['dalaofirsttimestamp'] )
+    df["dexurl"] = df.apply(lambda ser: (f'https://dexscreener.com/solana/{ser["swap_tokenaddress"]}?maker={str_dalao_address}' ), axis=1)
+    df["TokenFirstTime"] = df.groupby("token_idx")[
+        "timestamp"].transform("min")
+    df = calute_days(
+        df=df, now_unix_time=now_unix_time)
+    df = df.sort_values(by=["dalaofirsttimestamp", 'swap_tokenaddress', 'timestamp'], ascending=[
+        False, True, True]).reset_index(drop=True)
+    onetxhash_onerow_ana_df = df.copy()
+    onetxhash_onerow_ana_df = onetxhash_onerow_ana_df[["timestamp", "TokenFirstTime", 
+                                                       "sign", "swap_tokenaddress","dexurl","platform","swap_type",
+                                                       "swap_eth_amount", "swap_token_amount",
+                                                       "dalaofirsttimestamp","diffdays"]]
+
+    onetxhash_onerow_ana_df = onetxhash_onerow_ana_df.astype(
+        {'swap_eth_amount': float})
+    # 计算一个txhash的 tokenamount swap 数目
+    onetxhash_onerow_ana_df = get_txhash_tokenswap_amount(
+        df=onetxhash_onerow_ana_df)
+    # 计算一个txhash的sol swap 数目
+    earnMain_df = (
+        onetxhash_onerow_ana_df
+        .groupby('sign')["swap_eth_amount"]
+        .sum()
+    )
+    onetxhash_onerow_ana_df['swap_eth_amount'] = onetxhash_onerow_ana_df["sign"].map(
+        earnMain_df)
+
+    onetxhash_onerow_ana_df = onetxhash_onerow_ana_df.drop_duplicates().reset_index(drop=True)
+    onetxhash_onerow_ana_df = get_tokenswap_amount(df=onetxhash_onerow_ana_df)
+    onetxhash_onerow_ana_df = onetxhash_onerow_ana_df.sort_values(by=["dalaofirsttimestamp", 'swap_tokenaddress', 'timestamp'], ascending=[
+        False, True, True]).reset_index(drop=True)
+    onetxhash_onerow_ana_df = get_sol_profit(df=onetxhash_onerow_ana_df)
+
+    onetxhash_onerow_ana_df["datetime"] = pd.to_datetime(
+        onetxhash_onerow_ana_df["timestamp"], unit='s')
+
+    onetxhash_onerow_ana_df=onetxhash_onerow_ana_df[onetxhash_onerow_ana_cols]
+    onetxhash_onerow_ana_df.to_csv(
+        baseclass.dalao_profit_st_fm_path / f"onetxhash_onerow_profit_{str_dalao_address}.csv", index=False)
+    # onetxhash_onerow_ana_df=pd.DataFrame()
+    def set_platform(gdf):
+        if  "unknown" in  gdf["platform"]:
+            gdf["platform"] =  "unknown" 
+            print("unknow in plat")
+        return gdf
+    
+    onetxhash_onerow_ana_df.groupby(by=["swap_tokenaddress"]).apply(lambda gdf : set_platform(gdf))                                                                  
+
+    onetxhash_onerow_ana_dropdup_df = onetxhash_onerow_ana_df.drop_duplicates(subset=["swap_tokenaddress"]).reset_index(drop=True)
+ 
+    onetxhash_onerow_ana_dropdup_df.to_csv(
+        baseclass.dalao_profit_st_fm_path / f"onetxhash_onerow_profit_dropdup_{str_dalao_address}.csv", index=False)
+    
+    return onetxhash_onerow_ana_df
+
+
+def get_dalaoaddress_list():
+    df = pd.read_csv(baseclass.dalao_merge_path /
+                     "filter_dalao.csv", dtype=object)
+    arr_dalao_address = df["dalaoAddress"].tolist()
+    return arr_dalao_address
+
+
+def save_earn_kuisun_df():
+     
+    global total_arr_earn_kuisun
+    totalana_earn_kuisun_df = pd.DataFrame(
+        data=total_arr_earn_kuisun, columns=earn_kuisun_columns
+    )
+    totalana_earn_kuisun_df = totalana_earn_kuisun_df.round(4)
+    totalana_earn_kuisun_df = totalana_earn_kuisun_df.sort_values(by=["add"], ascending=[
+        True]).reset_index(drop=True)
+    totalana_earn_kuisun_df.to_excel(
+        baseclass.dalao_total_ana_fm_path/f"totalana_earn_kuisun_df.xlsx", index=False)
+    
+    return
+def save_total_ana_df():
+    global TotalAnalysis_list
+    TotalAnalysis_df = pd.DataFrame(
+        data=TotalAnalysis_list, columns=TotalAnalysis_columns
+    )
+
+    TotalAnalysis_df = TotalAnalysis_df.round(4)
+    TotalAnalysis_df = TotalAnalysis_df.sort_values(by=["add"], ascending=[
+        True]).reset_index(drop=True)
+ 
+    TotalAnalysis_df.to_csv(
+        baseclass.dalao_total_ana_fm_path/f"totalana.csv", index=False)
+
+    TotalAnalysis_df.to_excel(
+        baseclass.dalao_total_ana_fm_path/f"totalana.xlsx", index=False)
+
+    # mine_fir_earnper_filter_mask = (
+    #     (TotalAnalysis_df["15d_mine_fir_earnper"] >=
+    #      0.8*TotalAnalysis_df["11d_mine_fir_earnper"])
+    #     & (TotalAnalysis_df["11d_mine_fir_earnper"] >= 0.8*TotalAnalysis_df["07d_mine_fir_earnper"])
+    # )
+    # mine_fir_earnper_dropmax_filter_mask = (
+    #     (TotalAnalysis_df["15d_mine_fir_earnper_dropmax"] >=
+    #      0.8*TotalAnalysis_df["11d_mine_fir_earnper_dropmax"])
+    #     & (TotalAnalysis_df["11d_mine_fir_earnper_dropmax"] >= 0.8*TotalAnalysis_df["07d_mine_fir_earnper_dropmax"])
+    # )
+    
+    mine_noadd_fir_earnper_filter_mask = (
+        (TotalAnalysis_df["15d_mine_noadd_fir_earnper"] >=
+         0.8*TotalAnalysis_df["11d_mine_noadd_fir_earnper"])
+        & (TotalAnalysis_df["11d_mine_noadd_fir_earnper"] >= 0.8*TotalAnalysis_df["07d_mine_noadd_fir_earnper"])
+    )
+   
+    mine_noadd_fir_earnper_dropmax_filter_mask = (
+        (TotalAnalysis_df["15d_mine_noadd_fir_earnper_dropmax"] >=
+         0.8*TotalAnalysis_df["11d_mine_noadd_fir_earnper_dropmax"])
+        & (TotalAnalysis_df["11d_mine_noadd_fir_earnper_dropmax"] >= 0.8*TotalAnalysis_df["07d_mine_noadd_fir_earnper_dropmax"])
+    )
+
+    filter_mask = (
+
+        # mine_fir_earnper_filter_mask
+        # | mine_fir_earnper_dropmax_filter_mask
+          mine_noadd_fir_earnper_filter_mask
+        | mine_noadd_fir_earnper_dropmax_filter_mask
+    )
+    increase_TotalAnalysis_df = TotalAnalysis_df[filter_mask].reset_index(
+        drop=True)
+    increase_TotalAnalysis_df.to_excel(
+        baseclass.dalao_total_ana_fm_path/f"increase_totalana.xlsx", index=False)
+    last_07d_has_mask = (increase_TotalAnalysis_df["07d_trans"]== increase_TotalAnalysis_df["11d_trans"])
+    last_07d_increase_TotalAnalysis_df = increase_TotalAnalysis_df[last_07d_has_mask]
+    increase_TotalAnalysis_df.to_excel(
+        baseclass.dalao_total_ana_fm_path/f"increase_totalana_07d.xlsx", index=False)
+
+def get_mul_profit_st():
+    global arr_str_dalaoaddress
+    success_address_list = arr_str_dalaoaddress.copy()
+    for idx in range(0, len(arr_str_dalaoaddress), batchSize):
+        thread_list = []
+        for cur_idx in range(idx, min(idx+batchSize, len(arr_str_dalaoaddress))):
+            thread = threading.Thread(
+                target=get_one_profit_st,
+                args=(arr_str_dalaoaddress[cur_idx],
+                      success_address_list, cur_idx)
+            )
+            thread_list.append(thread)
+        for thread in thread_list:
+            thread.start()
+        for thread in thread_list:
+            thread.join()
+
+
+def get_one_profit_st(dalao_address, success_address_list, cur_idx):
+    try:
+        df = None
+        onetxhash_onerow_ana_df = None
+        print(f"get_one_profit_st cur_idx={cur_idx} dalao_address={dalao_address}\n", end='')
+
+        onetxhash_onerow_ana_df = get_profit_st(
+            str_dalao_address=dalao_address)
+        if onetxhash_onerow_ana_df is None:
+            print(f"get_one_profit_st cur_idx={cur_idx} is None \n", end='')
+            return
+        get_ana_df(dalao_address=dalao_address, df=onetxhash_onerow_ana_df,
+                success_address_list=success_address_list, onetxhash_onerow_ana_df=onetxhash_onerow_ana_df)
+        print(f"cur_idx={cur_idx} end \n", end='')
+        return
+    except Exception as e:
+        print(f"error_dalao_address={dalao_address}")
+        raise
+
+batchSize = 5
+TotalAnalysis_list = []
+total_arr_earn_kuisun =[]
+now_unix_time = int(time.time())
+
+df = pd.read_excel(baseclass.dalao_total_ana_fm_path /
+                   "anaing_dalao.xlsx", dtype=object)
+
+arr_str_dalaoaddress = df["add"].tolist()
+arr_str_dalaoaddress.append(baseclass.mywalletaddress)
+# arr_str_dalaoaddress = arr_str_dalaoaddress[0:2]
+# arr_str_dalaoaddress = ['H5P5xig8WjcDQrzyR4HaKcrg4hd2vh5DLPnFs4ypNE1X']
+print(f"arr_str_dalaoaddress len= {len(arr_str_dalaoaddress)}")
+get_mul_profit_st()
+save_total_ana_df()
+save_earn_kuisun_df()
+print(f"arr_str_dalaoaddress len= {len(arr_str_dalaoaddress)} \n", end='')
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 185 - 0
src/code/031_get_dalao_kuisun_per.py

@@ -0,0 +1,185 @@
+
+
+# 如果 dalao数目比较多还无法根据earnper为负进行筛选 使用此方法去除 earn_per 为负比例较高的 dalao
+
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+
+
+baseclass.makedirpath(baseclass.new_dalao_ana_fm_path)
+
+baseclass.open_base_library()
+decimal.getcontext().prec = 100
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+
+def makescreenurl(urlname, urlparam):
+    urlname = urlname + urlparam
+    return '=HYPERLINK("{}","{}")'.format(urlname, urlname)
+
+
+total_dalao_profit_df = pd.read_excel(baseclass.dalao_total_ana_fm_path /
+                                      f"total_dalao_profit_df.xlsx", dtype=object)
+
+total_dalao_profit_df["datetime"] = pd.to_datetime(
+    total_dalao_profit_df["datetime"])
+
+total_dalao_profit_df["dalaofirsttimestamp"] = pd.to_datetime(
+    total_dalao_profit_df["dalaofirsttimestamp"])
+
+total_dalao_profit_df = total_dalao_profit_df.astype({
+    'timestamp': int,
+    'buy_counts': int,
+    'sell_counts': int,
+    'swap_eth_amount': float,
+    'outtoken_per': float,
+    'cost_main': float,
+    'earn_main': float,
+    'earn_percent': float,
+    "fir_cost_main":float,
+    'fir_earn_percent':float,
+}
+)
+
+# df = df[(df["outtoken_per"] <= 1.1)].reset_index(drop=True)
+total_dalao_profit_df = total_dalao_profit_df[total_dalao_profit_df["cost_main"] != 0].reset_index(
+    drop=True)
+total_dalao_profit_df = total_dalao_profit_df[total_dalao_profit_df["fir_cost_main"] != 0].reset_index(
+    drop=True)
+
+outtokenper_total_dalao_profit_df = total_dalao_profit_df[["swap_tokenaddress","outtoken_per", "cost_main",	"earn_main", "earn_percent","fir_earn_percent",	"dalaoaddress",
+                                               "dalaofirsttimestamp"]].drop_duplicates().reset_index(drop=True)
+
+
+total_dalao_profit_df = total_dalao_profit_df[["swap_tokenaddress", "cost_main",	"earn_main", "earn_percent","fir_earn_percent",	"dalaoaddress",
+                                               "dalaofirsttimestamp"]].drop_duplicates().reset_index(drop=True)
+
+
+new_repeat_token_df = pd.read_excel(
+    baseclass.dalao_total_ana_fm_path/"new_repeat_token_df.xlsx", dtype=object)
+
+# new_repeat_token_df = new_repeat_token_df[new_repeat_token_df["add"].isin(
+#     arr_forfilter_token)]
+# new_repeat_token_df.to_excel(
+#     baseclass.dalao_total_ana_fm_path/"fiterkuisun_repeat_token_df.xlsx", index=False)
+
+totalana_anaing_dalao_df = pd.read_excel(
+    baseclass.dalao_total_ana_fm_path/"totalana_anaing_dalao.xlsx", dtype=object)
+
+arr_dalaoaddress_totalana_anaing_dalao = totalana_anaing_dalao_df["add"].tolist(
+)
+obj_str_dalaoaddress_2_buytokencounts = {}
+
+for str_dalaoaddress in arr_dalaoaddress_totalana_anaing_dalao:
+    # [购买次数, eran为负的次数]
+    obj_str_dalaoaddress_2_buytokencounts[str_dalaoaddress] = [0,0, 0,0,0,0,0,0]
+
+
+# 计算dalao的对于这些共同token的盈利比例等情况
+
+for str_dalaoaddress in arr_dalaoaddress_totalana_anaing_dalao:
+    cur_dalao_df = outtokenper_total_dalao_profit_df[outtokenper_total_dalao_profit_df["dalaoaddress"]
+                                         == str_dalaoaddress].reset_index(drop=True)
+
+    obj_str_dalaoaddress_2_buytokencounts[str_dalaoaddress][0] = len(
+        cur_dalao_df)
+    obj_str_dalaoaddress_2_buytokencounts[str_dalaoaddress][1] = len(
+        cur_dalao_df[cur_dalao_df["fir_earn_percent"] >=1])
+    
+    obj_str_dalaoaddress_2_buytokencounts[str_dalaoaddress][2] = len(
+        cur_dalao_df[(cur_dalao_df["fir_earn_percent"] >=0.5) & ( cur_dalao_df["fir_earn_percent"] <1)  ])
+    
+    obj_str_dalaoaddress_2_buytokencounts[str_dalaoaddress][3] = len(
+        cur_dalao_df[(cur_dalao_df["fir_earn_percent"] >=0) & ( cur_dalao_df["fir_earn_percent"] <0.5) ] 
+    )
+    obj_str_dalaoaddress_2_buytokencounts[str_dalaoaddress][4] = len(
+      cur_dalao_df[ (cur_dalao_df["fir_earn_percent"] >= -0.2 ) & ( cur_dalao_df["fir_earn_percent"] <0) ]           
+    )  
+       
+    obj_str_dalaoaddress_2_buytokencounts[str_dalaoaddress][5] = len(
+        cur_dalao_df[(cur_dalao_df["fir_earn_percent"] < -0.2 ) & ( cur_dalao_df["fir_earn_percent"] >-0.5) ])
+    obj_str_dalaoaddress_2_buytokencounts[str_dalaoaddress][6] = len(
+        cur_dalao_df[cur_dalao_df["fir_earn_percent"] <= -0.5])
+    obj_str_dalaoaddress_2_buytokencounts[str_dalaoaddress][7] = len(
+        cur_dalao_df[cur_dalao_df["outtoken_per"] >1])
+   
+    
+dalaoaddress_2_buytokencounts_df = pd.DataFrame.from_dict(
+    obj_str_dalaoaddress_2_buytokencounts, orient='index')
+
+dalaoaddress_2_buytokencounts_df = dalaoaddress_2_buytokencounts_df.reset_index(
+    names=["dalaoadd"], drop=False)
+dalaoaddress_2_buytokencounts_df = dalaoaddress_2_buytokencounts_df.rename(columns={
+    0: "counts",
+    1: "bigbigearncounts",
+    2: "bigearncounts",
+    3: "norearncounts",
+    4: "norkuisuncounts",
+    5: "bigkuisuncounts",
+    6: "bigbigkuisuncounts",
+    7: "gouzhuangcounts",
+})
+ 
+dalaoaddress_2_buytokencounts_df.insert(
+    loc=1, column="SolscanURL", value="")
+
+dalaoaddress_2_buytokencounts_df["SolscanURL"] = dalaoaddress_2_buytokencounts_df.apply(lambda ser: makescreenurl(
+    "https://solscan.io/account/", f'{ser["dalaoadd"]}'), axis=1)
+dalaoaddress_2_buytokencounts_df["totalcounts"] = len(
+    new_repeat_token_df)
+
+ 
+
+dalaoaddress_2_buytokencounts_df["bigbigearn_per"] = dalaoaddress_2_buytokencounts_df["bigbigearncounts"] / \
+    dalaoaddress_2_buytokencounts_df["counts"]
+dalaoaddress_2_buytokencounts_df["bigearn_per"] = dalaoaddress_2_buytokencounts_df["bigearncounts"] / \
+    dalaoaddress_2_buytokencounts_df["counts"]
+
+dalaoaddress_2_buytokencounts_df["norearn_per"] = dalaoaddress_2_buytokencounts_df["norearncounts"] / \
+    dalaoaddress_2_buytokencounts_df["counts"]
+
+
+dalaoaddress_2_buytokencounts_df["norkuisun_per"] = dalaoaddress_2_buytokencounts_df["norkuisuncounts"] / \
+    dalaoaddress_2_buytokencounts_df["counts"]
+dalaoaddress_2_buytokencounts_df["bigkuisun_per"] = dalaoaddress_2_buytokencounts_df["bigkuisuncounts"] / \
+    dalaoaddress_2_buytokencounts_df["counts"]
+dalaoaddress_2_buytokencounts_df["bigbigkuisun_per"] = dalaoaddress_2_buytokencounts_df["bigbigkuisuncounts"] / \
+    dalaoaddress_2_buytokencounts_df["counts"]
+
+dalaoaddress_2_buytokencounts_df["bigbig_dif"] = dalaoaddress_2_buytokencounts_df["bigbigearncounts"] -   dalaoaddress_2_buytokencounts_df["bigbigkuisuncounts"]
+dalaoaddress_2_buytokencounts_df["bigbig_dif_per"] = dalaoaddress_2_buytokencounts_df["bigbig_dif"] /   dalaoaddress_2_buytokencounts_df["counts"]
+
+dalaoaddress_2_buytokencounts_df["bigkuisunsum_counts"] = dalaoaddress_2_buytokencounts_df["bigkuisuncounts"] +  dalaoaddress_2_buytokencounts_df["bigbigkuisuncounts"]
+dalaoaddress_2_buytokencounts_df["bigkuisunsum_per"] = dalaoaddress_2_buytokencounts_df["bigkuisunsum_counts"] /   dalaoaddress_2_buytokencounts_df["counts"]
+
+
+dalaoaddress_2_buytokencounts_df = dalaoaddress_2_buytokencounts_df[[
+    "dalaoadd", "SolscanURL",  "totalcounts", "counts",
+   
+  "bigbigearncounts", "bigearncounts", "norearncounts",
+  "norkuisuncounts", "bigkuisuncounts", "bigbigkuisuncounts",
+
+   "bigbigearn_per",  "bigearn_per",    "norearn_per" , 
+  "norkuisun_per",  "bigkuisun_per","bigbigkuisun_per",
+
+   
+     "bigbig_dif",   "bigbig_dif_per", 
+     "bigkuisunsum_counts", "bigkuisunsum_per",
+       "gouzhuangcounts"
+     ]]
+
+dalaoaddress_2_buytokencounts_df.to_excel(
+    baseclass.dalao_total_ana_fm_path/"forfilter_dalaoaddress_2_buytokencounts.xlsx", index=False)
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 36 - 0
src/code/032_add_get_somedalao_totalana.py

@@ -0,0 +1,36 @@
+
+
+# 如果 dalao数目比较多还无法根据earnper为负进行筛选 使用此方法去除 earn_per 为负比例较高的 dalao
+
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+
+
+baseclass.makedirpath(baseclass.new_dalao_ana_fm_path)
+
+baseclass.open_base_library()
+decimal.getcontext().prec = 100
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+ 
+ 
+totalana_df = pd.read_excel(baseclass.dalao_total_ana_fm_path/f"totalana.xlsx",dtype=object)
+
+totalana_anaing_dalao_df = pd.read_excel(baseclass.dalao_total_ana_fm_path/f"totalana_anaing_dalao.xlsx",dtype=object)
+arr_add_totalana_anaing_dalao =totalana_anaing_dalao_df["add"].tolist()
+totalana_someadd_df = totalana_df[totalana_df["add"].isin(arr_add_totalana_anaing_dalao)]
+ 
+totalana_someadd_df.to_excel(baseclass.dalao_total_ana_fm_path/"totalana_someadd.xlsx",index=False)
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 423 - 0
src/code/1101_get_activities_bysolscan_playwright.py

@@ -0,0 +1,423 @@
+from playwright.async_api import async_playwright
+# from datetime import datetime, timezone
+
+from playwright.sync_api import expect
+import random
+
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+baseclass.makedirpath(baseclass.dalao_activities_solscan_path)
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+# Python中windows路径的3种写法
+# 可以是以下这样写:
+
+
+async def get_tbody_data(page, str_dalaoAddress):
+    arr_tokenname_amount = None
+    arr_tokenlink = None
+    txhash = None
+    try:
+        print(f"enter {str_dalaoAddress} get_tbody_data")
+        tbody_ = page.locator(
+            'table.w-full tbody')
+
+        await asyncio.sleep(3)
+        arr_trs = await tbody_.locator('tr').all()
+        arr_trs_datares = []
+        for idx_tr_ in range(0, len(arr_trs)):
+            arr_tds_datares = [None]*13
+            arr_trs_datares.append(arr_tds_datares)
+            tr_ = arr_trs[idx_tr_]
+            arr_tds = await tr_.locator('td').all()
+            for idx_td_ in range(0, len(arr_tds)):
+                td_ = arr_tds[idx_td_]
+                if (idx_td_ == 0):
+                    continue
+                elif (idx_td_ == 1):
+                    txhash = (await td_.text_content()).strip()
+                    arr_tds_datares[0] = txhash
+                elif (idx_td_ == 2):
+                    dateString = (await td_.text_content()).strip()
+                    [dateStr, timeStr] = dateString.split(' ')
+                    [month, day, year] = dateStr.split('-')
+                    [hours, minutes, seconds] = timeStr.split(':')
+                    utc_date = datetime.datetime(
+                        int(year), int(month), int(day), int(hours), int(minutes), int(seconds))
+                    timestamp_utc = int(utc_date.replace(
+                        tzinfo=datetime.timezone.utc).timestamp())
+                    arr_tds_datares[1] = utc_date.strftime("%Y-%m-%d %H:%M:%S")
+                    arr_tds_datares[2] = str(timestamp_utc)
+                elif (idx_td_ == 3):
+                    action_type = (await td_.text_content()).strip()
+                    if ('SWAP' in action_type):
+                        action_type = "SWAP"
+                    else:
+                        continue
+                    arr_tds_datares[3] = action_type
+
+                elif (idx_td_ == 4):
+                    from_address = (await td_.text_content()).strip()
+                    arr_tds_datares[4] = from_address
+                elif (idx_td_ == 5):
+                    arr_tokenname_amount = (await td_.inner_text()).strip()
+
+                    arr_tokenname_amount = arr_tokenname_amount.replace(
+                        ',', '').split('\n')
+
+                    arr_tokenlink = await td_.locator("a").all()
+                    out_tokenaddress = await arr_tokenlink[0].get_attribute('href')
+                    out_tokenaddress = out_tokenaddress.strip().split(
+                        '/')[-1]
+                    out_tokenname = arr_tokenname_amount[1]
+                    out_tokenamount = arr_tokenname_amount[0]
+
+                    in_tokenaddress = await arr_tokenlink[1].get_attribute(
+                        'href')
+                    in_tokenaddress = in_tokenaddress.strip().split(
+                        '/')[-1]
+                    in_tokenname = arr_tokenname_amount[3]
+                    in_tokenamount = arr_tokenname_amount[2]
+
+                    arr_tds_datares[5] = in_tokenaddress
+                    arr_tds_datares[6] = out_tokenaddress
+                    arr_tds_datares[7] = in_tokenname
+                    arr_tds_datares[8] = out_tokenname
+                    arr_tds_datares[9] = in_tokenamount
+                    arr_tds_datares[10] = out_tokenamount
+
+                elif (idx_td_ == 6):
+                    router_link = (await td_.locator("a").all())[0]
+                    router_link = await router_link.get_attribute(
+                        'href')
+                    router_link = router_link.strip().split('/')[-1]
+                    arr_tds_datares[11] = router_link
+                elif (idx_td_ == 7):
+                    arr_pool_img = await td_.locator("img").all()
+                    for idx_pool_img in range(0, len(arr_pool_img)):
+                        arr_pool_img[idx_pool_img] = await arr_pool_img[idx_pool_img].get_attribute(
+                            'src')
+
+                        arr_pool_img[idx_pool_img] = arr_pool_img[idx_pool_img].strip().split(
+                            '=')[-1]
+                    if "68747470733a2f2f737461746963732e736f6c7363616e2e696f2f65782d696d672f3637356b5058394d48546a53327a7431716672314e5948757a654c5866514d394832347746535574314d70382e706e67" in arr_pool_img:
+                        arr_pool_img = '1'
+                    else:
+                        arr_pool_img = '0'
+                    arr_tds_datares[12] = arr_pool_img
+
+        print(f"end {str_dalaoAddress} get_tbody_data")
+        return arr_trs_datares
+
+    except Exception as e:
+        print(str_dalaoAddress, txhash, "arr_tokenname_amount",
+              arr_tokenname_amount, "arr_tokenlink=", arr_tokenlink)
+        raise
+
+
+activities_columns = ['txhash', 'date', 'timestamp', 'action', 'from', 'in_tokenaddress',
+                      'out_tokenaddress',
+                      'in_tokenname',
+                      'out_tokenname',
+                      'in_tokenamount',
+                      'out_tokenamount',
+                      'router',
+                      'israydium',
+                      ]
+
+
+df = pd.read_csv(baseclass.dalao_merge_path /
+                 "filter_dalao.csv", dtype=object)
+
+arr_str_dalaoAddress = df["dalaoAddress"].tolist()
+temp_arr_str_dalaoAddress = copy.deepcopy(arr_str_dalaoAddress)
+for str_dalaoAddress in temp_arr_str_dalaoAddress:
+    if (baseclass.dalao_activities_solscan_path /
+            f"solscan_act_{str_dalaoAddress}.csv").exists():
+        arr_str_dalaoAddress.remove(str_dalaoAddress)
+
+# arr_str_dalaoAddress = arr_str_dalaoAddress[0:6]
+arr_str_dalaoSwapUrl = [
+    f"https://solscan.io/account/{str_dalaoAddress}#defiactivities" for str_dalaoAddress in arr_str_dalaoAddress]
+
+
+print('arr_str_dalaoAddress', len(arr_str_dalaoAddress))
+driver_len = 6 if len(arr_str_dalaoAddress) >= 6 else len(
+    arr_str_dalaoAddress)
+arr_driver = [None]*driver_len
+arr_wait = [None]*driver_len
+arr_home_handle = [None]*driver_len
+arr_split_str_dalaoAddress = [None]*driver_len
+arr_split_str_dalaoSwapUrl = [None]*driver_len
+len_split_str_dalaoAddress = int(len(arr_str_dalaoAddress)/driver_len)+1
+
+for idx_driver in range(0, driver_len):
+    arr_split_str_dalaoAddress[idx_driver] = arr_str_dalaoAddress[idx_driver *
+                                                                  len_split_str_dalaoAddress: (idx_driver+1)*len_split_str_dalaoAddress]
+    arr_split_str_dalaoSwapUrl[idx_driver] = arr_str_dalaoSwapUrl[idx_driver *
+                                                                  len_split_str_dalaoAddress: (idx_driver+1)*len_split_str_dalaoAddress]
+
+
+number_onepage = 10
+
+set_str_dalaoAddress = set(arr_str_dalaoAddress)
+# split_len = 3
+
+
+# def switch_to_page(context, title=None, url=None):
+#     """切换到指定title 名称 或 url 的 标签页"""
+#     for item_page in context.pages:
+#         if title:
+#             if title in item_page.title():
+#                 # 激活当前选项卡
+#                 item_page.bring_to_front()
+#                 return item_page
+#         elif url:
+#             if url in item_page.url:
+#                 # 激活当前选项卡
+#                 item_page.bring_to_front()
+#                 return item_page
+#     else:
+#         print("not found title or url")
+#     return context.pages[0]
+
+
+async def do_some_thing(playwright, cur_arr_str_dalaoAddress, cur_arr_str_dalaoSwapUrl):
+
+    browser = await playwright.chromium.launch(headless=True)
+    context = await browser.new_context()
+    arr_page = [None]*2
+    arr_page[0] = await context.new_page()
+    await arr_page[0].goto(
+        "https://solscan.io/")
+
+    # do ....
+    print(context.pages)
+
+    # global split_len
+    global set_str_dalaoAddress
+    # cur_set_str_dalaoAddress = set(arr_str_dalaoAddress)
+    arr_str_dalaoAddress = cur_arr_str_dalaoAddress
+    arr_str_dalaoSwapUrl = cur_arr_str_dalaoSwapUrl
+
+    for str_dalaoAddress_idx in range(0, len(cur_arr_str_dalaoAddress)):
+
+        str_dalaoAddress = arr_str_dalaoAddress[str_dalaoAddress_idx]
+        str_dalaoTransferUrl = arr_str_dalaoSwapUrl[str_dalaoAddress_idx]
+        print(f"enter str_dalaoAddress={str_dalaoAddress}")
+        arr_page[1] = await context.new_page()
+        await arr_page[1].goto(str_dalaoTransferUrl)
+        page = None
+        for item_page in context.pages:
+            if item_page.url == str_dalaoTransferUrl:
+                await item_page.bring_to_front()
+                page = item_page
+                break
+
+        res_df = pd.DataFrame(columns=activities_columns)
+        # if (baseclass.dalao_activities_solscan_path /
+        #         f"solscan_act_{str_dalaoAddress}.csv").exists():
+        #     res_df = pd.read_csv(baseclass.dalao_activities_solscan_path /
+        #                          f"solscan_act_{str_dalaoAddress}.csv", dtype=object)
+        #     continue
+        # text_pagee = await page.content()
+        # text_pagee = await page.html()
+        # print("text_pagee=", text_pagee)
+        th_ = page.locator(
+            'table.w-full thead th')
+        # await expect(th_).toBeVisible()
+        text_th_ = (await th_.text_content()).strip()
+        print("text_th_=", text_th_)
+        div_time_click = th_.locator(
+            'div.items-center.cursor-pointer')
+
+        text_time_click = (await div_time_click.text_content()).strip()
+        print(
+            f"str_dalaoAddress={str_dalaoAddress} text_time_click={text_time_click}")
+        if not "UTC" in text_time_click:
+            await div_time_click.click()
+            await page.wait_for_load_state('load')
+        prev_page_height = await page.evaluate(
+            "document.documentElement.scrollHeight")
+
+        await asyncio.sleep(0.4)
+        retytimes = 3
+        while retytimes > 0:
+            retytimes -= 1
+            await page.evaluate(
+                "window.scrollTo(0, document.body.scrollHeight);")
+            await asyncio.sleep(0.4)
+            cur_page_height = await page.evaluate(
+                "document.documentElement.scrollHeight")
+            if cur_page_height > prev_page_height:
+                prev_page_height = cur_page_height
+            elif cur_page_height == prev_page_height:
+                break
+
+        [button_num_onepage, number_onepage, arr_text_page_info,
+         button_aft_onepage] = await get_pageselect_element(page=page, str_dalaoAddress=str_dalaoAddress)
+        print(f"str_dalaoAddress={str_dalaoAddress} scrollTo 0")
+
+        while (number_onepage != 40):
+            await button_num_onepage.click(force=True)
+            div_data_radix_select_dep1 = page.locator(
+                'div[data-radix-select-viewport][role="presentation"]')
+            arr_div_data_radix_select = div_data_radix_select_dep1.locator(
+                'div[role="option"]')
+
+            div_data_radix_select = (await arr_div_data_radix_select.all())[-1]
+
+            await div_data_radix_select.click()
+            await asyncio.sleep(0.8)
+            [button_num_onepage, number_onepage, arr_text_page_info,
+             button_aft_onepage] = await get_pageselect_element(page=page, str_dalaoAddress=str_dalaoAddress)
+        retytimes = 3
+        while retytimes > 0:
+            retytimes -= 1
+            await page.evaluate(
+                "window.scrollTo(0, document.body.scrollHeight);")
+            await asyncio.sleep(0.4)
+            cur_page_height = await page.evaluate(
+                "document.documentElement.scrollHeight")
+            if cur_page_height > prev_page_height:
+                prev_page_height = cur_page_height
+            elif cur_page_height == prev_page_height:
+                break
+            break
+
+        [button_num_onepage, number_onepage, arr_text_page_info,
+         button_aft_onepage] = await get_pageselect_element(page=page, str_dalaoAddress=str_dalaoAddress)
+        number_total_page = arr_text_page_info[1] if arr_text_page_info[1] <= 3 else 3
+
+        for number_cur_page in range(1, number_total_page+1):
+            print(
+                f"str_dalaoAddress={str_dalaoAddress} number_cur_page={number_cur_page} number_total_page={number_total_page}")
+            retytimes = 3
+            while retytimes > 0:
+                retytimes -= 1
+                await page.evaluate(
+                    "window.scrollTo(0, document.body.scrollHeight);")
+
+                await asyncio.sleep(0.4)
+                cur_page_height = await page.evaluate(
+                    "document.documentElement.scrollHeight")
+                if cur_page_height > prev_page_height:
+                    prev_page_height = cur_page_height
+                elif cur_page_height == prev_page_height:
+                    break
+
+            [button_num_onepage, number_onepage, arr_text_page_info,
+             button_aft_onepage] = await get_pageselect_element(page=page, str_dalaoAddress=str_dalaoAddress)
+
+            while True:
+                try:
+                    tbody_data = await get_tbody_data(page=page, str_dalaoAddress=str_dalaoAddress)
+
+                except Exception as e:
+
+                    print(traceback.format_exc())
+                    await asyncio.sleep(2)
+                    continue
+                if tbody_data is None:
+                    await asyncio.sleep(0.8)
+                    continue
+                elif (number_cur_page < number_total_page and len(tbody_data) != 40):
+                    print("tbody_data_len=", len(tbody_data))
+                    await asyncio.sleep(0.8)
+                    continue
+                else:
+                    break
+            page_df = pd.DataFrame(
+                tbody_data, columns=activities_columns)
+            if page_df['txhash'].tolist()[0] in res_df['txhash']:
+                # 已经存在了 不用在遍历了直接跳过
+                break
+
+            res_df = pd.concat([res_df, page_df],
+                               ignore_index=True).reset_index(drop=True)
+            if (number_cur_page == number_total_page):
+                break
+
+            await button_aft_onepage.click()
+            await asyncio.sleep(1)
+
+        # df.to_csv(baseclass.dalao_activities_solscan_path)
+
+        res_df = res_df.drop_duplicates()
+        res_df.to_csv(baseclass.dalao_activities_solscan_path /
+                      f"solscan_act_{str_dalaoAddress}.csv", index=False)
+        set_str_dalaoAddress.discard(str_dalaoAddress)
+        await arr_page[1].close()
+
+    # time.sleep(10)
+    await asyncio.sleep(5)
+    await context.close()
+    await browser.close()
+
+
+async def get_pageselect_element(page, str_dalaoAddress):
+
+    while True:
+        try:
+            div_select_page = page.locator(
+                "div.items-center.justify-end.flex-row")
+            button_num_onepage = div_select_page.locator(
+                'button[type="button"].border-input')
+            number_onepage = int((await button_num_onepage.text_content()).strip())
+
+            text_page_info = (await div_select_page.text_content()).strip()
+            #  text_page_info = Show10per pagePage 1 of 2
+            print(f'{ str_dalaoAddress} text_page_info=', text_page_info)
+            if not "of" in text_page_info:
+                # print("arr_text_page_info no of")
+                raise Exception("arr_text_page_info no of")
+
+            arr_text_page_info = text_page_info.split(' ')
+            arr_text_page_info = [int(arr_text_page_info[-3]),
+                                  int(arr_text_page_info[-1])]
+
+            break
+        except Exception as e:
+            print(str(e))
+            await asyncio.sleep(1)
+            continue
+            # raise
+
+    # arr_button_left_right = div_select_page.locator(
+    #     'button.inline-flex.items-center.justify-center.whitespace-nowrap'
+    # )
+    # button_pre_onepage = arr_button_left_right.all()[1]
+    # button_aft_onepage = (await arr_button_left_right.all())[2]
+    button_aft_onepage = page.get_by_role("button", name="right")
+
+    return [button_num_onepage, number_onepage, arr_text_page_info,  button_aft_onepage]
+
+
+async def get_onedriver_swapactivities(cur_arr_str_dalaoAddress, cur_arr_str_dalaoSwapUrl):
+    async with async_playwright() as playwright:
+       
+        await do_some_thing(playwright, cur_arr_str_dalaoAddress, cur_arr_str_dalaoSwapUrl)
+
+
+async def main():
+    print("enter main()")
+    tasks = [get_onedriver_swapactivities(
+        arr_split_str_dalaoAddress[idx_driver], arr_split_str_dalaoSwapUrl[idx_driver]) for idx_driver in range(0, driver_len)]
+
+    await asyncio.gather(*tasks)
+
+
+asyncio.run(main())
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+# main()
+# asyncio.get_event_loop().run_until_complete(main())

+ 378 - 0
src/code/1101_get_activities_bysolscan_py

@@ -0,0 +1,378 @@
+from selenium import webdriver
+from selenium.webdriver.common.keys import Keys
+from selenium.webdriver.common.by import By
+from selenium.webdriver.support import expected_conditions as EC
+from selenium.common.exceptions outException
+from selenium.webdriver import ActionChains
+from selenium.webdriver.support.wait import WebDriverWait
+
+
+import pandas as pd
+import numpy as np
+import random
+import pandas as pd
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+baseclass.makedirpath(baseclass.dalao_activities_solscan_path)
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+# Python中windows路径的3种写法
+# 可以是以下这样写:
+
+# "C:\\Users\\10799\\Desktop\\learn\\C\\homework\\5"
+# r"C:\Users\10799\Desktop\learn\C\homework\5"
+# "C:/Users/10799/Desktop/learn/C/homework/5"
+# 但是不可以这样写:
+# "C:\Users\10799\Desktop\learn\C\homework\5"
+with open(baseclass.code_path/"get_swapactivaties.js") as f:
+    get_swapactivaties_script = f.read()
+
+with open(baseclass.code_path/"set_utctime_solscan.js") as f:
+    set_utctime_solscan_script = f.read()
+
+with open(baseclass.code_path/"get_swapactivaties_thead_body_dom.js") as f:
+    get_swapactivaties_thead_body_dom_script = f.read()
+
+activities_columns = ['txhash', 'date', 'timestamp', 'action', 'from', 'in_tokenaddress',
+                      'out_tokenaddress',
+                      'in_tokenname',
+                      'out_tokenname',
+                      'in_tokenamount',
+                      'out_tokenamount',
+                      'router',
+                      'israydium',
+                      ]
+opt = webdriver.FirefoxOptions()
+# 设置无界面
+opt.add_argument("--headless")
+# 禁用 gpu
+opt.add_argument('--disable-gpu')
+# firefox_binary = "C:\\Program Files\\Mozilla Firefox\\firefox.exe"
+# 指定 geckodirver 的安装路径,如果配置了环境变量则不需指定
+# executable_path = "F:\\MYCode\\geckodriver\\geckodriver.exe"
+# driver = webdriver.Firefox(
+#     firefox_binary=firefox_binary, executable_path=executable_path, options=opt)
+
+df = pd.read_csv(baseclass.dalao_merge_path /
+                 "filter_dalao.csv", dtype=object)
+
+arr_str_dalaoAddress = df["dalaoAddress"].tolist()
+arr_str_dalaoSwapUrl = [
+    f"https://solscan.io/account/{str_dalaoAddress}#defiactivities" for str_dalaoAddress in arr_str_dalaoAddress]
+
+
+print('arr_str_dalaoAddress', len(arr_str_dalaoAddress))
+
+
+driver_len = 1 if len(arr_str_dalaoAddress) >= 1 else len(
+    arr_str_dalaoAddress)
+arr_driver = [None]*driver_len
+arr_wait = [None]*driver_len
+arr_home_handle = [None]*driver_len
+arr_split_str_dalaoAddress = [None]*driver_len
+arr_split_str_dalaoSwapUrl = [None]*driver_len
+len_split_str_dalaoAddress = int(len(arr_str_dalaoAddress)/driver_len)+1
+for idx_driver in range(0, driver_len):
+    arr_split_str_dalaoAddress[idx_driver] = arr_str_dalaoAddress[idx_driver *
+                                                                  len_split_str_dalaoAddress: (idx_driver+1)*len_split_str_dalaoAddress]
+    arr_split_str_dalaoSwapUrl[idx_driver] = arr_str_dalaoSwapUrl[idx_driver *
+                                                                  len_split_str_dalaoAddress: (idx_driver+1)*len_split_str_dalaoAddress]
+    arr_driver[idx_driver] = webdriver.Firefox(options=opt)
+    arr_wait[idx_driver] = WebDriverWait(
+        arr_driver[idx_driver], 25, ignored_exceptions=None)
+    arr_driver[idx_driver].get("https://solscan.io/")
+    arr_driver[idx_driver].implicitly_wait(8)
+    arr_home_handle[idx_driver] = arr_driver[idx_driver].current_window_handle
+    print(
+        f"current_window_handle={arr_driver[idx_driver].current_window_handle}")
+
+    # driver = webdriver.Firefox(options=opt)
+    # wait = WebDriverWait(driver, 25, ignored_exceptions=None)
+    # driver.get("https://solscan.io/")
+    # driver.implicitly_wait(8)
+number_onepage = 10
+
+# https://solscan.io/account/8T5j9shxXMYKWiLzcNYo9X11Kr3F1X83FxzjLFCUtcxV#defiactivities
+
+
+driver_action = None
+
+
+def get_pageselect_element(driver, wait):
+    # div_select_page = wait.until(
+    #     EC.visibility_of_all_elements_located(
+    #         (
+    #             By.CSS_SELECTOR, 'div.items-center.justify-end'
+    #         )
+    #     )
+    # )
+    # div_select_page = div_select_page[0]
+    # let div_select_page = document.querySelectorAll("div.items-center.justify-end")[0];
+    # let button_num_onepage = div_select_page.querySelectorAll('button[type="button"].border-input')[0];
+
+    # button_num_onepage = wait.until(
+    #     # 'button[type="button"].border-input'
+    #     EC.visibility_of_all_elements_located(
+    #         (
+    #             By.CSS_SELECTOR, 'div.items-center.justify-end button[type="button"].border-input'
+    #         )
+    #     )
+    # )
+
+    while True:
+        try:
+            div_select_page = driver.find_element(
+                By.CSS_SELECTOR, "div.items-center.justify-end")
+            button_num_onepage = div_select_page.find_element(
+                By.CSS_SELECTOR, 'button[type="button"].border-input')
+            number_onepage = int(button_num_onepage.text.strip())
+
+            text_page_info = driver.execute_script(
+                "return arguments[0].textContent", div_select_page)
+            text_page_info = text_page_info.strip()
+            #  text_page_info = Show10per pagePage 1 of 2
+            arr_text_page_info = text_page_info.split(' ')
+            arr_text_page_info = [int(arr_text_page_info[-3]),
+                                  int(arr_text_page_info[-1])]
+            break
+        except Exception as e:
+            time.sleep(0.3)
+            continue
+    # div_select_page.getText().strip()
+
+    arr_button_left_right = div_select_page.find_elements(
+        By.CSS_SELECTOR,
+        'button.inline-flex.items-center.justify-center.whitespace-nowrap'
+    )
+    button_pre_onepage = arr_button_left_right[1]
+    button_aft_onepage = arr_button_left_right[2]
+
+    return [button_num_onepage, number_onepage, arr_text_page_info, button_pre_onepage, button_aft_onepage]
+
+
+set_str_dalaoAddress = set(arr_str_dalaoAddress)
+split_len = 3
+# while len(set_str_dalaoAddress) > 0:
+
+
+def get_onedriver_activites(driver, wait, home_handle, arr_str_dalaoAddress, arr_str_dalaoSwapUrl):
+    print("enter get_onedriver_activites")
+
+    global split_len
+    global set_str_dalaoAddress
+    cur_set_str_dalaoAddress = set(arr_str_dalaoAddress)
+
+    while (len(cur_set_str_dalaoAddress) > 0):
+
+        try:
+            cur_arr_str_dalaoAddress = arr_str_dalaoAddress[0:split_len]
+            cur_arr_str_dalaoSwapUrl = arr_str_dalaoSwapUrl[0:split_len]
+
+            for str_dalaoAddress_idx in range(0, len(cur_arr_str_dalaoAddress)):
+                # for str_dalaoUrl in arr_str_dalaoUrl:
+                str_dalaoAddress = cur_arr_str_dalaoAddress[str_dalaoAddress_idx]
+                str_dalaoTransferUrl = cur_arr_str_dalaoSwapUrl[str_dalaoAddress_idx]
+                script = f"window.open('{str_dalaoTransferUrl}');"
+                driver.execute_script(script)
+                time.sleep(random.uniform(3, 3.8))
+
+            while (True):
+                all_handles = driver.window_handles
+                all_handles.remove(home_handle)
+
+                if (len(all_handles) == 0):
+                    driver.switch_to.window(
+                        home_handle)
+                    break
+                for str_dalaoAddress_idx in range(0, len(all_handles)):
+                    res_df = pd.DataFrame(columns=activities_columns)
+                    driver.switch_to.window(
+                        all_handles[str_dalaoAddress_idx])
+
+                    while True:
+                        notcaredata = driver.execute_script(
+                            get_swapactivaties_thead_body_dom_script)
+
+                        if notcaredata is None:
+                            time.sleep(0.5)
+                            continue
+                        break
+
+                    print(
+                        f"enter {  driver.current_url} set_str_dalaoAddress len ={len(set_str_dalaoAddress)}")
+                    str_dalaoAddress = driver.current_url.split(
+                        '/')[-1].split('#')[0]
+
+                    if (baseclass.dalao_activities_solscan_path /
+                            f"solscan_act_{str_dalaoAddress}.csv").exists():
+                        res_df = pd.read_csv(baseclass.dalao_activities_solscan_path /
+                                             f"solscan_act_{str_dalaoAddress}.csv", dtype=object)
+                    driver.execute_script(set_utctime_solscan_script)
+                    time.sleep(0.5)
+
+                    height = 0
+                    while True:
+                        new_height = driver.execute_script(
+                            "return document.documentElement.scrollHeight;")
+                        if new_height > height:
+                            height = new_height
+                            driver.execute_script(
+                                "window.scrollTo(0,document.body.scrollHeight)")
+                        else:
+                            break
+                        time.sleep(0.5)
+                    [button_num_onepage, number_onepage, arr_text_page_info,
+                     button_pre_onepage, button_aft_onepage] = get_pageselect_element(driver, wait)
+                    while (number_onepage != 40):
+                        driver_action = ActionChains(driver)
+                        driver_action.reset_actions()
+                        driver_action.move_to_element(
+                            button_num_onepage).click().perform()
+
+                        div_data_radix_select_dep1 = driver.find_element(
+                            By.CSS_SELECTOR,
+                            'div[data-radix-select-viewport][role="presentation"]')
+
+                        # text = driver.execute_script(
+                        #     "return arguments[0].textContent", div_data_radix_select_dep1)
+                        # innerHTML = driver.execute_script(
+                        #     "return arguments[0].innerHTML", div_data_radix_select_dep1)
+
+                        arr_div_data_radix_select = div_data_radix_select_dep1.find_elements(
+                            By.CSS_SELECTOR,
+                            'div[role="option"]')
+                        div_data_radix_select = arr_div_data_radix_select[-1]
+
+                        driver_action.reset_actions()
+                        driver_action.move_to_element(
+                            div_data_radix_select).click().perform()
+                        time.sleep(0.5)
+                        break
+
+                    height = 0
+                    while True:
+                        new_height = driver.execute_script(
+                            "return document.documentElement.scrollHeight;")
+                        if new_height > height:
+                            height = new_height
+                            driver.execute_script(
+                                "window.scrollTo(0,document.body.scrollHeight)")
+                        else:
+                            break
+                        time.sleep(0.5)
+
+                    [button_num_onepage, number_onepage, arr_text_page_info,
+                        button_pre_onepage, button_aft_onepage] = get_pageselect_element(driver, wait)
+
+                    # number_total_txhash = arr_text_page_info[1]*40
+
+                    number_total_page = arr_text_page_info[1] if arr_text_page_info[1] <= 13 else 13
+
+                    for number_cur_page in range(1, number_total_page+1):
+                        print(
+                            f"str_dalaoAddress={str_dalaoAddress} number_cur_page={number_cur_page}")
+                        while True:
+                            notcaredata = driver.execute_script(
+                                get_swapactivaties_thead_body_dom_script)
+                            if notcaredata is None:
+                                time.sleep(0.5)
+                                continue
+                            break
+
+                        height = 0
+                        while True:
+                            new_height = driver.execute_script(
+                                "return document.documentElement.scrollHeight;")
+                            if new_height > height:
+                                height = new_height
+                                driver.execute_script(
+                                    "window.scrollTo(0,document.body.scrollHeight)")
+                            else:
+                                break
+                            time.sleep(0.5)
+                        [button_num_onepage, number_onepage, arr_text_page_info,
+                            button_pre_onepage, button_aft_onepage] = get_pageselect_element(driver, wait)
+                        while True:
+                            tbody_data = driver.execute_script(
+                                get_swapactivaties_script)
+                            if tbody_data is None:
+                                time.sleep(0.5)
+                                continue
+                            elif (number_cur_page < number_total_page and len(tbody_data) != 40):
+                                print("tbody_data_len=", len(tbody_data))
+                                time.sleep(0.5)
+                                continue
+                            else:
+                                break
+                        page_df = pd.DataFrame(
+                            tbody_data, columns=activities_columns)
+                        if page_df['txhash'].tolist()[0] in res_df['txhash']:
+                            # 已经存在了 不用在遍历了直接跳过
+                            break
+
+                        res_df = pd.concat([res_df, page_df],
+                                           ignore_index=True).reset_index(drop=True)
+
+                        driver_action.reset_actions()
+                        driver_action.move_to_element(
+                            button_aft_onepage).click().perform()
+                        time.sleep(1)
+                    res_df = res_df.drop_duplicates()
+                    res_df.to_csv(baseclass.dalao_activities_solscan_path /
+                                  f"solscan_act_{str_dalaoAddress}.csv", index=False)
+                    set_str_dalaoAddress.discard(str_dalaoAddress)
+                    cur_set_str_dalaoAddress.discard(str_dalaoAddress)
+
+                    if ("defiactivities" in driver.current_url):
+                        driver.close()
+
+                    time.sleep(random.uniform(0.7, 1.1))
+
+            arr_str_dalaoAddress = arr_str_dalaoAddress[split_len:]
+            arr_str_dalaoSwapUrl = arr_str_dalaoSwapUrl[split_len:]
+
+        except Exception as e:
+            print(e)
+            print(traceback.format_exc())
+            continue
+
+
+def get_muldriver_activities():
+    thread_list = []
+
+    for idx_driver in range(0, driver_len):
+        thread = threading.Thread(
+            target=get_onedriver_activites,
+            args=(arr_driver[idx_driver], arr_wait[idx_driver], arr_home_handle[idx_driver], arr_split_str_dalaoAddress[idx_driver], arr_split_str_dalaoSwapUrl[idx_driver]
+                  )
+        )
+        thread_list.append(thread)
+    for thread in thread_list:
+        thread.start()
+
+    for thread in thread_list:
+        thread.join()
+    time.sleep(10)
+    # while (True):
+    #     if len(set_str_dalaoAddress) == 0:
+    #         break
+    #     time.sleep(1)
+    for idx in range(0, driver_len):
+        arr_driver[idx].close()
+
+    return
+
+
+get_muldriver_activities()
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 381 - 0
src/code/1101_get_activities_bysolscan_selenium_py

@@ -0,0 +1,381 @@
+from selenium import webdriver
+from selenium.webdriver.common.keys import Keys
+from selenium.webdriver.common.by import By
+from selenium.webdriver.support import expected_conditions as EC
+from selenium.common.exceptions outException
+from selenium.webdriver import ActionChains
+from selenium.webdriver.support.wait import WebDriverWait
+
+
+import pandas as pd
+import numpy as np
+import random
+import pandas as pd
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+baseclass.makedirpath(baseclass.dalao_activities_solscan_path)
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+# Python中windows路径的3种写法
+# 可以是以下这样写:
+
+# "C:\\Users\\10799\\Desktop\\learn\\C\\homework\\5"
+# r"C:\Users\10799\Desktop\learn\C\homework\5"
+# "C:/Users/10799/Desktop/learn/C/homework/5"
+# 但是不可以这样写:
+# "C:\Users\10799\Desktop\learn\C\homework\5"
+with open(baseclass.code_path/"get_swapactivaties.js") as f:
+    get_swapactivaties_script = f.read()
+
+with open(baseclass.code_path/"set_utctime_solscan.js") as f:
+    set_utctime_solscan_script = f.read()
+
+with open(baseclass.code_path/"get_swapactivaties_thead_body_dom.js") as f:
+    get_swapactivaties_thead_body_dom_script = f.read()
+
+activities_columns = ['txhash', 'date', 'timestamp', 'action', 'from', 'in_tokenaddress',
+                      'out_tokenaddress',
+                      'in_tokenname',
+                      'out_tokenname',
+                      'in_tokenamount',
+                      'out_tokenamount',
+                      'router',
+                      'israydium',
+                      ]
+opt = webdriver.FirefoxOptions()
+# 设置无界面
+
+opt.add_argument('start-maximized')
+
+opt.add_argument("--headless")
+# 禁用 gpu
+opt.add_argument('--disable-gpu')
+# firefox_binary = "C:\\Program Files\\Mozilla Firefox\\firefox.exe"
+# 指定 geckodirver 的安装路径,如果配置了环境变量则不需指定
+# executable_path = "F:\\MYCode\\geckodriver\\geckodriver.exe"
+# driver = webdriver.Firefox(
+#     firefox_binary=firefox_binary, executable_path=executable_path, options=opt)
+
+df = pd.read_csv(baseclass.dalao_merge_path /
+                 "filter_dalao.csv", dtype=object)
+
+arr_str_dalaoAddress = df["dalaoAddress"].tolist()
+arr_str_dalaoSwapUrl = [
+    f"https://solscan.io/account/{str_dalaoAddress}#defiactivities" for str_dalaoAddress in arr_str_dalaoAddress]
+
+
+print('arr_str_dalaoAddress', len(arr_str_dalaoAddress))
+
+
+driver_len = 1 if len(arr_str_dalaoAddress) >= 1 else len(
+    arr_str_dalaoAddress)
+arr_driver = [None]*driver_len
+arr_wait = [None]*driver_len
+arr_home_handle = [None]*driver_len
+arr_split_str_dalaoAddress = [None]*driver_len
+arr_split_str_dalaoSwapUrl = [None]*driver_len
+len_split_str_dalaoAddress = int(len(arr_str_dalaoAddress)/driver_len)+1
+for idx_driver in range(0, driver_len):
+    arr_split_str_dalaoAddress[idx_driver] = arr_str_dalaoAddress[idx_driver *
+                                                                  len_split_str_dalaoAddress: (idx_driver+1)*len_split_str_dalaoAddress]
+    arr_split_str_dalaoSwapUrl[idx_driver] = arr_str_dalaoSwapUrl[idx_driver *
+                                                                  len_split_str_dalaoAddress: (idx_driver+1)*len_split_str_dalaoAddress]
+    arr_driver[idx_driver] = webdriver.Firefox(options=opt)
+    arr_wait[idx_driver] = WebDriverWait(
+        arr_driver[idx_driver], 25, ignored_exceptions=None)
+    arr_driver[idx_driver].get("https://solscan.io/")
+    arr_driver[idx_driver].implicitly_wait(8)
+    arr_home_handle[idx_driver] = arr_driver[idx_driver].current_window_handle
+    print(
+        f"current_window_handle={arr_driver[idx_driver].current_window_handle}")
+
+    # driver = webdriver.Firefox(options=opt)
+    # wait = WebDriverWait(driver, 25, ignored_exceptions=None)
+    # driver.get("https://solscan.io/")
+    # driver.implicitly_wait(8)
+number_onepage = 10
+
+# https://solscan.io/account/8T5j9shxXMYKWiLzcNYo9X11Kr3F1X83FxzjLFCUtcxV#defiactivities
+
+
+driver_action = None
+
+
+def get_pageselect_element(driver, wait):
+    # div_select_page = wait.until(
+    #     EC.visibility_of_all_elements_located(
+    #         (
+    #             By.CSS_SELECTOR, 'div.items-center.justify-end'
+    #         )
+    #     )
+    # )
+    # div_select_page = div_select_page[0]
+    # let div_select_page = document.querySelectorAll("div.items-center.justify-end")[0];
+    # let button_num_onepage = div_select_page.querySelectorAll('button[type="button"].border-input')[0];
+
+    # button_num_onepage = wait.until(
+    #     # 'button[type="button"].border-input'
+    #     EC.visibility_of_all_elements_located(
+    #         (
+    #             By.CSS_SELECTOR, 'div.items-center.justify-end button[type="button"].border-input'
+    #         )
+    #     )
+    # )
+
+    while True:
+        try:
+            div_select_page = driver.find_element(
+                By.CSS_SELECTOR, "div.items-center.justify-end")
+            button_num_onepage = div_select_page.find_element(
+                By.CSS_SELECTOR, 'button[type="button"].border-input')
+            number_onepage = int(button_num_onepage.text.strip())
+
+            text_page_info = driver.execute_script(
+                "return arguments[0].textContent", div_select_page)
+            text_page_info = text_page_info.strip()
+            #  text_page_info = Show10per pagePage 1 of 2
+            arr_text_page_info = text_page_info.split(' ')
+            arr_text_page_info = [int(arr_text_page_info[-3]),
+                                  int(arr_text_page_info[-1])]
+            break
+        except Exception as e:
+            time.sleep(0.3)
+            continue
+    # div_select_page.getText().strip()
+
+    arr_button_left_right = div_select_page.find_elements(
+        By.CSS_SELECTOR,
+        'button.inline-flex.items-center.justify-center.whitespace-nowrap'
+    )
+    button_pre_onepage = arr_button_left_right[1]
+    button_aft_onepage = arr_button_left_right[2]
+
+    return [button_num_onepage, number_onepage, arr_text_page_info, button_pre_onepage, button_aft_onepage]
+
+
+set_str_dalaoAddress = set(arr_str_dalaoAddress)
+split_len = 3
+# while len(set_str_dalaoAddress) > 0:
+
+
+def get_onedriver_activites(driver, wait, home_handle, arr_str_dalaoAddress, arr_str_dalaoSwapUrl):
+    print("enter get_onedriver_activites")
+
+    global split_len
+    global set_str_dalaoAddress
+    cur_set_str_dalaoAddress = set(arr_str_dalaoAddress)
+
+    while (len(cur_set_str_dalaoAddress) > 0):
+
+        try:
+            cur_arr_str_dalaoAddress = arr_str_dalaoAddress[0:split_len]
+            cur_arr_str_dalaoSwapUrl = arr_str_dalaoSwapUrl[0:split_len]
+
+            for str_dalaoAddress_idx in range(0, len(cur_arr_str_dalaoAddress)):
+                # for str_dalaoUrl in arr_str_dalaoUrl:
+                str_dalaoAddress = cur_arr_str_dalaoAddress[str_dalaoAddress_idx]
+                str_dalaoTransferUrl = cur_arr_str_dalaoSwapUrl[str_dalaoAddress_idx]
+                script = f"window.open('{str_dalaoTransferUrl}');"
+                driver.execute_script(script)
+                time.sleep(random.uniform(3, 3.8))
+
+            while (True):
+                all_handles = driver.window_handles
+                all_handles.remove(home_handle)
+
+                if (len(all_handles) == 0):
+                    driver.switch_to.window(
+                        home_handle)
+                    break
+                for str_dalaoAddress_idx in range(0, len(all_handles)):
+                    res_df = pd.DataFrame(columns=activities_columns)
+                    driver.switch_to.window(
+                        all_handles[str_dalaoAddress_idx])
+
+                    while True:
+                        notcaredata = driver.execute_script(
+                            get_swapactivaties_thead_body_dom_script)
+
+                        if notcaredata is None:
+                            time.sleep(0.5)
+                            continue
+                        break
+
+                    print(
+                        f"enter {  driver.current_url} set_str_dalaoAddress len ={len(set_str_dalaoAddress)}")
+                    str_dalaoAddress = driver.current_url.split(
+                        '/')[-1].split('#')[0]
+
+                    if (baseclass.dalao_activities_solscan_path /
+                            f"solscan_act_{str_dalaoAddress}.csv").exists():
+                        res_df = pd.read_csv(baseclass.dalao_activities_solscan_path /
+                                             f"solscan_act_{str_dalaoAddress}.csv", dtype=object)
+                    driver.execute_script(set_utctime_solscan_script)
+                    time.sleep(0.5)
+
+                    height = 0
+                    while True:
+                        new_height = driver.execute_script(
+                            "return document.documentElement.scrollHeight;")
+                        if new_height > height:
+                            height = new_height
+                            driver.execute_script(
+                                "window.scrollTo(0,document.body.scrollHeight)")
+                        else:
+                            break
+                        time.sleep(0.5)
+                    [button_num_onepage, number_onepage, arr_text_page_info,
+                     button_pre_onepage, button_aft_onepage] = get_pageselect_element(driver, wait)
+                    while (number_onepage != 40):
+                        driver_action = ActionChains(driver)
+                        driver_action.reset_actions()
+                        driver_action.move_to_element(
+                            button_num_onepage).click().perform()
+
+                        div_data_radix_select_dep1 = driver.find_element(
+                            By.CSS_SELECTOR,
+                            'div[data-radix-select-viewport][role="presentation"]')
+
+                        # text = driver.execute_script(
+                        #     "return arguments[0].textContent", div_data_radix_select_dep1)
+                        # innerHTML = driver.execute_script(
+                        #     "return arguments[0].innerHTML", div_data_radix_select_dep1)
+
+                        arr_div_data_radix_select = div_data_radix_select_dep1.find_elements(
+                            By.CSS_SELECTOR,
+                            'div[role="option"]')
+                        div_data_radix_select = arr_div_data_radix_select[-1]
+
+                        driver_action.reset_actions()
+                        driver_action.move_to_element(
+                            div_data_radix_select).click().perform()
+                        time.sleep(0.5)
+                        break
+
+                    height = 0
+                    while True:
+                        new_height = driver.execute_script(
+                            "return document.documentElement.scrollHeight;")
+                        if new_height > height:
+                            height = new_height
+                            driver.execute_script(
+                                "window.scrollTo(0,document.body.scrollHeight)")
+                        else:
+                            break
+                        time.sleep(0.5)
+
+                    [button_num_onepage, number_onepage, arr_text_page_info,
+                        button_pre_onepage, button_aft_onepage] = get_pageselect_element(driver, wait)
+
+                    # number_total_txhash = arr_text_page_info[1]*40
+
+                    number_total_page = arr_text_page_info[1] if arr_text_page_info[1] <= 13 else 13
+
+                    for number_cur_page in range(1, number_total_page+1):
+                        print(
+                            f"str_dalaoAddress={str_dalaoAddress} number_cur_page={number_cur_page}")
+                        while True:
+                            notcaredata = driver.execute_script(
+                                get_swapactivaties_thead_body_dom_script)
+                            if notcaredata is None:
+                                time.sleep(0.5)
+                                continue
+                            break
+
+                        height = 0
+                        while True:
+                            new_height = driver.execute_script(
+                                "return document.documentElement.scrollHeight;")
+                            if new_height > height:
+                                height = new_height
+                                driver.execute_script(
+                                    "window.scrollTo(0,document.body.scrollHeight)")
+                            else:
+                                break
+                            time.sleep(0.5)
+                        [button_num_onepage, number_onepage, arr_text_page_info,
+                            button_pre_onepage, button_aft_onepage] = get_pageselect_element(driver, wait)
+                        while True:
+                            tbody_data = driver.execute_script(
+                                get_swapactivaties_script)
+                            if tbody_data is None:
+                                time.sleep(0.5)
+                                continue
+                            elif (number_cur_page < number_total_page and len(tbody_data) != 40):
+                                print("tbody_data_len=", len(tbody_data))
+                                time.sleep(0.5)
+                                continue
+                            else:
+                                break
+                        page_df = pd.DataFrame(
+                            tbody_data, columns=activities_columns)
+                        if page_df['txhash'].tolist()[0] in res_df['txhash']:
+                            # 已经存在了 不用在遍历了直接跳过
+                            break
+
+                        res_df = pd.concat([res_df, page_df],
+                                           ignore_index=True).reset_index(drop=True)
+
+                        driver_action.reset_actions()
+                        driver_action.move_to_element(
+                            button_aft_onepage).click().perform()
+                        time.sleep(1)
+                    res_df = res_df.drop_duplicates()
+                    res_df.to_csv(baseclass.dalao_activities_solscan_path /
+                                  f"solscan_act_{str_dalaoAddress}.csv", index=False)
+                    set_str_dalaoAddress.discard(str_dalaoAddress)
+                    cur_set_str_dalaoAddress.discard(str_dalaoAddress)
+
+                    if ("defiactivities" in driver.current_url):
+                        driver.close()
+
+                    time.sleep(random.uniform(0.7, 1.1))
+
+            arr_str_dalaoAddress = arr_str_dalaoAddress[split_len:]
+            arr_str_dalaoSwapUrl = arr_str_dalaoSwapUrl[split_len:]
+
+        except Exception as e:
+            print(e)
+            print(traceback.format_exc())
+            continue
+
+
+def get_muldriver_activities():
+    thread_list = []
+
+    for idx_driver in range(0, driver_len):
+        thread = threading.Thread(
+            target=get_onedriver_activites,
+            args=(arr_driver[idx_driver], arr_wait[idx_driver], arr_home_handle[idx_driver], arr_split_str_dalaoAddress[idx_driver], arr_split_str_dalaoSwapUrl[idx_driver]
+                  )
+        )
+        thread_list.append(thread)
+    for thread in thread_list:
+        thread.start()
+
+    for thread in thread_list:
+        thread.join()
+    time.sleep(10)
+    # while (True):
+    #     if len(set_str_dalaoAddress) == 0:
+    #         break
+    #     time.sleep(1)
+    for idx in range(0, driver_len):
+        arr_driver[idx].close()
+
+    return
+
+
+get_muldriver_activities()
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 152 - 0
src/code/1102_get_config_transaction.py

@@ -0,0 +1,152 @@
+ 
+import pandas as pd
+import numpy as np
+import random
+import pandas as pd
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+baseclass.makedirpath(baseclass.dalao_config_st_solscan_path)
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+activities_columns = ['txhash', 'date', 'timestamp', 'action', 'from', 'in_tokenaddress',
+                      'out_tokenaddress',
+                      'in_tokenname',
+                      'out_tokenname',
+                      'in_tokenamount',
+                      'out_tokenamount',
+                      'router',
+                      'israydium',
+                      ]
+
+
+def setswaptokenname(gdf, str_dalaoAddress):
+    arr_in_tokenname = gdf["in_tokenname"].tolist()
+    arr_out_tokenname = gdf["out_tokenname"].tolist()
+    arr_in_tokenaddress = gdf["in_tokenaddress"].tolist()
+    arr_out_tokenaddress = gdf["out_tokenaddress"].tolist()
+
+    str_swap_tokenname = arr_in_tokenname[0] if arr_in_tokenaddress[
+        0] != "So11111111111111111111111111111111111111112" else arr_out_tokenname[0]
+    gdf["swap_tokenname"] = str_swap_tokenname
+
+    return gdf
+
+
+def setswaptoken(gdf, str_dalaoAddress):
+    arr_in_tokenaddress = gdf["in_tokenaddress"].tolist()
+    arr_out_tokenaddress = gdf["out_tokenaddress"].tolist()
+
+    str_swap_tokenaddress = arr_in_tokenaddress[0] if arr_in_tokenaddress[
+        0] != "So11111111111111111111111111111111111111112" else arr_out_tokenaddress[0]
+    gdf["swap_tokenaddress"] = str_swap_tokenaddress
+
+    return gdf
+
+
+def compute_eth_token_amount_onerow(row, str_dalaoAddress):
+    row = row.copy()
+
+    decimal_in_tokenamount = decimal.Decimal(
+        row['in_tokenamount'])
+    decimal_out_tokenamount = decimal.Decimal(
+        row['out_tokenamount'])
+    if row['in_tokenaddress'] == 'So11111111111111111111111111111111111111112':
+        row['swap_eth_amount'] = '{0:.4f}'.format(
+            decimal_in_tokenamount)
+        row['swap_token_amount'] = '{0:.4f}'.format(
+            - decimal_out_tokenamount)
+        row['action'] = "SELL"
+
+    elif row['in_tokenaddress'] != 'So11111111111111111111111111111111111111112':
+        row['swap_eth_amount'] = '{0:.4f}'.format(
+            -decimal_out_tokenamount)
+        row['swap_token_amount'] = '{0:.4f}'.format(
+            decimal_in_tokenamount)
+        row['action'] = "BUY"
+
+    return row
+
+
+def compute_eth_token_amount(df, str_dalaoAddress):
+
+    df = df.apply(lambda row: compute_eth_token_amount_onerow(
+        row, str_dalaoAddress), axis=1)
+
+    return df
+
+
+def main():
+
+    for str_dalao_idx in range(0, len(arr_str_dalaoAddress)):
+
+        str_dalaoAddress = arr_str_dalaoAddress[str_dalao_idx]
+
+        print(f"enter str_dalaoaddress= {str_dalaoAddress}")
+        if not (baseclass.dalao_activities_solscan_path /
+                f"solscan_act_{str_dalaoAddress}.csv").exists():
+            continue
+        df = pd.read_csv(baseclass.dalao_activities_solscan_path /
+                         f"solscan_act_{str_dalaoAddress}.csv", dtype=object)
+        if (len(df) == 0):
+            continue
+
+        mask_iswsol = (((df["in_tokenaddress"] == "So11111111111111111111111111111111111111112")
+                        & (df["out_tokenaddress"] != "So11111111111111111111111111111111111111112"))
+
+                       | (df["in_tokenaddress"] != "So11111111111111111111111111111111111111112")
+                       & (df["out_tokenaddress"] == "So11111111111111111111111111111111111111112"))
+
+        df = df[mask_iswsol].reset_index(drop=True)
+
+        if len(df) == 0:
+            continue
+        df["swap_tokenaddress"] = ""
+
+        df = df.groupby(by=["txhash"], group_keys=False).apply(
+            lambda gdf: setswaptoken(gdf, str_dalaoAddress))
+        df["swap_tokenname"] = ""
+        df = df.groupby(by=["txhash"], group_keys=False).apply(
+            lambda gdf: setswaptokenname(gdf, str_dalaoAddress))
+        df["swap_eth_amount"] = "0"
+        df["swap_token_amount"] = "0"
+        df = compute_eth_token_amount(df=df, str_dalaoAddress=str_dalaoAddress)
+
+        df["timestamp"] = df["timestamp"].astype(int)
+        df["token_idx"] = -1
+
+        gettokenidx_df = df[["timestamp", "swap_tokenaddress"]].copy()
+        gettokenidx_df = gettokenidx_df.sort_values(
+            by=["timestamp"], ascending=[True])
+        list_tokenaddress = gettokenidx_df["swap_tokenaddress"].drop_duplicates(
+        ).tolist()
+        for str_tokenaddress_idx in range(0, len(list_tokenaddress)):
+            str_tokenaddress = list_tokenaddress[str_tokenaddress_idx]
+            df.loc[df["swap_tokenaddress"] == str_tokenaddress,
+                   "token_idx"] = len(list_tokenaddress)-str_tokenaddress_idx
+
+        df = df.sort_values(by=["token_idx", "timestamp"], ascending=[
+            True, True]).reset_index(drop=True)
+        df.to_csv(baseclass.dalao_config_st_solscan_path /
+                  f"configtoken_{str_dalaoAddress}.csv", index=False)
+
+
+df = pd.read_csv(baseclass.dalao_merge_path /
+                 "filter_dalao.csv", dtype=object)
+
+arr_str_dalaoAddress = df["dalaoAddress"].tolist()
+
+# print(arr_str_dalaoAddress)
+print(len(arr_str_dalaoAddress))
+main()
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 540 - 0
src/code/1103_get_profit_st_solscan.py

@@ -0,0 +1,540 @@
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+baseclass.makedirpath(baseclass.dalao_profit_st_solscan_path)
+baseclass.makedirpath(baseclass.dalao_ana_solscan_path)
+
+baseclass.makedirpath(baseclass.dalao_total_ana_solscan_path)
+
+
+baseclass.open_base_library()
+decimal.getcontext().prec = 100
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+
+TotalAnalysis_columns = [
+    "add",
+    # "whichcontract",
+    "beizhu",
+
+    "03d_cost",
+    "03d_earn",
+    "03d_earnper",
+    "03d_difcost",
+    "03d_difearn",
+    "03d_difper",
+    "03d_costmedian",
+    "03d_costmean",
+    "03d_earncount_per",
+    "03d_cost_dropaddouttoken",
+    "03d_earn_dropaddouttoken",
+    "03d_earnper_dropaddouttoken",
+    "03d_difcost_dropaddouttoken",
+    "03d_difearn_dropaddouttoken",
+    "03d_difper_dropaddouttoken",
+    "03d_costmedian_dropaddouttoken",
+    "03d_costmean_dropaddouttoken",
+    "03d_earncount_per_dropaddouttoken",
+    "03d_trans",
+
+
+    "07d_cost",
+    "07d_earn",
+    "07d_earnper",
+    "07d_difcost",
+    "07d_difearn",
+    "07d_difper",
+    "07d_costmedian",
+    "07d_costmean",
+    "07d_earncount_per",
+    "07d_cost_dropaddouttoken",
+    "07d_earn_dropaddouttoken",
+    "07d_earnper_dropaddouttoken",
+    "07d_difcost_dropaddouttoken",
+    "07d_difearn_dropaddouttoken",
+    "07d_difper_dropaddouttoken",
+    "07d_costmedian_dropaddouttoken",
+    "07d_costmean_dropaddouttoken",
+    "07d_earncount_per_dropaddouttoken",
+    "07d_trans",
+
+
+    "11d_cost",
+    "11d_earn",
+    "11d_earnper",
+    "11d_difcost",
+    "11d_difearn",
+    "11d_difper",
+    "11d_costmedian",
+    "11d_costmean",
+    "11d_earncount_per",
+    "11d_cost_dropaddouttoken",
+    "11d_earn_dropaddouttoken",
+    "11d_earnper_dropaddouttoken",
+    "11d_difcost_dropaddouttoken",
+    "11d_difearn_dropaddouttoken",
+    "11d_difper_dropaddouttoken",
+    "11d_costmedian_dropaddouttoken",
+    "11d_costmean_dropaddouttoken",
+    "11d_earncount_per_dropaddouttoken",
+    "11d_trans",
+
+
+    "15d_cost",
+    "15d_earn",
+    "15d_earnper",
+    "15d_difcost",
+    "15d_difearn",
+    "15d_difper",
+    "15d_costmedian",
+    "15d_costmean",
+    "15d_earncount_per",
+    "15d_cost_dropaddouttoken",
+    "15d_earn_dropaddouttoken",
+    "15d_earnper_dropaddouttoken",
+    "15d_difcost_dropaddouttoken",
+    "15d_difearn_dropaddouttoken",
+    "15d_difper_dropaddouttoken",
+    "15d_costmedian_dropaddouttoken",
+    "15d_costmean_dropaddouttoken",
+    "15d_earncount_per_dropaddouttoken",
+    "15d_trans",
+
+    "15dearn_dif"
+]
+
+
+def get_tokenswap_amount(df):
+    def get_cost(gdf):
+        token_amount_list = gdf['swap_token_amount'].to_list()
+
+        arr_out_token_amount = [abs(decimal.Decimal(
+            token_amount)) for token_amount in token_amount_list if decimal.Decimal(token_amount) < 0]
+        arr_in_token_amount = [decimal.Decimal(
+            token_amount) for token_amount in token_amount_list if decimal.Decimal(token_amount) > 0]
+        buy_counts = len(arr_in_token_amount)
+        sell_counts = len(arr_out_token_amount)
+
+        out_token_amount = sum(arr_out_token_amount)
+        in_token_amount = sum(arr_in_token_amount)
+
+        out_token_amount_str = '{0:.2f}'.format(out_token_amount)
+        in_token_amount_str = '{0:.2f}'.format(in_token_amount)
+        outtoken_per = '{0:.2f}'.format(
+            out_token_amount/in_token_amount) if in_token_amount != 0 else '-10'
+        gdf[['buy_counts', 'sell_counts', 'intoken_amount', 'outtoken_amount', 'outtoken_per']] = [buy_counts, sell_counts,
+                                                                                                   in_token_amount_str, out_token_amount_str, outtoken_per]
+        return gdf
+    df[['buy_counts', 'sell_counts', 'intoken_amount',
+        'outtoken_amount', 'outtoken_per']] = [0, 0, '0', '0', '0']
+    df = df.groupby(["token_idx"], group_keys=False).apply(
+        lambda gdf:  get_cost(gdf))
+    df = df.reset_index(drop=True)
+    return df
+
+
+def get_sol_profit(df):
+    # 計算利潤
+    df['cost_main'] = 0
+    df['earn_main'] = 0
+    df['earn_percent'] = -10
+    df = df.astype({'swap_eth_amount': float})
+    costMain_df = (
+        df
+        .groupby('token_idx')["swap_eth_amount"]
+        .apply(lambda x: abs(x[x < 0].sum()))
+    )
+    df['cost_main'] = df['token_idx'].map(costMain_df)
+
+    df.loc[df['outtoken_per'] == "-10", "cost_main"] = 0
+    earnMain_df = (
+        df
+        .groupby('token_idx')["swap_eth_amount"]
+        .sum()
+    )
+    df['earn_main'] = df["token_idx"].map(earnMain_df)
+    df['earn_percent'] = np.where(
+        df['cost_main'] != 0,
+        df['earn_main'] / df['cost_main'],
+        -10,
+    )
+    return df
+
+
+def analysis_lastdays(df, now_unix_time, intervaldays=30):
+    if len(df) == 0:
+        return 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+    # need consider df may null if use iloc
+    lastdf = df[df["TokenFirstTime"] >= now_unix_time - 3600*24*intervaldays]
+    # 去除那些earnper为-10的
+    lastdf = lastdf[lastdf['cost_main'] != 0]
+    # 去除 cost_main 过小的 <0.04  sol 理论上 同时fir_cost_main!=0
+    lastdf = lastdf[lastdf['cost_main'] >= 0.04] 
+    lastdf = lastdf[lastdf['fir_cost_main'] != 0]
+    lastdf = lastdf.reset_index(drop=True)
+    if len(lastdf) == 0:
+        return 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+    last_cost_sum = lastdf['cost_main'].sum()
+    last_earn_sum = lastdf['earn_main'].sum()
+    last_cost_median = lastdf['cost_main'].median()
+    last_cost_mean = lastdf['cost_main'].mean()
+    last_earnper = last_earn_sum / last_cost_sum if last_cost_sum != 0 else -10
+    last_trans_amount = len(lastdf)
+    lastdf['earn_percent'] = np.where(
+        lastdf['cost_main'] != 0,
+        lastdf['earn_main'] / lastdf['cost_main'],
+        -10,
+    )
+    last_earncount_per = (len(lastdf[(
+        lastdf['earn_percent'] >= 0.05)]) / len(lastdf) if len(lastdf) != 0 else 0)
+    earnmain_max = lastdf['earn_main'].max()
+    last_earn_difmax_sum = last_earn_sum - earnmain_max
+    last_cost_difmax_sum = last_cost_sum - \
+        lastdf[lastdf['earn_main'] == earnmain_max]['cost_main'].to_list()[0]
+    last_dif_earnper = (
+        last_earn_difmax_sum / last_cost_difmax_sum if last_cost_difmax_sum != 0 else -10
+    )
+    return (
+        last_cost_sum,
+        last_earn_sum,
+        last_earnper,
+        last_cost_difmax_sum,
+        last_earn_difmax_sum,
+        last_dif_earnper,
+        last_cost_median,
+        last_cost_mean,
+        last_earncount_per,
+        last_trans_amount
+    )
+
+
+def analysis_lastdays_dropaddouttoken(df, now_unix_time, intervaldays=30):
+    if len(df) == 0:
+        return 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+    # need consider df may null if use iloc
+    lastdf = df[df["TokenFirstTime"] >= now_unix_time - 3600*24*intervaldays]
+    # 去除那些earnper为-10的
+    lastdf = lastdf[lastdf['cost_main'] != 0]
+    # 去除 cost_main 过小的 <0.04  sol 理论上 同时fir_cost_main!=0
+    lastdf = lastdf[lastdf['cost_main'] >= 0.04] 
+    lastdf = lastdf[lastdf['fir_cost_main'] != 0]
+    lastdf = lastdf.reset_index(drop=True)
+    if len(lastdf) == 0:
+        return 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+    last_cost_sum = lastdf['cost_main'].sum()
+    last_earn_sum = lastdf["earn_main_dropaddouttoken"].sum()
+    last_cost_median = lastdf['cost_main'].median()
+    last_cost_mean = lastdf['cost_main'].mean()
+    last_earnper = last_earn_sum / last_cost_sum if last_cost_sum != 0 else -10
+    last_trans_amount = len(lastdf)
+    lastdf['earn_percent'] = np.where(
+        lastdf['cost_main'] != 0,
+        lastdf["earn_main_dropaddouttoken"] / lastdf['cost_main'],
+        -10,
+    )
+    last_earncount_per = (len(lastdf[(
+        lastdf['earn_percent'] >= 0.05)]) / len(lastdf) if len(lastdf) != 0 else 0)
+    earnmain_max = lastdf["earn_main_dropaddouttoken"].max()
+    last_earn_difmax_sum = last_earn_sum - earnmain_max
+    last_cost_difmax_sum = last_cost_sum - \
+        lastdf[lastdf['earn_main_dropaddouttoken'] == earnmain_max]['cost_main'].to_list()[
+            0]
+    last_dif_earnper = (
+        last_earn_difmax_sum / last_cost_difmax_sum if last_cost_difmax_sum != 0 else -10
+    )
+    return (
+        last_cost_sum,
+        last_earn_sum,
+        last_earnper,
+        last_cost_difmax_sum,
+        last_earn_difmax_sum,
+        last_dif_earnper,
+        last_cost_median,
+        last_cost_mean,
+        last_earncount_per,
+        last_trans_amount
+    )
+
+
+onedalao_ana_columns = ['TokenFirstTime', 'swap_tokenaddress', 'swap_tokenname', 'buy_counts', 'sell_counts',
+                        'outtoken_per', 'cost_main', 'earn_main', 'earn_percent']
+
+
+def get_analyres(df,  dalao_address, now_unix_time):
+
+    (last_03d_cost, last_03d_earn, last_03d_earnper, last_03d_difcost, last_03d_difearn, last_03d_difper, last_03d_costmedian, last_03d_costmean, last_03d_earncount_per, last_03d_trans) = analysis_lastdays(
+        df, now_unix_time=now_unix_time, intervaldays=3
+    )
+    (last_07d_cost, last_07d_earn, last_07d_earnper, last_07d_difcost, last_07d_difearn, last_07d_difper, last_07d_costmedian, last_07d_costmean, last_07d_earncount_per, last_07d_trans) = analysis_lastdays(
+        df, now_unix_time=now_unix_time, intervaldays=7
+    )
+    (last_11d_cost, last_11d_earn, last_11d_earnper, last_11d_difcost, last_11d_difearn, last_11d_difper, last_11d_costmedian, last_11d_costmean, last_11d_earncount_per, last_11d_trans) = analysis_lastdays(
+        df, now_unix_time=now_unix_time, intervaldays=11
+    )
+    (last_15d_cost, last_15d_earn, last_15d_earnper, last_15d_difcost, last_15d_difearn, last_15d_difper, last_15d_costmedian, last_15d_costmean, last_15d_earncount_per, last_15d_trans) = analysis_lastdays(
+        df, now_unix_time=now_unix_time, intervaldays=15
+    )
+    # # 去除所有daxin
+    # df = df[df["isdaxin"] == "0"].reset_index(drop=True)
+
+    (last_03d_cost_dropaddouttoken, last_03d_earn_dropaddouttoken, last_03d_earnper_dropaddouttoken, last_03d_difcost_dropaddouttoken, last_03d_difearn_dropaddouttoken, last_03d_difper_dropaddouttoken, last_03d_costmedian_dropaddouttoken, last_03d_costmean_dropaddouttoken, last_03d_earncount_per_dropaddouttoken, last_03d_trans) = analysis_lastdays_dropaddouttoken(
+        df, now_unix_time=now_unix_time, intervaldays=3
+    )
+    (last_07d_cost_dropaddouttoken, last_07d_earn_dropaddouttoken, last_07d_earnper_dropaddouttoken, last_07d_difcost_dropaddouttoken, last_07d_difearn_dropaddouttoken, last_07d_difper_dropaddouttoken, last_07d_costmedian_dropaddouttoken, last_07d_costmean_dropaddouttoken, last_07d_earncount_per_dropaddouttoken, last_07d_trans) = analysis_lastdays_dropaddouttoken(
+        df, now_unix_time=now_unix_time, intervaldays=7
+    )
+    (last_11d_cost_dropaddouttoken, last_11d_earn_dropaddouttoken, last_11d_earnper_dropaddouttoken, last_11d_difcost_dropaddouttoken, last_11d_difearn_dropaddouttoken, last_11d_difper_dropaddouttoken, last_11d_costmedian_dropaddouttoken, last_11d_costmean_dropaddouttoken, last_11d_earncount_per_dropaddouttoken, last_11d_trans) = analysis_lastdays_dropaddouttoken(
+        df, now_unix_time=now_unix_time, intervaldays=11
+    )
+    (last_15d_cost_dropaddouttoken, last_15d_earn_dropaddouttoken, last_15d_earnper_dropaddouttoken, last_15d_difcost_dropaddouttoken, last_15d_difearn_dropaddouttoken, last_15d_difper_dropaddouttoken, last_15d_costmedian_dropaddouttoken, last_15d_costmean_dropaddouttoken, last_15d_earncount_per_dropaddouttoken, last_15d_trans) = analysis_lastdays_dropaddouttoken(
+        df, now_unix_time=now_unix_time, intervaldays=15
+    )
+    analist = [
+        dalao_address,
+        "",
+        last_03d_cost,
+        last_03d_earn,
+        last_03d_earnper,
+        last_03d_difcost,
+        last_03d_difearn,
+        last_03d_difper,
+        last_03d_costmedian,
+        last_03d_costmean,
+        last_03d_earncount_per,
+        last_03d_cost_dropaddouttoken,
+        last_03d_earn_dropaddouttoken,
+        last_03d_earnper_dropaddouttoken,
+        last_03d_difcost_dropaddouttoken,
+        last_03d_difearn_dropaddouttoken,
+        last_03d_difper_dropaddouttoken,
+        last_03d_costmedian_dropaddouttoken,
+        last_03d_costmean_dropaddouttoken,
+        last_03d_earncount_per_dropaddouttoken,
+        last_03d_trans,
+
+        last_07d_cost,
+        last_07d_earn,
+        last_07d_earnper,
+        last_07d_difcost,
+        last_07d_difearn,
+        last_07d_difper,
+        last_07d_costmedian,
+        last_07d_costmean,
+        last_07d_earncount_per,
+        last_07d_cost_dropaddouttoken,
+        last_07d_earn_dropaddouttoken,
+        last_07d_earnper_dropaddouttoken,
+        last_07d_difcost_dropaddouttoken,
+        last_07d_difearn_dropaddouttoken,
+        last_07d_difper_dropaddouttoken,
+        last_07d_costmedian_dropaddouttoken,
+        last_07d_costmean_dropaddouttoken,
+        last_07d_earncount_per_dropaddouttoken,
+        last_07d_trans,
+
+        last_11d_cost,
+        last_11d_earn,
+        last_11d_earnper,
+        last_11d_difcost,
+        last_11d_difearn,
+        last_11d_difper,
+        last_11d_costmedian,
+        last_11d_costmean,
+        last_11d_earncount_per,
+        last_11d_cost_dropaddouttoken,
+        last_11d_earn_dropaddouttoken,
+        last_11d_earnper_dropaddouttoken,
+        last_11d_difcost_dropaddouttoken,
+        last_11d_difearn_dropaddouttoken,
+        last_11d_difper_dropaddouttoken,
+        last_11d_costmedian_dropaddouttoken,
+        last_11d_costmean_dropaddouttoken,
+        last_11d_earncount_per_dropaddouttoken,
+        last_11d_trans,
+
+        last_15d_cost,
+        last_15d_earn,
+        last_15d_earnper,
+        last_15d_difcost,
+        last_15d_difearn,
+        last_15d_difper,
+        last_15d_costmedian,
+        last_15d_costmean,
+        last_15d_earncount_per,
+        last_15d_cost_dropaddouttoken,
+        last_15d_earn_dropaddouttoken,
+        last_15d_earnper_dropaddouttoken,
+        last_15d_difcost_dropaddouttoken,
+        last_15d_difearn_dropaddouttoken,
+        last_15d_difper_dropaddouttoken,
+        last_15d_costmedian_dropaddouttoken,
+        last_15d_costmean_dropaddouttoken,
+        last_15d_earncount_per_dropaddouttoken,
+        last_15d_trans,
+
+        last_15d_earn-last_15d_earn_dropaddouttoken
+    ]
+
+    global TotalAnalysis_list
+    TotalAnalysis_list.append(analist)
+
+
+def calute_days(df, now_unix_time):
+    df["diffdays"] = 0
+    intervaldays_list = [15, 11, 7, 3]
+    for intervaldays in intervaldays_list:
+        df.loc[df["TokenFirstTime"] >=
+               now_unix_time - 3600*24*intervaldays, "diffdays"] = intervaldays
+    return df
+
+
+def calucate_earnmain_dropoutoken(row):
+    earnmain_amount_dropoutoken = decimal.Decimal(row['earn_main'])
+    outtoken_per = decimal.Decimal(row["outtoken_per"])
+    if outtoken_per >= 1.2 or outtoken_per == -10:
+        earnmain_amount_dropoutoken = decimal.Decimal(0)
+    earnmain_amount_dropoutoken_str = '{0:.4f}'.format(
+        earnmain_amount_dropoutoken)
+    return float(earnmain_amount_dropoutoken_str)
+
+
+def makeDexurl(row, dalao_address):
+    tokenAddress = row['swap_tokenaddress']
+    urlname = f"https://dexscreener.com/solana/{tokenAddress}?maker={dalao_address}"
+    return '=HYPERLINK("{}","{}")'.format(urlname, "DEX/"+tokenAddress)
+
+
+def get_ana_df(dalao_address, df, success_address_list):
+    onedalao_ana_df = df[onedalao_ana_columns].drop_duplicates(
+    ).reset_index(drop=True)
+    onedalao_ana_df.insert(
+        loc=2, column="swap_tokenadd_dexurl", value="")
+
+    # def makeDexurl(row, dalao_address):
+    #     tokenAddress = row['swap_tokenaddress']
+    #     urlname = f"https://dexscreener.com/solana/{tokenAddress}?maker={dalao_address}"
+    #     return '=HYPERLINK("{}","{}")'.format(urlname, "DEX/"+tokenAddress)
+    # https://dexscreener.com/bsc/0xd57e3a71e95a088cd3ac63047fc1ef845f7bbac1
+    onedalao_ana_df['swap_tokenadd_dexurl'] = onedalao_ana_df.apply(
+        lambda row: makeDexurl(row, dalao_address), axis=1)
+
+    # def calucate_earnmain_dropoutoken(row):
+    #     earnmain_amount_dropoutoken = decimal.Decimal(row['earn_main'])
+    #     outtoken_per = decimal.Decimal(row["outtoken_per"])
+    #     if outtoken_per >= 1.2 or outtoken_per == -10:
+    #         earnmain_amount_dropoutoken = decimal.Decimal(0)
+    #     earnmain_amount_dropoutoken_str = '{0:.4f}'.format(
+    #         earnmain_amount_dropoutoken)
+    #     return float(earnmain_amount_dropoutoken_str)
+
+    # 如果outoken超了,earn_main_dropaddouttoken 的值有两种处理方式
+    # 一种设置为0 即为不亏不赚
+    # 一种为全负  即为全亏了
+    onedalao_ana_df["earn_main_dropaddouttoken"] = onedalao_ana_df.apply(
+        lambda row: calucate_earnmain_dropoutoken(row), axis=1)
+    now_unix_time = int(time.time())
+
+    get_analyres(df=onedalao_ana_df, dalao_address=dalao_address,
+                 now_unix_time=now_unix_time)
+
+    onedalao_ana_df = calute_days(
+        df=onedalao_ana_df, now_unix_time=now_unix_time)
+    onedalao_ana_df['TokenFirstTime'] = pd.to_datetime(
+        onedalao_ana_df['TokenFirstTime'], unit='s')
+
+    handle_onedalao_ana_df = onedalao_ana_df[onedalao_ana_df['cost_main'] != 0].reset_index(
+        drop=True)
+
+    baseclass.makedirpath(baseclass.dalao_ana_solscan_path / dalao_address)
+
+    onedalao_ana_df.to_csv(baseclass.dalao_ana_solscan_path /
+                           dalao_address/f"analysisprofit_{dalao_address}.csv", index=False)
+    handle_onedalao_ana_df.to_csv(baseclass.dalao_ana_solscan_path /
+                                  dalao_address/f"analysisprofit_handle_{dalao_address}.csv", index=False)
+    success_address_list.remove(dalao_address)
+    # print(f"{dalao_address} success remainder= {len(success_address_list)} \n", end='')
+
+
+def get_profit_st(str_dalao_address):
+
+    df = pd.read_csv(baseclass.dalao_config_st_solscan_path /
+                     f"configtoken_{str_dalao_address}.csv", dtype=object)
+#    txhash	date	timestamp	action	from	in_tokenaddress	out_tokenaddress	in_tokenname	out_tokenname	in_tokenamount	out_tokenamount	router	israydium	swap_tokenaddress	swap_eth_amount	swap_token_amount	token_idx
+
+    df["timestamp"] = df["timestamp"].astype(int)
+
+    df["TokenFirstTime"] = df.groupby("token_idx")[
+        "timestamp"].transform("min")
+    df = get_tokenswap_amount(df=df)
+    df = get_sol_profit(df=df)
+    df = df.sort_values(by=['TokenFirstTime', 'token_idx'], ascending=[
+        False, True]).reset_index(drop=True)
+    profit_df = df.drop(columns=['TokenFirstTime'])
+    profit_df.to_csv(baseclass.dalao_profit_st_solscan_path /
+                     f"profit_st_{str_dalao_address}.csv", index=False)
+
+    return df
+
+
+def get_dalaoaddress_list():
+    df = pd.read_csv(baseclass.dalao_merge_path /
+                     "filter_dalao.csv", dtype=object)
+    arr_dalao_address = df["dalaoAddress"].tolist()
+    return arr_dalao_address
+
+
+def save_total_ana_df():
+    global TotalAnalysis_list
+    TotalAnalysis_df = pd.DataFrame(
+        data=TotalAnalysis_list, columns=TotalAnalysis_columns
+    )
+
+    TotalAnalysis_df = TotalAnalysis_df.round(4)
+    TotalAnalysis_df = TotalAnalysis_df.sort_values(by=["add"], ascending=[
+        True]).reset_index(drop=True)
+
+    TotalAnalysis_df.to_csv(
+        baseclass.dalao_total_ana_solscan_path/f"totalana.csv", index=False)
+
+    TotalAnalysis_df.to_excel(
+        baseclass.dalao_total_ana_solscan_path/f"totalana.xlsx", index=False)
+    addtion_filter_mask = (
+        (TotalAnalysis_df["15d_difearn"] >=
+         0.9*TotalAnalysis_df["11d_difearn"])
+        & (TotalAnalysis_df["11d_difearn"] >= 0.9*TotalAnalysis_df["07d_difearn"])
+        & (TotalAnalysis_df["07d_difearn"] >= 0.9*TotalAnalysis_df["03d_difearn"])
+    )
+    new_TotalAnalysis_df = TotalAnalysis_df[addtion_filter_mask].reset_index(
+        drop=True)
+    new_TotalAnalysis_df.to_excel(
+        baseclass.dalao_total_ana_solscan_path/f"increase_totalana.xlsx", index=False)
+
+
+def main():
+    dalao_address_list = get_dalaoaddress_list()
+    for dalao_address in dalao_address_list:
+        print(f"enter {dalao_address}")
+        if not (baseclass.dalao_config_st_solscan_path /
+                f"configtoken_{dalao_address}.csv").exists():
+            continue
+        df = get_profit_st(str_dalao_address=dalao_address)
+        get_ana_df(dalao_address=dalao_address, df=df)
+    save_total_ana_df()
+    return
+
+
+TotalAnalysis_list = []
+main()
+
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 110 - 0
src/code/1104_handle_analysis_solscan.py

@@ -0,0 +1,110 @@
+
+from base_class import *
+from base_class import BaseVariableFunction
+from openpyxl.utils import get_column_letter, column_index_from_string
+from openpyxl.styles import PatternFill
+import openpyxl
+import shutil
+
+
+# # openpyxl填充色说明
+# # 调用openpyxl中PatternFill
+# # 纯色填充使用solid
+
+
+baseclass = BaseVariableFunction(__file__)
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+
+def analysisprofit_handle_sum(read_excel_pathname):
+    wb = openpyxl.load_workbook(read_excel_pathname)
+    ws = wb.active
+    col_range = ws.max_column
+    row_range = ws.max_row
+    for col_idx in range(1, col_range+1):
+     # 设置列宽
+        if col_idx == 1:
+            ws.column_dimensions[get_column_letter(col_idx)].width = 11
+    wb.save(read_excel_pathname)
+
+
+def modify_excel_style(read_excel_pathname):
+    # 使用openpyxl读取xlsx文件,创建workbook
+    wb = openpyxl.load_workbook(read_excel_pathname)
+    ws = wb.active
+    col_range = ws.max_column
+    row_range = ws.max_row
+    for col_idx in range(1, col_range+1):
+     # 设置列宽
+        ws.column_dimensions[get_column_letter(col_idx)].width = 5
+        col_header = ws.cell(row=1, column=col_idx).value
+        col_header_list = col_header.split("_")
+        if col_header_list[0] not in ["03d", "07d", "11d", "15d"]:
+            continue
+        col_header_list.pop(0)
+        coltype = "_".join(col_header_list)
+        match coltype:
+            case "earnper":
+                fill = PatternFill('darkDown', fgColor='80C530')
+                for row_idx in range(1, row_range+1):
+                    ws.cell(row=row_idx, column=col_idx).fill = fill
+            case "difper":
+                fill = PatternFill('darkDown', fgColor='00B050')
+                for row_idx in range(1, row_range+1):
+                    ws.cell(row=row_idx, column=col_idx).fill = fill
+            case "cost_dropaddouttoken":
+                fill = PatternFill('solid', fgColor='FEB8B8')
+                for row_idx in range(1, row_range+1):
+                    ws.cell(row=row_idx, column=col_idx).fill = fill
+            case "earn_dropaddouttoken":
+                fill = PatternFill('solid', fgColor='9FF3A0')
+                for row_idx in range(1, row_range+1):
+                    ws.cell(row=row_idx, column=col_idx).fill = fill
+            case "earnper_dropaddouttoken":
+                fill = PatternFill('solid', fgColor='80C530')
+                for row_idx in range(1, row_range+1):
+                    ws.cell(row=row_idx, column=col_idx).fill = fill
+            case "difcost_dropaddouttoken":
+                fill = PatternFill('solid', fgColor='FF0000')
+                for row_idx in range(1, row_range+1):
+                    ws.cell(row=row_idx, column=col_idx).fill = fill
+            case "difearn_dropaddouttoken":
+                fill = PatternFill('solid', fgColor='C4D79B')
+                for row_idx in range(1, row_range+1):
+                    ws.cell(row=row_idx, column=col_idx).fill = fill
+            case "difper_dropaddouttoken":
+                fill = PatternFill('solid', fgColor='00B050')
+                for row_idx in range(1, row_range+1):
+                    ws.cell(row=row_idx, column=col_idx).fill = fill
+            case "costmedian_dropaddouttoken":
+                fill = PatternFill('solid', fgColor='00B0F0')
+                for row_idx in range(1, row_range+1):
+                    ws.cell(row=row_idx, column=col_idx).fill = fill
+            case "trans":
+                fill = PatternFill('solid', fgColor='FFFF00')
+                for row_idx in range(1, row_range+1):
+                    ws.cell(row=row_idx, column=col_idx).fill = fill
+    wb.save(read_excel_pathname)
+
+
+modify_excel_style(
+    read_excel_pathname=baseclass.dalao_total_ana_solscan_path/f"totalana.xlsx")
+
+modify_excel_style(
+    read_excel_pathname=baseclass.dalao_total_ana_solscan_path/f"increase_totalana.xlsx")
+
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+# =IF(BJ2-BS2<=0.01,0,BJ2-BS2)

+ 132 - 0
src/code/2000_get_dalao_tran_defined.py

@@ -0,0 +1,132 @@
+
+
+# https://dexscreener.com/solana?rankBy=trendingScoreH24&order=desc&minLiq=50000&minAge=36
+
+# 将油猴脚本获取的top trader
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+ 
+baseclass.makedirpath(baseclass.dalao_tran_defined_path)
+baseclass.makedirpath(baseclass.dalao_merge_defined_path)
+
+ 
+
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+def makescreenurl( urlname,urlparam):
+    # pairAddress = series[address_str]
+    urlname = urlname + urlparam
+    return '=HYPERLINK("{}","{}")'.format(urlname, urlname)
+
+def fun(gdf  ):
+      
+    # Maker = gdf['MAKER'].tolist()[0]
+    gdf["FirstSwaptime"] = gdf["DATE"].min()
+    gdf["buy_counts"] = len(gdf)
+    
+    return gdf
+     
+ 
+        
+import re
+def filter_simple_dalao():
+
+    res_df = None
+    big_amount_df = None
+    global arr_token_address
+
+    for tokenadd in arr_token_address:
+     
+        df_raydium =None
+        df =None
+  
+        if (baseclass.dalao_tran_defined_path /  f"{tokenadd}_defined.xlsx").exists():
+            continue
+        
+ 
+        if ( baseclass.dalao_ori_tran_defined_path / f"{tokenadd}_raydium.csv").exists():
+            df_raydium =  pd.read_csv(
+            baseclass.dalao_ori_tran_defined_path / f"{tokenadd}_raydium.csv", dtype=object)
+            df_raydium =df_raydium.drop_duplicates().reset_index(drop=True)
+            df_raydium["DATE"] = pd.to_datetime(df_raydium["DATE"], format='%Y-%m-%d %H:%M:%S')
+            
+            df_raydium=df_raydium.sort_values(by=["DATE"],ascending=[True])
+ 
+            df_raydium=df_raydium[[
+                'DATE',
+                 'TYPE',
+                'SOL',
+                 'Token',
+                 'MAKER',
+                 'TXN',
+                 "PRICE",
+                 ]]
+                    
+ 
+        df = pd.concat([  df_raydium  ], ignore_index=True)
+        df["PRICE"] = df["PRICE"].astype(float)
+    
+        df=df.sort_values(by=["DATE"],ascending=[True])
+        df = df[df['TYPE'].isin(['Buy', 'Sell'])].reset_index(drop=True)
+        # df.to_excel(baseclass.dalao_merge_path/f"total_dalao_txn_{tokenadd}.xlsx",index=False)
+        
+        print(f"enter {tokenadd}")
+
+        df["isNormal"] = "-1"
+        df["TokenAddress"] = tokenadd
+        
+
+        df = df.groupby(by=['MAKER']).apply(
+            lambda gdf: fun(gdf )).reset_index(drop=True)
+         
+        
+        df =df.drop_duplicates(subset=["MAKER"]).reset_index(drop=True)
+        # 示例 获取结果如下 https://www.defined.fi/sol/D6NdKrKNQPmRZCCnG1GqXtF7MMoHB7qR6GU5TkG59Qz1?maker=3ACp4T3ptTdayzWryEhT65NKZSKLjwXviBjWEy54aFdW 
+        df['DefinedURL'] = df.apply(lambda ser: makescreenurl(
+        "https://www.defined.fi/sol/", f"{ser['TokenAddress']}?maker={ser['MAKER']}"), axis=1)
+            
+        df =df[ [ 
+                 "FirstSwaptime",
+                'SOL',
+                'Token',
+                'MAKER',
+                'TXN',
+                "PRICE",
+                "TokenAddress",
+                "buy_counts",
+                "isNormal",
+                "DefinedURL"
+                ] ]
+        df.to_excel(baseclass.dalao_tran_defined_path /  f"{tokenadd}_defined.xlsx",index=False )
+        
+        
+        
+        
+ 
+ 
+    return
+
+csv_file_list = [f for f in os.listdir(
+    baseclass.dalao_ori_tran_defined_path) if f.endswith(".csv") ]
+arr_token_address = [tokenadd.split("_")[0] for tokenadd in csv_file_list  ]
+arr_token_address=list(set(arr_token_address))
+
+
+
+print("arr_token_address= ",arr_token_address)
+
+filter_simple_dalao()
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 85 - 0
src/code/2001_add_merge_defined.py

@@ -0,0 +1,85 @@
+
+
+# https://dexscreener.com/solana?rankBy=trendingScoreH24&order=desc&minLiq=50000&minAge=36
+
+# 将油猴脚本获取的top trader
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+ 
+baseclass.makedirpath(baseclass.dalao_tran_defined_path)
+baseclass.makedirpath(baseclass.dalao_merge_defined_path)
+
+ 
+
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+
+def makescreenurl( urlname,urlparam):
+    # pairAddress = series[address_str]
+    urlname = urlname + urlparam
+    return '=HYPERLINK("{}","{}")'.format(urlname, urlname)
+
+def fun(gdf  ):
+      
+    # Maker = gdf['MAKER'].tolist()[0]
+    gdf["FirstSwaptime"] = gdf["DATE"].min()
+    gdf["buy_counts"] = len(gdf)
+    
+    return gdf
+     
+ 
+        
+import re
+def filter_simple_dalao():
+
+    global arr_token_address
+    df = None
+
+    for tokenadd in arr_token_address:
+ 
+        cur_df =  pd.read_excel(
+        baseclass.dalao_tran_defined_path / f"{tokenadd}_defined.xlsx", dtype=object)
+        cur_df=cur_df.astype({
+            "buy_counts":int,
+            "isNormal":int,
+        })
+        
+        cur_df = cur_df[cur_df["buy_counts"]<=2].reset_index(drop=True)
+        df = pd.concat([  df,cur_df  ], ignore_index=True)
+   
+        df =df.drop_duplicates(subset=["MAKER"]).reset_index(drop=True)
+   
+    df =df[[
+        "MAKER"
+    ]]
+    df.columns=["dalaoaddress"]
+    df["eth"] = -1
+    df["usdc"] = -1
+    df.to_excel(baseclass.dalao_merge_defined_path /  f"ori_merge_defined.xlsx",index=False )
+        
+ 
+    return
+
+token_file_list = [f for f in os.listdir(
+    baseclass.dalao_tran_defined_path) if f.endswith(".xlsx") ]
+arr_token_address = [tokenadd.split("_")[0] for tokenadd in token_file_list  ]
+arr_token_address=list(set(arr_token_address))
+
+
+
+print("arr_token_address= ",arr_token_address)
+ 
+filter_simple_dalao()
+
+print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")

+ 70 - 0
src/code/2001_getbalance_eth.py

@@ -0,0 +1,70 @@
+
+
+import requests
+
+
+ 
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+ 
+ 
+
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+ 
+url = "https://solana-mainnet.g.alchemy.com/v2/WLI0ohbUlvbsJVmoIvB1wTSwUA8qP5qS"
+
+getBalance_payload = {
+    "id": 1,
+    "jsonrpc": "2.0",
+    "method": "getBalance",
+    "params": []
+}
+headers = {
+    "accept": "application/json",
+    "content-type": "application/json"
+}
+
+df =  pd.read_excel( baseclass.dalao_merge_defined_path / f"ori_merge_defined.xlsx", dtype=object)
+df= df.astype({
+    "eth":int
+})
+df = df.drop_duplicates(subset=["dalaoaddress"])
+df =df.reset_index(drop=True)
+
+df_not_getbalance =df[ df["eth"]==-1]
+arr_str_dalaoaddress = df_not_getbalance['dalaoaddress'].tolist()
+ 
+    
+for idx , str_dalaoaddress in  enumerate(arr_str_dalaoaddress):
+    print(f"str_dalaoaddress={str_dalaoaddress}")
+    getBalance_payload["params"] = [str_dalaoaddress]
+    
+    response = requests.post(url, json=getBalance_payload, headers=headers)
+    if response.status_code != 200:
+        continue
+        
+    response_data = response.json()
+    eth_value = response_data["result"]["value"] / (10**9)
+    df.loc[ df["dalaoaddress"] ==str_dalaoaddress , "eth"] = eth_value
+    print(f"str_dalaoaddress={str_dalaoaddress} eth_value={eth_value}")
+    if idx%5==0:
+        df.to_excel( baseclass.dalao_merge_defined_path / f"ori_merge_defined.xlsx", index=False)
+   
+ 
+ 
+df.to_excel( baseclass.dalao_merge_defined_path / f"ori_merge_defined.xlsx", index=False)
+
+ 
+

+ 135 - 0
src/code/2001_getbalance_usdc.py

@@ -0,0 +1,135 @@
+
+
+import requests
+
+
+ 
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+ 
+ 
+
+print('\n'*5)
+print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
+ 
+url = "https://solana-mainnet.g.alchemy.com/v2/WLI0ohbUlvbsJVmoIvB1wTSwUA8qP5qS"
+
+getBalance_payload = {
+    "id": 1,
+    "jsonrpc": "2.0",
+    "method": "getBalance",
+    "params": []
+}
+headers = {
+    "accept": "application/json",
+    "content-type": "application/json"
+}
+getTokenAccountsByOwner_USDC_payload = {
+    "id": 1,
+    "jsonrpc": "2.0",
+    "method": "getTokenAccountsByOwner",
+    "params": ["" ,
+                { "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" }, 
+                { "encoding": "jsonParsed" }
+               ]
+}
+
+getTokenAccountsByOwner_USDT_payload = {
+    "id": 1,
+    "jsonrpc": "2.0",
+    "method": "getTokenAccountsByOwner",
+    "params": ["" ,
+                { "mint": "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB" }, 
+                { "encoding": "jsonParsed" }
+               ]
+}
+
+
+
+
+
+df =  pd.read_excel( baseclass.dalao_merge_defined_path / f"ori_merge_defined.xlsx", dtype=object)
+df= df.astype({
+    "eth":float,
+    "usdc":float,
+    "usdt":float,
+})
+df = df.drop_duplicates(subset=["dalaoaddress"])
+df =df.reset_index(drop=True)
+
+df_not_getbalance =df[   (df["eth"]<0.5) & ( df["usdc"]==-1 ) ]
+arr_str_dalaoaddress = df_not_getbalance['dalaoaddress'].tolist()
+ 
+for idx , str_dalaoaddress in  enumerate(arr_str_dalaoaddress):
+    print(f"str_dalaoaddress= {str_dalaoaddress}")
+    getTokenAccountsByOwner_USDC_payload["params"][0] =str_dalaoaddress
+    response = requests.post(url, json=getTokenAccountsByOwner_USDC_payload, headers=headers)
+
+    if response.status_code != 200:
+        continue
+        
+    response_data = response.json()
+    # print(response_data)
+    usdc_value = -1
+    if len(response_data["result"]["value"])==0:
+        usdc_value = 0
+    elif len(response_data["result"]["value"])==1:
+        usdc_value = response_data["result"]["value"][0]["account"]["data"]["parsed"]["info"]["tokenAmount"]["uiAmount"]  
+    elif len(response_data["result"]["value"])>1:
+        usdc_value = -1
+        
+    df.loc[ df["dalaoaddress"] ==str_dalaoaddress , "usdc"] = usdc_value
+    print(f"str_dalaoaddress= {str_dalaoaddress} usdc_value= {usdc_value}")
+    if idx%5==0:
+        df.to_excel( baseclass.dalao_merge_defined_path / f"ori_merge_defined.xlsx", index=False)
+   
+ 
+ 
+df.to_excel( baseclass.dalao_merge_defined_path / f"ori_merge_defined.xlsx", index=False)
+
+ 
+df_not_getbalance = df[(df["eth"]<0.5)& ( df["usdc"] <100 )&(df["usdt"] ==-1 ) ]
+arr_str_dalaoaddress = df_not_getbalance['dalaoaddress'].tolist()
+ 
+print(f"arr_str_dalaoaddress_len= {len(arr_str_dalaoaddress)}")
+ 
+for idx , str_dalaoaddress in  enumerate(arr_str_dalaoaddress):
+    print(f"str_dalaoaddress= {str_dalaoaddress}")
+    getTokenAccountsByOwner_USDT_payload["params"][0] =str_dalaoaddress
+    response = requests.post(url, json=getTokenAccountsByOwner_USDT_payload, headers=headers)
+
+    if response.status_code != 200:
+        continue
+        
+    response_data = response.json()
+ 
+    usdt_value = -1
+    if len(response_data["result"]["value"])==0:
+        usdt_value = 0
+    elif len(response_data["result"]["value"])==1:
+        usdt_value = response_data["result"]["value"][0]["account"]["data"]["parsed"]["info"]["tokenAmount"]["uiAmount"]  
+    elif len(response_data["result"]["value"])>1:
+        usdt_value = -1
+        
+    df.loc[ df["dalaoaddress"] ==str_dalaoaddress , "usdt"] = usdt_value
+    print(f"str_dalaoaddress= {str_dalaoaddress} usdt_value={usdt_value}")
+    if idx%5==0:
+        df.to_excel( baseclass.dalao_merge_defined_path / f"ori_merge_defined.xlsx", index=False)
+   
+ 
+ 
+df.to_excel( baseclass.dalao_merge_defined_path / f"ori_merge_defined.xlsx", index=False)
+
+ 
+ 

+ 440 - 0
src/code/2002_gmgn_playwright_chrome.py

@@ -0,0 +1,440 @@
+
+# from datetime import datetime, timezone
+# from playwright.async_api import async_playwright, Playwright
+# from playwright.sync_api import expect
+from playwright.async_api import Playwright, async_playwright, expect
+import random
+import time
+import datetime
+import asyncio
+import pathlib
+import shutil
+
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+
+baseclass.makedirpath(baseclass.dalao_ori_pnl_gmgn_path)
+
+old_print = print
+ 
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+print('\n'*5)
+
+ 
+print(f"{'{:<6}'.format('enter')}  ----------------NOTE-----------NOTE---------------")
+
+
+number_chars_arr = ["k", "m", "b", "t", "p"]
+
+number_chars_obj = {
+    "k": 3,
+    "m": 6,
+    "b": 9,
+    "t": 12,
+    "p": 15
+}
+  
+
+
+activities_columns = ['tokenaddress', 'tokenname',  'last_active', 
+                      'profit_usd',   'profit_percent', 
+                    'buy_usd', 'sell_usd',  
+                    '30d_txns_buy','30d_txns_sell',  ]
+
+ 
+
+df =  pd.read_excel( baseclass.dalao_merge_defined_path / f"merge_defined.xlsx", dtype=object)
+
+arr_str_dalaoaddress = df['dalaoaddress'].drop_duplicates().tolist()
+
+
+ 
+
+temp_arr_dalaoaddress = copy.deepcopy(arr_str_dalaoaddress)
+for str_dalaoaddress in temp_arr_dalaoaddress:
+    if (baseclass.dalao_ori_pnl_gmgn_path /
+            f"ori_gmgn_pnl_{str_dalaoaddress}.csv").exists():
+        arr_str_dalaoaddress.remove(str_dalaoaddress)
+        
+arr_str_dalaoUrl = [
+f"https://gmgn.ai/sol/address/{str_dalaoaddress}" for str_dalaoaddress in arr_str_dalaoaddress]
+
+print('arr_str_dalaoaddress', len(arr_str_dalaoaddress))
+driver_len = 1 if len(arr_str_dalaoaddress) >= 1 else len(
+    arr_str_dalaoaddress)
+arr_driver = [None]*driver_len
+arr_wait = [None]*driver_len
+arr_home_handle = [None]*driver_len
+arr_split_str_dalaoaddress = [None]*driver_len
+arr_split_str_dalaoSwapUrl = [None]*driver_len
+len_split_str_dalaoaddress = int(len(arr_str_dalaoaddress)/driver_len)+1
+
+for idx_driver in range(0, driver_len):
+    arr_split_str_dalaoaddress[idx_driver] = arr_str_dalaoaddress[idx_driver *
+                                                                  len_split_str_dalaoaddress: (idx_driver+1)*len_split_str_dalaoaddress]
+    arr_split_str_dalaoSwapUrl[idx_driver] = arr_str_dalaoUrl[idx_driver *
+                                                                  len_split_str_dalaoaddress: (idx_driver+1)*len_split_str_dalaoaddress]
+
+
+set_str_dalaoaddress = set(arr_str_dalaoaddress)
+
+
+
+
+async def do_some_thing(playwright, cur_arr_str_dalaoaddress, cur_arr_str_dalaoUrl):
+
+
+    # browser =  playwright.chromium.launch(headless=True)
+    # context = await playwright.chromium.launch_persistent_context(user_data_dir=USER_DIR_PATH, accept_downloads=True, headless=False)
+    context = await playwright.firefox.launch_persistent_context(user_data_dir=USER_DIR_PATH , headless=False)
+    # context = await playwright.chromium.launch_persistent_context(user_data_dir=USER_DIR_PATH , headless=False)
+    # context = browser.new_context()
+    context.set_default_timeout(28000)
+    # context = await browser.new_context()
+    arr_page = [None]*10
+    # arr_page[0] = await context.new_page()
+    # # page = arr_page[0]
+    # await arr_page[0].goto(
+    #     "https://gmgn.ai/" , timeout=100000)
+   
+    
+    global set_str_dalaoaddress
+    arr_str_dalaoaddress = cur_arr_str_dalaoaddress
+    arr_str_dalaoUrl = cur_arr_str_dalaoUrl
+    
+    dalao_len = 6
+    
+    for str_dalaoaddress_idx in range(0, len(arr_str_dalaoaddress) , dalao_len):
+        cur_arr_str_dalaoaddress = []
+        cur_arr_str_dalaoUrl = []
+        
+        for idx_dalao  in range(0 ,dalao_len ):
+            if str_dalaoaddress_idx + idx_dalao  >= len(arr_str_dalaoaddress):
+                continue
+            temp_str_dalaoaddress = arr_str_dalaoaddress[str_dalaoaddress_idx + idx_dalao ]
+            temp_str_dalaoUrl = arr_str_dalaoUrl[str_dalaoaddress_idx +  idx_dalao ]
+            cur_arr_str_dalaoaddress.append( temp_str_dalaoaddress )
+            cur_arr_str_dalaoUrl.append( temp_str_dalaoUrl )
+        
+
+        # tasks = [handle_one_page(
+        #    idx_page,context, arr_page, cur_arr_str_dalaoaddress[idx_page] , cur_arr_str_dalaoUrl[idx_page] ) for idx_page in range(0, dalao_len)]
+        # await asyncio.gather(*tasks)
+
+        tasks_for_wait = [asyncio.create_task(handle_one_page(
+           idx_page,context, arr_page, cur_arr_str_dalaoaddress[idx_page] , cur_arr_str_dalaoUrl[idx_page] ) ) for idx_page in range(0, len(cur_arr_str_dalaoaddress))]
+
+        # 获取 交易token较少的        
+        # done, pending = await asyncio.wait(tasks_for_wait, timeout=60)
+
+        done, pending = await asyncio.wait(tasks_for_wait, timeout=300)
+    
+    
+    
+    # await page.wait_for_timeout(3000)
+    # time.sleep(5.5)
+    # await page.close()
+    await asyncio.sleep(3)
+    await context.close()
+async def handle_one_page( idx_page,context, arr_page, str_dalaoaddress , str_dalaoUrl ):
+    global set_str_dalaoaddress
+    page = None
+    try:
+    
+        arr_page[idx_page] = await context.new_page()
+        await   arr_page[idx_page].goto( str_dalaoUrl, timeout=29000)
+        page =  arr_page[idx_page]
+        sleep_time = random.randint(10,30)
+        sleep_time=sleep_time/10
+
+        await asyncio.sleep(sleep_time)
+        # res_df = pd.DataFrame(columns=activities_columns)
+        prev_page_height = await page.evaluate(
+            "document.documentElement.scrollHeight")
+        while True:
+            isfull = await check_tbody_isfull(page=page , str_dalaoaddress=str_dalaoaddress)
+            if isfull:
+                break
+            await page.evaluate(
+                "window.scrollTo(0, document.body.scrollHeight);")
+            await asyncio.sleep(1)
+            await page.evaluate(
+                "window.scrollTo(0, document.body.scrollHeight);")
+            await asyncio.sleep(1)
+            cur_page_height = await page.evaluate(
+                "document.documentElement.scrollHeight")
+            print(f"prev_page_height={prev_page_height} cur_page_height={cur_page_height}  ")
+            if cur_page_height > prev_page_height:
+                prev_page_height = cur_page_height
+            elif cur_page_height == prev_page_height:
+                break
+        tbody_data = None
+        while True:
+            try:
+                tbody_data = await get_tbody_data(page=page, str_dalaoaddress=str_dalaoaddress)
+
+            except Exception as e:
+                    
+                print(traceback.format_exc())
+                await asyncio.sleep(2)
+                raise
+                continue
+            if tbody_data is None:
+                await asyncio.sleep(0.8)
+                raise("tbody_data is None")
+                # continue
+            else:
+                break
+        dalao_df = pd.DataFrame(
+            tbody_data, columns=activities_columns)
+        dalao_df.to_csv(baseclass.dalao_ori_pnl_gmgn_path /
+                f"ori_gmgn_pnl_{str_dalaoaddress}.csv", index=False)
+
+        set_str_dalaoaddress.discard(str_dalaoaddress)
+
+    except Exception as e:
+        print("handle_one_page error",e)
+    if page is not None:
+        print(f"str_dalaoaddress= {str_dalaoaddress} close")
+        await page.close()
+
+async def check_tbody_isfull(page ,str_dalaoaddress):
+    table = page.locator('div[aria-labelledby="tabs-leftTabs--tab-0"]')
+    tbody_ = table.locator(
+        'tbody')
+    arr_trs = await tbody_.locator('tr').all()
+    print( f"{str_dalaoaddress} arr_trs len =", len(arr_trs))
+    if len(arr_trs)>=200:
+        return True
+    if len(arr_trs)==0:
+        return False
+
+    last_tr = arr_trs[-1]
+    
+    arr_tds = await last_tr.locator('td').all()
+    
+    p_token_last_active =  arr_tds[0].locator("p")
+    str_token_last_active =( await p_token_last_active.text_content()).strip()
+    if "--"   in str_token_last_active :
+        return True
+    
+    if "d" not in str_token_last_active :
+        return False
+    str_token_last_active=str_token_last_active.replace("d","")
+    number_token_last_active =  int(str_token_last_active)
+    print( f" {str_dalaoaddress} number_token_last_active =",   (number_token_last_active))
+    if number_token_last_active>30:
+        return True
+    else :
+        return False
+     
+
+async def get_tbody_data(page, str_dalaoaddress):
+    arr_tokenlink = None
+    listen_tr_ = None
+    listen_td_ = None
+   
+    try:
+        print(f"enter {str_dalaoaddress} get_tbody_data")
+        table = page.locator('div[aria-labelledby="tabs-leftTabs--tab-0"]')
+        tbody_ = table.locator( 'tbody')        
+        
+    
+        await asyncio.sleep(3)
+        arr_trs = await tbody_.locator('tr').all()
+        arr_trs_datares = []
+        for idx_tr_ in range(0, len(arr_trs)):
+            if(idx_tr_ %20==0):
+                print(f"{str_dalaoaddress} {idx_tr_}")
+            arr_tds_datares = [None]*9
+            arr_trs_datares.append(arr_tds_datares)
+
+
+            tr_ = arr_trs[idx_tr_]
+            listen_tr_ = tr_
+            arr_tds = await tr_.locator('td').all()
+            # 共有10列 
+            # 'Token/Last Active', 'Unrealized',  '30D Realized Profit', 
+            #           'Total Profit',  'Balance',   
+            #           'Position %',  'Bought', 
+            #             'Sold',   '30D TXs','Ahare'
+                        
+            for idx_td_ in range(0, len(arr_tds)):
+                td_ = arr_tds[idx_td_]
+                listen_td_ =td_
+                 
+                if (idx_td_ == 0):
+                    # print((await td_.text_content()))
+                   
+                    arr_tokenlink = await td_.locator("a").all()
+                    href_tokenaddress_name = await  arr_tokenlink[0].get_attribute('href')
+                    href_tokenaddress = href_tokenaddress_name.strip().split(
+                        '/token/')[-1]
+                    # arr_tokenaddress_name = href_tokenaddress_name.split("?symbol=")
+                    str_tokenaddress = href_tokenaddress  
+                    
+                    div_title = td_.locator('div[title]')
+                    str_tokenname = "unknown"
+                    if (await div_title.count()) == 0:
+                        str_tokenname = str_tokenname + "_"+str_tokenaddress[0:4]
+                    else:  
+                        str_tokenname = await div_title.get_attribute('title')
+         
+                    str_tokenname = re.sub(r'[^sol0-9\.\+\-]', '', str_tokenname)
+     
+                    p_token_last_active =   td_.locator("p")
+                                       
+                    str_token_last_active = (await p_token_last_active.text_content()).strip()
+                    if str_token_last_active == "--":
+                        arr_trs_datares.pop()
+                        break
+                    arr_tds_datares[0] = str_tokenaddress
+                    arr_tds_datares[1] = str_tokenname
+                    arr_tds_datares[2] = str_token_last_active
+                    
+                     
+                elif (idx_td_ == 1):
+                    continue
+               
+                elif (idx_td_ == 2):
+                    continue
+           
+                elif (idx_td_ == 3):
+                    
+                    arr_p_profit =  await td_.locator('p').all()
+                    str_profit_usd = (await arr_p_profit[0].text_content()).strip().lower()
+                    str_profit_percent = (await arr_p_profit[1].text_content()).strip().lower()
+                    
+                    str_profit_usd =  re.sub(r'[sol,%\+><sol]', "", str_profit_usd)
+                    str_profit_percent =  re.sub(r'[sol,%\+><]', "", str_profit_percent)
+                    
+      
+                    if str_profit_usd=="--":
+                        str_profit_usd = "0"
+                        
+                    if str_profit_percent=="--":
+                        str_profit_percent = "0"
+      
+                    for str_number_char in number_chars_arr  :
+                        if str_number_char in str_profit_usd:
+                            str_profit_usd=str_profit_usd.replace( str_number_char  ,"")
+                            str_profit_usd = float(str_profit_usd) * 10 ** number_chars_obj[str_number_char]
+                            str_profit_usd = str(str_profit_usd)
+                        if str_number_char in str_profit_percent:
+                            str_profit_percent=str_profit_percent.replace( str_number_char  ,"")
+                            str_profit_percent = float(str_profit_percent) * 10 ** number_chars_obj[str_number_char]
+                            str_profit_percent = str(str_profit_percent)
+                                
+                
+                    arr_tds_datares[3] = str_profit_usd
+                    arr_tds_datares[4] = str(float(str_profit_percent) /100)
+ 
+                elif (idx_td_ == 4):
+                    continue
+      
+                elif (idx_td_ == 5):
+                    continue
+    
+                elif (idx_td_ == 6):
+                    # bought
+                    arr_p_buy =  await td_.locator('p').all()
+                    str_buy_usd = (await arr_p_buy[0].text_content()).strip().lower()
+                    str_buy_usd =  re.sub(r'[sol,%\+><]', "", str_buy_usd)
+                
+                    
+                    for str_number_char in number_chars_arr  :
+                        if str_number_char in str_buy_usd:
+                            str_buy_usd=str_buy_usd.replace( str_number_char  ,"")
+                            number_buy_usd = float(str_buy_usd) * 10 ** number_chars_obj[str_number_char]
+                            str_buy_usd = str(number_buy_usd)
+           
+                            
+                    arr_tds_datares[5] = str_buy_usd
+                    
+                   
+                elif (idx_td_ == 7):
+                    # sold
+                    arr_p_sell =  await td_.locator('p').all()
+                    str_sell_usd = (await arr_p_sell[0].text_content()).strip().lower()
+                    str_sell_usd =  re.sub(r'[sol,%\+><]', "", str_sell_usd)
+                    
+                    for str_number_char in number_chars_arr :
+                        if str_number_char in str_sell_usd:
+                            str_sell_usd=str_sell_usd.replace( str_number_char  ,"")
+                            str_sell_usd = float(str_sell_usd) * 10 ** number_chars_obj[str_number_char]
+                            str_sell_usd = str(str_sell_usd)
+                            
+                    arr_tds_datares[6] = str_sell_usd
+                    
+          
+                elif (idx_td_ == 8):
+                    # txns
+                    
+                    str_30d_txns= (await td_.text_content()).strip()
+                    # str_30d_txns = re.sub(r'\s+', '', str_30d_txns)
+                    str_30d_txns =  re.sub(r'[\s,><]', "", str_30d_txns)
+          
+                    arr_30dtxns = str_30d_txns.split("/")
+                    str_buy_txns = arr_30dtxns[0]
+                    str_sell_txns =arr_30dtxns[1]
+                    
+
+                    for str_number_char in number_chars_arr :
+                        if str_number_char in str_buy_txns:
+                            str_buy_txns=str_buy_txns.replace( str_number_char  ,"")
+                            str_buy_txns = float(str_buy_txns) * 10 ** number_chars_obj[str_number_char]
+                            str_buy_txns = str(str_buy_txns)
+
+                        if str_number_char in str_sell_txns:
+                                str_sell_txns=str_sell_txns.replace( str_number_char  ,"")
+                                str_sell_txns = float(str_sell_txns) * 10 ** number_chars_obj[str_number_char]
+                                str_sell_txns = str(str_sell_txns)
+							
+                    
+                    
+                    arr_tds_datares[7] = str_buy_txns
+                    arr_tds_datares[8] = str_sell_txns
+                                 
+        return arr_trs_datares
+
+    except Exception as e:
+        print( "error",str_dalaoaddress,     "listen_tr_=",(await listen_tr_.text_content()), 
+              "listen_td_=",  (await listen_td_.text_content()) 
+              )
+        raise
+
+
+async def get_onedriver_swapactivities(cur_arr_str_dalaoaddress, cur_arr_str_dalaoUrl):
+    async with async_playwright() as playwright:
+       
+        await do_some_thing(playwright, cur_arr_str_dalaoaddress, cur_arr_str_dalaoUrl)
+
+
+async def main():
+    print("enter main()")
+    # tasks = [get_onedriver_swapactivities(
+    #     arr_split_str_dalaoaddress[idx_driver], arr_split_str_dalaoSwapUrl[idx_driver] ) for idx_driver in range(0, driver_len)]
+
+    # await asyncio.gather(*tasks)
+    
+    await  get_onedriver_swapactivities( arr_split_str_dalaoaddress[0], arr_split_str_dalaoSwapUrl[0] )  
+        
+ 
+    
+
+
+
+
+  
+USER_DIR_PATH =  baseclass.browsercookie_path   
+baseclass.makedirpath(USER_DIR_PATH)
+asyncio.run(main())
+# main()
+print(f"{'{:<6}'.format('END')}  ----------------NOTE-----------NOTE---------------")

+ 78 - 0
src/code/2003_check_dalao_tokens_ispump.py

@@ -0,0 +1,78 @@
+
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+
+baseclass.makedirpath(baseclass.dalao_ori_pnl_gmgn_path)
+
+old_print = print
+ 
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+print('\n'*5)
+
+ 
+print(f"{'{:<6}'.format('enter')}  ----------------NOTE-----------NOTE---------------")
+
+arr_file =os.listdir(baseclass.dalao_ori_pnl_gmgn_path )
+
+
+df =  pd.read_excel( baseclass.dalao_merge_defined_path / f"merge_defined.xlsx", dtype=object)
+
+arr_str_dalaoaddress = df['dalaoaddress'].drop_duplicates().tolist()
+
+for str_dalaoaddress in arr_str_dalaoaddress:
+    
+        if not (baseclass.dalao_ori_pnl_gmgn_path / f"ori_gmgn_pnl_{str_dalaoaddress}.csv").exists():
+            continue
+        
+        print(f"str_dalaoaddress= {str_dalaoaddress}")
+        dalao_df = pd.read_csv(baseclass.dalao_ori_pnl_gmgn_path /
+                f"ori_gmgn_pnl_{str_dalaoaddress }.csv", dtype= object)
+    
+        
+        
+        dalao_df['30d_txns_buy'] = dalao_df['30d_txns_buy'].str.replace("K", '000', regex=True)
+        dalao_df['30d_txns_sell'] = dalao_df['30d_txns_sell'].str.replace("K", '000', regex=True)
+        
+        dalao_df['30d_txns_buy'] = dalao_df['30d_txns_buy'].str.replace(r'[,\.]', '', regex=True)
+
+        dalao_df['30d_txns_sell'] = dalao_df['30d_txns_sell'].str.replace(r'[,\.]', '', regex=True)
+        
+        dalao_df =dalao_df.astype({
+           
+                "buy_usd":float,
+                "profit_usd":float,
+                "30d_txns_buy":int,
+                "30d_txns_sell":int,
+                
+        })
+
+        dalao_df["profit_percent"] =     dalao_df["profit_usd"] /   dalao_df["buy_usd"]
+        dalao_df["profit_percent"] =        dalao_df["profit_percent"].round(2)
+        dalao_df["ispump"] = 0
+        dalao_df["isnengen"] = -1
+        
+  
+        dalao_df["url"] = dalao_df.apply(lambda ser: ( f"https://dexscreener.com/solana/{ser['tokenaddress']}?maker={str_dalaoaddress}"), axis=1)
+
+ 
+    
+        
+        pump_mask =  dalao_df['tokenaddress'].str.endswith('pump')
+        dalao_df.loc[pump_mask,"ispump"] =1
+
+        dalao_df.to_excel(baseclass.dalao_ori_pnl_gmgn_path /
+                f"ori_gmgn_pnl_{str_dalaoaddress}.xlsx", index=False )
+
+    
+    
+    
+    
+    
+print(f"{'{:<6}'.format('END')}  ----------------NOTE-----------NOTE---------------")

+ 247 - 0
src/code/2004_gmgn_handle_ori_pnl.py

@@ -0,0 +1,247 @@
+
+from base_class import BaseVariableFunction
+from base_class import *
+baseclass = BaseVariableFunction(__file__)
+
+old_print = print
+ 
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+print('\n'*5)
+print(f"{'{:<6}'.format('enter')}  ----------------NOTE-----------NOTE---------------")
+
+baseclass.makedirpath(  baseclass.dalao_pnl_gmgn_path)
+baseclass.makedirpath(baseclass.dalao_total_ana_gmgn_path)
+
+ 
+def get_ana_data_lastdays( df,    intervaldays=30):
+    if len(df) == 0:
+        return 0, 0, 0, 0, 0, 0, 0, 0, 0 
+ 
+    lastdf = df[df["last_active"] <=  intervaldays]
+    # 去除那些 只有卖没有买的
+    lastdf = lastdf[lastdf['buy_usd'] != 0]
+    
+    lastdf=lastdf[lastdf["profit_usd"] !=0] 
+        
+    # 去除 buy_usd 过小的 < 20 usd  
+    lastdf = lastdf[lastdf['buy_usd'] >= 30]
+
+    lastdf = lastdf.reset_index(drop=True)
+    
+    
+    if len(lastdf) == 0:
+        return 0, 0, 0, 0, 0, 0, 0, 0, 0 
+
+ 
+    last_cost_sum = lastdf['buy_usd'].sum()
+    last_earn_sum = lastdf['profit_usd'].sum()
+    last_cost_median = lastdf['buy_usd'].median()
+    last_cost_mean = lastdf['buy_usd'].mean()
+    last_earnper = last_earn_sum / last_cost_sum if last_cost_sum != 0 else -10
+    last_trans_amount = len(lastdf)
+    lastdf['earn_percent'] = np.where(
+        lastdf['buy_usd'] != 0,
+        lastdf['profit_usd'] / lastdf['buy_usd'],
+        -10,
+    )
+    
+    earnmain_max = lastdf['profit_usd'].max()
+    last_earn_difmax_sum = last_earn_sum - earnmain_max
+    last_cost_difmax_sum = last_cost_sum - \
+        lastdf[lastdf['profit_usd'] == earnmain_max]['buy_usd'].to_list()[0]
+    last_dif_earnper = (
+        last_earn_difmax_sum / last_cost_difmax_sum if last_cost_difmax_sum != 0 else -10
+    )
+    return (
+        last_cost_sum,
+        last_earn_sum,
+        last_earnper,
+        last_cost_difmax_sum,
+        last_earn_difmax_sum,
+        last_dif_earnper,
+        last_cost_median,
+        last_cost_mean,
+        last_trans_amount,
+ 
+    )
+
+
+def main():
+    global arr_totalAnalysis
+    for str_dalaoaddress_idx in range(0, len(arr_str_dalaoaddress)):
+        
+        str_dalaoaddress= arr_str_dalaoaddress[str_dalaoaddress_idx]
+        print(f"enter str_dalaoaddress={str_dalaoaddress}")
+        if not (baseclass.dalao_ori_pnl_gmgn_path / f"ori_gmgn_pnl_{str_dalaoaddress}.csv").exists():
+            continue
+        
+        cur_df = pd.read_csv( baseclass.dalao_ori_pnl_gmgn_path / f"ori_gmgn_pnl_{str_dalaoaddress}.csv",dtype=object)
+        arr_last_active =   cur_df["last_active"].tolist()
+        for idx , str_last_active in enumerate(arr_last_active ):
+            if "min"   in str_last_active  or  "h" in str_last_active or  "s" in str_last_active:
+                arr_last_active[idx] = "0"
+            elif "d" in str_last_active:
+                arr_last_active[idx] = str_last_active.replace("d","")
+        cur_df["last_active"] = arr_last_active
+        cur_df['30d_txns_buy'] = cur_df['30d_txns_buy'].str.replace(',', '')
+        cur_df['30d_txns_sell'] = cur_df['30d_txns_sell'].str.replace(',', '')
+        cur_df['profit_percent'] = cur_df['profit_percent'].str.replace('>', '')
+        
+        cur_df['30d_txns_buy'] = cur_df['30d_txns_buy'].str.replace("K", '000', regex=True)
+        cur_df['30d_txns_sell'] = cur_df['30d_txns_sell'].str.replace("K", '000', regex=True)
+        
+        cur_df['30d_txns_buy'] = cur_df['30d_txns_buy'].str.replace(r'[,\.]', '', regex=True)
+        
+        cur_df['30d_txns_sell'] = cur_df['30d_txns_sell'].str.replace(r'[,\.]', '', regex=True)
+            
+        
+        
+   
+        
+        cur_df = cur_df.astype({
+            "last_active" :  int ,
+            "profit_usd" :  float ,
+            "profit_percent" :  float ,
+            "buy_usd" :  float ,
+            "sell_usd" : float  ,
+            "30d_txns_buy" :  int ,
+            "30d_txns_sell":  int ,
+            
+        })
+        cur_df = cur_df[ cur_df["last_active"]<=30].reset_index(drop=True)
+
+        cur_df=cur_df[cur_df["profit_usd"] !=0].reset_index(drop=True)
+        cur_df=cur_df[cur_df["30d_txns_buy"] !=0].reset_index(drop=True)
+        
+        cur_df.to_csv( baseclass.dalao_pnl_gmgn_path / f"gmgn_pnl_{str_dalaoaddress}.csv",index  = False )
+        
+        (last_07d_cost, last_07d_earn, last_07d_earnper, last_07d_difcost, last_07d_difearn, last_07d_difper, 
+        last_07d_costmedian, last_07d_costmean,    last_07d_trans ,   ) = get_ana_data_lastdays( df=cur_df, intervaldays=7)
+        
+        (last_15d_cost, last_15d_earn, last_15d_earnper, last_15d_difcost, last_15d_difearn, last_15d_difper, 
+        last_15d_costmedian, last_15d_costmean,    last_15d_trans ,   ) = get_ana_data_lastdays( df=cur_df, intervaldays=15)
+        
+        (last_30d_cost, last_30d_earn, last_30d_earnper, last_30d_difcost, last_30d_difearn, last_30d_difper, 
+        last_30d_costmedian, last_30d_costmean,    last_30d_trans ,   ) = get_ana_data_lastdays( df=cur_df, intervaldays=30)
+        
+        arr_one_ana_data = [
+            str_dalaoaddress,
+            f"https://gmgn.ai/sol/address/{str_dalaoaddress}",
+            "",
+    
+            last_07d_cost,
+            last_07d_earn,
+            last_07d_earnper,
+            last_07d_difcost,
+            last_07d_difearn,
+            last_07d_difper,
+            last_07d_costmedian,
+            last_07d_costmean,
+            last_07d_trans,
+    
+
+            last_15d_cost,
+            last_15d_earn,
+            last_15d_earnper,
+            last_15d_difcost,
+            last_15d_difearn,
+            last_15d_difper,
+            last_15d_costmedian,
+            last_15d_costmean,
+            last_15d_trans,
+
+            last_30d_cost,
+            last_30d_earn,
+            last_30d_earnper,
+            last_30d_difcost,
+            last_30d_difearn,
+            last_30d_difper,
+            last_30d_costmedian,
+            last_30d_costmean,
+            last_30d_trans,
+
+    
+        ]
+        arr_totalAnalysis.append(arr_one_ana_data)
+        if len(arr_totalAnalysis )%50==0:
+            save_total_ana_df()
+
+
+    
+TotalAnalysis_columns = [
+    "add",
+    "url",
+    "beizhu",
+ 
+
+    "07d_cost",
+    "07d_earn",
+    "07d_earnper",
+    "07d_difcost",
+    "07d_difearn",
+    "07d_difper",
+    "07d_costmedian",
+    "07d_costmean",
+    "07d_trans",
+
+
+    "15d_cost",
+    "15d_earn",
+    "15d_earnper",
+    "15d_difcost",
+    "15d_difearn",
+    "15d_difper",
+    "15d_costmedian",
+    "15d_costmean",
+    "15d_trans",
+
+ 
+    "30d_cost",
+    "30d_earn",
+    "30d_earnper",
+    "30d_difcost",
+    "30d_difearn",
+    "30d_difper",
+    "30d_costmedian",
+    "30d_costmean",
+    "30d_trans",
+
+ 
+]
+
+
+def save_total_ana_df():
+    cur_time = int(time.time())
+    # cur_time=cur_time/1000
+ 
+    TotalAnalysis_df = pd.DataFrame(
+        data=arr_totalAnalysis, columns=TotalAnalysis_columns
+    )
+
+    TotalAnalysis_df = TotalAnalysis_df.round(4)
+    TotalAnalysis_df = TotalAnalysis_df.sort_values(by=["add"], ascending=[
+        True]).reset_index(drop=True)
+ 
+ 
+    TotalAnalysis_df.to_excel(
+        baseclass.dalao_total_ana_gmgn_path/f"totalana.xlsx", index=False)
+
+         
+df =  pd.read_excel( baseclass.dalao_merge_defined_path / f"merge_defined.xlsx", dtype=object)
+
+arr_str_dalaoaddress = df['dalaoaddress'].drop_duplicates().tolist()
+# arr_str_dalaoaddress= [ "21fPp88HFomebzssP3qLriHHQDw7NQxJ1SoHpgvGENLd"]
+arr_totalAnalysis = []
+   
+main()
+save_total_ana_df()
+     
+    
+
+print(f"{'{:<6}'.format('END')}  ----------------NOTE-----------NOTE---------------")

+ 1 - 0
src/code/aa.html

@@ -0,0 +1 @@
+<td class="g-table-cell g-table-cell-fix-left g-table-cell-fix-left-last" style="position: sticky; left: 0px;"><a class="css-1z083cs" href="/sol/token/9b8jL2wcVjBFpieC5TUR76BDJ6sW8Eghd3fyq5VJmzir"> <div class="css-11dqbsu"><svg xmlns="http://www.w3.org/2000/svg" width="16px" height="16px" fill="#5C6068" viewBox="0 0 16 16"> </svg></div><a datatype="out" class="css-klael4" href="/sol/token/9b8jL2wcVjBFpieC5TUR76BDJ6sW8Eghd3fyq5VJmzir"> <div class="css-11ubtlu"> <div class="css-1jaluhh"></div> </div> <div class="css-17rg6f"> <div title="CLAP" class="css-j7qwjs"> <div class="css-12zlagp"> <div class="css-101kej7">CLAP</div><svg xmlns="http://www.w3.org/2000/svg" width="12px" height="12px" fill="#5C6068" viewBox="0 0 12 12" style="cursor: pointer;"> <g clip-path="url(#clip0_6972_490)"> <rect y="2.571" width="9.429" height="9.429" rx="2.571"></rect> <path fill-rule="evenodd" clip-rule="evenodd" d="M2.713 1.728c.094-.01.19-.014.287-.014h4.286a3 3 0 013 3V9c0 .097-.005.193-.014.287A2.572 2.572 0 0012 6.857V2.571A2.571 2.571 0 009.429 0H5.143c-1.125 0-2.08.722-2.43 1.728z"> </path> </g> <defs> <clipPath id="clip0_6972_490"> <rect width="12" height="12"></rect> </clipPath> </defs> </svg> </div> <div class="css-171onha"> <p class="chakra-text css-1tcpqdg">4d </p> </div> </div> </div> </a> </a></td>

+ 41 - 0
src/code/aa.json

@@ -0,0 +1,41 @@
+{
+    "jsonrpc": "2.0",
+    "result": {
+        "context": {
+            "apiVersion": "1.18.23",
+            "slot": 291551168
+        },
+        "value": [
+            {
+                "account": {
+                    "data": {
+                        "parsed": {
+                            "info": {
+                                "isNative": False,
+                                "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
+                                "owner": "13r1Fgh1ZvwfZ4uZAH12zQ319sorYUF9abUFbq82KTi7",
+                                "state": "initialized",
+                                "tokenAmount": {
+                                    "amount": "0",
+                                    "decimals": 6,
+                                    "uiAmount": 0.0,
+                                    "uiAmountString": "0"
+                                }
+                            },
+                            "type": "account"
+                        },
+                        "program": "spl-token",
+                        "space": 165
+                    },
+                    "executable": False,
+                    "lamports": 2039280,
+                    "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
+                    "rentEpoch": 18446744073709551615,
+                    "space": 165
+                },
+                "pubkey": "aWRbst6rhRZjy4fD3zErLibB8E6dwz1VcgE82jCdayF"
+            }
+        ]
+    },
+    "id": 1
+}

+ 45 - 0
src/code/aa02.html

@@ -0,0 +1,45 @@
+<td class="g-table-cell g-table-cell-fix-left g-table-cell-fix-left-last" style="position: sticky; left: 0px;"><a
+        class="css-1z083cs" href="/sol/token/PFireKhT5WG7axMSLBmMRpvYH7cgHx9CRWHU8F8HNbr">
+        <div class="css-11dqbsu"><svg xmlns="http://www.w3.org/2000/svg" width="16px" height="16px" fill="#5C6068"
+                viewBox="0 0 16 16">
+                <g clip-path="url(#clip0_6939_489)">
+                    <path fill-rule="evenodd" clip-rule="evenodd"
+                        d="M6.421.99a1.754 1.754 0 013.158 0l1.587 3.127 3.352.603c1.414.254 1.976 2.051.975 3.121l-2.37 2.536.484 3.5c.204 1.477-1.267 2.587-2.554 1.93L8 14.245l-3.053 1.56c-1.287.658-2.758-.452-2.554-1.929l.484-3.5L.507 7.84c-1-1.07-.439-2.867.975-3.121l3.352-.603L6.421.99z">
+                    </path>
+                </g>
+                <defs>
+                    <clipPath id="clip0_6939_489">
+                        <rect width="16" height="16"></rect>
+                    </clipPath>
+                </defs>
+            </svg></div><a datatype="out" class="css-klael4"
+            href="/sol/token/PFireKhT5WG7axMSLBmMRpvYH7cgHx9CRWHU8F8HNbr">
+            <div class="css-io1jbk">
+                <div class="css-1jaluhh"></div>
+                <div class="css-1l4zoaw"></div>
+            </div>
+            <div class="css-17rg6f">
+                <div class="css-j7qwjs">
+                    <div class="css-12zlagp">
+                        <div class="css-101kej7"></div><svg xmlns="http://www.w3.org/2000/svg" width="12px"
+                            height="12px" fill="#5C6068" viewBox="0 0 12 12" style="cursor: pointer;">
+                            <g clip-path="url(#clip0_6972_490)">
+                                <rect y="2.571" width="9.429" height="9.429" rx="2.571"></rect>
+                                <path fill-rule="evenodd" clip-rule="evenodd"
+                                    d="M2.713 1.728c.094-.01.19-.014.287-.014h4.286a3 3 0 013 3V9c0 .097-.005.193-.014.287A2.572 2.572 0 0012 6.857V2.571A2.571 2.571 0 009.429 0H5.143c-1.125 0-2.08.722-2.43 1.728z">
+                                </path>
+                            </g>
+                            <defs>
+                                <clipPath id="clip0_6972_490">
+                                    <rect width="12" height="12"></rect>
+                                </clipPath>
+                            </defs>
+                        </svg>
+                    </div>
+                    <div class="css-171onha">
+                        <p class="chakra-text css-1tcpqdg">55d </p>
+                    </div>
+                </div>
+            </div>
+        </a>
+    </a></td>

File diff suppressed because it is too large
+ 191 - 0
src/code/aft_whole_page.html


+ 56 - 0
src/code/base_class.js

@@ -0,0 +1,56 @@
+// Define a simple class in file1.js
+const path = require("path");
+const fs = require("fs-extra")
+
+
+class BaseClass {
+    constructor(scriptDirectory, scriptfile = null) {
+        this.scriptfilename = path.basename(scriptfile);
+
+        this.src_directory = path.dirname(scriptDirectory); // 上一级目录
+
+        this.project_directory = path.dirname(this.src_directory);
+
+        // 注意 正确的应该是.join(,"/file")=root/file
+        // 但是目前是.join(,"/file/")=root/file/ 多了一个/ 是因为实际操作中存在 `${baseclass.xxx_path}script.js` 以后在改
+        this.code_path = path.join(this.project_directory, "src/code/");
+        this.librarydata_path = path.join(this.project_directory, "src/librarydata/");
+
+        this.newpair_from_dexscreener_path = path.join(this.librarydata_path, "newpair_from_dexscreener/");
+        this.newpair_merge_path = path.join(this.librarydata_path, "newpair_merge/");
+        this.topdalao_from_dexscreener_path = path.join(this.librarydata_path, "topdalao_from_dexscreener/");
+
+        this.dalao_merge_path = path.join(this.librarydata_path, "dalao_merge/");
+        this.topdalao_signatures_path = path.join(this.librarydata_path, "topdalao_signatures/");
+        this.topdalao_transaction_path = path.join(this.librarydata_path, "topdalao_transaction/");
+        this.topdalao_st_path = path.join(this.librarydata_path, "topdalao_st/");
+
+
+      
+
+
+
+
+    }
+    makedirpath(mkpath) {
+        if (!fs.existsSync(mkpath)) {
+            fs.mkdirSync(mkpath);
+        }
+    }
+    rmfolder(mkpath) {
+        // fs.removeSync()
+        fs.removeSync(mkpath);
+
+    }
+    sleep(sleepdelay) {
+        return new Promise((resolve, reject) => {
+            setTimeout(() => {
+                resolve(sleepdelay);
+            }, sleepdelay);
+        })
+    }
+
+
+}
+
+module.exports = BaseClass;

+ 368 - 0
src/code/base_class.py

@@ -0,0 +1,368 @@
+
+
+import requests
+import os
+import datetime
+import time
+import math
+import json
+import pathlib
+import shutil
+import decimal
+import traceback
+import pandas as pd
+import numpy as np
+import sys
+import threading
+import copy
+import asyncio
+import random
+import re
+class BaseVariableFunction:
+    def __init__(self, scriptfile):
+        # 获取当前脚本的名字
+        self.scriptfilename = pathlib.Path(scriptfile).name
+        # 获取脚本所在目录的绝对路径
+        self.script_directory = pathlib.Path(scriptfile).resolve().parent
+        self.src_directory = self.script_directory.parent
+        # 获取项目所在目录的绝对路径
+        self.project_directory = self.src_directory.parent
+
+        self.src_directory = self.project_directory/"src/"
+        self.code_path = self.project_directory / 'src/code/'
+        self.library_path = self.project_directory / 'src/library/'
+        self.librarydata_path = self.project_directory / 'src/librarydata/'
+        self.base_library_file = self.code_path / 'base_library.json'
+        self.newpair_from_dexscreener_path = self.librarydata_path/"newpair_from_dexscreener/"
+        self.dalao_ori_tran_txhash_solscan_path = self.librarydata_path / \
+            "dalao_ori_tran_txhash_solscan/"
+        self.dalao_tran_txhash_path = self.librarydata_path/"dalao_tran_txhash/"
+
+        self.newpair_merge_path = self.librarydata_path/"newpair_merge/"
+        self.browsercookie_path = self.library_path/"browsercookie/"
+
+        self.dalao_from_dexscreener_path = self.librarydata_path / \
+            "dalao_from_dexscreener/"
+        self.dalao_merge_path = self.librarydata_path/"dalao_merge/"
+
+        self.dalao_merge_defined_path = self.librarydata_path/"dalao_merge_defined/"
+        
+        self.dalao_ori_tran_dexscreen_path = self.librarydata_path/"dalao_ori_tran_dexscreen/"
+        
+        
+        self.dalao_ori_tran_defined_path = self.librarydata_path/"dalao_ori_tran_defined/"
+        self.dalao_tran_defined_path = self.librarydata_path/"dalao_tran_defined/"
+ 
+        self.dalao_transfer_solanafm_path = self.librarydata_path / \
+            "dalao_transfer_solanafm/"
+        self.dalao_tokentransfer_solanafm_path = self.librarydata_path / \
+            "dalao_tokentransfer_solanafm/"
+        self.dalao_transaction_st_solanafm_path = self.librarydata_path / \
+            "dalao_transaction_st_solanafm/"
+        self.dalao_configtoken_st_solanafm_path = self.librarydata_path / \
+            "dalao_configtoken_st_solanafm/"
+
+        self.dalao_activities_solscan_path = self.librarydata_path / \
+            "dalao_activities_solscan/"
+            
+        self.dalao_activities_gmgn_path = self.librarydata_path / \
+            "dalao_activities_gmgn/"
+        self.dalao_ori_pnl_gmgn_path = self.librarydata_path / \
+            "dalao_ori_pnl_gmgn/"
+        self.dalao_pnl_gmgn_path = self.librarydata_path / \
+            "dalao_pnl_gmgn/"
+        self.dalao_total_ana_gmgn_path = self.librarydata_path / "dalao_total_ana_gmgn/"
+         
+        self.dalao_config_st_solscan_path = self.librarydata_path / \
+            "dalao_config_st_solscan/"
+        self.dalao_profit_st_solscan_path = self.librarydata_path / "dalao_profit_st_solscan/"
+        self.dalao_total_ana_solscan_path = self.librarydata_path / "dalao_total_ana_solscan/"
+
+        self.dalao_ana_solscan_path = self.librarydata_path / "dalao_ana_solscan/"
+
+        self.dalao_ana_fm_path = self.librarydata_path / "dalao_ana_fm/"
+        self.new_dalao_ana_fm_path = self.librarydata_path / "new_dalao_ana_fm/"
+
+        self.dalao_total_ana_fm_path = self.librarydata_path / "dalao_total_ana_fm/"
+        self.dalao_profit_st_fm_path = self.librarydata_path / "dalao_profit_st_fm/"
+        self.new_dalao_total_ana_fm_path = self.librarydata_path / "new_dalao_total_ana_fm/"
+        self.dalao_signatures_path = self.librarydata_path / "dalao_signatures/"
+        self.dalao_transaction_path = self.librarydata_path / "dalao_transaction/"
+        self.dalao_ori_st_path = self.librarydata_path / "dalao_ori_st/"
+        self.dalao_configtoken_st_path = self.librarydata_path / "dalao_configtoken_st/"
+        self.dalao_profit_st_path = self.librarydata_path / "dalao_profit_st/"
+        self.dalao_ana_path = self.librarydata_path / "dalao_ana/"
+        # self.dalao_total_ana_path = self.librarydata_path / "dalao_total_ana/"
+
+        self.solana_fm_headers = {
+            "accept": "application/json",
+            "content-type": "application/json",
+            # "ApiKey": "sk_live_5a2d94637a2942e294e91ea58f070f3a"
+      
+            
+        }
+        self.arr_drop_token_froselecteddalao = [
+            
+            "DZM5CXzHXzUaxQVdf4LVFXTgAR7XBMpXxoyakPJVpump",
+            "83sjxMqcV9ynx4sSEjwL3NqNB7AoyiQLqdnuNHFXpump",
+            "2TQHtfEzqXpMYFaBGaURCBwhVRSBLTRvSpciVLmApump",
+            "H3Zh6Lq8SnwoZMQCic3omRvxHGbvv5z1hcZ4fGxhpump",
+            "8UzSrHEkoPofAFSmUh5k2pnxJrX1FV68bNXsQH7fpump",
+
+ 
+                                            ]
+        self.mywalletaddress="Cft4hKtC3dVftfqmL2MCALpeCq7oWM7qpftNfVVUzA7h"
+        self.headers = {
+            "accept": "application/json",
+            "content-type": "application/json"
+        }
+        self.str_token_address="A8C3xuqscfmyLrte3VmTqrAq8kgMASius9AFNANwpump"
+
+        self.arr_pub_address = [
+            "5DGhcY7QKci7BhpAqboHYT3weVPcyNAwUVN8JYCL8viT",
+            "5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1",
+            "EAiYEwo7N2WLfFwNsnxVKxH4ZehVBTbVbzsd59yREqAv",
+            "9nnLbotNTcUhvbrsA6Mdkx45Sm82G35zo28AqUvjExn8",
+            "6U91aKa8pmMxkJwBCfPTmUEfZi6dHe7DcFq2ALvB2tbB",
+            "4Agisox25EQTQ5LSgmETfMXrLZKZodmePMvnVoqQQFw5",
+            "5eDWEqd9LuedRwXCaVkghFjyRTT2aMeEr667y65bzmEu",
+            "5WU2HTcgGKf6EVBVqBxVaXNRndh8Stqj8dKqpdZeTBZL",
+            "F7KnmZuzqpZnbXaGnSt8DvuPsHS6N8LK1uRzLDwEkipX",
+            "62kLsCvpEVXr54qJGqgoqrbaEK8Y17eDZtXWEnS2JDzD",
+            "AC8FeLuP5ysJSYY4RUtUh9R2JXdpT4ZxnMBGmAC8Rrdj",
+            "Fm3DL8T4whBCk5yHLUTG6HGRbrzm3rsDkaRPF4GVVRuC",
+        ]
+
+
+
+    def makedirpath(self, folder):
+        pathlib.Path(folder).mkdir(exist_ok=True)
+
+    def rmfolder(self, folder):
+        if pathlib.Path(folder).exists():
+            shutil.rmtree(folder)
+
+    def open_base_library(self):
+
+        with self.base_library_file.open(mode='r', encoding='utf-8') as f:
+            self.base_library = json.load(f)
+        return self.base_library
+
+    def readcsvfiles_2df(self, csv_path):
+
+        csv_file_list = [f for f in os.listdir(csv_path) if f.endswith(".csv")]
+        merge_df = pd.DataFrame()
+        for csv_file in csv_file_list:
+            new_df = pd.read_csv(
+                csv_path / csv_file, dtype=object)
+
+            merge_df = pd.concat([merge_df, new_df]).reset_index(drop=True)
+
+        return merge_df
+
+    def ISO8601_str_to_timestamp(self, datetime_str):
+        # 将'2023-08-28T12:43:52Z' 结构的str 转化为utc的时间戳(单位:秒)
+        # Define the format of the input datetime string
+        # Adjust the format as per your input datetime string
+        format_str = '%Y-%m-%dT%H:%M:%SZ'
+        # 解析'2023-08-12T22:22:50Z' 并转换为0时区的时间
+        dt = datetime.datetime.strptime(datetime_str, format_str).replace(
+            tzinfo=datetime.timezone.utc)
+        # Convert the datetime object to a timestamp (number of seconds since the epoch)
+        timestamp = int(dt.timestamp())
+        return timestamp
+
+    def init_req_dict(self, param_sort="asc", offsettimes_max=10, key_idx=None, address=None, action=None, actiontype=None,  apikey=None, remainder_retry_times_max=5, startrange=27000000, endrange=99000000, timeout=30):
+        # 一个dict 对应一个address 的某一个block范围 一次性的,用完如果end>start 就remove 这个dict  如果一个address 有两个block range 那么会有两个dict
+        # requests_dict key 為空列表 ,使用append 進行添加
+        # requests_dict 進行初始化定義
+        # timeout ,請求request 的超時時間
+        # start 初始化以及每次reset重置的start
+        # remainder_retry_times_max 初始以及重置的初始 可以重傳次數
+        # tokencontract_params_list 請求bscscan api的參數設置
+        # offsettimes_max  允許的 offset 最大次數,默認一次offset 請求10000條
+        # req_response 接受響應列表
+        # offsettimes  記錄此add的offset 次數,等於offsettimes_max 就要停止報錯
+        # need_remove 此項的響應是否處理完成,如果處理完成(多次超時報錯或數據不對,或者分析完成),為True,
+        #   可以刪除,相應的tokencontracts 列表中的tradersadds 也需要remove此項索引被其他未完成的覆蓋
+        # remainder_retry_times 出現超時或請求錯誤可以進行重傳,此爲還可以重傳的次數
+        # key_idx 由于是异步执行函数 所有dict 会放在一dict 中 key_idx 就是当前dict在总的dict的索引当前dict 完成,就可以在总dict删除这个索引
+
+        if address is None:
+            raise Exception("not set address")
+        if key_idx is None:
+            raise Exception("not set key_idx")
+
+        requests_dict = {}
+        requests_dict["key_idx"] = key_idx
+        requests_dict["address"] = address
+        requests_dict["timeout"] = timeout
+        requests_dict["startrange"] = startrange
+        requests_dict["endrange"] = endrange
+        requests_dict["remainder_retry_times_max"] = remainder_retry_times_max
+        requests_dict["offsettimes_max"] = offsettimes_max
+        # 上面部分是无论发送了多少次请求都不变得
+        # 正在请求中 isrequseting=True 避免之前的没有结果,有发起新的请求
+        requests_dict["isrequseting"] = False
+        requests_dict["req_params"] = {}
+        requests_dict["req_response"] = None
+        requests_dict["req_pd"] = None
+        requests_dict["offsettimes"] = 0
+        requests_dict["need_remove"] = False
+        requests_dict["isfirstreq"] = True
+        requests_dict["remainder_retry_times"] = remainder_retry_times_max
+
+        requests_dict["req_params"] = {
+            "module": "account",
+
+            "address": address,
+            "page": 1,
+            # "offset": 10000,
+            "startrange": startrange,
+            "endrange": endrange,
+            "limit": 100,
+            "sort": param_sort,
+            "apikey": apikey
+        }
+
+        return requests_dict
+
+    def handle_IF_tokenresponse_NOTOK(self, tokenresponse,  cur_conadd, key_idx, requests_dict, req_dict_total):
+        # 對於相應正常,結果不正常的,可能是沒有交易記錄 可能是訪問頻率過高等,
+        # 對於部分不OK的情況,可以分別處理
+        # { "status": "0", "message": "No transactions found", "result": [] }
+        # { "status": "0", "message": "NOTOK", "result": "Max rate limit reached, please use API Key for higher rate limit" }
+        # { "status": "0", "message": "NOTOK", "result": "Contract source code not verified" }
+        # {'status': '0', 'message': 'NOTOK', 'result': 'Error! Invalid contract address format'}
+        # {'status': '0', 'message': 'Query Timeout occured. Please select a smaller result dataset',result': None}
+        print(
+            f"tokenresponse message NOTOK  {cur_conadd} \n", "tokenresponse=", tokenresponse, '\n', end='')
+        # print("test tokenresponse",
+        #       tokenresponse["message"], tokenresponse["result"])
+        if (1 == 2):
+            print("i dont know")
+
+        else:
+            raise Exception(
+                'tokenresponse message NOTOK And No matched method')
+
+    def judge_req_completed(self, requests_dict,  key_idx, cur_conadd, req_dict_total):
+        if requests_dict["req_params"]["endrange"] <= requests_dict["req_params"]["startrange"]:
+            # 如果接下来的block 范围有问题 startblcok >end 说明已经获取完毕 ,不用再获取了
+            print(
+                f"{cur_conadd} startblcok >end 结束\n", end='')
+            requests_dict["need_remove"] = True
+            if req_dict_total.get(key_idx) is not None:
+                print(f"remove  {cur_conadd} {key_idx}\n", end='')
+                del req_dict_total[key_idx]
+
+    def get_current_timestamp(self):
+
+        timestamp = math.floor(time.time())
+        return timestamp
+
+    def analysis_lastdays(self, df, now_unix_time, intervaldays=30):
+        if len(df) == 0:
+            return 0, 0, 0, 0, 0, 0, 0, 0, 0
+        # need consider df may null if use iloc
+        lastdf = df[df["TokenFirstTime"] >=
+                    now_unix_time - 3600*24*intervaldays]
+        # 去除那些earnper为-10的
+        lastdf = lastdf[lastdf['cost_main'] != 0]
+        lastdf = lastdf.reset_index(drop=True)
+        if len(lastdf) == 0:
+            return 0, 0, 0, 0,  0, 0, 0, 0, 0
+        last_cost_sum = lastdf['cost_main'].sum()
+        last_earn_sum = lastdf['earn_main'].sum()
+        last_cost_median = lastdf['cost_main'].median()
+        last_cost_mean = lastdf['cost_main'].mean()
+        last_earnper = last_earn_sum / last_cost_sum if last_cost_sum != 0 else -10
+        last_trans_amount = len(lastdf)
+        lastdf['earn_percent'] = np.where(
+            lastdf['cost_main'] != 0,
+            lastdf['earn_main'] / lastdf['cost_main'],
+            -10,
+        )
+        # last_earncount_per = (len(lastdf[(
+        #     lastdf['earn_percent'] >= 0.05)]) / len(lastdf) if len(lastdf) != 0 else 0)
+        earnmain_max = lastdf['earn_main'].max()
+        last_earn_difmax_sum = last_earn_sum - earnmain_max
+        last_cost_difmax_sum = last_cost_sum - \
+            lastdf[lastdf['earn_main'] == earnmain_max]['cost_main'].to_list()[
+                0]
+        last_dif_earnper = (
+            last_earn_difmax_sum / last_cost_difmax_sum if last_cost_difmax_sum != 0 else -10
+        )
+        return (
+            last_cost_sum,
+            last_earn_sum,
+            last_earnper,
+            last_cost_difmax_sum,
+            last_earn_difmax_sum,
+            last_dif_earnper,
+            last_cost_median,
+            last_cost_mean,
+            # last_earncount_per,
+            last_trans_amount
+        )
+
+    def analysis_lastdays_noaddouttoken(self, df, now_unix_time, intervaldays=30):
+        if len(df) == 0:
+            return 0, 0, 0, 0, 0,  0, 0, 0, 0
+        # need consider df may null if use iloc
+        lastdf = df[df["TokenFirstTime"] >=
+                    now_unix_time - 3600*24*intervaldays]
+        # 去除那些earnper为-10的
+        lastdf = lastdf[lastdf['cost_main'] != 0]
+        lastdf = lastdf.reset_index(drop=True)
+        if len(lastdf) == 0:
+            return 0, 0, 0, 0, 0,  0, 0, 0, 0
+        last_cost_sum = lastdf['cost_main'].sum()
+        last_earn_sum = lastdf["earn_main_noaddouttoken"].sum()
+        last_cost_median = lastdf['cost_main'].median()
+        last_cost_mean = lastdf['cost_main'].mean()
+        last_earnper = last_earn_sum / last_cost_sum if last_cost_sum != 0 else -10
+        last_trans_amount = len(lastdf)
+        lastdf['earn_percent'] = np.where(
+            lastdf['cost_main'] != 0,
+            lastdf["earn_main_noaddouttoken"] / lastdf['cost_main'],
+            -10,
+        )
+
+        earnmain_max = lastdf["earn_main_noaddouttoken"].max()
+        last_earn_difmax_sum = last_earn_sum - earnmain_max
+        last_cost_difmax_sum = last_cost_sum - \
+            lastdf[lastdf['earn_main_noaddouttoken'] == earnmain_max]['cost_main'].to_list()[
+                0]
+        last_dif_earnper = (
+            last_earn_difmax_sum / last_cost_difmax_sum if last_cost_difmax_sum != 0 else -10
+        )
+        return (
+            last_cost_sum,
+            last_earn_sum,
+            last_earnper,
+            last_cost_difmax_sum,
+            last_earn_difmax_sum,
+            last_dif_earnper,
+            last_cost_median,
+            last_cost_mean,
+            # last_earncount_per,
+            last_trans_amount
+        )
+    def pick_random_user_agent(self):
+        user_agents = [
+            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36",
+            "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36",
+            "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36",
+            "Mozilla/5.0 (Macintosh; Intel Mac OS X 12_2_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36",
+            "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36",
+            "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:97.0) Gecko/20100101 Firefox/97.0",
+            "Mozilla/5.0 (X11; Linux i686; rv:97.0) Gecko/20100101 Firefox/97.0",
+            "Mozilla/5.0 (Macintosh; Intel Mac OS X 12.2; rv:97.0) Gecko/20100101 Firefox/97.0",
+            "Mozilla/5.0 (Macintosh; Intel Mac OS X 12_2_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.2 Safari/605.1.15",
+            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36 OPR/83.0.4254.27",
+            "Mozilla/5.0 (Windows NT 10.0; WOW64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36 OPR/83.0.4254.27",
+            "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36 OPR/83.0.4254.27"
+        ]
+        header = {"user-agent": random.choice(user_agents)}
+        return header

+ 12 - 0
src/code/base_library.json

@@ -0,0 +1,12 @@
+{
+    "slottime": {
+        "startslot": [
+            254000000,
+            "2024-03-13T22:32:00Z"
+        ],
+        "endslot": [
+            258330000,
+            "2024-04-04T15:26:00Z"
+        ]
+    }
+}

File diff suppressed because it is too large
+ 149 - 0
src/code/bef_whole_page.html


+ 15 - 0
src/code/get_pageselect_element_solscan.js

@@ -0,0 +1,15 @@
+
+
+function get_pageselect_element() {
+
+    let div_select_page = document.querySelectorAll("div.items-center.justify-end")[0];
+    let button_num_onepage = div_select_page.querySelectorAll('button[type="button"].border-input')[0];
+    let number_onepage = button_num_onepage.innerText.trim();
+    let arr_button_left_right = div_select_page.querySelectorAll("button.inline-flex.items-center.justify-center.whitespace-nowrap");
+    let button_pre_onepage = arr_button_left_right[1];
+    let button_aft_onepage = arr_button_left_right[2];
+    return [div_select_page, button_num_onepage, number_onepage, button_pre_onepage, button_aft_onepage];
+
+}
+let [div_select_page, button_num_onepage, number_onepage, button_pre_onepage, button_aft_onepage] = get_pageselect_element();
+return [div_select_page, button_num_onepage, number_onepage, button_pre_onepage, button_aft_onepage];

+ 137 - 0
src/code/get_swapactivaties.js

@@ -0,0 +1,137 @@
+function sleep(sleepdelay) {
+    return new Promise((resolve, reject) => {
+        setTimeout(() => {
+            resolve(sleepdelay);
+        }, sleepdelay);
+    })
+}
+
+function get_tobody_data(tbody_) {
+    let arr_trs_datares = [];
+    let arr_trs = Array.from(tbody_.querySelectorAll("tr"));
+    for (let idx_tr_ = 0; idx_tr_ < arr_trs.length; idx_tr_++) {
+        let arr_tds_datares = new Array(13);
+        arr_trs_datares.push(arr_tds_datares);
+        let tr_ = arr_trs[idx_tr_];
+        let arr_tds = Array.from(tr_.querySelectorAll("td"));
+        for (let idx_td_ = 0; idx_td_ < arr_tds.length; idx_td_++) {
+            let td_ = arr_tds[idx_td_];
+            if (idx_td_ == 0) {
+                continue
+            }
+            else if (idx_td_ == 1) {
+                let txhash = td_.innerText.trim();
+                arr_tds_datares[0] = txhash;
+            } else if (idx_td_ == 2) {
+                let dateString = td_.innerText.trim();
+
+
+
+                const [dateStr, timeStr] = dateString.split(' ');
+                const [month, day, year] = dateStr.split('-');
+                const [hours, minutes, seconds] = timeStr.split(':');
+
+                const utcDate = new Date(Date.UTC(year, month - 1, day, hours, minutes, seconds));
+
+                // console.log(utcDate.toUTCString());
+                arr_tds_datares[1] = utcDate.toISOString();
+
+                arr_tds_datares[2] = String(utcDate.valueOf() / 1000);
+
+            } else if (idx_td_ == 3) {
+                let action_type = td_.innerText.trim();
+                if (action_type.indexOf('SWAP') != -1) {
+                    action_type = "SWAP";
+                }
+                arr_tds_datares[3] = action_type;
+            } else if (idx_td_ == 4) {
+                let from = td_.innerText.trim();
+                arr_tds_datares[4] = from;
+            } else if (idx_td_ == 5) {
+                let arr_tokenname_amount = td_.innerText.trim().replace(/,/g, '').split('\n');
+                let arr_tokenlink = Array.from(td_.querySelectorAll("a"));
+                let actionout_tokenaddress = arr_tokenlink[0].href.trim().split('/').slice(-1)[0];
+                let actionout_tokenname = arr_tokenname_amount[1];
+                let actionout_tokenamount = arr_tokenname_amount[0];
+
+                let actionin_tokenaddress = arr_tokenlink[1].href.trim().split('/').slice(-1)[0];
+                let actionin_tokenname = arr_tokenname_amount[3];
+                let actionin_tokenamount = arr_tokenname_amount[2];
+
+                arr_tds_datares[5] = actionin_tokenaddress;
+                arr_tds_datares[6] = actionout_tokenaddress;
+                arr_tds_datares[7] = actionin_tokenname;
+                arr_tds_datares[8] = actionout_tokenname;
+                arr_tds_datares[9] = actionin_tokenamount;
+                arr_tds_datares[10] = actionout_tokenamount;
+
+            } else if (idx_td_ == 6) {
+                let router_link = td_.querySelectorAll("a")[0].href.trim().split('/').slice(-1)[0];
+                arr_tds_datares[11] = router_link;
+            }
+            else if (idx_td_ == 7) {
+                // link is pool's address  every pool has every address , we cant know whichi is raydium pool or  juypool so wu use img to config
+                let arr_pool_img = Array.from(td_.querySelectorAll("img"));
+                for (let idx_pool_img = 0; idx_pool_img < arr_pool_img.length; idx_pool_img++) {
+                    arr_pool_img[idx_pool_img] = arr_pool_img[idx_pool_img].src.trim().split('=').slice(-1)[0];
+                }
+                if (arr_pool_img.includes("68747470733a2f2f737461746963732e736f6c7363616e2e696f2f65782d696d672f3637356b5058394d48546a53327a7431716672314e5948757a654c5866514d394832347746535574314d70382e706e67")) {
+                    // inculude raydium img
+                    arr_pool_img = '1';
+                } else {
+                    arr_pool_img = '0';
+                }
+                arr_tds_datares[12] = arr_pool_img;
+
+            }
+        }
+
+    }
+
+    return arr_trs_datares;
+
+}
+
+async function get_swapactivaties() {
+
+
+    let table_, thead_, arr_th_, tbody_;
+
+
+
+    let arr_title = [['txhash', 'date', 'timestamp', 'action', 'from', 'actionin_tokenaddress',
+        'actionout_tokenaddress',
+        'actionin_tokenname',
+        'actionout_tokenname',
+        'actionin_tokenamount',
+        'actionout_tokenamount',
+        'router',
+        'israydium'
+
+    ]]
+
+
+    try {
+
+        table_ = document.querySelector("table.w-full");
+        thead_ = table_.getElementsByTagName('thead')[0];
+        arr_th_ = Array.from(thead_.getElementsByTagName('th'));
+        // // arr_th_length=8 first is ''
+        tbody_ = table_.getElementsByTagName('tbody')[0];
+
+        let arr_trs_datares = get_tobody_data(tbody_);
+        let data_res = [...arr_trs_datares];
+        return data_res;
+    } catch (e) {
+        ;
+    }
+
+
+}
+
+
+
+
+
+let resdata = get_swapactivaties();
+return resdata;

+ 128 - 0
src/code/get_swapactivaties_thead_body_dom.js

@@ -0,0 +1,128 @@
+function sleep(sleepdelay) {
+    return new Promise((resolve, reject) => {
+        setTimeout(() => {
+            resolve(sleepdelay);
+        }, sleepdelay);
+    })
+}
+function get_tobody_data(tbody_) {
+    let arr_trs_datares = [];
+    let arr_trs = Array.from(tbody_.querySelectorAll("tr"));
+    for (let idx_tr_ = 0; idx_tr_ < arr_trs.length; idx_tr_++) {
+        let arr_tds_datares = new Array(13);
+        arr_trs_datares.push(arr_tds_datares);
+        let tr_ = arr_trs[idx_tr_];
+        let arr_tds = Array.from(tr_.querySelectorAll("td"));
+        for (let idx_td_ = 0; idx_td_ < arr_tds.length; idx_td_++) {
+            let td_ = arr_tds[idx_td_];
+            if (idx_td_ == 0) {
+                continue
+            }
+            else if (idx_td_ == 1) {
+                let txhash = td_.innerText.trim();
+                arr_tds_datares[0] = txhash;
+            } else if (idx_td_ == 2) {
+                let date = td_.innerText.trim();
+                arr_tds_datares[1] = date;
+                arr_tds_datares[2] = new Date(date).valueOf();
+
+            } else if (idx_td_ == 3) {
+                let action_type = td_.innerText.trim();
+                if (action_type.indexOf('SWAP') != -1) {
+                    action_type = "SWAP";
+                }
+                arr_tds_datares[3] = action_type;
+            } else if (idx_td_ == 4) {
+                let from = td_.innerText.trim();
+                arr_tds_datares[4] = from;
+            } else if (idx_td_ == 5) {
+                let arr_tokenname_amount = td_.innerText.trim().replace(/,/, '').split('\n');
+                let arr_tokenlink = Array.from(td_.querySelectorAll("a"));
+                let swapin_tokenaddress = arr_tokenlink[0].href.trim().split('/').slice(-1)[0];
+                let swapin_tokenname = arr_tokenname_amount[1];
+                let swapin_tokenamount = arr_tokenname_amount[0];
+                let swapout_tokenaddress = arr_tokenlink[1].href.trim().split('/').slice(-1)[0];
+                let swapout_tokenname = arr_tokenname_amount[3];
+                let swapout_tokenamount = arr_tokenname_amount[2];
+
+                arr_tds_datares[5] = swapin_tokenaddress;
+                arr_tds_datares[6] = swapout_tokenaddress;
+                arr_tds_datares[7] = swapin_tokenname;
+                arr_tds_datares[8] = swapout_tokenname;
+                arr_tds_datares[9] = swapin_tokenamount;
+                arr_tds_datares[10] = swapout_tokenamount;
+
+            } else if (idx_td_ == 6) {
+                let router_link = td_.querySelectorAll("a")[0].href.trim().split('/').slice(-1)[0];
+                arr_tds_datares[11] = router_link;
+            }
+            else if (idx_td_ == 7) {
+                // link is pool's address  every pool has every address , we cant know whichi is raydium pool or  juypool so wu use img to config
+                let arr_pool_img = Array.from(td_.querySelectorAll("img"));
+                for (let idx_pool_img = 0; idx_pool_img < arr_pool_img.length; idx_pool_img++) {
+                    arr_pool_img[idx_pool_img] = arr_pool_img[idx_pool_img].src.trim().split('=').slice(-1)[0];
+                }
+                if (arr_pool_img.includes("68747470733a2f2f737461746963732e736f6c7363616e2e696f2f65782d696d672f3637356b5058394d48546a53327a7431716672314e5948757a654c5866514d394832347746535574314d70382e706e67")) {
+                    // inculude raydium img
+                    arr_pool_img = 1;
+                } else {
+                    arr_pool_img = 0;
+                }
+                arr_tds_datares[12] = arr_pool_img;
+
+            }
+        }
+
+    }
+
+    return arr_trs_datares;
+
+}
+
+async function get_swapactivaties() {
+
+
+    let table_, thead_, arr_th_, tbody_;
+
+
+    let data_res = [];
+    let arr_title = [['txhash', 'date', 'timestamp', 'action', 'from', 'swapin_tokenaddress',
+        'swapout_tokenaddress',
+        'swapin_tokenname',
+        'swapout_tokenname',
+        'swapin_tokenamount',
+        'swapout_tokenamount',
+        'router',
+        'israydium'
+
+    ]]
+
+
+    try {
+        table_ = document.querySelector("table.w-full");
+        thead_ = table_.getElementsByTagName('thead')[0];
+        arr_th_ = Array.from(thead_.getElementsByTagName('th'));
+        tbody_ = table_.getElementsByTagName('tbody')[0];
+
+        let arr_trs_datares = get_tobody_data(tbody_);
+        let res_data = [...arr_trs_datares];
+        return res_data
+
+
+    } catch (e) {
+
+        ;
+    }
+    return
+
+
+
+}
+
+
+
+let res_data = undefined
+
+res_data = get_swapactivaties();
+return res_data;
+

+ 2435 - 0
src/code/nohup.out

@@ -0,0 +1,2435 @@
+
+
+
+
+
+2024-07-10 08:20:16 ENTER  005_dalaotransfer_dropduplicate_solanafm.py ----------------NOTE-----------NOTE---------------
+2024-07-10 08:20:16 arr_str_dalaoaddress 265
+2024-07-10 08:20:16 str_dalao_address= GXnQmvyqP1JXaene5GvcsafHLUPAKjV9wpmFwueCU9oD prelen= 11 aftlen= 11 remainder= 264 
+2024-07-10 08:20:16 str_dalao_address= 45EYZF2H8a6kjX7W4QEkEfrKjVfF1jtBLZWjuRGcukt3 prelen= 31 aftlen= 31 remainder= 263 
+2024-07-10 08:20:16 2024-07-10 08:20:16str_dalao_address= CGh6rrMV4Q4Syv7EAhqsR5i2TePaaNrWUzBQvWgz5gHD prelen= 68 aftlen= 68 remainder= 262 
+2024-07-10 08:20:16 str_dalao_address= Cz3mUHZbfmgEBfEdJECWswS3gQB8nEcZLYArU5PwBn5J prelen= 107 aftlen= 107 remainder= 260 
+2024-07-10 08:20:16  str_dalao_address= 6xbKtRWCH7Gd6yAUXXNK2Rk88tBGk7mdbNNKDc9QJgCE prelen= 120 aftlen= 120 remainder= 261 
+str_dalao_address= FHF8ciYNMxBENLZUSQCopixyKHasDQaPbVfhbUoLmXFb prelen= 136 aftlen= 128 remainder= 259 
+2024-07-10 08:20:16 str_dalao_address= 7zL7mpZQwGTfkAJ4Qn87y7HSDtT95cGEdXVoQMEyuCZX prelen= 104 aftlen= 104 remainder= 258 
+2024-07-10 08:20:16 str_dalao_address= AXyKkVAWmaDxm8jGwHEvM8KusJTbH9zWiZbVevRKvx8g prelen= 47 aftlen= 47 remainder= 257 
+2024-07-10 08:20:16 2024-07-10 08:20:16str_dalao_address= CcxHnvmz6RbhEMFD5WoWSGyc2CxpDQriGAo1a727MPMg prelen= 113 aftlen= 113 remainder= 256 
+ str_dalao_address= F5CsimrUKMdNeRJSvyLoykiVRnjthUWkBkDycUbnmpS6 prelen= 60 aftlen= 60 remainder= 255 
+2024-07-10 08:20:16 str_dalao_address= 69kPqGbtmT51foR3ZMRR48BVRhzcysPh7sLTBf9hSRGD prelen= 195 aftlen= 195 remainder= 254 
+2024-07-10 08:20:16 str_dalao_address= 8J6gYgHQXJp5uB7sveLWLQV9eFPzHQzY6RmYrh2StoZh prelen= 289 aftlen= 289 remainder= 253 
+2024-07-10 08:20:16 str_dalao_address= 4uLcs4jBxbnJEgTeq92oZjFjPzQNBiU9bcQ3Rq1tcL8R prelen= 148 aftlen= 148 remainder= 252 
+2024-07-10 08:20:16 str_dalao_address= 7jw834gPVnHeypTryDzb6Z3YTzhWSx2eSz7Bi6BkL4dz prelen= 284 aftlen= 284 remainder= 251 
+2024-07-10 08:20:16 str_dalao_address= CMu4NHnrJbf47amBwMmFwAxfoSniyxEz77NVoEUEqpkb prelen= 161 aftlen= 161 remainder= 250 
+2024-07-10 08:20:16 str_dalao_address= 9xuAXPdoTzNvqp5iEcN9CPRh23bDUE7tMykRJcdnzAuD prelen= 327 aftlen= 245 remainder= 249 
+2024-07-10 08:20:16 str_dalao_address= 4cdhkfmswFbBqzJptRRKHNWQqZEvTC7bSYTNgFbkCo1v prelen= 283 aftlen= 283 remainder= 248 
+2024-07-10 08:20:16 str_dalao_address= 9qdq5dERP6frhvZgdZ26WvsEXkqDvxYf27uvYu9W66jq prelen= 273 aftlen= 273 remainder= 247 
+2024-07-10 08:20:162024-07-10 08:20:162024-07-10 08:20:16   str_dalao_address= BmhEn4SYAESA1gYH3Txf6DqJgMbtKxHPV7WWdJzEQAvW prelen= 262 aftlen= 262 remainder= 245 
+str_dalao_address= 4qfdzdz19q5kWuo2hNAZyQ7krVM4wFSAEzjK1JrWrMwD prelen= 392 aftlen= 392 remainder= 244 
+2024-07-10 08:20:16 str_dalao_address= DcRAk2KT6pKf631AkdCVC3pe4mdHHrw3NDnEPk8zUWzy prelen= 316 aftlen= 316 remainder= 246 
+str_dalao_address= 9eUw1dqESPQxeFUm1kJh2WSY8mA1CszAREJRxxPjNGrd prelen= 409 aftlen= 409 remainder= 243 
+2024-07-10 08:20:17 2024-07-10 08:20:17 2024-07-10 08:20:17str_dalao_address= GUgfpxERCM6wdBBA77ddWfVKD5spyC4WgC4LRsrBnRXE prelen= 294 aftlen= 294 remainder= 241 
+ str_dalao_address= BD5YyR7f83EgeeWEBFW7mARsE5jxNi1wANRnnSqhoRbs prelen= 211 aftlen= 211 remainder= 242 
+str_dalao_address= EEkVVvKk5Tp6GAjiVpRk5yT34aYekUqZutSDbm733dcF prelen= 443 aftlen= 443 remainder= 240 
+2024-07-10 08:20:17 2024-07-10 08:20:17str_dalao_address= 4T34XEQJLzVXuecTnzqxvm31si8N9YTFbT9QCYb84ey4 prelen= 443 aftlen= 443 remainder= 239 
+ str_dalao_address= CdhzJDWgHEdzbhBUEFEgjvwpCrcXc5zd2h24So9it6Zj prelen= 69 aftlen= 69 remainder= 238 
+2024-07-10 08:20:17 str_dalao_address= 137whNrKQrFeTowL8zkn8sahGM1V4x8d6PVNxS4CebJQ prelen= 140 aftlen= 140 remainder= 237 
+2024-07-10 08:20:172024-07-10 08:20:17 str_dalao_address= 92iS2625agVhUDHhrigjgNKyh6maUE5Gg8Pfw1docGEG prelen= 717 aftlen= 598 remainder= 235 
+ str_dalao_address= C96RaPJwm6jc3yUTA6JrnPRsRTzVHgVkXxFFk3ShZdLm prelen= 197 aftlen= 197 remainder= 236 
+2024-07-10 08:20:17 str_dalao_address= CFR89scCo61vo56F8UQxmLiCmiJyWefEwVAUtq3B5Tic prelen= 453 aftlen= 453 remainder= 234 
+2024-07-10 08:20:17 str_dalao_address= 6ohVbJ7C4pEVCkkHBdHQmpP34knxPgbR1oqd4ybvQ6D8 prelen= 215 aftlen= 214 remainder= 233 
+2024-07-10 08:20:17 str_dalao_address= DHCJpUcyzioMGsELqdonFYNsgQ2Hs94wVB782bgYyjUg prelen= 270 aftlen= 270 remainder= 232 
+2024-07-10 08:20:172024-07-10 08:20:172024-07-10 08:20:17 str_dalao_address= 593NVnzXAveWxC2FVN7TRthZnAqfAwTQsQu3jthuTYog prelen= 251 aftlen= 251 remainder= 229 
+  str_dalao_address= 8xz41Ek2vdsR42WUk5z1mPBTsmTg1crkjbm5Ub9DhbjP prelen= 202 aftlen= 202 remainder= 230 
+str_dalao_address= 8vrwnPPSv12iKjVvEVKQb1fFvRa4DcnotA4RoVgraqRF prelen= 258 aftlen= 258 remainder= 231 
+2024-07-10 08:20:17 2024-07-10 08:20:17str_dalao_address= 7XJs14JR9R4P1epxYZo2v2CMwkkveubVmR8KvMLgHGAb prelen= 240 aftlen= 240 remainder= 228 
+ str_dalao_address= FRahFJMn86ZmtNJeBdoZiMS2LBTeZ3ZU9caBBAzp3g4G prelen= 318 aftlen= 318 remainder= 227 
+2024-07-10 08:20:17 str_dalao_address= 6ANioLqoBiJmefswnXxpAH89CYSjCMYAC6bMYP8rLGX1 prelen= 184 aftlen= 184 remainder= 226 
+2024-07-10 08:20:17 str_dalao_address= BMr77C8exnf9Q1jBMwsV8gbioqqNS3QQCkASH3btnbWx prelen= 427 aftlen= 427 remainder= 225 
+2024-07-10 08:20:17 str_dalao_address= DoJDW76kV4WH5Tiib32D9jyKQKbfhpzF6P4w2yueCwAD prelen= 194 aftlen= 194 remainder= 224 
+2024-07-10 08:20:172024-07-10 08:20:17 str_dalao_address= 8DdhgxW2EUYS2ReTjqEZbn3Lcd8Y98rWb83r1DLRh6eC prelen= 404 aftlen= 404 remainder= 222 
+ 2024-07-10 08:20:17 str_dalao_address= hqHJgH7CiGZmtkGZTJwHw2zhxtKNN7oHPZvy4XTLQd1 prelen= 371 aftlen= 371 remainder= 221 
+2024-07-10 08:20:17 str_dalao_address= 7BwHjUw3i2CRTNZiYGYo32r2wn4wEZF8TTUbSoLvMSSo prelen= 154 aftlen= 151 remainder= 220 
+2024-07-10 08:20:17 str_dalao_address= 6gwyMiXv3tzSF4AT2qUfJCeAHrBj8Y9zqba59yC8ZTVw prelen= 331 aftlen= 331 remainder= 219 
+str_dalao_address= FwoDrTiAWZx4tf9oqwAjYjftq2g267iGRqEvHqdtrWJi prelen= 484 aftlen= 484 remainder= 223 
+2024-07-10 08:20:172024-07-10 08:20:17 str_dalao_address= E379GSqozCknZZQZa5D5j8FrgTDzbeFrJdpjxnM9NS9d prelen= 418 aftlen= 418 remainder= 217 
+ str_dalao_address= DSKLqHEzMcvsSSNG7XobjbtKZV25kFn94ryYTRhRx8Zk prelen= 674 aftlen= 648 remainder= 218 
+2024-07-10 08:20:17 str_dalao_address= FijT78YGmoH3kaziymMYCDhdwA8g7xqdkg254qtkBKik prelen= 526 aftlen= 526 remainder= 216 
+2024-07-10 08:20:17 str_dalao_address= H2FUVtgBtbUzSwYtNmshbo95ajrz11t6weTzpsBrt5Es prelen= 36 aftlen= 36 remainder= 215 
+2024-07-10 08:20:17 str_dalao_address= CrTU5929Vnk4sb7Cyfyo1M63JvzgSpFPm58JSyajDbd8 prelen= 280 aftlen= 280 remainder= 214 
+2024-07-10 08:20:17 str_dalao_address= D5ena4B5y3nZUXQs893qNJqn95Yx3oa8u22fHT1eCapB prelen= 358 aftlen= 358 remainder= 213 
+2024-07-10 08:20:18 str_dalao_address= 3sXtXH4wbWdx4PxRVcPFtFZeHZn8H4BsuGga2mdqbBfo prelen= 58 aftlen= 58 remainder= 212 
+2024-07-10 08:20:182024-07-10 08:20:18 str_dalao_address= 9NZCt4VtnyuZCRtKSd31XoifVmbhERFQXmJ8fi5G6wP4 prelen= 401 aftlen= 401 remainder= 210 
+2024-07-10 08:20:18 str_dalao_address= F29cTM8g7sZ1murE5Eo1iVmpaJcvCQGM4PUEAi3Sp1Uh prelen= 123 aftlen= 123 remainder= 209 
+2024-07-10 08:20:182024-07-10 08:20:18 str_dalao_address= GKEmaVnyEHQggxsRd93wPzTjgDpmUGe3cmR2CQ7YMYMo prelen= 307 aftlen= 307 remainder= 207 
+ str_dalao_address= 58trto1eqFCbBagQKzXf7yihxMYcDvyKf7QPbAqhAxTU prelen= 301 aftlen= 301 remainder= 208 
+ 2024-07-10 08:20:18 str_dalao_address= HJz4XsCQzAbt8JGVTTxBBSFpGivm7XT5VkPZrgD15mfL prelen= 1021 aftlen= 752 remainder= 206 
+str_dalao_address= 7qYo4ecwDqKuanbfCk4wRroETN8juBFmtTdqhugB2QUw prelen= 90 aftlen= 90 remainder= 211 
+2024-07-10 08:20:18 str_dalao_address= CgkrM46UtqgWY8FWTBT8gEGa5ZRLMFkXQuatyRmc3Ct7 prelen= 71 aftlen= 71 remainder= 205 
+2024-07-10 08:20:182024-07-10 08:20:18 str_dalao_address= 56MmFK3tzurx7CYuHtUPDbwzQNWML4Tdqe4D8HWwNstR prelen= 116 aftlen= 116 remainder= 203 
+2024-07-10 08:20:18 str_dalao_address= J5smpruhLFadnin6ZNXvAhD6Q3qmbopedx8jhwxz3Kja prelen= 1241 aftlen= 779 remainder= 202 
+2024-07-10 08:20:18 str_dalao_address= CPsCsVWhkRu8FxFbvpThCYZR2PPvFjuJ78RajGCHAjzN prelen= 276 aftlen= 276 remainder= 201 
+2024-07-10 08:20:18  str_dalao_address= 32cZ3JoDm2r4jyfBgAs6ECKF2GA1v6ogBnuaWwPHCbf5 prelen= 192 aftlen= 192 remainder= 200 
+str_dalao_address= 2bgcMcLK1tREJQCcTHb2CeaBySmeEPM37QYnJTwwikY1 prelen= 178 aftlen= 178 remainder= 204 
+2024-07-10 08:20:18 str_dalao_address= EShhzFptmzfQMDaRSjS2xo1gG5qG6Ai9P3Jpj7eHHyv5 prelen= 461 aftlen= 461 remainder= 199 
+2024-07-10 08:20:18 str_dalao_address= 32s63FJ2snfYnPDC1Xzn3aVwFMBjUk4TtHXjY4KsJi1W prelen= 256 aftlen= 256 remainder= 198 
+2024-07-10 08:20:18 str_dalao_address= 75FU9rhGUtL7pgqmMEQMJp9ouZKHWbroZrgknP5L88SS prelen= 294 aftlen= 294 remainder= 197 
+2024-07-10 08:20:18 str_dalao_address= 9rE5Wp6j9CPu7fVzJ9PsT18Jy5Hdn6MFTPgrBb2x2Aup prelen= 256 aftlen= 256 remainder= 196 
+2024-07-10 08:20:18 2024-07-10 08:20:18 str_dalao_address= DVPZSCD8wqHyaGK3482EiAhqzVNYaBMgdBYtVhLdNyfH prelen= 631 aftlen= 631 remainder= 194 
+str_dalao_address= ZP8hv7BS7GhwtD8KdAxuofEQWoEWyTmZA79eTkeSGh4 prelen= 349 aftlen= 349 remainder= 195 
+2024-07-10 08:20:19 str_dalao_address= sjZ4SB46dfVrx9JsbyU6e2zCRkh5b1tYv84qihLoKky prelen= 437 aftlen= 437 remainder= 193 
+2024-07-10 08:20:19 str_dalao_address= JED9gEbMzhAsKHt65DjrDJ3epWCnoDiZPyn3YhQkqC38 prelen= 301 aftlen= 301 remainder= 192 
+2024-07-10 08:20:19 2024-07-10 08:20:19 str_dalao_address= CKid3aN6yQyF5jVQJteBU7xkWmftCmFvGTPsv7q6g12z prelen= 467 aftlen= 467 remainder= 190 
+str_dalao_address= FvYmth6RSdYYQ4mtEsSTZfUhcGnpHxgbo5kGEBYpbyB6 prelen= 264 aftlen= 264 remainder= 191 
+2024-07-10 08:20:19 str_dalao_address= CvptpjX1NeDLqpPMvkpSmXPHx4kS89KShRB2HxVTtHQW prelen= 438 aftlen= 438 remainder= 189 
+2024-07-10 08:20:19 str_dalao_address= 5erxVsb24bytwNWYv4QCUre3U8UR6QnTSRnTuEP6v4yC prelen= 1430 aftlen= 1177 remainder= 188 
+2024-07-10 08:20:19 str_dalao_address= 9sgh5mkpVhtiU6HzRKPDimYwTRX8eWoRE1isrgHARnbx prelen= 497 aftlen= 497 remainder= 187 
+2024-07-10 08:20:19 str_dalao_address= 7X6DA7mNLsVVN2s3Ez1NZSB93QKrSFDvtU11fH4PYKZT prelen= 852 aftlen= 636 remainder= 186 
+2024-07-10 08:20:19 str_dalao_address= eSb2nzsLA1xG9RkwqNzqyfUrRfHYpZGUBpqiWSqwxDy prelen= 645 aftlen= 645 remainder= 185 
+2024-07-10 08:20:19 str_dalao_address= J1YpUnsC85hUPaA6yJVsTPcVfnBA6Y51iaJ9J3faTBMX prelen= 1004 aftlen= 1004 remainder= 184 
+2024-07-10 08:20:19 str_dalao_address= HhMqYTYyjabHAhGXqgyHspkfTyXoKRsCtpEoQm41reLy prelen= 221 aftlen= 221 remainder= 183 
+2024-07-10 08:20:19 str_dalao_address= BpC3fASsiKT4q4oVnza8tPwjTCKPfqRhDKxc6TKfMXKN prelen= 46 aftlen= 46 remainder= 182 
+2024-07-10 08:20:192024-07-10 08:20:19  str_dalao_address= GFbQeBnjTs7q6DaEsAS7eNZyU3LL1aekaCuXnee5QgRJ prelen= 867 aftlen= 867 remainder= 181 
+str_dalao_address= 3QKha9egjzzeZiPNgwXq5HMRHe1XacDdgEnEABMjnPFS prelen= 32 aftlen= 32 remainder= 180 
+2024-07-10 08:20:192024-07-10 08:20:19  str_dalao_address= 6TyTdn1y5ZtBwktQt2bZihff9gKwmgLMhdBaaf9MXJVf prelen= 60 aftlen= 60 remainder= 179 
+str_dalao_address= EAoA2uFxyxFXXtXGnmj9AUuZM3gZK3nPVeH2hi7oc3B1 prelen= 58 aftlen= 58 remainder= 178 
+2024-07-10 08:20:19 str_dalao_address= CwCDojBiGrEiSnVFfE2yqxVq9eviDDMm2hGHek5okWvp prelen= 32 aftlen= 32 remainder= 177 
+2024-07-10 08:20:19 str_dalao_address= 3TCL9LQrhShkNW1mviWZGZGBEBqohPvSiCxJVFPTznWJ prelen= 3 aftlen= 3 remainder= 176 
+2024-07-10 08:20:19 str_dalao_address= FXvw9QRdZqr268TqwtHMztukgWFLZ96deco8QYKyi9u4 prelen= 3 aftlen= 3 remainder= 175 
+2024-07-10 08:20:19 str_dalao_address= 7vEbaGSKeoYBMFq5guUzEoS43rYbbNQerJp2uhp8UpAh prelen= 4 aftlen= 4 remainder= 174 
+2024-07-10 08:20:192024-07-10 08:20:19 str_dalao_address= 8XX8D8AL7jUoNnG2FQ9aZRPvevMgSUWjWPTkksem9Y9K prelen= 86 aftlen= 86 remainder= 173 
+ str_dalao_address= 4hDN7RAenPmKKHZnDukRgzPDEbJXWTGU7c2Uv5tKSfMT prelen= 122 aftlen= 122 remainder= 172 
+2024-07-10 08:20:19 str_dalao_address= 8JWggJCnVdBJjP83JvTySHQY3Zio7gWZanmnUfhTyF9z prelen= 116 aftlen= 116 remainder= 171 
+2024-07-10 08:20:19 str_dalao_address= 4SxJCWNygttSkjq7JCkkW7QMPMhiYzoVPh153WzSTd9v prelen= 19 aftlen= 19 remainder= 170 
+2024-07-10 08:20:19 str_dalao_address= F9g3TsKoyuPYxZAF8bLvQeM2Vg65Ftw7UNuseigmZ1AB prelen= 955 aftlen= 955 remainder= 169 
+2024-07-10 08:20:19 str_dalao_address= B2Yzz5LqMPZiSMwxba39tVY4ZdYVgYX5rjNvywTG1ZXr prelen= 104 aftlen= 104 remainder= 168 
+2024-07-10 08:20:19 str_dalao_address= DD5X8fzbdM1jhLDRg4J16jASmRgieAJhPUEksVrr1csL prelen= 40 aftlen= 40 remainder= 167 
+2024-07-10 08:20:19 str_dalao_address= vnnmZ4RmrPBcVgRLamtGsZdmj5wRuFY8yvbuS7fm6wU prelen= 437 aftlen= 437 remainder= 166 
+2024-07-10 08:20:20 str_dalao_address= EC2KJEc1mbsmDYYAfLeA1CYS3egFwYw7UmA7s46nLnMB prelen= 269 aftlen= 269 remainder= 165 
+2024-07-10 08:20:20 str_dalao_address= EKCMvweXWRPYFP4Bwa2HPmEtFZDZAJRg8rrPSPJgPsN5 prelen= 174 aftlen= 174 remainder= 164 
+2024-07-10 08:20:20 str_dalao_address= 5bkdTWQhSR7BFY5UL8MQqoifnSonkiH8Av73y8i8aJFJ prelen= 360 aftlen= 346 remainder= 163 
+2024-07-10 08:20:20 str_dalao_address= 67ESR5p8Azt1GbHCuBGxyR1aBXXaPzaa7qfbs5kpExxQ prelen= 279 aftlen= 279 remainder= 162 
+2024-07-10 08:20:20 str_dalao_address= 9zaqKfZg1d7N3tA2sLPMWo7emdu5CYEzKw3xBAwsKGsW prelen= 322 aftlen= 322 remainder= 161 
+2024-07-10 08:20:20 str_dalao_address= 6UJEhkKwoDRVbCcNf3Rs5xhM1EZCsSzEtfw1Hhoon9F9 prelen= 342 aftlen= 342 remainder= 160 
+2024-07-10 08:20:20 str_dalao_address= 5R1KSEz7MkPhioqaSNrLSBBAVsAaMvyyCRp737iCbYSx prelen= 55 aftlen= 55 remainder= 159 
+2024-07-10 08:20:20 str_dalao_address= EepYGi55YNeAhC1YMztweRrzYjvmConx6x8tgriEnaoE prelen= 114 aftlen= 114 remainder= 158 
+2024-07-10 08:20:20 str_dalao_address= 6Fi8koHrFNhUUiicFyAeArKr12uFxDFmFwiUBQ9JZuTw prelen= 222 aftlen= 193 remainder= 157 
+2024-07-10 08:20:20 2024-07-10 08:20:20str_dalao_address= 4KLagbRcs2qaE5SK2srHcf4eENZ1y5jh3imUKXAorCw7 prelen= 296 aftlen= 296 remainder= 156 
+ str_dalao_address= 6BQTsUaU5GEFCKaAbMbCZHzZXBEURDZ9b4KV4c6x3pnA prelen= 441 aftlen= 441 remainder= 155 
+2024-07-10 08:20:20 str_dalao_address= JB1PZMNpXkFgj2kxyA43z8Ry4um5Ap6u7z2gn5EEZr5h prelen= 511 aftlen= 511 remainder= 154 
+2024-07-10 08:20:20 str_dalao_address= 7rhkaHcUorHJSf8kRj2o3nDyhCG9PMEQSg7VGamQ1YSF prelen= 408 aftlen= 408 remainder= 153 
+2024-07-10 08:20:20 str_dalao_address= J7mApWsHQmZ5FtFrBx6UtysPHT7c6p9rgbu7X1pv8Jxe prelen= 788 aftlen= 788 remainder= 152 
+2024-07-10 08:20:20 str_dalao_address= 3R47dpawpKmYnXAczNSWSmACZdgSHkwCGrvkzM1JDSrC prelen= 431 aftlen= 431 remainder= 151 
+2024-07-10 08:20:20 str_dalao_address= 3qoYbTW8dKFDBFv76NdgdFWpo2qFCApzcg9w8AHTDAJ1 prelen= 415 aftlen= 415 remainder= 150 
+2024-07-10 08:20:20 str_dalao_address= ERdq2FHNuemT1AAHoqwWcjbsN7SMhsYt2zwQmUi2hxCq prelen= 311 aftlen= 311 remainder= 149 
+2024-07-10 08:20:20 2024-07-10 08:20:20 str_dalao_address= HnAzCZWjXW7NrPCc8RU4aE7jCbKwaLULKe53RhNe9LW3 prelen= 8 aftlen= 8 remainder= 148 
+str_dalao_address= 3yZqcQyKChk4Tu5FFTbi1CRs48WiVPju7HYs9jE234Uj prelen= 10 aftlen= 10 remainder= 147 
+2024-07-10 08:20:202024-07-10 08:20:20  2024-07-10 08:20:20 str_dalao_address= GN9oaCcbfVLSaF2KFXiXzMezF4fH73kzyA8yMnPQtcUH prelen= 875 aftlen= 875 remainder= 144 
+str_dalao_address= CZLvqmCTVGXn3FvtS8ehWqZQM8LBtNwSkdq9Hwccd6NA prelen= 839 aftlen= 364 remainder= 145 
+2024-07-10 08:20:21 str_dalao_address= 4jttec6ZEwGv5mddTkpFBNDtuNTjDgXEC2etkVDEMwnX prelen= 52 aftlen= 52 remainder= 143 
+2024-07-10 08:20:21 str_dalao_address= 3eY9waL3hBdZmjR231AnAkBc98oomxtqCsSjZbKJtZGf prelen= 147 aftlen= 147 remainder= 142 
+2024-07-10 08:20:21 str_dalao_address= D1m5v4aDLcW6BMJYmhryw4YGTHVgwL77TSUSvnytK5Y2 prelen= 280 aftlen= 280 remainder= 141 
+2024-07-10 08:20:21 str_dalao_address= Df4R1dVZLjFSW9qbPZfFyXZ1whNZrYrNfZ95UvSdYHxw prelen= 436 aftlen= 436 remainder= 140 
+2024-07-10 08:20:21 str_dalao_address= BerYpeK3WMowgPX5p8bNMgP4yRDxDeudmB2VYcWSqpET prelen= 19 aftlen= 19 remainder= 139 
+2024-07-10 08:20:21 str_dalao_address= E6WiYrZPW4CxLMbXmh2eGtSH2gyt4QQP3BVy9r6ufohH prelen= 291 aftlen= 291 remainder= 138 
+2024-07-10 08:20:21 str_dalao_address= 5D22RmLmYmFtFFXF52BnvnWUpUFmhse4RRhSrq3G6yN4 prelen= 122 aftlen= 122 remainder= 137 
+2024-07-10 08:20:21str_dalao_address= HfpdVRhXXmkQnpwhwqFUh6u7axAjLg7AvAnuMcgkV2Hk prelen= 52 aftlen= 52 remainder= 146 
+2024-07-10 08:20:21  str_dalao_address= CXQdGoLo9QnTwC1tr96HcQxZgw4gPrLZo9MpEKvAhXM6 prelen= 142 aftlen= 142 remainder= 136 
+str_dalao_address= HoqPsnhwxoDCHHuvX7W5JyaSXHWZce2xKHJBqA7MHPga prelen= 425 aftlen= 425 remainder= 135 
+2024-07-10 08:20:21 str_dalao_address= FXxvCs21WfrNwTieRJX1tH1WtEZ3QzdJ5siz6wDVpVNk prelen= 115 aftlen= 115 remainder= 134 
+2024-07-10 08:20:21 str_dalao_address= AGseT8871WpBEi6QKLkVUo8VS34M6XnwxhvwCpT435he prelen= 283 aftlen= 283 remainder= 133 
+2024-07-10 08:20:21 str_dalao_address= H4axUbkbRmFDmFnxG1Y1221GPd4qnuct75MBUxdMVTiV prelen= 206 aftlen= 179 remainder= 132 
+2024-07-10 08:20:21 str_dalao_address= DadBSqDuoQHPkaxXP8PHbWvf1fZ2Q1KGwnGM61zj2huC prelen= 31 aftlen= 31 remainder= 131 
+2024-07-10 08:20:212024-07-10 08:20:21 str_dalao_address= 3jMNgPFG4wrfVmGqmBe3URHuuduqU7fTZbJRyedkXFR7 prelen= 38 aftlen= 38 remainder= 130 
+ str_dalao_address= 6CYryfcdE9X2ZxKoysqbZ6ZX9wJ1VzvUEHtLx5fDYXo prelen= 287 aftlen= 287 remainder= 129 
+2024-07-10 08:20:21 str_dalao_address= Fd86iFWiaracVAPLj17dV3GZY9UVgNqEUPKfRkgUTrtN prelen= 154 aftlen= 130 remainder= 128 
+2024-07-10 08:20:21 str_dalao_address= 3W7AKDzLZE3U7k4RPVPviA1qQxvtEppK1rrL57fx2rU1 prelen= 419 aftlen= 419 remainder= 127 
+2024-07-10 08:20:212024-07-10 08:20:21  str_dalao_address= GwGnAhds8SQCx5erQUFAmFJv7ZZKs7J3MBWqeNYWCP96 prelen= 88 aftlen= 88 remainder= 126 
+str_dalao_address= 7LgLC6jp2xkZKJcLz982qASnX5U6p8r1J2x94oNz4vBK prelen= 440 aftlen= 440 remainder= 125 
+2024-07-10 08:20:21 str_dalao_address= 8mrwtqnvAr9ynkknTQsE3aXmkw2Hz2B3LQBsk3nQmrjL prelen= 290 aftlen= 290 remainder= 124 
+2024-07-10 08:20:212024-07-10 08:20:21  str_dalao_address= TSJk4dcfTDoVFfgzDmWM7uvriRkgsC6EYXW6oJJ78vS prelen= 216 aftlen= 216 remainder= 122 
+str_dalao_address= DFjjrhbVMUcVHTFPTQdwVFdEkv3tMXPo1bc5v17xHE9s prelen= 219 aftlen= 219 remainder= 123 
+2024-07-10 08:20:21 str_dalao_address= ZvvjVcHjji945BL7hJzgphVuZ3PEJfVuNwFLHFqYSbE prelen= 400 aftlen= 274 remainder= 121 
+2024-07-10 08:20:21 str_dalao_address= FguX3PEUzdj6oJoidQERwjY1NBxHGbdYyHzknTTL4eQX prelen= 466 aftlen= 466 remainder= 120 
+2024-07-10 08:20:21 str_dalao_address= 8RrRXd4G1jhXhYVtRt3LboDRB3JfGzTzeX2VWQYDKNiQ prelen= 501 aftlen= 501 remainder= 119 
+2024-07-10 08:20:21 str_dalao_address= CRAgP9HtVWkBNtngEy626jprCzK9jhxvagpj1ZyXS59Q prelen= 1272 aftlen= 1264 remainder= 118 
+2024-07-10 08:20:21 str_dalao_address= 4Q6Dg6hqgpkUDaN7jqTFp6QsaumrEs4MLNFrXGkPQ4Uy prelen= 346 aftlen= 346 remainder= 117 
+2024-07-10 08:20:222024-07-10 08:20:22 str_dalao_address= BuhhRuQ5qBdjy61ynYqyuZ7UH5hiAoWeZJGYCVLSGGDZ prelen= 468 aftlen= 468 remainder= 115 
+ str_dalao_address= 44TD7uQrK93iSFwLmWzGaovhZn4Ao4jnqNoNqLkHSYdn prelen= 847 aftlen= 762 remainder= 116 
+2024-07-10 08:20:22 str_dalao_address= Ao8CisnipDZ1Gb4QoZPUgkJdTQvDdoZqjPPgaAmnQrvB prelen= 471 aftlen= 471 remainder= 114 
+2024-07-10 08:20:22 str_dalao_address= HH3poyfaRco4v1UXFzCwTkmpkMQgZKjqHKUD7GWDTF2U prelen= 377 aftlen= 377 remainder= 113 
+2024-07-10 08:20:22 str_dalao_address= 9rBSeNt51zbzSNp94WUuR1k4LJpoiiBzHXRqBRrSzcny prelen= 387 aftlen= 387 remainder= 112 
+2024-07-10 08:20:22 str_dalao_address= 3odfMDcGfEGvM9gsQHxwaqctqEb86ituCpvKaQcgAQ8d prelen= 305 aftlen= 305 remainder= 111 
+2024-07-10 08:20:22 str_dalao_address= 8vXoLvbRw2ZdgyWvK4UNnMR4W5Lc7JKZFAeKPavEh96 prelen= 42 aftlen= 42 remainder= 110 
+2024-07-10 08:20:22 str_dalao_address= FATk52hRHc2na52PaUUbXQegY1EuM92dNXjyFRELf6x4 prelen= 380 aftlen= 380 remainder= 109 
+2024-07-10 08:20:22 str_dalao_address= CciktRE6WvMzaAqTLkwr89ViWhmNc26uzmD83G1cjZBF prelen= 357 aftlen= 357 remainder= 108 
+2024-07-10 08:20:22 str_dalao_address= ErQQ2kqDfEjPTiaakaPuFy79xi38jCc3Knuu7F3xsvy3 prelen= 204 aftlen= 204 remainder= 107 
+2024-07-10 08:20:22 str_dalao_address= 2dCU7Vi7wbH8dHPzTZ6RrcfRLESg5QwENsDJgRRPrQ8K prelen= 417 aftlen= 415 remainder= 106 
+2024-07-10 08:20:22 str_dalao_address= FSrdXhRnstrWZug9F43Uv5zDCcgEJTXYRPixXd6jyGDU prelen= 260 aftlen= 255 remainder= 105 
+2024-07-10 08:20:22 str_dalao_address= AU5tDrTMAsDu76oKjXLNrzH2C14gfki3tfP6G61sqhDT prelen= 1313 aftlen= 698 remainder= 104 
+2024-07-10 08:20:22 str_dalao_address= 3tbqqGHpwy1W3Edb7zY72dL96ENmVt3NsQB2tAr1b1dg prelen= 93 aftlen= 93 remainder= 103 
+2024-07-10 08:20:22 str_dalao_address= 2HBW8AukWxcXaWdNYo1gCTQsKrMguu3DsPRmR3d4teSS prelen= 272 aftlen= 272 remainder= 102 
+2024-07-10 08:20:22 2024-07-10 08:20:22str_dalao_address= 23uMsbsXkEgfFnwebRRJzzMhMPPVRSXJQ9J9hZSssi3m prelen= 204 aftlen= 204 remainder= 101 
+ str_dalao_address= EBXatXH1KXAQdennAp76BrRXGs1UncQosk8gcsBv9nwB prelen= 207 aftlen= 207 remainder= 100 
+2024-07-10 08:20:22 str_dalao_address= 9dyCPdtmWNF242YwCckkRy5RLu1mXtynagkhmDPvrd68 prelen= 371 aftlen= 371 remainder= 99 
+2024-07-10 08:20:22 str_dalao_address= BvQSVGLMq8YaAXJLoeMxpXn9LQVAX9cRbsPrgYpFEKS5 prelen= 1155 aftlen= 1155 remainder= 98 
+2024-07-10 08:20:22 str_dalao_address= D6fBZo7LFRct1JW9iEdf32JAab77Whmt4nbqnmbaxM97 prelen= 309 aftlen= 309 remainder= 97 
+2024-07-10 08:20:22 str_dalao_address= AWZjSsWeSKLTzbttC6qbpinmzvpVYD6vLGMvsCNiTibS prelen= 457 aftlen= 457 remainder= 96 
+2024-07-10 08:20:22 str_dalao_address= 5UyMPxW127T5XVVhz6uP7R6KqQiUCqcDkHDkpXFuHW2w prelen= 871 aftlen= 871 remainder= 95 
+2024-07-10 08:20:24 str_dalao_address= sU3GUBpAYZNrYuhqKdh24iYuFuNnBWQv7oEteNDXAWf prelen= 133 aftlen= 133 remainder= 94 
+2024-07-10 08:20:24 str_dalao_address= CdmQMQKNGAks14f7GY3HxxTRUe6KkXX7xhowxGpkcQn4 prelen= 256 aftlen= 256 remainder= 93 
+2024-07-10 08:20:24 str_dalao_address= 14S4fRuvNACffP5aHs1t7C7AjtyZsckwZuTosQy5UUkE prelen= 92 aftlen= 92 remainder= 92 
+2024-07-10 08:20:24 str_dalao_address= 98mi9itqKwaWdWPFGViAUQ6vZmB9ftphsZcVVCqPsqqT prelen= 117 aftlen= 117 remainder= 91 
+2024-07-10 08:20:242024-07-10 08:20:24 2024-07-10 08:20:242024-07-10 08:20:24 str_dalao_address= 6Eu5ms6QrQK2iRYsJHgXeyiYKawF7yT2N5DBhLjzYyRB prelen= 469 aftlen= 469 remainder= 87 
+  str_dalao_address= EXuVDJNqhWBHAwc2iefG4vW1GgJpejAqUvuRhUw4Nhog prelen= 504 aftlen= 504 remainder= 88 
+str_dalao_address= C9kjSCU9iZq2M89RfZqkuZpPvRXi8nuew3aDq4JzRa4G prelen= 293 aftlen= 292 remainder= 89 
+str_dalao_address= 2zhBbs127EnrkJWyc4U9DMuBxKnWLJfq4Hb8x1eskTfc prelen= 129 aftlen= 129 remainder= 90 
+2024-07-10 08:20:24 str_dalao_address= 5PQLyou4EZqFP4Xn3AiZ6CagJtzRQ1E4VTGC3VTmNHzn prelen= 301 aftlen= 301 remainder= 86 
+2024-07-10 08:20:24 str_dalao_address= B1wojkKqE7qtsXX8JP6PQERgdipJq6xpz8YGsdMsqK6n prelen= 75 aftlen= 75 remainder= 85 
+2024-07-10 08:20:24 str_dalao_address= DVt6AePG23LfTv1VDppnGWWHQXEbpWW97PEJf4UgMAM prelen= 488 aftlen= 417 remainder= 84 
+2024-07-10 08:20:24 str_dalao_address= AShvBnVmKN1Vw1o4gJfPs2CrHuvqyjo6h4Tztri6fCcE prelen= 452 aftlen= 452 remainder= 83 
+2024-07-10 08:20:24 str_dalao_address= GNvEdoh3KHMEJjZdzCRpP2muspSr4X3LRVRSrqiYcguZ prelen= 293 aftlen= 293 remainder= 82 
+2024-07-10 08:20:24 str_dalao_address= 6YncPWzRLER5oE1dDtRUFwxhrR2h1nwWutzHaDP23W3D prelen= 261 aftlen= 261 remainder= 81 
+2024-07-10 08:20:24 2024-07-10 08:20:24str_dalao_address= DhEDyawZ9gZ6iy8Bhk8rq7TNxy2mbv6H8eSNtzk216vr prelen= 111 aftlen= 111 remainder= 80 
+ str_dalao_address= 5anaQFiFY6GqWFaV6PnCjifRXzkvSrMpMz9CMSEi9Ccc prelen= 411 aftlen= 411 remainder= 79 
+2024-07-10 08:20:24 2024-07-10 08:20:24 str_dalao_address= 85kpzQBdyaMy2F3zQomT5ywsUSQLGMku3j9jK24Wne3w prelen= 635 aftlen= 606 remainder= 77 
+str_dalao_address= CRsgNuBuiKvMavq69NCdWu8FvBpS8srWq8RG2rNcSGpP prelen= 411 aftlen= 411 remainder= 78 
+2024-07-10 08:20:24 str_dalao_address= AsQXYJPMnkygPWPgSozm8SvJZqtLSgFy84uYgMaLbfYR prelen= 606 aftlen= 574 remainder= 76 
+2024-07-10 08:20:24 str_dalao_address= 6mKvvWnzXwGq1Ap22uHaK3j1MkUzwgZxLCcgQYN4Rh13 prelen= 260 aftlen= 260 remainder= 75 
+2024-07-10 08:20:24 str_dalao_address= C3dRLTBgYYQG1Q6czSqjmvgmyLL7upTede6pnzQnco3e prelen= 334 aftlen= 334 remainder= 74 
+2024-07-10 08:20:24 str_dalao_address= ApMLsE8WaLJwscY6t8vdwSMVUrnLdfkCv8uuKXJtQqZf prelen= 89 aftlen= 89 remainder= 73 
+2024-07-10 08:20:24 str_dalao_address= EejcWHh2ELTDkxKMmTJQ4VnyyYGdzLo91xMXzZNxAvbG prelen= 112 aftlen= 111 remainder= 72 
+2024-07-10 08:20:25 str_dalao_address= 4Q6rYzUsxVqjc253UX9UCz2EbbHXjgRKLzyjwsukfpPW prelen= 59 aftlen= 59 remainder= 71 
+2024-07-10 08:20:25 str_dalao_address= Fyv7URhz8pzRY3uUoBYNkaMSg6ifimvcFNK8p4gvWhbR prelen= 1020 aftlen= 1020 remainder= 70 
+2024-07-10 08:20:25 str_dalao_address= 7xbpY9oyFKTGqXTikXaEbKhaygX5hJzr6HQYtHKsUUFK prelen= 464 aftlen= 464 remainder= 69 
+2024-07-10 08:20:25 str_dalao_address= 7LZVvquLpGbD4cNS7PXACTRaQCNWcRwQMVMMD6TSw9Pf prelen= 304 aftlen= 304 remainder= 68 
+2024-07-10 08:20:25 str_dalao_address= 8VmbPAXwjXF5u28X6Bt7nSEefuoWrxUP2RSFhqvfuxUF prelen= 321 aftlen= 321 remainder= 67 
+2024-07-10 08:20:25 str_dalao_address= 5eoc5Neh5RFWCAK2SkGGKfCU5f4EXdFQxbNgZGD1fGYT prelen= 548 aftlen= 548 remainder= 66 
+2024-07-10 08:20:25 2024-07-10 08:20:25 str_dalao_address= Hemwik6AWf93dUpRYkkxyjn3WTGUnhsR6MYBvjzcadAN prelen= 476 aftlen= 476 remainder= 65 
+str_dalao_address= HfX41teh3ps5o6TsmZoT7kpFbbpRtKHZHjUeV9Pty7Cx prelen= 289 aftlen= 289 remainder= 64 
+2024-07-10 08:20:25 str_dalao_address= 4KnRuBPSkv6FHGWYsXFPzFX9V359Wcdjqu5nECAnz1xT prelen= 276 aftlen= 276 remainder= 63 
+2024-07-10 08:20:25 str_dalao_address= JCvxcZBr6HkgbjUkgdiKokghimXeyJiFejhgumdDJoHb prelen= 435 aftlen= 435 remainder= 62 
+2024-07-10 08:20:25 str_dalao_address= DTRtPCdKG9PDRMLDtbmnD8Xh9XRseKwpGESAEisqWGn prelen= 187 aftlen= 187 remainder= 61 
+2024-07-10 08:20:25 str_dalao_address= BaVfSvTBg97D57LoJGMUvCAJDiaBhZ1q4XUXNRsMoqDd prelen= 543 aftlen= 543 remainder= 60 
+2024-07-10 08:20:25 2024-07-10 08:20:25 str_dalao_address= DcrLEjXccQD8zpKPspbMVg9pShzQzn1PKZ18Jbn8MxMH prelen= 451 aftlen= 451 remainder= 58 
+2024-07-10 08:20:25 str_dalao_address= FSaanR7cdbcypqhNsjFQTfXy2XNrzvsDDDCXdX2GSCXg prelen= 424 aftlen= 418 remainder= 59 
+str_dalao_address= 2jk8TQjBjABhRpJSm86rWvpxNU9yyWAwiHcKAEeQUiWL prelen= 44 aftlen= 44 remainder= 57 
+2024-07-10 08:20:25 str_dalao_address= 2jzezk7cHATn6zdYw2pmysaqYz9FqkJPv9NTpKwX1hAN prelen= 100 aftlen= 100 remainder= 56 
+2024-07-10 08:20:25 str_dalao_address= CwCPoEr1S5Tpkv8L22iaaiNUHaUjFxALn5FsZUjjsNiS prelen= 129 aftlen= 129 remainder= 55 
+2024-07-10 08:20:25 str_dalao_address= DXCYfW88qKwAiSUayBvLVF3XNaKB8WdGw2h4fF1pYtGz prelen= 153 aftlen= 153 remainder= 54 
+2024-07-10 08:20:25 str_dalao_address= Fk2zvtxbHxiDgdoZGeCwmXG6dN8QyjDFXTvUShopcJHU prelen= 181 aftlen= 181 remainder= 53 
+2024-07-10 08:20:25 str_dalao_address= E8mFb4WhXVVT37C4fp7Vrmefw77PfDyr3N9APuCJCoAc prelen= 330 aftlen= 330 remainder= 52 
+2024-07-10 08:20:25 str_dalao_address= 3zW6odCfkmDFtWGhWc2Kp5SEokfprh2gnqLar1wv1WnB prelen= 1264 aftlen= 1155 remainder= 51 
+2024-07-10 08:20:25 2024-07-10 08:20:25 str_dalao_address= DVRhcUFVRnD2g1WVLm8u2VdTMsHiQwDeELwHE7jSUfnT prelen= 479 aftlen= 479 remainder= 49 
+str_dalao_address= AvMQh4RWW5D592c4mTcpXpfysYwuWwJWacXZYN5wViXt prelen= 330 aftlen= 330 remainder= 50 
+2024-07-10 08:20:26 str_dalao_address= 7mXohCdQMEidWkvh8v2DD21ZeQ8hoiLtR9UgxXWBChgX prelen= 35 aftlen= 35 remainder= 48 
+2024-07-10 08:20:262024-07-10 08:20:26 str_dalao_address= EgiHc8SqjNnAsaqB19c1yss9AnmgYjJmrPgypFVqBozG prelen= 239 aftlen= 225 remainder= 46 
+ str_dalao_address= 4jtyoKwpogYzWiKnL8Yb7rL1jLyN66VL1b22CWCywPVG prelen= 509 aftlen= 345 remainder= 47 
+2024-07-10 08:20:26 str_dalao_address= B76awVT8Zgns3HutwC7R47KqWD7DiUxVh5Syo3riSts prelen= 469 aftlen= 469 remainder= 45 
+2024-07-10 08:20:26 str_dalao_address= 7v1zaVsjxqRFo35DvNLedZjKEG6g8STZW3J9xNKAniqH prelen= 33 aftlen= 33 remainder= 44 
+2024-07-10 08:20:262024-07-10 08:20:26 str_dalao_address= 9zVrCjJGqnXTSehtMY3cc15t6oVeu4CDpSvViZWYZUa prelen= 147 aftlen= 147 remainder= 42 
+ str_dalao_address= 12ZZ6CaU1NTt5GwhDoSJ8XSKpmMQFL4UuvYYv2FoRLD3 prelen= 60 aftlen= 60 remainder= 43 
+2024-07-10 08:20:26 str_dalao_address= 22x8Lthq4yM6AD6VwiYGo78UASpDJCq3KbKs55NeFtnZ prelen= 24 aftlen= 24 remainder= 41 
+2024-07-10 08:20:262024-07-10 08:20:26 str_dalao_address= 6GE854hDBW4dpD873GsfFAB5aiHaRnrULzGVs4MyC53c prelen= 80 aftlen= 80 remainder= 39 
+ 2024-07-10 08:20:26str_dalao_address= DVWfUJav7CzGqGs1NKc8zhJcjMKBtmheUyZC2i6YBCtr prelen= 58 aftlen= 58 remainder= 40 
+ str_dalao_address= DUnugDGiaE2CgEfRfb97uLyKz8YV2knxXXjfPqQfi9ej prelen= 152 aftlen= 152 remainder= 38 
+2024-07-10 08:20:26 str_dalao_address= FeC6eoUA1Y8frBcx1XuZgXerBj5d3CGNwvFVJFpbYEid prelen= 287 aftlen= 287 remainder= 37 
+2024-07-10 08:20:26 str_dalao_address= w1GXiZ458rozCQZTog2x2qrkXKRQjEMWSiSjESx4Q6p prelen= 71 aftlen= 71 remainder= 36 
+2024-07-10 08:20:26 str_dalao_address= GadvcGntfi2iEKQmXNrJudvT9EtNrMp9cR8jdQoWZzQ7 prelen= 281 aftlen= 281 remainder= 35 
+2024-07-10 08:20:26 2024-07-10 08:20:26 str_dalao_address= 2gRf9QYcSNi7RSqpDAwG1VNkrvyqmPgA32dL15xKpzkE prelen= 449 aftlen= 449 remainder= 33 
+str_dalao_address= GVeiGLyHes2LnonvapBxo7FG1aEZsRA4yxbMJLt3vZiB prelen= 409 aftlen= 409 remainder= 34 
+2024-07-10 08:20:26 str_dalao_address= 8od7FZxojvXy7Zp9jwo2mWyshrV9MidREtx6i5wu1pvA prelen= 59 aftlen= 59 remainder= 32 
+2024-07-10 08:20:26 str_dalao_address= 2YsDS3SdNkq3Y4PaxdeYfds5PjLY4gQQMs82oMyYfBL4 prelen= 493 aftlen= 493 remainder= 31 
+2024-07-10 08:20:26 str_dalao_address= DekwpejAnJ4b93wU9kTxSKqdoVHCpoDymWPBww9eeqnm prelen= 278 aftlen= 278 remainder= 30 
+2024-07-10 08:20:26 str_dalao_address= Bkwanva2jqFJqTS1K1LeJooUjYwoZnCGtJfkuVxGFp6w prelen= 1149 aftlen= 516 remainder= 29 
+2024-07-10 08:20:26 str_dalao_address= 8JMreBJW2NgYCUw4q25oAcSUwnJSz5fnNJkU1QeHtieD prelen= 28 aftlen= 28 remainder= 28 
+2024-07-10 08:20:26 str_dalao_address= CJGc1RFrViUV7atc2vksLGvhGJePUkZcDj8gYCdogFGG prelen= 331 aftlen= 331 remainder= 27 
+2024-07-10 08:20:26 str_dalao_address= 2h7s3FpSvc6v2oHke6Uqg191B5fPCeFTmMGnh5oPWhX7 prelen= 122 aftlen= 122 remainder= 26 
+2024-07-10 08:20:26 str_dalao_address= G7S6kqk8bKHTxkBENCPrNnzAtSPxGZrcDwrfcFKGQtrF prelen= 338 aftlen= 338 remainder= 25 
+2024-07-10 08:20:26 str_dalao_address= AZsQxuDkXbmf8Eom4mqmZTWokEG37EpwNKFjFQNsQ3XV prelen= 469 aftlen= 469 remainder= 24 
+2024-07-10 08:20:262024-07-10 08:20:26  2024-07-10 08:20:26 2024-07-10 08:20:26str_dalao_address= HF4qoQHabG5zZsf5hVEWV3pub9Nj94VFRgZVyEQNt2RK prelen= 102 aftlen= 102 remainder= 21 
+ str_dalao_address= 3SWGR9ZmJm7vkfCedQ7ppaLgTeWZivpjKVaXFndt6tb8 prelen= 11 aftlen= 11 remainder= 20 
+str_dalao_address= F5Xsvt6MKs9S78Ggiry7RnGfc3Gm9VMPes8o7w5hMzn7 prelen= 446 aftlen= 446 remainder= 23 
+2024-07-10 08:20:26str_dalao_address= 3WL72gqW4XbzWi5BNNjK6L47DVShU5dYKzGHvHnXQPpu prelen= 262 aftlen= 262 remainder= 22 
+ str_dalao_address= HHTeEVGU3KUjXKkrbteRExFFjCiodJUxXY6amAUjLgUG prelen= 419 aftlen= 419 remainder= 19 
+2024-07-10 08:20:27 str_dalao_address= B83z3CARNkhQNYLMG2xPM3GhZm4kKReTWP7f9CtwLLXH prelen= 54 aftlen= 54 remainder= 18 
+2024-07-10 08:20:27 str_dalao_address= ASCUGaXce4dw8SFbfmk14ct4D17x9TwwhT7vovzJrcMU prelen= 76 aftlen= 76 remainder= 17 
+2024-07-10 08:20:27 str_dalao_address= GXK2nQQLbsThLGctQJJcXNjmcygTg4h6rwptx43r8QZj prelen= 54 aftlen= 54 remainder= 16 
+2024-07-10 08:20:27 str_dalao_address= 9GyS8aajDTSUMcVVzy3W7JeQMUzwvAWjUgL2ZhWWnQa1 prelen= 105 aftlen= 105 remainder= 15 
+2024-07-10 08:20:27 str_dalao_address= HvUjmTd5eDbPwxWzGwMM6UuWh7CJ9TBaAm3pSnBUBFEc prelen= 177 aftlen= 177 remainder= 14 
+2024-07-10 08:20:27 str_dalao_address= 7hsWydxcfTYEyb12EfRwYsbZPnWEVxEdgwcbX3DupNM prelen= 156 aftlen= 156 remainder= 13 
+2024-07-10 08:20:27 str_dalao_address= 8LZPjR1ZLsKiaF758F9vQASDDanFjz6JGfRmUxBnFwYr prelen= 482 aftlen= 482 remainder= 12 
+2024-07-10 08:20:272024-07-10 08:20:27  str_dalao_address= AgeUT38Y48m4ebZBFLhZVWnS8GnPL5NkUYjWsPpfde1a prelen= 351 aftlen= 351 remainder= 11 
+str_dalao_address= 4NAVrr9mEZ7FShN1QaTYtptpNDfJiP1CnKY7ZAaQ33fN prelen= 271 aftlen= 271 remainder= 10 
+2024-07-10 08:20:27 str_dalao_address= Hvts7WUNA9k72kkVt2YP6z1R85U3C637XqfCNoaYSy3W prelen= 1271 aftlen= 1024 remainder= 9 
+2024-07-10 08:20:27 str_dalao_address= 7DXpcXFXquz2duSGdAARjN3iEiHdqySGP4h6KuYHx8fK prelen= 393 aftlen= 393 remainder= 8 
+2024-07-10 08:20:27 str_dalao_address= 7x5FgWwqboGYAms25eGkHCg7bPrusHArwhCy9kBQMy8z prelen= 297 aftlen= 297 remainder= 7 
+2024-07-10 08:20:27 str_dalao_address= 7tE4jyagcP3AcFoL9RDe7V4sV41f9pJnMEQQ7EaTrJZ9 prelen= 432 aftlen= 432 remainder= 6 
+2024-07-10 08:20:27 str_dalao_address= 4Dq9VKSPVYeoSFeHrYBW58Do8Ntxfw7wdkMstVY6XoAj prelen= 483 aftlen= 483 remainder= 5 
+2024-07-10 08:20:27 str_dalao_address= HjojuU5gczPmUWrnsM6GNz9apFtoDsrFdDuoaMAGo4kX prelen= 767 aftlen= 671 remainder= 4 
+2024-07-10 08:20:27 str_dalao_address= BYQKaYipvXyaDhnAbHh9fuWpJUjB3doYpymz1zc9bAJC prelen= 115 aftlen= 115 remainder= 3 
+2024-07-10 08:20:27 str_dalao_address= EaDkM3mgx4rrBnvqZamW1WzWpXUsYcKmrNeNbUvieZcg prelen= 272 aftlen= 272 remainder= 2 
+2024-07-10 08:20:27 str_dalao_address= Cft4hKtC3dVftfqmL2MCALpeCq7oWM7qpftNfVVUzA7h prelen= 497 aftlen= 497 remainder= 1 
+2024-07-10 08:20:27 str_dalao_address= GHsojPSbfyNqbFSLhJajU4GnNRdNAtgjn8BDFKBYNzYL prelen= 1955 aftlen= 1955 remainder= 0 
+2024-07-10 08:20:28 END    005_dalaotransfer_dropduplicate_solanafm.py ----------------NOTE-----------NOTE---------------
+nohup: ignoring input
+2024-07-10 08:20:32 
+
+
+
+
+
+2024-07-10 08:20:32 ENTER  006_get_transaction_st_solanafm.py ----------------NOTE-----------NOTE---------------
+2024-07-10 08:20:322024-07-10 08:20:32  enter 4cdhkfmswFbBqzJptRRKHNWQqZEvTC7bSYTNgFbkCo1v2024-07-10 08:20:32 enter 6xbKtRWCH7Gd6yAUXXNK2Rk88tBGk7mdbNNKDc9QJgCEenter GXnQmvyqP1JXaene5GvcsafHLUPAKjV9wpmFwueCU9oD
+2024-07-10 08:20:32
+
+ enter FijT78YGmoH3kaziymMYCDhdwA8g7xqdkg254qtkBKik2024-07-10 08:20:32
+ enter FHF8ciYNMxBENLZUSQCopixyKHasDQaPbVfhbUoLmXFb
+2024-07-10 08:20:32 2024-07-10 08:20:32 enter Cz3mUHZbfmgEBfEdJECWswS3gQB8nEcZLYArU5PwBn5J
+2024-07-10 08:20:32enter CGh6rrMV4Q4Syv7EAhqsR5i2TePaaNrWUzBQvWgz5gHD
+ 2024-07-10 08:20:32enter 9qdq5dERP6frhvZgdZ26WvsEXkqDvxYf27uvYu9W66jq
+ 2024-07-10 08:20:32 enter 9eUw1dqESPQxeFUm1kJh2WSY8mA1CszAREJRxxPjNGrdenter 7zL7mpZQwGTfkAJ4Qn87y7HSDtT95cGEdXVoQMEyuCZX
+
+2024-07-10 08:20:32 enter 4qfdzdz19q5kWuo2hNAZyQ7krVM4wFSAEzjK1JrWrMwD
+2024-07-10 08:20:322024-07-10 08:20:32 enter 69kPqGbtmT51foR3ZMRR48BVRhzcysPh7sLTBf9hSRGD
+ 2024-07-10 08:20:33GXnQmvyqP1JXaene5GvcsafHLUPAKjV9wpmFwueCU9oD success remainder= 264 
+ enter 7jw834gPVnHeypTryDzb6Z3YTzhWSx2eSz7Bi6BkL4dz
+2024-07-10 08:20:33 2024-07-10 08:20:33enter 92iS2625agVhUDHhrigjgNKyh6maUE5Gg8Pfw1docGEG 
+2024-07-10 08:20:33enter 45EYZF2H8a6kjX7W4QEkEfrKjVfF1jtBLZWjuRGcukt3 2024-07-10 08:20:332024-07-10 08:20:33 enter 8J6gYgHQXJp5uB7sveLWLQV9eFPzHQzY6RmYrh2StoZh
+2024-07-10 08:20:33enter CcxHnvmz6RbhEMFD5WoWSGyc2CxpDQriGAo1a727MPMg enter BD5YyR7f83EgeeWEBFW7mARsE5jxNi1wANRnnSqhoRbs 
+
+2024-07-10 08:20:33 enter EEkVVvKk5Tp6GAjiVpRk5yT34aYekUqZutSDbm733dcF
+2024-07-10 08:20:33 2024-07-10 08:20:33 enter AXyKkVAWmaDxm8jGwHEvM8KusJTbH9zWiZbVevRKvx8genter 9xuAXPdoTzNvqp5iEcN9CPRh23bDUE7tMykRJcdnzAuD
+
+
+enter 4T34XEQJLzVXuecTnzqxvm31si8N9YTFbT9QCYb84ey4
+2024-07-10 08:20:33 enter 4uLcs4jBxbnJEgTeq92oZjFjPzQNBiU9bcQ3Rq1tcL8R2024-07-10 08:20:33 
+2024-07-10 08:20:33 enter FRahFJMn86ZmtNJeBdoZiMS2LBTeZ3ZU9caBBAzp3g4G
+enter CFR89scCo61vo56F8UQxmLiCmiJyWefEwVAUtq3B5Tic
+2024-07-10 08:20:332024-07-10 08:20:33 2024-07-10 08:20:33enter GUgfpxERCM6wdBBA77ddWfVKD5spyC4WgC4LRsrBnRXE  enter F5CsimrUKMdNeRJSvyLoykiVRnjthUWkBkDycUbnmpS6
+enter DcRAk2KT6pKf631AkdCVC3pe4mdHHrw3NDnEPk8zUWzy
+2024-07-10 08:20:33 enter BmhEn4SYAESA1gYH3Txf6DqJgMbtKxHPV7WWdJzEQAvW
+
+2024-07-10 08:20:34 2024-07-10 08:20:34 enter DHCJpUcyzioMGsELqdonFYNsgQ2Hs94wVB782bgYyjUg
+2024-07-10 08:20:34 enter 593NVnzXAveWxC2FVN7TRthZnAqfAwTQsQu3jthuTYog
+enter CMu4NHnrJbf47amBwMmFwAxfoSniyxEz77NVoEUEqpkb
+2024-07-10 08:20:342024-07-10 08:20:34  45EYZF2H8a6kjX7W4QEkEfrKjVfF1jtBLZWjuRGcukt3 success remainder= 263 
+enter 6ohVbJ7C4pEVCkkHBdHQmpP34knxPgbR1oqd4ybvQ6D8
+2024-07-10 08:20:34 2024-07-10 08:20:34enter hqHJgH7CiGZmtkGZTJwHw2zhxtKNN7oHPZvy4XTLQd1 enter FwoDrTiAWZx4tf9oqwAjYjftq2g267iGRqEvHqdtrWJi
+2024-07-10 08:20:34 Cz3mUHZbfmgEBfEdJECWswS3gQB8nEcZLYArU5PwBn5J success remainder= 262 
+
+2024-07-10 08:20:342024-07-10 08:20:35 enter BMr77C8exnf9Q1jBMwsV8gbioqqNS3QQCkASH3btnbWx
+ enter 8vrwnPPSv12iKjVvEVKQb1fFvRa4DcnotA4RoVgraqRF
+2024-07-10 08:20:35 2024-07-10 08:20:35 CGh6rrMV4Q4Syv7EAhqsR5i2TePaaNrWUzBQvWgz5gHD success remainder= 261 
+2024-07-10 08:20:35 enter HJz4XsCQzAbt8JGVTTxBBSFpGivm7XT5VkPZrgD15mfL
+2024-07-10 08:20:35 enter CdhzJDWgHEdzbhBUEFEgjvwpCrcXc5zd2h24So9it6Zjenter C96RaPJwm6jc3yUTA6JrnPRsRTzVHgVkXxFFk3ShZdLm
+2024-07-10 08:20:35 enter 8xz41Ek2vdsR42WUk5z1mPBTsmTg1crkjbm5Ub9DhbjP
+
+2024-07-10 08:20:352024-07-10 08:20:35 4uLcs4jBxbnJEgTeq92oZjFjPzQNBiU9bcQ3Rq1tcL8R success remainder= 260 
+ 2024-07-10 08:20:36enter 8DdhgxW2EUYS2ReTjqEZbn3Lcd8Y98rWb83r1DLRh6eC
+2024-07-10 08:20:36  enter 137whNrKQrFeTowL8zkn8sahGM1V4x8d6PVNxS4CebJQenter 7XJs14JR9R4P1epxYZo2v2CMwkkveubVmR8KvMLgHGAb
+2024-07-10 08:20:36 enter DSKLqHEzMcvsSSNG7XobjbtKZV25kFn94ryYTRhRx8Zk
+2024-07-10 08:20:36 
+2024-07-10 08:20:36enter 6ANioLqoBiJmefswnXxpAH89CYSjCMYAC6bMYP8rLGX1 enter 6gwyMiXv3tzSF4AT2qUfJCeAHrBj8Y9zqba59yC8ZTVw2024-07-10 08:20:36
+
+2024-07-10 08:20:362024-07-10 08:20:36   2024-07-10 08:20:36 AXyKkVAWmaDxm8jGwHEvM8KusJTbH9zWiZbVevRKvx8g success remainder= 259 
+enter JED9gEbMzhAsKHt65DjrDJ3epWCnoDiZPyn3YhQkqC38
+enter J5smpruhLFadnin6ZNXvAhD6Q3qmbopedx8jhwxz3Kja
+enter E379GSqozCknZZQZa5D5j8FrgTDzbeFrJdpjxnM9NS9d2024-07-10 08:20:36 enter DoJDW76kV4WH5Tiib32D9jyKQKbfhpzF6P4w2yueCwAD2024-07-10 08:20:37 
+
+enter 7BwHjUw3i2CRTNZiYGYo32r2wn4wEZF8TTUbSoLvMSSo
+2024-07-10 08:20:37 enter D5ena4B5y3nZUXQs893qNJqn95Yx3oa8u22fHT1eCapB
+2024-07-10 08:20:37 enter GKEmaVnyEHQggxsRd93wPzTjgDpmUGe3cmR2CQ7YMYMo2024-07-10 08:20:37
+ 6xbKtRWCH7Gd6yAUXXNK2Rk88tBGk7mdbNNKDc9QJgCE success remainder= 258 
+2024-07-10 08:20:37 2024-07-10 08:20:37 enter H2FUVtgBtbUzSwYtNmshbo95ajrz11t6weTzpsBrt5Esenter CrTU5929Vnk4sb7Cyfyo1M63JvzgSpFPm58JSyajDbd8
+
+2024-07-10 08:20:38 FHF8ciYNMxBENLZUSQCopixyKHasDQaPbVfhbUoLmXFb success remainder= 257 
+2024-07-10 08:20:382024-07-10 08:20:38 enter 9NZCt4VtnyuZCRtKSd31XoifVmbhERFQXmJ8fi5G6wP4
+2024-07-10 08:20:382024-07-10 08:20:38 enter 3sXtXH4wbWdx4PxRVcPFtFZeHZn8H4BsuGga2mdqbBfo
+ 2024-07-10 08:20:38 2024-07-10 08:20:39enter DVPZSCD8wqHyaGK3482EiAhqzVNYaBMgdBYtVhLdNyfH 
+enter 5erxVsb24bytwNWYv4QCUre3U8UR6QnTSRnTuEP6v4yC enter 58trto1eqFCbBagQKzXf7yihxMYcDvyKf7QPbAqhAxTU2024-07-10 08:20:39 F5CsimrUKMdNeRJSvyLoykiVRnjthUWkBkDycUbnmpS6 success remainder= 256 
+2024-07-10 08:20:39 enter sjZ4SB46dfVrx9JsbyU6e2zCRkh5b1tYv84qihLoKky
+enter ZP8hv7BS7GhwtD8KdAxuofEQWoEWyTmZA79eTkeSGh4
+
+
+2024-07-10 08:20:39 2024-07-10 08:20:39 2024-07-10 08:20:39 enter 7qYo4ecwDqKuanbfCk4wRroETN8juBFmtTdqhugB2QUw7zL7mpZQwGTfkAJ4Qn87y7HSDtT95cGEdXVoQMEyuCZX success remainder= 255 
+
+2024-07-10 08:20:39enter 2bgcMcLK1tREJQCcTHb2CeaBySmeEPM37QYnJTwwikY1 
+enter F9g3TsKoyuPYxZAF8bLvQeM2Vg65Ftw7UNuseigmZ1AB2024-07-10 08:20:40
+2024-07-10 08:20:402024-07-10 08:20:40  enter CgkrM46UtqgWY8FWTBT8gEGa5ZRLMFkXQuatyRmc3Ct72024-07-10 08:20:40
+ CdhzJDWgHEdzbhBUEFEgjvwpCrcXc5zd2h24So9it6Zj success remainder= 253 
+ 2024-07-10 08:20:40 enter CvptpjX1NeDLqpPMvkpSmXPHx4kS89KShRB2HxVTtHQW2024-07-10 08:20:40 enter CPsCsVWhkRu8FxFbvpThCYZR2PPvFjuJ78RajGCHAjzN
+H2FUVtgBtbUzSwYtNmshbo95ajrz11t6weTzpsBrt5Es success remainder= 254 
+
+enter EShhzFptmzfQMDaRSjS2xo1gG5qG6Ai9P3Jpj7eHHyv5
+2024-07-10 08:20:40 enter F29cTM8g7sZ1murE5Eo1iVmpaJcvCQGM4PUEAi3Sp1Uh2024-07-10 08:20:40
+ enter CRAgP9HtVWkBNtngEy626jprCzK9jhxvagpj1ZyXS59Q
+2024-07-10 08:20:41 2024-07-10 08:20:41enter 32s63FJ2snfYnPDC1Xzn3aVwFMBjUk4TtHXjY4KsJi1W enter 32cZ3JoDm2r4jyfBgAs6ECKF2GA1v6ogBnuaWwPHCbf5
+
+2024-07-10 08:20:42 enter 9rE5Wp6j9CPu7fVzJ9PsT18Jy5Hdn6MFTPgrBb2x2Aup
+2024-07-10 08:20:42 enter J1YpUnsC85hUPaA6yJVsTPcVfnBA6Y51iaJ9J3faTBMX2024-07-10 08:20:42
+2024-07-10 08:20:42  CcxHnvmz6RbhEMFD5WoWSGyc2CxpDQriGAo1a727MPMg success remainder= 252 
+enter 56MmFK3tzurx7CYuHtUPDbwzQNWML4Tdqe4D8HWwNstR2024-07-10 08:20:43 enter 7X6DA7mNLsVVN2s3Ez1NZSB93QKrSFDvtU11fH4PYKZT
+2024-07-10 08:20:43 2024-07-10 08:20:43 enter HhMqYTYyjabHAhGXqgyHspkfTyXoKRsCtpEoQm41reLy
+
+2024-07-10 08:20:43 3sXtXH4wbWdx4PxRVcPFtFZeHZn8H4BsuGga2mdqbBfo success remainder= 251 
+enter 75FU9rhGUtL7pgqmMEQMJp9ouZKHWbroZrgknP5L88SS2024-07-10 08:20:43 2024-07-10 08:20:43enter eSb2nzsLA1xG9RkwqNzqyfUrRfHYpZGUBpqiWSqwxDy enter CKid3aN6yQyF5jVQJteBU7xkWmftCmFvGTPsv7q6g12z
+
+
+2024-07-10 08:20:442024-07-10 08:20:44 enter 9sgh5mkpVhtiU6HzRKPDimYwTRX8eWoRE1isrgHARnbx 
+enter GFbQeBnjTs7q6DaEsAS7eNZyU3LL1aekaCuXnee5QgRJ2024-07-10 08:20:44
+ enter FvYmth6RSdYYQ4mtEsSTZfUhcGnpHxgbo5kGEBYpbyB62024-07-10 08:20:442024-07-10 08:20:44
+  enter BpC3fASsiKT4q4oVnza8tPwjTCKPfqRhDKxc6TKfMXKN
+enter EKCMvweXWRPYFP4Bwa2HPmEtFZDZAJRg8rrPSPJgPsN5
+2024-07-10 08:20:44 enter vnnmZ4RmrPBcVgRLamtGsZdmj5wRuFY8yvbuS7fm6wU
+2024-07-10 08:20:45 enter EC2KJEc1mbsmDYYAfLeA1CYS3egFwYw7UmA7s46nLnMB
+2024-07-10 08:20:452024-07-10 08:20:45 enter 5bkdTWQhSR7BFY5UL8MQqoifnSonkiH8Av73y8i8aJFJ
+ 58trto1eqFCbBagQKzXf7yihxMYcDvyKf7QPbAqhAxTU success remainder= 250 
+2024-07-10 08:20:45 2024-07-10 08:20:45 enter 6TyTdn1y5ZtBwktQt2bZihff9gKwmgLMhdBaaf9MXJVf
+2024-07-10 08:20:452024-07-10 08:20:45 CgkrM46UtqgWY8FWTBT8gEGa5ZRLMFkXQuatyRmc3Ct7 success remainder= 249 
+2024-07-10 08:20:45enter 4hDN7RAenPmKKHZnDukRgzPDEbJXWTGU7c2Uv5tKSfMT enter 8JWggJCnVdBJjP83JvTySHQY3Zio7gWZanmnUfhTyF9z
+ enter 67ESR5p8Azt1GbHCuBGxyR1aBXXaPzaa7qfbs5kpExxQ2024-07-10 08:20:46
+
+2024-07-10 08:20:46 enter EAoA2uFxyxFXXtXGnmj9AUuZM3gZK3nPVeH2hi7oc3B1
+2024-07-10 08:20:46 32s63FJ2snfYnPDC1Xzn3aVwFMBjUk4TtHXjY4KsJi1W success remainder= 248 
+2024-07-10 08:20:46 2024-07-10 08:20:46  enter 8XX8D8AL7jUoNnG2FQ9aZRPvevMgSUWjWPTkksem9Y9Kenter 3QKha9egjzzeZiPNgwXq5HMRHe1XacDdgEnEABMjnPFS
+2024-07-10 08:20:46 enter 4KLagbRcs2qaE5SK2srHcf4eENZ1y5jh3imUKXAorCw7
+
+enter CwCDojBiGrEiSnVFfE2yqxVq9eviDDMm2hGHek5okWvp2024-07-10 08:20:46 enter J7mApWsHQmZ5FtFrBx6UtysPHT7c6p9rgbu7X1pv8Jxe
+
+2024-07-10 08:20:46 enter HoqPsnhwxoDCHHuvX7W5JyaSXHWZce2xKHJBqA7MHPga
+2024-07-10 08:20:46 BpC3fASsiKT4q4oVnza8tPwjTCKPfqRhDKxc6TKfMXKN success remainder= 247 
+2024-07-10 08:20:47 2024-07-10 08:20:47 enter FXvw9QRdZqr268TqwtHMztukgWFLZ96deco8QYKyi9u4
+2024-07-10 08:20:472024-07-10 08:20:47enter 3TCL9LQrhShkNW1mviWZGZGBEBqohPvSiCxJVFPTznWJ2024-07-10 08:20:47 7qYo4ecwDqKuanbfCk4wRroETN8juBFmtTdqhugB2QUw success remainder= 246 
+ 2024-07-10 08:20:48
+2024-07-10 08:20:48 CMu4NHnrJbf47amBwMmFwAxfoSniyxEz77NVoEUEqpkb success remainder= 245 
+enter B2Yzz5LqMPZiSMwxba39tVY4ZdYVgYX5rjNvywTG1ZXr2024-07-10 08:20:48 FRahFJMn86ZmtNJeBdoZiMS2LBTeZ3ZU9caBBAzp3g4G success remainder= 244 
+ 
+enter ERdq2FHNuemT1AAHoqwWcjbsN7SMhsYt2zwQmUi2hxCq2024-07-10 08:20:48
+ enter 9zaqKfZg1d7N3tA2sLPMWo7emdu5CYEzKw3xBAwsKGsW
+ 2024-07-10 08:20:482024-07-10 08:20:48 CwCDojBiGrEiSnVFfE2yqxVq9eviDDMm2hGHek5okWvp success remainder= 243 
+2024-07-10 08:20:48enter 7vEbaGSKeoYBMFq5guUzEoS43rYbbNQerJp2uhp8UpAh2024-07-10 08:20:48
+ 2024-07-10 08:20:48 enter 4SxJCWNygttSkjq7JCkkW7QMPMhiYzoVPh153WzSTd9v
+2024-07-10 08:20:48 enter E6WiYrZPW4CxLMbXmh2eGtSH2gyt4QQP3BVy9r6ufohH
+2024-07-10 08:20:48 2024-07-10 08:20:487BwHjUw3i2CRTNZiYGYo32r2wn4wEZF8TTUbSoLvMSSo success remainder= 242 
+2024-07-10 08:20:48 2024-07-10 08:20:49 enter Df4R1dVZLjFSW9qbPZfFyXZ1whNZrYrNfZ95UvSdYHxwenter 6UJEhkKwoDRVbCcNf3Rs5xhM1EZCsSzEtfw1Hhoon9F9
+
+ 2024-07-10 08:20:49 56MmFK3tzurx7CYuHtUPDbwzQNWML4Tdqe4D8HWwNstR success remainder= 239 
+FXvw9QRdZqr268TqwtHMztukgWFLZ96deco8QYKyi9u4 success remainder= 241 
+enter DD5X8fzbdM1jhLDRg4J16jASmRgieAJhPUEksVrr1csL
+ 3TCL9LQrhShkNW1mviWZGZGBEBqohPvSiCxJVFPTznWJ success remainder= 240 
+2024-07-10 08:20:49 enter FguX3PEUzdj6oJoidQERwjY1NBxHGbdYyHzknTTL4eQX
+ 2024-07-10 08:20:49 7vEbaGSKeoYBMFq5guUzEoS43rYbbNQerJp2uhp8UpAh success remainder= 238 
+2024-07-10 08:20:49enter 3R47dpawpKmYnXAczNSWSmACZdgSHkwCGrvkzM1JDSrC
+2024-07-10 08:20:49 enter GN9oaCcbfVLSaF2KFXiXzMezF4fH73kzyA8yMnPQtcUH 2024-07-10 08:20:49
+2024-07-10 08:20:502024-07-10 08:20:50 137whNrKQrFeTowL8zkn8sahGM1V4x8d6PVNxS4CebJQ success remainder= 236 
+ enter 6BQTsUaU5GEFCKaAbMbCZHzZXBEURDZ9b4KV4c6x3pnA
+2024-07-10 08:20:50enter 7rhkaHcUorHJSf8kRj2o3nDyhCG9PMEQSg7VGamQ1YSF2024-07-10 08:20:50
+ 8vrwnPPSv12iKjVvEVKQb1fFvRa4DcnotA4RoVgraqRF success remainder= 237 
+ 2024-07-10 08:20:50  enter 6Fi8koHrFNhUUiicFyAeArKr12uFxDFmFwiUBQ9JZuTwZP8hv7BS7GhwtD8KdAxuofEQWoEWyTmZA79eTkeSGh4 success remainder= 235 
+
+2024-07-10 08:20:50 enter 5R1KSEz7MkPhioqaSNrLSBBAVsAaMvyyCRp737iCbYSx
+enter EepYGi55YNeAhC1YMztweRrzYjvmConx6x8tgriEnaoE
+2024-07-10 08:20:50 enter JB1PZMNpXkFgj2kxyA43z8Ry4um5Ap6u7z2gn5EEZr5h2024-07-10 08:20:51
+2024-07-10 08:20:512024-07-10 08:20:51 enter CZLvqmCTVGXn3FvtS8ehWqZQM8LBtNwSkdq9Hwccd6NA
+2024-07-10 08:20:51 3QKha9egjzzeZiPNgwXq5HMRHe1XacDdgEnEABMjnPFS success remainder= 234 
+2024-07-10 08:20:51 enter 3eY9waL3hBdZmjR231AnAkBc98oomxtqCsSjZbKJtZGf
+ enter D1m5v4aDLcW6BMJYmhryw4YGTHVgwL77TSUSvnytK5Y22024-07-10 08:20:51 2024-07-10 08:20:51enter 3yZqcQyKChk4Tu5FFTbi1CRs48WiVPju7HYs9jE234Uj 
+ 2024-07-10 08:20:512024-07-10 08:20:52enter 3qoYbTW8dKFDBFv76NdgdFWpo2qFCApzcg9w8AHTDAJ1
+
+ enter AGseT8871WpBEi6QKLkVUo8VS34M6XnwxhvwCpT435he
+enter HfpdVRhXXmkQnpwhwqFUh6u7axAjLg7AvAnuMcgkV2Hk2024-07-10 08:20:52
+ 2024-07-10 08:20:52 8J6gYgHQXJp5uB7sveLWLQV9eFPzHQzY6RmYrh2StoZh success remainder= 232 
+2024-07-10 08:20:5269kPqGbtmT51foR3ZMRR48BVRhzcysPh7sLTBf9hSRGD success remainder= 233 
+ 2024-07-10 08:20:52 enter H4axUbkbRmFDmFnxG1Y1221GPd4qnuct75MBUxdMVTiV2024-07-10 08:20:52
+2024-07-10 08:20:52 DD5X8fzbdM1jhLDRg4J16jASmRgieAJhPUEksVrr1csL success remainder= 231 
+2024-07-10 08:20:52 EKCMvweXWRPYFP4Bwa2HPmEtFZDZAJRg8rrPSPJgPsN5 success remainder= 229 
+enter HnAzCZWjXW7NrPCc8RU4aE7jCbKwaLULKe53RhNe9LW3 2024-07-10 08:20:53enter 7LgLC6jp2xkZKJcLz982qASnX5U6p8r1J2x94oNz4vBK 
+enter 4jttec6ZEwGv5mddTkpFBNDtuNTjDgXEC2etkVDEMwnX2024-07-10 08:20:53
+ 2024-07-10 08:20:532024-07-10 08:20:53 EAoA2uFxyxFXXtXGnmj9AUuZM3gZK3nPVeH2hi7oc3B1 success remainder= 228 
+4SxJCWNygttSkjq7JCkkW7QMPMhiYzoVPh153WzSTd9v success remainder= 230 
+2024-07-10 08:20:53  enter 9rBSeNt51zbzSNp94WUuR1k4LJpoiiBzHXRqBRrSzcny
+
+2024-07-10 08:20:53 2024-07-10 08:20:53 enter AU5tDrTMAsDu76oKjXLNrzH2C14gfki3tfP6G61sqhDT 
+enter 6CYryfcdE9X2ZxKoysqbZ6ZX9wJ1VzvUEHtLx5fDYXo
+2024-07-10 08:20:53 2024-07-10 08:20:53 enter 5D22RmLmYmFtFFXF52BnvnWUpUFmhse4RRhSrq3G6yN46TyTdn1y5ZtBwktQt2bZihff9gKwmgLMhdBaaf9MXJVf success remainder= 226 
+
+enter 44TD7uQrK93iSFwLmWzGaovhZn4Ao4jnqNoNqLkHSYdn
+F29cTM8g7sZ1murE5Eo1iVmpaJcvCQGM4PUEAi3Sp1Uh success remainder= 227 
+2024-07-10 08:20:54 enter 8mrwtqnvAr9ynkknTQsE3aXmkw2Hz2B3LQBsk3nQmrjL2024-07-10 08:20:542024-07-10 08:20:54 3yZqcQyKChk4Tu5FFTbi1CRs48WiVPju7HYs9jE234Uj success remainder= 224 
+ 
+2024-07-10 08:20:54BD5YyR7f83EgeeWEBFW7mARsE5jxNi1wANRnnSqhoRbs success remainder= 225 
+ enter Fd86iFWiaracVAPLj17dV3GZY9UVgNqEUPKfRkgUTrtN
+2024-07-10 08:20:54 enter CXQdGoLo9QnTwC1tr96HcQxZgw4gPrLZo9MpEKvAhXM6
+2024-07-10 08:20:552024-07-10 08:20:55 HnAzCZWjXW7NrPCc8RU4aE7jCbKwaLULKe53RhNe9LW3 success remainder= 222 
+2024-07-10 08:20:55  8xz41Ek2vdsR42WUk5z1mPBTsmTg1crkjbm5Ub9DhbjP success remainder= 221 
+7jw834gPVnHeypTryDzb6Z3YTzhWSx2eSz7Bi6BkL4dz success remainder= 223 
+2024-07-10 08:20:55 DoJDW76kV4WH5Tiib32D9jyKQKbfhpzF6P4w2yueCwAD success remainder= 220 
+2024-07-10 08:20:56 2024-07-10 08:20:562024-07-10 08:20:56 enter FXxvCs21WfrNwTieRJX1tH1WtEZ3QzdJ5siz6wDVpVNk
+ enter HH3poyfaRco4v1UXFzCwTkmpkMQgZKjqHKUD7GWDTF2Uenter 3W7AKDzLZE3U7k4RPVPviA1qQxvtEppK1rrL57fx2rU1
+2024-07-10 08:20:56 2024-07-10 08:20:56 
+enter BerYpeK3WMowgPX5p8bNMgP4yRDxDeudmB2VYcWSqpET
+2024-07-10 08:20:56enter ZvvjVcHjji945BL7hJzgphVuZ3PEJfVuNwFLHFqYSbE
+ enter DFjjrhbVMUcVHTFPTQdwVFdEkv3tMXPo1bc5v17xHE9s
+2024-07-10 08:20:57 enter DadBSqDuoQHPkaxXP8PHbWvf1fZ2Q1KGwnGM61zj2huC
+2024-07-10 08:20:57 enter BuhhRuQ5qBdjy61ynYqyuZ7UH5hiAoWeZJGYCVLSGGDZ
+2024-07-10 08:20:572024-07-10 08:20:57  C96RaPJwm6jc3yUTA6JrnPRsRTzVHgVkXxFFk3ShZdLm success remainder= 219 
+enter TSJk4dcfTDoVFfgzDmWM7uvriRkgsC6EYXW6oJJ78vS2024-07-10 08:20:57 2024-07-10 08:20:57 enter 3jMNgPFG4wrfVmGqmBe3URHuuduqU7fTZbJRyedkXFR7
+B2Yzz5LqMPZiSMwxba39tVY4ZdYVgYX5rjNvywTG1ZXr success remainder= 218 
+
+2024-07-10 08:20:58 HfpdVRhXXmkQnpwhwqFUh6u7axAjLg7AvAnuMcgkV2Hk success remainder= 217 
+2024-07-10 08:20:582024-07-10 08:20:58  2024-07-10 08:20:58 enter Ao8CisnipDZ1Gb4QoZPUgkJdTQvDdoZqjPPgaAmnQrvB
+enter 4Q6Dg6hqgpkUDaN7jqTFp6QsaumrEs4MLNFrXGkPQ4Uy
+2024-07-10 08:20:58 enter GwGnAhds8SQCx5erQUFAmFJv7ZZKs7J3MBWqeNYWCP96
+8XX8D8AL7jUoNnG2FQ9aZRPvevMgSUWjWPTkksem9Y9K success remainder= 216 
+2024-07-10 08:20:58 enter 8RrRXd4G1jhXhYVtRt3LboDRB3JfGzTzeX2VWQYDKNiQ
+2024-07-10 08:20:58 enter BvQSVGLMq8YaAXJLoeMxpXn9LQVAX9cRbsPrgYpFEKS5
+2024-07-10 08:20:582024-07-10 08:20:582024-07-10 08:20:58 enter 3odfMDcGfEGvM9gsQHxwaqctqEb86ituCpvKaQcgAQ8d enter CciktRE6WvMzaAqTLkwr89ViWhmNc26uzmD83G1cjZBF DcRAk2KT6pKf631AkdCVC3pe4mdHHrw3NDnEPk8zUWzy success remainder= 215 
+
+
+2024-07-10 08:20:58 CvptpjX1NeDLqpPMvkpSmXPHx4kS89KShRB2HxVTtHQW success remainder= 214 
+2024-07-10 08:20:59 6ANioLqoBiJmefswnXxpAH89CYSjCMYAC6bMYP8rLGX1 success remainder= 213 
+2024-07-10 08:20:59 2024-07-10 08:20:59 2024-07-10 08:20:59enter FATk52hRHc2na52PaUUbXQegY1EuM92dNXjyFRELf6x4enter 2dCU7Vi7wbH8dHPzTZ6RrcfRLESg5QwENsDJgRRPrQ8K
+ 2024-07-10 08:20:59 2024-07-10 08:20:59 BerYpeK3WMowgPX5p8bNMgP4yRDxDeudmB2VYcWSqpET success remainder= 211 
+2024-07-10 08:20:59
+ enter 2HBW8AukWxcXaWdNYo1gCTQsKrMguu3DsPRmR3d4teSS
+enter FSrdXhRnstrWZug9F43Uv5zDCcgEJTXYRPixXd6jyGDU
+2024-07-10 08:20:59 enter 9dyCPdtmWNF242YwCckkRy5RLu1mXtynagkhmDPvrd682024-07-10 08:20:59 
+5R1KSEz7MkPhioqaSNrLSBBAVsAaMvyyCRp737iCbYSx success remainder= 212 
+2024-07-10 08:20:59enter EBXatXH1KXAQdennAp76BrRXGs1UncQosk8gcsBv9nwB2024-07-10 08:20:59
+ 2024-07-10 08:20:59enter ErQQ2kqDfEjPTiaakaPuFy79xi38jCc3Knuu7F3xsvy3 enter 3tbqqGHpwy1W3Edb7zY72dL96ENmVt3NsQB2tAr1b1dg2024-07-10 08:20:59 
+ enter 8vXoLvbRw2ZdgyWvK4UNnMR4W5Lc7JKZFAeKPavEh96
+enter 5UyMPxW127T5XVVhz6uP7R6KqQiUCqcDkHDkpXFuHW2w
+
+2024-07-10 08:21:00 enter 23uMsbsXkEgfFnwebRRJzzMhMPPVRSXJQ9J9hZSssi3m
+2024-07-10 08:21:00 enter AWZjSsWeSKLTzbttC6qbpinmzvpVYD6vLGMvsCNiTibS2024-07-10 08:21:00 9rE5Wp6j9CPu7fVzJ9PsT18Jy5Hdn6MFTPgrBb2x2Aup success remainder= 210 
+
+2024-07-10 08:21:00 4jttec6ZEwGv5mddTkpFBNDtuNTjDgXEC2etkVDEMwnX success remainder= 209 
+2024-07-10 08:21:01 enter D6fBZo7LFRct1JW9iEdf32JAab77Whmt4nbqnmbaxM97
+2024-07-10 08:21:01 DadBSqDuoQHPkaxXP8PHbWvf1fZ2Q1KGwnGM61zj2huC success remainder= 208 
+2024-07-10 08:21:01 4hDN7RAenPmKKHZnDukRgzPDEbJXWTGU7c2Uv5tKSfMT success remainder= 207 
+2024-07-10 08:21:02 2024-07-10 08:21:022024-07-10 08:21:02 8JWggJCnVdBJjP83JvTySHQY3Zio7gWZanmnUfhTyF9z success remainder= 204 
+ 2024-07-10 08:21:02DHCJpUcyzioMGsELqdonFYNsgQ2Hs94wVB782bgYyjUg success remainder= 206 
+ 9qdq5dERP6frhvZgdZ26WvsEXkqDvxYf27uvYu9W66jq success remainder= 203 
+3jMNgPFG4wrfVmGqmBe3URHuuduqU7fTZbJRyedkXFR7 success remainder= 205 
+2024-07-10 08:21:03 7XJs14JR9R4P1epxYZo2v2CMwkkveubVmR8KvMLgHGAb success remainder= 202 
+2024-07-10 08:21:042024-07-10 08:21:04 2024-07-10 08:21:04 BmhEn4SYAESA1gYH3Txf6DqJgMbtKxHPV7WWdJzEQAvW success remainder= 201 
+ 9xuAXPdoTzNvqp5iEcN9CPRh23bDUE7tMykRJcdnzAuD success remainder= 200 
+6ohVbJ7C4pEVCkkHBdHQmpP34knxPgbR1oqd4ybvQ6D8 success remainder= 199 
+2024-07-10 08:21:05 32cZ3JoDm2r4jyfBgAs6ECKF2GA1v6ogBnuaWwPHCbf5 success remainder= 198 
+2024-07-10 08:21:05 HhMqYTYyjabHAhGXqgyHspkfTyXoKRsCtpEoQm41reLy success remainder= 197 
+2024-07-10 08:21:062024-07-10 08:21:06  4cdhkfmswFbBqzJptRRKHNWQqZEvTC7bSYTNgFbkCo1v success remainder= 196 
+GwGnAhds8SQCx5erQUFAmFJv7ZZKs7J3MBWqeNYWCP96 success remainder= 195 
+2024-07-10 08:21:062024-07-10 08:21:06 3tbqqGHpwy1W3Edb7zY72dL96ENmVt3NsQB2tAr1b1dg success remainder= 193 
+ CPsCsVWhkRu8FxFbvpThCYZR2PPvFjuJ78RajGCHAjzN success remainder= 194 
+2024-07-10 08:21:06 8vXoLvbRw2ZdgyWvK4UNnMR4W5Lc7JKZFAeKPavEh96 success remainder= 192 
+2024-07-10 08:21:06 EepYGi55YNeAhC1YMztweRrzYjvmConx6x8tgriEnaoE success remainder= 191 
+2024-07-10 08:21:06 2bgcMcLK1tREJQCcTHb2CeaBySmeEPM37QYnJTwwikY1 success remainder= 190 
+2024-07-10 08:21:06 75FU9rhGUtL7pgqmMEQMJp9ouZKHWbroZrgknP5L88SS success remainder= 189 
+2024-07-10 08:21:07 2024-07-10 08:21:07 BMr77C8exnf9Q1jBMwsV8gbioqqNS3QQCkASH3btnbWx success remainder= 188 
+EC2KJEc1mbsmDYYAfLeA1CYS3egFwYw7UmA7s46nLnMB success remainder= 187 
+2024-07-10 08:21:07 CrTU5929Vnk4sb7Cyfyo1M63JvzgSpFPm58JSyajDbd8 success remainder= 186 
+2024-07-10 08:21:07 9NZCt4VtnyuZCRtKSd31XoifVmbhERFQXmJ8fi5G6wP4 success remainder= 185 
+2024-07-10 08:21:07 5D22RmLmYmFtFFXF52BnvnWUpUFmhse4RRhSrq3G6yN4 success remainder= 184 
+2024-07-10 08:21:07 EShhzFptmzfQMDaRSjS2xo1gG5qG6Ai9P3Jpj7eHHyv5 success remainder= 183 
+2024-07-10 08:21:07 FXxvCs21WfrNwTieRJX1tH1WtEZ3QzdJ5siz6wDVpVNk success remainder= 182 
+2024-07-10 08:21:072024-07-10 08:21:07 GUgfpxERCM6wdBBA77ddWfVKD5spyC4WgC4LRsrBnRXE success remainder= 181 
+ sjZ4SB46dfVrx9JsbyU6e2zCRkh5b1tYv84qihLoKky success remainder= 180 
+2024-07-10 08:21:07 FijT78YGmoH3kaziymMYCDhdwA8g7xqdkg254qtkBKik success remainder= 179 
+2024-07-10 08:21:07 8DdhgxW2EUYS2ReTjqEZbn3Lcd8Y98rWb83r1DLRh6eC success remainder= 178 
+2024-07-10 08:21:07 2024-07-10 08:21:07H4axUbkbRmFDmFnxG1Y1221GPd4qnuct75MBUxdMVTiV success remainder= 177 
+ 9zaqKfZg1d7N3tA2sLPMWo7emdu5CYEzKw3xBAwsKGsW success remainder= 176 
+2024-07-10 08:21:07 593NVnzXAveWxC2FVN7TRthZnAqfAwTQsQu3jthuTYog success remainder= 175 
+2024-07-10 08:21:072024-07-10 08:21:07 vnnmZ4RmrPBcVgRLamtGsZdmj5wRuFY8yvbuS7fm6wU success remainder= 173 
+2024-07-10 08:21:07 3eY9waL3hBdZmjR231AnAkBc98oomxtqCsSjZbKJtZGf success remainder= 172 
+ CXQdGoLo9QnTwC1tr96HcQxZgw4gPrLZo9MpEKvAhXM6 success remainder= 174 
+2024-07-10 08:21:07 E6WiYrZPW4CxLMbXmh2eGtSH2gyt4QQP3BVy9r6ufohH success remainder= 171 
+2024-07-10 08:21:07 23uMsbsXkEgfFnwebRRJzzMhMPPVRSXJQ9J9hZSssi3m success remainder= 170 
+2024-07-10 08:21:07 4qfdzdz19q5kWuo2hNAZyQ7krVM4wFSAEzjK1JrWrMwD success remainder= 169 
+2024-07-10 08:21:08 Fd86iFWiaracVAPLj17dV3GZY9UVgNqEUPKfRkgUTrtN success remainder= 168 
+2024-07-10 08:21:08 9eUw1dqESPQxeFUm1kJh2WSY8mA1CszAREJRxxPjNGrd success remainder= 167 
+2024-07-10 08:21:08 2024-07-10 08:21:08JED9gEbMzhAsKHt65DjrDJ3epWCnoDiZPyn3YhQkqC38 success remainder= 166 
+ DVPZSCD8wqHyaGK3482EiAhqzVNYaBMgdBYtVhLdNyfH success remainder= 165 
+2024-07-10 08:21:082024-07-10 08:21:08 4T34XEQJLzVXuecTnzqxvm31si8N9YTFbT9QCYb84ey4 success remainder= 163 
+ 2024-07-10 08:21:08 AGseT8871WpBEi6QKLkVUo8VS34M6XnwxhvwCpT435he success remainder= 162 
+6UJEhkKwoDRVbCcNf3Rs5xhM1EZCsSzEtfw1Hhoon9F9 success remainder= 164 
+2024-07-10 08:21:08 2024-07-10 08:21:08 3qoYbTW8dKFDBFv76NdgdFWpo2qFCApzcg9w8AHTDAJ1 success remainder= 160 
+EEkVVvKk5Tp6GAjiVpRk5yT34aYekUqZutSDbm733dcF success remainder= 161 
+2024-07-10 08:21:08 2024-07-10 08:21:08 ERdq2FHNuemT1AAHoqwWcjbsN7SMhsYt2zwQmUi2hxCq success remainder= 158 
+ZvvjVcHjji945BL7hJzgphVuZ3PEJfVuNwFLHFqYSbE success remainder= 159 
+2024-07-10 08:21:08 4KLagbRcs2qaE5SK2srHcf4eENZ1y5jh3imUKXAorCw7 success remainder= 157 
+2024-07-10 08:21:08 FvYmth6RSdYYQ4mtEsSTZfUhcGnpHxgbo5kGEBYpbyB6 success remainder= 156 
+2024-07-10 08:21:08 Df4R1dVZLjFSW9qbPZfFyXZ1whNZrYrNfZ95UvSdYHxw success remainder= 155 
+2024-07-10 08:21:08 6BQTsUaU5GEFCKaAbMbCZHzZXBEURDZ9b4KV4c6x3pnA success remainder= 154 
+2024-07-10 08:21:08 6gwyMiXv3tzSF4AT2qUfJCeAHrBj8Y9zqba59yC8ZTVw success remainder= 153 
+2024-07-10 08:21:08 ErQQ2kqDfEjPTiaakaPuFy79xi38jCc3Knuu7F3xsvy3 success remainder= 152 
+2024-07-10 08:21:08 6Fi8koHrFNhUUiicFyAeArKr12uFxDFmFwiUBQ9JZuTw success remainder= 151 
+2024-07-10 08:21:08 2024-07-10 08:21:08E379GSqozCknZZQZa5D5j8FrgTDzbeFrJdpjxnM9NS9d success remainder= 150 
+ EBXatXH1KXAQdennAp76BrRXGs1UncQosk8gcsBv9nwB success remainder= 149 
+2024-07-10 08:21:082024-07-10 08:21:08  2024-07-10 08:21:08FATk52hRHc2na52PaUUbXQegY1EuM92dNXjyFRELf6x4 success remainder= 148 
+8mrwtqnvAr9ynkknTQsE3aXmkw2Hz2B3LQBsk3nQmrjL success remainder= 147 
+ DFjjrhbVMUcVHTFPTQdwVFdEkv3tMXPo1bc5v17xHE9s success remainder= 146 
+2024-07-10 08:21:08 FwoDrTiAWZx4tf9oqwAjYjftq2g267iGRqEvHqdtrWJi success remainder= 145 
+2024-07-10 08:21:08 TSJk4dcfTDoVFfgzDmWM7uvriRkgsC6EYXW6oJJ78vS success remainder= 144 
+2024-07-10 08:21:08 HoqPsnhwxoDCHHuvX7W5JyaSXHWZce2xKHJBqA7MHPga success remainder= 143 
+2024-07-10 08:21:09 8RrRXd4G1jhXhYVtRt3LboDRB3JfGzTzeX2VWQYDKNiQ success remainder= 142 
+2024-07-10 08:21:09 CFR89scCo61vo56F8UQxmLiCmiJyWefEwVAUtq3B5Tic success remainder= 141 
+2024-07-10 08:21:09 2024-07-10 08:21:09 9dyCPdtmWNF242YwCckkRy5RLu1mXtynagkhmDPvrd68 success remainder= 140 
+2024-07-10 08:21:09GKEmaVnyEHQggxsRd93wPzTjgDpmUGe3cmR2CQ7YMYMo success remainder= 139 
+ 6CYryfcdE9X2ZxKoysqbZ6ZX9wJ1VzvUEHtLx5fDYXo success remainder= 138 
+2024-07-10 08:21:09 CKid3aN6yQyF5jVQJteBU7xkWmftCmFvGTPsv7q6g12z success remainder= 137 
+2024-07-10 08:21:09 2024-07-10 08:21:09AWZjSsWeSKLTzbttC6qbpinmzvpVYD6vLGMvsCNiTibS success remainder= 136 
+ 67ESR5p8Azt1GbHCuBGxyR1aBXXaPzaa7qfbs5kpExxQ success remainder= 135 
+2024-07-10 08:21:09 hqHJgH7CiGZmtkGZTJwHw2zhxtKNN7oHPZvy4XTLQd1 success remainder= 134 
+2024-07-10 08:21:09 D5ena4B5y3nZUXQs893qNJqn95Yx3oa8u22fHT1eCapB success remainder= 133 
+2024-07-10 08:21:09 5bkdTWQhSR7BFY5UL8MQqoifnSonkiH8Av73y8i8aJFJ success remainder= 132 
+2024-07-10 08:21:09 2024-07-10 08:21:09 D1m5v4aDLcW6BMJYmhryw4YGTHVgwL77TSUSvnytK5Y2 success remainder= 130 
+CZLvqmCTVGXn3FvtS8ehWqZQM8LBtNwSkdq9Hwccd6NA success remainder= 131 
+2024-07-10 08:21:09 FSrdXhRnstrWZug9F43Uv5zDCcgEJTXYRPixXd6jyGDU success remainder= 129 
+2024-07-10 08:21:09 BuhhRuQ5qBdjy61ynYqyuZ7UH5hiAoWeZJGYCVLSGGDZ success remainder= 128 
+2024-07-10 08:21:09 3W7AKDzLZE3U7k4RPVPviA1qQxvtEppK1rrL57fx2rU1 success remainder= 127 
+2024-07-10 08:21:09 JB1PZMNpXkFgj2kxyA43z8Ry4um5Ap6u7z2gn5EEZr5h success remainder= 126 
+2024-07-10 08:21:09 3R47dpawpKmYnXAczNSWSmACZdgSHkwCGrvkzM1JDSrC success remainder= 125 
+2024-07-10 08:21:09 DSKLqHEzMcvsSSNG7XobjbtKZV25kFn94ryYTRhRx8Zk success remainder= 124 
+2024-07-10 08:21:09 2024-07-10 08:21:092024-07-10 08:21:09 3odfMDcGfEGvM9gsQHxwaqctqEb86ituCpvKaQcgAQ8d success remainder= 121 
+ 2HBW8AukWxcXaWdNYo1gCTQsKrMguu3DsPRmR3d4teSS success remainder= 123 
+7rhkaHcUorHJSf8kRj2o3nDyhCG9PMEQSg7VGamQ1YSF success remainder= 122 
+2024-07-10 08:21:09 D6fBZo7LFRct1JW9iEdf32JAab77Whmt4nbqnmbaxM97 success remainder= 120 
+2024-07-10 08:21:09 92iS2625agVhUDHhrigjgNKyh6maUE5Gg8Pfw1docGEG success remainder= 119 
+2024-07-10 08:21:09 FguX3PEUzdj6oJoidQERwjY1NBxHGbdYyHzknTTL4eQX success remainder= 118 
+2024-07-10 08:21:09 CciktRE6WvMzaAqTLkwr89ViWhmNc26uzmD83G1cjZBF success remainder= 117 
+2024-07-10 08:21:09 9rBSeNt51zbzSNp94WUuR1k4LJpoiiBzHXRqBRrSzcny success remainder= 116 
+2024-07-10 08:21:09 7LgLC6jp2xkZKJcLz982qASnX5U6p8r1J2x94oNz4vBK success remainder= 115 
+2024-07-10 08:21:09 9sgh5mkpVhtiU6HzRKPDimYwTRX8eWoRE1isrgHARnbx success remainder= 114 
+2024-07-10 08:21:09 2024-07-10 08:21:09 2dCU7Vi7wbH8dHPzTZ6RrcfRLESg5QwENsDJgRRPrQ8K success remainder= 113 
+J7mApWsHQmZ5FtFrBx6UtysPHT7c6p9rgbu7X1pv8Jxe success remainder= 112 
+2024-07-10 08:21:09 4Q6Dg6hqgpkUDaN7jqTFp6QsaumrEs4MLNFrXGkPQ4Uy success remainder= 111 
+2024-07-10 08:21:09 HH3poyfaRco4v1UXFzCwTkmpkMQgZKjqHKUD7GWDTF2U success remainder= 110 
+2024-07-10 08:21:09 J1YpUnsC85hUPaA6yJVsTPcVfnBA6Y51iaJ9J3faTBMX success remainder= 109 
+2024-07-10 08:21:09 Ao8CisnipDZ1Gb4QoZPUgkJdTQvDdoZqjPPgaAmnQrvB success remainder= 108 
+2024-07-10 08:21:09 GFbQeBnjTs7q6DaEsAS7eNZyU3LL1aekaCuXnee5QgRJ success remainder= 107 
+2024-07-10 08:21:10 44TD7uQrK93iSFwLmWzGaovhZn4Ao4jnqNoNqLkHSYdn success remainder= 106 
+2024-07-10 08:21:10 GN9oaCcbfVLSaF2KFXiXzMezF4fH73kzyA8yMnPQtcUH success remainder= 105 
+2024-07-10 08:21:10 7X6DA7mNLsVVN2s3Ez1NZSB93QKrSFDvtU11fH4PYKZT success remainder= 104 
+2024-07-10 08:21:10 5UyMPxW127T5XVVhz6uP7R6KqQiUCqcDkHDkpXFuHW2w success remainder= 103 
+2024-07-10 08:21:10 eSb2nzsLA1xG9RkwqNzqyfUrRfHYpZGUBpqiWSqwxDy success remainder= 102 
+2024-07-10 08:21:10 J5smpruhLFadnin6ZNXvAhD6Q3qmbopedx8jhwxz3Kja success remainder= 101 
+2024-07-10 08:21:10 HJz4XsCQzAbt8JGVTTxBBSFpGivm7XT5VkPZrgD15mfL success remainder= 100 
+2024-07-10 08:21:10 AU5tDrTMAsDu76oKjXLNrzH2C14gfki3tfP6G61sqhDT success remainder= 99 
+2024-07-10 08:21:10 F9g3TsKoyuPYxZAF8bLvQeM2Vg65Ftw7UNuseigmZ1AB success remainder= 98 
+2024-07-10 08:21:10 BvQSVGLMq8YaAXJLoeMxpXn9LQVAX9cRbsPrgYpFEKS5 success remainder= 97 
+2024-07-10 08:21:10 5erxVsb24bytwNWYv4QCUre3U8UR6QnTSRnTuEP6v4yC success remainder= 96 
+2024-07-10 08:21:10 CRAgP9HtVWkBNtngEy626jprCzK9jhxvagpj1ZyXS59Q success remainder= 95 
+2024-07-10 08:21:112024-07-10 08:21:112024-07-10 08:21:11  enter CdmQMQKNGAks14f7GY3HxxTRUe6KkXX7xhowxGpkcQn4enter 85kpzQBdyaMy2F3zQomT5ywsUSQLGMku3j9jK24Wne3w 
+enter 6Eu5ms6QrQK2iRYsJHgXeyiYKawF7yT2N5DBhLjzYyRB2024-07-10 08:21:11
+
+ enter AsQXYJPMnkygPWPgSozm8SvJZqtLSgFy84uYgMaLbfYR2024-07-10 08:21:11 
+enter 6mKvvWnzXwGq1Ap22uHaK3j1MkUzwgZxLCcgQYN4Rh132024-07-10 08:21:11
+2024-07-10 08:21:112024-07-10 08:21:11 enter C9kjSCU9iZq2M89RfZqkuZpPvRXi8nuew3aDq4JzRa4G
+2024-07-10 08:21:11  enter sU3GUBpAYZNrYuhqKdh24iYuFuNnBWQv7oEteNDXAWfenter EXuVDJNqhWBHAwc2iefG4vW1GgJpejAqUvuRhUw4Nhog
+2024-07-10 08:21:11
+  enter AZsQxuDkXbmf8Eom4mqmZTWokEG37EpwNKFjFQNsQ3XV2024-07-10 08:21:11
+ enter 14S4fRuvNACffP5aHs1t7C7AjtyZsckwZuTosQy5UUkE
+enter CRsgNuBuiKvMavq69NCdWu8FvBpS8srWq8RG2rNcSGpP
+2024-07-10 08:21:11 enter C3dRLTBgYYQG1Q6czSqjmvgmyLL7upTede6pnzQnco3e
+2024-07-10 08:21:11 enter AShvBnVmKN1Vw1o4gJfPs2CrHuvqyjo6h4Tztri6fCcE
+2024-07-10 08:21:12 enter 5PQLyou4EZqFP4Xn3AiZ6CagJtzRQ1E4VTGC3VTmNHzn2024-07-10 08:21:12
+ enter 6YncPWzRLER5oE1dDtRUFwxhrR2h1nwWutzHaDP23W3D
+2024-07-10 08:21:12 enter GNvEdoh3KHMEJjZdzCRpP2muspSr4X3LRVRSrqiYcguZ
+2024-07-10 08:21:12 enter DVt6AePG23LfTv1VDppnGWWHQXEbpWW97PEJf4UgMAM
+2024-07-10 08:21:122024-07-10 08:21:12 enter 5anaQFiFY6GqWFaV6PnCjifRXzkvSrMpMz9CMSEi9Ccc
+ enter DhEDyawZ9gZ6iy8Bhk8rq7TNxy2mbv6H8eSNtzk216vr
+2024-07-10 08:21:13 2024-07-10 08:21:13 enter Fyv7URhz8pzRY3uUoBYNkaMSg6ifimvcFNK8p4gvWhbR
+2024-07-10 08:21:13enter 98mi9itqKwaWdWPFGViAUQ6vZmB9ftphsZcVVCqPsqqT2024-07-10 08:21:13 enter 2zhBbs127EnrkJWyc4U9DMuBxKnWLJfq4Hb8x1eskTfc
+ enter B1wojkKqE7qtsXX8JP6PQERgdipJq6xpz8YGsdMsqK6n
+
+2024-07-10 08:21:132024-07-10 08:21:13 enter 3zW6odCfkmDFtWGhWc2Kp5SEokfprh2gnqLar1wv1WnB 
+enter EejcWHh2ELTDkxKMmTJQ4VnyyYGdzLo91xMXzZNxAvbG2024-07-10 08:21:13
+2024-07-10 08:21:13 enter ApMLsE8WaLJwscY6t8vdwSMVUrnLdfkCv8uuKXJtQqZf
+ 2024-07-10 08:21:13enter Hemwik6AWf93dUpRYkkxyjn3WTGUnhsR6MYBvjzcadAN enter FSaanR7cdbcypqhNsjFQTfXy2XNrzvsDDDCXdX2GSCXg
+
+2024-07-10 08:21:13 enter DcrLEjXccQD8zpKPspbMVg9pShzQzn1PKZ18Jbn8MxMH
+2024-07-10 08:21:13 2024-07-10 08:21:14 enter 5eoc5Neh5RFWCAK2SkGGKfCU5f4EXdFQxbNgZGD1fGYT
+enter 7xbpY9oyFKTGqXTikXaEbKhaygX5hJzr6HQYtHKsUUFK
+2024-07-10 08:21:142024-07-10 08:21:142024-07-10 08:21:14   enter BaVfSvTBg97D57LoJGMUvCAJDiaBhZ1q4XUXNRsMoqDdenter JCvxcZBr6HkgbjUkgdiKokghimXeyJiFejhgumdDJoHb
+CdmQMQKNGAks14f7GY3HxxTRUe6KkXX7xhowxGpkcQn4 success remainder= 94 
+2024-07-10 08:21:14
+ enter 7LZVvquLpGbD4cNS7PXACTRaQCNWcRwQMVMMD6TSw9Pf
+2024-07-10 08:21:142024-07-10 08:21:14  enter DTRtPCdKG9PDRMLDtbmnD8Xh9XRseKwpGESAEisqWGn2024-07-10 08:21:14enter 4Q6rYzUsxVqjc253UX9UCz2EbbHXjgRKLzyjwsukfpPW
+ 
+enter E8mFb4WhXVVT37C4fp7Vrmefw77PfDyr3N9APuCJCoAc2024-07-10 08:21:14 
+enter HfX41teh3ps5o6TsmZoT7kpFbbpRtKHZHjUeV9Pty7Cx
+2024-07-10 08:21:14 2024-07-10 08:21:14 enter 4KnRuBPSkv6FHGWYsXFPzFX9V359Wcdjqu5nECAnz1xT
+2024-07-10 08:21:14 2024-07-10 08:21:14enter 8VmbPAXwjXF5u28X6Bt7nSEefuoWrxUP2RSFhqvfuxUF2024-07-10 08:21:14 2024-07-10 08:21:14 
+enter 2jk8TQjBjABhRpJSm86rWvpxNU9yyWAwiHcKAEeQUiWLenter F5Xsvt6MKs9S78Ggiry7RnGfc3Gm9VMPes8o7w5hMzn7
+2024-07-10 08:21:15 2024-07-10 08:21:15 enter Hvts7WUNA9k72kkVt2YP6z1R85U3C637XqfCNoaYSy3W
+ 
+2024-07-10 08:21:15enter 2jzezk7cHATn6zdYw2pmysaqYz9FqkJPv9NTpKwX1hAN
+enter CwCPoEr1S5Tpkv8L22iaaiNUHaUjFxALn5FsZUjjsNiS
+ enter EgiHc8SqjNnAsaqB19c1yss9AnmgYjJmrPgypFVqBozG
+14S4fRuvNACffP5aHs1t7C7AjtyZsckwZuTosQy5UUkE success remainder= 93 
+2024-07-10 08:21:15 2024-07-10 08:21:152024-07-10 08:21:15 2024-07-10 08:21:15 enter 4jtyoKwpogYzWiKnL8Yb7rL1jLyN66VL1b22CWCywPVG
+ enter DXCYfW88qKwAiSUayBvLVF3XNaKB8WdGw2h4fF1pYtGzenter DVRhcUFVRnD2g1WVLm8u2VdTMsHiQwDeELwHE7jSUfnT
+enter Fk2zvtxbHxiDgdoZGeCwmXG6dN8QyjDFXTvUShopcJHU
+
+2024-07-10 08:21:152024-07-10 08:21:15 2024-07-10 08:21:15 B1wojkKqE7qtsXX8JP6PQERgdipJq6xpz8YGsdMsqK6n success remainder= 92 
+ enter AvMQh4RWW5D592c4mTcpXpfysYwuWwJWacXZYN5wViXt2024-07-10 08:21:16enter B76awVT8Zgns3HutwC7R47KqWD7DiUxVh5Syo3riSts2024-07-10 08:21:16  
+
+2024-07-10 08:21:16enter 2gRf9QYcSNi7RSqpDAwG1VNkrvyqmPgA32dL15xKpzkE enter 7mXohCdQMEidWkvh8v2DD21ZeQ8hoiLtR9UgxXWBChgX
+
+enter 2h7s3FpSvc6v2oHke6Uqg191B5fPCeFTmMGnh5oPWhX7
+2024-07-10 08:21:16 enter 9zVrCjJGqnXTSehtMY3cc15t6oVeu4CDpSvViZWYZUa
+2024-07-10 08:21:162024-07-10 08:21:16 2024-07-10 08:21:16  2024-07-10 08:21:17 enter 2YsDS3SdNkq3Y4PaxdeYfds5PjLY4gQQMs82oMyYfBL4enter FeC6eoUA1Y8frBcx1XuZgXerBj5d3CGNwvFVJFpbYEid
+
+enter HHTeEVGU3KUjXKkrbteRExFFjCiodJUxXY6amAUjLgUG2024-07-10 08:21:17 enter w1GXiZ458rozCQZTog2x2qrkXKRQjEMWSiSjESx4Q6p
+enter 7x5FgWwqboGYAms25eGkHCg7bPrusHArwhCy9kBQMy8z2024-07-10 08:21:17
+ enter 7v1zaVsjxqRFo35DvNLedZjKEG6g8STZW3J9xNKAniqH
+
+2024-07-10 08:21:17 enter G7S6kqk8bKHTxkBENCPrNnzAtSPxGZrcDwrfcFKGQtrF
+2024-07-10 08:21:172024-07-10 08:21:17 enter Bkwanva2jqFJqTS1K1LeJooUjYwoZnCGtJfkuVxGFp6w2024-07-10 08:21:17 enter GVeiGLyHes2LnonvapBxo7FG1aEZsRA4yxbMJLt3vZiB
+
+ 6Eu5ms6QrQK2iRYsJHgXeyiYKawF7yT2N5DBhLjzYyRB success remainder= 91 
+2024-07-10 08:21:18 2024-07-10 08:21:18 2jk8TQjBjABhRpJSm86rWvpxNU9yyWAwiHcKAEeQUiWL success remainder= 90 
+2024-07-10 08:21:18 enter EaDkM3mgx4rrBnvqZamW1WzWpXUsYcKmrNeNbUvieZcg
+2024-07-10 08:21:18 enter DVWfUJav7CzGqGs1NKc8zhJcjMKBtmheUyZC2i6YBCtr2024-07-10 08:21:18 
+enter 3WL72gqW4XbzWi5BNNjK6L47DVShU5dYKzGHvHnXQPpuenter GadvcGntfi2iEKQmXNrJudvT9EtNrMp9cR8jdQoWZzQ7
+
+2024-07-10 08:21:18 2024-07-10 08:21:19 enter CJGc1RFrViUV7atc2vksLGvhGJePUkZcDj8gYCdogFGG
+2024-07-10 08:21:194Q6rYzUsxVqjc253UX9UCz2EbbHXjgRKLzyjwsukfpPW success remainder= 89 
+ 2024-07-10 08:21:19enter 6GE854hDBW4dpD873GsfFAB5aiHaRnrULzGVs4MyC53c 
+2024-07-10 08:21:19 enter HjojuU5gczPmUWrnsM6GNz9apFtoDsrFdDuoaMAGo4kX
+enter HF4qoQHabG5zZsf5hVEWV3pub9Nj94VFRgZVyEQNt2RK
+2024-07-10 08:21:192024-07-10 08:21:19 7mXohCdQMEidWkvh8v2DD21ZeQ8hoiLtR9UgxXWBChgX success remainder= 88 
+ enter 12ZZ6CaU1NTt5GwhDoSJ8XSKpmMQFL4UuvYYv2FoRLD3
+2024-07-10 08:21:20 2024-07-10 08:21:202024-07-10 08:21:20 enter DUnugDGiaE2CgEfRfb97uLyKz8YV2knxXXjfPqQfi9ejsU3GUBpAYZNrYuhqKdh24iYuFuNnBWQv7oEteNDXAWf success remainder= 87 
+2024-07-10 08:21:20
+  enter DekwpejAnJ4b93wU9kTxSKqdoVHCpoDymWPBww9eeqnm2024-07-10 08:21:21 enter 22x8Lthq4yM6AD6VwiYGo78UASpDJCq3KbKs55NeFtnZenter 8od7FZxojvXy7Zp9jwo2mWyshrV9MidREtx6i5wu1pvA2024-07-10 08:21:21 enter 8JMreBJW2NgYCUw4q25oAcSUwnJSz5fnNJkU1QeHtieD
+2024-07-10 08:21:21 2024-07-10 08:21:21
+ 
+2024-07-10 08:21:21 
+DhEDyawZ9gZ6iy8Bhk8rq7TNxy2mbv6H8eSNtzk216vr success remainder= 86 
+2024-07-10 08:21:21enter 8LZPjR1ZLsKiaF758F9vQASDDanFjz6JGfRmUxBnFwYr
+2024-07-10 08:21:21enter 3SWGR9ZmJm7vkfCedQ7ppaLgTeWZivpjKVaXFndt6tb8
+ 2024-07-10 08:21:21 2zhBbs127EnrkJWyc4U9DMuBxKnWLJfq4Hb8x1eskTfc success remainder= 84 
+ 2024-07-10 08:21:22 2024-07-10 08:21:22 2024-07-10 08:21:22 enter ASCUGaXce4dw8SFbfmk14ct4D17x9TwwhT7vovzJrcMU
+2jzezk7cHATn6zdYw2pmysaqYz9FqkJPv9NTpKwX1hAN success remainder= 85 
+7v1zaVsjxqRFo35DvNLedZjKEG6g8STZW3J9xNKAniqH success remainder= 83 
+enter AgeUT38Y48m4ebZBFLhZVWnS8GnPL5NkUYjWsPpfde1a
+2024-07-10 08:21:22enter BYQKaYipvXyaDhnAbHh9fuWpJUjB3doYpymz1zc9bAJC
+ 2024-07-10 08:21:22enter B83z3CARNkhQNYLMG2xPM3GhZm4kKReTWP7f9CtwLLXH
+ 2024-07-10 08:21:22 enter GHsojPSbfyNqbFSLhJajU4GnNRdNAtgjn8BDFKBYNzYL
+2024-07-10 08:21:232024-07-10 08:21:232024-07-10 08:21:233SWGR9ZmJm7vkfCedQ7ppaLgTeWZivpjKVaXFndt6tb8 success remainder= 82 
+   enter HvUjmTd5eDbPwxWzGwMM6UuWh7CJ9TBaAm3pSnBUBFEc
+2024-07-10 08:21:23 EejcWHh2ELTDkxKMmTJQ4VnyyYGdzLo91xMXzZNxAvbG success remainder= 79 
+w1GXiZ458rozCQZTog2x2qrkXKRQjEMWSiSjESx4Q6p success remainder= 80 
+ApMLsE8WaLJwscY6t8vdwSMVUrnLdfkCv8uuKXJtQqZf success remainder= 81 
+2024-07-10 08:21:232024-07-10 08:21:23  enter 7hsWydxcfTYEyb12EfRwYsbZPnWEVxEdgwcbX3DupNMenter 7DXpcXFXquz2duSGdAARjN3iEiHdqySGP4h6KuYHx8fK
+2024-07-10 08:21:23
+2024-07-10 08:21:23  enter 4Dq9VKSPVYeoSFeHrYBW58Do8Ntxfw7wdkMstVY6XoAjenter GXK2nQQLbsThLGctQJJcXNjmcygTg4h6rwptx43r8QZj2024-07-10 08:21:232024-07-10 08:21:23
+ enter 9GyS8aajDTSUMcVVzy3W7JeQMUzwvAWjUgL2ZhWWnQa1
+
+ 2024-07-10 08:21:23 8JMreBJW2NgYCUw4q25oAcSUwnJSz5fnNJkU1QeHtieD success remainder= 78 
+enter 4NAVrr9mEZ7FShN1QaTYtptpNDfJiP1CnKY7ZAaQ33fN
+2024-07-10 08:21:24 22x8Lthq4yM6AD6VwiYGo78UASpDJCq3KbKs55NeFtnZ success remainder= 77 
+2024-07-10 08:21:242024-07-10 08:21:24 enter 7tE4jyagcP3AcFoL9RDe7V4sV41f9pJnMEQQ7EaTrJZ9 enter Cft4hKtC3dVftfqmL2MCALpeCq7oWM7qpftNfVVUzA7h
+
+2024-07-10 08:21:24 DVWfUJav7CzGqGs1NKc8zhJcjMKBtmheUyZC2i6YBCtr success remainder= 76 
+2024-07-10 08:21:24 B83z3CARNkhQNYLMG2xPM3GhZm4kKReTWP7f9CtwLLXH success remainder= 75 
+2024-07-10 08:21:252024-07-10 08:21:25 98mi9itqKwaWdWPFGViAUQ6vZmB9ftphsZcVVCqPsqqT success remainder= 74 
+ EgiHc8SqjNnAsaqB19c1yss9AnmgYjJmrPgypFVqBozG success remainder= 73 
+2024-07-10 08:21:26 GNvEdoh3KHMEJjZdzCRpP2muspSr4X3LRVRSrqiYcguZ success remainder= 72 
+2024-07-10 08:21:26 2024-07-10 08:21:26 9GyS8aajDTSUMcVVzy3W7JeQMUzwvAWjUgL2ZhWWnQa1 success remainder= 71 
+DTRtPCdKG9PDRMLDtbmnD8Xh9XRseKwpGESAEisqWGn success remainder= 70 
+2024-07-10 08:21:26 8od7FZxojvXy7Zp9jwo2mWyshrV9MidREtx6i5wu1pvA success remainder= 69 
+2024-07-10 08:21:272024-07-10 08:21:27 GXK2nQQLbsThLGctQJJcXNjmcygTg4h6rwptx43r8QZj success remainder= 67 
+2024-07-10 08:21:27  6mKvvWnzXwGq1Ap22uHaK3j1MkUzwgZxLCcgQYN4Rh13 success remainder= 66 
+2024-07-10 08:21:279zVrCjJGqnXTSehtMY3cc15t6oVeu4CDpSvViZWYZUa success remainder= 68 
+ DUnugDGiaE2CgEfRfb97uLyKz8YV2knxXXjfPqQfi9ej success remainder= 65 
+2024-07-10 08:21:27 12ZZ6CaU1NTt5GwhDoSJ8XSKpmMQFL4UuvYYv2FoRLD3 success remainder= 64 
+2024-07-10 08:21:27 HF4qoQHabG5zZsf5hVEWV3pub9Nj94VFRgZVyEQNt2RK success remainder= 63 
+2024-07-10 08:21:27 CwCPoEr1S5Tpkv8L22iaaiNUHaUjFxALn5FsZUjjsNiS success remainder= 62 
+2024-07-10 08:21:272024-07-10 08:21:27 ASCUGaXce4dw8SFbfmk14ct4D17x9TwwhT7vovzJrcMU success remainder= 61 
+ DXCYfW88qKwAiSUayBvLVF3XNaKB8WdGw2h4fF1pYtGz success remainder= 60 
+2024-07-10 08:21:27 6GE854hDBW4dpD873GsfFAB5aiHaRnrULzGVs4MyC53c success remainder= 59 
+2024-07-10 08:21:28 BYQKaYipvXyaDhnAbHh9fuWpJUjB3doYpymz1zc9bAJC success remainder= 58 
+2024-07-10 08:21:28 5PQLyou4EZqFP4Xn3AiZ6CagJtzRQ1E4VTGC3VTmNHzn success remainder= 57 
+2024-07-10 08:21:28 FSaanR7cdbcypqhNsjFQTfXy2XNrzvsDDDCXdX2GSCXg success remainder= 56 
+2024-07-10 08:21:28 6YncPWzRLER5oE1dDtRUFwxhrR2h1nwWutzHaDP23W3D success remainder= 55 
+2024-07-10 08:21:28 7x5FgWwqboGYAms25eGkHCg7bPrusHArwhCy9kBQMy8z success remainder= 54 
+2024-07-10 08:21:28 F5Xsvt6MKs9S78Ggiry7RnGfc3Gm9VMPes8o7w5hMzn7 success remainder= 53 
+2024-07-10 08:21:28 DVt6AePG23LfTv1VDppnGWWHQXEbpWW97PEJf4UgMAM success remainder= 52 
+2024-07-10 08:21:28 C9kjSCU9iZq2M89RfZqkuZpPvRXi8nuew3aDq4JzRa4G success remainder= 51 
+2024-07-10 08:21:28 Fk2zvtxbHxiDgdoZGeCwmXG6dN8QyjDFXTvUShopcJHU success remainder= 50 
+2024-07-10 08:21:282024-07-10 08:21:28  AgeUT38Y48m4ebZBFLhZVWnS8GnPL5NkUYjWsPpfde1a success remainder= 48 
+8VmbPAXwjXF5u28X6Bt7nSEefuoWrxUP2RSFhqvfuxUF success remainder= 49 
+2024-07-10 08:21:28 2024-07-10 08:21:287hsWydxcfTYEyb12EfRwYsbZPnWEVxEdgwcbX3DupNM success remainder= 47 
+ HvUjmTd5eDbPwxWzGwMM6UuWh7CJ9TBaAm3pSnBUBFEc success remainder= 46 
+2024-07-10 08:21:29 2h7s3FpSvc6v2oHke6Uqg191B5fPCeFTmMGnh5oPWhX7 success remainder= 45 
+2024-07-10 08:21:29 7xbpY9oyFKTGqXTikXaEbKhaygX5hJzr6HQYtHKsUUFK success remainder= 44 
+2024-07-10 08:21:29 AvMQh4RWW5D592c4mTcpXpfysYwuWwJWacXZYN5wViXt success remainder= 43 
+2024-07-10 08:21:29 5eoc5Neh5RFWCAK2SkGGKfCU5f4EXdFQxbNgZGD1fGYT success remainder= 42 
+2024-07-10 08:21:29 AZsQxuDkXbmf8Eom4mqmZTWokEG37EpwNKFjFQNsQ3XV success remainder= 41 
+2024-07-10 08:21:29 7LZVvquLpGbD4cNS7PXACTRaQCNWcRwQMVMMD6TSw9Pf success remainder= 40 
+2024-07-10 08:21:29 BaVfSvTBg97D57LoJGMUvCAJDiaBhZ1q4XUXNRsMoqDd success remainder= 39 
+2024-07-10 08:21:29 EaDkM3mgx4rrBnvqZamW1WzWpXUsYcKmrNeNbUvieZcg success remainder= 38 
+2024-07-10 08:21:29 2024-07-10 08:21:29 Bkwanva2jqFJqTS1K1LeJooUjYwoZnCGtJfkuVxGFp6w success remainder= 36 
+DVRhcUFVRnD2g1WVLm8u2VdTMsHiQwDeELwHE7jSUfnT success remainder= 37 
+2024-07-10 08:21:29 C3dRLTBgYYQG1Q6czSqjmvgmyLL7upTede6pnzQnco3e success remainder= 35 
+2024-07-10 08:21:292024-07-10 08:21:29  DekwpejAnJ4b93wU9kTxSKqdoVHCpoDymWPBww9eeqnm success remainder= 34 
+4KnRuBPSkv6FHGWYsXFPzFX9V359Wcdjqu5nECAnz1xT success remainder= 33 
+2024-07-10 08:21:29 DcrLEjXccQD8zpKPspbMVg9pShzQzn1PKZ18Jbn8MxMH success remainder= 32 
+2024-07-10 08:21:29 FeC6eoUA1Y8frBcx1XuZgXerBj5d3CGNwvFVJFpbYEid success remainder= 31 
+2024-07-10 08:21:29 E8mFb4WhXVVT37C4fp7Vrmefw77PfDyr3N9APuCJCoAc success remainder= 30 
+2024-07-10 08:21:29 4jtyoKwpogYzWiKnL8Yb7rL1jLyN66VL1b22CWCywPVG success remainder= 29 
+2024-07-10 08:21:29 AShvBnVmKN1Vw1o4gJfPs2CrHuvqyjo6h4Tztri6fCcE success remainder= 28 
+2024-07-10 08:21:29 HfX41teh3ps5o6TsmZoT7kpFbbpRtKHZHjUeV9Pty7Cx success remainder= 27 
+2024-07-10 08:21:29 2024-07-10 08:21:29 8LZPjR1ZLsKiaF758F9vQASDDanFjz6JGfRmUxBnFwYr success remainder= 25 
+7tE4jyagcP3AcFoL9RDe7V4sV41f9pJnMEQQ7EaTrJZ9 success remainder= 26 
+2024-07-10 08:21:29 3WL72gqW4XbzWi5BNNjK6L47DVShU5dYKzGHvHnXQPpu success remainder= 24 
+2024-07-10 08:21:29 EXuVDJNqhWBHAwc2iefG4vW1GgJpejAqUvuRhUw4Nhog success remainder= 23 
+2024-07-10 08:21:29 4NAVrr9mEZ7FShN1QaTYtptpNDfJiP1CnKY7ZAaQ33fN success remainder= 22 
+2024-07-10 08:21:29 7DXpcXFXquz2duSGdAARjN3iEiHdqySGP4h6KuYHx8fK success remainder= 21 
+2024-07-10 08:21:29 2YsDS3SdNkq3Y4PaxdeYfds5PjLY4gQQMs82oMyYfBL4 success remainder= 20 
+2024-07-10 08:21:29 B76awVT8Zgns3HutwC7R47KqWD7DiUxVh5Syo3riSts success remainder= 19 
+2024-07-10 08:21:29 2gRf9QYcSNi7RSqpDAwG1VNkrvyqmPgA32dL15xKpzkE success remainder= 18 
+2024-07-10 08:21:29 JCvxcZBr6HkgbjUkgdiKokghimXeyJiFejhgumdDJoHb success remainder= 17 
+2024-07-10 08:21:29 4Dq9VKSPVYeoSFeHrYBW58Do8Ntxfw7wdkMstVY6XoAj success remainder= 16 
+2024-07-10 08:21:302024-07-10 08:21:30 GadvcGntfi2iEKQmXNrJudvT9EtNrMp9cR8jdQoWZzQ7 success remainder= 14 
+ CRsgNuBuiKvMavq69NCdWu8FvBpS8srWq8RG2rNcSGpP success remainder= 15 
+2024-07-10 08:21:30 CJGc1RFrViUV7atc2vksLGvhGJePUkZcDj8gYCdogFGG success remainder= 13 
+2024-07-10 08:21:30 G7S6kqk8bKHTxkBENCPrNnzAtSPxGZrcDwrfcFKGQtrF success remainder= 12 
+2024-07-10 08:21:30 Hemwik6AWf93dUpRYkkxyjn3WTGUnhsR6MYBvjzcadAN success remainder= 11 
+2024-07-10 08:21:302024-07-10 08:21:30  HHTeEVGU3KUjXKkrbteRExFFjCiodJUxXY6amAUjLgUG success remainder= 10 
+5anaQFiFY6GqWFaV6PnCjifRXzkvSrMpMz9CMSEi9Ccc success remainder= 9 
+2024-07-10 08:21:30 Fyv7URhz8pzRY3uUoBYNkaMSg6ifimvcFNK8p4gvWhbR success remainder= 8 
+2024-07-10 08:21:30 AsQXYJPMnkygPWPgSozm8SvJZqtLSgFy84uYgMaLbfYR success remainder= 7 
+2024-07-10 08:21:30 GVeiGLyHes2LnonvapBxo7FG1aEZsRA4yxbMJLt3vZiB success remainder= 6 
+2024-07-10 08:21:30 85kpzQBdyaMy2F3zQomT5ywsUSQLGMku3j9jK24Wne3w success remainder= 5 
+2024-07-10 08:21:30 Cft4hKtC3dVftfqmL2MCALpeCq7oWM7qpftNfVVUzA7h success remainder= 4 
+2024-07-10 08:21:30 HjojuU5gczPmUWrnsM6GNz9apFtoDsrFdDuoaMAGo4kX success remainder= 3 
+2024-07-10 08:21:30 3zW6odCfkmDFtWGhWc2Kp5SEokfprh2gnqLar1wv1WnB success remainder= 2 
+2024-07-10 08:21:30 Hvts7WUNA9k72kkVt2YP6z1R85U3C637XqfCNoaYSy3W success remainder= 1 
+2024-07-10 08:21:30 GHsojPSbfyNqbFSLhJajU4GnNRdNAtgjn8BDFKBYNzYL success remainder= 0 
+2024-07-10 08:21:31 END    006_get_transaction_st_solanafm.py ----------------NOTE-----------NOTE---------------
+nohup: ignoring input
+2024-07-10 08:22:02 
+
+
+
+
+
+2024-07-10 08:22:02 ENTER  007_get_configtoken_st_solanafm.py ----------------NOTE-----------NOTE---------------
+2024-07-10 08:22:02 arr_str_dalaoaddress 265
+2024-07-10 08:22:02 enter str_dalaoaddress= 4cdhkfmswFbBqzJptRRKHNWQqZEvTC7bSYTNgFbkCo1v
+2024-07-10 08:22:02 enter str_dalaoaddress= 6xbKtRWCH7Gd6yAUXXNK2Rk88tBGk7mdbNNKDc9QJgCE
+2024-07-10 08:22:02 enter str_dalaoaddress= GXnQmvyqP1JXaene5GvcsafHLUPAKjV9wpmFwueCU9oD
+2024-07-10 08:22:02 enter str_dalaoaddress= FijT78YGmoH3kaziymMYCDhdwA8g7xqdkg254qtkBKik2024-07-10 08:22:02
+2024-07-10 08:22:02  enter str_dalaoaddress= FHF8ciYNMxBENLZUSQCopixyKHasDQaPbVfhbUoLmXFbenter str_dalaoaddress= CGh6rrMV4Q4Syv7EAhqsR5i2TePaaNrWUzBQvWgz5gHD
+2024-07-10 08:22:02
+ enter str_dalaoaddress= Cz3mUHZbfmgEBfEdJECWswS3gQB8nEcZLYArU5PwBn5J
+2024-07-10 08:22:032024-07-10 08:22:032024-07-10 08:22:03   enter str_dalaoaddress= 9qdq5dERP6frhvZgdZ26WvsEXkqDvxYf27uvYu9W66jq
+GXnQmvyqP1JXaene5GvcsafHLUPAKjV9wpmFwueCU9oD success remainder_len=264
+enter str_dalaoaddress= 7zL7mpZQwGTfkAJ4Qn87y7HSDtT95cGEdXVoQMEyuCZX2024-07-10 08:22:03 2024-07-10 08:22:032024-07-10 08:22:03enter str_dalaoaddress= 9eUw1dqESPQxeFUm1kJh2WSY8mA1CszAREJRxxPjNGrd 
+enter str_dalaoaddress= 4qfdzdz19q5kWuo2hNAZyQ7krVM4wFSAEzjK1JrWrMwD
+
+ enter str_dalaoaddress= 69kPqGbtmT51foR3ZMRR48BVRhzcysPh7sLTBf9hSRGD
+2024-07-10 08:22:03 2024-07-10 08:22:03enter str_dalaoaddress= 7jw834gPVnHeypTryDzb6Z3YTzhWSx2eSz7Bi6BkL4dz
+ 2024-07-10 08:22:03enter str_dalaoaddress= 92iS2625agVhUDHhrigjgNKyh6maUE5Gg8Pfw1docGEG
+ 2024-07-10 08:22:03 enter str_dalaoaddress= CcxHnvmz6RbhEMFD5WoWSGyc2CxpDQriGAo1a727MPMgenter str_dalaoaddress= 45EYZF2H8a6kjX7W4QEkEfrKjVfF1jtBLZWjuRGcukt3
+2024-07-10 08:22:03 
+enter str_dalaoaddress= 8J6gYgHQXJp5uB7sveLWLQV9eFPzHQzY6RmYrh2StoZh2024-07-10 08:22:03 
+enter str_dalaoaddress= EEkVVvKk5Tp6GAjiVpRk5yT34aYekUqZutSDbm733dcF2024-07-10 08:22:032024-07-10 08:22:03
+2024-07-10 08:22:03  2024-07-10 08:22:03  enter str_dalaoaddress= BD5YyR7f83EgeeWEBFW7mARsE5jxNi1wANRnnSqhoRbs
+enter str_dalaoaddress= 4T34XEQJLzVXuecTnzqxvm31si8N9YTFbT9QCYb84ey4
+enter str_dalaoaddress= 9xuAXPdoTzNvqp5iEcN9CPRh23bDUE7tMykRJcdnzAuD
+enter str_dalaoaddress= AXyKkVAWmaDxm8jGwHEvM8KusJTbH9zWiZbVevRKvx8g2024-07-10 08:22:04 enter str_dalaoaddress= 4uLcs4jBxbnJEgTeq92oZjFjPzQNBiU9bcQ3Rq1tcL8R
+
+2024-07-10 08:22:04 2024-07-10 08:22:04 enter str_dalaoaddress= CFR89scCo61vo56F8UQxmLiCmiJyWefEwVAUtq3B5Ticenter str_dalaoaddress= FRahFJMn86ZmtNJeBdoZiMS2LBTeZ3ZU9caBBAzp3g4G
+
+2024-07-10 08:22:04 2024-07-10 08:22:04enter str_dalaoaddress= GUgfpxERCM6wdBBA77ddWfVKD5spyC4WgC4LRsrBnRXE 
+enter str_dalaoaddress= DcRAk2KT6pKf631AkdCVC3pe4mdHHrw3NDnEPk8zUWzy
+2024-07-10 08:22:04 2024-07-10 08:22:042024-07-10 08:22:04 2024-07-10 08:22:04  enter str_dalaoaddress= BmhEn4SYAESA1gYH3Txf6DqJgMbtKxHPV7WWdJzEQAvWenter str_dalaoaddress= F5CsimrUKMdNeRJSvyLoykiVRnjthUWkBkDycUbnmpS6enter str_dalaoaddress= CMu4NHnrJbf47amBwMmFwAxfoSniyxEz77NVoEUEqpkb
+2024-07-10 08:22:04 enter str_dalaoaddress= DHCJpUcyzioMGsELqdonFYNsgQ2Hs94wVB782bgYyjUgAXyKkVAWmaDxm8jGwHEvM8KusJTbH9zWiZbVevRKvx8g pre= 120 aft= 108
+
+
+
+2024-07-10 08:22:05 CcxHnvmz6RbhEMFD5WoWSGyc2CxpDQriGAo1a727MPMg pre= 308 aft= 205
+2024-07-10 08:22:05 2024-07-10 08:22:05enter str_dalaoaddress= 593NVnzXAveWxC2FVN7TRthZnAqfAwTQsQu3jthuTYog 
+2024-07-10 08:22:05 2024-07-10 08:22:05 enter str_dalaoaddress= FwoDrTiAWZx4tf9oqwAjYjftq2g267iGRqEvHqdtrWJienter str_dalaoaddress= 6ohVbJ7C4pEVCkkHBdHQmpP34knxPgbR1oqd4ybvQ6D82024-07-10 08:22:05enter str_dalaoaddress= hqHJgH7CiGZmtkGZTJwHw2zhxtKNN7oHPZvy4XTLQd1
+
+
+ 2024-07-10 08:22:06CGh6rrMV4Q4Syv7EAhqsR5i2TePaaNrWUzBQvWgz5gHD success remainder_len=263
+2024-07-10 08:22:06 45EYZF2H8a6kjX7W4QEkEfrKjVfF1jtBLZWjuRGcukt3 success remainder_len=262
+ enter str_dalaoaddress= 8vrwnPPSv12iKjVvEVKQb1fFvRa4DcnotA4RoVgraqRF2024-07-10 08:22:06 enter str_dalaoaddress= BMr77C8exnf9Q1jBMwsV8gbioqqNS3QQCkASH3btnbWx2024-07-10 08:22:06
+ FHF8ciYNMxBENLZUSQCopixyKHasDQaPbVfhbUoLmXFb success remainder_len=261
+
+2024-07-10 08:22:062024-07-10 08:22:062024-07-10 08:22:06 enter str_dalaoaddress= HJz4XsCQzAbt8JGVTTxBBSFpGivm7XT5VkPZrgD15mfL2024-07-10 08:22:06
+  2024-07-10 08:22:06Cz3mUHZbfmgEBfEdJECWswS3gQB8nEcZLYArU5PwBn5J success remainder_len=260
+ enter str_dalaoaddress= C96RaPJwm6jc3yUTA6JrnPRsRTzVHgVkXxFFk3ShZdLm BD5YyR7f83EgeeWEBFW7mARsE5jxNi1wANRnnSqhoRbs pre= 420 aft= 394
+2024-07-10 08:22:06 enter str_dalaoaddress= CdhzJDWgHEdzbhBUEFEgjvwpCrcXc5zd2h24So9it6Zj4uLcs4jBxbnJEgTeq92oZjFjPzQNBiU9bcQ3Rq1tcL8R success remainder_len=259
+
+
+2024-07-10 08:22:06 2024-07-10 08:22:06enter str_dalaoaddress= 8xz41Ek2vdsR42WUk5z1mPBTsmTg1crkjbm5Ub9DhbjP
+2024-07-10 08:22:062024-07-10 08:22:06 enter str_dalaoaddress= 7XJs14JR9R4P1epxYZo2v2CMwkkveubVmR8KvMLgHGAb
+  enter str_dalaoaddress= 137whNrKQrFeTowL8zkn8sahGM1V4x8d6PVNxS4CebJQ2024-07-10 08:22:07enter str_dalaoaddress= 8DdhgxW2EUYS2ReTjqEZbn3Lcd8Y98rWb83r1DLRh6eC
+2024-07-10 08:22:07
+ 2024-07-10 08:22:07  enter str_dalaoaddress= DSKLqHEzMcvsSSNG7XobjbtKZV25kFn94ryYTRhRx8Zkenter str_dalaoaddress= 6ANioLqoBiJmefswnXxpAH89CYSjCMYAC6bMYP8rLGX1
+AXyKkVAWmaDxm8jGwHEvM8KusJTbH9zWiZbVevRKvx8g success remainder_len=258
+
+2024-07-10 08:22:07 enter str_dalaoaddress= 6gwyMiXv3tzSF4AT2qUfJCeAHrBj8Y9zqba59yC8ZTVw2024-07-10 08:22:07 
+2024-07-10 08:22:07enter str_dalaoaddress= E379GSqozCknZZQZa5D5j8FrgTDzbeFrJdpjxnM9NS9d2024-07-10 08:22:07 9qdq5dERP6frhvZgdZ26WvsEXkqDvxYf27uvYu9W66jq pre= 794 aft= 445
+
+ 2024-07-10 08:22:08enter str_dalaoaddress= J5smpruhLFadnin6ZNXvAhD6Q3qmbopedx8jhwxz3Kja
+ enter str_dalaoaddress= JED9gEbMzhAsKHt65DjrDJ3epWCnoDiZPyn3YhQkqC38
+2024-07-10 08:22:082024-07-10 08:22:08 enter str_dalaoaddress= 7BwHjUw3i2CRTNZiYGYo32r2wn4wEZF8TTUbSoLvMSSo2024-07-10 08:22:082024-07-10 08:22:08
+ enter str_dalaoaddress= D5ena4B5y3nZUXQs893qNJqn95Yx3oa8u22fHT1eCapB 
+6xbKtRWCH7Gd6yAUXXNK2Rk88tBGk7mdbNNKDc9QJgCE success remainder_len=257
+2024-07-10 08:22:082024-07-10 08:22:08 2024-07-10 08:22:08  enter str_dalaoaddress= H2FUVtgBtbUzSwYtNmshbo95ajrz11t6weTzpsBrt5Es2024-07-10 08:22:08  enter str_dalaoaddress= DoJDW76kV4WH5Tiib32D9jyKQKbfhpzF6P4w2yueCwAD8xz41Ek2vdsR42WUk5z1mPBTsmTg1crkjbm5Ub9DhbjP pre= 326 aft= 249enter str_dalaoaddress= CrTU5929Vnk4sb7Cyfyo1M63JvzgSpFPm58JSyajDbd8
+
+
+2024-07-10 08:22:08 2024-07-10 08:22:092024-07-10 08:22:092024-07-10 08:22:09  enter str_dalaoaddress= 3sXtXH4wbWdx4PxRVcPFtFZeHZn8H4BsuGga2mdqbBfoenter str_dalaoaddress= 9NZCt4VtnyuZCRtKSd31XoifVmbhERFQXmJ8fi5G6wP4
+
+ 2024-07-10 08:22:09
+enter str_dalaoaddress= GKEmaVnyEHQggxsRd93wPzTjgDpmUGe3cmR2CQ7YMYMo
+enter str_dalaoaddress= DVPZSCD8wqHyaGK3482EiAhqzVNYaBMgdBYtVhLdNyfH
+2024-07-10 08:22:09enter str_dalaoaddress= 58trto1eqFCbBagQKzXf7yihxMYcDvyKf7QPbAqhAxTU enter str_dalaoaddress= 5erxVsb24bytwNWYv4QCUre3U8UR6QnTSRnTuEP6v4yC
+
+ F5CsimrUKMdNeRJSvyLoykiVRnjthUWkBkDycUbnmpS6 success remainder_len=256
+2024-07-10 08:22:09 enter str_dalaoaddress= ZP8hv7BS7GhwtD8KdAxuofEQWoEWyTmZA79eTkeSGh4
+2024-07-10 08:22:092024-07-10 08:22:102024-07-10 08:22:10 enter str_dalaoaddress= 7qYo4ecwDqKuanbfCk4wRroETN8juBFmtTdqhugB2QUw
+ 2024-07-10 08:22:10  enter str_dalaoaddress= 2bgcMcLK1tREJQCcTHb2CeaBySmeEPM37QYnJTwwikY1CcxHnvmz6RbhEMFD5WoWSGyc2CxpDQriGAo1a727MPMg success remainder_len=255
+enter str_dalaoaddress= sjZ4SB46dfVrx9JsbyU6e2zCRkh5b1tYv84qihLoKky
+
+2024-07-10 08:22:10 2024-07-10 08:22:10 enter str_dalaoaddress= CgkrM46UtqgWY8FWTBT8gEGa5ZRLMFkXQuatyRmc3Ct7enter str_dalaoaddress= F9g3TsKoyuPYxZAF8bLvQeM2Vg65Ftw7UNuseigmZ1AB
+
+2024-07-10 08:22:11 enter str_dalaoaddress= CvptpjX1NeDLqpPMvkpSmXPHx4kS89KShRB2HxVTtHQW
+2024-07-10 08:22:112024-07-10 08:22:11 enter str_dalaoaddress= CPsCsVWhkRu8FxFbvpThCYZR2PPvFjuJ78RajGCHAjzN2024-07-10 08:22:12 enter str_dalaoaddress= F29cTM8g7sZ1murE5Eo1iVmpaJcvCQGM4PUEAi3Sp1Uh
+
+2024-07-10 08:22:12 2024-07-10 08:22:12 6ohVbJ7C4pEVCkkHBdHQmpP34knxPgbR1oqd4ybvQ6D8 pre= 476 aft= 436
+enter str_dalaoaddress= CRAgP9HtVWkBNtngEy626jprCzK9jhxvagpj1ZyXS59Q 2024-07-10 08:22:12enter str_dalaoaddress= EShhzFptmzfQMDaRSjS2xo1gG5qG6Ai9P3Jpj7eHHyv5 7zL7mpZQwGTfkAJ4Qn87y7HSDtT95cGEdXVoQMEyuCZX success remainder_len=254
+
+2024-07-10 08:22:12 enter str_dalaoaddress= 32s63FJ2snfYnPDC1Xzn3aVwFMBjUk4TtHXjY4KsJi1W
+
+2024-07-10 08:22:132024-07-10 08:22:13 2024-07-10 08:22:13 enter str_dalaoaddress= 9rE5Wp6j9CPu7fVzJ9PsT18Jy5Hdn6MFTPgrBb2x2Aup CdhzJDWgHEdzbhBUEFEgjvwpCrcXc5zd2h24So9it6Zj success remainder_len=253
+2024-07-10 08:22:13
+enter str_dalaoaddress= 32cZ3JoDm2r4jyfBgAs6ECKF2GA1v6ogBnuaWwPHCbf52024-07-10 08:22:14 enter str_dalaoaddress= 56MmFK3tzurx7CYuHtUPDbwzQNWML4Tdqe4D8HWwNstR
+ 2024-07-10 08:22:142024-07-10 08:22:14 enter str_dalaoaddress= 7X6DA7mNLsVVN2s3Ez1NZSB93QKrSFDvtU11fH4PYKZT H2FUVtgBtbUzSwYtNmshbo95ajrz11t6weTzpsBrt5Es success remainder_len=252
+enter str_dalaoaddress= J1YpUnsC85hUPaA6yJVsTPcVfnBA6Y51iaJ9J3faTBMX
+
+2024-07-10 08:22:14
+ enter str_dalaoaddress= 75FU9rhGUtL7pgqmMEQMJp9ouZKHWbroZrgknP5L88SS
+2024-07-10 08:22:142024-07-10 08:22:14  enter str_dalaoaddress= HhMqYTYyjabHAhGXqgyHspkfTyXoKRsCtpEoQm41reLyenter str_dalaoaddress= eSb2nzsLA1xG9RkwqNzqyfUrRfHYpZGUBpqiWSqwxDy2024-07-10 08:22:14 
+CMu4NHnrJbf47amBwMmFwAxfoSniyxEz77NVoEUEqpkb success remainder_len=251
+
+2024-07-10 08:22:15 enter str_dalaoaddress= CKid3aN6yQyF5jVQJteBU7xkWmftCmFvGTPsv7q6g12z
+2024-07-10 08:22:152024-07-10 08:22:15 enter str_dalaoaddress= 9sgh5mkpVhtiU6HzRKPDimYwTRX8eWoRE1isrgHARnbx BMr77C8exnf9Q1jBMwsV8gbioqqNS3QQCkASH3btnbWx pre= 546 aft= 540
+2024-07-10 08:22:15
+ enter str_dalaoaddress= GFbQeBnjTs7q6DaEsAS7eNZyU3LL1aekaCuXnee5QgRJ2024-07-10 08:22:16 enter str_dalaoaddress= FvYmth6RSdYYQ4mtEsSTZfUhcGnpHxgbo5kGEBYpbyB62024-07-10 08:22:162024-07-10 08:22:16  
+2024-07-10 08:22:16enter str_dalaoaddress= EKCMvweXWRPYFP4Bwa2HPmEtFZDZAJRg8rrPSPJgPsN5 58trto1eqFCbBagQKzXf7yihxMYcDvyKf7QPbAqhAxTU success remainder_len=250
+
+
+2024-07-10 08:22:16 enter str_dalaoaddress= BpC3fASsiKT4q4oVnza8tPwjTCKPfqRhDKxc6TKfMXKN
+3sXtXH4wbWdx4PxRVcPFtFZeHZn8H4BsuGga2mdqbBfo success remainder_len=249
+2024-07-10 08:22:16 FRahFJMn86ZmtNJeBdoZiMS2LBTeZ3ZU9caBBAzp3g4G success remainder_len=248
+2024-07-10 08:22:16 2024-07-10 08:22:16 enter str_dalaoaddress= EC2KJEc1mbsmDYYAfLeA1CYS3egFwYw7UmA7s46nLnMBenter str_dalaoaddress= vnnmZ4RmrPBcVgRLamtGsZdmj5wRuFY8yvbuS7fm6wU
+2024-07-10 08:22:172024-07-10 08:22:17 enter str_dalaoaddress= 5bkdTWQhSR7BFY5UL8MQqoifnSonkiH8Av73y8i8aJFJ
+
+ enter str_dalaoaddress= 4hDN7RAenPmKKHZnDukRgzPDEbJXWTGU7c2Uv5tKSfMT
+2024-07-10 08:22:172024-07-10 08:22:172024-07-10 08:22:17 enter str_dalaoaddress= 6TyTdn1y5ZtBwktQt2bZihff9gKwmgLMhdBaaf9MXJVf
+ enter str_dalaoaddress= 67ESR5p8Azt1GbHCuBGxyR1aBXXaPzaa7qfbs5kpExxQ2024-07-10 08:22:18 BD5YyR7f83EgeeWEBFW7mARsE5jxNi1wANRnnSqhoRbs success remainder_len=247
+ 2024-07-10 08:22:18 enter str_dalaoaddress= 8JWggJCnVdBJjP83JvTySHQY3Zio7gWZanmnUfhTyF9z
+
+7qYo4ecwDqKuanbfCk4wRroETN8juBFmtTdqhugB2QUw success remainder_len=246
+2024-07-10 08:22:19 69kPqGbtmT51foR3ZMRR48BVRhzcysPh7sLTBf9hSRGD success remainder_len=245
+2024-07-10 08:22:19 2024-07-10 08:22:19 CgkrM46UtqgWY8FWTBT8gEGa5ZRLMFkXQuatyRmc3Ct7 success remainder_len=244
+2024-07-10 08:22:19enter str_dalaoaddress= 3QKha9egjzzeZiPNgwXq5HMRHe1XacDdgEnEABMjnPFS
+ 32s63FJ2snfYnPDC1Xzn3aVwFMBjUk4TtHXjY4KsJi1W success remainder_len=243
+2024-07-10 08:22:192024-07-10 08:22:19 2024-07-10 08:22:19 enter str_dalaoaddress= CwCDojBiGrEiSnVFfE2yqxVq9eviDDMm2hGHek5okWvp
+enter str_dalaoaddress= 8XX8D8AL7jUoNnG2FQ9aZRPvevMgSUWjWPTkksem9Y9K
+ 2024-07-10 08:22:202024-07-10 08:22:20 enter str_dalaoaddress= EAoA2uFxyxFXXtXGnmj9AUuZM3gZK3nPVeH2hi7oc3B12024-07-10 08:22:20 enter str_dalaoaddress= 4KLagbRcs2qaE5SK2srHcf4eENZ1y5jh3imUKXAorCw72024-07-10 08:22:20 
+8xz41Ek2vdsR42WUk5z1mPBTsmTg1crkjbm5Ub9DhbjP success remainder_len=242
+ CFR89scCo61vo56F8UQxmLiCmiJyWefEwVAUtq3B5Tic pre= 818 aft= 817
+
+2024-07-10 08:22:202024-07-10 08:22:202024-07-10 08:22:20 2024-07-10 08:22:20 enter str_dalaoaddress= HoqPsnhwxoDCHHuvX7W5JyaSXHWZce2xKHJBqA7MHPga
+enter str_dalaoaddress= J7mApWsHQmZ5FtFrBx6UtysPHT7c6p9rgbu7X1pv8Jxe
+8J6gYgHQXJp5uB7sveLWLQV9eFPzHQzY6RmYrh2StoZh success remainder_len=241
+2024-07-10 08:22:21 2024-07-10 08:22:212bgcMcLK1tREJQCcTHb2CeaBySmeEPM37QYnJTwwikY1 pre= 517 aft= 394  enter str_dalaoaddress= FXvw9QRdZqr268TqwtHMztukgWFLZ96deco8QYKyi9u4
+2024-07-10 08:22:21
+ enter str_dalaoaddress= B2Yzz5LqMPZiSMwxba39tVY4ZdYVgYX5rjNvywTG1ZXr
+2024-07-10 08:22:21 enter str_dalaoaddress= 3TCL9LQrhShkNW1mviWZGZGBEBqohPvSiCxJVFPTznWJ
+ hqHJgH7CiGZmtkGZTJwHw2zhxtKNN7oHPZvy4XTLQd1 pre= 1348 aft= 7612024-07-10 08:22:21
+2024-07-10 08:22:218vrwnPPSv12iKjVvEVKQb1fFvRa4DcnotA4RoVgraqRF success remainder_len=240
+  6TyTdn1y5ZtBwktQt2bZihff9gKwmgLMhdBaaf9MXJVf pre= 118 aft= 81
+2024-07-10 08:22:222024-07-10 08:22:22enter str_dalaoaddress= 7vEbaGSKeoYBMFq5guUzEoS43rYbbNQerJp2uhp8UpAh
+2024-07-10 08:22:22  2024-07-10 08:22:227BwHjUw3i2CRTNZiYGYo32r2wn4wEZF8TTUbSoLvMSSo success remainder_len=238
+  2024-07-10 08:22:22 enter str_dalaoaddress= 9zaqKfZg1d7N3tA2sLPMWo7emdu5CYEzKw3xBAwsKGsW2024-07-10 08:22:22 BpC3fASsiKT4q4oVnza8tPwjTCKPfqRhDKxc6TKfMXKN success remainder_len=239
+137whNrKQrFeTowL8zkn8sahGM1V4x8d6PVNxS4CebJQ success remainder_len=237
+2024-07-10 08:22:22enter str_dalaoaddress= E6WiYrZPW4CxLMbXmh2eGtSH2gyt4QQP3BVy9r6ufohH2024-07-10 08:22:22
+ enter str_dalaoaddress= 6UJEhkKwoDRVbCcNf3Rs5xhM1EZCsSzEtfw1Hhoon9F9
+2024-07-10 08:22:232024-07-10 08:22:23 enter str_dalaoaddress= ERdq2FHNuemT1AAHoqwWcjbsN7SMhsYt2zwQmUi2hxCq
+ 2024-07-10 08:22:23
+FXvw9QRdZqr268TqwtHMztukgWFLZ96deco8QYKyi9u4 success remainder_len=236
+enter str_dalaoaddress= DD5X8fzbdM1jhLDRg4J16jASmRgieAJhPUEksVrr1csL
+  2024-07-10 08:22:23enter str_dalaoaddress= 4SxJCWNygttSkjq7JCkkW7QMPMhiYzoVPh153WzSTd9venter str_dalaoaddress= Df4R1dVZLjFSW9qbPZfFyXZ1whNZrYrNfZ95UvSdYHxw2024-07-10 08:22:23
+ 2024-07-10 08:22:23enter str_dalaoaddress= 3R47dpawpKmYnXAczNSWSmACZdgSHkwCGrvkzM1JDSrC
+ enter str_dalaoaddress= 6BQTsUaU5GEFCKaAbMbCZHzZXBEURDZ9b4KV4c6x3pnA
+2024-07-10 08:22:24 2024-07-10 08:22:24 
+ 2024-07-10 08:22:24 enter str_dalaoaddress= GN9oaCcbfVLSaF2KFXiXzMezF4fH73kzyA8yMnPQtcUH
+3TCL9LQrhShkNW1mviWZGZGBEBqohPvSiCxJVFPTznWJ success remainder_len=234
+2024-07-10 08:22:24 56MmFK3tzurx7CYuHtUPDbwzQNWML4Tdqe4D8HWwNstR success remainder_len=235
+9qdq5dERP6frhvZgdZ26WvsEXkqDvxYf27uvYu9W66jq success remainder_len=233
+2024-07-10 08:22:24 2024-07-10 08:22:242024-07-10 08:22:24 DD5X8fzbdM1jhLDRg4J16jASmRgieAJhPUEksVrr1csL success remainder_len=232
+enter str_dalaoaddress= FguX3PEUzdj6oJoidQERwjY1NBxHGbdYyHzknTTL4eQX
+enter str_dalaoaddress= 7rhkaHcUorHJSf8kRj2o3nDyhCG9PMEQSg7VGamQ1YSF2024-07-10 08:22:25
+2024-07-10 08:22:25 2024-07-10 08:22:252024-07-10 08:22:25  2024-07-10 08:22:25 F29cTM8g7sZ1murE5Eo1iVmpaJcvCQGM4PUEAi3Sp1Uh success remainder_len=231
+ enter str_dalaoaddress= EepYGi55YNeAhC1YMztweRrzYjvmConx6x8tgriEnaoEE379GSqozCknZZQZa5D5j8FrgTDzbeFrJdpjxnM9NS9d pre= 927 aft= 923enter str_dalaoaddress= 6Fi8koHrFNhUUiicFyAeArKr12uFxDFmFwiUBQ9JZuTw
+2024-07-10 08:22:25 enter str_dalaoaddress= JB1PZMNpXkFgj2kxyA43z8Ry4um5Ap6u7z2gn5EEZr5h
+ enter str_dalaoaddress= 5R1KSEz7MkPhioqaSNrLSBBAVsAaMvyyCRp737iCbYSx
+2024-07-10 08:22:25
+
+7vEbaGSKeoYBMFq5guUzEoS43rYbbNQerJp2uhp8UpAh success remainder_len=230
+ enter str_dalaoaddress= D1m5v4aDLcW6BMJYmhryw4YGTHVgwL77TSUSvnytK5Y2
+2024-07-10 08:22:26 2024-07-10 08:22:26enter str_dalaoaddress= CZLvqmCTVGXn3FvtS8ehWqZQM8LBtNwSkdq9Hwccd6NA
+2024-07-10 08:22:262024-07-10 08:22:26  CwCDojBiGrEiSnVFfE2yqxVq9eviDDMm2hGHek5okWvp success remainder_len=229
+ 8JWggJCnVdBJjP83JvTySHQY3Zio7gWZanmnUfhTyF9z pre= 318 aft= 263enter str_dalaoaddress= 3qoYbTW8dKFDBFv76NdgdFWpo2qFCApzcg9w8AHTDAJ1
+2024-07-10 08:22:272024-07-10 08:22:27
+ 2024-07-10 08:22:27sjZ4SB46dfVrx9JsbyU6e2zCRkh5b1tYv84qihLoKky pre= 476 aft= 460
+ 2024-07-10 08:22:27 6TyTdn1y5ZtBwktQt2bZihff9gKwmgLMhdBaaf9MXJVf success remainder_len=227
+ 2024-07-10 08:22:27 EKCMvweXWRPYFP4Bwa2HPmEtFZDZAJRg8rrPSPJgPsN5 success remainder_len=228
+enter str_dalaoaddress= 3yZqcQyKChk4Tu5FFTbi1CRs48WiVPju7HYs9jE234Uj2024-07-10 08:22:272024-07-10 08:22:27
+ 2024-07-10 08:22:272024-07-10 08:22:28enter str_dalaoaddress= 3eY9waL3hBdZmjR231AnAkBc98oomxtqCsSjZbKJtZGf 2024-07-10 08:22:28 
+  enter str_dalaoaddress= HfpdVRhXXmkQnpwhwqFUh6u7axAjLg7AvAnuMcgkV2Hk
+32cZ3JoDm2r4jyfBgAs6ECKF2GA1v6ogBnuaWwPHCbf5 pre= 397 aft= 214ZP8hv7BS7GhwtD8KdAxuofEQWoEWyTmZA79eTkeSGh4 success remainder_len=226
+3QKha9egjzzeZiPNgwXq5HMRHe1XacDdgEnEABMjnPFS success remainder_len=225
+
+enter str_dalaoaddress= H4axUbkbRmFDmFnxG1Y1221GPd4qnuct75MBUxdMVTiV2024-07-10 08:22:282024-07-10 08:22:28 2024-07-10 08:22:29enter str_dalaoaddress= AGseT8871WpBEi6QKLkVUo8VS34M6XnwxhvwCpT435he2024-07-10 08:22:29 2024-07-10 08:22:29enter str_dalaoaddress= 7LgLC6jp2xkZKJcLz982qASnX5U6p8r1J2x94oNz4vBK
+
+   2024-07-10 08:22:29C96RaPJwm6jc3yUTA6JrnPRsRTzVHgVkXxFFk3ShZdLm success remainder_len=224
+FijT78YGmoH3kaziymMYCDhdwA8g7xqdkg254qtkBKik success remainder_len=223
+2024-07-10 08:22:29enter str_dalaoaddress= HnAzCZWjXW7NrPCc8RU4aE7jCbKwaLULKe53RhNe9LW3 2024-07-10 08:22:30
+2024-07-10 08:22:30  DHCJpUcyzioMGsELqdonFYNsgQ2Hs94wVB782bgYyjUg success remainder_len=222
+2024-07-10 08:22:30  2024-07-10 08:22:30enter str_dalaoaddress= 9rBSeNt51zbzSNp94WUuR1k4LJpoiiBzHXRqBRrSzcny 2024-07-10 08:22:30enter str_dalaoaddress= 6CYryfcdE9X2ZxKoysqbZ6ZX9wJ1VzvUEHtLx5fDYXo
+enter str_dalaoaddress= AU5tDrTMAsDu76oKjXLNrzH2C14gfki3tfP6G61sqhDTenter str_dalaoaddress= 44TD7uQrK93iSFwLmWzGaovhZn4Ao4jnqNoNqLkHSYdn
+
+2024-07-10 08:22:30 enter str_dalaoaddress= 4jttec6ZEwGv5mddTkpFBNDtuNTjDgXEC2etkVDEMwnX
+enter str_dalaoaddress= 5D22RmLmYmFtFFXF52BnvnWUpUFmhse4RRhSrq3G6yN4
+ 
+
+2024-07-10 08:22:313yZqcQyKChk4Tu5FFTbi1CRs48WiVPju7HYs9jE234Uj success remainder_len=221
+2024-07-10 08:22:31 enter str_dalaoaddress= 8mrwtqnvAr9ynkknTQsE3aXmkw2Hz2B3LQBsk3nQmrjL 4SxJCWNygttSkjq7JCkkW7QMPMhiYzoVPh153WzSTd9v success remainder_len=220
+2024-07-10 08:22:32
+2024-07-10 08:22:32  5R1KSEz7MkPhioqaSNrLSBBAVsAaMvyyCRp737iCbYSx pre= 128 aft= 67
+DoJDW76kV4WH5Tiib32D9jyKQKbfhpzF6P4w2yueCwAD success remainder_len=219
+2024-07-10 08:22:32 2024-07-10 08:22:33enter str_dalaoaddress= Fd86iFWiaracVAPLj17dV3GZY9UVgNqEUPKfRkgUTrtN
+ 2024-07-10 08:22:33HnAzCZWjXW7NrPCc8RU4aE7jCbKwaLULKe53RhNe9LW3 success remainder_len=218
+2024-07-10 08:22:33 2024-07-10 08:22:33 DcRAk2KT6pKf631AkdCVC3pe4mdHHrw3NDnEPk8zUWzy success remainder_len=217
+CvptpjX1NeDLqpPMvkpSmXPHx4kS89KShRB2HxVTtHQW success remainder_len=216
+ enter str_dalaoaddress= CXQdGoLo9QnTwC1tr96HcQxZgw4gPrLZo9MpEKvAhXM6
+2024-07-10 08:22:352024-07-10 08:22:35 enter str_dalaoaddress= 3W7AKDzLZE3U7k4RPVPviA1qQxvtEppK1rrL57fx2rU12024-07-10 08:22:35 2024-07-10 08:22:35 6ohVbJ7C4pEVCkkHBdHQmpP34knxPgbR1oqd4ybvQ6D8 success remainder_len=215
+D5ena4B5y3nZUXQs893qNJqn95Yx3oa8u22fHT1eCapB pre= 883 aft= 859
+
+ 2024-07-10 08:22:35enter str_dalaoaddress= HH3poyfaRco4v1UXFzCwTkmpkMQgZKjqHKUD7GWDTF2U enter str_dalaoaddress= FXxvCs21WfrNwTieRJX1tH1WtEZ3QzdJ5siz6wDVpVNk2024-07-10 08:22:35
+ EAoA2uFxyxFXXtXGnmj9AUuZM3gZK3nPVeH2hi7oc3B1 success remainder_len=214
+2024-07-10 08:22:36 enter str_dalaoaddress= BerYpeK3WMowgPX5p8bNMgP4yRDxDeudmB2VYcWSqpET
+
+2024-07-10 08:22:37 enter str_dalaoaddress= ZvvjVcHjji945BL7hJzgphVuZ3PEJfVuNwFLHFqYSbE2024-07-10 08:22:37
+ enter str_dalaoaddress= DFjjrhbVMUcVHTFPTQdwVFdEkv3tMXPo1bc5v17xHE9s
+2024-07-10 08:22:372024-07-10 08:22:37 BerYpeK3WMowgPX5p8bNMgP4yRDxDeudmB2VYcWSqpET pre= 60 aft= 72024-07-10 08:22:372024-07-10 08:22:37 9xuAXPdoTzNvqp5iEcN9CPRh23bDUE7tMykRJcdnzAuD success remainder_len=211
+ 
+B2Yzz5LqMPZiSMwxba39tVY4ZdYVgYX5rjNvywTG1ZXr success remainder_len=213
+2024-07-10 08:22:38  5R1KSEz7MkPhioqaSNrLSBBAVsAaMvyyCRp737iCbYSx success remainder_len=212
+enter str_dalaoaddress= DadBSqDuoQHPkaxXP8PHbWvf1fZ2Q1KGwnGM61zj2huC
+2024-07-10 08:22:38 enter str_dalaoaddress= BuhhRuQ5qBdjy61ynYqyuZ7UH5hiAoWeZJGYCVLSGGDZ
+2024-07-10 08:22:38 enter str_dalaoaddress= TSJk4dcfTDoVFfgzDmWM7uvriRkgsC6EYXW6oJJ78vS2024-07-10 08:22:39 enter str_dalaoaddress= 3jMNgPFG4wrfVmGqmBe3URHuuduqU7fTZbJRyedkXFR7
+2024-07-10 08:22:39 enter str_dalaoaddress= 4Q6Dg6hqgpkUDaN7jqTFp6QsaumrEs4MLNFrXGkPQ4Uy
+
+2024-07-10 08:22:39 2024-07-10 08:22:39 BmhEn4SYAESA1gYH3Txf6DqJgMbtKxHPV7WWdJzEQAvW success remainder_len=210
+2024-07-10 08:22:392024-07-10 08:22:402024-07-10 08:22:40 enter str_dalaoaddress= GwGnAhds8SQCx5erQUFAmFJv7ZZKs7J3MBWqeNYWCP96enter str_dalaoaddress= Ao8CisnipDZ1Gb4QoZPUgkJdTQvDdoZqjPPgaAmnQrvB2024-07-10 08:22:40
+ BerYpeK3WMowgPX5p8bNMgP4yRDxDeudmB2VYcWSqpET success remainder_len=209
+ 2024-07-10 08:22:40 2024-07-10 08:22:40 3eY9waL3hBdZmjR231AnAkBc98oomxtqCsSjZbKJtZGf pre= 426 aft= 374enter str_dalaoaddress= 8RrRXd4G1jhXhYVtRt3LboDRB3JfGzTzeX2VWQYDKNiQ
+2024-07-10 08:22:40 
+9rE5Wp6j9CPu7fVzJ9PsT18Jy5Hdn6MFTPgrBb2x2Aup success remainder_len=208
+2024-07-10 08:22:40enter str_dalaoaddress= BvQSVGLMq8YaAXJLoeMxpXn9LQVAX9cRbsPrgYpFEKS5 enter str_dalaoaddress= CciktRE6WvMzaAqTLkwr89ViWhmNc26uzmD83G1cjZBF2024-07-10 08:22:40
+ 
+
+DadBSqDuoQHPkaxXP8PHbWvf1fZ2Q1KGwnGM61zj2huC pre= 53 aft= 442024-07-10 08:22:41
+ enter str_dalaoaddress= 3odfMDcGfEGvM9gsQHxwaqctqEb86ituCpvKaQcgAQ8d 2024-07-10 08:22:41enter str_dalaoaddress= FATk52hRHc2na52PaUUbXQegY1EuM92dNXjyFRELf6x4
+
+2024-07-10 08:22:41 4jttec6ZEwGv5mddTkpFBNDtuNTjDgXEC2etkVDEMwnX success remainder_len=206
+2024-07-10 08:22:41  8XX8D8AL7jUoNnG2FQ9aZRPvevMgSUWjWPTkksem9Y9K success remainder_len=207
+2024-07-10 08:22:41 HfpdVRhXXmkQnpwhwqFUh6u7axAjLg7AvAnuMcgkV2Hk success remainder_len=205
+enter str_dalaoaddress= 2dCU7Vi7wbH8dHPzTZ6RrcfRLESg5QwENsDJgRRPrQ8K
+2024-07-10 08:22:412024-07-10 08:22:41 DVPZSCD8wqHyaGK3482EiAhqzVNYaBMgdBYtVhLdNyfH success remainder_len=204
+2024-07-10 08:22:422024-07-10 08:22:42 2024-07-10 08:22:422024-07-10 08:22:422024-07-10 08:22:422024-07-10 08:22:42  CXQdGoLo9QnTwC1tr96HcQxZgw4gPrLZo9MpEKvAhXM6 pre= 378 aft= 246
+2024-07-10 08:22:42enter str_dalaoaddress= FSrdXhRnstrWZug9F43Uv5zDCcgEJTXYRPixXd6jyGDU EepYGi55YNeAhC1YMztweRrzYjvmConx6x8tgriEnaoE success remainder_len=202
+ enter str_dalaoaddress= 2HBW8AukWxcXaWdNYo1gCTQsKrMguu3DsPRmR3d4teSS  FXxvCs21WfrNwTieRJX1tH1WtEZ3QzdJ5siz6wDVpVNk pre= 195 aft= 183
+
+2024-07-10 08:22:42 
+7jw834gPVnHeypTryDzb6Z3YTzhWSx2eSz7Bi6BkL4dz success remainder_len=203
+2bgcMcLK1tREJQCcTHb2CeaBySmeEPM37QYnJTwwikY1 success remainder_len=201
+2024-07-10 08:22:42 enter str_dalaoaddress= 9dyCPdtmWNF242YwCckkRy5RLu1mXtynagkhmDPvrd68
+ 4KLagbRcs2qaE5SK2srHcf4eENZ1y5jh3imUKXAorCw7 pre= 634 aft= 630
+2024-07-10 08:22:424hDN7RAenPmKKHZnDukRgzPDEbJXWTGU7c2Uv5tKSfMT success remainder_len=200
+2024-07-10 08:22:43 2024-07-10 08:22:43 enter str_dalaoaddress= 8vXoLvbRw2ZdgyWvK4UNnMR4W5Lc7JKZFAeKPavEh96
+6ANioLqoBiJmefswnXxpAH89CYSjCMYAC6bMYP8rLGX1 success remainder_len=199
+2024-07-10 08:22:432024-07-10 08:22:43  2024-07-10 08:22:43  32cZ3JoDm2r4jyfBgAs6ECKF2GA1v6ogBnuaWwPHCbf5 success remainder_len=197
+enter str_dalaoaddress= EBXatXH1KXAQdennAp76BrRXGs1UncQosk8gcsBv9nwB
+BMr77C8exnf9Q1jBMwsV8gbioqqNS3QQCkASH3btnbWx success remainder_len=198
+2024-07-10 08:22:43enter str_dalaoaddress= ErQQ2kqDfEjPTiaakaPuFy79xi38jCc3Knuu7F3xsvy3
+2024-07-10 08:22:44 2024-07-10 08:22:44enter str_dalaoaddress= 3tbqqGHpwy1W3Edb7zY72dL96ENmVt3NsQB2tAr1b1dg
+2024-07-10 08:22:44 8JWggJCnVdBJjP83JvTySHQY3Zio7gWZanmnUfhTyF9z success remainder_len=196
+2024-07-10 08:22:44 2024-07-10 08:22:442024-07-10 08:22:44   enter str_dalaoaddress= AWZjSsWeSKLTzbttC6qbpinmzvpVYD6vLGMvsCNiTibS enter str_dalaoaddress= D6fBZo7LFRct1JW9iEdf32JAab77Whmt4nbqnmbaxM97
+enter str_dalaoaddress= 23uMsbsXkEgfFnwebRRJzzMhMPPVRSXJQ9J9hZSssi3mDadBSqDuoQHPkaxXP8PHbWvf1fZ2Q1KGwnGM61zj2huC success remainder_len=195
+enter str_dalaoaddress= 5UyMPxW127T5XVVhz6uP7R6KqQiUCqcDkHDkpXFuHW2w
+
+
+2024-07-10 08:22:46 4cdhkfmswFbBqzJptRRKHNWQqZEvTC7bSYTNgFbkCo1v success remainder_len=194
+2024-07-10 08:22:46 JB1PZMNpXkFgj2kxyA43z8Ry4um5Ap6u7z2gn5EEZr5h pre= 633 aft= 626
+2024-07-10 08:22:47 HhMqYTYyjabHAhGXqgyHspkfTyXoKRsCtpEoQm41reLy success remainder_len=193
+2024-07-10 08:22:48 593NVnzXAveWxC2FVN7TRthZnAqfAwTQsQu3jthuTYog success remainder_len=192
+2024-07-10 08:22:48 sjZ4SB46dfVrx9JsbyU6e2zCRkh5b1tYv84qihLoKky success remainder_len=191
+2024-07-10 08:22:49 2024-07-10 08:22:49 CPsCsVWhkRu8FxFbvpThCYZR2PPvFjuJ78RajGCHAjzN success remainder_len=190
+7XJs14JR9R4P1epxYZo2v2CMwkkveubVmR8KvMLgHGAb success remainder_len=189
+2024-07-10 08:22:50 2024-07-10 08:22:50 EEkVVvKk5Tp6GAjiVpRk5yT34aYekUqZutSDbm733dcF success remainder_len=187
+9eUw1dqESPQxeFUm1kJh2WSY8mA1CszAREJRxxPjNGrd success remainder_len=188
+2024-07-10 08:22:51 J1YpUnsC85hUPaA6yJVsTPcVfnBA6Y51iaJ9J3faTBMX pre= 1083 aft= 1078
+2024-07-10 08:22:522024-07-10 08:22:52 2024-07-10 08:22:52  2024-07-10 08:22:53 3jMNgPFG4wrfVmGqmBe3URHuuduqU7fTZbJRyedkXFR7 success remainder_len=184
+2024-07-10 08:22:53CrTU5929Vnk4sb7Cyfyo1M63JvzgSpFPm58JSyajDbd8 success remainder_len=186
+ GwGnAhds8SQCx5erQUFAmFJv7ZZKs7J3MBWqeNYWCP96 success remainder_len=183
+2024-07-10 08:22:538RrRXd4G1jhXhYVtRt3LboDRB3JfGzTzeX2VWQYDKNiQ pre= 429 aft= 427
+2024-07-10 08:22:534qfdzdz19q5kWuo2hNAZyQ7krVM4wFSAEzjK1JrWrMwD success remainder_len=185
+ GUgfpxERCM6wdBBA77ddWfVKD5spyC4WgC4LRsrBnRXE success remainder_len=181
+2024-07-10 08:22:54 2024-07-10 08:22:548vXoLvbRw2ZdgyWvK4UNnMR4W5Lc7JKZFAeKPavEh96 success remainder_len=180
+ 5D22RmLmYmFtFFXF52BnvnWUpUFmhse4RRhSrq3G6yN4 success remainder_len=182
+ EShhzFptmzfQMDaRSjS2xo1gG5qG6Ai9P3Jpj7eHHyv5 success remainder_len=179
+2024-07-10 08:22:542024-07-10 08:22:54 9sgh5mkpVhtiU6HzRKPDimYwTRX8eWoRE1isrgHARnbx pre= 1460 aft= 923
+2024-07-10 08:22:552024-07-10 08:22:55 2024-07-10 08:22:55  23uMsbsXkEgfFnwebRRJzzMhMPPVRSXJQ9J9hZSssi3m pre= 240 aft= 218 2024-07-10 08:22:55 8DdhgxW2EUYS2ReTjqEZbn3Lcd8Y98rWb83r1DLRh6eC success remainder_len=177
+FXxvCs21WfrNwTieRJX1tH1WtEZ3QzdJ5siz6wDVpVNk success remainder_len=178
+
+2024-07-10 08:22:55GFbQeBnjTs7q6DaEsAS7eNZyU3LL1aekaCuXnee5QgRJ pre= 1155 aft= 10542024-07-10 08:22:559zaqKfZg1d7N3tA2sLPMWo7emdu5CYEzKw3xBAwsKGsW success remainder_len=176
+ CXQdGoLo9QnTwC1tr96HcQxZgw4gPrLZo9MpEKvAhXM6 success remainder_len=175
+2024-07-10 08:22:55 
+vnnmZ4RmrPBcVgRLamtGsZdmj5wRuFY8yvbuS7fm6wU success remainder_len=174
+2024-07-10 08:22:55 2024-07-10 08:22:55 2024-07-10 08:22:55FATk52hRHc2na52PaUUbXQegY1EuM92dNXjyFRELf6x4 pre= 463 aft= 4519NZCt4VtnyuZCRtKSd31XoifVmbhERFQXmJ8fi5G6wP4 success remainder_len=173
+ FguX3PEUzdj6oJoidQERwjY1NBxHGbdYyHzknTTL4eQX pre= 1034 aft= 668
+2024-07-10 08:22:56 2024-07-10 08:22:56J5smpruhLFadnin6ZNXvAhD6Q3qmbopedx8jhwxz3Kja pre= 2252 aft= 2046 75FU9rhGUtL7pgqmMEQMJp9ouZKHWbroZrgknP5L88SS success remainder_len=172
+
+
+ EC2KJEc1mbsmDYYAfLeA1CYS3egFwYw7UmA7s46nLnMB success remainder_len=171
+2024-07-10 08:22:572024-07-10 08:22:57  E6WiYrZPW4CxLMbXmh2eGtSH2gyt4QQP3BVy9r6ufohH success remainder_len=169
+H4axUbkbRmFDmFnxG1Y1221GPd4qnuct75MBUxdMVTiV success remainder_len=170
+2024-07-10 08:22:59 3tbqqGHpwy1W3Edb7zY72dL96ENmVt3NsQB2tAr1b1dg success remainder_len=168
+2024-07-10 08:22:59 FSrdXhRnstrWZug9F43Uv5zDCcgEJTXYRPixXd6jyGDU pre= 661 aft= 592
+2024-07-10 08:23:002024-07-10 08:23:002024-07-10 08:23:00  hqHJgH7CiGZmtkGZTJwHw2zhxtKNN7oHPZvy4XTLQd1 success remainder_len=166
+eSb2nzsLA1xG9RkwqNzqyfUrRfHYpZGUBpqiWSqwxDy pre= 1743 aft= 1528
+2024-07-10 08:23:00 4T34XEQJLzVXuecTnzqxvm31si8N9YTFbT9QCYb84ey4 success remainder_len=165
+ Fd86iFWiaracVAPLj17dV3GZY9UVgNqEUPKfRkgUTrtN success remainder_len=167
+2024-07-10 08:23:012024-07-10 08:23:01 2024-07-10 08:23:01 JED9gEbMzhAsKHt65DjrDJ3epWCnoDiZPyn3YhQkqC38 success remainder_len=164
+ 2HBW8AukWxcXaWdNYo1gCTQsKrMguu3DsPRmR3d4teSS pre= 663 aft= 6484Q6Dg6hqgpkUDaN7jqTFp6QsaumrEs4MLNFrXGkPQ4Uy pre= 856 aft= 620
+2024-07-10 08:23:01 6gwyMiXv3tzSF4AT2qUfJCeAHrBj8Y9zqba59yC8ZTVw success remainder_len=163
+
+2024-07-10 08:23:02 3eY9waL3hBdZmjR231AnAkBc98oomxtqCsSjZbKJtZGf success remainder_len=162
+2024-07-10 08:23:032024-07-10 08:23:03 AGseT8871WpBEi6QKLkVUo8VS34M6XnwxhvwCpT435he success remainder_len=161
+ 2024-07-10 08:23:03 E379GSqozCknZZQZa5D5j8FrgTDzbeFrJdpjxnM9NS9d success remainder_len=160
+CciktRE6WvMzaAqTLkwr89ViWhmNc26uzmD83G1cjZBF pre= 1012 aft= 703
+2024-07-10 08:23:04 DSKLqHEzMcvsSSNG7XobjbtKZV25kFn94ryYTRhRx8Zk success remainder_len=159
+2024-07-10 08:23:042024-07-10 08:23:052024-07-10 08:23:05   ERdq2FHNuemT1AAHoqwWcjbsN7SMhsYt2zwQmUi2hxCq success remainder_len=157
+6BQTsUaU5GEFCKaAbMbCZHzZXBEURDZ9b4KV4c6x3pnA success remainder_len=158
+2024-07-10 08:23:05 GKEmaVnyEHQggxsRd93wPzTjgDpmUGe3cmR2CQ7YMYMo success remainder_len=155
+23uMsbsXkEgfFnwebRRJzzMhMPPVRSXJQ9J9hZSssi3m success remainder_len=156
+2024-07-10 08:23:06 Df4R1dVZLjFSW9qbPZfFyXZ1whNZrYrNfZ95UvSdYHxw success remainder_len=154
+2024-07-10 08:23:06 8RrRXd4G1jhXhYVtRt3LboDRB3JfGzTzeX2VWQYDKNiQ success remainder_len=153
+2024-07-10 08:23:07 HoqPsnhwxoDCHHuvX7W5JyaSXHWZce2xKHJBqA7MHPga success remainder_len=152
+2024-07-10 08:23:072024-07-10 08:23:07 6UJEhkKwoDRVbCcNf3Rs5xhM1EZCsSzEtfw1Hhoon9F9 success remainder_len=151
+2024-07-10 08:23:08  2024-07-10 08:23:08 92iS2625agVhUDHhrigjgNKyh6maUE5Gg8Pfw1docGEG success remainder_len=148
+2024-07-10 08:23:08 6Fi8koHrFNhUUiicFyAeArKr12uFxDFmFwiUBQ9JZuTw success remainder_len=149
+ZvvjVcHjji945BL7hJzgphVuZ3PEJfVuNwFLHFqYSbE success remainder_len=150
+CKid3aN6yQyF5jVQJteBU7xkWmftCmFvGTPsv7q6g12z success remainder_len=147
+2024-07-10 08:23:08 2024-07-10 08:23:082024-07-10 08:23:08  FwoDrTiAWZx4tf9oqwAjYjftq2g267iGRqEvHqdtrWJi success remainder_len=146
+EBXatXH1KXAQdennAp76BrRXGs1UncQosk8gcsBv9nwB success remainder_len=145
+FvYmth6RSdYYQ4mtEsSTZfUhcGnpHxgbo5kGEBYpbyB6 success remainder_len=144
+2024-07-10 08:23:09 2024-07-10 08:23:09ErQQ2kqDfEjPTiaakaPuFy79xi38jCc3Knuu7F3xsvy3 success remainder_len=143
+ 3qoYbTW8dKFDBFv76NdgdFWpo2qFCApzcg9w8AHTDAJ1 success remainder_len=142
+2024-07-10 08:23:09 D5ena4B5y3nZUXQs893qNJqn95Yx3oa8u22fHT1eCapB success remainder_len=141
+2024-07-10 08:23:09 TSJk4dcfTDoVFfgzDmWM7uvriRkgsC6EYXW6oJJ78vS success remainder_len=140
+2024-07-10 08:23:09 Ao8CisnipDZ1Gb4QoZPUgkJdTQvDdoZqjPPgaAmnQrvB pre= 980 aft= 971
+2024-07-10 08:23:09 FATk52hRHc2na52PaUUbXQegY1EuM92dNXjyFRELf6x4 success remainder_len=139
+2024-07-10 08:23:09 2024-07-10 08:23:10 5bkdTWQhSR7BFY5UL8MQqoifnSonkiH8Av73y8i8aJFJ success remainder_len=138
+JB1PZMNpXkFgj2kxyA43z8Ry4um5Ap6u7z2gn5EEZr5h success remainder_len=137
+2024-07-10 08:23:102024-07-10 08:23:10  2024-07-10 08:23:10 9dyCPdtmWNF242YwCckkRy5RLu1mXtynagkhmDPvrd68 success remainder_len=134
+4KLagbRcs2qaE5SK2srHcf4eENZ1y5jh3imUKXAorCw7 success remainder_len=136
+CFR89scCo61vo56F8UQxmLiCmiJyWefEwVAUtq3B5Tic success remainder_len=135
+2024-07-10 08:23:10 DFjjrhbVMUcVHTFPTQdwVFdEkv3tMXPo1bc5v17xHE9s success remainder_len=133
+2024-07-10 08:23:10 6CYryfcdE9X2ZxKoysqbZ6ZX9wJ1VzvUEHtLx5fDYXo success remainder_len=132
+2024-07-10 08:23:11 8mrwtqnvAr9ynkknTQsE3aXmkw2Hz2B3LQBsk3nQmrjL success remainder_len=131
+2024-07-10 08:23:11 CZLvqmCTVGXn3FvtS8ehWqZQM8LBtNwSkdq9Hwccd6NA success remainder_len=130
+2024-07-10 08:23:122024-07-10 08:23:12 3R47dpawpKmYnXAczNSWSmACZdgSHkwCGrvkzM1JDSrC success remainder_len=129
+ AWZjSsWeSKLTzbttC6qbpinmzvpVYD6vLGMvsCNiTibS success remainder_len=128
+2024-07-10 08:23:13 67ESR5p8Azt1GbHCuBGxyR1aBXXaPzaa7qfbs5kpExxQ success remainder_len=127
+2024-07-10 08:23:13 FSrdXhRnstrWZug9F43Uv5zDCcgEJTXYRPixXd6jyGDU success remainder_len=126
+2024-07-10 08:23:14 D1m5v4aDLcW6BMJYmhryw4YGTHVgwL77TSUSvnytK5Y2 success remainder_len=125
+2024-07-10 08:23:142024-07-10 08:23:14 3W7AKDzLZE3U7k4RPVPviA1qQxvtEppK1rrL57fx2rU1 success remainder_len=124
+ FguX3PEUzdj6oJoidQERwjY1NBxHGbdYyHzknTTL4eQX success remainder_len=123
+2024-07-10 08:23:14 2024-07-10 08:23:14J7mApWsHQmZ5FtFrBx6UtysPHT7c6p9rgbu7X1pv8Jxe success remainder_len=122
+ BuhhRuQ5qBdjy61ynYqyuZ7UH5hiAoWeZJGYCVLSGGDZ success remainder_len=121
+2024-07-10 08:23:15 4Q6Dg6hqgpkUDaN7jqTFp6QsaumrEs4MLNFrXGkPQ4Uy success remainder_len=120
+2024-07-10 08:23:15 2HBW8AukWxcXaWdNYo1gCTQsKrMguu3DsPRmR3d4teSS success remainder_len=119
+2024-07-10 08:23:15 2024-07-10 08:23:157rhkaHcUorHJSf8kRj2o3nDyhCG9PMEQSg7VGamQ1YSF success remainder_len=118
+ 9sgh5mkpVhtiU6HzRKPDimYwTRX8eWoRE1isrgHARnbx success remainder_len=117
+2024-07-10 08:23:16 3odfMDcGfEGvM9gsQHxwaqctqEb86ituCpvKaQcgAQ8d success remainder_len=116
+2024-07-10 08:23:16 7LgLC6jp2xkZKJcLz982qASnX5U6p8r1J2x94oNz4vBK success remainder_len=115
+2024-07-10 08:23:16 2024-07-10 08:23:16 9rBSeNt51zbzSNp94WUuR1k4LJpoiiBzHXRqBRrSzcny success remainder_len=113
+CciktRE6WvMzaAqTLkwr89ViWhmNc26uzmD83G1cjZBF success remainder_len=114
+2024-07-10 08:23:16 2024-07-10 08:23:16GFbQeBnjTs7q6DaEsAS7eNZyU3LL1aekaCuXnee5QgRJ success remainder_len=112
+ 2024-07-10 08:23:16 D6fBZo7LFRct1JW9iEdf32JAab77Whmt4nbqnmbaxM97 success remainder_len=110
+J1YpUnsC85hUPaA6yJVsTPcVfnBA6Y51iaJ9J3faTBMX success remainder_len=111
+2024-07-10 08:23:17 2024-07-10 08:23:18 GN9oaCcbfVLSaF2KFXiXzMezF4fH73kzyA8yMnPQtcUH success remainder_len=109
+HH3poyfaRco4v1UXFzCwTkmpkMQgZKjqHKUD7GWDTF2U success remainder_len=108
+2024-07-10 08:23:18 2dCU7Vi7wbH8dHPzTZ6RrcfRLESg5QwENsDJgRRPrQ8K success remainder_len=107
+2024-07-10 08:23:19 44TD7uQrK93iSFwLmWzGaovhZn4Ao4jnqNoNqLkHSYdn success remainder_len=106
+2024-07-10 08:23:19 Ao8CisnipDZ1Gb4QoZPUgkJdTQvDdoZqjPPgaAmnQrvB success remainder_len=105
+2024-07-10 08:23:19 HJz4XsCQzAbt8JGVTTxBBSFpGivm7XT5VkPZrgD15mfL success remainder_len=104
+2024-07-10 08:23:19 5UyMPxW127T5XVVhz6uP7R6KqQiUCqcDkHDkpXFuHW2w success remainder_len=103
+2024-07-10 08:23:19 7X6DA7mNLsVVN2s3Ez1NZSB93QKrSFDvtU11fH4PYKZT success remainder_len=102
+2024-07-10 08:23:19 eSb2nzsLA1xG9RkwqNzqyfUrRfHYpZGUBpqiWSqwxDy success remainder_len=101
+2024-07-10 08:23:20 J5smpruhLFadnin6ZNXvAhD6Q3qmbopedx8jhwxz3Kja success remainder_len=100
+2024-07-10 08:23:21 AU5tDrTMAsDu76oKjXLNrzH2C14gfki3tfP6G61sqhDT success remainder_len=99
+2024-07-10 08:23:21 F9g3TsKoyuPYxZAF8bLvQeM2Vg65Ftw7UNuseigmZ1AB success remainder_len=98
+2024-07-10 08:23:21 5erxVsb24bytwNWYv4QCUre3U8UR6QnTSRnTuEP6v4yC success remainder_len=97
+2024-07-10 08:23:21 BvQSVGLMq8YaAXJLoeMxpXn9LQVAX9cRbsPrgYpFEKS5 success remainder_len=96
+2024-07-10 08:23:21 CRAgP9HtVWkBNtngEy626jprCzK9jhxvagpj1ZyXS59Q success remainder_len=95
+2024-07-10 08:23:212024-07-10 08:23:21 enter str_dalaoaddress= CdmQMQKNGAks14f7GY3HxxTRUe6KkXX7xhowxGpkcQn4 2024-07-10 08:23:21
+ enter str_dalaoaddress= 6Eu5ms6QrQK2iRYsJHgXeyiYKawF7yT2N5DBhLjzYyRB
+2024-07-10 08:23:21 enter str_dalaoaddress= 85kpzQBdyaMy2F3zQomT5ywsUSQLGMku3j9jK24Wne3w2024-07-10 08:23:21enter str_dalaoaddress= AsQXYJPMnkygPWPgSozm8SvJZqtLSgFy84uYgMaLbfYR 
+2024-07-10 08:23:21 enter str_dalaoaddress= sU3GUBpAYZNrYuhqKdh24iYuFuNnBWQv7oEteNDXAWf2024-07-10 08:23:21
+
+enter str_dalaoaddress= 6mKvvWnzXwGq1Ap22uHaK3j1MkUzwgZxLCcgQYN4Rh13 enter str_dalaoaddress= AZsQxuDkXbmf8Eom4mqmZTWokEG37EpwNKFjFQNsQ3XV
+2024-07-10 08:23:21
+2024-07-10 08:23:21 enter str_dalaoaddress= C9kjSCU9iZq2M89RfZqkuZpPvRXi8nuew3aDq4JzRa4G
+2024-07-10 08:23:21  enter str_dalaoaddress= EXuVDJNqhWBHAwc2iefG4vW1GgJpejAqUvuRhUw4Nhog2024-07-10 08:23:21
+enter str_dalaoaddress= CRsgNuBuiKvMavq69NCdWu8FvBpS8srWq8RG2rNcSGpP 
+enter str_dalaoaddress= 14S4fRuvNACffP5aHs1t7C7AjtyZsckwZuTosQy5UUkE
+2024-07-10 08:23:21 2024-07-10 08:23:22enter str_dalaoaddress= C3dRLTBgYYQG1Q6czSqjmvgmyLL7upTede6pnzQnco3e 
+enter str_dalaoaddress= AShvBnVmKN1Vw1o4gJfPs2CrHuvqyjo6h4Tztri6fCcE
+2024-07-10 08:23:222024-07-10 08:23:22  enter str_dalaoaddress= 5PQLyou4EZqFP4Xn3AiZ6CagJtzRQ1E4VTGC3VTmNHznenter str_dalaoaddress= 6YncPWzRLER5oE1dDtRUFwxhrR2h1nwWutzHaDP23W3D2024-07-10 08:23:222024-07-10 08:23:22 
+
+enter str_dalaoaddress= GNvEdoh3KHMEJjZdzCRpP2muspSr4X3LRVRSrqiYcguZ sU3GUBpAYZNrYuhqKdh24iYuFuNnBWQv7oEteNDXAWf pre= 162 aft= 160
+
+2024-07-10 08:23:222024-07-10 08:23:22 enter str_dalaoaddress= DhEDyawZ9gZ6iy8Bhk8rq7TNxy2mbv6H8eSNtzk216vr2024-07-10 08:23:23 enter str_dalaoaddress= DVt6AePG23LfTv1VDppnGWWHQXEbpWW97PEJf4UgMAM
+2024-07-10 08:23:23 2024-07-10 08:23:232024-07-10 08:23:23
+2024-07-10 08:23:232024-07-10 08:23:23 enter str_dalaoaddress= Fyv7URhz8pzRY3uUoBYNkaMSg6ifimvcFNK8p4gvWhbR 2024-07-10 08:23:23enter str_dalaoaddress= 5anaQFiFY6GqWFaV6PnCjifRXzkvSrMpMz9CMSEi9Ccc 
+enter str_dalaoaddress= EejcWHh2ELTDkxKMmTJQ4VnyyYGdzLo91xMXzZNxAvbGenter str_dalaoaddress= B1wojkKqE7qtsXX8JP6PQERgdipJq6xpz8YGsdMsqK6n enter str_dalaoaddress= 98mi9itqKwaWdWPFGViAUQ6vZmB9ftphsZcVVCqPsqqT
+
+
+ 14S4fRuvNACffP5aHs1t7C7AjtyZsckwZuTosQy5UUkE pre= 247 aft= 732024-07-10 08:23:232024-07-10 08:23:23 enter str_dalaoaddress= Hemwik6AWf93dUpRYkkxyjn3WTGUnhsR6MYBvjzcadAN
+2024-07-10 08:23:232024-07-10 08:23:23
+2024-07-10 08:23:23 enter str_dalaoaddress= DcrLEjXccQD8zpKPspbMVg9pShzQzn1PKZ18Jbn8MxMH
+   2024-07-10 08:23:23 enter str_dalaoaddress= ApMLsE8WaLJwscY6t8vdwSMVUrnLdfkCv8uuKXJtQqZf
+
+2024-07-10 08:23:23enter str_dalaoaddress= 3zW6odCfkmDFtWGhWc2Kp5SEokfprh2gnqLar1wv1WnB2024-07-10 08:23:23
+ enter str_dalaoaddress= 2zhBbs127EnrkJWyc4U9DMuBxKnWLJfq4Hb8x1eskTfc2024-07-10 08:23:23 enter str_dalaoaddress= 5eoc5Neh5RFWCAK2SkGGKfCU5f4EXdFQxbNgZGD1fGYTenter str_dalaoaddress= FSaanR7cdbcypqhNsjFQTfXy2XNrzvsDDDCXdX2GSCXg
+
+ CdmQMQKNGAks14f7GY3HxxTRUe6KkXX7xhowxGpkcQn4 success remainder_len=94
+enter str_dalaoaddress= BaVfSvTBg97D57LoJGMUvCAJDiaBhZ1q4XUXNRsMoqDd2024-07-10 08:23:23  enter str_dalaoaddress= 7xbpY9oyFKTGqXTikXaEbKhaygX5hJzr6HQYtHKsUUFK
+2024-07-10 08:23:23
+
+2024-07-10 08:23:23 2024-07-10 08:23:23enter str_dalaoaddress= JCvxcZBr6HkgbjUkgdiKokghimXeyJiFejhgumdDJoHb
+  enter str_dalaoaddress= DTRtPCdKG9PDRMLDtbmnD8Xh9XRseKwpGESAEisqWGnenter str_dalaoaddress= 7LZVvquLpGbD4cNS7PXACTRaQCNWcRwQMVMMD6TSw9Pf
+
+2024-07-10 08:23:24 enter str_dalaoaddress= 4Q6rYzUsxVqjc253UX9UCz2EbbHXjgRKLzyjwsukfpPW
+2024-07-10 08:23:242024-07-10 08:23:24 enter str_dalaoaddress= 8VmbPAXwjXF5u28X6Bt7nSEefuoWrxUP2RSFhqvfuxUF enter str_dalaoaddress= HfX41teh3ps5o6TsmZoT7kpFbbpRtKHZHjUeV9Pty7Cx
+enter str_dalaoaddress= E8mFb4WhXVVT37C4fp7Vrmefw77PfDyr3N9APuCJCoAc
+2024-07-10 08:23:24 enter str_dalaoaddress= 4KnRuBPSkv6FHGWYsXFPzFX9V359Wcdjqu5nECAnz1xT2024-07-10 08:23:24
+ 2024-07-10 08:23:24 enter str_dalaoaddress= F5Xsvt6MKs9S78Ggiry7RnGfc3Gm9VMPes8o7w5hMzn7
+2024-07-10 08:23:24 enter str_dalaoaddress= 2jzezk7cHATn6zdYw2pmysaqYz9FqkJPv9NTpKwX1hAN
+
+enter str_dalaoaddress= 2jk8TQjBjABhRpJSm86rWvpxNU9yyWAwiHcKAEeQUiWL2024-07-10 08:23:24 
+2024-07-10 08:23:25 enter str_dalaoaddress= Hvts7WUNA9k72kkVt2YP6z1R85U3C637XqfCNoaYSy3Wenter str_dalaoaddress= CwCPoEr1S5Tpkv8L22iaaiNUHaUjFxALn5FsZUjjsNiS
+2024-07-10 08:23:252024-07-10 08:23:25 enter str_dalaoaddress= EgiHc8SqjNnAsaqB19c1yss9AnmgYjJmrPgypFVqBozG
+2024-07-10 08:23:252024-07-10 08:23:25   2zhBbs127EnrkJWyc4U9DMuBxKnWLJfq4Hb8x1eskTfc pre= 288 aft= 79
+2024-07-10 08:23:25 enter str_dalaoaddress= 4jtyoKwpogYzWiKnL8Yb7rL1jLyN66VL1b22CWCywPVGenter str_dalaoaddress= DXCYfW88qKwAiSUayBvLVF3XNaKB8WdGw2h4fF1pYtGz
+ApMLsE8WaLJwscY6t8vdwSMVUrnLdfkCv8uuKXJtQqZf pre= 175 aft= 133
+
+2024-07-10 08:23:25
+ enter str_dalaoaddress= DVRhcUFVRnD2g1WVLm8u2VdTMsHiQwDeELwHE7jSUfnT
+2024-07-10 08:23:262024-07-10 08:23:262024-07-10 08:23:26   enter str_dalaoaddress= B76awVT8Zgns3HutwC7R47KqWD7DiUxVh5Syo3riStsenter str_dalaoaddress= AvMQh4RWW5D592c4mTcpXpfysYwuWwJWacXZYN5wViXt
+2024-07-10 08:23:26
+enter str_dalaoaddress= Fk2zvtxbHxiDgdoZGeCwmXG6dN8QyjDFXTvUShopcJHU
+2024-07-10 08:23:262024-07-10 08:23:26  enter str_dalaoaddress= 7mXohCdQMEidWkvh8v2DD21ZeQ8hoiLtR9UgxXWBChgX
+14S4fRuvNACffP5aHs1t7C7AjtyZsckwZuTosQy5UUkE success remainder_len=93
+2024-07-10 08:23:272024-07-10 08:23:27 enter str_dalaoaddress= 9zVrCjJGqnXTSehtMY3cc15t6oVeu4CDpSvViZWYZUa enter str_dalaoaddress= 2h7s3FpSvc6v2oHke6Uqg191B5fPCeFTmMGnh5oPWhX72024-07-10 08:23:27 enter str_dalaoaddress= 2YsDS3SdNkq3Y4PaxdeYfds5PjLY4gQQMs82oMyYfBL4 2024-07-10 08:23:27
+ 
+enter str_dalaoaddress= 2gRf9QYcSNi7RSqpDAwG1VNkrvyqmPgA32dL15xKpzkE
+2024-07-10 08:23:27
+ enter str_dalaoaddress= FeC6eoUA1Y8frBcx1XuZgXerBj5d3CGNwvFVJFpbYEid
+2024-07-10 08:23:272024-07-10 08:23:272024-07-10 08:23:28  enter str_dalaoaddress= 7x5FgWwqboGYAms25eGkHCg7bPrusHArwhCy9kBQMy8z
+C9kjSCU9iZq2M89RfZqkuZpPvRXi8nuew3aDq4JzRa4G pre= 695 aft= 580enter str_dalaoaddress= w1GXiZ458rozCQZTog2x2qrkXKRQjEMWSiSjESx4Q6p
+ 2024-07-10 08:23:28 2024-07-10 08:23:28
+ enter str_dalaoaddress= 7v1zaVsjxqRFo35DvNLedZjKEG6g8STZW3J9xNKAniqH2024-07-10 08:23:28enter str_dalaoaddress= G7S6kqk8bKHTxkBENCPrNnzAtSPxGZrcDwrfcFKGQtrF
+enter str_dalaoaddress= HHTeEVGU3KUjXKkrbteRExFFjCiodJUxXY6amAUjLgUG
+
+ 2024-07-10 08:23:28EejcWHh2ELTDkxKMmTJQ4VnyyYGdzLo91xMXzZNxAvbG pre= 211 aft= 169
+ 6Eu5ms6QrQK2iRYsJHgXeyiYKawF7yT2N5DBhLjzYyRB success remainder_len=92
+2024-07-10 08:23:282024-07-10 08:23:28 2024-07-10 08:23:28sU3GUBpAYZNrYuhqKdh24iYuFuNnBWQv7oEteNDXAWf success remainder_len=91
+2024-07-10 08:23:28  enter str_dalaoaddress= GVeiGLyHes2LnonvapBxo7FG1aEZsRA4yxbMJLt3vZiB
+ 2024-07-10 08:23:28enter str_dalaoaddress= Bkwanva2jqFJqTS1K1LeJooUjYwoZnCGtJfkuVxGFp6w 
+2jk8TQjBjABhRpJSm86rWvpxNU9yyWAwiHcKAEeQUiWL success remainder_len=89
+2024-07-10 08:23:28 enter str_dalaoaddress= EaDkM3mgx4rrBnvqZamW1WzWpXUsYcKmrNeNbUvieZcg
+2024-07-10 08:23:28 enter str_dalaoaddress= GadvcGntfi2iEKQmXNrJudvT9EtNrMp9cR8jdQoWZzQ7
+2024-07-10 08:23:29 enter str_dalaoaddress= DVWfUJav7CzGqGs1NKc8zhJcjMKBtmheUyZC2i6YBCtr
+B1wojkKqE7qtsXX8JP6PQERgdipJq6xpz8YGsdMsqK6n success remainder_len=90
+2024-07-10 08:23:292024-07-10 08:23:29 enter str_dalaoaddress= 3WL72gqW4XbzWi5BNNjK6L47DVShU5dYKzGHvHnXQPpu
+2024-07-10 08:23:292024-07-10 08:23:29  enter str_dalaoaddress= 6GE854hDBW4dpD873GsfFAB5aiHaRnrULzGVs4MyC53c CRsgNuBuiKvMavq69NCdWu8FvBpS8srWq8RG2rNcSGpP pre= 1081 aft= 5702024-07-10 08:23:30 enter str_dalaoaddress= HF4qoQHabG5zZsf5hVEWV3pub9Nj94VFRgZVyEQNt2RK
+2024-07-10 08:23:30
+ enter str_dalaoaddress= HjojuU5gczPmUWrnsM6GNz9apFtoDsrFdDuoaMAGo4kX2024-07-10 08:23:30 enter str_dalaoaddress= 12ZZ6CaU1NTt5GwhDoSJ8XSKpmMQFL4UuvYYv2FoRLD3
+enter str_dalaoaddress= CJGc1RFrViUV7atc2vksLGvhGJePUkZcDj8gYCdogFGG
+2024-07-10 08:23:30 
+
+2024-07-10 08:23:302zhBbs127EnrkJWyc4U9DMuBxKnWLJfq4Hb8x1eskTfc success remainder_len=88
+ enter str_dalaoaddress= DekwpejAnJ4b93wU9kTxSKqdoVHCpoDymWPBww9eeqnm
+2024-07-10 08:23:302024-07-10 08:23:302024-07-10 08:23:312024-07-10 08:23:31   enter str_dalaoaddress= 8od7FZxojvXy7Zp9jwo2mWyshrV9MidREtx6i5wu1pvA2024-07-10 08:23:31 4Q6rYzUsxVqjc253UX9UCz2EbbHXjgRKLzyjwsukfpPW success remainder_len=86
+
+ ApMLsE8WaLJwscY6t8vdwSMVUrnLdfkCv8uuKXJtQqZf success remainder_len=87
+enter str_dalaoaddress= DUnugDGiaE2CgEfRfb97uLyKz8YV2knxXXjfPqQfi9ej2024-07-10 08:23:312024-07-10 08:23:31
+ enter str_dalaoaddress= 22x8Lthq4yM6AD6VwiYGo78UASpDJCq3KbKs55NeFtnZ7mXohCdQMEidWkvh8v2DD21ZeQ8hoiLtR9UgxXWBChgX success remainder_len=85
+2024-07-10 08:23:31
+2024-07-10 08:23:31 2024-07-10 08:23:322024-07-10 08:23:32  enter str_dalaoaddress= ASCUGaXce4dw8SFbfmk14ct4D17x9TwwhT7vovzJrcMUenter str_dalaoaddress= AgeUT38Y48m4ebZBFLhZVWnS8GnPL5NkUYjWsPpfde1a
+ enter str_dalaoaddress= 3SWGR9ZmJm7vkfCedQ7ppaLgTeWZivpjKVaXFndt6tb8
+
+ enter str_dalaoaddress= 8LZPjR1ZLsKiaF758F9vQASDDanFjz6JGfRmUxBnFwYrenter str_dalaoaddress= 8JMreBJW2NgYCUw4q25oAcSUwnJSz5fnNJkU1QeHtieD2024-07-10 08:23:32
+ enter str_dalaoaddress= BYQKaYipvXyaDhnAbHh9fuWpJUjB3doYpymz1zc9bAJC
+2024-07-10 08:23:32
+2024-07-10 08:23:322024-07-10 08:23:32  enter str_dalaoaddress= HvUjmTd5eDbPwxWzGwMM6UuWh7CJ9TBaAm3pSnBUBFEc
+ enter str_dalaoaddress= B83z3CARNkhQNYLMG2xPM3GhZm4kKReTWP7f9CtwLLXH
+enter str_dalaoaddress= GHsojPSbfyNqbFSLhJajU4GnNRdNAtgjn8BDFKBYNzYL2024-07-10 08:23:33 enter str_dalaoaddress= 7DXpcXFXquz2duSGdAARjN3iEiHdqySGP4h6KuYHx8fK
+
+2024-07-10 08:23:33 AvMQh4RWW5D592c4mTcpXpfysYwuWwJWacXZYN5wViXt pre= 471 aft= 3812024-07-10 08:23:33 
+enter str_dalaoaddress= 7hsWydxcfTYEyb12EfRwYsbZPnWEVxEdgwcbX3DupNM
+2024-07-10 08:23:342024-07-10 08:23:342024-07-10 08:23:342024-07-10 08:23:34 3SWGR9ZmJm7vkfCedQ7ppaLgTeWZivpjKVaXFndt6tb8 success remainder_len=83
+2024-07-10 08:23:34 w1GXiZ458rozCQZTog2x2qrkXKRQjEMWSiSjESx4Q6p success remainder_len=84
+ 22x8Lthq4yM6AD6VwiYGo78UASpDJCq3KbKs55NeFtnZ pre= 44 aft= 38 2024-07-10 08:23:34enter str_dalaoaddress= GXK2nQQLbsThLGctQJJcXNjmcygTg4h6rwptx43r8QZj enter str_dalaoaddress= 4Dq9VKSPVYeoSFeHrYBW58Do8Ntxfw7wdkMstVY6XoAj 8od7FZxojvXy7Zp9jwo2mWyshrV9MidREtx6i5wu1pvA pre= 138 aft= 88
+2024-07-10 08:23:34 
+DhEDyawZ9gZ6iy8Bhk8rq7TNxy2mbv6H8eSNtzk216vr success remainder_len=82
+
+
+2024-07-10 08:23:35 2024-07-10 08:23:352024-07-10 08:23:35 2024-07-10 08:23:352024-07-10 08:23:35enter str_dalaoaddress= 9GyS8aajDTSUMcVVzy3W7JeQMUzwvAWjUgL2ZhWWnQa1enter str_dalaoaddress= 4NAVrr9mEZ7FShN1QaTYtptpNDfJiP1CnKY7ZAaQ33fN enter str_dalaoaddress= Cft4hKtC3dVftfqmL2MCALpeCq7oWM7qpftNfVVUzA7h 
+ 2024-07-10 08:23:358JMreBJW2NgYCUw4q25oAcSUwnJSz5fnNJkU1QeHtieD success remainder_len=81
+ enter str_dalaoaddress= 7tE4jyagcP3AcFoL9RDe7V4sV41f9pJnMEQQ7EaTrJZ9DTRtPCdKG9PDRMLDtbmnD8Xh9XRseKwpGESAEisqWGn success remainder_len=80
+
+
+2024-07-10 08:23:36 6GE854hDBW4dpD873GsfFAB5aiHaRnrULzGVs4MyC53c pre= 220 aft= 201
+
+2024-07-10 08:23:362024-07-10 08:23:36  EejcWHh2ELTDkxKMmTJQ4VnyyYGdzLo91xMXzZNxAvbG success remainder_len=79
+DVWfUJav7CzGqGs1NKc8zhJcjMKBtmheUyZC2i6YBCtr success remainder_len=78
+2024-07-10 08:23:362024-07-10 08:23:37 GXK2nQQLbsThLGctQJJcXNjmcygTg4h6rwptx43r8QZj pre= 92 aft= 52 2024-07-10 08:23:372024-07-10 08:23:37ASCUGaXce4dw8SFbfmk14ct4D17x9TwwhT7vovzJrcMU pre= 174 aft= 122
+
+ 2024-07-10 08:23:37 HF4qoQHabG5zZsf5hVEWV3pub9Nj94VFRgZVyEQNt2RK pre= 176 aft= 167 2jzezk7cHATn6zdYw2pmysaqYz9FqkJPv9NTpKwX1hAN success remainder_len=76
+2024-07-10 08:23:37 7v1zaVsjxqRFo35DvNLedZjKEG6g8STZW3J9xNKAniqH success remainder_len=75
+2024-07-10 08:23:38B83z3CARNkhQNYLMG2xPM3GhZm4kKReTWP7f9CtwLLXH success remainder_len=77
+
+ 22x8Lthq4yM6AD6VwiYGo78UASpDJCq3KbKs55NeFtnZ success remainder_len=74
+2024-07-10 08:23:38 BYQKaYipvXyaDhnAbHh9fuWpJUjB3doYpymz1zc9bAJC pre= 198 aft= 153
+2024-07-10 08:23:38 2024-07-10 08:23:38G7S6kqk8bKHTxkBENCPrNnzAtSPxGZrcDwrfcFKGQtrF pre= 1438 aft= 183
+ 9zVrCjJGqnXTSehtMY3cc15t6oVeu4CDpSvViZWYZUa success remainder_len=73
+2024-07-10 08:23:382024-07-10 08:23:392024-07-10 08:23:39  GNvEdoh3KHMEJjZdzCRpP2muspSr4X3LRVRSrqiYcguZ success remainder_len=72
+8od7FZxojvXy7Zp9jwo2mWyshrV9MidREtx6i5wu1pvA success remainder_len=71
+ EgiHc8SqjNnAsaqB19c1yss9AnmgYjJmrPgypFVqBozG success remainder_len=70
+2024-07-10 08:23:39 12ZZ6CaU1NTt5GwhDoSJ8XSKpmMQFL4UuvYYv2FoRLD3 success remainder_len=69
+2024-07-10 08:23:402024-07-10 08:23:40 DUnugDGiaE2CgEfRfb97uLyKz8YV2knxXXjfPqQfi9ej success remainder_len=68
+ 2024-07-10 08:23:402024-07-10 08:23:40 GXK2nQQLbsThLGctQJJcXNjmcygTg4h6rwptx43r8QZj success remainder_len=67
+98mi9itqKwaWdWPFGViAUQ6vZmB9ftphsZcVVCqPsqqT success remainder_len=65
+ CwCPoEr1S5Tpkv8L22iaaiNUHaUjFxALn5FsZUjjsNiS success remainder_len=66
+2024-07-10 08:23:42 9GyS8aajDTSUMcVVzy3W7JeQMUzwvAWjUgL2ZhWWnQa1 success remainder_len=64
+2024-07-10 08:23:43 DXCYfW88qKwAiSUayBvLVF3XNaKB8WdGw2h4fF1pYtGz success remainder_len=63
+2024-07-10 08:23:43 Hemwik6AWf93dUpRYkkxyjn3WTGUnhsR6MYBvjzcadAN pre= 1121 aft= 1119
+2024-07-10 08:23:44 6GE854hDBW4dpD873GsfFAB5aiHaRnrULzGVs4MyC53c success remainder_len=62
+2024-07-10 08:23:44 ASCUGaXce4dw8SFbfmk14ct4D17x9TwwhT7vovzJrcMU success remainder_len=61
+2024-07-10 08:23:45 G7S6kqk8bKHTxkBENCPrNnzAtSPxGZrcDwrfcFKGQtrF success remainder_len=60
+2024-07-10 08:23:45 HF4qoQHabG5zZsf5hVEWV3pub9Nj94VFRgZVyEQNt2RK success remainder_len=59
+2024-07-10 08:23:46 2024-07-10 08:23:463WL72gqW4XbzWi5BNNjK6L47DVShU5dYKzGHvHnXQPpu pre= 913 aft= 586 7x5FgWwqboGYAms25eGkHCg7bPrusHArwhCy9kBQMy8z success remainder_len=58
+2024-07-10 08:23:46 BYQKaYipvXyaDhnAbHh9fuWpJUjB3doYpymz1zc9bAJC success remainder_len=57
+
+2024-07-10 08:23:462024-07-10 08:23:46 2h7s3FpSvc6v2oHke6Uqg191B5fPCeFTmMGnh5oPWhX7 success remainder_len=55
+2024-07-10 08:23:47 AgeUT38Y48m4ebZBFLhZVWnS8GnPL5NkUYjWsPpfde1a success remainder_len=54
+2024-07-10 08:23:47 7xbpY9oyFKTGqXTikXaEbKhaygX5hJzr6HQYtHKsUUFK success remainder_len=56
+2024-07-10 08:23:47  AvMQh4RWW5D592c4mTcpXpfysYwuWwJWacXZYN5wViXt success remainder_len=52
+HvUjmTd5eDbPwxWzGwMM6UuWh7CJ9TBaAm3pSnBUBFEc success remainder_len=53
+2024-07-10 08:23:47 F5Xsvt6MKs9S78Ggiry7RnGfc3Gm9VMPes8o7w5hMzn7 success remainder_len=51
+2024-07-10 08:23:482024-07-10 08:23:48 5anaQFiFY6GqWFaV6PnCjifRXzkvSrMpMz9CMSEi9Ccc pre= 961 aft= 960 2024-07-10 08:23:48
+ 5eoc5Neh5RFWCAK2SkGGKfCU5f4EXdFQxbNgZGD1fGYT success remainder_len=50
+2024-07-10 08:23:48 6mKvvWnzXwGq1Ap22uHaK3j1MkUzwgZxLCcgQYN4Rh13 success remainder_len=48
+2024-07-10 08:23:48DVt6AePG23LfTv1VDppnGWWHQXEbpWW97PEJf4UgMAM success remainder_len=49
+ BaVfSvTBg97D57LoJGMUvCAJDiaBhZ1q4XUXNRsMoqDd success remainder_len=47
+2024-07-10 08:23:49 Fk2zvtxbHxiDgdoZGeCwmXG6dN8QyjDFXTvUShopcJHU success remainder_len=46
+2024-07-10 08:23:49 FSaanR7cdbcypqhNsjFQTfXy2XNrzvsDDDCXdX2GSCXg success remainder_len=45
+2024-07-10 08:23:502024-07-10 08:23:50 CJGc1RFrViUV7atc2vksLGvhGJePUkZcDj8gYCdogFGG pre= 922 aft= 866
+2024-07-10 08:23:50 DVRhcUFVRnD2g1WVLm8u2VdTMsHiQwDeELwHE7jSUfnT success remainder_len=43
+ 2024-07-10 08:23:50 DekwpejAnJ4b93wU9kTxSKqdoVHCpoDymWPBww9eeqnm success remainder_len=44
+C9kjSCU9iZq2M89RfZqkuZpPvRXi8nuew3aDq4JzRa4G success remainder_len=42
+2024-07-10 08:23:50 5PQLyou4EZqFP4Xn3AiZ6CagJtzRQ1E4VTGC3VTmNHzn success remainder_len=41
+2024-07-10 08:23:51 2024-07-10 08:23:51 Bkwanva2jqFJqTS1K1LeJooUjYwoZnCGtJfkuVxGFp6w success remainder_len=40
+2024-07-10 08:23:51 DcrLEjXccQD8zpKPspbMVg9pShzQzn1PKZ18Jbn8MxMH success remainder_len=39
+7hsWydxcfTYEyb12EfRwYsbZPnWEVxEdgwcbX3DupNM success remainder_len=38
+2024-07-10 08:23:51 6YncPWzRLER5oE1dDtRUFwxhrR2h1nwWutzHaDP23W3D success remainder_len=37
+2024-07-10 08:23:512024-07-10 08:23:51  AZsQxuDkXbmf8Eom4mqmZTWokEG37EpwNKFjFQNsQ3XV success remainder_len=35
+8VmbPAXwjXF5u28X6Bt7nSEefuoWrxUP2RSFhqvfuxUF success remainder_len=36
+2024-07-10 08:23:51 GVeiGLyHes2LnonvapBxo7FG1aEZsRA4yxbMJLt3vZiB pre= 893 aft= 888
+2024-07-10 08:23:52 7LZVvquLpGbD4cNS7PXACTRaQCNWcRwQMVMMD6TSw9Pf success remainder_len=34
+2024-07-10 08:23:52 CRsgNuBuiKvMavq69NCdWu8FvBpS8srWq8RG2rNcSGpP success remainder_len=33
+2024-07-10 08:23:522024-07-10 08:23:52 4KnRuBPSkv6FHGWYsXFPzFX9V359Wcdjqu5nECAnz1xT success remainder_len=32
+2024-07-10 08:23:53 EaDkM3mgx4rrBnvqZamW1WzWpXUsYcKmrNeNbUvieZcg success remainder_len=30
+ HfX41teh3ps5o6TsmZoT7kpFbbpRtKHZHjUeV9Pty7Cx success remainder_len=31
+2024-07-10 08:23:53 EXuVDJNqhWBHAwc2iefG4vW1GgJpejAqUvuRhUw4Nhog success remainder_len=29
+2024-07-10 08:23:53 AShvBnVmKN1Vw1o4gJfPs2CrHuvqyjo6h4Tztri6fCcE success remainder_len=28
+2024-07-10 08:23:54 7tE4jyagcP3AcFoL9RDe7V4sV41f9pJnMEQQ7EaTrJZ9 success remainder_len=27
+2024-07-10 08:23:54 2YsDS3SdNkq3Y4PaxdeYfds5PjLY4gQQMs82oMyYfBL4 success remainder_len=26
+2024-07-10 08:23:54 8LZPjR1ZLsKiaF758F9vQASDDanFjz6JGfRmUxBnFwYr success remainder_len=25
+2024-07-10 08:23:54 E8mFb4WhXVVT37C4fp7Vrmefw77PfDyr3N9APuCJCoAc success remainder_len=24
+2024-07-10 08:23:55 2024-07-10 08:23:55 C3dRLTBgYYQG1Q6czSqjmvgmyLL7upTede6pnzQnco3e success remainder_len=23
+FeC6eoUA1Y8frBcx1XuZgXerBj5d3CGNwvFVJFpbYEid success remainder_len=22
+2024-07-10 08:23:55 2024-07-10 08:23:554jtyoKwpogYzWiKnL8Yb7rL1jLyN66VL1b22CWCywPVG success remainder_len=21
+ 3zW6odCfkmDFtWGhWc2Kp5SEokfprh2gnqLar1wv1WnB pre= 2313 aft= 2298
+2024-07-10 08:23:55 7DXpcXFXquz2duSGdAARjN3iEiHdqySGP4h6KuYHx8fK success remainder_len=20
+2024-07-10 08:23:55 GadvcGntfi2iEKQmXNrJudvT9EtNrMp9cR8jdQoWZzQ7 success remainder_len=19
+2024-07-10 08:23:55 JCvxcZBr6HkgbjUkgdiKokghimXeyJiFejhgumdDJoHb success remainder_len=18
+2024-07-10 08:23:55 3WL72gqW4XbzWi5BNNjK6L47DVShU5dYKzGHvHnXQPpu success remainder_len=17
+2024-07-10 08:23:56 2gRf9QYcSNi7RSqpDAwG1VNkrvyqmPgA32dL15xKpzkE success remainder_len=16
+2024-07-10 08:23:56 2024-07-10 08:23:56 4NAVrr9mEZ7FShN1QaTYtptpNDfJiP1CnKY7ZAaQ33fN success remainder_len=15
+B76awVT8Zgns3HutwC7R47KqWD7DiUxVh5Syo3riSts success remainder_len=14
+2024-07-10 08:23:56 4Dq9VKSPVYeoSFeHrYBW58Do8Ntxfw7wdkMstVY6XoAj success remainder_len=13
+2024-07-10 08:23:56 Fyv7URhz8pzRY3uUoBYNkaMSg6ifimvcFNK8p4gvWhbR success remainder_len=12
+2024-07-10 08:23:56 HHTeEVGU3KUjXKkrbteRExFFjCiodJUxXY6amAUjLgUG success remainder_len=11
+2024-07-10 08:23:56 2024-07-10 08:23:56Hemwik6AWf93dUpRYkkxyjn3WTGUnhsR6MYBvjzcadAN success remainder_len=10
+ CJGc1RFrViUV7atc2vksLGvhGJePUkZcDj8gYCdogFGG success remainder_len=9
+2024-07-10 08:23:56 85kpzQBdyaMy2F3zQomT5ywsUSQLGMku3j9jK24Wne3w success remainder_len=8
+2024-07-10 08:23:57 AsQXYJPMnkygPWPgSozm8SvJZqtLSgFy84uYgMaLbfYR success remainder_len=7
+2024-07-10 08:23:57 5anaQFiFY6GqWFaV6PnCjifRXzkvSrMpMz9CMSEi9Ccc success remainder_len=6
+2024-07-10 08:23:572024-07-10 08:23:57  GVeiGLyHes2LnonvapBxo7FG1aEZsRA4yxbMJLt3vZiB success remainder_len=4
+HjojuU5gczPmUWrnsM6GNz9apFtoDsrFdDuoaMAGo4kX success remainder_len=5
+2024-07-10 08:23:59 Cft4hKtC3dVftfqmL2MCALpeCq7oWM7qpftNfVVUzA7h success remainder_len=3
+2024-07-10 08:23:59 3zW6odCfkmDFtWGhWc2Kp5SEokfprh2gnqLar1wv1WnB success remainder_len=2
+2024-07-10 08:24:00 Hvts7WUNA9k72kkVt2YP6z1R85U3C637XqfCNoaYSy3W success remainder_len=1
+2024-07-10 08:24:00 GHsojPSbfyNqbFSLhJajU4GnNRdNAtgjn8BDFKBYNzYL success remainder_len=0
+2024-07-10 08:24:00 END    007_get_configtoken_st_solanafm.py ----------------NOTE-----------NOTE---------------
+nohup: ignoring input
+2024-07-10 08:24:50 
+
+
+
+
+
+2024-07-10 08:24:50 ENTER  008_get_profit_st_solanafm.py ----------------NOTE-----------NOTE---------------
+2024-07-10 08:24:50 arr_str_dalaoaddress len= 266
+2024-07-10 08:24:50 2024-07-10 08:24:50enter get_profit_st dalao_address= 4cdhkfmswFbBqzJptRRKHNWQqZEvTC7bSYTNgFbkCo1v 
+ 2024-07-10 08:24:50 enter get_profit_st dalao_address= 6xbKtRWCH7Gd6yAUXXNK2Rk88tBGk7mdbNNKDc9QJgCE 
+enter get_profit_st dalao_address= GXnQmvyqP1JXaene5GvcsafHLUPAKjV9wpmFwueCU9oD 
+2024-07-10 08:24:50 2024-07-10 08:24:50enter get_profit_st dalao_address= FijT78YGmoH3kaziymMYCDhdwA8g7xqdkg254qtkBKik 
+ enter get_profit_st dalao_address= FHF8ciYNMxBENLZUSQCopixyKHasDQaPbVfhbUoLmXFb 
+2024-07-10 08:24:51 cur_idx=2 end 
+2024-07-10 08:24:51 cur_idx=4 end 
+2024-07-10 08:24:51 cur_idx=1 end 
+2024-07-10 08:24:51 cur_idx=3 end 
+2024-07-10 08:24:51 cur_idx=0 end 
+2024-07-10 08:24:51 2024-07-10 08:24:512024-07-10 08:24:51 enter get_profit_st dalao_address= 9qdq5dERP6frhvZgdZ26WvsEXkqDvxYf27uvYu9W66jq 
+ enter get_profit_st dalao_address= Cz3mUHZbfmgEBfEdJECWswS3gQB8nEcZLYArU5PwBn5J 
+2024-07-10 08:24:51 enter get_profit_st dalao_address= CGh6rrMV4Q4Syv7EAhqsR5i2TePaaNrWUzBQvWgz5gHD 
+2024-07-10 08:24:51 enter get_profit_st dalao_address= 9eUw1dqESPQxeFUm1kJh2WSY8mA1CszAREJRxxPjNGrd 
+enter get_profit_st dalao_address= 7zL7mpZQwGTfkAJ4Qn87y7HSDtT95cGEdXVoQMEyuCZX 
+2024-07-10 08:24:51 cur_idx=5 end 
+2024-07-10 08:24:51 cur_idx=6 end 
+2024-07-10 08:24:51 cur_idx=8 end 
+2024-07-10 08:24:52 cur_idx=7 end 
+2024-07-10 08:24:52 cur_idx=9 end 
+2024-07-10 08:24:52 2024-07-10 08:24:52enter get_profit_st dalao_address= 4qfdzdz19q5kWuo2hNAZyQ7krVM4wFSAEzjK1JrWrMwD 
+ 2024-07-10 08:24:52enter get_profit_st dalao_address= 69kPqGbtmT51foR3ZMRR48BVRhzcysPh7sLTBf9hSRGD 
+ enter get_profit_st dalao_address= 7jw834gPVnHeypTryDzb6Z3YTzhWSx2eSz7Bi6BkL4dz 
+2024-07-10 08:24:52 enter get_profit_st dalao_address= 92iS2625agVhUDHhrigjgNKyh6maUE5Gg8Pfw1docGEG 
+2024-07-10 08:24:52 enter get_profit_st dalao_address= 45EYZF2H8a6kjX7W4QEkEfrKjVfF1jtBLZWjuRGcukt3 
+2024-07-10 08:24:52 cur_idx=14 end 
+2024-07-10 08:24:52 cur_idx=11 end 
+2024-07-10 08:24:52 cur_idx=12 end 
+2024-07-10 08:24:52 cur_idx=10 end 
+2024-07-10 08:24:52 cur_idx=13 end 
+2024-07-10 08:24:522024-07-10 08:24:52 enter get_profit_st dalao_address= 8J6gYgHQXJp5uB7sveLWLQV9eFPzHQzY6RmYrh2StoZh 
+2024-07-10 08:24:52  enter get_profit_st dalao_address= EEkVVvKk5Tp6GAjiVpRk5yT34aYekUqZutSDbm733dcF 
+enter get_profit_st dalao_address= CcxHnvmz6RbhEMFD5WoWSGyc2CxpDQriGAo1a727MPMg 
+2024-07-10 08:24:52 enter get_profit_st dalao_address= BD5YyR7f83EgeeWEBFW7mARsE5jxNi1wANRnnSqhoRbs 
+2024-07-10 08:24:52 enter get_profit_st dalao_address= AXyKkVAWmaDxm8jGwHEvM8KusJTbH9zWiZbVevRKvx8g 
+2024-07-10 08:24:53 cur_idx=19 end 
+2024-07-10 08:24:53 cur_idx=18 end 
+2024-07-10 08:24:53 cur_idx=15 end 
+2024-07-10 08:24:53 cur_idx=16 end 
+2024-07-10 08:24:53 cur_idx=17 end 
+2024-07-10 08:24:532024-07-10 08:24:53  enter get_profit_st dalao_address= 4T34XEQJLzVXuecTnzqxvm31si8N9YTFbT9QCYb84ey4 
+2024-07-10 08:24:53enter get_profit_st dalao_address= 9xuAXPdoTzNvqp5iEcN9CPRh23bDUE7tMykRJcdnzAuD 
+ enter get_profit_st dalao_address= 4uLcs4jBxbnJEgTeq92oZjFjPzQNBiU9bcQ3Rq1tcL8R 
+2024-07-10 08:24:532024-07-10 08:24:53 enter get_profit_st dalao_address= CFR89scCo61vo56F8UQxmLiCmiJyWefEwVAUtq3B5Tic 
+ enter get_profit_st dalao_address= FRahFJMn86ZmtNJeBdoZiMS2LBTeZ3ZU9caBBAzp3g4G 
+2024-07-10 08:24:53 cur_idx=22 end 
+2024-07-10 08:24:53 cur_idx=23 end 
+2024-07-10 08:24:54 cur_idx=20 end 
+2024-07-10 08:24:54 cur_idx=21 end 
+2024-07-10 08:24:54 cur_idx=24 end 
+2024-07-10 08:24:542024-07-10 08:24:54 2024-07-10 08:24:54 enter get_profit_st dalao_address= GUgfpxERCM6wdBBA77ddWfVKD5spyC4WgC4LRsrBnRXE 
+enter get_profit_st dalao_address= DcRAk2KT6pKf631AkdCVC3pe4mdHHrw3NDnEPk8zUWzy 
+2024-07-10 08:24:54  enter get_profit_st dalao_address= F5CsimrUKMdNeRJSvyLoykiVRnjthUWkBkDycUbnmpS6 
+enter get_profit_st dalao_address= BmhEn4SYAESA1gYH3Txf6DqJgMbtKxHPV7WWdJzEQAvW 
+2024-07-10 08:24:54 enter get_profit_st dalao_address= CMu4NHnrJbf47amBwMmFwAxfoSniyxEz77NVoEUEqpkb 
+2024-07-10 08:24:54 cur_idx=27 end 
+2024-07-10 08:24:54 cur_idx=29 end 
+2024-07-10 08:24:54 cur_idx=26 end 
+2024-07-10 08:24:54 cur_idx=28 end 
+2024-07-10 08:24:54 cur_idx=25 end 
+2024-07-10 08:24:542024-07-10 08:24:54  2024-07-10 08:24:54enter get_profit_st dalao_address= 593NVnzXAveWxC2FVN7TRthZnAqfAwTQsQu3jthuTYog 
+ enter get_profit_st dalao_address= DHCJpUcyzioMGsELqdonFYNsgQ2Hs94wVB782bgYyjUg 
+2024-07-10 08:24:54enter get_profit_st dalao_address= 6ohVbJ7C4pEVCkkHBdHQmpP34knxPgbR1oqd4ybvQ6D8 
+2024-07-10 08:24:54 enter get_profit_st dalao_address= FwoDrTiAWZx4tf9oqwAjYjftq2g267iGRqEvHqdtrWJi 
+ enter get_profit_st dalao_address= hqHJgH7CiGZmtkGZTJwHw2zhxtKNN7oHPZvy4XTLQd1 
+2024-07-10 08:24:55 cur_idx=31 end 
+2024-07-10 08:24:55 cur_idx=33 end 
+2024-07-10 08:24:55 cur_idx=32 end 
+2024-07-10 08:24:55 2024-07-10 08:24:55cur_idx=34 end 
+ cur_idx=30 end 
+2024-07-10 08:24:552024-07-10 08:24:55  enter get_profit_st dalao_address= BMr77C8exnf9Q1jBMwsV8gbioqqNS3QQCkASH3btnbWx 
+enter get_profit_st dalao_address= 8vrwnPPSv12iKjVvEVKQb1fFvRa4DcnotA4RoVgraqRF 
+2024-07-10 08:24:55 enter get_profit_st dalao_address= HJz4XsCQzAbt8JGVTTxBBSFpGivm7XT5VkPZrgD15mfL 
+2024-07-10 08:24:55 enter get_profit_st dalao_address= C96RaPJwm6jc3yUTA6JrnPRsRTzVHgVkXxFFk3ShZdLm 
+2024-07-10 08:24:55 enter get_profit_st dalao_address= CdhzJDWgHEdzbhBUEFEgjvwpCrcXc5zd2h24So9it6Zj 
+2024-07-10 08:24:56 cur_idx=39 end 
+2024-07-10 08:24:56 cur_idx=35 end 
+2024-07-10 08:24:56 cur_idx=37 end 
+2024-07-10 08:24:56 cur_idx=36 end 
+2024-07-10 08:24:56 cur_idx=38 end 
+2024-07-10 08:24:562024-07-10 08:24:562024-07-10 08:24:56   enter get_profit_st dalao_address= 8xz41Ek2vdsR42WUk5z1mPBTsmTg1crkjbm5Ub9DhbjP 
+enter get_profit_st dalao_address= 137whNrKQrFeTowL8zkn8sahGM1V4x8d6PVNxS4CebJQ 
+2024-07-10 08:24:56enter get_profit_st dalao_address= 8DdhgxW2EUYS2ReTjqEZbn3Lcd8Y98rWb83r1DLRh6eC 
+ enter get_profit_st dalao_address= 7XJs14JR9R4P1epxYZo2v2CMwkkveubVmR8KvMLgHGAb 
+2024-07-10 08:24:56 enter get_profit_st dalao_address= DSKLqHEzMcvsSSNG7XobjbtKZV25kFn94ryYTRhRx8Zk 
+2024-07-10 08:24:56 cur_idx=42 end 
+2024-07-10 08:24:56 cur_idx=40 end 
+2024-07-10 08:24:57 cur_idx=41 end 
+2024-07-10 08:24:57 cur_idx=43 end 
+2024-07-10 08:24:57 cur_idx=44 end 
+2024-07-10 08:24:57 enter get_profit_st dalao_address= 6ANioLqoBiJmefswnXxpAH89CYSjCMYAC6bMYP8rLGX1 
+2024-07-10 08:24:57 2024-07-10 08:24:57enter get_profit_st dalao_address= 6gwyMiXv3tzSF4AT2qUfJCeAHrBj8Y9zqba59yC8ZTVw 
+ enter get_profit_st dalao_address= E379GSqozCknZZQZa5D5j8FrgTDzbeFrJdpjxnM9NS9d 
+2024-07-10 08:24:57 2024-07-10 08:24:57enter get_profit_st dalao_address= J5smpruhLFadnin6ZNXvAhD6Q3qmbopedx8jhwxz3Kja 
+ enter get_profit_st dalao_address= JED9gEbMzhAsKHt65DjrDJ3epWCnoDiZPyn3YhQkqC38 
+2024-07-10 08:24:57 cur_idx=45 end 
+2024-07-10 08:24:57 cur_idx=46 end 
+2024-07-10 08:24:58 cur_idx=47 end 
+2024-07-10 08:24:58 cur_idx=49 end 
+2024-07-10 08:24:58 cur_idx=48 end 
+2024-07-10 08:24:58 2024-07-10 08:24:58enter get_profit_st dalao_address= DoJDW76kV4WH5Tiib32D9jyKQKbfhpzF6P4w2yueCwAD 
+2024-07-10 08:24:582024-07-10 08:24:58   enter get_profit_st dalao_address= GKEmaVnyEHQggxsRd93wPzTjgDpmUGe3cmR2CQ7YMYMo 
+enter get_profit_st dalao_address= D5ena4B5y3nZUXQs893qNJqn95Yx3oa8u22fHT1eCapB 
+2024-07-10 08:24:58 enter get_profit_st dalao_address= 7BwHjUw3i2CRTNZiYGYo32r2wn4wEZF8TTUbSoLvMSSo 
+enter get_profit_st dalao_address= H2FUVtgBtbUzSwYtNmshbo95ajrz11t6weTzpsBrt5Es 
+2024-07-10 08:24:58 cur_idx=54 end 
+2024-07-10 08:24:58 cur_idx=51 end 
+2024-07-10 08:24:58 cur_idx=50 end 
+2024-07-10 08:24:58 cur_idx=53 end 
+2024-07-10 08:24:58 cur_idx=52 end 
+2024-07-10 08:24:582024-07-10 08:24:582024-07-10 08:24:58  enter get_profit_st dalao_address= 9NZCt4VtnyuZCRtKSd31XoifVmbhERFQXmJ8fi5G6wP4 
+enter get_profit_st dalao_address= CrTU5929Vnk4sb7Cyfyo1M63JvzgSpFPm58JSyajDbd8 
+ 2024-07-10 08:24:58 enter get_profit_st dalao_address= DVPZSCD8wqHyaGK3482EiAhqzVNYaBMgdBYtVhLdNyfH 
+2024-07-10 08:24:58enter get_profit_st dalao_address= 3sXtXH4wbWdx4PxRVcPFtFZeHZn8H4BsuGga2mdqbBfo 
+ enter get_profit_st dalao_address= 58trto1eqFCbBagQKzXf7yihxMYcDvyKf7QPbAqhAxTU 
+2024-07-10 08:24:59 cur_idx=59 end 
+2024-07-10 08:24:59 cur_idx=56 end 
+2024-07-10 08:24:59 cur_idx=58 end 
+2024-07-10 08:24:59 cur_idx=55 end 
+2024-07-10 08:24:59 cur_idx=57 end 
+2024-07-10 08:24:59 enter get_profit_st dalao_address= 5erxVsb24bytwNWYv4QCUre3U8UR6QnTSRnTuEP6v4yC 
+2024-07-10 08:24:59 enter get_profit_st dalao_address= sjZ4SB46dfVrx9JsbyU6e2zCRkh5b1tYv84qihLoKky 
+2024-07-10 08:24:59 2024-07-10 08:24:59 enter get_profit_st dalao_address= 7qYo4ecwDqKuanbfCk4wRroETN8juBFmtTdqhugB2QUw 
+enter get_profit_st dalao_address= ZP8hv7BS7GhwtD8KdAxuofEQWoEWyTmZA79eTkeSGh4 
+2024-07-10 08:24:59 enter get_profit_st dalao_address= 2bgcMcLK1tREJQCcTHb2CeaBySmeEPM37QYnJTwwikY1 
+2024-07-10 08:25:00 cur_idx=63 end 
+2024-07-10 08:25:00 cur_idx=61 end 
+2024-07-10 08:25:00 cur_idx=62 end 
+2024-07-10 08:25:00 cur_idx=64 end 
+2024-07-10 08:25:00 cur_idx=60 end 
+2024-07-10 08:25:002024-07-10 08:25:00  enter get_profit_st dalao_address= CgkrM46UtqgWY8FWTBT8gEGa5ZRLMFkXQuatyRmc3Ct7 
+enter get_profit_st dalao_address= F9g3TsKoyuPYxZAF8bLvQeM2Vg65Ftw7UNuseigmZ1AB 
+2024-07-10 08:25:00 enter get_profit_st dalao_address= CvptpjX1NeDLqpPMvkpSmXPHx4kS89KShRB2HxVTtHQW 
+2024-07-10 08:25:00 enter get_profit_st dalao_address= EShhzFptmzfQMDaRSjS2xo1gG5qG6Ai9P3Jpj7eHHyv5 
+2024-07-10 08:25:00 enter get_profit_st dalao_address= CPsCsVWhkRu8FxFbvpThCYZR2PPvFjuJ78RajGCHAjzN 
+2024-07-10 08:25:00 cur_idx=66 end 
+2024-07-10 08:25:01 cur_idx=67 end 
+2024-07-10 08:25:01 cur_idx=69 end 
+2024-07-10 08:25:01 cur_idx=68 end 
+2024-07-10 08:25:01 cur_idx=65 end 
+2024-07-10 08:25:012024-07-10 08:25:01 enter get_profit_st dalao_address= F29cTM8g7sZ1murE5Eo1iVmpaJcvCQGM4PUEAi3Sp1Uh 
+2024-07-10 08:25:012024-07-10 08:25:012024-07-10 08:25:01 enter get_profit_st dalao_address= 32s63FJ2snfYnPDC1Xzn3aVwFMBjUk4TtHXjY4KsJi1W 
+ enter get_profit_st dalao_address= CRAgP9HtVWkBNtngEy626jprCzK9jhxvagpj1ZyXS59Q 
+ enter get_profit_st dalao_address= 32cZ3JoDm2r4jyfBgAs6ECKF2GA1v6ogBnuaWwPHCbf5 
+ enter get_profit_st dalao_address= 9rE5Wp6j9CPu7fVzJ9PsT18Jy5Hdn6MFTPgrBb2x2Aup 
+2024-07-10 08:25:01 cur_idx=72 end 
+2024-07-10 08:25:01 cur_idx=70 end 
+2024-07-10 08:25:02 cur_idx=73 end 
+2024-07-10 08:25:02 cur_idx=74 end 
+2024-07-10 08:25:02 cur_idx=71 end 
+2024-07-10 08:25:022024-07-10 08:25:02 enter get_profit_st dalao_address= J1YpUnsC85hUPaA6yJVsTPcVfnBA6Y51iaJ9J3faTBMX 
+2024-07-10 08:25:022024-07-10 08:25:022024-07-10 08:25:02   enter get_profit_st dalao_address= 7X6DA7mNLsVVN2s3Ez1NZSB93QKrSFDvtU11fH4PYKZT 
+enter get_profit_st dalao_address= 56MmFK3tzurx7CYuHtUPDbwzQNWML4Tdqe4D8HWwNstR 
+enter get_profit_st dalao_address= 75FU9rhGUtL7pgqmMEQMJp9ouZKHWbroZrgknP5L88SS 
+ enter get_profit_st dalao_address= HhMqYTYyjabHAhGXqgyHspkfTyXoKRsCtpEoQm41reLy 
+2024-07-10 08:25:02 cur_idx=76 end 
+2024-07-10 08:25:02 cur_idx=79 end 
+2024-07-10 08:25:02 cur_idx=78 end 
+2024-07-10 08:25:03 cur_idx=75 end 
+2024-07-10 08:25:03 cur_idx=77 end 
+2024-07-10 08:25:032024-07-10 08:25:03 enter get_profit_st dalao_address= 9sgh5mkpVhtiU6HzRKPDimYwTRX8eWoRE1isrgHARnbx 
+ enter get_profit_st dalao_address= eSb2nzsLA1xG9RkwqNzqyfUrRfHYpZGUBpqiWSqwxDy 
+2024-07-10 08:25:03 enter get_profit_st dalao_address= CKid3aN6yQyF5jVQJteBU7xkWmftCmFvGTPsv7q6g12z 
+2024-07-10 08:25:032024-07-10 08:25:03  enter get_profit_st dalao_address= GFbQeBnjTs7q6DaEsAS7eNZyU3LL1aekaCuXnee5QgRJ 
+enter get_profit_st dalao_address= FvYmth6RSdYYQ4mtEsSTZfUhcGnpHxgbo5kGEBYpbyB6 
+2024-07-10 08:25:03 cur_idx=84 end 
+2024-07-10 08:25:04 cur_idx=82 end 
+2024-07-10 08:25:04 cur_idx=81 end 
+2024-07-10 08:25:04 cur_idx=83 end 
+2024-07-10 08:25:04 cur_idx=80 end 
+2024-07-10 08:25:042024-07-10 08:25:04 enter get_profit_st dalao_address= BpC3fASsiKT4q4oVnza8tPwjTCKPfqRhDKxc6TKfMXKN 
+ enter get_profit_st dalao_address= EKCMvweXWRPYFP4Bwa2HPmEtFZDZAJRg8rrPSPJgPsN5 
+2024-07-10 08:25:042024-07-10 08:25:04 enter get_profit_st dalao_address= vnnmZ4RmrPBcVgRLamtGsZdmj5wRuFY8yvbuS7fm6wU 
+ enter get_profit_st dalao_address= EC2KJEc1mbsmDYYAfLeA1CYS3egFwYw7UmA7s46nLnMB 
+2024-07-10 08:25:04 enter get_profit_st dalao_address= 5bkdTWQhSR7BFY5UL8MQqoifnSonkiH8Av73y8i8aJFJ 
+2024-07-10 08:25:04 cur_idx=86 end 
+2024-07-10 08:25:04 cur_idx=85 end 
+2024-07-10 08:25:04 cur_idx=88 end 
+2024-07-10 08:25:05 cur_idx=87 end 
+2024-07-10 08:25:05 cur_idx=89 end 
+2024-07-10 08:25:052024-07-10 08:25:052024-07-10 08:25:052024-07-10 08:25:05   enter get_profit_st dalao_address= 6TyTdn1y5ZtBwktQt2bZihff9gKwmgLMhdBaaf9MXJVf 
+enter get_profit_st dalao_address= 67ESR5p8Azt1GbHCuBGxyR1aBXXaPzaa7qfbs5kpExxQ 
+enter get_profit_st dalao_address= 8JWggJCnVdBJjP83JvTySHQY3Zio7gWZanmnUfhTyF9z 
+ enter get_profit_st dalao_address= 4hDN7RAenPmKKHZnDukRgzPDEbJXWTGU7c2Uv5tKSfMT 
+2024-07-10 08:25:05 enter get_profit_st dalao_address= 3QKha9egjzzeZiPNgwXq5HMRHe1XacDdgEnEABMjnPFS 
+2024-07-10 08:25:05 cur_idx=94 end 
+2024-07-10 08:25:05 cur_idx=91 end 
+2024-07-10 08:25:05 cur_idx=93 end 
+2024-07-10 08:25:05 cur_idx=90 end 
+2024-07-10 08:25:05 cur_idx=92 end 
+2024-07-10 08:25:052024-07-10 08:25:05  enter get_profit_st dalao_address= EAoA2uFxyxFXXtXGnmj9AUuZM3gZK3nPVeH2hi7oc3B1 
+enter get_profit_st dalao_address= 8XX8D8AL7jUoNnG2FQ9aZRPvevMgSUWjWPTkksem9Y9K 
+2024-07-10 08:25:052024-07-10 08:25:052024-07-10 08:25:05   enter get_profit_st dalao_address= CwCDojBiGrEiSnVFfE2yqxVq9eviDDMm2hGHek5okWvp 
+enter get_profit_st dalao_address= J7mApWsHQmZ5FtFrBx6UtysPHT7c6p9rgbu7X1pv8Jxe 
+enter get_profit_st dalao_address= 4KLagbRcs2qaE5SK2srHcf4eENZ1y5jh3imUKXAorCw7 
+2024-07-10 08:25:05 cur_idx=97 end 
+2024-07-10 08:25:06 cur_idx=96 end 
+2024-07-10 08:25:06 cur_idx=95 end 
+2024-07-10 08:25:06 cur_idx=99 end 
+2024-07-10 08:25:06 cur_idx=98 end 
+2024-07-10 08:25:062024-07-10 08:25:062024-07-10 08:25:06  enter get_profit_st dalao_address= 3TCL9LQrhShkNW1mviWZGZGBEBqohPvSiCxJVFPTznWJ 
+ enter get_profit_st dalao_address= HoqPsnhwxoDCHHuvX7W5JyaSXHWZce2xKHJBqA7MHPga 
+enter get_profit_st dalao_address= FXvw9QRdZqr268TqwtHMztukgWFLZ96deco8QYKyi9u4 
+2024-07-10 08:25:06 enter get_profit_st dalao_address= B2Yzz5LqMPZiSMwxba39tVY4ZdYVgYX5rjNvywTG1ZXr 
+2024-07-10 08:25:06 enter get_profit_st dalao_address= 7vEbaGSKeoYBMFq5guUzEoS43rYbbNQerJp2uhp8UpAh 
+2024-07-10 08:25:06 cur_idx=101 end 
+2024-07-10 08:25:06 cur_idx=102 end 
+2024-07-10 08:25:06 cur_idx=104 end 
+2024-07-10 08:25:06 cur_idx=103 end 
+2024-07-10 08:25:06 cur_idx=100 end 
+2024-07-10 08:25:06 2024-07-10 08:25:06enter get_profit_st dalao_address= ERdq2FHNuemT1AAHoqwWcjbsN7SMhsYt2zwQmUi2hxCq 
+2024-07-10 08:25:062024-07-10 08:25:06 enter get_profit_st dalao_address= E6WiYrZPW4CxLMbXmh2eGtSH2gyt4QQP3BVy9r6ufohH 
+ enter get_profit_st dalao_address= 4SxJCWNygttSkjq7JCkkW7QMPMhiYzoVPh153WzSTd9v 
+ 2024-07-10 08:25:06 enter get_profit_st dalao_address= 9zaqKfZg1d7N3tA2sLPMWo7emdu5CYEzKw3xBAwsKGsW 
+enter get_profit_st dalao_address= 6UJEhkKwoDRVbCcNf3Rs5xhM1EZCsSzEtfw1Hhoon9F9 
+2024-07-10 08:25:07 cur_idx=108 end 
+2024-07-10 08:25:07 cur_idx=107 end 
+2024-07-10 08:25:07 cur_idx=105 end 
+2024-07-10 08:25:07 cur_idx=106 end 
+2024-07-10 08:25:07 cur_idx=109 end 
+2024-07-10 08:25:072024-07-10 08:25:072024-07-10 08:25:07   2024-07-10 08:25:07enter get_profit_st dalao_address= Df4R1dVZLjFSW9qbPZfFyXZ1whNZrYrNfZ95UvSdYHxw 
+ enter get_profit_st dalao_address= FguX3PEUzdj6oJoidQERwjY1NBxHGbdYyHzknTTL4eQX 
+enter get_profit_st dalao_address= DD5X8fzbdM1jhLDRg4J16jASmRgieAJhPUEksVrr1csL 
+enter get_profit_st dalao_address= 3R47dpawpKmYnXAczNSWSmACZdgSHkwCGrvkzM1JDSrC 
+2024-07-10 08:25:07 enter get_profit_st dalao_address= 6BQTsUaU5GEFCKaAbMbCZHzZXBEURDZ9b4KV4c6x3pnA 
+2024-07-10 08:25:07 cur_idx=110 end 
+2024-07-10 08:25:08 cur_idx=114 end 
+2024-07-10 08:25:08 cur_idx=111 end 
+2024-07-10 08:25:08 cur_idx=113 end 
+2024-07-10 08:25:08 cur_idx=112 end 
+2024-07-10 08:25:082024-07-10 08:25:082024-07-10 08:25:08  enter get_profit_st dalao_address= 7rhkaHcUorHJSf8kRj2o3nDyhCG9PMEQSg7VGamQ1YSF 
+ enter get_profit_st dalao_address= 5R1KSEz7MkPhioqaSNrLSBBAVsAaMvyyCRp737iCbYSx 
+enter get_profit_st dalao_address= GN9oaCcbfVLSaF2KFXiXzMezF4fH73kzyA8yMnPQtcUH 
+2024-07-10 08:25:08 2024-07-10 08:25:08enter get_profit_st dalao_address= 6Fi8koHrFNhUUiicFyAeArKr12uFxDFmFwiUBQ9JZuTw 
+ enter get_profit_st dalao_address= EepYGi55YNeAhC1YMztweRrzYjvmConx6x8tgriEnaoE 
+2024-07-10 08:25:08 cur_idx=117 end 
+2024-07-10 08:25:08 cur_idx=119 end 
+2024-07-10 08:25:08 cur_idx=118 end 
+2024-07-10 08:25:08 cur_idx=116 end 
+2024-07-10 08:25:08 cur_idx=115 end 
+2024-07-10 08:25:08 enter get_profit_st dalao_address= JB1PZMNpXkFgj2kxyA43z8Ry4um5Ap6u7z2gn5EEZr5h 
+2024-07-10 08:25:08 2024-07-10 08:25:082024-07-10 08:25:08 enter get_profit_st dalao_address= D1m5v4aDLcW6BMJYmhryw4YGTHVgwL77TSUSvnytK5Y2 
+enter get_profit_st dalao_address= CZLvqmCTVGXn3FvtS8ehWqZQM8LBtNwSkdq9Hwccd6NA 
+ enter get_profit_st dalao_address= 3qoYbTW8dKFDBFv76NdgdFWpo2qFCApzcg9w8AHTDAJ1 
+2024-07-10 08:25:08 enter get_profit_st dalao_address= 3eY9waL3hBdZmjR231AnAkBc98oomxtqCsSjZbKJtZGf 
+2024-07-10 08:25:09 cur_idx=124 end 
+2024-07-10 08:25:09 cur_idx=123 end 
+2024-07-10 08:25:09 cur_idx=120 end 
+2024-07-10 08:25:09 cur_idx=121 end 
+2024-07-10 08:25:09 cur_idx=122 end 
+2024-07-10 08:25:092024-07-10 08:25:09  enter get_profit_st dalao_address= 3yZqcQyKChk4Tu5FFTbi1CRs48WiVPju7HYs9jE234Uj 
+enter get_profit_st dalao_address= HfpdVRhXXmkQnpwhwqFUh6u7axAjLg7AvAnuMcgkV2Hk 
+2024-07-10 08:25:09 enter get_profit_st dalao_address= AGseT8871WpBEi6QKLkVUo8VS34M6XnwxhvwCpT435he 
+2024-07-10 08:25:092024-07-10 08:25:09 enter get_profit_st dalao_address= H4axUbkbRmFDmFnxG1Y1221GPd4qnuct75MBUxdMVTiV 
+ enter get_profit_st dalao_address= HnAzCZWjXW7NrPCc8RU4aE7jCbKwaLULKe53RhNe9LW3 
+2024-07-10 08:25:09 cur_idx=129 end 
+2024-07-10 08:25:10 cur_idx=125 end 
+2024-07-10 08:25:10 cur_idx=126 end 
+2024-07-10 08:25:10 cur_idx=127 end 
+2024-07-10 08:25:10 cur_idx=128 end 
+2024-07-10 08:25:102024-07-10 08:25:102024-07-10 08:25:102024-07-10 08:25:10 enter get_profit_st dalao_address= 4jttec6ZEwGv5mddTkpFBNDtuNTjDgXEC2etkVDEMwnX 
+   2024-07-10 08:25:10enter get_profit_st dalao_address= AU5tDrTMAsDu76oKjXLNrzH2C14gfki3tfP6G61sqhDT 
+ enter get_profit_st dalao_address= 6CYryfcdE9X2ZxKoysqbZ6ZX9wJ1VzvUEHtLx5fDYXo 
+enter get_profit_st dalao_address= 9rBSeNt51zbzSNp94WUuR1k4LJpoiiBzHXRqBRrSzcny 
+enter get_profit_st dalao_address= 7LgLC6jp2xkZKJcLz982qASnX5U6p8r1J2x94oNz4vBK 
+2024-07-10 08:25:10 cur_idx=131 end 
+2024-07-10 08:25:11 cur_idx=134 end 
+2024-07-10 08:25:11 cur_idx=130 end 
+2024-07-10 08:25:11 cur_idx=132 end 
+2024-07-10 08:25:11 cur_idx=133 end 
+2024-07-10 08:25:11 enter get_profit_st dalao_address= 44TD7uQrK93iSFwLmWzGaovhZn4Ao4jnqNoNqLkHSYdn 
+2024-07-10 08:25:112024-07-10 08:25:11 enter get_profit_st dalao_address= 8mrwtqnvAr9ynkknTQsE3aXmkw2Hz2B3LQBsk3nQmrjL 
+2024-07-10 08:25:112024-07-10 08:25:11  enter get_profit_st dalao_address= 5D22RmLmYmFtFFXF52BnvnWUpUFmhse4RRhSrq3G6yN4 
+ enter get_profit_st dalao_address= CXQdGoLo9QnTwC1tr96HcQxZgw4gPrLZo9MpEKvAhXM6 
+enter get_profit_st dalao_address= Fd86iFWiaracVAPLj17dV3GZY9UVgNqEUPKfRkgUTrtN 
+2024-07-10 08:25:11 cur_idx=139 end 
+2024-07-10 08:25:11 cur_idx=138 end 
+2024-07-10 08:25:11 cur_idx=136 end 
+2024-07-10 08:25:11 cur_idx=137 end 
+2024-07-10 08:25:12 cur_idx=135 end 
+2024-07-10 08:25:122024-07-10 08:25:122024-07-10 08:25:12 enter get_profit_st dalao_address= HH3poyfaRco4v1UXFzCwTkmpkMQgZKjqHKUD7GWDTF2U 
+ 2024-07-10 08:25:12 enter get_profit_st dalao_address= FXxvCs21WfrNwTieRJX1tH1WtEZ3QzdJ5siz6wDVpVNk 
+2024-07-10 08:25:12 enter get_profit_st dalao_address= BerYpeK3WMowgPX5p8bNMgP4yRDxDeudmB2VYcWSqpET 
+ enter get_profit_st dalao_address= 3W7AKDzLZE3U7k4RPVPviA1qQxvtEppK1rrL57fx2rU1 
+enter get_profit_st dalao_address= ZvvjVcHjji945BL7hJzgphVuZ3PEJfVuNwFLHFqYSbE 
+2024-07-10 08:25:12 cur_idx=143 end 
+2024-07-10 08:25:12 cur_idx=142 end 
+2024-07-10 08:25:12 cur_idx=141 end 
+2024-07-10 08:25:12 cur_idx=144 end 
+2024-07-10 08:25:12 cur_idx=140 end 
+2024-07-10 08:25:122024-07-10 08:25:122024-07-10 08:25:12   2024-07-10 08:25:12enter get_profit_st dalao_address= BuhhRuQ5qBdjy61ynYqyuZ7UH5hiAoWeZJGYCVLSGGDZ 
+enter get_profit_st dalao_address= DFjjrhbVMUcVHTFPTQdwVFdEkv3tMXPo1bc5v17xHE9s 
+enter get_profit_st dalao_address= DadBSqDuoQHPkaxXP8PHbWvf1fZ2Q1KGwnGM61zj2huC 
+ 2024-07-10 08:25:12 enter get_profit_st dalao_address= 3jMNgPFG4wrfVmGqmBe3URHuuduqU7fTZbJRyedkXFR7 
+enter get_profit_st dalao_address= TSJk4dcfTDoVFfgzDmWM7uvriRkgsC6EYXW6oJJ78vS 
+2024-07-10 08:25:13 cur_idx=146 end 
+2024-07-10 08:25:13 cur_idx=149 end 
+2024-07-10 08:25:13 cur_idx=148 end 
+2024-07-10 08:25:13 cur_idx=145 end 
+2024-07-10 08:25:13 cur_idx=147 end 
+2024-07-10 08:25:132024-07-10 08:25:13  enter get_profit_st dalao_address= 4Q6Dg6hqgpkUDaN7jqTFp6QsaumrEs4MLNFrXGkPQ4Uy 
+enter get_profit_st dalao_address= Ao8CisnipDZ1Gb4QoZPUgkJdTQvDdoZqjPPgaAmnQrvB 
+2024-07-10 08:25:132024-07-10 08:25:13  enter get_profit_st dalao_address= GwGnAhds8SQCx5erQUFAmFJv7ZZKs7J3MBWqeNYWCP96 
+enter get_profit_st dalao_address= 8RrRXd4G1jhXhYVtRt3LboDRB3JfGzTzeX2VWQYDKNiQ 
+2024-07-10 08:25:13 enter get_profit_st dalao_address= BvQSVGLMq8YaAXJLoeMxpXn9LQVAX9cRbsPrgYpFEKS5 
+2024-07-10 08:25:13 cur_idx=152 end 
+2024-07-10 08:25:13 cur_idx=153 end 
+2024-07-10 08:25:14 cur_idx=150 end 
+2024-07-10 08:25:14 cur_idx=151 end 
+2024-07-10 08:25:14 cur_idx=154 end 
+2024-07-10 08:25:142024-07-10 08:25:14  2024-07-10 08:25:14enter get_profit_st dalao_address= CciktRE6WvMzaAqTLkwr89ViWhmNc26uzmD83G1cjZBF 
+enter get_profit_st dalao_address= 3odfMDcGfEGvM9gsQHxwaqctqEb86ituCpvKaQcgAQ8d 
+2024-07-10 08:25:142024-07-10 08:25:14  enter get_profit_st dalao_address= 2dCU7Vi7wbH8dHPzTZ6RrcfRLESg5QwENsDJgRRPrQ8K 
+enter get_profit_st dalao_address= FATk52hRHc2na52PaUUbXQegY1EuM92dNXjyFRELf6x4 
+ enter get_profit_st dalao_address= FSrdXhRnstrWZug9F43Uv5zDCcgEJTXYRPixXd6jyGDU 
+2024-07-10 08:25:14 cur_idx=157 end 
+2024-07-10 08:25:15 cur_idx=156 end 
+2024-07-10 08:25:15 cur_idx=158 end 
+2024-07-10 08:25:15 cur_idx=159 end 
+2024-07-10 08:25:15 cur_idx=155 end 
+2024-07-10 08:25:152024-07-10 08:25:15 2024-07-10 08:25:15 2024-07-10 08:25:15enter get_profit_st dalao_address= 2HBW8AukWxcXaWdNYo1gCTQsKrMguu3DsPRmR3d4teSS 
+enter get_profit_st dalao_address= 9dyCPdtmWNF242YwCckkRy5RLu1mXtynagkhmDPvrd68 
+ enter get_profit_st dalao_address= EBXatXH1KXAQdennAp76BrRXGs1UncQosk8gcsBv9nwB 
+2024-07-10 08:25:15  enter get_profit_st dalao_address= 8vXoLvbRw2ZdgyWvK4UNnMR4W5Lc7JKZFAeKPavEh96 
+enter get_profit_st dalao_address= ErQQ2kqDfEjPTiaakaPuFy79xi38jCc3Knuu7F3xsvy3 
+2024-07-10 08:25:15 cur_idx=163 end 
+2024-07-10 08:25:15 cur_idx=164 end 
+2024-07-10 08:25:15 cur_idx=162 end 
+2024-07-10 08:25:15 cur_idx=161 end 
+2024-07-10 08:25:15 cur_idx=160 end 
+2024-07-10 08:25:15 enter get_profit_st dalao_address= 3tbqqGHpwy1W3Edb7zY72dL96ENmVt3NsQB2tAr1b1dg 
+2024-07-10 08:25:152024-07-10 08:25:152024-07-10 08:25:15  enter get_profit_st dalao_address= 5UyMPxW127T5XVVhz6uP7R6KqQiUCqcDkHDkpXFuHW2w 
+enter get_profit_st dalao_address= AWZjSsWeSKLTzbttC6qbpinmzvpVYD6vLGMvsCNiTibS 
+2024-07-10 08:25:15  enter get_profit_st dalao_address= D6fBZo7LFRct1JW9iEdf32JAab77Whmt4nbqnmbaxM97 
+enter get_profit_st dalao_address= 23uMsbsXkEgfFnwebRRJzzMhMPPVRSXJQ9J9hZSssi3m 
+2024-07-10 08:25:16 cur_idx=167 end 
+2024-07-10 08:25:16 cur_idx=165 end 
+2024-07-10 08:25:16 cur_idx=168 end 
+2024-07-10 08:25:16 cur_idx=169 end 
+2024-07-10 08:25:16 cur_idx=166 end 
+2024-07-10 08:25:162024-07-10 08:25:162024-07-10 08:25:162024-07-10 08:25:16  enter get_profit_st dalao_address= 85kpzQBdyaMy2F3zQomT5ywsUSQLGMku3j9jK24Wne3w 
+2024-07-10 08:25:16enter get_profit_st dalao_address= 6Eu5ms6QrQK2iRYsJHgXeyiYKawF7yT2N5DBhLjzYyRB 
+   enter get_profit_st dalao_address= AsQXYJPMnkygPWPgSozm8SvJZqtLSgFy84uYgMaLbfYR 
+enter get_profit_st dalao_address= 6mKvvWnzXwGq1Ap22uHaK3j1MkUzwgZxLCcgQYN4Rh13 
+enter get_profit_st dalao_address= CdmQMQKNGAks14f7GY3HxxTRUe6KkXX7xhowxGpkcQn4 
+2024-07-10 08:25:17 cur_idx=171 end 
+2024-07-10 08:25:17 cur_idx=170 end 
+2024-07-10 08:25:17 cur_idx=174 end 
+2024-07-10 08:25:17 cur_idx=172 end 
+2024-07-10 08:25:17 cur_idx=173 end 
+2024-07-10 08:25:17 enter get_profit_st dalao_address= sU3GUBpAYZNrYuhqKdh24iYuFuNnBWQv7oEteNDXAWf 
+2024-07-10 08:25:17 2024-07-10 08:25:172024-07-10 08:25:17enter get_profit_st dalao_address= C9kjSCU9iZq2M89RfZqkuZpPvRXi8nuew3aDq4JzRa4G 
+ enter get_profit_st dalao_address= EXuVDJNqhWBHAwc2iefG4vW1GgJpejAqUvuRhUw4Nhog 
+2024-07-10 08:25:17 enter get_profit_st dalao_address= CRsgNuBuiKvMavq69NCdWu8FvBpS8srWq8RG2rNcSGpP 
+ enter get_profit_st dalao_address= AZsQxuDkXbmf8Eom4mqmZTWokEG37EpwNKFjFQNsQ3XV 
+2024-07-10 08:25:17 cur_idx=175 end 
+2024-07-10 08:25:18 cur_idx=177 end 
+2024-07-10 08:25:18 cur_idx=178 end 
+2024-07-10 08:25:18 cur_idx=176 end 
+2024-07-10 08:25:18 cur_idx=179 end 
+2024-07-10 08:25:182024-07-10 08:25:18  enter get_profit_st dalao_address= C3dRLTBgYYQG1Q6czSqjmvgmyLL7upTede6pnzQnco3e 
+enter get_profit_st dalao_address= 14S4fRuvNACffP5aHs1t7C7AjtyZsckwZuTosQy5UUkE 
+2024-07-10 08:25:182024-07-10 08:25:18  enter get_profit_st dalao_address= 5PQLyou4EZqFP4Xn3AiZ6CagJtzRQ1E4VTGC3VTmNHzn 
+enter get_profit_st dalao_address= AShvBnVmKN1Vw1o4gJfPs2CrHuvqyjo6h4Tztri6fCcE 
+2024-07-10 08:25:18 enter get_profit_st dalao_address= 6YncPWzRLER5oE1dDtRUFwxhrR2h1nwWutzHaDP23W3D 
+2024-07-10 08:25:18 cur_idx=180 end 
+2024-07-10 08:25:18 cur_idx=184 end 
+2024-07-10 08:25:19 cur_idx=183 end 
+2024-07-10 08:25:19 cur_idx=182 end 
+2024-07-10 08:25:19 cur_idx=181 end 
+2024-07-10 08:25:19 enter get_profit_st dalao_address= GNvEdoh3KHMEJjZdzCRpP2muspSr4X3LRVRSrqiYcguZ 
+2024-07-10 08:25:19 2024-07-10 08:25:19enter get_profit_st dalao_address= DVt6AePG23LfTv1VDppnGWWHQXEbpWW97PEJf4UgMAM 
+2024-07-10 08:25:19 enter get_profit_st dalao_address= DhEDyawZ9gZ6iy8Bhk8rq7TNxy2mbv6H8eSNtzk216vr 
+ 2024-07-10 08:25:19 enter get_profit_st dalao_address= 98mi9itqKwaWdWPFGViAUQ6vZmB9ftphsZcVVCqPsqqT 
+enter get_profit_st dalao_address= 5anaQFiFY6GqWFaV6PnCjifRXzkvSrMpMz9CMSEi9Ccc 
+2024-07-10 08:25:19 cur_idx=187 end 
+2024-07-10 08:25:19 cur_idx=185 end 
+2024-07-10 08:25:19 cur_idx=189 end 
+2024-07-10 08:25:19 cur_idx=186 end 
+2024-07-10 08:25:19 cur_idx=188 end 
+2024-07-10 08:25:19 2024-07-10 08:25:19enter get_profit_st dalao_address= Fyv7URhz8pzRY3uUoBYNkaMSg6ifimvcFNK8p4gvWhbR 
+2024-07-10 08:25:19 enter get_profit_st dalao_address= 2zhBbs127EnrkJWyc4U9DMuBxKnWLJfq4Hb8x1eskTfc 
+ 2024-07-10 08:25:19 enter get_profit_st dalao_address= B1wojkKqE7qtsXX8JP6PQERgdipJq6xpz8YGsdMsqK6n 
+enter get_profit_st dalao_address= EejcWHh2ELTDkxKMmTJQ4VnyyYGdzLo91xMXzZNxAvbG 
+2024-07-10 08:25:19 enter get_profit_st dalao_address= 3zW6odCfkmDFtWGhWc2Kp5SEokfprh2gnqLar1wv1WnB 
+2024-07-10 08:25:202024-07-10 08:25:20  cur_idx=192 end 
+cur_idx=191 end 
+2024-07-10 08:25:20 cur_idx=193 end 
+2024-07-10 08:25:20 cur_idx=190 end 
+2024-07-10 08:25:20 cur_idx=194 end 
+2024-07-10 08:25:202024-07-10 08:25:20  enter get_profit_st dalao_address= Hemwik6AWf93dUpRYkkxyjn3WTGUnhsR6MYBvjzcadAN 
+2024-07-10 08:25:20 enter get_profit_st dalao_address= FSaanR7cdbcypqhNsjFQTfXy2XNrzvsDDDCXdX2GSCXg 
+enter get_profit_st dalao_address= ApMLsE8WaLJwscY6t8vdwSMVUrnLdfkCv8uuKXJtQqZf 
+2024-07-10 08:25:20 enter get_profit_st dalao_address= DcrLEjXccQD8zpKPspbMVg9pShzQzn1PKZ18Jbn8MxMH 
+2024-07-10 08:25:20 enter get_profit_st dalao_address= 5eoc5Neh5RFWCAK2SkGGKfCU5f4EXdFQxbNgZGD1fGYT 
+2024-07-10 08:25:20 cur_idx=196 end 
+2024-07-10 08:25:21 cur_idx=197 end 
+2024-07-10 08:25:21 cur_idx=199 end 
+2024-07-10 08:25:21 cur_idx=198 end 
+2024-07-10 08:25:21 cur_idx=195 end 
+2024-07-10 08:25:21 2024-07-10 08:25:21enter get_profit_st dalao_address= 7xbpY9oyFKTGqXTikXaEbKhaygX5hJzr6HQYtHKsUUFK 
+ enter get_profit_st dalao_address= BaVfSvTBg97D57LoJGMUvCAJDiaBhZ1q4XUXNRsMoqDd 
+2024-07-10 08:25:212024-07-10 08:25:21 2024-07-10 08:25:21enter get_profit_st dalao_address= JCvxcZBr6HkgbjUkgdiKokghimXeyJiFejhgumdDJoHb 
+  enter get_profit_st dalao_address= 7LZVvquLpGbD4cNS7PXACTRaQCNWcRwQMVMMD6TSw9Pf 
+enter get_profit_st dalao_address= 4Q6rYzUsxVqjc253UX9UCz2EbbHXjgRKLzyjwsukfpPW 
+2024-07-10 08:25:21 cur_idx=204 end 
+2024-07-10 08:25:21 cur_idx=201 end 
+2024-07-10 08:25:22 cur_idx=200 end 
+2024-07-10 08:25:22 cur_idx=203 end 
+2024-07-10 08:25:22 cur_idx=202 end 
+2024-07-10 08:25:22 enter get_profit_st dalao_address= DTRtPCdKG9PDRMLDtbmnD8Xh9XRseKwpGESAEisqWGn 
+2024-07-10 08:25:22 enter get_profit_st dalao_address= E8mFb4WhXVVT37C4fp7Vrmefw77PfDyr3N9APuCJCoAc 
+2024-07-10 08:25:22 enter get_profit_st dalao_address= HfX41teh3ps5o6TsmZoT7kpFbbpRtKHZHjUeV9Pty7Cx 
+2024-07-10 08:25:22 enter get_profit_st dalao_address= 8VmbPAXwjXF5u28X6Bt7nSEefuoWrxUP2RSFhqvfuxUF 
+2024-07-10 08:25:22 enter get_profit_st dalao_address= 4KnRuBPSkv6FHGWYsXFPzFX9V359Wcdjqu5nECAnz1xT 
+2024-07-10 08:25:22 cur_idx=205 end 
+2024-07-10 08:25:22 cur_idx=206 end 
+2024-07-10 08:25:22 cur_idx=208 end 
+2024-07-10 08:25:22 cur_idx=209 end 
+2024-07-10 08:25:22 cur_idx=207 end 
+2024-07-10 08:25:222024-07-10 08:25:222024-07-10 08:25:22   enter get_profit_st dalao_address= F5Xsvt6MKs9S78Ggiry7RnGfc3Gm9VMPes8o7w5hMzn7 
+enter get_profit_st dalao_address= 2jk8TQjBjABhRpJSm86rWvpxNU9yyWAwiHcKAEeQUiWL 
+enter get_profit_st dalao_address= 2jzezk7cHATn6zdYw2pmysaqYz9FqkJPv9NTpKwX1hAN 
+2024-07-10 08:25:22 2024-07-10 08:25:22enter get_profit_st dalao_address= CwCPoEr1S5Tpkv8L22iaaiNUHaUjFxALn5FsZUjjsNiS 
+ enter get_profit_st dalao_address= Hvts7WUNA9k72kkVt2YP6z1R85U3C637XqfCNoaYSy3W 
+2024-07-10 08:25:23 cur_idx=211 end 
+2024-07-10 08:25:23 cur_idx=212 end 
+2024-07-10 08:25:23 cur_idx=213 end 
+2024-07-10 08:25:23 cur_idx=210 end 
+2024-07-10 08:25:23 cur_idx=214 end 
+2024-07-10 08:25:232024-07-10 08:25:23  2024-07-10 08:25:23enter get_profit_st dalao_address= EgiHc8SqjNnAsaqB19c1yss9AnmgYjJmrPgypFVqBozG 
+2024-07-10 08:25:23enter get_profit_st dalao_address= 4jtyoKwpogYzWiKnL8Yb7rL1jLyN66VL1b22CWCywPVG 
+ enter get_profit_st dalao_address= DVRhcUFVRnD2g1WVLm8u2VdTMsHiQwDeELwHE7jSUfnT 
+ enter get_profit_st dalao_address= DXCYfW88qKwAiSUayBvLVF3XNaKB8WdGw2h4fF1pYtGz 
+2024-07-10 08:25:23 enter get_profit_st dalao_address= Fk2zvtxbHxiDgdoZGeCwmXG6dN8QyjDFXTvUShopcJHU 
+2024-07-10 08:25:24 cur_idx=217 end 
+2024-07-10 08:25:24 cur_idx=219 end 
+2024-07-10 08:25:24 cur_idx=215 end 
+2024-07-10 08:25:24 cur_idx=218 end 
+2024-07-10 08:25:24 cur_idx=216 end 
+2024-07-10 08:25:24 enter get_profit_st dalao_address= B76awVT8Zgns3HutwC7R47KqWD7DiUxVh5Syo3riSts 
+2024-07-10 08:25:24 enter get_profit_st dalao_address= AvMQh4RWW5D592c4mTcpXpfysYwuWwJWacXZYN5wViXt 
+2024-07-10 08:25:24 enter get_profit_st dalao_address= 2gRf9QYcSNi7RSqpDAwG1VNkrvyqmPgA32dL15xKpzkE 
+2024-07-10 08:25:242024-07-10 08:25:24  enter get_profit_st dalao_address= 7mXohCdQMEidWkvh8v2DD21ZeQ8hoiLtR9UgxXWBChgX 
+enter get_profit_st dalao_address= 2h7s3FpSvc6v2oHke6Uqg191B5fPCeFTmMGnh5oPWhX7 
+2024-07-10 08:25:24 cur_idx=223 end 
+2024-07-10 08:25:24 cur_idx=221 end 
+2024-07-10 08:25:25 cur_idx=224 end 
+2024-07-10 08:25:25 cur_idx=220 end 
+2024-07-10 08:25:25 cur_idx=222 end 
+2024-07-10 08:25:252024-07-10 08:25:25 enter get_profit_st dalao_address= 2YsDS3SdNkq3Y4PaxdeYfds5PjLY4gQQMs82oMyYfBL4 
+ enter get_profit_st dalao_address= 9zVrCjJGqnXTSehtMY3cc15t6oVeu4CDpSvViZWYZUa 
+2024-07-10 08:25:252024-07-10 08:25:25 2024-07-10 08:25:25 enter get_profit_st dalao_address= FeC6eoUA1Y8frBcx1XuZgXerBj5d3CGNwvFVJFpbYEid 
+ enter get_profit_st dalao_address= 7x5FgWwqboGYAms25eGkHCg7bPrusHArwhCy9kBQMy8z 
+enter get_profit_st dalao_address= HHTeEVGU3KUjXKkrbteRExFFjCiodJUxXY6amAUjLgUG 
+2024-07-10 08:25:25 cur_idx=225 end 
+2024-07-10 08:25:25 cur_idx=229 end 
+2024-07-10 08:25:25 cur_idx=226 end 
+2024-07-10 08:25:25 cur_idx=227 end 
+2024-07-10 08:25:26 cur_idx=228 end 
+2024-07-10 08:25:26 enter get_profit_st dalao_address= w1GXiZ458rozCQZTog2x2qrkXKRQjEMWSiSjESx4Q6p 
+2024-07-10 08:25:262024-07-10 08:25:262024-07-10 08:25:26 enter get_profit_st dalao_address= Bkwanva2jqFJqTS1K1LeJooUjYwoZnCGtJfkuVxGFp6w 
+  2024-07-10 08:25:26enter get_profit_st dalao_address= 7v1zaVsjxqRFo35DvNLedZjKEG6g8STZW3J9xNKAniqH 
+enter get_profit_st dalao_address= G7S6kqk8bKHTxkBENCPrNnzAtSPxGZrcDwrfcFKGQtrF 
+ enter get_profit_st dalao_address= GVeiGLyHes2LnonvapBxo7FG1aEZsRA4yxbMJLt3vZiB 
+2024-07-10 08:25:26 cur_idx=230 end 
+2024-07-10 08:25:26 cur_idx=231 end 
+2024-07-10 08:25:26 cur_idx=232 end 
+2024-07-10 08:25:26 cur_idx=233 end 
+2024-07-10 08:25:26 cur_idx=234 end 
+2024-07-10 08:25:26 enter get_profit_st dalao_address= EaDkM3mgx4rrBnvqZamW1WzWpXUsYcKmrNeNbUvieZcg 
+2024-07-10 08:25:26 2024-07-10 08:25:26enter get_profit_st dalao_address= GadvcGntfi2iEKQmXNrJudvT9EtNrMp9cR8jdQoWZzQ7 
+ enter get_profit_st dalao_address= DVWfUJav7CzGqGs1NKc8zhJcjMKBtmheUyZC2i6YBCtr 
+2024-07-10 08:25:26 enter get_profit_st dalao_address= 3WL72gqW4XbzWi5BNNjK6L47DVShU5dYKzGHvHnXQPpu 
+2024-07-10 08:25:26 enter get_profit_st dalao_address= CJGc1RFrViUV7atc2vksLGvhGJePUkZcDj8gYCdogFGG 
+2024-07-10 08:25:26 cur_idx=237 end 
+2024-07-10 08:25:27 cur_idx=238 end 
+2024-07-10 08:25:27 cur_idx=235 end 
+2024-07-10 08:25:27 cur_idx=239 end 
+2024-07-10 08:25:27 cur_idx=236 end 
+2024-07-10 08:25:27 enter get_profit_st dalao_address= 6GE854hDBW4dpD873GsfFAB5aiHaRnrULzGVs4MyC53c 
+2024-07-10 08:25:27 2024-07-10 08:25:272024-07-10 08:25:27 enter get_profit_st dalao_address= HF4qoQHabG5zZsf5hVEWV3pub9Nj94VFRgZVyEQNt2RK 
+enter get_profit_st dalao_address= 12ZZ6CaU1NTt5GwhDoSJ8XSKpmMQFL4UuvYYv2FoRLD3 
+ enter get_profit_st dalao_address= HjojuU5gczPmUWrnsM6GNz9apFtoDsrFdDuoaMAGo4kX 
+2024-07-10 08:25:27 enter get_profit_st dalao_address= DekwpejAnJ4b93wU9kTxSKqdoVHCpoDymWPBww9eeqnm 
+2024-07-10 08:25:27 cur_idx=240 end 
+2024-07-10 08:25:27 cur_idx=243 end 
+2024-07-10 08:25:28 cur_idx=241 end 
+2024-07-10 08:25:28 cur_idx=244 end 
+2024-07-10 08:25:28 cur_idx=242 end 
+2024-07-10 08:25:282024-07-10 08:25:28 2024-07-10 08:25:28enter get_profit_st dalao_address= DUnugDGiaE2CgEfRfb97uLyKz8YV2knxXXjfPqQfi9ej 
+  enter get_profit_st dalao_address= 22x8Lthq4yM6AD6VwiYGo78UASpDJCq3KbKs55NeFtnZ 
+enter get_profit_st dalao_address= 8od7FZxojvXy7Zp9jwo2mWyshrV9MidREtx6i5wu1pvA 
+2024-07-10 08:25:28 enter get_profit_st dalao_address= 8JMreBJW2NgYCUw4q25oAcSUwnJSz5fnNJkU1QeHtieD 
+2024-07-10 08:25:28 enter get_profit_st dalao_address= 3SWGR9ZmJm7vkfCedQ7ppaLgTeWZivpjKVaXFndt6tb8 
+2024-07-10 08:25:28 cur_idx=248 end 
+2024-07-10 08:25:28 cur_idx=249 end 
+2024-07-10 08:25:28 cur_idx=246 end 
+2024-07-10 08:25:28 cur_idx=247 end 
+2024-07-10 08:25:28 cur_idx=245 end 
+2024-07-10 08:25:282024-07-10 08:25:28  enter get_profit_st dalao_address= 8LZPjR1ZLsKiaF758F9vQASDDanFjz6JGfRmUxBnFwYr 
+2024-07-10 08:25:28enter get_profit_st dalao_address= ASCUGaXce4dw8SFbfmk14ct4D17x9TwwhT7vovzJrcMU 
+2024-07-10 08:25:28  enter get_profit_st dalao_address= BYQKaYipvXyaDhnAbHh9fuWpJUjB3doYpymz1zc9bAJC 
+enter get_profit_st dalao_address= AgeUT38Y48m4ebZBFLhZVWnS8GnPL5NkUYjWsPpfde1a 
+2024-07-10 08:25:28 enter get_profit_st dalao_address= B83z3CARNkhQNYLMG2xPM3GhZm4kKReTWP7f9CtwLLXH 
+2024-07-10 08:25:28 cur_idx=254 end 
+2024-07-10 08:25:29 cur_idx=253 end 
+2024-07-10 08:25:29 cur_idx=252 end 
+2024-07-10 08:25:29 cur_idx=251 end 
+2024-07-10 08:25:29 cur_idx=250 end 
+2024-07-10 08:25:29 2024-07-10 08:25:292024-07-10 08:25:29 enter get_profit_st dalao_address= HvUjmTd5eDbPwxWzGwMM6UuWh7CJ9TBaAm3pSnBUBFEc 
+enter get_profit_st dalao_address= GHsojPSbfyNqbFSLhJajU4GnNRdNAtgjn8BDFKBYNzYL 
+ enter get_profit_st dalao_address= 7DXpcXFXquz2duSGdAARjN3iEiHdqySGP4h6KuYHx8fK 
+2024-07-10 08:25:292024-07-10 08:25:29 enter get_profit_st dalao_address= GXK2nQQLbsThLGctQJJcXNjmcygTg4h6rwptx43r8QZj 
+ enter get_profit_st dalao_address= 7hsWydxcfTYEyb12EfRwYsbZPnWEVxEdgwcbX3DupNM 
+2024-07-10 08:25:29 cur_idx=259 end 
+2024-07-10 08:25:29 cur_idx=256 end 
+2024-07-10 08:25:29 cur_idx=258 end 
+2024-07-10 08:25:29 cur_idx=257 end 
+2024-07-10 08:25:30 cur_idx=255 end 
+2024-07-10 08:25:30 2024-07-10 08:25:30 enter get_profit_st dalao_address= 9GyS8aajDTSUMcVVzy3W7JeQMUzwvAWjUgL2ZhWWnQa1 
+2024-07-10 08:25:30 enter get_profit_st dalao_address= 4NAVrr9mEZ7FShN1QaTYtptpNDfJiP1CnKY7ZAaQ33fN 
+enter get_profit_st dalao_address= 4Dq9VKSPVYeoSFeHrYBW58Do8Ntxfw7wdkMstVY6XoAj 
+2024-07-10 08:25:30 2024-07-10 08:25:30 enter get_profit_st dalao_address= 7tE4jyagcP3AcFoL9RDe7V4sV41f9pJnMEQQ7EaTrJZ9 
+enter get_profit_st dalao_address= Cft4hKtC3dVftfqmL2MCALpeCq7oWM7qpftNfVVUzA7h 
+2024-07-10 08:25:30 cur_idx=261 end 
+2024-07-10 08:25:312024-07-10 08:25:31  cur_idx=262 end 
+cur_idx=263 end 
+2024-07-10 08:25:31 cur_idx=260 end 
+2024-07-10 08:25:31 cur_idx=264 end 
+2024-07-10 08:25:31 enter get_profit_st dalao_address= Cft4hKtC3dVftfqmL2MCALpeCq7oWM7qpftNfVVUzA7h 
+2024-07-10 08:25:31 cur_idx=265 end 
+2024-07-10 08:25:32 arr_str_dalaoaddress len= 266 
+2024-07-10 08:25:32 END    008_get_profit_st_solanafm.py ----------------NOTE-----------NOTE---------------
+nohup: ignoring input
+2024-07-10 08:28:54 
+
+
+
+
+
+2024-07-10 08:28:54 ENTER  009_handle_analysis_solanafm.py ----------------NOTE-----------NOTE---------------
+2024-07-10 08:28:54 END    009_handle_analysis_solanafm.py ----------------NOTE-----------NOTE---------------
+nohup: ignoring input
+2024-07-11 05:47:12 
+
+
+
+
+
+2024-07-11 05:47:12 ENTER  002_filter_dalao_tran_dexscreener.py ----------------NOTE-----------NOTE---------------
+2024-07-11 05:47:12 enter CZBYBV2e1x1ZuZ2qkwU5mPNVLFKfVvjSssSNHzSepump
+2024-07-11 05:47:25 enter 5nvGtoJEAj4kM4dyLXuKB3Vvuyi8sLTkTfE5CgdJ765r
+2024-07-11 05:47:30 enter BXFD1Dd1AT87MADC6SYZ95QQQjrTKEnDRwvVhAiLpump
+2024-07-11 05:47:36 enter CqkuYbmExfNPErqmzJ986PJtEydnK7xp8KmnFnwJpump
+2024-07-11 05:47:42 enter CXpAZfK9EyUVtGn7aM3XQxe4grESGMcQXqeRJkz4pump
+2024-07-11 05:47:46 enter G6a6tj8viH1FNdGT9Gym9GnyBQXiiUfzFEjnD5Tfm3kt
+2024-07-11 05:47:54 len df =446
+2024-07-11 05:47:54 END    002_filter_dalao_tran_dexscreener.py ----------------NOTE-----------NOTE---------------
+nohup: ignoring input
+2024-07-11 05:48:15 
+
+
+
+
+
+2024-07-11 05:48:15 ENTER  002_02_unhandle_dalao_drop0balance.py ----------------NOTE-----------NOTE---------------
+2024-07-11 05:48:15 remainder len = 422
+Traceback (most recent call last):
+  File "/home/finddalao/finddalao_sol/src/code/002_02_unhandle_dalao_drop0balance.py", line 70, in <module>
+    filter_onhand_dalao()
+  File "/home/finddalao/finddalao_sol/src/code/002_02_unhandle_dalao_drop0balance.py", line 59, in filter_onhand_dalao
+    df.read_excel(baseclass.dalao_merge_path /
+  File "/usr/local/lib/python3.10/dist-packages/pandas/core/generic.py", line 5989, in __getattr__
+    return object.__getattribute__(self, name)
+AttributeError: 'DataFrame' object has no attribute 'read_excel'
+nohup: ignoring input
+2024-07-11 05:51:39 
+
+
+
+
+
+2024-07-11 05:51:39 ENTER  002_02_unhandle_dalao_drop0balance.py ----------------NOTE-----------NOTE---------------
+2024-07-11 05:51:39 remainder len = 422
+2024-07-11 05:51:40 remainder len = 421
+2024-07-11 05:51:40 remainder len = 420
+2024-07-11 05:51:40 remainder len = 419
+2024-07-11 05:51:41 remainder len = 418
+2024-07-11 05:51:41 remainder len = 417
+2024-07-11 05:51:41 remainder len = 416
+2024-07-11 05:51:41 remainder len = 415
+2024-07-11 05:51:42 remainder len = 414
+2024-07-11 05:51:42 remainder len = 413
+2024-07-11 05:51:42 remainder len = 412
+2024-07-11 05:51:42 remainder len = 411
+2024-07-11 05:51:42 remainder len = 410
+2024-07-11 05:51:43 remainder len = 409
+2024-07-11 05:51:43 remainder len = 408
+2024-07-11 05:51:43 remainder len = 407
+2024-07-11 05:51:43 remainder len = 406
+2024-07-11 05:51:43 remainder len = 405
+2024-07-11 05:51:44 remainder len = 404
+2024-07-11 05:51:44 remainder len = 403
+2024-07-11 05:51:44 remainder len = 402
+2024-07-11 05:51:44 remainder len = 401
+2024-07-11 05:51:45 remainder len = 400
+2024-07-11 05:51:45 remainder len = 399
+2024-07-11 05:51:45 remainder len = 398
+2024-07-11 05:51:45 remainder len = 397
+2024-07-11 05:51:45 remainder len = 396
+2024-07-11 05:51:46 remainder len = 395
+2024-07-11 05:51:46 remainder len = 394
+2024-07-11 05:51:46 remainder len = 393
+2024-07-11 05:51:46 remainder len = 392
+2024-07-11 05:51:47 remainder len = 391
+2024-07-11 05:51:47 remainder len = 390
+2024-07-11 05:51:47 remainder len = 389
+2024-07-11 05:51:47 remainder len = 388
+2024-07-11 05:51:47 remainder len = 387
+2024-07-11 05:51:48 remainder len = 386
+2024-07-11 05:51:48 remainder len = 385
+2024-07-11 05:51:48 remainder len = 384
+2024-07-11 05:51:48 remainder len = 383
+2024-07-11 05:51:48 remainder len = 382
+2024-07-11 05:51:49 remainder len = 381
+2024-07-11 05:51:49 remainder len = 380
+2024-07-11 05:51:49 remainder len = 379
+2024-07-11 05:51:49 remainder len = 378
+2024-07-11 05:51:49 remainder len = 377
+2024-07-11 05:51:50 remainder len = 376
+2024-07-11 05:51:50 remainder len = 375
+2024-07-11 05:51:50 remainder len = 374
+2024-07-11 05:51:50 remainder len = 373
+2024-07-11 05:51:51 remainder len = 372
+2024-07-11 05:51:51 remainder len = 371
+2024-07-11 05:51:52 remainder len = 370
+2024-07-11 05:51:52 remainder len = 369
+2024-07-11 05:51:52 remainder len = 368
+2024-07-11 05:51:53 remainder len = 367
+2024-07-11 05:51:53 remainder len = 366
+2024-07-11 05:51:53 remainder len = 365
+2024-07-11 05:51:53 remainder len = 364
+2024-07-11 05:51:54 remainder len = 363
+2024-07-11 05:51:54 remainder len = 362
+2024-07-11 05:51:54 remainder len = 361
+2024-07-11 05:51:55 remainder len = 360
+2024-07-11 05:51:56 remainder len = 359
+2024-07-11 05:51:56 remainder len = 358
+2024-07-11 05:51:56 remainder len = 357
+2024-07-11 05:51:57 remainder len = 356
+2024-07-11 05:51:58 remainder len = 355
+2024-07-11 05:51:58 remainder len = 354
+2024-07-11 05:51:58 remainder len = 353
+2024-07-11 05:51:58 remainder len = 352
+2024-07-11 05:51:58 remainder len = 351
+2024-07-11 05:51:59 remainder len = 350
+2024-07-11 05:51:59 remainder len = 349
+2024-07-11 05:51:59 remainder len = 348
+2024-07-11 05:51:59 remainder len = 347
+2024-07-11 05:52:00 remainder len = 346
+2024-07-11 05:52:00 remainder len = 345
+2024-07-11 05:52:00 remainder len = 344
+2024-07-11 05:52:00 remainder len = 343
+2024-07-11 05:52:01 remainder len = 342
+2024-07-11 05:52:01 remainder len = 341
+2024-07-11 05:52:02 remainder len = 340
+2024-07-11 05:52:02 remainder len = 339
+2024-07-11 05:52:03 remainder len = 338
+2024-07-11 05:52:03 remainder len = 337
+2024-07-11 05:52:03 remainder len = 336
+2024-07-11 05:52:03 remainder len = 335
+2024-07-11 05:52:04 remainder len = 334
+2024-07-11 05:52:04 remainder len = 333
+2024-07-11 05:52:04 remainder len = 332
+2024-07-11 05:52:04 remainder len = 331
+2024-07-11 05:52:05 remainder len = 330
+2024-07-11 05:52:05 remainder len = 329
+2024-07-11 05:52:06 remainder len = 328
+2024-07-11 05:52:07 remainder len = 327
+2024-07-11 05:52:07 remainder len = 326
+2024-07-11 05:52:08 remainder len = 325
+2024-07-11 05:52:09 remainder len = 324
+2024-07-11 05:52:09 remainder len = 323
+2024-07-11 05:52:10 remainder len = 322
+2024-07-11 05:52:11 remainder len = 321
+2024-07-11 05:52:11 remainder len = 320
+2024-07-11 05:52:11 remainder len = 319
+2024-07-11 05:52:11 remainder len = 318
+2024-07-11 05:52:12 remainder len = 317
+2024-07-11 05:52:12 remainder len = 316
+2024-07-11 05:52:12 remainder len = 315
+2024-07-11 05:52:12 remainder len = 314
+2024-07-11 05:52:13 remainder len = 313
+2024-07-11 05:52:13 remainder len = 312
+2024-07-11 05:52:13 remainder len = 311
+2024-07-11 05:52:13 remainder len = 310
+2024-07-11 05:52:13 remainder len = 309
+2024-07-11 05:52:14 remainder len = 308
+2024-07-11 05:52:14 remainder len = 307
+2024-07-11 05:52:14 remainder len = 306
+2024-07-11 05:52:14 remainder len = 305
+2024-07-11 05:52:15 remainder len = 304
+2024-07-11 05:52:15 remainder len = 303
+2024-07-11 05:52:15 remainder len = 302
+2024-07-11 05:52:15 remainder len = 301
+2024-07-11 05:52:16 remainder len = 300
+2024-07-11 05:52:16 remainder len = 299
+2024-07-11 05:52:16 remainder len = 298
+2024-07-11 05:52:16 remainder len = 297
+2024-07-11 05:52:17 remainder len = 296
+2024-07-11 05:52:17 remainder len = 295
+2024-07-11 05:52:17 remainder len = 294
+2024-07-11 05:52:17 remainder len = 293
+2024-07-11 05:52:18 remainder len = 292
+2024-07-11 05:52:18 remainder len = 291
+2024-07-11 05:52:18 remainder len = 290
+2024-07-11 05:52:18 remainder len = 289
+2024-07-11 05:52:18 remainder len = 288
+2024-07-11 05:52:19 remainder len = 287
+2024-07-11 05:52:19 remainder len = 286
+2024-07-11 05:52:19 remainder len = 285
+2024-07-11 05:52:19 remainder len = 284
+2024-07-11 05:52:19 remainder len = 283
+2024-07-11 05:52:20 remainder len = 282
+2024-07-11 05:52:20 remainder len = 281
+2024-07-11 05:52:20 remainder len = 280
+2024-07-11 05:52:20 remainder len = 279
+2024-07-11 05:52:20 remainder len = 278
+2024-07-11 05:52:21 remainder len = 277
+2024-07-11 05:52:21 remainder len = 276
+2024-07-11 05:52:21 remainder len = 275
+2024-07-11 05:52:21 remainder len = 274
+2024-07-11 05:52:21 remainder len = 273
+2024-07-11 05:52:22 remainder len = 272
+2024-07-11 05:52:22 remainder len = 271
+2024-07-11 05:52:22 remainder len = 270
+2024-07-11 05:52:22 remainder len = 269
+2024-07-11 05:52:23 remainder len = 268
+2024-07-11 05:52:23 remainder len = 267
+2024-07-11 05:52:23 remainder len = 266
+2024-07-11 05:52:23 remainder len = 265
+2024-07-11 05:52:23 remainder len = 264
+2024-07-11 05:52:24 remainder len = 263
+2024-07-11 05:52:24 remainder len = 262
+2024-07-11 05:52:24 remainder len = 261
+2024-07-11 05:52:24 remainder len = 260
+2024-07-11 05:52:24 remainder len = 259
+2024-07-11 05:52:25 remainder len = 258
+2024-07-11 05:52:25 remainder len = 257
+2024-07-11 05:52:25 remainder len = 256
+2024-07-11 05:52:25 remainder len = 255
+2024-07-11 05:52:25 remainder len = 254
+2024-07-11 05:52:26 remainder len = 253
+2024-07-11 05:52:26 remainder len = 252
+2024-07-11 05:52:26 remainder len = 251
+2024-07-11 05:52:26 remainder len = 250
+2024-07-11 05:52:27 remainder len = 249
+2024-07-11 05:52:27 remainder len = 248
+2024-07-11 05:52:27 remainder len = 247
+2024-07-11 05:52:27 remainder len = 246
+2024-07-11 05:52:27 remainder len = 245
+2024-07-11 05:52:28 remainder len = 244
+2024-07-11 05:52:28 remainder len = 243
+2024-07-11 05:52:28 remainder len = 242
+2024-07-11 05:52:28 remainder len = 241
+2024-07-11 05:52:28 remainder len = 240
+2024-07-11 05:52:29 remainder len = 239
+2024-07-11 05:52:29 remainder len = 238
+2024-07-11 05:52:29 remainder len = 237
+2024-07-11 05:52:29 remainder len = 236
+2024-07-11 05:52:29 remainder len = 235
+2024-07-11 05:52:30 remainder len = 234
+2024-07-11 05:52:30 remainder len = 233
+2024-07-11 05:52:30 remainder len = 232
+2024-07-11 05:52:30 remainder len = 231
+2024-07-11 05:52:30 remainder len = 230
+2024-07-11 05:52:31 remainder len = 229
+2024-07-11 05:52:31 remainder len = 228
+2024-07-11 05:52:31 remainder len = 227
+2024-07-11 05:52:31 remainder len = 226
+2024-07-11 05:52:31 remainder len = 225
+2024-07-11 05:52:32 remainder len = 224
+2024-07-11 05:52:32 remainder len = 223
+2024-07-11 05:52:32 remainder len = 222
+2024-07-11 05:52:32 remainder len = 221
+2024-07-11 05:52:33 remainder len = 220
+2024-07-11 05:52:33 remainder len = 219
+2024-07-11 05:52:33 remainder len = 218
+2024-07-11 05:52:33 remainder len = 217
+2024-07-11 05:52:33 remainder len = 216
+2024-07-11 05:52:34 remainder len = 215
+2024-07-11 05:52:34 remainder len = 214
+2024-07-11 05:52:34 remainder len = 213
+2024-07-11 05:52:34 remainder len = 212
+2024-07-11 05:52:34 remainder len = 211
+2024-07-11 05:52:35 remainder len = 210
+2024-07-11 05:52:35 remainder len = 209
+2024-07-11 05:52:35 remainder len = 208
+2024-07-11 05:52:35 remainder len = 207
+2024-07-11 05:52:35 remainder len = 206
+2024-07-11 05:52:36 remainder len = 205
+2024-07-11 05:52:36 remainder len = 204
+2024-07-11 05:52:36 remainder len = 203
+2024-07-11 05:52:36 remainder len = 202
+2024-07-11 05:52:36 remainder len = 201
+2024-07-11 05:52:37 remainder len = 200
+2024-07-11 05:52:37 remainder len = 199
+2024-07-11 05:52:37 remainder len = 198
+2024-07-11 05:52:37 remainder len = 197
+2024-07-11 05:52:38 remainder len = 196
+2024-07-11 05:52:38 remainder len = 195
+2024-07-11 05:52:38 remainder len = 194
+2024-07-11 05:52:39 remainder len = 193
+2024-07-11 05:52:39 remainder len = 192
+2024-07-11 05:52:39 remainder len = 191
+2024-07-11 05:52:40 remainder len = 190
+2024-07-11 05:52:40 remainder len = 189
+2024-07-11 05:52:40 remainder len = 188
+2024-07-11 05:52:40 remainder len = 187
+2024-07-11 05:52:40 remainder len = 186
+2024-07-11 05:52:41 remainder len = 185
+2024-07-11 05:52:41 remainder len = 184
+2024-07-11 05:52:41 remainder len = 183
+2024-07-11 05:52:41 remainder len = 182
+2024-07-11 05:52:41 remainder len = 181
+2024-07-11 05:52:42 remainder len = 180
+2024-07-11 05:52:42 remainder len = 179
+2024-07-11 05:52:42 remainder len = 178
+2024-07-11 05:52:42 remainder len = 177
+2024-07-11 05:52:42 remainder len = 176
+2024-07-11 05:52:43 remainder len = 175
+2024-07-11 05:52:43 remainder len = 174
+2024-07-11 05:52:43 remainder len = 173
+2024-07-11 05:52:43 remainder len = 172
+2024-07-11 05:52:43 remainder len = 171
+2024-07-11 05:52:44 remainder len = 170
+2024-07-11 05:52:44 remainder len = 169
+2024-07-11 05:52:44 remainder len = 168
+2024-07-11 05:52:45 remainder len = 167
+2024-07-11 05:52:45 remainder len = 166
+2024-07-11 05:52:45 remainder len = 165
+2024-07-11 05:52:45 remainder len = 164
+2024-07-11 05:52:46 remainder len = 163
+2024-07-11 05:52:46 remainder len = 162
+2024-07-11 05:52:46 remainder len = 161
+2024-07-11 05:52:46 remainder len = 160
+2024-07-11 05:52:46 remainder len = 159
+2024-07-11 05:52:47 remainder len = 158
+2024-07-11 05:52:47 remainder len = 157
+2024-07-11 05:52:47 remainder len = 156
+2024-07-11 05:52:47 remainder len = 155
+2024-07-11 05:52:48 remainder len = 154
+2024-07-11 05:52:48 remainder len = 153
+2024-07-11 05:52:48 remainder len = 152
+2024-07-11 05:52:48 remainder len = 151
+2024-07-11 05:52:48 remainder len = 150
+2024-07-11 05:52:49 remainder len = 149
+2024-07-11 05:52:49 remainder len = 148
+2024-07-11 05:52:49 remainder len = 147
+2024-07-11 05:52:49 remainder len = 146
+2024-07-11 05:52:49 remainder len = 145
+2024-07-11 05:52:50 remainder len = 144
+2024-07-11 05:52:50 remainder len = 143
+2024-07-11 05:52:50 remainder len = 142
+2024-07-11 05:52:50 remainder len = 141
+2024-07-11 05:52:50 remainder len = 140
+2024-07-11 05:52:51 remainder len = 139
+2024-07-11 05:52:51 remainder len = 138
+2024-07-11 05:52:51 remainder len = 137
+2024-07-11 05:52:51 remainder len = 136
+2024-07-11 05:52:52 remainder len = 135
+2024-07-11 05:52:52 remainder len = 134
+2024-07-11 05:52:52 remainder len = 133
+2024-07-11 05:52:52 remainder len = 132
+2024-07-11 05:52:52 remainder len = 131
+2024-07-11 05:52:53 remainder len = 130
+2024-07-11 05:52:53 remainder len = 129
+2024-07-11 05:52:53 remainder len = 128
+2024-07-11 05:52:54 remainder len = 127
+2024-07-11 05:52:54 remainder len = 126
+2024-07-11 05:52:54 remainder len = 125
+2024-07-11 05:52:54 remainder len = 124
+2024-07-11 05:52:54 remainder len = 123
+2024-07-11 05:52:55 remainder len = 122
+2024-07-11 05:52:55 remainder len = 121
+2024-07-11 05:52:55 remainder len = 120
+2024-07-11 05:52:55 remainder len = 119
+2024-07-11 05:52:55 remainder len = 118
+2024-07-11 05:52:56 remainder len = 117
+2024-07-11 05:52:56 remainder len = 116
+2024-07-11 05:52:56 remainder len = 115
+2024-07-11 05:52:56 remainder len = 114
+2024-07-11 05:52:56 remainder len = 113
+2024-07-11 05:52:57 remainder len = 112
+2024-07-11 05:52:57 remainder len = 111
+2024-07-11 05:52:57 remainder len = 110
+2024-07-11 05:52:57 remainder len = 109
+2024-07-11 05:52:58 remainder len = 108
+2024-07-11 05:52:58 remainder len = 107
+2024-07-11 05:52:58 remainder len = 106
+2024-07-11 05:52:59 remainder len = 105
+2024-07-11 05:52:59 remainder len = 104
+2024-07-11 05:52:59 remainder len = 103
+2024-07-11 05:52:59 remainder len = 102
+2024-07-11 05:53:00 remainder len = 101
+2024-07-11 05:53:00 remainder len = 100
+2024-07-11 05:53:00 remainder len = 99
+2024-07-11 05:53:00 remainder len = 98
+2024-07-11 05:53:00 remainder len = 97
+2024-07-11 05:53:00 remainder len = 96
+2024-07-11 05:53:01 remainder len = 95
+2024-07-11 05:53:01 remainder len = 94
+2024-07-11 05:53:01 remainder len = 93
+2024-07-11 05:53:01 remainder len = 92
+2024-07-11 05:53:01 remainder len = 91
+2024-07-11 05:53:02 remainder len = 90
+2024-07-11 05:53:02 remainder len = 89
+2024-07-11 05:53:02 remainder len = 88
+2024-07-11 05:53:02 remainder len = 87
+2024-07-11 05:53:03 remainder len = 86
+2024-07-11 05:53:03 remainder len = 85
+2024-07-11 05:53:03 remainder len = 84
+2024-07-11 05:53:03 remainder len = 83
+2024-07-11 05:53:03 remainder len = 82
+2024-07-11 05:53:05 remainder len = 81
+2024-07-11 05:53:05 remainder len = 80
+2024-07-11 05:53:05 remainder len = 79
+2024-07-11 05:53:05 remainder len = 78
+2024-07-11 05:53:05 remainder len = 77
+2024-07-11 05:53:06 remainder len = 76
+2024-07-11 05:53:06 remainder len = 75
+2024-07-11 05:53:07 remainder len = 74
+2024-07-11 05:53:07 remainder len = 73
+2024-07-11 05:53:07 remainder len = 72
+2024-07-11 05:53:07 remainder len = 71
+2024-07-11 05:53:08 remainder len = 70
+2024-07-11 05:53:08 remainder len = 69
+2024-07-11 05:53:08 remainder len = 68
+2024-07-11 05:53:08 remainder len = 67
+2024-07-11 05:53:08 remainder len = 66
+2024-07-11 05:53:08 remainder len = 65
+2024-07-11 05:53:09 remainder len = 64
+2024-07-11 05:53:09 remainder len = 63
+2024-07-11 05:53:09 remainder len = 62
+2024-07-11 05:53:09 remainder len = 61
+2024-07-11 05:53:09 remainder len = 60
+2024-07-11 05:53:10 remainder len = 59
+2024-07-11 05:53:10 remainder len = 58
+2024-07-11 05:53:10 remainder len = 57
+2024-07-11 05:53:10 remainder len = 56
+2024-07-11 05:53:11 remainder len = 55
+2024-07-11 05:53:11 remainder len = 54
+2024-07-11 05:53:11 remainder len = 53
+2024-07-11 05:53:11 remainder len = 52
+2024-07-11 05:53:11 remainder len = 51
+2024-07-11 05:53:12 remainder len = 50
+2024-07-11 05:53:12 remainder len = 49
+2024-07-11 05:53:12 remainder len = 48
+2024-07-11 05:53:13 remainder len = 47
+2024-07-11 05:53:13 remainder len = 46
+2024-07-11 05:53:13 remainder len = 45
+2024-07-11 05:53:13 remainder len = 44
+2024-07-11 05:53:14 remainder len = 43
+2024-07-11 05:53:14 remainder len = 42
+2024-07-11 05:53:14 remainder len = 41
+2024-07-11 05:53:14 remainder len = 40
+2024-07-11 05:53:14 remainder len = 39
+2024-07-11 05:53:15 remainder len = 38
+2024-07-11 05:53:15 remainder len = 37
+2024-07-11 05:53:15 remainder len = 36
+2024-07-11 05:53:15 remainder len = 35
+2024-07-11 05:53:15 remainder len = 34
+2024-07-11 05:53:16 remainder len = 33
+2024-07-11 05:53:16 remainder len = 32
+2024-07-11 05:53:16 remainder len = 31
+2024-07-11 05:53:16 remainder len = 30
+2024-07-11 05:53:16 remainder len = 29
+2024-07-11 05:53:17 remainder len = 28
+2024-07-11 05:53:17 remainder len = 27
+2024-07-11 05:53:17 remainder len = 26
+2024-07-11 05:53:17 remainder len = 25
+2024-07-11 05:53:17 remainder len = 24
+2024-07-11 05:53:18 remainder len = 23
+2024-07-11 05:53:18 remainder len = 22
+2024-07-11 05:53:18 remainder len = 21
+2024-07-11 05:53:18 remainder len = 20
+2024-07-11 05:53:19 remainder len = 19
+2024-07-11 05:53:19 remainder len = 18
+2024-07-11 05:53:19 remainder len = 17
+2024-07-11 05:53:19 remainder len = 16
+2024-07-11 05:53:19 remainder len = 15
+2024-07-11 05:53:20 remainder len = 14
+2024-07-11 05:53:20 remainder len = 13
+2024-07-11 05:53:20 remainder len = 12
+2024-07-11 05:53:20 remainder len = 11
+2024-07-11 05:53:20 remainder len = 10
+2024-07-11 05:53:21 remainder len = 9
+2024-07-11 05:53:21 remainder len = 8
+2024-07-11 05:53:21 remainder len = 7
+2024-07-11 05:53:21 remainder len = 6
+2024-07-11 05:53:21 remainder len = 5
+2024-07-11 05:53:22 remainder len = 4
+2024-07-11 05:53:22 remainder len = 3
+2024-07-11 05:53:22 remainder len = 2
+2024-07-11 05:53:22 remainder len = 1
+Traceback (most recent call last):
+  File "/home/finddalao/finddalao_sol/src/code/002_02_unhandle_dalao_drop0balance.py", line 70, in <module>
+    
+  File "/home/finddalao/finddalao_sol/src/code/002_02_unhandle_dalao_drop0balance.py", line 64, in filter_onhand_dalao
+    
+  File "/usr/local/lib/python3.10/dist-packages/pandas/core/generic.py", line 5989, in __getattr__
+    return object.__getattribute__(self, name)
+AttributeError: 'DataFrame' object has no attribute 'read_excel'

+ 190 - 0
src/code/ori_dextools_sel_py

@@ -0,0 +1,190 @@
+from selenium import webdriver
+from selenium.webdriver.common.keys import Keys
+from selenium.webdriver.common.by import By
+from selenium.webdriver.support import expected_conditions as EC
+from selenium.common.exceptions outException
+from selenium.webdriver import ActionChains
+from selenium.webdriver.support.wait import WebDriverWait
+
+import pandas as pd
+import numpy as np
+import random
+import time
+
+def InitWeb(driver, wait):
+
+    time.sleep(8)
+
+    search_card = driver.find_element(By.XPATH, "//div[@class='search card']")
+    chain = search_card.find_element(By.XPATH, "./div[0]")
+
+    try:
+        closebutton = driver.find_elements(
+            By.XPATH, "//button[contains(@class, 'close')]"
+        )
+        for button in closebutton:
+            button.click()
+            time.sleep(0.5)
+    except:
+        pass
+    time.sleep(3)
+    infocon = wait.until(
+        EC.presence_of_element_located(
+            (
+                By.XPATH,
+                "//div[@class='user-info-container']//div[contains(@class, 'open-settings')]",
+            )
+        )
+    )
+    infocon.click()
+    langselect = wait.until(
+        EC.presence_of_element_located(
+            (
+                By.XPATH,
+                "//div[@class='panel-container__body']//app-dropdown-select[@id='language']",
+            )
+        )
+    )
+
+    time.sleep(6)
+    if langselect.text.strip() != "English":
+        x = langselect.location["x"] + langselect.size["width"] / 2
+        y = langselect.location["y"] + langselect.size["height"] / 2
+        action = ActionChains(driver)
+        action.reset_actions()
+        action.move_by_offset(x, y).click().perform()
+        selectlist = wait.until(
+            EC.presence_of_element_located(
+                (By.XPATH, "//div[contains(@class, 'dropdown-list')]")
+            )
+        )
+        engselected = selectlist.find_element(By.XPATH, "./div[1]")
+        x = engselected.location["x"] + engselected.size["width"] / 2
+        y = engselected.location["y"] + engselected.size["height"] / 2
+        action.reset_actions()
+        action.move_by_offset(x, y).click().perform()
+        time.sleep(5)
+        closebutton = driver.find_element(
+            By.XPATH,
+            "//div[contains(@class,'panel-container')]//button[contains(@class, 'close')]",
+        )
+        closebutton.click()
+
+    time.sleep(5)
+
+
+# 显示等待方法
+# WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
+readfile = "./dextoolsselinium/"
+errwritefile = "./dextoolsselinium/"
+csvname = "err-bsc-0318134801"
+
+with open("./dextoolsselinium/dexttraders.js", "r", encoding="utf-8") as f:
+    scrollscript = f.read()
+
+# df = pd.read_csv(f"./0-AveTokenList/{csvname}.csv",  encoding='utf-8')
+df = pd.read_csv(f"{readfile}{csvname}.csv", encoding="utf-8")
+# df = pd.read_csv("./dextoolsselinium/errbsc-0318134802.csv",
+#                  encoding='latin-1')
+
+# df = pd.read_excel(
+#     "./dextoolsselinium/errbsc-0318134801.xlsx")
+
+# df = df.drop(index=range(60))
+# print(df)
+
+addlists = [[x, y] for x, y in zip(df["Pair"], df["Tokenaddress"])]
+
+errortokens = [["Pair", "Tokenaddress"]]
+driver = webdriver.Chrome()
+url = "https://www.dextools.io/app/en"
+driver.get(url)
+driver.maximize_window()
+
+wait = WebDriverWait(driver, 15, ignored_exceptions=None)
+driver.set_script_timeout(250)
+
+# Enter_setEnglish(driver, wait)
+# addlists = [["sWirl/WBNB", "0x93c8d3777824db6e21cfdc06a528151ba752a9ea"]]
+for pair, tokenadd in addlists:
+    try:
+        print(f"{pair} begin")
+
+        time.sleep(random.uniform(4, 5))
+        header = wait.until(lambda x: x.find_element(By.TAG_NAME, "header"))
+        # searchinput = wait.until(lambda x: x.find_element(By.TAG_NAME, "input"))
+
+        searchinput = header.find_element(By.TAG_NAME, "input")
+        searchinput.send_keys(tokenadd)
+        time.sleep(10)
+
+        divelement = wait.until(
+            EC.presence_of_element_located(
+                (By.XPATH, "//div[contains(@class, 'search-results')]")
+            )
+        )
+        ulelement = divelement.find_element(By.TAG_NAME, "ul")
+        # print(ulelement.get_attribute("outerHTML"))
+        linum = int(divelement.find_element(
+            By.XPATH, "./div").text.strip().split()[0])
+        # print("linum", linum)
+
+        lielements = ulelement.find_elements(By.XPATH, "./li")
+        # print(lielements)
+        lielements = lielements[:linum]
+        try:
+            lielement = None
+            # print('pair',pair)
+            for i in range(linum):
+                # print(i,lielements[i].text,'replace',lielements[i].text.replace("\n", ""))
+                # print(i,)
+                if pair == lielements[i].find_element(
+                    By.XPATH, ".//app-token-name"
+                ).text.replace("\n", ""):
+                    lielement = lielements[i]
+                    break
+
+            liclick = lielement.find_element(By.XPATH, "./div")
+            liclick.click()
+        except:
+            # close-search ng-tns-c151-6 ng-star-inserted
+            closebutotn = driver.find_element(
+                By.XPATH, "//button[contains(@class,'close-search')]"
+            )
+            closebutotn.click()
+            raise
+
+            # print(liclick.get_attribute("outerHTML"))
+
+        time.sleep(random.uniform(8, 10))
+        # driver.execute_async_script(scrollscript)
+        wait.until(EC.presence_of_element_located(
+            (By.XPATH, "//datatable-body")))
+        # driver.execute_async_script(scrollscript)
+        driver.execute_script(scrollscript)
+
+    except TimeoutException as e:
+        # print('timeout', e)
+        print(f"time {pair}")
+        errortokens.append([pair, tokenadd])
+        # raise
+        # continue
+        # break
+    except Exception as e:
+        print(f"error {pair}")
+        errortokens.append([pair, tokenadd])
+        # print(e)
+        # raise
+        # break
+
+        # continue
+
+print("ready quit")
+time.sleep(300)
+
+driver.quit()  # 退出时自动清理临时文件
+
+
+errdf = pd.DataFrame(errortokens)
+print("errortokens list", errortokens)
+errdf.to_csv(f"{errwritefile}err-{csvname}.csv", index=False)

+ 33 - 0
src/code/set_utctime_solscan.js

@@ -0,0 +1,33 @@
+
+function sleep(sleepdelay) {
+    return new Promise((resolve, reject) => {
+        setTimeout(() => {
+            resolve(sleepdelay);
+        }, sleepdelay);
+    })
+}
+
+
+async function set_utctime_solscan() {
+    try {
+        let table_ = document.querySelector("table.w-full");
+        let thead_ = table_.getElementsByTagName("thead")[0];
+        let arr_th_ = Array.from(thead_.getElementsByTagName("th"));
+        let time_click_ = arr_th_[2].querySelectorAll("div.items-center.cursor-pointer")[0];
+        if (arr_th_[2].innerText.trim() == "Time") {
+            time_click_.click();
+        }
+
+    } catch (e) {
+        await sleep(1000);
+
+    }
+
+}
+
+
+(async function () {
+    await set_utctime_solscan();
+
+
+})();

+ 152 - 0
src/code/tamper_dexscreen_getnewpair_test.js

@@ -0,0 +1,152 @@
+// ==UserScript==
+// @name         DexScreen-GetNewPair
+// @namespace    http://tampermonkey.net/
+// @version      0.1
+// @description  try to take over the world!
+// @author       You
+// @match        https://dexscreener.com/new-pairs*
+// @icon         https://www.google.com/s2/favicons?sz=64&domain=dexscreener.com
+// @grant        none
+// ==/UserScript==
+
+// maker 降序
+// https://dexscreener.com/new-pairs?rankBy=pairAge&order=asc&chainIds=solana&dexIds=raydium&minLiq=2000&minAge=4&maxAge=48&min24HTxns=900&min24HBuys=800&min24HSells=800&min24HChg=100
+
+function funcDownload(content, filename) {
+    console.log('begin download');
+    // 创建隐藏的可下载链接
+    var eleLink = document.createElement('a');
+    eleLink.download = filename;
+    eleLink.style.display = 'none';
+    // 字符内容转变成blob地址
+    var blob = new Blob([content]);
+    eleLink.href = URL.createObjectURL(blob);
+    // 触发点击
+    document.body.appendChild(eleLink);
+    eleLink.click();
+    // 然后移除
+    document.body.removeChild(eleLink);
+}
+
+
+function sleep(sleepdelay) {
+    return new Promise((resolve, reject) => {
+        setTimeout(() => {
+            resolve(sleepdelay);
+        }, sleepdelay);
+    })
+}
+
+
+function getCurrentTime() {
+    const zeroFill = (i) => {
+        if (i >= 0 && i <= 9) {
+            return "0" + i;
+        } else {
+            return '' + i;
+        }
+
+    }
+    let date = new Date();//当前时间
+    let year = date.getFullYear();
+    let month = zeroFill(date.getMonth() + 1);//月
+    let day = zeroFill(date.getDate());//日
+    let hour = zeroFill(date.getHours());//时
+    let minute = zeroFill(date.getMinutes());//分
+    let second = zeroFill(date.getSeconds());//秒
+
+    //当前时间
+    var curTime = year + month + day + '_' + hour + minute + second;
+    return curTime;
+}
+
+
+(async function () {
+
+    await sleep(4000);
+    console.log("enter ")
+    var res = [];
+
+    var mydivbox = document.createElement("div");
+    //var input = document.createElement("input")
+    var button = document.createElement("button");//创建一个按钮
+    //mydivbox.appendChild(input);
+    mydivbox.appendChild(button);
+    //input.value = "350";
+    //input.className = "tam-myinput"
+    //input.type = "number"
+    button.className = "tam-mybutton"
+    button.textContent = "upstep"; //按钮内容
+    button.style.width = "100px"; //按钮宽度
+    button.style.height = "30px"; //按钮高度
+    button.style.align = "center"; //文本居中
+    button.style.color = "blue"; //按钮文字颜色
+    button.style.background = "#e33e33"; //按钮底色
+    button.style.border = "1px solid #e33e33"; //边框属性
+    //button.style.borderRadius = "4px"; //按钮四个角弧度
+
+    mydivbox.style.position = "fixed";
+    mydivbox.style.top = "60px";
+    mydivbox.style.right = "60px";
+
+    // var main_div = document.getElementsByTagName("main")[0];
+    // chakra-button__group custom-1itqpek
+
+    // var parent_div = main_div.getElementsByClassName("custom-12szi09")[0];
+    // console.log("parent_div.getElementsByClassName", parent_div.getElementsByClassName("custom-1itqpek")[0])
+    // parent_div.insertBefore(mydivbox, parent_div.getElementsByClassName("chakra-button__group")[0]);
+    // parent_div.appendChild(mydivbox);
+    document.body.appendChild(mydivbox)
+
+
+    button.addEventListener("click", clickBotton); //监听按钮点击事件
+
+
+    function clickBotton() {
+        console.log("entere clickBotton");
+        res = [];
+
+        let table_div = document.querySelector('.ds-dex-table.ds-dex-table-new');
+        // let theadtitles = table_div.querySelector('.ds-dex-table-th');
+        // let titlearr = theadtitles.innerText.trim().split(/\r?\n/);
+        let titlearr = ["TokenIdx", 'PairAddress', 'TokenName', 'QuoteToken', 'Age', "Buys", "Sells", "Makers", 'Liquidity', 'Fdv']
+        res.push(titlearr);
+        let tbodytrs_arr = table_div.getElementsByTagName('a');
+        for (let i = 0; i < tbodytrs_arr.length; i++) {
+            let tdtexts = []
+            let tbodytr = tbodytrs_arr[i];
+            let tds_arr = tbodytr.querySelectorAll('.ds-table-data-cell');
+            let token_address = tbodytr.href.trim().split('/').pop();
+            let token_idx = tbodytr.getElementsByClassName("ds-dex-table-row-badge-pair-no")[0].innerText.trim().replace(/#/g, '');
+            let token_name = tbodytr.getElementsByClassName('ds-dex-table-row-base-token-symbol')[0].innerText.trim();
+            let quote_token = tbodytr.getElementsByClassName('ds-dex-table-row-quote-token-symbol')[0].innerText.trim();
+            let pair_age = tbodytr.getElementsByClassName('ds-dex-table-row-col-pair-age')[0].innerText.trim();
+
+            let pair_buys = tds_arr[3].innerText.trim().replace(/,/g, '');
+            let pair_sells = tds_arr[4].innerText.trim().replace(/,/g, '');
+            let pair_makers = tds_arr[6].innerText.trim().replace(/,/g, '');
+            let pair_liquidity = tds_arr[tds_arr.length - 2].innerText.trim().replace(/[$]/, '');
+            let pair_fdv = tds_arr[tds_arr.length - 1].innerText.trim().replace(/[$]/g, '');
+
+            tdtexts = [token_idx, token_address, token_name, quote_token, pair_age, pair_buys, pair_sells, pair_makers, pair_liquidity, pair_fdv];
+            res.push(tdtexts);
+        }
+
+
+        res.forEach((val, index, arr) => { arr[index] = val.join() + "\n" });
+        let curTime = getCurrentTime();
+        let urlpathname = window.location.pathname.slice(1).split('/').pop();
+        urlpathname = urlpathname.replaceAll('-', "_");
+
+
+        funcDownload(res.join(""), "sol_" + curTime + urlpathname + ".csv");
+
+
+
+    }
+
+
+
+})();
+
+

+ 313 - 0
src/code/tamper_dexscreener_gettop.js

@@ -0,0 +1,313 @@
+// ==UserScript==
+// @name         DexScreen-GetTopTrader
+// @namespace    http://tampermonkey.net/
+// @version      0.1
+// @description  try to take over the world!
+// @author       You
+// @match        https://dexscreener.com/solana/*
+// @icon         https://www.google.com/s2/favicons?sz=64&domain=tampermonkey.net
+// @grant        none
+
+// ==/UserScript==
+
+
+
+function funcDownload(content, filename) {
+    console.log('begin download');
+    // 创建隐藏的可下载链接
+    var eleLink = document.createElement('a');
+    eleLink.download = filename;
+    eleLink.style.display = 'none';
+    // 字符内容转变成blob地址
+    var blob = new Blob([content]);
+    eleLink.href = URL.createObjectURL(blob);
+    // 触发点击
+    document.body.appendChild(eleLink);
+    eleLink.click();
+    // 然后移除
+    document.body.removeChild(eleLink);
+}
+
+
+
+
+function sleep(sleepdelay) {
+    return new Promise((resolve, reject) => {
+        setTimeout(() => {
+            resolve(sleepdelay);
+        }, sleepdelay);
+    })
+}
+
+var number_chars_obj = {
+    "k": 3,
+    "m": 6,
+    "b": 9,
+    "t": 12,
+    "p": 15
+};
+
+var number_chars_arr = ["k", "m", "b", "t", "p"];
+
+// window.addEventListener('load', () => {
+
+(async function () {
+    console.log("enter load");
+
+    var res = [];
+
+    await sleep(6000);
+    console.log("create button");
+
+    var mydivbox = document.createElement("div");
+    var input = document.createElement("input")
+    var button = document.createElement("button");//创建一个按钮
+    var button_toptraders = document.createElement("button");//创建 获取toptraders一个按钮
+    mydivbox.appendChild(input);
+    mydivbox.appendChild(button);
+    mydivbox.appendChild(button_toptraders);
+
+    input.value = "350";
+    input.className = "tam-myinput"
+    input.type = "number"
+
+
+    button_toptraders.className = "tam-mybutton-gettop";
+    button_toptraders.textContent = "gettop"; //按钮内容
+    button_toptraders.style.width = "90px"; //按钮宽度
+    //button.style.height = "28px"; //按钮高度
+    button_toptraders.style.align = "center"; //文本居中
+    button_toptraders.style.color = "blue"; //按钮文字颜色
+    button_toptraders.style.background = "#e33e33"; //按钮底色
+    button_toptraders.style.border = "1px solid #e33e33"; //边框属性
+    button_toptraders.addEventListener("click", clickBotton); //监听按钮点击事件
+
+
+    mydivbox.style.position = "fixed";
+    mydivbox.style.top = "60px";
+    mydivbox.style.right = "60px";
+
+    document.body.appendChild(mydivbox)
+
+
+    // var parentdiv = document.getElementsByClassName("custom-1275zxc")[0];
+    // parentdiv.insertBefore(mydivbox, parentdiv.getElementsByTagName("div")[0]);
+    // parentdiv.appendChild(mydivbox);
+    var theadtr = document.getElementsByClassName("custom-19qkkht")[0].getElementsByTagName("thead")[0];
+    theadtr.style.color = "blue";
+
+    function get_thead_arr(_thead) {
+        let titlearr = _thead.innerText.trim().split(/\r?\n/);
+        // titlearr = titlearr.slice(1, 5);
+
+        titlearr = [
+            "Rank",
+            "Maker",
+            "Buymoney",
+            "Sellmoney",
+            "Earn",
+            "Earnper",
+            "Buycount",
+            "Sellcount",
+            "Buyamount",
+            "Sellamount",
+            "Amountper",
+            "TokenAddress",
+            "isNormal",
+
+
+        ]
+        return titlearr;
+    }
+    function get_tbodyarr(tbody_arr) {
+        let urlpathname_arr = window.location.pathname.slice(1).split('/');
+        let token_address = urlpathname_arr[1];
+
+        for (let idx = 0; idx < tbody_arr.length; idx++) {
+            let tr = tbody_arr[idx];
+            let tds_arr = Array.from(tr.children);
+            let td_value_obj = {
+                "Rank": "0",
+                "Maker": "",
+                "Buymoney": 0,
+                "Sellmoney": 0,
+                "Earn": 0,
+                "Earnper": 0,
+                "Buycount": 0,
+                "Sellcount": 0,
+                "Buyamount": 0,
+                "Sellamount": 0,
+                "Amountper": 0,
+                "TokenAddress": token_address,
+                "isNormal": -1,
+
+
+            }
+            let temp_innertext;
+            for (let i = 0; i < tds_arr.length; i++) {
+                if (i == 1 || i == 4 || i == 5 || i == 6 || i == 7) {
+                    continue;
+                } else if (i == 0) {
+                    let td_innerText = tds_arr[i].innerText.trim().replace(/#/g, "");
+                    td_value_obj.Rank = td_innerText;
+
+                }
+                else if (i == 8) {
+                    td_value_obj.Maker = tds_arr[i].querySelector("a").href.split('/').pop();
+
+                } else if (i == 2 || i == 3) {
+                    // 获取 Bought
+                    // '<$0.1\n10/1 txns'
+                    // '-'
+                    let td_innerText = tds_arr[i].innerText.trim().toLowerCase();
+                    let money = 0, amount = 0, count = 0;
+
+                    if (td_innerText == "-") {
+                        if (i == 2) {
+                            td_value_obj.Buycount = 0;
+                            td_value_obj.Buymoney = 0;
+                        } else {
+                            td_value_obj.Sellcount = 0;
+                            td_value_obj.Sellmoney = 0;
+                        }
+                        continue;
+                    }
+                    if (td_innerText.indexOf("$") == -1) {
+                        console.log("idx=", idx, "td_innerText=", td_innerText);
+                        throw ("td_innerText error");
+                    }
+
+                    td_innerText = td_innerText.replace(/[(\$),]/g, "");
+                    let td_innerText_arr = td_innerText.split(/\r?\n/);
+                    td_innerText_arr.forEach((val, index, arr) => {
+                        arr[index] = val.trim();
+                    });
+
+                    // 获取buymoney / sellmoney  '<0.1' '11.5' '11.5k' '11.5m' 其他更大的数值
+                    if (td_innerText_arr[0].indexOf("<") != -1) {
+                        // td_value_obj.Buymoney = 0.1;
+                        money = 0.1;
+                    } else {
+                        if (!isNaN(td_innerText_arr[0])) {
+                            // td_value_obj.Buy
+                            money = parseFloat(td_innerText_arr[0]);
+
+                        } else {
+                            for (let number_char of number_chars_arr) {
+                                if (td_innerText_arr[0].indexOf(number_char) != -1) {
+                                    money = parseFloat(td_innerText_arr[0]) * 10 ** number_chars_obj[number_char];
+                                }
+                            }
+
+                        }
+
+                    }
+                    let temp_td_innerText = td_innerText_arr.pop();
+                    let temp_td_innerText_arr = temp_td_innerText.split("/");
+                    td_innerText_arr = [...td_innerText_arr, ...temp_td_innerText_arr];
+                    td_innerText_arr.forEach((val, index, arr) => {
+                        arr[index] = val.trim();
+                    });
+                    console.log("td_innerText_arr=", td_innerText_arr);
+
+                    //获取buyamount sellamount
+
+                    for (let number_char of number_chars_arr) {
+                        // 如果有k , m 等 需要转化为字符串
+                        if (td_innerText_arr[1].indexOf(number_char) != -1) {
+                            amount = String(parseInt(parseFloat(td_innerText_arr[1])) * 1000) + '0'.repeat(number_chars_obj[number_char] - 3);
+                            break;
+                        }
+                    }
+                    if (amount === 0) {
+                        amount = parseFloat(td_innerText_arr[1]);
+
+                    }
+
+
+                    // 获取buycount  1 txns
+                    td_innerText_arr[2] = td_innerText_arr[2].split(" ")[0].trim();
+                    // td_value_obj.Buy
+                    count = td_innerText_arr[2];
+
+                    if (i == 2) {
+                        td_value_obj.Buycount = count;
+                        td_value_obj.Buymoney = money;
+                        td_value_obj.Buyamount = amount;
+                    } else if (i == 3) {
+                        td_value_obj.Sellcount = count;
+                        td_value_obj.Sellmoney = money;
+                        td_value_obj.Sellamount = amount;
+                    }
+
+
+                }
+
+            }
+            td_value_obj.Earn = td_value_obj.Sellmoney - td_value_obj.Buymoney;
+            td_value_obj.Earnper = td_value_obj.Buymoney == 0 ? -10 : td_value_obj.Earn / td_value_obj.Buymoney;
+
+            if (typeof (td_value_obj.Sellamount) == 'string') {
+                if (typeof (td_value_obj.Buyamount) == 'string') {
+                    if (td_value_obj.Sellamount.length > td_value_obj.Buyamount.length) {
+                        td_value_obj.Amountper = 10;
+                    } else if (td_value_obj.Sellamount.length == td_value_obj.Buyamount.length) {
+                        td_value_obj.Amountper = parseFloat(td_value_obj.Sellamount.slice(0, 2)) / parseFloat(td_value_obj.Buyamount.slice(0, 2));
+                    } else {
+                        td_value_obj.Amountper = 0.1;
+                    }
+                } else {
+                    td_value_obj.Amountper = 10;
+                }
+            } else {
+                if (td_value_obj.Sellamount == 0) {
+                    td_value_obj.Amountper = 0;
+                } else if (typeof (td_value_obj.Buyamount) == 'string') {
+                    td_value_obj.Amountper = 0.1;
+                }
+                else {
+                    td_value_obj.Amountper = td_value_obj.Buyamount == 0 ? -10 : parseFloat(td_value_obj.Sellamount) / parseFloat(td_value_obj.Buyamount);
+
+                }
+            }
+
+
+
+            let td_value_arr = Object.values(td_value_obj);
+
+            res.push(td_value_arr);
+
+        }
+
+    }
+    function clickBotton() {
+        // let table_div_ep1 = document.querySelector('.custom-19qkkht');
+        let table_div_ep1 = document.getElementsByClassName('custom-p3e2vj')[0];
+        let divscrollerdep2 = table_div_ep1.querySelector('[data-test-id="virtuoso-scroller"]');
+
+        let div_table = table_div_ep1.getElementsByClassName('custom-17mi4hx')[0];
+        // console.log("div_table=", div_table);
+        let titlearr = get_thead_arr(div_table.children[0]);
+
+        let urlpathname_arr = window.location.pathname.slice(1).split('/');
+
+        res.push(titlearr);
+        let tbody_arr = Array.from(div_table.children);
+        tbody_arr.shift();
+        get_tbodyarr(tbody_arr);
+
+        res.forEach((val, index, arr) => { arr[index] = val.join() + "\n" });
+
+        urlpathname_arr[0] = urlpathname_arr[0].slice(0, 3);
+
+        funcDownload(res.join(""), "Dex-" + urlpathname_arr.join('-') + ".csv");
+
+
+    }
+
+
+
+
+
+
+})();

+ 296 - 0
src/code/tamper_dexscreengetitran_solana.js

@@ -0,0 +1,296 @@
+// ==UserScript==
+// @name         DexScreen-GetTran
+// @namespace    http://tampermonkey.net/
+// @version      0.1
+// @description  try to take over the world!
+// @author       You
+// @match        https://dexscreener.com/solana/*
+// @icon         https://www.google.com/s2/favicons?sz=64&domain=tampermonkey.net
+// @grant        none
+
+// ==/UserScript==
+
+
+
+function funcDownload(content, filename) {
+    console.log('begin download');
+    // 创建隐藏的可下载链接
+    var eleLink = document.createElement('a');
+    eleLink.download = filename;
+    eleLink.style.display = 'none';
+    // 字符内容转变成blob地址
+    var blob = new Blob([content]);
+    eleLink.href = URL.createObjectURL(blob);
+    // 触发点击
+    document.body.appendChild(eleLink);
+    eleLink.click();
+    // 然后移除
+    document.body.removeChild(eleLink);
+}
+
+
+
+
+function sleep(sleepdelay) {
+    return new Promise((resolve, reject) => {
+        setTimeout(() => {
+            resolve(sleepdelay);
+        }, sleepdelay);
+    })
+}
+var number_chars_obj = {
+    "k": 3,
+    "m": 6,
+    "b": 9,
+    "t": 12,
+    "p": 15
+};
+
+var monthmatch = {
+    "January": "01",
+    "February": "02",
+    "March": "03",
+    "Apr": "04",
+    "May": "05",
+    "June": "06",
+    "July": "07",
+    "August": "08",
+    "September": "09",
+    "October": "10",
+    "November": "11",
+    "December": "12",
+};
+var objcsv = {
+    "tokenname": null,
+    "res": null,
+    "simres": null,
+    "msimrs": null,
+
+}
+var number_chars_arr = ["k", "m", "b", "t", "p"];
+
+function get_thead_arr(_thead) {
+
+    let titlearr = _thead.innerText.trim().split(/\r?\n/);
+    titlearr = ['DATE', 'TYPE', 'USD', 'Token', 'SOL', 'PRICE', 'MAKER', 'TXN'];
+    return titlearr;
+}
+
+
+
+
+
+function handletime(res, date_idx) {
+
+    for (let i = 1; i < res.length; i++) {
+        let md = res[i][date_idx].slice(0, 2);
+        let hms = res[i][date_idx].slice(2);
+        res[i][date_idx] = md.join("-") + " " + hms.join(":");
+    }
+    return res;
+
+}
+
+
+
+function autoScroll(downstep, upstep, element, tbody, indexstart) {
+
+    let interval;
+    let timeout;
+    let equaltimes = 0
+    let dataindex, totaldataindex;
+
+
+    //回调time相关
+    let myDelay = 1000;
+    let thisDelay = 1000;
+    let start = Date.now();
+
+    async function notimeoutup(upstep) {
+
+        let tbodytrs = tbody.querySelectorAll('tr[class*="custom-"]');
+        let firdataindex = parseInt(tbodytrs[0].getAttribute('data-index'));
+
+        while (firdataindex >= indexstart) {
+            tbodytrs = tbody.querySelectorAll('tr[class*="custom-"]');
+            firdataindex = parseInt(tbodytrs[0].getAttribute('data-index'));
+
+            console.log("firdataindex,dataindex", firdataindex, dataindex);
+
+            let curpos = dataindex - 1 - firdataindex;
+            for (let i = curpos; i >= 0; i--) {
+
+                dataindex--;
+                let arr_tds;
+                try {
+                    arr_tds = Array.from(tbodytrs[i].getElementsByTagName("td")[0].children);
+
+                } catch (err) {
+                    await sleep(100);
+                    arr_tds = Array.from(tbodytrs[i].getElementsByTagName("td")[0].children);
+                }
+
+                let tdtexts = [];
+
+                for (let i = 0; i < arr_tds.length; i++) {
+
+                    if (i == 0) {
+                        //date
+                        //title 01:36:59, Saturday, February 4, 2023
+                        //text Feb 4 10:54:35 PM
+                        //有bug 12AM 为凌晨0点 -12  12PM就是中午12
+                        let month, day, hour, minute, second, isPM;
+                        isPM = arr_tds[0].innerText.includes("PM");
+                        let arr_dateinfo = arr_tds[0].innerText.trim().split(" ");
+                        //y,m,d concat,
+
+                        [hour, minute, second] = arr_dateinfo[2].trim().split(':');
+                        // arr_dateinfo[2] = arr_dateinfo[2].trim().split(" ");
+                        month = monthmatch[arr_dateinfo[0]];
+                        day = arr_dateinfo[1];
+                        if (hour == "12") {
+                            if (!isPM) {
+                                hour = "00";
+                            }
+                        } else if (isPM) {
+                            hour = (parseInt(hour) + 12).toString();
+                        }
+
+                        //if want UTCtimestamp
+                        let utctime = [month, day, hour, minute, second];
+
+
+                        tdtexts.push(utctime);
+                        // simtdtexts.push(utctime);
+
+                    } else if (i >= 6) {
+                        tdtexts.push(arr_tds[i].querySelector("a").href.split('/').pop());
+
+                    } else if (i == 5) {
+                        if (arr_tds[5].querySelectorAll("span").length == 2) {
+                            tdtexts.push(arr_tds[5].querySelector("span").title.trim().replace(/[(\$),]/g, ""));
+                            // simtdtexts.push(tds[5].querySelector("span").title.trim().replace(/[(\$),]/g, ""));
+
+                        } else {
+                            tdtexts.push(arr_tds[i].innerText.trim().replace(/[(\$),]/g, ""));
+                            // simtdtexts.push(tds[i].innerText.trim().replace(/[(\$),]/g, ""));
+                        }
+
+                    } else if (i == 2) {
+                        let usdstr = arr_tds[i].innerText.trim().replace(/[(\$)<,]/g, "");
+                        if (usdstr == '-') usdstr = '0';
+                        tdtexts.push(usdstr);
+
+                    } else {
+                        //make $ , replace ''
+                        tdtexts.push(arr_tds[i].innerText.trim().replace(/[(\$)<,]/g, ""));
+
+                    }
+
+
+                }
+
+                res.push(tdtexts);
+
+            }
+            element.scrollTop -= upstep;
+            await sleep(200);
+        }
+
+        console.log('reslen totalindex', res.length, totaldataindex);
+        res = handletime(res, 0);
+        res.forEach((val, index, arr) => { arr[index] = val.join() + "\n" });
+
+        let urlpathname = window.location.pathname.slice(1).split('/');
+        urlpathname[0] = urlpathname[0].slice(0, 3);
+
+        // funcDownload(res.join(""), "Dex-" + objcsv.tokenname + "-" + urlpathname.join('-') + ".csv");
+        funcDownload(res.join(""), "Dex_" + 'tran_' + urlpathname.join('_') + ".csv");
+
+
+    }
+
+    function down() {
+        interval = setInterval(() => {
+            let sTop = element.scrollTop;
+            element.scrollTop += downstep;
+            if (sTop == element.scrollTop) {
+                equaltimes++;
+                if (equaltimes == 5) {
+                    clearInterval(interval);
+                    let tbodytrs = tbody.querySelectorAll('tr[class*="custom-"]');
+                    dataindex = parseInt(tbodytrs[tbodytrs.length - 1].getAttribute('data-index'));
+                    totaldataindex = dataindex;
+                    console.log('totaldataindex', totaldataindex);
+
+                    notimeoutup(upstep);
+                }
+            }
+        }, 1500)
+
+    }
+
+    down()
+
+}
+
+
+
+var res = [];
+// var simres = [];
+// window.addEventListener('load', () => {
+
+(async function () {
+    console.log("enter load");
+    await sleep(6000);
+    console.log("create button");
+
+    var mydivbox = document.createElement("div");
+    var input = document.createElement("input")
+    var button_tran = document.createElement("button");//创建 获取toptran一个按钮
+    mydivbox.appendChild(input);
+    mydivbox.appendChild(button_tran);
+
+    input.value = "350";
+    input.className = "tam-myinput"
+    input.type = "number"
+
+    button_tran.className = "tam-mybutton-gettran"
+    button_tran.textContent = "gettran"; //按钮内容
+    button_tran.style.width = "90px"; //按钮宽度
+    //button.style.height = "28px"; //按钮高度
+    button_tran.style.align = "center"; //文本居中
+    button_tran.style.color = "blue"; //按钮文字颜色
+    button_tran.style.background = "#e33e33"; //按钮底色
+    button_tran.style.border = "1px solid #e33e33"; //边框属性
+    button_tran.addEventListener("click", clickBotton); //监听按钮点击事件
+
+    mydivbox.style.position = "fixed";
+    mydivbox.style.top = "60px";
+    mydivbox.style.right = "60px";
+    document.body.appendChild(mydivbox);
+    var theadtr = document.getElementsByClassName("custom-19qkkht")[0].getElementsByTagName("thead")[0];
+    theadtr.style.color = "blue";
+
+
+    function clickBotton() {
+        let arr_urlpathname = window.location.pathname.slice(1).split('/');
+        let table_div_ep1 = document.getElementsByClassName('custom-p3e2vj')[0];
+        let divscrollerdep2 = table_div_ep1.querySelector('[data-test-id="virtuoso-scroller"]');
+        let table_ = table_div_ep1.getElementsByTagName('table')[0];
+        let thead_ = table_.getElementsByTagName('thead')[0];
+        let titlearr = get_thead_arr(thead_);
+        res.push(titlearr);
+        let tbody_ = table_.getElementsByTagName('tbody')[0];
+        let upstep = parseInt(input.value);
+        console.log(upstep);
+        //ori titlearr = ['DATE', 'TYPE', 'USD', 'Token', 'SOL', 'PRICE', 'MAKER', 'TXN'];
+        //changeto titlearr = ['DATE', 'TYPE', 'USD', 'Token', 'MAKER', 'TXN'];
+
+
+
+
+        autoScroll(7000, upstep, divscrollerdep2, tbody_, 80);
+    }
+
+})();

+ 297 - 0
src/code/tamper_get_pump_trader.js

@@ -0,0 +1,297 @@
+// ==UserScript==
+// @name         Get_Tran_Pump
+// @namespace    http://tampermonkey.net/
+// @version      2024-07-14
+// @description  try to take over the world!
+// @author       You
+// @match        https://pump.fun/*
+// @icon         https://www.google.com/s2/favicons?sz=64&domain=pump.fun
+// @grant        none
+// ==/UserScript==
+
+
+
+function funcDownload(content, filename) {
+    console.log('begin download');
+    // 创建隐藏的可下载链接
+    var eleLink = document.createElement('a');
+    eleLink.download = filename;
+    eleLink.style.display = 'none';
+    // 字符内容转变成blob地址
+    var blob = new Blob([content]);
+    eleLink.href = URL.createObjectURL(blob);
+    // 触发点击
+    document.body.appendChild(eleLink);
+    eleLink.click();
+    // 然后移除
+    document.body.removeChild(eleLink);
+}
+
+
+function sleep(sleepdelay) {
+    return new Promise((resolve, reject) => {
+        setTimeout(() => {
+            resolve(sleepdelay);
+        }, sleepdelay);
+    })
+}
+var number_chars_obj = {
+    "k": 3,
+    "m": 6,
+    "b": 9,
+    "t": 12,
+    "p": 15
+};
+
+var monthmatch = {
+    "January": "01",
+    "February": "02",
+    "March": "03",
+    "Apr": "04",
+    "May": "05",
+    "June": "06",
+    "July": "07",
+    "August": "08",
+    "September": "09",
+    "October": "10",
+    "November": "11",
+    "December": "12",
+};
+
+var number_chars_arr = ["k", "m", "b", "t", "p"];
+
+function get_thead_arr(_thead) {
+
+    let titlearr = _thead.innerText.trim().split(/\r?\n/);
+
+
+    titlearr = ['MAKER', 'TYPE', 'SOL', 'Token', 'DATE', 'TXN'];
+    return titlearr;
+}
+
+
+
+
+
+function handletime(res, date_idx) {
+
+    for (let i = 1; i < res.length; i++) {
+        let md = res[i][date_idx].slice(0, 2);
+        let hms = res[i][date_idx].slice(2);
+        res[i][date_idx] = md.join("-") + " " + hms.join(":");
+    }
+    return res;
+
+}
+
+
+
+
+async function down(element) {
+    let equaltimes = 0;
+    let downstep = 800;
+    while (true) {
+        let sTop = element.scrollTop;
+        element.scrollTop += downstep;
+        let tbodytrs;
+        if (sTop == element.scrollTop) {
+            equaltimes++;
+            console.log("equaltimes=", equaltimes)
+            await sleep(300);
+            if (equaltimes == 5) {
+                break;
+
+            }
+        }
+    }
+    return;
+
+
+}
+
+function get_tbody_data() {
+    console.log("enter get_tbody_data");
+    let div_table = document.querySelector("div.flex.flex-col.gap-2.w-2\\/3 > div.w-full.text-xs.sm\\:text-sm.text-gray-400.bg-transparent.rounded-lg ")
+    let tbody = div_table.querySelectorAll("div.text-xs.my-1");
+
+    let arr_tbodytrs = Array.from(tbody);
+
+    for (let idx = 0; idx < arr_tbodytrs.length; idx++) {
+
+        let arr_tds;
+        arr_tds = Array.from(arr_tbodytrs[idx].children);
+        if (idx % 100 == 0) {
+            console.log("idx=", idx, arr_tbodytrs[idx])
+        }
+
+        let tdtexts = [];
+        for (let i = 0; i < arr_tds.length; i++) {
+            if (i == 0) {
+                // maker
+                // <a href="/profile/6Jf4iDyKGVY8CXynmHqrgUzGbx1GwerMyR2gZQ9LWFje">
+                tdtexts.push(arr_tds[i].querySelector("a").href.split('/').pop());
+
+            } else if (i == 1) {
+                // type
+                let type = arr_tds[i].innerText.trim();
+                if (type == "buy") {
+                    tdtexts.push("Buy");
+                } else {
+                    tdtexts.push("Sell");
+                }
+
+
+            } else if (i == 2) {
+                continue;
+
+            } else if (i == 3) {
+                // sol 
+                tdtexts.push(arr_tds[i].innerText.trim());
+
+            } else if (i == 4) {
+                let str_token_amount = arr_tds[i].innerText.trim();
+                let float_token_amount;
+                float_token_amount = parseFloat(str_token_amount);
+
+                for (let number_char of number_chars_arr) {
+                    if (str_token_amount.indexOf(number_char) != -1) {
+                        float_token_amount = parseFloat(str_token_amount) * 10 ** number_chars_obj[number_char];
+                    }
+                }
+                tdtexts.push(float_token_amount);
+            }
+            else if (i == 5) {
+                //date
+                let month, day, hour, minute, second, isPM;
+                let cur_date = new Date(arr_tds[i].innerText.trim());
+                month = cur_date.getMonth() + 1;// Returns the month (0-11)
+                day = cur_date.getDate();//Returns the day of the month (1-31)
+                hour = cur_date.getHours(); // Returns the hour (0-23)
+                minute = cur_date.getMinutes(); // Returns the minute (0-59)
+                second = cur_date.getSeconds(); // Returns the second (0-59)
+
+                let utctime = [month, day, hour, minute, second];
+
+
+                tdtexts.push(utctime);
+                // simtdtexts.push(utctime);
+
+            } else if (i == 6) {
+                tdtexts.push(arr_tds[i].querySelector("a").href.split('/').pop());
+
+            }
+
+
+        }
+
+        res.push(tdtexts);
+
+    }
+
+
+
+}
+
+
+var res = [];
+// var simres = [];
+// window.addEventListener('load', () => {
+
+(async function () {
+    console.log("enter load");
+    await sleep(6000);
+    console.log("create button");
+
+    var mydivbox = document.createElement("div");
+
+    var button_tran = document.createElement("button");//创建 获取toptran一个按钮
+
+    mydivbox.appendChild(button_tran);
+
+
+
+
+    button_tran.className = "tam-mybutton-gettran"
+    button_tran.textContent = "gettran"; //按钮内容
+    button_tran.style.width = "90px"; //按钮宽度
+    //button.style.height = "28px"; //按钮高度
+    button_tran.style.align = "center"; //文本居中
+    button_tran.style.color = "blue"; //按钮文字颜色
+    button_tran.style.background = "#e33e33"; //按钮底色
+    button_tran.style.border = "1px solid #e33e33"; //边框属性
+
+    button_tran.addEventListener("click", clickButton); //监听按钮点击事件
+
+    mydivbox.style.position = "fixed";
+    mydivbox.style.top = "60px";
+    mydivbox.style.right = "40px";
+    document.body.appendChild(mydivbox);
+    // var theadtr = document.getElementsByClassName("custom-19qkkht")[0].getElementsByTagName("thead")[0];
+    var theadtr = document.getElementsByTagName("table")[0].getElementsByTagName("thead")[0];
+    theadtr.style.color = "blue";
+
+
+    async function clickButton() {
+        res = [];
+        console.log("enter clickButton res=", res);
+        // button_trades = document.querySelector("div.flex.gap-2.h-fit.mt-4").children[1];
+        // await button_trades.click()
+
+
+        let div_table = document.querySelector("   div.flex.flex-col.gap-2.w-2\\/3 > div.w-full.text-xs.sm\\:text-sm.text-gray-400.bg-transparent.rounded-lg ")
+
+        let thead = div_table.querySelector("div:nth-child(2)");
+        let button_date = thead.children[5].querySelector("button");
+        await button_date.click();
+        let titlearr = get_thead_arr(thead);
+        res.push(titlearr);
+
+        await sleep(1500);
+        await down(element = document.documentElement);
+
+        // div_page_selected = document.querySelector("div.w-full.flex.justify-center.mt-4  ").children[0];
+
+        let pre_number_page = -1
+        let number_click_page = 0;
+
+        while (true) {
+
+
+
+            div_page_selected = document.querySelector("div.justify-self-end.mb-20").children[0];
+            let number_page = parseInt(div_page_selected.children[1].innerText);
+            console.log("number_page=", number_page);
+            if (pre_number_page == number_page) {
+                number_click_page++;
+                if (number_click_page >= 3) {
+
+                    break;
+                }
+
+            } else {
+
+                get_tbody_data();
+
+
+            }
+            let button_next = div_page_selected.children[2];
+            pre_number_page = number_page
+            await button_next.click();
+            await sleep(2000);
+
+        }
+        let urlpathname = window.location.pathname.slice(1).split('/');
+        console.log("urlpathname=", urlpathname)
+        res = handletime(res, 4);
+        res.forEach((val, index, arr) => { arr[index] = val.join() + "\n" });
+        funcDownload(res.join(""), urlpathname + "_pump" + ".csv");
+
+
+
+    }
+
+})();
+
+
+
+

+ 379 - 0
src/code/tamper_get_tran_scroll_defined.js

@@ -0,0 +1,379 @@
+// ==UserScript==
+// @name         defi-GetTran-SOL
+// @namespace    http://tampermonkey.net/
+// @version      0.1
+// @description  try to take over the world!
+// @author       You
+// @match        https://www.defined.fi/sol/*
+// @icon         https://www.google.com/s2/favicons?sz=64&domain=tampermonkey.net
+// @grant        none
+
+// ==/UserScript==
+
+
+function funcDownload(content, filename) {
+    console.log('begin download');
+    // 创建隐藏的可下载链接
+    let eleLink = document.createElement('a');
+    eleLink.download = filename;
+    eleLink.style.display = 'none';
+    // 字符内容转变成blob地址
+    let blob = new Blob([content]);
+    eleLink.href = URL.createObjectURL(blob);
+    // 触发点击
+    document.body.appendChild(eleLink);
+    eleLink.click();
+    // 然后移除
+    document.body.removeChild(eleLink);
+}
+
+
+function sleep(sleepdelay) {
+    return new Promise((resolve, reject) => {
+        setTimeout(() => {
+            resolve(sleepdelay);
+        }, sleepdelay);
+    })
+}
+var number_chars_obj = {
+    "k": 3,
+    "m": 6,
+    "b": 9,
+    "t": 12,
+    "p": 15
+};
+
+var monthmatch = {
+    "January": "01",
+    "February": "02",
+    "March": "03",
+    "Apr": "04",
+    "May": "05",
+    "June": "06",
+    "July": "07",
+    "August": "08",
+    "September": "09",
+    "October": "10",
+    "November": "11",
+    "December": "12",
+};
+
+var number_chars_arr = ["k", "m", "b", "t", "p"];
+
+function get_thead_arr() {
+
+    // let titlearr = _thead.innerText.trim().split(/\r?\n/);
+    let titlearr = ['TYPE', 'DATE', 'PRICE', 'USD', 'SOL', 'Token', 'MAKER', 'TXN'];
+    return titlearr;
+}
+
+
+
+var pre_timestamp = -1;
+var now_timestamp = -1;
+async function get_tbody_data() {
+    // let interval;
+    // let timeout;
+    // let equaltimes = 0
+    // let dataindex;
+    let tbody = document.querySelector("div.ReactVirtualized__Grid__innerScrollContainer");
+
+    let tbodytrs;
+    tbodytrs = tbody.children;
+    let style_top = parseInt(parseFloat(tbodytrs[0].style.top.replace("px", "")));
+    cur_firdataindex = parseInt(style_top / 40);
+
+
+
+    let curpos = getted_dataindex - cur_firdataindex + 1;
+
+    console.log("get_tbody_data curpos=", curpos, "tbodytrs.len=", tbodytrs.length, "res_data.len=", res_data.length, "cur_firdataindex=", cur_firdataindex, "getted_dataindex=", getted_dataindex,)
+    let getted_style_top = parseInt(parseFloat(tbodytrs[tbodytrs.length - 1].style.top.replace("px", "")));
+    getted_dataindex = parseInt(getted_style_top / 40);
+
+    for (let i = curpos; i < tbodytrs.length; i++) {
+        // dataindex--;
+        let arr_tds;
+        while (true) {
+            try {
+                arr_tds = Array.from(tbodytrs[i].children[0].children);
+                break;
+            } catch (err) {
+                await sleep(150);
+            }
+        }
+
+        let tdtexts = [];
+        if (arr_tds.length != 8) {
+            continue;
+        }
+        for (let i = 0; i < arr_tds.length; i++) {
+            if (i == 0) {
+
+                let type = "no";
+                let computeStyle = window.getComputedStyle(arr_tds[i].children[0], null);
+                let color = computeStyle.color.trim();
+                if (color == "rgb(241, 152, 159)") {
+                    type = "Sell"
+                }
+                else if (color == "rgb(161, 219, 177)") {
+                    type = "Buy"
+                }
+                tdtexts.push(type);
+            }
+            else if (i == 1) {
+                //date
+                let month, day, hour, minute, second;
+                let str_date = "2024 " + arr_tds[i].innerText.trim()
+                let cur_date = new Date(str_date);
+                let timestamp = cur_date.valueOf() / 1000;
+                if (pre_timestamp == -1) {
+                    pre_timestamp = timestamp;
+
+                }
+                now_timestamp = timestamp
+                month = cur_date.getMonth() + 1;// Returns the month (0-11)
+                day = cur_date.getDate();//Returns the day of the month (1-31)
+                hour = cur_date.getHours(); // Returns the hour (0-23)
+                minute = cur_date.getMinutes(); // Returns the minute (0-59)
+                second = cur_date.getSeconds(); // Returns the second (0-59)
+                //if want UTCtimestamp
+                // let utctime = [month, day, hour, minute, second];
+                let str_utctime = "2024-" + month + "-" + day + " " + hour + ":" + minute + ":" + second;
+
+                tdtexts.push(str_utctime);
+            } else if (i == 2) {
+                // price
+                let str_price = ""
+                let arr_span_price = Array.from(arr_tds[i].querySelector("span").children);
+                arr_span_price.shift();
+                if (arr_span_price.length == 1) {
+                    str_price = arr_span_price[0].innerText.trim().replace(/[(\$)<,]/g, "").trim();
+                } else {
+                    let str_zero_repeat = arr_span_price[1].children[0].innerText.trim();
+                    let fir_price = arr_span_price[0].innerText.trim().replace(/[(\$)<,]/g, "");
+                    let sec_price = arr_span_price[1].innerText.trim().replace(/[(\$)<,]/g, "");
+                    sec_price = sec_price.replace(str_zero_repeat, "")
+                    sec_price = "0".repeat(parseInt(str_zero_repeat) - 1) + sec_price;
+                    str_price = fir_price + sec_price;
+                }
+                // let usdstr = arr_tds[i].innerText.trim().replace(/[(\$)<,]/g, "");
+                tdtexts.push(str_price);
+            } else if (i == 3) {
+                // usd
+                let usdstr = arr_tds[i].innerText.trim().replace(/[(\$)<,]/g, "").trim();
+                tdtexts.push(usdstr);
+            } else if (i == 4) {
+                // sol
+                let str_sol;
+                let arr_span_sol = Array.from(arr_tds[i].querySelector("span").children);
+
+                if (arr_span_sol.length == 1) {
+                    str_sol = arr_span_sol[0].innerText.trim().replace(/[(\$)<,]/g, "").trim();
+                } else {
+                    str_sol = "0";
+                }
+
+                tdtexts.push(str_sol);
+            } else if (i == 5) {
+                // Token
+                // tdtexts.push(arr_tds[i].innerText.trim().replace(/[(\$)<,]/g, ""));
+
+                let str_token_amount = arr_tds[i].innerText.trim().replace(/[(\$)<,]/g, "").trim();
+                str_token_amount = str_token_amount.replace(/\s+/g, "");
+
+                str_token_amount = str_token_amount.toLowerCase();
+                let float_token_amount;
+
+                float_token_amount = parseFloat(str_token_amount);
+                for (let number_char of number_chars_arr) {
+                    if (str_token_amount.indexOf(number_char) != -1) {
+                        float_token_amount = parseFloat(str_token_amount) * 10 ** number_chars_obj[number_char];
+                    }
+                }
+                tdtexts.push(float_token_amount);
+
+            }
+
+            else if (i >= 6) {
+                let url_para = arr_tds[i].querySelector("a").href.split('/').pop();
+                tdtexts.push(url_para);
+
+            }
+
+        }
+
+        res_data.push(tdtexts);
+
+
+    }
+
+
+}
+
+function save_resdata() {
+    console.log("enter save_resdata");
+
+    res_data.forEach((val, index, arr) => { arr[index] = val.join() + "\n" });
+    let urlpathname = window.location.pathname.slice(1).split('/');
+    urlpathname = urlpathname.pop()
+
+    funcDownload(res_data.join(""), urlpathname + "_raydium" + "_" + parseInt(Date.now() / 1000) + ".csv");
+    res_data = [];
+
+}
+function autoScroll(element, indexstart) {
+    console.log("enter autoScroll");
+
+    cur_firdataindex = 0;
+    getted_dataindex = -1;
+
+    let interval;
+
+    let equaltimes = 0
+    let dataindex, totaldataindex;
+    let tbody = document.querySelector("div.ReactVirtualized__Grid__innerScrollContainer");
+
+
+    async function notimeoutup() {
+        console.log("enter notimeoutup")
+
+
+        console.log('reslen totalindex', res_data.length, totaldataindex);
+
+        save_resdata();
+    }
+
+    async function down() {
+        interval = setInterval(async () => {
+            // let sTop = element.scrollTop;
+
+            let tbodytrs;
+            let arr_tds;
+            if (sTop != 0 && sTop == element.scrollTop) {
+                equaltimes++;
+                if (equaltimes > 1) {
+                    console.log("equaltimes=", equaltimes);
+                }
+
+                await sleep(250);
+
+                if (equaltimes >= 25) {
+                    clearInterval(interval);
+                    tbodytrs = tbody.children;
+                    // dataindex = parseInt(tbodytrs[tbodytrs.length - 1].getAttribute('data-index'));
+                    let style_top = parseInt(parseFloat(tbodytrs[tbodytrs.length - 1].style.top.replace("px", "")));
+                    dataindex = parseInt(style_top / 40);
+                    totaldataindex = dataindex;
+                    console.log('totaldataindex', totaldataindex);
+                    try {
+                        // arr_tds = Array.from(tbodytrs[0].getElementsByTagName("td")[0].children);
+                        arr_tds = Array.from(tbodytrs[0].children[0].children);
+                    } catch (err) {
+                        await sleep(100);
+                        // arr_tds = Array.from(tbodytrs[0].getElementsByTagName("td")[0].children);
+                        arr_tds = Array.from(tbodytrs[0].children[0].children);
+                    }
+                    let cur_date = new Date(arr_tds[1].innerText.trim());
+                    console.log("cur_date=", cur_date);
+                    notimeoutup();
+                }
+            } else {
+                equaltimes = 0;
+                sTop = element.scrollTop;
+
+            }
+            await get_tbody_data();
+            if (res_data.length % 5000 <= 150) {
+                console.log("save_resdata last_element= ", res_data[res_data.length - 1])
+            }
+            if (res_data.length >= 8000 && now_timestamp - pre_timestamp >= 1800) {
+                pre_timestamp = -1;
+                now_timestamp = -1;
+                save_resdata();
+                await sleep(3000);
+            }
+
+
+
+            tbodytrs = tbody.children;
+            tbodytrs[tbodytrs.length - 1].scrollIntoView({ behavior: "smooth", block: "start" });
+            await sleep(300);
+        }, 1200)
+
+    }
+
+    down()
+
+}
+
+
+
+var res_data = [];
+var cur_firdataindex = 0;
+var getted_dataindex = -1;
+var sTop = 0;
+// var simres = [];
+// window.addEventListener('load', () => {
+
+(async function () {
+    console.log("enter load");
+    await sleep(6000);
+    console.log("create button");
+
+    var mydivbox = document.createElement("div");
+    var input = document.createElement("input")
+    var input_startdate = document.createElement("input")
+    var button_tran = document.createElement("button");//创建 获取toptran一个按钮
+    mydivbox.appendChild(input);
+    // mydivbox.appendChild(input_startdate);
+    mydivbox.appendChild(button_tran);
+
+    input.value = "300";
+    input.className = "tam-myinput";
+    input.type = "number";
+    input.style.width = "80px";
+
+    input_startdate.value = "0101-0000";
+    input_startdate.className = "tam-myinput-startdate";
+    input_startdate.type = "text";
+    input_startdate.style.width = "80px";
+
+    button_tran.className = "tam-mybutton-gettran"
+    button_tran.textContent = "gettran"; //按钮内容
+    button_tran.style.width = "90px"; //按钮宽度
+    button_tran.style.height = "30px"; //按钮高度
+    button_tran.style.align = "center"; //文本居中
+    button_tran.style.color = "blue"; //按钮文字颜色
+    button_tran.style.background = "#e33e33"; //按钮底色
+    button_tran.style.border = "1px solid #e33e33"; //边框属性
+    button_tran.addEventListener("click", clickButton); //监听按钮点击事件
+
+    mydivbox.style.position = "fixed";
+    mydivbox.style.top = "80px";
+    mydivbox.style.right = "40px";
+    document.body.appendChild(mydivbox);
+
+
+
+
+    async function clickButton() {
+        res_data = [];
+        cur_firdataindex = 0;
+        getted_dataindex = -1;
+
+        console.log("enter clickButton res_data=", res_data);
+        let divscrollerdep2 = document.querySelector('[aria-label="grid"]');
+
+        var table_ = document.querySelector("div.MuiBox-root.css-2povsm");
+
+        let titlearr = get_thead_arr();
+        res_data.push(titlearr);
+        autoScroll(divscrollerdep2, 1);
+    }
+
+})();
+
+
+
+

+ 340 - 0
src/code/tamper_has_startdate_dexscreengetitran_solana_scroll.js

@@ -0,0 +1,340 @@
+// ==UserScript==
+// @name         DexScreen-GetTran-HasStartDate
+// @namespace    http://tampermonkey.net/
+// @version      0.1
+// @description  try to take over the world!
+// @author       You
+// @match        https://dexscreener.com/solana/*
+// @icon         https://www.google.com/s2/favicons?sz=64&domain=tampermonkey.net
+// @grant        none
+
+// ==/UserScript==
+
+
+function funcDownload(content, filename) {
+    console.log('begin download');
+    // 创建隐藏的可下载链接
+    var eleLink = document.createElement('a');
+    eleLink.download = filename;
+    eleLink.style.display = 'none';
+    // 字符内容转变成blob地址
+    var blob = new Blob([content]);
+    eleLink.href = URL.createObjectURL(blob);
+    // 触发点击
+    document.body.appendChild(eleLink);
+    eleLink.click();
+    // 然后移除
+    document.body.removeChild(eleLink);
+}
+
+
+function sleep(sleepdelay) {
+    return new Promise((resolve, reject) => {
+        setTimeout(() => {
+            resolve(sleepdelay);
+        }, sleepdelay);
+    })
+}
+var number_chars_obj = {
+    "k": 3,
+    "m": 6,
+    "b": 9,
+    "t": 12,
+    "p": 15
+};
+
+var monthmatch = {
+    "January": "01",
+    "February": "02",
+    "March": "03",
+    "Apr": "04",
+    "May": "05",
+    "June": "06",
+    "July": "07",
+    "August": "08",
+    "September": "09",
+    "October": "10",
+    "November": "11",
+    "December": "12",
+};
+
+var number_chars_arr = ["k", "m", "b", "t", "p"];
+
+function get_thead_arr(_thead) {
+
+    let titlearr = _thead.innerText.trim().split(/\r?\n/);
+    titlearr = ['DATE', 'TYPE', 'USD', 'Token', 'SOL', 'PRICE', 'MAKER', 'TXN'];
+    return titlearr;
+}
+
+
+
+
+
+function handletime(res) {
+
+
+    for (let i = 1; i < res.length; i++) {
+        let md = res[i][0].slice(0, 2);
+        let hms = res[i][0].slice(2);
+        res[i][0] = md.join("-") + " " + hms.join(":");
+    }
+    return res
+
+
+
+
+}
+
+
+function autoScroll(downstep, upstep, element, tbody, indexstart, startdate_timestamp) {
+
+    let interval;
+    let timeout;
+    let equaltimes = 0
+    let dataindex, totaldataindex;
+
+    async function notimeoutup(upstep) {
+        console.log("enter notimeoutup")
+        let tbodytrs = tbody.querySelectorAll('tr[class*="custom-"]');
+        let firdataindex = parseInt(tbodytrs[0].getAttribute('data-index'));
+        let print_idx = 0;
+        while (firdataindex >= indexstart) {
+            print_idx++;
+            tbodytrs = tbody.querySelectorAll('tr[class*="custom-"]');
+            firdataindex = parseInt(tbodytrs[0].getAttribute('data-index'));
+            if (print_idx % 30 == 0) {
+                console.log("firdataindex,dataindex", firdataindex, dataindex);
+            }
+
+            let curpos = dataindex - 1 - firdataindex;
+            for (let i = curpos; i >= 0; i--) {
+                dataindex--;
+                let arr_tds;
+                while (true) {
+                    try {
+                        arr_tds = Array.from(tbodytrs[i].getElementsByTagName("td")[0].children);
+                        break;
+                    } catch (err) {
+                        await sleep(150);
+                    }
+                }
+
+                let tdtexts = [];
+                for (let i = 0; i < arr_tds.length; i++) {
+                    if (i == 0) {
+                        //date
+                        //title 01:36:59, Saturday, February 4, 2023
+                        //text Feb 4 10:54:35 PM
+                        //有bug 12AM 为凌晨0点 -12  12PM就是中午12
+                        let month, day, hour, minute, second, isPM;
+                        let cur_date = new Date(arr_tds[0].innerText.trim());
+                        month = cur_date.getMonth() + 1;// Returns the month (0-11)
+                        day = cur_date.getDate();//Returns the day of the month (1-31)
+                        hour = cur_date.getHours(); // Returns the hour (0-23)
+                        minute = cur_date.getMinutes(); // Returns the minute (0-59)
+                        second = cur_date.getSeconds(); // Returns the second (0-59)
+
+
+
+                        //if want UTCtimestamp
+                        let utctime = [month, day, hour, minute, second];
+
+
+                        tdtexts.push(utctime);
+                        // simtdtexts.push(utctime);
+
+                    } else if (i >= 6) {
+                        tdtexts.push(arr_tds[i].querySelector("a").href.split('/').pop());
+
+                    } else if (i == 5) {
+                        if (arr_tds[5].querySelectorAll("span").length == 2) {
+                            tdtexts.push(arr_tds[5].querySelector("span").title.trim().replace(/[(\$),]/g, ""));
+                            // simtdtexts.push(tds[5].querySelector("span").title.trim().replace(/[(\$),]/g, ""));
+
+                        } else {
+                            tdtexts.push(arr_tds[i].innerText.trim().replace(/[(\$),]/g, ""));
+                            // simtdtexts.push(tds[i].innerText.trim().replace(/[(\$),]/g, ""));
+                        }
+
+                    } else if (i == 2) {
+                        let usdstr = arr_tds[i].innerText.trim().replace(/[(\$)<,]/g, "");
+                        if (usdstr == '-') usdstr = '0';
+                        tdtexts.push(usdstr);
+
+                    } else {
+                        //make $ , replace ''
+                        tdtexts.push(arr_tds[i].innerText.trim().replace(/[(\$)<,]/g, ""));
+
+                    }
+
+
+                }
+
+                res.push(tdtexts);
+
+            }
+            // element.scrollTop -= upstep;
+            tbodytrs[0].scrollIntoView({ behavior: "smooth", block: "end" });
+            await sleep(200);
+        }
+
+        console.log('reslen totalindex', res.length, totaldataindex);
+        res = handletime(res);
+        res.forEach((val, index, arr) => { arr[index] = val.join() + "\n" });
+
+        let urlpathname = window.location.pathname.slice(1).split('/');
+        urlpathname = urlpathname.pop()
+
+        funcDownload(res.join(""), urlpathname + "_raydium" + ".csv");
+
+
+    }
+
+    function down() {
+        interval = setInterval(async () => {
+            let sTop = element.scrollTop;
+            element.scrollTop += downstep;
+            let tbodytrs;
+            if (sTop == element.scrollTop) {
+                equaltimes++;
+                console.log("equaltimes=", equaltimes)
+                await sleep(300);
+                if (startdate_timestamp != 0) {
+                    return;
+                }
+                if (equaltimes >= 20) {
+                    clearInterval(interval);
+                    tbodytrs = tbody.querySelectorAll('tr[class*="custom-"]');
+                    dataindex = parseInt(tbodytrs[tbodytrs.length - 1].getAttribute('data-index'));
+                    totaldataindex = dataindex;
+                    console.log('totaldataindex', totaldataindex);
+                    try {
+                        arr_tds = Array.from(tbodytrs[0].getElementsByTagName("td")[0].children);
+                    } catch (err) {
+                        await sleep(100);
+                        arr_tds = Array.from(tbodytrs[0].getElementsByTagName("td")[0].children);
+                    }
+                    let cur_date = new Date(arr_tds[0].innerText.trim());
+                    console.log("cur_date=", cur_date);
+                    notimeoutup(upstep);
+                }
+            } else {
+                equaltimes = 0;
+                tbodytrs = tbody.querySelectorAll('tr[class*="custom-"]');
+                let arr_tds;
+                try {
+                    arr_tds = Array.from(tbodytrs[0].getElementsByTagName("td")[0].children);
+                } catch (err) {
+                    await sleep(100);
+                    arr_tds = Array.from(tbodytrs[0].getElementsByTagName("td")[0].children);
+                }
+                let cur_date = new Date(arr_tds[0].innerText.trim());
+
+                if (cur_date.valueOf() >= startdate_timestamp) {
+                    return;
+                }
+                console.log("startate=", cur_date);
+                clearInterval(interval);
+                await sleep(2000);
+                tbodytrs = tbody.querySelectorAll('tr[class*="custom-"]');
+                dataindex = parseInt(tbodytrs[tbodytrs.length - 1].getAttribute('data-index'));
+                totaldataindex = dataindex;
+                console.log('totaldataindex', totaldataindex);
+                notimeoutup(upstep);
+            }
+        }, 1300)
+
+    }
+
+    down()
+
+}
+
+
+
+var res = [];
+// var simres = [];
+// window.addEventListener('load', () => {
+
+(async function () {
+    console.log("enter load");
+    await sleep(6000);
+    console.log("create button");
+
+    var mydivbox = document.createElement("div");
+    var input = document.createElement("input")
+    var input_startdate = document.createElement("input")
+    var button_tran = document.createElement("button");//创建 获取toptran一个按钮
+    mydivbox.appendChild(input);
+    mydivbox.appendChild(input_startdate);
+    mydivbox.appendChild(button_tran);
+
+    input.value = "300";
+    input.className = "tam-myinput";
+    input.type = "number";
+    input.style.width = "80px";
+
+    input_startdate.value = "0101-0000";
+    input_startdate.className = "tam-myinput-startdate";
+    input_startdate.type = "text";
+    input_startdate.style.width = "80px";
+
+    button_tran.className = "tam-mybutton-gettran"
+    button_tran.textContent = "gettran"; //按钮内容
+    button_tran.style.width = "90px"; //按钮宽度
+    //button.style.height = "28px"; //按钮高度
+    button_tran.style.align = "center"; //文本居中
+    button_tran.style.color = "blue"; //按钮文字颜色
+    button_tran.style.background = "#e33e33"; //按钮底色
+    button_tran.style.border = "1px solid #e33e33"; //边框属性
+    button_tran.addEventListener("click", clickButton); //监听按钮点击事件
+
+    mydivbox.style.position = "fixed";
+    mydivbox.style.top = "60px";
+    mydivbox.style.right = "40px";
+    document.body.appendChild(mydivbox);
+    // var theadtr = document.getElementsByClassName("custom-19qkkht")[0].getElementsByTagName("thead")[0];
+    var theadtr = document.getElementsByTagName("table")[0].getElementsByTagName("thead")[0];
+    theadtr.style.color = "blue";
+
+
+    function clickButton() {
+        res = [];
+        console.log("enter clickButton res=", res);
+
+        let arr_urlpathname = window.location.pathname.slice(1).split('/');
+        // let table_div_ep1 = document.getElementsByClassName('custom-p3e2vj')[0];
+        // let divscrollerdep2 = table_div_ep1.querySelector('[data-testid="virtuoso-scroller"]');
+        let divscrollerdep2 = document.querySelector('[data-testid="virtuoso-scroller"]');
+
+        var table_ = document.getElementsByTagName("table")[0];
+
+        let thead_ = table_.getElementsByTagName('thead')[0];
+        let titlearr = get_thead_arr(thead_);
+        res.push(titlearr);
+        let tbody_ = table_.getElementsByTagName('tbody')[0];
+        // let tbody_ = document.getElementsByClassName('custom-p3e2vj')[0].getElementsByTagName('table')[0].getElementsByTagName('tbody')[0];
+        let upstep = parseInt(input.value);
+        let startdate_timestamp = 0;
+        if (input_startdate.value.trim() == "0101-0000") {
+            ;
+        } else {
+            let cur_month = input_startdate.value.trim().slice(0, 2);
+            let cur_day = input_startdate.value.trim().slice(2, 4);
+            let cur_hour = input_startdate.value.trim().slice(5, 7);
+            let cur_minute = input_startdate.value.trim().slice(7, 9);
+            console.log("date", cur_month + "-" + cur_day + " " + cur_hour + ":" + cur_minute + ":" + "00");
+            startdate_timestamp = new Date(cur_month + "-" + cur_day + " " + cur_hour + ":" + cur_minute + ":" + "00").valueOf();
+
+        }
+        console.log(upstep, startdate_timestamp);
+
+        autoScroll(7000, upstep, divscrollerdep2, tbody_, 30, startdate_timestamp);
+    }
+
+})();
+
+
+
+

+ 238 - 0
src/code/tamper_listen_dexscreener_token_long.js

@@ -0,0 +1,238 @@
+// ==UserScript==
+// @name         Dex-Filter-ListenToken-Long-SOL
+// @namespace    http://tampermonkey.net/
+// @version      0.1
+// @description  try to take over the world!
+// @author       You
+// @match        https://dexscreener.com/new-pairs?rankBy=txns&order=desc&chainIds=solana&dexIds=raydium&minLiq=8000&minAge=48&min24HTxns=300&min24HBuys=100&min1HChg=4&min5MChg=2
+// @icon         https://www.google.com/s2/favicons?sz=64&domain=tampermonkey.net
+// @grant        none
+
+// ==/UserScript==
+
+// https://dexscreener.com/new-pairs?rankBy=txns&order=desc&chainIds=solana&dexIds=raydium&minLiq=8000&minAge=48&min24HTxns=300&min24HBuys=100&min1HChg=4&min5MChg=2
+
+// dex_long_token
+
+function funcDownload(content, filename) {
+    // 创建隐藏的可下载链接
+    let eleLink = document.createElement('a');
+    eleLink.download = filename;
+    eleLink.style.display = 'none';
+    // 字符内容转变成blob地址
+    let blob = new Blob([content]);
+    eleLink.href = URL.createObjectURL(blob);
+    // 触发点击
+    document.body.appendChild(eleLink);
+    eleLink.click();
+    // 然后移除
+    document.body.removeChild(eleLink);
+}
+
+
+function sleep(sleepdelay) {
+    return new Promise((resolve, reject) => {
+        setTimeout(() => {
+            resolve(sleepdelay);
+        }, sleepdelay);
+    })
+}
+
+var number_chars_obj = {
+    "k": 3,
+    "m": 6,
+    "b": 9,
+    "t": 12,
+    "p": 15
+};
+var number_chars_arr = ["k", "m", "b", "t", "p"];
+
+
+let obj_pairaddress = {
+    // "str_pairaddress": {
+    //     "save_timestamp": 0,
+
+
+    // }
+
+}
+
+var pre_click_timestamp = 0;
+
+var now_timestamp = 0;
+
+function click_avoid_sleep() {
+    if (now_timestamp - pre_click_timestamp >= 2 * 60 * 1000) {
+        pre_click_timestamp = now_timestamp;
+        let th = document.querySelector("div.ds-dex-table-th");
+
+        let button_click = th.children[5].querySelector("button");
+        button_click.click();
+    }
+
+
+
+}
+
+
+
+async function get_tbody_data() {
+    let tbody = document.querySelector("div.ds-dex-table.ds-dex-table-new");
+
+    let arr_tbody_trs = Array.from(tbody.querySelectorAll("a"));
+
+
+    for (let idx = 0; idx < arr_tbody_trs.length; idx++) {
+
+        let a_element = arr_tbody_trs[idx];
+        let pair_url = a_element.href;
+        let pair_address = pair_url.split("/").pop();
+
+
+
+        let arr_tds = Array.from(a_element.children);
+
+        let tdtexts = [];
+
+        tdtexts.push((Date.now()))
+        tdtexts.push(pair_address);
+        set_now_pairaddress.add(pair_address);
+
+        for (let i = 0; i < arr_tds.length; i++) {
+            if (i == 1) {
+                //  price
+                let price = arr_tds[i].innerText.trim().replace(/[(\$),]/g, "");
+                tdtexts.push(price);
+
+            } else if (i >= 7 && i <= 10) {
+                // 5m 1h 6h 24h change
+
+                let price_change = arr_tds[i].innerText.trim().replace(/[%,]/g, "");
+                for (let number_char of number_chars_arr) {
+                    if (price_change.indexOf(number_char) != -1) {
+                        price_change = parseFloat(price_change) * 10 ** number_chars_obj[number_char];
+                    }
+                }
+
+                tdtexts.push(price_change);
+            }
+
+        }
+
+        arr_res_data.push(tdtexts);
+
+
+    }
+    now_timestamp = Date.now();
+    click_avoid_sleep();
+    save_resdata();
+
+}
+
+function drop_outtime_pairaddress() {
+    // 距离上次save_timestamp 超过5分钟 删除
+
+    let arr_pre_pairaddress = Object.keys(obj_pairaddress);
+
+    for (let pre_pairaddress of arr_pre_pairaddress) {
+        let pre_pairaddress_save_timestamp = obj_pairaddress[pre_pairaddress]["save_timestamp"];
+        // 获取此pair已有5分钟 删除 掉此pair,允许再次获取新的
+        if (now_timestamp - pre_pairaddress_save_timestamp > 5 * 60 * 1000) {
+            delete obj_pairaddress[pre_pairaddress];
+
+        }
+    }
+
+}
+
+
+function save_resdata() {
+    // console.log("enter save_resdata");
+    drop_outtime_pairaddress();
+
+    let set_intersection_pairaddress = new Set([...set_now_pairaddress].filter(value => set_pre_pairaddress.has(value)));
+
+
+    // console.log("set_intersection_pairaddress=", set_intersection_pairaddress, 'set_pre_pairaddress=', set_pre_pairaddress, "set_now_pairaddress=", set_now_pairaddress);
+    set_pre_pairaddress.clear();
+    set_pre_pairaddress = set_now_pairaddress;
+    set_now_pairaddress = new Set();
+
+
+    if (set_intersection_pairaddress.size == 0) {
+        return;
+    }
+
+
+    let temp_arr_res_data = arr_res_data;
+    // console.log("temp_arr_res_data=", temp_arr_res_data);
+    arr_res_data = [];
+
+    for (let it of temp_arr_res_data) {
+        let str_pairaddress = it[1];
+
+        if (!set_intersection_pairaddress.has(str_pairaddress)) {
+            continue;
+        }
+        else if (obj_pairaddress[str_pairaddress] != undefined) {
+            continue;
+        } else {
+
+            obj_pairaddress[str_pairaddress] = {
+
+                "save_timestamp": now_timestamp,
+            }
+            arr_res_data.push(it);
+        }
+
+    }
+
+
+
+    if (arr_res_data.length == 0) {
+        // res 为空
+        // console.log("arr_res_data length is 0");
+        return;
+    }
+
+    // console.log("arr_res_data=", arr_res_data)
+    arr_res_data.unshift(["timestamp", "pairaddress", "price", "5m", "1h", "6h", "24h"]);
+
+    arr_res_data.forEach((val, index, arr) => { arr[index] = val.join() + "\n" });
+
+    let str_cur_time = "" + Date.now();
+
+
+    funcDownload(arr_res_data.join(""), str_cur_time + "_long" + ".csv");
+    arr_res_data = [];
+
+}
+
+function autoScroll() {
+    console.log("enter autoScroll");
+    async function fetchData() {
+        await get_tbody_data();
+        setTimeout(fetchData, 15 * 1000);
+    }
+
+    setTimeout(fetchData, 15 * 1000);
+
+}
+
+
+var arr_res_data = [];
+var set_pre_pairaddress = new Set();
+var set_now_pairaddress = new Set();
+// window.addEventListener('load', () => {
+
+(async function () {
+    console.log("enter load");
+    await sleep(6000);
+    autoScroll();
+
+
+})();
+
+
+
+

+ 240 - 0
src/code/tamper_listen_dexscreener_token_short.js

@@ -0,0 +1,240 @@
+// ==UserScript==
+// @name         Dex-Filter-ListenToken-Short-SOL
+// @namespace    http://tampermonkey.net/
+// @version      0.1
+// @description  try to take over the world!
+// @author       You
+// @match        https://dexscreener.com/new-pairs?rankBy=txns&order=desc&chainIds=solana&dexIds=raydium&minLiq=4000&maxAge=48&min24HTxns=150&min24HBuys=50&min1HChg=5&min5MChg=3
+// @icon         https://www.google.com/s2/favicons?sz=64&domain=tampermonkey.net
+// @grant        none
+
+// ==/UserScript==
+
+// https://dexscreener.com/new-pairs?rankBy=txns&order=desc&chainIds=solana&dexIds=raydium&minLiq=4000&maxAge=48&min24HTxns=150&min24HBuys=50&min1HChg=5&min5MChg=3
+
+
+
+// dex_short_token
+
+function funcDownload(content, filename) {
+    // 创建隐藏的可下载链接
+    let eleLink = document.createElement('a');
+    eleLink.download = filename;
+    eleLink.style.display = 'none';
+    // 字符内容转变成blob地址
+    let blob = new Blob([content]);
+    eleLink.href = URL.createObjectURL(blob);
+    // 触发点击
+    document.body.appendChild(eleLink);
+    eleLink.click();
+    // 然后移除
+    document.body.removeChild(eleLink);
+}
+
+
+function sleep(sleepdelay) {
+    return new Promise((resolve, reject) => {
+        setTimeout(() => {
+            resolve(sleepdelay);
+        }, sleepdelay);
+    })
+}
+
+var number_chars_obj = {
+    "k": 3,
+    "m": 6,
+    "b": 9,
+    "t": 12,
+    "p": 15
+};
+var number_chars_arr = ["k", "m", "b", "t", "p"];
+
+
+let obj_pairaddress = {
+    // "str_pairaddress": {
+    //     "save_timestamp": 0,
+
+
+    // }
+
+}
+
+var pre_click_timestamp = 0;
+
+var now_timestamp = 0;
+
+function click_avoid_sleep() {
+    if (now_timestamp - pre_click_timestamp >= 2 * 60 * 1000) {
+        pre_click_timestamp = now_timestamp;
+        let th = document.querySelector("div.ds-dex-table-th");
+
+        let button_click = th.children[5].querySelector("button");
+        button_click.click();
+    }
+
+
+
+}
+
+
+
+async function get_tbody_data() {
+    let tbody = document.querySelector("div.ds-dex-table.ds-dex-table-new");
+
+    let arr_tbody_trs = Array.from(tbody.querySelectorAll("a"));
+
+
+    for (let idx = 0; idx < arr_tbody_trs.length; idx++) {
+
+        let a_element = arr_tbody_trs[idx];
+        let pair_url = a_element.href;
+        let pair_address = pair_url.split("/").pop();
+
+
+
+        let arr_tds = Array.from(a_element.children);
+
+        let tdtexts = [];
+
+        tdtexts.push((Date.now()))
+        tdtexts.push(pair_address);
+        set_now_pairaddress.add(pair_address);
+
+        for (let i = 0; i < arr_tds.length; i++) {
+            if (i == 1) {
+                //  price
+                let price = arr_tds[i].innerText.trim().replace(/[(\$),]/g, "");
+                tdtexts.push(price);
+
+            } else if (i >= 7 && i <= 10) {
+                // 5m 1h 6h 24h change
+
+                let price_change = arr_tds[i].innerText.trim().replace(/[%,]/g, "");
+                for (let number_char of number_chars_arr) {
+                    if (price_change.indexOf(number_char) != -1) {
+                        price_change = parseFloat(price_change) * 10 ** number_chars_obj[number_char];
+                    }
+                }
+
+                tdtexts.push(price_change);
+            }
+
+        }
+
+        arr_res_data.push(tdtexts);
+
+
+    }
+    now_timestamp = Date.now();
+    click_avoid_sleep();
+    save_resdata();
+
+}
+
+function drop_outtime_pairaddress() {
+    // 距离上次save_timestamp 超过5分钟 删除
+
+    let arr_pre_pairaddress = Object.keys(obj_pairaddress);
+
+    for (let pre_pairaddress of arr_pre_pairaddress) {
+        let pre_pairaddress_save_timestamp = obj_pairaddress[pre_pairaddress]["save_timestamp"];
+        // 获取此pair已有5分钟 删除 掉此pair,允许再次获取新的
+        if (now_timestamp - pre_pairaddress_save_timestamp > 5 * 60 * 1000) {
+            delete obj_pairaddress[pre_pairaddress];
+
+        }
+    }
+
+}
+
+
+function save_resdata() {
+    // console.log("enter save_resdata");
+    drop_outtime_pairaddress();
+
+    let set_intersection_pairaddress = new Set([...set_now_pairaddress].filter(value => set_pre_pairaddress.has(value)));
+
+
+    // console.log("set_intersection_pairaddress=", set_intersection_pairaddress, 'set_pre_pairaddress=', set_pre_pairaddress, "set_now_pairaddress=", set_now_pairaddress);
+    set_pre_pairaddress.clear();
+    set_pre_pairaddress = set_now_pairaddress;
+    set_now_pairaddress = new Set();
+
+
+    if (set_intersection_pairaddress.size == 0) {
+        return;
+    }
+
+
+    let temp_arr_res_data = arr_res_data;
+    // console.log("temp_arr_res_data=", temp_arr_res_data);
+    arr_res_data = [];
+
+    for (let it of temp_arr_res_data) {
+        let str_pairaddress = it[1];
+
+        if (!set_intersection_pairaddress.has(str_pairaddress)) {
+            continue;
+        }
+        else if (obj_pairaddress[str_pairaddress] != undefined) {
+            continue;
+        } else {
+
+            obj_pairaddress[str_pairaddress] = {
+
+                "save_timestamp": now_timestamp,
+            }
+            arr_res_data.push(it);
+        }
+
+    }
+
+
+
+    if (arr_res_data.length == 0) {
+        // res 为空
+        // console.log("arr_res_data length is 0");
+        return;
+    }
+
+    // console.log("arr_res_data=", arr_res_data)
+    arr_res_data.unshift(["timestamp", "pairaddress", "price", "5m", "1h", "6h", "24h"]);
+
+    arr_res_data.forEach((val, index, arr) => { arr[index] = val.join() + "\n" });
+
+    let str_cur_time = "" + Date.now();
+
+
+    funcDownload(arr_res_data.join(""), str_cur_time + "_short" + ".csv");
+    arr_res_data = [];
+
+}
+
+function autoScroll() {
+    console.log("enter autoScroll");
+    async function fetchData() {
+        await get_tbody_data();
+        setTimeout(fetchData, 15 * 1000);
+    }
+
+    setTimeout(fetchData, 15 * 1000);
+
+}
+
+
+var arr_res_data = [];
+var set_pre_pairaddress = new Set();
+var set_now_pairaddress = new Set();
+// window.addEventListener('load', () => {
+
+(async function () {
+    console.log("enter load");
+    await sleep(6000);
+    autoScroll();
+
+
+})();
+
+
+
+

+ 318 - 0
src/code/tamper_notuse_solscan_swapactivaties copy.js

@@ -0,0 +1,318 @@
+// ==UserScript==
+// @name         DexScreen-GetTran-HasStartDate
+// @namespace    http://tampermonkey.net/
+// @version      0.1
+// @description  try to take over the world!
+// @author       You
+// @match        https://solscan.io/account/.*#defiactivities
+// @icon         https://www.google.com/s2/favicons?sz=64&domain=tampermonkey.net
+// @grant        none
+
+// ==/UserScript==
+
+
+function funcDownload(content, filename) {
+    console.log('begin download');
+    // 创建隐藏的可下载链接
+    var eleLink = document.createElement('a');
+    eleLink.download = filename;
+    eleLink.style.display = 'none';
+    // 字符内容转变成blob地址
+    var blob = new Blob([content]);
+    eleLink.href = URL.createObjectURL(blob);
+    // 触发点击
+    document.body.appendChild(eleLink);
+    eleLink.click();
+    // 然后移除
+    document.body.removeChild(eleLink);
+}
+
+
+function sleep(sleepdelay) {
+    return new Promise((resolve, reject) => {
+        setTimeout(() => {
+            resolve(sleepdelay);
+        }, sleepdelay);
+    })
+}
+var number_chars_obj = {
+    "k": 3,
+    "m": 6,
+    "b": 9,
+    "t": 12,
+    "p": 15
+};
+
+
+
+
+function get_thead_arr(_thead) {
+
+    let titlearr = _thead.innerText.trim().split(/\r?\n/);
+    titlearr = ['DATE', 'TYPE', 'USD', 'Token', 'SOL', 'PRICE', 'MAKER', 'TXN'];
+    return titlearr;
+}
+
+
+
+
+
+var res = [];
+// var simres = [];
+// window.addEventListener('load', () => {
+
+(async function () {
+    console.log("enter load");
+    await sleep(6000);
+    console.log("create button");
+
+    var mydivbox = document.createElement("div");
+
+    var button_tran = document.createElement("button");//创建 获取toptran一个按钮
+
+    mydivbox.appendChild(button_tran);
+
+    button_tran.className = "tam-mybutton-gettran"
+    button_tran.textContent = "getswap"; //按钮内容
+    button_tran.style.width = "90px"; //按钮宽度
+    //button.style.height = "28px"; //按钮高度
+    button_tran.style.align = "center"; //文本居中
+    button_tran.style.color = "blue"; //按钮文字颜色
+    button_tran.style.background = "#e33e33"; //按钮底色
+    button_tran.style.border = "1px solid #e33e33"; //边框属性
+    button_tran.addEventListener("click", clickButton); //监听按钮点击事件
+
+    mydivbox.style.position = "fixed";
+    mydivbox.style.top = "60px";
+    mydivbox.style.right = "40px";
+    document.body.appendChild(mydivbox);
+
+    async function get_page_data() {
+
+
+        let table_ = document.querySelectorAll("table.w-full")[0];
+        let thead_ = table_.getElementsByTagName('thead')[0];
+        let arr_th_ = Array.from(thead_.getElementsByTagName('th'));
+        // arr_th_长度为8 第一个是空
+        let time_click_ = arr_th_[2].querySelectorAll("div.items-center.cursor-pointer")[0];
+        // await handle_thead(arr_th_);
+        if (arr_th_[2].innerText.trim() == "Time") {
+            time_click_.click();
+            await sleep(1000);
+        }
+
+
+        let data_res = [];
+        let tbody_ = table_.getElementsByTagName('tbody')[0];
+        function get_tobody_data(tbody_) {
+            let arr_trs_datares = [];
+            let arr_trs = Array.from(tbody_.querySelectorAll("tr"));
+            for (let idx_tr_ = 0; idx_tr_ < arr_trs.length; idx_tr_++) {
+                let arr_tds_datares = new Array(13);
+                arr_trs_datares.push(arr_tds_datares);
+                let tr_ = arr_trs[idx_tr_];
+                let arr_tds = Array.from(tr_.querySelectorAll("td"));
+                for (let idx_td_ = 0; idx_td_ < arr_tds.length; idx_td_++) {
+                    let td_ = arr_tds[idx_td_];
+                    if (idx_td_ == 0) {
+                        continue
+                    }
+                    else if (idx_td_ == 1) {
+                        let txhash = td_.innerText.trim();
+                        arr_tds_datares[0] = txhash;
+                    } else if (idx_td_ == 2) {
+                        let date = td_.innerText.trim();
+                        arr_tds_datares[1] = date;
+                        arr_tds_datares[2] = new Date(date).valueOf();
+
+                    } else if (idx_td_ == 3) {
+                        let action_type = td_.innerText.trim();
+                        if (action_type.indexOf('SWAP') != -1) {
+                            action_type = "SWAP";
+                        }
+                        arr_tds_datares[3] = action_type;
+                    } else if (idx_td_ == 4) {
+                        let from = td_.innerText.trim();
+                        arr_tds_datares[4] = from;
+                    } else if (idx_td_ == 5) {
+                        let arr_tokenname_amount = td_.innerText.trim().replace(/,/, '').split('\n');
+                        let arr_tokenlink = Array.from(td_.querySelectorAll("a"));
+                        let swapin_tokenaddress = arr_tokenlink[0].href.trim().split('/').slice(-1)[0];
+                        let swapin_tokenname = arr_tokenname_amount[1];
+                        let swapin_tokenamount = arr_tokenname_amount[0];
+                        let swapout_tokenaddress = arr_tokenlink[1].href.trim().split('/').slice(-1)[0];
+                        let swapout_tokenname = arr_tokenname_amount[3];
+                        let swapout_tokenamount = arr_tokenname_amount[2];
+
+                        arr_tds_datares[5] = swapin_tokenaddress;
+                        arr_tds_datares[6] = swapout_tokenaddress;
+                        arr_tds_datares[7] = swapin_tokenname;
+                        arr_tds_datares[8] = swapout_tokenname;
+                        arr_tds_datares[9] = swapin_tokenamount;
+                        arr_tds_datares[10] = swapout_tokenamount;
+
+                    } else if (idx_td_ == 6) {
+                        let router_link = td_.querySelectorAll("a")[0].href.trim().split('/').slice(-1)[0];
+                        arr_tds_datares[11] = router_link;
+                    }
+                    else if (idx_td_ == 7) {
+                        // link 是pool的地址 每一给pool都不一样 无法确实是raydium pool 还是 juypool的 所以用图片来确定
+                        let arr_pool_img = Array.from(td_.querySelectorAll("img"));
+                        for (let idx_pool_img = 0; idx_pool_img < arr_pool_img.length; idx_pool_img++) {
+                            arr_pool_img[idx_pool_img] = arr_pool_img[idx_pool_img].src.trim().split('=').slice(-1)[0];
+                        }
+                        if (arr_pool_img.includes("68747470733a2f2f737461746963732e736f6c7363616e2e696f2f65782d696d672f3637356b5058394d48546a53327a7431716672314e5948757a654c5866514d394832347746535574314d70382e706e67")) {
+                            // 含有 raydium 的图片
+                            arr_pool_img = 1;
+                        } else {
+                            arr_pool_img = 0;
+                        }
+                        arr_tds_datares[12] = arr_pool_img;
+
+                    }
+                }
+
+            }
+
+            return arr_trs_datares;
+
+        }
+        let arr_title = ['txhash', 'date', 'timestamp', 'action', 'from', 'swapin_tokenaddress',
+            'swapout_tokenaddress',
+            'swapin_tokenname',
+            'swapout_tokenname',
+            'swapin_tokenamount',
+            'swapout_tokenamount',
+            'router',
+            'israydium'
+
+        ]
+
+        let arr_trs_datares = get_tobody_data(tbody_);
+        data_res = [...arr_title, ...arr_trs_datares];
+        return data_res;
+
+
+    }
+
+})();
+
+function get_page_element() {
+
+
+    let div_select_page = document.querySelectorAll("div.items-center.justify-end")[0];
+    let button_num_onepage = div_select_page.querySelectorAll('button[type="button"].border-input')[0];
+    let arr_button_left_right = div_select_page.querySelectorAll("button.inline-flex.items-center.justify-center.whitespace-nowrap");
+    let button_pre_onepage = arr_button_left_right[1];
+    let button_aft_onepage = arr_button_left_right[2];
+
+}
+
+async function get_page_data() {
+
+
+    let table_ = document.querySelectorAll("table.w-full")[0];
+    let thead_ = table_.getElementsByTagName('thead')[0];
+    let arr_th_ = Array.from(thead_.getElementsByTagName('th'));
+    // arr_th_长度为8 第一个是空
+    let time_click_ = arr_th_[2].querySelectorAll("div.items-center.cursor-pointer")[0];
+    // await handle_thead(arr_th_);
+    if (arr_th_[2].innerText.trim() == "Time") {
+        time_click_.click();
+        await sleep(1000);
+    }
+
+
+    let data_res = [];
+    let tbody_ = table_.getElementsByTagName('tbody')[0];
+    function get_tobody_data(tbody_) {
+        let arr_trs_datares = [];
+        let arr_trs = Array.from(tbody_.querySelectorAll("tr"));
+        for (let idx_tr_ = 0; idx_tr_ < arr_trs.length; idx_tr_++) {
+            let arr_tds_datares = new Array(13);
+            arr_trs_datares.push(arr_tds_datares);
+            let tr_ = arr_trs[idx_tr_];
+            let arr_tds = Array.from(tr_.querySelectorAll("td"));
+            for (let idx_td_ = 0; idx_td_ < arr_tds.length; idx_td_++) {
+                let td_ = arr_tds[idx_td_];
+                if (idx_td_ == 0) {
+                    continue
+                }
+                else if (idx_td_ == 1) {
+                    let txhash = td_.innerText.trim();
+                    arr_tds_datares[0] = txhash;
+                } else if (idx_td_ == 2) {
+                    let date = td_.innerText.trim();
+                    arr_tds_datares[1] = date;
+                    arr_tds_datares[2] = new Date(date).valueOf();
+
+                } else if (idx_td_ == 3) {
+                    let action_type = td_.innerText.trim();
+                    if (action_type.indexOf('SWAP') != -1) {
+                        action_type = "SWAP";
+                    }
+                    arr_tds_datares[3] = action_type;
+                } else if (idx_td_ == 4) {
+                    let from = td_.innerText.trim();
+                    arr_tds_datares[4] = from;
+                } else if (idx_td_ == 5) {
+                    let arr_tokenname_amount = td_.innerText.trim().replace(/,/, '').split('\n');
+                    let arr_tokenlink = Array.from(td_.querySelectorAll("a"));
+                    let swapin_tokenaddress = arr_tokenlink[0].href.trim().split('/').slice(-1)[0];
+                    let swapin_tokenname = arr_tokenname_amount[1];
+                    let swapin_tokenamount = arr_tokenname_amount[0];
+                    let swapout_tokenaddress = arr_tokenlink[1].href.trim().split('/').slice(-1)[0];
+                    let swapout_tokenname = arr_tokenname_amount[3];
+                    let swapout_tokenamount = arr_tokenname_amount[2];
+
+                    arr_tds_datares[5] = swapin_tokenaddress;
+                    arr_tds_datares[6] = swapout_tokenaddress;
+                    arr_tds_datares[7] = swapin_tokenname;
+                    arr_tds_datares[8] = swapout_tokenname;
+                    arr_tds_datares[9] = swapin_tokenamount;
+                    arr_tds_datares[10] = swapout_tokenamount;
+
+                } else if (idx_td_ == 6) {
+                    let router_link = td_.querySelectorAll("a")[0].href.trim().split('/').slice(-1)[0];
+                    arr_tds_datares[11] = router_link;
+                }
+                else if (idx_td_ == 7) {
+                    // link 是pool的地址 每一给pool都不一样 无法确实是raydium pool 还是 juypool的 所以用图片来确定
+                    let arr_pool_img = Array.from(td_.querySelectorAll("img"));
+                    for (let idx_pool_img = 0; idx_pool_img < arr_pool_img.length; idx_pool_img++) {
+                        arr_pool_img[idx_pool_img] = arr_pool_img[idx_pool_img].src.trim().split('=').slice(-1)[0];
+                    }
+                    if (arr_pool_img.includes("68747470733a2f2f737461746963732e736f6c7363616e2e696f2f65782d696d672f3637356b5058394d48546a53327a7431716672314e5948757a654c5866514d394832347746535574314d70382e706e67")) {
+                        // 含有 raydium 的图片
+                        arr_pool_img = 1;
+                    } else {
+                        arr_pool_img = 0;
+                    }
+                    arr_tds_datares[12] = arr_pool_img;
+
+                }
+            }
+
+        }
+
+        return arr_trs_datares;
+
+    }
+    let arr_title = ['txhash', 'date', 'timestamp', 'action', 'from', 'swapin_tokenaddress',
+        'swapout_tokenaddress',
+        'swapin_tokenname',
+        'swapout_tokenname',
+        'swapin_tokenamount',
+        'swapout_tokenamount',
+        'router',
+        'israydium'
+
+    ]
+
+    let arr_trs_datares = get_tobody_data(tbody_);
+    data_res = [...arr_title, ...arr_trs_datares];
+    return data_res;
+
+
+}
+

+ 128 - 0
src/code/tamper_nouse_solscan_swapactivaties.js

@@ -0,0 +1,128 @@
+
+function sleep(sleepdelay) {
+    return new Promise((resolve, reject) => {
+        setTimeout(() => {
+            resolve(sleepdelay);
+        }, sleepdelay);
+    })
+}
+
+function get_pageselect_element() {
+
+
+    let div_select_page = document.querySelectorAll("div.items-center.justify-end")[0];
+    let button_num_onepage = div_select_page.querySelectorAll('button[type="button"].border-input')[0];
+    let arr_button_left_right = div_select_page.querySelectorAll("button.inline-flex.items-center.justify-center.whitespace-nowrap");
+    let button_pre_onepage = arr_button_left_right[1];
+    let button_aft_onepage = arr_button_left_right[2];
+
+}
+function get_tobody_data(tbody_) {
+    let arr_trs_datares = [];
+    let arr_trs = Array.from(tbody_.querySelectorAll("tr"));
+    for (let idx_tr_ = 0; idx_tr_ < arr_trs.length; idx_tr_++) {
+        let arr_tds_datares = new Array(13);
+        arr_trs_datares.push(arr_tds_datares);
+        let tr_ = arr_trs[idx_tr_];
+        let arr_tds = Array.from(tr_.querySelectorAll("td"));
+        for (let idx_td_ = 0; idx_td_ < arr_tds.length; idx_td_++) {
+            let td_ = arr_tds[idx_td_];
+            if (idx_td_ == 0) {
+                continue
+            }
+            else if (idx_td_ == 1) {
+                let txhash = td_.innerText.trim();
+                arr_tds_datares[0] = txhash;
+            } else if (idx_td_ == 2) {
+                let date = td_.innerText.trim();
+                arr_tds_datares[1] = date;
+                arr_tds_datares[2] = new Date(date).valueOf();
+
+            } else if (idx_td_ == 3) {
+                let action_type = td_.innerText.trim();
+                if (action_type.indexOf('SWAP') != -1) {
+                    action_type = "SWAP";
+                }
+                arr_tds_datares[3] = action_type;
+            } else if (idx_td_ == 4) {
+                let from = td_.innerText.trim();
+                arr_tds_datares[4] = from;
+            } else if (idx_td_ == 5) {
+                let arr_tokenname_amount = td_.innerText.trim().replace(/,/, '').split('\n');
+                let arr_tokenlink = Array.from(td_.querySelectorAll("a"));
+                let swapin_tokenaddress = arr_tokenlink[0].href.trim().split('/').slice(-1)[0];
+                let swapin_tokenname = arr_tokenname_amount[1];
+                let swapin_tokenamount = arr_tokenname_amount[0];
+                let swapout_tokenaddress = arr_tokenlink[1].href.trim().split('/').slice(-1)[0];
+                let swapout_tokenname = arr_tokenname_amount[3];
+                let swapout_tokenamount = arr_tokenname_amount[2];
+
+                arr_tds_datares[5] = swapin_tokenaddress;
+                arr_tds_datares[6] = swapout_tokenaddress;
+                arr_tds_datares[7] = swapin_tokenname;
+                arr_tds_datares[8] = swapout_tokenname;
+                arr_tds_datares[9] = swapin_tokenamount;
+                arr_tds_datares[10] = swapout_tokenamount;
+
+            } else if (idx_td_ == 6) {
+                let router_link = td_.querySelectorAll("a")[0].href.trim().split('/').slice(-1)[0];
+                arr_tds_datares[11] = router_link;
+            }
+            else if (idx_td_ == 7) {
+                // link 是pool的地址 每一给pool都不一样 无法确实是raydium pool 还是 juypool的 所以用图片来确定
+                let arr_pool_img = Array.from(td_.querySelectorAll("img"));
+                for (let idx_pool_img = 0; idx_pool_img < arr_pool_img.length; idx_pool_img++) {
+                    arr_pool_img[idx_pool_img] = arr_pool_img[idx_pool_img].src.trim().split('=').slice(-1)[0];
+                }
+                if (arr_pool_img.includes("68747470733a2f2f737461746963732e736f6c7363616e2e696f2f65782d696d672f3637356b5058394d48546a53327a7431716672314e5948757a654c5866514d394832347746535574314d70382e706e67")) {
+                    // 含有 raydium 的图片
+                    arr_pool_img = 1;
+                } else {
+                    arr_pool_img = 0;
+                }
+                arr_tds_datares[12] = arr_pool_img;
+
+            }
+        }
+
+    }
+
+    return arr_trs_datares;
+
+}
+async function get_page_data() {
+
+
+    let table_ = document.querySelectorAll("table.w-full")[0];
+    let thead_ = table_.getElementsByTagName('thead')[0];
+    let arr_th_ = Array.from(thead_.getElementsByTagName('th'));
+    // arr_th_长度为8 第一个是空
+    let time_click_ = arr_th_[2].querySelectorAll("div.items-center.cursor-pointer")[0];
+    // await handle_thead(arr_th_);
+    if (arr_th_[2].innerText.trim() == "Time") {
+        time_click_.click();
+        await sleep(1000);
+    }
+
+
+    let data_res = [];
+    let tbody_ = table_.getElementsByTagName('tbody')[0];
+
+    let arr_title = ['txhash', 'date', 'timestamp', 'action', 'from', 'swapin_tokenaddress',
+        'swapout_tokenaddress',
+        'swapin_tokenname',
+        'swapout_tokenname',
+        'swapin_tokenamount',
+        'swapout_tokenamount',
+        'router',
+        'israydium'
+
+    ]
+
+    let arr_trs_datares = get_tobody_data(tbody_);
+    data_res = [...arr_title, ...arr_trs_datares];
+    return data_res;
+
+
+}
+

+ 1 - 0
src/code/tempCodeRunnerFile.py

@@ -0,0 +1 @@
+r

+ 73 - 0
src/code/test_get_tokenchanges.py

@@ -0,0 +1,73 @@
+ 
+ 
+import json
+
+import requests
+
+url = "https://solana-mainnet.g.alchemy.com/v2/pxF-cEkEE1JxzxgotGyww5ra5w1IvAkJ"
+str_dalao_address = ""
+getBalance_payload = {
+  
+    "id": 1,
+    "jsonrpc": "2.0",
+    "method": "getBalance",
+    "params": [ "318jS2NM4QC5nsD8Y7BoYBLpRcPDXtic1Wc8xs6MDfDg" ]
+}
+ 
+headers = {
+    "accept": "application/json",
+    "content-type": "application/json"
+}
+ 
+ 
+getTransaction_payload = {
+    "id": 1,
+    "jsonrpc": "2.0",
+    "method": "getTransaction",
+    "params": ["28qc2NVfCJgmSvNBFHVPiMXjQzufXEFR2QpWU928ab2QvvBVL7tdX4xJBTJdLmsbqfikhxbcMWzXCqK5E9rGqBvL",  
+                {
+            "maxSupportedTransactionVersion": 0,
+            "commitment": "confirmed"
+        }]
+}
+ 
+response = requests.post(url, json=getTransaction_payload, headers=headers)
+response = json.loads(
+response.text)
+response_result = response["result"]
+ 
+ 
+
+ 
+with open("response_result.json",mode='w') as f:
+    json.dump(response_result,f)
+ 
+str_dalao_address =  "HTVupcGHvA8tXX5pHmmAxQ8eiFAJSJhYNQjer3zycLcU"
+str_token_address = "Cu7NAWTDK4dAFjrycPNDqTcHwXXB57onxvA7D9zQpump"
+print(response_result)
+
+
+arr_postTokenBalances = response_result["meta"]["postTokenBalances"]
+arr_preTokenBalances = response_result["meta"]["preTokenBalances"]
+
+arr_postTokenBalances=[obj for obj in arr_postTokenBalances if (obj["owner"]==str_dalao_address and obj["mint"]==str_token_address )]
+
+arr_preTokenBalances=[obj for obj in arr_preTokenBalances if (obj["owner"]==str_dalao_address and obj["mint"]==str_token_address )]
+
+if( len(arr_postTokenBalances)>1 or  len(arr_preTokenBalances)>1 ):
+    print("arr_TokenBalances_len>1")
+    raise
+
+number_dalao_postTokenBalance = 0
+number_dalao_perTokenBalance = 0
+
+if len(arr_preTokenBalances)!=0:
+    number_dalao_perTokenBalance = arr_preTokenBalances[0]["uiTokenAmount"]["uiAmount"]
+
+if len(arr_postTokenBalances)!=0:
+    number_dalao_postTokenBalance = arr_postTokenBalances[0]["uiTokenAmount"]["uiAmount"]
+
+
+number_dalao_TokenBalance_change = number_dalao_postTokenBalance - number_dalao_perTokenBalance
+
+print("number_dalao_TokenBalance_change=",number_dalao_TokenBalance_change)

+ 86 - 0
src/code/zzzzzzzzzzzz_test_defined_playwright_chrome.py

@@ -0,0 +1,86 @@
+
+# from datetime import datetime, timezone
+# from playwright.async_api import async_playwright, Playwright
+# from playwright.sync_api import expect
+from playwright.async_api import Playwright, async_playwright, expect
+import random
+import time
+import datetime
+import asyncio
+import pathlib
+import shutil
+old_print = print
+
+
+def timestamped_print(*args, **kwargs):
+    old_print(datetime.datetime.utcnow().replace(
+        microsecond=0), *args, **kwargs)
+
+
+print = timestamped_print
+print('\n'*5)
+print(f"{'{:<6}'.format('enter')}  ----------------NOTE-----------NOTE---------------")
+
+
+def makedirpath(   folder):
+    pathlib.Path(folder).mkdir(exist_ok=True)
+
+def rmfolder(  folder):
+    if pathlib.Path(folder).exists():
+        shutil.rmtree(folder)
+
+
+# Python中windows路径的3种写法
+# 可以是以下这样写:
+utc_timeto = int(time.time())
+utc_timefrom = int(utc_timeto - 17*24*3600)
+utc_timeto = int(utc_timeto + 2*24*3600)
+
+ 
+
+
+async def do_some_thing(playwright      ):
+
+    # browser =  playwright.chromium.launch(headless=True)
+    context = await playwright.chromium.launch_persistent_context(user_data_dir=USER_DIR_PATH, accept_downloads=True, headless=False)
+    # context = await playwright.firefox.launch_persistent_context(user_data_dir=USER_DIR_PATH, accept_downloads=True, headless=False)
+    # context = browser.new_context()
+    context.set_default_timeout(9000)
+    # context = await browser.new_context()
+    arr_page = [None]*2
+    arr_page[0] = await context.new_page()
+    page = arr_page[0]
+    await arr_page[0].goto(
+        "https://www.defined.fi/sol/A9KLSS9modWzMc1A189c6HXwy1QkgUupun9TPJZkhmaw?maker=3RTD4pdo5fJ1pu1jAXRAD2Lzxyx4PHLzo2F6M5mP7LGZ&cache=b8081&quoteToken=token1" , timeout=100000)
+   
+    # cur_arr_str_dalaoAddress =[15]
+
+    print(context.pages)
+    await page.wait_for_timeout(100000)
+    time.sleep(5.5)
+    await page.close()
+ 
+
+    await context.close()
+
+
+async def get_onedriver_swapactivities(    ):
+    async with async_playwright() as playwright:
+        # playwright = Playwright().start()
+        await do_some_thing(playwright )
+
+
+async def main():
+    print("enter main()")
+
+    await get_onedriver_swapactivities( )
+
+
+ 
+ 
+# USER_DIR_PATH =    "./browsercookie_path"
+USER_DIR_PATH =  baseclass.browsercookie_path   
+makedirpath(USER_DIR_PATH)
+asyncio.run(main())
+# main()
+print(f"{'{:<6}'.format('END')}  ----------------NOTE-----------NOTE---------------")

Some files were not shown because too many files changed in this diff