#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace xrpl { STIssue::STIssue(SField const& name) : STBase{name} { } STIssue::STIssue(SerialIter& sit, SField const& name) : STBase{name} { auto const currencyOrAccount = sit.get160(); if (isXRP(static_cast(currencyOrAccount))) { asset_ = xrpIssue(); } // Check if MPT else { // MPT is serialized as: // - 160 bits MPT issuer account // - 160 bits black hole account // - 32 bits sequence AccountID account = static_cast(sit.get160()); // MPT if (noAccount() == account) { MPTID mptID; std::uint32_t sequence = sit.get32(); static_assert(MPTID::size() == sizeof(sequence) + sizeof(currencyOrAccount)); memcpy(mptID.data(), &sequence, sizeof(sequence)); memcpy( mptID.data() + sizeof(sequence), currencyOrAccount.data(), sizeof(currencyOrAccount)); MPTIssue issue{mptID}; asset_ = issue; } else { Issue issue; issue.currency = currencyOrAccount; issue.account = account; if (!isConsistent(issue)) Throw("invalid issue: currency and account native mismatch"); asset_ = issue; } } } SerializedTypeID STIssue::getSType() const { return STI_ISSUE; } std::string STIssue::getText() const { return asset_.getText(); } Json::Value STIssue::getJson(JsonOptions) const { Json::Value jv; asset_.setJson(jv); return jv; } void STIssue::add(Serializer& s) const { if (holds()) { auto const& issue = asset_.get(); s.addBitString(issue.currency); if (!isXRP(issue.currency)) s.addBitString(issue.account); } else { auto const& issue = asset_.get(); s.addBitString(issue.getIssuer()); s.addBitString(noAccount()); std::uint32_t sequence = 0; memcpy(&sequence, issue.getMptID().data(), sizeof(sequence)); s.add32(sequence); } } bool STIssue::isEquivalent(STBase const& t) const { STIssue const* v = dynamic_cast(&t); return (v != nullptr) && (*v == *this); } bool STIssue::isDefault() const { return holds() && asset_.get() == xrpIssue(); } STBase* STIssue::copy(std::size_t n, void* buf) const { return emplace(n, buf, *this); } STBase* STIssue::move(std::size_t n, void* buf) { return emplace(n, buf, std::move(*this)); } STIssue issueFromJson(SField const& name, Json::Value const& v) { return STIssue{name, assetFromJson(v)}; } } // namespace xrpl