| 1 | [ |
| 2 | "autonomous agent", |
| 3 | { |
| 4 | "getters": "{ |
| 5 | |
| 6 | $distribute_staker_fees = ($state, $aa_state, $user_perp) => { |
| 7 | $user_share = $user_perp.normalized_vp/$state.total_normalized_vp; |
| 8 | |
| 9 | $new_fees_since_prev_visit = $aa_state.total_staker_fees - $user_perp.last_perp_emissions.r; |
| 10 | $user_perp.last_perp_emissions.r = $aa_state.total_staker_fees; |
| 11 | |
| 12 | $reward = $new_fees_since_prev_visit * $user_share; |
| 13 | $user_perp.rewards.r = $user_perp.rewards.r + $reward; |
| 14 | }; |
| 15 | |
| 16 | $distribute_emissions = ($state, $perp, $user_perp, $perp_vps, $total_perp_balance, $emissions, $bAsset0, $aa_state) => { |
| 17 | if (!$state.total_normalized_vp) |
| 18 | return; |
| 19 | |
| 20 | if ($bAsset0) |
| 21 | $distribute_staker_fees($state, $aa_state, $user_perp); |
| 22 | |
| 23 | $perp_share = $perp_vps[$perp.asset_key]/$state.total_normalized_vp; |
| 24 | $user_share = $bAsset0 |
| 25 | ? $user_perp.normalized_vp/$state.total_normalized_vp |
| 26 | : ($total_perp_balance ? $user_perp.balance/$total_perp_balance : 0); |
| 27 | |
| 28 | foreach($emissions, 15, ($reward_asset_key, $asset_emissions) => { |
| 29 | |
| 30 | if ($asset_emissions < ($perp.last_emissions[$reward_asset_key] OTHERWISE 0)){ |
| 31 | $perp.last_emissions[$reward_asset_key] = 0; |
| 32 | $perp.received_emissions[$reward_asset_key] = 0; |
| 33 | } |
| 34 | if (($perp.received_emissions[$reward_asset_key] OTHERWISE 0) < ($user_perp.last_perp_emissions[$reward_asset_key] OTHERWISE 0)) |
| 35 | $user_perp.last_perp_emissions[$reward_asset_key] = 0; |
| 36 | |
| 37 | $new_total_emissions_since_prev_visit = $asset_emissions - $perp.last_emissions[$reward_asset_key]; |
| 38 | $perp.received_emissions[$reward_asset_key] = $perp.received_emissions[$reward_asset_key] + $new_total_emissions_since_prev_visit * $perp_share; |
| 39 | $perp.last_emissions[$reward_asset_key] = $asset_emissions; |
| 40 | |
| 41 | $new_emissions_since_prev_visit = $perp.received_emissions[$reward_asset_key] - $user_perp.last_perp_emissions[$reward_asset_key]; |
| 42 | $user_perp.last_perp_emissions[$reward_asset_key] = $perp.received_emissions[$reward_asset_key]; |
| 43 | |
| 44 | $reward = $new_emissions_since_prev_visit * $user_share; |
| 45 | $user_perp.rewards[$reward_asset_key] = $user_perp.rewards[$reward_asset_key] + $reward; |
| 46 | }); |
| 47 | }; |
| 48 | |
| 49 | $distribute_new_vp = ($votes, $perp_vps, $delta_normalized_vp, $percentages) => { |
| 50 | $totals = {total: 0}; |
| 51 | foreach($percentages, 20, ($perp_asset_key, $percentage) => { |
| 52 | require(+substring($perp_asset_key, 1) >= 0 AND starts_with($perp_asset_key, 'a'), "invalid perp asset key "||$perp_asset_key); |
| 53 | require($percentage > 0, "invalid percentage "||$percentage); |
| 54 | require(exists($perp_vps[$perp_asset_key]), "perp asset key "||$perp_asset_key||" not found in this group"); |
| 55 | $totals.total = $totals.total + $percentage; |
| 56 | $added_vp = $percentage/100 * $delta_normalized_vp; |
| 57 | $votes[$perp_asset_key] = $votes[$perp_asset_key] + $added_vp; |
| 58 | $perp_vps[$perp_asset_key] = $perp_vps[$perp_asset_key] + $added_vp; |
| 59 | }); |
| 60 | require($totals.total == 100, "percentages sum to "||$totals.total); |
| 61 | require(length($votes) <= 30, "max total number of supported perps is 30"); |
| 62 | $perp_vps.total = $perp_vps.total + $delta_normalized_vp; |
| 63 | }; |
| 64 | |
| 65 | |
| 66 | $apply_vote = ($votes, $perp_vps, $group_key1, $group_key2, $group_vps, $changes) => { |
| 67 | $totals = {total: 0, max: 0}; |
| 68 | foreach($changes, 20, ($perp_asset_key, $delta_vp) => { |
| 69 | require(+substring($perp_asset_key, 1) >= 0 AND starts_with($perp_asset_key, 'a'), "invalid perp asset key "||$perp_asset_key); |
| 70 | $votes[$perp_asset_key] = $votes[$perp_asset_key] + $delta_vp; |
| 71 | $p = $votes[$perp_asset_key]; |
| 72 | require($p >= 0, "would have negative votes for perp_asset_key "||$perp_asset_key); |
| 73 | if ($p == 0) |
| 74 | delete($votes, $perp_asset_key); |
| 75 | $totals.total = $totals.total + $delta_vp; |
| 76 | if (abs($delta_vp) > $totals.max) |
| 77 | $totals.max = abs($delta_vp); |
| 78 | if (exists($perp_vps[$group_key1][$perp_asset_key])) |
| 79 | $group_key = $group_key1; |
| 80 | else if ($group_key2 AND exists($perp_vps[$group_key2][$perp_asset_key])) |
| 81 | $group_key = $group_key2; |
| 82 | else |
| 83 | bounce("perp asset key "||$perp_asset_key||" not found in any of the two groups"); |
| 84 | $perp_vps[$group_key][$perp_asset_key] = $perp_vps[$group_key][$perp_asset_key] + $delta_vp; |
| 85 | $perp_vps[$group_key].total = $perp_vps[$group_key].total + $delta_vp; |
| 86 | $group_vps[$group_key] = $group_vps[$group_key] + $delta_vp; |
| 87 | }); |
| 88 | require(abs($totals.total) < $totals.max * 1e-14, "total votes changed by "||$totals.total); |
| 89 | require(length($votes) <= 30, "max total number of supported perps is 30"); |
| 90 | }; |
| 91 | |
| 92 | $remove_votes = ($votes, $perp_vps) => { |
| 93 | foreach($votes, 30, ($perp_asset_key, $vp) => { |
| 94 | require(exists($perp_vps[$perp_asset_key]), "perp asset key "||$perp_asset_key||" not found in the indicated group"); |
| 95 | $perp_vps[$perp_asset_key] = $perp_vps[$perp_asset_key] - $votes[$perp_asset_key]; |
| 96 | }); |
| 97 | }; |
| 98 | |
| 99 | |
| 100 | }", |
| 101 | "messages": [ |
| 102 | { |
| 103 | "app": "state", |
| 104 | "state": "{ |
| 105 | bounce("library only"); |
| 106 | }" |
| 107 | } |
| 108 | ] |
| 109 | } |
| 110 | ] |