From 8fc21cefda7548ef023908d8af0ff36395c4788b Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sat, 29 Nov 2025 12:23:53 +0000 Subject: [PATCH 1/4] feat: Multi-network support from a single branch This commit refactors the codebase to support multiple networks (mainnet and testnet) from a single `main` branch. The active network is determined by the contents of a `./chain_id` file. - `main` is now useable for both mainnet and testnet - The source of truth is the `./chain_id` file (`00` for mainnet, `01` for testnet) - New setup for support of multiple databases - Per-chain files for config, checkpoints, rewards, coinspecs, genesis - Refactored how code identifies network, using `CHAIN_ID` instead of `NETWORK` - Updated deploy/install/docker scripts to be driven by the `chain_id` file - Added safe defaults to the system to fall back to mainnet if the `chain_id` file is missing or invalid. --- ONE_BRANCH_TO_RULE_THEM_ALL.md | 52 ++++++ build/docker/miner/start.sh | 9 +- build/docker/node/docker_start.sh | 12 +- config/config.00.php | 105 ++++++++++++ config/config.01.php | 105 ++++++++++++ config/config.default.php | 107 +----------- include/checkpoints.00.php | 253 +++++++++++++++++++++++++++++ include/checkpoints.01.php | 44 +++++ include/checkpoints.php | 259 +----------------------------- include/class/Blockchain.php | 4 +- include/class/Transaction.php | 4 +- include/coinspec.00.php | 95 +++++++++++ include/coinspec.01.php | 99 ++++++++++++ include/coinspec.inc.php | 101 +----------- include/genesis.00.php | 13 ++ include/genesis.01.php | 11 ++ include/genesis.inc.php | 19 +-- include/rewards.00.php | 26 +++ include/rewards.01.php | 52 ++++++ include/rewards.inc.php | 35 +--- scripts/install_node.sh | 61 +++---- web/apps/common/include/top.php | 2 +- web/apps/explorer/address.php | 4 +- 23 files changed, 912 insertions(+), 560 deletions(-) create mode 100644 ONE_BRANCH_TO_RULE_THEM_ALL.md create mode 100644 config/config.00.php create mode 100644 config/config.01.php create mode 100644 include/checkpoints.00.php create mode 100644 include/checkpoints.01.php create mode 100644 include/coinspec.00.php create mode 100644 include/coinspec.01.php create mode 100644 include/genesis.00.php create mode 100644 include/genesis.01.php create mode 100644 include/rewards.00.php create mode 100644 include/rewards.01.php diff --git a/ONE_BRANCH_TO_RULE_THEM_ALL.md b/ONE_BRANCH_TO_RULE_THEM_ALL.md new file mode 100644 index 00000000..403185ba --- /dev/null +++ b/ONE_BRANCH_TO_RULE_THEM_ALL.md @@ -0,0 +1,52 @@ +# One Branch to Rule Them All + +This branch refactors the PHPCoin codebase to support multiple networks (mainnet and testnet) from a single `main` branch. The active network is determined by the contents of a `./chain_id` file. + +## What was done + +* **Multi-network support:** The codebase was refactored to support multiple networks from a single branch. +* **`chain_id` file:** The `./chain_id` file is now the source of truth for determining the active network. `00` for mainnet, `01` for testnet. +* **Network-specific configurations:** Per-chain files for config, checkpoints, rewards, coinspecs, and genesis have been created. +* **Dynamic loading:** The code now dynamically loads the correct network-specific files based on the `chain_id`. +* **Refactored network identification:** The code has been refactored to use `CHAIN_ID` instead of `NETWORK` for network identification. +* **Updated scripts:** The `install_node.sh`, `build/docker/miner/start.sh`, and `build/docker/node/docker_start.sh` scripts have been updated to be driven by the `chain_id` file. +* **Safe defaults:** The system now safely defaults to mainnet if the `chain_id` file is missing or invalid. + +## What needs to be tested + +### 1. Installation + +* **`install_node.sh`** + * Run the script with a `chain_id` file containing `00` and verify that a mainnet node is installed. + * Check that the `phpcoin_00` database is created. + * Check that the nginx configuration is created for port 80. + * Check that the mainnet blockchain is imported. + * Run the script with a `chain_id` file containing `01` and verify that a testnet node is installed. + * Check that the `phpcoin_01` database is created. + * Check that the nginx configuration is created for port 81. + * Check that the testnet blockchain is imported. + * Run the script without a `chain_id` file and verify that a mainnet node is installed by default. + +### 2. Docker + +* **Node** + * Build and run the node container with `CHAIN_ID=00` and verify that a mainnet node is started. + * Build and run the node container with `CHAIN_ID=01` and verify that a testnet node is started. +* **Miner** + * Build and run the miner container with a `chain_id` file containing `00` and verify that it connects to the mainnet mining node. + * Build and run the miner container with a `chain_id` file containing `01` and verify that it connects to the testnet mining node. + +### 3. Application Logic + +* **Database Connection** + * Verify that the application connects to the `phpcoin_00` database when `chain_id` is `00`. + * Verify that the application connects to the `phpcoin_01` database when `chain_id` is `01`. +* **Configuration Loading** + * Verify that the correct `config.XX.php`, `checkpoints.XX.php`, `rewards.XX.php`, `coinspec.XX.php`, and `genesis.XX.php` files are loaded based on the `chain_id`. +* **Network-specific Logic** + * Verify that all logic that was previously dependent on the `NETWORK` constant now correctly uses the `CHAIN_ID` constant. + * Specifically check the following files: + * `include/class/Blockchain.php` + * `include/class/Transaction.php` + * `web/apps/common/include/top.php` + * `web/apps/explorer/address.php` diff --git a/build/docker/miner/start.sh b/build/docker/miner/start.sh index cd92dc37..65025163 100644 --- a/build/docker/miner/start.sh +++ b/build/docker/miner/start.sh @@ -1,14 +1,19 @@ #!/bin/bash +CHAIN_ID_FILE="/phpcoin/chain_id" +if [ -f "$CHAIN_ID_FILE" ]; then + CHAIN_ID=$(cat "$CHAIN_ID_FILE") +else + CHAIN_ID="00" +fi -NETWORK="${NETWORK:-mainnet}" ADDRESS="${ADDRESS:-PtD756PoeBfw6KgCLqjpD4sYdZsaFu536F}" CPU="${CPU:-100}" NUM_THREADS=$(nproc --all) THREADS="${THREADS:-$NUM_THREADS}" MINING_NODE=https://m1.phpcoin.net -if [ "$NETWORK" = "testnet" ] +if [ "$CHAIN_ID" = "01" ] then MINING_NODE=https://miner1.phpcoin.net fi diff --git a/build/docker/node/docker_start.sh b/build/docker/node/docker_start.sh index efc2dbc8..d33d32f4 100644 --- a/build/docker/node/docker_start.sh +++ b/build/docker/node/docker_start.sh @@ -3,14 +3,14 @@ FILE=/first-run if test -f "$FILE"; then echo "First run node" - wget https://phpcoin.net/scripts/install_node.sh -O /install_node.sh - chmod +x install_node.sh - if [ "$NETWORK" = "mainnet" ] - then - /install_node.sh --docker + if [ "$CHAIN_ID" = "01" ]; then + echo "01" > /var/www/phpcoin/chain_id else - /install_node.sh --docker --network testnet + echo "00" > /var/www/phpcoin/chain_id fi + wget https://phpcoin.net/scripts/install_node.sh -O /install_node.sh + chmod +x install_node.sh + /install_node.sh --docker rm $FILE rm /install_node.sh else diff --git a/config/config.00.php b/config/config.00.php new file mode 100644 index 00000000..776ff2e3 --- /dev/null +++ b/config/config.00.php @@ -0,0 +1,105 @@ + "2ucwGhYszGUTZwmiT5YMsw3tn9nfhdTciaaKMMTX77Zw", // 2023-04-01 12:00:00 + 1000 => "6seZYqyH83Us7NhX3N9TgB8jqgkFrCc9etpQsiUL3coz", // 2023-04-02 06:32:45 + 5000 => "BLLhY8L5kr61jmwjF252qNBuBaL1Sxhz8TurgJ1MZVbR", // 2023-04-05 08:51:32 + 10000 => "5FCNEW8bRgb6pv7YXub755ijSU2DQJ15EqSdd4USMj98", // 2023-04-09 08:02:27 + 15000 => "CmFpsmEew6kCUgwFRPyvbYKGmiXZ4Hd1Gedoa6q98TJV", // 2023-04-13 04:38:58 + 20000 => "3LYBUKS1UFyPnY6ne3vz8zaYAWA36p75jvJzX1LZAJCi", // 2023-04-17 01:17:58 + 25000 => "29oP8cKUKawXvQgfV5prURUPytZt58iFqUug3cQd9ndf", // 2023-04-21 09:51:44 + 30000 => "AyuYpXTxSimipWXw9kaXg5A3Cu9gX7VcoFh5k2HhXMTp", // 2023-04-25 06:36:46 + 35000 => "wnV5doKG5L5do9X7ZK9ceTsEY38n4ktYgdZatpuyM1L", // 2023-04-29 03:35:22 + 40000 => "BBC84NpVjBtcaxdSPjCzHZm1J9XZ8hdoC38kPwLouatj", // 2023-05-03 00:16:23 + 45000 => "8fFgPVrVjWZQNWUkvWB4VUngdS9XFhVUEyZXnQFLaxuR", // 2023-05-06 21:41:47 + 50000 => "2RmopeRpxuFp6VM64v2Czyph7sTL3MXxJcPSGLBod2up", // 2023-05-10 17:54:22 + 55000 => "HXH4ts6j4eiXUHcg7G4KRJDsMgvckxXWzuwfV5FWbFvd", // 2023-05-14 14:40:19 + 60000 => "BHoaS3rkuP5LAJEm29YRhrUvm3edYjT87hhdXSzk9ks5", // 2023-05-18 10:50:49 + 65000 => "2KErUePq6U1Y8PjMzY9bMqS1GVWJzhKZUZjLpy7d9Jo9", // 2023-05-22 07:38:45 + 70000 => "DQbeBLfmtWob728NbrSTQER85mKgReXoENEjpa82r4Tp", // 2023-05-26 04:19:49 + 75000 => "4ZQfMnbzxQwnWpaXP1qzBaBoEwHiGxEHz4GxWPCVdMNx", // 2023-05-30 01:02:00 + 80000 => "NgHvZG4FKAXsmpDJg3xKr4MMFd7QFwZfixgvBMmBwAo", // 2023-06-02 21:31:42 + 85000 => "CEbViLj1VV49uE59JHLH3bMiK8mRQrYNejUHdzmVxbqB", // 2023-06-06 18:20:47 + 90000 => "9krGDi3N5xFWCCisEfG8igN9KgitUXGKhfwkqDZUdL9u", // 2023-06-10 15:39:39 + 95000 => "8MK419JyWhw4LVDm9bKZLmNjJo7FxckdKQszr5GV2BB5", // 2023-06-14 12:17:28 + 100000 => "6HTPwZc1u61FwUiBr779LM2nbDz5PuBFWeJJ3Gj88XQH", // 2023-06-18 09:23:09 + 105000 => "FzfkJLKmFYgoACAfwGScpKwDT5xn2xQiwrTpHCjyjCtL", // 2023-06-22 12:53:07 + 110000 => "co7GUpcXfGhzXB4mA6SEnDG96aZnQvRbrTvoZjvDYK3", // 2023-06-26 10:02:22 + 115000 => "BaRmc2zGGfkkvpdiB5XFn9T1NT5gzjxUb15xhtsecguW", // 2023-06-30 06:55:45 + 120000 => "LGvaKxz7waNciZJmwvnDAbkVdD1tW9UtJUUrkNoosQ5", // 2023-07-04 03:29:19 + 125000 => "zRNyPzprDx3X6VC4VPEtBGwcJcrtdRZMPx1maKMea8g", // 2023-07-07 23:56:57 + 130000 => "8PxbARg5VXuPh3mht9GrjWG5KLofwUjThEqmE1jFFn4c", // 2023-07-11 20:36:01 + 135000 => "HGNCvLHPmjsAa6c6BKTeqBeVD8daMDkpVKcG2T9HqZmT", // 2023-07-15 17:13:59 + 140000 => "4MtFPyDkTKf9FG8oQrkYWdGUS2m1VywaqzATvkZ3v5Rb", // 2023-07-19 13:40:35 + 145000 => "DW2CXDrV7x1xseN6aLf6jqqRgGNAZrZtk8wdDBtPMUmn", // 2023-07-23 10:23:16 + 150000 => "GeLkDJiMAz2qmM1kshykXQ8GMY3uP1C7yWKnxaxNicKX", // 2023-07-27 06:48:31 + 155000 => "DRUmtpY5qLN1AGR4whFFNRG98ntuexsdNt2wE7eMK8rV", // 2023-07-31 03:30:09 + 160000 => "ANhmZm9Rxcfyx8XNrcmtW6TzVz5urSzVakHZ8WsFjqLn", // 2023-08-04 00:15:49 + 165000 => "4M5VaRNxCmN5jmLf4fT4eW93vike4aQ6daYsAqqmDsn6", // 2023-08-07 21:21:44 + 170000 => "FT9Fbj1H2NcHBNiwy3RBRmBj4X7mWfRFvhyzkQtbehyu", // 2023-08-11 17:52:02 + 175000 => "5791qWxYd9sZ4naiEN1Hugi4LUDNr7Z7ecUke9JPyJvc", // 2023-08-15 14:22:24 + 180000 => "AUEp97Miy7ydDv5UW9fdx9Mpu4ZaDjHc2UWHUeMnKBAx", // 2023-08-19 10:34:05 + 185000 => "9M4tR8Ns9h3BTL63nefqRC4p7iaRNVedBJRdFeTHvFC1", // 2023-08-23 07:56:55 + 190000 => "CsF4UAXs3QJjhGfwF72sPuRPC9fbPP8zjLNRFEaV5ARC", // 2023-08-27 04:47:29 + 195000 => "EufiD5sSvcT8snK4UfRJQQGZSTLykSaafxy52NX5YusQ", // 2023-08-31 01:55:08 + 200000 => "4DLgryKvXKFhCNhdu3MEHya683sQ38sXnfRPGa6QBE2K", // 2023-09-03 23:12:58 + 205000 => "GpEwQMBybTXo8MDUacT5HQNdfLVx2nnx5jiQiPw54D2o", // 2023-09-07 19:52:22 + 210000 => "F4SZsmwdeff6NzeVRxVM7kUnUdqqgyAyopn6jGe5gmt3", // 2023-09-11 16:20:12 + 215000 => "APn8nnKJgpYzhEx42k6w5Zmb7H8j1EfA5M9vfhdWhDqd", // 2023-09-15 13:28:51 + 220000 => "CKDvEWgBxfE6ex8XQvVEmy5vQGVTfq13ANx5cZzzALoD", // 2023-09-19 10:14:19 + 225000 => "8U3ArGTHSsX7hPYtvpYLeGtQGHxWi78LShjSC23R9N8", // 2023-09-23 06:59:46 + 230000 => "GS2NEkDe4atZdT7n5Jk8ZT16eEKLNU3VqZS7yWT3KauA", // 2023-09-27 03:31:53 + 235000 => "DKwboNHf48i7JK1skZFoYxwfsRBLbuUYm6c68ZGrcL4C", // 2023-10-01 00:05:31 + 240000 => "6ghugWoXVVkGKo5qFs5LpV5cfvLXvZXruTuwfvZA3PxC", // 2023-10-04 21:06:02 + 245000 => "6GX5cijXxymBBEFiA418uQXd42BkPZ6mVKqiv5CvL4tB", // 2023-10-08 17:23:03 + 250000 => "BfM45EWHKi3vYEjAKh4dzeoV8cud2XKbuoh59Tnfiwu3", // 2023-10-12 14:03:43 + 255000 => "3U4pvPzMEpouVUSBpfNfk5czQ6PqcSQTRj3dnmnwArDz", // 2023-10-16 10:43:28 + 260000 => "GdgKNrEGEDMwudBspHt7rCFN6c3cgfwdEAAqrSkCsBDP", // 2023-10-20 07:47:47 + 265000 => "3ySM9bkqApnTzAKcVDeZdsAxShJBmsdjQtd3XgBwe4nJ", // 2023-10-24 04:08:32 + 270000 => "4FF1dvmzkerDZXZYhJ81jqeSfan135kFDhA3s54ExT3a", // 2023-10-28 00:42:15 + 275000 => "AMx9xv4DVw9tTyDXTx96TDBZoUj4ofuPj5ZqVYqiWVCB", // 2023-10-31 21:42:56 + 280000 => "B88eRpXsDNUv73gWEA5bq3qgG8zWCfs73bSPMPFjspS9", // 2023-11-04 18:26:38 + 285000 => "FWMYy9TzbPXHFJNsZ1Q2gx59VxRJg9g5oJdJEvbYUUsA", // 2023-11-08 15:04:40 + 290000 => "BhDiLZmS1FCRarPMqq51r1xRUTpcKq77u5DWnjgJnUvP", // 2023-11-12 11:17:01 + 295000 => "DbkUHFcrNSRdxi8Ri54M3Fu9LuE8SafbMJqk7JvYAGBv", // 2023-11-16 08:13:58 + 300000 => "3uLtfFanUqVPNkauBgq1sip7xaMMEB57WkooAnsgMtgg", // 2023-11-20 04:55:25 + 305000 => "9ZRML8zq2qqPjwx7qmTC6fnDwqzMNqhD8BoPkkXqSYf3", // 2023-11-24 09:39:26 + 310000 => "AFauVk939Q9SjqRT5kLWPChTxgarbBEgTPNsjjA9ZY7H", // 2023-11-28 06:28:57 + 315000 => "GfwAMvK8pKQ6QmMb5NnZoSCRoNKz8tpAjdXNsk4k9nbT", // 2023-12-02 02:50:33 + 320000 => "ARbDeH4vePdkVfnvj8mVGMS59uBqYyvWLxRRxV4fGFqa", // 2023-12-05 23:38:32 + 325000 => "7hay1mQWakr1kbtKyHRtEXjih8V6eBdCkXVhf1UPDys2", // 2023-12-09 20:20:48 + 330000 => "Nyj5UGDc7aW6EPzWoFSkb8GHjqavLrQ1QX3kekP6RWb", // 2023-12-13 17:00:34 + 335000 => "Gb1h1C6oU2rMZGnW5ZHpHLNHh7CZtpQNZXEh3gBBEQNW", // 2023-12-17 13:50:38 + 340000 => "6K7HjivvG4vEgTZEdegQPcsXvKjXxFPERq972sn3qT6p", // 2023-12-21 10:14:40 + 345000 => "9hqUXCrivX4NCMzGZrMRnaPrFeT3dRJZbi34Vq5QixNF", // 2023-12-25 07:11:20 + 350000 => "972rymKqb6QrpGf8rasCeKxNRhZHffKanSeCwKZh9LVJ", // 2023-12-29 03:54:09 + 355000 => "6biVWUFgZrGedarHTJD8jcf2bgvvW8zrGGBgNB8CVKmg", // 2024-01-02 00:11:22 + 360000 => "EaSvzW5btMXRzxBix26xgJGDrMwe7B4NGtRCivtQDLM8", // 2024-01-05 20:32:55 + 365000 => "CNnq8WKWXqFTyFywCDf7ypTdkDTPfiAxxorhQzuDcJpA", // 2024-01-09 16:47:50 + 370000 => "DDZtWLpjwiWTxq3v3phSAGEBciaczRW3UFfX8vhegF4Z", // 2024-01-13 13:19:30 + 375000 => "6Lq2x9hGPsnetHf2bd7TvYhjYLiHfVNHzGb7bu7rJ6yh", // 2024-01-17 09:51:20 + 380000 => "6k23TJ18HULJNEt7FH9d6xvU8WiAh4jFaukbuvm732oE", // 2024-01-21 06:20:08 + 385000 => "CfAKomeo362KJtgnKSSxGEgRx77SHrqPh4R53mZsr7iz", // 2024-01-25 03:13:09 + 390000 => "CwiEMsRY9oNdi9YpgQtT1GnorBvLv1NibswyQ3WbgufP", // 2024-01-29 00:08:22 + 395000 => "FQh8ysNsxueJ2xinfchiZJaNPizof89zk16fhGzCeb5N", // 2024-02-01 20:22:49 + 400000 => "ALB3X674Vn2Ff6CjM8KV97sYsY7JoRBic8Pzw6gCG4xc", // 2024-02-05 17:35:02 + 405000 => "3b1D2SUnyJQDfx5FqXPxiMs6aLhBCyNqNPk9nySJyHbY", // 2024-02-09 15:44:48 + 410000 => "4aXnVqs5H4d7RAj8dcjgrBmLiz3TSEyAC3h23Mp7HYjb", // 2024-02-13 12:31:49 + 415000 => "agUaqMpBcdV8hvEiAWREqxGdVJYY8jAS9TjHacnamPh", // 2024-02-17 08:52:08 + 420000 => "4Rn4ft5spMzJzYadMMwNFZXt3wz6bpEaTZgrs6EfL8Zj", // 2024-02-21 05:52:23 + 425000 => "7BhLvDTjyTXsDZn6WrLTFNm7daHSSRZ766ENtoaJ74hT", // 2024-02-25 02:24:15 + 430000 => "HumXU8fAiMBs1FFPg5RoHQUJZVG6ZzM5nsCR5JgCjpvv", // 2024-02-28 23:22:52 + 435000 => "DjdTPba5Dx6mLSZQKxd4o7FV2jJCYEthn5MUpZGauB6a", // 2024-03-03 20:27:03 + 440000 => "ALtzy3dz2A4VwmrC2G5zqMFvmH44pi3RUSNAsA3fgye3", // 2024-03-07 17:22:32 + 445000 => "BUP44kokcdKbpa6W9PYFyM21yKR3nZeSPvCkQJ81hk52", // 2024-03-11 14:19:20 + 450000 => "4irSmj8ZWBmxkLiCP8RhcjwmdAUfsJWXyzsEH9FYYyHH", // 2024-03-15 10:39:42 + 455000 => "7jtuqK6zhGSxyBpdxK9F5dEwQQN3ACvyMbHwt2gB75y6", // 2024-03-19 07:17:21 + 460000 => "Fox1HzTNoBJp9kK6GtQtJNUqucyEgYtpC473uPJB5RfQ", // 2024-03-23 03:39:15 + 465000 => "oELF6Kmp6szwum6FraYLPeLwArXRxq3vPWm8JVZjvxk", // 2024-03-27 00:02:32 + 470000 => "JDsLPPwNQBSM7fjMgyf3NzhuzN6vsbfYcT9AvGgv2LB6", // 2024-03-30 20:33:18 + 475000 => "6ty7t8xciD8VCcfk3ffESfDpeQ3RwC6BwEdyVTmuzPGB", // 2024-04-03 17:23:50 + 480000 => "79k6mGhZXwDy3yrnQufcf2K55U9cieLP9HmaGmeD5yKj", // 2024-04-07 14:07:45 + 485000 => "8MQXoNMkECtsTFuzdWMLmyUkWNVvvA5Q6yjFDQjYiEeN", // 2024-04-11 11:10:27 + 490000 => "GVEeZ16FRp9RWaAzeujyvcBbVzjcPD4waL6p4X6pTXwm", // 2024-04-15 07:55:42 + 495000 => "Gz1YfqfRjgWLd7yazmzn4tyBo4JH2SAPYHzLWeGFRdb8", // 2024-04-19 08:41:41 + 500000 => "3vVHbtw9Us6KZFEYR6oGNfE75QqCvdj5SvGACLk15RyQ", // 2024-04-23 05:51:38 + 505000 => "8viVhdLX3mhawrToPQfjE6GqSaKeuHmwEGDHtE66DDwe", // 2024-04-27 03:09:03 + 510000 => "5P9V3Zzr7euU9PbBgvHTEKhvp31ssLEeAWsUsNBRsE1W", // 2024-05-01 00:44:12 + 515000 => "CmaM6t7AA6WcEDJXtSs1C95PeeJy3FDBrE8cATtAeDGW", // 2024-05-04 21:38:51 + 520000 => "HGGchZdb1SPcqsft4nd19VRBaqtxabDnGB7k6NVvXPWb", // 2024-05-08 19:02:49 + 525000 => "HebNxkk64Z9ohdTNUj7k6FByZdricGbKHokzZLtXXPjf", // 2024-05-12 16:37:38 + 530000 => "HaDmHV13nEn5G13hjGN59hvuuZgvZ3Ws3B6bGYkG7fif", // 2024-05-16 13:43:28 + 535000 => "AUyFFULhqPYLvXYSY7t2mUZJ1CEzdpW9Z2snUxZmiV21", // 2024-05-20 10:35:47 + 540000 => "CsMCam3t6pPuZCGp7Rit2cmhV3t5AJym73t8tj7hD5vq", // 2024-05-24 07:59:04 + 545000 => "GAwvfPiFEVdHMS523TiZhvMcwwcZeenoBPDG5Hp11ith", // 2024-05-28 04:51:58 + 550000 => "A8igwUcabWpuxwDKfMLdC1xiFFcyofdAPL9yowozNJT2", // 2024-06-01 01:39:32 + 555000 => "DEPagpp1BawhAr2FhUE9YD8VCU2amNaKwNUv3qpUJcUn", // 2024-06-04 21:59:01 + 560000 => "BEiTrucHxH4LdU1SvHLp9GMy1P4QwUBVqf1iGFJnJRdd", // 2024-06-08 18:45:11 + 565000 => "FbXK5Q8srFGS9DFd8cT3yMvCBAJqB8qqP5W5JxvNHXE4", // 2024-06-12 15:25:43 + 570000 => "DaGBbwBhwEVjFmH3NjFdNwfsw4gdshgJfGMRcfr5AH2P", // 2024-06-16 12:04:17 + 575000 => "3eAWYfEopXoZnFC113kAPB8wuuBad1F7cvv7ewnBKZxL", // 2024-06-20 08:44:55 + 580000 => "9KMxWsSAPk2xzRVfZQumRfSwbTHjvbG1mcrRiMgFEHR5", // 2024-06-24 05:11:22 + 585000 => "9vCjXS1Fr7eXakLtfyYQXHfzAnCa42KnMDQkbnxsgcsd", // 2024-06-28 00:58:31 + 590000 => "5s7Ls8FbDUU5QUgGz24qKKrUsyS2e5pZ9A1NioVdFJRJ", // 2024-07-01 22:30:52 + 595000 => "65rMpGTP2s38SnbAFCz9zBXFL24XZqcTQwgToRGs9rZy", // 2024-07-05 19:16:12 + 600000 => "EYQFah3PKnRsk9BJJkkmSSHiBwAEDfue4tabzYSVVFWJ", // 2024-07-09 15:34:50 + 605000 => "P3fV4hDD2AGX2zerR56iNtoH5QXiFN9kZFFHfRFMbGs", // 2024-07-13 12:04:18 + 610000 => "511Y4Nym2wkZKwohgvpRT1AQk6yHu8QBFDkzNAsYmZEs", // 2024-07-17 08:12:07 + 615000 => "9vhQ6efWFehEBSmxsTdnxpMjKBQCorXtDSjfAK3K9Z4g", // 2024-07-21 04:45:22 + 620000 => "GQqVU8aTjmmjWW3Thepo6oRY5aspSTTYHQjwYWPYPfTv", // 2024-07-25 01:40:37 + 625000 => "6Vho2GcK89SDyjuXAjuA1JTWpNdJRkmzAz7CBHLEFjBx", // 2024-07-29 05:43:36 + 630000 => "7E6KkjZwYCPVsGNpnwN8sHCBn5aJFi6geSF1Bt42JiuP", // 2024-08-02 02:08:35 + 635000 => "3SVhx2YZAHZBvuJbwMQNoeysejykarxVhhkoezoNnrZn", // 2024-08-05 22:46:11 + 640000 => "7z7XMjEksvxnzgEECPfAv28FGno4R6Y3VqtFYgYWuRUm", // 2024-08-09 19:02:26 + 645000 => "4waPt22QUgLkKRFHhxorHN7vxYHy9h3fFMcjB3YJuBUj", // 2024-08-13 17:28:11 + 650000 => "CGLvdFCF6KFbEBTLwzgqBinKqik2Fv4t45UHTKBsSWAm", // 2024-08-17 15:11:30 + 655000 => "DLEoeqzR6iLnBKv5o4sxQ9YM27faULYigcoqK43nJHyx", // 2024-08-21 11:59:08 + 660000 => "B9xkadHFoaYo7suoUzRAerUPBX12zZDynek2rJChmiC4", // 2024-08-25 08:12:50 + 665000 => "4hc8prVQEZEqrwSgjNPkYTb3aSYZ11EJHpRDLUr6BvNQ", // 2024-08-29 04:34:56 + 670000 => "2NZNfZyJADfXhRkckQ65T73mAfuNSiWMpn4pXby1qk6z", // 2024-09-02 01:07:59 + 675000 => "AQKr5ZvYqu9GsYefJLKwfnrf6RcYA4YfEpALBnymQxmg", // 2024-09-05 21:41:51 + 680000 => "HLRUNdykRX34HzRfQj92HjSwvy5ek7wjM442BK7STdfA", // 2024-09-09 17:51:08 + 685000 => "8HDbhgB3oq8iUVD8YvbhTpyTHLQqyEjLyqgmNuSwQHKC", // 2024-09-13 14:41:22 + 690000 => "HU9GESw6NNUWnSsZ1rktNzJWE5AyAcxbvcqf4d5pf2Ev", // 2024-09-17 11:09:57 + 695000 => "Fjmqsy8me1Fdrx8G5xtu7EHQh3ha2PVusT2myiaFDgn9", // 2024-09-21 07:45:24 + 700000 => "2PFJW3iUdHTSMYD45geCs39XChvzAA1pTkf52A5mAaRo", // 2024-09-25 04:47:05 + 705000 => "5ZExFWZw2wXvV8AGnNzGBDeYAUmmMoWzVHG4dXnfadnP", // 2024-09-29 01:11:19 + 710000 => "A1MA62eN86PM1aRezbWP78aivxtydQPjHkgwCvcs26Jb", // 2024-10-02 21:56:10 + 715000 => "3vLcdWpWE1Zz2xVUuGW8XrYwRvCbFNKwf9K8c8RiQfr4", // 2024-10-06 18:32:15 + 720000 => "yXwDNA8SpRmfAwqD2afUk1Ctw1io6MXBKTTcJAtKXaM", // 2024-10-10 15:31:49 + 725000 => "96dDq9y1STC3qFQpLMVDLWQZaBDR85kBEh8VJkQGxhhA", // 2024-10-14 11:57:59 + 730000 => "Fo2pWjacRda2HsqXEbCFGPzbKNGkGYgNqGnm51Q4f5RQ", // 2024-10-18 08:25:07 + 735000 => "86sNYLwURbY5tF3dykg4p8cfcZQmTPNzM9dYH2zZTHdj", // 2024-10-22 04:39:37 + 740000 => "EpVBvTdJkMdbEgbHqnV7T5vVD7UJPuCWQatSwf4Uouuv", // 2024-10-26 00:54:18 + 745000 => "9VzUDCBp6UuVoYiuHciZwwJisyAbrdXwWt13Hgx7UhWL", // 2024-10-29 20:55:20 + 750000 => "97y3wB4hcUzZQCwDxFgWw2jdZY2Spk25eXhQjBsJpbpt", // 2024-11-02 17:21:25 + 755000 => "7MxRvN6o82GypCntw13JnZKHLXCRSDbiJcUEY5qEGKvo", // 2024-11-06 13:44:06 + 760000 => "6JD1oo7kksx4LjdzYx8kEZihTXF1TbtsoXW3vy222QX4", // 2024-11-10 10:00:25 + 765000 => "5b1Fzt5DXE2Kasb8kX7KmCfkLogwDu8bHjjXfi5s2A5f", // 2024-11-14 06:36:29 + 770000 => "AGczsoQ3benuUh15C92PcmUidgrHKyWWD1RC7fTBwn8h", // 2024-11-18 03:34:23 + 775000 => "2PaNHJJpb3wXT1otxcbRyvBbQVo8WbUiCWJkzQgJNC2c", // 2024-11-22 00:00:57 + 780000 => "EMHwUyRBDoNRYRbcznJbJ6SYhni5vzW1SJ2uKgEuQJo7", // 2024-11-25 20:37:43 + 785000 => "8tq7CzqciKcY5UjAzeN9ibgwKYDVysnfBLj3tApmCgWZ", // 2024-11-29 17:15:06 + 790000 => "E4FaUDuUtTo9j7oo8zGQuHCJBzgasZyzGXKRbekCjovf", // 2024-12-03 13:37:26 + 795000 => "D8djZWfxWkBKu8zkvXUayBXBJTGedUpaqesUMYZbRLV6", // 2024-12-07 09:52:22 + 800000 => "9VWSDBKPJeH1Wp7SsxGadi5vPBkJcTq3EQopo9wN77ER", // 2024-12-11 06:19:03 + 805000 => "F4Yg9ypBgCJ4d1Vgz3m4A2mQhzLyt2ReD62xr2zy3MJi", // 2024-12-15 02:40:48 + 810000 => "HiHujKeQSjNCyiZv1PzZTfDFdgWVHYq6wp62JgvB7hap", // 2024-12-18 22:40:21 + 815000 => "6kuAxR773268NcTZawBWQKyELyiEDDxsvkuKbSy4vjuk", // 2024-12-22 18:57:06 + 820000 => "2NMHcW9DjUVedxckf1bspBTkxhu6S6z6VNRAfQM1kW7R", // 2024-12-26 15:42:26 + 825000 => "5gHGADNFmYaLcACcRsCZ1YGvtcZKLRkjo5Q82GGA5uwL", // 2024-12-30 12:17:26 + 830000 => "6ococ6kNtrd8huhQ2TiCsswLD6T8CpEx7D8rz46xMZRY", // 2025-01-03 08:45:37 + 835000 => "9jWHmrQXZJwsq5g44mGBmNq3JYfArDt4m8gbJ1czpfUL", // 2025-01-07 04:54:00 + 840000 => "EkMGQGUnEcyVjEBJAwfGXF9tQcs9pM9pw2NvBZwSk2Ux", // 2025-01-11 01:39:08 + 845000 => "4YhbYPJaR5mRvdzEqTXuCX5sTKcQZz1hR5PCZ76tnzEA", // 2025-01-14 21:44:34 + 850000 => "9iTmUj4epSBNoTsqjac15t6CKdWBPLzBBhC34AWDYuHp", // 2025-01-18 18:04:40 + 855000 => "9ccmphxedz8zP2DDt5n6Y2UZg9HyVfwg1kddfEbnrz3X", // 2025-01-22 14:44:45 + 860000 => "9bKFU8Gdxv1hgz2r8cg3FHhQugjm3t2n2raTpnz1DZet", // 2025-01-26 10:59:38 + 865000 => "ngGDumKcrA1qoPoayr65L1pMRJCqrz7nYgodKRzPqqL", // 2025-01-30 07:00:00 + 870000 => "Bab9TMw3jRrm8QaTicXnRjYNwpzyMcMJ8bCXTzzFYc1W", // 2025-02-03 03:45:14 + 875000 => "AHgZQeKASLdagpt2UwqwNSbBfckAyyAPUEXUfJbs86ZZ", // 2025-02-07 00:28:06 + 880000 => "75FKbxy9SYU3CaWArovbPkAoKKrSxZZvnK1KABVC8cTa", // 2025-02-10 20:22:48 + 885000 => "Gdchg4ah2WwEGQpogoGDesiNuvjqaEpuKGhE7kNKw182", // 2025-02-14 16:56:57 + 890000 => "4MnM6v3TCdLMPTxmcmRt6Shn7MB6bi4EdeT6jQRdZmBT", // 2025-02-18 14:00:02 + 895000 => "ARtx4uWsR3X4TB8sXtgW8KiHakm3gaB5YY96yEF2qVBs", // 2025-02-22 10:42:30 + 900000 => "6xB4acpP9wH67UbQPetLMJuwie9GPaN74W2MMdEPqy2e", // 2025-02-26 07:31:50 + 905000 => "AcPAbz3Th1x5p4BmW2aKcP2Hi3S7tYvAgtyxrSRdu3Ta", // 2025-03-02 04:39:32 + 910000 => "4FQkMuJ134cFjsgLXM5ZHX6FRhhced4hB1QQB1UNcnKD", // 2025-03-06 01:12:51 + 915000 => "6613yadgpzt8uXPze7VTojdRNr48hHMFcapY5GUHyGN3", // 2025-03-09 21:23:11 + 920000 => "9roX4cv7yhtmbQHdCgnLzWsnu1pPYMzXH3zDeH4QLsiK", // 2025-03-13 17:53:32 + 925000 => "6xcQaSr2WkezjEHmiFuBRLcScFgQ623NTFmzaRKaJLRy", // 2025-03-17 14:09:38 + 930000 => "6qT9H76bUyxH1yX4xQqNkwqxzME42PBMk7KmD1Tjyt97", // 2025-03-21 10:21:37 + 935000 => "FPLnvt2aFfZc7rHDEQKxKPhshv4u4EChA4Dzi8UzXXc9", // 2025-03-25 06:58:47 + 940000 => "C9ZgWoTbaUo9RfxcRSB3WzABL5Z2X62r6raQba6oZkTW", // 2025-03-29 03:28:49 + 945000 => "8djUy2s3ErqKoaAZ8tEqYBjTuG6VGwmL4CcPj1AYWhnE", // 2025-04-02 00:05:26 + 950000 => "HyJvaVMGvqYDdqZEqW4Y6Bra8jx9ADwY2MSy7y4ND4s2", // 2025-04-05 20:13:52 + 955000 => "ALxZpH1PYWskBkk5ZH4DveEF9xA8n5cVBV6JQ9vmKj74", // 2025-04-09 17:02:18 + 960000 => "EscLk32eamDdueoS19WroJZ7NP9fJNeZ7MTZHVBavbJJ", // 2025-04-13 13:35:32 + 965000 => "GAcupX77Bh82YbXqQZi2PSd2Yj8rrSekoriGVs3ZJrWa", // 2025-04-17 10:03:52 + 970000 => "ASrHRYyLoqVHxZxvR87gyPM65czPpAcySdWB3bgBdyGp", // 2025-04-21 06:40:39 + 975000 => "7pggPX6w1AmwVd7L6cLXcuyaTQNno8REJRijaBP58bzE", // 2025-04-25 03:31:58 + 980000 => "C16rzAjghYuQ3TWnmGSFzyJDodC3QWPteoy6BQ3Ea1r1", // 2025-04-28 23:58:41 + 985000 => "6eZgYP8LDPzsoUi7xR7q2LBjw3DKGgNo2YmVqcxJ9oPH", // 2025-05-02 20:53:28 + 990000 => "9AB2Mk9NoARaWsvWWUhMMcUHEPpoLXoXxDNcobm7mfCD", // 2025-05-06 17:05:00 + 995000 => "SGDLZEWGgDP8Ru8gk4ATmdXujo2mHbApmjqaMwkCPhc", // 2025-05-10 13:46:53 + 1000000 => "wPCYpmpbQGoigsWq32kEaJhbDCM6h4bKLJDpdzncGvb", // 2025-05-14 10:25:40 + 1005000 => "8T3TP2aLj2MqBpHfSTFUpaFJpsdSq5xZY5QXSLMSFCy6", // 2025-05-18 06:29:26 + 1010000 => "9GW7yS42dsv6Bid8zhjZeSGpMBLqLpxdg5MjEtyznVLf", // 2025-05-22 03:29:56 + 1015000 => "9dZreCGDwFdas3KC4Aw69NniuYBGGnyDH9SjauALpd4m", // 2025-05-26 00:12:06 + 1020000 => "DHGa1XSFT8gRhnYiwa3bs3SoWhg94PmcPP15RXnLNm4v", // 2025-05-29 20:47:59 + 1025000 => "GPPHqM9KDHMJH3fCjQkUDWU3dn77uxbYS95upGPBBC7N", // 2025-06-02 17:04:29 + 1030000 => "7LokzmGWVVtddiwLNTeiw1d7uxawV8kAdk89GVk8woDs", // 2025-06-06 13:58:10 + 1035000 => "5JWi4VMZ6QojLjeN2iAaFseKXqSUGCm7oYYuycfbPLUx", // 2025-06-10 10:46:11 + 1040000 => "9gNHs4Z9SSXh97HF58cGMszKirNZSQFJNNkTvf32qcbz", // 2025-06-14 06:57:19 + 1045000 => "7vpTD4WbVqzH9RQyKnid7apMKqM3riMqGZmsP6vF4HjU", // 2025-06-18 03:41:38 + 1050000 => "9y8MrKfRuuqRQSNCwFANyxTB6gE1KgZ8mXf7rX5iSUs7", // 2025-06-22 00:20:25 + 1055000 => "7EVcno2ham49gi6oPjNenWeXJrhtJkfZgwAwe8daN4Bx", // 2025-06-25 20:28:29 + 1060000 => "9BQrDUPcyZqah1fKrrToAAxs262Qmjy373gSktHPWKSY", // 2025-06-29 16:55:22 + 1065000 => "DEAmD7PfjJTLaEEuX6CZEBw19XT3YoJD51VBTg3SnqQQ", // 2025-07-03 13:31:12 + 1070000 => "7Vee5fBCeu7WjU8qH4hbFKozytuVEj3QGu87ADupxRUt", // 2025-07-07 10:18:45 + 1075000 => "Ff2FtySDyASqvsCycJ2EPFwaakZuHmfRyxrt1sPQ9FTN", // 2025-07-11 06:27:01 + 1080000 => "4eNxiciWcvY9S8GfqibPGDCmdqYXzjB9ouok36kxZWGw", // 2025-07-15 03:03:24 + 1085000 => "9L3CciPdTd7pibwqgqvkrrqZXPFB5ehaK5HndBuTUMN7", // 2025-07-18 23:36:22 + 1090000 => "3gWmKFvbDNokMYQiSw7woY96LS64FmYxKWdcrcY9NzN3", // 2025-07-22 20:33:05 + 1095000 => "Ciop2JDnhEgcVrfs93k1sAToyCjFTBjt1Qfyn6pkrUqN", // 2025-07-26 16:58:50 + 1100000 => "k2a1NFwTZwWVZwEFg2qg9ZypZRuqfLLE3JwMPSKiDxW", // 2025-07-30 20:58:57 + 1105000 => "EdUoV2LeZJpZqs7FAg7fYBL8PSLm7vhLxZB4M1F7YaJT", // 2025-08-03 17:28:57 + 1110000 => "DKPaHmGP2rPgDZwfnaVHvdP73o9A31Cq2TEHHYjKy2ZC", // 2025-08-07 13:45:16 + 1115000 => "5FktenpNSMQJbHeK9JXejHBGnJMp4ZynwbK5EDFBEzab", // 2025-08-11 10:19:31 + 1120000 => "2FA8Dd3pwHsaGhjSgshEytYxB3dp14Z1sL3eRTbV2DvJ", // 2025-08-15 06:40:41 + 1125000 => "5BqnAgiDxkqZu72C8KNzivMM89UZAdQMqp6jaqEgf1Xd", // 2025-08-19 03:17:25 + 1130000 => "54KTbyPFfK48s7N2UkChdgvZmeAQQkjz1BhFXRLcdD2R", // 2025-08-22 23:38:30 + 1135000 => "Byrk7h3Da2ATtLx1HkK3MsBioYWi1GFY1pP3jNc9orWK", // 2025-08-26 20:11:21 + 1140000 => "GMfUSodLy3xinREHG7XgYQUdmY7Vchzrngiwwv8c4gTA", // 2025-08-30 16:54:23 + 1145000 => "HucYsXkZnowZBGY5gDFosV6KxjPQtqqt921bKYDWFJMC", // 2025-09-03 13:35:12 + 1150000 => "AoMek37aDiGMfuvX49CRBFzE1UkKfZFJvCHZ6GUsYsCf", // 2025-09-07 10:12:24 + 1155000 => "3ytuEwEZjjQyaG1mjwTWsHwhfzQpUtyvKsPaLyaphWNp", // 2025-09-11 07:01:46 + 1160000 => "2tXySoZgmm4hp4U8BsftoqYYkGwr1o3RMdjor1nKmT47", // 2025-09-15 03:17:24 + 1165000 => "4zxmQxpdTxQ3yAE78qMKweY3ef9ksd1GnAmCXKXokgzZ", // 2025-09-18 23:35:02 + 1170000 => "GE3Wqnf7XzKXj35d9zFW8ZfhTFeKvH4RQkzKQKpPaycG", // 2025-09-22 20:20:24 + 1175000 => "4rGeqnud7hs3MdcQWv9iYnHdJt2G6SQvvn9kh6GtwCPL", // 2025-09-26 16:54:27 + 1180000 => "CA1Lmxr77GXzu6VM9mgatfosanN1yADDBBtrijGeCvse", // 2025-09-30 13:34:42 + 1185000 => "5ujJpqgfEHRffNimk8Fyc2aarJkNWEnyuHMiBbFAx3Pz", // 2025-10-04 09:42:44 + 1190000 => "D12fqZqzf2fjKgosbNr2k7ZgnL7oHytPavEVaipqnBCZ", // 2025-10-08 06:42:17 + 1195000 => "EcX83v4B1MM4Ry533ZE5KFupxjzXWP1Ah51bzofkzKbH", // 2025-10-12 03:33:45 + 1200000 => "7cx13d5ciQGCGmcq6pLSMEGvXpC7njxGsSCbRoMNAg13", // 2025-10-16 00:09:32 + 1205000 => "FBgPCfj98EndJa6dyHvA9rccoG9m5t3Q5Jk3eV7gN3Zv", // 2025-10-19 20:40:56 + 1210000 => "KeSHZfka5Sq19bcbTadTs3Hw8AFYzyJrexdg3fy85B1", // 2025-10-23 17:23:30 + 1215000 => "2KMg4H12ahENAYpsvHN7yruWFGQiN4Y1S43LAorBv5CN", // 2025-10-27 13:38:32 + 1220000 => "CcqmZEYoqZxMg7Q2HpEqaaZHJu7WM1J2F8uwQMEz1S19", // 2025-10-31 09:59:03 + 1225000 => "7yQtC3bYDaPekSt32s27DRdK69QXLA5ML4MrjAJuf4pg", // 2025-11-04 06:44:17 + 1230000 => "hBPbFYWduzUDWmxA6ySJho89KUaZn3jnDzLEFKSJARi", // 2025-11-08 03:24:40 + 1235000 => "DHSMSkEguPPiEyEf3iUf8iiTm4JcZkGbFcnpreo75195", // 2025-11-12 00:01:34 + 1240000 => "5Ce4DNzZAuAcFR1ayiPcvWgomcsX4g3j3KsvzwYVwh98", // 2025-11-15 21:07:57 +]; diff --git a/include/checkpoints.01.php b/include/checkpoints.01.php new file mode 100644 index 00000000..fe63bd1b --- /dev/null +++ b/include/checkpoints.01.php @@ -0,0 +1,44 @@ + "9aeKHauMRjJC6GzXvjWpYfYcEA4vaFQLxDWitpVDReMQ", + 100000 => "CdZWtDjL1gR8Trmr7AmZzr6NvWaL4YqU7fvMBi5aDvig", + 200000 => "5SmJjMLujd1eMupCxjPW7pfWaSvEpA78ucyytG7NZWSX", + 300000 => "AuEMBrteJwXDj7aQvGGGZwV4m9w9ZRsYUfVBvfv1rhVk", + 400000 => "8huPL5RfSRTJPE1TUbnnf6jGnodSrkPSu34mebsz9hKr", + 500000 => "6Zc6pnn3bxstSBpV5Lr1dmwuTio3o76mLgCezpbmqHza", + 510000 => "HLwuPjxbbrhKkuwm5qWwv27Eu4npyxgBDvtAYCF1ZgAp", + 520000 => "6dYENVA64uVfv932RpvDtyjyzwfFK7U9DyxNQUtQ3ec7", + 530000 => "57QRa2m3peKmvbutPLGSfHXySX1tnzouMJJii6UKDH4X", + 540000 => "8xV48JMZm6MU4qpYHq77WFGAUZNVpiZdxNcLNHqsLGNZ", + 550000 => "41PG7tfGRCCSHwMoE5pkiNqn5nF4PXX1wYAuqap8MWBk", + 560000 => "7mY7Gnx1eksLKE6FngSarjqpDQEta9o8uYqTwgB9VmjY", + 561000 => "Gm1ZQU7qjwiZWX7q5QHZMkA5SPXuY9coeJeZVb5XjTsn", + 562000 => "KMCes9LK16fcnmBtKufssYRSuMm9vFhSp1xGqsoUFrn", + 563000 => "6EatKBVRkyqTu2cqJHJBcy3aYPdPHE5iEFCFxdzhZdpA", + 564000 => "25kLGoY4xd6o72DKTXA77wmdZYAto1pcTk1rw2pK7EQm", + 564811 => "BpaUVoE7degr96VWhPYwKciTPt6bAFJ1ymcNpjp4Dxkr", + 565000 => "FE1sfL3r6YN5z5nHpUimFpobiZ8jGRfykN6fmtCTehy5", + 566000 => "4RBYtqeYDoafzjKaNv3Am8Byrka89xeVVHNdvkHLj9vB", + 567000 => "8XCsgmRnWF2uYSiGLaB8zE1k8NvXwQ3bJXBufH7SFsS6", + 568000 => "XiwvDKLh86NAng7eFKa3bWyyKnb9aqtX9MwtmrNYdNj", + 569000 => "5q3SYXWUxjmyJ5JK15dzBt5VKCyxuS6G1ECKPx9Hqdvd", + 570000 => "G9hKpwDtcbHfoFLJQZNN1AV6MZ91jeaXguToYfsSpzE4", + 571000 => "WGViLLXUjo9KEm8mRSAQpcopezW7G7azGYD22zsBEXR", + 572000 => "CM51q2ibqTB4PQHNyMXmUuqYi5ZkfG32QX5p87prgs8e", + 573000 => "841T8wQtQX8zfMy6CLLWHTo3D2YFCswDPBLxYFRJ9iLJ", + 574000 => "Fb8zJMtQbhV7dngp9uWgx6pxvRcqB72jLDMfudun13xm", + 575000 => "3rPDbatdTQkaYEyCaWEm4QvQMezN6zRu5gEXhtqqkSez", + 576000 => "Duyn2CvZRPWaTLCLbuUYkH399nKaQZuqbdirXB51g7pz", + 577000 => "HNWA8k5KdygAaptKDLGPw2cGF1GfSys3NdExpQ5cAKQe", + 578000 => "EGZuDHivPjSweZQv6sYS3s5gVAunt3kAXesdXM1swy4K", + 579000 => "8LhwEj2LocXvdGAaZ5wC54CsCcUwQZoqMPQZWZDppHds", + 580000 => "8husyNntSF3tmXM6DYscqVSh3utn8EPJNaa6qnLbcLA4", + 581000 => "3oDkX8kFv72sDTkkfbsusqcWHZkTNpQRJcfencAowQDT", + 582000 => "DRTgaSrCVAjcF6tPX4DWresXbC4vdxfyHMU2GBCksoiP", + 583000 => "5po2BDHCcTzXQ5D4fK3LzMa1xy3YELgqWcTcngjwdjS8", + 584000 => "7vBBdnVnjWSpyph1TM8jc8eRhkj9DhuF97jnH7Xeps5F", + 585000 => "EzhUQ7d9KWCoqLAkv2ssSwfQvnG1ZwMJvfKjedJZ6mjq", + 586000 => "Ho8HdCje79XgtbmA12PFKMAZ91m3bUZD5GmeGJJo2e4b", + 587000 => "Dm4ZMMogsE6dHX1ThWVAaAxz6XYu9M5yVVAwoD594cj1", + 588000 => "HDZFNBTAgV5PmGymV3fRN2hZDB8feteUHpNGwTLkBeri" +]; diff --git a/include/checkpoints.php b/include/checkpoints.php index 0352172a..63964ddc 100644 --- a/include/checkpoints.php +++ b/include/checkpoints.php @@ -1,260 +1,7 @@ "2ucwGhYszGUTZwmiT5YMsw3tn9nfhdTciaaKMMTX77Zw", // 2023-04-01 12:00:00 - 1000 => "6seZYqyH83Us7NhX3N9TgB8jqgkFrCc9etpQsiUL3coz", // 2023-04-02 06:32:45 - 5000 => "BLLhY8L5kr61jmwjF252qNBuBaL1Sxhz8TurgJ1MZVbR", // 2023-04-05 08:51:32 - 10000 => "5FCNEW8bRgb6pv7YXub755ijSU2DQJ15EqSdd4USMj98", // 2023-04-09 08:02:27 - 15000 => "CmFpsmEew6kCUgwFRPyvbYKGmiXZ4Hd1Gedoa6q98TJV", // 2023-04-13 04:38:58 - 20000 => "3LYBUKS1UFyPnY6ne3vz8zaYAWA36p75jvJzX1LZAJCi", // 2023-04-17 01:17:58 - 25000 => "29oP8cKUKawXvQgfV5prURUPytZt58iFqUug3cQd9ndf", // 2023-04-21 09:51:44 - 30000 => "AyuYpXTxSimipWXw9kaXg5A3Cu9gX7VcoFh5k2HhXMTp", // 2023-04-25 06:36:46 - 35000 => "wnV5doKG5L5do9X7ZK9ceTsEY38n4ktYgdZatpuyM1L", // 2023-04-29 03:35:22 - 40000 => "BBC84NpVjBtcaxdSPjCzHZm1J9XZ8hdoC38kPwLouatj", // 2023-05-03 00:16:23 - 45000 => "8fFgPVrVjWZQNWUkvWB4VUngdS9XFhVUEyZXnQFLaxuR", // 2023-05-06 21:41:47 - 50000 => "2RmopeRpxuFp6VM64v2Czyph7sTL3MXxJcPSGLBod2up", // 2023-05-10 17:54:22 - 55000 => "HXH4ts6j4eiXUHcg7G4KRJDsMgvckxXWzuwfV5FWbFvd", // 2023-05-14 14:40:19 - 60000 => "BHoaS3rkuP5LAJEm29YRhrUvm3edYjT87hhdXSzk9ks5", // 2023-05-18 10:50:49 - 65000 => "2KErUePq6U1Y8PjMzY9bMqS1GVWJzhKZUZjLpy7d9Jo9", // 2023-05-22 07:38:45 - 70000 => "DQbeBLfmtWob728NbrSTQER85mKgReXoENEjpa82r4Tp", // 2023-05-26 04:19:49 - 75000 => "4ZQfMnbzxQwnWpaXP1qzBaBoEwHiGxEHz4GxWPCVdMNx", // 2023-05-30 01:02:00 - 80000 => "NgHvZG4FKAXsmpDJg3xKr4MMFd7QFwZfixgvBMmBwAo", // 2023-06-02 21:31:42 - 85000 => "CEbViLj1VV49uE59JHLH3bMiK8mRQrYNejUHdzmVxbqB", // 2023-06-06 18:20:47 - 90000 => "9krGDi3N5xFWCCisEfG8igN9KgitUXGKhfwkqDZUdL9u", // 2023-06-10 15:39:39 - 95000 => "8MK419JyWhw4LVDm9bKZLmNjJo7FxckdKQszr5GV2BB5", // 2023-06-14 12:17:28 - 100000 => "6HTPwZc1u61FwUiBr779LM2nbDz5PuBFWeJJ3Gj88XQH", // 2023-06-18 09:23:09 - 105000 => "FzfkJLKmFYgoACAfwGScpKwDT5xn2xQiwrTpHCjyjCtL", // 2023-06-22 12:53:07 - 110000 => "co7GUpcXfGhzXB4mA6SEnDG96aZnQvRbrTvoZjvDYK3", // 2023-06-26 10:02:22 - 115000 => "BaRmc2zGGfkkvpdiB5XFn9T1NT5gzjxUb15xhtsecguW", // 2023-06-30 06:55:45 - 120000 => "LGvaKxz7waNciZJmwvnDAbkVdD1tW9UtJUUrkNoosQ5", // 2023-07-04 03:29:19 - 125000 => "zRNyPzprDx3X6VC4VPEtBGwcJcrtdRZMPx1maKMea8g", // 2023-07-07 23:56:57 - 130000 => "8PxbARg5VXuPh3mht9GrjWG5KLofwUjThEqmE1jFFn4c", // 2023-07-11 20:36:01 - 135000 => "HGNCvLHPmjsAa6c6BKTeqBeVD8daMDkpVKcG2T9HqZmT", // 2023-07-15 17:13:59 - 140000 => "4MtFPyDkTKf9FG8oQrkYWdGUS2m1VywaqzATvkZ3v5Rb", // 2023-07-19 13:40:35 - 145000 => "DW2CXDrV7x1xseN6aLf6jqqRgGNAZrZtk8wdDBtPMUmn", // 2023-07-23 10:23:16 - 150000 => "GeLkDJiMAz2qmM1kshykXQ8GMY3uP1C7yWKnxaxNicKX", // 2023-07-27 06:48:31 - 155000 => "DRUmtpY5qLN1AGR4whFFNRG98ntuexsdNt2wE7eMK8rV", // 2023-07-31 03:30:09 - 160000 => "ANhmZm9Rxcfyx8XNrcmtW6TzVz5urSzVakHZ8WsFjqLn", // 2023-08-04 00:15:49 - 165000 => "4M5VaRNxCmN5jmLf4fT4eW93vike4aQ6daYsAqqmDsn6", // 2023-08-07 21:21:44 - 170000 => "FT9Fbj1H2NcHBNiwy3RBRmBj4X7mWfRFvhyzkQtbehyu", // 2023-08-11 17:52:02 - 175000 => "5791qWxYd9sZ4naiEN1Hugi4LUDNr7Z7ecUke9JPyJvc", // 2023-08-15 14:22:24 - 180000 => "AUEp97Miy7ydDv5UW9fdx9Mpu4ZaDjHc2UWHUeMnKBAx", // 2023-08-19 10:34:05 - 185000 => "9M4tR8Ns9h3BTL63nefqRC4p7iaRNVedBJRdFeTHvFC1", // 2023-08-23 07:56:55 - 190000 => "CsF4UAXs3QJjhGfwF72sPuRPC9fbPP8zjLNRFEaV5ARC", // 2023-08-27 04:47:29 - 195000 => "EufiD5sSvcT8snK4UfRJQQGZSTLykSaafxy52NX5YusQ", // 2023-08-31 01:55:08 - 200000 => "4DLgryKvXKFhCNhdu3MEHya683sQ38sXnfRPGa6QBE2K", // 2023-09-03 23:12:58 - 205000 => "GpEwQMBybTXo8MDUacT5HQNdfLVx2nnx5jiQiPw54D2o", // 2023-09-07 19:52:22 - 210000 => "F4SZsmwdeff6NzeVRxVM7kUnUdqqgyAyopn6jGe5gmt3", // 2023-09-11 16:20:12 - 215000 => "APn8nnKJgpYzhEx42k6w5Zmb7H8j1EfA5M9vfhdWhDqd", // 2023-09-15 13:28:51 - 220000 => "CKDvEWgBxfE6ex8XQvVEmy5vQGVTfq13ANx5cZzzALoD", // 2023-09-19 10:14:19 - 225000 => "8U3ArGTHSsX7hPYtvpYLeGtQGHxWi78LShjSC23R9N8", // 2023-09-23 06:59:46 - 230000 => "GS2NEkDe4atZdT7n5Jk8ZT16eEKLNU3VqZS7yWT3KauA", // 2023-09-27 03:31:53 - 235000 => "DKwboNHf48i7JK1skZFoYxwfsRBLbuUYm6c68ZGrcL4C", // 2023-10-01 00:05:31 - 240000 => "6ghugWoXVVkGKo5qFs5LpV5cfvLXvZXruTuwfvZA3PxC", // 2023-10-04 21:06:02 - 245000 => "6GX5cijXxymBBEFiA418uQXd42BkPZ6mVKqiv5CvL4tB", // 2023-10-08 17:23:03 - 250000 => "BfM45EWHKi3vYEjAKh4dzeoV8cud2XKbuoh59Tnfiwu3", // 2023-10-12 14:03:43 - 255000 => "3U4pvPzMEpouVUSBpfNfk5czQ6PqcSQTRj3dnmnwArDz", // 2023-10-16 10:43:28 - 260000 => "GdgKNrEGEDMwudBspHt7rCFN6c3cgfwdEAAqrSkCsBDP", // 2023-10-20 07:47:47 - 265000 => "3ySM9bkqApnTzAKcVDeZdsAxShJBmsdjQtd3XgBwe4nJ", // 2023-10-24 04:08:32 - 270000 => "4FF1dvmzkerDZXZYhJ81jqeSfan135kFDhA3s54ExT3a", // 2023-10-28 00:42:15 - 275000 => "AMx9xv4DVw9tTyDXTx96TDBZoUj4ofuPj5ZqVYqiWVCB", // 2023-10-31 21:42:56 - 280000 => "B88eRpXsDNUv73gWEA5bq3qgG8zWCfs73bSPMPFjspS9", // 2023-11-04 18:26:38 - 285000 => "FWMYy9TzbPXHFJNsZ1Q2gx59VxRJg9g5oJdJEvbYUUsA", // 2023-11-08 15:04:40 - 290000 => "BhDiLZmS1FCRarPMqq51r1xRUTpcKq77u5DWnjgJnUvP", // 2023-11-12 11:17:01 - 295000 => "DbkUHFcrNSRdxi8Ri54M3Fu9LuE8SafbMJqk7JvYAGBv", // 2023-11-16 08:13:58 - 300000 => "3uLtfFanUqVPNkauBgq1sip7xaMMEB57WkooAnsgMtgg", // 2023-11-20 04:55:25 - 305000 => "9ZRML8zq2qqPjwx7qmTC6fnDwqzMNqhD8BoPkkXqSYf3", // 2023-11-24 09:39:26 - 310000 => "AFauVk939Q9SjqRT5kLWPChTxgarbBEgTPNsjjA9ZY7H", // 2023-11-28 06:28:57 - 315000 => "GfwAMvK8pKQ6QmMb5NnZoSCRoNKz8tpAjdXNsk4k9nbT", // 2023-12-02 02:50:33 - 320000 => "ARbDeH4vePdkVfnvj8mVGMS59uBqYyvWLxRRxV4fGFqa", // 2023-12-05 23:38:32 - 325000 => "7hay1mQWakr1kbtKyHRtEXjih8V6eBdCkXVhf1UPDys2", // 2023-12-09 20:20:48 - 330000 => "Nyj5UGDc7aW6EPzWoFSkb8GHjqavLrQ1QX3kekP6RWb", // 2023-12-13 17:00:34 - 335000 => "Gb1h1C6oU2rMZGnW5ZHpHLNHh7CZtpQNZXEh3gBBEQNW", // 2023-12-17 13:50:38 - 340000 => "6K7HjivvG4vEgTZEdegQPcsXvKjXxFPERq972sn3qT6p", // 2023-12-21 10:14:40 - 345000 => "9hqUXCrivX4NCMzGZrMRnaPrFeT3dRJZbi34Vq5QixNF", // 2023-12-25 07:11:20 - 350000 => "972rymKqb6QrpGf8rasCeKxNRhZHffKanSeCwKZh9LVJ", // 2023-12-29 03:54:09 - 355000 => "6biVWUFgZrGedarHTJD8jcf2bgvvW8zrGGBgNB8CVKmg", // 2024-01-02 00:11:22 - 360000 => "EaSvzW5btMXRzxBix26xgJGDrMwe7B4NGtRCivtQDLM8", // 2024-01-05 20:32:55 - 365000 => "CNnq8WKWXqFTyFywCDf7ypTdkDTPfiAxxorhQzuDcJpA", // 2024-01-09 16:47:50 - 370000 => "DDZtWLpjwiWTxq3v3phSAGEBciaczRW3UFfX8vhegF4Z", // 2024-01-13 13:19:30 - 375000 => "6Lq2x9hGPsnetHf2bd7TvYhjYLiHfVNHzGb7bu7rJ6yh", // 2024-01-17 09:51:20 - 380000 => "6k23TJ18HULJNEt7FH9d6xvU8WiAh4jFaukbuvm732oE", // 2024-01-21 06:20:08 - 385000 => "CfAKomeo362KJtgnKSSxGEgRx77SHrqPh4R53mZsr7iz", // 2024-01-25 03:13:09 - 390000 => "CwiEMsRY9oNdi9YpgQtT1GnorBvLv1NibswyQ3WbgufP", // 2024-01-29 00:08:22 - 395000 => "FQh8ysNsxueJ2xinfchiZJaNPizof89zk16fhGzCeb5N", // 2024-02-01 20:22:49 - 400000 => "ALB3X674Vn2Ff6CjM8KV97sYsY7JoRBic8Pzw6gCG4xc", // 2024-02-05 17:35:02 - 405000 => "3b1D2SUnyJQDfx5FqXPxiMs6aLhBCyNqNPk9nySJyHbY", // 2024-02-09 15:44:48 - 410000 => "4aXnVqs5H4d7RAj8dcjgrBmLiz3TSEyAC3h23Mp7HYjb", // 2024-02-13 12:31:49 - 415000 => "agUaqMpBcdV8hvEiAWREqxGdVJYY8jAS9TjHacnamPh", // 2024-02-17 08:52:08 - 420000 => "4Rn4ft5spMzJzYadMMwNFZXt3wz6bpEaTZgrs6EfL8Zj", // 2024-02-21 05:52:23 - 425000 => "7BhLvDTjyTXsDZn6WrLTFNm7daHSSRZ766ENtoaJ74hT", // 2024-02-25 02:24:15 - 430000 => "HumXU8fAiMBs1FFPg5RoHQUJZVG6ZzM5nsCR5JgCjpvv", // 2024-02-28 23:22:52 - 435000 => "DjdTPba5Dx6mLSZQKxd4o7FV2jJCYEthn5MUpZGauB6a", // 2024-03-03 20:27:03 - 440000 => "ALtzy3dz2A4VwmrC2G5zqMFvmH44pi3RUSNAsA3fgye3", // 2024-03-07 17:22:32 - 445000 => "BUP44kokcdKbpa6W9PYFyM21yKR3nZeSPvCkQJ81hk52", // 2024-03-11 14:19:20 - 450000 => "4irSmj8ZWBmxkLiCP8RhcjwmdAUfsJWXyzsEH9FYYyHH", // 2024-03-15 10:39:42 - 455000 => "7jtuqK6zhGSxyBpdxK9F5dEwQQN3ACvyMbHwt2gB75y6", // 2024-03-19 07:17:21 - 460000 => "Fox1HzTNoBJp9kK6GtQtJNUqucyEgYtpC473uPJB5RfQ", // 2024-03-23 03:39:15 - 465000 => "oELF6Kmp6szwum6FraYLPeLwArXRxq3vPWm8JVZjvxk", // 2024-03-27 00:02:32 - 470000 => "JDsLPPwNQBSM7fjMgyf3NzhuzN6vsbfYcT9AvGgv2LB6", // 2024-03-30 20:33:18 - 475000 => "6ty7t8xciD8VCcfk3ffESfDpeQ3RwC6BwEdyVTmuzPGB", // 2024-04-03 17:23:50 - 480000 => "79k6mGhZXwDy3yrnQufcf2K55U9cieLP9HmaGmeD5yKj", // 2024-04-07 14:07:45 - 485000 => "8MQXoNMkECtsTFuzdWMLmyUkWNVvvA5Q6yjFDQjYiEeN", // 2024-04-11 11:10:27 - 490000 => "GVEeZ16FRp9RWaAzeujyvcBbVzjcPD4waL6p4X6pTXwm", // 2024-04-15 07:55:42 - 495000 => "Gz1YfqfRjgWLd7yazmzn4tyBo4JH2SAPYHzLWeGFRdb8", // 2024-04-19 08:41:41 - 500000 => "3vVHbtw9Us6KZFEYR6oGNfE75QqCvdj5SvGACLk15RyQ", // 2024-04-23 05:51:38 - 505000 => "8viVhdLX3mhawrToPQfjE6GqSaKeuHmwEGDHtE66DDwe", // 2024-04-27 03:09:03 - 510000 => "5P9V3Zzr7euU9PbBgvHTEKhvp31ssLEeAWsUsNBRsE1W", // 2024-05-01 00:44:12 - 515000 => "CmaM6t7AA6WcEDJXtSs1C95PeeJy3FDBrE8cATtAeDGW", // 2024-05-04 21:38:51 - 520000 => "HGGchZdb1SPcqsft4nd19VRBaqtxabDnGB7k6NVvXPWb", // 2024-05-08 19:02:49 - 525000 => "HebNxkk64Z9ohdTNUj7k6FByZdricGbKHokzZLtXXPjf", // 2024-05-12 16:37:38 - 530000 => "HaDmHV13nEn5G13hjGN59hvuuZgvZ3Ws3B6bGYkG7fif", // 2024-05-16 13:43:28 - 535000 => "AUyFFULhqPYLvXYSY7t2mUZJ1CEzdpW9Z2snUxZmiV21", // 2024-05-20 10:35:47 - 540000 => "CsMCam3t6pPuZCGp7Rit2cmhV3t5AJym73t8tj7hD5vq", // 2024-05-24 07:59:04 - 545000 => "GAwvfPiFEVdHMS523TiZhvMcwwcZeenoBPDG5Hp11ith", // 2024-05-28 04:51:58 - 550000 => "A8igwUcabWpuxwDKfMLdC1xiFFcyofdAPL9yowozNJT2", // 2024-06-01 01:39:32 - 555000 => "DEPagpp1BawhAr2FhUE9YD8VCU2amNaKwNUv3qpUJcUn", // 2024-06-04 21:59:01 - 560000 => "BEiTrucHxH4LdU1SvHLp9GMy1P4QwUBVqf1iGFJnJRdd", // 2024-06-08 18:45:11 - 565000 => "FbXK5Q8srFGS9DFd8cT3yMvCBAJqB8qqP5W5JxvNHXE4", // 2024-06-12 15:25:43 - 570000 => "DaGBbwBhwEVjFmH3NjFdNwfsw4gdshgJfGMRcfr5AH2P", // 2024-06-16 12:04:17 - 575000 => "3eAWYfEopXoZnFC113kAPB8wuuBad1F7cvv7ewnBKZxL", // 2024-06-20 08:44:55 - 580000 => "9KMxWsSAPk2xzRVfZQumRfSwbTHjvbG1mcrRiMgFEHR5", // 2024-06-24 05:11:22 - 585000 => "9vCjXS1Fr7eXakLtfyYQXHfzAnCa42KnMDQkbnxsgcsd", // 2024-06-28 00:58:31 - 590000 => "5s7Ls8FbDUU5QUgGz24qKKrUsyS2e5pZ9A1NioVdFJRJ", // 2024-07-01 22:30:52 - 595000 => "65rMpGTP2s38SnbAFCz9zBXFL24XZqcTQwgToRGs9rZy", // 2024-07-05 19:16:12 - 600000 => "EYQFah3PKnRsk9BJJkkmSSHiBwAEDfue4tabzYSVVFWJ", // 2024-07-09 15:34:50 - 605000 => "P3fV4hDD2AGX2zerR56iNtoH5QXiFN9kZFFHfRFMbGs", // 2024-07-13 12:04:18 - 610000 => "511Y4Nym2wkZKwohgvpRT1AQk6yHu8QBFDkzNAsYmZEs", // 2024-07-17 08:12:07 - 615000 => "9vhQ6efWFehEBSmxsTdnxpMjKBQCorXtDSjfAK3K9Z4g", // 2024-07-21 04:45:22 - 620000 => "GQqVU8aTjmmjWW3Thepo6oRY5aspSTTYHQjwYWPYPfTv", // 2024-07-25 01:40:37 - 625000 => "6Vho2GcK89SDyjuXAjuA1JTWpNdJRkmzAz7CBHLEFjBx", // 2024-07-29 05:43:36 - 630000 => "7E6KkjZwYCPVsGNpnwN8sHCBn5aJFi6geSF1Bt42JiuP", // 2024-08-02 02:08:35 - 635000 => "3SVhx2YZAHZBvuJbwMQNoeysejykarxVhhkoezoNnrZn", // 2024-08-05 22:46:11 - 640000 => "7z7XMjEksvxnzgEECPfAv28FGno4R6Y3VqtFYgYWuRUm", // 2024-08-09 19:02:26 - 645000 => "4waPt22QUgLkKRFHhxorHN7vxYHy9h3fFMcjB3YJuBUj", // 2024-08-13 17:28:11 - 650000 => "CGLvdFCF6KFbEBTLwzgqBinKqik2Fv4t45UHTKBsSWAm", // 2024-08-17 15:11:30 - 655000 => "DLEoeqzR6iLnBKv5o4sxQ9YM27faULYigcoqK43nJHyx", // 2024-08-21 11:59:08 - 660000 => "B9xkadHFoaYo7suoUzRAerUPBX12zZDynek2rJChmiC4", // 2024-08-25 08:12:50 - 665000 => "4hc8prVQEZEqrwSgjNPkYTb3aSYZ11EJHpRDLUr6BvNQ", // 2024-08-29 04:34:56 - 670000 => "2NZNfZyJADfXhRkckQ65T73mAfuNSiWMpn4pXby1qk6z", // 2024-09-02 01:07:59 - 675000 => "AQKr5ZvYqu9GsYefJLKwfnrf6RcYA4YfEpALBnymQxmg", // 2024-09-05 21:41:51 - 680000 => "HLRUNdykRX34HzRfQj92HjSwvy5ek7wjM442BK7STdfA", // 2024-09-09 17:51:08 - 685000 => "8HDbhgB3oq8iUVD8YvbhTpyTHLQqyEjLyqgmNuSwQHKC", // 2024-09-13 14:41:22 - 690000 => "HU9GESw6NNUWnSsZ1rktNzJWE5AyAcxbvcqf4d5pf2Ev", // 2024-09-17 11:09:57 - 695000 => "Fjmqsy8me1Fdrx8G5xtu7EHQh3ha2PVusT2myiaFDgn9", // 2024-09-21 07:45:24 - 700000 => "2PFJW3iUdHTSMYD45geCs39XChvzAA1pTkf52A5mAaRo", // 2024-09-25 04:47:05 - 705000 => "5ZExFWZw2wXvV8AGnNzGBDeYAUmmMoWzVHG4dXnfadnP", // 2024-09-29 01:11:19 - 710000 => "A1MA62eN86PM1aRezbWP78aivxtydQPjHkgwCvcs26Jb", // 2024-10-02 21:56:10 - 715000 => "3vLcdWpWE1Zz2xVUuGW8XrYwRvCbFNKwf9K8c8RiQfr4", // 2024-10-06 18:32:15 - 720000 => "yXwDNA8SpRmfAwqD2afUk1Ctw1io6MXBKTTcJAtKXaM", // 2024-10-10 15:31:49 - 725000 => "96dDq9y1STC3qFQpLMVDLWQZaBDR85kBEh8VJkQGxhhA", // 2024-10-14 11:57:59 - 730000 => "Fo2pWjacRda2HsqXEbCFGPzbKNGkGYgNqGnm51Q4f5RQ", // 2024-10-18 08:25:07 - 735000 => "86sNYLwURbY5tF3dykg4p8cfcZQmTPNzM9dYH2zZTHdj", // 2024-10-22 04:39:37 - 740000 => "EpVBvTdJkMdbEgbHqnV7T5vVD7UJPuCWQatSwf4Uouuv", // 2024-10-26 00:54:18 - 745000 => "9VzUDCBp6UuVoYiuHciZwwJisyAbrdXwWt13Hgx7UhWL", // 2024-10-29 20:55:20 - 750000 => "97y3wB4hcUzZQCwDxFgWw2jdZY2Spk25eXhQjBsJpbpt", // 2024-11-02 17:21:25 - 755000 => "7MxRvN6o82GypCntw13JnZKHLXCRSDbiJcUEY5qEGKvo", // 2024-11-06 13:44:06 - 760000 => "6JD1oo7kksx4LjdzYx8kEZihTXF1TbtsoXW3vy222QX4", // 2024-11-10 10:00:25 - 765000 => "5b1Fzt5DXE2Kasb8kX7KmCfkLogwDu8bHjjXfi5s2A5f", // 2024-11-14 06:36:29 - 770000 => "AGczsoQ3benuUh15C92PcmUidgrHKyWWD1RC7fTBwn8h", // 2024-11-18 03:34:23 - 775000 => "2PaNHJJpb3wXT1otxcbRyvBbQVo8WbUiCWJkzQgJNC2c", // 2024-11-22 00:00:57 - 780000 => "EMHwUyRBDoNRYRbcznJbJ6SYhni5vzW1SJ2uKgEuQJo7", // 2024-11-25 20:37:43 - 785000 => "8tq7CzqciKcY5UjAzeN9ibgwKYDVysnfBLj3tApmCgWZ", // 2024-11-29 17:15:06 - 790000 => "E4FaUDuUtTo9j7oo8zGQuHCJBzgasZyzGXKRbekCjovf", // 2024-12-03 13:37:26 - 795000 => "D8djZWfxWkBKu8zkvXUayBXBJTGedUpaqesUMYZbRLV6", // 2024-12-07 09:52:22 - 800000 => "9VWSDBKPJeH1Wp7SsxGadi5vPBkJcTq3EQopo9wN77ER", // 2024-12-11 06:19:03 - 805000 => "F4Yg9ypBgCJ4d1Vgz3m4A2mQhzLyt2ReD62xr2zy3MJi", // 2024-12-15 02:40:48 - 810000 => "HiHujKeQSjNCyiZv1PzZTfDFdgWVHYq6wp62JgvB7hap", // 2024-12-18 22:40:21 - 815000 => "6kuAxR773268NcTZawBWQKyELyiEDDxsvkuKbSy4vjuk", // 2024-12-22 18:57:06 - 820000 => "2NMHcW9DjUVedxckf1bspBTkxhu6S6z6VNRAfQM1kW7R", // 2024-12-26 15:42:26 - 825000 => "5gHGADNFmYaLcACcRsCZ1YGvtcZKLRkjo5Q82GGA5uwL", // 2024-12-30 12:17:26 - 830000 => "6ococ6kNtrd8huhQ2TiCsswLD6T8CpEx7D8rz46xMZRY", // 2025-01-03 08:45:37 - 835000 => "9jWHmrQXZJwsq5g44mGBmNq3JYfArDt4m8gbJ1czpfUL", // 2025-01-07 04:54:00 - 840000 => "EkMGQGUnEcyVjEBJAwfGXF9tQcs9pM9pw2NvBZwSk2Ux", // 2025-01-11 01:39:08 - 845000 => "4YhbYPJaR5mRvdzEqTXuCX5sTKcQZz1hR5PCZ76tnzEA", // 2025-01-14 21:44:34 - 850000 => "9iTmUj4epSBNoTsqjac15t6CKdWBPLzBBhC34AWDYuHp", // 2025-01-18 18:04:40 - 855000 => "9ccmphxedz8zP2DDt5n6Y2UZg9HyVfwg1kddfEbnrz3X", // 2025-01-22 14:44:45 - 860000 => "9bKFU8Gdxv1hgz2r8cg3FHhQugjm3t2n2raTpnz1DZet", // 2025-01-26 10:59:38 - 865000 => "ngGDumKcrA1qoPoayr65L1pMRJCqrz7nYgodKRzPqqL", // 2025-01-30 07:00:00 - 870000 => "Bab9TMw3jRrm8QaTicXnRjYNwpzyMcMJ8bCXTzzFYc1W", // 2025-02-03 03:45:14 - 875000 => "AHgZQeKASLdagpt2UwqwNSbBfckAyyAPUEXUfJbs86ZZ", // 2025-02-07 00:28:06 - 880000 => "75FKbxy9SYU3CaWArovbPkAoKKrSxZZvnK1KABVC8cTa", // 2025-02-10 20:22:48 - 885000 => "Gdchg4ah2WwEGQpogoGDesiNuvjqaEpuKGhE7kNKw182", // 2025-02-14 16:56:57 - 890000 => "4MnM6v3TCdLMPTxmcmRt6Shn7MB6bi4EdeT6jQRdZmBT", // 2025-02-18 14:00:02 - 895000 => "ARtx4uWsR3X4TB8sXtgW8KiHakm3gaB5YY96yEF2qVBs", // 2025-02-22 10:42:30 - 900000 => "6xB4acpP9wH67UbQPetLMJuwie9GPaN74W2MMdEPqy2e", // 2025-02-26 07:31:50 - 905000 => "AcPAbz3Th1x5p4BmW2aKcP2Hi3S7tYvAgtyxrSRdu3Ta", // 2025-03-02 04:39:32 - 910000 => "4FQkMuJ134cFjsgLXM5ZHX6FRhhced4hB1QQB1UNcnKD", // 2025-03-06 01:12:51 - 915000 => "6613yadgpzt8uXPze7VTojdRNr48hHMFcapY5GUHyGN3", // 2025-03-09 21:23:11 - 920000 => "9roX4cv7yhtmbQHdCgnLzWsnu1pPYMzXH3zDeH4QLsiK", // 2025-03-13 17:53:32 - 925000 => "6xcQaSr2WkezjEHmiFuBRLcScFgQ623NTFmzaRKaJLRy", // 2025-03-17 14:09:38 - 930000 => "6qT9H76bUyxH1yX4xQqNkwqxzME42PBMk7KmD1Tjyt97", // 2025-03-21 10:21:37 - 935000 => "FPLnvt2aFfZc7rHDEQKxKPhshv4u4EChA4Dzi8UzXXc9", // 2025-03-25 06:58:47 - 940000 => "C9ZgWoTbaUo9RfxcRSB3WzABL5Z2X62r6raQba6oZkTW", // 2025-03-29 03:28:49 - 945000 => "8djUy2s3ErqKoaAZ8tEqYBjTuG6VGwmL4CcPj1AYWhnE", // 2025-04-02 00:05:26 - 950000 => "HyJvaVMGvqYDdqZEqW4Y6Bra8jx9ADwY2MSy7y4ND4s2", // 2025-04-05 20:13:52 - 955000 => "ALxZpH1PYWskBkk5ZH4DveEF9xA8n5cVBV6JQ9vmKj74", // 2025-04-09 17:02:18 - 960000 => "EscLk32eamDdueoS19WroJZ7NP9fJNeZ7MTZHVBavbJJ", // 2025-04-13 13:35:32 - 965000 => "GAcupX77Bh82YbXqQZi2PSd2Yj8rrSekoriGVs3ZJrWa", // 2025-04-17 10:03:52 - 970000 => "ASrHRYyLoqVHxZxvR87gyPM65czPpAcySdWB3bgBdyGp", // 2025-04-21 06:40:39 - 975000 => "7pggPX6w1AmwVd7L6cLXcuyaTQNno8REJRijaBP58bzE", // 2025-04-25 03:31:58 - 980000 => "C16rzAjghYuQ3TWnmGSFzyJDodC3QWPteoy6BQ3Ea1r1", // 2025-04-28 23:58:41 - 985000 => "6eZgYP8LDPzsoUi7xR7q2LBjw3DKGgNo2YmVqcxJ9oPH", // 2025-05-02 20:53:28 - 990000 => "9AB2Mk9NoARaWsvWWUhMMcUHEPpoLXoXxDNcobm7mfCD", // 2025-05-06 17:05:00 - 995000 => "SGDLZEWGgDP8Ru8gk4ATmdXujo2mHbApmjqaMwkCPhc", // 2025-05-10 13:46:53 - 1000000 => "wPCYpmpbQGoigsWq32kEaJhbDCM6h4bKLJDpdzncGvb", // 2025-05-14 10:25:40 - 1005000 => "8T3TP2aLj2MqBpHfSTFUpaFJpsdSq5xZY5QXSLMSFCy6", // 2025-05-18 06:29:26 - 1010000 => "9GW7yS42dsv6Bid8zhjZeSGpMBLqLpxdg5MjEtyznVLf", // 2025-05-22 03:29:56 - 1015000 => "9dZreCGDwFdas3KC4Aw69NniuYBGGnyDH9SjauALpd4m", // 2025-05-26 00:12:06 - 1020000 => "DHGa1XSFT8gRhnYiwa3bs3SoWhg94PmcPP15RXnLNm4v", // 2025-05-29 20:47:59 - 1025000 => "GPPHqM9KDHMJH3fCjQkUDWU3dn77uxbYS95upGPBBC7N", // 2025-06-02 17:04:29 - 1030000 => "7LokzmGWVVtddiwLNTeiw1d7uxawV8kAdk89GVk8woDs", // 2025-06-06 13:58:10 - 1035000 => "5JWi4VMZ6QojLjeN2iAaFseKXqSUGCm7oYYuycfbPLUx", // 2025-06-10 10:46:11 - 1040000 => "9gNHs4Z9SSXh97HF58cGMszKirNZSQFJNNkTvf32qcbz", // 2025-06-14 06:57:19 - 1045000 => "7vpTD4WbVqzH9RQyKnid7apMKqM3riMqGZmsP6vF4HjU", // 2025-06-18 03:41:38 - 1050000 => "9y8MrKfRuuqRQSNCwFANyxTB6gE1KgZ8mXf7rX5iSUs7", // 2025-06-22 00:20:25 - 1055000 => "7EVcno2ham49gi6oPjNenWeXJrhtJkfZgwAwe8daN4Bx", // 2025-06-25 20:28:29 - 1060000 => "9BQrDUPcyZqah1fKrrToAAxs262Qmjy373gSktHPWKSY", // 2025-06-29 16:55:22 - 1065000 => "DEAmD7PfjJTLaEEuX6CZEBw19XT3YoJD51VBTg3SnqQQ", // 2025-07-03 13:31:12 - 1070000 => "7Vee5fBCeu7WjU8qH4hbFKozytuVEj3QGu87ADupxRUt", // 2025-07-07 10:18:45 - 1075000 => "Ff2FtySDyASqvsCycJ2EPFwaakZuHmfRyxrt1sPQ9FTN", // 2025-07-11 06:27:01 - 1080000 => "4eNxiciWcvY9S8GfqibPGDCmdqYXzjB9ouok36kxZWGw", // 2025-07-15 03:03:24 - 1085000 => "9L3CciPdTd7pibwqgqvkrrqZXPFB5ehaK5HndBuTUMN7", // 2025-07-18 23:36:22 - 1090000 => "3gWmKFvbDNokMYQiSw7woY96LS64FmYxKWdcrcY9NzN3", // 2025-07-22 20:33:05 - 1095000 => "Ciop2JDnhEgcVrfs93k1sAToyCjFTBjt1Qfyn6pkrUqN", // 2025-07-26 16:58:50 - 1100000 => "k2a1NFwTZwWVZwEFg2qg9ZypZRuqfLLE3JwMPSKiDxW", // 2025-07-30 20:58:57 - 1105000 => "EdUoV2LeZJpZqs7FAg7fYBL8PSLm7vhLxZB4M1F7YaJT", // 2025-08-03 17:28:57 - 1110000 => "DKPaHmGP2rPgDZwfnaVHvdP73o9A31Cq2TEHHYjKy2ZC", // 2025-08-07 13:45:16 - 1115000 => "5FktenpNSMQJbHeK9JXejHBGnJMp4ZynwbK5EDFBEzab", // 2025-08-11 10:19:31 - 1120000 => "2FA8Dd3pwHsaGhjSgshEytYxB3dp14Z1sL3eRTbV2DvJ", // 2025-08-15 06:40:41 - 1125000 => "5BqnAgiDxkqZu72C8KNzivMM89UZAdQMqp6jaqEgf1Xd", // 2025-08-19 03:17:25 - 1130000 => "54KTbyPFfK48s7N2UkChdgvZmeAQQkjz1BhFXRLcdD2R", // 2025-08-22 23:38:30 - 1135000 => "Byrk7h3Da2ATtLx1HkK3MsBioYWi1GFY1pP3jNc9orWK", // 2025-08-26 20:11:21 - 1140000 => "GMfUSodLy3xinREHG7XgYQUdmY7Vchzrngiwwv8c4gTA", // 2025-08-30 16:54:23 - 1145000 => "HucYsXkZnowZBGY5gDFosV6KxjPQtqqt921bKYDWFJMC", // 2025-09-03 13:35:12 - 1150000 => "AoMek37aDiGMfuvX49CRBFzE1UkKfZFJvCHZ6GUsYsCf", // 2025-09-07 10:12:24 - 1155000 => "3ytuEwEZjjQyaG1mjwTWsHwhfzQpUtyvKsPaLyaphWNp", // 2025-09-11 07:01:46 - 1160000 => "2tXySoZgmm4hp4U8BsftoqYYkGwr1o3RMdjor1nKmT47", // 2025-09-15 03:17:24 - 1165000 => "4zxmQxpdTxQ3yAE78qMKweY3ef9ksd1GnAmCXKXokgzZ", // 2025-09-18 23:35:02 - 1170000 => "GE3Wqnf7XzKXj35d9zFW8ZfhTFeKvH4RQkzKQKpPaycG", // 2025-09-22 20:20:24 - 1175000 => "4rGeqnud7hs3MdcQWv9iYnHdJt2G6SQvvn9kh6GtwCPL", // 2025-09-26 16:54:27 - 1180000 => "CA1Lmxr77GXzu6VM9mgatfosanN1yADDBBtrijGeCvse", // 2025-09-30 13:34:42 - 1185000 => "5ujJpqgfEHRffNimk8Fyc2aarJkNWEnyuHMiBbFAx3Pz", // 2025-10-04 09:42:44 - 1190000 => "D12fqZqzf2fjKgosbNr2k7ZgnL7oHytPavEVaipqnBCZ", // 2025-10-08 06:42:17 - 1195000 => "EcX83v4B1MM4Ry533ZE5KFupxjzXWP1Ah51bzofkzKbH", // 2025-10-12 03:33:45 - 1200000 => "7cx13d5ciQGCGmcq6pLSMEGvXpC7njxGsSCbRoMNAg13", // 2025-10-16 00:09:32 - 1205000 => "FBgPCfj98EndJa6dyHvA9rccoG9m5t3Q5Jk3eV7gN3Zv", // 2025-10-19 20:40:56 - 1210000 => "KeSHZfka5Sq19bcbTadTs3Hw8AFYzyJrexdg3fy85B1", // 2025-10-23 17:23:30 - 1215000 => "2KMg4H12ahENAYpsvHN7yruWFGQiN4Y1S43LAorBv5CN", // 2025-10-27 13:38:32 - 1220000 => "CcqmZEYoqZxMg7Q2HpEqaaZHJu7WM1J2F8uwQMEz1S19", // 2025-10-31 09:59:03 - 1225000 => "7yQtC3bYDaPekSt32s27DRdK69QXLA5ML4MrjAJuf4pg", // 2025-11-04 06:44:17 - 1230000 => "hBPbFYWduzUDWmxA6ySJho89KUaZn3jnDzLEFKSJARi", // 2025-11-08 03:24:40 - 1235000 => "DHSMSkEguPPiEyEf3iUf8iiTm4JcZkGbFcnpreo75195", // 2025-11-12 00:01:34 - 1240000 => "5Ce4DNzZAuAcFR1ayiPcvWgomcsX4g3j3KsvzwYVwh98", // 2025-11-15 21:07:57 -]; +require_once __DIR__ . "/checkpoints.".$chain_id.".php"; diff --git a/include/class/Blockchain.php b/include/class/Blockchain.php index 7f30ffec..06b1ca86 100644 --- a/include/class/Blockchain.php +++ b/include/class/Blockchain.php @@ -184,7 +184,7 @@ static function getStakingMinBalance($height) { if($height >= UPDATE_12_STAKING_DYNAMIC_THRESHOLD) { $collateral = Block::getMasternodeCollateral($height); return 2 * $collateral; - } else if(NETWORK == "testnet" && $height >= UPDATE_11_STAKING_MATURITY_REDUCE) { + } else if(CHAIN_ID == "01" && $height >= UPDATE_11_STAKING_MATURITY_REDUCE) { return 10000; } else { return 100; @@ -192,7 +192,7 @@ static function getStakingMinBalance($height) { } static function getSmartContractCreateFee($height=null) { - if(NETWORK == "testnet") { + if(CHAIN_ID == "01") { return 100; } else { return 1000; diff --git a/include/class/Transaction.php b/include/class/Transaction.php index 291506ec..342809dc 100755 --- a/include/class/Transaction.php +++ b/include/class/Transaction.php @@ -716,7 +716,7 @@ public function check($block, $verify = false, &$error = null) //genesis transaction $mining_end_block = Block::getMnStartHeight(); if($this->publicKey==GENESIS_DATA['public_key'] && $this->type==TX_TYPE_SEND && $height <= $mining_end_block - && NETWORK == "testnet") { + && CHAIN_ID == "01") { throw new Exception("Genesis can not spend before locked height"); } @@ -796,7 +796,7 @@ public function check($block, $verify = false, &$error = null) } $src = Account::getAddress($this->publicKey); if($src==$this->dst) { - if(NETWORK == "testnet") { + if(CHAIN_ID == "01") { if($this->id != "9RyNs6AUnByz4iuWfVAz6mTMCGiPUuqZ6c6nxQZzYEXh") { throw new Exception("{$this->id} - Invalid source address"); } diff --git a/include/coinspec.00.php b/include/coinspec.00.php new file mode 100644 index 00000000..4fa4c062 --- /dev/null +++ b/include/coinspec.00.php @@ -0,0 +1,95 @@ + 2048, "time_cost" => 2, "threads" => 1]; +const REMOTE_PEERS_LIST_URL = "https://main1.phpcoin.net/peers.php"; + +const MIN_NODE_SCORE = 80; + +const FEATURE_MN = true; +const MN_MIN_RUN_BLOCKS = 1440*30; +const MN_START_HEIGHT = 20001; + +const FEE_START_HEIGHT = PHP_INT_MAX; +const FEE_DIVIDER = 100; + +# Smart contracts +const FEATURE_SMART_CONTRACTS = true; +const SC_START_HEIGHT = 1035400; +const TX_TYPE_BURN_START_HEIGHT = 0; +const STAKING_START_HEIGHT = 20001; + +const SC_MAX_EXEC_TIME = 30; +const SC_MEMORY_LIMIT = "256M"; + +const GIT_URL = "https://github.com/phpcoinn/node"; +const UPDATE_1_BLOCK_ZERO_TIME = 0; +const UPDATE_2_BLOCK_CHECK_IMPROVED = 0; +const UPDATE_3_ARGON_HARD = 0; +const UPDATE_4_NO_POOL_MINING = 0; +const UPDATE_5_NO_MASTERNODE = 0; +const UPDATE_6_CHAIN_ID = 0; +const UPDATE_7_MINER_CHAIN_ID = 0; +const UPDATE_8_FIX_CHECK_BURN_TX_DST_NULL = [0, 0]; +const UPDATE_9_ADD_MN_COLLATERAL_TO_SIGNATURE = 0; +const UPDATE_10_ZERO_TX_NOT_ALLOWED = 27000; +const UPDATE_11_STAKING_MATURITY_REDUCE = 290000; +const UPDATE_12_STAKING_DYNAMIC_THRESHOLD = 290000; +const UPDATE_13_LIMIT_GENERATOR=536500; +const UPDATE_14_EXTENDED_SC_HASH=0; +const UPDATE_15_EXTENDED_SC_HASH_V2=0; +const UPDATE_16_SC_TXS_SORT=0; +const UPDATE_17_DEV_MINER_START=PHP_INT_MAX; + +const DEV_PUBLIC_KEY = "PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyao5hHHJd9axKhC1c5emTgT4hT7k7EvXiZrjTJSGEPmz9K1swEDQi8j14vCRwUisMsvHr4P5kirrDawM3NJiknWR"; + +const MAIN_DAPPS_ID = "PeC85pqFgRxmevonG6diUwT4AfF7YUPSm3"; +const TOTAL_INITIAL_SUPPLY = 103200000; + +const STOP_CHAIN_HEIGHT = PHP_INT_MAX; +const DELETE_CHAIN_HEIGHT = PHP_INT_MAX; + +const MN_CREATE_IGNORE_HEIGHT = [30234]; +const MN_COLD_START_HEIGHT = 290000; + +const IGNORE_SC_HASH_HEIGHT = []; +const BLACKLISTED_SMART_CONTRACTS = []; + +const DEV_REWARD_ADDRESS = "PdEvtfZwNsbddKLCZQcjTgjpdcznS1w3pG"; diff --git a/include/coinspec.01.php b/include/coinspec.01.php new file mode 100644 index 00000000..1c383da6 --- /dev/null +++ b/include/coinspec.01.php @@ -0,0 +1,99 @@ + 2048, "time_cost" => 2, "threads" => 1]; +const REMOTE_PEERS_LIST_URL = "https://node1.phpcoin.net/peers.php"; + +const MIN_NODE_SCORE = 80; + +const FEATURE_MN = true; +const MN_MIN_RUN_BLOCKS = 1440*30; +const MN_START_HEIGHT = 160001; + +const FEE_START_HEIGHT = PHP_INT_MAX; +const FEE_DIVIDER = 100; + +# Smart contracts +const FEATURE_SMART_CONTRACTS = true; +const SC_START_HEIGHT = 1038000; +const TX_TYPE_BURN_START_HEIGHT = 440000; +const STAKING_START_HEIGHT = 500001; + +const SC_MAX_EXEC_TIME = 30; +const SC_MEMORY_LIMIT = "256M"; + +const GIT_URL = "https://github.com/phpcoinn/node"; +const UPDATE_1_BLOCK_ZERO_TIME = 9000; +const UPDATE_2_BLOCK_CHECK_IMPROVED = 25000; +const UPDATE_3_ARGON_HARD = 45000; +const UPDATE_4_NO_POOL_MINING = 45400; +const UPDATE_5_NO_MASTERNODE = 290000; +const UPDATE_6_CHAIN_ID = 460000; +const UPDATE_7_MINER_CHAIN_ID = 480000; +const UPDATE_8_FIX_CHECK_BURN_TX_DST_NULL = [441381, 479168]; +const UPDATE_9_ADD_MN_COLLATERAL_TO_SIGNATURE = 538000; +const UPDATE_10_ZERO_TX_NOT_ALLOWED = 671000; +const UPDATE_11_STAKING_MATURITY_REDUCE = 898000; +const UPDATE_12_STAKING_DYNAMIC_THRESHOLD = 911000; +const UPDATE_13_LIMIT_GENERATOR=1041000; +const UPDATE_14_EXTENDED_SC_HASH=1044500; +const UPDATE_15_EXTENDED_SC_HASH_V2=1117000; +const UPDATE_16_SC_TXS_SORT=1238000; +const UPDATE_17_DEV_MINER_START=1393000; + +const DEV_PUBLIC_KEY = "PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyao5hHHJd9axKhC1c5emTgT4hT7k7EvXiZrjTJSGEPmz9K1swEDQi8j14vCRwUisMsvHr4P5kirrDawM3NJiknWR"; + +const MAIN_DAPPS_ID = "PeC85pqFgRxmevonG6diUwT4AfF7YUPSm3"; +const TOTAL_INITIAL_SUPPLY = 103200000; + +const STOP_CHAIN_HEIGHT = PHP_INT_MAX; +const DELETE_CHAIN_HEIGHT = PHP_INT_MAX; + +const MN_CREATE_IGNORE_HEIGHT = []; +const MN_COLD_START_HEIGHT = 879000; + +const IGNORE_SC_HASH_HEIGHT = [1142688,1099548,1142695]; + +const BLACKLISTED_SMART_CONTRACTS = [ + "Pt6iSKRkWBC37tco1JD2tDJh2WxrKExomU", "PbxqKgxHArNfN8YbXyy8FHdahmcFhfQdEQ", "PZWytEE4FUMstwfWhq4GHe42qstVPVL4AL", + "PptgFV5k3Z43Z9S7Q4t5nXj12QMpDEMirT", "PdiJCJobRuw4uTum4AUC3PFJcvL3qEL79r" +]; + +const DEV_REWARD_ADDRESS = "PdEvtfZwNsbddKLCZQcjTgjpdcznS1w3pG"; diff --git a/include/coinspec.inc.php b/include/coinspec.inc.php index 2a860b89..3ec7d8cb 100644 --- a/include/coinspec.inc.php +++ b/include/coinspec.inc.php @@ -1,101 +1,6 @@ 2048, "time_cost" => 2, "threads" => 1]; -const REMOTE_PEERS_LIST_URL = "https://main1.phpcoin.net/peers.php"; - -const MIN_NODE_SCORE = 80; - -const FEATURE_MN = true; -const MN_MIN_RUN_BLOCKS = 1440*30; -const MN_START_HEIGHT = 20001; - -const FEE_START_HEIGHT = PHP_INT_MAX; -const FEE_DIVIDER = 100; - -# Smart contracts -const FEATURE_SMART_CONTRACTS = true; -const SC_START_HEIGHT = 1035400; -const TX_TYPE_BURN_START_HEIGHT = 0; -const STAKING_START_HEIGHT = 20001; - -const SC_MAX_EXEC_TIME = 30; -const SC_MEMORY_LIMIT = "256M"; - -const GIT_URL = "https://github.com/phpcoinn/node"; -const UPDATE_1_BLOCK_ZERO_TIME = 0; -const UPDATE_2_BLOCK_CHECK_IMPROVED = 0; -const UPDATE_3_ARGON_HARD = 0; -const UPDATE_4_NO_POOL_MINING = 0; -const UPDATE_5_NO_MASTERNODE = 0; -const UPDATE_6_CHAIN_ID = 0; -const UPDATE_7_MINER_CHAIN_ID = 0; -const UPDATE_8_FIX_CHECK_BURN_TX_DST_NULL = [0, 0]; -const UPDATE_9_ADD_MN_COLLATERAL_TO_SIGNATURE = 0; -const UPDATE_10_ZERO_TX_NOT_ALLOWED = 27000; -const UPDATE_11_STAKING_MATURITY_REDUCE = 290000; -const UPDATE_12_STAKING_DYNAMIC_THRESHOLD = 290000; -const UPDATE_13_LIMIT_GENERATOR=536500; -const UPDATE_14_EXTENDED_SC_HASH=0; -const UPDATE_15_EXTENDED_SC_HASH_V2=0; -const UPDATE_16_SC_TXS_SORT=0; -const UPDATE_17_DEV_MINER_START=PHP_INT_MAX; - -const DEV_PUBLIC_KEY = "PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyao5hHHJd9axKhC1c5emTgT4hT7k7EvXiZrjTJSGEPmz9K1swEDQi8j14vCRwUisMsvHr4P5kirrDawM3NJiknWR"; - -const MAIN_DAPPS_ID = "PeC85pqFgRxmevonG6diUwT4AfF7YUPSm3"; -const TOTAL_INITIAL_SUPPLY = 103200000; - -const STOP_CHAIN_HEIGHT = PHP_INT_MAX; -const DELETE_CHAIN_HEIGHT = PHP_INT_MAX; - -const MN_CREATE_IGNORE_HEIGHT = [30234]; -const MN_COLD_START_HEIGHT = 290000; - -const IGNORE_SC_HASH_HEIGHT = []; -const BLACKLISTED_SMART_CONTRACTS = []; - -const DEV_REWARD_ADDRESS = "PdEvtfZwNsbddKLCZQcjTgjpdcznS1w3pG"; \ No newline at end of file +require_once __DIR__ . "/coinspec.".$_config['chain_id'].".php"; diff --git a/include/genesis.00.php b/include/genesis.00.php new file mode 100644 index 00000000..1e924a5f --- /dev/null +++ b/include/genesis.00.php @@ -0,0 +1,13 @@ + 'iKx1CJQ38Fu3W4uvvyWDqscDHK79SSU5sZcVG2Hdg1VVt8R8mJmn8ppQUQjVj74Z89q22Cqmdw5s44JTJiN5v5XPiUmtoDsHhD', + "public_key" => 'PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwV8eomW54A8ffNJhS8h3iq1DpzNaDadZvMBSBp6yqKLuebioGkhPjZCGCe59WCVTMmGAHF1qCXaVzKWmCR7KBNEA', + "argon" => '$argon2i$v=19$m=32768,t=2,p=1$dnN6NVAvUVU5RUt0NzJPQQ$fucz2ipellsRhqbR6g3oAG+wTuzcJi44KsL7D6g1P/A', + "difficulty" => '60000', + "nonce" => '0215d1ec54cab34df311b623e270c7171e4b7023aee65fde46af07ef62eea2fe', + "date" => '1680350400', + "reward_tx" => '{"9YF9wJKWP8cKuGWsaSZEs9QrHF39vzqsbjSG8VuSQwZ8":{"date":1680350400,"dst":"PgngvvRi27gwQrWQQD43Pj6R3cJaABeLTv","fee":"0.00000000","id":"9YF9wJKWP8cKuGWsaSZEs9QrHF39vzqsbjSG8VuSQwZ8","message":"Doc: Roads? Where were going, we dont need roads.","public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwV8eomW54A8ffNJhS8h3iq1DpzNaDadZvMBSBp6yqKLuebioGkhPjZCGCe59WCVTMmGAHF1qCXaVzKWmCR7KBNEA","signature":"AN1rKvtKPNusPgcV21viJdDH7VJ9oX84TgVp2b7dB8qPaxL5pxo5WKaK7ymuEbdS9uJ7cgJdzdxYAkJE4JUkXFt2cbPnC7mFU","src":"PgngvvRi27gwQrWQQD43Pj6R3cJaABeLTv","type":0,"val":"103200000.00000000"}}', + "block" => '2ucwGhYszGUTZwmiT5YMsw3tn9nfhdTciaaKMMTX77Zw', + "address" => 'PgngvvRi27gwQrWQQD43Pj6R3cJaABeLTv', +]; +const GENESIS_TIME = 1680350400; diff --git a/include/genesis.01.php b/include/genesis.01.php new file mode 100644 index 00000000..0801f29b --- /dev/null +++ b/include/genesis.01.php @@ -0,0 +1,11 @@ + 'AN1rKrcHMBADh4ceGUo3hGvoNLFg7kDjJxfYxSgSyCU1JUDefpvFKoycVid53z1SFSX8neNwvRDejYS3Txas2JSvg7wmnpa32', + "public_key" => 'PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwV8eomW54A8ffNJhS8h3iq1DpzNaDadZvMBSBp6yqKLuebioGkhPjZCGCe59WCVTMmGAHF1qCXaVzKWmCR7KBNEA', + "argon" => '$argon2i$v=19$m=2048,t=2,p=1$UGduZ3Z2UmkyN2d3UXJXUQ$KLnWlZm784lkgDlOnrmXhbpwruA+5FLQcdWctEwl62U', + "difficulty" => '60000', + "nonce" => 'ea1a46a97bd1db6fd9503537d67ec9b6c048047fa9536a3df604bf7c0eaac654', + "date" => '1636751245', + "reward_tx" => '{"5KKJEairgawBSAEshhYoxZTuhQbXUBUDEKY4Y2FAuRLz":{"date":1636751245,"dst":"PgngvvRi27gwQrWQQD43Pj6R3cJaABeLTv","fee":"0.00000000","id":"5KKJEairgawBSAEshhYoxZTuhQbXUBUDEKY4Y2FAuRLz","message":"Marty McFly: If you put your mind to it, you can accomplish anything.","public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwV8eomW54A8ffNJhS8h3iq1DpzNaDadZvMBSBp6yqKLuebioGkhPjZCGCe59WCVTMmGAHF1qCXaVzKWmCR7KBNEA","signature":"iKx1CJLcMQBxDTaxH8jPLZKiHM5y17vwvJDs9asLmwy5sUHhq8oZXwNvS35ujH3MKwj9H9g31wP2SCyt8RsTdoXVt2GDAf5t87","src":"PgngvvRi27gwQrWQQD43Pj6R3cJaABeLTv","type":0,"val":"4900010.00000000"}}', +]; +const GENESIS_TIME = 1636751245; diff --git a/include/genesis.inc.php b/include/genesis.inc.php index 7533d3cc..cb022996 100644 --- a/include/genesis.inc.php +++ b/include/genesis.inc.php @@ -1,20 +1,7 @@ 'iKx1CJQ38Fu3W4uvvyWDqscDHK79SSU5sZcVG2Hdg1VVt8R8mJmn8ppQUQjVj74Z89q22Cqmdw5s44JTJiN5v5XPiUmtoDsHhD', - "public_key" => 'PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwV8eomW54A8ffNJhS8h3iq1DpzNaDadZvMBSBp6yqKLuebioGkhPjZCGCe59WCVTMmGAHF1qCXaVzKWmCR7KBNEA', - "argon" => '$argon2i$v=19$m=32768,t=2,p=1$dnN6NVAvUVU5RUt0NzJPQQ$fucz2ipellsRhqbR6g3oAG+wTuzcJi44KsL7D6g1P/A', - "difficulty" => '60000', - "nonce" => '0215d1ec54cab34df311b623e270c7171e4b7023aee65fde46af07ef62eea2fe', - "date" => '1680350400', - "reward_tx" => '{"9YF9wJKWP8cKuGWsaSZEs9QrHF39vzqsbjSG8VuSQwZ8":{"date":1680350400,"dst":"PgngvvRi27gwQrWQQD43Pj6R3cJaABeLTv","fee":"0.00000000","id":"9YF9wJKWP8cKuGWsaSZEs9QrHF39vzqsbjSG8VuSQwZ8","message":"Doc: Roads? Where were going, we dont need roads.","public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwV8eomW54A8ffNJhS8h3iq1DpzNaDadZvMBSBp6yqKLuebioGkhPjZCGCe59WCVTMmGAHF1qCXaVzKWmCR7KBNEA","signature":"AN1rKvtKPNusPgcV21viJdDH7VJ9oX84TgVp2b7dB8qPaxL5pxo5WKaK7ymuEbdS9uJ7cgJdzdxYAkJE4JUkXFt2cbPnC7mFU","src":"PgngvvRi27gwQrWQQD43Pj6R3cJaABeLTv","type":0,"val":"103200000.00000000"}}', - "block" => '2ucwGhYszGUTZwmiT5YMsw3tn9nfhdTciaaKMMTX77Zw', - "address" => 'PgngvvRi27gwQrWQQD43Pj6R3cJaABeLTv', -]; -const GENESIS_TIME = 1680350400; +require_once __DIR__ . "/genesis.".$chain_id.".php"; diff --git a/include/rewards.00.php b/include/rewards.00.php new file mode 100644 index 00000000..d089e467 --- /dev/null +++ b/include/rewards.00.php @@ -0,0 +1,26 @@ +&2 - exit 1 - fi - ;; --help) - echo "Usage: ./install_node.sh [--network ]" - echo "network_name: testnet or mainnet. If not provided, mainnet is used by default." + echo "Usage: ./install_node.sh" exit 0 ;; --docker) @@ -33,15 +22,17 @@ function parse_arguments() { ;; esac done - # Check if network is valid (either mainnet or testnet) - if [[ "$NETWORK" != "mainnet" && "$NETWORK" != "testnet" ]]; then - echo "Error: Invalid network specified. Network should be either 'mainnet' or 'testnet'." >&2 - exit 1 - fi } parse_arguments "$@" # Call the function and pass all arguments +if [ -f "chain_id" ]; then + CHAIN_ID=$(cat chain_id) +else + echo "00" > chain_id + CHAIN_ID="00" +fi + # Rest of your script here servers=("phpcoin.net" "cn.phpcoin.net") @@ -78,15 +69,15 @@ find_best_server() { best_server_result=$best_server } -echo "PHPCoin $NETWORK node Installation" +echo "PHPCoin node Installation for chain_id $CHAIN_ID" echo "===================================================================================================" echo "PHPCoin: define db user and pass" echo "===================================================================================================" export DEBIAN_FRONTEND=noninteractive -export DB_NAME=phpcoin$NETWORK +export DB_NAME=phpcoin_$CHAIN_ID export DB_USER=phpcoin export DB_PASS=phpcoin -export NODE_DIR=/var/www/phpcoin-$NETWORK +export NODE_DIR=/var/www/phpcoin-$CHAIN_ID if [ "$DOCKER" = true ]; then NODE_DIR=/var/www/phpcoin @@ -124,11 +115,7 @@ if [ "$DOCKER" = true ]; then git remote add origin ${git_urls[$best_server_result]} git fetch origin git add . - if [ "$NETWORK" = "mainnet" ]; then - git pull origin main - else - git pull origin test - fi + git pull origin main git restore --staged . fi fi @@ -136,13 +123,7 @@ fi if [ ! -d "$NODE_DIR" ]; then mkdir $NODE_DIR cd $NODE_DIR - if [ "$NETWORK" = "mainnet" ] - then - git clone ${git_urls[$best_server_result]} . - elif [ "$NETWORK" = "testnet" ] - then - git clone ${git_urls[$best_server_result]} --branch test . - fi + git clone ${git_urls[$best_server_result]} . fi @@ -154,7 +135,7 @@ export IP=$(curl -s http://whatismyip.akamai.com/) PORT="" HOSTNAME="" BLOCKCHAIN_SNAPSHOT="" -if [ "$NETWORK" = "mainnet" ] +if [ "$CHAIN_ID" = "00" ] then PORT="80" HOSTNAME="http://$IP" @@ -162,7 +143,7 @@ then HOSTNAME="http://$IP:$EXT_PORT" fi BLOCKCHAIN_SNAPSHOT="blockchain" -elif [ "$NETWORK" = "testnet" ] +elif [ "$CHAIN_ID" = "01" ] then PORT="81" HOSTNAME="http://$IP:$PORT" @@ -170,14 +151,14 @@ then PORT="80" HOSTNAME="http://$IP:$EXT_PORT" fi - BLOCKCHAIN_SNAPSHOT="blockchain-$NETWORK" + BLOCKCHAIN_SNAPSHOT="blockchain-testnet" fi git config core.fileMode false echo "PHPCoin: Configure nginx" echo "===================================================================================================" -cat << EOF > /etc/nginx/sites-available/phpcoin-$NETWORK +cat << EOF > /etc/nginx/sites-available/phpcoin-$CHAIN_ID server { listen $PORT; server_name _; @@ -199,7 +180,7 @@ server { } EOF rm /etc/nginx/sites-enabled/default -ln -sr /etc/nginx/sites-available/phpcoin-$NETWORK /etc/nginx/sites-enabled/phpcoin-$NETWORK +ln -sr /etc/nginx/sites-available/phpcoin-$CHAIN_ID /etc/nginx/sites-enabled/phpcoin-$CHAIN_ID service nginx restart service php8.1-fpm start @@ -207,10 +188,8 @@ echo "PHPCoin: setup config file" echo "===================================================================================================" CONFIG_FILE=config/config.inc.php if [ ! -f "$CONFIGFILE" ]; then - cp config/config-sample.inc.php config/config.inc.php - sed -i "s/ENTER-DB-NAME/$DB_NAME/g" config/config.inc.php - sed -i "s/ENTER-DB-USER/$DB_USER/g" config/config.inc.php - sed -i "s/ENTER-DB-PASS/$DB_PASS/g" config/config.inc.php + echo " config/config.inc.php fi echo "PHPCoin: configure node" echo "===================================================================================================" diff --git a/web/apps/common/include/top.php b/web/apps/common/include/top.php index 35eed8bf..f9998eca 100755 --- a/web/apps/common/include/top.php +++ b/web/apps/common/include/top.php @@ -17,7 +17,7 @@ }); -if(NETWORK == "mainnet") { +if(CHAIN_ID == "00") { $res = file_get_contents("https://main1.phpcoin.net/dapps.php?url=PeC85pqFgRxmevonG6diUwT4AfF7YUPSm3/api.php?q=coinInfo"); $res = json_decode($res, true); $btcPrice = num($res['btcPrice'], 8); diff --git a/web/apps/explorer/address.php b/web/apps/explorer/address.php index 604f11e9..a72993a6 100755 --- a/web/apps/explorer/address.php +++ b/web/apps/explorer/address.php @@ -35,7 +35,7 @@ $addressTypes = Block::getAddressTypes($address); -if(NETWORK == "mainnet") { +if(CHAIN_ID == "00") { $url = "http://".$_SERVER['SERVER_NAME']."/dapps.php?url=PoApBr2zi84BEw2wtseaA2DtysEVCUnJd7/labeler/api.php?q=getAddressLabel&address=$address"; $res = file_get_contents($url); $res = json_decode($res, true); @@ -85,7 +85,7 @@ - + Label From e325eeab2a6234c63671fe99b120f06ac20df06e Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sat, 29 Nov 2025 17:25:07 +0000 Subject: [PATCH 2/4] feat: Multi-network support from a single branch This commit refactors the codebase to support multiple networks (mainnet and testnet) from a single `main` branch. The active network is determined by the contents of a `./chain_id` file. - `main` is now useable for both mainnet and testnet - The source of truth is the `./chain_id` file (`00` for mainnet, `01` for testnet) - New setup for support of multiple databases - Per-chain files for config, checkpoints, rewards, coinspecs, genesis - Refactored how code identifies network, using `CHAIN_ID` instead of `NETWORK` - Updated deploy/install/docker scripts to be driven by the `chain_id` file - Added safe defaults to the system to fall back to mainnet if the `chain_id` file is missing or invalid. --- build/docker/miner/README.md | 40 ++++++++++++----------------------- build/docker/node/Dockerfile | 3 --- build/docker/node/README.md | 26 ++++++++++++----------- include/class/Blockchain.php | 2 +- include/class/PeerRequest.php | 6 ------ include/functions.inc.php | 3 +-- scripts/install_node.sh | 18 +++++++--------- 7 files changed, 38 insertions(+), 60 deletions(-) diff --git a/build/docker/miner/README.md b/build/docker/miner/README.md index a62637bf..c5756353 100644 --- a/build/docker/miner/README.md +++ b/build/docker/miner/README.md @@ -1,30 +1,18 @@ -Docker image for running PHPCoin miner. +# PHPCoin miner on docker -Start with command: -``` -docker run -itd --name phpcoin-miner \ --e NETWORK= \ --e NODE= \ --e ADDRESS=
\ --e CPU= \ --e THREADS= \ -phpcoin/miner -``` - - -Options: - -NETWORK: mainnet(default) or testnet +You can run the phpcoin miner using docker. -NODE: specify mining node or use default network nodes - -ADDRESS: address where mining rewards goes - -CPU: maximum usage of single CPU (default 100%) +-e ADDRESS= \ +-e NODE= \ +-e CPU= \ +-e THREADS= \ +-v /path/to/your/phpcoin/chain_id:/phpcoin/chain_id \ +phpcoin-miner -THREADS: number of CPU threads to use (default all) +Explanation of parameters: -Check miner status -``` -docker logs -f phpcoin-miner -``` +ADDRESS: your address where you will receive the mining reward +NODE: the url of the node where you are mining +CPU: the percent of cpu to be used for mining +THREADS: number of threads to be used for mining +/path/to/your/phpcoin/chain_id: the path to your `chain_id` file. This is used to determine whether to mine on mainnet or testnet. diff --git a/build/docker/node/Dockerfile b/build/docker/node/Dockerfile index 2f25aad7..83e1e919 100755 --- a/build/docker/node/Dockerfile +++ b/build/docker/node/Dockerfile @@ -1,8 +1,5 @@ FROM ubuntu:22.04 -ARG NETWORK=mainnet -ENV NETWORK=$NETWORK - ENV DEBIAN_FRONTEND=noninteractive EXPOSE 80 diff --git a/build/docker/node/README.md b/build/docker/node/README.md index d3b54b51..e10bc7ae 100644 --- a/build/docker/node/README.md +++ b/build/docker/node/README.md @@ -1,16 +1,18 @@ -This is docker image for PHPCoin node (mainnet and testnet). +# PHPCoin node on docker -On first run container will download install script, install node and restore latest blockchain database +You can run your own phpcoin node using docker. -In order to preserve config file with private keys you should create volume and start container with volume: +This will run a full node, with miner enabled, open api, and admin panel. -``` -docker volume create phpcoin-config -docker run -itd --name phpcoin -p 81:80 -e EXT_PORT=81 -v phpcoin-config:/var/www/phpcoin/config phpcoin/node -``` +To run a mainnet node: +docker run -itd --name phpcoin-main -p 80:80 -e EXT_PORT=80 -e CHAIN_ID=00 -v phpcoin-config-main:/var/www/phpcoin/config phpcoin/node -For running testnet node run container with other parameters: -``` -docker volume create phpcoin-config-test -docker run -itd --name phpcoin-test -p 91:80 -e EXT_PORT=91 -e NETWORK=testnet -v phpcoin-config-test:/var/www/phpcoin/config phpcoin/node -``` +To run a testnet node: +docker run -itd --name phpcoin-test -p 91:80 -e EXT_PORT=91 -e CHAIN_ID=01 -v phpcoin-config-test:/var/www/phpcoin/config phpcoin/node + +This will map the config folder to a volume, so you can keep the node configuration. +You can check the node logs by running: +docker logs -f phpcoin-main + +To enter the node shell, run: +docker exec -it phpcoin-main bash diff --git a/include/class/Blockchain.php b/include/class/Blockchain.php index 06b1ca86..f797c437 100644 --- a/include/class/Blockchain.php +++ b/include/class/Blockchain.php @@ -200,7 +200,7 @@ static function getSmartContractCreateFee($height=null) { } static function getSmartContractExecFee($height=null) { - if(NETWORK == "testnet") { + if(CHAIN_ID == "01") { return 0.01; } else { return 1; diff --git a/include/class/PeerRequest.php b/include/class/PeerRequest.php index 8c81e5bf..ea825767 100644 --- a/include/class/PeerRequest.php +++ b/include/class/PeerRequest.php @@ -26,12 +26,6 @@ static function processRequest() { _logf("Invalid coin request=".json_encode($_REQUEST)." server=".json_encode($_SERVER)); api_err("Invalid coin ".json_encode($_REQUEST), 3); } - if(isset($_POST['network'])) { - if($_POST['network'] != NETWORK) { - _logf("Invalid network"); - api_err("Invalid network ".$_POST['network']); - } - } if(isset($_POST['chain_id']) && strlen($_POST['chain_id'])>0) { if($_POST['chain_id'] != CHAIN_ID) { _logf("Invalid chain ID"); diff --git a/include/functions.inc.php b/include/functions.inc.php index 8a34544e..c11e976a 100755 --- a/include/functions.inc.php +++ b/include/functions.inc.php @@ -217,7 +217,6 @@ function peer_post($url, $data = [], $timeout = 30, &$err= null, $info = null, & 'data' => json_encode($data), "coin" => COIN, "version"=>VERSION, - "network"=>NETWORK, "chain_id"=>CHAIN_ID, "requestId" => uniqid(), "info"=>empty($info) ? Peer::getInfo() : $info @@ -285,7 +284,7 @@ function peer_post($url, $data = [], $timeout = 30, &$err= null, $info = null, & $res = json_decode($result, true); // the function will return false if something goes wrong - if (!$res || $res['status'] != "ok" || $res['coin'] != COIN || (isset($res['network']) && $res['network'] != NETWORK && $res['chain_id'] != CHAIN_ID)) { + if (!$res || $res['status'] != "ok" || $res['coin'] != COIN || (isset($res['chain_id']) && $res['chain_id'] != CHAIN_ID)) { _log("Peer response to $url not ok res=".json_encode($result), 5); $err = $res['data']; return false; diff --git a/scripts/install_node.sh b/scripts/install_node.sh index 64f4aa6c..b4d14189 100755 --- a/scripts/install_node.sh +++ b/scripts/install_node.sh @@ -108,16 +108,14 @@ echo "PHPCoin: download node" echo "===================================================================================================" -if [ "$DOCKER" = true ]; then - if [ -d "$NODE_DIR/config" ]; then - cd $NODE_DIR - git init - git remote add origin ${git_urls[$best_server_result]} - git fetch origin - git add . - git pull origin main - git restore --staged . - fi +if [ -d "$NODE_DIR/config" ]; then + cd $NODE_DIR + git init + git remote add origin ${git_urls[$best_server_result]} + git fetch origin + git add . + git pull origin main + git restore --staged . fi if [ ! -d "$NODE_DIR" ]; then From ac756f19b7bf6b8159f5e38726f1d2804eee1ed8 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sat, 29 Nov 2025 18:34:30 +0000 Subject: [PATCH 3/4] feat: Multi-network support from a single branch This commit refactors the codebase to support multiple networks (mainnet and testnet) from a single `main` branch. The active network is determined by the contents of a `./chain_id` file. - `main` is now useable for both mainnet and testnet - The source of truth is the `./chain_id` file (`00` for mainnet, `01` for testnet) - New setup for support of multiple databases - Per-chain files for config, checkpoints, rewards, coinspecs, genesis - Refactored how code identifies network, using `CHAIN_ID` instead of `NETWORK` - Updated deploy/install/docker scripts to be driven by the `chain_id` file - Added safe defaults to the system to fall back to mainnet if the `chain_id` file is missing or invalid. --- ONE_BRANCH_TO_RULE_THEM_ALL.md | 52 ++++++++++++++++++++++++++++++++++ build/docker/miner/README.md | 3 +- scripts/install_node.sh | 7 ++--- 3 files changed, 57 insertions(+), 5 deletions(-) diff --git a/ONE_BRANCH_TO_RULE_THEM_ALL.md b/ONE_BRANCH_TO_RULE_THEM_ALL.md index 403185ba..62d1fd4d 100644 --- a/ONE_BRANCH_TO_RULE_THEM_ALL.md +++ b/ONE_BRANCH_TO_RULE_THEM_ALL.md @@ -12,6 +12,58 @@ This branch refactors the PHPCoin codebase to support multiple networks (mainnet * **Updated scripts:** The `install_node.sh`, `build/docker/miner/start.sh`, and `build/docker/node/docker_start.sh` scripts have been updated to be driven by the `chain_id` file. * **Safe defaults:** The system now safely defaults to mainnet if the `chain_id` file is missing or invalid. +## Updating Existing Installations + +### From `main` (mainnet) + +1. **Move the installation directory:** + ```bash + sudo mv /var/www/phpcoin-mainnet /var/www/phpcoin + ``` +2. **Update the code:** + ```bash + cd /var/www/phpcoin + git pull origin one_branch_to_rule_them_all + ``` +3. **Rename the database:** + ```bash + sudo mysql -e "RENAME DATABASE phpcoin TO phpcoin_00;" + ``` +4. **Create the `chain_id` file:** + ```bash + echo "00" > chain_id + ``` +5. **Re-run the install script to update configurations:** + ```bash + cd ~ + curl -s https://phpcoin.net/scripts/install_node.sh | bash + ``` + +### From `test` (testnet) + +1. **Move the installation directory:** + ```bash + sudo mv /var/www/phpcoin-testnet /var/www/phpcoin + ``` +2. **Update the code:** + ```bash + cd /var/www/phpcoin + git pull origin one_branch_to_rule_them_all + ``` +3. **Rename the database:** + ```bash + sudo mysql -e "RENAME DATABASE phpcoin TO phpcoin_01;" + ``` +4. **Create the `chain_id` file:** + ```bash + echo "01" > chain_id + ``` +5. **Re-run the install script to update configurations:** + ```bash + cd ~ + curl -s https://phpcoin.net/scripts/install_node.sh | bash + ``` + ## What needs to be tested ### 1. Installation diff --git a/build/docker/miner/README.md b/build/docker/miner/README.md index c5756353..2e758d75 100644 --- a/build/docker/miner/README.md +++ b/build/docker/miner/README.md @@ -2,12 +2,13 @@ You can run the phpcoin miner using docker. +docker run -itd --name phpcoin-miner \ -e ADDRESS= \ -e NODE= \ -e CPU= \ -e THREADS= \ -v /path/to/your/phpcoin/chain_id:/phpcoin/chain_id \ -phpcoin-miner +phpcoin/miner Explanation of parameters: diff --git a/scripts/install_node.sh b/scripts/install_node.sh index b4d14189..1a684e5b 100755 --- a/scripts/install_node.sh +++ b/scripts/install_node.sh @@ -77,10 +77,9 @@ export DEBIAN_FRONTEND=noninteractive export DB_NAME=phpcoin_$CHAIN_ID export DB_USER=phpcoin export DB_PASS=phpcoin -export NODE_DIR=/var/www/phpcoin-$CHAIN_ID +export NODE_DIR=/var/www/phpcoin if [ "$DOCKER" = true ]; then - NODE_DIR=/var/www/phpcoin DB_NAME=phpcoin fi @@ -156,7 +155,7 @@ git config core.fileMode false echo "PHPCoin: Configure nginx" echo "===================================================================================================" -cat << EOF > /etc/nginx/sites-available/phpcoin-$CHAIN_ID +cat << EOF > /etc/nginx/sites-available/phpcoin server { listen $PORT; server_name _; @@ -178,7 +177,7 @@ server { } EOF rm /etc/nginx/sites-enabled/default -ln -sr /etc/nginx/sites-available/phpcoin-$CHAIN_ID /etc/nginx/sites-enabled/phpcoin-$CHAIN_ID +ln -sr /etc/nginx/sites-available/phpcoin /etc/nginx/sites-enabled/phpcoin service nginx restart service php8.1-fpm start From 9cc8f406f26f4b249cd444f7a436f9fe2b8cf4ca Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sun, 30 Nov 2025 14:32:13 +0000 Subject: [PATCH 4/4] fix(auto-update): Make auto-updater branch-aware and improve docs Makes the auto-update feature safe for development branches by dynamically detecting the current git branch. The updater will now pull changes for the branch that is currently checked out, preventing it from overwriting a development branch with the default branch from the configuration. This change also completely overhauls the "Updating Existing Installations" section in the `ONE_BRANCH_TO_RULE_THEM_ALL.md` documentation to be safer and more comprehensive. The improvements to the documentation include: - Adding a database backup step using `mysqldump`. - Adding a file backup step for the application directory. - Replacing the insecure `curl | bash` command with instructions to run the local `scripts/install_node.sh` script. - Adding instructions on how to handle the existing `config.inc.php` file. - Improving the overall clarity and safety of the instructions by correcting numbering and typos. --- ONE_BRANCH_TO_RULE_THEM_ALL.md | 62 ++++++++++++++++++++++++++-------- include/class/Util.php | 2 +- 2 files changed, 49 insertions(+), 15 deletions(-) diff --git a/ONE_BRANCH_TO_RULE_THEM_ALL.md b/ONE_BRANCH_TO_RULE_THEM_ALL.md index 62d1fd4d..b5873d20 100644 --- a/ONE_BRANCH_TO_RULE_THEM_ALL.md +++ b/ONE_BRANCH_TO_RULE_THEM_ALL.md @@ -16,52 +16,82 @@ This branch refactors the PHPCoin codebase to support multiple networks (mainnet ### From `main` (mainnet) -1. **Move the installation directory:** +1. **Back up the database:** + ```bash + sudo mysqldump phpcoin > phpcoin_backup.sql + ``` +2. **Back up the application directory:** + ```bash + sudo cp -a /var/www/phpcoin-mainnet /var/www/phpcoin-mainnet.bak + ``` +3. **Move the installation directory:** ```bash sudo mv /var/www/phpcoin-mainnet /var/www/phpcoin ``` -2. **Update the code:** +4. **Update the code:** ```bash cd /var/www/phpcoin git pull origin one_branch_to_rule_them_all ``` -3. **Rename the database:** +5. **Rename the database:** ```bash sudo mysql -e "RENAME DATABASE phpcoin TO phpcoin_00;" ``` -4. **Create the `chain_id` file:** +6. **Create the `chain_id` file:** ```bash echo "00" > chain_id ``` -5. **Re-run the install script to update configurations:** +7. **Handle the configuration file:** ```bash - cd ~ - curl -s https://phpcoin.net/scripts/install_node.sh | bash + cd /var/www/phpcoin + mv config/config.inc.php config/config.inc.php.bak + cp config/config-sample.inc.php config/config.inc.php + ``` + *After this, you will need to manually copy your old settings from `config.inc.php.bak` to the new `config.inc.php`.* +8. **Re-run the install script to update configurations:** + ```bash + cd /var/www/phpcoin + sudo bash scripts/install_node.sh ``` ### From `test` (testnet) -1. **Move the installation directory:** +1. **Back up the database:** + ```bash + sudo mysqldump phpcoin > phpcoin_backup.sql + ``` +2. **Back up the application directory:** + ```bash + sudo cp -a /var/www/phpcoin-testnet /var/www/phpcoin-testnet.bak + ``` +3. **Move the installation directory:** ```bash sudo mv /var/www/phpcoin-testnet /var/www/phpcoin ``` -2. **Update the code:** +4. **Update the code:** ```bash cd /var/www/phpcoin git pull origin one_branch_to_rule_them_all ``` -3. **Rename the database:** +5. **Rename the database:** ```bash sudo mysql -e "RENAME DATABASE phpcoin TO phpcoin_01;" ``` -4. **Create the `chain_id` file:** +6. **Create the `chain_id` file:** ```bash echo "01" > chain_id ``` -5. **Re-run the install script to update configurations:** +7. **Handle the configuration file:** ```bash - cd ~ - curl -s https://phpcoin.net/scripts/install_node.sh | bash + cd /var/www/phpcoin + mv config/config.inc.php config/config.inc.php.bak + cp config/config-sample.inc.php config/config.inc.php + ``` + *After this, you will need to manually copy your old settings from `config.inc.php.bak` to the new `config.inc.php`.* +8. **Re-run the install script to update configurations:** + ```bash + cd /var/www/phpcoin + sudo bash scripts/install_node.sh ``` ## What needs to be tested @@ -102,3 +132,7 @@ This branch refactors the PHPCoin codebase to support multiple networks (mainnet * `include/class/Transaction.php` * `web/apps/common/include/top.php` * `web/apps/explorer/address.php` + +## Auto-update + +The auto-update feature is compatible with the One Branch system. The `chain_id` of the node will be preserved during the auto-update process. The auto-updater is also branch-aware, meaning it will pull updates for the currently checked-out git branch, making it safe to use on development branches. diff --git a/include/class/Util.php b/include/class/Util.php index 20d37deb..382e23dc 100644 --- a/include/class/Util.php +++ b/include/class/Util.php @@ -847,7 +847,7 @@ static function update($argv) { $branch = @trim($argv[2]); $force = @trim($argv[3]); if(empty($branch)) { - $branch = GIT_BRANCH; + $branch = trim(shell_exec("git rev-parse --abbrev-ref HEAD")); } $currentVersion = BUILD_VERSION; echo "Checking node branch=$branch force=$force update current version = ".BUILD_VERSION.PHP_EOL;