geturi

geturi | code​

/**
* LiquidHarmony uses the geturi action to perform an oracle request
*
* @param {std::vector<char>} uri - hex conversion of URL syntax to perform an oracle request
* @param {Lambda&&} combinator - lambda to return the results of an oracle request
*
* Example:
*
* @code
* [[eosio::action]] void testrnd(std::vector<char> uri) {
* getURI(uri, [&]( auto& results ) {
* return results[0].result;
* });
* }
* @endcode
*/
​
TABLE oracleentry { \
uint64_t id; \
std::vector<char> uri; \
std::vector<provider_result> results; \
checksum256 hash_key() const { return hashData(uri); } \
uint64_t primary_key()const { return id; } \
}; \
typedef eosio::multi_index<"oracleentry"_n, oracleentry, indexed_by<"byhash"_n, const_mem_fun<oracleentry, checksum256, &oracleentry::hash_key>>> oracleentries_t; \
​
static std::vector<char> getURI(std::vector<char> uri, Lambda&& combinator){ \
checksum256 trxId = transaction_id(); \
auto trxIdp = trxId.data(); \
std::string trxIdStr(trxIdp, trxIdp + trxId.size()); \
auto pubTime = tapos_block_prefix(); \
std::string uristr(uri.begin(), uri.end()); \
auto s = fc::base64_encode(trxIdStr) + "://" + fc::to_string(pubTime) + "://" + uristr;\
std::vector<char> idUri(s.begin(), s.end()); \
return _getURI(idUri, combinator); \
}\
​
static std::vector<char> _getURI(std::vector<char> uri, Lambda&& combinator){ \
auto _self = name(current_receiver()); \
oracleentries_t entries(_self, _self.value); \
auto cidx = entries.get_index<"byhash"_n>(); \
auto existing = cidx.find(hashData(uri)); \
if(existing == cidx.end()){ \
SEND_SVC_REQUEST(geturi, uri); \
} \
else {\
auto results = _extractResults(*existing, combinator);\
cidx.erase(existing);\
return results; \
} \
return std::vector<char>();\
} \