getDefinition(s)

Get an address definition(s)

Spec

getDefinition(address: string);
getDefinitions(addresses: string[]);

Example

await Client.getDefinition('A336I77COVXUCN3L2YOYVIZF7PKMFCAV');
await Client.getDefinitions(['A336I77COVXUCN3L2YOYVIZF7PKMFCAV']);

Response getDefinition

[
  "autonomous agent",
  {
    "doc_url": "https://pyth.ooo/perpetual.json",
    "getters": "{\n\n\t\t$trade_merge_period = 1; // seconds\n\n\t\t$get_param = ($name, $default) => {\n\t\t\t$value = var[$name];\n\t\t\texists($value) ? $value : (exists(params[$name]) ? params[$name] : $default)\n\t\t};\n\n\t\t$get_swap_fee = () => $get_param('swap_fee', 0.003);\n\t\t$get_arb_profit_tax = () => $get_param('arb_profit_tax', 0.9);\n\t\t$get_adjustment_period = () => $get_param('adjustment_period', 3 * 24 * 3600); // 3 days\n\t\t$get_presale_period = () => $get_param('presale_period', 14 * 24 * 3600); // 14 days\n\t\t$get_auction_price_halving_period = () => $get_param('auction_price_halving_period', 3 * 24 * 3600); // 3 days\n\t\t$get_token_share_threshold = () => $get_param('token_share_threshold', 0.1); // 10%\n\t\t$get_min_s0_share = () => $get_param('min_s0_share', 0.01); // 1%\n\t\t$get_stakers_fee_share = () => $get_param('stakers_fee_share', 0.5); // 50%\n\t\t$get_reserve_price_aa = () => $get_param('reserve_price_aa');\n\n\t\t$pow2 = $x => $x*$x;\n\t\t\n\t\t$adjust_prices = ($asset, $asset_info, $state) => {\n\t\t\tif ($state.asset0 == $asset)\n\t\t\t\treturn;\n\t\t\t\n\t\t\t$elapsed = timestamp - $asset_info.last_ts;\n\t\t\t$asset_info.last_ts = timestamp;\n\n\t\t\tif ($asset_info.presale AND $asset_info.preipo){\n\t\t\t\t$target_price = $asset_info.last_auction_price;\n\t\t\t}\n\t\t\telse{\n\t\t\t\t$price_aa = $asset_info.price_aa;\n\t\t\t\tif (!$price_aa)\n\t\t\t\t\treturn;\n\t\t\t\t// $target_price is in terms of the reserve currency.\n\t\t\t\t// Both $get_target_price() and $get_reserve_price() return prices in USD (or some other common currency)\n\t\t\t\t$target_price = $price_aa#3.$get_target_price() / $get_reserve_price_aa()#8.$get_reserve_price();\n\t\t\t\tif (typeof($target_price) != 'number' OR $target_price < 0)\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif ($asset_info.presale){\n\t\t\t\tif (\n\t\t\t\t\t$asset_info.presale_amount\n\t\t\t\t\tAND (\n\t\t\t\t\t\ttimestamp >= $asset_info.presale_finish_ts \n\t\t\t\t\t\tOR $asset_info.presale_amount >= $get_token_share_threshold() * $state.reserve\n\t\t\t\t\t\t// we can exceed max_tokens\n\t\t\t\t\t\tOR $asset_info.preipo AND $asset_info.presale_amount / $target_price >= $asset_info.max_tokens\n\t\t\t\t\t)\n\t\t\t\t){ // add the reserve and launch trading\n\t\t\t\t\tdelete($asset_info, 'presale');\n\t\t\t\t\t$asset_info.initial_price = $target_price;\n\t\t\t\t\t$asset_info.supply = floor($asset_info.presale_amount / $target_price);\n\t\t\t\t\t$asset_info.a = $pow2($target_price / $state.coef) * $state.reserve/$asset_info.presale_amount;\n\t\t\t\t\t$new_reserve = $state.reserve + $asset_info.presale_amount;\n\t\t\t\t\t$state.coef = $state.coef * sqrt($new_reserve/$state.reserve);\n\t\t\t\t\t$state.reserve = $new_reserve;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$r = $state.reserve;\n\t\t\t$c = $state.coef;\n\t\t\t$s = $asset_info.supply;\n\t\t\t$a = $asset_info.a;\n\t\t\t$p = $c*$c * $a * $s / $r;\n\t\t\t$s0 = $state.s0;\n\n\t\t\tif (!$s)\n\t\t\t\treturn;\n\n\t\t\t$full_delta_p = $target_price - $p;\n\t\t\t$adjustment_period = $get_adjustment_period();\n\t\t\t$delta_p = $elapsed >= $adjustment_period ? $full_delta_p : $elapsed/$adjustment_period*$full_delta_p;\n\n\t\t//\t$delta_a = $a * $delta_p/$p; // >= -$a\n\t\t//\t$asset_info.a = $asset_info.a + $delta_a; // stays positive\n\t\t//\t$state.coef = $c / sqrt(1 + $delta_a * $pow2($s * $c / $r));\n\n\t\t\t$new_c = $c * sqrt(1 - $s * $r * $delta_p / ($r*$r - $a * $pow2($c * $s)));\n\t\t\trequire(($new_c - $c) * $delta_p <= 0, \"c should change opposite to p\");\n\t\t\t$new_a = ($p + $delta_p) * $r / $new_c/$new_c / $s;\n\t\t\trequire(($new_a - $a) * $delta_p >= 0, \"a should change as p\");\n\t\t\t$asset_info.a = $new_a;\n\t\t\t$state.coef = $new_c;\n\n\t\t\t// apply drift that slowly depreciates p and moves the wealth to s0 holders\n\t\t\tif ($asset_info.drift_rate){\n\t\t\t\t$relative_price_drift = $elapsed/360/24/3600 * $asset_info.drift_rate;\n\t\t\t\tif ($relative_price_drift < 1){\n\t\t\t\t\t$asset_info.a = $asset_info.a * (1 - $relative_price_drift);\n\t\t\t\t\t$state.a0 = $state.a0 + $pow2($s/$s0) * $asset_info.a * $relative_price_drift;\n\t\t\t\t\trequire($state.a0 > 0, \"a0 would become negative\");\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t// keeping s0 share above some minimum\n\t\t\t$a0 = $state.a0;\n\t\t\t$c1 = $state.coef;\n\t\t\t$s0_share = $a0 * $pow2($s0 * $c1 / $r);\n\t\t\t$min_s0_share = $get_min_s0_share();\n\t\t\tif ($s0_share < $min_s0_share){\n\t\t\t\t$new_a0 = ($pow2($r/$c1/$s0) - $a0) / (1/$min_s0_share - 1);\n\t\t\t\t$new_c2 = $r/$s0 * sqrt($min_s0_share/$new_a0);\n\t\t\t\trequire($new_a0 > $a0, \"a0 should grow\");\n\t\t\t\trequire($new_c2 < $c, \"c should fall\");\n\t\t\t\t$state.a0 = $new_a0;\n\t\t\t\t$state.coef = $new_c;\n\t\t\t}\n\t\t};\n\n\n\t\t$get_auction_price = ($asset) => {\n\t\t\t$state = var['state'];\n\t\t\t$asset_info = var['asset_'||$asset];\n\t\t\trequire($asset_info, \"no such asset\");\n\t\t\trequire($asset_info.preipo, \"not a pre-IPO\");\n\t\t\t$asset_info.initial_auction_price / 2^((timestamp - $asset_info.creation_ts)/$get_auction_price_halving_period())\n\t\t};\n\n\t\t$get_price = ($asset, $bWithPriceAdjustment) => {\n\t\t\t$state = var['state'];\n\t\t\t$bAsset0 = $state.asset0 == $asset;\n\t\t\tif (!$bAsset0) {\n\t\t\t\t$asset_info = var['asset_'||$asset];\n\t\t\t\trequire($asset_info, \"no such asset\");\n\t\t\t\tif ($bWithPriceAdjustment)\n\t\t\t\t\t$adjust_prices($asset, $asset_info, $state);\n\t\t\t}\n\t\t\t$r = $state.reserve;\n\t\t\t$c = $state.coef;\n\t\t\t$s = $bAsset0 ? $state.s0 : $asset_info.supply;\n\t\t\t$a = $bAsset0 ? $state.a0 : $asset_info.a;\n\t\t\t$p = $c*$c * $a * $s / $r;\n\t\t\t$p\n\t\t};\n\n\n\t\t$get_exchange_result_by_state = ($tokens, $delta_r, $asset, $asset_info, $state, $trigger_initial_address) => {\n\t\t\trequire($tokens > 0 AND $delta_r == 0 OR $tokens == 0 AND $delta_r > 0, \"invalid input\");\n\n\t\t\t$op = $tokens ? 'sell' : 'buy';\n\t\t\t$bAsset0 = $state.asset0 == $asset;\n\n\t\t\t$r = $state.reserve;\n\t\t\t$c = $state.coef;\n\t\t\t$a0 = $state.a0;\n\t\t\t$s = $bAsset0 ? $state.s0 : $asset_info.supply;\n\t\t\t$a = $bAsset0 ? $state.a0 : $asset_info.a;\n\t\t\t$p = $s ? $c*$c * $a * $s / $r : 0;\n\t\t//\tlog('p = ', $p);\n\t\t\t$bInitial = $bAsset0 AND ($r == 0);\n\n\t\t\t$key = 'last_'||$op;\n\t\t\t$last_trade = $bAsset0 ? $state[$key] : $asset_info[$key];\n\t\t\t$bMerge = (timestamp <= $last_trade.ts + $trade_merge_period AND $trigger_initial_address == $last_trade.address);\n\t\t\t$recent_tax = $bMerge ? $last_trade.tax : 0;\n\t\t\t$recent_delta_s = $bMerge ? $last_trade.delta_s : 0;\n\t\t\t$initial_p = $bMerge ? ($tokens ? max($p, $last_trade.initial_p) : min($p, $last_trade.initial_p)) : $p;\n\n\t\t\t$swap_fee_rate = $bInitial ? 0 : $get_swap_fee();\n\t\t\t$arb_profit_tax_rate = $bInitial ? 0 : $get_arb_profit_tax();\n\t\t\t$stakers_fee_share = $get_stakers_fee_share();\n\t\t\t$a0_fee_share = 1 - $stakers_fee_share;\n\n\t\t\t$get_new_s = ($new_r, $fee_rate) => sqrt($s*$s + ($new_r*$new_r - $r*$r)/$c/$c/$a * (1 - $fee_rate));\n\t\t\t$get_new_r = ($new_s, $fee_rate) => sqrt($r*$r + ($new_s*$new_s - $s*$s)*$c*$c*$a * (1 - $fee_rate));\n\n\t\t\tif ($tokens) { // selling tokens\n\t\t\t\t$delta_s = -$tokens;\n\t\t\t\t$new_s = $s - $tokens;\n\t\t\t\t$new_r1 = $get_new_r($new_s, $swap_fee_rate);\n\t\t\t\t$new_a1 = $bAsset0 ? ($a * $s*$s + ($new_r1*$new_r1 - $r*$r)/$c/$c)/$new_s/$new_s : $a;\n\t\t\t\t$new_p1 = $c*$c * $new_a1 * $new_s / $new_r1;\n\t\t\t\trequire($new_p1 < $p OR abs($new_p1 - $p)/$p < $swap_fee_rate, \"price should go down when selling, got \"||$p||\" => \"||$new_p1);\n\t\t\t\t$arb_profit_tax = $arb_profit_tax_rate * abs($initial_p - $new_p1) * ($tokens - $recent_delta_s) / 2 - $recent_tax;\n\t\t\t\trequire($arb_profit_tax >= 0, \"negative arb profit tax \"||$arb_profit_tax);\n\t\t\t\t$full_fee_rate = $swap_fee_rate + $arb_profit_tax/($r - $new_r1);\n\t\t\t\trequire($full_fee_rate < 1, \"fee would exceed 100%\");\n\t\t\t\t$new_r_gross = ceil($get_new_r($new_s, $full_fee_rate));\n\t\t\t\trequire($new_r_gross <= $r, \"r_gross would increase to \"||$new_r_gross);\n\t\t\t\t$new_r = ceil($get_new_r($new_s, $full_fee_rate * $a0_fee_share));\n\t\t\t\trequire($new_r <= $r, \"r would increase to \"||$new_r);\n\t\t\t\t$staker_fee = $new_r_gross - $new_r;\n\t\t\t\trequire($staker_fee >= 0, \"negative staker fee \"||$staker_fee);\n\t\t\t\t$payout = $r - $new_r_gross;\n\t\t\t\t$swap_fee = $swap_fee_rate * $payout;\n\t\t\t\t$total_fee = $swap_fee + $arb_profit_tax;\n\t\t\t//\t$new_r = $net_new_r + $swap_fee;\n\t\t\t}\n\t\t\telse { // buying tokens\n\t\t\t\t$new_r_gross = $r + $delta_r;\n\t\t\t\t$swap_fee = $swap_fee_rate * $delta_r;\n\t\t\t\t$new_s1 = $get_new_s($new_r_gross, $swap_fee_rate);\n\t\t\t//\tlog('new_s1 = ', $new_s1, 'delta', $new_s1 - $s);\n\t\t\t\t$new_a1 = $bAsset0 ? ($a * $s*$s + ($new_r_gross*$new_r_gross - $r*$r)/$c/$c)/$new_s1/$new_s1 : $a;\n\t\t\t\t$new_p1 = $c*$c * $new_a1 * $new_s1 / $new_r_gross;\n\t\t\t//\tlog('new_p1 = ', $new_p1, 'delta', $new_p1 - $p);\n\t\t\t\trequire($new_p1 > $p, \"price should go up when buying, got \"||$p||\" => \"||$new_p1);\n\t\t\t\t$arb_profit_tax = $arb_profit_tax_rate * ($new_p1 - $initial_p) * ($new_s1 - $s + $recent_delta_s) / 2 - $recent_tax;\n\t\t\t\trequire($arb_profit_tax >= 0, \"negative arb profit tax \"||$arb_profit_tax);\n\n\t\t\t\t$total_fee = $swap_fee + $arb_profit_tax;\n\t\t\t\t$staker_fee = floor($total_fee * $stakers_fee_share);\n\t\t\t\t$full_fee_rate = $swap_fee_rate + $arb_profit_tax/$delta_r;\n\t\t\t\trequire($full_fee_rate < 1, \"fee would exceed 100%\");\n\t\t\t\t$new_r = $new_r_gross - $staker_fee;\n\t\t\t\t$new_s = floor($get_new_s($new_r, $full_fee_rate * $a0_fee_share)); // rounding is like an additional fee\n\t\t\t//\tlog('new_s = ', $new_s);\n\t\t\t\t$delta_s = $new_s - $s;\n\t\t\t\trequire($delta_s >= 0, \"s would decrease by \"||$delta_s);\n\t\t\t}\n\t\t\t$state.a0 = $bAsset0\n\t\t\t\t? ($state.a0 * $s*$s + ($new_r*$new_r - $r*$r)/$c/$c)/$new_s/$new_s\n\t\t\t\t: $a0 + (($new_r*$new_r - $r*$r)/$c/$c - $a * ($new_s*$new_s - $s*$s))/$state.s0/$state.s0;\n\t\t\trequire($state.a0 >= $a0, \"a0 should grow \"||$a0||\" => \"||$state.a0);\n\n\t\t\t$state.reserve = $new_r;\n\t\t\tif ($bAsset0)\n\t\t\t\t$state.s0 = $new_s;\n\t\t\telse\n\t\t\t\t$asset_info.supply = $new_s;\n\t\t\t\n\t\t\t$new_p = $c*$c * $a * $new_s / $new_r; // fix\n\t\t//\tlog('new_p = ', $new_p);\n\t\t\t\n\t\t//\tif ($tokens)\n\t\t//\t\t$arb_profit_tax = $arb_profit_tax_rate * abs(($new_p - $p) * ($new_s - $s) / 2);\n\n\t\t\t$fee_percent = $total_fee / ($tokens ? $payout : $delta_r) * 100;\n\t\t\t$state.total_staker_fees = $state.total_staker_fees + $staker_fee;\n\n\t\t\tif ($bAsset0){\n\t\t\t\t$state[$key].delta_s = ($bMerge ? $last_trade.delta_s : 0) + $delta_s;\n\t\t\t\t$state[$key].initial_p = $initial_p;\n\t\t\t\t$state[$key].tax = $arb_profit_tax;\n\t\t\t\t$state[$key].ts = timestamp;\n\t\t\t\t$state[$key].address = $trigger_initial_address;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t$asset_info[$key].delta_s = ($bMerge ? $last_trade.delta_s : 0) + $delta_s;\n\t\t\t\t$asset_info[$key].initial_p = $initial_p;\n\t\t\t\t$asset_info[$key].tax = $arb_profit_tax;\n\t\t\t\t$asset_info[$key].ts = timestamp;\n\t\t\t\t$asset_info[$key].address = $trigger_initial_address;\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tpayout: $payout,\n\t\t\t\tdelta_s: $delta_s,\n\t\t\t\told_reserve: $r,\n\t\t\t\tnew_reserve: $new_r,\n\t\t\t\tdelta_reserve: $new_r - $r,\n\t\t\t\told_price: $p,\n\t\t\t\tnew_price: $new_p,\n\t\t\t\tswap_fee: $swap_fee,\n\t\t\t\tarb_profit_tax: $arb_profit_tax,\n\t\t\t\ttotal_fee: $total_fee,\n\t\t\t\tfee_percent: $fee_percent,\n\t\t\t}\n\t\t};\n\n\t\t$get_exchange_result = ($asset, $tokens, $delta_r) => {\n\t\t\t$state = var['state'];\n\t\t\tif ($asset != $state.asset0){\n\t\t\t\t$asset_info = var['asset_'||$asset];\n\t\t\t\trequire($asset_info, \"no such asset\");\n\t\t\t\t$adjust_prices($asset, $asset_info, $state);\n\t\t\t}\n\t\t\t$get_exchange_result_by_state($tokens, $delta_r, $asset, $asset_info, $state, 'ADDRESS')\n\t\t};\n\n\n\n\t}",
    "init": "{\n\n\t\t$reserve_asset = params.reserve_asset;\n\t\t\n\t\t// reserve\n\t\t$min_contribution = ($reserve_asset == 'base') ? 99999 : 0;\n\t\t$network_fee = ($reserve_asset == 'base') ? 1000 : 0;\n\n\t\t$state = var['state'];\n\n\t\t// tokens\n\t\t$asset = trigger.data.asset;\n\n\t\tif ($asset AND $asset != $state.asset0){\n\t\t\t$asset_info = var['asset_'||$asset];\n\t\t\trequire($asset_info, \"no such asset\");\n\t\t\t$adjust_prices($asset, $asset_info, $state);\n\t\t}\n\n\t\tif (trigger.data.to AND !is_valid_address(trigger.data.to))\n\t\t\tbounce(\"bad to address\");\n\t\t$to = trigger.data.to OTHERWISE trigger.address;\n\n\n\t\t$staking_base_aa = 'HPJQ6ZCB2T3JTIVAMDM5QESZWNJNJERO';\n\n\t}",
    "messages": {
      "cases": [
        {
          "if": "{ trigger.data.define AND !$state }",
          "init": "{\n\t\t\t\t\t$params = {aa: this_address};\n\t\t\t\t\tif (params.challenging_period)\n\t\t\t\t\t\t$params.challenging_period = params.challenging_period;\n\t\t\t\t\tif (params.max_term)\n\t\t\t\t\t\t$params.max_term = params.max_term;\n\t\t\t\t\tif (params.min_term)\n\t\t\t\t\t\t$params.min_term = params.min_term;\n\t\t\t\t\tif (params.decay_factor)\n\t\t\t\t\t\t$params.decay_factor = params.decay_factor;\n\t\t\t\t\tif (params.max_drift_rate)\n\t\t\t\t\t\t$params.max_drift_rate = params.max_drift_rate;\n\t\t\t\t\t$staking_aa = [\n\t\t\t\t\t\t'autonomous agent',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbase_aa: $staking_base_aa,\n\t\t\t\t\t\t\tparams: $params\n\t\t\t\t\t\t}\n\t\t\t\t\t];\n\t\t\t\t\t$staking_aa_address = chash160($staking_aa);\n\n\t\t\t\t}",
          "messages": [
            {
              "app": "asset",
              "payload": {
                "is_private": false,
                "is_transferrable": true,
                "auto_destroy": false,
                "fixed_denominations": false,
                "issued_by_definer_only": true,
                "cosigned_by_definer": false,
                "spender_attested": false
              }
            },
            {
              "app": "definition",
              "payload": {
                "definition": "{$staking_aa}"
              }
            },
            {
              "app": "payment",
              "payload": {
                "asset": "base",
                "outputs": [
                  {
                    "address": "{ $staking_aa_address }",
                    "amount": 1000
                  }
                ]
              }
            },
            {
              "app": "state",
              "state": "{\n\t\t\t\t\t\t\tvar['staking_aa'] = $staking_aa_address;\n\t\t\t\t\t\t\tvar['state'] = {asset0: response_unit, a0: 1, s0: 0, reserve: 0, coef: 1, total_staker_fees: 0};\n\t\t\t\t\t\t\tresponse['asset'] = response_unit;\n\t\t\t\t\t\t}"
            }
          ]
        },
        {
          "if": "{ trigger.address == var['staking_aa'] AND trigger.data.name }",
          "init": "{\n\t\t\t\t\t$name = trigger.data.name;\n\t\t\t\t\t$value = trigger.data.value;\n\t\t\t\t\tif ($name == 'add_price_aa'){\n\t\t\t\t\t\trequire($value == 'yes', \"can't remove asset\");\n\t\t\t\t\t\trequire(trigger.data.price_aa, \"no price_aa\");\n\t\t\t\t\t}\n\t\t\t\t\telse if ($name == 'change_price_aa' OR $name == 'change_drift_rate'){\n\t\t\t\t\t\trequire($asset, \"no asset\");\n\t\t\t\t\t\tif ($name == 'change_price_aa' AND $asset_info.price_aa)\n\t\t\t\t\t\t\tbounce(\"only preipo can set a price AA\");\n\t\t\t\t\t}\n\t\t\t\t\telse if ($name == 'add_preipo'){\n\t\t\t\t\t\trequire($value == 'yes', \"can't remove preipo\");\n\t\t\t\t\t\trequire(trigger.data.symbol, \"no symbol\");\n\t\t\t\t\t\trequire(trigger.data.initial_auction_price, \"no initial_auction_price\");\n\t\t\t\t\t\trequire(trigger.data.max_tokens, \"no max_tokens\");\n\t\t\t\t\t}\n\t\t\t\t\t$bAddNewAsset = ($name == 'add_price_aa' OR $name == 'add_preipo');\n\t\t\t\t}",
          "messages": [
            {
              "if": "{$bAddNewAsset}",
              "app": "asset",
              "payload": {
                "is_private": false,
                "is_transferrable": true,
                "auto_destroy": false,
                "fixed_denominations": false,
                "issued_by_definer_only": true,
                "cosigned_by_definer": false,
                "spender_attested": false
              }
            },
            {
              "if": "{$bAddNewAsset}",
              "app": "payment",
              "payload": {
                "asset": "base",
                "outputs": [
                  {
                    "address": "{trigger.address}",
                    "amount": 1000
                  }
                ]
              }
            },
            {
              "app": "state",
              "state": "{\n\t\t\t\t\t\t\tif ($bAddNewAsset){\n\t\t\t\t\t\t\t\tresponse['asset'] = response_unit;\n\t\t\t\t\t\t\t\t$a_info = { // start a presale\n\t\t\t\t\t\t\t\t//\tsupply: 0, \n\t\t\t\t\t\t\t\t//\ta: 1, \n\t\t\t\t\t\t\t\t\tlast_ts: timestamp, \n\t\t\t\t\t\t\t\t\tpresale: true, \n\t\t\t\t\t\t\t\t\tpresale_amount: 0, \n\t\t\t\t\t\t\t\t\tcreation_ts: timestamp,\n\t\t\t\t\t\t\t\t\tpresale_finish_ts: timestamp + $get_presale_period(),\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tif ($name == 'add_price_aa')\n\t\t\t\t\t\t\t\t\t$a_info.price_aa = trigger.data.price_aa;\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t$a_info.preipo = true;\n\t\t\t\t\t\t\t\t\t$a_info.symbol = trigger.data.symbol;\n\t\t\t\t\t\t\t\t\t$a_info.initial_auction_price = trigger.data.initial_auction_price;\n\t\t\t\t\t\t\t\t\t$a_info.last_auction_price = trigger.data.initial_auction_price;\n\t\t\t\t\t\t\t\t\t$a_info.max_tokens = trigger.data.max_tokens;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tvar['asset_'||response_unit] = $a_info;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if ($name == 'change_price_aa' OR $name == 'change_drift_rate'){\n\t\t\t\t\t\t\t\t$asset_info[$name == 'change_price_aa' ? 'price_aa' : 'drift_rate'] = $value;\n\t\t\t\t\t\t\t\tvar['asset_'||$asset] = $asset_info;\n\t\t\t\t\t\t\t\tvar['state'] = $state; // we adjusted prices since we had asset in trigger.data\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tvar[$name] = $value;\n\t\t\t\t\t\t}"
            }
          ]
        },
        {
          "if": "{trigger.data.withdraw_staker_fees AND trigger.address == var['staking_aa']}",
          "messages": [
            {
              "app": "payment",
              "payload": {
                "asset": "{$reserve_asset}",
                "outputs": [
                  {
                    "address": "{trigger.data.address}",
                    "amount": "{ trigger.data.amount }"
                  }
                ]
              }
            }
          ]
        },
        {
          "if": "{\n\t\t\t\t\tif (!($state AND $asset AND trigger.data.presale))\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t$in_amount = trigger.output[[asset=$reserve_asset]];\n\t\t\t\t\t$bAdd = $in_amount > $min_contribution;\n\t\t\t\t\t$bWithdraw = $in_amount <= $min_contribution AND is_integer(trigger.data.withdraw_amount) AND trigger.data.withdraw_amount > 0;\n\t\t\t\t\t$bAdd OR $bWithdraw\n\t\t\t\t}",
          "init": "{\n\t\t\t\t\trequire($asset_info.presale, \"already launched\");\n\t\t\t\t\trequire($asset_info.presale_finish_ts >= timestamp, \"presale finished\");\n\t\t\t\t\tif ($bAdd)\n\t\t\t\t\t\t$delta = $in_amount;\n\t\t\t\t\telse { // withdraw\n\t\t\t\t\t\t$contribution = var['contribution_'||trigger.address||'_'||$asset];\n\t\t\t\t\t\trequire(trigger.data.withdraw_amount <= $contribution, \"you have only \"||$contribution);\n\t\t\t\t\t\t$delta = -trigger.data.withdraw_amount;\n\t\t\t\t\t}\n\t\t\t\t}",
          "messages": [
            {
              "if": "{$bWithdraw}",
              "app": "payment",
              "payload": {
                "asset": "{$reserve_asset}",
                "outputs": [
                  {
                    "address": "{$to}",
                    "amount": "{ trigger.data.withdraw_amount }"
                  }
                ]
              }
            },
            {
              "app": "state",
              "state": "{\n\t\t\t\t\t\t\tvar['contribution_'||trigger.address||'_'||$asset] += $delta;\n\t\t\t\t\t\t\t$asset_info.presale_amount = $asset_info.presale_amount + $delta;\n\t\t\t\t\t\t\tif ($asset_info.preipo AND $bAdd)\n\t\t\t\t\t\t\t\t$asset_info.last_auction_price = $asset_info.initial_auction_price / 2^((timestamp - $asset_info.creation_ts)/$get_auction_price_halving_period());\n\t\t\t\t\t\t\tvar['asset_'||$asset] = $asset_info;\n\t\t\t\t\t\t}"
            }
          ]
        },
        {
          "if": "{ $state AND $asset AND trigger.data.claim }",
          "init": "{\n\t\t\t\t\trequire(!$asset_info.presale, \"not launched yet\");\n\t\t\t\t\t$contribution = var['contribution_'||trigger.address||'_'||$asset];\n\t\t\t\t\trequire($contribution, \"you had no contribution or already paid\");\n\t\t\t\t}",
          "messages": [
            {
              "app": "payment",
              "payload": {
                "asset": "{$asset}",
                "outputs": [
                  {
                    "address": "{$to}",
                    "amount": "{ floor($contribution / $asset_info.initial_price) }"
                  }
                ]
              }
            },
            {
              "app": "state",
              "state": "{\n\t\t\t\t\t\t\tvar['contribution_'||trigger.address||'_'||$asset] = false;\n\t\t\t\t\t\t\tvar['asset_'||$asset] = $asset_info; // modified if we finished the presale or the price moved\n\t\t\t\t\t\t\tvar['state'] = $state;\n\t\t\t\t\t\t}"
            }
          ]
        },
        {
          "if": "{ $state AND $asset AND (trigger.output[[asset=$reserve_asset]] > $min_contribution OR trigger.output[[asset=$asset]] > 0) }",
          "init": "{\n\t\t\t\t\t$tokens = trigger.output[[asset=$asset]];\n\t\t\t\t\tif ($tokens){\n\t\t\t\t\t\trequire(trigger.output[[asset=$reserve_asset]] <= $min_contribution, \"don't send the reserve when redeeming tokens\");\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t$reserve_asset_amount = $tokens ? 0 : trigger.output[[asset=$reserve_asset]] - $network_fee; // subtract a fee to compensate for network fees\n\t\t\t\t\t\n\t\t\t\t\t$res = $get_exchange_result_by_state($tokens, $reserve_asset_amount, $asset, $asset_info, $state, trigger.initial_address);\n\t\t\t\t\t\n\t\t\t\t\tresponse['price'] = $res.new_price;\n\t\t\t\t\tresponse['swap_fee'] = $res.swap_fee;\n\t\t\t\t\tresponse['arb_profit_tax'] = $res.arb_profit_tax;\n\t\t\t\t\tresponse['total_fee'] = $res.total_fee;\n\n\t\t\t\t\tif ($res.payout AND $res.payout < 0)\n\t\t\t\t\t\tbounce(\"unexpected payout < 0\");\n\t\t\t\t\tif ($res.payout AND trigger.data.min_reserve_tokens AND $res.payout < trigger.data.min_reserve_tokens)\n\t\t\t\t\t\tbounce(\"payout would be only \" || $res.payout);\n\t\t\t\t\tif (trigger.data.max_fee_percent AND $res.fee_percent > trigger.data.max_fee_percent)\n\t\t\t\t\t\tbounce(\"fee would be \" || $res.fee_percent || '%');\n\t\t\t\t\t\n\t\t\t\t\t// further hops\n\t\t\t\t\t$hops = trigger.data.hops;\n\t\t\t\t\t$address = $hops[0].address OTHERWISE $to;\n\t\t\t\t\trequire($address != var['staking_aa'], \"sending to staking AA not allowed\"); // not necessary now\n\t\t\t\t\tif ($hops){\n\t\t\t\t\t\t$data_for_next_hop = $hops[0].data;\n\t\t\t\t\t\tdelete($hops, 0); // remove the head hop\n\t\t\t\t\t\tif ($data_for_next_hop OR length($hops)){\n\t\t\t\t\t\t\t$forwarded_data = $data_for_next_hop OTHERWISE {};\n\t\t\t\t\t\t\tif (length($hops))\n\t\t\t\t\t\t\t\t$forwarded_data.hops = $hops;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t}",
          "messages": [
            {
              "if": "{$res.delta_s > 0}",
              "app": "payment",
              "payload": {
                "asset": "{$asset}",
                "outputs": [
                  {
                    "address": "{$address}",
                    "amount": "{ $res.delta_s }"
                  }
                ]
              }
            },
            {
              "app": "payment",
              "payload": {
                "asset": "{$reserve_asset}",
                "outputs": [
                  {
                    "address": "{$address}",
                    "amount": "{$res.payout}",
                    "if": "{$res.payout}"
                  }
                ]
              }
            },
            {
              "if": "{$forwarded_data}",
              "app": "data",
              "payload": "{$forwarded_data}"
            },
            {
              "app": "state",
              "state": "{\n\t\t\t\t\t\t\tif ($asset != $state.asset0)\n\t\t\t\t\t\t\t\tvar['asset_'||$asset] = $asset_info;\n\t\t\t\t\t\t\tvar['state'] = $state;\n\t\t\t\t\t\t\tresponse['fee%'] = round($res.fee_percent, 4) || '%';\n\t\t\t\t\t\t}"
            }
          ]
        }
      ]
    }
  }
]

Response getDefinitions

{
  "A336I77COVXUCN3L2YOYVIZF7PKMFCAV": [
    "autonomous agent",
    {
      "doc_url": "https://pyth.ooo/perpetual.json",
      "getters": "{\n\n\t\t$trade_merge_period = 1; // seconds\n\n\t\t$get_param = ($name, $default) => {\n\t\t\t$value = var[$name];\n\t\t\texists($value) ? $value : (exists(params[$name]) ? params[$name] : $default)\n\t\t};\n\n\t\t$get_swap_fee = () => $get_param('swap_fee', 0.003);\n\t\t$get_arb_profit_tax = () => $get_param('arb_profit_tax', 0.9);\n\t\t$get_adjustment_period = () => $get_param('adjustment_period', 3 * 24 * 3600); // 3 days\n\t\t$get_presale_period = () => $get_param('presale_period', 14 * 24 * 3600); // 14 days\n\t\t$get_auction_price_halving_period = () => $get_param('auction_price_halving_period', 3 * 24 * 3600); // 3 days\n\t\t$get_token_share_threshold = () => $get_param('token_share_threshold', 0.1); // 10%\n\t\t$get_min_s0_share = () => $get_param('min_s0_share', 0.01); // 1%\n\t\t$get_stakers_fee_share = () => $get_param('stakers_fee_share', 0.5); // 50%\n\t\t$get_reserve_price_aa = () => $get_param('reserve_price_aa');\n\n\t\t$pow2 = $x => $x*$x;\n\t\t\n\t\t$adjust_prices = ($asset, $asset_info, $state) => {\n\t\t\tif ($state.asset0 == $asset)\n\t\t\t\treturn;\n\t\t\t\n\t\t\t$elapsed = timestamp - $asset_info.last_ts;\n\t\t\t$asset_info.last_ts = timestamp;\n\n\t\t\tif ($asset_info.presale AND $asset_info.preipo){\n\t\t\t\t$target_price = $asset_info.last_auction_price;\n\t\t\t}\n\t\t\telse{\n\t\t\t\t$price_aa = $asset_info.price_aa;\n\t\t\t\tif (!$price_aa)\n\t\t\t\t\treturn;\n\t\t\t\t// $target_price is in terms of the reserve currency.\n\t\t\t\t// Both $get_target_price() and $get_reserve_price() return prices in USD (or some other common currency)\n\t\t\t\t$target_price = $price_aa#3.$get_target_price() / $get_reserve_price_aa()#8.$get_reserve_price();\n\t\t\t\tif (typeof($target_price) != 'number' OR $target_price < 0)\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif ($asset_info.presale){\n\t\t\t\tif (\n\t\t\t\t\t$asset_info.presale_amount\n\t\t\t\t\tAND (\n\t\t\t\t\t\ttimestamp >= $asset_info.presale_finish_ts \n\t\t\t\t\t\tOR $asset_info.presale_amount >= $get_token_share_threshold() * $state.reserve\n\t\t\t\t\t\t// we can exceed max_tokens\n\t\t\t\t\t\tOR $asset_info.preipo AND $asset_info.presale_amount / $target_price >= $asset_info.max_tokens\n\t\t\t\t\t)\n\t\t\t\t){ // add the reserve and launch trading\n\t\t\t\t\tdelete($asset_info, 'presale');\n\t\t\t\t\t$asset_info.initial_price = $target_price;\n\t\t\t\t\t$asset_info.supply = floor($asset_info.presale_amount / $target_price);\n\t\t\t\t\t$asset_info.a = $pow2($target_price / $state.coef) * $state.reserve/$asset_info.presale_amount;\n\t\t\t\t\t$new_reserve = $state.reserve + $asset_info.presale_amount;\n\t\t\t\t\t$state.coef = $state.coef * sqrt($new_reserve/$state.reserve);\n\t\t\t\t\t$state.reserve = $new_reserve;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$r = $state.reserve;\n\t\t\t$c = $state.coef;\n\t\t\t$s = $asset_info.supply;\n\t\t\t$a = $asset_info.a;\n\t\t\t$p = $c*$c * $a * $s / $r;\n\t\t\t$s0 = $state.s0;\n\n\t\t\tif (!$s)\n\t\t\t\treturn;\n\n\t\t\t$full_delta_p = $target_price - $p;\n\t\t\t$adjustment_period = $get_adjustment_period();\n\t\t\t$delta_p = $elapsed >= $adjustment_period ? $full_delta_p : $elapsed/$adjustment_period*$full_delta_p;\n\n\t\t//\t$delta_a = $a * $delta_p/$p; // >= -$a\n\t\t//\t$asset_info.a = $asset_info.a + $delta_a; // stays positive\n\t\t//\t$state.coef = $c / sqrt(1 + $delta_a * $pow2($s * $c / $r));\n\n\t\t\t$new_c = $c * sqrt(1 - $s * $r * $delta_p / ($r*$r - $a * $pow2($c * $s)));\n\t\t\trequire(($new_c - $c) * $delta_p <= 0, \"c should change opposite to p\");\n\t\t\t$new_a = ($p + $delta_p) * $r / $new_c/$new_c / $s;\n\t\t\trequire(($new_a - $a) * $delta_p >= 0, \"a should change as p\");\n\t\t\t$asset_info.a = $new_a;\n\t\t\t$state.coef = $new_c;\n\n\t\t\t// apply drift that slowly depreciates p and moves the wealth to s0 holders\n\t\t\tif ($asset_info.drift_rate){\n\t\t\t\t$relative_price_drift = $elapsed/360/24/3600 * $asset_info.drift_rate;\n\t\t\t\tif ($relative_price_drift < 1){\n\t\t\t\t\t$asset_info.a = $asset_info.a * (1 - $relative_price_drift);\n\t\t\t\t\t$state.a0 = $state.a0 + $pow2($s/$s0) * $asset_info.a * $relative_price_drift;\n\t\t\t\t\trequire($state.a0 > 0, \"a0 would become negative\");\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t// keeping s0 share above some minimum\n\t\t\t$a0 = $state.a0;\n\t\t\t$c1 = $state.coef;\n\t\t\t$s0_share = $a0 * $pow2($s0 * $c1 / $r);\n\t\t\t$min_s0_share = $get_min_s0_share();\n\t\t\tif ($s0_share < $min_s0_share){\n\t\t\t\t$new_a0 = ($pow2($r/$c1/$s0) - $a0) / (1/$min_s0_share - 1);\n\t\t\t\t$new_c2 = $r/$s0 * sqrt($min_s0_share/$new_a0);\n\t\t\t\trequire($new_a0 > $a0, \"a0 should grow\");\n\t\t\t\trequire($new_c2 < $c, \"c should fall\");\n\t\t\t\t$state.a0 = $new_a0;\n\t\t\t\t$state.coef = $new_c;\n\t\t\t}\n\t\t};\n\n\n\t\t$get_auction_price = ($asset) => {\n\t\t\t$state = var['state'];\n\t\t\t$asset_info = var['asset_'||$asset];\n\t\t\trequire($asset_info, \"no such asset\");\n\t\t\trequire($asset_info.preipo, \"not a pre-IPO\");\n\t\t\t$asset_info.initial_auction_price / 2^((timestamp - $asset_info.creation_ts)/$get_auction_price_halving_period())\n\t\t};\n\n\t\t$get_price = ($asset, $bWithPriceAdjustment) => {\n\t\t\t$state = var['state'];\n\t\t\t$bAsset0 = $state.asset0 == $asset;\n\t\t\tif (!$bAsset0) {\n\t\t\t\t$asset_info = var['asset_'||$asset];\n\t\t\t\trequire($asset_info, \"no such asset\");\n\t\t\t\tif ($bWithPriceAdjustment)\n\t\t\t\t\t$adjust_prices($asset, $asset_info, $state);\n\t\t\t}\n\t\t\t$r = $state.reserve;\n\t\t\t$c = $state.coef;\n\t\t\t$s = $bAsset0 ? $state.s0 : $asset_info.supply;\n\t\t\t$a = $bAsset0 ? $state.a0 : $asset_info.a;\n\t\t\t$p = $c*$c * $a * $s / $r;\n\t\t\t$p\n\t\t};\n\n\n\t\t$get_exchange_result_by_state = ($tokens, $delta_r, $asset, $asset_info, $state, $trigger_initial_address) => {\n\t\t\trequire($tokens > 0 AND $delta_r == 0 OR $tokens == 0 AND $delta_r > 0, \"invalid input\");\n\n\t\t\t$op = $tokens ? 'sell' : 'buy';\n\t\t\t$bAsset0 = $state.asset0 == $asset;\n\n\t\t\t$r = $state.reserve;\n\t\t\t$c = $state.coef;\n\t\t\t$a0 = $state.a0;\n\t\t\t$s = $bAsset0 ? $state.s0 : $asset_info.supply;\n\t\t\t$a = $bAsset0 ? $state.a0 : $asset_info.a;\n\t\t\t$p = $s ? $c*$c * $a * $s / $r : 0;\n\t\t//\tlog('p = ', $p);\n\t\t\t$bInitial = $bAsset0 AND ($r == 0);\n\n\t\t\t$key = 'last_'||$op;\n\t\t\t$last_trade = $bAsset0 ? $state[$key] : $asset_info[$key];\n\t\t\t$bMerge = (timestamp <= $last_trade.ts + $trade_merge_period AND $trigger_initial_address == $last_trade.address);\n\t\t\t$recent_tax = $bMerge ? $last_trade.tax : 0;\n\t\t\t$recent_delta_s = $bMerge ? $last_trade.delta_s : 0;\n\t\t\t$initial_p = $bMerge ? ($tokens ? max($p, $last_trade.initial_p) : min($p, $last_trade.initial_p)) : $p;\n\n\t\t\t$swap_fee_rate = $bInitial ? 0 : $get_swap_fee();\n\t\t\t$arb_profit_tax_rate = $bInitial ? 0 : $get_arb_profit_tax();\n\t\t\t$stakers_fee_share = $get_stakers_fee_share();\n\t\t\t$a0_fee_share = 1 - $stakers_fee_share;\n\n\t\t\t$get_new_s = ($new_r, $fee_rate) => sqrt($s*$s + ($new_r*$new_r - $r*$r)/$c/$c/$a * (1 - $fee_rate));\n\t\t\t$get_new_r = ($new_s, $fee_rate) => sqrt($r*$r + ($new_s*$new_s - $s*$s)*$c*$c*$a * (1 - $fee_rate));\n\n\t\t\tif ($tokens) { // selling tokens\n\t\t\t\t$delta_s = -$tokens;\n\t\t\t\t$new_s = $s - $tokens;\n\t\t\t\t$new_r1 = $get_new_r($new_s, $swap_fee_rate);\n\t\t\t\t$new_a1 = $bAsset0 ? ($a * $s*$s + ($new_r1*$new_r1 - $r*$r)/$c/$c)/$new_s/$new_s : $a;\n\t\t\t\t$new_p1 = $c*$c * $new_a1 * $new_s / $new_r1;\n\t\t\t\trequire($new_p1 < $p OR abs($new_p1 - $p)/$p < $swap_fee_rate, \"price should go down when selling, got \"||$p||\" => \"||$new_p1);\n\t\t\t\t$arb_profit_tax = $arb_profit_tax_rate * abs($initial_p - $new_p1) * ($tokens - $recent_delta_s) / 2 - $recent_tax;\n\t\t\t\trequire($arb_profit_tax >= 0, \"negative arb profit tax \"||$arb_profit_tax);\n\t\t\t\t$full_fee_rate = $swap_fee_rate + $arb_profit_tax/($r - $new_r1);\n\t\t\t\trequire($full_fee_rate < 1, \"fee would exceed 100%\");\n\t\t\t\t$new_r_gross = ceil($get_new_r($new_s, $full_fee_rate));\n\t\t\t\trequire($new_r_gross <= $r, \"r_gross would increase to \"||$new_r_gross);\n\t\t\t\t$new_r = ceil($get_new_r($new_s, $full_fee_rate * $a0_fee_share));\n\t\t\t\trequire($new_r <= $r, \"r would increase to \"||$new_r);\n\t\t\t\t$staker_fee = $new_r_gross - $new_r;\n\t\t\t\trequire($staker_fee >= 0, \"negative staker fee \"||$staker_fee);\n\t\t\t\t$payout = $r - $new_r_gross;\n\t\t\t\t$swap_fee = $swap_fee_rate * $payout;\n\t\t\t\t$total_fee = $swap_fee + $arb_profit_tax;\n\t\t\t//\t$new_r = $net_new_r + $swap_fee;\n\t\t\t}\n\t\t\telse { // buying tokens\n\t\t\t\t$new_r_gross = $r + $delta_r;\n\t\t\t\t$swap_fee = $swap_fee_rate * $delta_r;\n\t\t\t\t$new_s1 = $get_new_s($new_r_gross, $swap_fee_rate);\n\t\t\t//\tlog('new_s1 = ', $new_s1, 'delta', $new_s1 - $s);\n\t\t\t\t$new_a1 = $bAsset0 ? ($a * $s*$s + ($new_r_gross*$new_r_gross - $r*$r)/$c/$c)/$new_s1/$new_s1 : $a;\n\t\t\t\t$new_p1 = $c*$c * $new_a1 * $new_s1 / $new_r_gross;\n\t\t\t//\tlog('new_p1 = ', $new_p1, 'delta', $new_p1 - $p);\n\t\t\t\trequire($new_p1 > $p, \"price should go up when buying, got \"||$p||\" => \"||$new_p1);\n\t\t\t\t$arb_profit_tax = $arb_profit_tax_rate * ($new_p1 - $initial_p) * ($new_s1 - $s + $recent_delta_s) / 2 - $recent_tax;\n\t\t\t\trequire($arb_profit_tax >= 0, \"negative arb profit tax \"||$arb_profit_tax);\n\n\t\t\t\t$total_fee = $swap_fee + $arb_profit_tax;\n\t\t\t\t$staker_fee = floor($total_fee * $stakers_fee_share);\n\t\t\t\t$full_fee_rate = $swap_fee_rate + $arb_profit_tax/$delta_r;\n\t\t\t\trequire($full_fee_rate < 1, \"fee would exceed 100%\");\n\t\t\t\t$new_r = $new_r_gross - $staker_fee;\n\t\t\t\t$new_s = floor($get_new_s($new_r, $full_fee_rate * $a0_fee_share)); // rounding is like an additional fee\n\t\t\t//\tlog('new_s = ', $new_s);\n\t\t\t\t$delta_s = $new_s - $s;\n\t\t\t\trequire($delta_s >= 0, \"s would decrease by \"||$delta_s);\n\t\t\t}\n\t\t\t$state.a0 = $bAsset0\n\t\t\t\t? ($state.a0 * $s*$s + ($new_r*$new_r - $r*$r)/$c/$c)/$new_s/$new_s\n\t\t\t\t: $a0 + (($new_r*$new_r - $r*$r)/$c/$c - $a * ($new_s*$new_s - $s*$s))/$state.s0/$state.s0;\n\t\t\trequire($state.a0 >= $a0, \"a0 should grow \"||$a0||\" => \"||$state.a0);\n\n\t\t\t$state.reserve = $new_r;\n\t\t\tif ($bAsset0)\n\t\t\t\t$state.s0 = $new_s;\n\t\t\telse\n\t\t\t\t$asset_info.supply = $new_s;\n\t\t\t\n\t\t\t$new_p = $c*$c * $a * $new_s / $new_r; // fix\n\t\t//\tlog('new_p = ', $new_p);\n\t\t\t\n\t\t//\tif ($tokens)\n\t\t//\t\t$arb_profit_tax = $arb_profit_tax_rate * abs(($new_p - $p) * ($new_s - $s) / 2);\n\n\t\t\t$fee_percent = $total_fee / ($tokens ? $payout : $delta_r) * 100;\n\t\t\t$state.total_staker_fees = $state.total_staker_fees + $staker_fee;\n\n\t\t\tif ($bAsset0){\n\t\t\t\t$state[$key].delta_s = ($bMerge ? $last_trade.delta_s : 0) + $delta_s;\n\t\t\t\t$state[$key].initial_p = $initial_p;\n\t\t\t\t$state[$key].tax = $arb_profit_tax;\n\t\t\t\t$state[$key].ts = timestamp;\n\t\t\t\t$state[$key].address = $trigger_initial_address;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t$asset_info[$key].delta_s = ($bMerge ? $last_trade.delta_s : 0) + $delta_s;\n\t\t\t\t$asset_info[$key].initial_p = $initial_p;\n\t\t\t\t$asset_info[$key].tax = $arb_profit_tax;\n\t\t\t\t$asset_info[$key].ts = timestamp;\n\t\t\t\t$asset_info[$key].address = $trigger_initial_address;\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tpayout: $payout,\n\t\t\t\tdelta_s: $delta_s,\n\t\t\t\told_reserve: $r,\n\t\t\t\tnew_reserve: $new_r,\n\t\t\t\tdelta_reserve: $new_r - $r,\n\t\t\t\told_price: $p,\n\t\t\t\tnew_price: $new_p,\n\t\t\t\tswap_fee: $swap_fee,\n\t\t\t\tarb_profit_tax: $arb_profit_tax,\n\t\t\t\ttotal_fee: $total_fee,\n\t\t\t\tfee_percent: $fee_percent,\n\t\t\t}\n\t\t};\n\n\t\t$get_exchange_result = ($asset, $tokens, $delta_r) => {\n\t\t\t$state = var['state'];\n\t\t\tif ($asset != $state.asset0){\n\t\t\t\t$asset_info = var['asset_'||$asset];\n\t\t\t\trequire($asset_info, \"no such asset\");\n\t\t\t\t$adjust_prices($asset, $asset_info, $state);\n\t\t\t}\n\t\t\t$get_exchange_result_by_state($tokens, $delta_r, $asset, $asset_info, $state, 'ADDRESS')\n\t\t};\n\n\n\n\t}",
      "init": "{\n\n\t\t$reserve_asset = params.reserve_asset;\n\t\t\n\t\t// reserve\n\t\t$min_contribution = ($reserve_asset == 'base') ? 99999 : 0;\n\t\t$network_fee = ($reserve_asset == 'base') ? 1000 : 0;\n\n\t\t$state = var['state'];\n\n\t\t// tokens\n\t\t$asset = trigger.data.asset;\n\n\t\tif ($asset AND $asset != $state.asset0){\n\t\t\t$asset_info = var['asset_'||$asset];\n\t\t\trequire($asset_info, \"no such asset\");\n\t\t\t$adjust_prices($asset, $asset_info, $state);\n\t\t}\n\n\t\tif (trigger.data.to AND !is_valid_address(trigger.data.to))\n\t\t\tbounce(\"bad to address\");\n\t\t$to = trigger.data.to OTHERWISE trigger.address;\n\n\n\t\t$staking_base_aa = 'HPJQ6ZCB2T3JTIVAMDM5QESZWNJNJERO';\n\n\t}",
      "messages": {
        "cases": [
          {
            "if": "{ trigger.data.define AND !$state }",
            "init": "{\n\t\t\t\t\t$params = {aa: this_address};\n\t\t\t\t\tif (params.challenging_period)\n\t\t\t\t\t\t$params.challenging_period = params.challenging_period;\n\t\t\t\t\tif (params.max_term)\n\t\t\t\t\t\t$params.max_term = params.max_term;\n\t\t\t\t\tif (params.min_term)\n\t\t\t\t\t\t$params.min_term = params.min_term;\n\t\t\t\t\tif (params.decay_factor)\n\t\t\t\t\t\t$params.decay_factor = params.decay_factor;\n\t\t\t\t\tif (params.max_drift_rate)\n\t\t\t\t\t\t$params.max_drift_rate = params.max_drift_rate;\n\t\t\t\t\t$staking_aa = [\n\t\t\t\t\t\t'autonomous agent',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbase_aa: $staking_base_aa,\n\t\t\t\t\t\t\tparams: $params\n\t\t\t\t\t\t}\n\t\t\t\t\t];\n\t\t\t\t\t$staking_aa_address = chash160($staking_aa);\n\n\t\t\t\t}",
            "messages": [
              {
                "app": "asset",
                "payload": {
                  "is_private": false,
                  "is_transferrable": true,
                  "auto_destroy": false,
                  "fixed_denominations": false,
                  "issued_by_definer_only": true,
                  "cosigned_by_definer": false,
                  "spender_attested": false
                }
              },
              {
                "app": "definition",
                "payload": {
                  "definition": "{$staking_aa}"
                }
              },
              {
                "app": "payment",
                "payload": {
                  "asset": "base",
                  "outputs": [
                    {
                      "address": "{ $staking_aa_address }",
                      "amount": 1000
                    }
                  ]
                }
              },
              {
                "app": "state",
                "state": "{\n\t\t\t\t\t\t\tvar['staking_aa'] = $staking_aa_address;\n\t\t\t\t\t\t\tvar['state'] = {asset0: response_unit, a0: 1, s0: 0, reserve: 0, coef: 1, total_staker_fees: 0};\n\t\t\t\t\t\t\tresponse['asset'] = response_unit;\n\t\t\t\t\t\t}"
              }
            ]
          },
          {
            "if": "{ trigger.address == var['staking_aa'] AND trigger.data.name }",
            "init": "{\n\t\t\t\t\t$name = trigger.data.name;\n\t\t\t\t\t$value = trigger.data.value;\n\t\t\t\t\tif ($name == 'add_price_aa'){\n\t\t\t\t\t\trequire($value == 'yes', \"can't remove asset\");\n\t\t\t\t\t\trequire(trigger.data.price_aa, \"no price_aa\");\n\t\t\t\t\t}\n\t\t\t\t\telse if ($name == 'change_price_aa' OR $name == 'change_drift_rate'){\n\t\t\t\t\t\trequire($asset, \"no asset\");\n\t\t\t\t\t\tif ($name == 'change_price_aa' AND $asset_info.price_aa)\n\t\t\t\t\t\t\tbounce(\"only preipo can set a price AA\");\n\t\t\t\t\t}\n\t\t\t\t\telse if ($name == 'add_preipo'){\n\t\t\t\t\t\trequire($value == 'yes', \"can't remove preipo\");\n\t\t\t\t\t\trequire(trigger.data.symbol, \"no symbol\");\n\t\t\t\t\t\trequire(trigger.data.initial_auction_price, \"no initial_auction_price\");\n\t\t\t\t\t\trequire(trigger.data.max_tokens, \"no max_tokens\");\n\t\t\t\t\t}\n\t\t\t\t\t$bAddNewAsset = ($name == 'add_price_aa' OR $name == 'add_preipo');\n\t\t\t\t}",
            "messages": [
              {
                "if": "{$bAddNewAsset}",
                "app": "asset",
                "payload": {
                  "is_private": false,
                  "is_transferrable": true,
                  "auto_destroy": false,
                  "fixed_denominations": false,
                  "issued_by_definer_only": true,
                  "cosigned_by_definer": false,
                  "spender_attested": false
                }
              },
              {
                "if": "{$bAddNewAsset}",
                "app": "payment",
                "payload": {
                  "asset": "base",
                  "outputs": [
                    {
                      "address": "{trigger.address}",
                      "amount": 1000
                    }
                  ]
                }
              },
              {
                "app": "state",
                "state": "{\n\t\t\t\t\t\t\tif ($bAddNewAsset){\n\t\t\t\t\t\t\t\tresponse['asset'] = response_unit;\n\t\t\t\t\t\t\t\t$a_info = { // start a presale\n\t\t\t\t\t\t\t\t//\tsupply: 0, \n\t\t\t\t\t\t\t\t//\ta: 1, \n\t\t\t\t\t\t\t\t\tlast_ts: timestamp, \n\t\t\t\t\t\t\t\t\tpresale: true, \n\t\t\t\t\t\t\t\t\tpresale_amount: 0, \n\t\t\t\t\t\t\t\t\tcreation_ts: timestamp,\n\t\t\t\t\t\t\t\t\tpresale_finish_ts: timestamp + $get_presale_period(),\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tif ($name == 'add_price_aa')\n\t\t\t\t\t\t\t\t\t$a_info.price_aa = trigger.data.price_aa;\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t$a_info.preipo = true;\n\t\t\t\t\t\t\t\t\t$a_info.symbol = trigger.data.symbol;\n\t\t\t\t\t\t\t\t\t$a_info.initial_auction_price = trigger.data.initial_auction_price;\n\t\t\t\t\t\t\t\t\t$a_info.last_auction_price = trigger.data.initial_auction_price;\n\t\t\t\t\t\t\t\t\t$a_info.max_tokens = trigger.data.max_tokens;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tvar['asset_'||response_unit] = $a_info;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if ($name == 'change_price_aa' OR $name == 'change_drift_rate'){\n\t\t\t\t\t\t\t\t$asset_info[$name == 'change_price_aa' ? 'price_aa' : 'drift_rate'] = $value;\n\t\t\t\t\t\t\t\tvar['asset_'||$asset] = $asset_info;\n\t\t\t\t\t\t\t\tvar['state'] = $state; // we adjusted prices since we had asset in trigger.data\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tvar[$name] = $value;\n\t\t\t\t\t\t}"
              }
            ]
          },
          {
            "if": "{trigger.data.withdraw_staker_fees AND trigger.address == var['staking_aa']}",
            "messages": [
              {
                "app": "payment",
                "payload": {
                  "asset": "{$reserve_asset}",
                  "outputs": [
                    {
                      "address": "{trigger.data.address}",
                      "amount": "{ trigger.data.amount }"
                    }
                  ]
                }
              }
            ]
          },
          {
            "if": "{\n\t\t\t\t\tif (!($state AND $asset AND trigger.data.presale))\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t$in_amount = trigger.output[[asset=$reserve_asset]];\n\t\t\t\t\t$bAdd = $in_amount > $min_contribution;\n\t\t\t\t\t$bWithdraw = $in_amount <= $min_contribution AND is_integer(trigger.data.withdraw_amount) AND trigger.data.withdraw_amount > 0;\n\t\t\t\t\t$bAdd OR $bWithdraw\n\t\t\t\t}",
            "init": "{\n\t\t\t\t\trequire($asset_info.presale, \"already launched\");\n\t\t\t\t\trequire($asset_info.presale_finish_ts >= timestamp, \"presale finished\");\n\t\t\t\t\tif ($bAdd)\n\t\t\t\t\t\t$delta = $in_amount;\n\t\t\t\t\telse { // withdraw\n\t\t\t\t\t\t$contribution = var['contribution_'||trigger.address||'_'||$asset];\n\t\t\t\t\t\trequire(trigger.data.withdraw_amount <= $contribution, \"you have only \"||$contribution);\n\t\t\t\t\t\t$delta = -trigger.data.withdraw_amount;\n\t\t\t\t\t}\n\t\t\t\t}",
            "messages": [
              {
                "if": "{$bWithdraw}",
                "app": "payment",
                "payload": {
                  "asset": "{$reserve_asset}",
                  "outputs": [
                    {
                      "address": "{$to}",
                      "amount": "{ trigger.data.withdraw_amount }"
                    }
                  ]
                }
              },
              {
                "app": "state",
                "state": "{\n\t\t\t\t\t\t\tvar['contribution_'||trigger.address||'_'||$asset] += $delta;\n\t\t\t\t\t\t\t$asset_info.presale_amount = $asset_info.presale_amount + $delta;\n\t\t\t\t\t\t\tif ($asset_info.preipo AND $bAdd)\n\t\t\t\t\t\t\t\t$asset_info.last_auction_price = $asset_info.initial_auction_price / 2^((timestamp - $asset_info.creation_ts)/$get_auction_price_halving_period());\n\t\t\t\t\t\t\tvar['asset_'||$asset] = $asset_info;\n\t\t\t\t\t\t}"
              }
            ]
          },
          {
            "if": "{ $state AND $asset AND trigger.data.claim }",
            "init": "{\n\t\t\t\t\trequire(!$asset_info.presale, \"not launched yet\");\n\t\t\t\t\t$contribution = var['contribution_'||trigger.address||'_'||$asset];\n\t\t\t\t\trequire($contribution, \"you had no contribution or already paid\");\n\t\t\t\t}",
            "messages": [
              {
                "app": "payment",
                "payload": {
                  "asset": "{$asset}",
                  "outputs": [
                    {
                      "address": "{$to}",
                      "amount": "{ floor($contribution / $asset_info.initial_price) }"
                    }
                  ]
                }
              },
              {
                "app": "state",
                "state": "{\n\t\t\t\t\t\t\tvar['contribution_'||trigger.address||'_'||$asset] = false;\n\t\t\t\t\t\t\tvar['asset_'||$asset] = $asset_info; // modified if we finished the presale or the price moved\n\t\t\t\t\t\t\tvar['state'] = $state;\n\t\t\t\t\t\t}"
              }
            ]
          },
          {
            "if": "{ $state AND $asset AND (trigger.output[[asset=$reserve_asset]] > $min_contribution OR trigger.output[[asset=$asset]] > 0) }",
            "init": "{\n\t\t\t\t\t$tokens = trigger.output[[asset=$asset]];\n\t\t\t\t\tif ($tokens){\n\t\t\t\t\t\trequire(trigger.output[[asset=$reserve_asset]] <= $min_contribution, \"don't send the reserve when redeeming tokens\");\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t$reserve_asset_amount = $tokens ? 0 : trigger.output[[asset=$reserve_asset]] - $network_fee; // subtract a fee to compensate for network fees\n\t\t\t\t\t\n\t\t\t\t\t$res = $get_exchange_result_by_state($tokens, $reserve_asset_amount, $asset, $asset_info, $state, trigger.initial_address);\n\t\t\t\t\t\n\t\t\t\t\tresponse['price'] = $res.new_price;\n\t\t\t\t\tresponse['swap_fee'] = $res.swap_fee;\n\t\t\t\t\tresponse['arb_profit_tax'] = $res.arb_profit_tax;\n\t\t\t\t\tresponse['total_fee'] = $res.total_fee;\n\n\t\t\t\t\tif ($res.payout AND $res.payout < 0)\n\t\t\t\t\t\tbounce(\"unexpected payout < 0\");\n\t\t\t\t\tif ($res.payout AND trigger.data.min_reserve_tokens AND $res.payout < trigger.data.min_reserve_tokens)\n\t\t\t\t\t\tbounce(\"payout would be only \" || $res.payout);\n\t\t\t\t\tif (trigger.data.max_fee_percent AND $res.fee_percent > trigger.data.max_fee_percent)\n\t\t\t\t\t\tbounce(\"fee would be \" || $res.fee_percent || '%');\n\t\t\t\t\t\n\t\t\t\t\t// further hops\n\t\t\t\t\t$hops = trigger.data.hops;\n\t\t\t\t\t$address = $hops[0].address OTHERWISE $to;\n\t\t\t\t\trequire($address != var['staking_aa'], \"sending to staking AA not allowed\"); // not necessary now\n\t\t\t\t\tif ($hops){\n\t\t\t\t\t\t$data_for_next_hop = $hops[0].data;\n\t\t\t\t\t\tdelete($hops, 0); // remove the head hop\n\t\t\t\t\t\tif ($data_for_next_hop OR length($hops)){\n\t\t\t\t\t\t\t$forwarded_data = $data_for_next_hop OTHERWISE {};\n\t\t\t\t\t\t\tif (length($hops))\n\t\t\t\t\t\t\t\t$forwarded_data.hops = $hops;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t}",
            "messages": [
              {
                "if": "{$res.delta_s > 0}",
                "app": "payment",
                "payload": {
                  "asset": "{$asset}",
                  "outputs": [
                    {
                      "address": "{$address}",
                      "amount": "{ $res.delta_s }"
                    }
                  ]
                }
              },
              {
                "app": "payment",
                "payload": {
                  "asset": "{$reserve_asset}",
                  "outputs": [
                    {
                      "address": "{$address}",
                      "amount": "{$res.payout}",
                      "if": "{$res.payout}"
                    }
                  ]
                }
              },
              {
                "if": "{$forwarded_data}",
                "app": "data",
                "payload": "{$forwarded_data}"
              },
              {
                "app": "state",
                "state": "{\n\t\t\t\t\t\t\tif ($asset != $state.asset0)\n\t\t\t\t\t\t\t\tvar['asset_'||$asset] = $asset_info;\n\t\t\t\t\t\t\tvar['state'] = $state;\n\t\t\t\t\t\t\tresponse['fee%'] = round($res.fee_percent, 4) || '%';\n\t\t\t\t\t\t}"
              }
            ]
          }
        ]
      }
    }
  ]
}

Last updated