diff --git a/src/SerializedObject.cpp b/src/SerializedObject.cpp index 7ff7482648..5dc6b29b6c 100644 --- a/src/SerializedObject.cpp +++ b/src/SerializedObject.cpp @@ -897,7 +897,7 @@ std::auto_ptr STObject::parseJson(const Json::Value& object, SField::r else if (value.isInt()) data.push_back(new STUInt32(field, range_check_cast(value.asInt(), 0, 4294967295))); else if (value.isUInt()) - data.push_back(new STUInt32(field, static_cast(value.asUInt(), 0, 4294967295))); + data.push_back(new STUInt32(field, static_cast(value.asUInt()))); else throw std::runtime_error("Incorrect type"); break; @@ -940,7 +940,7 @@ std::auto_ptr STObject::parseJson(const Json::Value& object, SField::r if (!value.isString()) throw std::runtime_error("Incorrect type"); data.push_back(new STVariableLength(field, strUnHex(value.asString()))); - break; + break; case STI_AMOUNT: // WRITEME @@ -950,9 +950,27 @@ std::auto_ptr STObject::parseJson(const Json::Value& object, SField::r case STI_PATHSET: // WRITEME - + break; case STI_ACCOUNT: - // WRITEME + { + if (!value.isString()) + throw std::runtime_error("Incorrect type"); + std::string strValue = value.asString(); + if (value.size() == 40) // 160-bit hex account value + { + uint160 v; + v.SetHex(strValue); + data.push_back(new STAccount(field, v)); + } + else + { // newcoin addres + NewcoinAddress a; + if (!a.setAccountPublic(strValue)) + throw std::runtime_error("Account invalid"); + data.push_back(new STAccount(field, a.getAccountID())); + } + } + break; case STI_OBJECT: case STI_TRANSACTION: diff --git a/src/SerializedTypes.cpp b/src/SerializedTypes.cpp index f4853a82e8..097395b5ca 100644 --- a/src/SerializedTypes.cpp +++ b/src/SerializedTypes.cpp @@ -231,9 +231,14 @@ bool STVector256::isEquivalent(const SerializedType& t) const // STAccount // +STAccount::STAccount(SField::ref n, const uint160& v) : STVariableLength(n) +{ + peekValue().insert(peekValue().end(), v.begin(), v.end()); +} + bool STAccount::isValueH160() const { - return peekValue().size() == (160/8); + return peekValue().size() == (160 / 8); } void STAccount::setValueH160(const uint160& v) diff --git a/src/SerializedTypes.h b/src/SerializedTypes.h index 046c39e52b..785e62515d 100644 --- a/src/SerializedTypes.h +++ b/src/SerializedTypes.h @@ -496,6 +496,7 @@ public: STAccount(const std::vector& v) : STVariableLength(v) { ; } STAccount(SField::ref n, const std::vector& v) : STVariableLength(n, v) { ; } + STAccount(SField::ref n, const uint160& v); STAccount(SField::ref n) : STVariableLength(n) { ; } STAccount() { ; } static std::auto_ptr deserialize(SerializerIterator& sit, SField::ref name)