diff --git a/.gitignore b/.gitignore index 9fc50df80..f010d3da8 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ src/bitcoin src/test/test_bitcoin src/core +test-*.txt *zcashTest.pk *zcashTest.vk @@ -27,6 +28,7 @@ build-aux/test-driver config.log config.status configure +configure~ libtool src/config/bitcoin-config.h src/config/bitcoin-config.h.in diff --git a/README.md b/README.md index 4a7cfd389..b1a7cbbbf 100644 --- a/README.md +++ b/README.md @@ -150,7 +150,6 @@ cd hush3 The links for the Official Hush explorers: * [explorer.hush.is](https://explorer.hush.is) - * [explorer.hush.land](https://explorer.hush.land) # What is SilentDragon? diff --git a/asmap.dat b/asmap.dat index 03eac1146..1b588bc44 100644 Binary files a/asmap.dat and b/asmap.dat differ diff --git a/configure.ac b/configure.ac index a7be75c61..a97432c65 100644 --- a/configure.ac +++ b/configure.ac @@ -3,12 +3,12 @@ AC_PREREQ([2.60]) define(_CLIENT_VERSION_MAJOR, 3) dnl Must be kept in sync with src/clientversion.h , ugh! define(_CLIENT_VERSION_MINOR, 10) -define(_CLIENT_VERSION_REVISION, 4) +define(_CLIENT_VERSION_REVISION, 5) define(_CLIENT_VERSION_BUILD, 50) define(_ZC_BUILD_VAL, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, m4_incr(_CLIENT_VERSION_BUILD), m4_eval(_CLIENT_VERSION_BUILD < 50), 1, m4_eval(_CLIENT_VERSION_BUILD - 24), m4_eval(_CLIENT_VERSION_BUILD == 50), 1, , m4_eval(_CLIENT_VERSION_BUILD - 50))) define(_CLIENT_VERSION_SUFFIX, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, _CLIENT_VERSION_REVISION-beta$1, m4_eval(_CLIENT_VERSION_BUILD < 50), 1, _CLIENT_VERSION_REVISION-rc$1, m4_eval(_CLIENT_VERSION_BUILD == 50), 1, _CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION-$1))) define(_CLIENT_VERSION_IS_RELEASE, true) -define(_COPYRIGHT_YEAR, 2025) +define(_COPYRIGHT_YEAR, 2026) AC_INIT([Hush],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_SUFFIX(_ZC_BUILD_VAL)],[https://git.hush.is/hush/hush3],[hush]) AC_CONFIG_SRCDIR([src/main.cpp]) AC_CONFIG_HEADERS([src/config/bitcoin-config.h]) @@ -716,7 +716,7 @@ if test x$use_pkgconfig = xyes; then ) else # BUG: Fix this: - echo 'BUG: configure does not yet check for the following dependencies if pkg-config is not on the system: libcrypto++, gmp' + echo 'BUG: configure does not yet check for the following dependencies if pkg-config is not on the system: libcrypto++' AC_CHECK_HEADER([wolfssl/wolfcrypt/sha512.h],,AC_MSG_ERROR(libwolfssl headers missing)) AC_CHECK_LIB([wolfssl], [wc_InitSha512],CRYPTO_LIBS=-lwolfssl, AC_MSG_ERROR(libwolfssl missing)) @@ -732,33 +732,9 @@ else fi fi -# These packages don't provide pkgconfig config files across all -# platforms, so we use older autoconf detection mechanisms: -if test x$TARGET_OS = xdarwin; then -AC_CHECK_HEADER([gmp.h],,AC_MSG_ERROR(libgmp headers missing)) -AC_CHECK_LIB([gmp],[[__gmpn_sub_n]],GMP_LIBS=-lgmp, [AC_MSG_ERROR(libgmp missing)]) - -AC_CHECK_HEADER([gmpxx.h],,AC_MSG_ERROR(libgmpxx headers missing)) -AC_CHECK_LIB([gmpxx],[main],GMPXX_LIBS=-lgmpxx, [AC_MSG_ERROR(libgmpxx missing)]) -fi - -#AC_CHECK_HEADER([gmp.h],,AC_MSG_ERROR(libgmp headers missing)) -#AC_CHECK_LIB([gmp],[[__gmpn_sub_n]],GMP_LIBS=-lgmp, [AC_MSG_ERROR(libgmp missing)]) - -#AC_CHECK_HEADER([gmpxx.h],,AC_MSG_ERROR(libgmpxx headers missing)) -#AC_CHECK_LIB([gmpxx],[main],GMPXX_LIBS=-lgmpxx, [AC_MSG_ERROR(libgmpxx missing)]) - fi -# These packages don't provide pkgconfig config files across all -# platforms, so we use older autoconf detection mechanisms: -AC_CHECK_HEADER([gmp.h],,AC_MSG_ERROR(libgmp headers missing)) -#AC_CHECK_LIB([gmp],[[__gmpn_sub_n]],GMP_LIBS=-lgmp, [AC_MSG_ERROR(libgmp missing)]) - -AC_CHECK_HEADER([gmpxx.h],,AC_MSG_ERROR(libgmpxx headers missing)) -AC_CHECK_LIB([gmpxx],[main],GMPXX_LIBS=-lgmpxx, [AC_MSG_ERROR(libgmpxx missing)]) - RUST_LIBS="-lrustzcash" case $host in *mingw*) @@ -768,12 +744,12 @@ case $host in ;; esac -# Additional Zcash internals flags +# Additional internals flags AX_CHECK_COMPILE_FLAG([-fwrapv],[CXXFLAGS="$CXXFLAGS -fwrapv"]) AX_CHECK_COMPILE_FLAG([-fno-strict-aliasing],[CXXFLAGS="$CXXFLAGS -fno-strict-aliasing"]) AX_CHECK_COMPILE_FLAG([-Wno-builtin-declaration-mismatch],[CXXFLAGS="$CXXFLAGS -Wno-builtin-declaration-mismatch"],,[[$CXXFLAG_WERROR]]) -LIBZCASH_LIBS="-lgmp -lgmpxx $BOOST_SYSTEM_LIB -lwolfssl -lsodium $RUST_LIBS" +LIBZCASH_LIBS="$BOOST_SYSTEM_LIB -lwolfssl -lsodium $RUST_LIBS" AC_MSG_CHECKING([whether to build hushd]) AM_CONDITIONAL([BUILD_BITCOIND], [test x$build_bitcoind = xyes]) @@ -902,8 +878,6 @@ AC_SUBST(CRYPTO_LIBS) AC_SUBST(SSL_LIBS) AC_SUBST(EVENT_LIBS) AC_SUBST(EVENT_PTHREADS_LIBS) -AC_SUBST(GMP_LIBS) -AC_SUBST(GMPXX_LIBS) AC_SUBST(LIBZCASH_LIBS) AC_CONFIG_FILES([Makefile src/Makefile doc/man/Makefile src/test/buildenv.py]) AC_CONFIG_FILES([qa/pull-tester/run-bitcoind-for-test.sh],[chmod +x qa/pull-tester/run-bitcoind-for-test.sh]) diff --git a/contrib/asmap/README.md b/contrib/asmap/README.md index cbb6f7526..a12dcaa8e 100644 --- a/contrib/asmap/README.md +++ b/contrib/asmap/README.md @@ -2,5 +2,6 @@ Files relating to -asmap=... feature, to use ASNs -From https://github.com/asmap/asmap-data/blob/main/1730210400_asmap.dat -[Upstream Commit dcce69e48211facdbd52a461cfce333d5800b7de](https://github.com/asmap/asmap-data/commit/dcce69e48211facdbd52a461cfce333d5800b7de) +From https://github.com/asmap/asmap-data/blob/main/2025/1764864000_asmap_unfilled.dat +[Upstream Merge Request #38](https://github.com/asmap/asmap-data/pull/38) +[Upstream Commit 17f2e06cf62df7c4455492692b92cfb685d1d7f7](https://github.com/asmap/asmap-data/commit/17f2e06cf62df7c4455492692b92cfb685d1d7f7) diff --git a/contrib/asmap/asmap.dat b/contrib/asmap/asmap.dat index 03eac1146..1b588bc44 100644 Binary files a/contrib/asmap/asmap.dat and b/contrib/asmap/asmap.dat differ diff --git a/contrib/block_time.pl b/contrib/block_time.pl index 2fc9299fb..57cedb061 100755 --- a/contrib/block_time.pl +++ b/contrib/block_time.pl @@ -26,13 +26,9 @@ if ($block <= $blockcount) { die "That block has already happened!"; } else { my $diff = $block - $blockcount; - my $minpb = 1.25; # 75s in minutes for HUSH3 - if ($coin eq 'DRAGONX') { - $minpb = 0.6; # minutes per block - } elsif ($coin) { - # TODO: support custom blocktimes - $minpb = 1; # assumes default blocktime of 60s - } + # TODO: support custom blocktimes + # assumes HACs use default blocktime of 60s + my $minpb = $coin ? 1 : 1.25; # 75s in minutes for HUSH3 my $minutes = $diff*$minpb; my $seconds = $minutes*60; my $now = time; diff --git a/contrib/debian/changelog b/contrib/debian/changelog index 421d39379..0afb9c9d7 100644 --- a/contrib/debian/changelog +++ b/contrib/debian/changelog @@ -1,3 +1,48 @@ +hush (3.10.5) stable; urgency=medium + + * DragonX is no longer supported by this codebase + * DragonX devs have forked our code and we wish them the best + * Find the latest place to download a DragonX full node via dragonx.is + * Concurrent `z_sendmany` now works + * A longstanding bug relating to run multiple `z_sendmany` operations at + once has been fixed. You can now queue up many `z_sendmany` operations + and they will succeed because they now understand how to avoid spending + coins that another `z_sendmany` process is trying to spend. + * Updated Autonomous System Map (asmap) + * New RPC `z_listlockunspent` + * Lists shielded notes (coins inside a zaddr) which are temporarily unspendable because an RPC process is currently trying to spend them. + * If that operation succeeds, they will become spent. If it fails they will be unlocked and become spendable again. + * New option to `z_shieldcoinbase` allows privately donating a percentage of coinbase funds during shielding + * This new option defaults to OFF and allows CLI users to opt-in to donating between 0% and 10% of coinbase funds to developers + * No GUI currently utilizes this but that feature is planned for SD + * The donation has extremely good privacy: + * It cannot be determined from public blockchain data if a donation is being made, as it takes the place of a Sietch output + * It cannot be determined from public blockchain data the amount of the donation + * Donations do not create new transactions, do not use additional blockspace and cannot be detected by anyone but the sender or reciever + * New HAC option `ac_clearnet` can be used to disable clearnet networking for an entire blockchain instead of just a single node + * Updated test framework and tests which allowed the fixing of the `z_sendmany` bug above + * Faster compiling of RandomX internals + * GMP dependency removed, as it is no longer needed + * Hush is now compatible with GCC15 and now correctly supports customizing the compiler for a build via the CC env var + * New HTML man pages are now available at doc/man/hushd.html and doc/man/hush-cli.html + +hush (3.10.4) stable; urgency=medium + + * Updated seed node list + * z_sendmany change: Now supports UTF8 strings as memos instead of hex + * New optional z_sendmany 5th argument allows an OP_RETURN for the transaction + * New CLI option -clearnet=0 which disables clearnet networking + * Using -mineraddress with -clearnet=0 disallowed since would reduce privacy + * Add CLI options -disableipv4 and -disableipv6 to disable IPv4 or IPv6 + * New HAC CLI consensus option -ac_minopreturnfee + * Updated ASmap, which maps IP addresses to Autonomous System (AS) numbers + * Added ASmap health check, which logs stats about the ASmap once per 24 hours + * Improved cjdns/i2p/tor docs + * Updated protocol version + * Fixed warnings caused by newer compiler versions + + -- Hush Core Sun, 06 Jul 2025 09:48:13 -0400 + hush (3.10.3) stable; urgency=high * Use WolfSSL 4.8.1 to prevent nodes from getting stuck and when shutting down diff --git a/contrib/debian/control b/contrib/debian/control index 7d1e6e2a2..0402371c0 100644 --- a/contrib/debian/control +++ b/contrib/debian/control @@ -4,8 +4,8 @@ Priority: optional Maintainer: Hush Homepage: https://hush.is Build-Depends: autoconf, automake, bsdmainutils, build-essential, - git, g++-multilib, libc6-dev, libtool, - m4, ncurses-dev, pkg-config, python, + cmake, curl, git, g++-multilib, libc6-dev, libsodium-dev, + libtool, m4, ncurses-dev, pkg-config, python, unzip, wget, zlib1g-dev Vcs-Git: https://git.hush.is/hush/hush3.git Vcs-Browser: https://git.hush.is/hush/hush3 diff --git a/contrib/debian/copyright b/contrib/debian/copyright index 905f248bb..b9fdca286 100644 --- a/contrib/debian/copyright +++ b/contrib/debian/copyright @@ -1,5 +1,5 @@ Files: * -Copyright: 2016-2024, The Hush developers +Copyright: 2016-2026, The Hush developers 2009-2016, Bitcoin Core developers License: GPLv3 Comment: https://hush.is diff --git a/contrib/debian/examples/HUSH3.conf b/contrib/debian/examples/HUSH3.conf index f11e309c1..0d6abda58 100644 --- a/contrib/debian/examples/HUSH3.conf +++ b/contrib/debian/examples/HUSH3.conf @@ -4,10 +4,30 @@ # Run a regression test network #regtest=0 +# Run a test node (which means you can mine with no peers) +#testnode=1 + +#set a custom client name/user agent +#clientName=GoldenSandtrout + +# Rescan from block height +#rescan=123 # Connect via a SOCKS5 proxy #proxy=127.0.0.1:9050 +# Automatically create Tor hidden service +#listenonion=1 + +#Use separate SOCKS5 proxy to reach peers via Tor hidden services +#onion=1.2.3.4:9050 + +# Only connect to nodes in network (ipv4, ipv6, onion or i2p)")); +#onlynet= + +#Tor control port to use if onion listening enabled +#torcontrol=127.0.0.1:9051 + # Bind to given address and always listen on it. Use [host]:port notation for IPv6 #bind= @@ -63,8 +83,9 @@ #rpcbind= # You must set rpcuser and rpcpassword to secure the JSON-RPC api -#rpcuser=Ulysses -#rpcpassword=YourSuperGreatPasswordNumber_DO_NOT_USE_THIS_OR_YOU_WILL_GET_ROBBED_385593 +# These will automatically be created for you +#rpcuser=user +#rpcpassword=supersecretpassword # How many seconds node will wait for a complete RPC HTTP request. # after the HTTP connection is established. @@ -83,7 +104,7 @@ #rpcallowip=2001:db8:85a3:0:0:8a2e:370:7334/96 # Listen for RPC connections on this TCP port: -#rpcport=8232 +#rpcport=1234 # You can use hushd to send commands to hushd # running on another host using this option: @@ -100,8 +121,8 @@ # Miscellaneous options -# Enable attempt to mine HUSH -#gen=0 +# Enable mining at startup +#gen=1 # Set the number of threads to be used for mining (-1 = all cores). #genproclimit=1 @@ -121,7 +142,7 @@ #paytxfee=0.00 #Rewind the chain to specific block height. This is useful for creating snapshots at a given block height. -#rewind=777777 +#rewind=555 #Stop the chain a specific block height. This is useful for creating snapshots at a given block height. #stopat=1000000 @@ -129,9 +150,60 @@ #Set an address to use as change address for all transactions. This value must be set to a 33 byte pubkey. All mined coins will also be sent to this address. #pubkey=027dc7b5cfb5efca96674b45e9fda18df069d040b9fd9ff32c35df56005e330392 -#Forfeit all user rewards to miners. Set this to explicitly not claim user rewards. -#exchange=1 +# Disable clearnet (ipv4 and ipv6) connections to this node +#clearnet=0 -#Donate all user rewards to a a specific address. This value must be set to a 33 byte pubkey. -#donation=027dc7b5cfb5efca96674b45e9fda18df069d040b9fd9ff32c35df56005e330392 +# Disable ipv4 +#disableipv4=1 +# Disable ipv6 +#disableipv6=1 +# Enable transaction index +#txindex=1 +# Enable address index +#addressindex=1 +# Enable timestamp index +#timestampindex=1 +# Enable spent index +#spentindex=1 + +# Enable shielded stats index +#zindex=1 + +# Attempt to salvage a corrupt wallet +# salvagewallet=1 + +# Mine all blocks to this address (not good for your privacy and not recommended!) +# Disallowed if clearnet=0 +# mineraddress=XXX + +# Disable wallet +#disablewallet=1 + +# Allow mining to an address that is not in the current wallet +#minetolocalwallet=0 + +# Delete all wallet transactions +#zapwallettxes=1 + +# Enable sapling consolidation +# consolidation=1 + +# Enable stratum server +# stratum=1 + +# Run a command each time a new block is seen +# %s in command is replaced by block hash +#blocknotify=/my/awesome/script.sh %s + +# Run a command when wallet gets a new tx +# %s in command is replaced with txid +#walletnotify=/my/cool/script.sh %s + +# Run a command when tx expires +# %s in command is replaced with txid +#txexpirynotify=/my/elite/script.sh %s + +# Execute this commend to send a tx +# %s is replaced with tx hex +#txsend=/send/it.sh %s diff --git a/contrib/debian/hush.manpages b/contrib/debian/hush.manpages index 9f2665c3e..6685edb09 100644 --- a/contrib/debian/hush.manpages +++ b/contrib/debian/hush.manpages @@ -1,2 +1,3 @@ DEBIAN/manpages/hush-cli.1 +DEBIAN/manpages/hush-tx.1 DEBIAN/manpages/hushd.1 diff --git a/contrib/sdl_checkpoints.pl b/contrib/sdl_checkpoints.pl index 938aee872..179f6f19b 100755 --- a/contrib/sdl_checkpoints.pl +++ b/contrib/sdl_checkpoints.pl @@ -9,8 +9,8 @@ use warnings; use strict; -# call this script like this to generate checkpoints for a HAC such as DragonX: -# CLI=./src/dragonx-cli ./contrib/sdl_checkpoints.pl ... +# call this script like this to generate checkpoints for another chain: +# CLI=./src/hac-cli ./contrib/sdl_checkpoints.pl ... my $hush = $ENV{CLI} || "./src/hush-cli"; my $gethash = "$hush getblockhash"; diff --git a/depends/Makefile b/depends/Makefile index 05abb94db..bdcafa4ff 100644 --- a/depends/Makefile +++ b/depends/Makefile @@ -5,7 +5,6 @@ BASE_CACHE ?= $(BASEDIR)/built SDK_PATH ?= $(BASEDIR)/SDKs NO_WALLET ?= NO_UPNP ?= -FALLBACK_DOWNLOAD_PATH ?= https://supernet/depends-sources BUILD ?= $(shell ./config.guess) HOST ?= $(BUILD) diff --git a/depends/hosts/linux.mk b/depends/hosts/linux.mk index 3805d2307..4895b1e30 100644 --- a/depends/hosts/linux.mk +++ b/depends/hosts/linux.mk @@ -10,15 +10,15 @@ linux_debug_CXXFLAGS=$(linux_debug_CFLAGS) linux_debug_CPPFLAGS=-D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC ifeq (86,$(findstring 86,$(build_arch))) -i686_linux_CC=gcc -m32 -i686_linux_CXX=g++ -m32 +i686_linux_CC=$(CC) -m32 +i686_linux_CXX=$(CXX) -m32 i686_linux_AR=ar i686_linux_RANLIB=ranlib i686_linux_NM=nm i686_linux_STRIP=strip -x86_64_linux_CC=gcc -m64 -x86_64_linux_CXX=g++ -m64 +x86_64_linux_CC=$(CC) -m64 +x86_64_linux_CXX=$(CXX) -m64 x86_64_linux_AR=ar x86_64_linux_RANLIB=ranlib x86_64_linux_NM=nm diff --git a/depends/packages/bdb.mk b/depends/packages/bdb.mk index 6b8b8e144..08c5793fb 100644 --- a/depends/packages/bdb.mk +++ b/depends/packages/bdb.mk @@ -14,7 +14,8 @@ ifneq ($(build_os),darwin) $(package)_config_opts_darwin=--disable-atomicsupport endif $(package)_config_opts_aarch64=--disable-atomicsupport -$(package)_cxxflags+=-std=c++11 +$(package)_cxxflags+=-std=c++11 -fPIE +$(package)_cflags+=-std=gnu17 -fPIE endef define $(package)_preprocess_cmds diff --git a/depends/packages/libgmp.mk b/depends/packages/libgmp.mk deleted file mode 100644 index 4ec7cde16..000000000 --- a/depends/packages/libgmp.mk +++ /dev/null @@ -1,46 +0,0 @@ -package=libgmp - -ifeq ($(host_os),mingw32) -$(package)_download_path=https://github.com/radix42/$(package)/archive -$(package)_file_name=$(package)-$($(package)_git_commit).tar.gz -$(package)_download_file=$($(package)_git_commit).tar.gz -$(package)_sha256_hash=67df06ed50f288bd7b1ec6907973684fb7cf1196f2cb368b59d423e42b065e40 -$(package)_git_commit=42ba95387cdfd67399f7aac52fddb8d6e1258ee6 -$(package)_dependencies= -$(package)_config_opts=--enable-cxx --disable-shared -else -#else ifeq ($(build_os),darwin) -$(package)_version=6.1.1 -$(package)_download_path=https://git.hush.is/attachments -$(package)_file_name=d613c855-cd92-4efb-b893-658496852019 -$(package)_download_file=d613c855-cd92-4efb-b893-658496852019 -$(package)_sha256_hash=a8109865f2893f1373b0a8ed5ff7429de8db696fc451b1036bd7bdf95bbeffd6 -$(package)_config_opts=--enable-cxx --disable-shared -endif - -#else -#$(package)_version=6.1.1 -#$(package)_download_path=https://ftp.gnu.org/gnu/gmp -#$(package)_file_name=gmp-$($(package)_version).tar.bz2 -#$(package)_sha256_hash=a8109865f2893f1373b0a8ed5ff7429de8db696fc451b1036bd7bdf95bbeffd6 -#$(package)_dependencies= -#$(package)_config_opts=--enable-cxx --disable-shared -#endif - -define $(package)_config_cmds - $($(package)_autoconf) --host=$(host) --build=$(build) -endef - -ifeq ($(build_os),darwin) -define $(package)_build_cmds - $(MAKE) -endef -else -define $(package)_build_cmds - $(MAKE) CPPFLAGS='-fPIC' -endef -endif - -define $(package)_stage_cmds - $(MAKE) DESTDIR=$($(package)_staging_dir) install ; echo '=== staging find for $(package):' ; find $($(package)_staging_dir) -endef diff --git a/depends/packages/libsodium.mk b/depends/packages/libsodium.mk index 2d930c4ae..787abae91 100644 --- a/depends/packages/libsodium.mk +++ b/depends/packages/libsodium.mk @@ -6,6 +6,8 @@ $(package)_download_file=0d9f589e-a9f9-4ddb-acaa-0f1b423b32eb $(package)_sha256_hash=6f504490b342a4f8a4c4a02fc9b866cbef8622d5df4e5452b46be121e46636c1 $(package)_dependencies= $(package)_config_opts= +$(package)_cflags=-std=gnu17 + ifeq ($(build_os),darwin) define $(package)_set_vars $(package)_build_env=MACOSX_DEPLOYMENT_TARGET="10.11" diff --git a/depends/packages/packages.mk b/depends/packages/packages.mk index 8c8cfadc8..c39adbf30 100644 --- a/depends/packages/packages.mk +++ b/depends/packages/packages.mk @@ -1,4 +1,4 @@ -zcash_packages := libgmp libsodium utfcpp +zcash_packages := libsodium utfcpp rust_crates := \ crate_aes \ crate_aesni \ @@ -39,8 +39,8 @@ native_packages := native_ccache wallet_packages=bdb ifeq ($(host_os),linux) - packages := boost wolfssl libevent $(zcash_packages) googletest libcurl #googlemock + packages := boost wolfssl libevent $(zcash_packages) libcurl #googlemock googletest else - packages := boost wolfssl libevent $(zcash_packages) libcurl googletest #googlemock + packages := boost wolfssl libevent $(zcash_packages) libcurl #googlemock googletest endif diff --git a/depends/packages/wolfssl.mk b/depends/packages/wolfssl.mk index 21b95e0ab..0c32d2de2 100644 --- a/depends/packages/wolfssl.mk +++ b/depends/packages/wolfssl.mk @@ -20,6 +20,7 @@ $(package)_download_path=https://github.com/wolfSSL/wolfssl/archive $(package)_download_file=v$($(package)_version)-stable.tar.gz define $(package)_set_vars +$(package)_cflags+=-std=gnu17 $(package)_config_env=AR="$($(package)_ar)" RANLIB="$($(package)_ranlib)" CC="$($(package)_cc)" $(package)_config_opts=--prefix=$(host_prefix) $(package)_config_opts+=--host=$(host) @@ -64,7 +65,7 @@ endef #endef define $(package)_build_cmds - $(MAKE) CPPFLAGS='-fPIC' -j1 src/libwolfssl.la + $(MAKE) CPPFLAGS='-fPIC' -j$(nproc) src/libwolfssl.la endef define $(package)_stage_cmds diff --git a/doc/developer-notes.md b/doc/developer-notes.md index e83a92145..28b112f76 100644 --- a/doc/developer-notes.md +++ b/doc/developer-notes.md @@ -96,7 +96,7 @@ For this repo, it's likely this is the command you need: gdb src/hushd core ``` -NOTE: Even if you are debugging a coredump on a HAC, such as DragonX, the file `src/dragonxd` +NOTE: Even if you are debugging a coredump on a HAC, the file `src/blahd` is just a shell script that calls `src/hushd` and you always want to give an actual executable file as the first argument to `gdb`, not a bash script. diff --git a/doc/man/hush-cli.1 b/doc/man/hush-cli.1 index 8547a839a..3af3968e8 100644 --- a/doc/man/hush-cli.1 +++ b/doc/man/hush-cli.1 @@ -1,9 +1,9 @@ -.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.13. -.TH HUSH-CLI "1" "July 2025" "hush-cli v3.10.4" "User Commands" +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. +.TH HUSH-CLI "1" "March 2026" "hush-cli v3.10.5" "User Commands" .SH NAME -hush-cli \- manual page for hush-cli v3.10.4 +hush-cli \- manual page for hush-cli v3.10.5 .SH DESCRIPTION -Hush RPC client version v3.10.4\-7e63e2f01\-dirty +Hush RPC client version v3.10.5\-04916cdf5 .PP In order to ensure you are adequately protecting your privacy when using Hush, please see . @@ -75,7 +75,7 @@ Read extra arguments from standard input, one per line until EOF/Ctrl\-D In order to ensure you are adequately protecting your privacy when using Hush, please see . -Copyright (C) 2016-2025 Duke Leto and The Hush Developers +Copyright (C) 2016-2026 Duke Leto and The Hush Developers Copyright (C) 2016-2020 jl777 and SuperNET developers diff --git a/doc/man/hush-cli.html b/doc/man/hush-cli.html new file mode 100644 index 000000000..0101fa93a --- /dev/null +++ b/doc/man/hush-cli.html @@ -0,0 +1,296 @@ + + + + + + + + + +HUSH-CLI + + + + +

HUSH-CLI

+ +NAME
+DESCRIPTION
+Usage:
+OPTIONS
+COPYRIGHT
+ +
+ + +

NAME + +

+ + +

hush-cli - +manual page for hush-cli v3.10.4

+ +

DESCRIPTION + +

+ + +

Hush RPC client +version v3.10.4-7e63e2f01-dirty

+ +

In order to +ensure you are adequately protecting your privacy when using +Hush, please see <https://hush.is/security/>.

+ +

Usage: + +

+ + +

hush-cli +[options] <command> [params]

+ +

Send command to Hush

+ +

hush-cli [options] help

+ +

List commands

+ +

hush-cli [options] help +<command>

+ +

Get help for a command

+ +

OPTIONS + +

+ + + + + + + +
+ + +

-?

+
+ +

This help +message

+ + + + + + +
+ + +

-conf=<file>

+
+ +

Specify +configuration file (default: HUSH3.conf)

+ + + + + + +
+ + +

-datadir=<dir>

+
+ +

Specify data +directory (this path cannot use ’˜’)

+ + + + + + +
+ + +

-testnet

+
+ +

Use the test +network

+ + + + + + +
+ + +

-regtest

+
+ +

Enter +regression test mode, which uses a special chain in which +blocks can be solved instantly. This is intended for +regression testing tools and app development.

+ + + + + + +
+ + + +

-rpcconnect=<ip>

+
+ +

Send commands +to node running on <ip> (default: 127.0.0.1)

+ + + + + + +
+ + + +

-rpcport=<port>

+
+ +

Connect to +JSON-RPC on <port> (default: 18030 )

+ + + + + + +
+ + +

-rpcwait

+
+ +

Wait for RPC +server to start

+ + + + + + +
+ + + +

-rpcuser=<user>

+
+ +

Username for +JSON-RPC connections

+ + + + + + +
+ + + +

-rpcpassword=<pw>

+
+ +

Password for +JSON-RPC connections

+ + + + + + +
+ + + +

-rpcclienttimeout=<n>

+
+ +

Timeout in +seconds during HTTP requests, or 0 for no timeout. (default: +900)

+ + + + + + +
+ + +

-stdin

+
+ +

Read extra +arguments from standard input, one per line until EOF/Ctrl-D +(recommended for sensitive information such as +passphrases)

+ +

COPYRIGHT + +

+ + +

In order to +ensure you are adequately protecting your privacy when using +Hush, please see <https://hush.is/security/>.

+ +

Copyright (C) +2016-2025 Duke Leto and The Hush Developers

+ +

Copyright (C) +2016-2020 jl777 and SuperNET developers

+ +

Copyright (C) +2016-2018 The Zcash developers

+ +

Copyright (C) +2009-2014 The Bitcoin Core developers

+ +

This is +experimental Free Software! Fuck Yeah!!!!!

+ +

Distributed +under the GPLv3 software license, see the accompanying file +COPYING or +<https://www.gnu.org/licenses/gpl-3.0.en.html>.

+
+ + diff --git a/doc/man/hush-tx.1 b/doc/man/hush-tx.1 index 939d2deed..156049873 100644 --- a/doc/man/hush-tx.1 +++ b/doc/man/hush-tx.1 @@ -1,9 +1,9 @@ -.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.13. -.TH HUSH-TX "1" "July 2025" "hush-tx v3.10.4" "User Commands" +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. +.TH HUSH-TX "1" "March 2026" "hush-tx v3.10.5" "User Commands" .SH NAME -hush-tx \- manual page for hush-tx v3.10.4 +hush-tx \- manual page for hush-tx v3.10.5 .SH DESCRIPTION -hush\-tx utility version v3.10.4\-7e63e2f01\-dirty +hush\-tx utility version v3.10.5\-04916cdf5 .SS "Usage:" .TP hush\-tx [options] [commands] @@ -89,7 +89,7 @@ Set register NAME to given JSON\-STRING In order to ensure you are adequately protecting your privacy when using Hush, please see . -Copyright (C) 2016-2025 Duke Leto and The Hush Developers +Copyright (C) 2016-2026 Duke Leto and The Hush Developers Copyright (C) 2016-2020 jl777 and SuperNET developers diff --git a/doc/man/hushd.1 b/doc/man/hushd.1 index 4eda8843a..0a89464b3 100644 --- a/doc/man/hushd.1 +++ b/doc/man/hushd.1 @@ -1,9 +1,9 @@ -.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.13. -.TH HUSHD "1" "July 2025" "hushd v3.10.4" "User Commands" +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. +.TH HUSHD "1" "March 2026" "hushd v3.10.5" "User Commands" .SH NAME -hushd \- manual page for hushd v3.10.4 +hushd \- manual page for hushd v3.10.5 .SH DESCRIPTION -Hush Daemon version v3.10.4\-7e63e2f01\-dirty +Hush Daemon version v3.10.5\-04916cdf5 .PP In order to ensure you are adequately protecting your privacy when using Hush, please see . @@ -78,7 +78,7 @@ applied) .HP \fB\-par=\fR .IP -Set the number of script verification threads (\fB\-8\fR to 16, 0 = auto, <0 = +Set the number of script verification threads (\fB\-32\fR to 16, 0 = auto, <0 = leave that many cores free, default: 0) .HP \fB\-pid=\fR @@ -686,6 +686,12 @@ OP_RETURN minimum fee per tx, regardless of tx size, default is 1 coin .IP CODA integration .HP +\fB\-ac_clearnet\fR +.IP +Enable or disable clearnet connections for the entire blockchain. +Setting to 0 will disable clearnet and use sane defaults for +Tor/i2p and require all nodes to do the same (default: 1) +.HP \fB\-ac_decay\fR .IP Percentage of block reward decrease at each halving @@ -759,7 +765,7 @@ Enforce transaction\-rate limit, default 0 In order to ensure you are adequately protecting your privacy when using Hush, please see . -Copyright (C) 2016-2025 Duke Leto and The Hush Developers +Copyright (C) 2016-2026 Duke Leto and The Hush Developers Copyright (C) 2016-2020 jl777 and SuperNET developers diff --git a/doc/man/hushd.html b/doc/man/hushd.html new file mode 100644 index 000000000..0086e76e4 --- /dev/null +++ b/doc/man/hushd.html @@ -0,0 +1,2681 @@ + + + + + + + + + +HUSHD + + + + +

HUSHD

+ +NAME
+DESCRIPTION
+Usage:
+OPTIONS
+COPYRIGHT
+ +
+ + +

NAME + +

+ + +

hushd - manual +page for hushd v3.10.4

+ +

DESCRIPTION + +

+ + +

Hush Daemon +version v3.10.4-7e63e2f01-dirty

+ +

In order to +ensure you are adequately protecting your privacy when using +Hush, please see <https://hush.is/security/>.

+ +

Usage: + +

+ + +

hushd +[options]

+ +

Start a Hush Daemon

+ +

OPTIONS + +

+ + + + + + + +
+ + +

-?

+
+ +

This help +message

+ + + + + + +
+ + + +

-blocknotify=<cmd>

+
+ +

Execute command +when the best block changes (%s in cmd is replaced by block +hash)

+ + + + + + +
+ + + +

-checkblocks=<n>

+
+ +

How many blocks +to check at startup (default: 288, 0 = all)

+ + + + + + +
+ + + +

-checklevel=<n>

+
+ +

How thorough +the block verification of -checkblocks is (0-4, +default: 3)

+ + + + + + +
+ + + +

-clientname=<SomeName>

+
+ +

Full node +client name, default ’GoldenSandtrout’

+ + + + + + +
+ + +

-conf=<file>

+
+ +

Specify +configuration file (default: HUSH3.conf)

+ + + + + + +
+ + +

-daemon

+
+ +

Run in the +background as a daemon and accept commands

+ + + + + + +
+ + +

-datadir=<dir>

+
+ +

Specify data +directory (this path cannot use ’˜’)

+ + + + + + +
+ + + +

-exportdir=<dir>

+
+ +

Specify +directory to be used when exporting data

+ + + + + + +
+ + +

-dbcache=<n>

+
+ +

Set database +cache size in megabytes (4 to 16384, default: 512)

+ + + + + + +
+ + + +

-loadblock=<file>

+
+ +

Imports blocks +from external blk000??.dat file on startup

+ + + + + + +
+ + + +

-maxdebugfilesize=<n>

+
+ +

Set the max +size of the debug.log file (default: 15)

+ + + + + + +
+ + + +

-maxorphantx=<n>

+
+ +

Keep at most +<n> unconnectable transactions in memory (default: +100)

+ + + + + + +
+ + +

-maxreorg=<n>

+
+ +

Specify the +maximum length of a blockchain re-organization

+ + + + + + +
+ + + +

-mempooltxinputlimit=<n>

+
+ + +

[DEPRECATED/IGNORED] +Set the maximum number of transparent inputs in a +transaction that the mempool will accept (default: 0 = no +limit applied)

+ + + + + + +
+ + +

-par=<n>

+
+ +

Set the number +of script verification threads (-8 to 16, 0 = auto, +<0 = leave that many cores free, default: 0)

+ + + + + + +
+ + +

-pid=<file>

+
+ +

Specify pid +file (default: hushd.pid)

+ + + + + + +
+ + + +

-txexpirynotify=<cmd>

+
+ +

Execute command +when transaction expires (%s in cmd is replaced by +transaction id)

+ + + + + + +
+ + +

-prune=<n>

+
+ +

Reduce storage +requirements by pruning (deleting) old blocks. This mode +disables wallet support and is incompatible with +-txindex. Warning: Reverting this setting requires +re-downloading the entire blockchain. (default: 0 = disable +pruning blocks, >550 = target size in MiB to use for +block files)

+ + + + + + +
+ + +

-reindex

+
+ +

Rebuild block +chain index from current blk000??.dat files on startup

+ + + + + + +
+ + +

-sysperms

+
+ +

Create new +files with system default permissions, instead of umask 077 +(only effective with disabled wallet functionality)

+ + + + + + +
+ + +

-txindex

+
+ +

Maintain a full +transaction index, used by the getrawtransaction rpc call +(default: 0)

+ + + + + + +
+ + +

-txsend=<cmd>

+
+ +

Execute command +to send a transaction instead of broadcasting (%s in cmd is +replaced by transaction hex)

+ + + + + + +
+ + +

-addressindex

+
+ +

Maintain a full +address index, used to query for the balance, txids and +unspent outputs for addresses (default: 0)

+ + + + + + +
+ + +

-timestampindex

+
+ +

Maintain a +timestamp index for block hashes, used to query blocks +hashes by a range of timestamps (default: 0)

+ + + + + + +
+ + +

-spentindex

+
+ +

Maintain a full +spent index, used to query the spending txid and input index +for an outpoint (default: 0)

+ + + + + + +
+ + +

-zindex

+
+ +

Maintain extra +statistics about shielded transactions and payments +(default: 0)

+ +

Connection +options:

+ + + + + + +
+ + +

-addnode=<ip>

+
+ +

Add a node to +connect to and attempt to keep the connection open

+ + + + + + +
+ + +

-asmap=<file>

+
+ +

Specify ASN +mapping used for bucketing of the peers (default: +asmap.dat). Relative paths will be prefixed by the +net-specific datadir location.

+ + + + + + +
+ + +

-banscore=<n>

+
+ +

Threshold for +disconnecting misbehaving peers (default: 100)

+ + + + + + +
+ + +

-bantime=<n>

+
+ +

Number of +seconds to keep misbehaving peers from reconnecting +(default: 86400)

+ + + + + + +
+ + +

-bind=<addr>

+
+ +

Bind to given +address and always listen on it. Use [host]:port notation +for IPv6

+ + + + + + +
+ + +

-connect=<ip>

+
+ +

Connect only to +the specified node(s)

+ + + + + + +
+ + +

-discover

+
+ +

Discover own IP +addresses (default: 1 when listening and no +-externalip or -proxy)

+ + + + + + +
+ + +

-dns

+
+ +

Allow DNS +lookups for -addnode, -seednode and +-connect (default: 1)

+ + + + + + +
+ + +

-dnsseed

+
+ +

Query for peer +addresses via DNS lookup, if low on addresses (default: 1 +unless -connect)

+ + + + + + +
+ + + +

-externalip=<ip>

+
+ +

Specify your +own public address

+ + + + + + +
+ + +

-forcednsseed

+
+ +

Always query +for peer addresses via DNS lookup (default: 0)

+ + + + + + +
+ + +

-listen

+
+ +

Accept +connections from outside (default: 1 if no -proxy or +-connect)

+ + + + + + +
+ + +

-listenonion

+
+ +

Automatically +create Tor hidden service (default: 1)

+ + + + + + +
+ + + +

-maxconnections=<n>

+
+ +

Maintain at +most <n> connections to peers (default: 384)

+ + + + + + +
+ + + +

-maxreceivebuffer=<n>

+
+ +

Maximum +per-connection receive buffer, <n>*1000 bytes +(default: 5000)

+ + + + + + +
+ + + +

-maxsendbuffer=<n>

+
+ +

Maximum +per-connection send buffer, <n>*1000 bytes (default: +1000)

+ + + + + + +
+ + + +

-onion=<ip:port>

+
+ +

Use separate +SOCKS5 proxy to reach peers via Tor hidden services +(default: -proxy)

+ + + + + + +
+ + +

-nspv_msg

+
+ +

Enable NSPV +messages processing (default: true when +-ac_private=1, otherwise false)

+ + + + + + +
+ + + +

-i2psam=<ip:port>

+
+ +

I2P SAM proxy +to reach I2P peers and accept I2P connections (default: +none)

+ + + + + + +
+ + +

-i2pacceptincoming

+
+ +

If set and +-i2psam is also set then incoming I2P connections are +accepted via the SAM proxy. If this is not set but +-i2psam is set then only outgoing connections will be +made to the I2P network. Ignored if -i2psam is not +set. Listening for incoming I2P connections is done through +the SAM proxy, not by binding to a local address and port +(default: 1)

+ + + + + + +
+ + +

-onlynet=<net>

+
+ +

Only connect to +nodes in network <net> (ipv4, ipv6, onion or i2p)

+ + + + + + +
+ + +

-disableipv4

+
+ +

Disable Ipv4 +network connections (default: 0)

+ + + + + + +
+ + +

-disableipv6

+
+ +

Disable Ipv6 +network connections (default: 0)

+ + + + + + +
+ + +

-clearnet

+
+ +

Enable clearnet +connections. Setting to 0 will disable clearnet and use sane +defaults for Tor/i2p (default: 1)

+ + + + + + +
+ + +

-permitbaremultisig

+
+ +

Relay non-P2SH +multisig (default: 1)

+ + + + + + +
+ + +

-peerbloomfilters

+
+ +

Support +filtering of blocks and transaction with Bloom filters +(default: 1)

+ + + + + + +
+ + +

-port=<port>

+
+ +

Listen for +connections on <port> (default: 55555 or testnet: +55420)

+ + + + + + +
+ + + +

-proxy=<ip:port>

+
+ +

Connect through +SOCKS5 proxy

+ + + + + + +
+ + +

-proxyrandomize

+
+ +

Randomize +credentials for every proxy connection. This enables Tor +stream isolation (default: 1)

+ + + + + + +
+ + +

-seednode=<ip>

+
+ +

Connect to a +node to retrieve peer addresses, and disconnect

+ + + + + + +
+ + +

-timeout=<n>

+
+ +

Specify +connection timeout in milliseconds (minimum: 1, default: +60000)

+ + + + + + +
+ + + +

-torcontrol=<ip>:<port>

+
+ +

Tor control +port to use if onion listening enabled (default: +127.0.0.1:9051)

+ + + + + + +
+ + + +

-torpassword=<pass>

+
+ +

Tor control +port password (default: empty)

+ + + + + + +
+ + +

-tls=<option>

+
+ +

Specify TLS +usage (default: 1 => enabled and required); Cannot be +turned off.

+ + + + + + +
+ + +

-tlsvalidate=<0 or +1>

+
+ +

Connect to +peers only with valid certificates (default: 0)

+ + + + + + +
+ + + +

-tlskeypath=<path>

+
+ +

Full path to a +private key

+ + + + + + +
+ + + +

-tlskeypwd=<password>

+
+ +

Password for a +private key encryption (default: not set, i.e. private key +will be stored unencrypted)

+ + + + + + +
+ + + +

-tlscertpath=<path>

+
+ +

Full path to a +certificate

+ + + + + + +
+ + + +

-tlstrustdir=<path>

+
+ +

Full path to a +trusted certificates directory

+ + + + + + +
+ + + +

-allowbind=<addr>

+
+ +

Bind to given +address and allowlist peers connecting to it. Use +[host]:port notation for IPv6

+ + + + + + +
+ + + +

-allowlist=<netmask>

+
+ +

Allowlist peers +connecting from the given netmask or IP address. Can be +specified multiple times. Allowlisted peers cannot be DoS +banned and their transactions are always relayed, even if +they are already in the mempool, useful e.g. for a +gateway

+ +

Wallet +options:

+ + + + + + +
+ + +

-disablewallet

+
+ +

Do not load the +wallet and disable wallet RPC calls

+ + + + + + +
+ + +

-keypool=<n>

+
+ +

Set key pool +size to <n> (default: 100)

+ + + + + + +
+ + +

-consolidation

+
+ +

Enable auto +Sapling note consolidation (default: false)

+ + + + + + +
+ + + +

-consolidationinterval

+
+ +

Block interval +between consolidations (default: 25)

+ + + + + + +
+ + + +

-consolidatesaplingaddress=<zaddr>

+
+ +

Specify Sapling +Address to Consolidate. (default: all)

+ + + + + + +
+ + +

-consolidationtxfee

+
+ +

Fee amount in +Puposhis used send consolidation transactions. (default +10000)

+ + + + + + +
+ + +

-zsweep

+
+ +

Enable zaddr +sweeping, automatically move all shielded funds to a one +address once per X blocks

+ + + + + + +
+ + + +

-zsweepaddress=<zaddr>

+
+ +

Specify the +shielded address where swept funds will be sent)

+ + + + + + +
+ + +

-zsweepfee

+
+ +

Fee amount in +puposhis used send sweep transactions. (default 10000)

+ + + + + + +
+ + +

-zsweepinterval

+
+ +

Sweep shielded +funds every X blocks (default 5)

+ + + + + + +
+ + +

-zsweepmaxinputs

+
+ +

Maximum number +of shielded inputs to sweep per transaction (default 8)

+ + + + + + +
+ + +

-zsweepexternal

+
+ +

Enable sweeping +to an external wallet (default false)

+ + + + + + +
+ + +

-zsweepexclude

+
+ +

Addresses to +exclude from sweeping (default none)

+ + + + + + +
+ + +

-deletetx

+
+ +

Enable Old +Transaction Deletion

+ + + + + + +
+ + +

-deleteinterval

+
+ +

Delete +transaction every <n> blocks during inital block +download (default: 1000)

+ + + + + + +
+ + +

-keeptxnum

+
+ +

Keep the last +<n> transactions (default: 200)

+ + + + + + +
+ + +

-keeptxfornblocks

+
+ +

Keep +transactions for at least <n> blocks (default: +10000)

+ + + + + + +
+ + + +

-paytxfee=<amt>

+
+ +

Fee (in +HUSH/kB) to add to transactions you send (default: 0.00)

+ + + + + + +
+ + + +

-keepnotewitnesscache

+
+ +

Keep partial +Sapling Note Witness cache. Must be used with +-rescanheight to find missing cache items.

+ + + + + + +
+ + +

-rescan

+
+ +

Rescan the +block chain for missing wallet transactions on startup

+ + + + + + +
+ + +

-rescanheight

+
+ +

Rescan from +specified height when rescan=1 on startup

+ + + + + + +
+ + +

-salvagewallet

+
+ +

Attempt to +recover private keys from a corrupt wallet.dat on +startup

+ + + + + + +
+ + + +

-sendfreetransactions

+
+ +

Send +transactions as zero-fee transactions if possible (default: +0)

+ + + + + + +
+ + +

-spendzeroconfchange

+
+ +

Spend +unconfirmed change when sending transactions (default: +1)

+ + + + + + +
+ + + +

-txconfirmtarget=<n>

+
+ +

If paytxfee is +not set, include enough fee so transactions begin +confirmation on average within n blocks (default: 2)

+ + + + + + +
+ + +

-txexpirydelta

+
+ +

Set the number +of blocks after which a transaction that has not been mined +will become invalid (default: 200)

+ + + + + + +
+ + + +

-maxtxfee=<amt>

+
+ +

Maximum total +fees (in HUSH) to use in a single wallet transaction; +setting this too low may abort large transactions (default: +0.10)

+ + + + + + +
+ + +

-upgradewallet

+
+ +

Upgrade wallet +to latest format on startup

+ + + + + + +
+ + +

-wallet=<file>

+
+ +

Specify wallet +file absolute path or a path relative to the data directory +(default: wallet.dat)

+ + + + + + +
+ + +

-walletbroadcast

+
+ +

Make the wallet +broadcast transactions (default: 1)

+ + + + + + +
+ + + +

-walletnotify=<cmd>

+
+ +

Execute command +when a wallet transaction changes (%s in cmd is replaced by +TxID)

+ + + + + + +
+ + + +

-allowlistaddress=<Raddress>

+
+ +

Enable the +wallet filter for notary nodes and add one Raddress to the +allowlist of the wallet filter. If -allowlistaddress= +is used, then the wallet filter is automatically activated. +Several Raddresses can be defined using several +-allowlistaddress= (similar to -addnode). The +wallet filter will filter the utxo to only ones coming from +my own Raddress (derived from pubkey) and each Raddress +defined using -allowlistaddress= this option is +mostly for Notary Nodes).

+ + + + + + +
+ + + +

-zapwallettxes=<mode>

+
+ +

Delete all +wallet transactions and only recover those parts of the +blockchain through -rescan on startup (1 = keep tx +meta data e.g. account owner and payment request +information, 2 = drop tx meta data)

+ + +

Debugging/Testing +options:

+ + + + + + +
+ + + +

-debug=<category>

+
+ +

Output +debugging information (default: 0, supplying +<category> is optional). If <category> is not +supplied or if <category> = 1, output all debugging +information. <category> can be: addrman, bench, +coindb, db, deletetx, estimatefee, http, libevent, lock, +mempool, net, tls, partitioncheck, pow, proxy, prune, rand, +randomx, reindex, rpc, selectcoins, stratum, tor, zrpc, +zrpcunsafe (implies zrpc).

+ + + + + + +
+ + + +

-experimentalfeatures

+
+ +

Enable use of +experimental features

+ + + + + + +
+ + +

-help-debug

+
+ +

Show all +debugging options (usage: --help -help-debug)

+ + + + + + +
+ + +

-logips

+
+ +

Include IP +addresses in debug output (default: 0)

+ + + + + + +
+ + +

-logtimestamps

+
+ +

Prepend debug +output with timestamp (default: 1)

+ + + + + + +
+ + + +

-minrelaytxfee=<amt>

+
+ +

Fees (in +HUSH/kB) smaller than this are considered zero fee for +relaying (default: 0.000001)

+ + + + + + +
+ + +

-printtoconsole

+
+ +

Send +trace/debug info to console instead of debug.log file

+ + + + + + +
+ + +

-shrinkdebugfile

+
+ +

Shrink +debug.log file on client startup (default: 1 when no +-debug)

+ + + + + + +
+ + +

-testnet

+
+ +

Use the test +network

+ +

Node relay +options:

+ + + + + + +
+ + +

-datacarrier

+
+ +

Relay and mine +data carrier transactions (default: 1)

+ + + + + + +
+ + +

-datacarriersize

+
+ +

Maximum size of +data in data carrier transactions we relay and mine +(default: 8192)

+ +

Block creation +options:

+ + + + + + +
+ + + +

-blockminsize=<n>

+
+ +

Set minimum +block size in bytes (default: 0)

+ + + + + + +
+ + + +

-blockmaxsize=<n>

+
+ +

Set maximum +block size in bytes (default: 2000000)

+ + + + + + +
+ + + +

-blockprioritysize=<n>

+
+ +

Set maximum +size of high-priority/low-fee transactions in bytes +(default: 1000000)

+ +

Mining +options:

+ + + + + + +
+ + +

-gen

+
+ +

Mine/generate +coins (default: 0)

+ + + + + + +
+ + + +

-genproclimit=<n>

+
+ +

Set the number +of threads for coin mining if enabled (-1 = all +cores, default: 0)

+ + + + + + +
+ + + +

-equihashsolver=<name>

+
+ +

Specify the +Equihash solver to be used if enabled (default: +"default")

+ + + + + + +
+ + + +

-mineraddress=<addr>

+
+ +

Send mined +coins to a specific single address

+ + + + + + +
+ + +

-minetolocalwallet

+
+ +

Require that +mined blocks use a coinbase address in the local wallet +(default: 1)

+ +

RPC server +options:

+ + + + + + +
+ + +

-server

+
+ +

Accept command +line and JSON-RPC commands

+ + + + + + +
+ + +

-rest

+
+ +

Accept public +REST requests (default: 0)

+ + + + + + +
+ + + +

-rpcbind=<addr>

+
+ +

Bind to given +address to listen for JSON-RPC connections. Use [host]:port +notation for IPv6. This option can be specified multiple +times (default: bind to all interfaces)

+ + + + + + +
+ + + +

-rpcuser=<user>

+
+ +

Username for +JSON-RPC connections

+ + + + + + +
+ + + +

-rpcpassword=<pw>

+
+ +

Password for +JSON-RPC connections

+ + + + + + +
+ + + +

-rpcport=<port>

+
+ +

Listen for +JSON-RPC connections on <port> (default: 0 or testnet: +10000)

+ + + + + + +
+ + + +

-rpcallowip=<ip>

+
+ +

Allow JSON-RPC +connections from specified source. Valid for <ip> are +a single IP (e.g. 1.2.3.4), a network/netmask (e.g. +1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24). +This option can be specified multiple times

+ + + + + + +
+ + + +

-rpcthreads=<n>

+
+ +

Set the number +of threads to service RPC calls (default: 8)

+ +

Metrics Options +(only if -daemon and -printtoconsole are not +set):

+ + + + + + +
+ + +

-showmetrics

+
+ +

Show metrics on +stdout (default: 1 if running in a console, 0 otherwise)

+ + + + + + +
+ + +

-metricsui

+
+ +

Set to 1 for a +persistent metrics screen, 0 for sequential metrics output +(default: 1 if running in a console, 0 otherwise)

+ + + + + + +
+ + +

-metricsrefreshtime

+
+ +

Number of +seconds between metrics refreshes (default: 1 if running in +a console, 600 otherwise)

+ +

Stratum server +options:

+ + + + + + +
+ + +

-stratum

+
+ +

Enable stratum +server (default: off)

+ + + + + + +
+ + + +

-stratumaddress=<address>

+
+ +

Mining address +to use when special address of ’x’ is sent by +miner (default: none)

+ + + + + + +
+ + + +

-stratumbind=<ipaddr>

+
+ +

Bind to given +address to listen for Stratum work requests. Use [host]:port +notation for IPv6. This option can be specified multiple +times (default: bind to all interfaces)

+ + + + + + +
+ + + +

-stratumport=<port>

+
+ +

Listen for +Stratum work requests on <port> (default: 19031 or +testnet: 19031)

+ + + + + + +
+ + + +

-stratumallowip=<ip>

+
+ +

Allow Stratum +work requests from specified source. Valid for <ip> +are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. +1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24). +This option can be specified multiple times

+ +

Hush Arrakis +Chain options:

+ + + + + + +
+ + +

-ac_algo

+
+ +

Choose PoW +mining algorithm, either ’equihash’ or +’randomx’. default is Equihash (200,9)

+ + + + + + +
+ + +

-ac_blocktime

+
+ +

Block time in +seconds, default is 60

+ + + + + + +
+ + +

-ac_beam

+
+ +

BEAM +integration

+ + + + + + +
+ + +

-ac_burn

+
+ +

Allow sending +funds to the transparent burn address when +-ac_private=1

+ + + + + + +
+ + +

-ac_minopreturnfee

+
+ +

OP_RETURN +minimum fee per tx, regardless of tx size, default is 1 +coin

+ + + + + + +
+ + +

-ac_coda

+
+ +

CODA +integration

+ + + + + + +
+ + +

-ac_decay

+
+ +

Percentage of +block reward decrease at each halving

+ + + + + + +
+ + +

-ac_end

+
+ +

Block height at +which block rewards will end

+ + + + + + +
+ + +

-ac_eras

+
+ +

Block reward +eras

+ + + + + + +
+ + +

-ac_founders

+
+ +

Number of +blocks between founders reward payouts

+ + + + + + +
+ + +

-ac_halving

+
+ +

Number of +blocks between each block reward halving

+ + + + + + +
+ + +

-ac_name

+
+ +

Name of asset +chain

+ + + + + + +
+ + +

-ac_notarypay

+
+ +

Pay notaries, +default 0

+ + + + + + +
+ + +

-ac_perc

+
+ +

Percentage of +block rewards paid to the founder

+ + + + + + +
+ + +

-ac_private

+
+ +

Shielded +transactions only (except coinbase + notaries), default is +0

+ + + + + + +
+ + +

-ac_pubkey

+
+ +

Public key for +receiving payments on the network

+ + + + + + +
+ + +

-ac_public

+
+ +

Transparent +transactions only, default 0

+ + + + + + +
+ + +

-ac_randomx_interval

+
+ +

Controls how +often the RandomX key block will change, default is 1024

+ + + + + + +
+ + +

-ac_randomx_lag

+
+ +

Sets the number +of RandomX blocks to wait before updating the key block, +default is 64

+ + + + + + +
+ + +

-ac_reward

+
+ +

Block reward in +satoshis, default is 0

+ + + + + + +
+ + +

-ac_script

+
+ +

P2SH/multisig +address to receive founders rewards

+ + + + + + +
+ + +

-ac_supply

+
+ +

Starting +supply, default is 10

+ + + + + + +
+ + +

-ac_txpow

+
+ +

Enforce +transaction-rate limit, default 0

+ +

COPYRIGHT + +

+ + +

In order to +ensure you are adequately protecting your privacy when using +Hush, please see <https://hush.is/security/>.

+ +

Copyright (C) +2016-2025 Duke Leto and The Hush Developers

+ +

Copyright (C) +2016-2020 jl777 and SuperNET developers

+ +

Copyright (C) +2016-2018 The Zcash developers

+ +

Copyright (C) +2009-2014 The Bitcoin Core developers

+ +

This is +experimental Free Software! Fuck Yeah!!!!!

+ +

Distributed +under the GPLv3 software license, see the accompanying file +COPYING or +<https://www.gnu.org/licenses/gpl-3.0.en.html>.

+
+ + diff --git a/doc/release-process.md b/doc/release-process.md index c1adb3269..ffd8b69ba 100644 --- a/doc/release-process.md +++ b/doc/release-process.md @@ -71,11 +71,11 @@ Install deps on Linux: - To make a pre-release "beta" you can modify `CLIENT_VERSION_BUILD` but that is rarely done in Hush world. - A `CLIENT_VERSION_BUILD` of 50 means "actual non-beta release" - Make sure to keep the values in configure.ac and src/clientversion.h the same. The variables are prefixed wth an underscore in configure.ac - - Run `make manpages`, commit + push results - - hushd must be running so the script can automatically get the correct version number - - There is a hack in the script where you can hardcode a version number if hushd isn't running. - - Comment out the HUSHVER line and uncomment the line above it with a hardcoded version number + - Run `./util/gen-manpages.sh`, commit + push results + - There is a hack in the script where you can hardcode a version number if hushd isn't compiled on this machine + - Comment out the HUSHVER line and uncomment the line above it with a hardcoded version number - PROTIP: Man page creation must be done after updating the version number and recompiling and before Debian package creation + - TODO: How to regenerate html man pages? - Update checkpoints in src/chainparams.cpp via util/checkpoints.pl - Run "./util/checkpoints.pl help" to get example usage - hushd must be running to run this script, since it uses hush-cli to get the data @@ -97,8 +97,6 @@ Install deps on Linux: - They only provide limited security, because they talk about the past, not future block heights. - Try to generate checkpoints as close to the release as possible, so you can have a recent block height be protected. - For instance, don't update checkpoints and then do a release a month later. You can always update checkpoint data again or multiple times - - DRAGONX now has checkpoints, you can generate them with: `./util/checkpoints.pl 1000 1 DRAGONX` - - Update copyright years if applicable. Example: `./util/update-copyrights.h 2022 2023` - Update doc/relnotes/README.md - To get the stats of file changes: `git diff --stat master...dev` - Do a fresh clone and fresh sync with new checkpoints diff --git a/doc/relnotes/README.md b/doc/relnotes/README.md index 9e7ae288e..49689ce02 100644 --- a/doc/relnotes/README.md +++ b/doc/relnotes/README.md @@ -10,7 +10,41 @@ and no longer on Github, since they banned Duke Leto and also because they censor many people around the world and work with evil organizations. They also use all your "private" repos to train their AI. +# Hush 3.10.5 "Atelic Alpaca" + +This is an OPTIONAL but RECOMMENDED upgrade. + + * DragonX is no longer supported by this codebase + * DragonX devs have forked our code and we wish them the best + * Find the latest place to download a DragonX full node via dragonx.is + * Concurrent `z_sendmany` now works + * A longstanding bug relating to run multiple `z_sendmany` operations at + once has been fixed. You can now queue up many `z_sendmany` operations + and they will succeed because they now understand how to avoid spending + coins that another `z_sendmany` process is trying to spend. + * Updated Autonomous System Map (asmap) + * New RPC `z_listlockunspent` + * Lists shielded notes (coins inside a zaddr) which are temporarily unspendable because an RPC process is currently trying to spend them. + * If that operation succeeds, they will become spent. If it fails they will be unlocked and become spendable again. + * New option to `z_shieldcoinbase` allows privately donating a percentage of coinbase funds during shielding + * This new option defaults to OFF and allows CLI users to opt-in to donating between 0% and 10% of coinbase funds to developers + * No GUI currently utilizes this but that feature is planned for SD + * The donation has extremely good privacy: + * It cannot be determined from public blockchain data if a donation is being made, as it takes the place of a Sietch output + * It cannot be determined from public blockchain data the amount of the donation + * Donations do not create new transactions, do not use additional blockspace and cannot be detected by anyone but the sender or reciever + * New HAC option `ac_clearnet` can be used to disable clearnet networking for an entire blockchain instead of just a single node + * Updated test framework and tests which allowed the fixing of the `z_sendmany` bug above + * Faster compiling of RandomX internals + * GMP dependency removed, as it is no longer needed + * Hush is now compatible with GCC15 and now correctly supports customizing the compiler for a build via the CC env var + * New HTML man pages are now available at doc/man/hushd.html and doc/man/hush-cli.html + # Hush 3.10.4 "Hazy Hākuturi" + +This is an OPTIONAL but RECOMMENDED upgrade. Some seed nodes have changed so if you are having +problems finding nodes, you want to upgrade. + * `z_sendmany` changes: * Now supports UTF8 strings as memos instead of requiring hex * Give a memo as "utf8:this is my memo" and it will automatically be hex encoded diff --git a/qa/rpc-tests/ac_private.py b/qa/rpc-tests/ac_private.py index bab8f618c..5db08a0f1 100755 --- a/qa/rpc-tests/ac_private.py +++ b/qa/rpc-tests/ac_private.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 # Copyright (c) 2016-2024 The Hush developers # Copyright (c) 2018 SuperNET developers # Distributed under the GPLv3 software license, see the accompanying @@ -8,7 +8,7 @@ from test_framework.test_framework import BitcoinTestFramework from test_framework.authproxy import JSONRPCException from test_framework.util import assert_equal, assert_greater_than, \ initialize_chain_clean, initialize_chain, start_nodes, start_node, connect_nodes_bi, \ - stop_nodes, sync_blocks, sync_mempools, wait_bitcoinds, rpc_port, assert_raises + stop_nodes, sync_blocks, sync_mempools, wait_bitcoinds, rpc_port, assert_raises, assert_true import time from decimal import Decimal @@ -21,16 +21,11 @@ def assert_success(result): def assert_error(result): assert_equal(result['result'], 'error') -def generate_random_string(length): - random_string = ''.join(choice(ascii_uppercase) for i in range(length)) - return random_string - - -class AssetChainPrivateTest (BitcoinTestFramework): - +class PrivateTest (BitcoinTestFramework): def setup_chain(self): print("Initializing ac_private test directory "+self.options.tmpdir) self.num_nodes = 1 + self.options.nocleanup = 1 # do not delete datadir after test run initialize_chain_clean(self.options.tmpdir, self.num_nodes) def setup_network(self, split = False): @@ -39,21 +34,19 @@ class AssetChainPrivateTest (BitcoinTestFramework): self.nodes = start_nodes(self.num_nodes, self.options.tmpdir, extra_args=[[ # always give -ac_name as first extra_arg and port as third - '-ac_name=REGTEST', - '-conf='+self.options.tmpdir+'/node0/REGTEST.conf', + '-ac_name=ZZZ', + '-conf='+self.options.tmpdir+'/node0/regtest/ZZZ.conf', '-port=64367', '-rpcport=64368', - '-regtest', - '-addressindex=1', - '-spentindex=1', - '-ac_supply=0', + '-ac_supply=10', '-ac_reward=25600000000', '-ac_private=1', '-allowlist=127.0.0.1', - '-debug', + #'-debug', + '-regtest', '--daemon', - '-rpcuser=rt', - '-rpcpassword=rt' + '-rpcuser=hush', + '-rpcpassword=puppy' ]] ) self.is_network_split = split @@ -71,23 +64,23 @@ class AssetChainPrivateTest (BitcoinTestFramework): def run_test (self): print("Mining blocks...") rpc = self.nodes[0] - # utxos from block 1 become mature in block 101 - rpc.generate(101) + rpc.generate(1) self.sync_all() rpc.getinfo() rpc.getwalletinfo() taddr = rpc.getnewaddress() - print "Sending to " + taddr - # sending to arbitrary non-notary transparent address is not allowed - assert_raises(JSONRPCException, rpc.sendtoaddress, taddr,1) - # this is a current notary address - # TODO: keep in sync when notaries change - #dev1_jl777 = "RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc" - # taddr vout is only allowed if it is a notary address - #txid = rpc.sendtoaddress(dev1_jl777, 7) - #assert txid, 'got txid' + # sending to arbitrary non-notary transparent address is not allowed + print("Sending to " + taddr) + try: + rpc.sendtoaddress(taddr, 1) + except: + assert_true(1) + + # this should work but don't + #assert_raises(JSONRPCException, rpc.sendtoaddress, taddr,1) + if __name__ == '__main__': - AssetChainPrivateTest ().main() + PrivateTest ().main() diff --git a/qa/rpc-tests/lockzins.py b/qa/rpc-tests/lockzins.py new file mode 100755 index 000000000..4c46fea0f --- /dev/null +++ b/qa/rpc-tests/lockzins.py @@ -0,0 +1,109 @@ +#!/usr/bin/env python3 +# Copyright (c) 2016-2025 The Hush developers +# Distributed under the GPLv3 software license, see the accompanying +# file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html + +from test_framework.test_framework import BitcoinTestFramework +from test_framework.authproxy import JSONRPCException +from test_framework.util import assert_equal, assert_greater_than, \ + initialize_chain_clean, initialize_chain, start_nodes, start_node, connect_nodes_bi, \ + stop_nodes, sync_blocks, sync_mempools, wait_bitcoinds, rpc_port, assert_raises, assert_true, \ + wait_and_assert_operationid_status + +import time +from decimal import Decimal +from random import choice +from string import ascii_uppercase + +def assert_success(result): + assert_equal(result['result'], 'success') + +def assert_error(result): + assert_equal(result['result'], 'error') + +class LockZinsTest (BitcoinTestFramework): + def setup_chain(self): + print("Initializing test directory "+self.options.tmpdir) + self.num_nodes = 1 + self.options.nocleanup = 1 # do not delete datadir after test run + initialize_chain_clean(self.options.tmpdir, self.num_nodes) + + def setup_network(self, split = False): + print("Setting up network...") + self.nodes = start_nodes(self.num_nodes, self.options.tmpdir, + extra_args=[[ + # always give -ac_name as first extra_arg and port as third + '-ac_name=ZZZ', + #'-ac_algo=randomx', + #'-testnode=1', # why does this make the test node hang before run_test() ? + '-conf='+self.options.tmpdir+'/node0/regtest/ZZZ.conf', + '-port=64367', + '-rpcport=64368', + '-ac_supply=1', + '-ac_reward=100000000', + '-ac_private=1', + '-allowlist=127.0.0.1', + #'-debug', + '-regtest', + '--daemon', + '-zrpc', + '-zdebug', + '-zrpcunsafe' + ]] + ) + self.is_network_split = False + self.rpc = self.nodes[0] + self.sync_all() + print("Done setting up network") + + def run_test (self): + print("Mining blocks...") + rpc = self.nodes[0] + # mine initial ac_supply + rpc.generate(1) + self.sync_all() + + zaddr1 = rpc.z_getnewaddress() + zaddr2 = rpc.z_getnewaddress() + + x = 0 + while x < 15: + rpc.generate(1) + self.sync_all() + time.sleep(1) + rpc.z_shieldcoinbase('*', zaddr1, 0, 1) + x = x+1 + + rpc.generate(11) + self.sync_all() + # rpc.z_listunspent() + rpc.z_getbalances() + + recipients = [] + recipients.append({"address": zaddr2, "amount": Decimal('3')}) + + # queue 4 ztxs, which will try to spend the same funds multiple times + # without correct locking of zins + opid1 = rpc.z_sendmany(zaddr1,recipients,1,0) + rpc.z_listlockunspent() + opid2 = rpc.z_sendmany(zaddr1,recipients,1,0) + rpc.z_listlockunspent() + opid3 = rpc.z_sendmany(zaddr1,recipients,1,0) + rpc.z_listlockunspent() + opid4 = rpc.z_sendmany(zaddr1,recipients,1,0) + + rpc.generate(1) + self.sync_all() + + # now that we have fullyNotified, this may not be needed? + #time.sleep(3) + + wait_and_assert_operationid_status(self.nodes[0], opid1) + wait_and_assert_operationid_status(self.nodes[0], opid2) + wait_and_assert_operationid_status(self.nodes[0], opid3) + wait_and_assert_operationid_status(self.nodes[0], opid4) + + rpc.z_getoperationstatus() + +if __name__ == '__main__': + LockZinsTest ().main() diff --git a/qa/rpc-tests/shieldcoinbase_donation.py b/qa/rpc-tests/shieldcoinbase_donation.py new file mode 100755 index 000000000..cce21d85b --- /dev/null +++ b/qa/rpc-tests/shieldcoinbase_donation.py @@ -0,0 +1,247 @@ +#!/usr/bin/env python3 +# Copyright (c) 2016-2025 The Hush developers +# Distributed under the GPLv3 software license, see the accompanying +# file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html + +from test_framework.test_framework import BitcoinTestFramework +from test_framework.authproxy import JSONRPCException +from test_framework.util import assert_equal, assert_greater_than, assert_greater_than_or_equal, \ + initialize_chain_clean, initialize_chain, start_nodes, start_node, connect_nodes_bi, \ + stop_nodes, sync_blocks, sync_mempools, wait_bitcoinds, rpc_port, assert_raises, assert_true, \ + wait_and_assert_operationid_status + +import time +from decimal import Decimal + +def assert_success(result): + assert_equal(result['result'], 'success') + +def assert_error(result): + assert_equal(result['result'], 'error') + +class ShieldCoinbaseDonationTest (BitcoinTestFramework): + def setup_chain(self): + print("Initializing test directory "+self.options.tmpdir) + self.num_nodes = 1 + self.options.nocleanup = 1 # do not delete datadir after test run + #self.options.nocleanup = 0 + initialize_chain_clean(self.options.tmpdir, self.num_nodes) + + def setup_network(self, split = False): + print("Setting up network...") + self.supply = 555 + self.nodes = start_nodes(self.num_nodes, self.options.tmpdir, + extra_args=[[ + # always give -ac_name as first extra_arg and port as third + '-ac_name=ZZZ', + #'-ac_algo=randomx', + #'-testnode=1', # why does this make the test node hang before run_test() ? + '-conf='+self.options.tmpdir+'/node0/regtest/ZZZ.conf', + '-port=63367', + '-rpcport=63368', + '-ac_supply=' + str(self.supply), + '-ac_reward=300000000', + '-ac_private=1', + '-allowlist=127.0.0.1', + '-regtest', + '--daemon', + #'-debug', + '-zrpc', + '-zdebug', + '-zrpcunsafe' + ]] + ) + self.is_network_split = False + self.rpc = self.nodes[0] + self.sync_all() + print("Done setting up network") + + def run_test (self): + # NOTE: order of these tests is important + self.run_test_default() + self.run_test_custom() + self.run_test_custom_nondefault_fee() + + def run_test_default(self): + rpc = self.nodes[0] + + # mine initial ac_supply + rpc.generate(1) + self.sync_all() + + zaddr1 = rpc.z_getnewaddress() + #rpc.z_exportkey(zaddr1) + + # first we test the default situation where no donation is given and + # it defaults to 0 + response = rpc.z_shieldcoinbase('*', zaddr1, 0, 1) + opid = response['opid'] + shieldingValue = response['shieldingValue'] + + assert_true( shieldingValue >= self.supply ) + + print("opid=" + opid) + + time.sleep(2) # give some time for the ztx to complete + + # 555 supply plus magic utxo = 555.05537304 + # NOTE: if any consensus params for this testcoin are changed above, + # the magic utxo will change and this value will need to be updated + totalSupply = 55505537304 # in puposhis + expectedAmount = totalSupply + + json = rpc.z_getoperationstatus() + txid = json[0]['result']['txid'] + + wait_and_assert_operationid_status(rpc, opid) + + rawtx0 = rpc.z_viewtransaction(txid) + assert_equal( rawtx0['outputs'][0]['valueZat'] , expectedAmount, '5% donation sends correct sendAmount') + + def run_test_custom_nondefault_fee(self): + rpc = self.nodes[0] + zaddr1 = rpc.z_getnewaddress() + + donation = 5 + + # donation zaddr is already imported from previous test + # NOTE: goal here is to test a situation where + # sendAmount/donationAmount arithmetic leads to a situation where the + # exact amount in satoshis must deal with truncation/rounding + + # shield funds to a new zaddr in this wallet with non-default fee + fee = 0.00000001 # 1 puposhi fee will lead to some kind of rounding/truncation arithmetic + response = rpc.z_shieldcoinbase('*', zaddr1, fee, 1, donation) + opid = response['opid'] + print("opid=" + opid) + + shieldingValue = response['shieldingValue'] + # sanity check. None of the expected values below will be correct if + # this is different + assert_equal( str(shieldingValue) , "3.00010000" ) + + # TODO: this might not be enough time for slow machines, better + # solution would be to wait until the opid finishes + time.sleep(2) # give some time for the ztx to complete + + # confirm tx from above + rpc.generate(1) + self.sync_all() + + # get the txid + json = rpc.z_getoperationstatus() + # NOTE: this is index 1 because this test runs after the above test + # It would be better to specifically find the data for our opid + txid = json[1]['result']['txid'] + print("txid=" + txid) + + rpc.z_listunspent() + + # (300010000 - 1)*.05 + # 15000499.95 + # (300010000 - 1) - 15000499 + # 285009500 + # The above value will be truncated (not rounded) by casting from + # double to CAmount/int64_t which means the donation will be 15000499 + # and the sendAmount will be 300010000 - 1 (the fee) - 15000499 = 285009500 + + + # these values assume that 3.0001 was shielded + expectedSendAmount = 285009500 + expectedDonationAmount = 15000499 + + # lookup txid + rawtx1 = rpc.z_viewtransaction(txid) + + # TODO: set this up once for all tests since they all use the same zaddr + donation_zaddr = "zregtestsapling1y30nwg0clsu6gcyrnvht8hdyfk3vwtszlh6kc4z5hv9hmpxzg2g0nx7c60xeecggm9x9gma96t4" + + # there should be two outputs to different addresses, order is nondeterministic + if rawtx1['outputs'][0]['address'] == donation_zaddr: + donation_zout = 0 + other_zout = 1 + else: + donation_zout = 1 + other_zout = 0 + + assert_equal( rawtx1['outputs'][donation_zout]['address'] , donation_zaddr, 'correct zaddr gets donation') + assert_equal( rawtx1['outputs'][donation_zout]['valueZat'] , expectedDonationAmount, '5% donation sends correct donationAmount') + + assert_equal( rawtx1['outputs'][other_zout]['address'] , zaddr1, 'correct zaddr gets main amount') + assert_equal( rawtx1['outputs'][other_zout]['valueZat'] , expectedSendAmount, '5% donation sends correct sendAmount') + + #TODO: assert sum = 3 + + def run_test_custom(self): + rpc = self.nodes[0] + zaddr1 = rpc.z_getnewaddress() + + # generate some new coinbase funds + rpc.generate(1) + self.sync_all() + + testing_zaddr = "zregtestsapling1y30nwg0clsu6gcyrnvht8hdyfk3vwtszlh6kc4z5hv9hmpxzg2g0nx7c60xeecggm9x9gma96t4" + testing_privkey = "secret-extended-key-regtest1q0hgrms7qqqqpqrsz6myrtnh3ccp8uzp0kgxj6029wr6vq5hqvyccdlz7a745pgm5eeaamxqp9rxll2xctfrlw2l8xhxsc7zsut2tyz0374rrlk8srjswx7rhm6hcf2d7fuwajazvjesafduzxyka4w02tqjxdehzvghyrsd2zll90k3g2ckdvc5kqd6r7r7nglrtj0ej5a40d6lh8zxrvdlxrpuc59y5m8n9tekdxh4wpqn3smv5nxu4vvu58f8dgwn92qfqrvxqlscchtyh" + + # import zaddr that receives donation , no rescan + rpc.z_importkey(testing_privkey, "no") + + rpc.z_listaddresses() + + # now we test giving a donation parameter + donation = 5 + + # shield funds to a new zaddr in this wallet with default fee + fee = 0.0001 + response = rpc.z_shieldcoinbase('*', zaddr1, fee, 1, donation) + opid = response['opid'] + print("opid=" + opid) + #wait_and_assert_operationid_status(rpc, opid) + shieldingValue = response['shieldingValue'] + + assert_greater_than_or_equal( shieldingValue , 3.0 ) + + time.sleep(2) # give some time for the ztx to complete + + rpc.getinfo() + + rpc.generate(1) + self.sync_all() + + # get the txid + json = rpc.z_getoperationstatus() + txid = json[0]['result']['txid'] + print("txid=" + txid) + + rpc.z_listunspent() + + # (3 - fee)*0.05 + expectedAmount1 = 14999500 + + # lookup txid + rawtx1 = rpc.z_viewtransaction(txid) + # there should be two outputs to different addresses, order is nondeterministic + if rawtx1['outputs'][0]['address'] == testing_zaddr: + donation_zout = 0 + other_zout = 1 + else: + donation_zout = 1 + other_zout = 0 + + # print("donation_zout=%d other_zout=%d" % (donation_zout,other_zout) ) + + assert_equal( rawtx1['outputs'][donation_zout]['address'] , testing_zaddr, 'correct zaddr gets donation') + assert_equal( rawtx1['outputs'][donation_zout]['valueZat'] , expectedAmount1, '5% donation sends correct donationAmount') + + # (3 - fee)*0.95 + expectedAmount2 = 284990500 + assert_equal( rawtx1['outputs'][other_zout]['address'] , zaddr1, 'correct zaddr gets main amount') + assert_equal( rawtx1['outputs'][other_zout]['valueZat'] , expectedAmount2, '5% donation sends correct sendAmount') + + + assert_equal( expectedAmount1 + expectedAmount2, 299990000, 'sendAmount+donationAmount = targetAmount - fee' ) + + +if __name__ == '__main__': + ShieldCoinbaseDonationTest().main() + diff --git a/qa/rpc-tests/test_framework/authproxy.py b/qa/rpc-tests/test_framework/authproxy.py index 366140aab..d88d98bc3 100644 --- a/qa/rpc-tests/test_framework/authproxy.py +++ b/qa/rpc-tests/test_framework/authproxy.py @@ -1,8 +1,4 @@ -#!/usr/bin/env python2 -# Copyright (c) 2016-2024 The Hush developers -# Distributed under the GPLv3 software license, see the accompanying -# file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html - +# Copyright (c) 2016-2025 The Hush developers """ Copyright 2011 Jeff Garzik @@ -38,45 +34,37 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA """ -try: - import http.client as httplib -except ImportError: - import httplib import base64 import decimal import json import logging -try: - import urllib.parse as urlparse -except ImportError: - import urlparse +from http.client import HTTPConnection, HTTPSConnection, BadStatusLine +from urllib.parse import urlparse + +USER_AGENT = "HushAuthServiceProxy/0.1" -USER_AGENT = "FUCKjl777LULZ" HTTP_TIMEOUT = 600 -log = logging.getLogger("BitcoinRPC") + +log = logging.getLogger("RPC") class JSONRPCException(Exception): def __init__(self, rpc_error): - Exception.__init__(self) + Exception.__init__(self, rpc_error.get("message")) self.error = rpc_error - def EncodeDecimal(o): if isinstance(o, decimal.Decimal): - return round(o, 8) + return str(o) raise TypeError(repr(o) + " is not JSON serializable") -class AuthServiceProxy(object): + +class AuthServiceProxy(): __id_count = 0 def __init__(self, service_url, service_name=None, timeout=HTTP_TIMEOUT, connection=None): self.__service_url = service_url - self.__service_name = service_name - self.__url = urlparse.urlparse(service_url) - if self.__url.port is None: - port = 80 - else: - port = self.__url.port + self._service_name = service_name + self.__url = urlparse(service_url) (user, passwd) = (self.__url.username, self.__url.password) try: user = user.encode('utf8') @@ -89,23 +77,25 @@ class AuthServiceProxy(object): authpair = user + b':' + passwd self.__auth_header = b'Basic ' + base64.b64encode(authpair) - if connection: - # Callables re-use the connection of the original proxy - self.__conn = connection - elif self.__url.scheme == 'https': - self.__conn = httplib.HTTPSConnection(self.__url.hostname, port, - None, None, False, - timeout) - else: - self.__conn = httplib.HTTPConnection(self.__url.hostname, port, - False, timeout) + self.timeout = timeout + self._set_conn(connection) + def _set_conn(self, connection=None): + port = 80 if self.__url.port is None else self.__url.port + if connection: + self.__conn = connection + self.timeout = connection.timeout + elif self.__url.scheme == 'https': + self.__conn = HTTPSConnection(self.__url.hostname, port, timeout=self.timeout) + else: + self.__conn = HTTPConnection(self.__url.hostname, port, timeout=self.timeout) + def __getattr__(self, name): if name.startswith('__') and name.endswith('__'): # Python internal stuff raise AttributeError - if self.__service_name is not None: - name = "%s.%s" % (self.__service_name, name) + if self._service_name is not None: + name = "%s.%s" % (self._service_name, name) return AuthServiceProxy(self.__service_url, name, connection=self.__conn) def _request(self, method, path, postdata): @@ -124,8 +114,9 @@ class AuthServiceProxy(object): # If connection was closed, try again. # Python 3.5+ raises BrokenPipeError instead of BadStatusLine when the connection was reset. # ConnectionResetError happens on FreeBSD with Python 3.4. - # These classes don't exist in Python 2.x, so we can't refer to them directly. - if ((isinstance(e, httplib.BadStatusLine) and e.line == "''") + # This can be simplified now that we depend on Python 3 (previously, we could not + # refer to BrokenPipeError or ConnectionResetError which did not exist on Python 2) + if ((isinstance(e, BadStatusLine) and e.line == "''") or e.__class__.__name__ in ('BrokenPipeError', 'ConnectionResetError')): self.__conn.close() self.__conn.request(method, path, postdata, headers) @@ -136,10 +127,10 @@ class AuthServiceProxy(object): def __call__(self, *args): AuthServiceProxy.__id_count += 1 - log.debug("-%s-> %s %s"%(AuthServiceProxy.__id_count, self.__service_name, + log.debug("-%s-> %s %s"%(AuthServiceProxy.__id_count, self._service_name, json.dumps(args, default=EncodeDecimal))) postdata = json.dumps({'version': '1.1', - 'method': self.__service_name, + 'method': self._service_name, 'params': args, 'id': AuthServiceProxy.__id_count}, default=EncodeDecimal) response = self._request('POST', self.__url.path, postdata) @@ -161,6 +152,11 @@ class AuthServiceProxy(object): if http_response is None: raise JSONRPCException({ 'code': -342, 'message': 'missing HTTP response from server'}) + + content_type = http_response.getheader('Content-Type') + if content_type != 'application/json': + raise JSONRPCException({ + 'code': -342, 'message': 'non-JSON HTTP response with \'%i %s\' from server' % (http_response.status, http_response.reason)}) responsedata = http_response.read().decode('utf8') response = json.loads(responsedata, parse_float=decimal.Decimal) diff --git a/qa/rpc-tests/test_framework/test_framework.py b/qa/rpc-tests/test_framework/test_framework.py index 273d9c6bf..1728c8dba 100755 --- a/qa/rpc-tests/test_framework/test_framework.py +++ b/qa/rpc-tests/test_framework/test_framework.py @@ -123,21 +123,26 @@ class BitcoinTestFramework(object): print("JSONRPC error: "+e.error['message']) traceback.print_tb(sys.exc_info()[2]) except AssertionError as e: - print("Assertion failed: "+e.message) + print("Assertion failed: " + str(e)) + traceback.print_tb(sys.exc_info()[2]) + except KeyError as e: + print("key not found: "+ str(e)) traceback.print_tb(sys.exc_info()[2]) except Exception as e: print("Unexpected exception caught during testing: "+str(e)) traceback.print_tb(sys.exc_info()[2]) + except KeyboardInterrupt as e: + print("Exiting after " + repr(e)) if not self.options.noshutdown: print("Stopping nodes") stop_nodes(self.nodes) wait_bitcoinds() else: - print("Note: hushds were not stopped and may still be running") + print("Note: nodes were not stopped and may still be running") if not self.options.nocleanup and not self.options.noshutdown: - print("Cleaning up") + print("Deleting %s" % self.options.tmpdir) shutil.rmtree(self.options.tmpdir) if success: @@ -169,7 +174,7 @@ class ComparisonTestFramework(BitcoinTestFramework): help="bitcoind binary to use for reference nodes (if any)") def setup_chain(self): - print "Initializing test directory "+self.options.tmpdir + print("Initializing test directory "+self.options.tmpdir) initialize_chain_clean(self.options.tmpdir, self.num_nodes) def setup_network(self): diff --git a/qa/rpc-tests/test_framework/util.py b/qa/rpc-tests/test_framework/util.py index 3280be573..e8a16251d 100644 --- a/qa/rpc-tests/test_framework/util.py +++ b/qa/rpc-tests/test_framework/util.py @@ -57,7 +57,7 @@ def sync_blocks(rpc_connections, wait=1): break time.sleep(wait) - # Now that the block counts are in sync, wait for the internal + # Now that the block counts are in sync, wait for the internal # notifications to finish while True: notified = [ x.getblockchaininfo()['fullyNotified'] for x in rpc_connections ] @@ -91,15 +91,17 @@ def sync_mempools(rpc_connections, wait=1): bitcoind_processes = {} def initialize_datadir(dirname, n): - datadir = os.path.join(dirname, "node"+str(n)) - datadir = os.path.join(datadir,"HUSH3") + datadir = os.path.join(dirname, "node"+str(n), "regtest") + #datadir = os.path.join(datadir,"ZZZ") if not os.path.isdir(datadir): + print("Creating dirs %s" % datadir) os.makedirs(datadir) - print("Writing to " + os.path.join(datadir,"HUSH3.conf")) - with open(os.path.join(datadir, "HUSH3.conf"), 'w') as f: + print("Writing to " + os.path.join(datadir,"ZZZ.conf")) + with open(os.path.join(datadir, "ZZZ.conf"), 'w') as f: f.write("regtest=1\n"); f.write("txindex=1\n"); + #f.write("testnode=1\n"); f.write("server=1\n"); f.write("showmetrics=0\n"); f.write("rpcuser=hush\n"); @@ -107,13 +109,15 @@ def initialize_datadir(dirname, n): f.write("port="+str(p2p_port(n))+"\n"); rpcport = str(rpc_port(n)) f.write("rpcport="+rpcport+"\n"); - print "RPC port=" + rpcport + print("RPC port=" + rpcport) f.write("listenonion=0\n"); # TODO: maybe make these optional, via arg to initialize_datadir, defaulted to on for now f.write("addressindex=1\n"); f.write("spentindex=1\n"); f.write("timestampindex=1\n"); - f.write("zindex=1\n"); + #f.write("zindex=1\n"); + print("Done writing to %s" % os.path.join(datadir,"ZZZ.conf") ) + return datadir def initialize_chain(test_dir): @@ -136,14 +140,14 @@ def initialize_chain(test_dir): cmd = os.getenv("BITCOINCLI", "hush-cli") cmd_args = cmd + " -datadir="+datadir + " -rpcwait getblockcount" if os.getenv("PYTHON_DEBUG", ""): - print "initialize_chain: hushd started, calling: " + cmd_args + print("initialize_chain: hushd started, calling: " + cmd_args) strcmd = cmd + " " + "-datadir="+datadir + " -rpcwait getblockcount" print("Running " + strcmd) subprocess.check_call(strcmd, shell=True); #subprocess.check_call([ cmd, "-rpcwait", "getblockcount"], stdout=devnull) if os.getenv("PYTHON_DEBUG", ""): - print "initialize_chain: hush-cli -rpcwait getblockcount completed" + print("initialize_chain: hush-cli -rpcwait getblockcount completed") devnull.close() rpcs = [] for i in range(4): @@ -175,7 +179,7 @@ def initialize_chain(test_dir): stop_nodes(rpcs) wait_bitcoinds() for i in range(4): - print "Cleaning up cache dir files" + print("Cleaning up cache dir files") os.remove(log_filename("cache", i, "debug.log")) os.remove(log_filename("cache", i, "db.log")) os.remove(log_filename("cache", i, "peers.dat")) @@ -221,36 +225,41 @@ def start_node(i, dirname, extra_args=None, rpchost=None, timewait=None, binary= """ Start a hushd and return RPC connection to it """ - print("Starting node " + str(i)) - datadir = os.path.join(dirname, "node"+str(i)) - # creating special config in case of cryptocondition asset chain test - if len(extra_args) > 0 and extra_args[0] == '-ac_name=REGTEST': - configpath = datadir + "/REGTEST.conf" + print("Starting node " + str(i) + " in dir " + dirname) + datadir = os.path.join(dirname, "node"+str(i), "regtest") + # creating special config + if len(extra_args) > 0 and extra_args[0] == '-ac_name=ZZZ': + configpath = datadir + "/ZZZ.conf" with open(configpath, "w+") as config: - config.write("regtest=1\n") - config.write("rpcuser=rt\n") - config.write("rpcpassword=rt\n") + config.write("rpcuser=hush\n") + config.write("rpcpassword=puppy\n") port = extra_args[3] config.write("rpcport=" + (port[9:]) + "\n") config.write("server=1\n") + #config.write("testnode=1\n") config.write("txindex=1\n") config.write("rpcworkqueue=256\n") config.write("rpcallowip=127.0.0.1\n") config.write("bind=127.0.0.1\n") - config.write("rpcbind=127.0.0.1") + #config.write("listenonion=0\n") + #config.write("torcontrol=127.0.0.1:9999\n") + config.write("rpcbind=127.0.0.1\n") + print("Done writing to %s" % configpath) + if binary is None: - binary = os.getenv("BITCOIND", "hushd") + binary = os.getenv("BITCOIND", "src/hushd") args = [ binary, "-datadir="+datadir, "-keypool=1", "-discover=0", "-rest" ] if extra_args is not None: args.extend(extra_args) - #print("args=" + ' '.join(args)) + print("args=" + ' '.join(args)) bitcoind_processes[i] = subprocess.Popen(args) devnull = open("/dev/null", "w+") - cmd = os.getenv("BITCOINCLI", "hush-cli") + cmd = os.getenv("BITCOINCLI", "src/hush-cli") print("cmd=" + cmd) - cmd_args = ' '.join(extra_args) + " -rpcwait getblockcount " + args = [ extra_args[0], "-datadir="+datadir, "-keypool=1", "-discover=0", "-rest" ] + cmd_args = ' '.join(args) + " -rpcwait getblockcount " if os.getenv("PYTHON_DEBUG", ""): - print "start_node: hushd started, calling : " + cmd + " " + cmd_args + print("start_node: hushd started, calling : " + cmd + " " + cmd_args) strcmd = cmd + " " + cmd_args print("Running " + strcmd) @@ -261,19 +270,20 @@ def start_node(i, dirname, extra_args=None, rpchost=None, timewait=None, binary= # _rpchost_to_args(rpchost) + # ["-rpcwait", "-rpcport=6438", "getblockcount"], stdout=devnull) if os.getenv("PYTHON_DEBUG", ""): - print "start_node: calling hush-cli -rpcwait getblockcount returned" + print("start_node: calling hush-cli -rpcwait getblockcount returned") devnull.close() - #port = extra_args[3] - port = rpc_port(i) + port = extra_args[3] + #port = rpc_port(i) + #print("port=%s" % port) username = rpc_username() password = rpc_password() - url = "http://%s:%s@%s:%d" % (username, password, rpchost or '127.0.0.1', int(port[9:])) + url = "http://%s:%s@%s:%s" % (username, password, rpchost or '127.0.0.1', port[9:]) print("connecting to " + url) if timewait is not None: proxy = AuthServiceProxy(url, timeout=timewait) else: proxy = AuthServiceProxy(url) - print("created proxy") + #print("created proxy") proxy.url = url # store URL on proxy for info return proxy @@ -470,7 +480,7 @@ def assert_raises(exc, fun, *args, **kwds): def wait_and_assert_operationid_status(node, myopid, in_status='success', in_errormsg=None, timeout=300): print('waiting for async operation {}'.format(myopid)) result = None - for _ in xrange(1, timeout): + for _ in range(1, timeout): results = node.z_getoperationresult([myopid]) if len(results) > 0: result = results[0] diff --git a/src/Makefile.am b/src/Makefile.am index d6ed7eb41..979df1a58 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -5,7 +5,7 @@ DIST_SUBDIRS = secp256k1 univalue AM_LDFLAGS = $(PTHREAD_CFLAGS) $(LIBTOOL_LDFLAGS) $(SAN_LDFLAGS) $(HARDENED_LDFLAGS) -AM_CXXFLAGS = $(SAN_CXXFLAGS) $(HARDENED_CXXFLAGS) $(ERROR_CXXFLAGS) +AM_CXXFLAGS = $(SAN_CXXFLAGS) $(HARDENED_CXXFLAGS) $(ERROR_CXXFLAGS) -std=c++17 AM_CPPFLAGS = $(HARDENED_CPPFLAGS) EXTRA_LIBRARIES = @@ -594,7 +594,7 @@ libzcash_a_CPPFLAGS = -DMULTICORE -fopenmp -fPIC -DBOOST_SPIRIT_THREADSAFE -DHAV #libzcash_a_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) #libzcash_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) -DMONTGOMERY_OUTPUT -libzcash_a_CXXFLAGS = $(SAN_CXXFLAGS) $(HARDENED_CXXFLAGS) -fwrapv -fno-strict-aliasing +libzcash_a_CXXFLAGS = $(SAN_CXXFLAGS) $(HARDENED_CXXFLAGS) -fwrapv -fno-strict-aliasing -std=gnu17 libzcash_a_LDFLAGS = $(SAN_LDFLAGS) $(HARDENED_LDFLAGS) libzcash_a_CPPFLAGS += -DMONTGOMERY_OUTPUT @@ -636,7 +636,7 @@ libhush_a_SOURCES = \ libhush_a_CPPFLAGS = -DMULTICORE -fopenmp -fPIC -DBINARY_OUTPUT -DCURVE_ALT_BN128 -DBOOST_SPIRIT_THREADSAFE -DHAVE_BUILD_INFO -D__STDC_FORMAT_MACROS $(HARDENED_CPPFLAGS) -pipe -O1 -g -Wstack-protector -fstack-protector-all -fPIE -fvisibility=hidden -DSTATIC $(BITCOIN_INCLUDES) -libhush_a_CXXFLAGS = $(HARDENED_CXXFLAGS) -fwrapv -fno-strict-aliasing +libhush_a_CXXFLAGS = $(HARDENED_CXXFLAGS) -fwrapv -fno-strict-aliasing -std=gnu17 libhush_a_LDFLAGS = $(HARDENED_LDFLAGS) diff --git a/src/cc/Makefile_custom b/src/cc/Makefile_custom index 9db01b106..d3ecf9c25 100644 --- a/src/cc/Makefile_custom +++ b/src/cc/Makefile_custom @@ -1,5 +1,4 @@ SHELL = /bin/sh -CC = gcc CC_DARWIN = g++-8 CC_WIN = x86_64-w64-mingw32-gcc-posix CC_AARCH64 = aarch64-linux-gnu-g++ diff --git a/src/cc/crypto777/OS_portable.h b/src/cc/crypto777/OS_portable.h index 2bf2d2583..3e00131da 100644 --- a/src/cc/crypto777/OS_portable.h +++ b/src/cc/crypto777/OS_portable.h @@ -70,51 +70,18 @@ #define MIN(x, y) ( ((x)<(y))?(x):(y) ) #endif -#include "../includes/libgfshare.h" #include "../includes/utlist.h" #include "../includes/uthash.h" #include "../includes/curve25519.h" #include "../includes/cJSON.h" -#include "../includes/tweetnacl.h" #ifndef MAP_FILE #define MAP_FILE 0 #endif -//#define fopen myfopen -//#define fclose myfclose -//FILE *myfopen(char *fname,char *mode); -//int32_t myfclose(FILE *fp); - -struct huffstream { uint8_t *ptr,*buf; uint32_t bitoffset,maski,endpos; uint32_t allocsize:31,allocated:1; }; -typedef struct huffstream HUFF; - -struct ramcoder -{ - uint32_t cumulativeProb; - uint16_t lower,upper,code,underflowBits,lastsymbol,upper_lastsymbol,counter; - uint64_t *histo; - uint16_t ranges[]; -}; - #define hrewind(hp) hseek(hp,0,SEEK_SET) -int32_t ramcoder_decoder(struct ramcoder *coder,int32_t updateprobs,uint8_t *buf,int32_t maxlen,HUFF *hp,bits256 *seed); -int32_t ramcoder_encoder(struct ramcoder *coder,int32_t updateprobs,uint8_t *buf,int32_t len,HUFF *hp,uint64_t *histo,bits256 *seed); -//int32_t init_ramcoder(struct ramcoder *coder,HUFF *hp,bits256 *seed); -int32_t ramcoder_decompress(uint8_t *data,int32_t maxlen,uint8_t *bits,uint32_t numbits,bits256 seed); -int32_t ramcoder_compress(uint8_t *bits,int32_t maxlen,uint8_t *data,int32_t datalen,bits256 seed); -uint64_t hconv_bitlen(uint64_t bitlen); -void _init_HUFF(HUFF *hp,int32_t allocsize,void *buf); -int32_t hgetbit(HUFF *hp); -int32_t hputbit(HUFF *hp,int32_t bit); -uint64_t hconv_bitlen(uint64_t bitlen); -int32_t hseek(HUFF *hp,int32_t offset,int32_t mode); #define SCRIPT_OPRETURN 0x6a -#define GENESIS_ACCT "1739068987193023818" // NXT-MRCC-2YLS-8M54-3CMAJ -#define GENESIS_PUBKEYSTR "1259ec21d31a30898d7cd1609f80d9668b4778e3d97e941044b39f0c44d2e51b" -#define GENESIS_PRIVKEYSTR "88a71671a6edd987ad9e9097428fc3f169decba3ac8f10da7b24e0ca16803b70" -#define GENESIS_SECRET "It was a bright cold day in April, and the clocks were striking thirteen." #define SATOSHIDEN ((uint64_t)100000000L) #define dstr(x) ((double)(x) / SATOSHIDEN) @@ -145,15 +112,6 @@ typedef struct queue char name[64],initflag; } queue_t; -struct rpcrequest_info -{ - struct rpcrequest_info *next,*prev; - pthread_t T; - int32_t sock; - uint32_t ipbits; - uint16_t port,pad; -}; - struct OS_mappedptr { char fname[512]; @@ -176,7 +134,6 @@ struct OS_memspace struct tai { uint64_t x; double millis; }; struct taidate { int32_t year,month,day; }; struct taitime { struct taidate date; int32_t hour,minute,second; uint32_t offset; double millis; }; -int32_t leapsecs_sub(struct tai *); struct tai tai_now(void); uint32_t tai2utc(struct tai t); @@ -193,8 +150,6 @@ char *utc_str(char *str,uint32_t utc); double tai_diff(struct tai reftai,struct tai cmptai); uint32_t OS_conv_utime(char *utime); -//int32_t msync(void *addr,size_t len,int32_t flags); - #ifdef __PNACL int32_t OS_nonportable_syncmap(struct OS_mappedptr *mp,long len); void *OS_nonportable_tmpalloc(char *dirname,char *name,struct OS_memspace *mem,long origsize); @@ -220,13 +175,9 @@ void OS_remove_directory(char *dirname); int32_t OS_portable_renamefile(char *fname,char *newfname); int32_t OS_portable_removefile(char *fname); void *OS_portable_mapfile(char *fname,long *filesizep,int32_t enablewrite); -//int32_t OS_portable_syncmap(struct OS_mappedptr *mp,long len); -//void *OS_portable_tmpalloc(char *dirname,char *name,struct OS_memspace *mem,long origsize); -int32_t is_DST(int32_t datenum); int32_t extract_datenum(int32_t *yearp,int32_t *monthp,int32_t *dayp,int32_t datenum); int32_t expand_datenum(char *date,int32_t datenum); -int32_t calc_datenum(int32_t year,int32_t month,int32_t day); int32_t ecb_decrdate(int32_t *yearp,int32_t *monthp,int32_t *dayp,char *date,int32_t datenum); int32_t conv_date(int32_t *secondsp,char *buf); uint32_t OS_conv_datenum(int32_t datenum,int32_t hour,int32_t minute,int32_t second); @@ -260,13 +211,9 @@ int32_t OS_releasemap(void *ptr,unsigned long filesize); double OS_milliseconds(void); void OS_randombytes(uint8_t *x,long xlen); -//int32_t OS_syncmap(struct OS_mappedptr *mp,long len); -//void *OS_tmpalloc(char *dirname,char *name,struct OS_memspace *mem,long origsize); - long myallocated(uint8_t type,long change); void *mycalloc(uint8_t type,int32_t n,long itemsize); void myfree(void *_ptr,long allocsize); -//void free_queueitem(void *itemdata); void *myrealloc(uint8_t type,void *oldptr,long oldsize,long newsize); void *myaligned_alloc(uint64_t allocsize); int32_t myaligned_free(void *ptr,long size); @@ -317,10 +264,8 @@ int init_base32(char *tokenstr,uint8_t *token,int32_t len); char *OS_mvstr(void); long _stripwhite(char *buf,int accept); -int32_t is_DST(int32_t datenum); int32_t extract_datenum(int32_t *yearp,int32_t *monthp,int32_t *dayp,int32_t datenum); int32_t expand_datenum(char *date,int32_t datenum); -int32_t calc_datenum(int32_t year,int32_t month,int32_t day); int32_t ecb_decrdate(int32_t *yearp,int32_t *monthp,int32_t *dayp,char *date,int32_t datenum); int32_t conv_date(int32_t *secondsp,char *buf); uint32_t OS_conv_datenum(int32_t datenum,int32_t hour,int32_t minute,int32_t second); @@ -332,58 +277,14 @@ uint64_t RS_decode(char *rs); int32_t RS_encode(char *rsaddr,uint64_t id); char *cmc_ticker(char *base); -void calc_sha1(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len); -void calc_md2(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len); -void calc_md4(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len); -void calc_md4str(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len); -void calc_md2str(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len); -void calc_md5str(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len); -void calc_sha224(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len); -void calc_sha384(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len); -void calc_sha512(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len); -void calc_sha224(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len); -void calc_rmd160(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len); -void calc_rmd128(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len); -void calc_rmd256(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len); -void calc_rmd320(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len); -void calc_tiger(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len); -void calc_whirlpool(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len); - -char *hmac_sha1_str(char *dest,char *key,int32_t key_size,char *message); -char *hmac_md2_str(char *dest,char *key,int32_t key_size,char *message); -char *hmac_md4_str(char *dest,char *key,int32_t key_size,char *message); -char *hmac_md5_str(char *dest,char *key,int32_t key_size,char *message); -char *hmac_sha224_str(char *dest,char *key,int32_t key_size,char *message); -char *hmac_sha256_str(char *dest,char *key,int32_t key_size,char *message); -char *hmac_sha384_str(char *dest,char *key,int32_t key_size,char *message); -char *hmac_sha512_str(char *dest,char *key,int32_t key_size,char *message); -char *hmac_rmd128_str(char *dest,char *key,int32_t key_size,char *message); -char *hmac_rmd160_str(char *dest,char *key,int32_t key_size,char *message); -char *hmac_rmd256_str(char *dest,char *key,int32_t key_size,char *message); -char *hmac_rmd320_str(char *dest,char *key,int32_t key_size,char *message); -char *hmac_tiger_str(char *dest,char *key,int32_t key_size,char *message); -char *hmac_whirlpool_str(char *dest,char *key,int32_t key_size,char *message); int nn_base64_encode(const uint8_t *in,size_t in_len,char *out,size_t out_len); int nn_base64_decode(const char *in,size_t in_len,uint8_t *out,size_t out_len); void calc_rmd160_sha256(uint8_t rmd160[20],uint8_t *data,int32_t datalen); void sha256_sha256(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len); void rmd160ofsha256(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len); -void calc_md5str(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len); -void calc_crc32str(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len); -void calc_NXTaddr(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len); -void calc_curve25519_str(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len); -void calc_base64_encodestr(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len); -void calc_base64_decodestr(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len); -void calc_hexstr(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len); -void calc_unhexstr(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len); int32_t safecopy(char *dest,char *src,long len); double dxblend(double *destp,double val,double decay); -uint64_t calc_ipbits(char *ip_port); -void expand_ipbits(char *ipaddr,uint64_t ipbits); -void escape_code(char *escaped,char *str); -void SaM_PrepareIndices(void); - // dragon_serdes.c #ifndef IGUANA_LOG2PACKETSIZE #define IGUANA_LOG2PACKETSIZE 22 @@ -428,10 +329,5 @@ void bits256_rmd160_sha256(uint8_t rmd160[20],bits256 data); double get_theoretical(double *avebidp,double *aveaskp,double *highbidp,double *lowaskp,double *CMC_averagep,double changes[3],char *name,char *base,char *rel,double *USD_averagep); char *bitcoind_RPCnew(void *curl_handle,char **retstrp,char *debugstr,char *url,char *userpass,char *command,char *params,int32_t timeout); -extern char *Iguana_validcommands[]; -extern bits256 GENESIS_PUBKEY,GENESIS_PRIVKEY; -extern char NXTAPIURL[]; -extern int32_t smallprimes[168],Debuglevel; - #endif diff --git a/src/cc/includes/curve25519.h b/src/cc/includes/curve25519.h index 5e08f5a4a..f3946e068 100644 --- a/src/cc/includes/curve25519.h +++ b/src/cc/includes/curve25519.h @@ -39,10 +39,6 @@ struct rmd160_vstate { uint64_t length; uint8_t buf[64]; uint32_t curlen, state[ struct acct777_sig { bits256 sigbits,pubkey; uint64_t signer64bits; uint32_t timestamp,allocsize; }; -//#undef force_inline -//#define force_inline __attribute__((always_inline)) - - bits320 fmul(const bits320 in2,const bits320 in); bits320 fexpand(bits256 basepoint); bits256 fcontract(const bits320 input); @@ -81,10 +77,4 @@ uint64_t acct777_signtx(struct acct777_sig *sig,bits256 privkey,uint32_t timesta uint64_t acct777_swaptx(bits256 privkey,struct acct777_sig *sig,uint32_t timestamp,uint8_t *data,int32_t datalen); void calc_hmac_sha256(uint8_t *mac,int32_t maclen,uint8_t *key,int32_t key_size,uint8_t *message,int32_t len); -#include "../includes/tweetnacl.h" -int32_t _SuperNET_cipher(uint8_t nonce[crypto_box_NONCEBYTES],uint8_t *cipher,uint8_t *message,int32_t len,bits256 destpub,bits256 srcpriv,uint8_t *buf); -uint8_t *_SuperNET_decipher(uint8_t nonce[crypto_box_NONCEBYTES],uint8_t *cipher,uint8_t *message,int32_t len,bits256 srcpub,bits256 mypriv); -void *SuperNET_deciphercalc(void **ptrp,int32_t *msglenp,bits256 privkey,bits256 srcpubkey,uint8_t *cipher,int32_t cipherlen,uint8_t *buf,int32_t bufsize); -uint8_t *SuperNET_ciphercalc(void **ptrp,int32_t *cipherlenp,bits256 *privkeyp,bits256 *destpubkeyp,uint8_t *data,int32_t datalen,uint8_t *space2,int32_t space2size); - #endif diff --git a/src/cc/includes/libgfshare.h b/src/cc/includes/libgfshare.h deleted file mode 100644 index b1c31db42..000000000 --- a/src/cc/includes/libgfshare.h +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright (c) 2016-2024 The Hush developers -// Distributed under the GPLv3 software license, see the accompanying -// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html -/* - * This file is Copyright Daniel Silverstone 2006 - * - * 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. - * - */ - -/****************************************************************************** - * Copyright © 2014-2019 The SuperNET Developers. * - * * - * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * - * the top-level directory of this distribution for the individual copyright * - * holder information and the developer policies on copyright and licensing. * - * * - * Unless otherwise agreed in a custom licensing agreement, no part of the * - * SuperNET software, including this file may be copied, modified, propagated * - * or distributed except according to the terms contained in the LICENSE file * - * * - * Removal or modification of this copyright notice is prohibited. * - * * - ******************************************************************************/ - -#ifndef LIBGFSHARE_H -#define LIBGFSHARE_H -#include - -typedef struct _gfshare_ctx gfshare_ctx; - -typedef void (*gfshare_rand_func_t)(unsigned char*,long); - -/* This will, by default, use random(). It's not very good so you should - * replace it (perhaps with a function which reads from /dev/urandom). - * If you can't be bothered, be sure to srandom() before you use any - * of the gfshare_ctx_enc_* functions - */ -extern gfshare_rand_func_t gfshare_fill_rand; - -/* ------------------------------------------------------[ Preparation ]---- */ - -/* Initialise a gfshare context for producing shares */ -gfshare_ctx* gfshare_ctx_init_enc(unsigned char* /* sharenrs */, - uint32_t /* sharecount */, - unsigned char /* threshold */, - uint32_t /* size */); - -/* Initialise a gfshare context for recombining shares */ -gfshare_ctx* gfshare_ctx_init_dec(unsigned char* /* sharenrs */, - uint32_t /* sharecount */, - uint32_t /* size */); - -/* Free a share context's memory. */ -void gfshare_ctx_free(gfshare_ctx* /* ctx */); - -/* --------------------------------------------------------[ Splitting ]---- */ - -/* Provide a secret to the encoder. (this re-scrambles the coefficients) */ -void gfshare_ctx_enc_setsecret(gfshare_ctx* /* ctx */, - unsigned char* /* secret */); - -/* Extract a share from the context. - * 'share' must be preallocated and at least 'size' bytes long. - * 'sharenr' is the index into the 'sharenrs' array of the share you want. - */ -void gfshare_ctx_encgetshare(uint8_t *logs,uint8_t *exps,gfshare_ctx* /* ctx */, unsigned char /* sharenr */, unsigned char* /* share */); -void gfshare_ctx_enc_getshare(gfshare_ctx* /* ctx */, unsigned char /* sharenr */, unsigned char* /* share */); - -/* ----------------------------------------------------[ Recombination ]---- */ - -/* Inform a recombination context of a change in share indexes */ -void gfshare_ctx_dec_newshares(gfshare_ctx* /* ctx */, - unsigned char* /* sharenrs */); - -/* Provide a share context with one of the shares. - * The 'sharenr' is the index into the 'sharenrs' array - */ -void gfshare_ctx_dec_giveshare(gfshare_ctx* /* ctx */, - unsigned char /* sharenr */, - unsigned char* /* share */); - -/* Extract the secret by interpolation of the shares. - * secretbuf must be allocated and at least 'size' bytes long - */ - -void gfshare_ctx_decextract(uint8_t *logs,uint8_t *exps,gfshare_ctx* /* ctx */, unsigned char* /* secretbuf */); -void gfshare_ctx_dec_extract(gfshare_ctx* /* ctx */, unsigned char* /* secretbuf */); - -#endif /* LIBGFSHARE_H */ - diff --git a/src/cc/includes/tweetnacl.h b/src/cc/includes/tweetnacl.h deleted file mode 100644 index f435ae376..000000000 --- a/src/cc/includes/tweetnacl.h +++ /dev/null @@ -1,278 +0,0 @@ -// Copyright (c) 2016-2024 The Hush developers -// Distributed under the GPLv3 software license, see the accompanying -// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html -#ifndef TWEETNACL_H -#define TWEETNACL_H -#define crypto_auth_PRIMITIVE "hmacsha512256" -#define crypto_auth crypto_auth_hmacsha512256 -#define crypto_auth_verify crypto_auth_hmacsha512256_verify -#define crypto_auth_BYTES crypto_auth_hmacsha512256_BYTES -#define crypto_auth_KEYBYTES crypto_auth_hmacsha512256_KEYBYTES -#define crypto_auth_IMPLEMENTATION crypto_auth_hmacsha512256_IMPLEMENTATION -#define crypto_auth_VERSION crypto_auth_hmacsha512256_VERSION -#define crypto_auth_hmacsha512256_tweet_BYTES 32 -#define crypto_auth_hmacsha512256_tweet_KEYBYTES 32 -extern int crypto_auth_hmacsha512256_tweet(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *); -extern int crypto_auth_hmacsha512256_tweet_verify(const unsigned char *,const unsigned char *,unsigned long long,const unsigned char *); -#define crypto_auth_hmacsha512256_tweet_VERSION "-" -#define crypto_auth_hmacsha512256 crypto_auth_hmacsha512256_tweet -#define crypto_auth_hmacsha512256_verify crypto_auth_hmacsha512256_tweet_verify -#define crypto_auth_hmacsha512256_BYTES crypto_auth_hmacsha512256_tweet_BYTES -#define crypto_auth_hmacsha512256_KEYBYTES crypto_auth_hmacsha512256_tweet_KEYBYTES -#define crypto_auth_hmacsha512256_VERSION crypto_auth_hmacsha512256_tweet_VERSION -#define crypto_auth_hmacsha512256_IMPLEMENTATION "crypto_auth/hmacsha512256/tweet" -#define crypto_box_PRIMITIVE "curve25519xsalsa20poly1305" -#define crypto_box crypto_box_curve25519xsalsa20poly1305 -#define crypto_box_open crypto_box_curve25519xsalsa20poly1305_open -#define crypto_box_keypair crypto_box_curve25519xsalsa20poly1305_keypair -#define crypto_box_priv2pub crypto_box_curve25519xsalsa20poly1305_priv2pub -#define crypto_box_beforenm crypto_box_curve25519xsalsa20poly1305_beforenm -#define crypto_box_afternm crypto_box_curve25519xsalsa20poly1305_afternm -#define crypto_box_open_afternm crypto_box_curve25519xsalsa20poly1305_open_afternm -#define crypto_box_PUBLICKEYBYTES crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES -#define crypto_box_SECRETKEYBYTES crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES -#define crypto_box_BEFORENMBYTES crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES -#define crypto_box_NONCEBYTES crypto_box_curve25519xsalsa20poly1305_NONCEBYTES -#define crypto_box_ZEROBYTES crypto_box_curve25519xsalsa20poly1305_ZEROBYTES -#define crypto_box_BOXZEROBYTES crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES -#define crypto_box_IMPLEMENTATION crypto_box_curve25519xsalsa20poly1305_IMPLEMENTATION -#define crypto_box_VERSION crypto_box_curve25519xsalsa20poly1305_VERSION -#define crypto_box_curve25519xsalsa20poly1305_tweet_PUBLICKEYBYTES 32 -#define crypto_box_curve25519xsalsa20poly1305_tweet_SECRETKEYBYTES 32 -#define crypto_box_curve25519xsalsa20poly1305_tweet_BEFORENMBYTES 32 -#define crypto_box_curve25519xsalsa20poly1305_tweet_NONCEBYTES 24 -#define crypto_box_curve25519xsalsa20poly1305_tweet_ZEROBYTES 32 -#define crypto_box_curve25519xsalsa20poly1305_tweet_BOXZEROBYTES 16 -extern int crypto_box_curve25519xsalsa20poly1305_tweet(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *,const unsigned char *); -extern int crypto_box_curve25519xsalsa20poly1305_tweet_open(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *,const unsigned char *); -extern int crypto_box_curve25519xsalsa20poly1305_tweet_keypair(unsigned char *,unsigned char *); -extern int crypto_box_curve25519xsalsa20poly1305_tweet_priv2pub(unsigned char *,unsigned char *); -extern int crypto_box_curve25519xsalsa20poly1305_tweet_beforenm(unsigned char *,const unsigned char *,const unsigned char *); -extern int crypto_box_curve25519xsalsa20poly1305_tweet_afternm(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *); -extern int crypto_box_curve25519xsalsa20poly1305_tweet_open_afternm(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *); -#define crypto_box_curve25519xsalsa20poly1305_tweet_VERSION "-" -#define crypto_box_curve25519xsalsa20poly1305 crypto_box_curve25519xsalsa20poly1305_tweet -#define crypto_box_curve25519xsalsa20poly1305_open crypto_box_curve25519xsalsa20poly1305_tweet_open -#define crypto_box_curve25519xsalsa20poly1305_keypair crypto_box_curve25519xsalsa20poly1305_tweet_keypair -#define crypto_box_curve25519xsalsa20poly1305_priv2pub crypto_box_curve25519xsalsa20poly1305_tweet_priv2pub -#define crypto_box_curve25519xsalsa20poly1305_beforenm crypto_box_curve25519xsalsa20poly1305_tweet_beforenm -#define crypto_box_curve25519xsalsa20poly1305_afternm crypto_box_curve25519xsalsa20poly1305_tweet_afternm -#define crypto_box_curve25519xsalsa20poly1305_open_afternm crypto_box_curve25519xsalsa20poly1305_tweet_open_afternm -#define crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES crypto_box_curve25519xsalsa20poly1305_tweet_PUBLICKEYBYTES -#define crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES crypto_box_curve25519xsalsa20poly1305_tweet_SECRETKEYBYTES -#define crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES crypto_box_curve25519xsalsa20poly1305_tweet_BEFORENMBYTES -#define crypto_box_curve25519xsalsa20poly1305_NONCEBYTES crypto_box_curve25519xsalsa20poly1305_tweet_NONCEBYTES -#define crypto_box_curve25519xsalsa20poly1305_ZEROBYTES crypto_box_curve25519xsalsa20poly1305_tweet_ZEROBYTES -#define crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES crypto_box_curve25519xsalsa20poly1305_tweet_BOXZEROBYTES -#define crypto_box_curve25519xsalsa20poly1305_VERSION crypto_box_curve25519xsalsa20poly1305_tweet_VERSION -#define crypto_box_curve25519xsalsa20poly1305_IMPLEMENTATION "crypto_box/curve25519xsalsa20poly1305/tweet" -#define crypto_core_PRIMITIVE "salsa20" -#define crypto_core crypto_core_salsa20 -#define crypto_core_OUTPUTBYTES crypto_core_salsa20_OUTPUTBYTES -#define crypto_core_INPUTBYTES crypto_core_salsa20_INPUTBYTES -#define crypto_core_KEYBYTES crypto_core_salsa20_KEYBYTES -#define crypto_core_CONSTBYTES crypto_core_salsa20_CONSTBYTES -#define crypto_core_IMPLEMENTATION crypto_core_salsa20_IMPLEMENTATION -#define crypto_core_VERSION crypto_core_salsa20_VERSION -#define crypto_core_salsa20_tweet_OUTPUTBYTES 64 -#define crypto_core_salsa20_tweet_INPUTBYTES 16 -#define crypto_core_salsa20_tweet_KEYBYTES 32 -#define crypto_core_salsa20_tweet_CONSTBYTES 16 -extern int crypto_core_salsa20_tweet(unsigned char *,const unsigned char *,const unsigned char *,const unsigned char *); -#define crypto_core_salsa20_tweet_VERSION "-" -#define crypto_core_salsa20 crypto_core_salsa20_tweet -#define crypto_core_salsa20_OUTPUTBYTES crypto_core_salsa20_tweet_OUTPUTBYTES -#define crypto_core_salsa20_INPUTBYTES crypto_core_salsa20_tweet_INPUTBYTES -#define crypto_core_salsa20_KEYBYTES crypto_core_salsa20_tweet_KEYBYTES -#define crypto_core_salsa20_CONSTBYTES crypto_core_salsa20_tweet_CONSTBYTES -#define crypto_core_salsa20_VERSION crypto_core_salsa20_tweet_VERSION -#define crypto_core_salsa20_IMPLEMENTATION "crypto_core/salsa20/tweet" -#define crypto_core_hsalsa20_tweet_OUTPUTBYTES 32 -#define crypto_core_hsalsa20_tweet_INPUTBYTES 16 -#define crypto_core_hsalsa20_tweet_KEYBYTES 32 -#define crypto_core_hsalsa20_tweet_CONSTBYTES 16 -extern int crypto_core_hsalsa20_tweet(unsigned char *,const unsigned char *,const unsigned char *,const unsigned char *); -#define crypto_core_hsalsa20_tweet_VERSION "-" -#define crypto_core_hsalsa20 crypto_core_hsalsa20_tweet -#define crypto_core_hsalsa20_OUTPUTBYTES crypto_core_hsalsa20_tweet_OUTPUTBYTES -#define crypto_core_hsalsa20_INPUTBYTES crypto_core_hsalsa20_tweet_INPUTBYTES -#define crypto_core_hsalsa20_KEYBYTES crypto_core_hsalsa20_tweet_KEYBYTES -#define crypto_core_hsalsa20_CONSTBYTES crypto_core_hsalsa20_tweet_CONSTBYTES -#define crypto_core_hsalsa20_VERSION crypto_core_hsalsa20_tweet_VERSION -#define crypto_core_hsalsa20_IMPLEMENTATION "crypto_core/hsalsa20/tweet" -#define crypto_hashblocks_PRIMITIVE "sha512" -#define crypto_hashblocks crypto_hashblocks_sha512 -#define crypto_hashblocks_STATEBYTES crypto_hashblocks_sha512_STATEBYTES -#define crypto_hashblocks_BLOCKBYTES crypto_hashblocks_sha512_BLOCKBYTES -#define crypto_hashblocks_IMPLEMENTATION crypto_hashblocks_sha512_IMPLEMENTATION -#define crypto_hashblocks_VERSION crypto_hashblocks_sha512_VERSION -#define crypto_hashblocks_sha512_tweet_STATEBYTES 64 -#define crypto_hashblocks_sha512_tweet_BLOCKBYTES 128 -extern int crypto_hashblocks_sha512_tweet(unsigned char *,const unsigned char *,unsigned long long); -#define crypto_hashblocks_sha512_tweet_VERSION "-" -#define crypto_hashblocks_sha512 crypto_hashblocks_sha512_tweet -#define crypto_hashblocks_sha512_STATEBYTES crypto_hashblocks_sha512_tweet_STATEBYTES -#define crypto_hashblocks_sha512_BLOCKBYTES crypto_hashblocks_sha512_tweet_BLOCKBYTES -#define crypto_hashblocks_sha512_VERSION crypto_hashblocks_sha512_tweet_VERSION -#define crypto_hashblocks_sha512_IMPLEMENTATION "crypto_hashblocks/sha512/tweet" -#define crypto_hashblocks_sha256_tweet_STATEBYTES 32 -#define crypto_hashblocks_sha256_tweet_BLOCKBYTES 64 -extern int crypto_hashblocks_sha256_tweet(unsigned char *,const unsigned char *,unsigned long long); -#define crypto_hashblocks_sha256_tweet_VERSION "-" -#define crypto_hashblocks_sha256 crypto_hashblocks_sha256_tweet -#define crypto_hashblocks_sha256_STATEBYTES crypto_hashblocks_sha256_tweet_STATEBYTES -#define crypto_hashblocks_sha256_BLOCKBYTES crypto_hashblocks_sha256_tweet_BLOCKBYTES -#define crypto_hashblocks_sha256_VERSION crypto_hashblocks_sha256_tweet_VERSION -#define crypto_hashblocks_sha256_IMPLEMENTATION "crypto_hashblocks/sha256/tweet" -#define crypto_hash_PRIMITIVE "sha512" -#define crypto_hash crypto_hash_sha512 -#define crypto_hash_BYTES crypto_hash_sha512_BYTES -#define crypto_hash_IMPLEMENTATION crypto_hash_sha512_IMPLEMENTATION -#define crypto_hash_VERSION crypto_hash_sha512_VERSION -#define crypto_hash_sha512_tweet_BYTES 64 -extern int crypto_hash_sha512_tweet(unsigned char *,const unsigned char *,unsigned long long); -#define crypto_hash_sha512_tweet_VERSION "-" -#define crypto_hash_sha512 crypto_hash_sha512_tweet -#define crypto_hash_sha512_BYTES crypto_hash_sha512_tweet_BYTES -#define crypto_hash_sha512_VERSION crypto_hash_sha512_tweet_VERSION -#define crypto_hash_sha512_IMPLEMENTATION "crypto_hash/sha512/tweet" -#define crypto_hash_sha256_tweet_BYTES 32 -extern int crypto_hash_sha256_tweet(unsigned char *,const unsigned char *,unsigned long long); -#define crypto_hash_sha256_tweet_VERSION "-" -#define crypto_hash_sha256 crypto_hash_sha256_tweet -#define crypto_hash_sha256_BYTES crypto_hash_sha256_tweet_BYTES -#define crypto_hash_sha256_VERSION crypto_hash_sha256_tweet_VERSION -#define crypto_hash_sha256_IMPLEMENTATION "crypto_hash/sha256/tweet" -#define crypto_onetimeauth_PRIMITIVE "poly1305" -#define crypto_onetimeauth crypto_onetimeauth_poly1305 -#define crypto_onetimeauth_verify crypto_onetimeauth_poly1305_verify -#define crypto_onetimeauth_BYTES crypto_onetimeauth_poly1305_BYTES -#define crypto_onetimeauth_KEYBYTES crypto_onetimeauth_poly1305_KEYBYTES -#define crypto_onetimeauth_IMPLEMENTATION crypto_onetimeauth_poly1305_IMPLEMENTATION -#define crypto_onetimeauth_VERSION crypto_onetimeauth_poly1305_VERSION -#define crypto_onetimeauth_poly1305_tweet_BYTES 16 -#define crypto_onetimeauth_poly1305_tweet_KEYBYTES 32 -extern int crypto_onetimeauth_poly1305_tweet(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *); -extern int crypto_onetimeauth_poly1305_tweet_verify(const unsigned char *,const unsigned char *,unsigned long long,const unsigned char *); -#define crypto_onetimeauth_poly1305_tweet_VERSION "-" -#define crypto_onetimeauth_poly1305 crypto_onetimeauth_poly1305_tweet -#define crypto_onetimeauth_poly1305_verify crypto_onetimeauth_poly1305_tweet_verify -#define crypto_onetimeauth_poly1305_BYTES crypto_onetimeauth_poly1305_tweet_BYTES -#define crypto_onetimeauth_poly1305_KEYBYTES crypto_onetimeauth_poly1305_tweet_KEYBYTES -#define crypto_onetimeauth_poly1305_VERSION crypto_onetimeauth_poly1305_tweet_VERSION -#define crypto_onetimeauth_poly1305_IMPLEMENTATION "crypto_onetimeauth/poly1305/tweet" -#define crypto_scalarmult_PRIMITIVE "curve25519" -#define crypto_scalarmult crypto_scalarmult_curve25519 -#define crypto_scalarmult_base crypto_scalarmult_curve25519_base -#define crypto_scalarmult_BYTES crypto_scalarmult_curve25519_BYTES -#define crypto_scalarmult_SCALARBYTES crypto_scalarmult_curve25519_SCALARBYTES -#define crypto_scalarmult_IMPLEMENTATION crypto_scalarmult_curve25519_IMPLEMENTATION -#define crypto_scalarmult_VERSION crypto_scalarmult_curve25519_VERSION -#define crypto_scalarmult_curve25519_tweet_BYTES 32 -#define crypto_scalarmult_curve25519_tweet_SCALARBYTES 32 -extern int crypto_scalarmult_curve25519_tweet(unsigned char *,const unsigned char *,const unsigned char *); -extern int crypto_scalarmult_curve25519_tweet_base(unsigned char *,const unsigned char *); -#define crypto_scalarmult_curve25519_tweet_VERSION "-" -#define crypto_scalarmult_curve25519 crypto_scalarmult_curve25519_tweet -#define crypto_scalarmult_curve25519_base crypto_scalarmult_curve25519_tweet_base -#define crypto_scalarmult_curve25519_BYTES crypto_scalarmult_curve25519_tweet_BYTES -#define crypto_scalarmult_curve25519_SCALARBYTES crypto_scalarmult_curve25519_tweet_SCALARBYTES -#define crypto_scalarmult_curve25519_VERSION crypto_scalarmult_curve25519_tweet_VERSION -#define crypto_scalarmult_curve25519_IMPLEMENTATION "crypto_scalarmult/curve25519/tweet" -#define crypto_secretbox_PRIMITIVE "xsalsa20poly1305" -#define crypto_secretbox crypto_secretbox_xsalsa20poly1305 -#define crypto_secretbox_open crypto_secretbox_xsalsa20poly1305_open -#define crypto_secretbox_KEYBYTES crypto_secretbox_xsalsa20poly1305_KEYBYTES -#define crypto_secretbox_NONCEBYTES crypto_secretbox_xsalsa20poly1305_NONCEBYTES -#define crypto_secretbox_ZEROBYTES crypto_secretbox_xsalsa20poly1305_ZEROBYTES -#define crypto_secretbox_BOXZEROBYTES crypto_secretbox_xsalsa20poly1305_BOXZEROBYTES -#define crypto_secretbox_IMPLEMENTATION crypto_secretbox_xsalsa20poly1305_IMPLEMENTATION -#define crypto_secretbox_VERSION crypto_secretbox_xsalsa20poly1305_VERSION -#define crypto_secretbox_xsalsa20poly1305_tweet_KEYBYTES 32 -#define crypto_secretbox_xsalsa20poly1305_tweet_NONCEBYTES 24 -#define crypto_secretbox_xsalsa20poly1305_tweet_ZEROBYTES 32 -#define crypto_secretbox_xsalsa20poly1305_tweet_BOXZEROBYTES 16 -extern int crypto_secretbox_xsalsa20poly1305_tweet(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *); -extern int crypto_secretbox_xsalsa20poly1305_tweet_open(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *); -#define crypto_secretbox_xsalsa20poly1305_tweet_VERSION "-" -#define crypto_secretbox_xsalsa20poly1305 crypto_secretbox_xsalsa20poly1305_tweet -#define crypto_secretbox_xsalsa20poly1305_open crypto_secretbox_xsalsa20poly1305_tweet_open -#define crypto_secretbox_xsalsa20poly1305_KEYBYTES crypto_secretbox_xsalsa20poly1305_tweet_KEYBYTES -#define crypto_secretbox_xsalsa20poly1305_NONCEBYTES crypto_secretbox_xsalsa20poly1305_tweet_NONCEBYTES -#define crypto_secretbox_xsalsa20poly1305_ZEROBYTES crypto_secretbox_xsalsa20poly1305_tweet_ZEROBYTES -#define crypto_secretbox_xsalsa20poly1305_BOXZEROBYTES crypto_secretbox_xsalsa20poly1305_tweet_BOXZEROBYTES -#define crypto_secretbox_xsalsa20poly1305_VERSION crypto_secretbox_xsalsa20poly1305_tweet_VERSION -#define crypto_secretbox_xsalsa20poly1305_IMPLEMENTATION "crypto_secretbox/xsalsa20poly1305/tweet" -#define crypto_sign_PRIMITIVE "ed25519" -#define crypto_sign crypto_sign_ed25519 -#define crypto_sign_open crypto_sign_ed25519_open -#define crypto_sign_keypair crypto_sign_ed25519_keypair -#define crypto_sign_BYTES crypto_sign_ed25519_BYTES -#define crypto_sign_PUBLICKEYBYTES crypto_sign_ed25519_PUBLICKEYBYTES -#define crypto_sign_SECRETKEYBYTES crypto_sign_ed25519_SECRETKEYBYTES -#define crypto_sign_IMPLEMENTATION crypto_sign_ed25519_IMPLEMENTATION -#define crypto_sign_VERSION crypto_sign_ed25519_VERSION -#define crypto_sign_ed25519_tweet_BYTES 64 -#define crypto_sign_ed25519_tweet_PUBLICKEYBYTES 32 -#define crypto_sign_ed25519_tweet_SECRETKEYBYTES 64 -extern int crypto_sign_ed25519_tweet(unsigned char *,unsigned long long *,const unsigned char *,unsigned long long,const unsigned char *); -extern int crypto_sign_ed25519_tweet_open(unsigned char *,unsigned long long *,const unsigned char *,unsigned long long,const unsigned char *); -extern int crypto_sign_ed25519_tweet_keypair(unsigned char *,unsigned char *); -#define crypto_sign_ed25519_tweet_VERSION "-" -#define crypto_sign_ed25519 crypto_sign_ed25519_tweet -#define crypto_sign_ed25519_open crypto_sign_ed25519_tweet_open -#define crypto_sign_ed25519_keypair crypto_sign_ed25519_tweet_keypair -#define crypto_sign_ed25519_BYTES crypto_sign_ed25519_tweet_BYTES -#define crypto_sign_ed25519_PUBLICKEYBYTES crypto_sign_ed25519_tweet_PUBLICKEYBYTES -#define crypto_sign_ed25519_SECRETKEYBYTES crypto_sign_ed25519_tweet_SECRETKEYBYTES -#define crypto_sign_ed25519_VERSION crypto_sign_ed25519_tweet_VERSION -#define crypto_sign_ed25519_IMPLEMENTATION "crypto_sign/ed25519/tweet" -#define crypto_stream_PRIMITIVE "xsalsa20" -#define crypto_stream crypto_stream_xsalsa20 -#define crypto_stream_xor crypto_stream_xsalsa20_xor -#define crypto_stream_KEYBYTES crypto_stream_xsalsa20_KEYBYTES -#define crypto_stream_NONCEBYTES crypto_stream_xsalsa20_NONCEBYTES -#define crypto_stream_IMPLEMENTATION crypto_stream_xsalsa20_IMPLEMENTATION -#define crypto_stream_VERSION crypto_stream_xsalsa20_VERSION -#define crypto_stream_xsalsa20_tweet_KEYBYTES 32 -#define crypto_stream_xsalsa20_tweet_NONCEBYTES 24 -extern int crypto_stream_xsalsa20_tweet(unsigned char *,unsigned long long,const unsigned char *,const unsigned char *); -extern int crypto_stream_xsalsa20_tweet_xor(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *); -#define crypto_stream_xsalsa20_tweet_VERSION "-" -#define crypto_stream_xsalsa20 crypto_stream_xsalsa20_tweet -#define crypto_stream_xsalsa20_xor crypto_stream_xsalsa20_tweet_xor -#define crypto_stream_xsalsa20_KEYBYTES crypto_stream_xsalsa20_tweet_KEYBYTES -#define crypto_stream_xsalsa20_NONCEBYTES crypto_stream_xsalsa20_tweet_NONCEBYTES -#define crypto_stream_xsalsa20_VERSION crypto_stream_xsalsa20_tweet_VERSION -#define crypto_stream_xsalsa20_IMPLEMENTATION "crypto_stream/xsalsa20/tweet" -#define crypto_stream_salsa20_tweet_KEYBYTES 32 -#define crypto_stream_salsa20_tweet_NONCEBYTES 8 -extern int crypto_stream_salsa20_tweet(unsigned char *,unsigned long long,const unsigned char *,const unsigned char *); -extern int crypto_stream_salsa20_tweet_xor(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *); -#define crypto_stream_salsa20_tweet_VERSION "-" -#define crypto_stream_salsa20 crypto_stream_salsa20_tweet -#define crypto_stream_salsa20_xor crypto_stream_salsa20_tweet_xor -#define crypto_stream_salsa20_KEYBYTES crypto_stream_salsa20_tweet_KEYBYTES -#define crypto_stream_salsa20_NONCEBYTES crypto_stream_salsa20_tweet_NONCEBYTES -#define crypto_stream_salsa20_VERSION crypto_stream_salsa20_tweet_VERSION -#define crypto_stream_salsa20_IMPLEMENTATION "crypto_stream/salsa20/tweet" -#define crypto_verify_PRIMITIVE "16" -#define crypto_verify crypto_verify_16 -#define crypto_verify_BYTES crypto_verify_16_BYTES -#define crypto_verify_IMPLEMENTATION crypto_verify_16_IMPLEMENTATION -#define crypto_verify_VERSION crypto_verify_16_VERSION -#define crypto_verify_16_tweet_BYTES 16 -extern int crypto_verify_16_tweet(const unsigned char *,const unsigned char *); -#define crypto_verify_16_tweet_VERSION "-" -#define crypto_verify_16 crypto_verify_16_tweet -#define crypto_verify_16_BYTES crypto_verify_16_tweet_BYTES -#define crypto_verify_16_VERSION crypto_verify_16_tweet_VERSION -#define crypto_verify_16_IMPLEMENTATION "crypto_verify/16/tweet" -#define crypto_verify_32_tweet_BYTES 32 -extern int crypto_verify_32_tweet(const unsigned char *,const unsigned char *); -#define crypto_verify_32_tweet_VERSION "-" -#define crypto_verify_32 crypto_verify_32_tweet -#define crypto_verify_32_BYTES crypto_verify_32_tweet_BYTES -#define crypto_verify_32_VERSION crypto_verify_32_tweet_VERSION -#define crypto_verify_32_IMPLEMENTATION "crypto_verify/32/tweet" -#endif diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 106ce8c1d..ea82f24e0 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -2537,2264 +2537,264 @@ void *chainparams_commandline() { (2239000, uint256S("0x0000000a9a4283412f076a0e1d36e1e02571468ff12d06c0d075e1dfa569af8c")) (2240000, uint256S("0x00000008b78c49c1d514ce9cc583ec04c36023911ed7772d1cf0c50b5ce1f8c8")) (2241000, uint256S("0x0000000cbb3151b62023e1cafa4476d7bf2cf34c13229f3ba510053182133ef2")) - ,(int64_t) 1750938666, // time of last checkpointed block - (int64_t) 3149229, // total txs - (double) 1257 // txs in the last day before block 2241103 + // Generated at 1770775265 via hush3 util/checkpoints.pl by fekt + (2242000, uint256S("0x0000000639e7cdbae613ab8f4143277829306e7d57eeadcfcb7265f1e28ac363")) + (2243000, uint256S("0x000000029591085967e3ac15e0ddb5c243af07093dc64b5b1a1ca0dd95500d69")) + (2244000, uint256S("0x0000000a2c33d2169cd72cbd0b673b17a65fcf1d3a510571926931dc968a0bd5")) + (2245000, uint256S("0x0000000aa0c1ab8675cb813617e7be20cea64484d9e90e7bd0d7a2cb5bbef025")) + (2246000, uint256S("0x000000049e63d83725d69366566de1affaea381748af1e2e84ee5cc9746ca1e0")) + (2247000, uint256S("0x000000066e6ab0fdd0ea1fd278ae453d5c9f4c5cd806978078d27d4186b67e45")) + (2248000, uint256S("0x0000000579710a00611086a3728eedaed497864064fbb3bf794de98ce1b43b98")) + (2249000, uint256S("0x0000000c16fa58634e8208cd64166c400d7e4ad757d9862c718ad0eccba25c33")) + (2250000, uint256S("0x0000001216f31c7fa5ef2bab036c18a078948fcbdbf5dd911e5e97af52eeae2d")) + (2251000, uint256S("0x00000006ea7862dc07e9922bc9ad21ef3bcb84f21bcfe6291916d6b760a0396c")) + (2252000, uint256S("0x0000000299fff0555b47a150c838d020eb13dd5ffbdc807436fd7f719ef06fe3")) + (2253000, uint256S("0x00000009d9b4c1d13c241c9faeeac438234b1895f7a0bbbed63c893fc2b3b86f")) + (2254000, uint256S("0x00000004dc2c2dae3285eff8d35be7c8fe3e57ad05140e668856283c74c71397")) + (2255000, uint256S("0x00000009c680c9b81ff273b621ee012c01a0139f71ff5eaf984c859bd1a55c52")) + (2256000, uint256S("0x0000000417fb7913115f91212858f9228d5b78afa08047fa58e14d9a36f0b5a8")) + (2257000, uint256S("0x000000114d96462293431694f555603a2d69d389fc2d40fe71a543ad6b8fa325")) + (2258000, uint256S("0x000000091a5fe69e0a2e3fab2a7fddac80884a01a221c3165710984855757026")) + (2259000, uint256S("0x00000003b0556f0ce601334fa7a982d81e5a4bea90feaf919eaf2cd08b507537")) + (2260000, uint256S("0x00000003294c2abac4fd4d956c0fd73d9c1bd7839345ba7d20d36bb72ae4e9d1")) + (2261000, uint256S("0x00000007f6a5271e53c857ad37efb84f8d63692141c1b5764544061cecab100b")) + (2262000, uint256S("0x0000000ead64272e3253cc0ee075dd556ec246ea455d6c80dc969828ab78e4f1")) + (2263000, uint256S("0x00000006a201d947fe26455507ce6cf35a135900aea35bf2aa3d5fe6fc344b1d")) + (2264000, uint256S("0x00000009d531481ca86dd40ba1e5416c96599959dda7a14632c4c9b532174136")) + (2265000, uint256S("0x0000000d388dd0319ec85c05ef1f819c45fc38868e9f80574c6bc3f2bf81a4a8")) + (2266000, uint256S("0x0000000d34c42498f375a422192a0ab9cdf28aee1c44d6dbfb2fc39441119537")) + (2267000, uint256S("0x000000008b4f21882c9182c1589665789fa9e6e311453c432eb9a19921dc9c1a")) + (2268000, uint256S("0x00000009d28ff429d3bf68d9357085a6dbfd952d9ccaa2fc1bd75924a2b764a2")) + (2269000, uint256S("0x000000065a56a774057b6f0b0ec2e9a1e0ede8a08f8df07519aeb4301c003fc4")) + (2270000, uint256S("0x0000000755a887ab42cee733259c93643885c796294043d6de8044d5391caf0b")) + (2271000, uint256S("0x00000004504bedb66856a96d67fc47e64c893f78d6b925adf3b512fd6bc98a48")) + (2272000, uint256S("0x0000000f53bcebe9cebbe116e29d89a608b71baa2fa3d433406fc557d144fff2")) + (2273000, uint256S("0x00000001f0d38889e0af73dc4422ec20b016c4bc4f2bdab3f825c37b8e256f10")) + (2274000, uint256S("0x0000000716249b3c1c9f6b7a8b8151d434b60453240013aaa1298cd2e932593a")) + (2275000, uint256S("0x00000005ecbe534bac7f3ced474598e150aa10c187771e2997401f34d51f6836")) + (2276000, uint256S("0x00000008bffb4d2f238501dd83525892bfae42326c13047feef6a41a537b0a9b")) + (2277000, uint256S("0x0000000ac763c012cf2d166a8a9784476b79fbc5e69db968d713338c26d1f30c")) + (2278000, uint256S("0x0000000473e63c49ea5fdf470175d571e5748a832da5cc9f6680ffd8834b9037")) + (2279000, uint256S("0x00000003beac52f57577eb42d2f06f0b3a2aa9bb88d76c8e3995d58a3958d01b")) + (2280000, uint256S("0x00000005754bfb5612af3262ff220a463a6ea7ed7dcb8d836184faf36365a434")) + (2281000, uint256S("0x00000008f256c6045ba433caf815cdb242a74db23a89bbfdae133d4423179c28")) + (2282000, uint256S("0x00000001a1eb59850ffee3c0f36c801a5ebd81b3f5d4b16f7a96e8a1acae066b")) + (2283000, uint256S("0x000000072260f3107060f4b40a9b82ebfd91a8dba0abca95587c259a1d4ae328")) + (2284000, uint256S("0x00000002a885479848b027ad73a166500caa50fad66544a0781daa7ed7826dc8")) + (2285000, uint256S("0x000000040c21edb9da2f2bd20bb2c2783786f7df4b12bdcc19eb1dce05ff73a5")) + (2286000, uint256S("0x000000099bfba32ebdcab508849883dd81b403a2fea7627561a76b0ac07f1555")) + (2287000, uint256S("0x00000002fca8b551380eb723ee0fe28e8b7eed91c5b5b22b3d3683c8cc48dd98")) + (2288000, uint256S("0x000000017b0efd22434f55df1bd2376757c7180482934bf15ec5d11f5e9f1992")) + (2289000, uint256S("0x0000000914321c0aa24b5b7b60ca7375d0310dae5aae63aaddba1e2525a0ecfc")) + (2290000, uint256S("0x0000000bb0734a5cc744c3e88b07278f9f203ed54bdf37565ce0f0601785206e")) + (2291000, uint256S("0x00000000fd54f5abdb585e175fd116ca5d0e0fcf2609bbe3e3f50af5d838ee88")) + (2292000, uint256S("0x000000005b7071a15b4de9d8f64f2cf65488b492d53aa67b9a5b8793f11d552f")) + (2293000, uint256S("0x00000003e6f66db9958c013119417614600d734d2467946fe9ab67d29d15ae0c")) + (2294000, uint256S("0x00000004214e96e861cbb78b3c1e7af9abd8d56aa5b00d7c32bb513111d799fe")) + (2295000, uint256S("0x0000000998eebea807d9e087387ada8ef687186f02d2624f9ccfcc85dd5995c4")) + (2296000, uint256S("0x0000000bef492694462982457b713f8dce25f95ea2378872fbe2116af13c8d55")) + (2297000, uint256S("0x00000000d9c08bd584313e17567a228ebc0ea479c4401b06a740288ecb781589")) + (2298000, uint256S("0x00000004e35011dfb889c1e7214cea14031b2824ec912ab62423ecd2e6617ac1")) + (2299000, uint256S("0x000000081394cfdb51ba39b46194acc02e3ff6dd3229c2a02f89cf17903feaa1")) + (2300000, uint256S("0x00000008dacdcb3d3a401067163d70a11fcd241b143ff8b0840bceb1b1f2c669")) + (2301000, uint256S("0x000000083e30d9978047e3d9e65eddca355bbc26cd26906e09771501a9c69e21")) + (2302000, uint256S("0x0000000e787f0468f6881c48e89ee3c076faef612970bdcbd6e9c65ebb7cb380")) + (2303000, uint256S("0x0000000de9ac20b90f78d0783303c1f54636784e03e8bc91d10e793909fef451")) + (2304000, uint256S("0x00000000c19cb2dc191eb0937b7846798fa7393abd2a0ca39b1466ff968145bb")) + (2305000, uint256S("0x00000002ac9d5106314df167dfcd1779c66f10c08d613c437bda41d589c68ebd")) + (2306000, uint256S("0x000000089e79082de3ef208f3a7c9a7d8126602ad0aea06512b5e4c6d9e86bd1")) + (2307000, uint256S("0x000000084daa98547641d141f1e9ee313810804439cb7d7111a95e7d82e370f3")) + (2308000, uint256S("0x00000001ffd8ed775d2f14b794d6e9a47323d30b237bfc903273883eb1b48745")) + (2309000, uint256S("0x000000047ef844bb25a8d4b49f0e3c997c8431c9d57d0debfb9cb1e16be89b9c")) + (2310000, uint256S("0x00000002b5a2ca8cfb6f791d6663bda64122e3bb5133ae59ebedc6cd8926b87f")) + (2311000, uint256S("0x0000000c72bdc140f18e35f6b109062402f2798a1d5b0636d54419ecfb586a99")) + (2312000, uint256S("0x00000000233b17ac0a2ceaf343d4863838ea4d7fdb618e41afc7ccdefeae2e09")) + (2313000, uint256S("0x000000031211ad2eed2d3e95f237a4fde885e21de1bada6a4fd2122b3ae71604")) + (2314000, uint256S("0x00000009ca80b54724e7b7d28fc33fada3a60c8703dbaaeecab537678042f310")) + (2315000, uint256S("0x00000003ecae670118772edb796689bddc895349d730684300e2243fb2fa7510")) + (2316000, uint256S("0x00000007e80b508932e11bcf260357fc8a4e3a50316c62425a5ecfbb5b01ccb8")) + (2317000, uint256S("0x0000000ad43f486f843f0177034db1ef1c08dec70123287d910cf56e6d5b14f7")) + (2318000, uint256S("0x0000000a2f5052ac8eaf9f53025c18578de3dbe7ecd8db270333570396d93044")) + (2319000, uint256S("0x00000002f2f36fd4d9fea75a767b261c185d50f578751ffa4b2d7c273a59f1a7")) + (2320000, uint256S("0x0000000259d0ea601415d7a59a06991e001b47d2d197ad8a4a58125c6b3f3f04")) + (2321000, uint256S("0x000000098c80088890af1930f94a8b7c7c556b6b47b769e9100f614b1fe5a957")) + (2322000, uint256S("0x000000006a9bbbb21c6e9ba32d32bec96117706f5c9c736701daa01aa3bb65d7")) + (2323000, uint256S("0x000000067663943e10e690018643704b95e5031a5fceb659d6c72b518e0c4dfe")) + (2324000, uint256S("0x000000011e12b07f3b5a93434c15793f5bbf64e2db3acae92d3eb0993386bf96")) + (2325000, uint256S("0x000000053dccfe554a790cd5c7b4485f4ea097e4a1a68fd9b0e78d4a0ac08bdd")) + (2326000, uint256S("0x00000006a0081de5dfc28881060a163f56dffcbc48d4e764213a9dc0dca8532f")) + (2327000, uint256S("0x000000007bff982e79a35899593205a70e6d7099a19706de5728ee5fad7755ad")) + (2328000, uint256S("0x000000093f59936b67b0ec3f1a61da027295d7e923f766f4dac33548859d0b0d")) + (2329000, uint256S("0x00000004df29ea3989c84b2d7b74681d61999ff2f1e87ec799e7b98229b3db0a")) + (2330000, uint256S("0x000000069d7a77bb701913872d2cc97b41a84a087b08c5e6dcf000d436c85a20")) + (2331000, uint256S("0x000000000f05f07b3c2e56dcd2618884723febbe1765269fb0e98c8899e49e07")) + (2332000, uint256S("0x00000005982e9df1997abcd844365f2cd3ede939bc8cb023d102982be6614226")) + (2333000, uint256S("0x000000093afd87436be409bc555ec93eb8861f50c763f8570e47ce9a9a82caeb")) + (2334000, uint256S("0x000000025ce4aacc79ece1ca1cf3aed8aff7f5b1e78e0eb8add39285b5df6b3b")) + (2335000, uint256S("0x000000014acafd5d9e56123a0db996387a29b391cd30214508b84e5b26f5854f")) + (2336000, uint256S("0x0000000a0fcca3616f1f000e933950022f10a81c81a9e9983d2ef520ed4eabf2")) + (2337000, uint256S("0x0000000c4f37c3365ac1e28572bafe57707c85b38ebb57cab504f24d043a7ebf")) + (2338000, uint256S("0x0000000247719db4d03113c8217786cee9426bb03efc19bdb2020c2fb7a366ad")) + (2339000, uint256S("0x0000000a3327ea10710a6d3fa3bd4ecf434e8996ccd21d858b25d155b98a51b5")) + (2340000, uint256S("0x00000001d19589c45214b3725e8c4a9e43b9325755b4f61ab6a0711080e06da1")) + (2341000, uint256S("0x000000075cb96b2f4c59a7bf1c0a0b8b40e20bccd4bb66210999781084d13686")) + (2342000, uint256S("0x00000004ac932402460fdefd936920d192087bf766f2ae4d20fbba5c020912a3")) + (2343000, uint256S("0x00000003666efdc6d42e9340774f635ec8e74756d15fe80c38f40580efffe838")) + (2344000, uint256S("0x0000000260938f2cf2878e655ebeccff6d6c7301bafcb2b0cdfc3de1ee083c05")) + (2345000, uint256S("0x0000000ac89e24d6fb2078bc7325801ddd76d135dd713c9a739487f9e420d0ad")) + (2346000, uint256S("0x000000082c9fb3dc3be388368e8c3442549272b042888fe928050031e30854fb")) + (2347000, uint256S("0x0000000604bc997abe0401c77779bbe8bc482250d659bf62c9fdee52f627a76f")) + (2348000, uint256S("0x00000002333549099296b383e860096eb44640df650b4759555a2d98a9414593")) + (2349000, uint256S("0x0000000e203eda98ca80405e7b8c6b30118a63391c4674c6735bade051d9b0f2")) + (2350000, uint256S("0x0000000333e26521cd152f6b1b00bb1b5b64f3379cf1deddfa34de11036d5ae1")) + (2351000, uint256S("0x00000014ab83e4a23aa9de6aa076c6d4704c2447f15cb51d81ddf28da5bfab30")) + (2352000, uint256S("0x000000076c8c96e233a91bd2229a12ba9ff4fcb0460f5e024fa768932788577b")) + (2353000, uint256S("0x0000001575b8953953ddf0dbc2fc77ee4658b4f679225aa95a92c85dc09b3e9f")) + (2354000, uint256S("0x00000006a9539950e2761aa3cdded393544177aef5c3b7cc0a43f054d63049d9")) + (2355000, uint256S("0x00000007f031a38d945ed7c6f2ccf4c769072ee0dc564a93358b3a61111363a8")) + (2356000, uint256S("0x00000003be043922843b7c4a67fa5ec66616eb7138da0a56745de08fd43d4ef1")) + (2357000, uint256S("0x000000009a348a80a3663ff3e1b9754835eb6501041e3638b4bbefbed8c17b3b")) + (2358000, uint256S("0x0000000616cd52386d0a7642375901d198bbed1c941aa59629a93e3e3ffeb7f3")) + (2359000, uint256S("0x0000000276e51ab7c5d886aacc655545abeb89b6069f2e7dc5feffc688361771")) + (2360000, uint256S("0x0000000b3a89bc3bbceb90fb7a622f34e4cbbfcfaae5aaeeab1631fbf0b2ce30")) + (2361000, uint256S("0x00000002108b1dab8c041854535acf21e13eaabd838448b65535a0888eecdae2")) + (2362000, uint256S("0x0000000fe1fc5361a67a6d2b576ab7fe9cff35dae981c82309e864a34f954a3d")) + (2363000, uint256S("0x00000009f9f8806d4339889957992f4652316d95cfabbeddd0be98b99bafe151")) + (2364000, uint256S("0x0000000ddb833e67482bff99fe170a8e0f5679b5b09484548661b8bce6d44806")) + (2365000, uint256S("0x00000003a4b9c250bcd72a86a4b44b5791f22545f6fa5964979af5a0e7592b88")) + (2366000, uint256S("0x000000074c66d7eddab4c8d6415f7700b2848e8fde7c428d154508ff30be41b2")) + (2367000, uint256S("0x00000000574e376e7a84a61014fb1a1ec879f14f22510d6b14b0e6c5087c6ab6")) + (2368000, uint256S("0x00000005aeb467a9c14db403f5e0fb28e056d0b9696dcf43a881127063d26004")) + (2369000, uint256S("0x0000000c1984972effd09b1533e1a43d78e2d3970e9a64fd2ad7950870af2449")) + (2370000, uint256S("0x0000000b76c128306c54781fffb7c5b51738c018db4539410aa83fb2ee9aa0ff")) + (2371000, uint256S("0x0000000cf6b75c2335426dcccdcb0dff6cc8073c541cfdb8a21a0793edb52673")) + (2372000, uint256S("0x00000001cb78bc7fe496f10e6f1af9a30fae91134ae04c5122ffe3669ead8278")) + (2373000, uint256S("0x0000000ab1049753c09c60da546af24753016122d8afa62e844c5108d42b2884")) + (2374000, uint256S("0x00000005913fc8737b9a0fac196c6ee13d24719778a1ad1b53a8221401835b01")) + (2375000, uint256S("0x00000001334ccaded3f79c44ab9390501e8be08a51c2e880f38fcbb1e3110203")) + (2376000, uint256S("0x0000000d7b4c9c9feaf32c8e93bbc83cf6171b287c67dbd72c409b3a63f5cd1b")) + (2377000, uint256S("0x0000000b4c2126e33bb3034308c9a5d0f85bca7f84856b8943987b0001406760")) + (2378000, uint256S("0x000000078d8ffc3c0a21dde272da7dc7b6f8a7302e354304e60b677a6b00d0f4")) + (2379000, uint256S("0x00000003e2393be31c4f74be209889ea7febd7211cf4cf4ff1f05353a40f3444")) + (2380000, uint256S("0x0000000a6199ce2413ecf5da52ff07e9ce34266ae865c791e67fc5381d94e31a")) + (2381000, uint256S("0x000000133580fea19341139849e793182dd14b8a87c891cbdf7fa934eef366af")) + (2382000, uint256S("0x0000000a362398c94d539654f0cec4bb0290ddbf1e722c43daa135831a8371ec")) + (2383000, uint256S("0x0000001681c98df5ffbb0380c3b2a9280be30c0c089f7798d363fcdcbc3729fb")) + (2384000, uint256S("0x000000023ed0b5aa2ecb122b145723841bd200ca77e5a3b2eb8d5d2674e29f50")) + (2385000, uint256S("0x0000001122c91873c493dc06a4be6196a1b024ed3d912c62adcb74b8179f2616")) + (2386000, uint256S("0x00000012da2a63050c90e15bc394f99c29f5d13032b8873fdea5349d5239a876")) + (2387000, uint256S("0x00000017524b7564b3dda21b33865a0aa71a005dcc54fc0c26714523b4592936")) + (2388000, uint256S("0x0000001573b88b76d1ff5acbdab4fec529bd1474c93ffc000e4787d6ee6aab0e")) + (2389000, uint256S("0x0000000c5f1b6d93ea8340a9981db9caa911616e1070ad5ced4ac923d578614e")) + (2390000, uint256S("0x0000001a89ccde9e6d5a64ecebf3881eb7541095e4ed1cf4abe724150e9b0888")) + (2391000, uint256S("0x00000011158d59a051bb16c9fc106187af5d703a169ccdd3c74ab6819ec63030")) + (2392000, uint256S("0x0000000bb7bb7200a959cbcd491256b8f4092f614c8bbc3369cdbf26d1a04007")) + (2393000, uint256S("0x000000121c6afd403c6e1734f3061d55b5fa3d84d64adfef996bdf1561e8882e")) + (2394000, uint256S("0x0000001703894e914b6017b16407fc54920315e596b1c343e23a3086831304e7")) + (2395000, uint256S("0x00000021b87e7d3b6936585753fc602b26c486a8cbeb51eb9dbccfa3d77bb9df")) + (2396000, uint256S("0x00000000f0d7649f90b9f46ef80a6c2f81e57ee3a60a7bcc643f8d6900cb96b0")) + (2397000, uint256S("0x0000001cd9e74310fb55624d217ed45087ee321cdcd5b46ba52443a2690b8e99")) + (2398000, uint256S("0x0000000ac0eeec2cb91208100df8678dd5cd4953f0e8f86d21df99ab87ed65eb")) + (2399000, uint256S("0x0000001e0568c23d3d8dacad2fc54238dfb52503a018e7d0766f06b05a7440ec")) + (2400000, uint256S("0x00000004c33d57974f87f1b5cd202509db56360af1c170bf686f7714f9f73324")) + (2401000, uint256S("0x0000002272da4b06574766adabf95319c281dfd328288063f6e59fdd98beb785")) + (2402000, uint256S("0x00000018cc0fb3f36d3bb6dc4fc2f030b24f703580a4f4360ab79908620b9587")) + (2403000, uint256S("0x0000001785d88ee1b65d19d93cb814c4bc88695cec5e1d13502ffec51887b3a8")) + (2404000, uint256S("0x0000001cf81afe69cc610aa7cbe42b9019e04bf4559f082bd03e59b22aec46e3")) + (2405000, uint256S("0x0000004aecdf618131f43cdc4961d0db4b3f8629c3ece616c60cd61b464cda38")) + (2406000, uint256S("0x0000000c8b0d57ff78146e9393f2ce3049748f8b89506044e6c43843d462b9df")) + (2407000, uint256S("0x0000001f8b59995fb2365cafa67f041645b1051fa72178a53e0268e0bbab9225")) + (2408000, uint256S("0x00000014bde74285472809047ae9a06b7c07eb4d3251e493711a48b94ec6e72f")) + (2409000, uint256S("0x0000001c744ee89ee28a5cc592b03d2da631c7b5e0000acff440e450cc98b8e3")) + (2410000, uint256S("0x0000000ef5c6dda30a1327c59ebb1e27bc745f208a649fd0bbd088c596d34b3d")) + (2411000, uint256S("0x0000002bdfab534da2bc4b80321939c4d1e19fd6bf4990b820e5249617155f04")) + (2412000, uint256S("0x00000009904671edd0057296289df3a34776c45f207ff49d503594a37890b8b4")) + (2413000, uint256S("0x00000020ee19598e2f5c7f195eec914521d9ab428d5d518e921d0c61cdc32771")) + (2414000, uint256S("0x0000000c267badaad0ebe4b5f1acbac66e609102b323128077e77dafe35c8ca1")) + (2415000, uint256S("0x00000029b7f47de4a0dbafb1a8d27841b75441fe767923c6597bfed58f250a5c")) + (2416000, uint256S("0x00000014774cca430950e4f6619523f7c1c07f6497645c71f8f82034b51cfb46")) + (2417000, uint256S("0x0000000b3c660fc5d97acae714738aa3fcc45b7714bf30ae729fc7dd7f8c3ea9")) + (2418000, uint256S("0x00000008e8f0b1ed6ba90f8fe5ee5269f1d5358cbe4cc5f87bb5a2e41e074131")) + (2419000, uint256S("0x0000000381790101d01091cbc4fe3f290357aec4f855aeceef3778e29007c6f3")) + (2420000, uint256S("0x00000000ab4b5d141c5ad361261b67b663eeeea6e2565660cc88c573f2312d85")) + (2421000, uint256S("0x0000000bbc516d3681b065efd2ae3c7e8e73b8c297aa0b4e1cf8c5e758d4b533")) + (2422000, uint256S("0x00000010e0561d60597cdb9226a25dab0be82e892a8e7c2625793aaf9cfb68f4")) + (2423000, uint256S("0x0000001e1b41fb434a2c76604dfe2e7a2e5c37c3ecd7be57e49f37f002525bf1")) + (2424000, uint256S("0x00000018aeb17128908df8e9c012c2be3fc68508e07d9e9fb8b8ffffdaded01f")) + (2425000, uint256S("0x0000000dc75823ec02f685d3d5159982d6cacc02b950d422aebb85894d7e8714")) + (2426000, uint256S("0x0000001a1385d1b1ad6b2bee9f43f3216b2d2c1665d804d86e04ce51ffa7b718")) + (2427000, uint256S("0x00000010e5ba371753aa929c28ff69577312660992f270cebf812e8c3cfd118d")) + (2428000, uint256S("0x000000100cec9e616d3120ea998736782ede8ea24fff63d93cca85202969a9c0")) + (2429000, uint256S("0x0000000bfad3f44cdf9c319b777f2c09127bc79d5648f470e2126ec257f1cf32")) + (2430000, uint256S("0x0000001660faa3feaa525793143cd6064a45897951cbf206bddbe97f315f9082")) + (2431000, uint256S("0x000000031ec6ba4d2d6e5d6dec303e8cc504ce14a637c2f16990eee11e5e6dd1")) + (2432000, uint256S("0x000000099b32f36d03ef0d1a7b7f8521b079e619ba1963926d0a806fd6795a18")) + (2433000, uint256S("0x00000004ad7c00f6699e5f3c0642cd750acd544fd68b41d57f4d5c83113c2cb7")) + (2434000, uint256S("0x0000000bf1f9c3a02935f792f4dfe6f5c47d44e55d8c62591295bf9d7f7c04ff")) + (2435000, uint256S("0x0000000417c243bb7565ceaa22879984d6f5bc41637a21ddcabdc7bd477f6a5a")) + (2436000, uint256S("0x000000057d5cc62dc187782d7b2d8d69f248446e29bf4b08360f139e42a71d5e")) + (2437000, uint256S("0x00000008774b957cf2636b3fc40e62b9253b5fe03d96dbd755a5a0b786ed396c")) + (2438000, uint256S("0x00000000b5cf66004092272b3667254971fec72c9b5c339f919c017a5a639e88")) + (2439000, uint256S("0x00000003b811ae0242020aa61a36863d4ac4b4b34d5a7b762df371a368a64780")) + (2440000, uint256S("0x0000000fa7c64437272d1536e0c36844f1201ee659b57c76f366df21e93dedb8")) + (2441000, uint256S("0x0000000c6899ae843c752c7700602059dc26bda6a7172ffc420c70c268e319b9")) + (2442000, uint256S("0x0000000d9d3812d8b04b033654d6fdf7df57e39fe0026eccc65e665bbaa64937")) + (2443000, uint256S("0x0000001d9c8c3ec02fa1f6826efd27abe01ea12880d79464372980d9760f4a80")) + (2444000, uint256S("0x00000014463dcf9fed98125822cc62b1928ab8d114fcc32bde2022d87f2881ad")) + (2445000, uint256S("0x0000000a5eb8e26589b0def3d1ed38fb9e2cf2efb47bd1b5ead36fd95400a9ad")) + (2446000, uint256S("0x00000005321a7ba69447cd2db149a195b81568c729219b08fcc96acc5400b09b")) + (2447000, uint256S("0x0000002658b3050e401408b6710a88a31a2ae0e32509f86c45200ce0657744d3")) + (2448000, uint256S("0x000000129f699381a1c6499bf4c81f6db9ff42a3c414586c107ecaccebd18f7e")) + (2449000, uint256S("0x0000000e93568a1a125bb70f6aaf88c65f5856a93f25e5c1eaa955edf4367aec")) + (2450000, uint256S("0x0000001aca22e92d2770641a570042ace83cc3b7b415942bb2ec98c27cd9e459")) + (2451000, uint256S("0x0000000eed036b68450f543f15fd5611b5d58b68073663554ab7df1f6d64bc63")) + (2452000, uint256S("0x00000002e7da7ab67e2d9f9e0811e4ff2d9c769afdda0e6b17305ee54c49c793")) + (2453000, uint256S("0x00000013a10a505ff6e2cecd98b2a777798ab485329b3b8a1aaadfdc9233f55a")) + (2454000, uint256S("0x00000011f8c0335e57260893e9a7a07b51e618495de1e714e41f5f8f8b44dce2")) + (2455000, uint256S("0x0000001a7252f733c5ef7b4a155b45d2804d7d58669ce2adec862c2073497414")) + (2456000, uint256S("0x00000005b0ec55d9ba788dbe457ce7de6fdab98e9f2b64c473f984b5226e14d7")) + (2457000, uint256S("0x0000000325912c30f1e85d411646d69ec610a6a7b51a3270c50dd4e322d5e302")) + (2458000, uint256S("0x000000198faebde0185f47503f36118699417576ff0cd5ab0286c2cddaf0a183")) + (2459000, uint256S("0x0000002679ead0750187cb00db36d00f9736225a346c6588bd95c6616a0475b9")) + (2460000, uint256S("0x0000001505d4ab140748a4a66c3535c1f139011261e934de44c5e8320a302241")) + (2461000, uint256S("0x0000000736c8db1f4355f5bbda3a05a2250f5715868b1b2c62bc987ed384169f")) + (2462000, uint256S("0x0000002f8f8312c535fb968a490f8036c7c63f3417b4d02513c1ffc8c6d316fa")) + (2463000, uint256S("0x0000003aef7b6267c6801dba00e8485370b0ea238c327f91ce2ff9dc38e8b8ef")) + (2464000, uint256S("0x00000013b494f4cab732933bfaa20eb9e6ea9c38fd155014aeb836d4e3d91af7")) + (2465000, uint256S("0x0000000fac738877a3e20fb26b5dd037ad8a263c8b695fac6df67961f8914ca7")) + (2466000, uint256S("0x0000000b042ae9b4a1763442cbf257d6401a2ec99b8e2b6b932ac1d036ed7587")) + (2467000, uint256S("0x000000242dcadd23d522d6d616a5436dc0b95e4b63df5fa42dafc49288f75a9a")) + (2468000, uint256S("0x0000001fe4f46d86fb48a2f89a51fd2dbc3f1f408794c0fbbcb8eb03405e914a")) + (2469000, uint256S("0x0000001e8d28d5cebdb409e3df5a6250c091e0065913886f85d95517a701d370")) + (2470000, uint256S("0x000000060520ac869929774283ce90ae49bd58ed35c4160185371c056cde2145")) + (2471000, uint256S("0x00000011941386845826e8c5f43f858d88ab7cb70986cde448ca56db7791da01")) + (2472000, uint256S("0x000000059d0a0318f6ff35b9e6ce41402826da0828b1fc6fbeb77eb35254482d")) + (2473000, uint256S("0x0000000e6bc0696f5a8c7244801254c5195ab22639507a037f763470c21be489")) + (2474000, uint256S("0x0000001b7704c883122cab125975b3a6ceaaacd75bf68987abcc2fe16ec29964")) + (2475000, uint256S("0x00000007c1222eacb83c0d0f168707d60d03bb0e02c3e6fade1298996b127a44")) + (2476000, uint256S("0x0000001b37e571df0f9bfd6bb9edbdedf32a00930a9b03f934015ad4f654d5cb")) + (2477000, uint256S("0x000000250b85d9d1e6877ca38bc72cf457ba61f95958f662a7a65ed30668cdcf")) + (2478000, uint256S("0x0000002ad081046fdbe3b328aa983c5ec5520bd108e612ec43d87f5b591e5144")) + (2479000, uint256S("0x00000012951e3a6292344e7f5a723026dec9be2a6a5dc741f45909a374681225")) + (2480000, uint256S("0x0000002635a970c4a26735bf36d04fd75be1ee269e2743ce464f132d7b449b06")) + (2481000, uint256S("0x00000003117b7bee1f32f1709c246b9aef9a9e631dfde8f4e110075c4935571d")) + (2482000, uint256S("0x0000001c7e64f8c2ed87917e72ba8e70a7a05a3bcd3943a6ec294c7cacd8cf4d")) + (2483000, uint256S("0x00000003916a9b3cacd51c2a801d0f84b5a8454edff6f24c6c18df5eb5306f4a")) + (2484000, uint256S("0x00000019533ddfd4f866f6b7b5b08d8dd55c57ee98ebe1beb9dc59ca5d125fd0")) + (2485000, uint256S("0x0000000649fe5a6fb447c57d1ee176d96083a282f677cc6d6f752f875a93fb68")) + (2486000, uint256S("0x000000187188a82f6a0541ad820cdf9e78623a807363682ece6ff2265bcf6e0e")) + (2487000, uint256S("0x00000001eac13b490d7c1af69df0304b07049d167fbb2ead7deee8bbb29d8af3")) + (2488000, uint256S("0x0000000a5edd28bf92b92f2dbfe506cebd94ce9489d8660da5e03b0d60d4af56")) + (2489000, uint256S("0x000000145ed0bdbd0de255d580458ef63f325ad8218383b085a4c897c618b405")) + (2490000, uint256S("0x000000152414e803b4dfbdfba88c723bd4d019b6d1bd75ae7d0558e9f89031b8")) + (2491000, uint256S("0x0000000003809be736caa5623a8b35cab3e47eef08978e2cf704becd25ecc930")) + (2492000, uint256S("0x000000071f812b04876f39ee8f40a3eb27db146955f1d6d9e9c32a88603e6a4a")) + (2493000, uint256S("0x0000000bfa0994063148280c8857506a17ef3c83de44e1f711b62cf0858bc743")) + ,(int64_t) 1770722878, // time of last checkpointed block + (int64_t) 3423685, // total txs + (double) 1243 // txs in the last day before block 2493626 }; // END HUSH mainnet checkpoint data - } else if (strcmp(SMART_CHAIN_SYMBOL,"DRAGONX") == 0) { - checkpointData = //(Checkpoints::CCheckpointData) - { - boost::assign::map_list_of - // Generated at 1686858269 via hush3 util/checkpoints.pl by Duke Leto - (1000, uint256S("0x000bffdae30339fad4ed82a2d2bfc0846f12fb9aeef5e33bb563f4cdd376dc08")) - (2000, uint256S("0x0003578c68350c7afacdc940c87ea9255681a135a0a9b2c13a075485d96155ed")) - (3000, uint256S("0x0001fef5443794fe61e0d397897f0a45a66c5473a70819608504f1395aed1d8c")) - (4000, uint256S("0x000197510698c8fc50133971744d1dd49aae371366d3986c412a189e9c617974")) - (5000, uint256S("0x00000094754d610b08b801545dbdbf57433e7c4d2a48818ff499f8fab05b0927")) - (6000, uint256S("0x0002116377d2d0c04344f0ed7eec63814b54bae740562ccede0c3d9404900cdb")) - (7000, uint256S("0x0001c74d83479bf05a3d9181555ff4ed373a642b1b4cb9cc633c090a522c10e0")) - (8000, uint256S("0x00011c3cd9aeadb039ba28547f232391ded0329ab6b7ec454aeb671246c94b58")) - (9000, uint256S("0x00005b1b0187ba523b6670e65262d1b028a140582301c7ea65065cd47a679c6d")) - (10000, uint256S("0x0000f32ac2bd4581ef4b651f72b27d92dfca04d4dc721c505214f113e209b10e")) - (11000, uint256S("0x000086e271117d75ac85fd00fbec94bbc53a5b990ccb362a8a2f064a97cdf7b2")) - (12000, uint256S("0x000098431effc021e44f867cffa2e309d7bbcc34201ea8d3bc7b08faeca556e3")) - (13000, uint256S("0x000194c6d37ebd00f7746536a7f3a891866954c1020f61be5573b055ea991fa1")) - (14000, uint256S("0x0001102d2b0c1efe8c07768b3bd540e8b2ef8c03e2f8271a58def634a51c576f")) - (15000, uint256S("0x0000c616068d8730adbd87b2bc9d4d5322610e52da6806b9cb2f1894af37d933")) - (16000, uint256S("0x0000049f6a5818a48aafb52781f91f8eca4d05c29c537a85c34b6fa342996a27")) - (17000, uint256S("0x000079bf17272dc67ca18df9f7c5b817c37bd2d103ee76d3b2271511c5aa0b82")) - (18000, uint256S("0x00005f4d742dc1b0e12200c4da8080d75973b18b6d2bdf748f149be72a313627")) - (19000, uint256S("0x0000368eaee2a6f22d64c66c0e3cfc7fe2709f7ced31a589ac8b4c461eca2fff")) - (20000, uint256S("0x0001b4057aebdc835c63dfb581235d5917af697fff962ecfe47e8a26c0b3ac55")) - (21000, uint256S("0x00010a339a0830471d384741ff24161252fdfab8ecfb493b6e8d1f1e7ce342b7")) - (22000, uint256S("0x000013c834a72926969cf8ed88b79175aa3ea952e67b7054c4fa06cc4e5209c4")) - (23000, uint256S("0x0000386a639d79d35972576b55787a80986a27c7415949dc645dc50522f6487a")) - (24000, uint256S("0x000075055db90559920ac02c2de8e1622533b7532b84fe702baf05082161e011")) - (25000, uint256S("0x0001b866113317839d2f6fa608f98f798db1570b4f84e36789126edda9b75d35")) - (26000, uint256S("0x00012ce8394b99c4fff5c052a0abb142c8c1eaa58b830699222a8eacb95298af")) - (27000, uint256S("0x000058bbe34298518632e0522d3ba10e050a5a31e2c4fd862a576f300e9f5c1d")) - (28000, uint256S("0x000163c608d28f1c3a10f8425b5469099b7fff50e25424659887e011d2c0281e")) - (29000, uint256S("0x0000c3baca291f20849d96de3436dad0efc24aa5b44bbdd466ea841b28d70a2e")) - (30000, uint256S("0x000075d2e08eafd62f4633cc1cabf281de17e7e0bba7965db75f3cf268b9a980")) - (31000, uint256S("0x00010cc563eef842749ea14412e922bad6e3515c049f639612a07b221aff4de2")) - (32000, uint256S("0x000150dee2380f76bb144f8c5433bd27e049c54feaaeadeb8bfc3948293453a9")) - (33000, uint256S("0x0000ec245f9808c6792915ae2a467593a1675efce42a2d0ee486e091913159d8")) - (34000, uint256S("0x000166dbcd4f262032e7a981207ac709f7be88a037650ca454db43018286c8f8")) - (35000, uint256S("0x0001a5c13dd9333a4ec60bc6af488ef7e3738aaf2170c70b716a30597b8e2d70")) - (36000, uint256S("0x00018e4fe65c96f0e187c265fa3faa49156ad07991284920beaef3b3b499dcbe")) - (37000, uint256S("0x00017e952f47ea070893b41a76468fee7db3073184eab10c960e2aead6fddf7e")) - (38000, uint256S("0x00010e3c64c0127fb995ab10d45bb281e5c78239c0303c825d81bb4cf994c7c0")) - (39000, uint256S("0x0001db8de504639d87029c9be04acdfef038601af58ea38ba307a7cc0ce8fdf7")) - (40000, uint256S("0x00015fc2f6953e67578c6484c3a5342d883fd3ef051456edc55064e544f04df2")) - (41000, uint256S("0x000200e23bc81ee9e9a9b29eb9c478c035d52de845c118a1645a3876d0f0f7ec")) - (42000, uint256S("0x00018b8b952e0268ee7007ca2bfe3499f1c78911e5d308d877aa3829a8ddfa95")) - (43000, uint256S("0x00005cc6dc81cdd3ad3c1bc5675064b8d6d01ac85348c116f4db28c61df5cb52")) - (44000, uint256S("0x0002a71c4a45353eeed81519d1f4b78e4be13702907bc872fd605c094eb5c8fe")) - (45000, uint256S("0x00005c3e9bdb78fa205f39a6f4fff5c547775ee90e79fedebecb17336c03e868")) - (46000, uint256S("0x00024017e7985c841e8b607624f74f3efe46f915d272f9f8c07a93353858d92b")) - (47000, uint256S("0x0000d29c58bb338aa55bb017d8fbbe3b7c3bed83f212094a18ef7fde7f8eb675")) - (48000, uint256S("0x00024b1c2d6131f7ec9748c763c3168d2d761c7617e10d09fb93aff2b4a29ca3")) - (49000, uint256S("0x000120f81110878ca7ec75d155badf2348bda20a9034b24b8317ba0f16568788")) - (50000, uint256S("0x000207bddb3ebb7cb8000f84e63ae7be40e74dde52c8bfa4f0cc913b048e5767")) - (51000, uint256S("0x0001c8554ac45a19684c7328056420d7b27c1c5c9f03059c095ca4a2749b29f4")) - (52000, uint256S("0x000104d93b769e9e7190b031f6250445b05750a36231f8ea7f2dce8c8a0487be")) - (53000, uint256S("0x00002ab5a1e72ef163242f4be6a26063f26cef6f1eccb4cfe44a099ba710fdc4")) - (54000, uint256S("0x000117645f0ee76f12601abe5554729ca9241c65e49cbefae77e67d18204795f")) - (55000, uint256S("0x0000ab7cf81435f26f56b9687b8f6feaaed95ed8090a1dac8a690a39b9a89c8b")) - (56000, uint256S("0x000134d8809fb2222a3ed76958f998589ac69d6d08d534309ecf569b6d448cb3")) - (57000, uint256S("0x00003daaec8c3d9c31b32163cef47c4883ad9b12b85a641eefbd02b06c4b6083")) - (58000, uint256S("0x000096456c3f1af39489df84dbf0a0975c9cc29fa1f524e72cf4421fd6465b82")) - (59000, uint256S("0x00016202a3cdcb3b0c27e75f84cebcf576bc7869abf0fab13c68abd3b111fb9e")) - (60000, uint256S("0x000071cd818c3fa9f155ec8ac65333f43e0d86b4f6ea98fc702ae0fe1ec3126f")) - (61000, uint256S("0x0000d1654355ba77105cc07e7cf024e0200f39646ea3cbf816737e621857ff36")) - (62000, uint256S("0x0000f1e6a09effa09329175ee4d8b42fdae3c365f1232fd440d0d41b6c090dc9")) - (63000, uint256S("0x0000ffbceee7b86cb04a37fefeb0452de8305aef4c37b6bfa84cffe4dba168be")) - (64000, uint256S("0x00002db24701b3d6c0d7547c1636b0aae754c050915ba607da1022e859bf0a07")) - (65000, uint256S("0x000102bfa6361b71cc51e231b87c653dfd21a865284fe013d65bac8fb2d96878")) - (66000, uint256S("0x000061e9bf36f9b2d110d7d545d9fa1deaaf39ce91d2d5e3f51b5e8eec37d820")) - (67000, uint256S("0x00000128e4528bae30aae739e7d1d1528e366739878878bdec5e5d5f5639de21")) - (68000, uint256S("0x0000c45a027fe81eb60c60573bffa4558b3d187f7144131eff0b97fc52d8fbcf")) - (69000, uint256S("0x00005fc22d9c90e1c88c5724ea8b45d2b198bd03d77931c4d328e88313d9080e")) - (70000, uint256S("0x0000bbfd71d248074239456adf756eff007bcbe004b8c02eed8dd1b1656d9270")) - (71000, uint256S("0x00003f2d633d303c935554a414ec99443e01f5e626522159d97b7774f939158f")) - (72000, uint256S("0x0001514d0a98b94dbc81f70c59d29ae437a4690beb464d1b92abe7bd1e055a35")) - (73000, uint256S("0x0000807fe075a08da2bb07b8f4bb9a02b7e450fe6e5be062c21b15beed210dfa")) - (74000, uint256S("0x00006bf606a3c548c55c079343183caaebaa2c23d8580abb9eedf2a7e9b2a453")) - (75000, uint256S("0x00016da1e267ef35372482c84a37012e74c136fea0015b48ac7e039a5025b71e")) - (76000, uint256S("0x000029e02c641075abe8adabdb3b59e3696611f37c3da3f3bfcad72a705e7a3c")) - (77000, uint256S("0x000105f3af93470b7076fdfb9a0e9714f596ca4366deb3c35333648257464d67")) - (78000, uint256S("0x000144235c2eb2e871e11eca2ef9c051432bce4e9a1bb346b0b895e8e559286b")) - (79000, uint256S("0x0000b73f9f1a91cacb3c93638fe7ef6fa91072fd76d91cb51f34e794941f7325")) - (80000, uint256S("0x00001d995acdf7ac796829dcc869dae073258e5c608a8daa709b4c512c3a3343")) - (81000, uint256S("0x0000b163da6072538fc53a789dc47228a691b734a74e551e0e2e9e0d26fdbcff")) - (82000, uint256S("0x00012e9491a6d4d2b32f1869eb44672e1833ab718e580bf5609d7f9c58bc0af3")) - (83000, uint256S("0x00017280176966d19319f3c4d67440759e072e0c8b66b93d1f87921743b99fd1")) - (84000, uint256S("0x0000f62cd78630155998d1a64104c2f66328a586988b18874e99364eb60fc0d9")) - (85000, uint256S("0x00000d6fe7b9dec442628066442bd0558ceaa1a8d664d82f122790b2c917f950")) - (86000, uint256S("0x000029a1d545e5b7fdd28617de6195347d719524d5626f12d19924921e7f2359")) - (87000, uint256S("0x000138aea3caee3827eacfea9efd4d41f74958992c3b17a19599c28932aec442")) - (88000, uint256S("0x0000ace521b7b212027faf886832a3858b6b1391face5d9bfa21a58d08577f17")) - (89000, uint256S("0x000054190734e754a5aa58f1cb70753fcba0a88f512185578b8d772918dbf549")) - (90000, uint256S("0x0000d841407e0ac42c190ca65319bf2c4ec056724c75774bbfaaaf28fc022fec")) - (91000, uint256S("0x0000d95e5a72eb25762fd65ed7901ee7c5365d1b7ada72080743f95fe9bfd308")) - (92000, uint256S("0x0000c77b274f557cca7a381b64ccba1412a4f927ae850cc5e0ea3b3fe6a85947")) - (93000, uint256S("0x000006ce04d80995709a8a93da2eaa6c00a7b0c15e7f409a1cbfa64f92ec4aee")) - (94000, uint256S("0x0000e610317357e75beadac9a249f9b1847e26d98dfde191f9e421df0ac009ec")) - (95000, uint256S("0x000039e0566bdb30c72857c5e05afeefefcb4fea69ee24e86fb3506c93c4169a")) - (96000, uint256S("0x00007707c899da1d86457bc55fc614cef6dfc73216d04f26b500728c57b8b7c6")) - (97000, uint256S("0x000133c725bdbbf3c4c3669e32f459f3d0cb6c473b5a9dcfac06c486e1ece294")) - (98000, uint256S("0x00001d75a7c92f3586045b534f5a80c474b9b1ba463acd1462b9494bc9dbc12d")) - (99000, uint256S("0x000070946880c634b930804e55cc2f380fbd897d4d1713e6ab0a86ec66299f44")) - (100000, uint256S("0x00005af032270f04bc9be8072ee0b70820b88303dc25770a8dfb5c6f00341ae8")) - (101000, uint256S("0x00015739048f9cd91a5f5da04d9b1f0b220d719c13a6b03577d60027ba0cf130")) - (102000, uint256S("0x0000ae124051763e3ccdc1beff5d4ba304715e06f6a54124ee4ce4a4424e2925")) - (103000, uint256S("0x0000b46bd79314799b28964e5bc9cfbfd4481fd4148c4775337cc7a3458f411f")) - (104000, uint256S("0x0000546d926811aeaa19b14fb06c919174d73ceb41800f21e8856b940ea0d51e")) - (105000, uint256S("0x00006f831295c6d417a10268beda28ef058a646d68dcf53f6c5197c7c0071144")) - (106000, uint256S("0x0000aa4f504584b2e604186eb4edc1d60caa757ef25db86a35aca9b9e03bab02")) - (107000, uint256S("0x0000e945fef42d3eb4cc606aa888cb9908a9778592470e6630035821b83bf32a")) - (108000, uint256S("0x000042b833a40904ba608c715efca50f3b351924cddc50793af26be698b791b4")) - (109000, uint256S("0x00008b8778ff887a3ae0dc04a9cc546408c8b7cc4f23668b2e38ade6fbe31487")) - (110000, uint256S("0x00007558a72be2b93ff9c32a3c8c8896f4fd7b8d59430a1917755412307bbcde")) - (111000, uint256S("0x00005fcd2934faee4f6cf128a272a03c7001be0f59abe873c4ef5dbd469fee67")) - (112000, uint256S("0x0000ea01486382afa2787d723f80d1073bd8924181f9e0aba2e4a253e4fb571d")) - (113000, uint256S("0x00002e5f65baec8b526c5096351a30bc33cee3692ed4e3b4144229cf9ca6dc83")) - (114000, uint256S("0x0000177996f4e8f436672b0405b1de6bb7335bdc32cea1635d6122c4d6af7563")) - (115000, uint256S("0x00011891d2d508824de7657981c754372a2c2985b2d483fc48003de27f9b5716")) - (116000, uint256S("0x000088d8381d4a1c3b468bedbf6320e7dba41285ae99bcaf0b4750ca9cada4bb")) - (117000, uint256S("0x0000b0dacbd93ed6feb0c83af3f8b57598ca9b59b87c4a0f6f8b7738b37ba280")) - (118000, uint256S("0x000141aa854c151264db40b7fb065d5d6402c03786d1201a428bdb2f3cf4be0d")) - (119000, uint256S("0x00001dcec0e976c13fa307ee80f37a7d188e80b7e18c6aa744948139090ee4c6")) - (120000, uint256S("0x000159aac0c2854248eeaa7717b5f9defed70ec7eb56225f74650e2e4dd14ab0")) - (121000, uint256S("0x0000ffaabd57940430c76493f65b2ea9588ea5d218bf4ab8cd7986a4f36d85ed")) - (122000, uint256S("0x00004997285f83bdf2b84e906a5427d1246d2a9576fe70ba98db0fb1906e2a81")) - (123000, uint256S("0x00011189d192349030a4d667504557de1c6f321c2d2b433f279d83aefd49a88d")) - (124000, uint256S("0x000021e928fa16624a41e6d5d3275ecbf15d4f2e7ac529f411c071090b01a501")) - (125000, uint256S("0x0001678ffaaf26a44aacadf79d4312a1a3269e110df6a25b00371575574c5fd5")) - (126000, uint256S("0x00014435157bc5cf46047a2080a3fac7680635b4bd269404297581b884f26aff")) - (127000, uint256S("0x00005b0ee65fba4d6eb0902766eadf515fb252b86140e9093d249d8f9a54a128")) - (128000, uint256S("0x000021b7d3534640ec2854c0fcc08b1342162770a4e1c37870e9cf0030582d85")) - (129000, uint256S("0x00009fb144dfe588c1ae56ba6e17a6d6b1565c1b27464c5cba79c918b56a1760")) - (130000, uint256S("0x0000674dcced99276e684e9ac19eb2412e55c968a2bb524069384647cb45eefc")) - (131000, uint256S("0x0000ad841440e59715c68856f4011e854031cad19788438bdceaa4ca161f06a1")) - (132000, uint256S("0x00002789aed78f0b29396c9d654c1599b35cae19704d1b15e4f266af109c1f8c")) - (133000, uint256S("0x00002a422e40e72b7a35d4818a59297bfdcc5efcaeaa30d54d1d290e85a6f1de")) - (134000, uint256S("0x00003628a789756f15bb46fd8de99f9baab50f19a935716785dcae0275bf4a05")) - (135000, uint256S("0x000075517e8be4c0ed800d66ad00dd67346ea2b34348e594b769fa9bac3fecb5")) - (136000, uint256S("0x00002b4196ca58d9e2b7c75f1e8de291cf22b7bbc4be8dc2cfb29f54c256d3ba")) - (137000, uint256S("0x0000180d66e02d24330e9ef3d49813136eac06802e2989fa379d7a88e4067e01")) - (138000, uint256S("0x0000ad0a51cac855e0b162fbf069b560cd8d21fb5275f9d06304a740129bc809")) - (139000, uint256S("0x0000219d48ec853516f9262b41d84c5fbc5417b604e3b9001769bd5ac3f59b28")) - (140000, uint256S("0x00012475b06db9b0c4befe66ed3de054b993bc787092488df2383c566155921e")) - (141000, uint256S("0x000061896c62d282efc098341741a1a67c4d9c87fec6f1948a2225bc56c44c78")) - (142000, uint256S("0x0000444880b2e2b46b874fbb0acd44675ce257d2bac4eade4b9b9929a7b39b08")) - (143000, uint256S("0x0000509c13924e0733c5d6fc3bc7a270d2dd3b4c82db7fdfcaf02a410103ca78")) - (144000, uint256S("0x0000dd507d1b7059fb9c41c103ff43190425d567a661a59d704563c9dce1a1c9")) - (145000, uint256S("0x000097e5ebd34461ebcb5fdd3beb6e973fa752817f2ebe9fd3d57a56537e1ec0")) - (146000, uint256S("0x0000afb0eab0639d2623a15d8454cc7464c83f677fa7461259a445304fc3d3a8")) - (147000, uint256S("0x000123ce32adbc6c65e490bcc21554b0afda1476b2a6da11a28e264f1964cda6")) - (148000, uint256S("0x00016278bed29b081e4986de9c6422a89d8aa719dd1ab422c1ea7fa10284094b")) - (149000, uint256S("0x0001484305013531de1e5abda094fb453d5c5fb0d35812327ea01517c9149cdc")) - (150000, uint256S("0x0000da3a58875dc171e5bb9747cff5dfa2880d39e244d3f10acccf5232aac81b")) - (151000, uint256S("0x000006f333c55d2b6ab5f334a6d05f96fe74e301d4110ac92807239873f25671")) - (152000, uint256S("0x00008844695c54bee8e1711ec7e80f474c7a3bf1b78aa272553ca233746c912f")) - (153000, uint256S("0x00011c8bc4ffe00ea899ae19daa572e61e4cb951a594229d67e2af19d6388d21")) - (154000, uint256S("0x000111aaabb95e1cb1a225e5e8b2a6727c11da97c7391800618c7ba11c6ad669")) - (155000, uint256S("0x0001011a4d88acf916da949572a7f1c208bd7d31e0598d4337980c48ed88b18f")) - (156000, uint256S("0x0000651ee0d6bdaeec5bf585fa628e4336e7238974ca90461d38506c34d6f00b")) - (157000, uint256S("0x0000d2ecfe64aa069aeba21fb1bd8995cfad455c296670e3dec13fde989aa1c5")) - (158000, uint256S("0x000113b2ab0d24a2bac410a0155ca9d2fa6b2923c0042c228dd86fe37ad04469")) - (159000, uint256S("0x0000b1741e1d0b841bf0c0d5b3a0b9a906cde8e630e10b71ebfdf18ae5197d9f")) - (160000, uint256S("0x0000419b54cbe8a842b92201996bd74382b63db7ab0b1989b932ecb19bdd6f4a")) - (161000, uint256S("0x000076eac68434f40b6921b251fc2ec5de4748044d849887a70116f344f1477c")) - (162000, uint256S("0x0000fb948303f30cde6c2ed932915e0f6aaa932dc3dec324851b256e82f4f2a0")) - (163000, uint256S("0x000025244341c537faf365bb46626f0283a2fc0cd668c93cb9771da7f7c6be56")) - (164000, uint256S("0x000046fc2919f8ae4b88c1faecea97f6301a27a9a16184934d70b0b305891a14")) - (165000, uint256S("0x000116cc086ac32a24092d39089d2bcf5977bbc08ad916a8fac2aaefb48f2220")) - (166000, uint256S("0x0000dc6455e6eaae079ba6592fe0d5688c696955f00d33dbfc0cf76aac48e10a")) - (167000, uint256S("0x00012685e23a0997797098d047631fe7da1849e763dda0c7a00f47c7dfd13366")) - (168000, uint256S("0x0000b28813965516fe96909418dc72a4ce126401cd7a03919b9888d0da3b37d3")) - (169000, uint256S("0x00014522bcc0fa9995c6b1b6e6ba3ddd4298b0dd59854d25e713c43778d93d77")) - (170000, uint256S("0x0000f8e02172873f12b2b1adf8709b5d1990ef64b674fb0e5ed1ea08db9b6a48")) - (171000, uint256S("0x0000b0d9d1cced1c0396bab1f1003c9a009dc47da63c8220fc23bb3948a82ed2")) - (172000, uint256S("0x000099c8db9b14c2d5f7c685ee8569755bc50306397f749c7e0e31e709bfc4f3")) - (173000, uint256S("0x00007c422bc9f8295deeb35ea5225bc4f8021fee412c9a5127b6067582b356fa")) - (174000, uint256S("0x0001127a0d14aec0b5ba96dfb606cb9a562d5dafe79646076b9c0a7f7bbc8ffa")) - (175000, uint256S("0x000091c16ae7ffb036f716ac975bf6a9572fd9d439abef21036d18c3be0f90c7")) - (176000, uint256S("0x0000f4e7f4a42a9bf0dfe831764ccf9a8116f98e8158d072b8034d6b7a1e0400")) - (177000, uint256S("0x00006a9efe8a6d93dc8d16757a425c2cb8b910195f08fa210bb0bb3daec47080")) - (178000, uint256S("0x000065fdff26f07f13a0e9db44f6847161b360a6dea1cb7ef810c93a62043025")) - (179000, uint256S("0x0001a0a5300ed334e0ada6eb53d762ebcb1bf7ad0b6312905257f7698477ed51")) - (180000, uint256S("0x000131b050c745484f85e2c8422bf4624f23c69969d1c7d2f6760ef62a864746")) - (181000, uint256S("0x0000cf46ed02cc030fa3209a7fdca35a99249a17b241d30849ea094cdc827a49")) - (182000, uint256S("0x0000b16cd4ef9db7e929372be056e12d8422575891d032298cc17853d043a6e8")) - (183000, uint256S("0x0000d5d53dbb045bedbd997855eb931d7e671740e2aa37a84e184b43b90cf1a5")) - (184000, uint256S("0x00010f06fdae2de13519604475ff9412eb67731f9d4d0420c00b1f2530a5fd91")) - (185000, uint256S("0x000145be18021effbc081d0ca8fd549317766b57d828bc946436e84325b17c7c")) - (186000, uint256S("0x00006e592793a9bb5795a4f76b5ed47af4ce51b0d2e6730888c2c38dca5864b2")) - (187000, uint256S("0x0000438bdd8a024ccc008726a1690873039153df76ed254d2d773e55def68742")) - (188000, uint256S("0x00010108fe7c2543e5b258ee511ded17e12f3ed1688164ef78526684c1ea193e")) - (189000, uint256S("0x00005cc59b9b2116afa0e6ecc12769ee5f91efa91d245fc64bfda90479f8c9a7")) - (190000, uint256S("0x0000572751fda233f466c6ad237184ff6a7a15f8d84e5471e3dc5288ad74f592")) - (191000, uint256S("0x0000b5bb7236376176640e75308466cec3c3fa7bde6f24b1d12c96e94df2bb58")) - (192000, uint256S("0x0000620eaa310878ce85d6cd90d2b4724b36236575ff26c2ed6e34c93f6a8625")) - (193000, uint256S("0x00003a8b7d4cc3a92bb3b5301f9d7ca91941150e5bbc10f1204ec0175053bae2")) - (194000, uint256S("0x00007144b1bd53defd4cc1e78832a2bec8d66e094a0f03c22276e846cf8b598e")) - (195000, uint256S("0x00010530fcae36dc749c679366101df5d344243238e0e6dff2cbf57f9e25d5ce")) - (196000, uint256S("0x00002d2b003cc4851f4950cdfe7996f55b26c7564e60feb6e19597db49dd998b")) - (197000, uint256S("0x00011545798a62155ff5aa047a1cb59c0860b187a59bce8976b57f9c3bb35184")) - (198000, uint256S("0x000061433820de56f44eb774c2f54181b0e6d1e6b27e4a8eefef90039bbecd07")) - (199000, uint256S("0x0000403ced11ef43d8324070ddc30fc69a0c2d8186e4551c140a9378f0312d34")) - (200000, uint256S("0x00009ca9950079d5cd882b615fc068df25beed137642b751b224d6a939a87c69")) - (201000, uint256S("0x000015eb67778c671b0fd29016482d42758cc2edd8361f30788ab95c8328efa5")) - (202000, uint256S("0x0000c6e1a58b63e282fdedf31c1da7cc6d8b0a6dad82fc425672ac0eaf737c84")) - (203000, uint256S("0x000078e0e23fa6f7ccf5e8bb8d6703e0d70b7a86fc0c7493f61ef57e945a8250")) - (204000, uint256S("0x0000451704df4c8a94edd50b78540e8852bb55eef42bf2da3e19a173b8c246d5")) - (205000, uint256S("0x0000309772c01eeda1979e18f93a8721bfdd08c1796ea3a5861011c3de0f9fc1")) - (206000, uint256S("0x00001ba8aa17a23a2c6af771063cbe0afba5bed5b9a7b6c12d3cf0240277fa39")) - (207000, uint256S("0x0000bc3893889caddd09c6117bbd6dd044ebff10b28e008f19f7c43a496592fc")) - (208000, uint256S("0x0000684467ca15f917315fbab3fc3f2907c5f30153c5b884d0298a0d1e77815a")) - (209000, uint256S("0x0000a4f86f394beec9c9241e6dcb05b49393653bc5eaf35820403e54a23bcab6")) - (210000, uint256S("0x000097146b9280bac0344dc886cc4c77141b7467e2ef68e657525d789a9cdcc1")) - (211000, uint256S("0x0000298926d49fc5da4f866133c5c1d1e48d10a17b384eac616022057a7a46c9")) - (212000, uint256S("0x0000eca72307d64a15d234ee372e18862a46d6fc7fd2d0ef3d35c0e5ac836cfa")) - (213000, uint256S("0x0000d89ced1ffc0a9fbc0763d6d090bb19e2657f93c43144b359c16804778a89")) - (214000, uint256S("0x00010f939491f8393ddf82118d72bf420c3ebe01788d3cc69163865bcd848738")) - (215000, uint256S("0x00006ad713ab44526e84e11d0400e5619c2415773cf5068f4946d52bf9633f10")) - (216000, uint256S("0x00008410e6c8ecde65179424ec6443ec1b2215d2403d8b6f779da51136ec02a1")) - (217000, uint256S("0x000020ee6b9a6228bbb57a3dbfab949740801149096f7d0633066026e6792ee5")) - (218000, uint256S("0x0000d38defba9427c17c1cb43398593528af10ae6fbec1d445ce2533c4a0228d")) - (219000, uint256S("0x00001066c0c557ad46f0228c6b8ca18f17979032c55ae24ddab15394080987da")) - (220000, uint256S("0x00010f0dfb2aa26bcd90f8769709a91e0948c03b56ca24740a94f59d5822a815")) - (221000, uint256S("0x000058f2dc34a3060aa22edeb91d3a389f0732e479dc2c0d33696fe61ef1c9f0")) - (222000, uint256S("0x0000533b7f73d91cbe609c8626083dc44e8ce65ddc723729a16e9469030ba263")) - (223000, uint256S("0x0000f81efaff06d9a57c42026bc5aabe52a0ff81a37220e16c4c84904e7cab64")) - (224000, uint256S("0x000130f784b48728fa8f619617996b7e99dfb430176f9ba894a68630a851cd4f")) - (225000, uint256S("0x00003c810725d91c1c489ec513ae71f29562fbc4292719babfcc78dcb293a9e2")) - (226000, uint256S("0x0000dd323efe5d0e9adc1389e4c9eb1c4070fb38d932683032910aba746b3c2e")) - (227000, uint256S("0x000132092774885d1ce3ec989f1b199bdc178b7d406ad9b0d23d3e4e6720d3ca")) - (228000, uint256S("0x0000cf429d0c05ce9e009e501d724d8929fc40027a2f78f7e67ec7d86e91cd57")) - (229000, uint256S("0x000061b40ec34dab4fa83698ace103b6caf9271cbca2b8c7ead55fd299f23f1d")) - (230000, uint256S("0x0000ca632b73f5b1ca9d60ede2010290712fc2f2d28d08ecb31b0affc5b8284f")) - (231000, uint256S("0x000025ffb1c37889da722af7ecfe87e3897c813e4b948d30e1647d44f1a2439a")) - (232000, uint256S("0x0000147749add04281819da29a8c6d7d7e30fa9e8307738519d33605bb26772d")) - (233000, uint256S("0x0000b9ef9879f18d47d7248a8404b2f2b38490f1ea2272e2ab5d10e57e687698")) - (234000, uint256S("0x000006a82f41ac94661d4e0a3dd8d5ef790b5c7c3f68b3bbf9b2c0749ff3171d")) - (235000, uint256S("0x000088d9f88a14a5fefcba4bb61c05e43518806bbb489ea4ea3c53e48ed8262b")) - (236000, uint256S("0x000036c1032ea9f7091faa0ba289ef025926e4f012e19a65476ad061d61343dc")) - (237000, uint256S("0x000016076e6dfd0f0de47d77f975823d286c9458f0e9ce851b8a585e442d1503")) - (238000, uint256S("0x0000b228ebfb020faedd5db874ff7c20bf50f33e0ed824ce30da871ef8859a30")) - (239000, uint256S("0x000098f1ed04960ba6dada245c1d954dda785a250f1365b1d46934514b513e6e")) - (240000, uint256S("0x00004827b75431d480812d39ca8e0925e44889c18b08778b2171c78aacc800f9")) - (241000, uint256S("0x000047f75806dff17a4fbdf87a2361ebf325eb3043d3e7cee86cacabc81394d4")) - (242000, uint256S("0x000027fb57cd69593cc13f6e4ba8cc32bf5982f301c2a9e04474abac8313ced6")) - (243000, uint256S("0x0000d6fb59a655b9402dddd35f09e25085ba1a472e3c344b392d5b3ee293db81")) - (244000, uint256S("0x0000913dc99d2bc33a75deae45a155e2b8dd7953dcd87be10be4943d1b20a82f")) - (245000, uint256S("0x000041e52aed642e547ec8895d84d25203b296f871b50a1f0250ca00c5cf01ea")) - (246000, uint256S("0x00000dbbaad4e01e63b8e068a25d0210ad2c5f656f6d77da241b980fbf77932b")) - (247000, uint256S("0x00010edbb33cf3df1dc924eac96ced741f3a735394bc9fed3b8c1ad3692b3ec5")) - (248000, uint256S("0x00008e0bfb7b326a4bfc6a2995a14f357a27f5725d930a62d2d3ba80f59b2ee0")) - (249000, uint256S("0x00000cf51bb1334a730b924430908700a6f6a995bd9dd252d77b7f94a014c8a8")) - (250000, uint256S("0x000090c5798405d73f400657dcc5685172c6b2608809a9ec2e82297716e5f5cd")) - (251000, uint256S("0x000082d84ca93a2211bb870b3dc2865092fba3b772acbe934cb0a6ff99338762")) - (252000, uint256S("0x000090f2de1badb88177db6c3682f0f223196f51a3e054fe6b06caa5d5e914e3")) - (253000, uint256S("0x0000e0f97c745975bbe5050af8fe92637a7d0cd458cd1706221d34af719f995c")) - (254000, uint256S("0x0000b8eb6c3ec95367882780cba0369222a9acbdbd626bbdc2efa5e9806309ee")) - (255000, uint256S("0x00003f05f5e1dbdc2038158fe47ec02994e8cc643a710a513f8f489dd58f61e8")) - (256000, uint256S("0x0000d31f04b719ad5681f7e1b517daccd9694fbc9409ccd286f558455982d261")) - (257000, uint256S("0x0000ed07ac5882e040bb9de0f4ad4d4527ca5c73c4f1a88eb53dc0651ecbd1b4")) - (258000, uint256S("0x000097e6df4db5049fcff2e691c02570d82c7dbd168189c06f31dd94949ba8b1")) - (259000, uint256S("0x0000e2e8b741d28d9a097229d6e5a2ba1732a82fa2ddcfb41f20eebd94c76c32")) - (260000, uint256S("0x0000263c2baec9d5575580a30787d4893c1517b64ff7294e41f2efb16d21ef85")) - (261000, uint256S("0x00008b142681d8cfc53df1ea806f828f9bdf64789eddd8ee3d031bb8ef8acba8")) - (262000, uint256S("0x0000d2482da09b9d9f76fea70205c1de1029074f2b352ce4b44e86188139daef")) - (263000, uint256S("0x00007ab5c28f261713ec133b8543393d556c1a259ca05968bd3075792aab3ca8")) - (264000, uint256S("0x0000a75e0af3d8f54950cdbe04a0d083eab58c4aa5c83151883f1e4ed3b81364")) - (265000, uint256S("0x0000189eb94df3a9cbc293fb896cdd2c0a11a96c6312ebc48dabcc87c1ce77d5")) - (266000, uint256S("0x00006843e067df56f2eda15d3d2f2b0a3ce1f9ccca76267b43b355939538d94f")) - (267000, uint256S("0x000061e5f1d6bec772831bfcdf02331a6cb8824a2cca249ffa49737d19782447")) - (268000, uint256S("0x00007f909a3f437fbef9702678e510ab70af79371ea7810af0ae12fc5e9e014b")) - (269000, uint256S("0x00007de818cb26675fd9edef889f228985951c8654354ff50671f672bc868815")) - (270000, uint256S("0x000027590b1638a77fbcf91aa46bb6fe044bf24a63a79ad6cc74b46d2318368c")) - (271000, uint256S("0x000066e889f46e219dcf0b4406ad481e8fc400bc65bc4de757f8a2cc946ce9cd")) - (272000, uint256S("0x0000380a032fc737f0d643ad61ba707f4c6fe939a2b430b10fa581f5a0679100")) - (273000, uint256S("0x0000126824caa6aae226452aab57a114ffb6afbf8cf261963a3961318a28b419")) - (274000, uint256S("0x00005c4c0b084a1d192dfe12783aa91c778f1e709457e73cf76f5889cc26bb78")) - (275000, uint256S("0x00007dc532c6b377c64462a8b8c16b3eff0096fbd9c6b4006c752ce7d653989e")) - (276000, uint256S("0x000010f0388da6d99966cf52ea61c27d687ebe07e8235725df251ad15ead0dee")) - (277000, uint256S("0x00003e8d6d6063171e835af9113f880af2a5907712d3c0e96350d3851961856c")) - (278000, uint256S("0x000037ba4dbfc93957ec601b00835a98c16ad2ed58c26c61ce4b9c2a3d333ec2")) - (279000, uint256S("0x00006717a9b460b220defcd60216be89ee2c433a2d888bfcab850ad5f209d94c")) - (280000, uint256S("0x000041384c4c769143b1501c7c6f892a4ae5e295ca471499e08c8299f5162099")) - (281000, uint256S("0x00000b03c4c5ebafada3fa92aee6703ddaefaab554f48bb204e358ac0aa97add")) - (282000, uint256S("0x00006be32af84c330c5d7d2d97684f1e3fac9e1f298784cb15b35df6bc606f8a")) - (283000, uint256S("0x00000dc131bd64e0911950eccc6ce708ac27bd7388da64e19d4cf23ef888b5c7")) - (284000, uint256S("0x000075deef6c427d641f480805c5ddcf260481983924be5f6a22af7a934ddaf0")) - (285000, uint256S("0x00007a019cb2e868b90a7c30debd7de1bfb5440e06c5bd8187f921358c7ae781")) - (286000, uint256S("0x00001095ccb8ef1028bf4ef8df40467441167280b6a7a15384ba60708ca4ed29")) - (287000, uint256S("0x000085d7c734a13bebb8057beff8deec794a930bd6300af1becd7de50d425fa4")) - (288000, uint256S("0x00001d8395c53c0fc68e536df49fe942caa67f6d8a3f91cdcc018d15b3fe0593")) - (289000, uint256S("0x000050cee8c1581b2d8214d43f9a8c888bdb390b91352fd5347b48df92828b8b")) - (290000, uint256S("0x00004240e011ef34f0b6015698b4baa2728b2885a69284afab0424fc6b09877d")) - (291000, uint256S("0x00007c90a0da5bd891f8de0a7a09d1b8af3831143926d02e90d29d9d1934b5e6")) - (292000, uint256S("0x000015965fa7e60705a11e595a18875ed065d8b11d8030880e59a5d474e458f0")) - (293000, uint256S("0x00008981da5387cdfb537ec9d4eb8e8bc81bf5f18938eaf04889acf011c96749")) - (294000, uint256S("0x00003810c0f915b3fc12207edc99f7b9226f5572f491e7349e79b228c8e7469a")) - (295000, uint256S("0x000087f128604abe37b8fefd2f098b0e0984e6e7a65e2151889a302a68c06eca")) - (296000, uint256S("0x000062a42664d4c4e88bbdbd991e7fee35f779c126dd27386e5225d2237dc2d7")) - (297000, uint256S("0x00001c42f5f24b38f202527e3c2cfec3f5621ad87e75253b5d431452d786d4c4")) - (298000, uint256S("0x0000198517575016a98ee8b54deb7232c2312f017d60959280060ea3cf92e4f2")) - (299000, uint256S("0x00003a9031fb5b7e9a318c08588f63e52a6c91845b444e515bfde4c9b88bffe0")) - (300000, uint256S("0x00000c72234e026b3ac4be4a972889fe48810cb27d551058b77d4c5e9b32575c")) - (301000, uint256S("0x000099dff2afc7600c8b724dfc3202d0d29d38ebef21ffc02f4e2f2a66ccea99")) - (302000, uint256S("0x000085a79dd00da9a21cff9b4266a8fe5c2e90b5ea53ec1c7792295192a2e37e")) - (303000, uint256S("0x00005798b40b3eb295eeb9be6af8ca5007784beda82d04a4a8b9c3a2ac0b1096")) - (304000, uint256S("0x00004eedbf20eec4f279484eb5c13c266d463475ad2fdbb7447bf0a8acb7ac6c")) - (305000, uint256S("0x000029cab3bf30d2b12ef99eb43ed67bf6f81399938cde4f061dcf1d3a3b8282")) - (306000, uint256S("0x000030648c81f681bc962e698a27f587da62182e555579910c456f723109b42f")) - (307000, uint256S("0x0000085e26e0618a933a35267273dbeec35ef76f83d7543443cd55a2ca0e233c")) - (308000, uint256S("0x0000239ea91faaf5425f65fc585e7fac6dc518869a1a7091450f90ee8bdb2fd1")) - (309000, uint256S("0x00001b62fdf4af7be68cd70b1f982d29260dd1e667ef349314a4bddd73d55496")) - (310000, uint256S("0x0000765eb51eaa30265211672e8311dd40e265ad4142f4a03efd2f4089d9e186")) - (311000, uint256S("0x0000140c77cdf8f9d4b289aebc0310305693f970ec409f2b828c3ed513f3e58e")) - (312000, uint256S("0x00003f6e2f0e82c242e5b0a7e126ad210e53fb0dfbe794ff2d7e1cdd3873e818")) - (313000, uint256S("0x00002e678cd8a3a18a1cdc5c957b6c0c880acc21b801c68cc4d7b37110a83f22")) - (314000, uint256S("0x0000198bbbeec4927abfc60f2becfb96a5b0846962d65b32de3f9243bdf39af8")) - (315000, uint256S("0x00006c90b93d54587dfd63105e063f6ddf43cff500aa9968622df5c93a5b0798")) - (316000, uint256S("0x00004c21c397bf276a5cd62d960e308fcb098ec45bd60a4f1bf023b6edf2e6ad")) - (317000, uint256S("0x000036b7f6b9e2dea52a6067a94f2e2704bc1824c8e11bd300a841c46e7dd2c2")) - (318000, uint256S("0x000025029ef96a105a50a7030fb0d61edeceea25e4effb02b3ce8eb4c6205782")) - (319000, uint256S("0x00003537409e025a8075526fa097882f919ee169606a9368d8c3db2d33119e14")) - (320000, uint256S("0x000023b752e4c077f231d05026220244ca10a603324035b885e1b0dd6443c148")) - (321000, uint256S("0x000003411062d7ec945c786237575766c5ce2e48c4f94ca04f28b1404ba86097")) - (322000, uint256S("0x000022447ebbb48e06508a70746f87b2e55f026b8ae3052a168f29848d3e2aa7")) - (323000, uint256S("0x000057eac2e6c611398b43e8a72b83f5863b104fa66120e707df6e3e6fa1ba8e")) - (324000, uint256S("0x00006fa40d2be13a2ba910156769754eab5d55059729597a02194e5e0f84b336")) - (325000, uint256S("0x000007fcd4dab7c2cfcfea47ce88932d3ced21fa9264c1c8ed9cbf3fee08635e")) - (326000, uint256S("0x000017fdd022300e952d9274c63cffd8c791dcaa4d82e5d1c9615464df19ae13")) - (327000, uint256S("0x00006739a0fc2ad8788ef615aa26d6a9c7c6d6adf9a9e84f7ae68379eca2a0b3")) - (328000, uint256S("0x0000777de98944635470c99ec1652aa2c15ce3ff4b19de17eed5373d2474a6ab")) - (329000, uint256S("0x000042206ddb76bd7efdb14b694543b685771c6c341089f5bd1dbfa04d6eace2")) - (330000, uint256S("0x000069d6c21607c368128d4586255f315c55380759a766f961acc35a2e9cb166")) - (331000, uint256S("0x00005b19671f21015db7011c9702a420bab766d8bb7cf25b8525429eeff36b45")) - (332000, uint256S("0x00002d62d1f4d13ec708f65c04937b86cf86a36f68caec269f598e8835ca362f")) - (333000, uint256S("0x000013ef2283eae4c9631b4bbbe80b4fb06b663e25a569336326d7897d80a9f8")) - (334000, uint256S("0x000018b4c8d94267953a1df06439a1393c903255a58c9152593eb2d369d87399")) - (335000, uint256S("0x000022628e5db36faec4fe5f107deab56c47c61bb29a51177ecd6f86939d83c1")) - (336000, uint256S("0x00000f22f49242eb151276aa5fc84debb67bc632197c448dd23a501923f6cdc9")) - (337000, uint256S("0x00004aea6cad4849f27af16c298a990e242b77e249eff52fc9c955c121d5ea62")) - (338000, uint256S("0x000064b79a8fd98e2c57184d6ac67daad8278419aee044bec13c7d8de0baebba")) - (339000, uint256S("0x00007ed65e7fe77d691f91d1ed0fbc40413f277770c8a5aa389505b2a179f428")) - (340000, uint256S("0x00002d001410cef77057d66b49c1949ca1367e11297a595b13f17ff1676e55e9")) - (341000, uint256S("0x0000544668ada85a8429537011fa53be0a2c2801c6c022289b8b056ee54e96ef")) - (342000, uint256S("0x0000311ec160ae645fdbffa2eccbdd4212d6c7a5de7e78786d37e9341d531f75")) - (343000, uint256S("0x000010a8f4eefa8040add659396d269e245441439e33154a3b7324ba8884a6fa")) - (344000, uint256S("0x0000500a9df05634fe8987d437cd3ccb502fc36c00fdc73195bbce7d63d1a7a9")) - (345000, uint256S("0x000002a979e67ec52d92b87c4637f166c694378a9a57e3f8103c7d8a084f551a")) - (346000, uint256S("0x000026662841a071a8c0cc28bd560b42af3b739db3d494dc9bf2754bba021da5")) - (347000, uint256S("0x000031d4a32cf5e1c4f1b7d7e3556a2ce8de88ad3f5307f5b20cd7e40a2d1401")) - (348000, uint256S("0x00000f91efbd01c0cd21b1ab0e0daf2d014a7e6bab3fda7ef480ab35c80a2421")) - (349000, uint256S("0x0000460718b2aee973f80306a37506f9cbf40123fd1205c26c33b0d9749d524b")) - (350000, uint256S("0x00005953abe841392b72e8fab12e3cbceb18c128f73e1aa4406defd18543fe4c")) - (351000, uint256S("0x000018647cfc45a1524168193e67e6af22e8677ba3428dde5f6a2f76c199532d")) - (352000, uint256S("0x00004d0d3fc72f9d7f9a6712c098eb6cef0a7756886011f036736de200fbe5c9")) - (353000, uint256S("0x00007948b8f6bb2433088cffb4bb18ca1d03aad3068a7ea923475f1aa108fd20")) - (354000, uint256S("0x00000a0072325a23f9afcaff49a8c3bcb04f1fcb01612de33bcb9f0f20ebb356")) - (355000, uint256S("0x00003e0133ccefae6723c9f14bfd290a7aaf60c2bc962c293fb58b5957ed1a2e")) - (356000, uint256S("0x000005b41a41a8ec5c60cad85a03d9fa5025b5d9a088a6bbc2ebd1d8e858189e")) - (357000, uint256S("0x000021655f02625c28257183e5c4639841b11661cf40f00fc5ac4bcfcf1eb072")) - (358000, uint256S("0x00007c3fe61dca2d5c52bd5e9090c91812bab9c6a7407e32ed0a930b421f5b80")) - (359000, uint256S("0x000063f8390cad7ad17cbd18983b923e18a1469d5730dec7a62e12914c66df9c")) - (360000, uint256S("0x00000f11a3a78c71d8a7c722cfb52f51006b3656b707cf94c0b08a80c4fd4dc9")) - (361000, uint256S("0x000008e76b1c141b783936c946af3f121d5b96fb8766d83c58ea7f7602c78386")) - (362000, uint256S("0x00000c92d4b3163c33c0efa3feaf6f4c170f9d6288d2435a09435eac87d04e09")) - (363000, uint256S("0x0000567379ab1430696266da7ee6dd1e7ba0eb91bba09c85f558c181e01625e5")) - (364000, uint256S("0x00000712954e172eef571e8297ea1843aba0a762b31b5b2b40ca2027e7c0b1ec")) - (365000, uint256S("0x0000627358770bbc0bf614acb3d02d996f220562f083d08c75e71aa2e83a7870")) - (366000, uint256S("0x0000404c17107474c2a0704c9920ee16e502c8119581f4707e0959af3004746a")) - (367000, uint256S("0x00006c5d54ad2b5279842e8ee726359064c72a034c5c3d5f261413c2cc6a4e6f")) - (368000, uint256S("0x00000df9f5d119afd39c0654010f1ff492f8e04dc1dbe1cc0d3ad5767601c91b")) - (369000, uint256S("0x00004e47d205ac774a1f6d7d8bcc29d6eba6f11005b75aee6dedca1e46a1c1db")) - (370000, uint256S("0x0000810057e4efa124db97d9433372af35b93ae61ea4b620f7ac3ac26658a5aa")) - (371000, uint256S("0x00007e49d0ae73df2647b33550aad63d79c05e40b08fc1c25cb9450ad2b5e8f3")) - (372000, uint256S("0x0000076bfad90f3f5befd763f0abdfd05077821099e0c33bc3947ed853d0b928")) - (373000, uint256S("0x00000d03d70c31a5ae2d32b66a3528981c88d361cc165512a3d9278ebace0589")) - (374000, uint256S("0x00003e477b6dd1ffc2218862bc18b5a651c82122cdcec0c455613d1891e9a727")) - (375000, uint256S("0x000012ad562f8b65a93cb2eb5f708d55e4c3ac689d2020843c55b34099755233")) - (376000, uint256S("0x0000556b17a0197dbaba33c7f58fee2cc9219b6918d925a4146fa7fd5de0e94b")) - (377000, uint256S("0x00005f1ac71e07fcc4f44fdfef693983a872be58f5b1bc04d13873408a54f2e2")) - (378000, uint256S("0x000014e65f4e30b3097d2ebb33c11ada6abaf81e8ac3ffc2e0b6d4756b59822a")) - (379000, uint256S("0x000021418aa5de171ac72097abad42b7f1af1a2f7e19b4c98c7174d5164fa5bc")) - (380000, uint256S("0x000046b214d061a9c237e42bf42493f9792cf80b95f89ef10f432cacee23eba6")) - (381000, uint256S("0x000068f06f5bf5b288e78d694775cb76cf1ed473f95da29790e4b60133d6bb87")) - (382000, uint256S("0x000008c5632f8e3f8e61aebd686b624c7ad644227639d320c3ad286f71d4e14d")) - (383000, uint256S("0x00003b7fffa7e988b90e05d94d24153b0a22e01d9ee0c56e04e9263c88c558ee")) - (384000, uint256S("0x0000083022ca686c81f5f403743dba37334a0e96f96d3c8bed7353a1bd11e58b")) - (385000, uint256S("0x0000485dc4369a16c2c8bde7577ce99ffd0a15a1d21cdf61c01f0bee17b36b2a")) - (386000, uint256S("0x00006da0099b6f9edb40dab855231677bf4f97b0e7643fccad05cd97a8b76397")) - (387000, uint256S("0x000063ff38ec555dc089900fe0ff5648488421918db713941d6c24cfebad37fe")) - (388000, uint256S("0x000069ca27290d71648678a0c5ebd379a17ffc895fea7b23837093a337563060")) - (389000, uint256S("0x00004a1e13ef7557c9dfe0c7daf3e7483e7d1420afff64a5325af7d5bfe49994")) - (390000, uint256S("0x00001dce3a9cdd42f97d3268d29bdad179375f61f7d4e729919450996917c583")) - (391000, uint256S("0x0000071173926b7f9492e35cf48185c2cb57ffcaff2149dcef5c40148a55255d")) - (392000, uint256S("0x00007c3336097b98f2fbc46dcd4f981e73ddb93c8096015282eba490b773cda4")) - (393000, uint256S("0x00000738869c9b8cf66aaa075ebefc5209c90a0f225b405e1850b0b00343bc2e")) - (394000, uint256S("0x0000537c3d2b6794fc5c2636a3311e1cdb34c019ae2dc09778d0c500e1593f2f")) - (395000, uint256S("0x00000dad4673f1db54a434d106a69af55f494ac29a428ff37f4e4aa3b734a37d")) - (396000, uint256S("0x0000514b509a25edc24df6d94e24e2aac5727c18d361fdd7e64356f2233016b2")) - (397000, uint256S("0x00000eaaf35e4358bee2a8c5981683b15214d7ecc03701438f94f5306d10c6c3")) - (398000, uint256S("0x00007cb707f7132454c53ba8410dbb588c3b23e7d731f824d58da21f4ac62330")) - (399000, uint256S("0x00000cc6edba6cf9dd44204502309c781a1f769e019e42306c785dfd2d3614eb")) - (400000, uint256S("0x000023fc6e679339fa72280568217dee1ea0c26790c13f80d0092f9b12ed5f38")) - (401000, uint256S("0x00004ee2b9c7df597e26a4ee85b56c0842380adf5d15b9f6667a132f7cb0b07c")) - (402000, uint256S("0x000073b711054a260c45b4ad63796949d2a00a0baca00e1a68ed16fc98f45d70")) - (403000, uint256S("0x000070b43d9d52a1f896a13bfdfb445fcc3b1374b7ef123b0cce1488f551a954")) - (404000, uint256S("0x00007864734f9e3f3596d9d92df853d3a9b1172ff747fe5983e09028114404c3")) - (405000, uint256S("0x000075ff54f6af74e69cb36dfd7634dace0c68e00d309da017f81ea5dcc9480d")) - (406000, uint256S("0x00008b908deffb33856ccd1ef6afa73cf8bd01e8c3b5be502829dd64157e3f7e")) - (407000, uint256S("0x000023d28f6b13c134285247c6d8191f16a94463ccd84a506c99ba52706b67e6")) - (408000, uint256S("0x0000723a9c35577d2e56749861ad4e9d3c61b1c650e0c7c832cb1d60346fb46c")) - (409000, uint256S("0x000021a04d41834edb1ebf0c3c09488fb1e3da4c30acfda07ef154de955dbfc0")) - (410000, uint256S("0x00007b63162192a0b9c1015a227df9fe264591b5842aab61a637c06768a5e3d7")) - (411000, uint256S("0x0000064165fbcae2b8c44549630ec47c9504c77ddd0aaea91e846539ce023c6d")) - (412000, uint256S("0x000048d4879eb955e516485f822f2f52fa078f02396fcdbd1e0fc0698a90d577")) - (413000, uint256S("0x00006df51ae354366835450d019ea8a7a59a34060dec74de630bdf8004bbbd18")) - (414000, uint256S("0x0000113f9fa68a6a1acc32aeab61e8ca15e1f53e9f43b9e77bca85fecc7871d8")) - (415000, uint256S("0x000003ec7bf286218a52ceea9a5b8ec460a5a77211679c2b8d1d1e4ff96c03fe")) - (416000, uint256S("0x00000c4a34784e10158b231baa9c35b6aca1cb1d967f65bdeed7480f55df869d")) - (417000, uint256S("0x00004462829936ef1967f6604d00c0e034588642dacc1ec827ec3b4468202ab0")) - (418000, uint256S("0x00005debf20584e6e0adb8c05a73bf4b30484451964d39536f50bb02b426b0b1")) - (419000, uint256S("0x00006357b1afbb6aebcfc778c06ed1fc51fbb51a7fc9b882c4c9bb4a35e0b4ed")) - (420000, uint256S("0x000040207b5dc0f5e2509b1216b549672c58d68bac8224f67492aa803b2f2570")) - (421000, uint256S("0x000042124fbfa2ba3db57f39bfd4f5986969c5c4faf8b1c06cf470a5ea001788")) - (422000, uint256S("0x00003c97f3bdafac16b245ea1f3b941c52388be5bec9c087186ac17088d5cbf5")) - (423000, uint256S("0x00005068310436b42ace3d987e8a10eb858b4a23321dfeeefaef22e9446fa2b0")) - (424000, uint256S("0x00005ef6829528a3504565070d82e425614426ab25b45bca04aa4af3d7e0e29c")) - (425000, uint256S("0x000024123c6a896dfb002e50b4574037d07bb94e0a0e9544e67f8a2e090b6b89")) - (426000, uint256S("0x00004f641099594d32e1880080931343420e8597be3939a4f6628969d4c94a4d")) - (427000, uint256S("0x000078d2859474d6b72acaa6060ced2386028e457743bad4cd9b0ced3f8ab154")) - (428000, uint256S("0x000087e3b407861303f6b32015910f4a3dd0f1f78a4e53f178ca442e9275c317")) - (429000, uint256S("0x000060b5c76252c68f358202b6f6c421d5ca9c705dd28240882258df8a809174")) - (430000, uint256S("0x0000305e76e05f96396d96187e6d35e900a4d735aeee6f105168eb45846d7055")) - (431000, uint256S("0x00002181db7f434ad47bfc295f8ebf8caa382f13829ff70b06263648e0e033ad")) - (432000, uint256S("0x00003e3f8d3848689893840e239619e875db02745d68709a533e30fef16fe9b1")) - (433000, uint256S("0x00007ec0e6150fdeee913a18f5c8f3d7099bc744a218dc6a01c63580aa9c8eb1")) - (434000, uint256S("0x0000415b347418526dbbce15098f2d8d1b5a1dd0446151efcfdd3318d5861351")) - (435000, uint256S("0x0000663b475c89a1ead8cc41c1ed10c8fcdbf417d007a6f0b95580a1165eaa1a")) - (436000, uint256S("0x00001783f2a7362a81e0b49cfdeb7dbb032e6e9ab4f66b3cefb4e52f1c5dfb34")) - (437000, uint256S("0x00008486eaa2a91c1ef5c530065431dbbb0c4240dea7a2101ab0582484003280")) - (438000, uint256S("0x00004fd678f5f493ea4e9ec5b54dd66749350fcd325c5ec677c154bcbca88799")) - (439000, uint256S("0x00009244e5e34e05cfcf1bbf619c8a8b43ceb538fabfa7843be9796a295e49e8")) - (440000, uint256S("0x000036b5b2b13908454ede21c5826af6331b728a66da7fc67bfedca910ff9b80")) - (441000, uint256S("0x000034367b426ed559bb7d0b1046eec735a850c53fce26f8b0716198ff90051e")) - (442000, uint256S("0x000059583a267d919d5bc4c65abf8c304150e45a336b9f34bb35ddaf0bcb1787")) - (443000, uint256S("0x00004f414772200bfaf67651fbc4cc103367a5108a35fe026850a4bfd92d38ff")) - (444000, uint256S("0x00001b9bc79d27709c34a96a5dbd6a259fa1495afdf8fd05c23a2d659602620c")) - (445000, uint256S("0x000061e49c4d2d995a43a2d2b491a023444b70aba5150ee4d2789cfca6018710")) - (446000, uint256S("0x000051f2bc3eb24aa77017476494528e0096a0a1cb1e29b4318ce9b3410c6751")) - (447000, uint256S("0x00002979121255c18f58c5ec1a4267104585577b91e2e61682b44d65930400f5")) - (448000, uint256S("0x00001122c7a9f21b96941e6e074122ce55cb412d659ffbfad8a0bebcbd487533")) - (449000, uint256S("0x00005ed4ab8507e94702e24ce16b257e8eac754be1eb3e743b430bdbe3e2eb14")) - (450000, uint256S("0x00001579df12ce8d38b8f4416f221964af6aa54bd065201c578bee6e03596463")) - (451000, uint256S("0x000057eae48d40b8b59a16f65fa4b5902b27dbe0bb5470cd27214f4045172d87")) - (452000, uint256S("0x00006e7bbad31584a17b7bae4b7555a4807ce276cd5046a309d79f0a402cdbd9")) - (453000, uint256S("0x0000011e661360329ac1ba58e11f2358731abd884d1c590525d074195bfc8ddd")) - (454000, uint256S("0x000065acdfbb8d1e0d66b358f81acd99711adedb85f37fd522b8b515184a073c")) - (455000, uint256S("0x000026888730aacaf408c7b6cdd5a4ebce04f4c2aea22061f5ee832a65c52b24")) - (456000, uint256S("0x0000602cca1d31d8a750c84cda243b6d454d4d93bcc2241cf0ae6982a4716755")) - (457000, uint256S("0x00002d7fd2ac55de783d6f69270fd9e499789185e98eca4561bcfb13be663cee")) - (458000, uint256S("0x000015971c8c8c0d2b2ba9b9c0dd5c97091b77e3bd747cd8f5a1396d7cbc39d0")) - (459000, uint256S("0x00008473ea08a574ab72f3246462ca97fed87478c6e5fb39bb9b340f6c8b0f44")) - (460000, uint256S("0x00006487396edc5cb9bf6f5cd62491d1d5a47e89257ac0286cbcc8f428239fb7")) - (461000, uint256S("0x00004579751a959bf33a7418c872ee533c11dd0db764bdbf800317fcca50db74")) - (462000, uint256S("0x00005e57d635a75aae751e87aa9081218babed5522861be57ca55ea5d91e5cc3")) - (463000, uint256S("0x00000fb2816e0c45b5414b72aa67a918c1ffc6a5e114d4f4aa2c1863f9d7ea7a")) - (464000, uint256S("0x00003c2985800d71f2875169d86d911bbf3ede85eaec083869bcb817d5930407")) - (465000, uint256S("0x000037d41b8dcc82d16da8907512e4c0dd4d98e5f8e1985f6c418d62fe38bf20")) - (466000, uint256S("0x000034e51cc154129c394b6130d3711bf930c47a0943c0e08598353565781e8e")) - (467000, uint256S("0x00004c2bd9c0a4414e9c689b21a8266dcd0ea9f0363559940c77f53dac76a746")) - (468000, uint256S("0x0000097d658883238e26170d0244759a6a0fb53204e392bd5607bff329e52580")) - (469000, uint256S("0x000068c832e7335fa8b095693ede2161463e250a6857171efb34e8b2c858f0cc")) - (470000, uint256S("0x000016f55342090f2f7dd1013c1780daea3e18331b9e481e44cc969e42267c9a")) - (471000, uint256S("0x00002544263ac1d071b15575a1be34f3e220e97b631bbd0a37ca2211da3be579")) - (472000, uint256S("0x000082479a6d345f52f2f6a3a7f8b3e1bde3e31bdf6971ae7e17a4e9ceb9f3d8")) - (473000, uint256S("0x00006af93834d09ba9e22c0e9bcf041df511fa73adc7c3b90b20930c14dc3afc")) - (474000, uint256S("0x000009f5395a0e10bd3467d49468f22a17b96cc56f133742b4b94f81d055a1ed")) - (475000, uint256S("0x00000732dfcbe6c20963da08712f407c0137c686c2c5b8199be7ab93533ca75e")) - (476000, uint256S("0x0000212ee23e893f853ef49641d748435b3a783c12eccfaa9d113ed1039a59aa")) - (477000, uint256S("0x00002eb7f121312d1702a95d23e6058d305bc2fcec6b665918d1f61ccdce3d8a")) - (478000, uint256S("0x00007c3f92685d1ab3a31d4462286825e1edf247b74f0f2acf203cfda160b4b6")) - (479000, uint256S("0x0000387969e04687fa879ecc4b7ef42e94d7702b2adc5c895b91036f2b2b32a5")) - (480000, uint256S("0x00004fcf6a8c13044beef7a176c1b872bbec53cc00aee74a4cbc9f7cb332ad29")) - (481000, uint256S("0x000071ff0caf576084563d6bc15fe7887b261a22cd7f2540a047486dc97cd961")) - (482000, uint256S("0x00000d18b5deb42f4a383a510d5ce92e4ffe84cf12556adb09cfc381eae9343a")) - (483000, uint256S("0x00003045108fd460198ab5db9154df288f796e4714d78bfc030bf32a0d72ece4")) - (484000, uint256S("0x000077ab6ef56dc32d8d78340e0f69e9666914ce0299c16d80c9ed44b95cc74c")) - (485000, uint256S("0x00005641dd3b8af4af4328e7240b2f614d4f9bc02d941f1cb753fd9b9e648ac3")) - (486000, uint256S("0x000045d840594db850fdf19c03b29b2587b225f7c17009b6bc92c3a95d913714")) - (487000, uint256S("0x0000428e6bef96b2cfa2a512d10ff22f459e1c81dfd833935bd2bec9a9401c70")) - (488000, uint256S("0x00004b7a10c67d0bd09058183babec02861c0722b09b75038d3779a586bcee48")) - (489000, uint256S("0x000023557e9510f58a398eeaf0c36753b93ade77ce885f8736011f5eba399340")) - (490000, uint256S("0x000021e70faa40c6b1cd9ed3f91b8ad43e2570a00e34c54c5ed74218ac33bf72")) - (491000, uint256S("0x00002edd58e2126702485fddda9eb55d1d39880c44de8d8c0efdcdecdae2722c")) - (492000, uint256S("0x00004f00c0831ebd6675da2aa83a3352e79affee2786a26dab96cda9336b7ccc")) - (493000, uint256S("0x000064438694b83dc959b20b82cd5da3f4622186404753b97340450be0a15755")) - (494000, uint256S("0x00003607262aef0da4f84721222cfb5cbb915db323ec95e1b4e70bf3ce860c6b")) - (495000, uint256S("0x000024c603dbf750c01c2975ab60624bfe5ed2e44532649917d9645ae6209ebf")) - (496000, uint256S("0x0000191661868f098c37178cebe1c4eea37f311eaeb82e5148f1452b26d1fbca")) - (497000, uint256S("0x000029b3502c67a39247b646f286d925af7d0501f994c4367d8769dadaa9ab1b")) - (498000, uint256S("0x00003e7be1463cf709a8a1fc6b431c442de0f5e972b8b2444fcb2d275287d36c")) - (499000, uint256S("0x00000d00e2075b9de577c9f2b21927ea21f4bc6719734888073e039a43e3f30c")) - (500000, uint256S("0x000038889c413584ecab16aaf0ae8f050fec136484416084187a2fa27ed1efc4")) - (501000, uint256S("0x00003e0981fdee677dbfdffbf5910ab8ccab4d91e2e3f10594668cad35e0fe1b")) - (502000, uint256S("0x00000e08e2495364b7cdd48cd2999e568e92f4ca9b27343af4240f9adc194f9d")) - (503000, uint256S("0x000014996d031f6c0b0d3e0268d22c75ee9bed7e9f845f81b8df5dd38b195995")) - (504000, uint256S("0x0000041a7d55d6e9344faff6af6a60608a4572f3c12adb79a326606e5b168cd2")) - (505000, uint256S("0x00002df16f23a38f3bf6e3e42f5f14ff44bb357a975c8eb43d4985f16e4a7628")) - (506000, uint256S("0x000042c9adeb835a1105e772a9fc637d156cc8eff5d71a78243dbf3fe0ab096f")) - (507000, uint256S("0x000001c27a7bf812eb8ba21e6ce59591b2eaaf50121e5c98fd740629d00a4e2b")) - (508000, uint256S("0x00000716bb09e7513f50d5ea46d15324d892c305a11267306c009c720f51d3bb")) - (509000, uint256S("0x00007358b4d32fac5362839bf3bebdd938905766ef3e853d00ebf8557a724239")) - (510000, uint256S("0x000045c957443966535795a08bc5feffee0f0c59b55d7ba727593dbc459a1c34")) - (511000, uint256S("0x00001d9b8898a1a26bec928ded3b3650b6e0b6cf6589f95072fbff5586057716")) - (512000, uint256S("0x00006c49e4544ce19a6b3e4a4e82e05fbc3ef1ce9d3dee203cf09f047ec92d30")) - (513000, uint256S("0x0000585a620e53ace251123b33f40e106a761262d2f3c972fc2b8811435ba20f")) - (514000, uint256S("0x0000393fa870037144940ca55d8160c1a8d502da59fc3197c1156b0af6673d15")) - (515000, uint256S("0x00003c6fc5a0bb67ccaa6c7eddd4e19386d45078982471aa0d9e9895ff53799a")) - (516000, uint256S("0x00002c219d6f22673c1092bbabce56a5cbbbb64f87ec82ef729471200d99f83c")) - (517000, uint256S("0x00001d86620d7cd6a09979763fc54e4adab8c2fbf85c4267a5bebc9c57b011eb")) - (518000, uint256S("0x000059d64e5492cb98ec1c8f696baba3da6e5dac0e9a49957adf0c30df6e1c51")) - (519000, uint256S("0x00005a8cd10c4dfabc4bee6b734ed70aa095c25fcbe879bf4b3d8e18de73d0cb")) - (520000, uint256S("0x000065949a8cd500872a3961e2d5736fee4f84ddb909c1f34969223b0f896fc0")) - (521000, uint256S("0x000027525047176985a35f002bfcf0bfc838fddfb467da7d3a994bcee2230100")) - (522000, uint256S("0x00005dfbd9f73797b39189e7b677d3d02696dc4f20814036f015c5a18d144d41")) - (523000, uint256S("0x00004370f822c1c027c975defd953e4fec60f02b6eaae2a0f0e34ffc0c109f67")) - (524000, uint256S("0x00002840bcce6492e4685fa9a278ace9f8144ec6092f6c0382dd6f6db2e0d637")) - (525000, uint256S("0x00004000bcd7dbebe428be48c0247abfc9c2cf583ac61517c17f6d748b303ce7")) - (526000, uint256S("0x000062a7bc7adfd8963df452ea4f01c547bacaa2c77ff0c728cd74f6c13bee55")) - (527000, uint256S("0x000075be4294dbb03f48a0f042d4e5e0c61b86af6dbbb51a98497ac66c6f60be")) - (528000, uint256S("0x00001c082e744a49944a41eb6d411cef4da29fea9a5d691f5394e74753ddb6ee")) - (529000, uint256S("0x000033f2df7443bb0fd704def1211fd46f69e17f2efaa71ad89a07a662f19447")) - (530000, uint256S("0x00001b24c718558a4c4e08ea1605fc5851706f39b163d2b90e6f89d3bb633330")) - (531000, uint256S("0x000068a1b6fc06c84598d4e1f6ada5fc28f4a35ad1f8ac73fe9e194b3d6f693c")) - (532000, uint256S("0x00000fd8ce5f553c59aeae4872dbe40c59968cd887d28e5d5dc8679c8a8b2c8b")) - (533000, uint256S("0x00003c501980079c65a7affff6ba946c83b16dc1d26b3d543cf2342bc4772a7e")) - (534000, uint256S("0x00000d9542f8f3ef06142d28e71ccd02301f23d1e034655649161b771c8a2717")) - (535000, uint256S("0x00006a4049a70212e50778047963facbb4219773a5cd579a8b561e0f5be54c29")) - (536000, uint256S("0x000067f76538d777945b49185b06707bd205b7b52ccac3734b7e2f4c7ab8a4f9")) - (537000, uint256S("0x0000749689869c525f2950a7c505c33931d9452917d3a2385763bf4d2d0741fd")) - (538000, uint256S("0x00006325cd66e6ca1557bb1793fd082cb18f623951393e1e4168ac9856d33dd3")) - (539000, uint256S("0x00005153466c7801b3b03be72d50615cda701b8caa8e4f800e234c4413d66368")) - (540000, uint256S("0x00000b8dbe1fe69be0c9da5dc22153a6de62d31971e11b991fd69485a81ecccb")) - (541000, uint256S("0x00005019c785dc1a8c9cb87116db8d66e3274d6f5442766e8d3ec903901544c8")) - (542000, uint256S("0x000023728297092f786127737d4a1567b0c2a25c6663703c3094a40de5a764e1")) - (543000, uint256S("0x00003f358514ab25f549124d13d3accb6c0a25733e7f0063917db8883c392151")) - (544000, uint256S("0x0000575c64c3dc7b4f35b4dde172e203ab295be62ffa6d45be6dfa21b0722ce4")) - (545000, uint256S("0x0000500460a844904611820b3aec828f4ae81241b3c1cca05e54cdfccb7afef4")) - (546000, uint256S("0x000074299d0ff2bf246de95724f23ed309e8b9d12e1b126b45206edc7330282c")) - (547000, uint256S("0x000026242bb192f9b1e775072362ee7fd81eaee84ebedc0bac32de3eb3d1964d")) - (548000, uint256S("0x00000433fbda0af11426e98584cab293f1749bdbba31673e4b2213bc9f47d0e1")) - (549000, uint256S("0x0000210248aff1d6d175bdf2ce9f79989956c13bd0c3c8dabb3c3d3b0e06a3e6")) - (550000, uint256S("0x000029c2f399d04f9bda73c132727d12a5c101f20afd7d7d020d5abe8f35d2df")) - (551000, uint256S("0x000084c1cc26236704afd8ae0fb3e6e8b4bf524762e0397650eae55c965136ab")) - (552000, uint256S("0x0000400b7e02ce71392f6f56067397afca0d5344bd5cf5a135739bcf9c02b42d")) - (553000, uint256S("0x000056d0ba072d5e5b8bee481cf580756950be0196e0c0bae131f08effd0011a")) - (554000, uint256S("0x00000856dd4e8a4841b2065c4a2a0fe3c05d66a3f42d53f6850812d58d033e14")) - (555000, uint256S("0x00000cfaee3ce417fcb3a3822da63cea501e0386485a74eff5f22ed05640e871")) - (556000, uint256S("0x00007c178577d145a7dff1fcf71f66d0207fccb9ac3e36bef6d64ccb6eec3508")) - (557000, uint256S("0x00005c4a091b3868f66be76d2d037752059990ab9ae6322a2007b6f5732a6690")) - (558000, uint256S("0x000044442536c02259b84632d7fe6ee73d76cc88cf4bbaab105e8c238b736c36")) - (559000, uint256S("0x00008593c169a4cabf0edee91ae842eb8cc1392270ea8dc9553000a07b5898d0")) - (560000, uint256S("0x0000437b6d663bf1bd44299280d96559c7fceee80dd15909bb430f04169e75e1")) - (561000, uint256S("0x000007d9df6ef7fcabe7e09f06ca0a23b6fce4d0f447b198e4be59246317275c")) - (562000, uint256S("0x000075f98a0c6610b87a01d52621d19d03334e0463bd29f3809e4450c2020a84")) - (563000, uint256S("0x000044a41b5d044b16eea04c7638c49e7cc47157efac851ece0e4d4379302b22")) - (564000, uint256S("0x00003c0f59927b1fb11bee07cc24215ffcf790450e0dde36e7a11e3d81614107")) - (565000, uint256S("0x000077a9fd67eeeca0da1f6b33af856717f9b07867dd615ec03f5f7f228cfbfd")) - (566000, uint256S("0x00007f2b4dddffca860200c50e2e6b44470620a458b98cca605e5789605bc211")) - (567000, uint256S("0x000065fb1b7d7335a0a517ee6cfdf59e57da3b3ec2cef987cf187664a844a02c")) - (568000, uint256S("0x00005d17458233dd11128ce73ef85b1724eea15df792162a08012d08830a815c")) - (569000, uint256S("0x00007c0be6c32678fbad87e682353f63dab380ec92908384abb3baaeb6b6736c")) - (570000, uint256S("0x000070c8008bcf3c2edeb60484503d4f38a6c1790e7a253173edd2fbb3200e8c")) - (571000, uint256S("0x0000121eb903f4281a190384a1aa2a829bf39f26e9691c0634f714919eda806a")) - (572000, uint256S("0x00002159746ea264c72259abdc4c1ab7bf97192ee46b4929ca9072a934710b9c")) - (573000, uint256S("0x00002b3818ba88554534bfc60577ede0dfd6bfa52b3c1fa09a6ee1c5637c8e99")) - (574000, uint256S("0x00000d520ac757f24b221cc9226edcd4d156869c4ac0f08aae15b650a2d2b02c")) - (575000, uint256S("0x000001a04bb7cdee2e607896d5cd735c5c61eadae55d07bab65e417841c675b7")) - (576000, uint256S("0x00003bca98ec02fa0de5c4e78505a323fc544f375e54953ac20d8eeae95886cb")) - (577000, uint256S("0x0000630c7321fdd6d994f70b07e177a047db6986c57fd2bd241801f104c0f313")) - (578000, uint256S("0x00006315654c3acb5e6e71119ef1e9630c545ef0bbf669b6bc48904522c1536c")) - (579000, uint256S("0x000076c2e9f8de87847422c52204cc3921606e7a5afefbe0eecdd511f5f89d04")) - (580000, uint256S("0x0000313f09d83c59644907ca6036f88f82b2bdbbfe5dc91c248a7c9b786dc9fc")) - (581000, uint256S("0x00001bec9efae7cb616e3fa10a633fd77c98f0a0e7994ef34bcd961f0594505a")) - (582000, uint256S("0x00000026a23469d49f5b5ea59211e409b1a2ae9ca9201a32192fbb302388da94")) - (583000, uint256S("0x00004502f499f32f957e83df9a7eea61dbcc5e278acae5d3d3e989957d3d71ad")) - (584000, uint256S("0x000006dff519a0687bd2318d8df706ec23eb10a9a65741e100da90cb7a24c4ae")) - (585000, uint256S("0x00000b114050e479b4647a151444f5f1ebf27b7f4ef0e412225a83d5c0fc872c")) - (586000, uint256S("0x00007782b6fddcd66108cc537e601c27c832406ca947c7877d2fbcfedb119aa0")) - (587000, uint256S("0x0000581ffc434077e9b7df1b1e675a9aa98f7af48a524311eefc62185a96c341")) - (588000, uint256S("0x00000b58b2f21f316a7a424249a5c59e086ecd70d77d1e29bd0fd61515503f07")) - (589000, uint256S("0x000024252a8712b710dabe5aca0fd01e4b336812c7d3620d1f48f2f83c9cde9d")) - (590000, uint256S("0x00005d849ece31d523ec22768684fe8f06826fac681a5e53515799dde5f3c47e")) - (591000, uint256S("0x000066c09b394c4baec74a86acb52ba4133f282d2687ff844e80d1267604b2db")) - (592000, uint256S("0x00000548f8f684f26eec12c2f5ccd8825a457b91d1c4075bc5af79e3e0b733ea")) - (593000, uint256S("0x00003b6eb0b9e00cee3a2c38dfbed8a4eb50c22b5794a55083f895963005fbf1")) - (594000, uint256S("0x000052fd8efae2975a9417575a3c103e42531480430b728f88014c7a49862c70")) - (595000, uint256S("0x000019f7aa5bc508f356fb6b0e25deb30d94257fe302b573f65b908f0dd85db5")) - (596000, uint256S("0x0000551a4c8000f46d4b78444060c998708c20c3c38558886347e959ddab5d71")) - (597000, uint256S("0x000008a3cf44d248337fcb5c2edcbbe99e95de78a8b814556c169c2aa8829e58")) - (598000, uint256S("0x000040de5f2767e0b8517a2d977f63b3704a9e3a73ec3467c81d7d0e5d7bbc2d")) - (599000, uint256S("0x00003bbcdb4fdae10fbffee91333650fc529dc32caacd84e7e3399fb89cd161d")) - (600000, uint256S("0x0000436ae9e88636c65919c5966f9d34a31dc4b65eeaa11f0da4f0dd1dee9149")) - (601000, uint256S("0x00000dc5d8f2ba8821342e3579deb326cfbaaded887d33af51c40e3392e6a4f7")) - (602000, uint256S("0x00007b2aafac9fb53cc6ca0f1d913b34195b5fbb6a2e9109ebab67ba0add21d6")) - (603000, uint256S("0x00003b0cdd0e712cde665f24c0c7ad591618a573dcb59e6f5009005488f8019a")) - (604000, uint256S("0x000050fca9bdd4e9be9dc5ab7aba2102e8b7e8ba8752367aaf1f1acb76573a10")) - (605000, uint256S("0x0000433a13ada8dd84c8e1a50b01aec369596dc15275386b0145a7ac519c6c20")) - (606000, uint256S("0x00006ef55f58c64cd7293898b3ed065129558e0cff65275165392f629908ef63")) - (607000, uint256S("0x00003228eadcd9267b72ee72612b9dc9130e0afa7ebc1ed15e4bdb4dd0bbfd77")) - (608000, uint256S("0x000086b1651bcecc84afe5716e46847d43b0ba7c2e5c4413f40b671683511bf2")) - (609000, uint256S("0x000034966052e04561f6bfbb389dad01bea47d8cd44a6820618c921f66e008ba")) - (610000, uint256S("0x000034a883b6a81b1532959b63a5365343362982bbf37cadcff99d8e60d8e825")) - (611000, uint256S("0x00003aeb64f96418cdd4d2bae7aacc7ad54316bb65dc6cbf38d41861c2dc666a")) - (612000, uint256S("0x000049f102cef61bae1cee19bd50d4f37f90f3e2c67b11b556bb2b02bd3976e3")) - (613000, uint256S("0x000077fe70c0c0e02ed4c99771cf2942ee312569fac2c728f271f17b425a3609")) - (614000, uint256S("0x000063786b5555a2ac21002d3afe8e5d7f548965a60abd146e75c6056c790a25")) - (615000, uint256S("0x000022495d08215a51e3d1209fccb4423d8649ea23e474d7c72fd7bdc6175dc3")) - (616000, uint256S("0x00000544e44551824ac7f2491ad19b2463ee63cf28fb317a21811282da68d0ea")) - (617000, uint256S("0x00003edd4418af458ad224648d1d2b080e5cf76519836d6ee39fb3094e9e8d08")) - (618000, uint256S("0x00008b7128113a91fd7c7230141de8ec0613d0fa502caf384c4026a4af430b0c")) - (619000, uint256S("0x000047f2eaf7db232149e151a714f2fb550b8a8ba30d5b9382dbf367558543c0")) - (620000, uint256S("0x000083e3d11d57f10ca889db4f39a5a1ffcfbc779fb147e2d78c003488a56937")) - (621000, uint256S("0x000054669b9ab9844d3077b687acd5a6ffe41dc4760d24a0b349adc110419cd1")) - (622000, uint256S("0x00002fd67bbd742bfd6ac69836c6e66dea835687a3e0254ab4c2eec0af6013bd")) - (623000, uint256S("0x000058d8ba58d2bfbf9a0b2281b9fee517b7286f21c188b74b70a5e3e31538d3")) - (624000, uint256S("0x0000187c49df0bd5f0b0b959623dc88d54ddc0915631d9fb448c6a1489afdccb")) - (625000, uint256S("0x000078124e3a14bd08b0a1c8d6d4cfd94f1b7215678d2550afedbfcc0b238430")) - (626000, uint256S("0x00002bd802b4710dee8a3f7b79ca7ee7ff8229abfdd75fc1b999e8d3f1214068")) - (627000, uint256S("0x00007e54bad62029382c902d40cf5d32b24f944528985340818dbf5d2d8e63ed")) - (628000, uint256S("0x0000827334e651c03abe2f1306a90e6db15499115d095f9837bab698a90147c6")) - (629000, uint256S("0x0000796aa83d5c501960482dd2df7f7c2046bf255f529d229b4037dac1dd9c64")) - (630000, uint256S("0x00003cae63886df0b0d10fc0915289bce98117b17c1bd5fc4e005f75370c470d")) - (631000, uint256S("0x0000367ceb36052ca267cb71126c395d52cead56b184d97b8f1dbef6c31399f8")) - (632000, uint256S("0x00004a25472d93f6b45b52f40cbe4f96b6645dccf2054742fea6310c5275ac62")) - (633000, uint256S("0x00003e39e64bcaa6e2148e63fd4bf4848ebff537bdda354106c6611d9ed4a661")) - (634000, uint256S("0x00008752aabb421803dad99ff286b141dbb8f9448034b9bf123163eed60d54bc")) - (635000, uint256S("0x000011d4b790a0d94080ff1ff1d75fe3a1371c1117f72520bf71e29b3031e53f")) - (636000, uint256S("0x000039d22dee92b88b9dc801fd80a64bc1a5327323a7734d86b6fa06d5118630")) - (637000, uint256S("0x000020ded38a69de8d8f95a0429aa22f6ffa87777421d7c1e7812af97bedec5b")) - (638000, uint256S("0x00004c7bd96e45c157f47614bc1749ea05021c4c0568556963d3455a328ee8b9")) - (639000, uint256S("0x00004683154e1dd208bf8e263f7096fe65b62eb12d2465a0bdb0d3fc3e68dda0")) - (640000, uint256S("0x0000266d50614b362c3c45f59a016843277cfe0905db3cdcb15a2accd89b97f6")) - (641000, uint256S("0x000033b482977874fbfcd3cce372ee98b4cfba672f00a6c8302260ade7a864fd")) - (642000, uint256S("0x000066980f706965647570772006a43a09f3c1f076683ca8ab3f65623ee90f1b")) - (643000, uint256S("0x000029446689b15ef5cab50e541c96b863c7f97bcf491652ce750e7c928bca62")) - (644000, uint256S("0x00006a7242707969e716d5b184689b1ffde9a19e109df7366f226e24a0220657")) - (645000, uint256S("0x00005f5bdc31fcdd4eb55a02a48a8b73612def26563724a959fd759c592816f6")) - (646000, uint256S("0x000052f597ec93b183e4606bf9ef91f4ab65583ae4572b859326a0afc882c173")) - (647000, uint256S("0x000075ea6529ba397732bf3772330858424e8524d120dc8bebdcde0a002b3fdb")) - (648000, uint256S("0x00006b277691edea33fa3ca4f23691d0a7182f8ebcf9ce00d780abc3cd357b47")) - (649000, uint256S("0x00002c5180f4558a08f9af7dfe25d7b9f0b766c9703bd73f0aef13fde010123c")) - (650000, uint256S("0x000051cb54c7a3308052e8136db2c9615c94bfec0979697f251f20847cce4963")) - (651000, uint256S("0x00003e2d493a06c223e31ccd12e3b45f6d099bbc55b39cd0672d9f0547c02411")) - (652000, uint256S("0x00004f95122c592d3a77071f0ea04e48598b211e95ce69bbf37107240be5bd4d")) - (653000, uint256S("0x0000564d9bd27869d77d874e322b3eb4f88422b7eecdd0f0f1f8846b16df693b")) - (654000, uint256S("0x00003847ffd4976a5e54670c7f226a37cd1677d80aa6d9d23fcff37ee385c84f")) - (655000, uint256S("0x000083c80ce350c84a27b755f8620d57d1937dc2171b22063abd4a43335fb0a1")) - (656000, uint256S("0x00004bee79412b8865ad1bc7d3a4bdf6673cf439faf7d06ce4c25e18278beefc")) - (657000, uint256S("0x000053773f2064b2ef13122b88d9f8cd1403cb5f690480fc8358415c7c6342aa")) - (658000, uint256S("0x00002002beb709452d8e6674e7e202e0767845252dd09ae22277447c580f9466")) - (659000, uint256S("0x000007d0ea4b6b588610a2d8e7e41b1d8bdb788d1b36e16bc1970a30eb7701c4")) - (660000, uint256S("0x000040122c9700917a83fac1ce3790ae0a31d33fb1a9f7327d5d60932c2d61a3")) - (661000, uint256S("0x00007b94c7d9d8e37c4c3f1c244f662fe979fc50a93a10a0648e50658889c479")) - (662000, uint256S("0x0000509f00767d1b1580e946b82fa7da0c4f9d34bc3dbb0d291d2c9b0266e498")) - (663000, uint256S("0x00004a609cc9b256d7583d3a19700f5bcc1b6f3e99ccf5d25f645f03bc4a9299")) - (664000, uint256S("0x000005da1969138a1bc8cc763aef2e4bc266f447df0fa90e70b893b920bb808f")) - (665000, uint256S("0x0000352b38d8442ef68b046d14dc33837e087771ae201dcfc06f16257a65e5c0")) - (666000, uint256S("0x00002ec8bc083ca9f9855301ebc2cbeab83e63630247c74134b960c3e79f58ea")) - (667000, uint256S("0x0000322a13f6c6b53d290e5810b387ef622108565b43705653dc7194f712f7d8")) - (668000, uint256S("0x000052aff29d93c1e52f3bb230c082fc5cddfa11a8f6737ed7369c4a205a1eb1")) - (669000, uint256S("0x00008f2b1d5f21b85d42456a4d1adf6031effc7288725385cefb2d380045eb98")) - (670000, uint256S("0x00000487b1a11a5d1c671e788d8ec240585b35d43e67f4a157c95d2b874e05e9")) - (671000, uint256S("0x00007a4d20bd194b58b0d8322b40905687b8625ca019396f281cc69e236dadde")) - (672000, uint256S("0x000065589b9a13c03084ca14f5dac85f79ac25020cf0bfa60b46eede759d6b1c")) - (673000, uint256S("0x0000496ff7888b6343661d8939faa966491e3a5fae008f265a25541be94811df")) - (674000, uint256S("0x0000827374e8782d4fa84e8dca701696a237fa437c211ca2a1d6eb0a3a9a5425")) - (675000, uint256S("0x00002cc1f83c1e50155f7eb8a587b446957105e3a439cfa39231aaa430b181c3")) - (676000, uint256S("0x00002bd82232186baa40f7066a72bc1374a37b9d2daebb1cb45c702881d53620")) - (677000, uint256S("0x00005af1e66043923b5a998e2e10b07b1923761c4eb6a9dadc06ba35a9cc05b7")) - (678000, uint256S("0x000050e10a55ea1e814af34b1a6b948b1862ef5d80095d69576570bb4d57c18b")) - (679000, uint256S("0x00000fbfc06c8a4063e9269731d3af840215667a2a34117eb6e792b143303cae")) - (680000, uint256S("0x000068e3988fb8e32f2aa408d3414cb9da9748da7d8250fae08dc246317ed65d")) - (681000, uint256S("0x00005255d2baf40602ec07b09486bcb5ef5b1272ec8b2d7fa0fd8a7e91498e32")) - (682000, uint256S("0x0000385522458cb6b4dd4a9b8f651276d616c157e9892e8159fe334bf1e41ba5")) - (683000, uint256S("0x00007f98e027180bfe9244f6a34613835fbf242b053e4d35c4a5c7fe275fd5ce")) - (684000, uint256S("0x00000398b4a299f9e2c2259eb9caf37b612f8b9921842ecd6459104a5c1728c7")) - (685000, uint256S("0x000071fe00ba95387fb8dee3185f07698f1bba98af44af444ebe10fe0222d506")) - (686000, uint256S("0x00006aad8ea1604cbc2bf35ee899ff71bf43be5c7bc38a528a69dc25632451b2")) - (687000, uint256S("0x00001c5353578dbc2433a6bb899bdbf8838e244f6fdac167736043566a5f8b9a")) - (688000, uint256S("0x00005673acc55810e796f5e1202aaf9a219cedb78b22500a367ebe4c21f862d5")) - (689000, uint256S("0x00001a403948a30ed565fda094be582636947a6708562dbae3d7806842a90f69")) - (690000, uint256S("0x0000084caa9255d78ceef4411cd69d319e78eaf98f5062157944682526eaf889")) - (691000, uint256S("0x00003c6d705d2b55087b3fe0cf00fbe9235e04faad5f67c6041a35e0c95e2233")) - (692000, uint256S("0x0000082319d11fe87e8c905b1381fca11c56c94087c8b83a116d0978a9b96713")) - (693000, uint256S("0x0000054e84d1ee41de438f81e98efa858c5cf350a7e4bbbf91696ec018afb5e9")) - (694000, uint256S("0x000059f4bc84ac5a4d1692b7e39cfe5637048fc3c8dd5bf11f9638deeaf2be4a")) - (695000, uint256S("0x00004b912acca69c8324b152c63be6c56b6c96616d8670e3313727de3fdff809")) - (696000, uint256S("0x000060812d53e1948414d700505cad3634dc100c9b4c943919fd2ae2d1f32c7c")) - (697000, uint256S("0x00005aa2aafa94b759c9db1042a38482b8ca41135322300b7ebd95a39db2950a")) - (698000, uint256S("0x0000209fb13efbb40e6f5dac563a53d65becbd897da138bd95166ad3427c4476")) - (699000, uint256S("0x000044ba748f6da341af23bfcf6eeb4c8fd525dd30721f2643eaf63cbfd7723d")) - (700000, uint256S("0x00008edc47c5bb08fa7e565022caff0de4735bc6b3a50ce6ce50df4ec667700b")) - (701000, uint256S("0x00000ded42dec98258c983df777daafed6cfc99f0fdb08afce18b5bec2cea0d7")) - (702000, uint256S("0x0000524d8b89cc67fb2cb824ca6cddb3eef75c3dfe1b4a82c5f84a438af205cd")) - (703000, uint256S("0x00004322186ff4b1a342fe99bfdfc3789878d47313d3eabc0995c1550ef0f34e")) - (704000, uint256S("0x00002c9f1dba514d11cdc2b61b231b658888ab4c418780c1ebbd83bea65082f4")) - (705000, uint256S("0x00009322b4e8212f5ebdcb2ef4847a9d02523aa6ff9d9e4a958116365773ae70")) - (706000, uint256S("0x000095885e9010d3b50f941fe7b4985fbfb28b995b85e7b74923624d9eea559c")) - (707000, uint256S("0x000028dc64df302c6fa105d9eb10298072a25de66cd38c449a0eb3a34a8cc75e")) - (708000, uint256S("0x0000052ffc7e92c94142c99d59930a1bef10ac5239f756b668d7e88baafcd817")) - (709000, uint256S("0x000030ec146822e74348d354ccf6ce82eeddc547e412ec5f3c471c8c86c5b6d0")) - (710000, uint256S("0x000078982d79cfc589556fb27f548885bda5e146b1327bc5bdc0eecbb58c5f46")) - (711000, uint256S("0x000064bdb4bdf8130f3b4238a5f34a93e30828707edbe44d709da995d6f3040c")) - (712000, uint256S("0x00004b0c9fe52ef4864771077d13d56154f354a4d17d571a2f8eefd7ac15f2fa")) - (713000, uint256S("0x0000305af605f5af748bbb2021bb68aa936662c7b1f1f12f002a9f2b1ff4b804")) - (714000, uint256S("0x000001b9360aab6238bb98306a33349a56605096432389e1ec8c4c17f52ac909")) - (715000, uint256S("0x000035a37dfaf08583796f0d6c9fd9187c8c5ab7f4ca72d792c148dca388b1c9")) - (716000, uint256S("0x00000cf4b5e61baa6fcf3599c263041d4edbc26118610f0ad4ad7285cdf6e8c0")) - (717000, uint256S("0x000006b81c040c5ad7538726dd735298bd319ba41021d15eac33d6b3d9b3f49f")) - (718000, uint256S("0x00001851ef32ed7435aa45e983718409ec0451516a7c603261028329fc706c2f")) - (719000, uint256S("0x00001761a4179610235fa0215c6f96e899a9a2b44e409b89bd87da1c974e3c4b")) - (720000, uint256S("0x000048a83b4832a27349ebbd2f73414813c495eca71ae7db3db46ab01606ad79")) - (721000, uint256S("0x0000623d0cb4c9c4f8ce5b5e82a5a91c11526a49d093f779d21dbca3f10ca186")) - (722000, uint256S("0x0000230ca89bbcab6f867b92991eefb8d7eaa999c1bc3e88ec20154a242f2c04")) - (723000, uint256S("0x0000759e37d650242835dd67827cc10f66dd664f078344e1689f51d75fc57daa")) - (724000, uint256S("0x0000173e6ba51cb3b8c239eff1f3e5f326304c1e60a0a75fc126509deb0a4780")) - (725000, uint256S("0x0000048dd2c527da42b919976bcfca2295f0c7606b9adb8c3e81f0d9d8cba6fb")) - (726000, uint256S("0x0000331afc3cde5cd724c02587cde0e628d10f5cfd4809fc1edef72239944007")) - (727000, uint256S("0x00007bbf39744b920d3edff5941fb4d1f4ab15f3c31cb61252ed6f16c921e5df")) - (728000, uint256S("0x00003117719719bd2adff98da1e73acc7b66e440c4d29a8e983bd85044419f9d")) - (729000, uint256S("0x000025e2fc0eb94bd418a21fdbf5f90c717bc5cbf6e92acac3a3b009b1a3642f")) - (730000, uint256S("0x0000592ff5248f0fbf7ef9e39e0560f95975803312dc0d7c8de61cb3183c452b")) - (731000, uint256S("0x00004fb3099863dcf7c09b6ddb6be43357ca72b848b2bc4af71dceb6210ac87f")) - (732000, uint256S("0x000001f13cbd71460cbe1720519491bcc0e92cc00787474af7a26f5e5e31eccf")) - (733000, uint256S("0x0000206b824d514c9fa1ee4da1688765b92befde69427a925edb76207c2b3894")) - (734000, uint256S("0x00007ad519bba141a425208d02a8fa9c6356f079c456a37c593da53befb1e580")) - (735000, uint256S("0x000024bb3077ad1ee51ae6bf04fcd14cfc98bb0bf7d4eeab7efbec48c05a4c80")) - (736000, uint256S("0x0000500f718bb843769d11510234ffee56a6376f4477f36df4abfd936c982737")) - (737000, uint256S("0x000090258d994c3bb5f14ccfd7bcdc33c6023d8faea57936ecad8444df570c59")) - (738000, uint256S("0x00007d613b9ba29af0c2a6afbf3e869ad489802e405a2ae6d01b807b1926e234")) - (739000, uint256S("0x00002d798dd51d62f09cdcd8b04fd39406d1f150dffcd59197c72b5fbc4158d6")) - (740000, uint256S("0x00006901558a74158f7b154635dc1ca20db88135ad4bdf5a27b7110e131a9ad4")) - (741000, uint256S("0x0000797ea4c8080df06c8bf0385e73114ada78520312eed1aac310525a665d31")) - (742000, uint256S("0x0000598add4be1345b741bae74cb53cf354d70ba9308023feb8c44f3edbb75bc")) - (743000, uint256S("0x00000c4cc674e30db554dbbbabad0ef19e7586fba5846d669804662871b4fc5f")) - (744000, uint256S("0x00006292a417fc4053bc2de0703d2b6848a281e7423eb67a56880aec7fd9032e")) - (745000, uint256S("0x00005917cf49f943ba8f7b301601f4cd2ec19e612da8d1e55d88f7fbd07cd4de")) - (746000, uint256S("0x00004ca89cba20b7735cd3bfbb13d47ff639b708c44a61c1e8f8208940510a11")) - (747000, uint256S("0x000001af21f0300a4ea047e6c08594190be99a87bdefc915d78263500bad653f")) - (748000, uint256S("0x0000193010ce9c9ecffb9064c8a2ba4977056e664f0f0f11fea044fe37491331")) - (749000, uint256S("0x0000671675eb405106fddf7b1ba5c3aa58c3975f02ab22215e6a13875b8ee165")) - (750000, uint256S("0x000045d2c9dbf992768e4855d0b533c8066a636c72773c4e9de29c167f255f6b")) - (751000, uint256S("0x00002f1de17d93f381ec118a265f2fd2cbd3d6944c2ce49a7366506827e6d082")) - (752000, uint256S("0x000053b86c2f9e8cb9c91485b2e84972902b2ccc8e26ff7b370a98e0f6ebda22")) - (753000, uint256S("0x00006120dc67344507cd5df80935e6a5ed7e0d6517d26ad858f3e7c3cef14760")) - (754000, uint256S("0x00001f51cb470c709aa77787bc57045ba2fa6c57b840269ed3978293c8830135")) - (755000, uint256S("0x00001575b45b0b20db4e248a8d64525c805d41324dd44d974f109752b9a2750a")) - (756000, uint256S("0x0000287d75aaba029c56d0758655eb98a8b6976257ac2a406e84cbf228ba8689")) - (757000, uint256S("0x0000236b884919dd0a00062ecb138278d92d1532ac0aa0b4f5aa8c6bc3cbe87b")) - (758000, uint256S("0x00006595633e8b84d40afcd11e036160edf30a155cf6df1eac442653ebbf20e4")) - (759000, uint256S("0x000049967003dd0d3ccec6a67ac9e71979d2baee621b7e00b2a79d6e89474bc5")) - (760000, uint256S("0x00003bed363545a3db6a54e6ed60e0494b73e686d138fe60b87253cf64e14b49")) - (761000, uint256S("0x00003b9833902363bab63cebbd86510b022c3d211bfb9357cb16d9a036306317")) - (762000, uint256S("0x000059c89172ecb70a4a599dc4c6d0ece81af2d09645d7e163459f76483b29ff")) - (763000, uint256S("0x00006b73f910a7495f392309fc49c048fb570d354d6f68e1b55a83fe585d5c0e")) - (764000, uint256S("0x00007d0f42736fd57f9d9b28e2a3a014c1b70f39504464f78ae56345c40cf8cc")) - (765000, uint256S("0x000064ac901cac48d977c53efdba1a5f6252c8897a72001d6288a41cb50ea60c")) - (766000, uint256S("0x000020a571e231b3afe577748c0e224df57a37738f4add606efe7a0b28a5e075")) - (767000, uint256S("0x00005f17269fc96784a2f146f5aea75eda1da7e0e863b71d79bc9b491a6610fa")) - (768000, uint256S("0x000014f17adaf27eeab1db7dd1bb25a03579d042d403a8c05585c819d3cdec49")) - (769000, uint256S("0x0000047b0bd5ddb77a5415d5a6c3ba79d9fe71f452cc6264c1fd56b73af74383")) - (770000, uint256S("0x00007385edc0ff7a856aa6921cf5fe7860e915a5d46f6c1676685dedcb8f5271")) - (771000, uint256S("0x000065889c31b9055c4ea88a55b6d91189ad310918d397b859063ae724ed1e24")) - (772000, uint256S("0x000007cf336cf1f316556473f4f66b9d6b716956960c0d9bcb9905540dafbc9b")) - (773000, uint256S("0x000043ae84959c8f0562a9b26dbd2ba02f1bde8c4243c74a0e770b50780c3ce9")) - (774000, uint256S("0x0000507b6b4ab724ad4c7cab6a80e18c728c9377fd4f0b2d0fba863c50b55d4e")) - (775000, uint256S("0x000010825660f5abb7aebb3b60d64a62f5fc83ab259547f46da9c27b63ab5eea")) - (776000, uint256S("0x000013b6812b878b5d05f8f4f5d9b72f14a6dfc8f3c62f522965d4b76e773fb6")) - (777000, uint256S("0x0000029367c70dd7cc0a2561e5e02a608e6114fd5496da97fba27426187eb42d")) - (778000, uint256S("0x000036db0575186a39cdce9e74dd287bee6c2de0967e2e5d894203425284719d")) - (779000, uint256S("0x0000442dcdb9eacdd7e7891b9aa1a59960109bc31d4d74c41735d92e98b8fe1a")) - (780000, uint256S("0x00007078727c38b3dcf92001100fd25f90feede5e8a908ec9607b112cbc073d7")) - (781000, uint256S("0x00007540200124c254bca2750b16e27df38e1a6ba50a29bfe53abacbb8891446")) - (782000, uint256S("0x000058db5be4534b5409192b5fb9fe2c2f39da12518c971befa98961583776f1")) - (783000, uint256S("0x00005a1a81a2f564e1c8939c37f535bdd8e2660ccfaa70d7d1cdc95dd51517b0")) - (784000, uint256S("0x00005cc0c98bd06589af2d3130bf409b4eb85391cf75616fae85aacd46d036f6")) - (785000, uint256S("0x000043c62dcb4306dbc4cef5d778a65cfa70c539eff73c3f8f26856a49fe5eae")) - (786000, uint256S("0x00006596f5f4cca692cad747c1d883a91fb92dc4405a26f071e031c3eb3bc3f8")) - (787000, uint256S("0x000038db38f8e3e341731623b7f0129d7cf87d400e59f2bbe016caf6f5d270f5")) - (788000, uint256S("0x0000125fde93c4decae31e759251dd899d1bd1d3106b4ccca91ad8654c59ea67")) - (789000, uint256S("0x000056fd200edf535cfaa34da9b89512f7027706d579f169237b9b28b7af8b84")) - (790000, uint256S("0x00004d295243452c2946e9205cf3bc59475287c1718676f6e50e67eb9901425a")) - (791000, uint256S("0x00005b0fd53c0c8d6ea717007cfabfe196eacbfe7168bd5b0f48097e6d386db8")) - (792000, uint256S("0x00003e52994334723516d6f860838dafc1b073b58a60a52ba939c2bc7c0aa2aa")) - (793000, uint256S("0x0000658d89055152ffa1c347d3637fd9d43cd3d56891eb779af8f3df705f725f")) - (794000, uint256S("0x00007f557f547b8f0283475eac5670923727f9fbc8bff505ac45f87a631b4722")) - (795000, uint256S("0x00009859a0766efbab8f636bb0558bcc425a4aca527662bc24fed7769de654cb")) - (796000, uint256S("0x00001ddb44be45a829f3a11dfcde700bf73666590a35675e8aa675e27b57912a")) - (797000, uint256S("0x00004b21921081c50d70b966de583c939b1e65181c268fe352f72d3638cb44f8")) - (798000, uint256S("0x00001ad3dd046ec41fe0c22dade01d9c99a01fdd173788606361f949a9fdd320")) - (799000, uint256S("0x00005bd70b917273f3824d52813b15b7ab5fcea8ec309dcaa633c02f1705d3df")) - (800000, uint256S("0x0000640fc41f9dc199d59fe773bb333c13dc2d908ce7ace0a1d066e1fea1e13f")) - (801000, uint256S("0x000020379973ece3b4b7bebd8b01d2e6bb5d0a20ecacc6dfa0cd3237c65cc51d")) - (802000, uint256S("0x00000628c6bdad96cc7514870f5cba7c87052e94c2ce89bbab6f504fcf5044ae")) - (803000, uint256S("0x00007030da49876a11c9987be43f81dc30b0ae0a21b7d31d762b8ca980ef02b8")) - (804000, uint256S("0x00004fcf77675b057bd582cf4c2667f2e2858ff6f70b904f1cb955c6cdbb6dd8")) - (805000, uint256S("0x00001ac86e1c48ba3efd9838d3de04c3a2eaa561bc41597cc0698cb18623bb97")) - (806000, uint256S("0x000009c0d52ea3500e4d7a2aa88e51dfcf3e766da92a7b3cf36377bdecb985c8")) - (807000, uint256S("0x000019de53b77c617ddbad1eb5bde1548519075f5f8cc3f3ce812f99a3c78fb3")) - (808000, uint256S("0x0000711e70d75daa3fd971fa5712a2c43ff7c27856a195a1139c932c32995219")) - (809000, uint256S("0x000053b323a89bbd37abc5059868692f9c2df68431a4b781a36a253fa6ad721e")) - (810000, uint256S("0x00002735c70731b9ed94dabfd5473144a535af478ff04f07e7a198a5062c6516")) - (811000, uint256S("0x000076c3247095eec378a1f599d24efdb39aff39f57f954e797d88f82ddb49cc")) - (812000, uint256S("0x0000295c9fc0ec0403768b02f2310580a25ffa7c1bb70f988ee7d00e79aca30c")) - (813000, uint256S("0x00000a89cd18698c34e77938f982f1041177a3ade727bb0454dad444f55d1d47")) - (814000, uint256S("0x000034b41e2142ea9084dca685a9f6c09ffae63e087b4211350a8aeef5b894f9")) - (815000, uint256S("0x00003798ce72491fe10acc35c4d2252b11e70f41bde2c23a9f5d39f62156363d")) - (816000, uint256S("0x00002f241d3f9ade027e2cf64b1d33dfa85412ea01e59cfdc0f95a17254ae40b")) - (817000, uint256S("0x0000290acf337ba1f9e654942a7185693e6eafca61f4d91e088f63fb1b699b44")) - (818000, uint256S("0x0000098b7241ca6e928945f6f0f6cca48e229f6ec429316d6d16a2821176d0e8")) - (819000, uint256S("0x00006e719dc18f28f96bfba7bdaaed3b150a357a8b0f5cded43d72f18d49e835")) - (820000, uint256S("0x00001df952c416cba92cdac45913475a1e2494e95a4190960e334240efa3d2c4")) - (821000, uint256S("0x000011cf917ec5206c48561b3f860d1d1fbbd247caa9b0801b446541c74a4560")) - (822000, uint256S("0x0000512bb99135f616dd045a14650df532434f4db5d0f1ec0c8c01949dc84c12")) - (823000, uint256S("0x000026b71e291a93b0eab69e37e1146c51bfb38634c6150e78f14244ee202b32")) - (824000, uint256S("0x00001db40132c5a7be5d566d2e2ea01d494137cc946e60a195d90fb67494251e")) - (825000, uint256S("0x000067856552cadc5460d379999008d307233511625744285ec13b0f61289ef2")) - (826000, uint256S("0x000011554c5b351623f70c195df2e94d519d606d7d8c3fe52faf8d7cbe79f51e")) - (827000, uint256S("0x000026404e235fbad5217deaa05cdcefff97c1bf03d3936b6ef798dfbae84a59")) - (828000, uint256S("0x00004f553a5c9f4d1740631a9dffa5bd4e93890485295a52bd1f5ba36868fe22")) - (829000, uint256S("0x0000218e741ad6e0e775943a954186c9cc9d1cc116aefd4e7b6bda00184e5ccc")) - (830000, uint256S("0x0000313d0909651b5f2bcecccf811de988f06ba779ebcec92ddaf733f6e4b2dc")) - (831000, uint256S("0x00007b086c73e29f0bea8a298a2847f82f42f9630e5d1682fb235597a4b324a6")) - (832000, uint256S("0x000072b3999cf87b5c419633816719c80cac0a17891a8951ec1f714a521c2eff")) - (833000, uint256S("0x000075bcab0b6a7ade6eff8aedb76ce76a8f6b0a2580c520724063b61dff3765")) - (834000, uint256S("0x00003f851b1f2f7c6698c9e0806f12a9252ed41038eae2e31799c2eaf94fb76c")) - (835000, uint256S("0x00007549227d77254ff024b5e20d4bb366c569d5be6e4aacf268b73c0fafad32")) - (836000, uint256S("0x00005c3837f6537ff471f77aa1a0a9ccc70d39f91b1f36a686213cdab7a3bfd7")) - (837000, uint256S("0x000044c7c771ef1ee06f8856b48a93cb5a73f08ff2dcdb45d02e621400c1a5a8")) - (838000, uint256S("0x00007cf6b7d34c5e26badd7f02eb191e57764ca890eea70fee06b8d4a25e8af4")) - (839000, uint256S("0x00003c36acd2ce2c47fafd78ba3fba03faedc703290f52fa2a176387c1cc642d")) - (840000, uint256S("0x000067813b167220e4936fef9a0f283e56d6fc83a163fdc44b2b6f003f2dc660")) - (841000, uint256S("0x000024433e3ceb8b9310df1ee1824cff4c28147d9be66ae1cc946a4b3c6fe1a7")) - (842000, uint256S("0x00001e0fbc7a26c349d47b983369891ce7e321bda16c4ce5f01872aad350502c")) - (843000, uint256S("0x0000650dddac5532e8aa0fb7076301493ac82d743517fea3978e27e1bb2d1cf5")) - (844000, uint256S("0x00000a89887a2c3734664bb2ff20051b20772f3946be5700e2d5423bec4c8dc1")) - (845000, uint256S("0x00000c23bc1535ed29fe656dc1ccc23209cf90ca68160fce1861e53b8b7ebbe6")) - (846000, uint256S("0x0000388e10658ee10e6e8b84f8fd31f53f4327b89dfd9c0d345de3f8a99e60ef")) - (847000, uint256S("0x000076958ba49e7269957fffab7b34dd27a760d8c6607ff023506c86d43dd340")) - (848000, uint256S("0x00007d9fd506a29a41cb6c6564c6dca3086355f0283bac6e640ed3358c3bc3ca")) - (849000, uint256S("0x0000336cd0b1dd763d0f9975b2019e93bb4feee6d22d440cd2a74272fb2f33be")) - (850000, uint256S("0x0000612f3aff24eb07160699d27a4469a11fafaddaa323010e88bb3f69cc7316")) - (851000, uint256S("0x000022314332713634c34b35a699ae4648f7a09e175477f7475485068c6f2a87")) - (852000, uint256S("0x00001a7415c2a02b0e2916775d4ae9edc34ac803aedd274b1c925d78a212a295")) - (853000, uint256S("0x00003572645e601576800cdd55d6a58c37c5608cbb51af573e34a29c136bf870")) - (854000, uint256S("0x00002651664ff10eae80bffa2b28aeb93493fdeae60d230b581aa0bbd7885200")) - (855000, uint256S("0x000080ef07f534c70ffedc956fc3bd78951ab0eab50e776ed05aff2ebd75eb37")) - (856000, uint256S("0x00003b3872d24598dcc10849502d2b0a50daf6bceda6f707128542f96687fa19")) - (857000, uint256S("0x0000305befd21df66a1ad45ade766917ab3471bf7781e59d5a87ac0cf8bc1db6")) - (858000, uint256S("0x00006e093156dc22a333f21accb49b8edaf9aa60e49647637a6dab023717813d")) - (859000, uint256S("0x0000182f21dbaaafc38859083105b36905400bab818cf87abe5c0ed52bae608a")) - (860000, uint256S("0x00001999dd005c53141c1728f40bcdd4b7a528ba65b180567300979194b196fa")) - (861000, uint256S("0x00002d3ce5b2bf5af077430b51e5d3d9c0ae8860836271b6862168fe79056632")) - (862000, uint256S("0x00001529bc0df458d3e53abe27b51214a7796c590b324092d3dc8e610883f7be")) - (863000, uint256S("0x00004a63b8657b4880ecfa9e5b9273d180beee36da365e326d82fde2c1b2d988")) - (864000, uint256S("0x00004f8276429ef089105e4c90861cdbd03bbe0fd84447d768bc193a855d5473")) - (865000, uint256S("0x00003b51c77b529800cef1d47dd1586a7500f29ae92cb3b8768ca81f54ddc0a6")) - (866000, uint256S("0x0000294bb5e3779b42741d53fafccf9c32ce7467808966fc693d9dbe4660b512")) - (867000, uint256S("0x000074c7b653bd9a76bd1448298bd864ddf49511da82036a56086870abf9805e")) - (868000, uint256S("0x000051ea7b3d3e3be6f8f23e28756a69f2ce3c44e89dc698261fe6c43801a4cb")) - (869000, uint256S("0x00000d7bdb810c06e78497452fa6ad3477e76928a0e0149949b6857a6ee12b95")) - (870000, uint256S("0x00006f4e756f969adb221afdcddc65979660e39799a9a9103d9d883bcc4c9f72")) - (871000, uint256S("0x0000002fc905a1f7c67431810d1f14de0a2b8c3387bae141484820b1fb584ce5")) - (872000, uint256S("0x000032760631edb2b1999186dd75080ec72bb7217e3c9a206a2ed575abac6538")) - (873000, uint256S("0x000020b1577c9844e736554e4f22c0e01b7a4be8f623799b42780583f68df8c3")) - (874000, uint256S("0x00000593b9d731f4d6499f9674d69ba9e015284b1282f6f6d411cda553530a2c")) - (875000, uint256S("0x00005c62416a0650de882b93d2f713d680b5505b56b07118d402b51192a5c07f")) - (876000, uint256S("0x0000301509a3d2fb62a1878b3b86a8eaab42a84eac37453781c2cf712b2ce747")) - (877000, uint256S("0x00004b13371bb0f27014836f29886ed5018bf08572a27b7b5061c8a1acc7f98e")) - (878000, uint256S("0x0000156bd2d1088f84b7d3e46bd31ee5353a551dbd6a9f2db128c3f9cb67767e")) - (879000, uint256S("0x00001fd3d4255632ffe63481aeb2fdcc683df0b9135bafd15dbb309561cef581")) - (880000, uint256S("0x00008bc77e18736b7876d995db87837974fc4e723353a5339f52361bcceb632f")) - (881000, uint256S("0x00008f9fd5305b1ef6c11d58833ae85c6273931cd2a8b271ed7337e9007a12de")) - (882000, uint256S("0x000071e3325bf3ec8d64e489c0f4c0fc92d5fd79e6793d8240a3d0f8a9be63ca")) - (883000, uint256S("0x00000f18583203aa2b5211cef703581ff212c2343a2c92ee36c10cd695395958")) - (884000, uint256S("0x000074ce09839a1c518c0c9376e1ca0a61318f32f234273e7455de3a9c0dabe0")) - (885000, uint256S("0x000021ed36aed698ec9b35a34523b831c777014bbc87831dee4bdf613bb8cc33")) - (886000, uint256S("0x0000752fe0cacddb169c676d3cf4d4ddb3dde1c94110022c307d338153f8ae23")) - (887000, uint256S("0x000053d1d0fe3221bcfe061ee33346c9f6e067f6e383e5c18d4cd80d4a19916e")) - (888000, uint256S("0x00000e306f9c0fd54d7dcfde614eda0d1d59c3fadf3ed1a20552ce8958c74a27")) - (889000, uint256S("0x00006c8cac10dc846790110c28852de29754a56e3d182566c89916b42ba666f7")) - (890000, uint256S("0x000081163a16d309bfbce119c27c23cff28e99e2f5248d897de84a9d04a7b0c9")) - (891000, uint256S("0x000086b3f5228857dbd9e0181bc7ec1af0f186e5bebdaf5ebd639f53784de48b")) - (892000, uint256S("0x0000189ea1fd4571f85058bfe18fb107b242e51be76a096c5756f8f9d2bf3a80")) - (893000, uint256S("0x00008ef32c3cd2e05c1ff6668bc0398cd754aed04b9ee8b47b3da5ce63cc4a70")) - (894000, uint256S("0x00003681261a9e354a6c39c450ed133e22759b32760d346941b1ffcf78c72637")) - (895000, uint256S("0x00003930f93e5f335699d76ed9feff63a7372c5e42215e2089b52ab06a76c5f7")) - (896000, uint256S("0x00004d0e19dce5d3faf528cb41b636cd405d54129260054fa7b5d047d97c6f7b")) - (897000, uint256S("0x000034f1933d827c974fe0b463c2f47d03600b5286bee593a862dfdfbedabeab")) - (898000, uint256S("0x00003ac2943862684f1a753f8baa071d0b87bb37ac9653c0c5f5fd02868d0dc7")) - (899000, uint256S("0x000065bad08079b6c104460b7d3d2a4ff4a54ec89ecc0662649cf420e5388f04")) - (900000, uint256S("0x000023936469313daadbfb35bb1af3ca9c3a0a2f7341e3fd54c73e817bb2b586")) - (901000, uint256S("0x00009a42a0fd6e91c1b302ca778b33cd093c1996a5677efd6dadebf7f855b1fc")) - (902000, uint256S("0x0000510d7d2e2b03a68cb85f6fc053882d8ae05324cd571255c905f7dc2e4184")) - (903000, uint256S("0x00002a955c654e036531a05844298d72378a8cd1fc6c00dfa2b2105ea00edec5")) - (904000, uint256S("0x00003feb74a594eb7fdbca9ff4f54d81d4bbd2c20ac5ec78c52fe5c996ef4c1e")) - (905000, uint256S("0x000002a091febc5c4498e5334cbefe64ef08a0397a94b908253baee18b7193e6")) - (906000, uint256S("0x000022331700860809c0066e3329d18c0b3754ae2c8ebd6eeb0a42d83acccb48")) - (907000, uint256S("0x000009cda75fc593c641567f237ea453535ed3e5c851267a2b43b59b7d82a232")) - (908000, uint256S("0x00005d7fdf2fa669e27ffc8e9e230b36886364e60496108b9b73e166a48e4382")) - (909000, uint256S("0x000053376948fb992c82c3e56d648e8e3de70d3c55192a65b5f0c0a3db5b478d")) - (910000, uint256S("0x000033733d3f6613409f56627cee647bc85066a57b789b248d94fcafc3ba0479")) - (911000, uint256S("0x00000ecf2a1c9272c9f155be408b5fdfb3d41d8a67f5d4d4c9cf45c41731f61c")) - (912000, uint256S("0x00003d2c5c67bf69530bde65945a65296a611bbc09596f5ccfa1af84973e356a")) - (913000, uint256S("0x00000a50a4efcda624ddfe0f6160b14ed6e7dbce3f1f8c1a17967ed2ed1a6d29")) - (914000, uint256S("0x00002c13dad6c6e5bddabd391b3ed5da2f83993af5d9e9137cd777a2859bc934")) - (915000, uint256S("0x00007339913ca51cc74c064838beebd8ba81a92ad082a363e8993ebd44974cd6")) - (916000, uint256S("0x000062d5cf2992756ee1c996940beb97dc40dec98e911f4f101ec2e3c8ad4e40")) - (917000, uint256S("0x000062b4081cdeadd650f1aad8b123b7f7f33c9075bdcdfa3d5ab6e84324f6d9")) - (918000, uint256S("0x00005f4e81c679bd1e1c6dcb6cda0bc1bd024327224b76f614d2a2565b8ba17e")) - (919000, uint256S("0x00007fe72bd2c8d7d40c2dd97e36026d8a298754c9a7a8bfb4f1249fec14729b")) - (920000, uint256S("0x0000660a4c74a8c9d65df6dc9c7d22ced45d560c1d22cf3e248baa02cc773177")) - (921000, uint256S("0x000027a1ae24bf0bba3dadc225089f11146d8148f2d93e487881e3af235aada8")) - (922000, uint256S("0x00000026bf6572a65d7c42300ceee60286a0d0f1ca75da6285ccc81aaf20da33")) - (923000, uint256S("0x000055f21ee2ac27bc82fc8f3490a5e06c91d619a099643648ab2c0f485c784b")) - (924000, uint256S("0x00006606390d5f493eb1497b50ae859980d3ce958ef45e74112b8a1df26d0f8d")) - (925000, uint256S("0x000041fc67cef98bbdd6d9e3a13cb0cd5dd60ffc28de1e2f128e425ebc74ba86")) - (926000, uint256S("0x00004e378cd6512d0feffe6c6d40352ff7a275ca3d21c60633910d90d4fd619b")) - (927000, uint256S("0x00003d3dfafbe41cd72e98c993d61795739d12bbe73c3d88c381172fa687bffa")) - (928000, uint256S("0x000013a74075878f81afc451d5b8d7278aac05e9980feb6dd5d0cc2df05d3bcd")) - (929000, uint256S("0x00007b35381ebbc1aa79d9829aa8897a74e357c497f79b4e214523b28f5201d2")) - (930000, uint256S("0x00004990787bb80cd418e82f5ce14197ea53e4803b88d35233d0a9df06f08ed4")) - (931000, uint256S("0x00006353a8dc66f567c4865540d4d82f6aa323c239953070232436d816fe4239")) - (932000, uint256S("0x000046627e904e21eb12036c13af5260821233b6ce24255a7fd65b4d9f2811ed")) - (933000, uint256S("0x00007cbc4f3b750bc10f6bc51c67c392302259cbbf9d4e3de7e98ee2556d3e29")) - (934000, uint256S("0x000039494242b523c7eb4a8fd669227000654bebdb439793032dcfefa761e978")) - (935000, uint256S("0x00005e1d76e1f3f790d271260466b1cb7317a152e27f3eb3fa5ac02caa9de0b3")) - (936000, uint256S("0x0000803ebc34268fe221568bf74e86b7d00b306a5dcc74e58657eb0eabab4c48")) - (937000, uint256S("0x0000679acd510514d98cd755da8a5f84f86e6d3518e37b60c9d0d3f5360cd1b2")) - (938000, uint256S("0x0000724d82b0c4c8861faae85dbbf518325b5542fbc7838920fdafd69a30b5dd")) - (939000, uint256S("0x00004476db07e186aba89b7dca2e49dc35c967332a4f7d7299193a6d53eac479")) - (940000, uint256S("0x0000541d565f69359359a165f2d74ce18d098b439794e158da4ee6f3e1864bfb")) - (941000, uint256S("0x000058c831cee1349919ac75d2f98d7bc12358a2557cd875f0f57b8f3b7c6d17")) - (942000, uint256S("0x00007c99fb783ee71082d325fdd8ae1d181a4f05cd0034dccf3ff3ef695f1401")) - (943000, uint256S("0x00006596355090e9854b2f22ddf3ae1d1c6308e432311a26e03c92468d69c863")) - (944000, uint256S("0x0000b6659b828fa64d5a9556ded1fae73dbb81ea5d79cb91dc7077147016547c")) - (945000, uint256S("0x00002c0dfb6f97e2b7d1b18133469657a47d51c0daaa1a4925dd5f3708d8b10a")) - (946000, uint256S("0x00007f682e30326b11491e948162ac5c1f3633f52728136af8e961186871adce")) - (947000, uint256S("0x000074ee3cebb3ac37f141363939a33f60b28aebb78af26be86894fc38cc1399")) - (948000, uint256S("0x00001240ad57e861e4c7e06ce22b0c3d3fa1691ad8fd300645d4884d2b325450")) - (949000, uint256S("0x000003b2db4e1c8e07040d8eda6e8ee46faf7ea913610c04faeac8dc9b2a22fd")) - (950000, uint256S("0x000034fc8d33f91264f615b269dc33b5d47b426fc6754273ff7a459081b732dd")) - (951000, uint256S("0x000010b65debabd9db50513314df344d0bd3ea876d9fbb402f16437a8cb51552")) - (952000, uint256S("0x00008e3bd560f59d7b0b3cdac452aa844dc09c43e98f40b0a2c9c58fac76eb01")) - (953000, uint256S("0x000023685660a930b3d9832bad49e3af9415243efad5ab0dd4ed10d90449c36a")) - (954000, uint256S("0x000033172e6d0498112cdee86320a2e629615718e55a19dd26ab86f95e818b11")) - (955000, uint256S("0x00005bf6c2a199b4fab81bfd45a67fd8ce708f16792150450fda4c9918509bef")) - (956000, uint256S("0x00001216493d2732103fca24f1d291cd0c6b60bf6c38dbad1264fa67cfa5647f")) - (957000, uint256S("0x00006e78f92fbf4b78dfd02a7225465819f2dbfd211df95735c8a38ecae597d3")) - (958000, uint256S("0x000083a03bc5814718a089b49e5a8fc3e085a8ff6ea10d4429f0eccb6652cfea")) - (959000, uint256S("0x00005a66f76f9308b9ea2d4449d63bc054996b503d2fdff0c9327be670df82ff")) - (960000, uint256S("0x00001a07190de23bd4d3dd7c80d47b921c6814558afd639dee206d59db732432")) - (961000, uint256S("0x000037169673714f5b3730d71ae455852689ebfe5feecabf9e840fa3e6c81491")) - (962000, uint256S("0x0000406673e36aa298cbb04bf8e0dd663ad704b40db787791e196bb33827654a")) - (963000, uint256S("0x000003433d6f9cae3bef1393fbf0b5fdc8e6a0b694dcf7785b4297559fcd828c")) - (964000, uint256S("0x000068c78f3e12851372f11ea70b1162e7ec8dc8fee907782402a03b167b86c9")) - (965000, uint256S("0x00002343460755213710071c8e51565d7ec1d86dcb5b71b5e59ddd24f7a4344e")) - (966000, uint256S("0x0000772de803cd7c4ac8aa7f2ed1cd7ef13a59151424eef8f43e13798e9d7bda")) - (967000, uint256S("0x000083cbc5c8d1338caef2fdc4cea6b3ed1cd63f2eec1e81067c9fc657caf042")) - (968000, uint256S("0x00000f469df04f873d3a8c65c79dddb4a4bac26d5c4c2f38948350135bacb050")) - (969000, uint256S("0x000003aabfde9a844a47f0801fb8cc433af4143dd1d4b4f9763c20793493a267")) - (970000, uint256S("0x00000611c1529817df9ae09b4198578d920e2abced48945c4a366aee86e54f84")) - (971000, uint256S("0x000021f10926f8d23a1f093c1dc32d10f02b448296e265abcf1399f66d588a7b")) - (972000, uint256S("0x0000371066a71e81ade6c024361b3ea36dcd4a4d71e6fb1792670fd22cbf2651")) - (973000, uint256S("0x000003f7bd4e713edcc45931d57183da16842f3cee8ee424c037bd5db8c56eeb")) - (974000, uint256S("0x000089352ebd5def5f0c5f45c44bb202050a5bd8eb5f7be8afb2acff24ddaa95")) - (975000, uint256S("0x000024b561197358ab92e2c2f535207d81664b66b8bb4b2b4a6a02268570813e")) - (976000, uint256S("0x00006a53ed79e17b40cc042fd0a9e69947e9c46d4d543dcdc8c04e8bb8a120ba")) - (977000, uint256S("0x00001126e98094e28fc99747307f3614a81293ad48e0cf21615119148e4f023c")) - (978000, uint256S("0x00003ed71e9504cf37e0211f649efdbbe54e774a0e066e922a4b14a78499a747")) - (979000, uint256S("0x000028cab68c0404292dcd89f04cdcedd68fd8e66ea85fea84ac0fd978ec4429")) - (980000, uint256S("0x0000017214698c757c38cee40a6c14c6d2f5000dcfdb2de65e47956443d03be4")) - (981000, uint256S("0x000017d35857c636c16c765afbbd5755303270f5a4c4f4f3baa1c6ffcc07f25c")) - (982000, uint256S("0x0000290a27f6add114ab8f49812f57c606c2e3ae9ae8830d6fbb19d81a38c6b5")) - (983000, uint256S("0x00005ead64a87b9c14831a782517a7759b5bf05f28ca54b10fcacc7c626f28ad")) - (984000, uint256S("0x000022fafeb4da74660c4b44c2c6916151f7e158fdb8d9b4b238e74eb5e83641")) - (985000, uint256S("0x00000fedd91f10cf512535147e9706993fdcd7d5609c6d47fc8a2b9a2efd0f50")) - (986000, uint256S("0x000065dbfba59de0e52b772507169b0ebdac9f73369f794c0799738df30ea2a0")) - (987000, uint256S("0x00002723abb80e9ece84055c113e0caa507177ddc88cb6b8011ecba39b490dd8")) - (988000, uint256S("0x00001938e724c8033d1f60ddd27512f6f358847e96c63def28e85bd40616117c")) - (989000, uint256S("0x00003071ff9188d27f744395aefb1d406cccc15f61b7f79bba0ea9d100475a63")) - // Generated at 1709542425 via hush3 util/checkpoints.pl by onryo - (990000, uint256S("0x00005340e6855081dd3fade7baa8db18b660ffd272373e67c812c5cf69006300")) - (991000, uint256S("0x000027d07656cbdbd3746495e091388f35c9e2a11a2389174490a9433a9e0da4")) - (992000, uint256S("0x00001413d8eb317a69e45bf44aba0af79c724b45272043307480213bd4e7d653")) - (993000, uint256S("0x000054984fe60a08b731c2bba0bd89aaa52b6c33cbe530b75bc1bb85610c524b")) - (994000, uint256S("0x00007ac941c80daca1fbc00502ec407ee1ba8812d0e3d20ff58cdbef5e8e7c1b")) - (995000, uint256S("0x000076f55d290067e298fdb38f058fd08f369bc174112265dcd076c4d8d35f83")) - (996000, uint256S("0x00008037d5af8e2bdb498d5ab2d3cb80261adce66219810e6c6bd674c32895ce")) - (997000, uint256S("0x00004bea570cdedaae9475e42d1110ce0cb3ccee646a296955690a9bb39b0cf9")) - (998000, uint256S("0x0000181e1e6e1ef5692044f0b736b384037d26c18ed23c9f658f0043859181bf")) - (999000, uint256S("0x000018a43fa4f904d88c570e4add479359451a5decbe9cca0b6558873085c2e5")) - (1000000, uint256S("0x00005efbc0c1342f7604617830dde40956343dbfb4737502334c54bd28387855")) - (1001000, uint256S("0x00000c7efc367b7f30692b032b2583c43abd344c551dc9276e20ad582b7d3ee9")) - (1002000, uint256S("0x0000128508c85119573651c10abe581fa300de23f3f914be1512609449eee78a")) - (1003000, uint256S("0x00003f4edd2eee5456b7cc7908e54c5f05703909d2b7f9f4f5074d1254cdb5b6")) - (1004000, uint256S("0x00003c94446cfa8f2302da854b1136281a4f9f3f0ea0faa5d9992c079c8fd884")) - (1005000, uint256S("0x00002fbb77f69a8d8e82f374313bb3a1b4ff45a9c4fe5c193bc6cfafc73a0167")) - (1006000, uint256S("0x000066cd4d3492f6fe4eb0d240202535840ab48cb8cd8e6abc97e34037f629fa")) - (1007000, uint256S("0x00001b3e9655887cfa6a214754599584fd4bfa42fb87ade8196cdba5dc8bf0ce")) - (1008000, uint256S("0x000034949bfa333e64dedbc7f4da1ffed03307388d0cf9eec38dde9fb6f69900")) - (1009000, uint256S("0x0001b9d8fc55cefab5a2c98bf858db8a85ae84f90050e70314c5b68aebf50e19")) - (1010000, uint256S("0x00002ddc10f8190a9bcf3c6bb218f5b168db3b1aa025af10ce5f5b7cca2368e4")) - (1011000, uint256S("0x000030b762ea360d7f3db9a387be63861ec8083751289d4f09e724b7bd0e388e")) - (1012000, uint256S("0x0000558ceceb8d989fc9a5fab8f86df6dd7e098ba086d5ff418226e377688ea5")) - (1013000, uint256S("0x000014009864d940ea50da1139c1ec60052f29a68e899f4a26d8ae22058e2c4c")) - (1014000, uint256S("0x000064a6927370067437735b6a2cd55875fcc0f7570722cf91e22e638499fb73")) - (1015000, uint256S("0x000021d05a8465e463226f90fad388f0f7e1e3a96c7c21efa4fadd57a9b46f34")) - (1016000, uint256S("0x000044fb0fc12c7321248196d511da458ab3c7c2d8b0c129ade3be23209fced3")) - (1017000, uint256S("0x000070bdd5ea9f5241f762ad95138956a85ec9fe579fad04053e66c7ee5dea1f")) - (1018000, uint256S("0x00002db1288225647d4ab28034c86da87dee0345853cad7c6b9902a2b0c211a6")) - (1019000, uint256S("0x0000541804a065a0717bbddfb91bc39a6b9d59cbc4119ff0b526922f5649331f")) - (1020000, uint256S("0x000008643ba6ac5974579afde3ac22485b4aa5b475011420ea4232cd2e4aff20")) - (1021000, uint256S("0x00001fbe4f31c6102147a36dcefa5e5341ea66bbe1b6bcfd44ab2e38a4491e45")) - (1022000, uint256S("0x000002659dd1d8d34619b8b08961a1fd0ef60b845e1b79476771a3b6847e58cf")) - (1023000, uint256S("0x000023ced946206ff0a67c748398f71b4530fe97f46c742b4226ccb88c76a69b")) - (1024000, uint256S("0x00006e5d3e4c0529264121608c64da672831dfffeaf01b356e72d08876bf4a98")) - (1025000, uint256S("0x00005430bdd9ab40b0b4901d87e419d287c330cb483ae4aabfb6d3f6162375fa")) - (1026000, uint256S("0x00000beb4104589cd59b0762d279038ba07e9c73f6c397041f344bdbe14d7afd")) - (1027000, uint256S("0x000036b0021e002b163335593432840721e8b2487b9040a85479603675f755bd")) - (1028000, uint256S("0x0000378ea28592f3e0ff6c40c88731604b5c7cffd90ab527433ff5dfa92875a7")) - (1029000, uint256S("0x00007b7127cb6479b9a76de36f1772e3bf04a4cb763c029018d8c9b7e79c89ca")) - (1030000, uint256S("0x0000808ca14d72c3d5ce2dba95a43d7cfd0a5c0446dae881b4e2fdcddef29553")) - (1031000, uint256S("0x000018c2bc86e86e466b79808855e27f509918eca70713311a9ae85f28827228")) - (1032000, uint256S("0x0000bd2396371ab47326321013cb0d2f781377fc4ee5dbfa7b8d3825c0112e01")) - (1033000, uint256S("0x000020caf07e63f12a6c756fb91d056d7e43f25893b6ca108bed802f6049d988")) - (1034000, uint256S("0x00000c58f68dcb0ea8d8de091ae16b0bf7dc5c01bbd9854437cdbaf5a8528e74")) - (1035000, uint256S("0x000006c9cec3c2b65485fc9323caeed6b653868e271aee78e15696f6489344d5")) - (1036000, uint256S("0x0000ab2364c12dca420906bb96f264cc08a349b27f144d0db930663091b1c584")) - (1037000, uint256S("0x000039e3601727b488db835e87f711548b4e4320359fd27311e2cb09831f51d6")) - (1038000, uint256S("0x0000a1ebeb106ac690835266ff1385dab284805c9a4c3e5002b624c25bdada9a")) - (1039000, uint256S("0x000031574c8bd20b4024e8abaa9610028d2051c75a968390a74c843c44e6120d")) - (1040000, uint256S("0x00003f7008d4c2e3163b73caa2903ffccb00331ccb5bcc6fe1e272103b4b760b")) - (1041000, uint256S("0x00006c658df9c6b2594fe1fdc04e3f0506efc112f57503a86bd076a257733216")) - (1042000, uint256S("0x00009aa962e2bb956df64fb5cb5f248c1acc789f152559977cafc82ef31d2deb")) - (1043000, uint256S("0x000033c28decc901fd38fc4bc0f56287643474f4c9453bce08d3a272a782defc")) - (1044000, uint256S("0x00008ee9080fc9875af0a40a231e416a9de04d25a2e62cb6c5dd3d087afb9e44")) - (1045000, uint256S("0x00000c81fdecc3f2dc285720eec0ff497e4f36a6de3201ae1d65d02192a9bed2")) - (1046000, uint256S("0x00006eb6a451ae693be242c9c6d80b0b29db967f3a1fba9ab407353d88d7bfbc")) - (1047000, uint256S("0x000023a25fa6885548d13a33885a1252f0018eaf7f0bf5c76111fd2eb1ebabcc")) - (1048000, uint256S("0x00004f1da023868efbbffd8cad9982ce3ee5ba81ab403c0014038f770ff66c41")) - (1049000, uint256S("0x000048e7281e18cd07b8fb4970ca07fe35712f003cce3a0bb28ed6fd373ed333")) - (1050000, uint256S("0x000065e2f27bf9c47650dcda4235236daecea24b8f6d5de7ff3cd12b36a130f9")) - (1051000, uint256S("0x00005d57f2ff192d0a5aaf6caef8235eb6ed2abf584e68fdf0a84449bfa8085f")) - (1052000, uint256S("0x00004447ed52419433f77d95d8cc0d4c63e092a6b9a78a5353e7eb53c643f762")) - (1053000, uint256S("0x000067991dfa2a3c9e0ef86cfc3f0f7e04c17f0b9214c9e6554b99c16ca2fdb0")) - (1054000, uint256S("0x00004438ca06103b5a8eb9b6a92d76fd06bd77299a92a64cd00653314395be32")) - (1055000, uint256S("0x000065b37ff6aa3fdf8b102baa1573e738de58ddb925d487a7da04aa8570d273")) - (1056000, uint256S("0x000000ddf378344ebb2f2be0c7fda470e04037429d02009d3cb05155d5d921f0")) - (1057000, uint256S("0x000055155bc9f6b05002980dc7ca8363992a2e70bcfd8a4a779e75ff6c96d28b")) - (1058000, uint256S("0x000007db32449fead97b865cb719ac27ecc34ce8fd69d01c121b4b494a3064cf")) - (1059000, uint256S("0x0000291bedebe02fd854225e31959cc8dc26828184db0a76d412651b12e89a12")) - (1060000, uint256S("0x00005690db6a3f997a039afc7739035cb4d0e6d672a9c18776223d66388bfc4e")) - (1061000, uint256S("0x000041b2852387073f1aa4958cb4713024317a67635706848d061f94c852ccda")) - (1062000, uint256S("0x00004dc608c3fd7bfb54b3e2ecc144cddbaaa79678bda6255cbb4ef4a10d919f")) - (1063000, uint256S("0x000055b10b2ad91853e6b208e23245a91a5e0c4fc9108a4494f738096091a683")) - (1064000, uint256S("0x00003d68fbb4f9e5ab99a95bbcab44a054acb0d1dfed4f0c9514566e5dfdce0e")) - (1065000, uint256S("0x00003a4af8f73ef5c9ca11e1b28fbcb8f3bbfd700346ced0d462dc1b6aae095b")) - (1066000, uint256S("0x000079b03035b9899298522cd0fde65333f80e7fd19d4c1e547cd89b30456d48")) - (1067000, uint256S("0x000052e584b9f265a75dba3296d42a9aa851a5828d4e205ea05c4dcfcbde0c88")) - (1068000, uint256S("0x000015eec1de9a0f36c893aed27751f9729e9404c0fca2429f9b7e1e53c202f6")) - (1069000, uint256S("0x000033d9df0f4941018f53eb539b3b8fcbefbc6e5f60d1ed8d8e5d90dd72e5c2")) - (1070000, uint256S("0x000063990f169d83f00357097d194597f077e5faab078795240eff231b6179b7")) - (1071000, uint256S("0x00001e14d8b274509dd11f2590ed37831963215ef81ca9f571a185e736fba0ad")) - (1072000, uint256S("0x00006dec9c4159450c55addc032bcaff72fd3059d5a56f166f6d7238de5ce955")) - (1073000, uint256S("0x000023298fab42136c52ad020b759892e6f169075da06ca3a80c5a140df14bc2")) - (1074000, uint256S("0x0000626f55b005be949b03532365ebb4e51ddc8cab1950c43cf3d201d4377aaf")) - (1075000, uint256S("0x0000b6a77bca66546df35247aea0bcff78c052d4fd2c9c01e83386267581dbd7")) - (1076000, uint256S("0x000034a08dd3a38dd273e963399c09dcb6709f95008236a300bcbfb19f6bf85a")) - (1077000, uint256S("0x00004ca05ac52bfcf461784ce42e813e66b5276f2f2f5bb4c886e5412511efe7")) - (1078000, uint256S("0x00000e7ec6c2366364232322193ecf0178a38a2a7e1d51c5385c0fadb38f8802")) - (1079000, uint256S("0x00005038f1d006393d46522c6114c6e49ad54ecb9d3ee45abf9e8f49775b63ef")) - (1080000, uint256S("0x0000686623e37caf1a5e5ff9e0740eb0c7e57799f70a5adc8b88d81cda45e723")) - (1081000, uint256S("0x00004572b2f6a4f1f71697d56b97c054e19ebbdaf57c7db56510574751d3e571")) - (1082000, uint256S("0x0000284ea3820d41b64bd9efd2cd5a9d84016fee948ee35353add333a02c0e9b")) - (1083000, uint256S("0x00008fd4db40c96e3ad0d907a00f578608eeeee7daec33637d3ff456395368c1")) - (1084000, uint256S("0x000025ad29fd6b5ea43a2fa28637c569988eb58fadffaa456450e0853825676b")) - (1085000, uint256S("0x00005a2e0577384e33e0b4d87a500d5bd8284e72bf5524be81ffa550d85b6cc2")) - (1086000, uint256S("0x00000ffbb3cdf5ecae202d47f28920a0ebb38bf464b49f728833c03214e4c648")) - (1087000, uint256S("0x00005613d71456fa41a1d0da1d0f0d1a5b685184a6b775898f2ac361e9929c0a")) - (1088000, uint256S("0x0000280e821b1344f7624e8cf3c02a0756fb86f9a12fc2da08b555f0c07f3526")) - (1089000, uint256S("0x000042ba124036b7ae68e8f59c6b6b4c531346cf9187906678c75a0ff40ba852")) - (1090000, uint256S("0x00001d164a60ba32049705b3de3cc156145508e7864a6c3359a5554d35f1cc02")) - (1091000, uint256S("0x000030c1afdead30970db1584a0574882c0a005f5b10156dafdc96e56e5cda5d")) - (1092000, uint256S("0x00001f56adcfd15f0349959e2d985892bb42fe56dfa8f69211e05c0c35919617")) - (1093000, uint256S("0x000048a3e0e44aad0337104d522c2446e8d4f36c38e8168d3abc054f0bd7b6ac")) - (1094000, uint256S("0x000067facd02d8aa79e3ee8dfd2ba0b4cd95e580c74498d527913b9656b9b12d")) - (1095000, uint256S("0x00003e192638cb1394ea1fbc3f8507a1211e07d47aa0fc40333ea7d3b680191a")) - (1096000, uint256S("0x00001563dfb69dd5ec19083e1f1cd3a0620e304e9dffac12c32f630c308c433d")) - (1097000, uint256S("0x00005fa829b0fd9cdf758ee597d91461412cb323cab332f5b89da4a34ff61e49")) - (1098000, uint256S("0x00002337e7251b57ae128e963e8dbe37cbba15d63a33ad264f1fb544c268dda4")) - (1099000, uint256S("0x0000153f031a99ee4e7c5191463d3341ce42cf8fc73f10dbb2b9d4d9f9e789fc")) - (1100000, uint256S("0x00004505211599b14b8b94fde5c1ffcce88901427dbc1ea633917160d4188f29")) - (1101000, uint256S("0x000095283bd1240f7413c332e8b949b26cd9c6ec29eea47b6fa2dfbd85715e79")) - (1102000, uint256S("0x000097e46e5472b9e2cc1d7621c2c4252b1bd1bf9ae28b4b542ef1a3ac2afba1")) - (1103000, uint256S("0x00005fc1b80c232f7efc14a16b0b749e43c79c7f5f2754ba257395adff881d31")) - (1104000, uint256S("0x000000600a4fc970f991f462dcb7f777cd9d71d117c37035b87bd897fe9a54ce")) - (1105000, uint256S("0x000082e3f85e251a1302db120427c66b3d94e7ad1b5ab1b8a181c9f3692fee4b")) - (1106000, uint256S("0x0000893cc92138fa6b14e738dd62ee7f2e82d2681ef4b5e1a0f79e91a029307b")) - (1107000, uint256S("0x000095a0703d62883498279283f169aec02b8ec1ad0262308ab4b31ac2ea7a8f")) - (1108000, uint256S("0x000041463ca3374182ab463e738f26bf27db11978000671ff196b02a8a2059ab")) - (1109000, uint256S("0x00008a5a388578aa4248f6fb47546ec2a04b35e669e120fbdcad6dde9f005476")) - (1110000, uint256S("0x000010f822b1664ac8042ec066739dac80c2996cd2494f613926defbb4f76ab5")) - (1111000, uint256S("0x0000464499866b7dc037cf45c92e2ffa1b854e0618c0c58e7075062a46350e46")) - (1112000, uint256S("0x00005338a944dfc29c0234107f58ba564371017783fd6db0f37ffbff16254768")) - (1113000, uint256S("0x0000726e4c72bc2ba9b8624f7d12280e58c431979fa792b6d5b1756e23dde388")) - (1114000, uint256S("0x000055f1d9ffc756f3357f15186623a8f44fec77d9a760099e4c0e315a90a671")) - (1115000, uint256S("0x000066c68f0abdea160ec4074820b7d26b4730bd44ceceb9e092abefaf390ae0")) - (1116000, uint256S("0x0000329b740e77aa5ad3062210c0e023d05e06d29ef86d17cb5103dbbaa48929")) - (1117000, uint256S("0x0000848309ade0df03a8bbd431a3e59a79f226242847979d66b32f5d36fd833c")) - (1118000, uint256S("0x0000233defa4050580da7600bed2f1fee01d28cb949f2ac0e5587ee7f9ac8874")) - (1119000, uint256S("0x00002b3d78c994486a51e16e2ea33f2bc2ac0ed4051e2d769844bf9a6308d11f")) - (1120000, uint256S("0x0000409d4bfdf323d3a9a85b65765e90084218a776c76a1cd07829cb7f5b6d05")) - (1121000, uint256S("0x000070b4ac49549b8346930d31aaeba267e6d5e80c29ec5709c7f7844523923b")) - (1122000, uint256S("0x0000105ec7d7fdb44d8e7f8f214a016cd241fbd54bd63dd3d0ac405ab3f1fa5d")) - (1123000, uint256S("0x00003c72860ef8c6f8e4596966fd4c4fe75ae774056426e1595b02ad8ab9befc")) - (1124000, uint256S("0x00006920884cf1c0ff9ece4c7e9e940d8312c71790436f796ff4131b9357975a")) - (1125000, uint256S("0x00005a6594364b26fa93cdd28b2afe596f818743c5eaa86b5be9273187d4a5cc")) - (1126000, uint256S("0x000018583bb1fa1de1a6223c8ea4412856a4a9715c4499f966d4b479ed421a9e")) - (1127000, uint256S("0x000062ad6d9175ffa331b96444ad6b8b9842d564d359b68ac6b325b80f874f86")) - (1128000, uint256S("0x000030af1516b3d81082bbbf43054f723ea8090c31939f8335e2548861f585b0")) - (1129000, uint256S("0x00004691aec7b3d82d064a112e4a480e48ec3d7fa678862df12ae146265f5482")) - (1130000, uint256S("0x000082de552f3b0dbd1a805e08db29f9f60fe020ee88944b0266e55cda2f7e78")) - (1131000, uint256S("0x0000061cc63ed366899e9d4d7c748ac75ae3ef9a32ef60e92cf7c0c306ee9711")) - (1132000, uint256S("0x00008bd55bfae2a954b70b04f570e03b9148d639358a697b5d2e948fc6345918")) - (1133000, uint256S("0x00003a59655529f46df2b436019db7b1d7b9757f4416699ab5d895cd68f9be64")) - (1134000, uint256S("0x00004f6097651296f52e7d69a51e7b82ce12599109c5abc201d77cf9af9d6e88")) - (1135000, uint256S("0x000049450fcc6b737c938099e17bc0c54cd18b385112cd7689477a9cc8a27e99")) - (1136000, uint256S("0x00005ea94a0ee3a23b8224a87dd107e13ea0e86a59c3d2de4fb9fd3a94c0fe27")) - (1137000, uint256S("0x0000270eb8f01ef39a7a1cbc8a3d0d2ceefc65f5842ac3001b4a5247e8c2e525")) - (1138000, uint256S("0x0000339b020870d50d1496802dcf21142c95971f1781000c202d1e8a52bf12ca")) - (1139000, uint256S("0x0000716e4b703564bd4b4bfa84fd6b317aefcea3d13e6eead901de144a703005")) - (1140000, uint256S("0x0000012c87cc87745fe70667c7a2eca8b03dac27a8424b0830c06a18fdf9fc77")) - (1141000, uint256S("0x00006bf655db63cb0e89eb631a25d198d80d593cd4d35c8c9de2b62003a8f4f2")) - (1142000, uint256S("0x00000949c0348276363e0aabc6895b7a5298ba2ba1f003c2a4a23be5c6d843a7")) - // Generated at 1726147945 via hush3 util/checkpoints.pl by onryo - (1143000, uint256S("0x0000559866cc5a14cf418bec8754ac4790dd538fefb17cbfad7ba5d186dc8f31")) - (1144000, uint256S("0x00004f970b2fc229ea23e0294ff43e7858e00a6ef2ccad15d48c7b8e5bf9e270")) - (1145000, uint256S("0x00000a8c950b018ed9517b58f2559fd4a5a9213dcd552e78ca25b3c76b8456df")) - (1146000, uint256S("0x00002be2e2e097c68eb85b60ec0ebbe4e87438a25affd4ed2dc29387d5069ba6")) - (1147000, uint256S("0x0000474f086d74c4a20bbb6131bc75aea1bbc2ff5a32f462fae87a2375b85d26")) - (1148000, uint256S("0x000054292fe108d54727c31aacf212b6697dc6aed6d14140e75d3982458f6af1")) - (1149000, uint256S("0x00004d8a8bc4a47f060fa8903ea8d73528f83873f878516e7554decbbfd1b3c8")) - (1150000, uint256S("0x0000383d666b6039ad272fadc0e6375def512cdaa0d958ef03369eb286f7f790")) - (1151000, uint256S("0x000011afd8e3a4920090b635cacad14e12c61d9b64b12498dc533bc3ea7a2c07")) - (1152000, uint256S("0x00000992f60aa90c6f8f17d9b1e3e22500cb13d254d1a736dd34fd4838ea5dc0")) - (1153000, uint256S("0x000027c82a655f31c8614ca71b2ca7913379b735e6800abe41634ca9a778bc49")) - (1154000, uint256S("0x00001800e1d84ba053d1cecbf92e02577c06b05f5963c13df01802eab626448f")) - (1155000, uint256S("0x00005254625752fad08e9a965f7b8e2c44710250782d307c02a6a97ae011d76a")) - (1156000, uint256S("0x000051ee7e11ebb76f6e27e1d4fd206f5527a6dd3ec58e0bbed04f75b6462339")) - (1157000, uint256S("0x00002dd6c9a7fd522d5a2c9810da28dc8d456fac65e4faa377f6247f37b08978")) - (1158000, uint256S("0x00007ce77f64fbf985fc4e2e90dc6bec6ca17845eb7f9096d7f8e463540dd394")) - (1159000, uint256S("0x000029591fa14c002a6befeb3d567ab73be62600f40e337c525eca3412b6c8d9")) - (1160000, uint256S("0x000033a737dae6e4c83b3cc5eb9cfab2d69119096dd958a620b3d4d28505461c")) - (1161000, uint256S("0x00006f6989a5cae0b1974edc9d9b9eeb028208a285820429f3fa63ed8bc9466a")) - (1162000, uint256S("0x00004329014090653fe61bc5760b392730d2d4926228538d322f3c10d5d00fd6")) - (1163000, uint256S("0x000050ed4d90504ee338510f3fa404411a6c124561b1d697042b3644101d73df")) - (1164000, uint256S("0x00001733edfd42ca5d95d039ff31eb28cdeb72bb6a63a6f797d097bc850cf874")) - (1165000, uint256S("0x00006132cc449bcc44ac4cc8077991419558463b936cd2dcd498d7d384de957c")) - (1166000, uint256S("0x0000233926a59b4b5b859af2f89159d72fdaf70b4d291bfd28376efb5b1af8b5")) - (1167000, uint256S("0x00006cf8e4257f5ac086e112f1bad8e5d119220545ed98dbaf17b6585cc8f8b3")) - (1168000, uint256S("0x00005dea4f2ff28f229bf3fb9ab4c8d5aecd79417acaf9c1fe875c223030b228")) - (1169000, uint256S("0x000009472a9a906e93ab907a41f5b67466e64d19142ed6889c769b8ec0941603")) - (1170000, uint256S("0x000015438fdf9acff1bfb51f49362ae1c1573c278f5048def1dc5b3f6ebb4d46")) - (1171000, uint256S("0x00002e38ea63b3e4b6a7cd5d8034f0e3f6fcfe9640c0d5d9ef1ea657788c88be")) - (1172000, uint256S("0x00001affe5e20f07596836762c185c83e6a80b1e61f6c3f6b75c19cf78756f7c")) - (1173000, uint256S("0x000062ac3dbdcc95b2419b9bb887bfe51b2517fde6e17bfd0d7108a704878c74")) - (1174000, uint256S("0x00003efdb7414f360b533f699d4af99a93f1d2752617a21cc2f780b54d8bab6b")) - (1175000, uint256S("0x000017520993990f7cab94d7047d745d533252d577479e22fd630dd4df0943b4")) - (1176000, uint256S("0x000024bd3f052e52f37d15a9e71729a85c2f06adbb99cb38e95f48ab658aa331")) - (1177000, uint256S("0x00004a741fdc39082def272557e0cb43996b917707190b8203dbd8d98df6502c")) - (1178000, uint256S("0x0000123fab19710ddc712ff96a8fa813a4b8ce174dc6a4015f63957cac36e276")) - (1179000, uint256S("0x000007e82b343a8b76a0964206a34f5cb0c5765f7b02fe4c538b2a45b36d9b09")) - (1180000, uint256S("0x0000649ca5e4674aaafd4a4ba0471871174ea06c10509d112eea15ee99fe8daf")) - (1181000, uint256S("0x000029fb97da343e7e6402af6cc9b4f3796be80b2896a54fb579e471c6bf115a")) - (1182000, uint256S("0x00002af27c646a7b0fa7c96ea6edf9c098d6fde6ff35f1e793820dc5b808280d")) - (1183000, uint256S("0x00003e2f509c57db42106586345b8a1078223ef43f6b29aed8ec1cfefcaee17c")) - (1184000, uint256S("0x0000073e3365f8b253334d549ca50a5adedce9f97427bef3ebe314c04f983b63")) - (1185000, uint256S("0x000001ce36b5afec8ad1771670f9a17755efbd78b169c17c8f1977903d7942b6")) - (1186000, uint256S("0x0000572991b2ab1139dd0e06d6d326dc924536f62d563a3f6b4bb31d5f8da850")) - (1187000, uint256S("0x00000e430150aca093ddd310bffffbd4c28fa65423d6f5491c902c7fe5bb3c50")) - (1188000, uint256S("0x000063da1fbcf413ea1a8664352c409ea2b2eee698fc953313e04e8f9c4c13f6")) - (1189000, uint256S("0x00005bbc9f9803ca56d18da09b6e8158a9efd9795753e477636948049fb6b077")) - (1190000, uint256S("0x00002245226551549ffa162c710225978f840faa0970916927ba949cfc9abd11")) - (1191000, uint256S("0x00000750a1a7f0b9f320c07e4239c8266ca8203184cf2840d2117e06da625e2d")) - (1192000, uint256S("0x00000340cc881b0ff9a1045da2e513e1dfaa9784d5c74b71d06a69ba08f9bdc6")) - (1193000, uint256S("0x00004af98432b689093039aa7bb31407320db379bb7a1af401f4ab3b50b4c7cb")) - (1194000, uint256S("0x00002811098dabbf8b0d9a187a7d6aa946eee22ca7a2d4fc0e2db05c85d9e7ee")) - (1195000, uint256S("0x000023354ca74ce1d65c067a43bc287b178db1accc68d0e255affb783d28fb1e")) - (1196000, uint256S("0x000022f383c401cdd9b5428a35d2912c32da96ee75d9ca11d6c950bd26a85ae4")) - (1197000, uint256S("0x00006128dee332a6b6a60bbec4cb87a21a7caa4d998bd50e4e17f93a9fafa947")) - (1198000, uint256S("0x000040c6d3b8a3056f809beb6fe99193c95fb1e675217fc4c672947e4ad28b5b")) - (1199000, uint256S("0x00000526a9c4e9c16dd17b43fedd5c93484bcaff8c659fd8c590c4150674fefe")) - (1200000, uint256S("0x000013ad8b897aa023a26864bc8499fadc17c37214b46f0d4b84dc4744a3f270")) - (1201000, uint256S("0x00005499d0c4695da60fddd08c03f2f88fc73bce71fc2db01287afb58f6c0be8")) - (1202000, uint256S("0x00002fd7cf1273183ee655a1453d99accf4911134f14819ed04af6a22e4869f2")) - (1203000, uint256S("0x00000c5686cbe6e542dfadb8a8c72f5fbd6f3e4c4151363dd5ffed5ed4e0de93")) - (1204000, uint256S("0x000011645bb9c42eaccdf0736c7cbb9d446cb0ce42b9298824fad5a9c896cf1b")) - (1205000, uint256S("0x000037b4659afc89a6c0c31773590af066cbd8cefd257f4f97d6715589196230")) - (1206000, uint256S("0x00006401cfc88a271056704d6820a97e30d32e1f55f045070f1f2864e37477bc")) - (1207000, uint256S("0x0000384c8c430ec912faf02763b45908661c49a09d957e04fd666c1853a445f0")) - (1208000, uint256S("0x00001272213359e1fa3986880da18000d1dbeb472794b6ef3e119f1f924dd0d5")) - (1209000, uint256S("0x00004ea7dcd4baa421d2f25cdd3d154fbeb80b48bef575bc1abf7be30b531782")) - (1210000, uint256S("0x000014155338aa216d649ff656fa174fa2ef31f709ff6733a6dca2cac5fbfaac")) - (1211000, uint256S("0x000050cfccf156ec081627ea46874a77f210dbcf5f815e67476104a49d2234ae")) - (1212000, uint256S("0x000002361f8cdb0ef51cab2067b81285e5ad470876eda334357c1becb4e14a0e")) - (1213000, uint256S("0x0000148363d3feb29f88b422299e0b6c4d02579a390f2ba5f813d8b834c6c9ba")) - (1214000, uint256S("0x000014dfe478cea8044551facc7a21e3cd150d1bbe36b240567c3e605d240f78")) - (1215000, uint256S("0x000066ab5b4c8ca88603b375dadfd7437e82afe4c0becf0c823ea52389c95592")) - (1216000, uint256S("0x0000192d568f61af06e235d325ed8a25e338ecde8ebb7550168c3eda7271f8b9")) - (1217000, uint256S("0x0000082ce9b9bf87cd52d99fa606276cfe37f3735f87e6124929d1904f9a8e59")) - (1218000, uint256S("0x0000664551fda17ca48d894328a14ee1ad6cfbe3b093cfe2af5cfa6c326385b3")) - (1219000, uint256S("0x0000567bc2fba439fa518ace0e3e1a3de20dd681787c55cd47fc5fc3270dd689")) - (1220000, uint256S("0x000032c41595c1d0856b5f42cc223f718fc39730a8ccc7da12979eeb16843b17")) - (1221000, uint256S("0x000068a6d0e870f3066eb53fff971a3bd2ed5e6be356aa60b5471acddbab1463")) - (1222000, uint256S("0x0000501c420637240ced9e7b1ac94d1ed6628c32df44516b3cee7e362f68bcf7")) - (1223000, uint256S("0x000017febc9a274e74e08e1bcc0d2437502c2367565cc66a41418750f14996ed")) - (1224000, uint256S("0x00001cdd2659af3594e105128d614ed88275a3aaf17ebebb7462efac3d7a8308")) - (1225000, uint256S("0x00004c9e0b767f0af5af5ee53f0815c1250412a6da9b095d71bdc4b1d04aacf1")) - (1226000, uint256S("0x000040ccb928b631aaa50329c3aa6c261e0e259be89bc44d241d32a06906b7d2")) - (1227000, uint256S("0x00000636ff452b4189d3e504317cd1e0565f6989c08689876f175976c8e5f6d5")) - (1228000, uint256S("0x00003922ee1388e9dd42ec9085be131adac3cb192889573c7dc95f0d5b10fb2a")) - (1229000, uint256S("0x00000d6cc5c06405e558d1586ba42cb7a7a33658e806ae84956c501da672b15a")) - (1230000, uint256S("0x0000172fe9a0cdfa70d80e99586ac8a26034d7100a74c45aa5cb832be780b602")) - (1231000, uint256S("0x000042423636e41f92ed92e94573a7757c5683c71d794ca329f4dc250d496562")) - (1232000, uint256S("0x000030db4f249f0a8a0cc452f7c286346193a9b9a58c612a3026cc5196f34b65")) - (1233000, uint256S("0x000008739a594e05fe74e78016df5a8cc9f534c35f476f31cc53c1f728ddbd0b")) - (1234000, uint256S("0x00005686cacd29d4b25154f85a59b96ad38f76b1dc50189ccd7c2ff64916d500")) - (1235000, uint256S("0x00004dd1ed8cc9d9fae3dda3dac545c1013888053d7d172c93243bafc12ab6bf")) - (1236000, uint256S("0x000039da72e90fdf62c5058186ece9f625a6fb752468dfcb554cce91de40533e")) - (1237000, uint256S("0x000051b553a4247a192a3c467cca2761c03b083e72d3b3876e00cfdbae61ee1c")) - (1238000, uint256S("0x0000470a1946478d605cd8de5837f6605bbb783d8e20437b4a72574d9c8135cc")) - (1239000, uint256S("0x00002b7de55538a8b5a5d7f3869e24585a7da48da6770900620f37e3ae3cb067")) - (1240000, uint256S("0x00005dd97b8aa7bba0d0a2743f39b6a483884db7397b65abedb866bdb27acdb6")) - (1241000, uint256S("0x00005370d77990c5391a2bad8c76eb21ac87642f70ce4cb859e2998f327c76c7")) - (1242000, uint256S("0x000013e9aebc799c5feb3a8048d663f698ea1e2ea69f0f493fa5f0051fb63a1a")) - (1243000, uint256S("0x0000149885bc1668a1993b87def2c16c546cbff364cac2aa9bffbf98dacfab30")) - (1244000, uint256S("0x00002c685cda1ff8c394cac9d350a58edf7202a8f0d28a6ee08cd72ca052cbfd")) - (1245000, uint256S("0x0000102705046f777fac46a021ad9658c4413fcfc45079c4f2d72a4628317a87")) - (1246000, uint256S("0x00000fa7de6082201c2367a3fbce4dc81f68442bcd953053e495cd546791e589")) - (1247000, uint256S("0x0000154a5c84fe71a13ce57bb79d10a96c87cae33377e7964b23ae94a2253a17")) - (1248000, uint256S("0x000000be86b23e43ff6a25bc0762054094c9610de62e7f402ef6d5fbf997ab1e")) - (1249000, uint256S("0x00005b543b6fc0104ff434f493e9e40e6c60e2dfcdf64fad44418ccf6b186b5c")) - (1250000, uint256S("0x000040801b1c63452f1fe4a0549d5062b24f9d96ae8813e38e5310f2feab28f4")) - (1251000, uint256S("0x000057fb0a2062247b3a8536b4890ef2474e9a0e995a834feea2e51eaf43829b")) - (1252000, uint256S("0x00004e2b5964a7b44110b6ffa12aba62d497333c41216e2a177d49593181d5a6")) - (1253000, uint256S("0x0000319fa7a3b0ed79476b6568f4e64136a5d427d1ae00aaa38f2db6113ec7ef")) - (1254000, uint256S("0x000019a583a766c17f6d107bb941752783b3b595ea5cb02279b2915645782881")) - (1255000, uint256S("0x00002001eba0b7c49990435285721c5e8d8dfe087a33a0149bfaa138ebdb11b7")) - (1256000, uint256S("0x00002932656be7b66c9a751d8da9b20e54972a7c0c260976cc47f4a48ec8e0d9")) - (1257000, uint256S("0x00000a8566c990bd741caae3dde65b624b884b463b9bbb5cacc4078fbf0339e8")) - (1258000, uint256S("0x000039e1f356f63faf24d72e9ff9c29f77df9f40756d5dd524a3b250ae2e871f")) - (1259000, uint256S("0x00001eb035d147edeaf8d88049502b2044e2d8da4750f5c1b9a7aef9c6943195")) - (1260000, uint256S("0x000012c037027810296ce25642167daf3d0495e1ef9292544f47599531244bd2")) - (1261000, uint256S("0x00002abb17fa2d045456b3961696f7b36b1443603ccbadf2e6395dc1d1fb140d")) - (1262000, uint256S("0x0000088736c35e41ff0566ff9fe6d76e0cc142e99beb5854bd8f589d90d7ef0a")) - (1263000, uint256S("0x00001ed2d037a67a4ec8aa01138726214016edf506251c6b454404e98cb766df")) - (1264000, uint256S("0x000005e40cd01ce160b4fe154922162fd3d492aa52951bf44337a139409a4452")) - (1265000, uint256S("0x0000676839db3008652bef92beea49cb82abad08c7eccc57284094fad7feca13")) - (1266000, uint256S("0x000013074b6318eb49001ece9fc669438b0e77c686c5a43b3744d0cf47a0beb1")) - (1267000, uint256S("0x000022aa82205b1067a9a2ebc5930b70b6881d984d0ce1a8b029fd6f0bd88f45")) - (1268000, uint256S("0x000031b0063d7f9063d54bb07fe9e56cbc3b75022080fe7a5c25cfa78e867d24")) - (1269000, uint256S("0x000060c8a2b63b45fbf8a359485425c0ae083d4654d2d062f1a9dbb4a1b4a1e6")) - (1270000, uint256S("0x000022d4eefaaed23d27ad85bb00e92349b53c3f81d4d308acc53434dafdf731")) - (1271000, uint256S("0x0000077b6614dba2b69bae84afbe8d11e3beb9b12c869c8a9160f3dccbd833ee")) - (1272000, uint256S("0x0000359829c6014d0707fd13bb5f66e1906346fcf6a64fb5e81a29d7efcd52c4")) - (1273000, uint256S("0x000044586991e1f5cee09e2c0b3e175845e659945b8f680d2bc148c495156395")) - (1274000, uint256S("0x0000460b6b756e425a9ec78111b4c3dac21fd61027f4cd4ba557d7cace76f400")) - (1275000, uint256S("0x00000c6fc0db70726dc0a40e9b12f636cb4830c42c1b06de34d8dbc618685cfa")) - (1276000, uint256S("0x00001d7679c574c9c5dc3cadf6bd27f67126db8f79e5190f8ddb9acfaf85209a")) - (1277000, uint256S("0x0000355d71b43c37b2426466692eadb1a425a1dbaa15960cd99b1b9935a90006")) - (1278000, uint256S("0x00004c7ad5faffd431bff2e9f3de5f7e89ab8fee40c0a5c997bb999a6c5b4cda")) - (1279000, uint256S("0x0000474d6f4ea13eb5559ad26b7adbb580c6a44dfae04beeb49bb4f994da4fd2")) - (1280000, uint256S("0x0000187b49dbd8b87d68adc0070413d3ba904df45d27d1837aede0aa50993df5")) - (1281000, uint256S("0x000053c0c7c2df5c493b6c94c90f7d54c9d16182f673f0d79697dc4bf56b551c")) - (1282000, uint256S("0x000032a389674742454fe3410cf839a0a761cfa46dfa126cb1a32da994d272de")) - (1283000, uint256S("0x000034e46e23ea151912514e0736c9b27efbf9be08dbf8d931f9686092534280")) - (1284000, uint256S("0x00000a5df550a85eac7892811fee5473ff7a9c8308d70671e6c279500ad731df")) - (1285000, uint256S("0x000015935070956de8543a6d36d7b97436e1b8b933c308c3929a404b15a56dc9")) - (1286000, uint256S("0x00001a57e5646201963da0f7e3d130ec1ea70e017883f677a7cee17d6abae9d0")) - (1287000, uint256S("0x00004a92e3671588fcb49a8db0283320b13138edd92e19fbf1c843df9e5ab2ae")) - (1288000, uint256S("0x00002c10244eb91ecfb44089ec47cc3594b6876f1db247ca49f378ad4b216dba")) - (1289000, uint256S("0x000050a8a6902ec83acbd97c599b0cb1b503437ed964c98e9bfeb8a0f2bbcc62")) - (1290000, uint256S("0x00000ed28be2c4c802b598a19ed177364bf86029e8b20e43338c721f231e4279")) - (1291000, uint256S("0x00004d122c9a324995e3246836d0bac61f731d82331c2a62b47f78ca45cd09bf")) - (1292000, uint256S("0x0000088be22cde734cea1d67f8a3f1d5297fd79b1c9e5fe44be483057b08439f")) - (1293000, uint256S("0x00001b62d2ae6cec0a041b5d6b7ab112b618354e4788476d2b0fe6abf138fd03")) - (1294000, uint256S("0x00000a13aea1a99a8167cd04ec6c0363de67f49ab6b1a7e5d76612dea2ca0cf5")) - (1295000, uint256S("0x000033982767c8bcc47dd13c5be0f843e1385bc51aeb87debdd5258bbcde9d2c")) - (1296000, uint256S("0x0000125c70cfad5ac088c0043509f659f59878758234b89cf31010e2ad028a82")) - (1297000, uint256S("0x0000259af057d1738063700bbdb1352a381c01092d6aca3380218ed6a5fca750")) - (1298000, uint256S("0x00000441c838672326020f9b1e1036f108254216d50af05bddb4b19357d95855")) - (1299000, uint256S("0x000018fb87a76ae93b2c9f8052442c875a68b474dd81af0c59221eee714c9e6e")) - (1300000, uint256S("0x000009b6907f7923dc9b784b0077bb713a8856ca9d940f57078b44d0f83ac312")) - (1301000, uint256S("0x00004289784e21a386a8190738da51c2d3f77900259414860b5e81539e9558e5")) - (1302000, uint256S("0x0000289a30b70cf0ec123814a18ff6f0d87165f762207ee4e931a355afe452e6")) - (1303000, uint256S("0x000023cf6ecda684faa7500e030e6dcbdf63af8a26dc498d94364df7bfdae0d7")) - (1304000, uint256S("0x000034c8fe4345599dcb66d08bc7595d99cf70f3f8a53628b43eb27fc849ea0d")) - (1305000, uint256S("0x000043b3c599734e3c7c3fe8223fba99d1362f3a5cbcf92b6a5965fec8eb14e5")) - (1306000, uint256S("0x00003c914f7c29699e4532cb69a7cf806e76bd93bce5a16802bd6fcb72cf0869")) - (1307000, uint256S("0x00004b4b26da50b96f76b2bc4fb2a86d9770998e8e5d4150e1d6b747eba925e9")) - (1308000, uint256S("0x00002fc77f9b68d13c067311e6ca0ef116eaf711823d4b1b584f9acd7f0ce82a")) - (1309000, uint256S("0x00002d1b444197e533f8025ef5ebb6ccb279094c1ebe1dc999d6604554f0c91e")) - (1310000, uint256S("0x0000136813f4498435a9f1d740616be5aa8a7dc5fe1fd893a86400959f2667c4")) - (1311000, uint256S("0x000015aa7a373c271f2761066a9fce067540bedca683e0cb2e7cb075c2f7ae56")) - (1312000, uint256S("0x000049027d369fba3fe3a0dc4c34a8f19ceb7c728aa8a01863368e65a74a0402")) - (1313000, uint256S("0x000021265084f0017f10af2adec81ad77fdff31e99109787af283cd6ce276d86")) - (1314000, uint256S("0x00001dc5b690ef30a433b9b92aa2f53083e7f97ace9e7efa3b66c6e45237539d")) - (1315000, uint256S("0x00003b70d6876046d2815d25c254e7a28687344d8d8d881b5a2cb490dbe1b7b0")) - (1316000, uint256S("0x0000035c58cfcf4e3bffa99a55195ec63519b41d2158cf35a98e31f0b2ff4fb1")) - (1317000, uint256S("0x00002871c10c82a4b527d460036b93a3218ea8f4c0d4d5962000b21fac6ce5c2")) - (1318000, uint256S("0x0000523e5cc8af99515b772098780d643ecf8d1bb60a44e9ed01e1e6ac05fbbc")) - (1319000, uint256S("0x00007649faacbc98ca50131914a671cac3449faf45efc358687bf46daf01bfc3")) - (1320000, uint256S("0x000054f5e7a90e9b5e70336442e07c569da53095163b6e6029c2cf7012737654")) - (1321000, uint256S("0x000073d0f551b3e768bf3435d170b1299e8abbde276127e7f73d070421cb7f9f")) - (1322000, uint256S("0x00004ee980bd008cc453ed43891ead6f4047a5b26eacfed37368c44784027e65")) - (1323000, uint256S("0x00006a06db6521b45b0e6aad0576294d6eae7f0f88f64bfee971fa83847dfa2d")) - (1324000, uint256S("0x000052748d09b26b13adfd512ce2ab015cb4d82e171afff48c28908017a63f9a")) - (1325000, uint256S("0x0000243fc652997bc4b6a2315b9384a54e312678d09fb00c068981456ad76449")) - (1326000, uint256S("0x00000b1efbae985fe97c5664bb006b2a5d9c929502619cdc6a08488427b8bfd8")) - (1327000, uint256S("0x00003eab5ef74d212a6031d1333a8e32a7476618639eeb9709601247dcf28b52")) - (1328000, uint256S("0x0000205d5addc63d62805bf598664eee091b52d3222a5b5fb5494a6efb584cd6")) - (1329000, uint256S("0x00004b5a5e95536ac8036a4b3e95df41f372699387600a7f3bd340a0c04c8d5f")) - (1330000, uint256S("0x0000190c2db32da38586594ee3c67a95fd1ebf4b6fa288c8407decefc23eb420")) - (1331000, uint256S("0x00003ed190a2570d494dee7e966544c3d3981a1c4dfcf25f6f1c5b543bd3aa71")) - (1332000, uint256S("0x0000151e66c75701e9040b8bed59abebaa51e7c2465773f1b07c7063c2ef9c02")) - (1333000, uint256S("0x00002c5a586b74cb3c2595441f48e4ce62997b86e997cb87fa6e5eddbfa9ac52")) - (1334000, uint256S("0x00002a52be65eb1c9dc8bbe85d68583a74e0ec93a518ab1b5e2cb24a5a80bd19")) - (1335000, uint256S("0x000021fd0d351efa9e040a873c446e1302a5ac5b5025084563b3e7a60ff2c2c6")) - (1336000, uint256S("0x000053d767bc40e54e6b1aef2f51ee7755b36209a2c283d50827c05b92fb0e0a")) - (1337000, uint256S("0x000013d91d3baf584f200f050564b5efd2cd098d378d448643e21601a56504d2")) - (1338000, uint256S("0x0000413db692b66b4db2ddd2e55f53dcc7e6e1c1784373a0b67fadadddff5aa1")) - (1339000, uint256S("0x00005c660d497cdfb5a13be94b69226077506128b46a0659b6ea4d5b3c8d9d1a")) - (1340000, uint256S("0x000025a875bb614824947cfefc70701ae1bf573a38f5fd5255d97238947d4d46")) - (1341000, uint256S("0x00000ae023b2b24a6f8bbea6268100bca725b8da415eeef679b1c35f8a836787")) - (1342000, uint256S("0x00000201c23daa15a0241c0e1291fac68143ac9fe72f66370bc9c151a109da98")) - (1343000, uint256S("0x0000305946c0b179db2aab47885b509fbc931874a89cafd046dffab5266d9432")) - (1344000, uint256S("0x00000317b608a52b734a7b3aad36143b761f34e47f26ab1c7c05c75c3af31a24")) - (1345000, uint256S("0x000034f335b83c243f68ff7be160dee32e1faa6b6f05094946f0f169fa6770fe")) - (1346000, uint256S("0x0000207f8a87af0453b46fed4fff804419fb1ffa178ee0086be40d61bbc5d304")) - (1347000, uint256S("0x00001f72cb20b6197b3de236eb3d57bd46878bee758787e75af50b963dacb863")) - (1348000, uint256S("0x00005b521b1d95b13625a9e349354cea391e8caf58db86e07c86642ef9d5b433")) - (1349000, uint256S("0x000064bc53df71822fd8f7a451cdcf6a4837631aa208675e64cfa4fc8f3ee284")) - (1350000, uint256S("0x00001b9b8fa3e8f35dbc95a27c88ae13b6c5d70ad81c7d4353e7f2b0096d8cc3")) - (1351000, uint256S("0x000008939e57dd2d369604bcfbbff892fbd89a4f8526ad0b021fffb01f06a2b4")) - (1352000, uint256S("0x00006f4f0458341f0fb67de2542818a688a772c4e3b785d00336de59c9947b0c")) - (1353000, uint256S("0x0000727e0460a180bd36f387e28a2bc0c24ea5dc34910e1f59c430861e810882")) - (1354000, uint256S("0x0000502d7a840217c1310c002a10dbb9e38826b9bcca353efb318e3712ebc1ad")) - (1355000, uint256S("0x000063fb9048dd54c0350c3f14ca94d561b24ba64e339eac3b741666b2a7ae58")) - (1356000, uint256S("0x00004f08f17e3543181de2cba7842dece3ba3fa7c6014c6b4b43095481646c08")) - (1357000, uint256S("0x000025fa2b0bcd25cdf5877561579f0e394f5129cae461c3a817af816e0d458d")) - (1358000, uint256S("0x000034f582b22ba9a754b83197b6c09fd811dc6a24d7ae80d28d4e405fd44bc0")) - (1359000, uint256S("0x00006317029a3817cd40290b1d7a5f6c88f3c0d33ec2131f5b25dd798b1ecbfc")) - (1360000, uint256S("0x00005be02850d4d4fcc57f1af06934459b2beb0c3e218e41f31b44383e3bc6b6")) - (1361000, uint256S("0x0000477079b78868204a9065bb1f55a3e1b2231ba95421bbd656a4de648583f7")) - (1362000, uint256S("0x00002effd551c67a9ff3b4a83eb19bfd9bcf899ad021fb749524c2889e3e0f84")) - (1363000, uint256S("0x000030de375a7891acc79ed08c5f1f2e462391e825e24bf367283ff761c8a0c5")) - (1364000, uint256S("0x00001a67a194321cc66ac092354827207ccb6b163a094bc670a1e0266024ef85")) - (1365000, uint256S("0x00003f3ae3ef89b9d1f196f47e8b3e42c7f1d4947c518a61239584d1fd1c5efb")) - (1366000, uint256S("0x00000b2c437d78f45eff553c1200e4c017cec07e825359842a764e5fe7f0c8be")) - (1367000, uint256S("0x0000211500a4981a24ab387a229440741f7bb1d230fd41152fa1a2ce55f13d9e")) - (1368000, uint256S("0x00003c915106dce5166bec267e52beed2b998eec834817eafa9fe90e5636e62b")) - (1369000, uint256S("0x0000549ef7cc9bb848c447bc326977798dd599aa25c224c94ee36bc8e568b6b2")) - (1370000, uint256S("0x00000156aa005f16d2c49557dde9ab4e8c8f7988ad3d742349ac7d8e5a540dbe")) - (1371000, uint256S("0x000026010d2b966d1c844d51fca19f808ba9ac595b7f6e67e92d1c57fcf96002")) - (1372000, uint256S("0x0000229d1a4c8ee6fcc5d4a8a8185466f8d9cda1eedbf06e8fd42916def5a00c")) - (1373000, uint256S("0x00000183822f5fd258a0546bf0d99679b6b6250a6dfd00ec41950fa607d80b21")) - (1374000, uint256S("0x00004121cbde3764685f88becc2f76cc82bf267b8e2c6cfb290705286d35a963")) - (1375000, uint256S("0x00004f01f0471283f9e3539aeea5a7fdde6e262bbbac7371ead9f8be817b57b5")) - (1376000, uint256S("0x00005e3524bbf76ca54513bebe1543728110d24b7b57ed29df454d0b5ae9113e")) - (1377000, uint256S("0x000038495b87d9f88798b8c4d9ef076e77533df730af15c59ed2099a22a0132b")) - (1378000, uint256S("0x00000e07849388d96f40d68bfef4eb519cba87b83502fa3ec7b3ad19b7b5e3d7")) - (1379000, uint256S("0x000027f63bf39af6977c10274283d3d9f323fbe265f6947f7281aeffefdc5ba4")) - (1380000, uint256S("0x00005505fc6e9964c5046bfdcba3ed94b981c39d81057fd1e159066d86503b0b")) - (1381000, uint256S("0x000010c64d196f9eaa408a041ca83f4f302f55f3ac336a622ee71305c3b29388")) - (1382000, uint256S("0x00001643b8cc9dae02bece65ff6522bbfd6c376d714d7f6fd49e382d9df42db5")) - (1383000, uint256S("0x00000e8168f5c7315866986466a2c798e5310dbed27fd07fa0985f5c341a86a6")) - (1384000, uint256S("0x0000631b02985c7f9a4c4f6687f5ae7f099c12f03f6bd2a5eb1aa7eee1f97a94")) - (1385000, uint256S("0x00005de1bda0086f5536e4541c116f782c4fcf288d4f28ed8871be8649dd54bf")) - (1386000, uint256S("0x000016ecc09da98c1adc4cde6ffdf6b1e5b34be2392ddd49d917e12268159c9a")) - (1387000, uint256S("0x000016b0710e0f91f24b6307fd32163358e844ca729e1f02e4ce8e99cbdb79bc")) - (1388000, uint256S("0x00007746c4cd4567c2215530e3f617c1cd533d89025d50ca39aeaa5e6bcdfd44")) - (1389000, uint256S("0x00007e6e74437b5e17b8b3c758009957ca4a865fe23e5c33e0099e6f0d8ee845")) - (1390000, uint256S("0x00007250c54dea4de6ae66a06b19a5538a64a98475c1f890e2845cfd0b0f6f87")) - (1391000, uint256S("0x000043385abbf08e4f0aa190078923bc7d27254b6c93256c8f56d026992de23e")) - (1392000, uint256S("0x0000264465ee861672764b4328d3e0a1bb4f2ebe168eaf3bf2e3c7bd68e47057")) - (1393000, uint256S("0x00002bdc46d2a233b0643e8c5b4eb5b4805e94d846b7a3543a72cd184b556e88")) - (1394000, uint256S("0x00001d7e7ef3992f2c2a90dc163a75868cb922762653c92d4e339d63e478f67e")) - (1395000, uint256S("0x000002cb974dbeacf08022dd44eb46648d5aec77cbcb72e04f6b5a511f4221d4")) - (1396000, uint256S("0x00006a978b1ae0aa4dc8b8b7ef6c864ad4f1be7da453480d2f088698810ea735")) - (1397000, uint256S("0x00002f68dd57c62f1086876fec0d9082c3da2566c2f0e6a22bdc429968209197")) - (1398000, uint256S("0x00008031c280fc082ddc06f14750f865da4d885b60f0fc6354481d7a00a52c63")) - (1399000, uint256S("0x00003a8a94de485da24caf7dc18fd923d27bcb07d29a5a4701c9930cf4f98d46")) - (1400000, uint256S("0x000011096de8cdd5942f4bdb443bdb8ad336342b3173ef8fa05307a9c8cf58ee")) - (1401000, uint256S("0x00001a22b299474069d4d834ec72a8a26f18640701c575500e0b5fb6b02fd021")) - (1402000, uint256S("0x00005dea39ad54b2862ae95657164f650e28ba250a4e1c9663b2fbc3db76a53e")) - (1403000, uint256S("0x000055857eed6134a03b6f5fcfb9112dd75b809ca8f579e11cd7b5846fb87c3a")) - (1404000, uint256S("0x000049548a6d09685e90375c2476674ca6e27453a8e05f8874fe0ba6e93d28c9")) - (1405000, uint256S("0x00000aeda49c9635b1079d3497d51e4ae1af507b16eaa4b7337bfde0f4e7ae6a")) - (1406000, uint256S("0x00003ae2cbae0d61d8dfb474f124cf2f6a994e5dcbfb3633bb1e357e358a3404")) - (1407000, uint256S("0x00004f41a6bc783f7c0d1f0c958e360a62ff50c6a40cc18b6a40bcd3a6add2a0")) - (1408000, uint256S("0x000031fe6e28dba476f91e83402b912c47df4002b97ed2f6999c30fa985996fd")) - (1409000, uint256S("0x0000727d07f32206cf915066e9fdb9907c3d25d49ba660db641494d5155a8127")) - (1410000, uint256S("0x0000405c1dc5e1e9bcc44a2c21c1bea6c2fe9b61ce3383ca2bc8051e954bc7e9")) - (1411000, uint256S("0x000035579f681bc9587ed9bb15a692da25409cfbefa79a1a89c5cb80fd3c0571")) - (1412000, uint256S("0x0000508dfbad47ff590c35883c493a875fa012d13bd1347d98a0a1a2bb7902f5")) - (1413000, uint256S("0x000017f5eb3f35a0d31d56b7adf60526a8ae44cc5c30b78e1416e633f7e8d5d3")) - (1414000, uint256S("0x0000808b8460ffb966b6313507830f6737c030f220e071de5619f21dfc8da78b")) - (1415000, uint256S("0x00001b587ffb3f55a7ea904532a213c2a4284b872c0ab9e803f320f195834db8")) - (1416000, uint256S("0x00001a140ad86b1b89f133819fd2ebc32729659a10489d0e7563c258fb67834b")) - (1417000, uint256S("0x0000459938d0e333ce98ece0a10cbed2f8ab955a2f70b1638e367049fe03b039")) - (1418000, uint256S("0x00002775ccbfb25998045102ad45a4a8b60403e877f9a60684a37fb9f1e24ac7")) - (1419000, uint256S("0x00001d4c713389cda24457fdbf22d1c513829e59ebaab09788b66c450574017b")) - (1420000, uint256S("0x0000716e6829dcda9d949cca382e41034a038b018a418bb6cec025bd7aa6b6a9")) - (1421000, uint256S("0x000016072ac6ceb3d2b8835be8e3276ea3fdca6082c922fbf4a2d66cc0b2de1f")) - (1422000, uint256S("0x00003cdeb85dd131660109a77b32ff072cce5119268524f7ff4e363b26e38f9d")) - (1423000, uint256S("0x00003facc7586105dcdaa31deafb1df8d3599e9fa93b1580856e2339148c506d")) - (1424000, uint256S("0x00005fb14795c1157ff1a95988d3defd1e39ac720ecf8595b99e413c7435130c")) - (1425000, uint256S("0x00005bb58f776f79f1a524ad3145b20114a12c5a620b9073b0e0f0730fd07bcb")) - (1426000, uint256S("0x0000607570d3c5d7ead43017397804b87868398256f2af8e61c24b62af3dce1a")) - (1427000, uint256S("0x000071c76f0aef33c1324393d145bf2c794162cce33e992bfc65b75765c6a0bc")) - (1428000, uint256S("0x00006018fc369b3af83b17854e093c9087ddd77802c21fb12497e94a1bc5afd4")) - (1429000, uint256S("0x00002a4e85b18e3dd7c4a07d0730bab0eda36a97a7eba58b7397a026083bbeee")) - (1430000, uint256S("0x000009d80d24169a4bc873c9f878ba7b08a0fefc85a40c1048721b343f249dbf")) - (1431000, uint256S("0x000026f094183a7f07bd8756f7becffd05cd4e7634a5b213ef3c23e5b6f97ef9")) - (1432000, uint256S("0x00007f7ddf1e1ceef2c23ed49e5fba39bfe33a2beb0189049e91cd475eb9f155")) - (1433000, uint256S("0x000060ea03b0e8aa7899d0d1b98b52b4a4c33b205983812d14b81ef09287b19e")) - (1434000, uint256S("0x00002284a454241cdcb0e95f0d9c0d247f6d915ba2214ed5a314a0225977199c")) - (1435000, uint256S("0x00001dd2d4d2dad999376d08dd1e2c472dc1e3455cf7d7221eeff8f6cf9fb114")) - (1436000, uint256S("0x00007bf3f632d51fea6cc6f20bc2f0fb85874a789dc3cd6a1f0f2dc66b5538bf")) - (1437000, uint256S("0x00000db26fa1ec1619344134d24dd24b5a29d510c3f06216630f4dbf73565dd4")) - (1438000, uint256S("0x000047a4145ee353646f39e1a6a6225214630f4e8cb4875e910809f6cb5a767a")) - (1439000, uint256S("0x00004267abb63e82ba97d51ffed3dd98e1460a5baba5aeff17bb941cd5e4240c")) - (1440000, uint256S("0x00005242530b3faa4c464a684aa360213d185b5532279e50048c22478b587e4d")) - (1441000, uint256S("0x00000f7ecbab8367bdcedd3882a469e95dc02a104bf9fe21c3493f6e7eb7678b")) - (1442000, uint256S("0x0000259a5a60df413dabe2177c51574ad856024bf02cab06404d9bf3979f255e")) - (1443000, uint256S("0x000019b6d30bf30393118deb097d33ccb1a296a297bb56efa95a0edcb823778b")) - (1444000, uint256S("0x000001e7d450d911390dd0d21a727f3963c6e2787ab48c9eb52f5f8805bcca43")) - (1445000, uint256S("0x00001ddda6fc26a28b6156c72aef52d46c9cf6f131da11aabc296ab737e84e12")) - (1446000, uint256S("0x00007ef41d460d18ffd70624ffb716b47daeb1fdf1ef8c749e5c6cfeda7e2fd9")) - (1447000, uint256S("0x00003cc8059291cc699032ab2ee35cd58630e91d538f80171e28f3c574eaa72c")) - (1448000, uint256S("0x00005b329cd2f049e697abf9d740d8181ef501357c7bfc1ca0980d15d127c079")) - (1449000, uint256S("0x0000145558665a6e1c6698240d7921c09a80df1265e0316dbccd6427c8cbd0ad")) - (1450000, uint256S("0x00002ab142f116f52000cacdd3f05da45dc7d1a188d04cf57095dde1e10e7c45")) - (1451000, uint256S("0x00002ed9d3dc2d60ebc8fd71bf958f7a16c99c1073ddfd06ca3d3964bf8d0fcc")) - (1452000, uint256S("0x00006c99a63588e991244cb16d65241e7f8c8a51c69f27013972cdfb627ef469")) - (1453000, uint256S("0x00005d800553e59397fd1852bc11ab440d40202a1514d47786e45538debc727e")) - (1454000, uint256S("0x000015d919078132a9919315c6cbc1f016fa32912f6e6d765b57caa64a038c69")) - (1455000, uint256S("0x00001e7eb6d77f2fc2cb60cf49581b18ed0704686a5b9c0d9681f84ad67af3c5")) - (1456000, uint256S("0x000050f68cb35ba10b95d3542d1d1cd7299805675f52870b54a2b35da6a47376")) - (1457000, uint256S("0x00002d3b75f6416e72777492b18de9c487cdc209f82750bf9bb0c61d79830ae2")) - (1458000, uint256S("0x00004d39813c667b84fa19e1ba8934b197accb59141d3b407c8e6310a2be353c")) - (1459000, uint256S("0x00003f9968f692a32404d64403d7574d4053d75d28c73bc4832ede6363a37815")) - (1460000, uint256S("0x0000457bf2734cdb31c828d467d6678140942cd27fe84091543a33c1a786ff0e")) - (1461000, uint256S("0x00003640de8991d2dce4dfbc5aaa40195c1d248d70e4ece748bf3841aa68a9cd")) - (1462000, uint256S("0x000038feafbcf1b9c8fe8b07ede5051a04b9a3f935b5b63796b9b822c2af6f7c")) - (1463000, uint256S("0x00002933fd1e62ab5cd54a40efd87091c057886fc0ccb5e8865ff53583ba3134")) - (1464000, uint256S("0x00004a7bc1706346d7fc51fda7d5dcc993592fe683d2f17bf594868c0ac7e6e4")) - (1465000, uint256S("0x0000620221261d65b72fd31fcb2ccbf37f743282455312a5013ec58901bea574")) - (1466000, uint256S("0x000017ec19979da76669b4dc9bc3c20ea74d0a9ee3d8c93dbbd45393f4278510")) - (1467000, uint256S("0x000030cd35ee603269884c9fea00e6fe9abd8a58a2ed15a72ca909f67c9ade24")) - (1468000, uint256S("0x0000576c624d94aa124844c995943a953fc9ef249783a76f1bb10ea5246a3309")) - (1469000, uint256S("0x00000bceda549d22ff52a7f21769aa9cafba2adfb5f2039b71536c841d72fe80")) - (1470000, uint256S("0x000027cf3973376f2e39711853c969763b3a9a5f614c479d36a82328b4034714")) - (1471000, uint256S("0x00005477303f498253b92eb410b9ce73e377edba795013722a8d84f8141ad872")) - (1472000, uint256S("0x000053a3db0b7b34004610d7cfdf59e72fe278468dfea1f5faadb251a0304f3e")) - (1473000, uint256S("0x00001e515ef508874a83e6e75906dc64c2ee25fb5c462b6712f947ce725195e5")) - (1474000, uint256S("0x000037d40334077f5387ad4e5aacc41fe720d5593e2d75fa6e7a12d23dd2251d")) - (1475000, uint256S("0x00003ff337fba64eec0d5f2374194d8764dab3c173c7ab593490fe0dba23ba6e")) - (1476000, uint256S("0x00000f028d26078a5beb3ee987635bdaa93d4d8a4addc0bd82d185844f4c78db")) - (1477000, uint256S("0x0000337fc9cf8d52b2ab171460cbb3976ccfbc34e2366b50c65ef86f4a8058d3")) - (1478000, uint256S("0x00001e75d7b55d58122fcf44ae97243fad28993ba9ecf8e29b57cd8d726dc448")) - (1479000, uint256S("0x00001bbfca4da29a52407aa2d8b49c77b5bc48ed0f62e59fe37d513cc51e2c8f")) - (1480000, uint256S("0x00006f49e804684d1c7e50bf8e1234fc1fbd123af27ba7459f20c07203b93054")) - (1481000, uint256S("0x000025bb119aa40cc5a1064366b832a489fee8ec615e8a57b9b5c6fcb9989160")) - (1482000, uint256S("0x00004e4df74223c0aa441425d08fd3e9eb3d6c54a12b3060d99e9b5ae3009399")) - (1483000, uint256S("0x00001d35a5f1960bdd484ce1c3e4a51163d4fe153f6f0fdbd8286c6834e59ba3")) - (1484000, uint256S("0x000027928236cc6cb5403e3cbf3157d4146de4d34e12bcf8af233918f3c6d52d")) - (1485000, uint256S("0x000064be474b3ec1e860f61848bdab8a01bf0412bbc7c979d8b4b05a18b1ce6e")) - (1486000, uint256S("0x00003f75f24012a202f6916ac20ebedbe14e6fd1ef09b037404565a311643307")) - (1487000, uint256S("0x000055c76e5db476d20d9a5fd219fce2c9c8586bc69750a66c19407947ebe0eb")) - (1488000, uint256S("0x00000ba35f0ccd2e8fc94caecb8e034b39aaef28bc68cf268033e765edb8670c")) - (1489000, uint256S("0x000037b5608bfd9417c5aaaac6dd4689a2e286f61e046421aabfcd27c42fcbd6")) - (1490000, uint256S("0x000047018d94461b91f86e2591f8a175b54d797fab29e8cdd07a38d546cd2ae5")) - (1491000, uint256S("0x0000339ebc81a4d1c99266c1ad4c0bd9e60bdf9f3f7a5fc2b7d7c0ff1023a20e")) - (1492000, uint256S("0x000034f2be651c725a501710b90dfc7ac2a7439a7790d178f37e635339582d19")) - (1493000, uint256S("0x00004e36b6c7820cec761cf75c6be0817a893dd2c28ecadc52fe9570276c6676")) - (1494000, uint256S("0x0000436de2198200c988fb5329dd0629693ea351099e6a7ee54f2fcd15fc848f")) - (1495000, uint256S("0x000030e54f3e42971065cfb365889092df67c4f4cbd8d9882309d408beaef4be")) - (1496000, uint256S("0x00002c91d87c10542b3db4d339f84ca3d6f537c631f4d3a545fcc63c242d47c2")) - (1497000, uint256S("0x00000e03462a161ce11c317d3c3959d057f4dfdb72ca767d3ea92dec5381f4ae")) - (1498000, uint256S("0x00000b00fef2c10cbb333e159bd725051cb2b8868c3fa7794180a862b8c4bc2b")) - (1499000, uint256S("0x00003b1c63ff1b19cc6579c949f4e3a8a70257b61cb13cba980470cda9296a40")) - (1500000, uint256S("0x0000324248e01dbc3a4dcf9d3065e5e1eb6c81fa8586d4b82b32e97cc43d8356")) - (1501000, uint256S("0x000043493acb1081ca68732119a37f8a37bbd98875aed14da785180190be64f1")) - (1502000, uint256S("0x0000560985bff5d7439e08ce1dad6deb423279192f27ced560c3a01e037f95c1")) - (1503000, uint256S("0x00000f4203bcef4cd3199e40f90e164de773436eaaec87cd8a9dd932d08c01a2")) - (1504000, uint256S("0x00001a20bfdbec3a4640a5a0b494d8850326fbed04d790fb552198ef2b081782")) - (1505000, uint256S("0x00003ef1fdd6eb80ac9a5d58ae0323795e0ca7ff3942ef0b7738cc6c6af3ae27")) - (1506000, uint256S("0x00002c0517b5619ccc18ea8ac5717dc57cc3b613de03b040490199e463db2738")) - (1507000, uint256S("0x000051e4b0a891542c75f463c089d4e5f0e5af64a8d1aea734de1d28acfd2fb6")) - (1508000, uint256S("0x0000533831066724eab70c56e2ff2ea6d91a4af4c455b41f9dc6bd3072189fc9")) - (1509000, uint256S("0x00001305d4a25f67fc5365df6403a6caf3b44199cd7499da724eae6f2ccf65d5")) - (1510000, uint256S("0x000029fd6680e674dad7ad6a5fd3f44e73287062d47bb97c7644db3489a4fa36")) - (1511000, uint256S("0x00000e8c0c7c707dfde3d1b31a3290f8c90e709698e79c70c0c692d31a11ddde")) - (1512000, uint256S("0x0000619dc165673789b342d1840fdf31dbd3a0a1593513cafa3bb63af729402f")) - (1513000, uint256S("0x0000459b32b8f32c9f6744e4d7efe9dd2f387140cb1b0f9d4b6e9357f10ad16e")) - (1514000, uint256S("0x00006f522875038fce8852a8846919f8206026dca7932c996d5f32f49e31a35f")) - (1515000, uint256S("0x000039e9c41476289108b9b4c69adc07451a35fc9f156db6e7267cf2bd160d33")) - (1516000, uint256S("0x00003bf37101566dd38384ef39896ac740fb0d5cdfcdacab406bc89f3c3a1b1d")) - (1517000, uint256S("0x00004932a3e8b7a39d1af6e5687a73cdccc1da437bf14995c023f5f0d3cd66f2")) - (1518000, uint256S("0x0000637f5d64d8a2517a806c784086134630d740b932be18d45ae20f130e996a")) - (1519000, uint256S("0x00005340b308a63376f46ac08ebd71c70aebddaba4705122aa0a3019331bfc63")) - (1520000, uint256S("0x0000037445ddb55d5c28f2a4446780e4be0c7f47cccb626bb0fbb8a3a10f728a")) - (1521000, uint256S("0x00006946ca6a97c12f2b8e6009f40bf670914f9867fa846cab06f1e0a674c65b")) - (1522000, uint256S("0x000004827524135eab105b368e2aa794224de498f31392c0a6fd3a4aea38c837")) - (1523000, uint256S("0x000036e8232c944a7b9b2a2068555c91fd6529fdf335fa9626c5e096b2271ea8")) - (1524000, uint256S("0x000023c8cbb293fb6a3a973b5d7610ae3d88f7c8b6402248d8b81024d5cc5fcb")) - (1525000, uint256S("0x00005cd2813b417613f5dae9692064e6aa7fb8c74b71afc649f06128df62d0cf")) - (1526000, uint256S("0x00001ba5005432017e83161723a376e787796e66b66c65cf0cdb2a01dbe2040f")) - (1527000, uint256S("0x00001d5c090338beef5d6218e8f1b452098cad822f656e9c4c42188806d20b46")) - (1528000, uint256S("0x00000a466b5e366cebd5a05f4791664b692e7795bb432e860a7e6e9f51a7ec67")) - (1529000, uint256S("0x00005d9434f77694bc50168a7568a6bd8be685c9346dbe2e500ceaf188e43bb4")) - (1530000, uint256S("0x000059d5ff92b926dbff5b3d54f35a544b02501851c58d1abe75bffbd41dfc5e")) - (1531000, uint256S("0x000058b961b0a4c0bf3e3ef170d4a292fadcb35542b473a2427100e6438bcdf8")) - (1532000, uint256S("0x00002bb6b5aa24b3d8cef0a87fd2433e4a71044337af7d4b8efa2de3165c545d")) - (1533000, uint256S("0x00002f998ff8c1796e20a4a0fda67042a9536932631e36453fb0d572044b1236")) - (1534000, uint256S("0x000005b39e2588b0bde112382f92fa3c31b46fb8db4b9cf807aa6d55f4c8d818")) - (1535000, uint256S("0x000043743d50a88fa433397d198a0a7d695d38ba765ed10d256506e866b5a3de")) - (1536000, uint256S("0x00002c52d80c50f3a11bbea52bd8df8a79a09c7dff6f9d9bac57ef7af3a0f9f5")) - (1537000, uint256S("0x0000540162434470999d0b649f28f5372fa0a1e8ac0e1377fbb7cd4741b266c1")) - (1538000, uint256S("0x0000616aa7db059317abdf3474912a9d924b66dc2b5937b9b21810baf553237a")) - (1539000, uint256S("0x00003c64995ff3c589a2ac3f0471ebeb1542a7efc907c818081a41bbc803e429")) - (1540000, uint256S("0x00006e5ef028324567cb084b819d13b8ff2ba8d2d1f4d682cfba675455007a3d")) - (1541000, uint256S("0x00003d5fe2645115ea34279ce8fa1999e77242ee194cc0f8f28d6939cfe54e5b")) - (1542000, uint256S("0x00006fb56c95b6fc0b371d5028d26269c2f80bb8adaa2cc6521ee3e22db04b0b")) - (1543000, uint256S("0x00003f1d51f1135bc204c22bcf3401b580efb17b08a164c60d6d66ba2b6d58de")) - (1544000, uint256S("0x0000112c5a0b02d5258361bd4ca4e859c2cfaeb80caef4fb6dd6a79f1856d85b")) - (1545000, uint256S("0x0000369839fcf820ca45525787abc752a54826fd0a2ac5f6a4da13a1aefaa562")) - (1546000, uint256S("0x00006200ddb88ab631c1a2fe6b3fa3b19e7568069e0381e061af26c3578fef7c")) - (1547000, uint256S("0x000056f960fda0ec23bd1102a9b28d513e1f927449cc23a5e68f7e6ac9fee73f")) - (1548000, uint256S("0x0000528915ed9c5b205fa0c8d1e3e354df58d87facd66bb441c0b572416bc668")) - (1549000, uint256S("0x000058d83f9d7347a849e1097c45de1b2a3d8b0d66c2c9ffac1ef50d5f8f2e35")) - (1550000, uint256S("0x00002f2255e089937ae2c11e0bf2f096dd2e4602b9d1e2c10747ade07629b45b")) - (1551000, uint256S("0x00000b75bab95db82fe97910341f75a403ecd8ad7226e4cd20a1fdbe6e22c099")) - (1552000, uint256S("0x00006c630f876f9d8c511c56ece86f6649dfc4e431c10e1b07d6adbcf35083b0")) - (1553000, uint256S("0x000058856c3e68ed63195a8da5814c7a1163068e1431d2d956790a4ecf107f02")) - (1554000, uint256S("0x00006269759675c42f0fef86e5a638b8ffe8e8e0a93ea08483398dc70a1dd32f")) - (1555000, uint256S("0x00001350376b081909694bfabd00f0e87276bc896440f23ed0252f2e2a5194f5")) - (1556000, uint256S("0x00003d7079ef71e7c159e6ab1cd92f3af5ac9e362e42a14530f1c31a8b74f5b0")) - (1557000, uint256S("0x0000595ac7499c1fb41bd90a175c31ec50570d948491270931bd07e1492e251c")) - (1558000, uint256S("0x00000e52e16cbc10f302a8b1676eccc61a687d7e595830afd37a9e6a2a553673")) - (1559000, uint256S("0x000016ea90eaa3e6ed5ec1c0df2a9db32d4f5a3f85ef3ae276aa9aefca29d9cb")) - (1560000, uint256S("0x0000280433109582ea0c96fa1867c86f70600dac6f9914a91ea049969594b809")) - (1561000, uint256S("0x00006d64f133b1b715f1e8ba259f452e068d935216b52006623615cdeb5364bf")) - (1562000, uint256S("0x00005ce06c254d44629cb5c7e1444a2662e74a39020e05c43c64f4a0315e362a")) - (1563000, uint256S("0x000052fb949f15f05421f6682171802a7aa2138aafcc95d5f22bfb22542d59f4")) - (1564000, uint256S("0x000057d41a403a9f0c0ec301f45ca86e4cb3df50bcfda7d7b0bab86ba9122205")) - (1565000, uint256S("0x000051dad695df837258e4ab91db4f08efbaee1556a80b69a9c06461e1874a6f")) - (1566000, uint256S("0x000007d82ca32972994e90aa8e2cd9555e31f9f8277949405249f15d45e963ea")) - (1567000, uint256S("0x00002ddd9c4656c7d78d8917434f94070c0672967ae255d6f57646b9b09506ce")) - (1568000, uint256S("0x00006bca7a17c03734dfeca39f23510a8eb8f25030034c99daa52111119d6331")) - (1569000, uint256S("0x00007066b928536fc27343c0fec355ad0c52b59906223f48308e41c4ffd22339")) - (1570000, uint256S("0x00001e8f4d2fd86654189f494ace0a835f855c960358d901b51a0eacbb391543")) - (1571000, uint256S("0x00001309773bc979bed740fa624ed136241c8e492825b6ecfbdc39c025b24550")) - (1572000, uint256S("0x000038cfb767f3b97dd3b546f1e9e6e52d7a623dcb41c5a7454597cecc1db4b7")) - (1573000, uint256S("0x00008032108731e660a00b2812cb8b9a75f0ec16b143f9bceaf6410294c75904")) - (1574000, uint256S("0x00002f7c6593ffc9e2ad1eabb1c9b3ba04f43f433ca62e93c9f318c6fe5ee3d9")) - (1575000, uint256S("0x0000174e15f30ef6a742622af6659ad1c0641833156ac4c64144b54773cb7e30")) - (1576000, uint256S("0x000081f693a5455a8b28883eb4c97ae09440bfe6c81a0f8253bccc76cb644fb9")) - (1577000, uint256S("0x00006080530e97ff85b33784ea5fc8195320a4cb329e49a773df0a9f604a9aaa")) - (1578000, uint256S("0x00002821144963291e50d22046bf65f5c01ebbe1607746b34461013664039a93")) - (1579000, uint256S("0x00004cf0fa901f1e16bd5f0963773e5a5df0e210168a44a13be9398bfd7ca112")) - (1580000, uint256S("0x00001e5033df33216358904bbbf6cb9cb3b03b2956893cfd8c032b4e5c4ca08a")) - (1581000, uint256S("0x000087635ea70c8b1ccaa3754106dfb4f5d92219f522e7e7609b4dc75f404634")) - (1582000, uint256S("0x00007745f61f8e388b3d0ae55b6313a695cc8622d8d76497ea4745e294061f7e")) - (1583000, uint256S("0x0000636ab289c2287033066f8bea4222c5ee9dbdf3eab7945830d8779650a471")) - (1584000, uint256S("0x000004128d5a5cf452ef9aff1a87f39613ead76508367786c72679be963a6d4b")) - (1585000, uint256S("0x00000920f2773b73d275fef0ac909578d7d436423533c58b70201b552e010e74")) - (1586000, uint256S("0x000018fda4e4ca2e4f0716e30c9f743cd415947bff1a8eb384dd50c92b2f0143")) - (1587000, uint256S("0x00000aefb81fcf668e42994c46c961215518f712df4aa5556b7004a0c0bdc2c1")) - (1588000, uint256S("0x000037177927587a0e5903dbf93408ca263bcf868018d827f7b248bb36394a7d")) - (1589000, uint256S("0x00007e364a90288aae61feefbe6dcc218458c98ed9d4ab62a522a727f9dbd7e6")) - (1590000, uint256S("0x000047707a12173afcfff8dfa0ab9790c84a2f233630adb35187656cdce4dbfa")) - (1591000, uint256S("0x00001660b1ee772ad34fb435f8939f669ab3aa4e49c839f3c19fc380ce1bdb08")) - (1592000, uint256S("0x000016d5ee6370b9e4e3d7fdd60c5791032c6df4b396a1bfed2a517444955f6e")) - (1593000, uint256S("0x00002fd99027c0d83531ecd1b940f4c81b8f72796fba37f05f4f57cf788d2d90")) - (1594000, uint256S("0x0000075f6c2da6e0f6323d083fd69ad0ec7119356aaf50b6d02f859af1f868ae")) - (1595000, uint256S("0x0000a7ffc5b96746369c1a04dd062cc4ededf64f2a9ef11cf4b3bcab99946f55")) - (1596000, uint256S("0x0000930876f4fdaeb5e7ff316214247ab7d47fee47f6d3c65b93639f7fbea0a1")) - (1597000, uint256S("0x000064a14bdf8276b1ec884a0c9983f277a0bfeeeef5782b4e79dc7deae3c19e")) - (1598000, uint256S("0x000084c89eb1776d748687f2e180d6640e5a7cc8c8de75706b02e29f87fef8be")) - (1599000, uint256S("0x00001cdb7ec465e5edb8aaf78570970a425309f050fdb9ed376ad4b98a888b11")) - (1600000, uint256S("0x000026c04739309ae03a6578613b71fca0572c9793521809967ada579cc1830b")) - (1601000, uint256S("0x000090beea47fe396580e3669295f1463abc047585d3c5029d3a29e473f2e4e8")) - (1602000, uint256S("0x0000a8ca712ed653cf5cdf141382b02b552e21f4dc687a89ca946d7a236fca29")) - (1603000, uint256S("0x000009762ffa6eefefcd29703f41cf9bbe5e44b4a757968f107ad9e20679c373")) - // Generated at 1750959556 via hush3 util/checkpoints.pl by Duke Leto - (1604000, uint256S("0x000000047ec28daa1ebd35d272006bb99be1bfc432e64fa9ba7558669a0beebc")) - (1605000, uint256S("0x00000002829e77226633eecc400ad22f7c0051e9acea26285ffb12cad1fd3461")) - (1606000, uint256S("0x00000005c2cb7675138e10f36971d9620254bc4781d07f0785c0567068e39ef5")) - (1607000, uint256S("0x00000005703e6b60f7004a502a54615df241f38e1b4f30856a21db2ab8e2a162")) - (1608000, uint256S("0x00000000397c7d1a709c8156ef2d3da4f63b06cef6e16656510e9fb07e398d94")) - (1609000, uint256S("0x000000031accfc8544bde0cf3d160e9c46186d1330bfbc2f075bda9e63e71058")) - (1610000, uint256S("0x00000000318ea4aea52e334b9b3f8bf91e63fe485468936bba68485ae1095a46")) - (1611000, uint256S("0x0000000197b39d70fb42cd31ddc99cc3993f8fcf143f4f13138908bad9be1dfb")) - (1612000, uint256S("0x000000032441e4bbf21affe0c75a11c2aa6e8527be12effc017cb0601dd0d88a")) - (1613000, uint256S("0x00000002ff16ad0bafee22be75b953357ac958b64aa74761017cf27ef349093f")) - (1614000, uint256S("0x00000003a313b96708612dd8223e7d1bf0384b6edc56320a9932f64d1d638db6")) - (1615000, uint256S("0x00000000d192d0150f90daa6b4e2e6f7236cd641314fdced99fce65fe30d48be")) - (1616000, uint256S("0x000000036a26bb9a2481f666975bd98a478b52eb98cc0719fea84bac424a7ba8")) - (1617000, uint256S("0x000000015b35b9e2df778aac51af83403d9f361c582ff8a91a3dc4fdfadf7018")) - (1618000, uint256S("0x0000000638029048e3dff9fba19fcf06b88543ecfe45980cfdb1282670095d85")) - (1619000, uint256S("0x000000025fcd19b079405d3037588012a9cdc138ee633dd5ab5cdef92a8de23d")) - (1620000, uint256S("0x000000048c6667a8724512cbd999bc491ec8522b1f3817001c7ba485dec46d10")) - (1621000, uint256S("0x00000005d981cd3473f8815d18965c0e0035993117390e9659fe8d3b9562c8dc")) - (1622000, uint256S("0x0000000371a1663973c7b19a0b4dd8673f1ddb14a0438c89de3908712437f688")) - (1623000, uint256S("0x000000038ed359f4cdcfb54a0ba36a8ac89e4f697836920c28dd038d643064d1")) - (1624000, uint256S("0x00000000ca915eb30164ac2aad328ae5d9d4531bf8ef30c7bdf3c18c0abcdae4")) - (1625000, uint256S("0x0000000303957deb36dc6a3b6597984ca9585172a198342eb102a9d3b9455596")) - (1626000, uint256S("0x00000001485e2bf5e67162c35b4dddb9ea709e639bfdf79c8b9d1e0fd9abcf00")) - (1627000, uint256S("0x000000000cb8f8b60fa1e57622a7a5bb2daa07899d1eb39f817f8c424a52a3e5")) - (1628000, uint256S("0x00000000eab91143aa66330d27d57f77bb7feb904d17e9a3ec20c7836c701f35")) - (1629000, uint256S("0x00000002ed48f715858c998e5133c0d6748b820ce3380e2759db5558209a167a")) - (1630000, uint256S("0x000000032c724b40a4fb6d3e613aed9f294f22b76fc30b6caaa3bfe7ce3b01ad")) - (1631000, uint256S("0x000000008b0eb942b318fe821ccbf977d24a34cb9138555cc02130ecc655af81")) - (1632000, uint256S("0x0000000061c1e1eef48730e29b494681c2a3aab036219bbea140e0e4f51e0d6e")) - (1633000, uint256S("0x00000003b3d9950c5ddb598a474edc15fcc323dd59b44c32534354a043014707")) - (1634000, uint256S("0x00000001e6b8b9a471537f3b006c75428405c0f877e638e417ee9be9d2ff43b1")) - (1635000, uint256S("0x000000030073be68be4e7d68bcdb151ecf5af613bdfb9e93e7d1f7b0752f7aa5")) - (1636000, uint256S("0x00000000fd1b3853a2d59705d5b36e76491c58e0fbb81d2b35d7a7e3add3b4e1")) - (1637000, uint256S("0x000000023620ab021fb58eee94b3fbcff4b7d502807d028bdb2f32708150aae4")) - (1638000, uint256S("0x000000043c2e172e6ca4248a65ba64bdbe445f5f81844752f988a107845f349a")) - (1639000, uint256S("0x00000002fcbf7f7b4e04fa895012776248ce5020ec4bded612537a58c9dd87ea")) - (1640000, uint256S("0x00000000d6605a8a213fa134a2bf74cc901a42d0706718090788d6915c7ebbfd")) - (1641000, uint256S("0x00000001716416197b1802314a0d0f1679ab789e258ed3c930ac3456dba9bed4")) - (1642000, uint256S("0x000000044a7353133354febf9a2549d6033cabff8b3e9cb8c4335ca809d9d048")) - (1643000, uint256S("0x00000004b7eaa979bcbd468e4f9f0e4c1c9a7dde3eedd1ea53a5ce2bef562b09")) - (1644000, uint256S("0x000000027430ab7a59514ba994b3f114e5c28ea36f714515ed3cf70caeb8d227")) - (1645000, uint256S("0x00000000d4de211a3a25d4243278e0fc498058a9bae5860ae35963bcf155ba4f")) - (1646000, uint256S("0x00000004d8e662533da408b1427c4840c477bb176f5d6cc16e989a57646ecba5")) - (1647000, uint256S("0x0000000213f087be9c672b98a13d76dfb77bf276dee00e14a708c3b864427331")) - (1648000, uint256S("0x0000000129f391dd5e18ce5efbfff76edbdbd87914b7b07a68a6bbee01b4efa1")) - (1649000, uint256S("0x00000003c84f48d9074fe0dd3132843feebc204b7832fcf58265ed2b0fc91e9f")) - (1650000, uint256S("0x00000000922fca1c2ab235f6592387433c0622665408caf1a689d588acd7ef4a")) - (1651000, uint256S("0x0000000235c9ddae6fcee3486886406cdfacf06729a6a7e2abbd1a12d5b65367")) - (1652000, uint256S("0x00000001122a37089bc208bf027091c41aeed037a011aebfd1beb1388aa6e3ea")) - (1653000, uint256S("0x000000013177553290193311f8cffaa71c3648cd54039bd700685f626b7f61c3")) - (1654000, uint256S("0x00000003fadb924a1ff4dc97591004198afc9711dbbd404099f671ad93a372f5")) - (1655000, uint256S("0x0000000155ca47f18a7bc8dd51e68140cdb9a8e9d3b774276ba1dbebb1755857")) - (1656000, uint256S("0x00000003899e96ab824d812f38ac7de0c68edd5092fdbed2bc2c25ff98d64a23")) - (1657000, uint256S("0x0000000382b6257c88191f59c00b494a70a9748fa6e15edfa3a7861961836125")) - (1658000, uint256S("0x000000015f51ec2a910d81081f3458e384fa6fd3687b6b6081da5d908c21fed4")) - (1659000, uint256S("0x000000002613a74bdcb2a4321f2bf8b17dfd247cfe139ea569c0912ded3c7d2d")) - (1660000, uint256S("0x000000049e13deb195724e2a64bf4d7a476b44d67d9779a321cdc32f2363c691")) - (1661000, uint256S("0x0000000188e1647808e786af316efa45a9faba7241a24ea44a7b3b1487db382d")) - (1662000, uint256S("0x00000001edfb091e9ea392c20a197002d7de65656f41b97fdd2b175dc92860ca")) - (1663000, uint256S("0x000000029800198e2b567a2b256bc5089e6d3a57379e22ff966126151acad77b")) - (1664000, uint256S("0x0000000215402fce1b5853158fc0210b3cd3d8ad125af4692562ed8f9c399075")) - (1665000, uint256S("0x00000003164d40c0bb82317df59c0e325601b268d2c579d8f81e593c1e85adda")) - (1666000, uint256S("0x00000004a4bb0d82d09a6cfdea1493de1e960adf9bf58ecf12fcc65d8c076db6")) - (1667000, uint256S("0x00000000677a80fc06a62957146bdcfc83c637504683265fb09ca655b14a1ad8")) - (1668000, uint256S("0x00000002d16c791f19fbfb53f6b8b061af5276a756b632a59627889291caade0")) - (1669000, uint256S("0x0000000063226419faac0536ce13765bcf210fb02f4b32aa34dc68e36edc62ff")) - (1670000, uint256S("0x00000001d70644f12e0ed97832baea5d8d52b4109c3eb6d13628ca61c6983af6")) - (1671000, uint256S("0x00000001cf40d5ab42932e082e3c8f0bb769d46e759776113a40e864d9aa4aad")) - (1672000, uint256S("0x00000002070b8a20b0c1491cb30554beaa4070ca92c043a436de279794e9f24c")) - (1673000, uint256S("0x00000002619389bf5e4e12e728a4879f0ae9e09e59721313efaf00c293dbb3fd")) - (1674000, uint256S("0x000000032517420588e7b8fa7892ebe9c04fa247dc04a77cf7ff8cd96dcdfaf1")) - (1675000, uint256S("0x00000002e056c3b3501346a044723757bdf22448957ed61f580482cead17db2b")) - (1676000, uint256S("0x000000021956ce039b89a4dc4f57bbd948852fb8e60cbee97e47914476a00af7")) - (1677000, uint256S("0x00000000dcd83c42b2bd5a062c0e46237232166a3fd11fe0909908675d4b2960")) - (1678000, uint256S("0x00000002be3d780622e1c8d12dfb9ce8e00d1a6a0774edac2ec7cacd0d47968c")) - (1679000, uint256S("0x000000021acce8c8f368551df6373c7a87d884847a4837abfdeca3a412b50cdb")) - (1680000, uint256S("0x00000005910f9f52c1b2c386a051811f11d3eaa4c737dcce58ab3cc37fcd62fb")) - (1681000, uint256S("0x000000049ffd7d05bb3c1b49874baceea1bc7b6b900e31100c2ca3bcc28a25a2")) - (1682000, uint256S("0x00000001b230ac60a34ebd20a60b32c881c6d720e61eb8ff353426579d9a38b4")) - (1683000, uint256S("0x0000000427e6838977f26189ff5e1d56ebc6ecd7a9eb06d0ad1cae3ef773519e")) - (1684000, uint256S("0x000000022f04d5082852031d455546c7ca4a25e964008f8ea69d29946f28e1e6")) - (1685000, uint256S("0x0000000475bec2831d736ed0a14462c023bbd80ae03d0ec2e5c4633339332456")) - (1686000, uint256S("0x000000047a42b4eabe3ffab8d95e3cb1a2d923afcbda4e335374e728777fc474")) - (1687000, uint256S("0x00000003eda47c88b7d313cc525f0511934dacc364d045057eefc2148934cfbb")) - (1688000, uint256S("0x000000040d7bda41689357c29aedb77b016f3cd2ce2bc3ba04c4bdd95d455286")) - (1689000, uint256S("0x0000000128027ca8f7b2dccb44d26946b9df6533f05e63da9d475867c4b251fa")) - (1690000, uint256S("0x00000002dbbef67d168a562e36ba850e15acfad1172d1134df4f1f4288c9d865")) - (1691000, uint256S("0x000000048ad7645fb07ec103dadabfb66c2b544c69bd920692a834a8844be93d")) - (1692000, uint256S("0x000000010ddd71bc79e292a7c6e3c70565ba211f918eb1751e905301acbcd517")) - (1693000, uint256S("0x000000010dc70ae11c82e34000cd7d1a344bbf9fcf6344b3ac04f3173d1703d0")) - (1694000, uint256S("0x000000027e5cb8c5bfd613100811708f7d180b994650d3ca6900a81683d50fa0")) - (1695000, uint256S("0x000000014325867b388dc34843b695536eb9185c6782707f1c86edf0b5b89e9d")) - (1696000, uint256S("0x000000046385ad70b5c3de53eb6634836758eea4f7ee7b81a889f7201e27337d")) - (1697000, uint256S("0x00000004bbef43e1ad19298dea05462d23e7de9482dfda72c8643cc5a73e3356")) - (1698000, uint256S("0x00000000c7fa58a2b8420904097a9e02bc0b7aa9bc9e427ae1eed1908a150b0c")) - (1699000, uint256S("0x000000020ddfe5a4caddee1261f1b30faebfa220184e7e8fafee520d1bdc2452")) - (1700000, uint256S("0x00000001c8a7698cd8594605fed3594a8a576535d94f3440ba69b2ec01706e2f")) - (1701000, uint256S("0x00000002e9daa2a596858bd331b6320b4aaa34124ace3dbabbd50502b58eaf6b")) - (1702000, uint256S("0x000000015cfe670509475a9e7f693b5169e02d54bf459342f511b39ae05d8ce5")) - (1703000, uint256S("0x0000000045def8972d1adc0828618f4186f89b2d550a03f099ea4a72a78161ec")) - (1704000, uint256S("0x00000001a4a313c141aa9f20bb8011d00315bcfab4784a711d1529851ca6f218")) - (1705000, uint256S("0x00000000fc4bbd9320b7b0f3329c52e604655d872caa8ef9a64eb34e44b42795")) - (1706000, uint256S("0x0000000614e676936e086495ec9b3b1688a7d6030d032c3da7c241a417e6dbe7")) - (1707000, uint256S("0x000000005ebf5e6aa923dd2a4367d7747126343356710659b4b105b5557b26be")) - (1708000, uint256S("0x00000002dbfbbfa81aba34a934a69c7d6db57ace02eb20b7f1be183d8bc67b49")) - (1709000, uint256S("0x0000000481ece1648cf7bc906f3f912d7900170d6adda615c6e9402e7aae7a71")) - (1710000, uint256S("0x00000003b17400949f2f3c82142eca4c6590e863f657b64a3dbe7f79fccf38d0")) - (1711000, uint256S("0x00000004f87d08b7c4d366db9cdcef3f427842525b6e61c42338474821a22e03")) - (1712000, uint256S("0x000000049b7af8b5b5f9eb3f29d37e312abde898ad5b4891cd7d0ca1a7ee6c9d")) - (1713000, uint256S("0x00000002fe801673cf970df547fc14c4028b7c77abc185cb733b1726d8bcbce1")) - (1714000, uint256S("0x00000004a088e6e02bdc2cd157915dc13f4ff56eaaa0e7e79b796b5b3c72a89b")) - (1715000, uint256S("0x00000002e2d5aab4a2e23b05498896ff1e8c509e66ea5018c5a48135d65f54cf")) - (1716000, uint256S("0x0000000050ffc3dc91d5a8514d461b81515ebd67e22e2e3588436a8a10d7b768")) - (1717000, uint256S("0x000000017bfd0ce4a25cb8d4bae41b7e8d007854c1a66ea2fc015259b1e76174")) - (1718000, uint256S("0x00000000c8746b2e580c8e50800000d65fe893b974c2b0825521d916a87f6bbc")) - (1719000, uint256S("0x00000004647c20d62c9d15237d1f7d7996fd09c3e3a22f85439d1437eba50ca3")) - (1720000, uint256S("0x0000000087327d6b4e0644f9160915ad6f9e61497569d6223f079f7e9745674e")) - (1721000, uint256S("0x0000000201320ec96d6595875bcea2e431521b5035a766b072152af196004dbf")) - (1722000, uint256S("0x00000003d96adf0598c8a738e69fab7e578be011a49725b7dc77ebec29641dfd")) - (1723000, uint256S("0x0000000539537247a56af803ea95566ed5460664b0ba7958304f8f12ddbd657d")) - (1724000, uint256S("0x00000000e00f083cf90a695e5d6027a64e6cf3d42597a56871d17f310d7d3136")) - (1725000, uint256S("0x00000000888dbc0aa88e5d36cea342943d0271d5bfb15feebf637a838088aad3")) - (1726000, uint256S("0x000000059b3c06996b53335953a921cbd3edd0987b95a6be1987517afa58fd6c")) - (1727000, uint256S("0x000000048b539eaf18dfb0a9ce0b69a089fb4bdc80f4248dfd3e0270a2de6ce2")) - (1728000, uint256S("0x00000001055b9a98fd452d8b15f32990319ee5cb55fcd2463f382f1c9ba3ef4a")) - (1729000, uint256S("0x00000004237a1b7205a35ff9d2ed13198899f6995a0c9080ea1e0fce6b119d6c")) - (1730000, uint256S("0x00000002db2eb82e6309c174228bd0ef365f39ae75774123ff97ac729ce2ed42")) - (1731000, uint256S("0x000000066d71c51b95c32540d10fb0a7dcd8057ed812fb3bad4e084926b6cfe4")) - (1732000, uint256S("0x0000000285bd425dd245cc5456f6e0df4d1fc35531019297f3ba4a39e1c0f20e")) - (1733000, uint256S("0x000000020aad80909c26fc60918260f1096897a67d8d0e8e712b5374c04df5f4")) - (1734000, uint256S("0x0000000454b30f370832f4f09dcb3cc25347185fe78e6a20f53bc929c1f4f046")) - (1735000, uint256S("0x000000031c20ff6b27992f7df1c7852100844745d06eb081f1d7a14f8945a15d")) - (1736000, uint256S("0x00000002e8bb07f38fea576318d0daf090360d1c80f22d2c4d5acb18167985d3")) - (1737000, uint256S("0x000000029a2c942f291b050a17474b6fc0302911cbe28200133e6da35e282e7d")) - (1738000, uint256S("0x00000000ff3a12e66d4ea8356848f5fd4ee9a08793d182c91e805a0783dbb0ad")) - (1739000, uint256S("0x0000000141c88040bb76f4a44c42df8bab23b7d8cc582cdd76e7ce76ef56cb1d")) - (1740000, uint256S("0x00000001b8e797ff118fa4c0275efc75d8a1c57753b60939bd3365b29f801b7e")) - (1741000, uint256S("0x00000003f9d0ab66675f262a3bdcc1a31dcc31726ee7765ab29378d543329e49")) - (1742000, uint256S("0x000000002d3600b5c69588493b3129d847bb6e2576c0bc3ff9f6460efd2581f5")) - (1743000, uint256S("0x0000000282cadbec2f99e0c8e944b9260f13f7133cc56416870fe38e4848bfff")) - (1744000, uint256S("0x000000038e69af50667adef2cb0e9aeee8bccd52bea7e46227294f6a5e0c0438")) - (1745000, uint256S("0x000000057c5b7c69c1c10a2d11caecfbe17eb62e9be08bcf70334e25709d85b2")) - (1746000, uint256S("0x000000005590217461b08cffd1058091affebbed9715322a924057cbe697e94f")) - (1747000, uint256S("0x00000001f6a7c6dcb1984728e353cf24a3bea2e68c73754a916aefcdfb0cf29c")) - (1748000, uint256S("0x000000050efca03a20ac1d081f7b237e0187003765c302826c1c5ebb6eb251a2")) - (1749000, uint256S("0x000000029dc342a556a0f39de61340bf1913a001f2bedffb2d2fc75e9b2306bd")) - (1750000, uint256S("0x000000014c90d5bd41f3bb9cc83e966d17245989901adea24e9fb803a3af796f")) - (1751000, uint256S("0x00000002a3ace1b4b93e182cc8ab48c2d5f21d098435e08d6ffa006e66bde526")) - (1752000, uint256S("0x000000014717eb5f4d01bfe4a62a0a3cf5767ac1fe61d20782767b9ad38551a4")) - (1753000, uint256S("0x0000000165c3cd794a3ad5f5f7cf858228dd7bafea465d89d9ea6bb9d50c9a8b")) - (1754000, uint256S("0x0000000425309c3ac83b8f59e0987213c44f9d1a70af1b2df67acef706e37da6")) - (1755000, uint256S("0x00000003d788414e454fdf516d768165cd6efd59da056ad9275a2818bbf29dd0")) - (1756000, uint256S("0x0000000665956fc396e2c1b42c3932580e37f478ec7c15e28f35a76195a986d5")) - (1757000, uint256S("0x00000000dc5ace43a116ccc9358a1a6a1f21b99a4d4b38b939b5dc732578e340")) - (1758000, uint256S("0x00000000e2a0b7e090507f4f13e21aa73024fb5f8eb946975c8e18d3fbe5425c")) - (1759000, uint256S("0x000000037def7a52163a882e40c5f693d718ee3c9a3ff72765c91e5b6f9af913")) - (1760000, uint256S("0x000000045769ff47e8e3f1cb51a9b6ff1378899a231161da2a3b3caa8413b94a")) - (1761000, uint256S("0x000000052ffed0ce57ccfad266b64d9a949ad2784af80a066902dca2b2d417c8")) - (1762000, uint256S("0x000000010bef4889898cf3e2c3d0cb0ad0cc15a7aa394b6db6949aac4414e9d7")) - (1763000, uint256S("0x000000052b4397f24c7be192df7c617a3ec05eea73a9f0a71d294749c0555521")) - (1764000, uint256S("0x000000024051d111a516bd779d7a854c658439a0f82664ae7742fb76f2d87a86")) - (1765000, uint256S("0x000000054ae9cfdc5678a79671544817cfb5c45c865ce489388c6f4aab2216ee")) - (1766000, uint256S("0x00000004221eb0fac5a1340dec575372ca0ea842ac3f13eaeb41e848a9b3d605")) - (1767000, uint256S("0x0000000365cfe174006b52e5699397e641be7aaac2e4dd954bdc417dc2077004")) - (1768000, uint256S("0x00000003fdc4b4eda17fb6af8ae1551a13fc0d655a6b9559f61f39dc08ba0087")) - (1769000, uint256S("0x000000037d29ae542edf0e8fe09b2cf95d36f90d827152d4693244915b3ee456")) - (1770000, uint256S("0x00000004c918f544097141d0d6086567f483f707e948b6b9a9de762ed5281205")) - (1771000, uint256S("0x0000000436ac22a224104b08bff31869c7ac3102b9e35ae3cc23190809008abb")) - (1772000, uint256S("0x00000002385ec38d63ba954913958bc0c973698667f0cf37fe840faf362add07")) - (1773000, uint256S("0x00000004b1bd7d5616aaccf2eb556dfcd704c82c60c0b4eebc29f8f640903168")) - (1774000, uint256S("0x000000036415ef1337b9120373ccc66e851cf33e77579832eb65983bafeecbec")) - (1775000, uint256S("0x00000004c4bab47e83343b2bfce06d1542ebdefe1fddb286ed8f91a6c84769c7")) - (1776000, uint256S("0x000000016a5765722d608457aa92632a328ae581a5de599504c0935ca6092e82")) - (1777000, uint256S("0x0000000701c4bab1ce3c92668ed4949496b0830cf1d771670bb5631df8c7f643")) - (1778000, uint256S("0x000000013d0ff9925033ce0b3162926f200f867ee43efac2a7bdf6a95a56c351")) - (1779000, uint256S("0x000000003b272c6520cb8893f29db1e667aacbf40ff6da4da3ac325516c16e57")) - (1780000, uint256S("0x000000013df5ab5ff720342b732febd98fa9320bc64ea34714dbf7b4fbcd53aa")) - (1781000, uint256S("0x0000000b64be023cbcfcec386c79d708467e466782b835d1e67b486f2e5c2d74")) - (1782000, uint256S("0x000000021b2a9cd3cbbba257a3ce503f6fa1e39c6d1804100a14c13744b24363")) - (1783000, uint256S("0x00000007cde6f7ef2a41c581b122b24877e4203b3445baf0034d73ed14204ed2")) - (1784000, uint256S("0x000000004b37bb794f24abca1c311145c97550199373b17d2c7c07df5ebb9538")) - (1785000, uint256S("0x000000047edc917325ce9578a4c94f00a1183cd753c76b12c195e0e820d556f3")) - (1786000, uint256S("0x000000025c0177811a33925ddb7c245e56b941a6fbbabad67f300489e98817cf")) - (1787000, uint256S("0x0000000459dc750d8d9310ea28c7f88bdc2c2816b185ec45919bffd62153a57d")) - (1788000, uint256S("0x000000034ca7412ad71c48d3772d97dc99bbe3418b1c3cdd538b9700936fb199")) - (1789000, uint256S("0x000000076f64250f26cd16523a1785b7add386b594ebd457acbff0b7a6aa89cd")) - (1790000, uint256S("0x000000060d72c59bb12a1633dce31071cc6a132c626ab16caec774c1c7eb4d35")) - (1791000, uint256S("0x00000001515c3d79e4e28cdeaaa4a5b95b94e3a20e54c788bd66c7d79b312a5c")) - (1792000, uint256S("0x000000030f57e0c948e41863bda05f6c144ac8c9e0811e3c1844cc417e2ac8f9")) - (1793000, uint256S("0x00000005dcbfb0ea2a75b3babdf61fdaa8bc4bb24f08f2aadce4d431a681ad3d")) - (1794000, uint256S("0x00000005471c52605a54456a45e70e78f212988a21dbfc2b44329595c9d61dcd")) - (1795000, uint256S("0x000000041746a3ea05c2e383917554b8687bedce1c79c59e4d48a9dad86245af")) - (1796000, uint256S("0x00000002381f362803c3c533767dfbcb32f9756ae6bf9b7bfbf717751959be15")) - (1797000, uint256S("0x000000010a66bfc8280389b9358b7d32df17368c8d207385827ce5dcc26d8928")) - (1798000, uint256S("0x00000003170e34e98d6f7465c2aca3ac03fd6838770c639ffaaffdf47b2b5a5e")) - (1799000, uint256S("0x0000000d1f702ffae124c4d2ec4094b453f6a730f7d137638e517f377b2699f0")) - (1800000, uint256S("0x00000003119096a306aeb83dc7c3fa2c1baecaed090d88fac9751b85c02d5392")) - (1801000, uint256S("0x00000005583508df3d48ca3ea7aa8b1790a12b9d68a1537316d3ba83041acb70")) - (1802000, uint256S("0x000000060084882a0c69971fa6b1f5b219fe582b715864791c24fbdf779e30ef")) - (1803000, uint256S("0x0000000362f4bdac37f39bc886b56518b27ddca7df34c93170b316dc861997b0")) - (1804000, uint256S("0x000000052ac5a611ef3aded2989cc41fe7ef76ee95235ddc8904035ea6b41220")) - (1805000, uint256S("0x000000053f82b8a019469735d361dfe98b0ede3b7eeb1ea98bd266e4957c2009")) - (1806000, uint256S("0x00000002a73fd89ea6c9cc235a70d6d5de89870669b89a96a917f8bf96b9f799")) - (1807000, uint256S("0x000000045c45f117de62f01bc283f6170fda3ccc403aef07ad8d1b30eaf11031")) - (1808000, uint256S("0x00000004a6be7713af8533717d906be3d0b3df6b845be498591e775b27b570a5")) - (1809000, uint256S("0x000000030e95b1540d64d3cc1f596b3b84e21b7211595210d51807f12f784d29")) - (1810000, uint256S("0x00000000b00c53c576fc4938e55c3e091eebc59b67007a819d7ac77ab56fd296")) - (1811000, uint256S("0x000000008dffebe6bdf334c49df095ac5cfbcd6c81b2737e57f3ae706ee1355d")) - (1812000, uint256S("0x00000004870a62faf53b5bc60093537140a2ed830773294dac7fbe7caceac315")) - (1813000, uint256S("0x00000001cfa729a10b2978412336e3b8e5e776b79ebae946c23027fd54acae47")) - (1814000, uint256S("0x000000041aaaaa85cec731049de070fdc2b307b452cc305e8c75664efe5041bc")) - (1815000, uint256S("0x00000002ae8ca8bf637db8f46524c969fb60ec976dee9337c85e12acda1b800a")) - (1816000, uint256S("0x000000025cc83efcfa5b31b0a4b547cf5923b2f28344079f50ff09310b4e3149")) - (1817000, uint256S("0x000000038d0d1c7c923615fb07937822e313804269fccf884e38e613db802db8")) - (1818000, uint256S("0x00000005cdaec2266a5c21932dd2289a0171931aa4bdc39bcdc381d6194f3733")) - (1819000, uint256S("0x0000001f9bdedeacacc6602bf223dab9e25944637920fc6799738795c3c7efde")) - (1820000, uint256S("0x00000003a5a16120bde4b1a6a784ace30b616be37b8429e4f43eee44ceee0598")) - (1821000, uint256S("0x00000001f3c39cbe6a2bc81b0a6e6aa257de0bf13452d9adcaeeb71cc23ad029")) - (1822000, uint256S("0x00000004e0bbde4a8783d01581c7a1ba255506e9f967d8c096bc6c9034f70222")) - (1823000, uint256S("0x00000004a6d66ca53dbf714c238022cc0a42126540dff2f9cff7c59395a5752a")) - (1824000, uint256S("0x000000014b2b5044d0150acb34d993faa9ef0120a0842455e112d78632659c4f")) - (1825000, uint256S("0x0000000263a08ebf63abf6bd81764d1215a5a90aaded13d11bd04e2eb5107a05")) - (1826000, uint256S("0x000000065c08ecd03aa691178834c112fa5e728ecd82a8927f0e4f49664d5af8")) - (1827000, uint256S("0x000000058d8e8b4a7d38afa75d99f5e91b440fc209572ff26a98b1aabbbdbdcd")) - (1828000, uint256S("0x00000004480b9a3c0f9c87307804c6278dcb49c3fc362370a9fc424f27bac805")) - (1829000, uint256S("0x00000000f0b3cb7e289f48c72af19d62075c3390cd2991447216be87f9d372ae")) - (1830000, uint256S("0x000000008cd6ca08f95df6d9fab3faf3ab1ea74570d953fc05dea018f7ab0d95")) - (1831000, uint256S("0x0000000434184bdedea630dcdfeb3ff92aa48c46623f9237ee4b965150557c5a")) - (1832000, uint256S("0x00000003bf13197e2553f80bb4f1f41a27aafff87829e921fbddbdfa58718c78")) - (1833000, uint256S("0x000000037027ca30d184228e7ff663a9c0dde0f8f26f99bd587e0b8a309389fc")) - (1834000, uint256S("0x00000002827b9efc26f29c80eb728cb8ecd6cfc1a968b03c3f0e8fdd81625d88")) - (1835000, uint256S("0x000000049a0d5128db2dfa0961db2058bf7d153ebf0f4cc6d5054f561736f90c")) - (1836000, uint256S("0x00000003f67c56ff4281d35dfa78392f7ca0fe10cca06015e60b4c6ebfa2da7c")) - (1837000, uint256S("0x00000007ab31a2d80026cb363b965ed0b43a122b3e03e53b6f6614ed5ad835e6")) - (1838000, uint256S("0x00000009024dd6c35f41ebd7b759f8b108fb990c337fb2b764abcf571c731098")) - (1839000, uint256S("0x00000004a77cdd4e5130cee8c0ac9ecde7c22b0e342463596275db8b249d235e")) - (1840000, uint256S("0x0000000194db82e2be83455d477ba908718dc3c0b1092a4ef62459ad9b75b864")) - (1841000, uint256S("0x000000039654d65ddca898e2e13af01982516a542d3ede41163bb5e57c62cfcd")) - (1842000, uint256S("0x000000026c7a39b765fd8fab1cbd39bb4acb76e65de4d84996e90b6bc5cbbb8e")) - (1843000, uint256S("0x00000004ce2314f45bfeb207e27324783207dccc9a032f4f7560d5b63073d7bc")) - (1844000, uint256S("0x0000000830425ecc1282b45f0d9d2496eda51e7d29ffba7900441132c7a49d59")) - (1845000, uint256S("0x0000000a2f8f3e74c416dcd911fb06985baafa789066a7d98535fc7ccaf01299")) - (1846000, uint256S("0x00000002ac3047bbaf9a6fb3158e1245022251c40ad29c7b7d9e0dc117bae112")) - (1847000, uint256S("0x000000048c49382f8e79ae130453614ed621975037119573a8442e0c5674b7d2")) - (1848000, uint256S("0x00000007a618116d10d5cd2d61f3a542d44780a951f18b217ae394a95a51f946")) - (1849000, uint256S("0x000000053b6032fcd14396e27f966ce552450219e4f77a4bcfc7759362975d2f")) - (1850000, uint256S("0x0000000a68b3397504659a4e8eea87fc7c8788b8ce6616148c02addf46fb5a38")) - (1851000, uint256S("0x000000095bfe4bbdf20dafff20a5ba564b879595eb543394b789337e5493e766")) - (1852000, uint256S("0x000000027befad10df24147b92fc6b0b1310311fbcea57cb0ecb0f20cac43c60")) - (1853000, uint256S("0x00000000eb95b25125c7b58b9685242b4e29c4bce0f952b96475971d2b4bac51")) - (1854000, uint256S("0x000000035427daf79fdbba6152e558cb835c87817952e16dc83694d74f577dd9")) - (1855000, uint256S("0x00000000e86cebd49029f1348ecf3fec3d042fe3ad054040cf809975d676ccab")) - (1856000, uint256S("0x00000006d804ca22bbc006e2204ed721e35ca88675a66817f56a5daf3d34aaf3")) - (1857000, uint256S("0x000000069547a70ca10c149dc211c92c986800b9a4f74a44a0892f187ddf5042")) - (1858000, uint256S("0x00000002ca6303d0b280024eac8b07405dc2cfc86d54f3668074f60180bff21c")) - (1859000, uint256S("0x00000009736485bdfbcc7fef9068d2c50690e1331c0063381bb96940ce6740c7")) - (1860000, uint256S("0x00000003a9ec571fce90048e4c46586dd0a764a332b9aad36783ebe6ef225ef6")) - (1861000, uint256S("0x00000002fba6f836e098c87c71e6fc2fc811ef2c3e4014b8f66ca241c9538370")) - (1862000, uint256S("0x0000000458bcae098b9aed006b5f5b71cdfb5f7b73b0217a809d4ab5db2be96b")) - (1863000, uint256S("0x00000001e71c2b9725fd5afbb8586d6312200eada7971fdfab2d9c888daaf350")) - (1864000, uint256S("0x00000000971b82db5d846116c8bce305134f155730fc61a0f3b1e3fdc75828eb")) - (1865000, uint256S("0x00000000e999b3f061a706af846bc212e4e2ce41151a9c5d9ca6504ee7dc9675")) - (1866000, uint256S("0x000000003919b6575c4d446f14b00a57c326f282ed2e00cf75f72006d67680e3")) - (1867000, uint256S("0x00000001008c08cbae80cbf264f8c4aba686928fd72459df2298f2a6042d074c")) - (1868000, uint256S("0x000000000b8c1a48392a319214fefaf0a1aa0ff9c3ec57437fcce5068f2c4789")) - (1869000, uint256S("0x0000000758b5ff8f3edf6cf1f3b8c31778595eacc6e9139c3cd7485abf6ac8ac")) - (1870000, uint256S("0x00000006c0e18a5966014b683fc2ad66e67233857f870d1dfc3e4ba24c8d8c80")) - (1871000, uint256S("0x0000000aca708fa0f28d3c6dd195bce536428919684852372cca706440ce6470")) - (1872000, uint256S("0x00000009f1e7e2ee40d6436009ef884d25171058221068e6b561649164b921a3")) - (1873000, uint256S("0x000000041205df49ec40c992d36f19bb697f0dd25fd9474a613cdd4aea8cdf9e")) - (1874000, uint256S("0x0000000578b693fff37a8603939098aea30340b7c805a98317ced77cc9a9d738")) - (1875000, uint256S("0x000000038b9acc3c108412fe3a61bd7f77c4e709e7923fce6730173edc851ff3")) - (1876000, uint256S("0x00000002500162bbfcabe7018c43756da89dd5f5dd86b7a59d81b0aab222a4b1")) - (1877000, uint256S("0x00000001653423619a040072d21407c8f3e481c5d2da428a8c3aec4ff044ca3a")) - (1878000, uint256S("0x00000007c40a0e9e986333cbdabc6d81e100eaa1eea7a983b8bbb78317d05072")) - (1879000, uint256S("0x00000000742d5d64baebfca3b564937726ea4d4928f5b14bc5a5e70fd9c72e99")) - (1880000, uint256S("0x000000024d22fa0bdfeec3156b14a6ec455e0dccb913d006d701087a962bf692")) - (1881000, uint256S("0x000000077867103cbb1befdf33a24850470f1e26d8942a8c694b0cfd736cc8a6")) - (1882000, uint256S("0x00000003e31aad71429d93282c80b73903df35d6a762eae880ce7f746e39acb7")) - (1883000, uint256S("0x00000007df770a4a295aaed19a510535217663471284c37e62171a0b8b69070e")) - (1884000, uint256S("0x00000004f813d155265f3f09d6e0512bd0111e81708bd6c4b5857fa4c85bbf02")) - (1885000, uint256S("0x00000006236adc55d27b875af36649c7482b16a33842546bf4e8212805174e76")) - (1886000, uint256S("0x000000075757edd65122294031731b6038daefeb2d18e9adacda4b85da530fc0")) - (1887000, uint256S("0x000000021f9eaf50778462b2b58aa21b047200697c6c41880b014a14d9883c33")) - (1888000, uint256S("0x00000043c363d1126947ebea3156d801ef0922ecc57f2130793526801f11772b")) - (1889000, uint256S("0x0000000353d262ed384f346d50d7fa64ac7e513c155f4322386a0f1e33d626d1")) - (1890000, uint256S("0x000000029f50b0065af5c1eec4de04b140d847535d5422215dd0e26eed008d35")) - (1891000, uint256S("0x00000001f5b6af002a9524a8991426ee891a268f885139001ed6fdef2e1b0cb0")) - (1892000, uint256S("0x00000003c7318412f7ebd0a1da5e2809abf6293b2cf6ec519ed91a44a9b5acff")) - (1893000, uint256S("0x0000000c0efaacf06f7d9f5ce1a5211671201c24bbbe4fcbd759d17daf07d3f9")) - (1894000, uint256S("0x0000000095e2ba9e15c007baca9a01ea50ec64d87bf84f32fa9749d6f3c69f4a")) - (1895000, uint256S("0x00000002909536ceb779f4fb3bff8bf68aabcf26d953a6ccf9eac2b012c348fe")) - (1896000, uint256S("0x000000099876579cb3995e07b004c5b25304db77604b049c36473bb3be195159")) - (1897000, uint256S("0x00000009a267875f480399b16c0aa89f915d7d0a4ae15cf3bef66f9a104219d7")) - (1898000, uint256S("0x00000004321a0d47a384e405e4d3d585c7b5e064559b394d9b8517d409b81647")) - (1899000, uint256S("0x000000083025e8364786b286eb3d65cc39fa9cad4720ffef5a22da2618c4ddce")) - (1900000, uint256S("0x00000003df9302cdceced304405e46e3fe5950e191173e2afc810527d4a45472")) - (1901000, uint256S("0x00000001634453c1ad96fc6bae21a1e58c6b48af72ba9633b95fd313f4bf68da")) - (1902000, uint256S("0x0000000bc5de5e55f8d89dd1e26125b69767df8b410163d4903cfdc69687c2d7")) - (1903000, uint256S("0x0000000425dbba65f46a66a3255fe4c3e446c460970ecc066270abc0ef53ddf4")) - (1904000, uint256S("0x00000005cfedd11ec3f788d8c3e6a126c47c6bfffe0d34b821a0a1ebbd2bd0ed")) - (1905000, uint256S("0x00000004c602ef20f36b9dcfefe1970f3e008157ffcc8ddde3eb5f304f566618")) - (1906000, uint256S("0x00000004051959adaef5d9e0dc2b142351c5a5afc9a01b5c9b333a8f72844902")) - (1907000, uint256S("0x000000095bc01b7e1fdefcdc2fdfa5e9a9be8a896fae2d2b0907a5c6fc741fd2")) - (1908000, uint256S("0x00000007258940eebc238e5aabd9403c3ad97e88a90e0596a15a50f979c3b7a4")) - (1909000, uint256S("0x0000000623a348b65f08632fa073d3226831f677299eaa98afc249c6b7dea056")) - (1910000, uint256S("0x00000011f5e9f50fd2aa37b4c1bcb42a3607f4837687300be7cfc0acfe4db976")) - (1911000, uint256S("0x00000004bfc1a263d309938f5604f5c8cbc54d7b580c0b2300f6d96a2e6ac4e5")) - (1912000, uint256S("0x0000000137671d01cfcefa184b3a3365bce9caa2b8db024101f5c996b9cb2dcf")) - (1913000, uint256S("0x00000008b7007ec04ad61ce451f94a3c6fb2adb7426fc6071b2a5ea48c4f9fd8")) - (1914000, uint256S("0x0000000243fe84ebc7f9e6464ea68e938c3095e51561d168cac11e02da7dfffc")) - (1915000, uint256S("0x0000000463ee472250bc95ddf1403ac7ce518cb52b4570c5bf53c7c055f718e0")) - (1916000, uint256S("0x00000007450182fd8b6e17ab04c95182aa33ab281399e590538f3c6a5daff7cc")) - (1917000, uint256S("0x0000000a3e34f534cb787befc6520577404e39ddfb8331e587912e3c35f8eee3")) - (1918000, uint256S("0x0000000a8377c632f26108c153d2fd1d42e13e7bbfb8e62642d5e80546e2ed62")) - (1919000, uint256S("0x000000016e1b54a1aea7c531c47a3cd6aa5e0722d294c8fc0b718a9aa4574792")) - (1920000, uint256S("0x00000003e6d1d949658d5852b9319dbe0e75a4c171d2282a091a97aadc301da0")) - (1921000, uint256S("0x00000003d37c4d24c50bc32f815a8c089862d2a33f5e5010c0c36cf51f23d430")) - (1922000, uint256S("0x00000001de45a81a83b52246f6bdfd8ce4ab49ff209377f348040a2f7a08f540")) - (1923000, uint256S("0x00000006ec45bdf0764f20744447b67227cc91330bded5797881616372aa0400")) - (1924000, uint256S("0x00000003f57657a30f1fc6107611dc86dff2ea88a58d46a37339a1bc199c8f96")) - (1925000, uint256S("0x000000012f56b581239965f384ee45d91f58818781616b24e37b1a0f9ff3d21d")) - (1926000, uint256S("0x00000001fac2e82d4b4e4dc95f62625d259c29a16527dcd2ee8f1a5005944269")) - (1927000, uint256S("0x00000003ab28525c560ac0f8ba5a5ab32975b87ba1d423bdd1d1a9a675d668c6")) - (1928000, uint256S("0x0000001fc650e767800d6e022e173a9d1608ef821c296dfaabc8ac1e4f60f10c")) - (1929000, uint256S("0x00000000a297246c427d1d21d43110f0e4561e42ab940c1269d5cca17f0904e1")) - (1930000, uint256S("0x00000012f367afa4b2981c51d39b2d5181b076d93f85220a2e6c373be5c3ba13")) - (1931000, uint256S("0x0000000195f51b18da7a447e64c29086d9b9239f344592fdc31dd4793f6fb4dc")) - (1932000, uint256S("0x0000000a72a3f81eecf15b2b06b37e5d0e5c8be26945be29f7b80242dd8d866d")) - (1933000, uint256S("0x0000000602cec0393e21864f1f9de0e9a31c9eaf96d406d976b2932cb076f945")) - (1934000, uint256S("0x000000026ae0bfcedd170c1a7ec3c282806d522c714337105a5b9e3c9f75f51f")) - (1935000, uint256S("0x000000096c05eb37e98c0ac1e5da953f75c416b1939d05c3a7f38b443075274f")) - (1936000, uint256S("0x00000000b366ca6e89b40632b26fe80c14fb549c70484adede899f4b9550594b")) - (1937000, uint256S("0x00000002407697e167d3a957bf6e89a3f6ef12448ec37dc077c36541c08d9d9c")) - (1938000, uint256S("0x000000010e122ecf450e3f7af854c5d5af48ff297dc9f7b49ee60d7bb26b8744")) - (1939000, uint256S("0x00000004ace5ced8a4f052dd1260cccb305f4ec05207d3882b9ef40d11a5fe6b")) - (1940000, uint256S("0x00000001e668c7e4bcdee1a9b291e5ecfcad3eeb84ec4cff80eab05ce23109cd")) - (1941000, uint256S("0x0000000913631ecaeefb24c9d168a9a0c05df2012f3e988030eed645687a6ec3")) - (1942000, uint256S("0x0000000315b6039d0a0c14820f396dc960ad507783847f599b7d5154f88f94e0")) - (1943000, uint256S("0x00000005b7bc0112d299c2f0caed3b0cfa6c1bb730c9004e4d6ef2ceeec9efe0")) - (1944000, uint256S("0x00000007c64f0a932a8edfebb2d494665e524afc5ab755e2cefec84ce77d259a")) - (1945000, uint256S("0x00000006c6a9fe8c05283f310c0dff22a2d92304b605b593fe1c1fdfc1085bb3")) - (1946000, uint256S("0x000000054b5c0409f082be6f0b4deac5ef5106fc44173f3422885fb23bd73f7d")) - (1947000, uint256S("0x000000069a8e31d32df50f35ef63029bdd3a56d042d34cf6d02f6efc637c8dd1")) - (1948000, uint256S("0x0000000885fd68fb764457590ddee9aef3e4256f2ef067388a9c72714fa775b7")) - (1949000, uint256S("0x000000064285b903e667a64cb598f7aee2cbcf8a513a681334adef89f58b58c5")) - (1950000, uint256S("0x0000000a706ce153f138e155a21da714642ccf0997f9f9229dded6335a59ba07")) - (1951000, uint256S("0x00000005a15015e01043f708b242ae79f71694be8546098085f6604c007c40c3")) - (1952000, uint256S("0x0000000acf2ac942089d2f1dee9428c42ca89857b4cd412daedc8c68f1ca4b0b")) - (1953000, uint256S("0x00000001b11437b9668a1ba11d70af25a2c9c1635604e689d7e846d154af7503")) - (1954000, uint256S("0x0000000217414e96a2db88062abb846422f94a5329f9b89545c5c85848b3050f")) - (1955000, uint256S("0x0000000007a180128bd24de08bcda9a1f14985facc7836f4e0807c8f35b6f390")) - (1956000, uint256S("0x0000000e2a5b0ea6c830770e16614a39704d94224b317a3c82361e5c833e5480")) - (1957000, uint256S("0x00000004e224492b153481750f677db156a960d80e046c0a99fd05e3841f7a2d")) - (1958000, uint256S("0x000000038b6f492cfe2bbdef289854fb1b095c240dd4166a8f235e9eb8156258")) - (1959000, uint256S("0x00000001e59f4c934ef2f778612da7e8574649cce4638a7b4a9d9833ad32b6cc")) - (1960000, uint256S("0x0000000dad02b04d06cf33f129c4001eee6a1633281ad1966089287542dbf0d4")) - (1961000, uint256S("0x00000003bbbb92d446e92a6ca1c2026ca5acff6ef342ad7f98220e4a9f8e7ea4")) - (1962000, uint256S("0x0000000c344d3c9c22450b075f54711dda6d6f31bd4131cd8ace9197bbc79d11")) - (1963000, uint256S("0x00000007f00366ec50f4b795574ab91f426e130cd9b03999fb06a72fb4398f65")) - (1964000, uint256S("0x00000000bc0ccb4e73a3b1da4c8b9898176658fd67e0be6268e4e6a7d15a910b")) - (1965000, uint256S("0x000000037ef51b844eeddc16da9879defc6a3445142281ae34024447c3c8d9c5")) - (1966000, uint256S("0x00000001874485237ab2d0f395532fa16907e2cb0f25e5651312be730a2edcb0")) - (1967000, uint256S("0x000000054de0e7518f1263b6d0235f1e2430f7dd23cc1620122357a68731eab9")) - (1968000, uint256S("0x00000000a63a04fda160827bf347d6a6cd72ba97ae1608a76716cd97926ea88b")) - (1969000, uint256S("0x000000063f5c075dc64a67c603d21416c75ec633c1dcd0e7a93fc03bc21c6979")) - (1970000, uint256S("0x00000007790e2edf51dbaced8ac240a960dd133cbab4c0c642b93614987aedb5")) - (1971000, uint256S("0x00000007158c4e8d7ad061228c7386179ab5bececfc8e9719dc3129c6c441acc")) - (1972000, uint256S("0x0000000c1827bbab90381298cb73f55a2e146bbf235dfa57d6bc08632448acd0")) - (1973000, uint256S("0x00000005da023a70008ab851ec50b8b900332376f17f99588c91504c26b5b125")) - (1974000, uint256S("0x00000002114d8ecee02f6b3be44335ab85df887a86d78992af6a3ce9ba669c56")) - (1975000, uint256S("0x0000000a397eb6d899727ca5db6db81c6ad676c58020a0ffb3f391ff6888f3e3")) - (1976000, uint256S("0x00000009bbbf4aab09bb73cc6ed628211b1977ae5a3265fc778dcc06391c4c3e")) - (1977000, uint256S("0x0000000b7fb944df8a5b894a38b96c17eda331b3d8c406c5921f470d4adeda22")) - (1978000, uint256S("0x00000004008b94214bded7d7f14981a445055997d76b92a920dc4d55681066b0")) - (1979000, uint256S("0x000000074afc0070f2fe5643ae73e82f9e2a00c2bd10b65c4009f1fa8b9bb447")) - (1980000, uint256S("0x000000104f63e7a22c822a5185dfcf3daea94d1dc4eb72cdd1c0d5819b284b2a")) - (1981000, uint256S("0x000000056829646eb2ec3e513ae9bce58e55cc76ff9a8cca9ef9ba1665a39010")) - (1982000, uint256S("0x00000001519cc29c8c85f9f4aa37226b7d3a8a65f922f0406a9c5d92175c3c3a")) - (1983000, uint256S("0x00000017dc2451bb004694edbc90d12fc16aa45b25ac6b7b3d0179527e1c45ab")) - (1984000, uint256S("0x000000020d0f451448959d98abbdc7c9d890b8d52257323b551497376a558a1d")) - (1985000, uint256S("0x00000002577dcc6f4fe27913c036fb90161d35ce4ad9eec7fc311eaaef60e94a")) - (1986000, uint256S("0x0000000202b6fcf0b41f9214f65d5c2180815004d39ec2de27cacd3a92576607")) - (1987000, uint256S("0x000000055865f161ff5e3c9761b37505064dc7583ce5e5e592b6721ee6cb5347")) - (1988000, uint256S("0x000000080f858e3d234d701da31ef2aa1254fda3150e3ac368cb51e2115e3200")) - (1989000, uint256S("0x0000000cfa4d1e2bbdcbb234fe2f082850dcdfa858a32bef37cf89d00c89f396")) - (1990000, uint256S("0x0000000a4c621c54b6e3b4a75e9fa4f018960a1200f074de82324f68b294f04d")) - (1991000, uint256S("0x00000000cc0f49d2b2448b362e28daf3e57e1bafdb634ba2c85a51bbbec57afb")) - (1992000, uint256S("0x00000002ebd4290f45632a9573abcf4d6fc1639b34aa990eef34b6b0935cf14d")) - (1993000, uint256S("0x0000000b6d0c384a04f998e996f453058e006cd0d2bc3abdd518804eb3263fab")) - (1994000, uint256S("0x00000002c0fcac020a83d330d6e56255c82d0b47b048270dc33d6ce05b18048d")) - (1995000, uint256S("0x00000001d0cd3b61e536c43dac7d4f072769ae8e3b9abdd7f934059e5692c6ef")) - (1996000, uint256S("0x0000000ac753c7ed5450d7b05b0bd98a29df7059769c8bc07e04a2ca609c346e")) - (1997000, uint256S("0x00000004f457ce81972f0eff5cac5a63832b0d043e0ca9fc5ecac6dbdce65240")) - (1998000, uint256S("0x0000000b572087155a59cc67ba355d3a3ffaccfd685570ec56778329b27fb9ce")) - (1999000, uint256S("0x00000006e4773706c3a83ed448da34fc4e3e737d47df623254e059fd76643a52")) - (2000000, uint256S("0x00000006104d9702e1e5347418c213ba31fc3c14e009ab2d802de64f75f5ef8b")) - (2001000, uint256S("0x00000003e0ca20ef98823c384607d34fbadd3425f54b75b92a2f7b898386afff")) - (2002000, uint256S("0x0000000486c9388c8932401756df96c043e39bdfb52d8d0a147a5b97922b428e")) - (2003000, uint256S("0x00000001e639068d2aada8551e23effbea6e281bc8b10a74e8f9fd757a9d7f26")) - (2004000, uint256S("0x00000004e6f8077d8cb9adb4b0c4f08e88deb784c57b461167000763c9f7e22c")) - (2005000, uint256S("0x0000000381e818c7c3598ce66fceeb3f76538b851a33672b6fb7f63b0ee1376c")) - (2006000, uint256S("0x00000005956353cc542e589709ef1d1859c0466ae6590459ac3299513431e935")) - (2007000, uint256S("0x00000000efc171f4a2eab03c8ce32dadade866aee3a9c70b430daf051715f900")) - (2008000, uint256S("0x0000000120aad6d1c226a6ec15887cbc96135d2237f37c8c076dd20c81122cad")) - (2009000, uint256S("0x000000048d5381588a5be440fd9ad45747f76f6f5ce6e0b679ef549e0ab33979")) - (2010000, uint256S("0x000000086d9b6cfc665cd910e9d3832cde002278ae7342b1d660141390e81ed9")) - (2011000, uint256S("0x000000070b22fa037c6d290ba7811448bea1cf00c8f22aaf70b992a0456aaca0")) - (2012000, uint256S("0x00000003b32bf142b85b39c398205f42b3e10fa967fd78db41cec936347fa545")) - (2013000, uint256S("0x00000003b5bd355c58956838c927059b221c87af7e8282a5e0027e8c552d082f")) - (2014000, uint256S("0x00000001c5f2d5cccc99b43f7a9c1b9e3315eb4feef4bf611c680d6d55a1c395")) - (2015000, uint256S("0x00000006f94f71772329e7ebab13a932297c37faef047b4777f276281a6412e6")) - (2016000, uint256S("0x0000000421b342cf93513b1d098fc1a50904a1583f11a67b2d1286b4311270aa")) - (2017000, uint256S("0x000000035cfdd315adf7eb39f24b1114c316559b7266e28e369bd335332ed26e")) - (2018000, uint256S("0x00000004178109bc2e463872fed909113bb4a047722e7d4131f9f5e75e3b5d07")) - (2019000, uint256S("0x000000040bee044c9437828ac4569799f69d14527918015b94c6ef9f0ec771a2")) - (2020000, uint256S("0x00000002b5a7669c48ab1e6405688bf645062c2098ffaa8784bb6b9e952f32c3")) - (2021000, uint256S("0x00000003e7f2248ec7063391c0b8f650f6f02abcea8146025685cce41f1967db")) - (2022000, uint256S("0x00000002a3057653ae6c75eecd9f4688f0440b4e44f81af95cfa2072e01cf366")) - (2023000, uint256S("0x000000043d0b453924262edf2f2b07419cb1c79a22d2aeb9d0352727b8b95770")) - (2024000, uint256S("0x0000000857efe8be5bee7d4949b4a46924a6b16a773267faa47924db46755adc")) - (2025000, uint256S("0x00000007e197ec851d99abb18e9bda39af5acd4ebdf1cb284cf24becaa621936")) - (2026000, uint256S("0x00000008e7576b9fd21454ee1c241ad5ff86de27b90a2038b17c05174af6aa2b")) - (2027000, uint256S("0x00000007852b9d9c07bb4fb396bfcf1651fed5afacf91ac051e6232cc79eaf43")) - (2028000, uint256S("0x00000002134827686fa7399d930d28e1379d806c5da307ee8b6420e43e587c95")) - (2029000, uint256S("0x000000064d359b9d5968be2e7f2629363f16f14f2e2c23f9f113bb8074219eeb")) - (2030000, uint256S("0x0000000b62411c2027634d87f0fe56311f891a2471c2dc59f881e909fa62e21d")) - (2031000, uint256S("0x0000000b69aa3c2e0a408071337b0b8e500d7168ae58866008278bd876711b8e")) - (2032000, uint256S("0x00000004ce57ce1b210ec68c6d78d3e61b1bb61b15b42829f59adc144243396c")) - (2033000, uint256S("0x00000004024fdc3d1fac61b6713ad6013a2f36738d63cc8da836baf294bee671")) - (2034000, uint256S("0x000000057861c7bc5314e0da1aec9f1ebc1ffb4faf6955e0b75a892601edff73")) - (2035000, uint256S("0x00000010c8a56a05dad2b598c2912c8ea541b4a26f1547d96a653f6a4201bd22")) - (2036000, uint256S("0x000000041e11ed9bd926c40d810330fac5a7d68e6eaa363e0bb5c61af322ea65")) - (2037000, uint256S("0x0000000a7e65071ac725747967d8fa4c05cf1c3cf707bf32ea3af64b5be1b708")) - (2038000, uint256S("0x0000000f2bf661c814dd4c29018d5990125f5b944f8ff32d1dab74c4df96bb22")) - (2039000, uint256S("0x00000011646bb384a33b2176522d0b1890c4252e004f6e39a8a24ef23de7d4c6")) - (2040000, uint256S("0x000000049927621327cb34f68b8fa4a7a27a8f348284fbbe19a31dfb05796028")) - (2041000, uint256S("0x00000012aa50fdd25fa7bec01b4b23bf185028ee9b391ee01f448e3466dde830")) - (2042000, uint256S("0x0000001448dbbce0a941d62af80a4802b4125dbb703b8d6afc562f6f6a71c2ce")) - (2043000, uint256S("0x00000008425d39caac093da2d3bca16eb6341a5a5c6a0c9c3b29e59b613f19d5")) - (2044000, uint256S("0x00000003646c87e167ccec6a46c532299ff95ad0e09d763c77dea1b1f77fa41d")) - (2045000, uint256S("0x00000008a305f798f921a659779f2faa0c9b6061654f128bc0288e5ffba5617b")) - (2046000, uint256S("0x00000005f13275b498964e0b1b2175e9269c6e72f8d3d4a6c8800866648cc139")) - (2047000, uint256S("0x00000001faff2ed7233ac268b0dea48ca095c4221531fd5cb0a717be44fa57f2")) - (2048000, uint256S("0x000000096067600fb16cf37ff22348b0f66e81e70b9db5594ec96e55ea2aed3e")) - (2049000, uint256S("0x00000004a5c77487e8b9ce874907d1d87a5cc9a233b8200dc29424fc4d05c4ad")) - (2050000, uint256S("0x00000000f9e4a246d317efc0058c117518058b90e354fd0832a8aa3f2817ad98")) - (2051000, uint256S("0x00000004c25718021a1640d581520087f4b1ca550f60624e4f0165c42811f591")) - (2052000, uint256S("0x00000001f1cc162af35f2b78d57ce24699ddade07e9e28a72024eed4ae6d88da")) - (2053000, uint256S("0x0000000675cd8c85204a982290cbcee1ce7744883f50e49b42ec19bc3f26a6cd")) - (2054000, uint256S("0x000000073ae301de16e3a8ddfc31461abaaa6d0f68dce219e021e60786a87e33")) - (2055000, uint256S("0x0000000c3c1403f65d6d949bf47ac6c20ddf1a72a4746d489ac0373d0019ef36")) - (2056000, uint256S("0x00000000bbd938ba5199353f4464da3e0548a161b659d4158022c494e5964c53")) - (2057000, uint256S("0x00000002ef9613e873ab3e696bc67a854ca0fbd5d2c80ca2813790c7e68f7ca0")) - (2058000, uint256S("0x0000000aa352bf7be4811a434ed81b599c8bb75b51c9180ed950ed93025896bc")) - (2059000, uint256S("0x00000008758359b387368898cb7a1ab2637e8afcc25be27639c92044b6d38481")) - (2060000, uint256S("0x00000007e482f4d5931a4900fea1fe60e9b5272340930740d1daf0ddcb60fba6")) - (2061000, uint256S("0x00000002a4cc006f2a4a8dfe6031a8224f13a1653d2d7cb759f6424e973b21bc")) - (2062000, uint256S("0x00000002a89e57d8aa5073bbf9b47d3a1406b880d5a10cd04bf4db15b8d52f9f")) - (2063000, uint256S("0x00000001c2c88d5d2afd8e5d3ac0a58f75f1233278bad1f509c04bf2de8a0cd7")) - (2064000, uint256S("0x00000001e96c132713c76b3b660176376eee4d01aca688ccbd1f052c7e02eab9")) - (2065000, uint256S("0x00000009be2a5ecaa562da4b4a89974c63e41fff0d45e67aaef52cd5628832a7")) - (2066000, uint256S("0x00000002b9e96ca7a4702ff76b0e8985bd5b8165a844b0ff524118cb73b81b91")) - (2067000, uint256S("0x0000000b08dc59f10fbf0be04059d20d0fe8dffa0775a27deddeea31f1aa9c08")) - (2068000, uint256S("0x00000004f4bad2cf91e2ca928674dc26219b9fd5d51089b71ffa3a0e40c1a8cb")) - (2069000, uint256S("0x000000020ef61abb460f3bf1805208c67ef076169cc3d93feea93a44549e6b01")) - (2070000, uint256S("0x0000001933ccfe24b7f15e44ffcd6c70eb07ddd1e5153572c587c71604e037de")) - (2071000, uint256S("0x00000000b837126d714857fbefa49ba9b57a5c8e4131bc58a57a8cb72e0db9a7")) - (2072000, uint256S("0x00000009fe7c493b1bedea4cbe111dc917f36a5daa7c515efc1b152b5a4f898b")) - (2073000, uint256S("0x000000017b1dcba194020efecba83e73dc5c79d61a67909ba9697be7a096fa21")) - (2074000, uint256S("0x0000000523d291de6295dccc955ce5ad336f16f7758be2fe806828c577aceb10")) - (2075000, uint256S("0x000000000797b81b51747b233de0f2af1996321a91f3e4202b6ec009c084fa40")) - (2076000, uint256S("0x00000001e24e43918b04c68bdb3d6f344fa45161d6a83214d33182c266106942")) - (2077000, uint256S("0x0000000cd024f9475ad27396e68f77d14f261db3168510b7d5fd985e15317fe7")) - (2078000, uint256S("0x0000000098a181b61158deab23686d5fd27124e333c9db07b23144d490e94e21")) - (2079000, uint256S("0x00000008530c9cf4c78823bb23f1c12bf06fba66b757e5c0289c49a695d0f0de")) - (2080000, uint256S("0x00000006d0cfee04fb90dcbc7a3e97928228f9d49311f0c03ba36ebd91714c0e")) - (2081000, uint256S("0x000000061584569c356147479c7b59896050f266971b3ba39f2afd863c9d5da7")) - (2082000, uint256S("0x000000038a92b82d08c169edac37a1b6686d32c9b62efb79a1e0120a2e5b980c")) - (2083000, uint256S("0x0000000ed590f12cc3b91f450e5d30a317fb745dfd0559640bbd1822be0892cf")) - (2084000, uint256S("0x000000033451b003a9784bf72fb2fdf45a39b324efc6b58c5428ce4d06ae9383")) - (2085000, uint256S("0x00000006d0106b85a660e384bcf50003fbb3ebf4dc8ea4666745d18aad0ce706")) - (2086000, uint256S("0x000000046acf8da7d34ea59dee43aed38d8b174b8d3945223fd302fd43d1da30")) - (2087000, uint256S("0x00000005ced9d8c38416be2bf222b4e6bd0c116b8f3f7eb64b6a8979c4d42496")) - (2088000, uint256S("0x000000056abb81bb40ce200afa9431ec809a0b32614bc0a222d8f5363457cb1d")) - (2089000, uint256S("0x00000007510588a1f76e1bfd1d71302c734296e56654b973633cdd09715ac1b1")) - (2090000, uint256S("0x0000000419b70e2eee4092d5a7a6567d4f0f44bd25bb2e0c9c93640c147c8ad7")) - (2091000, uint256S("0x00000005a64ce43194676a276f61bc316b122526487eb6446900ecc3128d2b59")) - (2092000, uint256S("0x00000008a604ff11b8c78d309b067636a08881d6b67a262c33a35b7103228a8d")) - (2093000, uint256S("0x00000005cd8ad1d36831cb219e751d6fdea3c1ef5984106d4267181574abbb7a")) - (2094000, uint256S("0x000000084ecece471b2a7c20058821bc00507948c4e2ddda440fbbff20e8f9d0")) - (2095000, uint256S("0x00000004febb4db9b9a83945d1e876e6a1df57e9d4b7c7be522c313ca14b0684")) - (2096000, uint256S("0x00000000c6b4ad716b1ecdf2941ac5951566349430f4f65ab30a19d4683e06fe")) - (2097000, uint256S("0x0000000a69188059da26fcda56fda6616b6a7b910d81fbac0bed9cd2788fe11d")) - (2098000, uint256S("0x000000000964c0376b72fd3475fe3e20ebc0f43269d7c7be0c1b3e1ae3b084a2")) - (2099000, uint256S("0x000000075489657e7019ba875720ba133610cccbd69873b2409d293973878de6")) - (2100000, uint256S("0x000000048bce0d172dc7f21cfdd89cebc1dc8fda33b53ccd483fa77465601469")) - (2101000, uint256S("0x0000000d17a5f6802150f5f317617439d1406c1a6c9905360d5b8936f1235bf1")) - (2102000, uint256S("0x0000000a2e1dab28ba0b9d381c2a1dfc503dfc3ece2e7382efeef7fc0a9114ee")) - (2103000, uint256S("0x0000000af3728cb8cfd44ebba3ad4371affc1b77dded8c1016f6aa1e7533620f")) - (2104000, uint256S("0x00000004d3121b000e5fdfb36181921f290f9b0e88bca5e7db73edfe39ad4389")) - (2105000, uint256S("0x0000001578e4d7efa6c5071cce3bcb6c313dc20024605fc68ec52373940e2503")) - (2106000, uint256S("0x000000091602e3e0e6f2696b637f278878aa9df54b5da697623d3ff15758f530")) - (2107000, uint256S("0x0000000b40c4b2d15563ea4a4526618bc7456ae7af75b43564ef0cec35ad938f")) - (2108000, uint256S("0x0000000682e77053c4d4bcd7b6c2104e4e3c194154ef857cd05115f02681d81f")) - (2109000, uint256S("0x000000035a9bbeba87ba109903ffee9c71fd62a0a6395f1696490ea674e5a658")) - (2110000, uint256S("0x0000000547f13c557983f66c18ab0db1a64c9a8892dd84127e04025b5335a816")) - (2111000, uint256S("0x00000011342622886386272683f28994966657f559c5a39dbef9aef6c14314f3")) - (2112000, uint256S("0x0000000446d090e0f478bcb7d90cbb15142eb585c31229a433f8fb1470252be2")) - (2113000, uint256S("0x0000000db1383e1c4ca8e5f29136deb3f65ff989acbca44c94cdd4d431d6e40d")) - (2114000, uint256S("0x00000001574baeb58d2999e2ce95b0049ba0d680cc68caf2ee644abe05d17c58")) - (2115000, uint256S("0x0000000b784255ee9900040a759883da9cb04d29fd96f2b2bc8fa777377666e3")) - (2116000, uint256S("0x00000002598ad558cd93fbc11106615d187c227d80f4b9e30ba480c264bd2345")) - (2117000, uint256S("0x00000009d3b9dbbd63b11aa254b53421d55c864578617c5a57addb7b2b058f51")) - (2118000, uint256S("0x0000001083f791fdb1d314ac096a510e829d849c51ecfd07b05a97beca0fdc9f")) - (2119000, uint256S("0x0000000ef2775f3449c5f473744e92018681e9de74c59695457d4aa6fdd6d74c")) - (2120000, uint256S("0x000000044205e969e5d5ce1f297de9fa11fa23e0407dd28b852d48ab5e45f1da")) - (2121000, uint256S("0x00000010b04548479daf16dfa9c8e3c0e5b4e5b29876cb8a307d2e407aa3e5ab")) - (2122000, uint256S("0x000000052cd0199a56b4f840e6cd06afc7bae1fe5c6b060ad56b25e60037acbb")) - (2123000, uint256S("0x000000059972a7dde8caf40947c0e6fad1e85558e6da1e444be6c246589ed617")) - (2124000, uint256S("0x00000009eb2cbc8df55758e60fe06d9b38e57e1408caa4e03724519cf2639e7e")) - (2125000, uint256S("0x0000000118e98419f9b56c890c77e53298fa478bf0adaa1cd4e9617f575d442c")) - (2126000, uint256S("0x0000001168a734074aaeaa042800ebfd7a1283e0fea5ec8a688beed2822983e4")) - (2127000, uint256S("0x00000006dc5056e1e4ecd42ab4247ad9aeeb78313d5b00c14038a91c4c18b6dd")) - (2128000, uint256S("0x00000000310924a85b39bbd14bcb151d11e450bd69af772276509e007d93bf7e")) - (2129000, uint256S("0x00000014a0d1ad70f7e8b9444143cea92f0bbbba8f3490a502ccb26169acc3c3")) - (2130000, uint256S("0x000000077bafacdc4d2276cbd5e97b7f303c98570932991935d947c2bdcf6d0e")) - (2131000, uint256S("0x0000000af47253f4aea86c4af51be4b34f5aba1c454aa41098c41d84793cfb5f")) - (2132000, uint256S("0x0000000d8b0fd244174731a7f03a399597be4b27ea30f82711c5ce5a7b4cb778")) - (2133000, uint256S("0x000000096f73526a734ef98d58ceaf9839095180f96b27aa0b68f8e9bc395cc1")) - (2134000, uint256S("0x000000135654421fab135971b1654a79dddb59195ccc060a5b19ba80beef5955")) - (2135000, uint256S("0x0000000a93e5abb450f1f1aded4f38b808dfd038fd72e4c20b697aa98fa9cfdc")) - (2136000, uint256S("0x0000000408c0887a70fe0fa4a43c477426589ce4f552db7d176eb140a9a30fcc")) - (2137000, uint256S("0x0000000464a46aa2d5f22f3f4a39803aad1084a22dccd1fcb83f08e29d3e28b2")) - (2138000, uint256S("0x000000064a011e9ecef25946fe33f9c18371e051eb246cd3621090f8139ced91")) - (2139000, uint256S("0x000000082fa6fc9c1a92ebf29a0ba2eadccd20508a1db83619357894062a5aff")) - (2140000, uint256S("0x0000000460f855e76c4d739a4023d17fe1ac6376614a1764141770edb1d687c8")) - (2141000, uint256S("0x0000000481247aaabde662576ee0178a48a4f25ddf188eebc95db4ce2c578bb2")) - (2142000, uint256S("0x00000011b7aa00475cf8620ccb296970536e0a7e3cd928d5ed05020f95923ff7")) - (2143000, uint256S("0x00000004a48dfe4fdf0eec5f130563783c60e56115226c5febfa0a5201ba7b25")) - (2144000, uint256S("0x00000013dad0ea792083834d4e02a711a738ccc4f51955fca5852b151e469f05")) - (2145000, uint256S("0x000000054ce9776cbf4d7d957865c0b3aed4a6f466459b5f2f395d2b2a2da6f2")) - (2146000, uint256S("0x00000001e0aafae6d61db4d7fb1441e1ce8381a3243e8904ff453857d0b3456c")) - (2147000, uint256S("0x000000084f0c9ba9b8490ed271747910a4053bc09ec4ec74f399fe7262e822dd")) - (2148000, uint256S("0x00000003f7b29fb734195f4ea924862811300096a17367c0334bf74e2f483fdd")) - (2149000, uint256S("0x00000002586cd17b50a802cf1a37cbf0ae8c4f165a8b4bb1dbbf0f434832e44f")) - (2150000, uint256S("0x0000000234336fc37adb386d4d3ba166106b1888f6b15210b476778e1cdba617")) - (2151000, uint256S("0x0000000abd4237926addc45f8aa8e2e8e3dcecc8f9a065538a0d8add0a41adcd")) - (2152000, uint256S("0x00000004063fbe8f4cb1c212ebe3c4655744728091e92e219b245fcd5a0c572a")) - (2153000, uint256S("0x000000015299ea3f0bbac8c1e87774255918e60405de053e01f468605169721a")) - (2154000, uint256S("0x000000009f685faddbdded0d7aa0360e5fd0434672ec0bd7a496ef14f300d9c6")) - (2155000, uint256S("0x00000004e2bab8860d90b57285c78d521d0a67826c6b59ee53907a97ebc3e98b")) - (2156000, uint256S("0x0000000365fc20fedaf53e4eb761e8b3efa219d6bb5eee72b569d49302b098f6")) - (2157000, uint256S("0x0000000ee0631ed6e44c0ad4e2ab99732088a92b17b946afd6782faf8c1039be")) - (2158000, uint256S("0x0000000f64d288fff1628defcbfc0ca5c41a45cdffad7ac8b425eb688645090c")) - (2159000, uint256S("0x0000000b4b3609b61df88081218a64157546e78be3125f02e0fb9a2ad7dc6fe0")) - (2160000, uint256S("0x0000000c658223e9d6a2b966022dfadc8e6b4a54e04710d2ebcded687cead660")) - (2161000, uint256S("0x0000001159a41488ff78d7bedca36a0fd79b841dab0e8ab3904d82860baa8b8a")) - (2162000, uint256S("0x00000011fecb4f33f5707ebb37badaf7ff933f117e892f58782b4a9a5f3baa63")) - (2163000, uint256S("0x0000000f5797242276a9a7a8cd70d8efbc6c225fcec4cb733ddec3c763ca42e4")) - (2164000, uint256S("0x0000000886bfacf5c79a53fbd9533b7af09f22e1a340284f9cff2644fe0b4b6b")) - (2165000, uint256S("0x0000000ba2f63317611c67307a58afc3f536568cc8a26c3e1a7c96bfeae50d04")) - (2166000, uint256S("0x0000000e2cf36af435818846e670e89b01c4204520108b24fd8b7138da9a80fc")) - (2167000, uint256S("0x000000015fcddcda4bf66d26410b003fe1f117701d72a85a2ec308db6a88cacc")) - (2168000, uint256S("0x000000129c923c361fd4caeee0bfabef70c5358489ca3a64ccb2c0fb74c2d759")) - (2169000, uint256S("0x0000000246c65f7233c3319283c4600600ba6bec6ecf33113552762f8bcc82ee")) - (2170000, uint256S("0x0000000ac527711a96daa55c309ac6090e0c5e47f4dc43720fffaf3167d9385a")) - (2171000, uint256S("0x000000065376b6bdc5dc0bc108400a4749afddde1c1757c17f11476c1d612220")) - (2172000, uint256S("0x00000006ca134d446c4e8cbbd1f8c3fa0276a12dfd5419ac83797e01e87a7836")) - (2173000, uint256S("0x00000009009d3bb8f190afc32b77661e0081d2c3f5d7e5e3377b4bb53d5c1a9b")) - (2174000, uint256S("0x00000010feb7099c8e0a2f0582c653d131123ca678c11965886b7f283438d5b4")) - (2175000, uint256S("0x00000011dbb4610eadd4991bd7a29360d2e73e98ac053445639fa63d87df9364")) - (2176000, uint256S("0x000000085561ce48c0eac05bc168bf5eb4eec888795be1ce26ad10e9543b9f66")) - (2177000, uint256S("0x000000095e48492726b15e24aa78ada0ec58a06f3d8c6588e9d732f377748596")) - (2178000, uint256S("0x0000001219fe5ea9287939ddd0e6e5e2f8ad4d6556a52002ad5074de9f53227d")) - (2179000, uint256S("0x00000010e3820efc9a0adc4ef3871f03f2f4722c982a77b30f757b3ef9975cb2")) - (2180000, uint256S("0x000000081877c0925c42cb866f4100f49eeb17af7ce3527744e10d519a35dc90")) - (2181000, uint256S("0x0000000cea4a29dcf89dc3d699ffc9e04aef2e923f4b75ba9af5c89ebffdb9d7")) - (2182000, uint256S("0x000000018920865bb9ea4a7458fec9e3b0e9f28c9bef25488ce444f08c58a062")) - (2183000, uint256S("0x0000001353c7fdf1416a0d361dcbe669de666166fe645188a26eea4c78ddf03a")) - (2184000, uint256S("0x00000007dbbe33596b119695ebd530869646c32e322b5fcd377d48bc31fd8c2b")) - (2185000, uint256S("0x000000198ffa20fcd5fcc98d5242f43ed1fad39015885cafd817870237420ee2")) - (2186000, uint256S("0x0000000914848d7c0720bf947010055b0a99b1854e305ca5146658181493d4bc")) - (2187000, uint256S("0x00000005b671f40e14f57ae18eb2aef37c233be1f6958a8deb25897b0755d88b")) - (2188000, uint256S("0x00000010ff6edb5e128fb6c729fdca152931cdd2c85161770833ed0a4021556f")) - (2189000, uint256S("0x0000001790079fc71b5cf4c9e28e8c4f7c2ed68db86618fdab844ed92f49869a")) - (2190000, uint256S("0x0000001ac858c2579fe6804e17c9a4ffac6f87ad218a42e0023d4f4a937d256a")) - (2191000, uint256S("0x0000000657e488ff574b139465409d783d5e7b12275b9a904adc4bdcbec555a6")) - (2192000, uint256S("0x0000000f5d7531d2be768b6b077cc1981f3da77065ddac9019c376abd771d2bf")) - (2193000, uint256S("0x0000002bf66b350408816e2dcc6166a7438786d28b5dc96eb2be8251c9edd915")) - (2194000, uint256S("0x00000006bf224770c8ed65aba45a66e04a484d4e11718586ca367e76d23570c1")) - (2195000, uint256S("0x0000000d1a303359ca7cfff975ea261045650efae95a58ec942ae6b65418760d")) - (2196000, uint256S("0x0000000c10de971b747e2d8dcf0b435ad911c5c4e650c22c2926317f9737f958")) - (2197000, uint256S("0x000000147f6a742c2a6177e3d265a0ebda14d8b065ccb31979e5a98d886136eb")) - (2198000, uint256S("0x000000104a69691ae8661a505be930491f1f8e778b66f236fd82238f1ecc55b5")) - (2199000, uint256S("0x0000001d15e004f42cb05c998b9bc4dc523be01d38b05b70d6247b7b273b3b1a")) - (2200000, uint256S("0x00000008cfb7b2ee0a5efbcaf54fb9343fd45aa0fc15fdf9f793a9ec84b1b3d8")) - (2201000, uint256S("0x00000014ffb9bacf3a7cce9172c18acaefb7e37be1622c058239c3903a41b1fb")) - (2202000, uint256S("0x000000199098587a246d8326b2bcd3edb13f9a5929164973f3dba9aafc7e2db1")) - (2203000, uint256S("0x000000003bbc88abdde6242b28a8f7ad7c80a0a4b2b02f7c13f1e851a87c0531")) - (2204000, uint256S("0x0000000b9454d46cdc35e507b9aa0b98f8c6c98bc7473281a5925efa25e7d9f7")) - (2205000, uint256S("0x00000003c6742a5eb51b71732d4ad13bddabe1a22a0f9bb1879c726853db4ea0")) - (2206000, uint256S("0x00000010ee207e0218f281066a8cb3a208540766a34818d001859a4ff21a9442")) - (2207000, uint256S("0x00000011fdbf6ed34b05e960036e4d1bd5087cb10a3fb37edad1847403d0a5fc")) - (2208000, uint256S("0x00000017fd1de616ff467b5a6ec399703f232dd5e20021f0325df4cd5066047e")) - (2209000, uint256S("0x0000001b0d85a780bc6c1fcf95d775ddf7d11930b8a7d0f30c76e17fe5b91f08")) - (2210000, uint256S("0x000000320ac1d0412b54f38d926afd63830f91fcbcc06869b9970f53804c8b05")) - (2211000, uint256S("0x0000000e89eb1167ff72252d64de56463e8bb89a546a318100bc1e09b40c75ed")) - (2212000, uint256S("0x0000000929563985b806ac74a296d19869e5e74942e73a8769da3380b0be3769")) - (2213000, uint256S("0x0000000268c366b226e82917d23c89eebfab13d226388362220b0052cefeda9d")) - (2214000, uint256S("0x0000000667ffb02f6dfceba778614abdbf5ae11b73ce4d8e5524d3e77b6d1bf0")) - (2215000, uint256S("0x00000009c0432726c9666371c3834e5b500b38caf41080b68869cfbb12af6dc2")) - (2216000, uint256S("0x0000000b4a5c376d4fc524ad456c90147206bbd445509be5a191ad9979c51f67")) - (2217000, uint256S("0x0000000563e32e4235ab5694177fc53923b9b742d0cb8b6dd654a1b45b5b9e9f")) - (2218000, uint256S("0x00000002e16de2a52496ac6caff3454fcc8dda9291b042607ab5b8cb4eb06149")) - (2219000, uint256S("0x00000003f615c3a50807128b9eb71dd357782edc581b923f0d97ecb169f00744")) - (2220000, uint256S("0x00000005a5d40c3f2239ceab163c6b0065b5c8eb98608a67943c42a7d0efdf06")) - (2221000, uint256S("0x000000052f90cdbad630bfc9639680fa20fd40af4448d6222b832b1496f9d611")) - (2222000, uint256S("0x0000000a114845b86115b2b7e83999f8745d795b3e712481dd8fcad6b017ad6c")) - (2223000, uint256S("0x0000000671f202549cf64821f6a7f9a722cf79054fd415af2c38477ed11f4509")) - (2224000, uint256S("0x00000006f8d21a9b3ffca12033f5e27d7a4b45c6254cd3bcfa0a6a7e252ffbdc")) - (2225000, uint256S("0x0000000e97a31cd82ec650d23de1d6a505ebc6f752b1bedb9f9295be69840212")) - (2226000, uint256S("0x0000000a77b14d5e8aa98dc37bab028d11c999478a344dc2d9eb4db350a8fffb")) - (2227000, uint256S("0x0000000886cde6f06d72666d7ed1d85866f8bea788102932c973fe39af80a74a")) - (2228000, uint256S("0x00000009af43eb0ed51d153a3462b65d09b4730c277d528016852980e4168752")) - (2229000, uint256S("0x00000003f464599aa6386056de225d1cbef006b8da9c0d27cc6fa779089868ca")) - (2230000, uint256S("0x0000000c0bd50433b89655bf283daf43856db8d822e996f614397c8b1c393e38")) - (2231000, uint256S("0x00000003254820b91ccca295afaa3c9562ec15032953d5ad0782c95f7d4da9fb")) - (2232000, uint256S("0x0000000349afb4e98ae708f7dff039c54b1446da2664ad0dddd5f5b94755cbfc")) - (2233000, uint256S("0x0000000297526918a57fb1a21b70cd8ed1265547d4a61ecd57302c29d16aba1c")) - (2234000, uint256S("0x00000003288ea064a3f6ddc603de61bdb4c0ccfee2a70b621a7fe95f9ad35a8c")) - (2235000, uint256S("0x0000000b8a88cee5ac71e4b61ace898cafe7c895c9bf0b5db00b9d71fda173d7")) - (2236000, uint256S("0x000000056051307f0119d828d8d621b34ef6f60a06694c569c669ead97b9a00d")) - (2237000, uint256S("0x000000001f5aa9e9dbb3be2b01a4ab0b108b85fd375f23a0452930126a00c21c")) - (2238000, uint256S("0x00000002daa24ab7db17601826843cef57562ccc1aa80a692daf45435d816cca")) - (2239000, uint256S("0x0000000a9a4283412f076a0e1d36e1e02571468ff12d06c0d075e1dfa569af8c")) - (2240000, uint256S("0x00000008b78c49c1d514ce9cc583ec04c36023911ed7772d1cf0c50b5ce1f8c8")) - (2241000, uint256S("0x0000000cbb3151b62023e1cafa4476d7bf2cf34c13229f3ba510053182133ef2")) - ,(int64_t) 1750938666, // time of last checkpointed block - (int64_t) 3149424, // total txs - (double) 1254 // txs in the last day before block 2241283 - }; } else { // all other HAC's with no checkpoints checkpointData = //(Checkpoints::CCheckpointData) diff --git a/src/chainparams.h b/src/chainparams.h index 5104e3b7e..962f8ece9 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -118,11 +118,7 @@ public: void SetKValue(uint64_t k) { nEquihashK = k; } void SetMiningRequiresPeers(bool flag) { fMiningRequiresPeers = flag; } - //void setnonce(uint32_t nonce) { memcpy(&genesis.nNonce,&nonce,sizeof(nonce)); } - //void settimestamp(uint32_t timestamp) { genesis.nTime = timestamp; } - //void setgenesis(CBlock &block) { genesis = block; } - //void recalc_genesis(uint32_t nonce) { genesis = CreateGenesisBlock(ASSETCHAINS_TIMESTAMP, nonce, GENESIS_NBITS, 1, COIN); }; - CMessageHeader::MessageStartChars pchMessageStart; // jl777 moved + CMessageHeader::MessageStartChars pchMessageStart; Consensus::Params consensus; protected: diff --git a/src/clientversion.h b/src/clientversion.h index c149a7692..9023f8b95 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -1,6 +1,6 @@ // Copyright (c) 2009-2014 The Bitcoin Core developers // Copyright (c) 2016-2017 The Zcash developers -// Copyright (c) 2016-2025 The Hush developers +// Copyright (c) 2016-2026 The Hush developers // Distributed under the GPLv3 software license, see the accompanying // file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html // What happened to the SuperNET developers, who cared about privacy? @@ -30,7 +30,7 @@ // Must be kept in sync with configure.ac , ugh! #define CLIENT_VERSION_MAJOR 3 #define CLIENT_VERSION_MINOR 10 -#define CLIENT_VERSION_REVISION 4 +#define CLIENT_VERSION_REVISION 5 #define CLIENT_VERSION_BUILD 50 //! Set to true for release, false for prerelease or test build diff --git a/src/crypto/common.h b/src/crypto/common.h index 64c144848..52451cd28 100644 --- a/src/crypto/common.h +++ b/src/crypto/common.h @@ -121,34 +121,8 @@ int inline init_and_check_sodium() return -1; } - // What follows is a runtime test that ensures the version of libsodium - // we're linked against checks that signatures are canonical (s < L). - const unsigned char message[1] = { 0 }; - - unsigned char pk[crypto_sign_PUBLICKEYBYTES]; - unsigned char sk[crypto_sign_SECRETKEYBYTES]; - unsigned char sig[crypto_sign_BYTES]; - - crypto_sign_keypair(pk, sk); - crypto_sign_detached(sig, NULL, message, sizeof(message), sk); - - assert(crypto_sign_verify_detached(sig, message, sizeof(message), pk) == 0); - - // Copied from libsodium/crypto_sign/ed25519/ref10/open.c - static const unsigned char L[32] = - { 0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, - 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10 }; - - // Add L to S, which starts at sig[32]. - unsigned int s = 0; - for (size_t i = 0; i < 32; i++) { - s = sig[32 + i] + L[i] + (s >> 8); - sig[32 + i] = s & 0xff; - } - - assert(crypto_sign_verify_detached(sig, message, sizeof(message), pk) != 0); + // We no longer need to check for canonical signatures since we no longer + // use the crypto_sign_* API since Sprout was removed return 0; } diff --git a/src/dragonx-cli b/src/dragonx-cli deleted file mode 100755 index 6e456edff..000000000 --- a/src/dragonx-cli +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash -# Copyright 2016-2024 The Hush Developers -# Copyright 2022 The DragonX Developers -# Released under the GPLv3 - -# set working directory to the location of this script -# readlink -f does not always exist -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -cd $DIR -DIR="$( cd "$( dirname "$( readlink "${BASH_SOURCE[0]}" )" )" && pwd )" -cd $DIR - -./hush-cli -ac_name=DRAGONX "$@" diff --git a/src/dragonx-cli.bat b/src/dragonx-cli.bat deleted file mode 100644 index 5edecfd8e..000000000 --- a/src/dragonx-cli.bat +++ /dev/null @@ -1,10 +0,0 @@ -@call :GET_CURRENT_DIR -@cd %THIS_DIR% -hush-cli.exe -ac_name=DRAGONX %* -@goto :EOF - -:GET_CURRENT_DIR -@pushd %~dp0 -@set THIS_DIR=%CD% -@popd -@goto :EOF diff --git a/src/dragonxd b/src/dragonxd deleted file mode 100755 index 076ce94dc..000000000 --- a/src/dragonxd +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash -# Copyright 2016-2024 The Hush Developers -# Copyright 2022 The DragonX Developers -# Released under the GPLv3 - -# set working directory to the location of this script -# readlink -f does not always exist -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -cd $DIR -DIR="$( cd "$( dirname "$( readlink "${BASH_SOURCE[0]}" )" )" && pwd )" -cd $DIR - -SEEDNODE=176.126.87.241 - -# Remember Remember the 5th November for freedom of speech is not free!! -./hush-arrakis-chain -ac_name=DRAGONX -ac_algo=randomx -ac_halving=3500000 -ac_reward=300000000 -ac_blocktime=36 -ac_private=1 -addnode=$SEEDNODE $@ diff --git a/src/dragonxd.bat b/src/dragonxd.bat deleted file mode 100644 index 0dc4fd2c9..000000000 --- a/src/dragonxd.bat +++ /dev/null @@ -1,10 +0,0 @@ -@call :GET_CURRENT_DIR -@cd %THIS_DIR% -hushd.exe -ac_name=DRAGONX -ac_algo=randomx -ac_halving=3500000 -ac_reward=300000000 -ac_blocktime=36 -ac_private=1 -addnode=176.126.87.241 %* -@goto :EOF - -:GET_CURRENT_DIR -@pushd %~dp0 -@set THIS_DIR=%CD% -@popd -@goto :EOF diff --git a/src/gtest/test_checktransaction.cpp b/src/gtest/test_checktransaction.cpp index 1ff043cd8..a5afda321 100644 --- a/src/gtest/test_checktransaction.cpp +++ b/src/gtest/test_checktransaction.cpp @@ -10,25 +10,6 @@ //TODO: Update these tests for Sapling /* -TEST(checktransaction_tests, check_vpub_not_both_nonzero) { - CMutableTransaction tx; - tx.nVersion = 2; - - { - // Ensure that values within the joinsplit are well-formed. - CMutableTransaction newTx(tx); - CValidationState state; - - newTx.vjoinsplit.push_back(JSDescription()); - - JSDescription *jsdesc = &newTx.vjoinsplit[0]; - jsdesc->vpub_old = 1; - jsdesc->vpub_new = 1; - - EXPECT_FALSE(CheckTransactionWithoutProofVerification(newTx, state)); - EXPECT_EQ(state.GetRejectReason(), "bad-txns-vpubs-both-nonzero"); - } -} class MockCValidationState : public CValidationState { public: @@ -47,56 +28,6 @@ public: MOCK_CONST_METHOD0(GetRejectReason, std::string()); }; -void CreateJoinSplitSignature(CMutableTransaction& mtx, uint32_t consensusBranchId); - -CMutableTransaction GetValidTransaction() { - uint32_t consensusBranchId = SPROUT_BRANCH_ID; - - CMutableTransaction mtx; - mtx.vin.resize(2); - mtx.vin[0].prevout.hash = uint256S("0000000000000000000000000000000000000000000000000000000000000001"); - mtx.vin[0].prevout.n = 0; - mtx.vin[1].prevout.hash = uint256S("0000000000000000000000000000000000000000000000000000000000000002"); - mtx.vin[1].prevout.n = 0; - mtx.vout.resize(2); - // mtx.vout[0].scriptPubKey = - mtx.vout[0].nValue = 0; - mtx.vout[1].nValue = 0; - mtx.vjoinsplit.resize(2); - mtx.vjoinsplit[0].nullifiers.at(0) = uint256S("0000000000000000000000000000000000000000000000000000000000000000"); - mtx.vjoinsplit[0].nullifiers.at(1) = uint256S("0000000000000000000000000000000000000000000000000000000000000001"); - mtx.vjoinsplit[1].nullifiers.at(0) = uint256S("0000000000000000000000000000000000000000000000000000000000000002"); - mtx.vjoinsplit[1].nullifiers.at(1) = uint256S("0000000000000000000000000000000000000000000000000000000000000003"); - - CreateJoinSplitSignature(mtx, consensusBranchId); - return mtx; -} - -void CreateJoinSplitSignature(CMutableTransaction& mtx, uint32_t consensusBranchId) { - // Generate an ephemeral keypair. - uint256 joinSplitPubKey; - unsigned char joinSplitPrivKey[crypto_sign_SECRETKEYBYTES]; - crypto_sign_keypair(joinSplitPubKey.begin(), joinSplitPrivKey); - mtx.joinSplitPubKey = joinSplitPubKey; - - // Compute the correct hSig. - // TODO: #966. - static const uint256 one(uint256S("0000000000000000000000000000000000000000000000000000000000000001")); - // Empty output script. - CScript scriptCode; - CTransaction signTx(mtx); - uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL, 0, consensusBranchId); - if (dataToBeSigned == one) { - throw std::runtime_error("SignatureHash failed"); - } - - // Add the signature - assert(crypto_sign_detached(&mtx.joinSplitSig[0], NULL, - dataToBeSigned.begin(), 32, - joinSplitPrivKey - ) == 0); -} - TEST(checktransaction_tests, valid_transaction) { CMutableTransaction mtx = GetValidTransaction(); CTransaction tx(mtx); @@ -515,42 +446,6 @@ TEST(checktransaction_tests, bad_txns_invalid_joinsplit_signature) { ContextualCheckTransaction(0,tx, state, 0, 100, []() { return false; }); } -TEST(checktransaction_tests, non_canonical_ed25519_signature) { - SelectParams(CBaseChainParams::REGTEST); - - CMutableTransaction mtx = GetValidTransaction(); - - // Check that the signature is valid before we add L - { - CTransaction tx(mtx); - MockCValidationState state; - EXPECT_TRUE(ContextualCheckTransaction(0,tx, state, 0, 100)); - } - - // Copied from libsodium/crypto_sign/ed25519/ref10/open.c - static const unsigned char L[32] = - { 0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, - 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10 }; - - // Add L to S, which starts at mtx.joinSplitSig[32]. - unsigned int s = 0; - for (size_t i = 0; i < 32; i++) { - s = mtx.joinSplitSig[32 + i] + L[i] + (s >> 8); - mtx.joinSplitSig[32 + i] = s & 0xff; - } - - CTransaction tx(mtx); - - MockCValidationState state; - // during initial block download, DoS ban score should be zero, else 100 - EXPECT_CALL(state, DoS(0, false, REJECT_INVALID, "bad-txns-invalid-joinsplit-signature", false)).Times(1); - ContextualCheckTransaction(0,tx, state, 0, 100, []() { return true; }); - EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "bad-txns-invalid-joinsplit-signature", false)).Times(1); - ContextualCheckTransaction(0,tx, state, 0, 100, []() { return false; }); -} - TEST(checktransaction_tests, OverwinterConstructors) { CMutableTransaction mtx; mtx.fOverwintered = true; diff --git a/src/hush/tlsmanager.cpp b/src/hush/tlsmanager.cpp index 8b03445ce..dbfa9b006 100644 --- a/src/hush/tlsmanager.cpp +++ b/src/hush/tlsmanager.cpp @@ -301,7 +301,7 @@ WOLFSSL_CTX* TLSManager::initCtx(TLSContextType ctxType) bool bInitialized = false; WOLFSSL_CTX* tlsCtx = NULL; - byte *pem; + unsigned char *pem; int plen = 0; if ((tlsCtx = wolfSSL_CTX_new(ctxType == SERVER_CONTEXT ? wolfTLSv1_3_server_method() : wolfTLSv1_3_client_method()))) { diff --git a/src/hush_cJSON.h b/src/hush_cJSON.h index 367ef3ee4..a29e9e4d0 100644 --- a/src/hush_cJSON.h +++ b/src/hush_cJSON.h @@ -46,7 +46,6 @@ #include #include #include "cJSON.h" -//#include "../crypto555/OS_portable.h" #define MAX_JSON_FIELD 4096 // on the big side diff --git a/src/hush_defs.h b/src/hush_defs.h index 720fa70b5..510a6309a 100644 --- a/src/hush_defs.h +++ b/src/hush_defs.h @@ -556,12 +556,7 @@ static const char *notaries_list[NUM_HUSH_SEASONS][NUM_HUSH_NOTARIES][2] = #define HUSH_BIT63SET(x) ((x) & ((uint64_t)1 << 63)) #define HUSH_VALUETOOBIG(x) ((x) > (uint64_t)10000000001*COIN) -//#ifndef TESTMODE -#define PRICES_DAYWINDOW ((3600*24/ASSETCHAINS_BLOCKTIME) + 1) -//#else -//#define PRICES_DAYWINDOW (7) -//#endif - +extern uint8_t ASSETCHAINS_CLEARNET; extern uint8_t ASSETCHAINS_TXPOW,ASSETCHAINS_PUBLIC; extern int8_t ASSETCHAINS_ADAPTIVEPOW; int32_t MAX_BLOCK_SIZE(int32_t height); @@ -582,13 +577,12 @@ extern std::string NOTARY_PUBKEY,ASSETCHAINS_OVERRIDE_PUBKEY,ASSETCHAINS_SCRIPTP extern uint8_t NOTARY_PUBKEY33[33],ASSETCHAINS_OVERRIDE_PUBKEY33[33],ASSETCHAINS_MARMARA; extern std::vector ASSETCHAINS_PRICES,ASSETCHAINS_STOCKS; extern uint256 HUSH_EARLYTXID; -extern int32_t HUSH_CONNECTING,HUSH_CCACTIVATE,HUSH_DEALERNODE; +extern int32_t HUSH_CONNECTING,HUSH_CCACTIVATE; extern uint32_t ASSETCHAINS_CC; extern std::string CCerror,ASSETCHAINS_CCLIB; extern uint8_t ASSETCHAINS_CCDISABLES[256]; extern int32_t USE_EXTERNAL_PUBKEY; extern std::string NOTARY_PUBKEY,NOTARY_ADDRESS; -extern std::string DONATION_PUBKEY; extern uint8_t ASSETCHAINS_PRIVATE; extern int32_t USE_EXTERNAL_PUBKEY; extern char NOTARYADDRS[64][64]; @@ -622,12 +616,8 @@ int32_t hush_heightpricebits(uint64_t *seedp,uint32_t *heightbits,int32_t nHeigh char *hush_pricename(char *name,int32_t ind); int32_t hush_priceind(const char *symbol); int32_t hush_pricesinit(); -int64_t hush_priceave(int64_t *tmpbuf,int64_t *correlated,int32_t cskip); -int64_t hush_pricecorrelated(uint64_t seed,int32_t ind,uint32_t *rawprices,int32_t rawskip,uint32_t *nonzprices,int32_t smoothwidth); int32_t hush_nextheight(); uint32_t hush_heightstamp(int32_t height); -int64_t hush_pricemult(int32_t ind); -int32_t hush_priceget(int64_t *buf64,int32_t ind,int32_t height,int32_t numblocks); int32_t hush_currentheight(); int32_t hush_notarized_bracket(struct notarized_checkpoint *nps[2],int32_t height); arith_uint256 hush_adaptivepow_target(int32_t height,arith_uint256 bnTarget,uint32_t nTime); diff --git a/src/hush_gateway.h b/src/hush_gateway.h index 3f6a83425..a27b99927 100644 --- a/src/hush_gateway.h +++ b/src/hush_gateway.h @@ -18,12 +18,6 @@ // paxdeposit equivalent in reverse makes opreturn and HUSH does the same in reverse #include "hush_defs.h" - -int32_t pax_fiatstatus(uint64_t *available,uint64_t *deposited,uint64_t *issued,uint64_t *withdrawn,uint64_t *approved,uint64_t *redeemed,char *base) -{ - return(-1); -} - void pax_keyset(uint8_t *buf,uint256 txid,uint16_t vout,uint8_t type) { memcpy(buf,&txid,32); @@ -41,140 +35,23 @@ struct pax_transaction *hush_paxfind(uint256 txid,uint16_t vout,uint8_t type) return(pax); } -struct pax_transaction *hush_paxfinds(uint256 txid,uint16_t vout) -{ - struct pax_transaction *pax; int32_t i; uint8_t types[] = { 'I', 'D', 'X', 'A', 'W' }; - for (i=0; itxid = txid; - pax->vout = vout; - pax->type = type; - memcpy(pax->buf,buf,sizeof(pax->buf)); - HASH_ADD_KEYPTR(hh,PAX,pax->buf,sizeof(pax->buf),pax); - //printf("ht.%d create pax.%p mark.%d\n",height,pax,mark); - } - if ( pax != 0 ) - { - pax->marked = mark; - //if ( height > 214700 || pax->height > 214700 ) - // printf("mark ht.%d %.8f %.8f\n",pax->height,dstr(pax->puposhis),dstr(pax->fiatoshis)); - - } - pthread_mutex_unlock(&hush_mutex); + struct pax_transaction *pax; return(pax); } void hush_paxdelete(struct pax_transaction *pax) { - return; // breaks when out of order - pthread_mutex_lock(&hush_mutex); - HASH_DELETE(hh,PAX,pax); - pthread_mutex_unlock(&hush_mutex); } void hush_gateway_deposit(char *coinaddr,uint64_t value,char *symbol,uint64_t fiatoshis,uint8_t *rmd160,uint256 txid,uint16_t vout,uint8_t type,int32_t height,int32_t otherheight,char *source,int32_t approved) // assetchain context { - struct pax_transaction *pax; uint8_t buf[35]; int32_t addflag = 0; struct hush_state *sp; char str[HUSH_SMART_CHAIN_MAXLEN],dest[HUSH_SMART_CHAIN_MAXLEN],*s; - //if ( HUSH_PAX == 0 ) - // return; - //if ( strcmp(symbol,SMART_CHAIN_SYMBOL) != 0 ) - // return; - sp = hush_stateptr(str,dest); - pthread_mutex_lock(&hush_mutex); - pax_keyset(buf,txid,vout,type); - HASH_FIND(hh,PAX,buf,sizeof(buf),pax); - if ( pax == 0 ) - { - pax = (struct pax_transaction *)calloc(1,sizeof(*pax)); - pax->txid = txid; - pax->vout = vout; - pax->type = type; - memcpy(pax->buf,buf,sizeof(pax->buf)); - HASH_ADD_KEYPTR(hh,PAX,pax->buf,sizeof(pax->buf),pax); - addflag = 1; - if ( 0 && SMART_CHAIN_SYMBOL[0] == 0 ) - { - int32_t i; for (i=0; i<32; i++) - printf("%02x",((uint8_t *)&txid)[i]); - printf(" v.%d [%s] kht.%d ht.%d create pax.%p symbol.%s source.%s\n",vout,SMART_CHAIN_SYMBOL,height,otherheight,pax,symbol,source); - } - } - pthread_mutex_unlock(&hush_mutex); - if ( coinaddr != 0 ) - { - strcpy(pax->coinaddr,coinaddr); - if ( value != 0 ) - pax->puposhis = value; - if ( symbol != 0 ) - strcpy(pax->symbol,symbol); - if ( source != 0 ) - strcpy(pax->source,source); - if ( fiatoshis != 0 ) - pax->fiatoshis = fiatoshis; - if ( rmd160 != 0 ) - memcpy(pax->rmd160,rmd160,20); - if ( height != 0 ) - pax->height = height; - if ( otherheight != 0 ) - pax->otherheight = otherheight; - } - else - { - pax->marked = height; - //printf("pax.%p MARK DEPOSIT ht.%d other.%d\n",pax,height,otherheight); - } } int32_t hush_rwapproval(int32_t rwflag,uint8_t *opretbuf,struct pax_transaction *pax) { - int32_t i,len = 0; - if ( rwflag == 1 ) - { - for (i=0; i<32; i++) - opretbuf[len++] = ((uint8_t *)&pax->txid)[i]; - opretbuf[len++] = pax->vout & 0xff; - opretbuf[len++] = (pax->vout >> 8) & 0xff; - } - else - { - for (i=0; i<32; i++) - ((uint8_t *)&pax->txid)[i] = opretbuf[len++]; - //for (i=0; i<32; i++) - // printf("%02x",((uint8_t *)&pax->txid)[31-i]); - pax->vout = opretbuf[len++]; - pax->vout += ((uint32_t)opretbuf[len++] << 8); - //printf(" txid v.%d\n",pax->vout); - } - len += dragon_rwnum(rwflag,&opretbuf[len],sizeof(pax->puposhis),&pax->puposhis); - len += dragon_rwnum(rwflag,&opretbuf[len],sizeof(pax->fiatoshis),&pax->fiatoshis); - len += dragon_rwnum(rwflag,&opretbuf[len],sizeof(pax->height),&pax->height); - len += dragon_rwnum(rwflag,&opretbuf[len],sizeof(pax->otherheight),&pax->otherheight); - if ( rwflag != 0 ) - { - memcpy(&opretbuf[len],pax->rmd160,20), len += 20; - for (i=0; i<4; i++) - opretbuf[len++] = pax->source[i]; - } - else - { - memcpy(pax->rmd160,&opretbuf[len],20), len += 20; - for (i=0; i<4; i++) - pax->source[i] = opretbuf[len++]; - } - return(len); + return 0; } int32_t hush_issued_opreturn(char *base,uint256 *txids,uint16_t *vouts,int64_t *values,int64_t *srcvalues,int32_t *hushheights,int32_t *otherheights,int8_t *baseids,uint8_t *rmd160s,uint8_t *opretbuf,int32_t opretlen,int32_t iskomodo) @@ -184,360 +61,19 @@ int32_t hush_issued_opreturn(char *base,uint256 *txids,uint16_t *vouts,int64_t * int32_t hush_paxcmp(char *symbol,int32_t hushheight,uint64_t value,uint64_t checkvalue,uint64_t seed) { - int32_t ratio; - if ( seed == 0 && checkvalue != 0 ) - { - ratio = ((value << 6) / checkvalue); - if ( ratio >= 60 && ratio <= 67 ) - return(0); - else - { - if ( SMART_CHAIN_SYMBOL[0] != 0 ) - printf("ht.%d ignore mismatched %s value %lld vs checkvalue %lld -> ratio.%d\n",hushheight,symbol,(long long)value,(long long)checkvalue,ratio); - return(-1); - } - } - else if ( checkvalue != 0 ) - { - ratio = ((value << 10) / checkvalue); - if ( ratio >= 1023 && ratio <= 1025 ) - return(0); - } - return(value != checkvalue); + return 0; } uint64_t hush_paxtotal() { - struct pax_transaction *pax,*pax2,*tmp,*tmp2; char symbol[HUSH_SMART_CHAIN_MAXLEN],dest[HUSH_SMART_CHAIN_MAXLEN],*str; int32_t i,ht; int64_t checktoshis; uint64_t seed,total = 0; struct hush_state *basesp; - if ( HUSH_PASSPORT_INITDONE == 0 ) //HUSH_PAX == 0 || - return(0); - if ( hush_isrealtime(&ht) == 0 ) - return(0); - else - { - HASH_ITER(hh,PAX,pax,tmp) - { - if ( pax->marked != 0 ) - continue; - if ( pax->type == 'A' || pax->type == 'D' || pax->type == 'X' ) - str = pax->symbol; - else str = pax->source; - basesp = hush_stateptrget(str); - if ( basesp != 0 && pax->didstats == 0 ) - { - if ( pax->type == 'I' && (pax2= hush_paxfind(pax->txid,pax->vout,'D')) != 0 ) - { - if ( pax2->fiatoshis != 0 ) - { - pax->puposhis = pax2->puposhis; - pax->fiatoshis = pax2->fiatoshis; - basesp->issued += pax->fiatoshis; - pax->didstats = 1; - if ( strcmp(str,SMART_CHAIN_SYMBOL) == 0 ) - printf("########### %p issued %s += %.8f hushheight.%d %.8f other.%d\n",basesp,str,dstr(pax->fiatoshis),pax->height,dstr(pax->puposhis),pax->otherheight); - pax2->marked = pax->height; - pax->marked = pax->height; - } - } - else if ( pax->type == 'W' ) - { - //bitcoin_address(coinaddr,addrtype,rmd160,20); - if ( (checktoshis= hush_paxprice(&seed,pax->height,pax->source,(char *)"HUSH3",(uint64_t)pax->fiatoshis)) != 0 ) - { - if ( hush_paxcmp(pax->source,pax->height,pax->puposhis,checktoshis,seed) != 0 ) - { - pax->marked = pax->height; - //printf("WITHDRAW.%s mark <- %d %.8f != %.8f\n",pax->source,pax->height,dstr(checktoshis),dstr(pax->puposhis)); - } - else if ( pax->validated == 0 ) - { - pax->validated = pax->puposhis = checktoshis; - //int32_t j; for (j=0; j<32; j++) - // printf("%02x",((uint8_t *)&pax->txid)[j]); - //if ( strcmp(str,SMART_CHAIN_SYMBOL) == 0 ) - // printf(" v%d %p got WITHDRAW.%s HUSH3.%d ht.%d %.8f -> %.8f/%.8f\n",pax->vout,pax,pax->source,pax->height,pax->otherheight,dstr(pax->fiatoshis),dstr(pax->puposhis),dstr(checktoshis)); - } - } - } - } - } - } - hush_stateptr(symbol,dest); - HASH_ITER(hh,PAX,pax,tmp) - { - pax->ready = 0; - if ( 0 && pax->type == 'A' ) - printf("%p pax.%s <- %s marked.%d %.8f -> %.8f validated.%d approved.%d\n",pax,pax->symbol,pax->source,pax->marked,dstr(pax->puposhis),dstr(pax->fiatoshis),pax->validated != 0,pax->approved != 0); - if ( pax->marked != 0 ) - continue; - if ( strcmp(symbol,pax->symbol) == 0 || pax->type == 'A' ) - { - if ( pax->marked == 0 ) - { - if ( hush_is_issuer() != 0 ) - { - if ( pax->validated != 0 && pax->type == 'D' ) - { - total += pax->fiatoshis; - pax->ready = 1; - } - } - else if ( pax->approved != 0 && pax->type == 'A' ) - { - if ( pax->validated != 0 ) - { - total += pax->puposhis; - pax->ready = 1; - } - else - { - seed = 0; - checktoshis = hush_paxprice(&seed,pax->height,pax->source,(char *)"HUSH3",(uint64_t)pax->fiatoshis); - //printf("paxtotal PAX_fiatdest ht.%d price %s %.8f -> HUSH %.8f vs %.8f\n",pax->height,pax->symbol,(double)pax->fiatoshis/COIN,(double)pax->puposhis/COIN,(double)checktoshis/COIN); - //printf(" v%d %.8f k.%d ht.%d\n",pax->vout,dstr(pax->puposhis),pax->height,pax->otherheight); - if ( seed != 0 && checktoshis != 0 ) - { - if ( checktoshis == pax->puposhis ) - { - total += pax->puposhis; - pax->validated = pax->puposhis; - pax->ready = 1; - } else pax->marked = pax->height; - } - } - } - if ( 0 && pax->ready != 0 ) - printf("%p (%c) pax.%s marked.%d %.8f -> %.8f validated.%d approved.%d ready.%d ht.%d\n",pax,pax->type,pax->symbol,pax->marked,dstr(pax->puposhis),dstr(pax->fiatoshis),pax->validated != 0,pax->approved != 0,pax->ready,pax->height); - } - } - } - //printf("paxtotal %.8f\n",dstr(total)); - return(total); -} - -static int _paxorder(const void *a,const void *b) -{ -#define pax_a (*(struct pax_transaction **)a) -#define pax_b (*(struct pax_transaction **)b) - uint64_t aval,bval; - aval = pax_a->fiatoshis + pax_a->puposhis + pax_a->height; - bval = pax_b->fiatoshis + pax_b->puposhis + pax_b->height; - if ( bval > aval ) - return(-1); - else if ( bval < aval ) - return(1); - return(0); -#undef pax_a -#undef pax_b -} - -int32_t hush_pending_withdraws(char *opretstr) // todo: enforce deterministic order -{ - struct pax_transaction *pax,*pax2,*tmp,*paxes[64]; uint8_t opretbuf[16384*4]; int32_t i,n,ht,len=0; uint64_t total = 0; - if ( HUSH_PAX == 0 || HUSH_PASSPORT_INITDONE == 0 ) - return(0); - if ( hush_isrealtime(&ht) == 0 || SMART_CHAIN_SYMBOL[0] != 0 ) - return(0); - n = 0; - HASH_ITER(hh,PAX,pax,tmp) - { - if ( pax->type == 'W' ) - { - if ( (pax2= hush_paxfind(pax->txid,pax->vout,'A')) != 0 ) - { - if ( pax2->approved != 0 ) - pax->approved = pax2->approved; - } - else if ( (pax2= hush_paxfind(pax->txid,pax->vout,'X')) != 0 ) - pax->approved = pax->height; - //printf("pending_withdraw: pax %s marked.%u approved.%u validated.%llu\n",pax->symbol,pax->marked,pax->approved,(long long)pax->validated); - if ( pax->marked == 0 && pax->approved == 0 && pax->validated != 0 ) - { - if ( n < sizeof(paxes)/sizeof(*paxes) ) - { - paxes[n++] = pax; - //int32_t j; for (j=0; j<32; j++) - // printf("%02x",((uint8_t *)&pax->txid)[j]); - //printf(" %s.(ht.%d ht.%d marked.%u approved.%d validated %.8f) %.8f\n",pax->source,pax->height,pax->otherheight,pax->marked,pax->approved,dstr(pax->validated),dstr(pax->puposhis)); - } - } - } - } - opretstr[0] = 0; - if ( n > 0 ) - { - opretbuf[len++] = 'A'; - qsort(paxes,n,sizeof(*paxes),_paxorder); - for (i=0; i>3)*7 ) - len += hush_rwapproval(1,&opretbuf[len],paxes[i]); - } - if ( len > 0 ) - init_hexbytes_noT(opretstr,opretbuf,len); - } - //fprintf(stderr,"hush_pending_withdraws len.%d PAXTOTAL %.8f\n",len,dstr(hush_paxtotal())); - return(len); + return(0); } int32_t hush_gateway_deposits(CMutableTransaction *txNew,char *base,int32_t tokomodo) { - struct pax_transaction *pax,*tmp; char symbol[HUSH_SMART_CHAIN_MAXLEN],dest[HUSH_SMART_CHAIN_MAXLEN]; uint8_t *script,opcode,opret[16384*4],data[16384*4]; int32_t i,baseid,ht,len=0,opretlen=0,numvouts=1; struct hush_state *sp; uint64_t available,deposited,issued,withdrawn,approved,redeemed,mask,sum = 0; - if ( HUSH_PASSPORT_INITDONE == 0 )//HUSH_PAX == 0 || - return(0); - struct hush_state *hushsp = hush_stateptrget((char *)"HUSH3"); - sp = hush_stateptr(symbol,dest); - strcpy(symbol,base); - if ( SMART_CHAIN_SYMBOL[0] != 0 && hush_baseid(SMART_CHAIN_SYMBOL) < 0 ) - return(0); - PENDING_HUSH_TX = 0; - for (i=0; i<3; i++) - { - if ( hush_isrealtime(&ht) != 0 ) - break; - sleep(1); - } - if ( i == 3 ) - { - if ( tokomodo == 0 ) - printf("%s not realtime ht.%d\n",SMART_CHAIN_SYMBOL,ht); - return(0); - } - if ( tokomodo == 0 ) - { - opcode = 'I'; - } - else - { - opcode = 'X'; - if ( 1 || hush_paxtotal() == 0 ) - return(0); - } - HASH_ITER(hh,PAX,pax,tmp) - { - if ( pax->type != 'D' && pax->type != 'A' ) - continue; - { -#ifdef HUSH_SMART_CHAINS_WAITNOTARIZE - if ( pax->height > 236000 ) - { - if ( hushsp != 0 && hushsp->NOTARIZED_HEIGHT >= pax->height ) - pax->validated = pax->puposhis; - else if ( hushsp->CURRENT_HEIGHT > pax->height+30 ) - pax->validated = pax->ready = 0; - } - else - { - if ( hushsp != 0 && (hushsp->NOTARIZED_HEIGHT >= pax->height || hushsp->CURRENT_HEIGHT > pax->height+30) ) // assumes same chain as notarize - pax->validated = pax->puposhis; - else pax->validated = pax->ready = 0; - } -#else - pax->validated = pax->puposhis; -#endif - } - if ( SMART_CHAIN_SYMBOL[0] != 0 && (pax_fiatstatus(&available,&deposited,&issued,&withdrawn,&approved,&redeemed,symbol) != 0 || available < pax->fiatoshis) ) - { - //if ( pax->height > 214700 || strcmp(SMART_CHAIN_SYMBOL,symbol) == 0 ) - // printf("miner.[%s]: skip %s %.8f when avail %.8f deposited %.8f, issued %.8f withdrawn %.8f approved %.8f redeemed %.8f\n",SMART_CHAIN_SYMBOL,symbol,dstr(pax->fiatoshis),dstr(available),dstr(deposited),dstr(issued),dstr(withdrawn),dstr(approved),dstr(redeemed)); - continue; - } - /*printf("pax.%s marked.%d %.8f -> %.8f ready.%d validated.%d\n",pax->symbol,pax->marked,dstr(pax->puposhis),dstr(pax->fiatoshis),pax->ready!=0,pax->validated!=0); - if ( pax->marked != 0 || (pax->type != 'D' && pax->type != 'A') || pax->ready == 0 ) - { - printf("reject 2\n"); - continue; - }*/ - if ( SMART_CHAIN_SYMBOL[0] != 0 && (strcmp(pax->symbol,symbol) != 0 || pax->validated == 0 || pax->ready == 0) ) - { - if ( strcmp(pax->symbol,SMART_CHAIN_SYMBOL) == 0 ) - printf("pax->symbol.%s != %s or null pax->validated %.8f ready.%d ht.(%d %d)\n",pax->symbol,symbol,dstr(pax->validated),pax->ready,hushsp->CURRENT_HEIGHT,pax->height); - pax->marked = pax->height; - continue; - } - if ( pax->ready == 0 ) - continue; - if ( pax->type == 'A' && SMART_CHAIN_SYMBOL[0] == 0 ) - { - if ( hushsp != 0 ) - { - if ( (baseid= hush_baseid(pax->symbol)) < 0 || ((1LL << baseid) & sp->RTmask) == 0 ) - { - printf("not RT for (%s) %llx baseid.%d %llx\n",pax->symbol,(long long)sp->RTmask,baseid,(long long)(1LL< %.8f ready.%d validated.%d approved.%d\n",tokomodo,pax->type,pax,pax->symbol,pax->marked,dstr(pax->puposhis),dstr(pax->fiatoshis),pax->ready!=0,pax->validated!=0,pax->approved!=0); - if ( 0 && SMART_CHAIN_SYMBOL[0] != 0 ) - printf("pax.%s marked.%d %.8f -> %.8f\n",SMART_CHAIN_SYMBOL,pax->marked,dstr(pax->puposhis),dstr(pax->fiatoshis)); - if ( opcode == 'I' ) - { - sum += pax->fiatoshis; - if ( sum > available ) - break; - } - txNew->vout.resize(numvouts+1); - txNew->vout[numvouts].nValue = (opcode == 'I') ? pax->fiatoshis : pax->puposhis; - txNew->vout[numvouts].scriptPubKey.resize(25); - script = (uint8_t *)&txNew->vout[numvouts].scriptPubKey[0]; - *script++ = 0x76; - *script++ = 0xa9; - *script++ = 20; - memcpy(script,pax->rmd160,20), script += 20; - *script++ = 0x88; - *script++ = 0xac; - if ( tokomodo == 0 ) - { - for (i=0; i<32; i++) - data[len++] = ((uint8_t *)&pax->txid)[i]; - data[len++] = pax->vout & 0xff; - data[len++] = (pax->vout >> 8) & 0xff; - PENDING_HUSH_TX += pax->fiatoshis; - } - else - { - len += hush_rwapproval(1,&data[len],pax); - PENDING_HUSH_TX += pax->puposhis; - printf(" len.%d vout.%u DEPOSIT %.8f <- pax.%s pending ht %d %d %.8f | ",len,pax->vout,(double)txNew->vout[numvouts].nValue/COIN,symbol,pax->height,pax->otherheight,dstr(PENDING_HUSH_TX)); - } - if ( numvouts++ >= 64 || sum > COIN ) - break; - } - if ( numvouts > 1 ) - { - if ( tokomodo != 0 ) - strcpy(symbol,(char *)"HUSH3"); - for (i=0; symbol[i]!=0; i++) - data[len++] = symbol[i]; - data[len++] = 0; - for (i=0; ivout.resize(numvouts+1); - txNew->vout[numvouts].nValue = 0; - txNew->vout[numvouts].scriptPubKey.resize(opretlen); - script = (uint8_t *)&txNew->vout[numvouts].scriptPubKey[0]; - memcpy(script,opret,opretlen); - for (i=0; i<8; i++) - printf("%02x",opret[i]); - printf(" <- opret, MINER deposits.%d (%s) vouts.%d %.8f opretlen.%d\n",tokomodo,SMART_CHAIN_SYMBOL,numvouts,dstr(PENDING_HUSH_TX),opretlen); - return(1); - } return(0); } -int32_t hush_checkvout(int32_t vout,int32_t k,int32_t indallvouts) -{ - if ( k < indallvouts ) - return(vout == 1); - else if ( k == indallvouts || k == indallvouts+1 ) - return(1); - else return(vout == 0); -} - void hush_passport_iteration(); const char *hush_opreturn(int32_t height,uint64_t value,uint8_t *opretbuf,int32_t opretlen,uint256 txid,uint16_t vout,char *source) @@ -1286,136 +822,31 @@ extern std::vector Mineropret; // opreturn data set by the data gatheri #define issue_curl(cmdstr) bitcoind_RPC(0,(char *)"CBCOINBASE",cmdstr,0,0,0) -const char *Cryptos[] = { "HUSH", "ETH" }; -// "LTC", "BCHABC", "XMR", "IOTA", "ZEC", "WAVES", "LSK", "DCR", "RVN", "DASH", "XEM", "BTS", "ICX", "HOT", "STEEM", "ENJ", "STRAT" -const char *Forex[] = -{ "BGN","NZD","ILS","RUB","CAD","PHP","CHF","AUD","JPY","TRY","HKD","MYR","HRK","CZK","IDR","DKK","NOK","HUF","GBP","MXN","THB","ISK","ZAR","BRL","SGD","PLN","INR","KRW","RON","CNY","SEK","EUR" -}; // must be in ECB list - -struct hush_extremeprice -{ - uint256 blockhash; - uint32_t pricebits,timestamp; - int32_t height; - int16_t dir,ind; -} ExtremePrice; - -struct hush_priceinfo -{ - FILE *fp; - char symbol[64]; -} PRICES[HUSH_MAXPRICES]; - -uint32_t PriceCache[HUSH_LOCALPRICE_CACHESIZE][HUSH_MAXPRICES];//4+sizeof(Cryptos)/sizeof(*Cryptos)+sizeof(Forex)/sizeof(*Forex)]; -int64_t PriceMult[HUSH_MAXPRICES]; int32_t hush_cbopretsize(uint64_t flags); -void hush_PriceCache_shift() -{ - int32_t i; - for (i=HUSH_LOCALPRICE_CACHESIZE-1; i>0; i--) - memcpy(PriceCache[i],PriceCache[i-1],sizeof(PriceCache[i])); - memcpy(PriceCache[0],Mineropret.data(),Mineropret.size()); -} - int32_t _hush_heightpricebits(uint64_t *seedp,uint32_t *heightbits,CBlock *block) { - CTransaction tx; int32_t numvouts; std::vector vopret; - tx = block->vtx[0]; - numvouts = (int32_t)tx.vout.size(); - GetOpReturnData(tx.vout[numvouts-1].scriptPubKey,vopret); - if ( vopret.size() >= PRICES_SIZEBIT0 ) - { - if ( seedp != 0 ) - memcpy(seedp,&block->hashMerkleRoot,sizeof(*seedp)); - memcpy(heightbits,vopret.data(),vopret.size()); - return((int32_t)(vopret.size()/sizeof(uint32_t))); - } return(-1); } // hush_heightpricebits() extracts the price data in the coinbase for nHeight int32_t hush_heightpricebits(uint64_t *seedp,uint32_t *heightbits,int32_t nHeight) { - CBlockIndex *pindex; CBlock block; - if ( seedp != 0 ) - *seedp = 0; - if ( (pindex= hush_chainactive(nHeight)) != 0 ) - { - if ( hush_blockload(block,pindex) == 0 ) - { - return(_hush_heightpricebits(seedp,heightbits,&block)); - } - } - fprintf(stderr,"couldnt get pricebits for %d\n",nHeight); return(-1); } -/* - hush_pricenew() is passed in a reference price, the change tolerance and the proposed price. it needs to return a clipped price if it is too big and also set a flag if it is at or above the limit - */ uint32_t hush_pricenew(char *maxflagp,uint32_t price,uint32_t refprice,int64_t tolerance) { - uint64_t highprice,lowprice; - if ( refprice < 2 ) - return(0); - highprice = ((uint64_t)refprice * (COIN + tolerance)) / COIN; // calc highest acceptable price - lowprice = ((uint64_t)refprice * (COIN - tolerance)) / COIN; // and lowest - if ( highprice == refprice ) - highprice++; - if ( lowprice == refprice ) - lowprice--; - if ( price >= highprice ) - { - //fprintf(stderr,"high %u vs h%llu l%llu tolerance.%llu\n",price,(long long)highprice,(long long)lowprice,(long long)tolerance); - if ( price > highprice ) // return non-zero only if we violate the tolerance - { - *maxflagp = 2; - return(highprice); - } - *maxflagp = 1; - } - else if ( price <= lowprice ) - { - //fprintf(stderr,"low %u vs h%llu l%llu tolerance.%llu\n",price,(long long)highprice,(long long)lowprice,(long long)tolerance); - if ( price < lowprice ) - { - *maxflagp = -2; - return(lowprice); - } - *maxflagp = -1; - } return(0); } -// hush_pricecmp() returns -1 if any of the prices are beyond the tolerance int32_t hush_pricecmp(int32_t nHeight,int32_t n,char *maxflags,uint32_t *pricebitsA,uint32_t *pricebitsB,int64_t tolerance) { - int32_t i; uint32_t newprice; - for (i=1; i newprice.%u out of tolerance maxflag.%d\n",nHeight,i,n,pricebitsB[i],pricebitsA[i],newprice,maxflags[i]); - return(-1); - } - } return(0); } -// hush_priceclamp() clamps any price that is beyond tolerance int32_t hush_priceclamp(int32_t n,uint32_t *pricebits,uint32_t *refprices,int64_t tolerance) { - int32_t i; uint32_t newprice; char maxflags[HUSH_MAXPRICES]; - memset(maxflags,0,sizeof(maxflags)); - for (i=1; i %u\n",i,n,refprices[i],pricebits[i],newprice); - pricebits[i] = newprice; - } - } return(0); } @@ -1464,161 +895,12 @@ CScript hush_mineropret(int32_t nHeight) return(opret); } -/* - hush_opretvalidate() is the entire price validation! - it prints out some useful info for debugging, like the lag from current time and prev block and the prices encoded in the opreturn. - - The only way hush_opretvalidate() doesnt return an error is if maxflag is set or it is within tolerance of both the prior block and the local data. The local data validation only happens if it is a recent block and not a block from the past as the local node is only getting the current price data. - - */ - - void hush_queuelocalprice(int32_t dir,int32_t height,uint32_t timestamp,uint256 blockhash,int32_t ind,uint32_t pricebits) { - fprintf(stderr,"ExtremePrice dir.%d ht.%d ind.%d cmpbits.%u\n",dir,height,ind,pricebits); - ExtremePrice.dir = dir; - ExtremePrice.height = height; - ExtremePrice.blockhash = blockhash; - ExtremePrice.ind = ind; - ExtremePrice.timestamp = timestamp; - ExtremePrice.pricebits = pricebits; } int32_t hush_opretvalidate(const CBlock *block,CBlockIndex * const previndex,int32_t nHeight,CScript scriptPubKey) { - int32_t testchain_exemption = 0; - std::vector vopret; char maxflags[HUSH_MAXPRICES]; uint256 bhash; double btcusd,btcgbp,btceur; uint32_t localbits[HUSH_MAXPRICES],pricebits[HUSH_MAXPRICES],prevbits[HUSH_MAXPRICES],newprice; int32_t i,j,prevtime,maxflag,lag,lag2,lag3,n,errflag,iter; uint32_t now; - now = (uint32_t)time(NULL); - if ( ASSETCHAINS_CBOPRET != 0 && nHeight > 0 ) - { - bhash = block->GetHash(); - GetOpReturnData(scriptPubKey,vopret); - if ( vopret.size() >= PRICES_SIZEBIT0 ) - { - n = (int32_t)(vopret.size() / sizeof(uint32_t)); - memcpy(pricebits,vopret.data(),Mineropret.size()); - memset(maxflags,0,sizeof(maxflags)); - if ( nHeight > 2 ) - { - prevtime = previndex->nTime; - lag = (int32_t)(now - pricebits[0]); - lag2 = (int32_t)(pricebits[0] - prevtime); - lag3 = (int32_t)(block->nTime - pricebits[0]); - if ( lag < -60 ) // avoid data from future - { - fprintf(stderr,"A ht.%d now.%u htstamp.%u %u - pricebits[0] %u -> lags.%d %d %d\n",nHeight,now,prevtime,block->nTime,pricebits[0],lag,lag2,lag3); - return(-1); - } - if ( lag2 < -60 ) //testchain_exemption ) // must be close to last block timestamp - { - fprintf(stderr,"B ht.%d now.%u htstamp.%u %u - pricebits[0] %u -> lags.%d %d %d vs %d cmp.%d\n",nHeight,now,prevtime,block->nTime,pricebits[0],lag,lag2,lag3,ASSETCHAINS_BLOCKTIME,lag2<-ASSETCHAINS_BLOCKTIME); - if ( nHeight > testchain_exemption ) - return(-1); - } - if ( lag3 < -60 || lag3 > ASSETCHAINS_BLOCKTIME ) - { - fprintf(stderr,"C ht.%d now.%u htstamp.%u %u - pricebits[0] %u -> lags.%d %d %d\n",nHeight,now,prevtime,block->nTime,pricebits[0],lag,lag2,lag3); - if ( nHeight > testchain_exemption ) - return(-1); - } - btcusd = (double)pricebits[1]/10000; - btcgbp = (double)pricebits[2]/10000; - btceur = (double)pricebits[3]/10000; - fprintf(stderr,"ht.%d: lag.%d %.4f USD, %.4f GBP, %.4f EUR, GBPUSD %.6f, EURUSD %.6f, EURGBP %.6f [%d]\n",nHeight,lag,btcusd,btcgbp,btceur,btcusd/btcgbp,btcusd/btceur,btcgbp/btceur,lag2); - if ( hush_heightpricebits(0,prevbits,nHeight-1) > 0 ) - { - if ( nHeight < testchain_exemption ) - { - for (i=0; i= PRICES_SIZEBIT0 ) - { - memcpy(localbits,Mineropret.data(),Mineropret.size()); - if ( nHeight < testchain_exemption ) - { - for (i=0; i 0 && localbits[i] < prevbits[i] ) - { - if ( iter == 0 ) - break; - // second iteration checks recent prices to see if within local volatility - for (j=0; j= prevbits[i] ) - { - fprintf(stderr,"i.%d within recent localprices[%d] %u >= %u\n",i,j,PriceCache[j][i],prevbits[i]); - break; - } - if ( j == HUSH_LOCALPRICE_CACHESIZE ) - { - hush_queuelocalprice(1,nHeight,block->nTime,bhash,i,prevbits[i]); - break; - } - } - else if ( maxflag < 0 && localbits[i] > prevbits[i] ) - { - if ( iter == 0 ) - break; - for (j=0; jnTime,bhash,i,prevbits[i]); - break; - } - } - } - } - if ( i != n ) - { - if ( iter == 0 ) - { - fprintf(stderr,"force update prices\n"); - hush_cbopretupdate(1); - memcpy(localbits,Mineropret.data(),Mineropret.size()); - } else return(-1); - } - } - } - } - if ( bhash == ExtremePrice.blockhash ) - { - fprintf(stderr,"approved a previously extreme price based on new data ht.%d vs %u vs %u\n",ExtremePrice.height,ExtremePrice.timestamp,(uint32_t)block->nTime); - memset(&ExtremePrice,0,sizeof(ExtremePrice)); - } - return(0); - } else fprintf(stderr,"wrong size %d vs %d, scriptPubKey size %d [%02x]\n",(int32_t)vopret.size(),(int32_t)Mineropret.size(),(int32_t)scriptPubKey.size(),scriptPubKey[0]); - return(-1); - } return(0); } @@ -1718,16 +1000,6 @@ cJSON *send_curl(char *url,char *fname) } // get_urljson just returns the JSON returned by the URL using issue_curl - - -/* -const char *Techstocks[] = -{ "AAPL","ADBE","ADSK","AKAM","AMD","AMZN","ATVI","BB","CDW","CRM","CSCO","CYBR","DBX","EA","FB","GDDY","GOOG","GRMN","GSAT","HPQ","IBM","INFY","INTC","INTU","JNPR","MSFT","MSI","MU","MXL","NATI","NCR","NFLX","NTAP","NVDA","ORCL","PANW","PYPL","QCOM","RHT","S","SHOP","SNAP","SPOT","SYMC","SYNA","T","TRIP","TWTR","TXN","VMW","VOD","VRSN","VZ","WDC","XRX","YELP","YNDX","ZEN" -}; -const char *Metals[] = { "XAU", "XAG", "XPT", "XPD", }; -const char *Markets[] = { "DJIA", "SPX", "NDX", "VIX" }; -*/ - cJSON *get_urljson(char *url) { char *jsonstr; cJSON *json = 0; @@ -1740,792 +1012,20 @@ cJSON *get_urljson(char *url) return(json); } -int32_t get_stockprices(uint32_t now,uint32_t *prices,std::vector symbols) -{ - char url[32768],*symbol,*timestr; cJSON *json,*obj; int32_t i,n=0,retval=-1; uint32_t uprice,timestamp; - sprintf(url,"https://api.iextrading.com/1.0/tops/last?symbols=%s",GetArg("-ac_stocks","").c_str()); - fprintf(stderr,"url.(%s)\n",url); - if ( (json= get_urljson(url)) != 0 ) //if ( (json= send_curl(url,(char *)"iex")) != 0 ) // - { - fprintf(stderr,"stocks.(%s)\n",jprint(json,0)); - if ( (n= cJSON_GetArraySize(json)) > 0 ) - { - retval = n; - for (i=0; i now+60 || timestamp < now-ASSETCHAINS_BLOCKTIME ) - { - fprintf(stderr,"time error.%d (%u vs %u)\n",timestamp-now,timestamp,now); - retval = -1; - }*/ - if ( symbols[i] != symbol ) - { - retval = -1; - fprintf(stderr,"MISMATCH."); - } - fprintf(stderr,"(%s %u) ",symbol,uprice); - } - } - fprintf(stderr,"numstocks.%d\n",n); - } - //https://api.iextrading.com/1.0/tops/last?symbols=AAPL -> [{"symbol":"AAPL","price":198.63,"size":100,"time":1555092606076}] - free_json(json); - } - return(retval); -} - -uint32_t get_dailyfx(uint32_t *prices) -{ - //{"base":"USD","rates":{"BGN":1.74344803,"NZD":1.471652701,"ILS":3.6329113924,"RUB":65.1997682296,"CAD":1.3430201462,"USD":1.0,"PHP":52.8641469068,"CHF":0.9970582992,"AUD":1.4129078267,"JPY":110.6792654662,"TRY":5.6523444464,"HKD":7.8499732573,"MYR":4.0824567659,"HRK":6.6232840078,"CZK":22.9862720628,"IDR":14267.4986628633,"DKK":6.6551078624,"NOK":8.6806917454,"HUF":285.131039401,"GBP":0.7626582278,"MXN":19.4183455161,"THB":31.8702085933,"ISK":122.5708682475,"ZAR":14.7033339276,"BRL":3.9750401141,"SGD":1.3573720806,"PLN":3.8286682118,"INR":69.33187734,"KRW":1139.1602781244,"RON":4.2423783206,"CNY":6.7387234801,"SEK":9.3385630237,"EUR":0.8914244963},"date":"2019-03-28"} - char url[512],*datestr; cJSON *json,*rates; int32_t i; uint32_t datenum=0,price = 0; - sprintf(url,"https://api.openrates.io/latest?base=USD"); - if ( (json= get_urljson(url)) != 0 ) //if ( (json= send_curl(url,(char *)"dailyfx")) != 0 ) - { - if ( (rates= jobj(json,(char *)"rates")) != 0 ) - { - for (i=0; i strvec) -{ - int32_t i,errs=0; uint32_t price; char *symbol; - for (i=0; i 333 ) // for debug only! -// ASSETCHAINS_CBOPRET = 7; - size = hush_cbopretsize(ASSETCHAINS_CBOPRET); - if ( Mineropret.size() < size ) - Mineropret.resize(size); - size = PRICES_SIZEBIT0; - if ( (forceflag != 0 || now > lastbtc+120) && get_btcusd(pricebits) == 0 ) - { - if ( flags == 0 ) - hush_PriceCache_shift(); - memcpy(PriceCache[0],pricebits,PRICES_SIZEBIT0); - flags |= 1; - } - if ( (ASSETCHAINS_CBOPRET & 2) != 0 ) - { - if ( now > lasttime+3600*5 || forexprices[0] == 0 ) // cant assume timestamp is valid for forex price as it is a daily weekday changing thing anyway. - { - get_dailyfx(forexprices); - if ( flags == 0 ) - hush_PriceCache_shift(); - flags |= 2; - memcpy(&PriceCache[0][size/sizeof(uint32_t)],forexprices,sizeof(forexprices)); - } - size += (sizeof(Forex)/sizeof(*Forex)) * sizeof(uint32_t); - } - if ( (ASSETCHAINS_CBOPRET & 4) != 0 ) - { - if ( forceflag != 0 || flags != 0 ) - { - get_cryptoprices(pricebuf,Cryptos,(int32_t)(sizeof(Cryptos)/sizeof(*Cryptos)),ASSETCHAINS_PRICES); - if ( flags == 0 ) - hush_PriceCache_shift(); - memcpy(&PriceCache[0][size/sizeof(uint32_t)],pricebuf,(sizeof(Cryptos)/sizeof(*Cryptos)+ASSETCHAINS_PRICES.size()) * sizeof(uint32_t)); - flags |= 4; // very rarely we can see flags == 6 case - } - size += (sizeof(Cryptos)/sizeof(*Cryptos)+ASSETCHAINS_PRICES.size()) * sizeof(uint32_t); - } - now = (uint32_t)time(NULL); - if ( (ASSETCHAINS_CBOPRET & 8) != 0 ) - { - if ( forceflag != 0 || flags != 0 ) - { - if ( get_stockprices(now,pricebuf,ASSETCHAINS_STOCKS) == ASSETCHAINS_STOCKS.size() ) - { - if ( flags == 0 ) - hush_PriceCache_shift(); - memcpy(&PriceCache[0][size/sizeof(uint32_t)],pricebuf,ASSETCHAINS_STOCKS.size() * sizeof(uint32_t)); - flags |= 8; // very rarely we can see flags == 10 case - } - } - size += (ASSETCHAINS_STOCKS.size()) * sizeof(uint32_t); - } - if ( flags != 0 ) - { - if ( (flags & 1) != 0 ) - lastbtc = now; - if ( (flags & 2) != 0 ) - lasttime = now; - memcpy(Mineropret.data(),PriceCache[0],size); - if ( ExtremePrice.dir != 0 && ExtremePrice.ind > 0 && ExtremePrice.ind < size/sizeof(uint32_t) && now < ExtremePrice.timestamp+3600 ) - { - fprintf(stderr,"cmp dir.%d PriceCache[0][ExtremePrice.ind] %u >= %u ExtremePrice.pricebits\n",ExtremePrice.dir,PriceCache[0][ExtremePrice.ind],ExtremePrice.pricebits); - if ( (ExtremePrice.dir > 0 && PriceCache[0][ExtremePrice.ind] >= ExtremePrice.pricebits) || (ExtremePrice.dir < 0 && PriceCache[0][ExtremePrice.ind] <= ExtremePrice.pricebits) ) - { - fprintf(stderr,"future price is close enough to allow approving previously rejected block ind.%d %u vs %u\n",ExtremePrice.ind,PriceCache[0][ExtremePrice.ind],ExtremePrice.pricebits); - if ( (pindex= hush_blockindex(ExtremePrice.blockhash)) != 0 ) - pindex->nStatus &= ~BLOCK_FAILED_MASK; - else fprintf(stderr,"couldnt find block.%s\n",ExtremePrice.blockhash.GetHex().c_str()); - } - } - // high volatility still strands nodes so we need to check new prices to approve a stuck block - // scan list of stuck blocks (one?) and auto reconsiderblock if it changed state - - //int32_t i; for (i=0; i= HUSH_MAXPRICES ) - return(-1); - mult = hush_pricemult(ind); - if ( nonzprices != 0 ) - memset(nonzprices,0,sizeof(*nonzprices)*PRICES_DAYWINDOW); - //for (i=0; i= PRICES_DAYWINDOW ) - i = 0; - if ( (price= rawprices[i*rawskip]) == 0 ) - { - fprintf(stderr,"null rawprice.[%d]\n",i); - return(-1); - } - if ( price >= lowprice && price <= highprice ) - { - //fprintf(stderr,"%.1f ",(double)price/10000); - sum += price; - correlation++; - if ( correlation > (PRICES_DAYWINDOW>>1) ) - { - if ( nonzprices == 0 ) - return(refprice * mult); - //fprintf(stderr,"-> %.4f\n",(double)sum*mult/correlation); - //return(sum*mult/correlation); - n = 0; - i = (iter + seed) % PRICES_DAYWINDOW; - for (k=0; k= PRICES_DAYWINDOW ) - i = 0; - if ( n > (PRICES_DAYWINDOW>>1) ) - nonzprices[i] = 0; - else - { - price = rawprices[i*rawskip]; - if ( price < lowprice || price > highprice ) - nonzprices[i] = 0; - else - { - nonzprices[i] = price; - //fprintf(stderr,"(%d %u) ",i,rawprices[i*rawskip]); - n++; - } - } - } - //fprintf(stderr,"ind.%d iter.%d j.%d i.%d n.%d correlation.%d ref %llu -> %llu\n",ind,iter,j,i,n,correlation,(long long)refprice,(long long)sum/correlation); - if ( n != correlation ) - return(-1); - sum = den = n = 0; - for (i=0; i %.8f\n",(long long)firstprice,((double)(sum*mult) / den) / COIN); - return((sum * mult) / den); - } - } - } - if ( correlation > maxcorrelation ) - maxcorrelation = correlation; - } - fprintf(stderr,"ind.%d iter.%d maxcorrelation.%d ref.%llu high.%llu low.%llu\n",ind,iter,maxcorrelation,(long long)refprice,(long long)highprice,(long long)lowprice); - return(0); -} - -int64_t _pairave64(int64_t valA,int64_t valB) -{ - if ( valA != 0 && valB != 0 ) - return((valA + valB) / 2); - else if ( valA != 0 ) return(valA); - else return(valB); -} - -int64_t _pairdiff64(register int64_t valA,register int64_t valB) -{ - if ( valA != 0 && valB != 0 ) - return(valA - valB); - else return(0); -} - -int64_t balanced_ave64(int64_t buf[],int32_t i,int32_t width) -{ - register int32_t nonz,j; register int64_t sum,price; - nonz = 0; - sum = 0; - for (j=-width; j<=width; j++) - { - price = buf[i + j]; - if ( price != 0 ) - { - sum += price; - nonz++; - } - } - if ( nonz != 0 ) - sum /= nonz; - return(sum); -} - -void buf_trioave64(int64_t dest[],int64_t src[],int32_t n) -{ - register int32_t i,j,width = 3; - for (i=0; i<128; i++) - src[i] = 0; - //for (i=n-width-1; i>width; i--) - // dest[i] = balanced_ave(src,i,width); - //for (i=width; i>0; i--) - // dest[i] = balanced_ave(src,i,i); - for (i=1; i *(int64_t *)b) return 1; - else if ( (uint64_t)a < (uint64_t)b ) // jl777 prevent nondeterminism - return(-1); - else return(1); -} - -static void sort64(int64_t *l, int32_t llen) -{ - qsort(l,llen,sizeof(uint64_t),cmp_llu); -} - -static int revcmp_llu(const void *a, const void*b) -{ - if(*(int64_t *)a < *(int64_t *)b) return 1; - else if(*(int64_t *)a > *(int64_t *)b) return -1; - else if ( (uint64_t)a < (uint64_t)b ) // jl777 prevent nondeterminism - return(-1); - else return(1); -} - -static void revsort64(int64_t *l, int32_t llen) -{ - qsort(l,llen,sizeof(uint64_t),revcmp_llu); -} - -int64_t hush_priceave(int64_t *buf,int64_t *correlated,int32_t cskip) -{ - int32_t i,dir=0; int64_t sum=0,nonzprice,price,halfave,thirdave,fourthave,decayprice; - if ( PRICES_DAYWINDOW < 2 ) - return(0); - for (i=0; i price ) // rising prices - sort64(buf,PRICES_DAYWINDOW); - else revsort64(buf,PRICES_DAYWINDOW); - decayprice = buf[0]; - for (i=0; i %.8f\n",halfave 0 && PRICES[0].fp != 0 && createflag != 0 ) - { - fseek(PRICES[0].fp,(2*PRICES_DAYWINDOW+PRICES_SMOOTHWIDTH) * sizeof(uint32_t) * i,SEEK_SET); - fputc(0,PRICES[0].fp); - fflush(PRICES[0].fp); - } - fprintf(stderr,"pricesinit done i.%d num.%d numprices.%d\n",i,num,(int32_t)(hush_cbopretsize(ASSETCHAINS_CBOPRET)/sizeof(uint32_t))); - if ( i != num || i != hush_cbopretsize(ASSETCHAINS_CBOPRET)/sizeof(uint32_t) ) - { - fprintf(stderr,"fatal error opening prices files, start shutdown\n"); - StartShutdown(); - } return(0); } -pthread_mutex_t pricemutex; - -// PRICES file layouts -// [0] rawprice32 / timestamp -// [1] correlated -// [2] 24hr ave -// [3] to [7] reserved - void hush_pricesupdate(int32_t height,CBlock *pblock) { - static int numprices; static uint32_t *ptr32; static int64_t *ptr64,*tmpbuf; - int32_t ind,offset,width; int64_t correlated,smoothed; uint64_t seed,rngval; uint32_t rawprices[HUSH_MAXPRICES],buf[PRICES_MAXDATAPOINTS*2]; - width = PRICES_DAYWINDOW;//(2*PRICES_DAYWINDOW + PRICES_SMOOTHWIDTH); - if ( numprices == 0 ) - { - pthread_mutex_init(&pricemutex,0); - numprices = (int32_t)(hush_cbopretsize(ASSETCHAINS_CBOPRET) / sizeof(uint32_t)); - ptr32 = (uint32_t *)calloc(sizeof(uint32_t),numprices * width); - ptr64 = (int64_t *)calloc(sizeof(int64_t),PRICES_DAYWINDOW*PRICES_MAXDATAPOINTS); - tmpbuf = (int64_t *)calloc(sizeof(int64_t),2*PRICES_DAYWINDOW); - fprintf(stderr,"prices update: numprices.%d %p %p\n",numprices,ptr32,ptr64); - } - if ( _hush_heightpricebits(&seed,rawprices,pblock) == numprices ) - { - //for (ind=0; ind PRICES_DAYWINDOW ) - { - fseek(PRICES[0].fp,(height-width+1) * numprices * sizeof(uint32_t),SEEK_SET); - if ( fread(ptr32,sizeof(uint32_t),width*numprices,PRICES[0].fp) == width*numprices ) - { - rngval = seed; - for (ind=1; ind 0 ) - { - fseek(PRICES[ind].fp,height * sizeof(int64_t) * PRICES_MAXDATAPOINTS,SEEK_SET); - memset(buf,0,sizeof(buf)); - buf[0] = rawprices[ind]; - buf[1] = rawprices[0]; // timestamp - memcpy(&buf[2],&correlated,sizeof(correlated)); - if ( fwrite(buf,1,sizeof(buf),PRICES[ind].fp) != sizeof(buf) ) - fprintf(stderr,"error fwrite buf for ht.%d ind.%d\n",height,ind); - else if ( height > PRICES_DAYWINDOW*2 ) - { - fseek(PRICES[ind].fp,(height-PRICES_DAYWINDOW+1) * PRICES_MAXDATAPOINTS * sizeof(int64_t),SEEK_SET); - if ( fread(ptr64,sizeof(int64_t),PRICES_DAYWINDOW*PRICES_MAXDATAPOINTS,PRICES[ind].fp) == PRICES_DAYWINDOW*PRICES_MAXDATAPOINTS ) - { - if ( (smoothed= hush_priceave(tmpbuf,&ptr64[(PRICES_DAYWINDOW-1)*PRICES_MAXDATAPOINTS+1],-PRICES_MAXDATAPOINTS)) > 0 ) - { - fseek(PRICES[ind].fp,(height * PRICES_MAXDATAPOINTS + 2) * sizeof(int64_t),SEEK_SET); - if ( fwrite(&smoothed,1,sizeof(smoothed),PRICES[ind].fp) != sizeof(smoothed) ) - fprintf(stderr,"error fwrite smoothed for ht.%d ind.%d\n",height,ind); - else fflush(PRICES[ind].fp); - } else fprintf(stderr,"error price_smoothed ht.%d ind.%d\n",height,ind); - } else fprintf(stderr,"error fread ptr64 for ht.%d ind.%d\n",height,ind); - } - } else fprintf(stderr,"error hush_pricecorrelated for ht.%d ind.%d\n",height,ind); - } - fprintf(stderr,"height.%d\n",height); - } else fprintf(stderr,"error reading rawprices for ht.%d\n",height); - } else fprintf(stderr,"height.%d <= width.%d\n",height,width); - pthread_mutex_unlock(&pricemutex); - } else fprintf(stderr,"null PRICES[0].fp\n"); - } else fprintf(stderr,"numprices mismatch, height.%d\n",height); } - -int32_t hush_priceget(int64_t *buf64,int32_t ind,int32_t height,int32_t numblocks) -{ - FILE *fp; int32_t retval = PRICES_MAXDATAPOINTS; - pthread_mutex_lock(&pricemutex); - if ( ind < HUSH_MAXPRICES && (fp= PRICES[ind].fp) != 0 ) - { - fseek(fp,height * PRICES_MAXDATAPOINTS * sizeof(int64_t),SEEK_SET); - if ( fread(buf64,sizeof(int64_t),numblocks*PRICES_MAXDATAPOINTS,fp) != numblocks*PRICES_MAXDATAPOINTS ) - retval = -1; - } - pthread_mutex_unlock(&pricemutex); - return(retval); -} - diff --git a/src/hush_globals.h b/src/hush_globals.h index 128d719da..f7bbeb860 100644 --- a/src/hush_globals.h +++ b/src/hush_globals.h @@ -45,11 +45,12 @@ int COINBASE_MATURITY = _COINBASE_MATURITY;//100; unsigned int WITNESS_CACHE_SIZE = _COINBASE_MATURITY+10; uint256 HUSH_EARLYTXID; -int32_t HUSH_MININGTHREADS = -1,IS_HUSH_NOTARY,USE_EXTERNAL_PUBKEY,HUSH_CHOSEN_ONE,ASSETCHAINS_SEED,HUSH_ON_DEMAND,HUSH_EXTERNAL_NOTARIES,HUSH_PASSPORT_INITDONE,HUSH_PAX,HUSH_EXCHANGEWALLET,HUSH_REWIND,HUSH_CONNECTING = -1,HUSH_DEALERNODE,HUSH_EXTRASATOSHI,ASSETCHAINS_FOUNDERS,ASSETCHAINS_CBMATURITY,HUSH_NSPV; +int32_t HUSH_MININGTHREADS = -1,IS_HUSH_NOTARY,USE_EXTERNAL_PUBKEY,HUSH_CHOSEN_ONE,ASSETCHAINS_SEED,HUSH_ON_DEMAND,HUSH_EXTERNAL_NOTARIES,HUSH_PASSPORT_INITDONE,HUSH_PAX,HUSH_EXCHANGEWALLET,HUSH_REWIND,HUSH_CONNECTING = -1,HUSH_EXTRASATOSHI,ASSETCHAINS_FOUNDERS,ASSETCHAINS_CBMATURITY,HUSH_NSPV; int32_t HUSH_INSYNC,HUSH_LASTMINED,prevHUSH_LASTMINED,HUSH_CCACTIVATE; -std::string NOTARY_PUBKEY,ASSETCHAINS_NOTARIES,ASSETCHAINS_OVERRIDE_PUBKEY,DONATION_PUBKEY,ASSETCHAINS_SCRIPTPUB,NOTARY_ADDRESS,ASSETCHAINS_SELFIMPORT,ASSETCHAINS_CCLIB; +std::string NOTARY_PUBKEY,ASSETCHAINS_NOTARIES,ASSETCHAINS_OVERRIDE_PUBKEY,ASSETCHAINS_SCRIPTPUB,NOTARY_ADDRESS,ASSETCHAINS_SELFIMPORT,ASSETCHAINS_CCLIB; uint8_t NOTARY_PUBKEY33[33],ASSETCHAINS_OVERRIDE_PUBKEY33[33],ASSETCHAINS_OVERRIDE_PUBKEYHASH[20],ASSETCHAINS_PUBLIC,ASSETCHAINS_PRIVATE,ASSETCHAINS_TXPOW,ASSETCHAINS_MARMARA; int8_t ASSETCHAINS_ADAPTIVEPOW; +uint8_t ASSETCHAINS_CLEARNET = 1; uint8_t ASSETCHAINS_BURN = 0; uint32_t ASSETCHAINS_MINOPRETURNFEE = 0; std::vector Mineropret; diff --git a/src/hush_notary.h b/src/hush_notary.h index 50335c349..0a66c6877 100644 --- a/src/hush_notary.h +++ b/src/hush_notary.h @@ -17,7 +17,6 @@ ******************************************************************************/ #include "hush_defs.h" -#include "hush_cJSON.h" #define HUSH_NOTARIES_HEIGHT1 814000 diff --git a/src/hush_utils.h b/src/hush_utils.h index f1bb80697..1ca9db12d 100644 --- a/src/hush_utils.h +++ b/src/hush_utils.h @@ -1339,7 +1339,7 @@ void hush_statefname(char *fname,char *symbol,char *str) fname[len - n] = 0; else { - if ( strcmp(symbol,"REGTEST") != 0 ) + if ( strcmp(symbol,"ZZZ") != 0 ) printf("unexpected fname.(%s) vs %s [%s] n.%d len.%d (%s)\n",fname,symbol,SMART_CHAIN_SYMBOL,n,len,&fname[len - n]); return; } @@ -1763,9 +1763,7 @@ void hush_args(char *argv0) { HUSH_MININGTHREADS = GetArg("-genproclimit",-1); } - DONATION_PUBKEY = GetArg("-donation", ""); NOTARY_PUBKEY = GetArg("-pubkey", ""); - HUSH_DEALERNODE = GetArg("-dealer",0); HUSH_TESTNODE = GetArg("-testnode",0); if ( strlen(NOTARY_PUBKEY.c_str()) == 66 ) @@ -1796,12 +1794,10 @@ void hush_args(char *argv0) fprintf(stderr,".oO Starting %s Full Node (Extreme Privacy!) with genproc=%d notary=%d\n",name.c_str(),HUSH_MININGTHREADS, IS_HUSH_NOTARY); vector HUSH_nodes = {}; - vector DRAGONX_nodes = {}; - // Only HUSH3 and DRAGONX connect to these by default, other HACs must opt-in via -connect/-addnode + // Only HUSH3 uses these by default, other HACs must opt-in via -connect/-addnode const bool ishush3 = strncmp(name.c_str(), "HUSH3",5) == 0 ? true : false; - const bool isdragonx = strncmp(name.c_str(), "DRAGONX",7) == 0 ? true : false; - LogPrint("net", "%s: ishush3=%d isdragonx=%d\n", __func__, ishush3, isdragonx); + LogPrint("net", "%s: ishush3=%d\n", __func__, ishush3); if (ishush3) { HUSH_nodes = {"node1.hush.is","node2.hush.is","node3.hush.is", "node4.hush.is","node5.hush.is","node6.hush.is", @@ -1818,27 +1814,16 @@ void hush_args(char *argv0) } - if (isdragonx) { - DRAGONX_nodes = {"node1.dragonx.is","node2.dragonx.is","node3.dragonx.is", - "node4.dragonx.is","node5.dragonx.is","node6.dragonx.is" - }; - } - vector more_nodes = mapMultiArgs["-addnode"]; if (more_nodes.size() > 0) { fprintf(stderr,"%s: Adding %lu more nodes via custom -addnode arguments\n", __func__, more_nodes.size() ); } - // Add default HUSH and DRAGONX nodes after custom addnodes, if applicable + // Add default HUSH nodes after custom addnodes, if applicable if(HUSH_nodes.size() > 0) { LogPrint("net", "%s: adding %d HUSH3 hostname-based nodes\n", __func__, HUSH_nodes.size() ); more_nodes.insert( more_nodes.end(), HUSH_nodes.begin(), HUSH_nodes.end() ); } - if(DRAGONX_nodes.size() > 0) { - LogPrint("net", "%s: adding %d DRAGONX hostname-based nodes\n", __func__, DRAGONX_nodes.size() ); - more_nodes.insert( more_nodes.end(), DRAGONX_nodes.begin(), DRAGONX_nodes.end() ); - } - mapMultiArgs["-addnode"] = more_nodes; HUSH_STOPAT = GetArg("-stopat",0); MAX_REORG_LENGTH = GetArg("-maxreorg",MAX_REORG_LENGTH); @@ -1853,6 +1838,7 @@ void hush_args(char *argv0) Split(GetArg("-ac_nk",""), sizeof(ASSETCHAINS_NK)/sizeof(*ASSETCHAINS_NK), ASSETCHAINS_NK, 0); ASSETCHAINS_BURN = GetArg("-ac_burn", 0); + ASSETCHAINS_CLEARNET = GetArg("-ac_clearnet", 1); ASSETCHAINS_MINOPRETURNFEE = GetArg("-ac_minopreturnfee", 0); // -ac_ccactivateht=evalcode,height,evalcode,height,evalcode,height.... @@ -2180,7 +2166,7 @@ void hush_args(char *argv0) } } - if ( ASSETCHAINS_ENDSUBSIDY[0] != 0 || ASSETCHAINS_REWARD[0] != 0 || ASSETCHAINS_HALVING[0] != 0 || ASSETCHAINS_DECAY[0] != 0 || ASSETCHAINS_COMMISSION != 0 || ASSETCHAINS_PUBLIC != 0 || ASSETCHAINS_PRIVATE != 0 || ASSETCHAINS_TXPOW != 0 || ASSETCHAINS_FOUNDERS != 0 || ASSETCHAINS_SCRIPTPUB.size() > 1 || ASSETCHAINS_SELFIMPORT.size() > 0 || ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 || ASSETCHAINS_TIMELOCKGTE != _ASSETCHAINS_TIMELOCKOFF|| ASSETCHAINS_ALGO != ASSETCHAINS_EQUIHASH || ASSETCHAINS_LWMAPOS != 0 || ASSETCHAINS_LASTERA > 0 || ASSETCHAINS_BEAMPORT != 0 || ASSETCHAINS_CODAPORT != 0 || ASSETCHAINS_MARMARA != 0 || nonz > 0 || ASSETCHAINS_CCLIB.size() > 0 || ASSETCHAINS_FOUNDERS_REWARD != 0 || ASSETCHAINS_NOTARY_PAY[0] != 0 || ASSETCHAINS_BLOCKTIME != 60 || ASSETCHAINS_CBOPRET != 0 || Mineropret.size() != 0 || (ASSETCHAINS_NK[0] != 0 && ASSETCHAINS_NK[1] != 0) || HUSH_SNAPSHOT_INTERVAL != 0 || ASSETCHAINS_EARLYTXIDCONTRACT != 0 || ASSETCHAINS_CBMATURITY != 0 || ASSETCHAINS_ADAPTIVEPOW != 0 || ASSETCHAINS_BURN != 0 || ASSETCHAINS_MINOPRETURNFEE) + if ( ASSETCHAINS_ENDSUBSIDY[0] != 0 || ASSETCHAINS_REWARD[0] != 0 || ASSETCHAINS_HALVING[0] != 0 || ASSETCHAINS_DECAY[0] != 0 || ASSETCHAINS_COMMISSION != 0 || ASSETCHAINS_PUBLIC != 0 || ASSETCHAINS_PRIVATE != 0 || ASSETCHAINS_TXPOW != 0 || ASSETCHAINS_FOUNDERS != 0 || ASSETCHAINS_SCRIPTPUB.size() > 1 || ASSETCHAINS_SELFIMPORT.size() > 0 || ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 || ASSETCHAINS_TIMELOCKGTE != _ASSETCHAINS_TIMELOCKOFF|| ASSETCHAINS_ALGO != ASSETCHAINS_EQUIHASH || ASSETCHAINS_LWMAPOS != 0 || ASSETCHAINS_LASTERA > 0 || ASSETCHAINS_BEAMPORT != 0 || ASSETCHAINS_CODAPORT != 0 || ASSETCHAINS_MARMARA != 0 || nonz > 0 || ASSETCHAINS_CCLIB.size() > 0 || ASSETCHAINS_FOUNDERS_REWARD != 0 || ASSETCHAINS_NOTARY_PAY[0] != 0 || ASSETCHAINS_BLOCKTIME != 60 || ASSETCHAINS_CBOPRET != 0 || Mineropret.size() != 0 || (ASSETCHAINS_NK[0] != 0 && ASSETCHAINS_NK[1] != 0) || HUSH_SNAPSHOT_INTERVAL != 0 || ASSETCHAINS_EARLYTXIDCONTRACT != 0 || ASSETCHAINS_CBMATURITY != 0 || ASSETCHAINS_ADAPTIVEPOW != 0 || ASSETCHAINS_BURN != 0 || ASSETCHAINS_MINOPRETURNFEE || (ASSETCHAINS_CLEARNET == 0) ) { if(fDebug) fprintf(stderr,"perc %.4f%% ac_pub=[%02x%02x%02x...] acsize.%d\n",dstr(ASSETCHAINS_COMMISSION)*100,ASSETCHAINS_OVERRIDE_PUBKEY33[0],ASSETCHAINS_OVERRIDE_PUBKEY33[1],ASSETCHAINS_OVERRIDE_PUBKEY33[2],(int32_t)ASSETCHAINS_SCRIPTPUB.size()); @@ -2350,6 +2336,11 @@ void hush_args(char *argv0) { extralen += dragon_rwnum(1,&extraptr[extralen],sizeof(ASSETCHAINS_MINOPRETURNFEE),(void *)&ASSETCHAINS_MINOPRETURNFEE); } + + if ( ASSETCHAINS_CLEARNET == 0 ) + { + extralen += dragon_rwnum(1,&extraptr[extralen],sizeof(ASSETCHAINS_CLEARNET),(void *)&ASSETCHAINS_CLEARNET); + } } addn = GetArg("-seednode",""); diff --git a/src/init.cpp b/src/init.cpp index 2877dd288..652408036 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -146,7 +146,9 @@ std::atomic fRequestShutdown(false); void StartShutdown() { - fprintf(stderr,"%s: fRequestShudown=true\n", __FUNCTION__); + if(fDebug) { + fprintf(stderr,"%s: fRequestShudown=true\n", __FUNCTION__); + } fRequestShutdown = true; } bool ShutdownRequested() @@ -208,7 +210,9 @@ void Shutdown() RenameThread(shutoffstr); mempool.AddTransactionsUpdated(1); - fprintf(stderr,"%s: stopping HUSH HTTP/REST/RPC\n", __FUNCTION__); + if(fDebug) { + fprintf(stderr,"%s: stopping HUSH HTTP/REST/RPC\n", __FUNCTION__); + } StopHTTPRPC(); StopREST(); StopRPC(); @@ -225,7 +229,9 @@ void Shutdown() GenerateBitcoins(false, 0); #endif #endif - fprintf(stderr,"%s: stopping node\n", __FUNCTION__); + if(fDebug) { + fprintf(stderr,"%s: stopping node\n", __FUNCTION__); + } StopNode(); StopTorControl(); UnregisterNodeSignals(GetNodeSignals()); @@ -606,6 +612,7 @@ std::string HelpMessage(HelpMessageMode mode) strUsage += HelpMessageOpt("-ac_burn", _("Allow sending funds to the transparent burn address when -ac_private=1")); strUsage += HelpMessageOpt("-ac_minopreturnfee", _("OP_RETURN minimum fee per tx, regardless of tx size, default is 1 coin")); strUsage += HelpMessageOpt("-ac_coda", _("CODA integration")); + strUsage += HelpMessageOpt("-ac_clearnet", _("Enable or disable clearnet connections for the entire blockchain. Setting to 0 will disable clearnet and use sane defaults for Tor/i2p and require all nodes to do the same") + " " + strprintf(_("(default: %u)"), DEFAULT_CLEARNET)); strUsage += HelpMessageOpt("-ac_decay", _("Percentage of block reward decrease at each halving")); strUsage += HelpMessageOpt("-ac_end", _("Block height at which block rewards will end")); strUsage += HelpMessageOpt("-ac_eras", _("Block reward eras")); @@ -873,16 +880,6 @@ static void ZC_LoadParams(const CChainParams& chainparams) } } - if (!found) { - // This will only work when SDX is installed into /Applications, which is the only supported method - sapling_spend = boost::filesystem::path("/Applications/silentdragonx.app/Contents/MacOS") / "sapling-spend.params"; - sapling_output = boost::filesystem::path("/Applications/silentdragonx.app/Contents/MacOS") / "sapling-output.params"; - if (files_exist(sapling_spend, sapling_output)) { - LogPrintf("Found sapling params in /Applications/Contents/MacOS\n"); - found = true; - } - } - if (!found) { // SD DMG Support: Apple just has to do things differently... sapling_spend = boost::filesystem::path("./silentdragon.app/Contents/MacOS") / "sapling-spend.params"; @@ -893,16 +890,6 @@ static void ZC_LoadParams(const CChainParams& chainparams) } } - if (!found) { - // SDX DMG Support: Apple just has to do things differently... - sapling_spend = boost::filesystem::path("./silentdragonx.app/Contents/MacOS") / "sapling-spend.params"; - sapling_output = boost::filesystem::path("./silentdragonx.app/Contents/MacOS") / "sapling-output.params"; - if (files_exist(sapling_spend, sapling_output)) { - LogPrintf("Found sapling params in /Applications/Contents/MacOS\n"); - found = true; - } - } - if (!found) { // The traditional place Zcash params are stored, should not hit this case in normal circumstances, // as Hush packages sapling params now @@ -1184,17 +1171,9 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) if(fs::exists(asmap_path)) { printf("%s: found asmap file at %s\n", __func__, asmap_path.c_str() ); } else { - // Mac SDX - asmap_path = fs::path("/Applications/SilentDragonX.app/Contents/MacOS/") / DEFAULT_ASMAP_FILENAME; - printf("%s: looking for asmap file at %s\n", __func__, asmap_path.c_str() ); - if(fs::exists(asmap_path)) { - printf("%s: found asmap file at %s\n", __func__, asmap_path.c_str() ); - } - else { - // Shit is fucked up, die an honorable death - InitError(strprintf(_("Could not find any asmap file! Please report this bug to Hush Developers"))); - return false; - } + // Shit is fucked up, die an honorable death + InitError(strprintf(_("Could not find any asmap file! Please report this bug to Hush Developers"))); + return false; } } } @@ -1647,8 +1626,8 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) } //fprintf(stderr,"%s tik18\n", __FUNCTION__); - // Disable clearnet peers if -clearnet=0 - if (!GetBoolArg("-clearnet", DEFAULT_CLEARNET)) { + // Disable clearnet peers if -clearnet=0 for this node or -ac_clearnet=0 for this chain + if (ASSETCHAINS_CLEARNET == 0 || !GetBoolArg("-clearnet", DEFAULT_CLEARNET)) { #ifdef ENABLE_MINING // mining to the same taddr links different txs together as from the same owner // and if using -clearnet=0 that can be used to link together different .onions diff --git a/src/main.cpp b/src/main.cpp index ff3c3ea64..2ae864b3a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -116,7 +116,7 @@ extern char SMART_CHAIN_SYMBOL[HUSH_SMART_CHAIN_MAXLEN]; extern uint64_t ASSETCHAINS_ENDSUBSIDY[ASSETCHAINS_MAX_ERAS+1], ASSETCHAINS_REWARD[ASSETCHAINS_MAX_ERAS+1], ASSETCHAINS_HALVING[ASSETCHAINS_MAX_ERAS+1]; extern uint32_t ASSETCHAINS_MAGIC; extern uint64_t ASSETCHAINS_LINEAR,ASSETCHAINS_COMMISSION,ASSETCHAINS_SUPPLY; -extern uint8_t ASSETCHAINS_PUBLIC,ASSETCHAINS_PRIVATE; +extern uint8_t ASSETCHAINS_PUBLIC,ASSETCHAINS_PRIVATE,ASSETCHAINS_CLEARNET; extern int32_t ASSETCHAINS_STAKED; extern uint64_t ASSETCHAINS_CBOPRET; @@ -2688,7 +2688,7 @@ namespace Consensus { BOOST_FOREACH(const CTxOut& txout, tx.vout) { const bool isopret = txout.scriptPubKey.IsOpReturn(); - // HUSH+DRGX do not use -ac_minopreturnfee so this does not (yet) + // HUSH does not use -ac_minopreturnfee so this does not (yet) // affect those chains, they will need a height activated consensus // change diff --git a/src/net.cpp b/src/net.cpp index 4b52c796d..efac15c12 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -45,6 +45,7 @@ #include using namespace hush; extern int32_t HUSH_TESTNODE; +extern uint8_t ASSETCHAINS_CLEARNET; // Dump addresses to peers.dat every 5 minutes (300s) // Satoshi originally used 10 seconds(!), did they know something Peter Wuille didn't? @@ -1653,7 +1654,7 @@ int64_t PoissonNextSend(int64_t now, int average_interval_seconds) void ASMapHealthCheck() { // No health check if clearnet is disabled - if (!GetBoolArg("-clearnet", DEFAULT_CLEARNET)) { + if (ASSETCHAINS_CLEARNET == 0 || !GetBoolArg("-clearnet", DEFAULT_CLEARNET)) { return; } diff --git a/src/net.h b/src/net.h index 937f07ef1..fdc1984ce 100644 --- a/src/net.h +++ b/src/net.h @@ -51,7 +51,9 @@ #undef TFM_TIMING_RESISTANT #define ECC_TIMING_RESISTANT 420 #define TFM_TIMING_RESISTANT 420 +#define byte unsigned char #include +#undef byte class CAddrMan; class CBlockIndex; diff --git a/src/netaddress.cpp b/src/netaddress.cpp index 5d5a75739..9884376b3 100644 --- a/src/netaddress.cpp +++ b/src/netaddress.cpp @@ -28,7 +28,6 @@ #include constexpr uint64_t CNetAddr::V1_SERIALIZATION_SIZE; -constexpr uint64_t CNetAddr::MAX_ADDRV2_SIZE; /** check whether a given address is in a network we can probably connect to */ bool CNetAddr::IsReachableNetwork() { diff --git a/src/pow.cpp b/src/pow.cpp index 4aa00b094..0ba332b07 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -729,9 +729,6 @@ bool CheckProofOfWork(const CBlockHeader &blkHeader, uint8_t *pubkey33, int32_t if ( HUSH_LOADINGBLOCKS != 0 ) return true; - /* - if ( SMART_CHAIN_SYMBOL[0] != 0 || height > 792000 ) - { if ( Params().NetworkIDString() != "regtest" ) { for (i=31; i>=0; i--) @@ -748,8 +745,6 @@ bool CheckProofOfWork(const CBlockHeader &blkHeader, uint8_t *pubkey33, int32_t fprintf(stderr," <- origpubkey\n"); } return false; - } - */ } /*for (i=31; i>=0; i--) fprintf(stderr,"%02x",((uint8_t *)&hash)[i]); diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp index 5737a4e32..5f1394a80 100644 --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -639,12 +639,6 @@ UniValue getblockhash(const UniValue& params, bool fHelp, const CPubKey& mypk) return pblockindex->GetBlockHash().GetHex(); } -UniValue getlastsegidstakes(const UniValue& params, bool fHelp, const CPubKey& mypk) -{ - UniValue ret(UniValue::VOBJ); - return ret; -} - UniValue getblockheader(const UniValue& params, bool fHelp, const CPubKey& mypk) { if (fHelp || params.size() < 1 || params.size() > 2) @@ -1061,9 +1055,6 @@ UniValue notaries(const UniValue& params, bool fHelp, const CPubKey& mypk) return ret; } -int32_t hush_pending_withdraws(char *opretstr); -extern char CURRENCIES[][8]; - UniValue gettxout(const UniValue& params, bool fHelp, const CPubKey& mypk) { if (fHelp || params.size() < 2 || params.size() > 3) @@ -1344,6 +1335,12 @@ UniValue getblockchaininfo(const UniValue& params, bool fHelp, const CPubKey& my obj.push_back(Pair("pruneheight", block->GetHeight())); } + + // this helps our tests work correctly + if (Params().NetworkIDString() == "regtest") { + obj.pushKV("fullyNotified", ChainIsFullyNotified()); + } + return obj; } diff --git a/src/rpc/client.cpp b/src/rpc/client.cpp index 517f254c1..132362a88 100644 --- a/src/rpc/client.cpp +++ b/src/rpc/client.cpp @@ -90,10 +90,8 @@ static const CRPCConvertParam vRPCConvertParams[] = { "getblock", 1 }, { "getblockheader", 1 }, { "getchaintxstats", 0 }, - { "getlastsegidstakes", 0 }, { "gettransaction", 1 }, { "getrawtransaction", 1 }, - { "getlastsegidstakes", 0 }, { "createrawtransaction", 0 }, { "createrawtransaction", 1 }, { "createrawtransaction", 2 }, diff --git a/src/rpc/server.cpp b/src/rpc/server.cpp index d98332447..6d5a166b4 100644 --- a/src/rpc/server.cpp +++ b/src/rpc/server.cpp @@ -320,7 +320,6 @@ static const CRPCCommand vRPCCommands[] = { "blockchain", "getblockhashes", &getblockhashes, true }, { "blockchain", "getblockhash", &getblockhash, true }, { "blockchain", "getblockheader", &getblockheader, true }, - { "blockchain", "getlastsegidstakes", &getlastsegidstakes, true }, { "blockchain", "getchaintips", &getchaintips, true }, { "blockchain", "getdifficulty", &getdifficulty, true }, { "blockchain", "getmempoolinfo", &getmempoolinfo, true }, @@ -429,9 +428,7 @@ static const CRPCCommand vRPCCommands[] = { "wallet", "getaddressesbyaccount", &getaddressesbyaccount, true }, { "wallet", "cleanwallettransactions", &cleanwallettransactions, false }, { "wallet", "getbalance", &getbalance, false }, - { "wallet", "getbalance64", &getbalance64, false }, { "wallet", "getnewaddress", &getnewaddress, true }, -// { "wallet", "getnewaddress64", &getnewaddress64, true }, { "wallet", "getrawchangeaddress", &getrawchangeaddress, true }, { "wallet", "getreceivedbyaccount", &getreceivedbyaccount, false }, { "wallet", "getreceivedbyaddress", &getreceivedbyaddress, false }, @@ -462,6 +459,7 @@ static const CRPCCommand vRPCCommands[] = { "wallet", "walletlock", &walletlock, true }, { "wallet", "walletpassphrasechange", &walletpassphrasechange, true }, { "wallet", "walletpassphrase", &walletpassphrase, true }, + { "wallet", "z_listlockunspent", &z_listlockunspent, false }, { "wallet", "z_listreceivedbyaddress",&z_listreceivedbyaddress,false }, { "wallet", "z_listreceivedaddress", &z_listreceivedaddress, false }, { "wallet", "z_getbalance", &z_getbalance, false }, diff --git a/src/rpc/server.h b/src/rpc/server.h index 4f3577719..08c60fe16 100644 --- a/src/rpc/server.h +++ b/src/rpc/server.h @@ -245,7 +245,6 @@ extern UniValue cclibinfo(const UniValue& params, bool fHelp, const CPubKey& myp extern UniValue cclib(const UniValue& params, bool fHelp, const CPubKey& mypk); extern UniValue getnewaddress(const UniValue& params, bool fHelp, const CPubKey& mypk); // in rpcwallet.cpp -//extern UniValue getnewaddress64(const UniValue& params, bool fHelp, const CPubKey& mypk); // in rpcwallet.cpp extern UniValue getaccountaddress(const UniValue& params, bool fHelp, const CPubKey& mypk); extern UniValue getrawchangeaddress(const UniValue& params, bool fHelp, const CPubKey& mypk); extern UniValue setaccount(const UniValue& params, bool fHelp, const CPubKey& mypk); @@ -259,7 +258,6 @@ extern UniValue getreceivedbyaddress(const UniValue& params, bool fHelp, const C extern UniValue getreceivedbyaccount(const UniValue& params, bool fHelp, const CPubKey& mypk); extern UniValue cleanwallettransactions(const UniValue& params, bool fHelp, const CPubKey& mypk); extern UniValue getbalance(const UniValue& params, bool fHelp, const CPubKey& mypk); -extern UniValue getbalance64(const UniValue& params, bool fHelp, const CPubKey& mypk); extern UniValue getunconfirmedbalance(const UniValue& params, bool fHelp, const CPubKey& mypk); extern UniValue movecmd(const UniValue& params, bool fHelp, const CPubKey& mypk); extern UniValue sendfrom(const UniValue& params, bool fHelp, const CPubKey& mypk); @@ -286,7 +284,6 @@ extern UniValue getdragonjson(const UniValue& params, bool fHelp, const CPubKey& extern UniValue getnotarysendmany(const UniValue& params, bool fHelp, const CPubKey& mypk); extern UniValue geterablockheights(const UniValue& params, bool fHelp, const CPubKey& mypk); extern UniValue setpubkey(const UniValue& params, bool fHelp, const CPubKey& mypk); -extern UniValue setstakingsplit(const UniValue& params, bool fHelp, const CPubKey& mypk); extern UniValue getwalletinfo(const UniValue& params, bool fHelp, const CPubKey& mypk); extern UniValue getblockchaininfo(const UniValue& params, bool fHelp, const CPubKey& mypk); extern UniValue getnetworkinfo(const UniValue& params, bool fHelp, const CPubKey& mypk); @@ -297,6 +294,7 @@ extern UniValue getrawtransaction(const UniValue& params, bool fHelp, const CPub extern UniValue listunspent(const UniValue& params, bool fHelp, const CPubKey& mypk); extern UniValue lockunspent(const UniValue& params, bool fHelp, const CPubKey& mypk); extern UniValue listlockunspent(const UniValue& params, bool fHelp, const CPubKey& mypk); +extern UniValue z_listlockunspent(const UniValue& params, bool fHelp, const CPubKey& mypk); extern UniValue createrawtransaction(const UniValue& params, bool fHelp, const CPubKey& mypk); extern UniValue decoderawtransaction(const UniValue& params, bool fHelp, const CPubKey& mypk); extern UniValue decodescript(const UniValue& params, bool fHelp, const CPubKey& mypk); @@ -316,7 +314,6 @@ extern UniValue getblockhashes(const UniValue& params, bool fHelp, const CPubKey extern UniValue getblockdeltas(const UniValue& params, bool fHelp, const CPubKey& mypk); extern UniValue getblockhash(const UniValue& params, bool fHelp, const CPubKey& mypk); extern UniValue getblockheader(const UniValue& params, bool fHelp, const CPubKey& mypk); -extern UniValue getlastsegidstakes(const UniValue& params, bool fHelp, const CPubKey& mypk); extern UniValue getblock(const UniValue& params, bool fHelp, const CPubKey& mypk); extern UniValue gettxoutsetinfo(const UniValue& params, bool fHelp, const CPubKey& mypk); extern UniValue gettxout(const UniValue& params, bool fHelp, const CPubKey& mypk); diff --git a/src/test/sighash_tests.cpp b/src/test/sighash_tests.cpp index ed1a2dcca..354b50295 100644 --- a/src/test/sighash_tests.cpp +++ b/src/test/sighash_tests.cpp @@ -166,48 +166,6 @@ void static RandomTransaction(CMutableTransaction &tx, bool fSingle, uint32_t co tx.vShieldedOutput.push_back(odesc); } } - if (tx.nVersion >= 2) { - for (int js = 0; js < joinsplits; js++) { - JSDescription jsdesc; - if (insecure_rand() % 2 == 0) { - jsdesc.vpub_old = insecure_rand() % 100000000; - } else { - jsdesc.vpub_new = insecure_rand() % 100000000; - } - - jsdesc.anchor = GetRandHash(); - jsdesc.nullifiers[0] = GetRandHash(); - jsdesc.nullifiers[1] = GetRandHash(); - jsdesc.ephemeralKey = GetRandHash(); - jsdesc.randomSeed = GetRandHash(); - randombytes_buf(jsdesc.ciphertexts[0].begin(), jsdesc.ciphertexts[0].size()); - randombytes_buf(jsdesc.ciphertexts[1].begin(), jsdesc.ciphertexts[1].size()); - if (tx.fOverwintered && tx.nVersion >= SAPLING_TX_VERSION) { - libzcash::GrothProof zkproof; - randombytes_buf(zkproof.begin(), zkproof.size()); - jsdesc.proof = zkproof; - } else { - jsdesc.proof = libzcash::PHGRProof::random_invalid(); - } - jsdesc.macs[0] = GetRandHash(); - jsdesc.macs[1] = GetRandHash(); - - tx.vjoinsplit.push_back(jsdesc); - } - - unsigned char joinSplitPrivKey[crypto_sign_SECRETKEYBYTES]; - crypto_sign_keypair(tx.joinSplitPubKey.begin(), joinSplitPrivKey); - - // Empty output script. - CScript scriptCode; - CTransaction signTx(tx); - uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL, 0, consensusBranchId); - - assert(crypto_sign_detached(&tx.joinSplitSig[0], NULL, - dataToBeSigned.begin(), 32, - joinSplitPrivKey - ) == 0); - } } BOOST_FIXTURE_TEST_SUITE(sighash_tests, JoinSplitTestingSetup) diff --git a/src/test/transaction_tests.cpp b/src/test/transaction_tests.cpp index b5ac66255..74fb69739 100644 --- a/src/test/transaction_tests.cpp +++ b/src/test/transaction_tests.cpp @@ -464,136 +464,6 @@ void test_simple_sapling_invalidity(uint32_t consensusBranchId, CMutableTransact } } -void test_simple_joinsplit_invalidity(uint32_t consensusBranchId, CMutableTransaction tx) -{ - auto verifier = libzcash::ProofVerifier::Strict(); - { - // Ensure that empty vin/vout remain invalid without - // joinsplits. - CMutableTransaction newTx(tx); - CValidationState state; - - unsigned char joinSplitPrivKey[crypto_sign_SECRETKEYBYTES]; - crypto_sign_keypair(newTx.joinSplitPubKey.begin(), joinSplitPrivKey); - - // No joinsplits, vin and vout, means it should be invalid. - BOOST_CHECK(!CheckTransactionWithoutProofVerification(newTx, state)); - BOOST_CHECK(state.GetRejectReason() == "bad-txns-vin-empty"); - - newTx.vin.push_back(CTxIn(uint256S("0000000000000000000000000000000000000000000000000000000000000001"), 0)); - - BOOST_CHECK(!CheckTransactionWithoutProofVerification(newTx, state)); - BOOST_CHECK(state.GetRejectReason() == "bad-txns-vout-empty"); - - newTx.vjoinsplit.push_back(JSDescription()); - JSDescription *jsdesc = &newTx.vjoinsplit[0]; - - jsdesc->nullifiers[0] = GetRandHash(); - jsdesc->nullifiers[1] = GetRandHash(); - - BOOST_CHECK(CheckTransactionWithoutProofVerification(newTx, state)); - BOOST_CHECK(!ContextualCheckTransaction(0,newTx, state, 0, 100)); - BOOST_CHECK(state.GetRejectReason() == "bad-txns-invalid-joinsplit-signature"); - - // Empty output script. - CScript scriptCode; - CTransaction signTx(newTx); - uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL, 0, consensusBranchId); - - assert(crypto_sign_detached(&newTx.joinSplitSig[0], NULL, - dataToBeSigned.begin(), 32, - joinSplitPrivKey - ) == 0); - - BOOST_CHECK(CheckTransactionWithoutProofVerification(newTx, state)); - BOOST_CHECK(ContextualCheckTransaction(0,newTx, state, 0, 100)); - } - { - // Ensure that values within the joinsplit are well-formed. - CMutableTransaction newTx(tx); - CValidationState state; - - newTx.vjoinsplit.push_back(JSDescription()); - - JSDescription *jsdesc = &newTx.vjoinsplit[0]; - jsdesc->vpub_old = -1; - - BOOST_CHECK(!CheckTransaction(newTx, state, verifier)); - BOOST_CHECK(state.GetRejectReason() == "bad-txns-vpub_old-negative"); - - jsdesc->vpub_old = MAX_MONEY + 1; - - BOOST_CHECK(!CheckTransaction(newTx, state, verifier)); - BOOST_CHECK(state.GetRejectReason() == "bad-txns-vpub_old-toolarge"); - - jsdesc->vpub_old = 0; - jsdesc->vpub_new = -1; - - BOOST_CHECK(!CheckTransaction(newTx, state, verifier)); - BOOST_CHECK(state.GetRejectReason() == "bad-txns-vpub_new-negative"); - - jsdesc->vpub_new = MAX_MONEY + 1; - - BOOST_CHECK(!CheckTransaction(newTx, state, verifier)); - BOOST_CHECK(state.GetRejectReason() == "bad-txns-vpub_new-toolarge"); - - jsdesc->vpub_new = (MAX_MONEY / 2) + 10; - - newTx.vjoinsplit.push_back(JSDescription()); - - JSDescription *jsdesc2 = &newTx.vjoinsplit[1]; - jsdesc2->vpub_new = (MAX_MONEY / 2) + 10; - - BOOST_CHECK(!CheckTransaction(newTx, state, verifier)); - BOOST_CHECK(state.GetRejectReason() == "bad-txns-txintotal-toolarge"); - } - { - // Ensure that nullifiers are never duplicated within a transaction. - CMutableTransaction newTx(tx); - CValidationState state; - - newTx.vjoinsplit.push_back(JSDescription()); - JSDescription *jsdesc = &newTx.vjoinsplit[0]; - - jsdesc->nullifiers[0] = GetRandHash(); - jsdesc->nullifiers[1] = jsdesc->nullifiers[0]; - - BOOST_CHECK(!CheckTransaction(newTx, state, verifier)); - BOOST_CHECK(state.GetRejectReason() == "bad-joinsplits-nullifiers-duplicate"); - - jsdesc->nullifiers[1] = GetRandHash(); - - newTx.vjoinsplit.push_back(JSDescription()); - jsdesc = &newTx.vjoinsplit[0]; // Fixes #2026. Related PR #2078. - JSDescription *jsdesc2 = &newTx.vjoinsplit[1]; - - jsdesc2->nullifiers[0] = GetRandHash(); - jsdesc2->nullifiers[1] = jsdesc->nullifiers[0]; - - BOOST_CHECK(!CheckTransaction(newTx, state, verifier)); - BOOST_CHECK(state.GetRejectReason() == "bad-joinsplits-nullifiers-duplicate"); - } - { - // Ensure that coinbase transactions do not have joinsplits. - CMutableTransaction newTx(tx); - CValidationState state; - - newTx.vjoinsplit.push_back(JSDescription()); - JSDescription *jsdesc = &newTx.vjoinsplit[0]; - jsdesc->nullifiers[0] = GetRandHash(); - jsdesc->nullifiers[1] = GetRandHash(); - - newTx.vin.push_back(CTxIn(uint256(), -1)); - - { - CTransaction finalNewTx(newTx); - BOOST_CHECK(finalNewTx.IsCoinBase()); - } - BOOST_CHECK(!CheckTransaction(newTx, state, verifier)); - BOOST_CHECK(state.GetRejectReason() == "bad-cb-has-joinsplits"); - } -} - BOOST_AUTO_TEST_CASE(test_simple_joinsplit_invalidity_driver) { { CMutableTransaction mtx; diff --git a/src/testdragonx-cli b/src/testdragonx-cli deleted file mode 100755 index 3c3539d58..000000000 --- a/src/testdragonx-cli +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash -# Copyright 2016-2024 The Hush Developers -# Copyright 2022 The DragonX Developers -# Released under the GPLv3 - -# set working directory to the location of this script -# readlink -f does not always exist -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -cd $DIR -DIR="$( cd "$( dirname "$( readlink "${BASH_SOURCE[0]}" )" )" && pwd )" -cd $DIR - -./hush-cli -ac_name=TESTDRAGONX $@ diff --git a/src/testdragonxd b/src/testdragonxd deleted file mode 100755 index 953ffd4ae..000000000 --- a/src/testdragonxd +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash -# Copyright 2016-2024 The Hush Developers -# Copyright 2022 The DragonX Developers -# Released under the GPLv3 - -# set working directory to the location of this script -# readlink -f does not always exist -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -cd $DIR -DIR="$( cd "$( dirname "$( readlink "${BASH_SOURCE[0]}" )" )" && pwd )" -cd $DIR - -BLOCKTIME=18 -SUPPLY=0 - -# Remember Remember the 5th November for freedom of speech is not free!! -./hush-arrakis-chain -ac_name=TESTDRAGONX -ac_algo=randomx -ac_halving=3500000 -ac_reward=300000000 -ac_blocktime=$BLOCKTIME -ac_private=1 -ac_supply=$SUPPLY -debug=randomx $@ diff --git a/src/testequihash-cli b/src/testequihash-cli deleted file mode 100755 index 21910a5f6..000000000 --- a/src/testequihash-cli +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash -# Copyright 2016-2024 The Hush Developers -# Copyright 2022 The DragonX Developers -# Released under the GPLv3 - -# set working directory to the location of this script -# readlink -f does not always exist -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -cd $DIR -DIR="$( cd "$( dirname "$( readlink "${BASH_SOURCE[0]}" )" )" && pwd )" -cd $DIR - -./hush-cli -ac_name=TESTEQUIHASH $@ diff --git a/src/testequihashd b/src/testequihashd deleted file mode 100755 index 5e46cddc1..000000000 --- a/src/testequihashd +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash -# Copyright 2016-2024 The Hush Developers -# Copyright 2022 The DragonX Developers -# Released under the GPLv3 - -# set working directory to the location of this script -# readlink -f does not always exist -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -cd $DIR -DIR="$( cd "$( dirname "$( readlink "${BASH_SOURCE[0]}" )" )" && pwd )" -cd $DIR - -BLOCKTIME=18 -SUPPLY=0 - -# same as TESTDRAGONX except equihash and different ac_name -# and debug=pow which is the equivalent of debug=randomx for equihash mining -./hush-arrakis-chain -ac_name=TESTEQUIHASH -ac_halving=3500000 -ac_reward=300000000 -ac_blocktime=$BLOCKTIME -ac_private=1 -ac_supply=$SUPPLY -debug=pow $@ diff --git a/src/transaction_builder.cpp b/src/transaction_builder.cpp index 76ba42302..10f2383e5 100644 --- a/src/transaction_builder.cpp +++ b/src/transaction_builder.cpp @@ -54,6 +54,9 @@ void TransactionBuilder::AddSaplingOutput( CAmount value, std::array memo) { + if(fZdebug) { + LogPrintf("%s: adding output with value=%ld\n", __func__, value); + } auto note = libzcash::SaplingNote(to, value); outputs.emplace_back(ovk, note, memo); mtx.valueBalance -= value; @@ -150,7 +153,7 @@ boost::optional TransactionBuilder::Build() change -= tOut.nValue; } if (change < 0) { - LogPrintf("%s: negative change!\n", __func__); + LogPrintf("%s: negative change=%lu mtx.valueBalance=%lu fee=%lu!\n", __func__, change, mtx.valueBalance, fee); return boost::none; } diff --git a/src/txdb.cpp b/src/txdb.cpp index 6a6f7c086..4d402d072 100644 --- a/src/txdb.cpp +++ b/src/txdb.cpp @@ -271,13 +271,13 @@ bool CCoinsViewDB::GetStats(CCoinsStats &stats) const { bool CBlockTreeDB::WriteBatchSync(const std::vector >& fileInfo, int nLastFile, const std::vector& blockinfo) { CDBBatch batch(*this); - if (fZdebug) + if (fDebug) fprintf(stderr, "%s: Writing block files\n", __FUNCTION__); for (const auto& it : fileInfo) { batch.Write(make_pair(DB_BLOCK_FILES, it.first), *it.second); } batch.Write(DB_LAST_BLOCK, nLastFile); - if (fZdebug) + if (fDebug) fprintf(stderr, "%s: Writing block index\n", __FUNCTION__); for (const auto& it : blockinfo) { std::pair key = make_pair(DB_BLOCK_INDEX, it->GetBlockHash()); diff --git a/src/version.h b/src/version.h index 27553d45d..0381ff1c2 100644 --- a/src/version.h +++ b/src/version.h @@ -1,5 +1,5 @@ // Copyright (c) 2012-2014 The Bitcoin Core developers -// Copyright (c) 2016-2025 The Hush developers +// Copyright (c) 2016-2026 The Hush developers // Distributed under the GPLv3 software license, see the accompanying // file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html /****************************************************************************** @@ -21,7 +21,7 @@ #define HUSH_VERSION_H // network protocol versioning -static const int PROTOCOL_VERSION = 1987428; +static const int PROTOCOL_VERSION = 1987429; //! initial proto version, to be increased after version/verack negotiation static const int INIT_PROTO_VERSION = 209; //! In this version, 'getheaders' was introduced. diff --git a/src/wallet/asyncrpcoperation_mergetoaddress.cpp b/src/wallet/asyncrpcoperation_mergetoaddress.cpp index e09068ac4..6c8975b23 100644 --- a/src/wallet/asyncrpcoperation_mergetoaddress.cpp +++ b/src/wallet/asyncrpcoperation_mergetoaddress.cpp @@ -53,13 +53,13 @@ using namespace libzcash; extern UniValue sendrawtransaction(const UniValue& params, bool fHelp, const CPubKey& mypk); AsyncRPCOperation_mergetoaddress::AsyncRPCOperation_mergetoaddress( - boost::optional builder, - CMutableTransaction contextualTx, - std::vector utxoInputs, - std::vector saplingNoteInputs, - MergeToAddressRecipient recipient, - CAmount fee, - UniValue contextInfo) : + boost::optional builder, + CMutableTransaction contextualTx, + std::vector utxoInputs, + std::vector saplingNoteInputs, + MergeToAddressRecipient recipient, + CAmount fee, + UniValue contextInfo) : tx_(contextualTx), utxoInputs_(utxoInputs), saplingNoteInputs_(saplingNoteInputs), recipient_(recipient), fee_(fee), contextinfo_(contextInfo) { if (fee < 0 || fee > MAX_MONEY) { @@ -182,7 +182,6 @@ void AsyncRPCOperation_mergetoaddress::main() // Notes: // 1. #1359 Currently there is no limit set on the number of inputs+outputs, so size of tx could be invalid. -// 2. #1277 Spendable notes are not locked, so an operation running in parallel could also try to use them. bool AsyncRPCOperation_mergetoaddress::main_impl() { assert(isToTaddr_ != isToZaddr_); @@ -192,22 +191,6 @@ bool AsyncRPCOperation_mergetoaddress::main_impl() size_t numInputs = utxoInputs_.size(); - /* - // Check mempooltxinputlimit to avoid creating a transaction which the local mempool rejects - size_t limit = (size_t)GetArg("-mempooltxinputlimit", 0); - { - LOCK(cs_main); - if (NetworkUpgradeActive(chainActive.Height() + 1, Params().GetConsensus(), Consensus::UPGRADE_OVERWINTER)) { - limit = 0; - } - } - if (limit > 0 && numInputs > limit) { - throw JSONRPCError(RPC_WALLET_ERROR, - strprintf("Number of transparent inputs %d is greater than mempooltxinputlimit of %d", - numInputs, limit)); - } - */ - CAmount t_inputs_total = 0; for (MergeToAddressInputUTXO& t : utxoInputs_) { t_inputs_total += std::get<1>(t); diff --git a/src/wallet/asyncrpcoperation_mergetoaddress.h b/src/wallet/asyncrpcoperation_mergetoaddress.h index f4360e13c..b70eeb98f 100644 --- a/src/wallet/asyncrpcoperation_mergetoaddress.h +++ b/src/wallet/asyncrpcoperation_mergetoaddress.h @@ -1,6 +1,5 @@ // Copyright (c) 2017 The Zcash developers // Copyright (c) 2016-2024 The Hush developers - // Distributed under the GPLv3 software license, see the accompanying // file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html @@ -28,12 +27,9 @@ #include "transaction_builder.h" #include "wallet.h" #include "zcash/Address.hpp" -#include "zcash/JoinSplit.hpp" - #include #include #include - #include // Default transaction fee if caller does not specify one. @@ -90,9 +86,6 @@ private: CTxDestination toTaddr_; PaymentAddress toPaymentAddress_; - uint256 joinSplitPubKey_; - unsigned char joinSplitPrivKey_[crypto_sign_SECRETKEYBYTES]; - std::vector utxoInputs_; std::vector saplingNoteInputs_; diff --git a/src/wallet/asyncrpcoperation_saplingconsolidation.cpp b/src/wallet/asyncrpcoperation_saplingconsolidation.cpp index 41455d360..755564492 100644 --- a/src/wallet/asyncrpcoperation_saplingconsolidation.cpp +++ b/src/wallet/asyncrpcoperation_saplingconsolidation.cpp @@ -74,6 +74,8 @@ void AsyncRPCOperation_saplingconsolidation::main() { } LogPrintf("%s", s); + unlock_notes(); // clean up + LogPrint("zrpc", "%s: consolidation input notes unlocked\n", getId()); } bool AsyncRPCOperation_saplingconsolidation::main_impl() { @@ -102,6 +104,11 @@ bool AsyncRPCOperation_saplingconsolidation::main_impl() { return true; } + // store sapling inputs so we can correctly lock and unlock them + for (auto entry : saplingEntries) { + z_sapling_inputs_.push_back(entry); + } + if (fConsolidationMapUsed) { const vector& v = mapMultiArgs["-consolidatesaplingaddress"]; for(int i = 0; i < v.size(); i++) { @@ -233,6 +240,10 @@ bool AsyncRPCOperation_saplingconsolidation::main_impl() { break; } + // Lock shielded input notes + lock_notes(); + LogPrint("zrpc", "%s: consolidation input notes locked\n", getId()); + if(pwalletMain->CommitAutomatedTx(tx)) { LogPrintf("%s: Committed consolidation transaction with txid=%s\n",opid, tx.GetHash().ToString()); amountConsolidated += actualAmountToSend; @@ -240,10 +251,15 @@ bool AsyncRPCOperation_saplingconsolidation::main_impl() { numTxCreated++; } else { LogPrintf("%s: Consolidation transaction FAILED in CommitTransaction, txid=%s\n",opid , tx.GetHash().ToString()); + + unlock_notes(); + LogPrint("zrpc", "%s: consolidatoin input notes unlocked\n", getId()); + setConsolidationResult(numTxCreated, amountConsolidated, consolidationTxIds); status = false; break; } + } } @@ -275,3 +291,19 @@ UniValue AsyncRPCOperation_saplingconsolidation::getStatus() const { obj.push_back(Pair("target_height", targetHeight_)); return obj; } + +// Lock input notes +void AsyncRPCOperation_saplingconsolidation::lock_notes() { + LOCK2(cs_main, pwalletMain->cs_wallet); + for (auto note : z_sapling_inputs_) { + pwalletMain->LockNote(note.op); + } +} + +// Unlock input notes +void AsyncRPCOperation_saplingconsolidation::unlock_notes() { + LOCK2(cs_main, pwalletMain->cs_wallet); + for (auto note : z_sapling_inputs_) { + pwalletMain->UnlockNote(note.op); + } +} diff --git a/src/wallet/asyncrpcoperation_saplingconsolidation.h b/src/wallet/asyncrpcoperation_saplingconsolidation.h index 4cc370431..675a56ad7 100644 --- a/src/wallet/asyncrpcoperation_saplingconsolidation.h +++ b/src/wallet/asyncrpcoperation_saplingconsolidation.h @@ -8,6 +8,7 @@ #include "univalue.h" #include "zcash/Address.hpp" #include "zcash/zip32.h" +#include "wallet.h" // for SaplingNoteEntry //Default fee used for consolidation transactions, in puposhis static const CAmount DEFAULT_CONSOLIDATION_FEE = 10000; @@ -32,10 +33,14 @@ public: virtual UniValue getStatus() const; + void lock_notes(); + void unlock_notes(); + private: int targetHeight_; bool main_impl(); + std::vector z_sapling_inputs_; void setConsolidationResult(int numTxCreated, const CAmount& amountConsolidated, const std::vector& consolidationTxIds); diff --git a/src/wallet/asyncrpcoperation_sendmany.cpp b/src/wallet/asyncrpcoperation_sendmany.cpp index 311fc217c..f2a698d05 100644 --- a/src/wallet/asyncrpcoperation_sendmany.cpp +++ b/src/wallet/asyncrpcoperation_sendmany.cpp @@ -63,11 +63,12 @@ AsyncRPCOperation_sendmany::AsyncRPCOperation_sendmany( std::string fromAddress, std::vector tOutputs, std::vector zOutputs, + std::vector saplingNoteInputs, int minDepth, CAmount fee, UniValue contextInfo, CScript opret) : - tx_(contextualTx), fromaddress_(fromAddress), t_outputs_(tOutputs), z_outputs_(zOutputs), mindepth_(minDepth), fee_(fee), contextinfo_(contextInfo), opret_(opret) + tx_(contextualTx), fromaddress_(fromAddress), t_outputs_(tOutputs), z_outputs_(zOutputs), saplingNoteInputs_(saplingNoteInputs), mindepth_(minDepth), fee_(fee), contextinfo_(contextInfo), opret_(opret) { assert(fee_ >= 0); @@ -119,14 +120,25 @@ AsyncRPCOperation_sendmany::AsyncRPCOperation_sendmany( } else { LogPrint("zrpc", "%s: z_sendmany initialized\n", getId()); } + + //TODO: lock_utxos() ? + // Lock shielded input notes (zins) stored in saplingNoteInputs + lock_notes(); + LogPrintf("%s: %s z_sendmany input notes locked\n", __func__, getId()); } AsyncRPCOperation_sendmany::~AsyncRPCOperation_sendmany() { } void AsyncRPCOperation_sendmany::main() { - if (isCancelled()) + + // clean up locks if we are cancelled + if (isCancelled()) { + // We are more likely to be spending notes, so unlock them first + unlock_notes(); + unlock_utxos(); return; + } set_state(OperationStatus::EXECUTING); start_execution_clock(); @@ -162,6 +174,10 @@ void AsyncRPCOperation_sendmany::main() { set_error_message("unknown error"); } + unlock_notes(); + unlock_utxos(); + LogPrintf("%s: %s z_sendmany input notes+utxos unlocked\n", __func__, getId()); + #ifdef ENABLE_MINING #ifdef ENABLE_WALLET GenerateBitcoins(GetBoolArg("-gen",false), pwalletMain, GetArg("-genproclimit", 1)); @@ -172,6 +188,7 @@ void AsyncRPCOperation_sendmany::main() { stop_execution_clock(); + if (success) { set_state(OperationStatus::SUCCESS); } else { @@ -185,22 +202,14 @@ void AsyncRPCOperation_sendmany::main() { s += strprintf(", error=%s)\n", getErrorMessage()); } LogPrintf("%s",s); + } // Notes: -// 1. #1159 Currently there is no limit set on the number of shielded spends, so size of tx could be invalid. -// 2. #1360 Note selection is not optimal -// 3. #1277 Spendable notes are not locked, so an operation running in parallel could also try to use them +// 1. Currently there is no limit set on the number of shielded spends, so size of tx could be invalid. bool AsyncRPCOperation_sendmany::main_impl() { - assert(isfromtaddr_ != isfromzaddr_); - /* TODO: this needs to allow DPoW addresses. Consensus-time checks do it correctly. - if(t_outputs_.size() > 0) { - throw JSONRPCError(RPC_WALLET_ERROR, "Extreme Privacy! You cannot send to a transparent address."); - } - */ - bool isSingleZaddrOutput = (t_outputs_.size()==0 && z_outputs_.size()==1); bool isMultipleZaddrOutput = (t_outputs_.size()==0 && z_outputs_.size()>=1); bool isPureTaddrOnlyTx = (isfromtaddr_ && z_outputs_.size() == 0); @@ -227,9 +236,8 @@ bool AsyncRPCOperation_sendmany::main_impl() { } } - if (isfromzaddr_ && !find_unspent_notes()) { - throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, "Insufficient funds, no unspent notes found for zaddr from address."); - } + // Lock UTXOs + lock_utxos(); CAmount t_inputs_total = 0; for (SendManyInputUTXO & t : t_inputs_) { @@ -237,8 +245,8 @@ bool AsyncRPCOperation_sendmany::main_impl() { } CAmount z_inputs_total = 0; - for (auto t : z_sapling_inputs_) { - z_inputs_total += t.note.value(); + for (auto t : saplingNoteInputs_) { + z_inputs_total += std::get<1>(t).value(); } CAmount t_outputs_total = 0; @@ -252,8 +260,11 @@ bool AsyncRPCOperation_sendmany::main_impl() { z_outputs_total += std::get<1>(t); } + LogPrintf("%s: z_inputs_total=%s z_outputs_total=%s\n", __func__, FormatMoney(z_inputs_total), FormatMoney(z_outputs_total) ); + CAmount sendAmount = z_outputs_total + t_outputs_total; CAmount targetAmount = sendAmount + minersFee; + LogPrintf("%s: targetAmount=%s sendAmount=%s minersFee=%s\n", __func__, FormatMoney(targetAmount), FormatMoney(sendAmount), FormatMoney(minersFee) ); assert(!isfromtaddr_ || z_inputs_total == 0); assert(!isfromzaddr_ || t_inputs_total == 0); @@ -309,23 +320,6 @@ bool AsyncRPCOperation_sendmany::main_impl() { t_inputs_ = selectedTInputs; t_inputs_total = selectedUTXOAmount; - /* - // Check mempooltxinputlimit to avoid creating a transaction which the local mempool rejects - const size_t limit = (size_t)GetArg("-mempooltxinputlimit", 0); - { - LOCK(cs_main); - if (NetworkUpgradeActive(chainActive.Height() + 1, Params().GetConsensus(), Consensus::UPGRADE_OVERWINTER)) { - limit = 0; - } - } - if (limit > 0) { - size_t n = t_inputs_.size(); - if (n > limit) { - throw JSONRPCError(RPC_WALLET_ERROR, strprintf("Too many transparent inputs %zu > limit %zu", n, limit)); - } - } - */ - // update the transaction with these inputs if (isUsingBuilder_) { CScript scriptPubKey; @@ -415,15 +409,10 @@ bool AsyncRPCOperation_sendmany::main_impl() { if(fZdebug) LogPrintf("%s: Selecting Sapling notes\n", __FUNCTION__); std::vector ops; - std::vector notes; CAmount sum = 0; - for (auto t : z_sapling_inputs_) { - ops.push_back(t.op); - notes.push_back(t.note); - sum += t.note.value(); - if (sum >= targetAmount) { - break; - } + + for(const auto t : saplingNoteInputs_) { + ops.push_back(std::get<0>(t)); } // Fetch Sapling anchor and witnesses @@ -435,14 +424,19 @@ bool AsyncRPCOperation_sendmany::main_impl() { pwalletMain->GetSaplingNoteWitnesses(ops, witnesses, anchor); } + LogPrintf("%s: ops.size=%d witnesses.size=%d\n", __func__, ops.size(), witnesses.size() ); + // Add Sapling spends - for (size_t i = 0; i < notes.size(); i++) { - if (!witnesses[i]) { + for (size_t i = 0; i < saplingNoteInputs_.size(); i++) { + if (!witnesses.at(i)) { throw JSONRPCError(RPC_WALLET_ERROR, - strprintf( "Missing witness for Sapling note at outpoint %s", z_sapling_inputs_[i].op.ToString()) + strprintf( "Missing witness for Sapling note at outpoint %s", std::get<0>(saplingNoteInputs_[i]).ToString()) ); } - assert(builder_.AddSaplingSpend(expsk, notes[i], anchor, witnesses[i].get())); + if(fZdebug) + LogPrintf("%s: Adding Sapling spend\n", __func__); + + assert(builder_.AddSaplingSpend(expsk, std::get<1>(saplingNoteInputs_[i]), anchor, witnesses[i].get())); } // Add Sapling outputs @@ -454,7 +448,7 @@ bool AsyncRPCOperation_sendmany::main_impl() { assert(boost::get(&addr) != nullptr); auto to = boost::get(addr); if(fZdebug) - LogPrintf("%s: Adding Sapling output to address %s\n", __FUNCTION__, address.c_str()); + LogPrintf("%s: Adding Sapling output with value=%s to address %s\n", __func__, FormatMoney(value), address.c_str()); auto memo = get_memo_from_hex_string(hexMemo); @@ -488,6 +482,7 @@ bool AsyncRPCOperation_sendmany::main_impl() { // Send the transaction // TODO: Use CWallet::CommitTransaction instead of sendrawtransaction auto signedtxn = EncodeHexTx(tx_); + if (!testmode) { UniValue params = UniValue(UniValue::VARR); params.push_back(signedtxn); @@ -659,37 +654,6 @@ bool AsyncRPCOperation_sendmany::find_utxos(bool fAcceptCoinbase=false) { return t_inputs_.size() > 0; } - -bool AsyncRPCOperation_sendmany::find_unspent_notes() { - if(fZdebug) - LogPrintf("%s: For address %s depth=%d\n", __FUNCTION__, fromaddress_.c_str(), mindepth_); - - std::vector saplingEntries; - { - LOCK2(cs_main, pwalletMain->cs_wallet); - pwalletMain->GetFilteredNotes(saplingEntries, fromaddress_, mindepth_); - } - - for (auto entry : saplingEntries) { - z_sapling_inputs_.push_back(entry); - std::string data(entry.memo.begin(), entry.memo.end()); - LogPrint("zrpcunsafe", "%s: found unspent Sapling note (txid=%s, vShieldedSpend=%d, amount=%s, memo=%s)\n", - getId(), - entry.op.hash.ToString().substr(0, 10), - entry.op.n, - FormatMoney(entry.note.value()), - HexStr(data).substr(0, 10)); - } - - // sort in descending order, so big notes appear first - std::sort(z_sapling_inputs_.begin(), z_sapling_inputs_.end(), - [](SaplingNoteEntry i, SaplingNoteEntry j) -> bool { - return i.note.value() > j.note.value(); - }); - - return true; -} - void AsyncRPCOperation_sendmany::add_taddr_outputs_to_tx() { CMutableTransaction rawTx(tx_); @@ -781,3 +745,53 @@ UniValue AsyncRPCOperation_sendmany::getStatus() const { obj.push_back(Pair("params", contextinfo_ )); return obj; } + +// Lock input utxos + void AsyncRPCOperation_sendmany::lock_utxos() { + LOCK2(cs_main, pwalletMain->cs_wallet); + for (auto utxo : t_inputs_) { + uint256 txid = std::get<0>(utxo); + int vout = std::get<1>(utxo); + + COutPoint outpt(txid, vout); + pwalletMain->LockCoin(outpt); + } +} + +// Unlock input utxos +void AsyncRPCOperation_sendmany::unlock_utxos() { + LOCK2(cs_main, pwalletMain->cs_wallet); + for (auto utxo : t_inputs_) { + uint256 txid = std::get<0>(utxo); + int vout = std::get<1>(utxo); + + COutPoint outpt(txid, vout); + pwalletMain->UnlockCoin(outpt); + } +} + +// Lock input notes +void AsyncRPCOperation_sendmany::lock_notes() { + LOCK2(cs_main, pwalletMain->cs_wallet); + LogPrintf("%s: found %lu notes to lock\n", __func__, saplingNoteInputs_.size() ); + for (auto note : saplingNoteInputs_) { + if(pwalletMain->IsLockedNote(std::get<0>(note))) { + LogPrintf("%s: note already locked!\n", __func__); + } else { + pwalletMain->LockNote(std::get<0>(note)); + } + } +} + +// Unlock input notes +void AsyncRPCOperation_sendmany::unlock_notes() { + LOCK2(cs_main, pwalletMain->cs_wallet); + LogPrintf("%s: found %lu notes to unlock\n", __func__, saplingNoteInputs_.size() ); + for (auto note : saplingNoteInputs_) { + if(pwalletMain->IsLockedNote(std::get<0>(note))) { + pwalletMain->UnlockNote(std::get<0>(note)); + } else { + LogPrintf("%s: note already unlocked!\n", __func__); + } + } +} diff --git a/src/wallet/asyncrpcoperation_sendmany.h b/src/wallet/asyncrpcoperation_sendmany.h index 340c0c4cb..2d06b0c48 100644 --- a/src/wallet/asyncrpcoperation_sendmany.h +++ b/src/wallet/asyncrpcoperation_sendmany.h @@ -25,14 +25,11 @@ #include "amount.h" #include "primitives/transaction.h" #include "transaction_builder.h" -#include "zcash/JoinSplit.hpp" #include "zcash/Address.hpp" #include "wallet.h" - #include #include #include - #include // Default transaction fee if caller does not specify one. @@ -46,11 +43,8 @@ typedef std::tuple SendManyRecipient; // Input UTXO is a tuple (quadruple) of txid, vout, amount, coinbase) typedef std::tuple SendManyInputUTXO; -// A struct to help us track the witness and anchor for a given JSOutPoint -struct WitnessAnchorData { - boost::optional witness; - uint256 anchor; -}; +// Input note is a tuple of output, note, amount, spending key +typedef std::tuple SendManyInputSaplingNote; class AsyncRPCOperation_sendmany : public AsyncRPCOperation { public: @@ -60,6 +54,7 @@ public: std::string fromAddress, std::vector tOutputs, std::vector zOutputs, + std::vector saplingNoteInputs, int minDepth, CAmount fee = ASYNC_RPC_OPERATION_DEFAULT_MINERS_FEE, UniValue contextInfo = NullUniValue, @@ -96,17 +91,11 @@ private: SpendingKey spendingkey_; CScript opret_ = CScript(); - uint256 joinSplitPubKey_; - unsigned char joinSplitPrivKey_[crypto_sign_SECRETKEYBYTES]; - - // The key is the result string from calling JSOutPoint::ToString() - std::unordered_map jsopWitnessAnchorMap; - std::vector t_outputs_; std::vector z_outputs_; std::vector t_inputs_; - //std::vector z_sprout_inputs_; - std::vector z_sapling_inputs_; + //std::vector z_sapling_inputs_; + std::vector saplingNoteInputs_; TransactionBuilder builder_; CTransaction tx_; @@ -119,6 +108,11 @@ private: bool main_impl(); void sign_send_raw_transaction(UniValue obj); // throws exception if there was an error + + void lock_utxos(); + void unlock_utxos(); + void lock_notes(); + void unlock_notes(); }; @@ -172,6 +166,4 @@ public: } }; - #endif /* ASYNCRPCOPERATION_SENDMANY_H */ - diff --git a/src/wallet/asyncrpcoperation_shieldcoinbase.cpp b/src/wallet/asyncrpcoperation_shieldcoinbase.cpp index 57113f930..46cf1ffd9 100644 --- a/src/wallet/asyncrpcoperation_shieldcoinbase.cpp +++ b/src/wallet/asyncrpcoperation_shieldcoinbase.cpp @@ -54,8 +54,9 @@ AsyncRPCOperation_shieldcoinbase::AsyncRPCOperation_shieldcoinbase( std::vector inputs, std::string toAddress, CAmount fee, + uint8_t donation, UniValue contextInfo) : - builder_(builder), tx_(contextualTx), inputs_(inputs), fee_(fee), contextinfo_(contextInfo) + builder_(builder), tx_(contextualTx), inputs_(inputs), fee_(fee), donation_(donation), contextinfo_(contextInfo) { assert(contextualTx.nVersion >= 2); // transaction format version must support vjoinsplit @@ -67,6 +68,10 @@ AsyncRPCOperation_shieldcoinbase::AsyncRPCOperation_shieldcoinbase( throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, "Empty inputs"); } + if (donation < 0 || donation > 10 ) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid donation percentage, must be an integer between 0 and 10 inclusive"); + } + // Check the destination address is valid for this network i.e. not testnet being used on mainnet auto address = DecodePaymentAddress(toAddress); if (IsValidPaymentAddress(address)) { @@ -161,24 +166,7 @@ void AsyncRPCOperation_shieldcoinbase::main() { bool AsyncRPCOperation_shieldcoinbase::main_impl() { CAmount minersFee = fee_; - - size_t numInputs = inputs_.size(); - - /* - // Check mempooltxinputlimit to avoid creating a transaction which the local mempool rejects - size_t limit = (size_t)GetArg("-mempooltxinputlimit", 0); - { - LOCK(cs_main); - if (NetworkUpgradeActive(chainActive.Height() + 1, Params().GetConsensus(), Consensus::UPGRADE_OVERWINTER)) { - limit = 0; - } - } - if (limit>0 && numInputs > limit) { - throw JSONRPCError(RPC_WALLET_ERROR, - strprintf("Number of inputs %d is greater than mempooltxinputlimit of %d", - numInputs, limit)); - } - */ + size_t numInputs = inputs_.size(); CAmount targetAmount = 0; for (ShieldCoinbaseUTXO & utxo : inputs_) { @@ -192,10 +180,10 @@ bool AsyncRPCOperation_shieldcoinbase::main_impl() { } CAmount sendAmount = targetAmount - minersFee; - LogPrint("zrpc", "%s: spending %s to shield %s with fee %s\n", - getId(), FormatMoney(targetAmount), FormatMoney(sendAmount), FormatMoney(minersFee)); + LogPrint("zrpc", "%s: spending %s to shield %s with fee %s, donation=%d\n", + getId(), FormatMoney(targetAmount), FormatMoney(sendAmount), FormatMoney(minersFee), donation_); - return boost::apply_visitor(ShieldToAddress(this, sendAmount), tozaddr_); + return boost::apply_visitor(ShieldToAddress(this, sendAmount, donation_), tozaddr_); } extern UniValue signrawtransaction(const UniValue& params, bool fHelp, const CPubKey& mypk); @@ -228,20 +216,59 @@ bool ShieldToAddress::operator()(const libzcash::SaplingPaymentAddress &zaddr) c m_op->builder_.AddTransparentInput(COutPoint(t.txid, t.vout), t.scriptPubKey, t.amount); } } + if(donation) { + //if donation>0, send X% of value to zaddr and Y% of of value to donatezaddr where X+Y=100% - // Send all value to the target z-addr - m_op->builder_.SendChangeTo(zaddr, ovk); + auto dzaddr = ""; + if(Params().NetworkIDString() == "regtest") { + dzaddr = "zregtestsapling1y30nwg0clsu6gcyrnvht8hdyfk3vwtszlh6kc4z5hv9hmpxzg2g0nx7c60xeecggm9x9gma96t4"; + } else { + //TODO: randomly select from a set + dzaddr = "zs1uhmry4jjaymhh2x7x53fkahp57u60qr54ydtcd6c2nzu73lgm78a4kml2x7ylm547hu2qqtsnw5"; + } + auto donationZaddr = DecodePaymentAddress(dzaddr); + if (!IsValidPaymentAddress(donationZaddr)) { + throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid donation zaddr, Unknown address format: ") + dzaddr); + } + + // calculate donation as a double then convert to CAmount + double amount = (static_cast(donation)/100)*static_cast(sendAmount); + CAmount donationAmount = static_cast(amount); + + // add original recipient as first output, with sendAmount less the donation + CAmount newAmount = sendAmount - donationAmount; + m_op->builder_.AddSaplingOutput(ovk, zaddr, newAmount); + + auto donationZout = boost::get(donationZaddr); + m_op->builder_.AddSaplingOutput(ovk, donationZout, donationAmount); + + if(fZdebug) { + LogPrintf("%s: donation=%ld, sendAmount=%ld, newAmount=%ld, donationAmount=%ld, newAmount+donationAmount=%ld fee=%ld\n", __func__, + donation, sendAmount, newAmount, donationAmount, newAmount+donationAmount, m_op->fee_); + } + + // zdust as third output, so donation txs are indistinguishable from + // non-donation z_shieldcoinbase txs + auto zdust1 = DecodePaymentAddress(randomSietchZaddr()); + auto sietchZout1 = boost::get(zdust1); + m_op->builder_.AddSaplingOutput(ovk, sietchZout1, 0); + + } else { + // Send all value to the target z-addr + m_op->builder_.SendChangeTo(zaddr, ovk); + + // Sietchified Shielding of Coinbase Funds + // Add Sietch zouts so it's unclear which zout contains value :) + // This reduces metadata leakage of coinbase t=>z tx's + CAmount amount = 0; + auto zdust1 = DecodePaymentAddress(randomSietchZaddr()); + auto zdust2 = DecodePaymentAddress(randomSietchZaddr()); + auto sietchZout1 = boost::get(zdust1); + auto sietchZout2 = boost::get(zdust2); + m_op->builder_.AddSaplingOutput(ovk, sietchZout1, amount); + m_op->builder_.AddSaplingOutput(ovk, sietchZout2, amount); + } - // Sietchified Shielding of Coinbase Funds - // Add Sietch zouts so it's unclear which zout contains value :) - // This reduces metadata leakage of coinbase t=>z tx's - CAmount amount = 0; - auto zdust1 = DecodePaymentAddress(randomSietchZaddr()); - auto zdust2 = DecodePaymentAddress(randomSietchZaddr()); - auto sietchZout1 = boost::get(zdust1); - auto sietchZout2 = boost::get(zdust2); - m_op->builder_.AddSaplingOutput(ovk, sietchZout1, amount); - m_op->builder_.AddSaplingOutput(ovk, sietchZout2, amount); // Build the transaction auto maybe_tx = m_op->builder_.Build(); diff --git a/src/wallet/asyncrpcoperation_shieldcoinbase.h b/src/wallet/asyncrpcoperation_shieldcoinbase.h index bd606e23e..121d214b9 100644 --- a/src/wallet/asyncrpcoperation_shieldcoinbase.h +++ b/src/wallet/asyncrpcoperation_shieldcoinbase.h @@ -49,6 +49,7 @@ public: std::vector inputs, std::string toAddress, CAmount fee = SHIELD_COINBASE_DEFAULT_MINERS_FEE, + uint8_t donation = 0, UniValue contextInfo = NullUniValue); virtual ~AsyncRPCOperation_shieldcoinbase(); @@ -63,7 +64,6 @@ public: virtual UniValue getStatus() const; bool testmode = false; // Set to true to disable sending txs and generating proofs - bool cheatSpend = false; // set when this is shielding a cheating coinbase private: friend class ShieldToAddress; @@ -74,11 +74,11 @@ private: CAmount fee_; PaymentAddress tozaddr_; - uint256 joinSplitPubKey_; - unsigned char joinSplitPrivKey_[crypto_sign_SECRETKEYBYTES]; - std::vector inputs_; + // this is a donation % between 0 and 10, not a CAmount + uint8_t donation_; + TransactionBuilder builder_; CTransaction tx_; @@ -87,7 +87,6 @@ private: void sign_send_raw_transaction(UniValue obj); // throws exception if there was an error void lock_utxos(); - void unlock_utxos(); }; @@ -96,15 +95,15 @@ class ShieldToAddress : public boost::static_visitor private: AsyncRPCOperation_shieldcoinbase *m_op; CAmount sendAmount; + uint8_t donation = 0; public: - ShieldToAddress(AsyncRPCOperation_shieldcoinbase *op, CAmount sendAmount) : - m_op(op), sendAmount(sendAmount) {} + ShieldToAddress(AsyncRPCOperation_shieldcoinbase *op, CAmount sendAmount, uint8_t donation) : + m_op(op), sendAmount(sendAmount), donation(donation) {} bool operator()(const libzcash::SaplingPaymentAddress &zaddr) const; bool operator()(const libzcash::InvalidEncoding& no) const; }; - // To test private methods, a friend class can act as a proxy class TEST_FRIEND_AsyncRPCOperation_shieldcoinbase { public: @@ -135,6 +134,4 @@ public: } }; - #endif /* ASYNCRPCOPERATION_SHIELDCOINBASE_H */ - diff --git a/src/wallet/rpcdump.cpp b/src/wallet/rpcdump.cpp index eb32c244f..d9f265927 100644 --- a/src/wallet/rpcdump.cpp +++ b/src/wallet/rpcdump.cpp @@ -704,7 +704,7 @@ UniValue dumpwallet_impl(const UniValue& params, bool fHelp, bool fDumpZKeys) throw JSONRPCError(RPC_INTERNAL_ERROR, e.what()); } if (exportdir.empty()) { - throw JSONRPCError(RPC_WALLET_ERROR, "Cannot export wallet until the hushd -exportdir option has been set"); + throw JSONRPCError(RPC_WALLET_ERROR, "Cannot export wallet until the -exportdir option has been set"); } std::string unclean = params[0].get_str(); std::string clean = SanitizeFilename(unclean); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 5f26a4034..da348b76f 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -82,9 +82,7 @@ char *uint256_str(char *dest,uint256 txid); // Private method: UniValue z_getoperationstatus_IMPL(const UniValue&, bool); -#define PLAN_NAME_MAX 8 -#define VALID_PLAN_NAME(x) (strlen(x) <= PLAN_NAME_MAX) -#define THROW_IF_SYNCING(INSYNC) if (HUSH_TESTNODE == 0 && INSYNC == 0) { throw runtime_error(strprintf("%s: Extreme Privacy! Chain still syncing at height %d, aborting to prevent linkability analysis. Please wait until FULLY SYNCED and try again.",__FUNCTION__,chainActive.Tip()->GetHeight())); } +#define THROW_IF_SYNCING(INSYNC) if (Params().NetworkIDString() != "regtest" && HUSH_TESTNODE == 0 && INSYNC == 0) { throw runtime_error(strprintf("%s: Extreme Privacy! Chain still syncing at height %d, aborting to prevent linkability analysis. Please wait until FULLY SYNCED and try again.",__FUNCTION__,chainActive.Tip()->GetHeight())); } int tx_height( const uint256 &hash ); @@ -1343,19 +1341,19 @@ UniValue sendfrom(const UniValue& params, bool fHelp, const CPubKey& mypk) "\nSend 0.01 " + strprintf("%s",hush_chainname()) + " from the default account to the address, must have at least 1 confirmation\n" + HelpExampleCli("sendfrom", "\"\" \"RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPV\" 0.01") + "\nSend 0.01 from the tabby account to the given address, funds must have at least 6 confirmations\n" - + HelpExampleCli("sendfrom", "\"tabby\" \"RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPV\" 0.01 6 \"donation\" \"seans outpost\"") + + + HelpExampleCli("sendfrom", "\"tabby\" \"RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPV\" 0.01 6 \"donation\" \"Hush Puppy Freedom Fund\"") + "\nAs a json rpc call\n" - + HelpExampleRpc("sendfrom", "\"tabby\", \"RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPV\", 0.01, 6, \"donation\", \"seans outpost\"") + + HelpExampleRpc("sendfrom", "\"tabby\", \"RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPV\", 0.01, 6, \"donation\", \"Hush Puppy Freedom Fund\"") ); if ( ASSETCHAINS_PRIVATE != 0 ) - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "cant use transparent addresses in private chain"); + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Cannot use transparent addresses in private chain"); LOCK2(cs_main, pwalletMain->cs_wallet); std::string strAccount = AccountFromValue(params[0]); CTxDestination dest = DecodeDestination(params[1].get_str()); if (!IsValidDestination(dest)) { - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid Hush address!"); + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid address!"); } CAmount nAmount = AmountFromValue(params[2]); if (nAmount <= 0) @@ -2647,6 +2645,49 @@ UniValue lockunspent(const UniValue& params, bool fHelp, const CPubKey& mypk) return true; } +UniValue z_listlockunspent(const UniValue& params, bool fHelp, const CPubKey& mypk) +{ + if (!EnsureWalletIsAvailable(fHelp)) + return NullUniValue; + + if (fHelp || params.size() > 0) + throw runtime_error( + "z_listlockunspent\n" + "\nReturns list of temporarily locked shielded outputs which are currently unspendable. They are locked\n" + "\nbecause they are currently in the process of being spent by an operation such as z_sendmany/z_mergetoaddress/etc.\n" + "\nIf that operation succeeds, they will become spent. If it fails they will be unlocked and become\n" + "\nspendable again.\n" + "\nResult:\n" + "[\n" + " {\n" + " \"txid\" : \"transactionid\", (string) The transaction id locked\n" + " \"outindex\" : n (integer) The shielded output index\n" + " }\n" + " ,...\n" + "]\n" + "\nExamples:\n" + "\nList the locked Sapling notes\n" + + HelpExampleCli("z_listlockunspent", "") + + "\nAs a json rpc call\n" + + HelpExampleRpc("z_listlockunspent", "") + ); + + LOCK2(cs_main, pwalletMain->cs_wallet); + vector ops = pwalletMain->ListLockedSaplingNotes(); + + UniValue ret(UniValue::VARR); + + BOOST_FOREACH(SaplingOutPoint &op, ops) { + UniValue o(UniValue::VOBJ); + + o.push_back(Pair("txid", op.hash.GetHex())); + o.push_back(Pair("outindex", (int) op.n)); + ret.push_back(o); + } + + return ret; +} + UniValue listlockunspent(const UniValue& params, bool fHelp, const CPubKey& mypk) { if (!EnsureWalletIsAvailable(fHelp)) @@ -4083,7 +4124,6 @@ UniValue z_getbalances(const UniValue& params, bool fHelp, const CPubKey& mypk) return results; } - UniValue z_listunspent(const UniValue& params, bool fHelp, const CPubKey& mypk) { if (!EnsureWalletIsAvailable(fHelp)) @@ -4113,6 +4153,7 @@ UniValue z_listunspent(const UniValue& params, bool fHelp, const CPubKey& mypk) " \"outindex\" (sapling) : n (numeric) the output index\n" " \"confirmations\" : n (numeric) the number of confirmations\n" " \"spendable\" : true|false (boolean) true if note can be spent by wallet, false if note has zero confirmations, false if address is watchonly\n" + " \"locked\" : true|false (boolean) true if note is part of an in-process async operation to spend it, such as z_mergetoaddress/z_sendmany/etc\n" " \"address\" : \"address\", (string) the shielded address\n" " \"amount\": xxxxx, (numeric) the amount of value in the note\n" " \"memo\": xxxxx, (string) hexademical string representation of memo field\n" @@ -4218,8 +4259,12 @@ UniValue z_listunspent(const UniValue& params, bool fHelp, const CPubKey& mypk) libzcash::SaplingFullViewingKey fvk; pwalletMain->GetSaplingIncomingViewingKey(boost::get(entry.address), ivk); pwalletMain->GetSaplingFullViewingKey(ivk, fvk); - bool hasSaplingSpendingKey = pwalletMain->HaveSaplingSpendingKey(fvk); + const bool hasSaplingSpendingKey = pwalletMain->HaveSaplingSpendingKey(fvk); obj.push_back(Pair("spendable", hasSaplingSpendingKey)); + + const bool isLocked = pwalletMain->IsLockedNote(entry.op); + obj.push_back(Pair("locked", isLocked)); + obj.push_back(Pair("address", EncodePaymentAddress(entry.address))); obj.push_back(Pair("amount", ValueFromAmount(CAmount(entry.note.value())))); // note.value() is equivalent to plaintext.value() obj.push_back(Pair("memo", HexStr(entry.memo))); @@ -4783,7 +4828,7 @@ UniValue z_viewtransaction(const UniValue& params, bool fHelp, const CPubKey& my UniValue entry(UniValue::VOBJ); if (!pwalletMain->mapWallet.count(hash)) - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid or non-wallet Hush transaction id!"); + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid or non-wallet transaction id!"); const CWalletTx& wtx = pwalletMain->mapWallet[hash]; entry.push_back(Pair("txid", hash.GetHex())); @@ -5126,7 +5171,7 @@ UniValue z_sendmany(const UniValue& params, bool fHelp, const CPubKey& mypk) fprintf(stderr,"%s: Selecting one of %lu potential source zaddrs\n", __func__, nPotentials); fromaddress = vPotentialAddresses[ GetRandInt(nPotentials) ]; } else { - // Automagic zaddr source election failed, exit honorably + // Automagic zaddr source selection failed, exit honorably throw JSONRPCError(RPC_INVALID_PARAMETER, "No single zaddr currently has enough funds to make that transaction, you may need to wait for confirmations."); } } else { @@ -5149,6 +5194,7 @@ UniValue z_sendmany(const UniValue& params, bool fHelp, const CPubKey& mypk) } } + // Recipients std::vector taddrRecipients; std::vector zaddrRecipients; @@ -5238,6 +5284,38 @@ UniValue z_sendmany(const UniValue& params, bool fHelp, const CPubKey& mypk) nTotalOut += nAmount; } + + std::vector saplingEntries; + // find all unspent and unlocked notes in this zaddr + pwalletMain->GetFilteredNotes(saplingEntries, fromaddress); + + // sort notes from largest to smallest, which means + // we will spend the largest first + std::sort(saplingEntries.begin(), saplingEntries.end(), + [](SaplingNoteEntry i, SaplingNoteEntry j) -> bool { + return i.note.value() > j.note.value(); + }); + + CAmount total_value = 0; + + std::vector saplingNoteInputs; + // Decide which sapling notes will be spent + for (const SaplingNoteEntry& entry : saplingEntries) { + CAmount nValue = entry.note.value(); + libzcash::SaplingExtendedSpendingKey extsk; + if (!pwalletMain->GetSaplingExtendedSpendingKey(entry.address, extsk)) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "Could not find spending key for payment address."); + } + saplingNoteInputs.emplace_back(entry.op, entry.note, nValue, extsk.expsk); + total_value += nValue; + LogPrintf("%s: adding note to spend with value=%s, total_value=%s\n", __func__, FormatMoney(nValue), FormatMoney(total_value) ); + if (total_value >= nTotalOut) { + // we have enough note value to make the tx + LogPrintf("%s: found enough notes, nTotalOut=%s total_value=%s\n", __func__, FormatMoney(nTotalOut), FormatMoney(total_value) ); + break; + } + } + // SIETCH: Sprinkle our cave with some magic privacy zdust // End goal is to have this be as large as possible without slowing xtns down too much // A value of 7 will provide much stronger linkability privacy versus pre-Sietch operations @@ -5290,18 +5368,6 @@ UniValue z_sendmany(const UniValue& params, bool fHelp, const CPubKey& mypk) mtx.nVersionGroupId = SAPLING_VERSION_GROUP_ID; mtx.nVersion = SAPLING_TX_VERSION; unsigned int max_tx_size = MAX_TX_SIZE_AFTER_SAPLING; - /* - const bool sapling = true; //NetworkUpgradeActive(nextBlockHeight, Params().GetConsensus(), Consensus::UPGRADE_SAPLING)) { - if (!sapling) { - if (NetworkUpgradeActive(nextBlockHeight, Params().GetConsensus(), Consensus::UPGRADE_OVERWINTER)) { - mtx.nVersionGroupId = OVERWINTER_VERSION_GROUP_ID; - mtx.nVersion = OVERWINTER_TX_VERSION; - } else { - mtx.fOverwintered = false; - mtx.nVersion = 2; - } - } - */ // As a sanity check, estimate and verify that the size of the transaction will be valid. // Depending on the input notes, the actual tx size may turn out to be larger and perhaps invalid. @@ -5370,7 +5436,7 @@ UniValue z_sendmany(const UniValue& params, bool fHelp, const CPubKey& mypk) throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Fee %s is greater than the sum of outputs %s and also greater than the default fee", FormatMoney(nFee), FormatMoney(nTotalOut))); } } - } + } } // Use input parameters as the optional context info to be returned by z_getoperationstatus and z_getoperationresult. @@ -5393,8 +5459,9 @@ UniValue z_sendmany(const UniValue& params, bool fHelp, const CPubKey& mypk) // Create operation and add to global queue std::shared_ptr q = getAsyncRPCQueue(); - std::shared_ptr operation( new AsyncRPCOperation_sendmany(builder, contextualTx, fromaddress, taddrRecipients, zaddrRecipients, nMinDepth, nFee, contextInfo, opret) ); + std::shared_ptr operation( new AsyncRPCOperation_sendmany(builder, contextualTx, fromaddress, taddrRecipients, zaddrRecipients, saplingNoteInputs, nMinDepth, nFee, contextInfo, opret) ); q->addOperation(operation); + if(fZdebug) LogPrintf("%s: Submitted to async queue\n", __FUNCTION__); AsyncRPCOperationId operationId = operation->getId(); @@ -5420,9 +5487,9 @@ UniValue z_shieldcoinbase(const UniValue& params, bool fHelp, const CPubKey& myp if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - if (fHelp || params.size() < 2 || params.size() > 4) + if (fHelp || params.size() < 2 || params.size() > 5) throw runtime_error( - "z_shieldcoinbase \"fromaddress\" \"tozaddress\" ( fee ) ( limit )\n" + "z_shieldcoinbase \"fromaddress\" \"tozaddress\" ( fee ) ( limit ) ( donation )\n" "\nShield transparent coinbase funds by sending to a shielded zaddr. This is an asynchronous operation and utxos" "\nselected for shielding will be locked. If there is an error, they are unlocked. The RPC call `listlockunspent`" "\ncan be used to return a list of locked utxos. The number of coinbase utxos selected for shielding can be limited" @@ -5435,19 +5502,22 @@ UniValue z_shieldcoinbase(const UniValue& params, bool fHelp, const CPubKey& myp "2. \"toaddress\" (string, required) The address is a zaddr.\n" "3. fee (numeric, optional, default=" + strprintf("%s", FormatMoney(SHIELD_COINBASE_DEFAULT_MINERS_FEE)) + ") The fee amount to attach to this transaction.\n" - "4. limit (numeric, optional, default=" + "4. limit (integer, optional, default=" + strprintf("%d", SHIELD_COINBASE_DEFAULT_LIMIT) + ") Limit on the maximum number of utxos to shield. Set to 0 to use as many as will fit in the transaction.\n" + "5. donation (integer, optional, default=0) Percentage of coinbase funds to donate. Must be between 0 and 10 inclusive.\n" "\nResult:\n" "{\n" - " \"remainingUTXOs\": xxx (numeric) Number of coinbase utxos still available for shielding.\n" + " \"remainingUTXOs\": xxx (integer) Number of coinbase utxos still available for shielding.\n" " \"remainingValue\": xxx (numeric) Value of coinbase utxos still available for shielding.\n" - " \"shieldingUTXOs\": xxx (numeric) Number of coinbase utxos being shielded.\n" - " \"shieldingValue\": xxx (numeric) Value of coinbase utxos being shielded.\n" - " \"opid\": xxx (string) An operationid to pass to z_getoperationstatus to get the result of the operation.\n" + " \"shieldingUTXOs\": xxx (integer) Number of coinbase utxos being shielded.\n" + " \"shieldingValue\": xxx (numeric) Value of coinbase utxos being shielded.\n" + " \"opid\": xxx (string) An operationid to pass to z_getoperationstatus to get the result of the operation.\n" "}\n" "\nExamples:\n" + HelpExampleCli("z_shieldcoinbase", "\"RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPV\" \"zs14d8tc0hl9q0vg5l28uec5vk6sk34fkj2n8s7jalvw5fxpy6v39yn4s2ga082lymrkjk0x2nqg37\"") + HelpExampleRpc("z_shieldcoinbase", "\"RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPV\", \"zs14d8tc0hl9q0vg5l28uec5vk6sk34fkj2n8s7jalvw5fxpy6v39yn4s2ga082lymrkjk0x2nqg37\"") + + HelpExampleCli("z_shieldcoinbase", "'*'\", \"zs14d8tc0hl9q0vg5l28uec5vk6sk34fkj2n8s7jalvw5fxpy6v39yn4s2ga082lymrkjk0x2nqg37\"") + + HelpExampleRpc("z_shieldcoinbase", "'*'\", \"zs14d8tc0hl9q0vg5l28uec5vk6sk34fkj2n8s7jalvw5fxpy6v39yn4s2ga082lymrkjk0x2nqg37\"") ); LOCK2(cs_main, pwalletMain->cs_wallet); @@ -5490,6 +5560,16 @@ UniValue z_shieldcoinbase(const UniValue& params, bool fHelp, const CPubKey& myp } } + uint8_t donation = 0; + if (params.size() > 4) { + donation = params[4].get_int(); + if (donation < 0 || donation > 10 ) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid donation percentage, must be an integer between 0 and 10"); + } + } + + LogPrintf("%s: donation=%d\n", __func__, donation); + int nextBlockHeight = chainActive.Height() + 1; bool overwinterActive = nextBlockHeight>=1 ? true : false; // NetworkUpgradeActive(nextBlockHeight, Params().GetConsensus(), Consensus::UPGRADE_OVERWINTER); unsigned int max_tx_size = MAX_TX_SIZE_AFTER_SAPLING; @@ -5590,15 +5670,13 @@ UniValue z_shieldcoinbase(const UniValue& params, bool fHelp, const CPubKey& myp contextInfo.push_back(Pair("fromaddress", params[0])); contextInfo.push_back(Pair("toaddress", params[1])); contextInfo.push_back(Pair("fee", ValueFromAmount(nFee))); + contextInfo.push_back(Pair("donation", donation)); - // Builder (used if Sapling addresses are involved) - TransactionBuilder builder = TransactionBuilder( - Params().GetConsensus(), nextBlockHeight, pwalletMain); + TransactionBuilder builder = TransactionBuilder( Params().GetConsensus(), nextBlockHeight, pwalletMain); // Contextual transaction we will build on int blockHeight = chainActive.LastTip()->GetHeight(); nextBlockHeight = blockHeight + 1; - // (used if no Sapling addresses are involved) CMutableTransaction contextualTx = CreateNewContextualCMutableTransaction( Params().GetConsensus(), nextBlockHeight); contextualTx.nLockTime = chainActive.LastTip()->GetHeight(); @@ -5609,7 +5687,7 @@ UniValue z_shieldcoinbase(const UniValue& params, bool fHelp, const CPubKey& myp // Create operation and add to global queue std::shared_ptr q = getAsyncRPCQueue(); - std::shared_ptr operation( new AsyncRPCOperation_shieldcoinbase(builder, contextualTx, inputs, destaddress, nFee, contextInfo) ); + std::shared_ptr operation( new AsyncRPCOperation_shieldcoinbase(builder, contextualTx, inputs, destaddress, nFee, donation, contextInfo) ); q->addOperation(operation); AsyncRPCOperationId operationId = operation->getId(); @@ -5619,6 +5697,7 @@ UniValue z_shieldcoinbase(const UniValue& params, bool fHelp, const CPubKey& myp o.push_back(Pair("remainingValue", ValueFromAmount(remainingValue))); o.push_back(Pair("shieldingUTXOs", static_cast(numUtxos))); o.push_back(Pair("shieldingValue", ValueFromAmount(shieldedValue))); + o.push_back(Pair("donation", donation)); o.push_back(Pair("opid", operationId)); return o; } @@ -5951,7 +6030,7 @@ UniValue z_mergetoaddress(const UniValue& params, bool fHelp, const CPubKey& myp // Contextual transaction we will build on CMutableTransaction contextualTx; //= CreateNewContextualCMutableTransaction( Params().GetConsensus(), nextBlockHeight); - // Builder (used if Sapling addresses are involved) + // Builder (used if zaddrs are involved) boost::optional builder; if (isToSaplingZaddr || saplingNoteInputs.size() > 0) { builder = TransactionBuilder(Params().GetConsensus(), nextBlockHeight, pwalletMain); @@ -5962,7 +6041,7 @@ UniValue z_mergetoaddress(const UniValue& params, bool fHelp, const CPubKey& myp // Create operation and add to global queue std::shared_ptr q = getAsyncRPCQueue(); std::shared_ptr operation( - new AsyncRPCOperation_mergetoaddress(builder, contextualTx, utxoInputs, saplingNoteInputs, recipient, nFee, contextInfo) ); + new AsyncRPCOperation_mergetoaddress(builder, contextualTx, utxoInputs, saplingNoteInputs, recipient, nFee, contextInfo) ); q->addOperation(operation); AsyncRPCOperationId operationId = operation->getId(); @@ -6186,49 +6265,6 @@ UniValue setpubkey(const UniValue& params, bool fHelp, const CPubKey& mypk) return result; } -UniValue getbalance64(const UniValue& params, bool fHelp, const CPubKey& mypk) -{ - set setAddress; vector vecOutputs; - UniValue ret(UniValue::VOBJ); UniValue a(UniValue::VARR),b(UniValue::VARR); CTxDestination address; - if (!EnsureWalletIsAvailable(fHelp)) - return NullUniValue; - - const CKeyStore& keystore = *pwalletMain; - CAmount nValues[64],nValues2[64],nValue,total,total2; int32_t i,segid; - if (!EnsureWalletIsAvailable(fHelp)) - return NullUniValue; - if (params.size() > 0) - throw runtime_error("getbalance64\n"); - total = total2 = 0; - memset(nValues,0,sizeof(nValues)); - memset(nValues2,0,sizeof(nValues2)); - LOCK2(cs_main, pwalletMain->cs_wallet); - pwalletMain->AvailableCoins(vecOutputs, false, NULL, true); - BOOST_FOREACH(const COutput& out, vecOutputs) - { - nValue = out.tx->vout[out.i].nValue; - if ( ExtractDestination(out.tx->vout[out.i].scriptPubKey, address) ) - { - segid = (hush_segid32((char *)CBitcoinAddress(address).ToString().c_str()) & 0x3f); - if ( out.nDepth < 100 ) - nValues2[segid] += nValue, total2 += nValue; - else nValues[segid] += nValue, total += nValue; - //fprintf(stderr,"%s %.8f depth.%d segid.%d\n",(char *)CBitcoinAddress(address).ToString().c_str(),(double)nValue/COIN,(int32_t)out.nDepth,segid); - } else fprintf(stderr,"no destination\n"); - } - ret.push_back(Pair("mature",(double)total/COIN)); - ret.push_back(Pair("immature",(double)total2/COIN)); - for (i=0; i<64; i++) - { - a.push_back((uint64_t)nValues[i]); - b.push_back((uint64_t)nValues2[i]); - } - ret.push_back(Pair("staking", a)); - ret.push_back(Pair("notstaking", b)); - return ret; -} - - extern UniValue dumpprivkey(const UniValue& params, bool fHelp, const CPubKey& mypk); // in rpcdump.cpp extern UniValue convertpassphrase(const UniValue& params, bool fHelp, const CPubKey& mypk); extern UniValue importprivkey(const UniValue& params, bool fHelp, const CPubKey& mypk); diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 1017bb3df..31a266533 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -66,7 +66,6 @@ bool fPayAtLeastCustomFee = true; #include "hush_defs.h" CBlockIndex *hush_chainactive(int32_t height); -extern std::string DONATION_PUBKEY; extern int32_t HUSH_LOADINGBLOCKS; int32_t hush_dpowconfs(int32_t height,int32_t numconfs); int tx_height( const uint256 &hash ); @@ -1840,19 +1839,17 @@ void CWallet::GetSaplingNoteWitnesses(std::vector notes, auto noteData = mapWallet[note.hash].mapSaplingNoteData; auto nWitnesses = noteData[note].witnesses.size(); if (mapWallet.count(note.hash) && noteData.count(note) && nWitnesses > 0) { - fprintf(stderr,"%s: Found %lu witnesses for note %s\n", __func__, nWitnesses, note.hash.ToString().c_str() ); + fprintf(stderr,"%s: Found %lu witnesses for note %s...\n", __func__, nWitnesses, note.hash.ToString().substr(0,8).c_str() ); witnesses[i] = noteData[note].witnesses.front(); if (!rt) { //fprintf(stderr,"%s: Setting witness root\n",__func__); rt = witnesses[i]->root(); } else { if(*rt == witnesses[i]->root()) { - //fprintf(stderr,"%s: rt=%s\n",__func__,rt.GetHash().ToString().c_str()); - //fprintf(stderr,"%s: witnesses[%d]->root()=%s\n",__func__,i,witnesses[i]->root().GetHash().ToString().c_str()); + } else { // Something is fucky std::string err = string("CWallet::GetSaplingNoteWitnesses: Invalid witness root! rt=") + rt.get().ToString(); err += string("\n!= witness[i]->root()=") + witnesses[i]->root().ToString(); - //throw std::logic_error(err); fprintf(stderr,"%s: IGNORING %s\n", __func__,err.c_str()); } @@ -4587,12 +4584,14 @@ void CWallet::LockNote(const SaplingOutPoint& output) { AssertLockHeld(cs_wallet); setLockedSaplingNotes.insert(output); + fprintf(stderr,"%s: locking note %s...\n", __func__, output.hash.ToString().substr(0,8).c_str() ); } void CWallet::UnlockNote(const SaplingOutPoint& output) { AssertLockHeld(cs_wallet); setLockedSaplingNotes.erase(output); + fprintf(stderr,"%s: unlocking note %s...\n", __func__, output.hash.ToString().substr(0,8).c_str() ); } void CWallet::UnlockAllSaplingNotes() @@ -4879,6 +4878,8 @@ void CWallet::GetFilteredNotes( { LOCK2(cs_main, cs_wallet); + LogPrintf("%s ignoreLocked=%d\n", __func__, ignoreLocked); + for (auto & p : mapWallet) { CWalletTx wtx = p.second; @@ -4940,8 +4941,8 @@ void CWallet::GetFilteredNotes( } // skip locked notes - // TODO: Add locking for Sapling notes -> done if (ignoreLocked && IsLockedNote(op)) { + LogPrintf("%s: skipping locked note %s\n", __func__, op.hash.ToString().substr(0,10).c_str()); continue; } @@ -5037,7 +5038,7 @@ SpendingKeyAddResult AddSpendingKeyToWallet::operator()(const libzcash::SaplingE if (params.vUpgrades[Consensus::UPGRADE_SAPLING].nActivationHeight == Consensus::NetworkUpgrade::ALWAYS_ACTIVE) { m_wallet->mapSaplingZKeyMetadata[ivk].nCreateTime = nTime; } else { - // TODO: set a better time for HUSH+DRAGONX + // TODO: set a better time for HUSH+HACs // 154051200 seconds from epoch is Friday, 26 October 2018 00:00:00 GMT - definitely before Sapling activates m_wallet->mapSaplingZKeyMetadata[ivk].nCreateTime = std::max((int64_t) 154051200, nTime); } diff --git a/test b/test new file mode 100755 index 000000000..c9c507ca8 --- /dev/null +++ b/test @@ -0,0 +1,47 @@ +#!/usr/bin/env perl +# Copyright 2016-2026 The Hush developers +# Distributed under the GPLv3 software license, see the accompanying +# file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html + +use strict; +use warnings; +use 5.010; + +my $flags = $ENV{TEST_FLAGS} || '--tracerpc'; +my $test_dir = './qa/rpc-tests'; + +$ENV{PYTHONPATH} = "./qa/rpc-tests/test_framework/"; +#$ENV{PYTHON_DEBUG} = 1; + +my @tests_to_run = qw{ + lockzins.py + shieldcoinbase_donation.py +}; + +my $exit = 0; +my $failed_tests = 0; +my $time=time(); +my $num_tests = @tests_to_run; + +print "# Running $num_tests tests"; +for my $test (@tests_to_run) { + # send both stderr+stdout to our output file + my $cmd = "$test_dir/$test $flags 1>test-$time.txt 2>&1"; + system($cmd); + + print "."; + + if($?) { + say "$cmd FAILED!"; + $exit = 1; + $failed_tests++; + } +} +print "\n"; + +if ($exit) { + say "FAIL! Number of failed tests: $failed_tests . Details in test-$time.txt"; +} else { + say "PASS!"; +} +exit($exit); diff --git a/util/build-debian-package.sh b/util/build-debian-package.sh index e277b8725..3677019e1 100755 --- a/util/build-debian-package.sh +++ b/util/build-debian-package.sh @@ -81,10 +81,6 @@ strip $DEB_BIN/hush-cli cp $SRC_PATH/src/hush-tx $DEB_BIN strip $DEB_BIN/hush-tx -# these are scripts and don't require a strip -cp $SRC_PATH/src/dragonx-cli $DEB_BIN -cp $SRC_PATH/src/dragonxd $DEB_BIN - cp $SRC_PATH/src/hush-arrakis-chain $DEB_BIN cp $SRC_DEB/changelog $DEB_DOC cp $SRC_DEB/copyright $DEB_DOC diff --git a/util/build.sh b/util/build.sh index 6bf7a6d69..67e34898a 100755 --- a/util/build.sh +++ b/util/build.sh @@ -125,18 +125,19 @@ eval "$MAKE" --version | head -n2 as --version | head -n1 as --version | tail -n1 ld -v +autoconf --version HOST="$HOST" BUILD="$BUILD" "$MAKE" "$@" -C ./depends/ V=1 -./autogen.sh +time ./autogen.sh -CONFIG_SITE="$PWD/depends/$HOST/share/config.site" ./configure "$HARDENING_ARG" "$LCOV_ARG" "$TEST_ARG" "$MINING_ARG" $CONFIGURE_FLAGS CXXFLAGS='-g' +CC=${CC:-gcc} CXX=${CXX:-g++} CONFIG_SITE="$PWD/depends/$HOST/share/config.site" ./configure "$HARDENING_ARG" "$LCOV_ARG" "$TEST_ARG" "$MINING_ARG" $CONFIGURE_FLAGS CXXFLAGS='-g' CFLAGS='-std=gnu17' # Build CryptoConditions stuff WD=$PWD cd src/cc echo $PWD -./makecustom +CFLAGS=-std=gnu17 CC=${CC:-gcc} ./makecustom cd $WD # Build RandomX @@ -147,9 +148,10 @@ then else mkdir build && cd build cmake -DARCH=native .. - make + # pass along potential -jX and other args + time make "$@" fi cd $WD -"$MAKE" "$@" V=1 +time "$MAKE" "$@" V=1 diff --git a/util/checkpoints.pl b/util/checkpoints.pl index a0a4e1273..4eaf58df9 100755 --- a/util/checkpoints.pl +++ b/util/checkpoints.pl @@ -33,8 +33,6 @@ if ($acname) { $cli .= " -ac_name=$acname"; # HSC's by default have a blocktime of 60s $perday = 1440; - # Dragonx has a blocktime of 36s - $perday = 2400 if ($acname eq 'DRAGONX'); } else { $acname = 'HUSH3'; } diff --git a/util/gen-linux-binary-release.sh b/util/gen-linux-binary-release.sh index dbf5f392e..6f4f7ac92 100755 --- a/util/gen-linux-binary-release.sh +++ b/util/gen-linux-binary-release.sh @@ -24,7 +24,7 @@ echo "Created new build dir $BUILD" cp contrib/asmap/asmap.dat $BUILD cp sapling*.params $BUILD cd src -cp hushd hush-cli hush-tx hush-arrakis-chain dragonx-cli dragonxd ../$BUILD +cp hushd hush-cli hush-tx hush-arrakis-chain ../$BUILD cd ../$BUILD strip hushd hush-cli hush-tx cd .. diff --git a/util/gen-manpages.sh b/util/gen-manpages.sh index 844fac739..1fcfae26f 100755 --- a/util/gen-manpages.sh +++ b/util/gen-manpages.sh @@ -14,7 +14,7 @@ HUSHTX=${HUSHTX:-$SRCDIR/hush-tx} # Check if help2man is installed & if not then display error to user and exit [ ! -x "$(command -v help2man)" ] && echo "help2man could not be found" && echo "Please install from your Linux package manager and try again" && echo "On Debian-based systems you can do: apt-get install help2man" && exit 1 -# use this if hushd is not running +# use this if hushd is not compiled #HUSHVER="v3.6.2" HUSHVER=$(./src/hushd --version|head -n1|cut -d' ' -f4|cut -d- -f1)