PaymentCode::PaymentCode(const std::string& base58)
{
    OTData rawCode;
    App::Me().Crypto().Util().Base58CheckDecode(base58, rawCode);

    if (81 == rawCode.GetSize()) {
        uint8_t prependByte, features;
        rawCode.OTfread(&prependByte, 1);

        rawCode.OTfread(&version_, 1);
        rawCode.OTfread(&features, 1);

        if (features & 0x80) {
            hasBitmessage_ = true;
        }

        OTData key;
        key.SetSize(33);
        chain_code_.SetSize(32);

        OT_ASSERT(33 == key.GetSize());
        OT_ASSERT(32 == chain_code_.GetSize());

        rawCode.OTfread(static_cast<uint8_t*>(const_cast<void*>(key.GetPointer())), key.GetSize());
        rawCode.OTfread(static_cast<uint8_t*>(const_cast<void*>(chain_code_.GetPointer())), chain_code_.GetSize());

        ConstructKey(key, chain_code_);

        if (hasBitmessage_) {
            rawCode.OTfread(&bitmessage_version_, 1);
            rawCode.OTfread(&bitmessage_stream_, 1);
        }
    }
}
PaymentCode::PaymentCode(const proto::PaymentCode& paycode)
    : version_(paycode.version())
    , chain_code_(paycode.chaincode().c_str(), paycode.chaincode().size())
    , hasBitmessage_(paycode.has_bitmessage())
{
    OT_ASSERT(paycode.has_key());

    OTData key(paycode.key().c_str(), paycode.key().size());
    OTData chaincode(paycode.chaincode().c_str(), paycode.chaincode().size());
    ConstructKey(key, chaincode);

    if (paycode.has_bitmessageversion()) {
        bitmessage_version_ = paycode.bitmessageversion();
    }
    if (paycode.has_bitmessagestream()) {
        bitmessage_stream_ = paycode.bitmessagestream();
    }
}
PaymentCode::PaymentCode(
    const uint32_t nym,
    const bool bitmessage,
    const uint8_t bitmessageVersion,
    const uint8_t bitmessageStream)
        : hasBitmessage_(bitmessage)
        , bitmessage_version_(bitmessageVersion)
        , bitmessage_stream_(bitmessageStream)
{
    serializedAsymmetricKey privatekey =
        App::Me().Crypto().BIP32().GetPaymentCode(nym);

    chain_code_.Assign(
        privatekey->chaincode().c_str(),
        privatekey->chaincode().size());

    serializedAsymmetricKey key =
        App::Me().Crypto().BIP32().PrivateToPublic(*privatekey);

    OTData pubkey(key->key().c_str(), key->key().size());

    ConstructKey(pubkey, chain_code_);
}
	//! Default constructor
	Edge(size_t v1, size_t v2, double weight)
		: m_key(ConstructKey(v1, v2))
		, m_weight(weight)
	{
		assert(m_weight >= 0);
	}