diff -Nru anoncoin-0.8.5.6/anoncoin-qt.pro anoncoin-0.8.5.6+git20141111.r4233/anoncoin-qt.pro
--- anoncoin-0.8.5.6/anoncoin-qt.pro 2013-12-24 19:07:16.000000000 +0000
+++ anoncoin-0.8.5.6+git20141111.r4233/anoncoin-qt.pro 2014-11-11 13:56:18.000000000 +0000
@@ -1,11 +1,11 @@
TEMPLATE = app
TARGET = anoncoin-qt
macx:TARGET = "Anoncoin-Qt"
-VERSION = 0.8.5.1
+VERSION = 0.8.5.6
INCLUDEPATH += src src/json src/qt i2psam
QT += core gui network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
-DEFINES += QT_GUI BOOST_THREAD_USE_LIB BOOST_SPIRIT_THREADSAFE
+DEFINES += QT_GUI BOOST_THREAD_USE_LIB BOOST_SPIRIT_THREADSAFE ENABLE_WALLET
CONFIG += no_include_pwd
CONFIG += thread
SUBDIR = i2psam
@@ -196,7 +196,7 @@
src/qt/walletview.h \
src/qt/walletstack.h \
src/qt/walletframe.h \
- src/bitcoinrpc.h \
+ src/anoncoinrpc.h \
src/qt/overviewpage.h \
src/qt/csvmodelwriter.h \
src/crypter.h \
@@ -215,6 +215,7 @@
src/i2p.h \
src/scrypt.h \
src/version.h \
+ src/miner.h \
src/netbase.h \
src/clientversion.h \
src/txdb.h \
@@ -273,7 +274,7 @@
src/qt/walletview.cpp \
src/qt/walletstack.cpp \
src/qt/walletframe.cpp \
- src/bitcoinrpc.cpp \
+ src/anoncoinrpc.cpp \
src/rpcdump.cpp \
src/rpcnet.cpp \
src/rpcmining.cpp \
@@ -296,6 +297,7 @@
src/i2p.cpp \
src/scrypt.cpp \
src/noui.cpp \
+ src/miner.cpp \
src/leveldb.cpp \
src/txdb.cpp \
src/qt/splashscreen.cpp \
diff -Nru anoncoin-0.8.5.6/contrib/gitian-descriptors/deps-win32.yml anoncoin-0.8.5.6+git20141111.r4233/contrib/gitian-descriptors/deps-win32.yml
--- anoncoin-0.8.5.6/contrib/gitian-descriptors/deps-win32.yml 2013-12-24 19:07:16.000000000 +0000
+++ anoncoin-0.8.5.6+git20141111.r4233/contrib/gitian-descriptors/deps-win32.yml 2014-11-11 13:56:18.000000000 +0000
@@ -1,5 +1,5 @@
---
-name: "bitcoin-deps"
+name: "anoncoin-deps"
suites:
- "precise"
architectures:
@@ -90,4 +90,4 @@
cd ..
#
cd $INSTALLPREFIX
- zip -r $OUTDIR/bitcoin-deps-win32-gitian-r9.zip include lib
+ zip -r $OUTDIR/anoncoin-deps-win32-gitian-r9.zip include lib
diff -Nru anoncoin-0.8.5.6/contrib/gitian-descriptors/gitian-win32.yml anoncoin-0.8.5.6+git20141111.r4233/contrib/gitian-descriptors/gitian-win32.yml
--- anoncoin-0.8.5.6/contrib/gitian-descriptors/gitian-win32.yml 2013-12-24 19:07:16.000000000 +0000
+++ anoncoin-0.8.5.6+git20141111.r4233/contrib/gitian-descriptors/gitian-win32.yml 2014-11-11 13:56:18.000000000 +0000
@@ -1,5 +1,5 @@
---
-name: "litecoin"
+name: "anoncoin"
suites:
- "precise"
architectures:
@@ -13,12 +13,12 @@
- "faketime"
reference_datetime: "2011-01-30 00:00:00"
remotes:
-- "url": "https://github.com/litecoin-project/litecoin.git"
- "dir": "litecoin"
+- "url": "https://github.com/Anoncoin/anoncoin.git"
+ "dir": "anoncoin"
files:
- "qt-win32-4.8.3-gitian-r4.zip"
- "boost-win32-1.54.0-gitian-r6.zip"
-- "bitcoin-deps-win32-gitian-r9.zip"
+- "anoncoin-deps-win32-gitian-r9.zip"
script: |
#
STAGING=$HOME/staging
@@ -28,10 +28,13 @@
cd $STAGING
unzip ../build/qt-win32-4.8.3-gitian-r4.zip
unzip ../build/boost-win32-1.54.0-gitian-r6.zip
- unzip ../build/bitcoin-deps-win32-gitian-r9.zip
+ unzip ../build/anoncoin-deps-win32-gitian-r9.zip
cd $HOME/build/
#
- cd litecoin
+ cd anoncoin
+ cd i2psam
+ make -f makefile.linux-mingw
+ cd ..
export PATH=$STAGING/host/bin:$PATH
mkdir -p $OUTDIR/src
git archive HEAD | tar -x -C $OUTDIR/src
@@ -41,19 +44,19 @@
export FAKETIME=$REFERENCE_DATETIME
export TZ=UTC
ln -s $STAGING $HOME/qt
- $HOME/staging/host/bin/qmake -spec unsupported/win32-g++-cross MINIUPNPC_LIB_PATH=$STAGING MINIUPNPC_INCLUDE_PATH=$STAGING BDB_LIB_PATH=$STAGING BDB_INCLUDE_PATH=$STAGING BOOST_LIB_PATH=$STAGING BOOST_INCLUDE_PATH=$STAGING BOOST_LIB_SUFFIX=-mt-s BOOST_THREAD_LIB_SUFFIX=_win32-mt-s OPENSSL_LIB_PATH=$STAGING OPENSSL_INCLUDE_PATH=$STAGING QRENCODE_LIB_PATH=$STAGING QRENCODE_INCLUDE_PATH=$STAGING USE_QRCODE=1 INCLUDEPATH=$STAGING DEFINES=BOOST_THREAD_USE_LIB BITCOIN_NEED_QT_PLUGINS=1 QMAKE_LRELEASE=lrelease QMAKE_CXXFLAGS=-frandom-seed=litecoin USE_BUILD_INFO=1 USE_SSE2=1
+ $HOME/staging/host/bin/qmake -spec unsupported/win32-g++-cross MINIUPNPC_LIB_PATH=$STAGING MINIUPNPC_INCLUDE_PATH=$STAGING BDB_LIB_PATH=$STAGING BDB_INCLUDE_PATH=$STAGING BOOST_LIB_PATH=$STAGING BOOST_INCLUDE_PATH=$STAGING BOOST_LIB_SUFFIX=-mt-s BOOST_THREAD_LIB_SUFFIX=_win32-mt-s OPENSSL_LIB_PATH=$STAGING OPENSSL_INCLUDE_PATH=$STAGING QRENCODE_LIB_PATH=$STAGING QRENCODE_INCLUDE_PATH=$STAGING USE_QRCODE=1 INCLUDEPATH=$STAGING DEFINES=BOOST_THREAD_USE_LIB BITCOIN_NEED_QT_PLUGINS=1 QMAKE_LRELEASE=lrelease QMAKE_CXXFLAGS=-frandom-seed=anoncoin USE_BUILD_INFO=1 USE_SSE2=1
make $MAKEOPTS
- $HOST-strip release/litecoin-qt.exe
- cp release/litecoin-qt.exe $OUTDIR/
+ $HOST-strip release/anoncoin-qt.exe
+ cp release/anoncoin-qt.exe $OUTDIR/
#
cd src
export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1
export FAKETIME=$REFERENCE_DATETIME
export TZ=UTC
- make -f makefile.linux-mingw $MAKEOPTS DEPSDIR=$STAGING litecoind.exe USE_UPNP=0 DEBUGFLAGS="-frandom-seed=litecoin" USE_SSE2=1
- $HOST-strip litecoind.exe
+ make -f makefile.linux-mingw $MAKEOPTS DEPSDIR=$STAGING anoncoind.exe USE_UPNP=0 DEBUGFLAGS="-frandom-seed=anoncoin" USE_SSE2=1
+ $HOST-strip anoncoind.exe
mkdir $OUTDIR/daemon
- cp litecoind.exe $OUTDIR/daemon
+ cp anoncoind.exe $OUTDIR/daemon
cd ..
mkdir nsis
git archive HEAD | tar -x -C nsis
@@ -62,4 +65,4 @@
cp ../../release/* ../release/
cp ../../src/*.exe .
makensis ../share/setup.nsi
- cp ../share/litecoin-*-win32-setup.exe $OUTDIR/
+ cp ../share/anoncoin-*-win32-setup.exe $OUTDIR/
diff -Nru anoncoin-0.8.5.6/contrib/gitian-descriptors/gitian.yml anoncoin-0.8.5.6+git20141111.r4233/contrib/gitian-descriptors/gitian.yml
--- anoncoin-0.8.5.6/contrib/gitian-descriptors/gitian.yml 2013-12-24 19:07:16.000000000 +0000
+++ anoncoin-0.8.5.6+git20141111.r4233/contrib/gitian-descriptors/gitian.yml 2014-11-11 13:56:18.000000000 +0000
@@ -1,18 +1,15 @@
---
-name: "litecoin"
+name: "anoncoin"
suites:
-- "lucid"
+- "precise"
architectures:
- "i386"
- "amd64"
packages:
-- "libdb4.8++-dev"
+- "libdb5.1++-dev"
- "qt4-qmake"
- "libqt4-dev"
-- "libboost-system-dev"
-- "libboost-filesystem-dev"
-- "libboost-program-options-dev"
-- "libboost-thread-dev"
+- "libboost-all-dev"
- "libssl-dev"
- "git-core"
- "unzip"
@@ -20,8 +17,8 @@
- "libpng12-dev"
reference_datetime: "2011-01-30 00:00:00"
remotes:
-- "url": "https://github.com/litecoin-project/litecoin.git"
- "dir": "litecoin"
+- "url": "https://github.com/Anoncoin/anoncoin.git"
+ "dir": "anoncoin"
files:
- "miniupnpc-1.6.tar.gz"
- "qrencode-3.2.0.tar.bz2"
@@ -40,16 +37,18 @@
make $MAKEOPTS install
cd ..
#
- cd litecoin
+ cd anoncoin
mkdir -p $OUTDIR/src
git archive HEAD | tar -x -C $OUTDIR/src
cp $OUTDIR/src/doc/README.md $OUTDIR
cp $OUTDIR/src/COPYING $OUTDIR
- cd src
- make -f makefile.unix STATIC=1 OPENSSL_INCLUDE_PATH="$INSTDIR/include" OPENSSL_LIB_PATH="$INSTDIR/lib" $MAKEOPTS litecoind USE_UPNP=0 DEBUGFLAGS= USE_SSE2=1
+ cd i2psam
+ make -f makefile.unix
+ cd ../src
+ make -f makefile.unix STATIC=1 OPENSSL_INCLUDE_PATH="$INSTDIR/include" OPENSSL_LIB_PATH="$INSTDIR/lib" $MAKEOPTS anoncoind USE_UPNP=0 DEBUGFLAGS= USE_SSE2=1
mkdir -p $OUTDIR/bin/$GBUILD_BITS
- install -s litecoind $OUTDIR/bin/$GBUILD_BITS
+ install -s anoncoind $OUTDIR/bin/$GBUILD_BITS
cd ..
qmake INCLUDEPATH="$INSTDIR/include" LIBS="-L$INSTDIR/lib" RELEASE=1 USE_QRCODE=1 USE_SSE2=1
make $MAKEOPTS
- install litecoin-qt $OUTDIR/bin/$GBUILD_BITS
+ install anoncoin-qt $OUTDIR/bin/$GBUILD_BITS
diff -Nru anoncoin-0.8.5.6/contrib/gitian-descriptors/qt-win32.yml anoncoin-0.8.5.6+git20141111.r4233/contrib/gitian-descriptors/qt-win32.yml
--- anoncoin-0.8.5.6/contrib/gitian-descriptors/qt-win32.yml 2013-12-24 19:07:16.000000000 +0000
+++ anoncoin-0.8.5.6+git20141111.r4233/contrib/gitian-descriptors/qt-win32.yml 2014-11-11 13:56:18.000000000 +0000
@@ -15,7 +15,7 @@
remotes: []
files:
- "qt-everywhere-opensource-src-4.8.3.tar.gz"
-- "bitcoin-deps-win32-gitian-r9.zip"
+- "anoncoin-deps-win32-gitian-r9.zip"
script: |
#
HOST=i686-w64-mingw32
@@ -24,8 +24,8 @@
mkdir $INSTDIR
mkdir -p $INSTDIR/host/bin
#
- # Need mingw-compiled openssl from bitcoin-deps:
- unzip bitcoin-deps-win32-gitian-r9.zip
+ # Need mingw-compiled openssl from anoncoin-deps:
+ unzip anoncoin-deps-win32-gitian-r9.zip
DEPSDIR=`pwd`
#
tar xzf qt-everywhere-opensource-src-4.8.3.tar.gz
diff -Nru anoncoin-0.8.5.6/contrib/macdeploy/fancy.plist anoncoin-0.8.5.6+git20141111.r4233/contrib/macdeploy/fancy.plist
--- anoncoin-0.8.5.6/contrib/macdeploy/fancy.plist 2013-12-24 19:07:16.000000000 +0000
+++ anoncoin-0.8.5.6+git20141111.r4233/contrib/macdeploy/fancy.plist 2014-11-11 13:56:18.000000000 +0000
@@ -22,7 +22,7 @@
370
156
- Litecoin-Qt.app
+ Anoncoin-Qt.app
128
156
diff -Nru anoncoin-0.8.5.6/contrib/macdeploy/macdeployqtplus anoncoin-0.8.5.6+git20141111.r4233/contrib/macdeploy/macdeployqtplus
--- anoncoin-0.8.5.6/contrib/macdeploy/macdeployqtplus 2013-12-24 19:07:16.000000000 +0000
+++ anoncoin-0.8.5.6+git20141111.r4233/contrib/macdeploy/macdeployqtplus 2014-11-11 13:56:18.000000000 +0000
@@ -763,7 +763,7 @@
items_positions.append(itemscript.substitute(params))
params = {
- "disk" : "Litecoin-Qt",
+ "disk" : "Anoncoin-Qt",
"window_bounds" : "300,300,800,620",
"icon_size" : "96",
"background_commands" : "",
diff -Nru anoncoin-0.8.5.6/debian/changelog anoncoin-0.8.5.6+git20141111.r4233/debian/changelog
--- anoncoin-0.8.5.6/debian/changelog 2014-03-09 01:41:48.000000000 +0000
+++ anoncoin-0.8.5.6+git20141111.r4233/debian/changelog 2014-11-29 03:50:25.000000000 +0000
@@ -1,3 +1,15 @@
+anoncoin (0.8.5.6+git20141111.r4233-1~precise+1) precise; urgency=medium
+
+ * Backport to Precise
+
+ -- Kill Your TV Sat, 29 Nov 2014 03:50:09 +0000
+
+anoncoin (0.8.5.6+git20141111.r4233-1) unstable; urgency=medium
+
+ * New upstream git snapshot
+
+ -- Kill Your TV Sat, 29 Nov 2014 00:38:29 +0000
+
anoncoin (0.8.5.6-1ubuntu1~precise1) precise; urgency=medium
* Backport for Ubuntu Precise
diff -Nru anoncoin-0.8.5.6/debian/copyright anoncoin-0.8.5.6+git20141111.r4233/debian/copyright
--- anoncoin-0.8.5.6/debian/copyright 2014-03-09 01:41:48.000000000 +0000
+++ anoncoin-0.8.5.6+git20141111.r4233/debian/copyright 2014-11-29 03:50:25.000000000 +0000
@@ -79,7 +79,8 @@
License: GPL-3+
Files: debian/*
-Copyright: 2012-2014 Dmitry Smirnov
+Copyright: 2014 Kill Your TV
+ 2012-2014 Dmitry Smirnov
2010-2011 Jonas Smedegaard
License: GPL-2+
This package is free software; you can redistribute it and/or modify
diff -Nru anoncoin-0.8.5.6/debian/examples/anoncoin.conf anoncoin-0.8.5.6+git20141111.r4233/debian/examples/anoncoin.conf
--- anoncoin-0.8.5.6/debian/examples/anoncoin.conf 2014-03-09 01:41:48.000000000 +0000
+++ anoncoin-0.8.5.6+git20141111.r4233/debian/examples/anoncoin.conf 2014-11-29 03:50:25.000000000 +0000
@@ -48,6 +48,16 @@
# running on another host using this option:
rpcconnect=127.0.0.1
+# Enable I2P
+i2p=1
+
+#i2psessionname=Anoncoin-client
+#samhost=
+#samport=
+#mydestination=
+
+
+
# Use Secure Sockets Layer (also known as TLS or HTTPS) to communicate
# with Anoncoin -server or anoncoind
#rpcssl=1
diff -Nru anoncoin-0.8.5.6/debian/gbp.conf anoncoin-0.8.5.6+git20141111.r4233/debian/gbp.conf
--- anoncoin-0.8.5.6/debian/gbp.conf 2014-03-09 01:41:48.000000000 +0000
+++ anoncoin-0.8.5.6+git20141111.r4233/debian/gbp.conf 2014-11-29 03:50:25.000000000 +0000
@@ -6,7 +6,7 @@
# the default clean command:
#cleaner = debuild clean
# the default branch for upstream sources:
-upstream-branch = master-neo
+upstream-branch = master
# the default branch for the debian patch:
debian-branch = ubuntu/precise
# the default tag formats used:
@@ -39,7 +39,7 @@
#ignore-new = True
#export = HEAD
# compress with bzip2
-compression = gzip
+compression = xz
# use best compression
#compression-level = best
# Don't send notifications, alternatives: on/true, off/false or auto
diff -Nru anoncoin-0.8.5.6/debian/patches/0001-builddate.patch anoncoin-0.8.5.6+git20141111.r4233/debian/patches/0001-builddate.patch
--- anoncoin-0.8.5.6/debian/patches/0001-builddate.patch 2014-03-09 01:41:48.000000000 +0000
+++ anoncoin-0.8.5.6+git20141111.r4233/debian/patches/0001-builddate.patch 2014-11-29 03:50:25.000000000 +0000
@@ -2,6 +2,14 @@
Date: Sat, 8 Mar 2014 00:02:53 +0000
Subject: builddate
+Patch borrowed from the Debian litecoin packaging. Original header info
+follows:
+
+Last-Update: 2013-11-20
+Forwarded: not-needed
+Author: Dmitry Smirnov
+Description: provide build date information.
+
---
share/genbuild.sh | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff -Nru anoncoin-0.8.5.6/debian/patches/0002-unbundle-leveldb.patch anoncoin-0.8.5.6+git20141111.r4233/debian/patches/0002-unbundle-leveldb.patch
--- anoncoin-0.8.5.6/debian/patches/0002-unbundle-leveldb.patch 2014-03-09 01:41:48.000000000 +0000
+++ anoncoin-0.8.5.6+git20141111.r4233/debian/patches/0002-unbundle-leveldb.patch 2014-11-29 03:50:25.000000000 +0000
@@ -2,17 +2,26 @@
Date: Sat, 8 Mar 2014 00:02:54 +0000
Subject: unbundle-leveldb
+
+Patch borrowed from the Debian litecoin packaging and rebased to apply to the
+anoncoin codebase by kytv.
+
+Original header info follows:
+
+Last-Update: 2013-11-14
+Forwarded: not-needed
+Author: Dmitry Smirnov
+Description: use system libleveldb-dev instead of a bundled one.
+
---
anoncoin-qt.pro | 20 +-------------------
src/leveldb.cpp | 2 +-
src/makefile.unix | 8 +-------
3 files changed, 3 insertions(+), 27 deletions(-)
-diff --git a/anoncoin-qt.pro b/anoncoin-qt.pro
-index bb1a192..9d61153 100644
--- a/anoncoin-qt.pro
+++ b/anoncoin-qt.pro
-@@ -102,25 +102,7 @@ contains(BITCOIN_NEED_QT_PLUGINS, 1) {
+@@ -102,25 +102,7 @@
QTPLUGIN += qcncodecs qjpcodecs qtwcodecs qkrcodecs qtaccessiblewidgets
}
@@ -39,8 +48,6 @@
# regenerate src/build.h
!win32|contains(USE_BUILD_INFO, 1) {
-diff --git a/src/leveldb.cpp b/src/leveldb.cpp
-index e66f851..c465aee 100644
--- a/src/leveldb.cpp
+++ b/src/leveldb.cpp
@@ -8,7 +8,7 @@
@@ -52,19 +59,17 @@
#include
-diff --git a/src/makefile.unix b/src/makefile.unix
-index 2b9996b..0658b4c 100644
--- a/src/makefile.unix
+++ b/src/makefile.unix
-@@ -115,7 +115,6 @@ xCXXFLAGS=-O2 -pthread -Wall -Wextra -Wformat -Wformat-security -Wno-unused-para
- xLDFLAGS=$(LDHARDENING) $(LDFLAGS)
-
+@@ -113,7 +113,6 @@
+ # anoncoind depends on them. This is inelegant because they are redundant when listed
+ # in $OBJS (NOTE: compilation fails if they are not in $LIBS, even if present here).
OBJS= \
- leveldb/libleveldb.a \
+ ../i2psam/libi2psam.a \
obj/alert.o \
obj/version.o \
- obj/checkpoints.o \
-@@ -166,11 +165,7 @@ test check: test_anoncoin FORCE
+@@ -165,11 +164,7 @@
# LevelDB support
#
MAKEOVERRIDES =
@@ -75,9 +80,9 @@
- @echo "Building LevelDB ..." && cd leveldb && $(MAKE) CC=$(CC) CXX=$(CXX) OPT="$(xCXXFLAGS)" libleveldb.a libmemenv.a && cd ..
+LIBS += -lleveldb -lmemenv
- # auto-generated dependencies:
- -include obj/*.P
-@@ -217,6 +212,5 @@ clean:
+ #
+ # I2P support
+@@ -225,6 +220,5 @@
-rm -f obj/*.P
-rm -f obj-test/*.P
-rm -f obj/build.h
diff -Nru anoncoin-0.8.5.6/debian/patches/0003-bash-completion.patch anoncoin-0.8.5.6+git20141111.r4233/debian/patches/0003-bash-completion.patch
--- anoncoin-0.8.5.6/debian/patches/0003-bash-completion.patch 2014-03-09 01:41:48.000000000 +0000
+++ anoncoin-0.8.5.6+git20141111.r4233/debian/patches/0003-bash-completion.patch 2014-11-29 03:50:25.000000000 +0000
@@ -2,6 +2,9 @@
Date: Sat, 8 Mar 2014 00:04:04 +0000
Subject: bash-completion
+s/litecoin/anoncoin/
+s/Litecoin/Anoncoin/
+
---
contrib/bitcoind.bash-completion | 36 ++++++++++++++++++------------------
1 file changed, 18 insertions(+), 18 deletions(-)
diff -Nru anoncoin-0.8.5.6/debian/patches/series anoncoin-0.8.5.6+git20141111.r4233/debian/patches/series
--- anoncoin-0.8.5.6/debian/patches/series 2014-03-09 01:41:48.000000000 +0000
+++ anoncoin-0.8.5.6+git20141111.r4233/debian/patches/series 2014-11-29 03:50:25.000000000 +0000
@@ -1,3 +1,3 @@
0001-builddate.patch
-#0002-unbundle-leveldb.patch
+0002-unbundle-leveldb.patch
0003-bash-completion.patch
diff -Nru anoncoin-0.8.5.6/doc/build-unix.md anoncoin-0.8.5.6+git20141111.r4233/doc/build-unix.md
--- anoncoin-0.8.5.6/doc/build-unix.md 2013-12-24 19:07:16.000000000 +0000
+++ anoncoin-0.8.5.6+git20141111.r4233/doc/build-unix.md 2014-11-11 13:56:18.000000000 +0000
@@ -81,7 +81,7 @@
Notes
-----
-The release is built with GCC and then "strip bitcoind" to strip the debug
+The release is built with GCC and then "strip anoncoind" to strip the debug
symbols, which reduces the executable size by about 90%.
@@ -139,7 +139,7 @@
* Non-executable Stack
If the stack is executable then trivial stack based buffer overflow exploits are possible if
- vulnerable buffers are found. By default, bitcoin should be built with a non-executable stack
+ vulnerable buffers are found. By default, anoncoin should be built with a non-executable stack
but if one of the libraries it uses asks for an executable stack or someone makes a mistake
and uses a compiler extension which requires an executable stack, it will silently build an
executable without the non-executable stack protection.
diff -Nru anoncoin-0.8.5.6/doc/release-process.md anoncoin-0.8.5.6+git20141111.r4233/doc/release-process.md
--- anoncoin-0.8.5.6/doc/release-process.md 2013-12-24 19:07:16.000000000 +0000
+++ anoncoin-0.8.5.6+git20141111.r4233/doc/release-process.md 2014-11-11 13:56:18.000000000 +0000
@@ -24,9 +24,9 @@
##perform gitian builds
- From a directory containing the litecoin source, gitian-builder and gitian.sigs
+ From a directory containing the anoncoin source, gitian-builder and gitian.sigs
- export SIGNER=(your gitian key, ie bluematt, sipa, etc)
+ export SIGNER=(your gitian key, ie Meeh, K1773R, etc)
export VERSION=0.8.0
cd ./gitian-builder
@@ -42,79 +42,79 @@
wget 'http://downloads.sourceforge.net/project/boost/boost/1.50.0/boost_1_50_0.tar.bz2'
wget 'http://releases.qt-project.org/qt4/source/qt-everywhere-opensource-src-4.8.3.tar.gz'
cd ..
- ./bin/gbuild ../litecoin/contrib/gitian-descriptors/boost-win32.yml
+ ./bin/gbuild ../anoncoin/contrib/gitian-descriptors/boost-win32.yml
mv build/out/boost-win32-1.50.0-gitian2.zip inputs/
- ./bin/gbuild ../litecoin/contrib/gitian-descriptors/qt-win32.yml
+ ./bin/gbuild ../anoncoin/contrib/gitian-descriptors/qt-win32.yml
mv build/out/qt-win32-4.8.3-gitian-r1.zip inputs/
- ./bin/gbuild ../litecoin/contrib/gitian-descriptors/deps-win32.yml
- mv build/out/litecoin-deps-0.0.5.zip inputs/
+ ./bin/gbuild ../anoncoin/contrib/gitian-descriptors/deps-win32.yml
+ mv build/out/anoncoin-deps-0.0.5.zip inputs/
- Build litecoind and litecoin-qt on Linux32, Linux64, and Win32:
+ Build anoncoind and anoncoin-qt on Linux32, Linux64, and Win32:
- ./bin/gbuild --commit litecoin=v${VERSION} ../litecoin/contrib/gitian-descriptors/gitian.yml
- ./bin/gsign --signer $SIGNER --release ${VERSION} --destination ../gitian.sigs/ ../litecoin/contrib/gitian-descriptors/gitian.yml
+ ./bin/gbuild --commit anoncoin=v${VERSION} ../anoncoin/contrib/gitian-descriptors/gitian.yml
+ ./bin/gsign --signer $SIGNER --release ${VERSION} --destination ../gitian.sigs/ ../anoncoin/contrib/gitian-descriptors/gitian.yml
pushd build/out
- zip -r litecoin-${VERSION}-linux-gitian.zip *
- mv litecoin-${VERSION}-linux-gitian.zip ../../
+ zip -r anoncoin-${VERSION}-linux-gitian.zip *
+ mv anoncoin-${VERSION}-linux-gitian.zip ../../
popd
- ./bin/gbuild --commit litecoin=v${VERSION} ../litecoin/contrib/gitian-descriptors/gitian-win32.yml
- ./bin/gsign --signer $SIGNER --release ${VERSION}-win32 --destination ../gitian.sigs/ ../litecoin/contrib/gitian-descriptors/gitian-win32.yml
+ ./bin/gbuild --commit anoncoin=v${VERSION} ../anoncoin/contrib/gitian-descriptors/gitian-win32.yml
+ ./bin/gsign --signer $SIGNER --release ${VERSION}-win32 --destination ../gitian.sigs/ ../anoncoin/contrib/gitian-descriptors/gitian-win32.yml
pushd build/out
- zip -r litecoin-${VERSION}-win32-gitian.zip *
- mv litecoin-${VERSION}-win32-gitian.zip ../../
+ zip -r anoncoin-${VERSION}-win32-gitian.zip *
+ mv anoncoin-${VERSION}-win32-gitian.zip ../../
popd
Build output expected:
- 1. linux 32-bit and 64-bit binaries + source (litecoin-${VERSION}-linux-gitian.zip)
- 2. windows 32-bit binary, installer + source (litecoin-${VERSION}-win32-gitian.zip)
+ 1. linux 32-bit and 64-bit binaries + source (anoncoin-${VERSION}-linux-gitian.zip)
+ 2. windows 32-bit binary, installer + source (anoncoin-${VERSION}-win32-gitian.zip)
3. Gitian signatures (in gitian.sigs/${VERSION}[-win32]/(your gitian key)/
repackage gitian builds for release as stand-alone zip/tar/installer exe
**Linux .tar.gz:**
- unzip litecoin-${VERSION}-linux-gitian.zip -d litecoin-${VERSION}-linux
- tar czvf litecoin-${VERSION}-linux.tar.gz litecoin-${VERSION}-linux
- rm -rf litecoin-${VERSION}-linux
+ unzip anoncoin-${VERSION}-linux-gitian.zip -d anoncoin-${VERSION}-linux
+ tar czvf anoncoin-${VERSION}-linux.tar.gz anoncoin-${VERSION}-linux
+ rm -rf anoncoin-${VERSION}-linux
**Windows .zip and setup.exe:**
- unzip litecoin-${VERSION}-win32-gitian.zip -d litecoin-${VERSION}-win32
- mv litecoin-${VERSION}-win32/litecoin-*-setup.exe .
- zip -r litecoin-${VERSION}-win32.zip bitcoin-${VERSION}-win32
- rm -rf litecoin-${VERSION}-win32
+ unzip anoncoin-${VERSION}-win32-gitian.zip -d anoncoin-${VERSION}-win32
+ mv anoncoin-${VERSION}-win32/anoncoin-*-setup.exe .
+ zip -r anoncoin-${VERSION}-win32.zip bitcoin-${VERSION}-win32
+ rm -rf anoncoin-${VERSION}-win32
**Perform Mac build:**
- OSX binaries are created by Gavin Andresen on a 32-bit, OSX 10.6 machine.
+ OSX binaries are created by Meeh on a 64-bit, OSX 10.7.5 machine.
- qmake RELEASE=1 USE_UPNP=1 USE_QRCODE=1 litecoin-qt.pro
+ qmake RELEASE=1 USE_UPNP=1 USE_QRCODE=1 anoncoin-qt.pro
make
export QTDIR=/opt/local/share/qt4 # needed to find translations/qt_*.qm files
T=$(contrib/qt_translations.py $QTDIR/translations src/qt/locale)
python2.7 share/qt/clean_mac_info_plist.py
- python2.7 contrib/macdeploy/macdeployqtplus Bitcoin-Qt.app -add-qt-tr $T -dmg -fancy contrib/macdeploy/fancy.plist
+ python2.7 contrib/macdeploy/macdeployqtplus Anoncoin-Qt.app -add-qt-tr $T -dmg -fancy contrib/macdeploy/fancy.plist
Build output expected: Bitcoin-Qt.dmg
###Next steps:
* Code-sign Windows -setup.exe (in a Windows virtual machine) and
- OSX Bitcoin-Qt.app (Note: only Gavin has the code-signing keys currently)
+ OSX Anoncoin-Qt.app (Note: only Meeh has the code-signing keys currently)
* upload builds to SourceForge
* create SHA256SUMS for builds, and PGP-sign it
-* update litecoin.org version
+* update anoncoin.org version
make sure all OS download links go to the right versions
* update forum version
* update wiki download links
-* update wiki changelog: [https://en.litecoin.it/wiki/Changelog](https://en.bitcoin.it/wiki/Changelog)
+* update wiki changelog: [https://en.bitcoin.it/wiki/Changelog](https://en.bitcoin.it/wiki/Changelog)
Commit your signature to gitian.sigs:
@@ -129,32 +129,32 @@
### After 3 or more people have gitian-built, repackage gitian-signed zips:
-From a directory containing litecoin source, gitian.sigs and gitian zips
+From a directory containing anoncoin source, gitian.sigs and gitian zips
export VERSION=0.5.1
- mkdir litecoin-${VERSION}-linux-gitian
- pushd litecoin-${VERSION}-linux-gitian
- unzip ../litecoin-${VERSION}-linux-gitian.zip
+ mkdir anoncoin-${VERSION}-linux-gitian
+ pushd anoncoin-${VERSION}-linux-gitian
+ unzip ../anoncoin-${VERSION}-linux-gitian.zip
mkdir gitian
- cp ../litecoin/contrib/gitian-downloader/*.pgp ./gitian/
+ cp ../anoncoin/contrib/gitian-downloader/*.pgp ./gitian/
for signer in $(ls ../gitian.sigs/${VERSION}/); do
- cp ../gitian.sigs/${VERSION}/${signer}/litecoin-build.assert ./gitian/${signer}-build.assert
- cp ../gitian.sigs/${VERSION}/${signer}/litecoin-build.assert.sig ./gitian/${signer}-build.assert.sig
+ cp ../gitian.sigs/${VERSION}/${signer}/anoncoin-build.assert ./gitian/${signer}-build.assert
+ cp ../gitian.sigs/${VERSION}/${signer}/anoncoin-build.assert.sig ./gitian/${signer}-build.assert.sig
done
- zip -r litecoin-${VERSION}-linux-gitian.zip *
- cp litecoin-${VERSION}-linux-gitian.zip ../
+ zip -r anoncoin-${VERSION}-linux-gitian.zip *
+ cp anoncoin-${VERSION}-linux-gitian.zip ../
popd
- mkdir litecoin-${VERSION}-win32-gitian
- pushd litecoin-${VERSION}-win32-gitian
- unzip ../litecoin-${VERSION}-win32-gitian.zip
+ mkdir anoncoin-${VERSION}-win32-gitian
+ pushd anoncoin-${VERSION}-win32-gitian
+ unzip ../anoncoin-${VERSION}-win32-gitian.zip
mkdir gitian
- cp ../litecoin/contrib/gitian-downloader/*.pgp ./gitian/
+ cp ../anoncoin/contrib/gitian-downloader/*.pgp ./gitian/
for signer in $(ls ../gitian.sigs/${VERSION}-win32/); do
- cp ../gitian.sigs/${VERSION}-win32/${signer}/litecoin-build.assert ./gitian/${signer}-build.assert
- cp ../gitian.sigs/${VERSION}-win32/${signer}/litecoin-build.assert.sig ./gitian/${signer}-build.assert.sig
+ cp ../gitian.sigs/${VERSION}-win32/${signer}/anoncoin-build.assert ./gitian/${signer}-build.assert
+ cp ../gitian.sigs/${VERSION}-win32/${signer}/anoncoin-build.assert.sig ./gitian/${signer}-build.assert.sig
done
- zip -r litecoin-${VERSION}-win32-gitian.zip *
- cp litecoin-${VERSION}-win32-gitian.zip ../
+ zip -r anoncoin-${VERSION}-win32-gitian.zip *
+ cp anoncoin-${VERSION}-win32-gitian.zip ../
popd
- Upload gitian zips to SourceForge
diff -Nru anoncoin-0.8.5.6/.gitignore anoncoin-0.8.5.6+git20141111.r4233/.gitignore
--- anoncoin-0.8.5.6/.gitignore 2013-12-24 19:07:16.000000000 +0000
+++ anoncoin-0.8.5.6+git20141111.r4233/.gitignore 2014-11-11 13:56:18.000000000 +0000
@@ -1,7 +1,7 @@
src/*.exe
-src/litecoin
-src/litecoind
-src/test_litecoin
+src/anoncoin
+src/anoncoind
+src/test_anoncoind
.*.swp
*.*~*
*.bak
@@ -9,17 +9,17 @@
*.orig
*.o
*.patch
-.litecoin
+.anoncoin
# Compilation and Qt preprocessor part
*.qm
Makefile
-litecoin-qt
-Litecoin-Qt.app
+anoncoin-qt
+Anoncoin-Qt.app
# Unit-tests
Makefile.test
-litecoin-qt_test
+anoncoin-qt_test
# Resources cpp
qrc_*.cpp
diff -Nru anoncoin-0.8.5.6/i2psam/.gitignore anoncoin-0.8.5.6+git20141111.r4233/i2psam/.gitignore
--- anoncoin-0.8.5.6/i2psam/.gitignore 1970-01-01 00:00:00.000000000 +0000
+++ anoncoin-0.8.5.6+git20141111.r4233/i2psam/.gitignore 2014-11-11 13:56:18.000000000 +0000
@@ -0,0 +1 @@
+libi2psam.a
diff -Nru anoncoin-0.8.5.6/i2psam/makefile.linux-mingw anoncoin-0.8.5.6+git20141111.r4233/i2psam/makefile.linux-mingw
--- anoncoin-0.8.5.6/i2psam/makefile.linux-mingw 2013-12-24 19:07:16.000000000 +0000
+++ anoncoin-0.8.5.6+git20141111.r4233/i2psam/makefile.linux-mingw 2014-11-11 13:56:18.000000000 +0000
@@ -7,13 +7,13 @@
####### Compiler, tools and options
-CC = i586-mingw32msvc-gcc
-CXX = i586-mingw32msvc-g++
+CC = i686-w64-mingw32-gcc
+CXX = i686-w64-mingw32-g++
DEFINES = -D_MT -DWIN32 -D_WINDOWS
-CFLAGS = -pipe -isystem /usr/i586-mingw32msvc/include/ -O2 -Wall -Wextra $(DEFINES)
+CFLAGS = -pipe -isystem /usr/i686-w64-mingw32/include/ -O2 -Wall -Wextra $(DEFINES)
CXXFLAGS = -O2 -fexceptions -Wall -Wextra $(DEFINES)
INCPATH = -I'../../dependencies/mingw32/qt/include' -I'../../dependencies/mingw32' -I'../../dependencies/mingw32/qt/include/ActiveQt' -I'../../dependencies/mingw32/qt/mkspecs/unsupported/win32-g++-cross'
-LIB = i586-mingw32msvc-ar -ru
+LIB = i686-w64-mingw32-ar -ru
COPY = cp
SED = sed
COPY_FILE = $(COPY)
diff -Nru anoncoin-0.8.5.6/INSTALL anoncoin-0.8.5.6+git20141111.r4233/INSTALL
--- anoncoin-0.8.5.6/INSTALL 2013-12-24 19:07:16.000000000 +0000
+++ anoncoin-0.8.5.6+git20141111.r4233/INSTALL 2014-11-11 13:56:18.000000000 +0000
@@ -1,9 +1,9 @@
-Building Litecoin
+Building Anoncoin
-See doc/readme-qt.rst for instructions on building Litecoin-Qt,
+See doc/readme-qt.rst for instructions on building Anoncoin-Qt,
the intended-for-end-users, nice-graphical-interface, reference
-implementation of Litecoin.
+implementation of Anoncoin.
-See doc/build-*.txt for instructions on building litecoind,
+See doc/build-*.txt for instructions on building anoncoind,
the intended-for-services, no-graphical-interface, reference
-implementation of Litecoin.
+implementation of Anoncoin.
diff -Nru anoncoin-0.8.5.6/README.md anoncoin-0.8.5.6+git20141111.r4233/README.md
--- anoncoin-0.8.5.6/README.md 2013-12-24 19:07:16.000000000 +0000
+++ anoncoin-0.8.5.6+git20141111.r4233/README.md 2014-11-11 13:56:18.000000000 +0000
@@ -1,34 +1,47 @@
-Anoncoin - a fork version of Litecoin optimized for CPU mining using scrypt as a proof of work scheme.
- - 3.42 minute block targets (retarget on ~1680 blocks, 4days)
- - Starts with 4.2 coin blocks until block 42000
- - 7 coin blocks until block 77777
- - 5 coin blocks after 77778, then subsidy halves in 306600 blocks (~2 years)
-
-Development process
-===================
-
-Developers work in their own trees, then submit pull requests when
-they think their feature or bug fix is ready.
-
-The patch will be accepted if there is broad consensus that it is a
-good thing. Developers should expect to rework and resubmit patches
-if they don't match the project's coding conventions (see coding.txt)
-or are controversial.
-
-The master branch is regularly built and tested, but is not guaranteed
-to be completely stable. Tags are regularly created to indicate new
-official, stable release versions of Anoncoin.
-
-Feature branches are created when there are major new features being
-worked on by several people.
-
-From time to time a pull request will become outdated. If this occurs, and
-the pull is no longer automatically mergeable; a comment on the pull will
-be used to issue a warning of closure. The pull will be closed 15 days
-after the warning if action is not taken by the author. Pull requests closed
-in this manner will have their corresponding issue labeled 'stagnant'.
-
-Issues with no commits will be given a similar warning, and closed after
-15 days from their last activity. Issues closed in this manner will be
-labeled 'stale'.
-
+Anoncoin
+====================
+
+Anoncoin is a privacy-oriented decentralized crypto-currency which uses the I2P network to hide users' identities (Tor is also supported).
+
+Platforms:
+- Linux - [![Build Status - Linux](https://jenkins.nordcloud.no/buildStatus/icon?job=Anoncoin-Linux)](https://jenkins.nordcloud.no/job/Anoncoin-Linux/)
+- Windows (Mingw-w64) - [![Build Status - Mingw-w64](https://jenkins.nordcloud.no/buildStatus/icon?job=Anoncoin-Mingw-w64)](https://jenkins.nordcloud.no/job/Anoncoin-Mingw-w64/)
+- OSX (Build status to be added soon)
+
+Specs:
+ - launched in June 2013
+ - scrypt proof-of-work (same as Litecoin)
+ - 3 minute block targets with KGW retargeting (before block 87777, it was 3.42 minute targets using classic algorithm)
+ - Starts with 4.2 coin blocks until block 42000
+ - 7 coin blocks until block 77777
+ - 5 coin blocks after 77778, then subsidy halves when block height divisible by 306600 (~1.75 years)
+ - total supply will be 3,103,954 ANC
+
+Development process
+===================
+
+Developers work in their own trees, then submit pull requests when
+they think their feature or bug fix is ready.
+
+The patch will be accepted if there is broad consensus that it is a
+good thing. Developers should expect to rework and resubmit patches
+if they don't match the project's coding conventions (see coding.txt)
+or are controversial.
+
+The master branch is regularly built and tested, but is not guaranteed
+to be completely stable. Tags are regularly created to indicate new
+official, stable release versions of Anoncoin.
+
+Feature branches are created when there are major new features being
+worked on by several people.
+
+From time to time a pull request will become outdated. If this occurs, and
+the pull is no longer automatically mergeable; a comment on the pull will
+be used to issue a warning of closure. The pull will be closed 15 days
+after the warning if action is not taken by the author. Pull requests closed
+in this manner will have their corresponding issue labeled 'stagnant'.
+
+Issues with no commits will be given a similar warning, and closed after
+15 days from their last activity. Issues closed in this manner will be
+labeled 'stale'.
+
diff -Nru anoncoin-0.8.5.6/share/pixmaps/bitcoin32.xpm anoncoin-0.8.5.6+git20141111.r4233/share/pixmaps/bitcoin32.xpm
--- anoncoin-0.8.5.6/share/pixmaps/bitcoin32.xpm 2013-12-24 19:07:16.000000000 +0000
+++ anoncoin-0.8.5.6+git20141111.r4233/share/pixmaps/bitcoin32.xpm 2014-11-11 13:56:18.000000000 +0000
@@ -1,348 +1,112 @@
-/* XPM */
-static char *graphic[] = {
-/* width height num_colors chars_per_pixel */
-"32 32 309 2",
-/* colors */
-" c None",
-". c #444444",
-"X c #474747",
-"o c #666666",
-"O c #888888",
-"+ c None",
-"@ c #AAAAAA",
-"# c None",
-"$ c #CCCCCC",
-"% c #474747",
-"& c #EEEEEE",
-"* c #535353",
-"= c None",
-"- c #757575",
-"; c #979797",
-": c #B9B9B9",
-"> c #DBDBDB",
-", c #FDFDFD",
-"< c #626262",
-"1 c #848484",
-"2 c #A6A6A6",
-"3 c #C8C8C8",
-"4 c #EAEAEA",
-"5 c #686868",
-"6 c #737373",
-"7 c #717171",
-"8 c #939393",
-"9 c #B5B5B5",
-"0 c #D7D7D7",
-"q c #F9F9F9",
-"w c #3C3C3C",
-"e c #5E5E5E",
-"r c #808080",
-"t c #4E4E4E",
-"y c None",
-"u c #A2A2A2",
-"i c None",
-"p c #C4C4C4",
-"a c #E6E6E6",
-"s c #4B4B4B",
-"d c None",
-"f c None",
-"g c #6D6D6D",
-"h c #8F8F8F",
-"j c #B1B1B1",
-"k c #D3D3D3",
-"l c #F5F5F5",
-"z c None",
-"x c None",
-"c c #434343",
-"v c None",
-"b c #5A5A5A",
-"n c None",
-"m c #7C7C7C",
-"M c None",
-"N c #9E9E9E",
-"B c #C0C0C0",
-"V c None",
-"C c #E2E2E2",
-"Z c None",
-"A c #5C5C5C",
-"S c #474747",
-"D c None",
-"F c #696969",
-"G c #8B8B8B",
-"H c None",
-"J c #ADADAD",
-"K c #CFCFCF",
-"L c #4A4A4A",
-"P c #F1F1F1",
-"I c None",
-"U c #565656",
-"Y c #787878",
-"T c #9A9A9A",
-"R c #BCBCBC",
-"E c #3F3F3F",
-"W c #DEDEDE",
-"Q c #6F6F6F",
-"! c None",
-"~ c #434343",
-"^ c #656565",
-"/ c None",
-"( c #878787",
-") c #A9A9A9",
-"_ c #CBCBCB",
-"` c #EDEDED",
-"' c None",
-"] c #525252",
-"[ c None",
-"{ c None",
-"} c #747474",
-"| c #6B6B6B",
-" . c #969696",
-".. c #B8B8B8",
-"X. c None",
-"o. c #DADADA",
-"O. c #515151",
-"+. c None",
-"@. c #FCFCFC",
-"#. c None",
-"$. c #3F3F3F",
-"%. c #464646",
-"&. c #616161",
-"*. c #838383",
-"=. c #A5A5A5",
-"-. c #C7C7C7",
-";. c #3B3B3B",
-":. c None",
-">. c #E9E9E9",
-",. c #464646",
-"<. c None",
-"1. c #3B3B3B",
-"2. c None",
-"3. c #4E4E4E",
-"4. c #707070",
-"5. c #929292",
-"6. c #676767",
-"7. c #B4B4B4",
-"8. c #424242",
-"9. c #D6D6D6",
-"0. c #F8F8F8",
-"q. c #3B3B3B",
-"w. c None",
-"e. c None",
-"r. c #5D5D5D",
-"t. c None",
-"y. c #7F7F7F",
-"u. c None",
-"i. c #A1A1A1",
-"p. c #C3C3C3",
-"a. c #E5E5E5",
-"s. c None",
-"d. c None",
-"f. c None",
-"g. c #373737",
-"h. c None",
-"j. c #4D4D4D",
-"k. c #4A4A4A",
-"l. c #6C6C6C",
-"z. c #8E8E8E",
-"x. c #424242",
-"c. c None",
-"v. c #B0B0B0",
-"b. c #4D4D4D",
-"n. c #D2D2D2",
-"m. c None",
-"M. c #F4F4F4",
-"N. c #424242",
-"B. c None",
-"V. c #4D4D4D",
-"C. c None",
-"Z. c #7B7B7B",
-"A. c #9D9D9D",
-"S. c None",
-"D. c #BFBFBF",
-"F. c #E1E1E1",
-"G. c None",
-"H. c #636363",
-"J. c None",
-"K. c #424242",
-"L. c #464646",
-"P. c None",
-"I. c None",
-"U. c #686868",
-"Y. c #8A8A8A",
-"T. c #424242",
-"R. c None",
-"E. c #ACACAC",
-"W. c #CECECE",
-"Q. c None",
-"!. c #424242",
-"~. c #F0F0F0",
-"^. c #555555",
-"/. c #777777",
-"(. c None",
-"). c #999999",
-"_. c None",
-"`. c #BBBBBB",
-"'. c #DDDDDD",
-"]. c None",
-"[. c #FFFFFF",
-"{. c #424242",
-"}. c None",
-"|. c #868686",
-" X c #A8A8A8",
-".X c #CACACA",
-"XX c #3E3E3E",
-"oX c #ECECEC",
-"OX c #454545",
-"+X c #515151",
-"@X c #737373",
-"#X c #959595",
-"$X c #B7B7B7",
-"%X c #D9D9D9",
-"&X c #454545",
-"*X c #FBFBFB",
-"=X c None",
-"-X c None",
-";X c #454545",
-":X c #606060",
-">X c #A4A4A4",
-",X c #3A3A3A",
-"o c #484848",
-",o c #6A6A6A",
-"X&o+XE uX+. ",
-" m.;X* _X3 C P 0.*X[X[X@.0.& roXoh 6X8.v ",
-" { ^XPX=oa.eXM.%X..u 8 8XwokX0 6oxXC VXg XX/ ",
-" d ~ G 9.~.eX.6owX|Xg.s. ",
-" I.,.- wXl ro; @ 2o=.mXm _ Xo-.K r =.XoyXg g a.P 4o,o%.KX ",
-" bX+XB ~.oo*oeo9 2 GX@XkX$ p -.W (Xy.Y g 7Xr.F 4 4 YXS 1X ",
-" <.DX8 pX$oGX..2o.o XJ gX_ !X$ k W.] Z.0o7 g r N j xXW O MXu. ",
-" 'XLXX@ ).} W W.#opXGXU y.&o_X..9.a D.n.JXB >ow. ",
-"h.b.y.rol 8X8XwoN yXQXZ.8 a ]XTX~.*.7 ) =ok 9.]XCX0 2 P o.(Xt d.",
-"IX7o=.& o.&o#XUX.oE.7.7XYXooC oo>.L.F =.HXlX#o-.=.m :XW 2X).T._.",
-"M s eoeX: O v.eoB eo@ogX'.>.~X6opX=.: /.3 @o5.PX,o,o9o..6o9X. Z ",
-"Q.9o!X$o..3 k .XXop .} $oJXM.0.[.[.).l.z.Z./.PX7XF gXGXl B dX+ ",
-"Q tXW.M...wXwX.X7.Y +Xv.[.q , [.kX< tX|XWXr 0oPX( kXW.: ~.-.* 6.",
-"qo%oHXM.: $ 7..o} &ooX[.RX, RXJX* &o_XoJ.",
-"! >o`.$o`.r _X_XFXEX,oRXxX~.*X_X&.8X8 yX) J @oeo$XUXEX: P j {.# ",
-"e.!.i.oXTXy.i.`X.X( QX*XoX>.$o|X%o4.(X@X} /.PX%oF F }Xrooo .AXy ",
-"= j.mX'.6oGX0 0 #oy.HXJXa -oa.oo-oroW TXo.]XF.tXo ^ O $o0 l.O.}.",
-" 2.3.iX6o4oeoC iXY & 4 oopXCXW TX]X9.k 4olX$ dXy.Z.K & `.. f ",
-" X.K. r c z ",
-" 6 dX`.~X4 F U dX$.k.}Xg g F SX^ :Xb e F mXB @o>.a 7.{.#. ",
-" =X&XgXK 6oa 7 (XJ 3 4o!XiXVX@ou UXN J eo$X2 pX4 _ e V.n ",
-" o3Xy.wX~.~X@op 0 wXW.YXwo( |.5.A.*o .@ 4 ~X4o@X;.I ",
-" G.w y.4o~Xl K @o Xr < EXOo/.&o*.NX4oxXa _ @X3of. ",
-" aX,XU.: CX~.6oo.7.*o .T XD.W xX& TX7.e DXcX ",
-" i OX>o( D.> 4 xX0.0.eX$oP 2X%X`.r . L 5X ",
-" S.[ N.dX4.UX9X=o-.-.B j #Xl.L.x.' C. ",
-" (.BXrXK.~ >o/X/X>o~ ZX0X{Xx ",
-" zXqXt.)X| w.-X1o "
-};
+/* XPM */
+static char * bitcoin32_xpm[] = {
+"32 32 77 1",
+" c None",
+". c #A2A1A1",
+"+ c #A1A1A1",
+"@ c #A1A0A0",
+"# c #9F9F9F",
+"$ c #A7A7A7",
+"% c #A9A9A9",
+"& c #AEAEAE",
+"* c #B0B0B0",
+"= c #B1B1B1",
+"- c #A8A8A8",
+"; c #A4A4A4",
+"> c #ACACAC",
+", c #B2B2B2",
+"' c #AAAAAA",
+") c #ABABAB",
+"! c #A6A6A6",
+"~ c #A3A3A3",
+"{ c #A8A7A7",
+"] c #A5A5A5",
+"^ c #ADADAD",
+"/ c #9E9E9E",
+"( c #ADACAC",
+"_ c #A2A2A2",
+": c #A0A0A0",
+"< c #9D9D9D",
+"[ c #A5A4A4",
+"} c #9C9C9C",
+"| c #9B9B9B",
+"1 c #979797",
+"2 c #8C8C8C",
+"3 c #848484",
+"4 c #838383",
+"5 c #878787",
+"6 c #929292",
+"7 c #9A9A9A",
+"8 c #AFAFAF",
+"9 c #8B8B8B",
+"0 c #7F7F7F",
+"a c #808080",
+"b c #7E7E7E",
+"c c #828282",
+"d c #969696",
+"e c #939292",
+"f c #999999",
+"g c #898989",
+"h c #8A8A8A",
+"i c #888888",
+"j c #959595",
+"k c #939393",
+"l c #909090",
+"m c #8D8D8D",
+"n c #9D9C9C",
+"o c #B4B4B4",
+"p c #B6B6B6",
+"q c #919090",
+"r c #A9A8A8",
+"s c #B8B8B8",
+"t c #BCBCBC",
+"u c #B5B5B5",
+"v c #C5C5C5",
+"w c #C1C1C1",
+"x c #B3B3B3",
+"y c #C8C8C8",
+"z c #BFBFBF",
+"A c #B9B9B9",
+"B c #AAA9A9",
+"C c #9E9D9D",
+"D c #949494",
+"E c #919191",
+"F c #8E8E8E",
+"G c #858585",
+"H c #B7B7B7",
+"I c #818181",
+"J c #989898",
+"K c #949393",
+"L c #989797",
+" ",
+" .+@ ",
+" #$%&*==*&-; ",
+" +>,')'!;~!%%)={ ",
+" -*)&'!;+##+~]%^%*/ ",
+" ()&'$;_:/<#+~!%>'[ ",
+" ^%'!~+#/<}|||}/#+~!%-] ",
+" '));_:/<}1234567<<#+~'%# ",
+" _&8$_/<}}790aabcd<}+!>&e ",
+" *,);:/}% ",
+" ]88$_/}<#+fkllmi47_:<}<+!^8j ",
+" ^,);:<}<+;}7djkmh;!_/}<#~%>~ ",
+" no8$_/<<#_]#:}|fk18';#<}/+!^= ",
+" %^);:<}<:]]_]~_:}$p^!+/}<#~%=q ",
+" r%$_#<<#_-!!%''%]st,';:/}/+]$# ",
+" ;-;:<}<:;)!'^8,u&vwp&$+/}<#~~+ ",
+" ]']+/}<:;-~-*=xuxyzu^]+/}<:~]+ ",
+" ;>-~#<]+<}<:}f'=*)<^s8-~#<}<:;%)C ",
+" !=*%~#<}/dD8=8+jEF2i9d}}/_$&u ",
+" ou>]+<}|kD,**#|1DlmG57<:;'x* ",
+" BH*%~#<7k<=*8&>%;+/gI7/+$^8+ ",
+" :xu>]+<}1-=*8&^%]_:a4|#;',x9 ",
+" (p*-~#/<~~_+_+#]~+:/}fJJfJ1dk6}_;'== ",
+" +&=>-]_+#/<<<<<#:_;$)8&K ",
+" [&u*^-]~+#<+_]-)8x&| ",
+" _*su8>%]~+:_;$)8oo=L ",
+" L*,Au*>-]]$)&oH,>2 ",
+" #*p,o=^)8,8p)f ",
+" D:]^=*>_#m ",
+" "};
Binary files /tmp/HJIlW0zWiX/anoncoin-0.8.5.6/share/pixmaps/bitcoin-bc.ico and /tmp/M7FtINbfTK/anoncoin-0.8.5.6+git20141111.r4233/share/pixmaps/bitcoin-bc.ico differ
Binary files /tmp/HJIlW0zWiX/anoncoin-0.8.5.6/share/pixmaps/bitcoin.ico and /tmp/M7FtINbfTK/anoncoin-0.8.5.6+git20141111.r4233/share/pixmaps/bitcoin.ico differ
Binary files /tmp/HJIlW0zWiX/anoncoin-0.8.5.6/share/pixmaps/favicon.ico and /tmp/M7FtINbfTK/anoncoin-0.8.5.6+git20141111.r4233/share/pixmaps/favicon.ico differ
Binary files /tmp/HJIlW0zWiX/anoncoin-0.8.5.6/share/pixmaps/nsis-header.bmp and /tmp/M7FtINbfTK/anoncoin-0.8.5.6+git20141111.r4233/share/pixmaps/nsis-header.bmp differ
Binary files /tmp/HJIlW0zWiX/anoncoin-0.8.5.6/share/pixmaps/nsis-wizard.bmp and /tmp/M7FtINbfTK/anoncoin-0.8.5.6+git20141111.r4233/share/pixmaps/nsis-wizard.bmp differ
diff -Nru anoncoin-0.8.5.6/share/qt/clean_mac_info_plist.py anoncoin-0.8.5.6+git20141111.r4233/share/qt/clean_mac_info_plist.py
--- anoncoin-0.8.5.6/share/qt/clean_mac_info_plist.py 2013-12-24 19:07:16.000000000 +0000
+++ anoncoin-0.8.5.6+git20141111.r4233/share/qt/clean_mac_info_plist.py 2014-11-11 13:56:18.000000000 +0000
@@ -9,10 +9,10 @@
bitcoinDir = "./";
inFile = bitcoinDir+"/share/qt/Info.plist"
-outFile = "Bitcoin-Qt.app/Contents/Info.plist"
+outFile = "Anoncoin-Qt.app/Contents/Info.plist"
version = "unknown";
-fileForGrabbingVersion = bitcoinDir+"bitcoin-qt.pro"
+fileForGrabbingVersion = bitcoinDir+"anoncoin-qt.pro"
for line in open(fileForGrabbingVersion):
lineArr = line.replace(" ", "").split("=");
if lineArr[0].startswith("VERSION"):
@@ -26,4 +26,4 @@
fOut = open(outFile, "w");
fOut.write(newFileContent);
-print "Info.plist fresh created"
\ No newline at end of file
+print "Info.plist fresh created"
diff -Nru anoncoin-0.8.5.6/share/setup.nsi anoncoin-0.8.5.6+git20141111.r4233/share/setup.nsi
--- anoncoin-0.8.5.6/share/setup.nsi 2013-12-24 19:07:16.000000000 +0000
+++ anoncoin-0.8.5.6+git20141111.r4233/share/setup.nsi 2014-11-11 13:56:18.000000000 +0000
@@ -5,9 +5,9 @@
# General Symbol Definitions
!define REGKEY "SOFTWARE\$(^Name)"
-!define VERSION 0.8.5.1
+!define VERSION 0.8.5.6
!define COMPANY "Anoncoin project"
-!define URL https://anoncoin/
+!define URL https://anoncoin.net/
# MUI Symbol Definitions
!define MUI_ICON "../share/pixmaps/bitcoin.ico"
@@ -45,13 +45,13 @@
!insertmacro MUI_LANGUAGE English
# Installer attributes
-OutFile anoncoin-0.8.5.1-win32-setup.exe
+OutFile anoncoin-0.8.5.6-win32-setup.exe
InstallDir $PROGRAMFILES\Anoncoin
CRCCheck on
XPStyle on
BrandingText " "
ShowInstDetails show
-VIProductVersion 0.8.5.1
+VIProductVersion 0.8.5.6
VIAddVersionKey ProductName Anoncoin
VIAddVersionKey ProductVersion "${VERSION}"
VIAddVersionKey CompanyName "${COMPANY}"
diff -Nru anoncoin-0.8.5.6/src/anoncoinrpc.cpp anoncoin-0.8.5.6+git20141111.r4233/src/anoncoinrpc.cpp
--- anoncoin-0.8.5.6/src/anoncoinrpc.cpp 1970-01-01 00:00:00.000000000 +0000
+++ anoncoin-0.8.5.6+git20141111.r4233/src/anoncoinrpc.cpp 2014-11-11 13:56:18.000000000 +0000
@@ -0,0 +1,1305 @@
+// Copyright (c) 2010 Satoshi Nakamoto
+// Copyright (c) 2009-2012 The Bitcoin developers
+// Distributed under the MIT/X11 software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#include "init.h"
+#include "util.h"
+#include "sync.h"
+#include "ui_interface.h"
+#include "base58.h"
+#include "anoncoinrpc.h"
+#include "db.h"
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+using namespace std;
+using namespace boost;
+using namespace boost::asio;
+using namespace json_spirit;
+
+static std::string strRPCUserColonPass;
+
+// These are created by StartRPCThreads, destroyed in StopRPCThreads
+static asio::io_service* rpc_io_service = NULL;
+static ssl::context* rpc_ssl_context = NULL;
+static boost::thread_group* rpc_worker_group = NULL;
+
+static inline unsigned short GetDefaultRPCPort()
+{
+ return GetBoolArg("-testnet", false) ? 19376 : 9376;
+}
+
+Object JSONRPCError(int code, const string& message)
+{
+ Object error;
+ error.push_back(Pair("code", code));
+ error.push_back(Pair("message", message));
+ return error;
+}
+
+void RPCTypeCheck(const Array& params,
+ const list& typesExpected,
+ bool fAllowNull)
+{
+ unsigned int i = 0;
+ BOOST_FOREACH(Value_type t, typesExpected)
+ {
+ if (params.size() <= i)
+ break;
+
+ const Value& v = params[i];
+ if (!((v.type() == t) || (fAllowNull && (v.type() == null_type))))
+ {
+ string err = strprintf("Expected type %s, got %s",
+ Value_type_name[t], Value_type_name[v.type()]);
+ throw JSONRPCError(RPC_TYPE_ERROR, err);
+ }
+ i++;
+ }
+}
+
+void RPCTypeCheck(const Object& o,
+ const map& typesExpected,
+ bool fAllowNull)
+{
+ BOOST_FOREACH(const PAIRTYPE(string, Value_type)& t, typesExpected)
+ {
+ const Value& v = find_value(o, t.first);
+ if (!fAllowNull && v.type() == null_type)
+ throw JSONRPCError(RPC_TYPE_ERROR, strprintf("Missing %s", t.first.c_str()));
+
+ if (!((v.type() == t.second) || (fAllowNull && (v.type() == null_type))))
+ {
+ string err = strprintf("Expected type %s for %s, got %s",
+ Value_type_name[t.second], t.first.c_str(), Value_type_name[v.type()]);
+ throw JSONRPCError(RPC_TYPE_ERROR, err);
+ }
+ }
+}
+
+int64 AmountFromValue(const Value& value)
+{
+ double dAmount = value.get_real();
+ if (dAmount <= 0.0 || dAmount > 4200000.0)
+ throw JSONRPCError(RPC_TYPE_ERROR, "Invalid amount");
+ int64 nAmount = roundint64(dAmount * COIN);
+ if (!MoneyRange(nAmount))
+ throw JSONRPCError(RPC_TYPE_ERROR, "Invalid amount");
+ return nAmount;
+}
+
+Value ValueFromAmount(int64 amount)
+{
+ return (double)amount / (double)COIN;
+}
+
+std::string HexBits(unsigned int nBits)
+{
+ union {
+ int32_t nBits;
+ char cBits[4];
+ } uBits;
+ uBits.nBits = htonl((int32_t)nBits);
+ return HexStr(BEGIN(uBits.cBits), END(uBits.cBits));
+}
+
+
+
+///
+/// Note: This interface may still be subject to change.
+///
+
+string CRPCTable::help(string strCommand) const
+{
+ string strRet;
+ set setDone;
+ for (map::const_iterator mi = mapCommands.begin(); mi != mapCommands.end(); ++mi)
+ {
+ const CRPCCommand *pcmd = mi->second;
+ string strMethod = mi->first;
+ // We already filter duplicates, but these deprecated screw up the sort order
+ if (strMethod.find("label") != string::npos)
+ continue;
+ if (strCommand != "" && strMethod != strCommand)
+ continue;
+ if (pcmd->reqWallet && !pwalletMain)
+ continue;
+
+ try
+ {
+ Array params;
+ rpcfn_type pfn = pcmd->actor;
+ if (setDone.insert(pfn).second)
+ (*pfn)(params, true);
+ }
+ catch (std::exception& e)
+ {
+ // Help text is returned in an exception
+ string strHelp = string(e.what());
+ if (strCommand == "")
+ if (strHelp.find('\n') != string::npos)
+ strHelp = strHelp.substr(0, strHelp.find('\n'));
+ strRet += strHelp + "\n";
+ }
+ }
+ if (strRet == "")
+ strRet = strprintf("help: unknown command: %s\n", strCommand.c_str());
+ strRet = strRet.substr(0,strRet.size()-1);
+ return strRet;
+}
+
+Value help(const Array& params, bool fHelp)
+{
+ if (fHelp || params.size() > 1)
+ throw runtime_error(
+ "help [command]\n"
+ "List commands, or get help for a command.");
+
+ string strCommand;
+ if (params.size() > 0)
+ strCommand = params[0].get_str();
+
+ return tableRPC.help(strCommand);
+}
+
+
+Value stop(const Array& params, bool fHelp)
+{
+ // Accept the deprecated and ignored 'detach' boolean argument
+ if (fHelp || params.size() > 1)
+ throw runtime_error(
+ "stop\n"
+ "Stop Anoncoin server.");
+ // Shutdown will take long enough that the response should get back
+ StartShutdown();
+ return "Anoncoin server stopping";
+}
+
+
+
+//
+// Call Table
+//
+
+
+static const CRPCCommand vRPCCommands[] =
+{ // name actor (function) okSafeMode threadSafe reqWallet
+ // ------------------------ ----------------------- ---------- ---------- ---------
+ { "help", &help, true, true, false },
+ { "stop", &stop, true, true, false },
+ { "getblockcount", &getblockcount, true, false, false },
+ { "getbestblockhash", &getbestblockhash, true, false, false },
+ { "getconnectioncount", &getconnectioncount, true, false, false },
+ { "getpeerinfo", &getpeerinfo, true, false, false },
+ { "addnode", &addnode, true, true, false },
+ { "getaddednodeinfo", &getaddednodeinfo, true, true, false },
+ { "getdifficulty", &getdifficulty, true, false, false },
+ { "getnetworkhashps", &getnetworkhashps, true, false, false },
+ { "getgenerate", &getgenerate, true, false, false },
+ { "setgenerate", &setgenerate, true, false, true },
+ { "gethashespersec", &gethashespersec, true, false, false },
+ { "getinfo", &getinfo, true, false, false },
+ { "getmininginfo", &getmininginfo, true, false, false },
+ { "getnewaddress", &getnewaddress, true, false, true },
+ { "getaccountaddress", &getaccountaddress, true, false, true },
+ { "setaccount", &setaccount, true, false, true },
+ { "getaccount", &getaccount, false, false, true },
+ { "getaddressesbyaccount", &getaddressesbyaccount, true, false, true },
+ { "sendtoaddress", &sendtoaddress, false, false, true },
+ { "getreceivedbyaddress", &getreceivedbyaddress, false, false, true },
+ { "getreceivedbyaccount", &getreceivedbyaccount, false, false, true },
+ { "listreceivedbyaddress", &listreceivedbyaddress, false, false, true },
+ { "listreceivedbyaccount", &listreceivedbyaccount, false, false, true },
+ { "backupwallet", &backupwallet, true, false, true },
+ { "keypoolrefill", &keypoolrefill, true, false, true },
+ { "walletpassphrase", &walletpassphrase, true, false, true },
+ { "walletpassphrasechange", &walletpassphrasechange, false, false, true },
+ { "walletlock", &walletlock, true, false, true },
+ { "encryptwallet", &encryptwallet, false, false, true },
+ { "validateaddress", &validateaddress, true, false, false },
+ { "getbalance", &getbalance, false, false, true },
+ { "move", &movecmd, false, false, true },
+ { "sendfrom", &sendfrom, false, false, true },
+ { "sendmany", &sendmany, false, false, true },
+ { "addmultisigaddress", &addmultisigaddress, false, false, true },
+ { "createmultisig", &createmultisig, true, true , false },
+ { "getrawmempool", &getrawmempool, true, false, false },
+ { "getblock", &getblock, false, false, false },
+ { "getblockhash", &getblockhash, false, false, false },
+ { "gettransaction", &gettransaction, false, false, true },
+ { "listtransactions", &listtransactions, false, false, true },
+ { "listaddressgroupings", &listaddressgroupings, false, false, true },
+ { "signmessage", &signmessage, false, false, true },
+ { "verifymessage", &verifymessage, false, false, false },
+ { "getwork", &getwork, true, false, true },
+ { "getworkex", &getworkex, true, false, true },
+ { "listaccounts", &listaccounts, false, false, true },
+ { "settxfee", &settxfee, false, false, true },
+ { "getblocktemplate", &getblocktemplate, true, false, false },
+ { "submitblock", &submitblock, false, false, false },
+ { "setmininput", &setmininput, false, false, false },
+ { "listsinceblock", &listsinceblock, false, false, true },
+ { "dumpprivkey", &dumpprivkey, true, false, true },
+ { "importprivkey", &importprivkey, false, false, true },
+ { "listunspent", &listunspent, false, false, true },
+ { "getrawtransaction", &getrawtransaction, false, false, false },
+ { "createrawtransaction", &createrawtransaction, false, false, false },
+ { "decoderawtransaction", &decoderawtransaction, false, false, false },
+ { "signrawtransaction", &signrawtransaction, false, false, false },
+ { "sendrawtransaction", &sendrawtransaction, false, false, false },
+ { "gettxoutsetinfo", &gettxoutsetinfo, true, false, false },
+ { "gettxout", &gettxout, true, false, false },
+ { "lockunspent", &lockunspent, false, false, true },
+ { "listlockunspent", &listlockunspent, false, false, true },
+ { "verifychain", &verifychain, true, false, false },
+};
+
+CRPCTable::CRPCTable()
+{
+ unsigned int vcidx;
+ for (vcidx = 0; vcidx < (sizeof(vRPCCommands) / sizeof(vRPCCommands[0])); vcidx++)
+ {
+ const CRPCCommand *pcmd;
+
+ pcmd = &vRPCCommands[vcidx];
+ mapCommands[pcmd->name] = pcmd;
+ }
+}
+
+const CRPCCommand *CRPCTable::operator[](string name) const
+{
+ map::const_iterator it = mapCommands.find(name);
+ if (it == mapCommands.end())
+ return NULL;
+ return (*it).second;
+}
+
+//
+// HTTP protocol
+//
+// This ain't Apache. We're just using HTTP header for the length field
+// and to be compatible with other JSON-RPC implementations.
+//
+
+string HTTPPost(const string& strMsg, const map& mapRequestHeaders)
+{
+ ostringstream s;
+ s << "POST / HTTP/1.1\r\n"
+ << "User-Agent: anoncoin-json-rpc/" << FormatFullVersion() << "\r\n"
+ << "Host: 127.0.0.1\r\n"
+ << "Content-Type: application/json\r\n"
+ << "Content-Length: " << strMsg.size() << "\r\n"
+ << "Connection: close\r\n"
+ << "Accept: application/json\r\n";
+ BOOST_FOREACH(const PAIRTYPE(string, string)& item, mapRequestHeaders)
+ s << item.first << ": " << item.second << "\r\n";
+ s << "\r\n" << strMsg;
+
+ return s.str();
+}
+
+string rfc1123Time()
+{
+ char buffer[64];
+ time_t now;
+ time(&now);
+ struct tm* now_gmt = gmtime(&now);
+ string locale(setlocale(LC_TIME, NULL));
+ setlocale(LC_TIME, "C"); // we want POSIX (aka "C") weekday/month strings
+ strftime(buffer, sizeof(buffer), "%a, %d %b %Y %H:%M:%S +0000", now_gmt);
+ setlocale(LC_TIME, locale.c_str());
+ return string(buffer);
+}
+
+static string HTTPReply(int nStatus, const string& strMsg, bool keepalive)
+{
+ if (nStatus == HTTP_UNAUTHORIZED)
+ return strprintf("HTTP/1.0 401 Authorization Required\r\n"
+ "Date: %s\r\n"
+ "Server: anoncoin-json-rpc/%s\r\n"
+ "WWW-Authenticate: Basic realm=\"jsonrpc\"\r\n"
+ "Content-Type: text/html\r\n"
+ "Content-Length: 296\r\n"
+ "\r\n"
+ "\r\n"
+ "\r\n"
+ "\r\n"
+ "Error\r\n"
+ "\r\n"
+ "\r\n"
+ "401 Unauthorized.
\r\n"
+ "\r\n", rfc1123Time().c_str(), FormatFullVersion().c_str());
+ const char *cStatus;
+ if (nStatus == HTTP_OK) cStatus = "OK";
+ else if (nStatus == HTTP_BAD_REQUEST) cStatus = "Bad Request";
+ else if (nStatus == HTTP_FORBIDDEN) cStatus = "Forbidden";
+ else if (nStatus == HTTP_NOT_FOUND) cStatus = "Not Found";
+ else if (nStatus == HTTP_INTERNAL_SERVER_ERROR) cStatus = "Internal Server Error";
+ else cStatus = "";
+ return strprintf(
+ "HTTP/1.1 %d %s\r\n"
+ "Date: %s\r\n"
+ "Connection: %s\r\n"
+ "Content-Length: %"PRIszu"\r\n"
+ "Content-Type: application/json\r\n"
+ "Server: anoncoin-json-rpc/%s\r\n"
+ "\r\n"
+ "%s",
+ nStatus,
+ cStatus,
+ rfc1123Time().c_str(),
+ keepalive ? "keep-alive" : "close",
+ strMsg.size(),
+ FormatFullVersion().c_str(),
+ strMsg.c_str());
+}
+
+bool ReadHTTPRequestLine(std::basic_istream& stream, int &proto,
+ string& http_method, string& http_uri)
+{
+ string str;
+ getline(stream, str);
+
+ // HTTP request line is space-delimited
+ vector vWords;
+ boost::split(vWords, str, boost::is_any_of(" "));
+ if (vWords.size() < 2)
+ return false;
+
+ // HTTP methods permitted: GET, POST
+ http_method = vWords[0];
+ if (http_method != "GET" && http_method != "POST")
+ return false;
+
+ // HTTP URI must be an absolute path, relative to current host
+ http_uri = vWords[1];
+ if (http_uri.size() == 0 || http_uri[0] != '/')
+ return false;
+
+ // parse proto, if present
+ string strProto = "";
+ if (vWords.size() > 2)
+ strProto = vWords[2];
+
+ proto = 0;
+ const char *ver = strstr(strProto.c_str(), "HTTP/1.");
+ if (ver != NULL)
+ proto = atoi(ver+7);
+
+ return true;
+}
+
+int ReadHTTPStatus(std::basic_istream& stream, int &proto)
+{
+ string str;
+ getline(stream, str);
+ vector vWords;
+ boost::split(vWords, str, boost::is_any_of(" "));
+ if (vWords.size() < 2)
+ return HTTP_INTERNAL_SERVER_ERROR;
+ proto = 0;
+ const char *ver = strstr(str.c_str(), "HTTP/1.");
+ if (ver != NULL)
+ proto = atoi(ver+7);
+ return atoi(vWords[1].c_str());
+}
+
+int ReadHTTPHeaders(std::basic_istream& stream, map& mapHeadersRet)
+{
+ int nLen = 0;
+ loop
+ {
+ string str;
+ std::getline(stream, str);
+ if (str.empty() || str == "\r")
+ break;
+ string::size_type nColon = str.find(":");
+ if (nColon != string::npos)
+ {
+ string strHeader = str.substr(0, nColon);
+ boost::trim(strHeader);
+ boost::to_lower(strHeader);
+ string strValue = str.substr(nColon+1);
+ boost::trim(strValue);
+ mapHeadersRet[strHeader] = strValue;
+ if (strHeader == "content-length")
+ nLen = atoi(strValue.c_str());
+ }
+ }
+ return nLen;
+}
+
+int ReadHTTPMessage(std::basic_istream& stream, map& mapHeadersRet, string& strMessageRet,
+ int nProto)
+{
+ mapHeadersRet.clear();
+ strMessageRet = "";
+
+ // Read header
+ int nLen = ReadHTTPHeaders(stream, mapHeadersRet);
+ if (nLen < 0 || nLen > (int)MAX_SIZE)
+ return HTTP_INTERNAL_SERVER_ERROR;
+
+ // Read message
+ if (nLen > 0)
+ {
+ vector vch(nLen);
+ stream.read(&vch[0], nLen);
+ strMessageRet = string(vch.begin(), vch.end());
+ }
+
+ string sConHdr = mapHeadersRet["connection"];
+
+ if ((sConHdr != "close") && (sConHdr != "keep-alive"))
+ {
+ if (nProto >= 1)
+ mapHeadersRet["connection"] = "keep-alive";
+ else
+ mapHeadersRet["connection"] = "close";
+ }
+
+ return HTTP_OK;
+}
+
+bool HTTPAuthorized(map& mapHeaders)
+{
+ string strAuth = mapHeaders["authorization"];
+ if (strAuth.substr(0,6) != "Basic ")
+ return false;
+ string strUserPass64 = strAuth.substr(6); boost::trim(strUserPass64);
+ string strUserPass = DecodeBase64(strUserPass64);
+ return TimingResistantEqual(strUserPass, strRPCUserColonPass);
+}
+
+//
+// JSON-RPC protocol. Bitcoin speaks version 1.0 for maximum compatibility,
+// but uses JSON-RPC 1.1/2.0 standards for parts of the 1.0 standard that were
+// unspecified (HTTP errors and contents of 'error').
+//
+// 1.0 spec: http://json-rpc.org/wiki/specification
+// 1.2 spec: http://groups.google.com/group/json-rpc/web/json-rpc-over-http
+// http://www.codeproject.com/KB/recipes/JSON_Spirit.aspx
+//
+
+string JSONRPCRequest(const string& strMethod, const Array& params, const Value& id)
+{
+ Object request;
+ request.push_back(Pair("method", strMethod));
+ request.push_back(Pair("params", params));
+ request.push_back(Pair("id", id));
+ return write_string(Value(request), false) + "\n";
+}
+
+Object JSONRPCReplyObj(const Value& result, const Value& error, const Value& id)
+{
+ Object reply;
+ if (error.type() != null_type)
+ reply.push_back(Pair("result", Value::null));
+ else
+ reply.push_back(Pair("result", result));
+ reply.push_back(Pair("error", error));
+ reply.push_back(Pair("id", id));
+ return reply;
+}
+
+string JSONRPCReply(const Value& result, const Value& error, const Value& id)
+{
+ Object reply = JSONRPCReplyObj(result, error, id);
+ return write_string(Value(reply), false) + "\n";
+}
+
+void ErrorReply(std::ostream& stream, const Object& objError, const Value& id)
+{
+ // Send error reply from json-rpc error object
+ int nStatus = HTTP_INTERNAL_SERVER_ERROR;
+ int code = find_value(objError, "code").get_int();
+ if (code == RPC_INVALID_REQUEST) nStatus = HTTP_BAD_REQUEST;
+ else if (code == RPC_METHOD_NOT_FOUND) nStatus = HTTP_NOT_FOUND;
+ string strReply = JSONRPCReply(Value::null, objError, id);
+ stream << HTTPReply(nStatus, strReply, false) << std::flush;
+}
+
+bool ClientAllowed(const boost::asio::ip::address& address)
+{
+ // Make sure that IPv4-compatible and IPv4-mapped IPv6 addresses are treated as IPv4 addresses
+ if (address.is_v6()
+ && (address.to_v6().is_v4_compatible()
+ || address.to_v6().is_v4_mapped()))
+ return ClientAllowed(address.to_v6().to_v4());
+
+ if (address == asio::ip::address_v4::loopback()
+ || address == asio::ip::address_v6::loopback()
+ || (address.is_v4()
+ // Check whether IPv4 addresses match 127.0.0.0/8 (loopback subnet)
+ && (address.to_v4().to_ulong() & 0xff000000) == 0x7f000000))
+ return true;
+
+ const string strAddress = address.to_string();
+ const vector& vAllow = mapMultiArgs["-rpcallowip"];
+ BOOST_FOREACH(string strAllow, vAllow)
+ if (WildcardMatch(strAddress, strAllow))
+ return true;
+ return false;
+}
+
+//
+// IOStream device that speaks SSL but can also speak non-SSL
+//
+template
+class SSLIOStreamDevice : public iostreams::device {
+public:
+ SSLIOStreamDevice(asio::ssl::stream &streamIn, bool fUseSSLIn) : stream(streamIn)
+ {
+ fUseSSL = fUseSSLIn;
+ fNeedHandshake = fUseSSLIn;
+ }
+
+ void handshake(ssl::stream_base::handshake_type role)
+ {
+ if (!fNeedHandshake) return;
+ fNeedHandshake = false;
+ stream.handshake(role);
+ }
+ std::streamsize read(char* s, std::streamsize n)
+ {
+ handshake(ssl::stream_base::server); // HTTPS servers read first
+ if (fUseSSL) return stream.read_some(asio::buffer(s, n));
+ return stream.next_layer().read_some(asio::buffer(s, n));
+ }
+ std::streamsize write(const char* s, std::streamsize n)
+ {
+ handshake(ssl::stream_base::client); // HTTPS clients write first
+ if (fUseSSL) return asio::write(stream, asio::buffer(s, n));
+ return asio::write(stream.next_layer(), asio::buffer(s, n));
+ }
+ bool connect(const std::string& server, const std::string& port)
+ {
+ ip::tcp::resolver resolver(stream.get_io_service());
+ ip::tcp::resolver::query query(server.c_str(), port.c_str());
+ ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
+ ip::tcp::resolver::iterator end;
+ boost::system::error_code error = asio::error::host_not_found;
+ while (error && endpoint_iterator != end)
+ {
+ stream.lowest_layer().close();
+ stream.lowest_layer().connect(*endpoint_iterator++, error);
+ }
+ if (error)
+ return false;
+ return true;
+ }
+
+private:
+ bool fNeedHandshake;
+ bool fUseSSL;
+ asio::ssl::stream& stream;
+};
+
+class AcceptedConnection
+{
+public:
+ virtual ~AcceptedConnection() {}
+
+ virtual std::iostream& stream() = 0;
+ virtual std::string peer_address_to_string() const = 0;
+ virtual void close() = 0;
+};
+
+template
+class AcceptedConnectionImpl : public AcceptedConnection
+{
+public:
+ AcceptedConnectionImpl(
+ asio::io_service& io_service,
+ ssl::context &context,
+ bool fUseSSL) :
+ sslStream(io_service, context),
+ _d(sslStream, fUseSSL),
+ _stream(_d)
+ {
+ }
+
+ virtual std::iostream& stream()
+ {
+ return _stream;
+ }
+
+ virtual std::string peer_address_to_string() const
+ {
+ return peer.address().to_string();
+ }
+
+ virtual void close()
+ {
+ _stream.close();
+ }
+
+ typename Protocol::endpoint peer;
+ asio::ssl::stream sslStream;
+
+private:
+ SSLIOStreamDevice _d;
+ iostreams::stream< SSLIOStreamDevice > _stream;
+};
+
+void ServiceConnection(AcceptedConnection *conn);
+
+// Forward declaration required for RPCListen
+template
+static void RPCAcceptHandler(boost::shared_ptr< basic_socket_acceptor > acceptor,
+ ssl::context& context,
+ bool fUseSSL,
+ AcceptedConnection* conn,
+ const boost::system::error_code& error);
+
+/**
+ * Sets up I/O resources to accept and handle a new connection.
+ */
+template
+static void RPCListen(boost::shared_ptr< basic_socket_acceptor > acceptor,
+ ssl::context& context,
+ const bool fUseSSL)
+{
+ // Accept connection
+ AcceptedConnectionImpl* conn = new AcceptedConnectionImpl(acceptor->get_io_service(), context, fUseSSL);
+
+ acceptor->async_accept(
+ conn->sslStream.lowest_layer(),
+ conn->peer,
+ boost::bind(&RPCAcceptHandler,
+ acceptor,
+ boost::ref(context),
+ fUseSSL,
+ conn,
+ boost::asio::placeholders::error));
+}
+
+/**
+ * Accept and handle incoming connection.
+ */
+template
+static void RPCAcceptHandler(boost::shared_ptr< basic_socket_acceptor > acceptor,
+ ssl::context& context,
+ const bool fUseSSL,
+ AcceptedConnection* conn,
+ const boost::system::error_code& error)
+{
+ // Immediately start accepting new connections, except when we're cancelled or our socket is closed.
+ if (error != asio::error::operation_aborted && acceptor->is_open())
+ RPCListen(acceptor, context, fUseSSL);
+
+ AcceptedConnectionImpl* tcp_conn = dynamic_cast< AcceptedConnectionImpl* >(conn);
+
+ // TODO: Actually handle errors
+ if (error)
+ {
+ delete conn;
+ }
+
+ // Restrict callers by IP. It is important to
+ // do this before starting client thread, to filter out
+ // certain DoS and misbehaving clients.
+ else if (tcp_conn && !ClientAllowed(tcp_conn->peer.address()))
+ {
+ // Only send a 403 if we're not using SSL to prevent a DoS during the SSL handshake.
+ if (!fUseSSL)
+ conn->stream() << HTTPReply(HTTP_FORBIDDEN, "", false) << std::flush;
+ delete conn;
+ }
+ else {
+ ServiceConnection(conn);
+ conn->close();
+ delete conn;
+ }
+}
+
+void StartRPCThreads()
+{
+ strRPCUserColonPass = mapArgs["-rpcuser"] + ":" + mapArgs["-rpcpassword"];
+ if ((mapArgs["-rpcpassword"] == "") ||
+ (mapArgs["-rpcuser"] == mapArgs["-rpcpassword"]))
+ {
+ unsigned char rand_pwd[32];
+ RAND_bytes(rand_pwd, 32);
+ string strWhatAmI = "To use anoncoind";
+ if (mapArgs.count("-server"))
+ strWhatAmI = strprintf(_("To use the %s option"), "\"-server\"");
+ else if (mapArgs.count("-daemon"))
+ strWhatAmI = strprintf(_("To use the %s option"), "\"-daemon\"");
+ uiInterface.ThreadSafeMessageBox(strprintf(
+ _("%s, you must set a rpcpassword in the configuration file:\n"
+ "%s\n"
+ "It is recommended you use the following random password:\n"
+ "rpcuser=anoncoinrpc\n"
+ "rpcpassword=%s\n"
+ "(you do not need to remember this password)\n"
+ "The username and password MUST NOT be the same.\n"
+ "If the file does not exist, create it with owner-readable-only file permissions.\n"
+ "It is also recommended to set alertnotify so you are notified of problems;\n"
+ "for example: alertnotify=echo %%s | mail -s \"Anoncoin Alert\" admin@foo.com\n"),
+ strWhatAmI.c_str(),
+ GetConfigFile().string().c_str(),
+ EncodeBase58(&rand_pwd[0],&rand_pwd[0]+32).c_str()),
+ "", CClientUIInterface::MSG_ERROR);
+ StartShutdown();
+ return;
+ }
+
+ assert(rpc_io_service == NULL);
+ rpc_io_service = new asio::io_service();
+ rpc_ssl_context = new ssl::context(*rpc_io_service, ssl::context::sslv23);
+
+ const bool fUseSSL = GetBoolArg("-rpcssl");
+
+ if (fUseSSL)
+ {
+ rpc_ssl_context->set_options(ssl::context::no_sslv2);
+
+ filesystem::path pathCertFile(GetArg("-rpcsslcertificatechainfile", "server.cert"));
+ if (!pathCertFile.is_complete()) pathCertFile = filesystem::path(GetDataDir()) / pathCertFile;
+ if (filesystem::exists(pathCertFile)) rpc_ssl_context->use_certificate_chain_file(pathCertFile.string());
+ else printf("ThreadRPCServer ERROR: missing server certificate file %s\n", pathCertFile.string().c_str());
+
+ filesystem::path pathPKFile(GetArg("-rpcsslprivatekeyfile", "server.pem"));
+ if (!pathPKFile.is_complete()) pathPKFile = filesystem::path(GetDataDir()) / pathPKFile;
+ if (filesystem::exists(pathPKFile)) rpc_ssl_context->use_private_key_file(pathPKFile.string(), ssl::context::pem);
+ else printf("ThreadRPCServer ERROR: missing server private key file %s\n", pathPKFile.string().c_str());
+
+ string strCiphers = GetArg("-rpcsslciphers", "TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH");
+ SSL_CTX_set_cipher_list(rpc_ssl_context->impl(), strCiphers.c_str());
+ }
+
+ // Try a dual IPv6/IPv4 socket, falling back to separate IPv4 and IPv6 sockets
+ const bool loopback = !mapArgs.count("-rpcallowip");
+ asio::ip::address bindAddress = loopback ? asio::ip::address_v6::loopback() : asio::ip::address_v6::any();
+ ip::tcp::endpoint endpoint(bindAddress, GetArg("-rpcport", GetDefaultRPCPort()));
+ boost::system::error_code v6_only_error;
+ boost::shared_ptr acceptor(new ip::tcp::acceptor(*rpc_io_service));
+
+ bool fListening = false;
+ std::string strerr;
+ try
+ {
+ acceptor->open(endpoint.protocol());
+ acceptor->set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
+
+ // Try making the socket dual IPv6/IPv4 (if listening on the "any" address)
+ acceptor->set_option(boost::asio::ip::v6_only(loopback), v6_only_error);
+
+ acceptor->bind(endpoint);
+ acceptor->listen(socket_base::max_connections);
+
+ RPCListen(acceptor, *rpc_ssl_context, fUseSSL);
+
+ fListening = true;
+ }
+ catch(boost::system::system_error &e)
+ {
+ strerr = strprintf(_("An error occurred while setting up the RPC port %u for listening on IPv6, falling back to IPv4: %s"), endpoint.port(), e.what());
+ }
+
+ try {
+ // If dual IPv6/IPv4 failed (or we're opening loopback interfaces only), open IPv4 separately
+ if (!fListening || loopback || v6_only_error)
+ {
+ bindAddress = loopback ? asio::ip::address_v4::loopback() : asio::ip::address_v4::any();
+ endpoint.address(bindAddress);
+
+ acceptor.reset(new ip::tcp::acceptor(*rpc_io_service));
+ acceptor->open(endpoint.protocol());
+ acceptor->set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
+ acceptor->bind(endpoint);
+ acceptor->listen(socket_base::max_connections);
+
+ RPCListen(acceptor, *rpc_ssl_context, fUseSSL);
+
+ fListening = true;
+ }
+ }
+ catch(boost::system::system_error &e)
+ {
+ strerr = strprintf(_("An error occurred while setting up the RPC port %u for listening on IPv4: %s"), endpoint.port(), e.what());
+ }
+
+ if (!fListening) {
+ uiInterface.ThreadSafeMessageBox(strerr, "", CClientUIInterface::MSG_ERROR);
+ StartShutdown();
+ return;
+ }
+
+ rpc_worker_group = new boost::thread_group();
+ for (int i = 0; i < GetArg("-rpcthreads", 4); i++)
+ rpc_worker_group->create_thread(boost::bind(&asio::io_service::run, rpc_io_service));
+}
+
+void StopRPCThreads()
+{
+ if (rpc_io_service == NULL) return;
+
+ rpc_io_service->stop();
+ rpc_worker_group->join_all();
+ delete rpc_worker_group; rpc_worker_group = NULL;
+ delete rpc_ssl_context; rpc_ssl_context = NULL;
+ delete rpc_io_service; rpc_io_service = NULL;
+}
+
+class JSONRequest
+{
+public:
+ Value id;
+ string strMethod;
+ Array params;
+
+ JSONRequest() { id = Value::null; }
+ void parse(const Value& valRequest);
+};
+
+void JSONRequest::parse(const Value& valRequest)
+{
+ // Parse request
+ if (valRequest.type() != obj_type)
+ throw JSONRPCError(RPC_INVALID_REQUEST, "Invalid Request object");
+ const Object& request = valRequest.get_obj();
+
+ // Parse id now so errors from here on will have the id
+ id = find_value(request, "id");
+
+ // Parse method
+ Value valMethod = find_value(request, "method");
+ if (valMethod.type() == null_type)
+ throw JSONRPCError(RPC_INVALID_REQUEST, "Missing method");
+ if (valMethod.type() != str_type)
+ throw JSONRPCError(RPC_INVALID_REQUEST, "Method must be a string");
+ strMethod = valMethod.get_str();
+ if (strMethod != "getwork" && strMethod != "getworkex" && strMethod != "getblocktemplate")
+ printf("ThreadRPCServer method=%s\n", strMethod.c_str());
+
+ // Parse params
+ Value valParams = find_value(request, "params");
+ if (valParams.type() == array_type)
+ params = valParams.get_array();
+ else if (valParams.type() == null_type)
+ params = Array();
+ else
+ throw JSONRPCError(RPC_INVALID_REQUEST, "Params must be an array");
+}
+
+static Object JSONRPCExecOne(const Value& req)
+{
+ Object rpc_result;
+
+ JSONRequest jreq;
+ try {
+ jreq.parse(req);
+
+ Value result = tableRPC.execute(jreq.strMethod, jreq.params);
+ rpc_result = JSONRPCReplyObj(result, Value::null, jreq.id);
+ }
+ catch (Object& objError)
+ {
+ rpc_result = JSONRPCReplyObj(Value::null, objError, jreq.id);
+ }
+ catch (std::exception& e)
+ {
+ rpc_result = JSONRPCReplyObj(Value::null,
+ JSONRPCError(RPC_PARSE_ERROR, e.what()), jreq.id);
+ }
+
+ return rpc_result;
+}
+
+static string JSONRPCExecBatch(const Array& vReq)
+{
+ Array ret;
+ for (unsigned int reqIdx = 0; reqIdx < vReq.size(); reqIdx++)
+ ret.push_back(JSONRPCExecOne(vReq[reqIdx]));
+
+ return write_string(Value(ret), false) + "\n";
+}
+
+void ServiceConnection(AcceptedConnection *conn)
+{
+ bool fRun = true;
+ while (fRun)
+ {
+ int nProto = 0;
+ map mapHeaders;
+ string strRequest, strMethod, strURI;
+
+ // Read HTTP request line
+ if (!ReadHTTPRequestLine(conn->stream(), nProto, strMethod, strURI))
+ break;
+
+ // Read HTTP message headers and body
+ ReadHTTPMessage(conn->stream(), mapHeaders, strRequest, nProto);
+
+ if (strURI != "/") {
+ conn->stream() << HTTPReply(HTTP_NOT_FOUND, "", false) << std::flush;
+ break;
+ }
+
+ // Check authorization
+ if (mapHeaders.count("authorization") == 0)
+ {
+ conn->stream() << HTTPReply(HTTP_UNAUTHORIZED, "", false) << std::flush;
+ break;
+ }
+ if (!HTTPAuthorized(mapHeaders))
+ {
+ printf("ThreadRPCServer incorrect password attempt from %s\n", conn->peer_address_to_string().c_str());
+ /* Deter brute-forcing short passwords.
+ If this results in a DOS the user really
+ shouldn't have their RPC port exposed.*/
+ if (mapArgs["-rpcpassword"].size() < 20)
+ MilliSleep(250);
+
+ conn->stream() << HTTPReply(HTTP_UNAUTHORIZED, "", false) << std::flush;
+ break;
+ }
+ if (mapHeaders["connection"] == "close")
+ fRun = false;
+
+ JSONRequest jreq;
+ try
+ {
+ // Parse request
+ Value valRequest;
+ if (!read_string(strRequest, valRequest))
+ throw JSONRPCError(RPC_PARSE_ERROR, "Parse error");
+
+ string strReply;
+
+ // singleton request
+ if (valRequest.type() == obj_type) {
+ jreq.parse(valRequest);
+
+ Value result = tableRPC.execute(jreq.strMethod, jreq.params);
+
+ // Send reply
+ strReply = JSONRPCReply(result, Value::null, jreq.id);
+
+ // array of requests
+ } else if (valRequest.type() == array_type)
+ strReply = JSONRPCExecBatch(valRequest.get_array());
+ else
+ throw JSONRPCError(RPC_PARSE_ERROR, "Top-level object parse error");
+
+ conn->stream() << HTTPReply(HTTP_OK, strReply, fRun) << std::flush;
+ }
+ catch (Object& objError)
+ {
+ ErrorReply(conn->stream(), objError, jreq.id);
+ break;
+ }
+ catch (std::exception& e)
+ {
+ ErrorReply(conn->stream(), JSONRPCError(RPC_PARSE_ERROR, e.what()), jreq.id);
+ break;
+ }
+ }
+}
+
+json_spirit::Value CRPCTable::execute(const std::string &strMethod, const json_spirit::Array ¶ms) const
+{
+ // Find method
+ const CRPCCommand *pcmd = tableRPC[strMethod];
+ if (!pcmd)
+ throw JSONRPCError(RPC_METHOD_NOT_FOUND, "Method not found");
+ if (pcmd->reqWallet && !pwalletMain)
+ throw JSONRPCError(RPC_METHOD_NOT_FOUND, "Method not found (disabled)");
+
+ // Observe safe mode
+ string strWarning = GetWarnings("rpc");
+ if (strWarning != "" && !GetBoolArg("-disablesafemode") &&
+ !pcmd->okSafeMode)
+ throw JSONRPCError(RPC_FORBIDDEN_BY_SAFE_MODE, string("Safe mode: ") + strWarning);
+
+ try
+ {
+ // Execute
+ Value result;
+ {
+ if (pcmd->threadSafe)
+ result = pcmd->actor(params, false);
+ else if (!pwalletMain) {
+ LOCK(cs_main);
+ result = pcmd->actor(params, false);
+ } else {
+ LOCK2(cs_main, pwalletMain->cs_wallet);
+ result = pcmd->actor(params, false);
+ }
+ }
+ return result;
+ }
+ catch (std::exception& e)
+ {
+ throw JSONRPCError(RPC_MISC_ERROR, e.what());
+ }
+}
+
+
+Object CallRPC(const string& strMethod, const Array& params)
+{
+ if (mapArgs["-rpcuser"] == "" && mapArgs["-rpcpassword"] == "")
+ throw runtime_error(strprintf(
+ _("You must set rpcpassword= in the configuration file:\n%s\n"
+ "If the file does not exist, create it with owner-readable-only file permissions."),
+ GetConfigFile().string().c_str()));
+
+ // Connect to localhost
+ bool fUseSSL = GetBoolArg("-rpcssl");
+ asio::io_service io_service;
+ ssl::context context(io_service, ssl::context::sslv23);
+ context.set_options(ssl::context::no_sslv2);
+ asio::ssl::stream sslStream(io_service, context);
+ SSLIOStreamDevice d(sslStream, fUseSSL);
+ iostreams::stream< SSLIOStreamDevice > stream(d);
+ if (!d.connect(GetArg("-rpcconnect", "127.0.0.1"), GetArg("-rpcport", itostr(GetDefaultRPCPort()))))
+ throw runtime_error("couldn't connect to server");
+
+ // HTTP basic authentication
+ string strUserPass64 = EncodeBase64(mapArgs["-rpcuser"] + ":" + mapArgs["-rpcpassword"]);
+ map mapRequestHeaders;
+ mapRequestHeaders["Authorization"] = string("Basic ") + strUserPass64;
+
+ // Send request
+ string strRequest = JSONRPCRequest(strMethod, params, 1);
+ string strPost = HTTPPost(strRequest, mapRequestHeaders);
+ stream << strPost << std::flush;
+
+ // Receive HTTP reply status
+ int nProto = 0;
+ int nStatus = ReadHTTPStatus(stream, nProto);
+
+ // Receive HTTP reply message headers and body
+ map mapHeaders;
+ string strReply;
+ ReadHTTPMessage(stream, mapHeaders, strReply, nProto);
+
+ if (nStatus == HTTP_UNAUTHORIZED)
+ throw runtime_error("incorrect rpcuser or rpcpassword (authorization failed)");
+ else if (nStatus >= 400 && nStatus != HTTP_BAD_REQUEST && nStatus != HTTP_NOT_FOUND && nStatus != HTTP_INTERNAL_SERVER_ERROR)
+ throw runtime_error(strprintf("server returned HTTP error %d", nStatus));
+ else if (strReply.empty())
+ throw runtime_error("no response from server");
+
+ // Parse reply
+ Value valReply;
+ if (!read_string(strReply, valReply))
+ throw runtime_error("couldn't parse reply from server");
+ const Object& reply = valReply.get_obj();
+ if (reply.empty())
+ throw runtime_error("expected reply to have result, error and id properties");
+
+ return reply;
+}
+
+
+
+
+template
+void ConvertTo(Value& value, bool fAllowNull=false)
+{
+ if (fAllowNull && value.type() == null_type)
+ return;
+ if (value.type() == str_type)
+ {
+ // reinterpret string as unquoted json value
+ Value value2;
+ string strJSON = value.get_str();
+ if (!read_string(strJSON, value2))
+ throw runtime_error(string("Error parsing JSON:")+strJSON);
+ ConvertTo(value2, fAllowNull);
+ value = value2;
+ }
+ else
+ {
+ value = value.get_value();
+ }
+}
+
+// Convert strings to command-specific RPC representation
+Array RPCConvertValues(const std::string &strMethod, const std::vector &strParams)
+{
+ Array params;
+ BOOST_FOREACH(const std::string ¶m, strParams)
+ params.push_back(param);
+
+ int n = params.size();
+
+ //
+ // Special case non-string parameter types
+ //
+ if (strMethod == "stop" && n > 0) ConvertTo(params[0]);
+ if (strMethod == "getaddednodeinfo" && n > 0) ConvertTo(params[0]);
+ if (strMethod == "setgenerate" && n > 0) ConvertTo(params[0]);
+ if (strMethod == "setgenerate" && n > 1) ConvertTo(params[1]);
+ if (strMethod == "getnetworkhashps" && n > 0) ConvertTo(params[0]);
+ if (strMethod == "getnetworkhashps" && n > 1) ConvertTo(params[1]);
+ if (strMethod == "sendtoaddress" && n > 1) ConvertTo(params[1]);
+ if (strMethod == "settxfee" && n > 0) ConvertTo(params[0]);
+ if (strMethod == "setmininput" && n > 0) ConvertTo(params[0]);
+ if (strMethod == "getreceivedbyaddress" && n > 1) ConvertTo(params[1]);
+ if (strMethod == "getreceivedbyaccount" && n > 1) ConvertTo(params[1]);
+ if (strMethod == "listreceivedbyaddress" && n > 0) ConvertTo(params[0]);
+ if (strMethod == "listreceivedbyaddress" && n > 1) ConvertTo(params[1]);
+ if (strMethod == "listreceivedbyaccount" && n > 0) ConvertTo(params[0]);
+ if (strMethod == "listreceivedbyaccount" && n > 1) ConvertTo(params[1]);
+ if (strMethod == "getbalance" && n > 1) ConvertTo(params[1]);
+ if (strMethod == "getblockhash" && n > 0) ConvertTo(params[0]);
+ if (strMethod == "move" && n > 2) ConvertTo(params[2]);
+ if (strMethod == "move" && n > 3) ConvertTo(params[3]);
+ if (strMethod == "sendfrom" && n > 2) ConvertTo(params[2]);
+ if (strMethod == "sendfrom" && n > 3) ConvertTo(params[3]);
+ if (strMethod == "listtransactions" && n > 1) ConvertTo(params[1]);
+ if (strMethod == "listtransactions" && n > 2) ConvertTo(params[2]);
+ if (strMethod == "listaccounts" && n > 0) ConvertTo(params[0]);
+ if (strMethod == "walletpassphrase" && n > 1) ConvertTo(params[1]);
+ if (strMethod == "getblocktemplate" && n > 0) ConvertTo