* 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
* [[eosio::action]] void testrnd(std::vector<char> uri) {
* getURI(uri, [&]( auto& results ) {
* return results[0].result;
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); \
auto results = _extractResults(*existing, combinator);\
return std::vector<char>();\