Unit ID
pCZOuYmk21a6oJQvt4+ndSwbdzov2raJ2tL9ufkjH+A=
Received
27.07.2020 12:00:26
Confirmation delay (full node)
1 minute 26 seconds
Confirmation delay (light node)
2 minutes 23 seconds
Messages
Definition
Definition: [ "autonomous agent", { "doc_url": "https://ostable.org/governance.json", "init": "{ $regular_challenging_period = params.regular_challenging_period OTHERWISE 3*24*3600; $important_challenging_period = params.important_challenging_period OTHERWISE 30*24*3600; // one cannot withdraw for this period after voting for a winning value $freeze_period = params.freeze_period OTHERWISE 30*24*3600; // min share of token1 supply required to approve a proposal $proposal_min_support = params.proposal_min_support OTHERWISE 0.5; $asset = params.asset; if (!$asset) bounce("no asset"); $curve_aa = params.curve_aa; if (!$curve_aa) bounce("no curve_aa"); $get_oracles = $oracles_string => { $pairs = split($oracles_string, " "); if (length($pairs) > 3) bounce("too many oracles"); $oracles_data = map($pairs, 3, $pair => { $oracle = substring($pair, 0, 32); if (!is_valid_address($oracle)) bounce("invalid oracle address: " || $oracle); $op = substring($pair, 32, 1); if ($op != '*' AND $op != '/') bounce("invalid format of oracles, should be oracle*feed_name or oracle/feed_name"); $feed_name = substring($pair, 33); { oracle: $oracle, feed_name: $feed_name, op: $op, } }); $oracles_data }; $get_value_key = $value => { $key_len = length('support_' || 'oracles' || '_' || $value || '_') + 32; ($key_len > 128) ? sha256($value) : $value }; }", "messages": { "cases": [ { "if": "{ trigger.data.name AND trigger.data.commit }", "init": "{ $name = trigger.data.name; $leader = var['leader_' || $name]; $current_value = var[$name]; if (!exists($leader)) // can be 0 bounce("no leader"); if (exists($current_value) AND $leader == $current_value) bounce("already equal to leader"); $challenging_period = ($name == 'oracles') ? $important_challenging_period : $regular_challenging_period; if (var['challenging_period_start_ts_' || $name] + $challenging_period > timestamp) bounce("challenging period not expired yet"); if ($name == 'proposal'){ $expiry = var['proposal_' || $leader || '_expiry']; if (parse_date($expiry) < timestamp) bounce("the proposal has expired"); if (var['proposal_' || $leader || '_approved']) bounce("the proposal has already been approved"); $support = var['support_' || $name || '_' || $leader]; if ($support < var[$curve_aa]['supply1'] * $proposal_min_support) bounce("not enough support for the proposal"); } }", "messages": [ { "app": "payment", "payload": { "asset": "base", "outputs": [ { "address": "{$curve_aa}", "amount": 5000 } ] } }, { "if": "{$name != 'proposal'}", "app": "data", "payload": { "name": "{$name}", "value": "{($name == 'oracles') ? $get_oracles($leader) : $leader}" } }, { "if": "{$name == 'proposal'}", "app": "data", "payload": { "grant": 1, "recipient": "{var['proposal_' || $leader || '_recipient']}", "amount": "{var['proposal_' || $leader || '_amount']}" } }, { "app": "state", "state": "{ if ($name != 'proposal') var[$name] = $leader; else var['proposal_' || $leader || '_approved'] = 1; }" } ] }, { "if": "{ trigger.data.name }", "init": "{ $balance = var['balance_' || trigger.address] + trigger.output[[asset=$asset]]; if (!$balance) bounce("you have no deposited balance and cannot vote"); $name = trigger.data.name; $value = trigger.data.value; // can be empty to remove one's vote if ( $name != 'fee_multiplier' AND $name != 'moved_capacity_share' AND $name != 'threshold_distance' AND $name != 'move_capacity_timeout' AND $name != 'slow_capacity_share' AND $name != 'interest_rate' AND $name != 'oracles' AND $name != 'proposal' ) bounce("unknown name: " || $name); if (exists($value)){ if ($name == 'fee_multiplier' AND !(typeof($value) == 'number' AND $value >= 1)) bounce("invalid value"); if ($name == 'moved_capacity_share' AND !(typeof($value) == 'number' AND $value > 0 AND $value <= 1)) bounce("invalid value"); if ($name == 'threshold_distance' AND !(typeof($value) == 'number' AND $value > 0 AND $value <= 0.2)) bounce("invalid value"); if ($name == 'move_capacity_timeout' AND !(is_integer($value) AND $value > 0)) bounce("invalid value"); if ($name == 'slow_capacity_share' AND !(typeof($value) == 'number' AND $value >= 0 AND $value <= 1)) bounce("invalid value"); if ($name == 'interest_rate' AND !(typeof($value) == 'number' AND $value >= 0)) bounce("invalid value"); if ($name == 'oracles') $oracles_data = $get_oracles($value); // will bounce if the format is bad if ($name == 'proposal'){ if (!(is_integer($value) AND $value > 0)) bounce("invalid value"); $expiry = var['proposal_' || $value || '_expiry']; if (!$expiry) bounce("no such proposal"); if (parse_date($expiry) < timestamp) bounce("the proposal has expired"); if (var['proposal_' || $value || '_approved']) bounce("the proposal has already been approved"); } } }", "messages": [ { "app": "state", "state": "{ if (trigger.output[[asset=$asset]]) var['balance_' || trigger.address] += trigger.output[[asset=$asset]]; $prev_choice = var['choice_' || trigger.address || '_' || $name]; $leader = var['leader_' || $name]; $challenging_period = ($name == 'oracles') ? $important_challenging_period : $regular_challenging_period; if (exists($leader) AND exists($prev_choice) AND $prev_choice == $leader AND var['challenging_period_start_ts_' || $name] + $challenging_period + $freeze_period > timestamp) bounce("you cannot change your vote yet"); var['choice_' || trigger.address || '_' || $name] = $value; if (exists($prev_choice)){ $prev_choice_key = $get_value_key($prev_choice); var['support_' || $name || '_' || $prev_choice_key] -= var['support_' || $name || '_' || $prev_choice_key || '_' || trigger.address]; var['support_' || $name || '_' || $prev_choice_key || '_' || trigger.address] = false; } if (exists($value)){ $value_key = $get_value_key($value); var['support_' || $name || '_' || $value_key] += $balance; var['support_' || $name || '_' || $value_key || '_' || trigger.address] = $balance; if (!exists($leader) OR var['support_' || $name || '_' || $value_key] > var['support_' || $name || '_' || $get_value_key($leader)]){ var['leader_' || $name] = $value; var['challenging_period_start_ts_' || $name] = timestamp; } } }" } ] }, { "if": "{ trigger.data.withdraw }", "init": "{ $balance = var['balance_' || trigger.address] + trigger.output[[asset=$asset]]; if (!$balance) bounce("you have no deposited balance and cannot withdraw"); $amount = trigger.data.amount OTHERWISE $balance; if ($amount > $balance) bounce("your balance is only " || $balance); if (var['choice_' || trigger.address || '_' || 'fee_multiplier']) bounce("support for fee_multiplier not removed yet"); if (var['choice_' || trigger.address || '_' || 'moved_capacity_share']) bounce("support for moved_capacity_share not removed yet"); if (var['choice_' || trigger.address || '_' || 'threshold_distance']) bounce("support for threshold_distance not removed yet"); if (var['choice_' || trigger.address || '_' || 'move_capacity_timeout']) bounce("support for move_capacity_timeout not removed yet"); if (var['choice_' || trigger.address || '_' || 'slow_capacity_share']) bounce("support for slow_capacity_share not removed yet"); if (var['choice_' || trigger.address || '_' || 'interest_rate']) bounce("support for interest_rate not removed yet"); if (var['choice_' || trigger.address || '_' || 'oracles']) bounce("support for oracles not removed yet"); if (var['choice_' || trigger.address || '_' || 'proposal']) bounce("support for proposal not removed yet"); }", "messages": [ { "app": "payment", "payload": { "asset": "{$asset}", "outputs": [ { "address": "{trigger.address}", "amount": "{ $amount }" } ] } }, { "app": "state", "state": "{ var['balance_' || trigger.address] -= $amount; }" } ] }, { "if": "{ trigger.data.add_proposal AND trigger.data.type }", "init": "{ if (trigger.data.type != 'grant') bounce("unrecognized proposal type"); if (!is_valid_address(trigger.data.recipient)) bounce("invalid grant recipient address"); if (!is_integer(trigger.data.amount) OR trigger.data.amount <= 0) bounce("invalid grant amount"); if (!unit[trigger.data.unit]) bounce("proposal unit not found"); if (!trigger.data.expiry) bounce("proposal expiry date not set"); $expiry_ts = parse_date(trigger.data.expiry); if (!$expiry_ts) bounce("invalid expiry date"); }", "messages": [ { "app": "state", "state": "{ var['count_proposals'] += 1; $num = var['count_proposals']; var['proposal_' || $num || '_recipient'] = trigger.data.recipient; var['proposal_' || $num || '_amount'] = trigger.data.amount; var['proposal_' || $num || '_unit'] = trigger.data.unit; var['proposal_' || $num || '_expiry'] = trigger.data.expiry; }" } ] } ] } } ]
Technical information
Fees:
9,950 bytes
(452 headers, 9498 payload)
Level:1453020
Witnessed level:1453011
Main chain index:1446691
Latest included mc index:1446690
Status:stable/confirmed/final