diff --git a/src/SerializedObject.cpp b/src/SerializedObject.cpp index aef0f9cf75..c2cf3c2678 100644 --- a/src/SerializedObject.cpp +++ b/src/SerializedObject.cpp @@ -429,6 +429,17 @@ std::vector STObject::getValueFieldTL(SOE_Field field) const return cf->getValue(); } +STAmount STObject::getValueFieldAmount(SOE_Field field) const +{ + const SerializedType* rf = peekAtPField(field); + if (!rf) throw std::runtime_error("Field not found"); + SerializedTypeID id = rf->getSType(); + if (id == STI_NOTPRESENT) return STAmount(); // optional field not present + const STAmount *cf = dynamic_cast(rf); + if (!cf) throw std::runtime_error("Wrong field type"); + return *cf; +} + void STObject::setValueFieldU8(SOE_Field field, unsigned char v) { SerializedType* rf = getPField(field); @@ -519,6 +530,16 @@ void STObject::setValueFieldTL(SOE_Field field, const std::vectorsetValue(v); } +void STObject::setValueFieldAmount(SOE_Field field, const STAmount &v) +{ + SerializedType* rf = getPField(field); + if (!rf) throw std::runtime_error("Field not found"); + if (rf->getSType() == STI_NOTPRESENT) rf = makeFieldPresent(field); + STAmount* cf = dynamic_cast(rf); + if (!cf) throw std::runtime_error("Wrong field type"); + (*cf) = v; +} + Json::Value STObject::getJson(int options) const { Json::Value ret(Json::objectValue); diff --git a/src/SerializedObject.h b/src/SerializedObject.h index 88e5d902fc..9a28151717 100644 --- a/src/SerializedObject.h +++ b/src/SerializedObject.h @@ -145,6 +145,7 @@ public: NewcoinAddress getValueFieldAccount(SOE_Field field) const; std::vector getValueFieldVL(SOE_Field field) const; std::vector getValueFieldTL(SOE_Field field) const; + STAmount getValueFieldAmount(SOE_Field field) const; void setValueFieldU8(SOE_Field field, unsigned char); void setValueFieldU16(SOE_Field field, uint16); @@ -157,6 +158,7 @@ public: void setValueFieldAccount(SOE_Field field, const uint160&); void setValueFieldAccount(SOE_Field field, const NewcoinAddress& addr) { setValueFieldAccount(field, addr.getAccountID()); } + void setValueFieldAmount(SOE_Field field, const STAmount&); bool isFieldPresent(SOE_Field field) const; SerializedType* makeFieldPresent(SOE_Field field); diff --git a/src/SerializedTransaction.h b/src/SerializedTransaction.h index ff30e63e04..587387e733 100644 --- a/src/SerializedTransaction.h +++ b/src/SerializedTransaction.h @@ -84,6 +84,7 @@ public: uint256 getITFieldH256(SOE_Field field) const { return mInnerTxn.getValueFieldH256(field); } std::vector getITFieldVL(SOE_Field field) const { return mInnerTxn.getValueFieldVL(field); } std::vector getITFieldTL(SOE_Field field) const { return mInnerTxn.getValueFieldTL(field); } + STAmount getITFieldAmount(SOE_Field field) const { return mInnerTxn.getValueFieldAmount(field); } void setITFieldU8(SOE_Field field, unsigned char v) { return mInnerTxn.setValueFieldU8(field, v); } void setITFieldU16(SOE_Field field, uint16 v) { return mInnerTxn.setValueFieldU16(field, v); } void setITFieldU32(SOE_Field field, uint32 v) { return mInnerTxn.setValueFieldU32(field, v); } @@ -98,6 +99,8 @@ public: { return mInnerTxn.setValueFieldAccount(field, v); } void setITFieldAccount(SOE_Field field, const NewcoinAddress& v) { return mInnerTxn.setValueFieldAccount(field, v); } + void setITFieldAmount(SOE_Field field, const STAmount& v) + { return mInnerTxn.setValueFieldAmount(field, v); } // optional field functions bool getITFieldPresent(SOE_Field field) const;