mirror of
https://github.com/kvazar-network/kevacoin.git
synced 2025-01-17 18:40:09 +00:00
Bump univalue and fix json formatting in tests
This merge commit bumps the univalue subtree and also updates the whitespace for some failing tests.
This commit is contained in:
commit
faaeeb0d3e
@ -12,6 +12,7 @@ pkgconfig_DATA = pc/libunivalue.pc
|
|||||||
|
|
||||||
libunivalue_la_SOURCES = \
|
libunivalue_la_SOURCES = \
|
||||||
lib/univalue.cpp \
|
lib/univalue.cpp \
|
||||||
|
lib/univalue_get.cpp \
|
||||||
lib/univalue_read.cpp \
|
lib/univalue_read.cpp \
|
||||||
lib/univalue_write.cpp
|
lib/univalue_write.cpp
|
||||||
|
|
||||||
@ -20,7 +21,7 @@ libunivalue_la_LDFLAGS = \
|
|||||||
-no-undefined
|
-no-undefined
|
||||||
libunivalue_la_CXXFLAGS = -I$(top_srcdir)/include
|
libunivalue_la_CXXFLAGS = -I$(top_srcdir)/include
|
||||||
|
|
||||||
TESTS = test/unitester
|
TESTS = test/object test/unitester test/no_nul
|
||||||
|
|
||||||
GENBIN = gen/gen$(BUILD_EXEEXT)
|
GENBIN = gen/gen$(BUILD_EXEEXT)
|
||||||
GEN_SRCS = gen/gen.cpp
|
GEN_SRCS = gen/gen.cpp
|
||||||
@ -33,7 +34,7 @@ gen: lib/univalue_escapes.h $(GENBIN)
|
|||||||
@echo Updating $<
|
@echo Updating $<
|
||||||
$(AM_V_at)$(GENBIN) > lib/univalue_escapes.h
|
$(AM_V_at)$(GENBIN) > lib/univalue_escapes.h
|
||||||
|
|
||||||
noinst_PROGRAMS = $(TESTS)
|
noinst_PROGRAMS = $(TESTS) test/test_json
|
||||||
|
|
||||||
TEST_DATA_DIR=test
|
TEST_DATA_DIR=test
|
||||||
|
|
||||||
@ -42,6 +43,21 @@ test_unitester_LDADD = libunivalue.la
|
|||||||
test_unitester_CXXFLAGS = -I$(top_srcdir)/include -DJSON_TEST_SRC=\"$(srcdir)/$(TEST_DATA_DIR)\"
|
test_unitester_CXXFLAGS = -I$(top_srcdir)/include -DJSON_TEST_SRC=\"$(srcdir)/$(TEST_DATA_DIR)\"
|
||||||
test_unitester_LDFLAGS = -static $(LIBTOOL_APP_LDFLAGS)
|
test_unitester_LDFLAGS = -static $(LIBTOOL_APP_LDFLAGS)
|
||||||
|
|
||||||
|
test_test_json_SOURCES = test/test_json.cpp
|
||||||
|
test_test_json_LDADD = libunivalue.la
|
||||||
|
test_test_json_CXXFLAGS = -I$(top_srcdir)/include
|
||||||
|
test_test_json_LDFLAGS = -static $(LIBTOOL_APP_LDFLAGS)
|
||||||
|
|
||||||
|
test_no_nul_SOURCES = test/no_nul.cpp
|
||||||
|
test_no_nul_LDADD = libunivalue.la
|
||||||
|
test_no_nul_CXXFLAGS = -I$(top_srcdir)/include
|
||||||
|
test_no_nul_LDFLAGS = -static $(LIBTOOL_APP_LDFLAGS)
|
||||||
|
|
||||||
|
test_object_SOURCES = test/object.cpp
|
||||||
|
test_object_LDADD = libunivalue.la
|
||||||
|
test_object_CXXFLAGS = -I$(top_srcdir)/include
|
||||||
|
test_object_LDFLAGS = -static $(LIBTOOL_APP_LDFLAGS)
|
||||||
|
|
||||||
TEST_FILES = \
|
TEST_FILES = \
|
||||||
$(TEST_DATA_DIR)/fail10.json \
|
$(TEST_DATA_DIR)/fail10.json \
|
||||||
$(TEST_DATA_DIR)/fail11.json \
|
$(TEST_DATA_DIR)/fail11.json \
|
||||||
@ -77,6 +93,8 @@ TEST_FILES = \
|
|||||||
$(TEST_DATA_DIR)/fail39.json \
|
$(TEST_DATA_DIR)/fail39.json \
|
||||||
$(TEST_DATA_DIR)/fail40.json \
|
$(TEST_DATA_DIR)/fail40.json \
|
||||||
$(TEST_DATA_DIR)/fail41.json \
|
$(TEST_DATA_DIR)/fail41.json \
|
||||||
|
$(TEST_DATA_DIR)/fail42.json \
|
||||||
|
$(TEST_DATA_DIR)/fail44.json \
|
||||||
$(TEST_DATA_DIR)/fail3.json \
|
$(TEST_DATA_DIR)/fail3.json \
|
||||||
$(TEST_DATA_DIR)/fail4.json \
|
$(TEST_DATA_DIR)/fail4.json \
|
||||||
$(TEST_DATA_DIR)/fail5.json \
|
$(TEST_DATA_DIR)/fail5.json \
|
||||||
@ -88,6 +106,11 @@ TEST_FILES = \
|
|||||||
$(TEST_DATA_DIR)/pass2.json \
|
$(TEST_DATA_DIR)/pass2.json \
|
||||||
$(TEST_DATA_DIR)/pass3.json \
|
$(TEST_DATA_DIR)/pass3.json \
|
||||||
$(TEST_DATA_DIR)/round1.json \
|
$(TEST_DATA_DIR)/round1.json \
|
||||||
$(TEST_DATA_DIR)/round2.json
|
$(TEST_DATA_DIR)/round2.json \
|
||||||
|
$(TEST_DATA_DIR)/round3.json \
|
||||||
|
$(TEST_DATA_DIR)/round4.json \
|
||||||
|
$(TEST_DATA_DIR)/round5.json \
|
||||||
|
$(TEST_DATA_DIR)/round6.json \
|
||||||
|
$(TEST_DATA_DIR)/round7.json
|
||||||
|
|
||||||
EXTRA_DIST=$(TEST_FILES) $(GEN_SRCS)
|
EXTRA_DIST=$(TEST_FILES) $(GEN_SRCS)
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
|
|
||||||
UniValue
|
|
||||||
|
|
||||||
A universal value object, with JSON encoding (output) and decoding (input).
|
|
||||||
|
|
||||||
Built as a single dynamic RAII C++ object class, and no templates.
|
|
||||||
|
|
32
src/univalue/README.md
Normal file
32
src/univalue/README.md
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
|
||||||
|
# UniValue
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
A universal value class, with JSON encoding and decoding.
|
||||||
|
|
||||||
|
UniValue is an abstract data type that may be a null, boolean, string,
|
||||||
|
number, array container, or a key/value dictionary container, nested to
|
||||||
|
an arbitrary depth.
|
||||||
|
|
||||||
|
This class is aligned with the JSON standard, [RFC
|
||||||
|
7159](https://tools.ietf.org/html/rfc7159.html).
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
This project is a standard GNU
|
||||||
|
[autotools](https://www.gnu.org/software/automake/manual/html_node/Autotools-Introduction.html)
|
||||||
|
project. Build and install instructions are available in the `INSTALL`
|
||||||
|
file provided with GNU autotools.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ./autogen.sh
|
||||||
|
$ ./configure
|
||||||
|
$ make
|
||||||
|
```
|
||||||
|
|
||||||
|
## Design
|
||||||
|
|
||||||
|
UniValue provides a single dynamic RAII C++ object class,
|
||||||
|
and minimizes template use (contra json_spirit).
|
||||||
|
|
@ -1,7 +1,7 @@
|
|||||||
m4_define([libunivalue_major_version], [1])
|
m4_define([libunivalue_major_version], [1])
|
||||||
m4_define([libunivalue_minor_version], [1])
|
m4_define([libunivalue_minor_version], [1])
|
||||||
m4_define([libunivalue_micro_version], [2])
|
m4_define([libunivalue_micro_version], [3])
|
||||||
m4_define([libunivalue_interface_age], [2])
|
m4_define([libunivalue_interface_age], [3])
|
||||||
# If you need a modifier for the version number.
|
# If you need a modifier for the version number.
|
||||||
# Normally empty, but can be used to make "fixup" releases.
|
# Normally empty, but can be used to make "fixup" releases.
|
||||||
m4_define([libunivalue_extraversion], [])
|
m4_define([libunivalue_extraversion], [])
|
||||||
@ -14,7 +14,7 @@ m4_define([libunivalue_age], [m4_eval(libunivalue_binary_age - libunivalue_inter
|
|||||||
m4_define([libunivalue_version], [libunivalue_major_version().libunivalue_minor_version().libunivalue_micro_version()libunivalue_extraversion()])
|
m4_define([libunivalue_version], [libunivalue_major_version().libunivalue_minor_version().libunivalue_micro_version()libunivalue_extraversion()])
|
||||||
|
|
||||||
|
|
||||||
AC_INIT([univalue], [1.0.2],
|
AC_INIT([univalue], [1.0.3],
|
||||||
[http://github.com/jgarzik/univalue/])
|
[http://github.com/jgarzik/univalue/])
|
||||||
|
|
||||||
dnl make the compilation flags quiet unless V=1 is used
|
dnl make the compilation flags quiet unless V=1 is used
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#define __UNIVALUE_H__
|
#define __UNIVALUE_H__
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@ -69,10 +70,11 @@ public:
|
|||||||
size_t size() const { return values.size(); }
|
size_t size() const { return values.size(); }
|
||||||
|
|
||||||
bool getBool() const { return isTrue(); }
|
bool getBool() const { return isTrue(); }
|
||||||
bool checkObject(const std::map<std::string,UniValue::VType>& memberTypes);
|
void getObjMap(std::map<std::string,UniValue>& kv) const;
|
||||||
|
bool checkObject(const std::map<std::string,UniValue::VType>& memberTypes) const;
|
||||||
const UniValue& operator[](const std::string& key) const;
|
const UniValue& operator[](const std::string& key) const;
|
||||||
const UniValue& operator[](unsigned int index) const;
|
const UniValue& operator[](size_t index) const;
|
||||||
bool exists(const std::string& key) const { return (findKey(key) >= 0); }
|
bool exists(const std::string& key) const { size_t i; return findKey(key, i); }
|
||||||
|
|
||||||
bool isNull() const { return (typ == VNULL); }
|
bool isNull() const { return (typ == VNULL); }
|
||||||
bool isTrue() const { return (typ == VBOOL) && (val == "1"); }
|
bool isTrue() const { return (typ == VBOOL) && (val == "1"); }
|
||||||
@ -92,8 +94,25 @@ public:
|
|||||||
std::string s(val_);
|
std::string s(val_);
|
||||||
return push_back(s);
|
return push_back(s);
|
||||||
}
|
}
|
||||||
|
bool push_back(uint64_t val_) {
|
||||||
|
UniValue tmpVal(val_);
|
||||||
|
return push_back(tmpVal);
|
||||||
|
}
|
||||||
|
bool push_back(int64_t val_) {
|
||||||
|
UniValue tmpVal(val_);
|
||||||
|
return push_back(tmpVal);
|
||||||
|
}
|
||||||
|
bool push_back(int val_) {
|
||||||
|
UniValue tmpVal(val_);
|
||||||
|
return push_back(tmpVal);
|
||||||
|
}
|
||||||
|
bool push_back(double val_) {
|
||||||
|
UniValue tmpVal(val_);
|
||||||
|
return push_back(tmpVal);
|
||||||
|
}
|
||||||
bool push_backV(const std::vector<UniValue>& vec);
|
bool push_backV(const std::vector<UniValue>& vec);
|
||||||
|
|
||||||
|
void __pushKV(const std::string& key, const UniValue& val);
|
||||||
bool pushKV(const std::string& key, const UniValue& val);
|
bool pushKV(const std::string& key, const UniValue& val);
|
||||||
bool pushKV(const std::string& key, const std::string& val_) {
|
bool pushKV(const std::string& key, const std::string& val_) {
|
||||||
UniValue tmpVal(VSTR, val_);
|
UniValue tmpVal(VSTR, val_);
|
||||||
@ -124,9 +143,10 @@ public:
|
|||||||
std::string write(unsigned int prettyIndent = 0,
|
std::string write(unsigned int prettyIndent = 0,
|
||||||
unsigned int indentLevel = 0) const;
|
unsigned int indentLevel = 0) const;
|
||||||
|
|
||||||
bool read(const char *raw);
|
bool read(const char *raw, size_t len);
|
||||||
|
bool read(const char *raw) { return read(raw, strlen(raw)); }
|
||||||
bool read(const std::string& rawStr) {
|
bool read(const std::string& rawStr) {
|
||||||
return read(rawStr.c_str());
|
return read(rawStr.data(), rawStr.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -135,7 +155,7 @@ private:
|
|||||||
std::vector<std::string> keys;
|
std::vector<std::string> keys;
|
||||||
std::vector<UniValue> values;
|
std::vector<UniValue> values;
|
||||||
|
|
||||||
int findKey(const std::string& key) const;
|
bool findKey(const std::string& key, size_t& retIdx) const;
|
||||||
void writeArray(unsigned int prettyIndent, unsigned int indentLevel, std::string& s) const;
|
void writeArray(unsigned int prettyIndent, unsigned int indentLevel, std::string& s) const;
|
||||||
void writeObject(unsigned int prettyIndent, unsigned int indentLevel, std::string& s) const;
|
void writeObject(unsigned int prettyIndent, unsigned int indentLevel, std::string& s) const;
|
||||||
|
|
||||||
@ -240,7 +260,7 @@ enum jtokentype {
|
|||||||
};
|
};
|
||||||
|
|
||||||
extern enum jtokentype getJsonToken(std::string& tokenVal,
|
extern enum jtokentype getJsonToken(std::string& tokenVal,
|
||||||
unsigned int& consumed, const char *raw);
|
unsigned int& consumed, const char *raw, const char *end);
|
||||||
extern const char *uvTypeName(UniValue::VType t);
|
extern const char *uvTypeName(UniValue::VType t);
|
||||||
|
|
||||||
static inline bool jsonTokenIsValue(enum jtokentype jtt)
|
static inline bool jsonTokenIsValue(enum jtokentype jtt)
|
||||||
|
@ -4,75 +4,12 @@
|
|||||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <errno.h>
|
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include <limits>
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <stdexcept>
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "univalue.h"
|
#include "univalue.h"
|
||||||
|
|
||||||
namespace
|
|
||||||
{
|
|
||||||
static bool ParsePrechecks(const std::string& str)
|
|
||||||
{
|
|
||||||
if (str.empty()) // No empty string allowed
|
|
||||||
return false;
|
|
||||||
if (str.size() >= 1 && (json_isspace(str[0]) || json_isspace(str[str.size()-1]))) // No padding allowed
|
|
||||||
return false;
|
|
||||||
if (str.size() != strlen(str.c_str())) // No embedded NUL characters allowed
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ParseInt32(const std::string& str, int32_t *out)
|
|
||||||
{
|
|
||||||
if (!ParsePrechecks(str))
|
|
||||||
return false;
|
|
||||||
char *endp = NULL;
|
|
||||||
errno = 0; // strtol will not set errno if valid
|
|
||||||
long int n = strtol(str.c_str(), &endp, 10);
|
|
||||||
if(out) *out = (int32_t)n;
|
|
||||||
// Note that strtol returns a *long int*, so even if strtol doesn't report a over/underflow
|
|
||||||
// we still have to check that the returned value is within the range of an *int32_t*. On 64-bit
|
|
||||||
// platforms the size of these types may be different.
|
|
||||||
return endp && *endp == 0 && !errno &&
|
|
||||||
n >= std::numeric_limits<int32_t>::min() &&
|
|
||||||
n <= std::numeric_limits<int32_t>::max();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ParseInt64(const std::string& str, int64_t *out)
|
|
||||||
{
|
|
||||||
if (!ParsePrechecks(str))
|
|
||||||
return false;
|
|
||||||
char *endp = NULL;
|
|
||||||
errno = 0; // strtoll will not set errno if valid
|
|
||||||
long long int n = strtoll(str.c_str(), &endp, 10);
|
|
||||||
if(out) *out = (int64_t)n;
|
|
||||||
// Note that strtoll returns a *long long int*, so even if strtol doesn't report a over/underflow
|
|
||||||
// we still have to check that the returned value is within the range of an *int64_t*.
|
|
||||||
return endp && *endp == 0 && !errno &&
|
|
||||||
n >= std::numeric_limits<int64_t>::min() &&
|
|
||||||
n <= std::numeric_limits<int64_t>::max();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ParseDouble(const std::string& str, double *out)
|
|
||||||
{
|
|
||||||
if (!ParsePrechecks(str))
|
|
||||||
return false;
|
|
||||||
if (str.size() >= 2 && str[0] == '0' && str[1] == 'x') // No hexadecimal floats allowed
|
|
||||||
return false;
|
|
||||||
std::istringstream text(str);
|
|
||||||
text.imbue(std::locale::classic());
|
|
||||||
double result;
|
|
||||||
text >> result;
|
|
||||||
if(out) *out = result;
|
|
||||||
return text.eof() && !text.fail();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
const UniValue NullUniValue;
|
const UniValue NullUniValue;
|
||||||
@ -104,7 +41,7 @@ static bool validNumStr(const string& s)
|
|||||||
{
|
{
|
||||||
string tokenVal;
|
string tokenVal;
|
||||||
unsigned int consumed;
|
unsigned int consumed;
|
||||||
enum jtokentype tt = getJsonToken(tokenVal, consumed, s.c_str());
|
enum jtokentype tt = getJsonToken(tokenVal, consumed, s.data(), s.data() + s.size());
|
||||||
return (tt == JTOK_NUMBER);
|
return (tt == JTOK_NUMBER);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -189,13 +126,22 @@ bool UniValue::push_backV(const std::vector<UniValue>& vec)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UniValue::__pushKV(const std::string& key, const UniValue& val_)
|
||||||
|
{
|
||||||
|
keys.push_back(key);
|
||||||
|
values.push_back(val_);
|
||||||
|
}
|
||||||
|
|
||||||
bool UniValue::pushKV(const std::string& key, const UniValue& val_)
|
bool UniValue::pushKV(const std::string& key, const UniValue& val_)
|
||||||
{
|
{
|
||||||
if (typ != VOBJ)
|
if (typ != VOBJ)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
keys.push_back(key);
|
size_t idx;
|
||||||
values.push_back(val_);
|
if (findKey(key, idx))
|
||||||
|
values[idx] = val_;
|
||||||
|
else
|
||||||
|
__pushKV(key, val_);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -204,30 +150,43 @@ bool UniValue::pushKVs(const UniValue& obj)
|
|||||||
if (typ != VOBJ || obj.typ != VOBJ)
|
if (typ != VOBJ || obj.typ != VOBJ)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
for (unsigned int i = 0; i < obj.keys.size(); i++) {
|
for (size_t i = 0; i < obj.keys.size(); i++)
|
||||||
keys.push_back(obj.keys[i]);
|
__pushKV(obj.keys[i], obj.values.at(i));
|
||||||
values.push_back(obj.values.at(i));
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int UniValue::findKey(const std::string& key) const
|
void UniValue::getObjMap(std::map<std::string,UniValue>& kv) const
|
||||||
{
|
{
|
||||||
for (unsigned int i = 0; i < keys.size(); i++) {
|
if (typ != VOBJ)
|
||||||
if (keys[i] == key)
|
return;
|
||||||
return (int) i;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
kv.clear();
|
||||||
|
for (size_t i = 0; i < keys.size(); i++)
|
||||||
|
kv[keys[i]] = values[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
bool UniValue::checkObject(const std::map<std::string,UniValue::VType>& t)
|
bool UniValue::findKey(const std::string& key, size_t& retIdx) const
|
||||||
{
|
{
|
||||||
|
for (size_t i = 0; i < keys.size(); i++) {
|
||||||
|
if (keys[i] == key) {
|
||||||
|
retIdx = i;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UniValue::checkObject(const std::map<std::string,UniValue::VType>& t) const
|
||||||
|
{
|
||||||
|
if (typ != VOBJ)
|
||||||
|
return false;
|
||||||
|
|
||||||
for (std::map<std::string,UniValue::VType>::const_iterator it = t.begin();
|
for (std::map<std::string,UniValue::VType>::const_iterator it = t.begin();
|
||||||
it != t.end(); ++it) {
|
it != t.end(); ++it) {
|
||||||
int idx = findKey(it->first);
|
size_t idx = 0;
|
||||||
if (idx < 0)
|
if (!findKey(it->first, idx))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (values.at(idx).getType() != it->second)
|
if (values.at(idx).getType() != it->second)
|
||||||
@ -242,14 +201,14 @@ const UniValue& UniValue::operator[](const std::string& key) const
|
|||||||
if (typ != VOBJ)
|
if (typ != VOBJ)
|
||||||
return NullUniValue;
|
return NullUniValue;
|
||||||
|
|
||||||
int index = findKey(key);
|
size_t index = 0;
|
||||||
if (index < 0)
|
if (!findKey(key, index))
|
||||||
return NullUniValue;
|
return NullUniValue;
|
||||||
|
|
||||||
return values.at(index);
|
return values.at(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
const UniValue& UniValue::operator[](unsigned int index) const
|
const UniValue& UniValue::operator[](size_t index) const
|
||||||
{
|
{
|
||||||
if (typ != VOBJ && typ != VARR)
|
if (typ != VOBJ && typ != VARR)
|
||||||
return NullUniValue;
|
return NullUniValue;
|
||||||
@ -283,75 +242,3 @@ const UniValue& find_value(const UniValue& obj, const std::string& name)
|
|||||||
return NullUniValue;
|
return NullUniValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::vector<std::string>& UniValue::getKeys() const
|
|
||||||
{
|
|
||||||
if (typ != VOBJ)
|
|
||||||
throw std::runtime_error("JSON value is not an object as expected");
|
|
||||||
return keys;
|
|
||||||
}
|
|
||||||
|
|
||||||
const std::vector<UniValue>& UniValue::getValues() const
|
|
||||||
{
|
|
||||||
if (typ != VOBJ && typ != VARR)
|
|
||||||
throw std::runtime_error("JSON value is not an object or array as expected");
|
|
||||||
return values;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool UniValue::get_bool() const
|
|
||||||
{
|
|
||||||
if (typ != VBOOL)
|
|
||||||
throw std::runtime_error("JSON value is not a boolean as expected");
|
|
||||||
return getBool();
|
|
||||||
}
|
|
||||||
|
|
||||||
const std::string& UniValue::get_str() const
|
|
||||||
{
|
|
||||||
if (typ != VSTR)
|
|
||||||
throw std::runtime_error("JSON value is not a string as expected");
|
|
||||||
return getValStr();
|
|
||||||
}
|
|
||||||
|
|
||||||
int UniValue::get_int() const
|
|
||||||
{
|
|
||||||
if (typ != VNUM)
|
|
||||||
throw std::runtime_error("JSON value is not an integer as expected");
|
|
||||||
int32_t retval;
|
|
||||||
if (!ParseInt32(getValStr(), &retval))
|
|
||||||
throw std::runtime_error("JSON integer out of range");
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
int64_t UniValue::get_int64() const
|
|
||||||
{
|
|
||||||
if (typ != VNUM)
|
|
||||||
throw std::runtime_error("JSON value is not an integer as expected");
|
|
||||||
int64_t retval;
|
|
||||||
if (!ParseInt64(getValStr(), &retval))
|
|
||||||
throw std::runtime_error("JSON integer out of range");
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
double UniValue::get_real() const
|
|
||||||
{
|
|
||||||
if (typ != VNUM)
|
|
||||||
throw std::runtime_error("JSON value is not a number as expected");
|
|
||||||
double retval;
|
|
||||||
if (!ParseDouble(getValStr(), &retval))
|
|
||||||
throw std::runtime_error("JSON double out of range");
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
const UniValue& UniValue::get_obj() const
|
|
||||||
{
|
|
||||||
if (typ != VOBJ)
|
|
||||||
throw std::runtime_error("JSON value is not an object as expected");
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
const UniValue& UniValue::get_array() const
|
|
||||||
{
|
|
||||||
if (typ != VARR)
|
|
||||||
throw std::runtime_error("JSON value is not an array as expected");
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
147
src/univalue/lib/univalue_get.cpp
Normal file
147
src/univalue/lib/univalue_get.cpp
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
// Copyright 2014 BitPay Inc.
|
||||||
|
// Copyright 2015 Bitcoin Core Developers
|
||||||
|
// Distributed under the MIT software license, see the accompanying
|
||||||
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <vector>
|
||||||
|
#include <limits>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "univalue.h"
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
static bool ParsePrechecks(const std::string& str)
|
||||||
|
{
|
||||||
|
if (str.empty()) // No empty string allowed
|
||||||
|
return false;
|
||||||
|
if (str.size() >= 1 && (json_isspace(str[0]) || json_isspace(str[str.size()-1]))) // No padding allowed
|
||||||
|
return false;
|
||||||
|
if (str.size() != strlen(str.c_str())) // No embedded NUL characters allowed
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ParseInt32(const std::string& str, int32_t *out)
|
||||||
|
{
|
||||||
|
if (!ParsePrechecks(str))
|
||||||
|
return false;
|
||||||
|
char *endp = NULL;
|
||||||
|
errno = 0; // strtol will not set errno if valid
|
||||||
|
long int n = strtol(str.c_str(), &endp, 10);
|
||||||
|
if(out) *out = (int32_t)n;
|
||||||
|
// Note that strtol returns a *long int*, so even if strtol doesn't report a over/underflow
|
||||||
|
// we still have to check that the returned value is within the range of an *int32_t*. On 64-bit
|
||||||
|
// platforms the size of these types may be different.
|
||||||
|
return endp && *endp == 0 && !errno &&
|
||||||
|
n >= std::numeric_limits<int32_t>::min() &&
|
||||||
|
n <= std::numeric_limits<int32_t>::max();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ParseInt64(const std::string& str, int64_t *out)
|
||||||
|
{
|
||||||
|
if (!ParsePrechecks(str))
|
||||||
|
return false;
|
||||||
|
char *endp = NULL;
|
||||||
|
errno = 0; // strtoll will not set errno if valid
|
||||||
|
long long int n = strtoll(str.c_str(), &endp, 10);
|
||||||
|
if(out) *out = (int64_t)n;
|
||||||
|
// Note that strtoll returns a *long long int*, so even if strtol doesn't report a over/underflow
|
||||||
|
// we still have to check that the returned value is within the range of an *int64_t*.
|
||||||
|
return endp && *endp == 0 && !errno &&
|
||||||
|
n >= std::numeric_limits<int64_t>::min() &&
|
||||||
|
n <= std::numeric_limits<int64_t>::max();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ParseDouble(const std::string& str, double *out)
|
||||||
|
{
|
||||||
|
if (!ParsePrechecks(str))
|
||||||
|
return false;
|
||||||
|
if (str.size() >= 2 && str[0] == '0' && str[1] == 'x') // No hexadecimal floats allowed
|
||||||
|
return false;
|
||||||
|
std::istringstream text(str);
|
||||||
|
text.imbue(std::locale::classic());
|
||||||
|
double result;
|
||||||
|
text >> result;
|
||||||
|
if(out) *out = result;
|
||||||
|
return text.eof() && !text.fail();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::vector<std::string>& UniValue::getKeys() const
|
||||||
|
{
|
||||||
|
if (typ != VOBJ)
|
||||||
|
throw std::runtime_error("JSON value is not an object as expected");
|
||||||
|
return keys;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::vector<UniValue>& UniValue::getValues() const
|
||||||
|
{
|
||||||
|
if (typ != VOBJ && typ != VARR)
|
||||||
|
throw std::runtime_error("JSON value is not an object or array as expected");
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UniValue::get_bool() const
|
||||||
|
{
|
||||||
|
if (typ != VBOOL)
|
||||||
|
throw std::runtime_error("JSON value is not a boolean as expected");
|
||||||
|
return getBool();
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string& UniValue::get_str() const
|
||||||
|
{
|
||||||
|
if (typ != VSTR)
|
||||||
|
throw std::runtime_error("JSON value is not a string as expected");
|
||||||
|
return getValStr();
|
||||||
|
}
|
||||||
|
|
||||||
|
int UniValue::get_int() const
|
||||||
|
{
|
||||||
|
if (typ != VNUM)
|
||||||
|
throw std::runtime_error("JSON value is not an integer as expected");
|
||||||
|
int32_t retval;
|
||||||
|
if (!ParseInt32(getValStr(), &retval))
|
||||||
|
throw std::runtime_error("JSON integer out of range");
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t UniValue::get_int64() const
|
||||||
|
{
|
||||||
|
if (typ != VNUM)
|
||||||
|
throw std::runtime_error("JSON value is not an integer as expected");
|
||||||
|
int64_t retval;
|
||||||
|
if (!ParseInt64(getValStr(), &retval))
|
||||||
|
throw std::runtime_error("JSON integer out of range");
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
double UniValue::get_real() const
|
||||||
|
{
|
||||||
|
if (typ != VNUM)
|
||||||
|
throw std::runtime_error("JSON value is not a number as expected");
|
||||||
|
double retval;
|
||||||
|
if (!ParseDouble(getValStr(), &retval))
|
||||||
|
throw std::runtime_error("JSON double out of range");
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
const UniValue& UniValue::get_obj() const
|
||||||
|
{
|
||||||
|
if (typ != VOBJ)
|
||||||
|
throw std::runtime_error("JSON value is not an object as expected");
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
const UniValue& UniValue::get_array() const
|
||||||
|
{
|
||||||
|
if (typ != VARR)
|
||||||
|
throw std::runtime_error("JSON value is not an array as expected");
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
@ -43,21 +43,21 @@ static const char *hatoui(const char *first, const char *last,
|
|||||||
}
|
}
|
||||||
|
|
||||||
enum jtokentype getJsonToken(string& tokenVal, unsigned int& consumed,
|
enum jtokentype getJsonToken(string& tokenVal, unsigned int& consumed,
|
||||||
const char *raw)
|
const char *raw, const char *end)
|
||||||
{
|
{
|
||||||
tokenVal.clear();
|
tokenVal.clear();
|
||||||
consumed = 0;
|
consumed = 0;
|
||||||
|
|
||||||
const char *rawStart = raw;
|
const char *rawStart = raw;
|
||||||
|
|
||||||
while ((*raw) && (json_isspace(*raw))) // skip whitespace
|
while (raw < end && (json_isspace(*raw))) // skip whitespace
|
||||||
raw++;
|
raw++;
|
||||||
|
|
||||||
switch (*raw) {
|
if (raw >= end)
|
||||||
|
|
||||||
case 0:
|
|
||||||
return JTOK_NONE;
|
return JTOK_NONE;
|
||||||
|
|
||||||
|
switch (*raw) {
|
||||||
|
|
||||||
case '{':
|
case '{':
|
||||||
raw++;
|
raw++;
|
||||||
consumed = (raw - rawStart);
|
consumed = (raw - rawStart);
|
||||||
@ -127,40 +127,40 @@ enum jtokentype getJsonToken(string& tokenVal, unsigned int& consumed,
|
|||||||
numStr += *raw; // copy first char
|
numStr += *raw; // copy first char
|
||||||
raw++;
|
raw++;
|
||||||
|
|
||||||
if ((*first == '-') && (!json_isdigit(*raw)))
|
if ((*first == '-') && (raw < end) && (!json_isdigit(*raw)))
|
||||||
return JTOK_ERR;
|
return JTOK_ERR;
|
||||||
|
|
||||||
while ((*raw) && json_isdigit(*raw)) { // copy digits
|
while (raw < end && json_isdigit(*raw)) { // copy digits
|
||||||
numStr += *raw;
|
numStr += *raw;
|
||||||
raw++;
|
raw++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// part 2: frac
|
// part 2: frac
|
||||||
if (*raw == '.') {
|
if (raw < end && *raw == '.') {
|
||||||
numStr += *raw; // copy .
|
numStr += *raw; // copy .
|
||||||
raw++;
|
raw++;
|
||||||
|
|
||||||
if (!json_isdigit(*raw))
|
if (raw >= end || !json_isdigit(*raw))
|
||||||
return JTOK_ERR;
|
return JTOK_ERR;
|
||||||
while ((*raw) && json_isdigit(*raw)) { // copy digits
|
while (raw < end && json_isdigit(*raw)) { // copy digits
|
||||||
numStr += *raw;
|
numStr += *raw;
|
||||||
raw++;
|
raw++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// part 3: exp
|
// part 3: exp
|
||||||
if (*raw == 'e' || *raw == 'E') {
|
if (raw < end && (*raw == 'e' || *raw == 'E')) {
|
||||||
numStr += *raw; // copy E
|
numStr += *raw; // copy E
|
||||||
raw++;
|
raw++;
|
||||||
|
|
||||||
if (*raw == '-' || *raw == '+') { // copy +/-
|
if (raw < end && (*raw == '-' || *raw == '+')) { // copy +/-
|
||||||
numStr += *raw;
|
numStr += *raw;
|
||||||
raw++;
|
raw++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!json_isdigit(*raw))
|
if (raw >= end || !json_isdigit(*raw))
|
||||||
return JTOK_ERR;
|
return JTOK_ERR;
|
||||||
while ((*raw) && json_isdigit(*raw)) { // copy digits
|
while (raw < end && json_isdigit(*raw)) { // copy digits
|
||||||
numStr += *raw;
|
numStr += *raw;
|
||||||
raw++;
|
raw++;
|
||||||
}
|
}
|
||||||
@ -177,13 +177,16 @@ enum jtokentype getJsonToken(string& tokenVal, unsigned int& consumed,
|
|||||||
string valStr;
|
string valStr;
|
||||||
JSONUTF8StringFilter writer(valStr);
|
JSONUTF8StringFilter writer(valStr);
|
||||||
|
|
||||||
while (*raw) {
|
while (true) {
|
||||||
if ((unsigned char)*raw < 0x20)
|
if (raw >= end || (unsigned char)*raw < 0x20)
|
||||||
return JTOK_ERR;
|
return JTOK_ERR;
|
||||||
|
|
||||||
else if (*raw == '\\') {
|
else if (*raw == '\\') {
|
||||||
raw++; // skip backslash
|
raw++; // skip backslash
|
||||||
|
|
||||||
|
if (raw >= end)
|
||||||
|
return JTOK_ERR;
|
||||||
|
|
||||||
switch (*raw) {
|
switch (*raw) {
|
||||||
case '"': writer.push_back('\"'); break;
|
case '"': writer.push_back('\"'); break;
|
||||||
case '\\': writer.push_back('\\'); break;
|
case '\\': writer.push_back('\\'); break;
|
||||||
@ -196,7 +199,8 @@ enum jtokentype getJsonToken(string& tokenVal, unsigned int& consumed,
|
|||||||
|
|
||||||
case 'u': {
|
case 'u': {
|
||||||
unsigned int codepoint;
|
unsigned int codepoint;
|
||||||
if (hatoui(raw + 1, raw + 1 + 4, codepoint) !=
|
if (raw + 1 + 4 >= end ||
|
||||||
|
hatoui(raw + 1, raw + 1 + 4, codepoint) !=
|
||||||
raw + 1 + 4)
|
raw + 1 + 4)
|
||||||
return JTOK_ERR;
|
return JTOK_ERR;
|
||||||
writer.push_back_u(codepoint);
|
writer.push_back_u(codepoint);
|
||||||
@ -246,7 +250,7 @@ enum expect_bits {
|
|||||||
#define setExpect(bit) (expectMask |= EXP_##bit)
|
#define setExpect(bit) (expectMask |= EXP_##bit)
|
||||||
#define clearExpect(bit) (expectMask &= ~EXP_##bit)
|
#define clearExpect(bit) (expectMask &= ~EXP_##bit)
|
||||||
|
|
||||||
bool UniValue::read(const char *raw)
|
bool UniValue::read(const char *raw, size_t size)
|
||||||
{
|
{
|
||||||
clear();
|
clear();
|
||||||
|
|
||||||
@ -257,10 +261,11 @@ bool UniValue::read(const char *raw)
|
|||||||
unsigned int consumed;
|
unsigned int consumed;
|
||||||
enum jtokentype tok = JTOK_NONE;
|
enum jtokentype tok = JTOK_NONE;
|
||||||
enum jtokentype last_tok = JTOK_NONE;
|
enum jtokentype last_tok = JTOK_NONE;
|
||||||
|
const char* end = raw + size;
|
||||||
do {
|
do {
|
||||||
last_tok = tok;
|
last_tok = tok;
|
||||||
|
|
||||||
tok = getJsonToken(tokenVal, consumed, raw);
|
tok = getJsonToken(tokenVal, consumed, raw, end);
|
||||||
if (tok == JTOK_NONE || tok == JTOK_ERR)
|
if (tok == JTOK_NONE || tok == JTOK_ERR)
|
||||||
return false;
|
return false;
|
||||||
raw += consumed;
|
raw += consumed;
|
||||||
@ -371,9 +376,6 @@ bool UniValue::read(const char *raw)
|
|||||||
case JTOK_KW_NULL:
|
case JTOK_KW_NULL:
|
||||||
case JTOK_KW_TRUE:
|
case JTOK_KW_TRUE:
|
||||||
case JTOK_KW_FALSE: {
|
case JTOK_KW_FALSE: {
|
||||||
if (!stack.size())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
UniValue tmpVal;
|
UniValue tmpVal;
|
||||||
switch (tok) {
|
switch (tok) {
|
||||||
case JTOK_KW_NULL:
|
case JTOK_KW_NULL:
|
||||||
@ -388,6 +390,11 @@ bool UniValue::read(const char *raw)
|
|||||||
default: /* impossible */ break;
|
default: /* impossible */ break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!stack.size()) {
|
||||||
|
*this = tmpVal;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
UniValue *top = stack.back();
|
UniValue *top = stack.back();
|
||||||
top->values.push_back(tmpVal);
|
top->values.push_back(tmpVal);
|
||||||
|
|
||||||
@ -396,10 +403,12 @@ bool UniValue::read(const char *raw)
|
|||||||
}
|
}
|
||||||
|
|
||||||
case JTOK_NUMBER: {
|
case JTOK_NUMBER: {
|
||||||
if (!stack.size())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
UniValue tmpVal(VNUM, tokenVal);
|
UniValue tmpVal(VNUM, tokenVal);
|
||||||
|
if (!stack.size()) {
|
||||||
|
*this = tmpVal;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
UniValue *top = stack.back();
|
UniValue *top = stack.back();
|
||||||
top->values.push_back(tmpVal);
|
top->values.push_back(tmpVal);
|
||||||
|
|
||||||
@ -408,17 +417,18 @@ bool UniValue::read(const char *raw)
|
|||||||
}
|
}
|
||||||
|
|
||||||
case JTOK_STRING: {
|
case JTOK_STRING: {
|
||||||
if (!stack.size())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
UniValue *top = stack.back();
|
|
||||||
|
|
||||||
if (expect(OBJ_NAME)) {
|
if (expect(OBJ_NAME)) {
|
||||||
|
UniValue *top = stack.back();
|
||||||
top->keys.push_back(tokenVal);
|
top->keys.push_back(tokenVal);
|
||||||
clearExpect(OBJ_NAME);
|
clearExpect(OBJ_NAME);
|
||||||
setExpect(COLON);
|
setExpect(COLON);
|
||||||
} else {
|
} else {
|
||||||
UniValue tmpVal(VSTR, tokenVal);
|
UniValue tmpVal(VSTR, tokenVal);
|
||||||
|
if (!stack.size()) {
|
||||||
|
*this = tmpVal;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
UniValue *top = stack.back();
|
||||||
top->values.push_back(tmpVal);
|
top->values.push_back(tmpVal);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -432,7 +442,7 @@ bool UniValue::read(const char *raw)
|
|||||||
} while (!stack.empty ());
|
} while (!stack.empty ());
|
||||||
|
|
||||||
/* Check that nothing follows the initial construct (parsed above). */
|
/* Check that nothing follows the initial construct (parsed above). */
|
||||||
tok = getJsonToken(tokenVal, consumed, raw);
|
tok = getJsonToken(tokenVal, consumed, raw, end);
|
||||||
if (tok != JTOK_NONE)
|
if (tok != JTOK_NONE)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -46,19 +46,19 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Write codepoint directly, possibly collating surrogate pairs
|
// Write codepoint directly, possibly collating surrogate pairs
|
||||||
void push_back_u(unsigned int codepoint)
|
void push_back_u(unsigned int codepoint_)
|
||||||
{
|
{
|
||||||
if (state) // Only accept full codepoints in open state
|
if (state) // Only accept full codepoints in open state
|
||||||
is_valid = false;
|
is_valid = false;
|
||||||
if (codepoint >= 0xD800 && codepoint < 0xDC00) { // First half of surrogate pair
|
if (codepoint_ >= 0xD800 && codepoint_ < 0xDC00) { // First half of surrogate pair
|
||||||
if (surpair) // Two subsequent surrogate pair openers - fail
|
if (surpair) // Two subsequent surrogate pair openers - fail
|
||||||
is_valid = false;
|
is_valid = false;
|
||||||
else
|
else
|
||||||
surpair = codepoint;
|
surpair = codepoint_;
|
||||||
} else if (codepoint >= 0xDC00 && codepoint < 0xE000) { // Second half of surrogate pair
|
} else if (codepoint_ >= 0xDC00 && codepoint_ < 0xE000) { // Second half of surrogate pair
|
||||||
if (surpair) { // Open surrogate pair, expect second half
|
if (surpair) { // Open surrogate pair, expect second half
|
||||||
// Compute code point from UTF-16 surrogate pair
|
// Compute code point from UTF-16 surrogate pair
|
||||||
append_codepoint(0x10000 | ((surpair - 0xD800)<<10) | (codepoint - 0xDC00));
|
append_codepoint(0x10000 | ((surpair - 0xD800)<<10) | (codepoint_ - 0xDC00));
|
||||||
surpair = 0;
|
surpair = 0;
|
||||||
} else // Second half doesn't follow a first half - fail
|
} else // Second half doesn't follow a first half - fail
|
||||||
is_valid = false;
|
is_valid = false;
|
||||||
@ -66,7 +66,7 @@ public:
|
|||||||
if (surpair) // First half of surrogate pair not followed by second - fail
|
if (surpair) // First half of surrogate pair not followed by second - fail
|
||||||
is_valid = false;
|
is_valid = false;
|
||||||
else
|
else
|
||||||
append_codepoint(codepoint);
|
append_codepoint(codepoint_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Check that we're in a state where the string can be ended
|
// Check that we're in a state where the string can be ended
|
||||||
@ -96,22 +96,22 @@ private:
|
|||||||
// Two subsequent \u.... may have to be replaced with one actual codepoint.
|
// Two subsequent \u.... may have to be replaced with one actual codepoint.
|
||||||
unsigned int surpair; // First half of open UTF-16 surrogate pair, or 0
|
unsigned int surpair; // First half of open UTF-16 surrogate pair, or 0
|
||||||
|
|
||||||
void append_codepoint(unsigned int codepoint)
|
void append_codepoint(unsigned int codepoint_)
|
||||||
{
|
{
|
||||||
if (codepoint <= 0x7f)
|
if (codepoint_ <= 0x7f)
|
||||||
str.push_back((char)codepoint);
|
str.push_back((char)codepoint_);
|
||||||
else if (codepoint <= 0x7FF) {
|
else if (codepoint_ <= 0x7FF) {
|
||||||
str.push_back((char)(0xC0 | (codepoint >> 6)));
|
str.push_back((char)(0xC0 | (codepoint_ >> 6)));
|
||||||
str.push_back((char)(0x80 | (codepoint & 0x3F)));
|
str.push_back((char)(0x80 | (codepoint_ & 0x3F)));
|
||||||
} else if (codepoint <= 0xFFFF) {
|
} else if (codepoint_ <= 0xFFFF) {
|
||||||
str.push_back((char)(0xE0 | (codepoint >> 12)));
|
str.push_back((char)(0xE0 | (codepoint_ >> 12)));
|
||||||
str.push_back((char)(0x80 | ((codepoint >> 6) & 0x3F)));
|
str.push_back((char)(0x80 | ((codepoint_ >> 6) & 0x3F)));
|
||||||
str.push_back((char)(0x80 | (codepoint & 0x3F)));
|
str.push_back((char)(0x80 | (codepoint_ & 0x3F)));
|
||||||
} else if (codepoint <= 0x1FFFFF) {
|
} else if (codepoint_ <= 0x1FFFFF) {
|
||||||
str.push_back((char)(0xF0 | (codepoint >> 18)));
|
str.push_back((char)(0xF0 | (codepoint_ >> 18)));
|
||||||
str.push_back((char)(0x80 | ((codepoint >> 12) & 0x3F)));
|
str.push_back((char)(0x80 | ((codepoint_ >> 12) & 0x3F)));
|
||||||
str.push_back((char)(0x80 | ((codepoint >> 6) & 0x3F)));
|
str.push_back((char)(0x80 | ((codepoint_ >> 6) & 0x3F)));
|
||||||
str.push_back((char)(0x80 | (codepoint & 0x3F)));
|
str.push_back((char)(0x80 | (codepoint_ & 0x3F)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -79,8 +79,6 @@ void UniValue::writeArray(unsigned int prettyIndent, unsigned int indentLevel, s
|
|||||||
s += values[i].write(prettyIndent, indentLevel + 1);
|
s += values[i].write(prettyIndent, indentLevel + 1);
|
||||||
if (i != (values.size() - 1)) {
|
if (i != (values.size() - 1)) {
|
||||||
s += ",";
|
s += ",";
|
||||||
if (prettyIndent)
|
|
||||||
s += " ";
|
|
||||||
}
|
}
|
||||||
if (prettyIndent)
|
if (prettyIndent)
|
||||||
s += "\n";
|
s += "\n";
|
||||||
|
4
src/univalue/test/.gitignore
vendored
4
src/univalue/test/.gitignore
vendored
@ -1,4 +1,8 @@
|
|||||||
|
|
||||||
|
object
|
||||||
unitester
|
unitester
|
||||||
|
test_json
|
||||||
|
no_nul
|
||||||
|
|
||||||
*.trs
|
*.trs
|
||||||
*.log
|
*.log
|
||||||
|
@ -1 +1 @@
|
|||||||
"A JSON payload should be an object or array, not a string."
|
"This is a string that never ends, yes it goes on and on, my friends.
|
||||||
|
BIN
src/univalue/test/fail42.json
Normal file
BIN
src/univalue/test/fail42.json
Normal file
Binary file not shown.
1
src/univalue/test/fail44.json
Normal file
1
src/univalue/test/fail44.json
Normal file
@ -0,0 +1 @@
|
|||||||
|
"This file ends without a newline or close-quote.
|
8
src/univalue/test/no_nul.cpp
Normal file
8
src/univalue/test/no_nul.cpp
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#include "univalue.h"
|
||||||
|
|
||||||
|
int main (int argc, char *argv[])
|
||||||
|
{
|
||||||
|
char buf[] = "___[1,2,3]___";
|
||||||
|
UniValue val;
|
||||||
|
return val.read(buf + 3, 7) ? 0 : 1;
|
||||||
|
}
|
395
src/univalue/test/object.cpp
Normal file
395
src/univalue/test/object.cpp
Normal file
@ -0,0 +1,395 @@
|
|||||||
|
// Copyright (c) 2014 BitPay Inc.
|
||||||
|
// Copyright (c) 2014-2016 The Bitcoin Core developers
|
||||||
|
// Distributed under the MIT software license, see the accompanying
|
||||||
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <vector>
|
||||||
|
#include <string>
|
||||||
|
#include <map>
|
||||||
|
#include <cassert>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <univalue.h>
|
||||||
|
|
||||||
|
#define BOOST_FIXTURE_TEST_SUITE(a, b)
|
||||||
|
#define BOOST_AUTO_TEST_CASE(funcName) void funcName()
|
||||||
|
#define BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
#define BOOST_CHECK(expr) assert(expr)
|
||||||
|
#define BOOST_CHECK_EQUAL(v1, v2) assert((v1) == (v2))
|
||||||
|
#define BOOST_CHECK_THROW(stmt, excMatch) { \
|
||||||
|
try { \
|
||||||
|
(stmt); \
|
||||||
|
} catch (excMatch & e) { \
|
||||||
|
} catch (...) { \
|
||||||
|
assert(0); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
#define BOOST_CHECK_NO_THROW(stmt) { \
|
||||||
|
try { \
|
||||||
|
(stmt); \
|
||||||
|
} catch (...) { \
|
||||||
|
assert(0); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_FIXTURE_TEST_SUITE(univalue_tests, BasicTestingSetup)
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(univalue_constructor)
|
||||||
|
{
|
||||||
|
UniValue v1;
|
||||||
|
BOOST_CHECK(v1.isNull());
|
||||||
|
|
||||||
|
UniValue v2(UniValue::VSTR);
|
||||||
|
BOOST_CHECK(v2.isStr());
|
||||||
|
|
||||||
|
UniValue v3(UniValue::VSTR, "foo");
|
||||||
|
BOOST_CHECK(v3.isStr());
|
||||||
|
BOOST_CHECK_EQUAL(v3.getValStr(), "foo");
|
||||||
|
|
||||||
|
UniValue numTest;
|
||||||
|
BOOST_CHECK(numTest.setNumStr("82"));
|
||||||
|
BOOST_CHECK(numTest.isNum());
|
||||||
|
BOOST_CHECK_EQUAL(numTest.getValStr(), "82");
|
||||||
|
|
||||||
|
uint64_t vu64 = 82;
|
||||||
|
UniValue v4(vu64);
|
||||||
|
BOOST_CHECK(v4.isNum());
|
||||||
|
BOOST_CHECK_EQUAL(v4.getValStr(), "82");
|
||||||
|
|
||||||
|
int64_t vi64 = -82;
|
||||||
|
UniValue v5(vi64);
|
||||||
|
BOOST_CHECK(v5.isNum());
|
||||||
|
BOOST_CHECK_EQUAL(v5.getValStr(), "-82");
|
||||||
|
|
||||||
|
int vi = -688;
|
||||||
|
UniValue v6(vi);
|
||||||
|
BOOST_CHECK(v6.isNum());
|
||||||
|
BOOST_CHECK_EQUAL(v6.getValStr(), "-688");
|
||||||
|
|
||||||
|
double vd = -7.21;
|
||||||
|
UniValue v7(vd);
|
||||||
|
BOOST_CHECK(v7.isNum());
|
||||||
|
BOOST_CHECK_EQUAL(v7.getValStr(), "-7.21");
|
||||||
|
|
||||||
|
std::string vs("yawn");
|
||||||
|
UniValue v8(vs);
|
||||||
|
BOOST_CHECK(v8.isStr());
|
||||||
|
BOOST_CHECK_EQUAL(v8.getValStr(), "yawn");
|
||||||
|
|
||||||
|
const char *vcs = "zappa";
|
||||||
|
UniValue v9(vcs);
|
||||||
|
BOOST_CHECK(v9.isStr());
|
||||||
|
BOOST_CHECK_EQUAL(v9.getValStr(), "zappa");
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(univalue_typecheck)
|
||||||
|
{
|
||||||
|
UniValue v1;
|
||||||
|
BOOST_CHECK(v1.setNumStr("1"));
|
||||||
|
BOOST_CHECK(v1.isNum());
|
||||||
|
BOOST_CHECK_THROW(v1.get_bool(), std::runtime_error);
|
||||||
|
|
||||||
|
UniValue v2;
|
||||||
|
BOOST_CHECK(v2.setBool(true));
|
||||||
|
BOOST_CHECK_EQUAL(v2.get_bool(), true);
|
||||||
|
BOOST_CHECK_THROW(v2.get_int(), std::runtime_error);
|
||||||
|
|
||||||
|
UniValue v3;
|
||||||
|
BOOST_CHECK(v3.setNumStr("32482348723847471234"));
|
||||||
|
BOOST_CHECK_THROW(v3.get_int64(), std::runtime_error);
|
||||||
|
BOOST_CHECK(v3.setNumStr("1000"));
|
||||||
|
BOOST_CHECK_EQUAL(v3.get_int64(), 1000);
|
||||||
|
|
||||||
|
UniValue v4;
|
||||||
|
BOOST_CHECK(v4.setNumStr("2147483648"));
|
||||||
|
BOOST_CHECK_EQUAL(v4.get_int64(), 2147483648);
|
||||||
|
BOOST_CHECK_THROW(v4.get_int(), std::runtime_error);
|
||||||
|
BOOST_CHECK(v4.setNumStr("1000"));
|
||||||
|
BOOST_CHECK_EQUAL(v4.get_int(), 1000);
|
||||||
|
BOOST_CHECK_THROW(v4.get_str(), std::runtime_error);
|
||||||
|
BOOST_CHECK_EQUAL(v4.get_real(), 1000);
|
||||||
|
BOOST_CHECK_THROW(v4.get_array(), std::runtime_error);
|
||||||
|
BOOST_CHECK_THROW(v4.getKeys(), std::runtime_error);
|
||||||
|
BOOST_CHECK_THROW(v4.getValues(), std::runtime_error);
|
||||||
|
BOOST_CHECK_THROW(v4.get_obj(), std::runtime_error);
|
||||||
|
|
||||||
|
UniValue v5;
|
||||||
|
BOOST_CHECK(v5.read("[true, 10]"));
|
||||||
|
BOOST_CHECK_NO_THROW(v5.get_array());
|
||||||
|
std::vector<UniValue> vals = v5.getValues();
|
||||||
|
BOOST_CHECK_THROW(vals[0].get_int(), std::runtime_error);
|
||||||
|
BOOST_CHECK_EQUAL(vals[0].get_bool(), true);
|
||||||
|
|
||||||
|
BOOST_CHECK_EQUAL(vals[1].get_int(), 10);
|
||||||
|
BOOST_CHECK_THROW(vals[1].get_bool(), std::runtime_error);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(univalue_set)
|
||||||
|
{
|
||||||
|
UniValue v(UniValue::VSTR, "foo");
|
||||||
|
v.clear();
|
||||||
|
BOOST_CHECK(v.isNull());
|
||||||
|
BOOST_CHECK_EQUAL(v.getValStr(), "");
|
||||||
|
|
||||||
|
BOOST_CHECK(v.setObject());
|
||||||
|
BOOST_CHECK(v.isObject());
|
||||||
|
BOOST_CHECK_EQUAL(v.size(), 0);
|
||||||
|
BOOST_CHECK_EQUAL(v.getType(), UniValue::VOBJ);
|
||||||
|
BOOST_CHECK(v.empty());
|
||||||
|
|
||||||
|
BOOST_CHECK(v.setArray());
|
||||||
|
BOOST_CHECK(v.isArray());
|
||||||
|
BOOST_CHECK_EQUAL(v.size(), 0);
|
||||||
|
|
||||||
|
BOOST_CHECK(v.setStr("zum"));
|
||||||
|
BOOST_CHECK(v.isStr());
|
||||||
|
BOOST_CHECK_EQUAL(v.getValStr(), "zum");
|
||||||
|
|
||||||
|
BOOST_CHECK(v.setFloat(-1.01));
|
||||||
|
BOOST_CHECK(v.isNum());
|
||||||
|
BOOST_CHECK_EQUAL(v.getValStr(), "-1.01");
|
||||||
|
|
||||||
|
BOOST_CHECK(v.setInt((int)1023));
|
||||||
|
BOOST_CHECK(v.isNum());
|
||||||
|
BOOST_CHECK_EQUAL(v.getValStr(), "1023");
|
||||||
|
|
||||||
|
BOOST_CHECK(v.setInt((int64_t)-1023LL));
|
||||||
|
BOOST_CHECK(v.isNum());
|
||||||
|
BOOST_CHECK_EQUAL(v.getValStr(), "-1023");
|
||||||
|
|
||||||
|
BOOST_CHECK(v.setInt((uint64_t)1023ULL));
|
||||||
|
BOOST_CHECK(v.isNum());
|
||||||
|
BOOST_CHECK_EQUAL(v.getValStr(), "1023");
|
||||||
|
|
||||||
|
BOOST_CHECK(v.setNumStr("-688"));
|
||||||
|
BOOST_CHECK(v.isNum());
|
||||||
|
BOOST_CHECK_EQUAL(v.getValStr(), "-688");
|
||||||
|
|
||||||
|
BOOST_CHECK(v.setBool(false));
|
||||||
|
BOOST_CHECK_EQUAL(v.isBool(), true);
|
||||||
|
BOOST_CHECK_EQUAL(v.isTrue(), false);
|
||||||
|
BOOST_CHECK_EQUAL(v.isFalse(), true);
|
||||||
|
BOOST_CHECK_EQUAL(v.getBool(), false);
|
||||||
|
|
||||||
|
BOOST_CHECK(v.setBool(true));
|
||||||
|
BOOST_CHECK_EQUAL(v.isBool(), true);
|
||||||
|
BOOST_CHECK_EQUAL(v.isTrue(), true);
|
||||||
|
BOOST_CHECK_EQUAL(v.isFalse(), false);
|
||||||
|
BOOST_CHECK_EQUAL(v.getBool(), true);
|
||||||
|
|
||||||
|
BOOST_CHECK(!v.setNumStr("zombocom"));
|
||||||
|
|
||||||
|
BOOST_CHECK(v.setNull());
|
||||||
|
BOOST_CHECK(v.isNull());
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(univalue_array)
|
||||||
|
{
|
||||||
|
UniValue arr(UniValue::VARR);
|
||||||
|
|
||||||
|
UniValue v((int64_t)1023LL);
|
||||||
|
BOOST_CHECK(arr.push_back(v));
|
||||||
|
|
||||||
|
std::string vStr("zippy");
|
||||||
|
BOOST_CHECK(arr.push_back(vStr));
|
||||||
|
|
||||||
|
const char *s = "pippy";
|
||||||
|
BOOST_CHECK(arr.push_back(s));
|
||||||
|
|
||||||
|
std::vector<UniValue> vec;
|
||||||
|
v.setStr("boing");
|
||||||
|
vec.push_back(v);
|
||||||
|
|
||||||
|
v.setStr("going");
|
||||||
|
vec.push_back(v);
|
||||||
|
|
||||||
|
BOOST_CHECK(arr.push_backV(vec));
|
||||||
|
|
||||||
|
BOOST_CHECK(arr.push_back((uint64_t) 400ULL));
|
||||||
|
BOOST_CHECK(arr.push_back((int64_t) -400LL));
|
||||||
|
BOOST_CHECK(arr.push_back((int) -401));
|
||||||
|
BOOST_CHECK(arr.push_back(-40.1));
|
||||||
|
|
||||||
|
BOOST_CHECK_EQUAL(arr.empty(), false);
|
||||||
|
BOOST_CHECK_EQUAL(arr.size(), 9);
|
||||||
|
|
||||||
|
BOOST_CHECK_EQUAL(arr[0].getValStr(), "1023");
|
||||||
|
BOOST_CHECK_EQUAL(arr[1].getValStr(), "zippy");
|
||||||
|
BOOST_CHECK_EQUAL(arr[2].getValStr(), "pippy");
|
||||||
|
BOOST_CHECK_EQUAL(arr[3].getValStr(), "boing");
|
||||||
|
BOOST_CHECK_EQUAL(arr[4].getValStr(), "going");
|
||||||
|
BOOST_CHECK_EQUAL(arr[5].getValStr(), "400");
|
||||||
|
BOOST_CHECK_EQUAL(arr[6].getValStr(), "-400");
|
||||||
|
BOOST_CHECK_EQUAL(arr[7].getValStr(), "-401");
|
||||||
|
BOOST_CHECK_EQUAL(arr[8].getValStr(), "-40.1");
|
||||||
|
|
||||||
|
BOOST_CHECK_EQUAL(arr[999].getValStr(), "");
|
||||||
|
|
||||||
|
arr.clear();
|
||||||
|
BOOST_CHECK(arr.empty());
|
||||||
|
BOOST_CHECK_EQUAL(arr.size(), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(univalue_object)
|
||||||
|
{
|
||||||
|
UniValue obj(UniValue::VOBJ);
|
||||||
|
std::string strKey, strVal;
|
||||||
|
UniValue v;
|
||||||
|
|
||||||
|
strKey = "age";
|
||||||
|
v.setInt(100);
|
||||||
|
BOOST_CHECK(obj.pushKV(strKey, v));
|
||||||
|
|
||||||
|
strKey = "first";
|
||||||
|
strVal = "John";
|
||||||
|
BOOST_CHECK(obj.pushKV(strKey, strVal));
|
||||||
|
|
||||||
|
strKey = "last";
|
||||||
|
const char *cVal = "Smith";
|
||||||
|
BOOST_CHECK(obj.pushKV(strKey, cVal));
|
||||||
|
|
||||||
|
strKey = "distance";
|
||||||
|
BOOST_CHECK(obj.pushKV(strKey, (int64_t) 25));
|
||||||
|
|
||||||
|
strKey = "time";
|
||||||
|
BOOST_CHECK(obj.pushKV(strKey, (uint64_t) 3600));
|
||||||
|
|
||||||
|
strKey = "calories";
|
||||||
|
BOOST_CHECK(obj.pushKV(strKey, (int) 12));
|
||||||
|
|
||||||
|
strKey = "temperature";
|
||||||
|
BOOST_CHECK(obj.pushKV(strKey, (double) 90.012));
|
||||||
|
|
||||||
|
UniValue obj2(UniValue::VOBJ);
|
||||||
|
BOOST_CHECK(obj2.pushKV("cat1", 9000));
|
||||||
|
BOOST_CHECK(obj2.pushKV("cat2", 12345));
|
||||||
|
|
||||||
|
BOOST_CHECK(obj.pushKVs(obj2));
|
||||||
|
|
||||||
|
BOOST_CHECK_EQUAL(obj.empty(), false);
|
||||||
|
BOOST_CHECK_EQUAL(obj.size(), 9);
|
||||||
|
|
||||||
|
BOOST_CHECK_EQUAL(obj["age"].getValStr(), "100");
|
||||||
|
BOOST_CHECK_EQUAL(obj["first"].getValStr(), "John");
|
||||||
|
BOOST_CHECK_EQUAL(obj["last"].getValStr(), "Smith");
|
||||||
|
BOOST_CHECK_EQUAL(obj["distance"].getValStr(), "25");
|
||||||
|
BOOST_CHECK_EQUAL(obj["time"].getValStr(), "3600");
|
||||||
|
BOOST_CHECK_EQUAL(obj["calories"].getValStr(), "12");
|
||||||
|
BOOST_CHECK_EQUAL(obj["temperature"].getValStr(), "90.012");
|
||||||
|
BOOST_CHECK_EQUAL(obj["cat1"].getValStr(), "9000");
|
||||||
|
BOOST_CHECK_EQUAL(obj["cat2"].getValStr(), "12345");
|
||||||
|
|
||||||
|
BOOST_CHECK_EQUAL(obj["nyuknyuknyuk"].getValStr(), "");
|
||||||
|
|
||||||
|
BOOST_CHECK(obj.exists("age"));
|
||||||
|
BOOST_CHECK(obj.exists("first"));
|
||||||
|
BOOST_CHECK(obj.exists("last"));
|
||||||
|
BOOST_CHECK(obj.exists("distance"));
|
||||||
|
BOOST_CHECK(obj.exists("time"));
|
||||||
|
BOOST_CHECK(obj.exists("calories"));
|
||||||
|
BOOST_CHECK(obj.exists("temperature"));
|
||||||
|
BOOST_CHECK(obj.exists("cat1"));
|
||||||
|
BOOST_CHECK(obj.exists("cat2"));
|
||||||
|
|
||||||
|
BOOST_CHECK(!obj.exists("nyuknyuknyuk"));
|
||||||
|
|
||||||
|
std::map<std::string, UniValue::VType> objTypes;
|
||||||
|
objTypes["age"] = UniValue::VNUM;
|
||||||
|
objTypes["first"] = UniValue::VSTR;
|
||||||
|
objTypes["last"] = UniValue::VSTR;
|
||||||
|
objTypes["distance"] = UniValue::VNUM;
|
||||||
|
objTypes["time"] = UniValue::VNUM;
|
||||||
|
objTypes["calories"] = UniValue::VNUM;
|
||||||
|
objTypes["temperature"] = UniValue::VNUM;
|
||||||
|
objTypes["cat1"] = UniValue::VNUM;
|
||||||
|
objTypes["cat2"] = UniValue::VNUM;
|
||||||
|
BOOST_CHECK(obj.checkObject(objTypes));
|
||||||
|
|
||||||
|
objTypes["cat2"] = UniValue::VSTR;
|
||||||
|
BOOST_CHECK(!obj.checkObject(objTypes));
|
||||||
|
|
||||||
|
obj.clear();
|
||||||
|
BOOST_CHECK(obj.empty());
|
||||||
|
BOOST_CHECK_EQUAL(obj.size(), 0);
|
||||||
|
BOOST_CHECK_EQUAL(obj.getType(), UniValue::VNULL);
|
||||||
|
|
||||||
|
BOOST_CHECK_EQUAL(obj.setObject(), true);
|
||||||
|
UniValue uv;
|
||||||
|
uv.setInt(42);
|
||||||
|
obj.__pushKV("age", uv);
|
||||||
|
BOOST_CHECK_EQUAL(obj.size(), 1);
|
||||||
|
BOOST_CHECK_EQUAL(obj["age"].getValStr(), "42");
|
||||||
|
|
||||||
|
uv.setInt(43);
|
||||||
|
obj.pushKV("age", uv);
|
||||||
|
BOOST_CHECK_EQUAL(obj.size(), 1);
|
||||||
|
BOOST_CHECK_EQUAL(obj["age"].getValStr(), "43");
|
||||||
|
|
||||||
|
obj.pushKV("name", "foo bar");
|
||||||
|
|
||||||
|
std::map<std::string,UniValue> kv;
|
||||||
|
obj.getObjMap(kv);
|
||||||
|
BOOST_CHECK_EQUAL(kv["age"].getValStr(), "43");
|
||||||
|
BOOST_CHECK_EQUAL(kv["name"].getValStr(), "foo bar");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char *json1 =
|
||||||
|
"[1.10000000,{\"key1\":\"str\\u0000\",\"key2\":800,\"key3\":{\"name\":\"martian http://test.com\"}}]";
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(univalue_readwrite)
|
||||||
|
{
|
||||||
|
UniValue v;
|
||||||
|
BOOST_CHECK(v.read(json1));
|
||||||
|
|
||||||
|
std::string strJson1(json1);
|
||||||
|
BOOST_CHECK(v.read(strJson1));
|
||||||
|
|
||||||
|
BOOST_CHECK(v.isArray());
|
||||||
|
BOOST_CHECK_EQUAL(v.size(), 2);
|
||||||
|
|
||||||
|
BOOST_CHECK_EQUAL(v[0].getValStr(), "1.10000000");
|
||||||
|
|
||||||
|
UniValue obj = v[1];
|
||||||
|
BOOST_CHECK(obj.isObject());
|
||||||
|
BOOST_CHECK_EQUAL(obj.size(), 3);
|
||||||
|
|
||||||
|
BOOST_CHECK(obj["key1"].isStr());
|
||||||
|
std::string correctValue("str");
|
||||||
|
correctValue.push_back('\0');
|
||||||
|
BOOST_CHECK_EQUAL(obj["key1"].getValStr(), correctValue);
|
||||||
|
BOOST_CHECK(obj["key2"].isNum());
|
||||||
|
BOOST_CHECK_EQUAL(obj["key2"].getValStr(), "800");
|
||||||
|
BOOST_CHECK(obj["key3"].isObject());
|
||||||
|
|
||||||
|
BOOST_CHECK_EQUAL(strJson1, v.write());
|
||||||
|
|
||||||
|
/* Check for (correctly reporting) a parsing error if the initial
|
||||||
|
JSON construct is followed by more stuff. Note that whitespace
|
||||||
|
is, of course, exempt. */
|
||||||
|
|
||||||
|
BOOST_CHECK(v.read(" {}\n "));
|
||||||
|
BOOST_CHECK(v.isObject());
|
||||||
|
BOOST_CHECK(v.read(" []\n "));
|
||||||
|
BOOST_CHECK(v.isArray());
|
||||||
|
|
||||||
|
BOOST_CHECK(!v.read("@{}"));
|
||||||
|
BOOST_CHECK(!v.read("{} garbage"));
|
||||||
|
BOOST_CHECK(!v.read("[]{}"));
|
||||||
|
BOOST_CHECK(!v.read("{}[]"));
|
||||||
|
BOOST_CHECK(!v.read("{} 42"));
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|
||||||
|
int main (int argc, char *argv[])
|
||||||
|
{
|
||||||
|
univalue_constructor();
|
||||||
|
univalue_typecheck();
|
||||||
|
univalue_set();
|
||||||
|
univalue_array();
|
||||||
|
univalue_object();
|
||||||
|
univalue_readwrite();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
1
src/univalue/test/round3.json
Normal file
1
src/univalue/test/round3.json
Normal file
@ -0,0 +1 @@
|
|||||||
|
"abcdefghijklmnopqrstuvwxyz"
|
1
src/univalue/test/round4.json
Normal file
1
src/univalue/test/round4.json
Normal file
@ -0,0 +1 @@
|
|||||||
|
7
|
1
src/univalue/test/round5.json
Normal file
1
src/univalue/test/round5.json
Normal file
@ -0,0 +1 @@
|
|||||||
|
true
|
1
src/univalue/test/round6.json
Normal file
1
src/univalue/test/round6.json
Normal file
@ -0,0 +1 @@
|
|||||||
|
false
|
1
src/univalue/test/round7.json
Normal file
1
src/univalue/test/round7.json
Normal file
@ -0,0 +1 @@
|
|||||||
|
null
|
24
src/univalue/test/test_json.cpp
Normal file
24
src/univalue/test/test_json.cpp
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
// Test program that can be called by the JSON test suite at
|
||||||
|
// https://github.com/nst/JSONTestSuite.
|
||||||
|
//
|
||||||
|
// It reads JSON input from stdin and exits with code 0 if it can be parsed
|
||||||
|
// successfully. It also pretty prints the parsed JSON value to stdout.
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
#include "univalue.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
int main (int argc, char *argv[])
|
||||||
|
{
|
||||||
|
UniValue val;
|
||||||
|
if (val.read(string(istreambuf_iterator<char>(cin),
|
||||||
|
istreambuf_iterator<char>()))) {
|
||||||
|
cout << val.write(1 /* prettyIndent */, 4 /* indentLevel */) << endl;
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
cerr << "JSON Parse Error." << endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
@ -113,6 +113,8 @@ static const char *filenames[] = {
|
|||||||
"fail39.json", // invalid unicode: only second half of surrogate pair
|
"fail39.json", // invalid unicode: only second half of surrogate pair
|
||||||
"fail40.json", // invalid unicode: broken UTF-8
|
"fail40.json", // invalid unicode: broken UTF-8
|
||||||
"fail41.json", // invalid unicode: unfinished UTF-8
|
"fail41.json", // invalid unicode: unfinished UTF-8
|
||||||
|
"fail42.json", // valid json with garbage following a nul byte
|
||||||
|
"fail44.json", // unterminated string
|
||||||
"fail3.json",
|
"fail3.json",
|
||||||
"fail4.json", // extra comma
|
"fail4.json", // extra comma
|
||||||
"fail5.json",
|
"fail5.json",
|
||||||
@ -125,6 +127,11 @@ static const char *filenames[] = {
|
|||||||
"pass3.json",
|
"pass3.json",
|
||||||
"round1.json", // round-trip test
|
"round1.json", // round-trip test
|
||||||
"round2.json", // unicode
|
"round2.json", // unicode
|
||||||
|
"round3.json", // bare string
|
||||||
|
"round4.json", // bare number
|
||||||
|
"round5.json", // bare true
|
||||||
|
"round6.json", // bare false
|
||||||
|
"round7.json", // bare null
|
||||||
};
|
};
|
||||||
|
|
||||||
// Test \u handling
|
// Test \u handling
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
"hex": "493046022100b4251ecd63778a3dde0155abe4cd162947620ae9ee45a874353551092325b116022100db307baf4ff3781ec520bd18f387948cedd15dc27bafe17c894b0fe6ffffcafa012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
|
"hex": "493046022100b4251ecd63778a3dde0155abe4cd162947620ae9ee45a874353551092325b116022100db307baf4ff3781ec520bd18f387948cedd15dc27bafe17c894b0fe6ffffcafa012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "752f7f69b915637dc1c2f7aed1466ad676f6f3e24cf922809705f664e97ab3c1",
|
"txid": "752f7f69b915637dc1c2f7aed1466ad676f6f3e24cf922809705f664e97ab3c1",
|
||||||
"vout": 1,
|
"vout": 1,
|
||||||
@ -23,7 +23,7 @@
|
|||||||
"hex": "473044022079bd62ee09621a3be96b760c39e8ef78170101d46313923c6b07ae60a95c90670220238e51ea29fc70b04b65508450523caedbb11cb4dd5aa608c81487de798925ba0121027a759be8df971a6a04fafcb4f6babf75dc811c5cdaa0734cddbe9b942ce75b34"
|
"hex": "473044022079bd62ee09621a3be96b760c39e8ef78170101d46313923c6b07ae60a95c90670220238e51ea29fc70b04b65508450523caedbb11cb4dd5aa608c81487de798925ba0121027a759be8df971a6a04fafcb4f6babf75dc811c5cdaa0734cddbe9b942ce75b34"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "b0ac9cca2e69cd02410e31b1f4402a25758e71abd1ab06c265ef9077dc05d0ed",
|
"txid": "b0ac9cca2e69cd02410e31b1f4402a25758e71abd1ab06c265ef9077dc05d0ed",
|
||||||
"vout": 209,
|
"vout": 209,
|
||||||
@ -32,7 +32,7 @@
|
|||||||
"hex": "48304502207722d6f9038673c86a1019b1c4de2d687ae246477cd4ca7002762be0299de385022100e594a11e3a313942595f7666dcf7078bcb14f1330f4206b95c917e7ec0e82fac012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
|
"hex": "48304502207722d6f9038673c86a1019b1c4de2d687ae246477cd4ca7002762be0299de385022100e594a11e3a313942595f7666dcf7078bcb14f1330f4206b95c917e7ec0e82fac012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "a135eafb595eaf4c1ea59ccb111cdc0eae1b2c979b226a1e5aa8b76fe2d628df",
|
"txid": "a135eafb595eaf4c1ea59ccb111cdc0eae1b2c979b226a1e5aa8b76fe2d628df",
|
||||||
"vout": 0,
|
"vout": 0,
|
||||||
@ -41,7 +41,7 @@
|
|||||||
"hex": "483045022100a63a4788027b79b65c6f9d9e054f68cf3b4eed19efd82a2d53f70dcbe64683390220526f243671425b2bd05745fcf2729361f985cfe84ea80c7cfc817b93d8134374012103a621f08be22d1bbdcbe4e527ee4927006aa555fc65e2aafa767d4ea2fe9dfa52"
|
"hex": "483045022100a63a4788027b79b65c6f9d9e054f68cf3b4eed19efd82a2d53f70dcbe64683390220526f243671425b2bd05745fcf2729361f985cfe84ea80c7cfc817b93d8134374012103a621f08be22d1bbdcbe4e527ee4927006aa555fc65e2aafa767d4ea2fe9dfa52"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "a5d6bf53ba21140b8a4d554feb00fe8bb9a62430ff9e4624aa2f58a120232aae",
|
"txid": "a5d6bf53ba21140b8a4d554feb00fe8bb9a62430ff9e4624aa2f58a120232aae",
|
||||||
"vout": 1,
|
"vout": 1,
|
||||||
@ -50,7 +50,7 @@
|
|||||||
"hex": "493046022100b200ac6db16842f76dab9abe807ce423c992805879bc50abd46ed8275a59d9cf022100c0d518e85dd345b3c29dd4dc47b9a420d3ce817b18720e94966d2fe23413a408012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
|
"hex": "493046022100b200ac6db16842f76dab9abe807ce423c992805879bc50abd46ed8275a59d9cf022100c0d518e85dd345b3c29dd4dc47b9a420d3ce817b18720e94966d2fe23413a408012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "1b299cf14f1a22e81ea56d71b7affbd7cf386807bf2b4d4b79a18a54125accb3",
|
"txid": "1b299cf14f1a22e81ea56d71b7affbd7cf386807bf2b4d4b79a18a54125accb3",
|
||||||
"vout": 0,
|
"vout": 0,
|
||||||
@ -59,7 +59,7 @@
|
|||||||
"hex": "483045022100ededc441c3103a6f2bd6cab7639421af0f6ec5e60503bce1e603cf34f00aee1c02205cb75f3f519a13fb348783b21db3085cb5ec7552c59e394fdbc3e1feea43f967012103a621f08be22d1bbdcbe4e527ee4927006aa555fc65e2aafa767d4ea2fe9dfa52"
|
"hex": "483045022100ededc441c3103a6f2bd6cab7639421af0f6ec5e60503bce1e603cf34f00aee1c02205cb75f3f519a13fb348783b21db3085cb5ec7552c59e394fdbc3e1feea43f967012103a621f08be22d1bbdcbe4e527ee4927006aa555fc65e2aafa767d4ea2fe9dfa52"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "071df1cdcb3f0070f9d6af7b0274f02d0be2324a274727cfd288383167531485",
|
"txid": "071df1cdcb3f0070f9d6af7b0274f02d0be2324a274727cfd288383167531485",
|
||||||
"vout": 21,
|
"vout": 21,
|
||||||
@ -68,7 +68,7 @@
|
|||||||
"hex": "483045022100d9eed5413d2a4b4b98625aa6e3169edc4fb4663e7862316d69224454e70cd8ca022061e506521d5ced51dd0ea36496e75904d756a4c4f9fb111568555075d5f68d9a012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
"hex": "483045022100d9eed5413d2a4b4b98625aa6e3169edc4fb4663e7862316d69224454e70cd8ca022061e506521d5ced51dd0ea36496e75904d756a4c4f9fb111568555075d5f68d9a012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "b012e500eb7adf7a13ed332dd6ece849f94f7a62bb3eac5babab356d1fc19282",
|
"txid": "b012e500eb7adf7a13ed332dd6ece849f94f7a62bb3eac5babab356d1fc19282",
|
||||||
"vout": 9,
|
"vout": 9,
|
||||||
@ -77,7 +77,7 @@
|
|||||||
"hex": "48304502207e84b27139c4c19c828cb1e30c349bba88e4d9b59be97286960793b5ddc0a2af0221008cdc7a951e7f31c20953ed5635fbabf228e80b7047f32faaa0313e7693005177012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
"hex": "48304502207e84b27139c4c19c828cb1e30c349bba88e4d9b59be97286960793b5ddc0a2af0221008cdc7a951e7f31c20953ed5635fbabf228e80b7047f32faaa0313e7693005177012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "58840fee9c833f2f2d40575842f30f4b8d2553094d06ad88b03d06869acf3d88",
|
"txid": "58840fee9c833f2f2d40575842f30f4b8d2553094d06ad88b03d06869acf3d88",
|
||||||
"vout": 30,
|
"vout": 30,
|
||||||
@ -86,7 +86,7 @@
|
|||||||
"hex": "4730440220426540dfed9c4ab5812e5f06df705b8bcf307dd7d20f7fa6512298b2a6314f420220064055096e3ca62f6c7352c66a5447767c53f946acdf35025ab3807ddb2fa404012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
"hex": "4730440220426540dfed9c4ab5812e5f06df705b8bcf307dd7d20f7fa6512298b2a6314f420220064055096e3ca62f6c7352c66a5447767c53f946acdf35025ab3807ddb2fa404012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "e69f9cd16946e570a665245354428a3f507ea69f4568b581e4af98edb3db9766",
|
"txid": "e69f9cd16946e570a665245354428a3f507ea69f4568b581e4af98edb3db9766",
|
||||||
"vout": 114,
|
"vout": 114,
|
||||||
@ -95,7 +95,7 @@
|
|||||||
"hex": "47304402200a5e673996f2fc88e21cc8613611f08a650bc0370338803591d85d0ec5663764022040b6664a0d1ec83a7f01975b8fde5232992b8ca58bf48af6725d2f92a936ab2e012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
"hex": "47304402200a5e673996f2fc88e21cc8613611f08a650bc0370338803591d85d0ec5663764022040b6664a0d1ec83a7f01975b8fde5232992b8ca58bf48af6725d2f92a936ab2e012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "595d1257f654ed2cbe5a65421e8aefd2b4d70b5b6c89a03f1d7e518221fc3f02",
|
"txid": "595d1257f654ed2cbe5a65421e8aefd2b4d70b5b6c89a03f1d7e518221fc3f02",
|
||||||
"vout": 103,
|
"vout": 103,
|
||||||
@ -104,7 +104,7 @@
|
|||||||
"hex": "493046022100d93b30219c5735f673be5c3b4688366d96f545561c74cb62c6958c00f6960806022100ec8200adcb028f2184fa2a4f6faac7f8bb57cb4503bb7584ac11051fece31b3d012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
|
"hex": "493046022100d93b30219c5735f673be5c3b4688366d96f545561c74cb62c6958c00f6960806022100ec8200adcb028f2184fa2a4f6faac7f8bb57cb4503bb7584ac11051fece31b3d012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "06fc818f9555a261248ecd7aad0993eafb5a82ceb2b5c87c3ddfb06671c7f816",
|
"txid": "06fc818f9555a261248ecd7aad0993eafb5a82ceb2b5c87c3ddfb06671c7f816",
|
||||||
"vout": 1,
|
"vout": 1,
|
||||||
@ -113,7 +113,7 @@
|
|||||||
"hex": "483045022100a13934e68d3f5b22b130c4cb33f4da468cffc52323a47fbfbe06b64858162246022047081e0a70ff770e64a2e2d31e5d520d9102268b57a47009a72fe73ec766901801210234b9d9413f247bb78cd3293b7b65a2c38018ba5621ea9ee737f3a6a3523fb4cd"
|
"hex": "483045022100a13934e68d3f5b22b130c4cb33f4da468cffc52323a47fbfbe06b64858162246022047081e0a70ff770e64a2e2d31e5d520d9102268b57a47009a72fe73ec766901801210234b9d9413f247bb78cd3293b7b65a2c38018ba5621ea9ee737f3a6a3523fb4cd"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "fb416c8155d6bb1d43f9395466ca90a638a7c2dd3ff617aadf3a7ac8f3967b19",
|
"txid": "fb416c8155d6bb1d43f9395466ca90a638a7c2dd3ff617aadf3a7ac8f3967b19",
|
||||||
"vout": 0,
|
"vout": 0,
|
||||||
@ -122,7 +122,7 @@
|
|||||||
"hex": "49304602210097f1f35d5bdc1a3a60390a1b015b8e7c4f916aa3847aafd969e04975e15bbe70022100a9052eb25517d481f1fda1b129eb1b534da50ea1a51f3ee012dca3601c11b86a0121027a759be8df971a6a04fafcb4f6babf75dc811c5cdaa0734cddbe9b942ce75b34"
|
"hex": "49304602210097f1f35d5bdc1a3a60390a1b015b8e7c4f916aa3847aafd969e04975e15bbe70022100a9052eb25517d481f1fda1b129eb1b534da50ea1a51f3ee012dca3601c11b86a0121027a759be8df971a6a04fafcb4f6babf75dc811c5cdaa0734cddbe9b942ce75b34"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "3940b9683bd6104ad24c978e640ba4095993cafdb27d2ed91baa27ee61a2d920",
|
"txid": "3940b9683bd6104ad24c978e640ba4095993cafdb27d2ed91baa27ee61a2d920",
|
||||||
"vout": 221,
|
"vout": 221,
|
||||||
@ -131,7 +131,7 @@
|
|||||||
"hex": "483045022012b3138c591bf7154b6fef457f2c4a3c7162225003788ac0024a99355865ff13022100b71b125ae1ffb2e1d1571f580cd3ebc8cd049a2d7a8a41f138ba94aeb982106f012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
|
"hex": "483045022012b3138c591bf7154b6fef457f2c4a3c7162225003788ac0024a99355865ff13022100b71b125ae1ffb2e1d1571f580cd3ebc8cd049a2d7a8a41f138ba94aeb982106f012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "711b5714d3b5136147c02194cd95bde94a4648c4263ca6f972d86cd1d579f150",
|
"txid": "711b5714d3b5136147c02194cd95bde94a4648c4263ca6f972d86cd1d579f150",
|
||||||
"vout": 1,
|
"vout": 1,
|
||||||
@ -140,7 +140,7 @@
|
|||||||
"hex": "483045022100f834ccc8b22ee72712a3e5e6ef4acb8b2fb791b5385b70e2cd4332674d6667f4022024fbda0a997e0c253503f217501f508a4d56edce2c813ecdd9ad796dbeba907401210234b9d9413f247bb78cd3293b7b65a2c38018ba5621ea9ee737f3a6a3523fb4cd"
|
"hex": "483045022100f834ccc8b22ee72712a3e5e6ef4acb8b2fb791b5385b70e2cd4332674d6667f4022024fbda0a997e0c253503f217501f508a4d56edce2c813ecdd9ad796dbeba907401210234b9d9413f247bb78cd3293b7b65a2c38018ba5621ea9ee737f3a6a3523fb4cd"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "6364b5c5efe018430789e7fb4e338209546cae5d9c5f5e300aac68155d861b55",
|
"txid": "6364b5c5efe018430789e7fb4e338209546cae5d9c5f5e300aac68155d861b55",
|
||||||
"vout": 27,
|
"vout": 27,
|
||||||
@ -149,7 +149,7 @@
|
|||||||
"hex": "48304502203b2fd1e39ae0e469d7a15768f262661b0de41470daf0fe8c4fd0c26542a0870002210081c57e331f9a2d214457d953e3542904727ee412c63028113635d7224da3dccc012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
"hex": "48304502203b2fd1e39ae0e469d7a15768f262661b0de41470daf0fe8c4fd0c26542a0870002210081c57e331f9a2d214457d953e3542904727ee412c63028113635d7224da3dccc012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "0bb57f6e38012c86d4c5a28c904f2675082859147921a707d48961015a3e5057",
|
"txid": "0bb57f6e38012c86d4c5a28c904f2675082859147921a707d48961015a3e5057",
|
||||||
"vout": 1095,
|
"vout": 1095,
|
||||||
@ -158,7 +158,7 @@
|
|||||||
"hex": "48304502206947a9c54f0664ece4430fd4ae999891dc50bb6126bc36b6a15a3189f29d25e9022100a86cfc4e2fdd9e39a20e305cfd1b76509c67b3e313e0f118229105caa0e823c9012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
"hex": "48304502206947a9c54f0664ece4430fd4ae999891dc50bb6126bc36b6a15a3189f29d25e9022100a86cfc4e2fdd9e39a20e305cfd1b76509c67b3e313e0f118229105caa0e823c9012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "9b34274814a2540bb062107117f8f3e75ef85d953e9372d8261a3e9dfbc1163f",
|
"txid": "9b34274814a2540bb062107117f8f3e75ef85d953e9372d8261a3e9dfbc1163f",
|
||||||
"vout": 37,
|
"vout": 37,
|
||||||
@ -167,7 +167,7 @@
|
|||||||
"hex": "483045022100c7128fe10b2d38744ae8177776054c29fc8ec13f07207723e70766ab7164847402201d2cf09009b9596de74c0183d1ab832e5edddb7a9965880bb400097e850850f8012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
"hex": "483045022100c7128fe10b2d38744ae8177776054c29fc8ec13f07207723e70766ab7164847402201d2cf09009b9596de74c0183d1ab832e5edddb7a9965880bb400097e850850f8012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "b86b5cc0d8a7374d94e277850b0a249cb26a7b42ddf014f28a49b8859da64241",
|
"txid": "b86b5cc0d8a7374d94e277850b0a249cb26a7b42ddf014f28a49b8859da64241",
|
||||||
"vout": 20,
|
"vout": 20,
|
||||||
@ -176,7 +176,7 @@
|
|||||||
"hex": "48304502203b89a71628a28cc3703d170ca3be77786cff6b867e38a18b719705f8a326578f022100b2a9879e1acf621faa6466c207746a7f3eb4c8514c1482969aba3f2a957f1321012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
"hex": "48304502203b89a71628a28cc3703d170ca3be77786cff6b867e38a18b719705f8a326578f022100b2a9879e1acf621faa6466c207746a7f3eb4c8514c1482969aba3f2a957f1321012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "3d0a2353eeec44d3c10aed259038db321912122cd4150048f7bfa4c0ecfee236",
|
"txid": "3d0a2353eeec44d3c10aed259038db321912122cd4150048f7bfa4c0ecfee236",
|
||||||
"vout": 242,
|
"vout": 242,
|
||||||
@ -200,7 +200,7 @@
|
|||||||
"1E7SGgAZFCHDnVZLuRViX3gUmxpMfdvd2o"
|
"1E7SGgAZFCHDnVZLuRViX3gUmxpMfdvd2o"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"value": 0.01000001,
|
"value": 0.01000001,
|
||||||
"n": 1,
|
"n": 1,
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
"hex": "493046022100b4251ecd63778a3dde0155abe4cd162947620ae9ee45a874353551092325b116022100db307baf4ff3781ec520bd18f387948cedd15dc27bafe17c894b0fe6ffffcafa012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
|
"hex": "493046022100b4251ecd63778a3dde0155abe4cd162947620ae9ee45a874353551092325b116022100db307baf4ff3781ec520bd18f387948cedd15dc27bafe17c894b0fe6ffffcafa012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "a72ec96bd0d022d1b0c2f9078cdd46b3725b8eecdd001e17b21e3ababad14ecb",
|
"txid": "a72ec96bd0d022d1b0c2f9078cdd46b3725b8eecdd001e17b21e3ababad14ecb",
|
||||||
"vout": 0,
|
"vout": 0,
|
||||||
@ -23,7 +23,7 @@
|
|||||||
"hex": "493046022100a9b617843b68c284715d3e02fd120479cd0d96a6c43bf01e697fb0a460a21a3a022100ba0a12fbe8b993d4e7911fa3467615765dbe421ddf5c51b57a9c1ee19dcc00ba012103e633b4fa4ceb705c2da712390767199be8ef2448b3095dc01652e11b2b751505"
|
"hex": "493046022100a9b617843b68c284715d3e02fd120479cd0d96a6c43bf01e697fb0a460a21a3a022100ba0a12fbe8b993d4e7911fa3467615765dbe421ddf5c51b57a9c1ee19dcc00ba012103e633b4fa4ceb705c2da712390767199be8ef2448b3095dc01652e11b2b751505"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "752f7f69b915637dc1c2f7aed1466ad676f6f3e24cf922809705f664e97ab3c1",
|
"txid": "752f7f69b915637dc1c2f7aed1466ad676f6f3e24cf922809705f664e97ab3c1",
|
||||||
"vout": 1,
|
"vout": 1,
|
||||||
@ -32,7 +32,7 @@
|
|||||||
"hex": "473044022079bd62ee09621a3be96b760c39e8ef78170101d46313923c6b07ae60a95c90670220238e51ea29fc70b04b65508450523caedbb11cb4dd5aa608c81487de798925ba0121027a759be8df971a6a04fafcb4f6babf75dc811c5cdaa0734cddbe9b942ce75b34"
|
"hex": "473044022079bd62ee09621a3be96b760c39e8ef78170101d46313923c6b07ae60a95c90670220238e51ea29fc70b04b65508450523caedbb11cb4dd5aa608c81487de798925ba0121027a759be8df971a6a04fafcb4f6babf75dc811c5cdaa0734cddbe9b942ce75b34"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "b0ac9cca2e69cd02410e31b1f4402a25758e71abd1ab06c265ef9077dc05d0ed",
|
"txid": "b0ac9cca2e69cd02410e31b1f4402a25758e71abd1ab06c265ef9077dc05d0ed",
|
||||||
"vout": 209,
|
"vout": 209,
|
||||||
@ -41,7 +41,7 @@
|
|||||||
"hex": "48304502207722d6f9038673c86a1019b1c4de2d687ae246477cd4ca7002762be0299de385022100e594a11e3a313942595f7666dcf7078bcb14f1330f4206b95c917e7ec0e82fac012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
|
"hex": "48304502207722d6f9038673c86a1019b1c4de2d687ae246477cd4ca7002762be0299de385022100e594a11e3a313942595f7666dcf7078bcb14f1330f4206b95c917e7ec0e82fac012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "a135eafb595eaf4c1ea59ccb111cdc0eae1b2c979b226a1e5aa8b76fe2d628df",
|
"txid": "a135eafb595eaf4c1ea59ccb111cdc0eae1b2c979b226a1e5aa8b76fe2d628df",
|
||||||
"vout": 0,
|
"vout": 0,
|
||||||
@ -50,7 +50,7 @@
|
|||||||
"hex": "483045022100a63a4788027b79b65c6f9d9e054f68cf3b4eed19efd82a2d53f70dcbe64683390220526f243671425b2bd05745fcf2729361f985cfe84ea80c7cfc817b93d8134374012103a621f08be22d1bbdcbe4e527ee4927006aa555fc65e2aafa767d4ea2fe9dfa52"
|
"hex": "483045022100a63a4788027b79b65c6f9d9e054f68cf3b4eed19efd82a2d53f70dcbe64683390220526f243671425b2bd05745fcf2729361f985cfe84ea80c7cfc817b93d8134374012103a621f08be22d1bbdcbe4e527ee4927006aa555fc65e2aafa767d4ea2fe9dfa52"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "a5d6bf53ba21140b8a4d554feb00fe8bb9a62430ff9e4624aa2f58a120232aae",
|
"txid": "a5d6bf53ba21140b8a4d554feb00fe8bb9a62430ff9e4624aa2f58a120232aae",
|
||||||
"vout": 1,
|
"vout": 1,
|
||||||
@ -59,7 +59,7 @@
|
|||||||
"hex": "493046022100b200ac6db16842f76dab9abe807ce423c992805879bc50abd46ed8275a59d9cf022100c0d518e85dd345b3c29dd4dc47b9a420d3ce817b18720e94966d2fe23413a408012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
|
"hex": "493046022100b200ac6db16842f76dab9abe807ce423c992805879bc50abd46ed8275a59d9cf022100c0d518e85dd345b3c29dd4dc47b9a420d3ce817b18720e94966d2fe23413a408012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "1b299cf14f1a22e81ea56d71b7affbd7cf386807bf2b4d4b79a18a54125accb3",
|
"txid": "1b299cf14f1a22e81ea56d71b7affbd7cf386807bf2b4d4b79a18a54125accb3",
|
||||||
"vout": 0,
|
"vout": 0,
|
||||||
@ -68,7 +68,7 @@
|
|||||||
"hex": "483045022100ededc441c3103a6f2bd6cab7639421af0f6ec5e60503bce1e603cf34f00aee1c02205cb75f3f519a13fb348783b21db3085cb5ec7552c59e394fdbc3e1feea43f967012103a621f08be22d1bbdcbe4e527ee4927006aa555fc65e2aafa767d4ea2fe9dfa52"
|
"hex": "483045022100ededc441c3103a6f2bd6cab7639421af0f6ec5e60503bce1e603cf34f00aee1c02205cb75f3f519a13fb348783b21db3085cb5ec7552c59e394fdbc3e1feea43f967012103a621f08be22d1bbdcbe4e527ee4927006aa555fc65e2aafa767d4ea2fe9dfa52"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "071df1cdcb3f0070f9d6af7b0274f02d0be2324a274727cfd288383167531485",
|
"txid": "071df1cdcb3f0070f9d6af7b0274f02d0be2324a274727cfd288383167531485",
|
||||||
"vout": 21,
|
"vout": 21,
|
||||||
@ -77,7 +77,7 @@
|
|||||||
"hex": "483045022100d9eed5413d2a4b4b98625aa6e3169edc4fb4663e7862316d69224454e70cd8ca022061e506521d5ced51dd0ea36496e75904d756a4c4f9fb111568555075d5f68d9a012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
"hex": "483045022100d9eed5413d2a4b4b98625aa6e3169edc4fb4663e7862316d69224454e70cd8ca022061e506521d5ced51dd0ea36496e75904d756a4c4f9fb111568555075d5f68d9a012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "b012e500eb7adf7a13ed332dd6ece849f94f7a62bb3eac5babab356d1fc19282",
|
"txid": "b012e500eb7adf7a13ed332dd6ece849f94f7a62bb3eac5babab356d1fc19282",
|
||||||
"vout": 9,
|
"vout": 9,
|
||||||
@ -86,7 +86,7 @@
|
|||||||
"hex": "48304502207e84b27139c4c19c828cb1e30c349bba88e4d9b59be97286960793b5ddc0a2af0221008cdc7a951e7f31c20953ed5635fbabf228e80b7047f32faaa0313e7693005177012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
"hex": "48304502207e84b27139c4c19c828cb1e30c349bba88e4d9b59be97286960793b5ddc0a2af0221008cdc7a951e7f31c20953ed5635fbabf228e80b7047f32faaa0313e7693005177012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "58840fee9c833f2f2d40575842f30f4b8d2553094d06ad88b03d06869acf3d88",
|
"txid": "58840fee9c833f2f2d40575842f30f4b8d2553094d06ad88b03d06869acf3d88",
|
||||||
"vout": 30,
|
"vout": 30,
|
||||||
@ -95,7 +95,7 @@
|
|||||||
"hex": "4730440220426540dfed9c4ab5812e5f06df705b8bcf307dd7d20f7fa6512298b2a6314f420220064055096e3ca62f6c7352c66a5447767c53f946acdf35025ab3807ddb2fa404012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
"hex": "4730440220426540dfed9c4ab5812e5f06df705b8bcf307dd7d20f7fa6512298b2a6314f420220064055096e3ca62f6c7352c66a5447767c53f946acdf35025ab3807ddb2fa404012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "e69f9cd16946e570a665245354428a3f507ea69f4568b581e4af98edb3db9766",
|
"txid": "e69f9cd16946e570a665245354428a3f507ea69f4568b581e4af98edb3db9766",
|
||||||
"vout": 114,
|
"vout": 114,
|
||||||
@ -104,7 +104,7 @@
|
|||||||
"hex": "47304402200a5e673996f2fc88e21cc8613611f08a650bc0370338803591d85d0ec5663764022040b6664a0d1ec83a7f01975b8fde5232992b8ca58bf48af6725d2f92a936ab2e012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
"hex": "47304402200a5e673996f2fc88e21cc8613611f08a650bc0370338803591d85d0ec5663764022040b6664a0d1ec83a7f01975b8fde5232992b8ca58bf48af6725d2f92a936ab2e012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "595d1257f654ed2cbe5a65421e8aefd2b4d70b5b6c89a03f1d7e518221fc3f02",
|
"txid": "595d1257f654ed2cbe5a65421e8aefd2b4d70b5b6c89a03f1d7e518221fc3f02",
|
||||||
"vout": 103,
|
"vout": 103,
|
||||||
@ -113,7 +113,7 @@
|
|||||||
"hex": "493046022100d93b30219c5735f673be5c3b4688366d96f545561c74cb62c6958c00f6960806022100ec8200adcb028f2184fa2a4f6faac7f8bb57cb4503bb7584ac11051fece31b3d012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
|
"hex": "493046022100d93b30219c5735f673be5c3b4688366d96f545561c74cb62c6958c00f6960806022100ec8200adcb028f2184fa2a4f6faac7f8bb57cb4503bb7584ac11051fece31b3d012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "06fc818f9555a261248ecd7aad0993eafb5a82ceb2b5c87c3ddfb06671c7f816",
|
"txid": "06fc818f9555a261248ecd7aad0993eafb5a82ceb2b5c87c3ddfb06671c7f816",
|
||||||
"vout": 1,
|
"vout": 1,
|
||||||
@ -122,7 +122,7 @@
|
|||||||
"hex": "483045022100a13934e68d3f5b22b130c4cb33f4da468cffc52323a47fbfbe06b64858162246022047081e0a70ff770e64a2e2d31e5d520d9102268b57a47009a72fe73ec766901801210234b9d9413f247bb78cd3293b7b65a2c38018ba5621ea9ee737f3a6a3523fb4cd"
|
"hex": "483045022100a13934e68d3f5b22b130c4cb33f4da468cffc52323a47fbfbe06b64858162246022047081e0a70ff770e64a2e2d31e5d520d9102268b57a47009a72fe73ec766901801210234b9d9413f247bb78cd3293b7b65a2c38018ba5621ea9ee737f3a6a3523fb4cd"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "fb416c8155d6bb1d43f9395466ca90a638a7c2dd3ff617aadf3a7ac8f3967b19",
|
"txid": "fb416c8155d6bb1d43f9395466ca90a638a7c2dd3ff617aadf3a7ac8f3967b19",
|
||||||
"vout": 0,
|
"vout": 0,
|
||||||
@ -131,7 +131,7 @@
|
|||||||
"hex": "49304602210097f1f35d5bdc1a3a60390a1b015b8e7c4f916aa3847aafd969e04975e15bbe70022100a9052eb25517d481f1fda1b129eb1b534da50ea1a51f3ee012dca3601c11b86a0121027a759be8df971a6a04fafcb4f6babf75dc811c5cdaa0734cddbe9b942ce75b34"
|
"hex": "49304602210097f1f35d5bdc1a3a60390a1b015b8e7c4f916aa3847aafd969e04975e15bbe70022100a9052eb25517d481f1fda1b129eb1b534da50ea1a51f3ee012dca3601c11b86a0121027a759be8df971a6a04fafcb4f6babf75dc811c5cdaa0734cddbe9b942ce75b34"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "3940b9683bd6104ad24c978e640ba4095993cafdb27d2ed91baa27ee61a2d920",
|
"txid": "3940b9683bd6104ad24c978e640ba4095993cafdb27d2ed91baa27ee61a2d920",
|
||||||
"vout": 221,
|
"vout": 221,
|
||||||
@ -140,7 +140,7 @@
|
|||||||
"hex": "483045022012b3138c591bf7154b6fef457f2c4a3c7162225003788ac0024a99355865ff13022100b71b125ae1ffb2e1d1571f580cd3ebc8cd049a2d7a8a41f138ba94aeb982106f012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
|
"hex": "483045022012b3138c591bf7154b6fef457f2c4a3c7162225003788ac0024a99355865ff13022100b71b125ae1ffb2e1d1571f580cd3ebc8cd049a2d7a8a41f138ba94aeb982106f012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "711b5714d3b5136147c02194cd95bde94a4648c4263ca6f972d86cd1d579f150",
|
"txid": "711b5714d3b5136147c02194cd95bde94a4648c4263ca6f972d86cd1d579f150",
|
||||||
"vout": 1,
|
"vout": 1,
|
||||||
@ -149,7 +149,7 @@
|
|||||||
"hex": "483045022100f834ccc8b22ee72712a3e5e6ef4acb8b2fb791b5385b70e2cd4332674d6667f4022024fbda0a997e0c253503f217501f508a4d56edce2c813ecdd9ad796dbeba907401210234b9d9413f247bb78cd3293b7b65a2c38018ba5621ea9ee737f3a6a3523fb4cd"
|
"hex": "483045022100f834ccc8b22ee72712a3e5e6ef4acb8b2fb791b5385b70e2cd4332674d6667f4022024fbda0a997e0c253503f217501f508a4d56edce2c813ecdd9ad796dbeba907401210234b9d9413f247bb78cd3293b7b65a2c38018ba5621ea9ee737f3a6a3523fb4cd"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "6364b5c5efe018430789e7fb4e338209546cae5d9c5f5e300aac68155d861b55",
|
"txid": "6364b5c5efe018430789e7fb4e338209546cae5d9c5f5e300aac68155d861b55",
|
||||||
"vout": 27,
|
"vout": 27,
|
||||||
@ -158,7 +158,7 @@
|
|||||||
"hex": "48304502203b2fd1e39ae0e469d7a15768f262661b0de41470daf0fe8c4fd0c26542a0870002210081c57e331f9a2d214457d953e3542904727ee412c63028113635d7224da3dccc012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
"hex": "48304502203b2fd1e39ae0e469d7a15768f262661b0de41470daf0fe8c4fd0c26542a0870002210081c57e331f9a2d214457d953e3542904727ee412c63028113635d7224da3dccc012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "0bb57f6e38012c86d4c5a28c904f2675082859147921a707d48961015a3e5057",
|
"txid": "0bb57f6e38012c86d4c5a28c904f2675082859147921a707d48961015a3e5057",
|
||||||
"vout": 1095,
|
"vout": 1095,
|
||||||
@ -167,7 +167,7 @@
|
|||||||
"hex": "48304502206947a9c54f0664ece4430fd4ae999891dc50bb6126bc36b6a15a3189f29d25e9022100a86cfc4e2fdd9e39a20e305cfd1b76509c67b3e313e0f118229105caa0e823c9012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
"hex": "48304502206947a9c54f0664ece4430fd4ae999891dc50bb6126bc36b6a15a3189f29d25e9022100a86cfc4e2fdd9e39a20e305cfd1b76509c67b3e313e0f118229105caa0e823c9012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "9b34274814a2540bb062107117f8f3e75ef85d953e9372d8261a3e9dfbc1163f",
|
"txid": "9b34274814a2540bb062107117f8f3e75ef85d953e9372d8261a3e9dfbc1163f",
|
||||||
"vout": 37,
|
"vout": 37,
|
||||||
@ -176,7 +176,7 @@
|
|||||||
"hex": "483045022100c7128fe10b2d38744ae8177776054c29fc8ec13f07207723e70766ab7164847402201d2cf09009b9596de74c0183d1ab832e5edddb7a9965880bb400097e850850f8012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
"hex": "483045022100c7128fe10b2d38744ae8177776054c29fc8ec13f07207723e70766ab7164847402201d2cf09009b9596de74c0183d1ab832e5edddb7a9965880bb400097e850850f8012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "b86b5cc0d8a7374d94e277850b0a249cb26a7b42ddf014f28a49b8859da64241",
|
"txid": "b86b5cc0d8a7374d94e277850b0a249cb26a7b42ddf014f28a49b8859da64241",
|
||||||
"vout": 20,
|
"vout": 20,
|
||||||
@ -185,7 +185,7 @@
|
|||||||
"hex": "48304502203b89a71628a28cc3703d170ca3be77786cff6b867e38a18b719705f8a326578f022100b2a9879e1acf621faa6466c207746a7f3eb4c8514c1482969aba3f2a957f1321012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
"hex": "48304502203b89a71628a28cc3703d170ca3be77786cff6b867e38a18b719705f8a326578f022100b2a9879e1acf621faa6466c207746a7f3eb4c8514c1482969aba3f2a957f1321012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "3d0a2353eeec44d3c10aed259038db321912122cd4150048f7bfa4c0ecfee236",
|
"txid": "3d0a2353eeec44d3c10aed259038db321912122cd4150048f7bfa4c0ecfee236",
|
||||||
"vout": 242,
|
"vout": 242,
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
"hex": "493046022100b4251ecd63778a3dde0155abe4cd162947620ae9ee45a874353551092325b116022100db307baf4ff3781ec520bd18f387948cedd15dc27bafe17c894b0fe6ffffcafa012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
|
"hex": "493046022100b4251ecd63778a3dde0155abe4cd162947620ae9ee45a874353551092325b116022100db307baf4ff3781ec520bd18f387948cedd15dc27bafe17c894b0fe6ffffcafa012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "a72ec96bd0d022d1b0c2f9078cdd46b3725b8eecdd001e17b21e3ababad14ecb",
|
"txid": "a72ec96bd0d022d1b0c2f9078cdd46b3725b8eecdd001e17b21e3ababad14ecb",
|
||||||
"vout": 0,
|
"vout": 0,
|
||||||
@ -23,7 +23,7 @@
|
|||||||
"hex": "493046022100a9b617843b68c284715d3e02fd120479cd0d96a6c43bf01e697fb0a460a21a3a022100ba0a12fbe8b993d4e7911fa3467615765dbe421ddf5c51b57a9c1ee19dcc00ba012103e633b4fa4ceb705c2da712390767199be8ef2448b3095dc01652e11b2b751505"
|
"hex": "493046022100a9b617843b68c284715d3e02fd120479cd0d96a6c43bf01e697fb0a460a21a3a022100ba0a12fbe8b993d4e7911fa3467615765dbe421ddf5c51b57a9c1ee19dcc00ba012103e633b4fa4ceb705c2da712390767199be8ef2448b3095dc01652e11b2b751505"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "752f7f69b915637dc1c2f7aed1466ad676f6f3e24cf922809705f664e97ab3c1",
|
"txid": "752f7f69b915637dc1c2f7aed1466ad676f6f3e24cf922809705f664e97ab3c1",
|
||||||
"vout": 1,
|
"vout": 1,
|
||||||
@ -32,7 +32,7 @@
|
|||||||
"hex": "473044022079bd62ee09621a3be96b760c39e8ef78170101d46313923c6b07ae60a95c90670220238e51ea29fc70b04b65508450523caedbb11cb4dd5aa608c81487de798925ba0121027a759be8df971a6a04fafcb4f6babf75dc811c5cdaa0734cddbe9b942ce75b34"
|
"hex": "473044022079bd62ee09621a3be96b760c39e8ef78170101d46313923c6b07ae60a95c90670220238e51ea29fc70b04b65508450523caedbb11cb4dd5aa608c81487de798925ba0121027a759be8df971a6a04fafcb4f6babf75dc811c5cdaa0734cddbe9b942ce75b34"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "b0ac9cca2e69cd02410e31b1f4402a25758e71abd1ab06c265ef9077dc05d0ed",
|
"txid": "b0ac9cca2e69cd02410e31b1f4402a25758e71abd1ab06c265ef9077dc05d0ed",
|
||||||
"vout": 209,
|
"vout": 209,
|
||||||
@ -41,7 +41,7 @@
|
|||||||
"hex": "48304502207722d6f9038673c86a1019b1c4de2d687ae246477cd4ca7002762be0299de385022100e594a11e3a313942595f7666dcf7078bcb14f1330f4206b95c917e7ec0e82fac012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
|
"hex": "48304502207722d6f9038673c86a1019b1c4de2d687ae246477cd4ca7002762be0299de385022100e594a11e3a313942595f7666dcf7078bcb14f1330f4206b95c917e7ec0e82fac012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "a135eafb595eaf4c1ea59ccb111cdc0eae1b2c979b226a1e5aa8b76fe2d628df",
|
"txid": "a135eafb595eaf4c1ea59ccb111cdc0eae1b2c979b226a1e5aa8b76fe2d628df",
|
||||||
"vout": 0,
|
"vout": 0,
|
||||||
@ -50,7 +50,7 @@
|
|||||||
"hex": "483045022100a63a4788027b79b65c6f9d9e054f68cf3b4eed19efd82a2d53f70dcbe64683390220526f243671425b2bd05745fcf2729361f985cfe84ea80c7cfc817b93d8134374012103a621f08be22d1bbdcbe4e527ee4927006aa555fc65e2aafa767d4ea2fe9dfa52"
|
"hex": "483045022100a63a4788027b79b65c6f9d9e054f68cf3b4eed19efd82a2d53f70dcbe64683390220526f243671425b2bd05745fcf2729361f985cfe84ea80c7cfc817b93d8134374012103a621f08be22d1bbdcbe4e527ee4927006aa555fc65e2aafa767d4ea2fe9dfa52"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "a5d6bf53ba21140b8a4d554feb00fe8bb9a62430ff9e4624aa2f58a120232aae",
|
"txid": "a5d6bf53ba21140b8a4d554feb00fe8bb9a62430ff9e4624aa2f58a120232aae",
|
||||||
"vout": 1,
|
"vout": 1,
|
||||||
@ -59,7 +59,7 @@
|
|||||||
"hex": "493046022100b200ac6db16842f76dab9abe807ce423c992805879bc50abd46ed8275a59d9cf022100c0d518e85dd345b3c29dd4dc47b9a420d3ce817b18720e94966d2fe23413a408012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
|
"hex": "493046022100b200ac6db16842f76dab9abe807ce423c992805879bc50abd46ed8275a59d9cf022100c0d518e85dd345b3c29dd4dc47b9a420d3ce817b18720e94966d2fe23413a408012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "1b299cf14f1a22e81ea56d71b7affbd7cf386807bf2b4d4b79a18a54125accb3",
|
"txid": "1b299cf14f1a22e81ea56d71b7affbd7cf386807bf2b4d4b79a18a54125accb3",
|
||||||
"vout": 0,
|
"vout": 0,
|
||||||
@ -68,7 +68,7 @@
|
|||||||
"hex": "483045022100ededc441c3103a6f2bd6cab7639421af0f6ec5e60503bce1e603cf34f00aee1c02205cb75f3f519a13fb348783b21db3085cb5ec7552c59e394fdbc3e1feea43f967012103a621f08be22d1bbdcbe4e527ee4927006aa555fc65e2aafa767d4ea2fe9dfa52"
|
"hex": "483045022100ededc441c3103a6f2bd6cab7639421af0f6ec5e60503bce1e603cf34f00aee1c02205cb75f3f519a13fb348783b21db3085cb5ec7552c59e394fdbc3e1feea43f967012103a621f08be22d1bbdcbe4e527ee4927006aa555fc65e2aafa767d4ea2fe9dfa52"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "071df1cdcb3f0070f9d6af7b0274f02d0be2324a274727cfd288383167531485",
|
"txid": "071df1cdcb3f0070f9d6af7b0274f02d0be2324a274727cfd288383167531485",
|
||||||
"vout": 21,
|
"vout": 21,
|
||||||
@ -77,7 +77,7 @@
|
|||||||
"hex": "483045022100d9eed5413d2a4b4b98625aa6e3169edc4fb4663e7862316d69224454e70cd8ca022061e506521d5ced51dd0ea36496e75904d756a4c4f9fb111568555075d5f68d9a012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
"hex": "483045022100d9eed5413d2a4b4b98625aa6e3169edc4fb4663e7862316d69224454e70cd8ca022061e506521d5ced51dd0ea36496e75904d756a4c4f9fb111568555075d5f68d9a012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "b012e500eb7adf7a13ed332dd6ece849f94f7a62bb3eac5babab356d1fc19282",
|
"txid": "b012e500eb7adf7a13ed332dd6ece849f94f7a62bb3eac5babab356d1fc19282",
|
||||||
"vout": 9,
|
"vout": 9,
|
||||||
@ -86,7 +86,7 @@
|
|||||||
"hex": "48304502207e84b27139c4c19c828cb1e30c349bba88e4d9b59be97286960793b5ddc0a2af0221008cdc7a951e7f31c20953ed5635fbabf228e80b7047f32faaa0313e7693005177012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
"hex": "48304502207e84b27139c4c19c828cb1e30c349bba88e4d9b59be97286960793b5ddc0a2af0221008cdc7a951e7f31c20953ed5635fbabf228e80b7047f32faaa0313e7693005177012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "58840fee9c833f2f2d40575842f30f4b8d2553094d06ad88b03d06869acf3d88",
|
"txid": "58840fee9c833f2f2d40575842f30f4b8d2553094d06ad88b03d06869acf3d88",
|
||||||
"vout": 30,
|
"vout": 30,
|
||||||
@ -95,7 +95,7 @@
|
|||||||
"hex": "4730440220426540dfed9c4ab5812e5f06df705b8bcf307dd7d20f7fa6512298b2a6314f420220064055096e3ca62f6c7352c66a5447767c53f946acdf35025ab3807ddb2fa404012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
"hex": "4730440220426540dfed9c4ab5812e5f06df705b8bcf307dd7d20f7fa6512298b2a6314f420220064055096e3ca62f6c7352c66a5447767c53f946acdf35025ab3807ddb2fa404012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "e69f9cd16946e570a665245354428a3f507ea69f4568b581e4af98edb3db9766",
|
"txid": "e69f9cd16946e570a665245354428a3f507ea69f4568b581e4af98edb3db9766",
|
||||||
"vout": 114,
|
"vout": 114,
|
||||||
@ -104,7 +104,7 @@
|
|||||||
"hex": "47304402200a5e673996f2fc88e21cc8613611f08a650bc0370338803591d85d0ec5663764022040b6664a0d1ec83a7f01975b8fde5232992b8ca58bf48af6725d2f92a936ab2e012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
"hex": "47304402200a5e673996f2fc88e21cc8613611f08a650bc0370338803591d85d0ec5663764022040b6664a0d1ec83a7f01975b8fde5232992b8ca58bf48af6725d2f92a936ab2e012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "595d1257f654ed2cbe5a65421e8aefd2b4d70b5b6c89a03f1d7e518221fc3f02",
|
"txid": "595d1257f654ed2cbe5a65421e8aefd2b4d70b5b6c89a03f1d7e518221fc3f02",
|
||||||
"vout": 103,
|
"vout": 103,
|
||||||
@ -113,7 +113,7 @@
|
|||||||
"hex": "493046022100d93b30219c5735f673be5c3b4688366d96f545561c74cb62c6958c00f6960806022100ec8200adcb028f2184fa2a4f6faac7f8bb57cb4503bb7584ac11051fece31b3d012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
|
"hex": "493046022100d93b30219c5735f673be5c3b4688366d96f545561c74cb62c6958c00f6960806022100ec8200adcb028f2184fa2a4f6faac7f8bb57cb4503bb7584ac11051fece31b3d012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "06fc818f9555a261248ecd7aad0993eafb5a82ceb2b5c87c3ddfb06671c7f816",
|
"txid": "06fc818f9555a261248ecd7aad0993eafb5a82ceb2b5c87c3ddfb06671c7f816",
|
||||||
"vout": 1,
|
"vout": 1,
|
||||||
@ -122,7 +122,7 @@
|
|||||||
"hex": "483045022100a13934e68d3f5b22b130c4cb33f4da468cffc52323a47fbfbe06b64858162246022047081e0a70ff770e64a2e2d31e5d520d9102268b57a47009a72fe73ec766901801210234b9d9413f247bb78cd3293b7b65a2c38018ba5621ea9ee737f3a6a3523fb4cd"
|
"hex": "483045022100a13934e68d3f5b22b130c4cb33f4da468cffc52323a47fbfbe06b64858162246022047081e0a70ff770e64a2e2d31e5d520d9102268b57a47009a72fe73ec766901801210234b9d9413f247bb78cd3293b7b65a2c38018ba5621ea9ee737f3a6a3523fb4cd"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "fb416c8155d6bb1d43f9395466ca90a638a7c2dd3ff617aadf3a7ac8f3967b19",
|
"txid": "fb416c8155d6bb1d43f9395466ca90a638a7c2dd3ff617aadf3a7ac8f3967b19",
|
||||||
"vout": 0,
|
"vout": 0,
|
||||||
@ -131,7 +131,7 @@
|
|||||||
"hex": "49304602210097f1f35d5bdc1a3a60390a1b015b8e7c4f916aa3847aafd969e04975e15bbe70022100a9052eb25517d481f1fda1b129eb1b534da50ea1a51f3ee012dca3601c11b86a0121027a759be8df971a6a04fafcb4f6babf75dc811c5cdaa0734cddbe9b942ce75b34"
|
"hex": "49304602210097f1f35d5bdc1a3a60390a1b015b8e7c4f916aa3847aafd969e04975e15bbe70022100a9052eb25517d481f1fda1b129eb1b534da50ea1a51f3ee012dca3601c11b86a0121027a759be8df971a6a04fafcb4f6babf75dc811c5cdaa0734cddbe9b942ce75b34"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "3940b9683bd6104ad24c978e640ba4095993cafdb27d2ed91baa27ee61a2d920",
|
"txid": "3940b9683bd6104ad24c978e640ba4095993cafdb27d2ed91baa27ee61a2d920",
|
||||||
"vout": 221,
|
"vout": 221,
|
||||||
@ -140,7 +140,7 @@
|
|||||||
"hex": "483045022012b3138c591bf7154b6fef457f2c4a3c7162225003788ac0024a99355865ff13022100b71b125ae1ffb2e1d1571f580cd3ebc8cd049a2d7a8a41f138ba94aeb982106f012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
|
"hex": "483045022012b3138c591bf7154b6fef457f2c4a3c7162225003788ac0024a99355865ff13022100b71b125ae1ffb2e1d1571f580cd3ebc8cd049a2d7a8a41f138ba94aeb982106f012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "711b5714d3b5136147c02194cd95bde94a4648c4263ca6f972d86cd1d579f150",
|
"txid": "711b5714d3b5136147c02194cd95bde94a4648c4263ca6f972d86cd1d579f150",
|
||||||
"vout": 1,
|
"vout": 1,
|
||||||
@ -149,7 +149,7 @@
|
|||||||
"hex": "483045022100f834ccc8b22ee72712a3e5e6ef4acb8b2fb791b5385b70e2cd4332674d6667f4022024fbda0a997e0c253503f217501f508a4d56edce2c813ecdd9ad796dbeba907401210234b9d9413f247bb78cd3293b7b65a2c38018ba5621ea9ee737f3a6a3523fb4cd"
|
"hex": "483045022100f834ccc8b22ee72712a3e5e6ef4acb8b2fb791b5385b70e2cd4332674d6667f4022024fbda0a997e0c253503f217501f508a4d56edce2c813ecdd9ad796dbeba907401210234b9d9413f247bb78cd3293b7b65a2c38018ba5621ea9ee737f3a6a3523fb4cd"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "6364b5c5efe018430789e7fb4e338209546cae5d9c5f5e300aac68155d861b55",
|
"txid": "6364b5c5efe018430789e7fb4e338209546cae5d9c5f5e300aac68155d861b55",
|
||||||
"vout": 27,
|
"vout": 27,
|
||||||
@ -158,7 +158,7 @@
|
|||||||
"hex": "48304502203b2fd1e39ae0e469d7a15768f262661b0de41470daf0fe8c4fd0c26542a0870002210081c57e331f9a2d214457d953e3542904727ee412c63028113635d7224da3dccc012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
"hex": "48304502203b2fd1e39ae0e469d7a15768f262661b0de41470daf0fe8c4fd0c26542a0870002210081c57e331f9a2d214457d953e3542904727ee412c63028113635d7224da3dccc012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "0bb57f6e38012c86d4c5a28c904f2675082859147921a707d48961015a3e5057",
|
"txid": "0bb57f6e38012c86d4c5a28c904f2675082859147921a707d48961015a3e5057",
|
||||||
"vout": 1095,
|
"vout": 1095,
|
||||||
@ -167,7 +167,7 @@
|
|||||||
"hex": "48304502206947a9c54f0664ece4430fd4ae999891dc50bb6126bc36b6a15a3189f29d25e9022100a86cfc4e2fdd9e39a20e305cfd1b76509c67b3e313e0f118229105caa0e823c9012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
"hex": "48304502206947a9c54f0664ece4430fd4ae999891dc50bb6126bc36b6a15a3189f29d25e9022100a86cfc4e2fdd9e39a20e305cfd1b76509c67b3e313e0f118229105caa0e823c9012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "9b34274814a2540bb062107117f8f3e75ef85d953e9372d8261a3e9dfbc1163f",
|
"txid": "9b34274814a2540bb062107117f8f3e75ef85d953e9372d8261a3e9dfbc1163f",
|
||||||
"vout": 37,
|
"vout": 37,
|
||||||
@ -176,7 +176,7 @@
|
|||||||
"hex": "483045022100c7128fe10b2d38744ae8177776054c29fc8ec13f07207723e70766ab7164847402201d2cf09009b9596de74c0183d1ab832e5edddb7a9965880bb400097e850850f8012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
"hex": "483045022100c7128fe10b2d38744ae8177776054c29fc8ec13f07207723e70766ab7164847402201d2cf09009b9596de74c0183d1ab832e5edddb7a9965880bb400097e850850f8012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "b86b5cc0d8a7374d94e277850b0a249cb26a7b42ddf014f28a49b8859da64241",
|
"txid": "b86b5cc0d8a7374d94e277850b0a249cb26a7b42ddf014f28a49b8859da64241",
|
||||||
"vout": 20,
|
"vout": 20,
|
||||||
@ -185,7 +185,7 @@
|
|||||||
"hex": "48304502203b89a71628a28cc3703d170ca3be77786cff6b867e38a18b719705f8a326578f022100b2a9879e1acf621faa6466c207746a7f3eb4c8514c1482969aba3f2a957f1321012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
"hex": "48304502203b89a71628a28cc3703d170ca3be77786cff6b867e38a18b719705f8a326578f022100b2a9879e1acf621faa6466c207746a7f3eb4c8514c1482969aba3f2a957f1321012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "3d0a2353eeec44d3c10aed259038db321912122cd4150048f7bfa4c0ecfee236",
|
"txid": "3d0a2353eeec44d3c10aed259038db321912122cd4150048f7bfa4c0ecfee236",
|
||||||
"vout": 242,
|
"vout": 242,
|
||||||
@ -209,7 +209,7 @@
|
|||||||
"1E7SGgAZFCHDnVZLuRViX3gUmxpMfdvd2o"
|
"1E7SGgAZFCHDnVZLuRViX3gUmxpMfdvd2o"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"value": 0.01000001,
|
"value": 0.01000001,
|
||||||
"n": 1,
|
"n": 1,
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
"hex": ""
|
"hex": ""
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "bf829c6bcf84579331337659d31f89dfd138f7f7785802d5501c92333145ca7c",
|
"txid": "bf829c6bcf84579331337659d31f89dfd138f7f7785802d5501c92333145ca7c",
|
||||||
"vout": 18,
|
"vout": 18,
|
||||||
@ -23,7 +23,7 @@
|
|||||||
"hex": ""
|
"hex": ""
|
||||||
},
|
},
|
||||||
"sequence": 4294967295
|
"sequence": 4294967295
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "22a6f904655d53ae2ff70e701a0bbd90aa3975c0f40bfc6cc996a9049e31cdfc",
|
"txid": "22a6f904655d53ae2ff70e701a0bbd90aa3975c0f40bfc6cc996a9049e31cdfc",
|
||||||
"vout": 1,
|
"vout": 1,
|
||||||
@ -47,7 +47,7 @@
|
|||||||
"13tuJJDR2RgArmgfv6JScSdreahzgc4T6o"
|
"13tuJJDR2RgArmgfv6JScSdreahzgc4T6o"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"value": 4.00000000,
|
"value": 4.00000000,
|
||||||
"n": 1,
|
"n": 1,
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
"13tuJJDR2RgArmgfv6JScSdreahzgc4T6o"
|
"13tuJJDR2RgArmgfv6JScSdreahzgc4T6o"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"value": 4.00000000,
|
"value": 4.00000000,
|
||||||
"n": 1,
|
"n": 1,
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
"13tuJJDR2RgArmgfv6JScSdreahzgc4T6o"
|
"13tuJJDR2RgArmgfv6JScSdreahzgc4T6o"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"value": 0.00000000,
|
"value": 0.00000000,
|
||||||
"n": 1,
|
"n": 1,
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
"hex": ""
|
"hex": ""
|
||||||
},
|
},
|
||||||
"sequence": 4294967293
|
"sequence": 4294967293
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"txid": "5897de6bd6027a475eadd57019d4e6872c396d0716c4875a5f1a6fcfdf385c1f",
|
"txid": "5897de6bd6027a475eadd57019d4e6872c396d0716c4875a5f1a6fcfdf385c1f",
|
||||||
"vout": 0,
|
"vout": 0,
|
||||||
|
@ -17,8 +17,8 @@
|
|||||||
"reqSigs": 2,
|
"reqSigs": 2,
|
||||||
"type": "multisig",
|
"type": "multisig",
|
||||||
"addresses": [
|
"addresses": [
|
||||||
"1FoG2386FG2tAJS9acMuiDsKy67aGg9MKz",
|
"1FoG2386FG2tAJS9acMuiDsKy67aGg9MKz",
|
||||||
"1FXtz9KU8JNmQDyHdiEm5HDiALuP3zdHvV",
|
"1FXtz9KU8JNmQDyHdiEm5HDiALuP3zdHvV",
|
||||||
"14LuavcBbXZYJ6Tsz3cAUQj9SuQoL2xCQX"
|
"14LuavcBbXZYJ6Tsz3cAUQj9SuQoL2xCQX"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user