COOPENOMICS  v1
Кооперативная Экономика
rammarket.hpp
См. документацию.
1#pragma once
2
3#include <algorithm>
4#include <cmath>
5#include <eosio/asset.hpp>
6
7namespace eosiosystem {
8using eosio::asset;
9using eosio::symbol;
10
11typedef double real_type;
12
18struct [[eosio::table, eosio::contract(SYSTEM)]] exchange_state {
19 asset supply;
20
21 struct connector {
22 asset balance;
23 double weight = 0.5; //.5
24
25 EOSLIB_SERIALIZE(connector, (balance)(weight))
26 };
27
30
31 uint64_t primary_key() const { return supply.symbol.raw(); }
32
33 asset convert_to_exchange(connector & c, asset in) {
34 real_type R(supply.amount);
35 real_type C(c.balance.amount + in.amount);
36 real_type F(c.weight);
37 real_type T(in.amount);
38 real_type ONE(1.0);
39
40 real_type E = -R * (ONE - pow(ONE + T / C, F));
41 int64_t issued = int64_t(E);
42
43 supply.amount += issued;
44 c.balance.amount += in.amount;
45
46 return asset(issued, supply.symbol);
47 };
48
49 asset convert_from_exchange(connector & c, asset in) {
50 eosio::check(in.symbol == supply.symbol, "unexpected asset symbol input");
51
52 real_type R(supply.amount - in.amount);
53 real_type C(c.balance.amount);
54 real_type F(1.0 / c.weight);
55 real_type E(in.amount);
56 real_type ONE(1.0);
57
58 // potentially more accurate:
59 // The functions std::expm1 and std::log1p are useful for financial
60 // calculations, for example, when calculating small daily interest rates:
61 // (1+x)n -1 can be expressed as std::expm1(n * std::log1p(x)). real_type T
62 // = C * std::expm1( F * std::log1p(E/R) );
63
64 real_type T = C * (std::pow(ONE + E / R, F) - ONE);
65 int64_t out = int64_t(T);
66
67 supply.amount -= in.amount;
68 c.balance.amount -= out;
69
70 return asset(out, c.balance.symbol);
71 };
72
73 asset convert(asset from, const symbol &to) {
74 auto sell_symbol = from.symbol;
75 auto ex_symbol = supply.symbol;
76 auto base_symbol = base.balance.symbol;
77 auto quote_symbol = quote.balance.symbol;
78
79 // print( "From: ", from, " TO ", asset( 0,to), "\n" );
80 // print( "base: ", base_symbol, "\n" );
81 // print( "quote: ", quote_symbol, "\n" );
82 // print( "ex: ", supply.symbol, "\n" );
83
84 if (sell_symbol != ex_symbol) {
85 if (sell_symbol == base_symbol) {
86 from = convert_to_exchange(base, from);
87 } else if (sell_symbol == quote_symbol) {
88 from = convert_to_exchange(quote, from);
89 } else {
90 eosio::check(false, "invalid sell");
91 }
92 } else {
93 if (to == base_symbol) {
94 from = convert_from_exchange(base, from);
95 } else if (to == quote_symbol) {
96 from = convert_from_exchange(quote, from);
97 } else {
98 eosio::check(false, "invalid conversion");
99 }
100 }
101
102 if (to != from.symbol)
103 return convert(from, to);
104
105 return from;
106 };
107
108 EOSLIB_SERIALIZE(exchange_state, (supply)(base)(quote))
109};
110
111typedef eosio::multi_index<"rammarket"_n, exchange_state> rammarket;
112
113eosio::asset determine_ram_price(uint32_t bytes) {
114 eosiosystem::rammarket rammarkettable(_system, _system.value);
115 auto market = rammarkettable.get(_ramcore_symbol.raw());
116 auto ram_price =
117 market.convert(eosio::asset{bytes, RAM_symbol}, _root_symbol);
118 ram_price.amount = (ram_price.amount * 200 + 199) / 199; // add ram fee
119
120 return ram_price;
121}
122
123} // namespace eosiosystem
static constexpr eosio::symbol _ramcore_symbol
Definition: consts.hpp:219
static constexpr eosio::name _system
Definition: consts.hpp:158
static constexpr eosio::symbol RAM_symbol
Definition: consts.hpp:218
static constexpr eosio::symbol _root_symbol
Definition: consts.hpp:209
contract
Definition: eosio.msig_tests.cpp:977
balance
Definition: eosio.token_tests.cpp:226
supply
Definition: eosio.token_tests.cpp:150
Definition: eosio.msig.hpp:34
Definition: rammarket.hpp:7
eosio::multi_index<"rammarket"_n, exchange_state > rammarket
Definition: rammarket.hpp:111
double real_type
Definition: rammarket.hpp:11
eosio::asset determine_ram_price(uint32_t bytes)
Definition: rammarket.hpp:113
Definition: rammarket.hpp:21
double weight
Definition: rammarket.hpp:23
asset balance
Definition: rammarket.hpp:22
Definition: rammarket.hpp:18
uint64_t primary_key() const
Definition: rammarket.hpp:31
connector quote
Definition: rammarket.hpp:29
asset supply
Definition: rammarket.hpp:19
connector base
Definition: rammarket.hpp:28
asset convert_to_exchange(connector &c, asset in)
Definition: rammarket.hpp:33
asset convert(asset from, const symbol &to)
Definition: rammarket.hpp:73
asset convert_from_exchange(connector &c, asset in)
Definition: rammarket.hpp:49