#ifndef MODEL_HPP #define MODEL_HPP #include #include #include #include #include "crow/json.h" #include "tl/expected.hpp" #include "big_int.hpp" struct PublicKey { BigInt modulus; //: "daaa63ddda38c189b8c49020c8276adbe0a695685a...", BigInt public_exponent;//: 65537, crow::json::wvalue to_json() const; }; struct WeightedUrl { uint32_t weight; std::string url; crow::json::wvalue to_json() const; }; /** currency description document */ struct CDD { std::string additional_info; time_t cdd_expiry_date;//: 2023-07-22T15:45:53.164685 std::string cdd_location;//: https://opencent.org, size_t cdd_serial;//: 1, time_t cdd_signing_date;//: 2022-07-22T15:45:53.164685, size_t currency_divisor;//: 100, std::string currency_name;//: OpenCent, std::vector denominations;//: [1, 2, 5], BigInt id;//: 23ed956e629ba35f0002eaf833ea436aea7db5c2, std::vector info_service; /* eCipherSuite*/ std::string issuer_cipher_suite; //: RSA-SHA256-PSS-CHAUM82, PublicKey issuer_public_master_key; //: { // modulus: // daaa63ddda38c189b8c49020c8276adbe0a695685a..., // public_exponent: 65537, // type: rsa public key //}, std::vector mint_service; std::string protocol_version; //: https://opencoin.org/1.0, std::vector redeem_service; std::vector renew_service; crow::json::wvalue to_json() const; }; struct CDDC { CDD cdd; std::string signature; crow::json::wvalue to_json() const; }; struct MintKey { unsigned int cdd_serial; std::string coins_expiry_date; //": "2023-10-30T15:45:53.164685", unsigned int denomination; //": 1, BigInt id; // "1ceb977bb531c65f133ab8b0d60862b17369d96", BigInt issuer_id; //": "23ed956e629ba35f0002eaf833ea436aea7db5c2", PublicKey public_mint_key; std::string sign_coins_not_after; std::string sign_coins_not_before; // "type": "mint key" crow::json::wvalue to_json() const; }; struct MintKeyCert { MintKey mint_key; std::string signature; crow::json::wvalue to_json() const; }; enum class eError { JSON_PARSE_ERROR, JSON_MISSING_KEY, JSON_WRONG_REQUEST_TYPE, JSON_WRONG_VALUE_TYPE, JSON_ERROR, NOT_IMPLEMENTED }; struct Response { unsigned int message_reference; unsigned int status_code; std::string status_description; virtual crow::json::wvalue to_json() const; }; struct RequestCDDCSerial { unsigned int message_reference; /// Client internal message reference. /// (Integer) static tl::expected from_string(const std::string &str); }; struct ResponseCDDCSerial : Response { unsigned int cdd_serial; crow::json::wvalue to_json() const override; }; struct RequestCDDC { unsigned int cdd_serial; /// The version of the CDD. (Int) unsigned int message_reference; /// Client internal message reference. /// (Integer) static tl::expected from_string(const std::string &str); }; struct ResponseCDDC : Response { CDDC cddc; crow::json::wvalue to_json() const override; }; struct RequestMKCs { std::vector denominations; unsigned int message_reference; /// Client internal message reference. /// (Integer) std::vector mint_key_ids; // "type": "request mint key certificates" static tl::expected from_string(const std::string &str); }; struct ResponseMKCs : Response { std::vector keys; crow::json::wvalue to_json() const override; }; struct Blind { BigInt blinded_payload_hash; //bigint BigInt mint_key_id; //bigint std::string reference; crow::json::wvalue to_json() const; static tl::expected from_json(const crow::json::rvalue &json); }; struct BlindSignature { BigInt blind_signature; std::string reference; crow::json::wvalue to_json() const; }; struct RequestMint { unsigned int message_reference; /// Client internal message reference. /// (Integer) BigInt transaction_reference; std::vector blinds; // "type": "request mint" static tl::expected from_string(const std::string &str); }; struct ResponseMint : Response { std::vector blind_signatures; crow::json::wvalue to_json() const override; }; struct Coin { struct Payload { std::string cdd_location; unsigned int denomination; BigInt issuer_id; BigInt mint_key_id; std::string protocol_version; BigInt serial; crow::json::wvalue to_json() const; static tl::expected from_json(const crow::json::rvalue& json); }; Payload payload; std::string signature; crow::json::wvalue to_json() const; static tl::expected from_json(const crow::json::rvalue &json); }; struct CoinStack { std::vector coins; std::string subject; // "type": "coinstack" crow::json::wvalue to_json() const; }; struct RequestRenew { std::vector blinds; std::vector coins; unsigned int message_reference; /// Client internal message reference. /// (Integer) std::string transaction_reference; // "type": "request renew" static tl::expected from_string(const std::string &str); }; struct ResponseDelay : Response { crow::json::wvalue to_json() const override; }; struct RequestResume { unsigned int message_reference; /// Client internal message reference. /// (Integer) BigInt transaction_reference; // "type": "request resume" static tl::expected from_string(const std::string &str); }; struct RequestRedeem { std::vector coins; unsigned int message_reference; /// Client internal message reference. /// (Integer) // "type": "request redeem" static tl::expected from_string(const std::string &str); }; struct ResponseRedeem : Response { crow::json::wvalue to_json() const override; }; class Model { public: virtual ~Model(){}; virtual tl::expected getCDDC(unsigned int cdd_serial) = 0; virtual tl::expected getCurrentCDDC() = 0; virtual const std::vector getMKCs(const std::vector &denominations, const std::vector &mint_key_ids) = 0; virtual std::vector mint(std::string const& transaction_reference, const std::vector &blinds) = 0; virtual bool redeem(const std::vector &coins) = 0; static std::unique_ptr getModel(const std::string &backend_name); private: }; #endif // #ifndef MODEL_HPP