Unit ID
Myjr1GBHXmdGB3F/En9+VlkymmWtDZYpVNtw8094INU=
Received
27.06.2023 12:52:09
Confirmation delay (full node)
21 minutes 31 seconds
Confirmation delay (light node)
30 minutes 46 seconds
Messages
Definition
Definition: [ "autonomous agent", { "getters": "{ $get_whitelisted_base_aas = () => { 'DYZOJKX4MJOQRAUPX7K6WCEV5STMKOHI': true, }; $get_available_balance = ($arb_aa, $a) => balance[$arb_aa][$a] - ($a == 'base' ? 10000 : 0); $get_denom = ($balances, $l_balances, $shifts, $pAB, $alpha, $in_label) => { $leverages = [2, 5, 10, 20, 50, 100]; $beta = 1 - $alpha; $reversed = $in_label == 'y'; $b = $reversed ? $alpha : $beta; // account for leveraged positions $L_sums = {x: 0}; foreach($leverages, 6, $L => { $signedL = $reversed ? -$L : $L; $L_sums.x = $L_sums.x + ($L - 1) * ($l_balances[$signedL||'x'].balance + $l_balances[-$signedL||'x'].balance / $pAB); }); $denom = $b * ($balances[$in_label] + $shifts[$in_label||'0']) - $L_sums.x; // log({denom: $denom, sum: $L_sums.x, share: $L_sums.x/$denom}); require($denom > 0, "negative denom " || $denom); $denom }; $calc_arb_params = ($arb_aa, $asset, $oswap_aas, $share, $secondary_share) => { $whitelisted_base_aas = $get_whitelisted_base_aas(); $balance = $get_available_balance($arb_aa, $asset); $oswap_params = map($oswap_aas, 3, ($oswap_aa) => { $definition = definition[$oswap_aa][1]; require($whitelisted_base_aas[$definition.base_aa], "disallowed base AA in oswap AA "||$oswap_aa); $definition.params }); $assetA = $asset; $in_labels = []; // log('oswap params', $oswap_params); if ($oswap_params[0].x_asset == $asset){ $in_labels[0] = 'x'; $assetB = $oswap_params[0].y_asset; } else if ($oswap_params[0].y_asset == $asset){ $in_labels[0] = 'y'; $assetB = $oswap_params[0].x_asset; } else bounce("first pool doesn't trade the reserve asset"); // log('assetB', $assetB); $in_labels[1] = 'undef'; if ($oswap_params[2].x_asset == $asset){ $in_labels[2] = 'y'; $assetC = $oswap_params[2].y_asset; } else if ($oswap_params[2].y_asset == $asset){ $in_labels[2] = 'x'; $assetC = $oswap_params[2].x_asset; } else bounce("third pool doesn't trade the reserve asset"); // log('assetC', $assetC); require($assetB != $assetC, "B and C assets are the same"); if ($oswap_params[1].x_asset == $assetB){ $in_labels[1] = 'x'; require($oswap_params[1].y_asset == $assetC, "second pool's y is not C"); } else if ($oswap_params[1].y_asset == $assetB){ $in_labels[1] = 'y'; require($oswap_params[1].x_asset == $assetC, "second pool's x is not C"); } else bounce("second pool doesn't trade asset B"); $get_param = ($i, $name, $default) => { $value = var[$oswap_aas[$i]][$name]; exists($value) ? $value : (exists($oswap_params[$i][$name]) ? $oswap_params[$i][$name] : $default) }; $fees = map([0,1,2], 3, $i => $get_param($i, 'swap_fee', 0.003)); $alphas = map([0,1,2], 3, $i => $get_param($i, 'alpha', 0.5)); $Lambdas = map([0,1,2], 3, $i => $get_param($i, 'pool_leverage', 1)); $arb_profit_taxes = map([0,1], 2, $i => $get_param($i, 'arb_profit_tax', 0)); // log('Lambdas', $Lambdas); $get_shifts = ($i) => { $mid_price = $get_param($i, 'mid_price', 0); // price of x_asset in terms of y_asset if ($mid_price){ $alpha = $alphas[$i]; $beta = 1 - $alpha; $gamma = $get_param($i, 'price_deviation', 0); $lp_shares = var[$oswap_aas[$i]]['lp_shares']; $s_curve = $lp_shares.linear * $lp_shares.coef; $x0 = $s_curve / $mid_price^$beta / $gamma; $y0 = $x0 * $mid_price; } // else{ // $x0 = 0; // $y0 = 0; // } {x0: $x0, y0: $y0} }; $shifts = map([0,1,2], 3, $i => $get_shifts($i)); $oswap_balances = map([0,1,2], 3, $i => var[$oswap_aas[$i]]['balances']); $get_price = ($i) => { $alpha = $alphas[$i]; $beta = 1 - $alpha; $balances = $oswap_balances[$i]; $sh = $shifts[$i]; ($in_labels[$i] == 'x') ? $alpha/$beta * ($balances.y + $sh.y0) / ($balances.x + $sh.x0) : $beta/$alpha * ($balances.x + $sh.x0) / ($balances.y + $sh.y0) }; $pAB = $get_price(0); $pBC = $get_price(1); $pCA = $get_price(2); $pAB2 = 1/$pBC/$pCA; log('pAB', $pAB, 'pAB2', $pAB2); $pAC = 1/$pCA; $pCB = 1/$pBC; $pBA = 1/$pAB; $denomAB = $get_denom($oswap_balances[0], var[$oswap_aas[0]]['leveraged_balances'], $shifts[0], $pAB, $alphas[0], $in_labels[0]); $denomBC = $get_denom($oswap_balances[1], var[$oswap_aas[1]]['leveraged_balances'], $shifts[1], $pBC, $alphas[1], $in_labels[1]); $denomCA = $get_denom($oswap_balances[2], var[$oswap_aas[2]]['leveraged_balances'], $shifts[2], $pCA, $alphas[2], $in_labels[2]); $amounts = {A: 0, B: 0, C: 0}; $b = []; $b[0] = $in_labels[0] == 'x' ? 1 - $alphas[0] : $alphas[0]; $b[1] = $in_labels[1] == 'x' ? 1 - $alphas[1] : $alphas[1]; $b[2] = $in_labels[2] == 'x' ? 1 - $alphas[2] : $alphas[2]; // profitable to sell A on AB pool and buy on BC and CA if ($pAB * (1 - $fees[0]) > $pAB2 * (1 + $fees[1]) * (1 + $fees[2])){ $pAB_minus_fee = $pAB * (1 - $fees[0]); $pAB2_plus_fee = $pAB2 * (1 + $fees[1]) * (1 + $fees[2]); $amounts.A = floor(($pAB_minus_fee - $pAB2_plus_fee)/$pAB_minus_fee / (1/$denomAB + $pAB/$denomBC + $pAB*$pBC/$denomCA)); if ($amounts.A > $balance) $amounts.A = $balance; $amounts.netA = $amounts.A * $share; $final_pBA = $pBA * (1 + $amounts.netA/($denomAB + $b[0] * $Lambdas[0] * $amounts.netA)); $amounts.B = $amounts.netA / $final_pBA * (1 - $fees[0]) - ($pAB - 1/$final_pBA) * $amounts.netA / 2 * $arb_profit_taxes[0]; $amounts.netB = $amounts.B * $secondary_share; $final_pCB = $pCB * (1 + $amounts.netB/($denomBC + $b[1] * $Lambdas[1] * $amounts.netB) /* $share * $share*/); $amounts.C = $amounts.netB / $final_pCB * (1 - $fees[1]) - ($pBC - 1/$final_pCB) * $amounts.netB / 2 * $arb_profit_taxes[1]; $amounts.netC = $amounts.C * $secondary_share; $final_pAC = $pAC * (1 + $amounts.netC/($denomCA + $b[2] * $Lambdas[2] * $amounts.netC) /* $share * $share * $share*/); // log('amounts', $amounts); // log('AB', $pAB, 1/$final_pBA); $from = 'AB'; $amount = $amounts.A; $address = $oswap_aas[0]; $data = { final_price: $final_pBA, hops: [ // next oswaps in the chain { address: $oswap_aas[1], change_address: $arb_aa, data: {final_price: $final_pCB}, }, { address: $oswap_aas[2], change_address: $arb_aa, data: {final_price: $final_pAC}, }, { address: $arb_aa, }, ] }; } else if ($pAB * (1 + $fees[0]) < $pAB2 * (1 - $fees[1]) * (1 - $fees[2])){ $denomBA = $denomAB * $pAB; $denomCB = $denomBC * $pBC; $denomAC = $denomCA * $pCA; $pAC2 = $pAB * $pBC; $pAC_minus_fee = $pAC * (1 - $fees[2]); $pAC2_plus_fee = $pAC2 * (1 + $fees[0]) * (1 + $fees[1]); $amounts.A = floor(($pAC_minus_fee - $pAC2_plus_fee)/$pAC_minus_fee / (1/$denomAC + $pAC/$denomCB + $pAC*$pCB/$denomBA)); if ($amounts.A > $balance) $amounts.A = $balance; $b[0] = 1 - $b[0]; $b[1] = 1 - $b[1]; $b[2] = 1 - $b[2]; $amounts.netA = $amounts.A * $share; $final_pCA = $pCA * (1 + $amounts.netA/($denomAC + $b[2] * $Lambdas[2] * $amounts.netA)); $amounts.C = $amounts.netA / $final_pCA * (1 - $fees[2]) - ($pAC - 1/$final_pCA) * $amounts.netA / 2 * $arb_profit_taxes[2]; $amounts.netC = $amounts.C * $secondary_share; $final_pBC = $pBC * (1 + $amounts.netC/($denomCB + $b[1] * $Lambdas[1] * $amounts.netC)); $amounts.B = $amounts.netC / $final_pBC * (1 - $fees[1]) - ($pCB - 1/$final_pBC) * $amounts.netC / 2 * $arb_profit_taxes[1]; $amounts.netB = $amounts.B * $secondary_share; $final_pAB = $pAB * (1 + $amounts.netB/($denomBA + $b[0] * $Lambdas[0] * $amounts.netB)); // log('amounts', $amounts); // log('AC', $pAC, 1/$final_pCA); $from = 'AC'; $amount = $amounts.A; $address = $oswap_aas[2]; $data = { final_price: $final_pCA, hops: [ // next oswaps in the chain { address: $oswap_aas[1], change_address: $arb_aa, data: {final_price: $final_pBC}, }, { address: $oswap_aas[0], change_address: $arb_aa, data: {final_price: $final_pAB}, }, { address: $arb_aa, }, ] }; } else bounce("no arb opportunity exists"); { from: $from, amount: $amount, address: $address, data: $data, pAB: $pAB, pBC: $pBC, pCA: $pCA, assetA: $assetA, assetB: $assetB, assetC: $assetC, } }; $calc_exchange_params = ($arb_aa, $oswap_aa, $asset, $share) => { $whitelisted_base_aas = $get_whitelisted_base_aas(); $definition = definition[$oswap_aa][1]; require($whitelisted_base_aas[$definition.base_aa], "disallowed base AA in "||$oswap_aa); $oswap_params = $definition.params; if ($oswap_params.x_asset == $asset){ $in_label = 'y'; $assetB = $oswap_params.y_asset; } else if ($oswap_params.y_asset == $asset){ $in_label = 'x'; $assetB = $oswap_params.x_asset; } else bounce("the pool doesn't trade the reserve asset"); $get_param = ($name, $default) => { $value = var[$oswap_aa][$name]; exists($value) ? $value : (exists($oswap_params[$name]) ? $oswap_params[$name] : $default) }; $alpha = $get_param('alpha'); $beta = 1 - $alpha; $balances = var[$oswap_aa]['balances']; $get_shifts = () => { $mid_price = $get_param('mid_price', 0); // price of x_asset in terms of y_asset if ($mid_price){ $gamma = $get_param('price_deviation', 0); $lp_shares = var[$oswap_aa]['lp_shares']; $s_curve = $lp_shares.linear * $lp_shares.coef; $x0 = $s_curve / $mid_price^$beta / $gamma; $y0 = $x0 * $mid_price; } {x0: $x0, y0: $y0} }; $sh = $get_shifts(); $pBA = ($in_label == 'x') ? $alpha/$beta * ($balances.y + $sh.y0) / ($balances.x + $sh.x0) : $beta/$alpha * ($balances.x + $sh.x0) / ($balances.y + $sh.y0); $denom = $get_denom($balances, var[$oswap_aa]['leveraged_balances'], $sh, $pBA, $alpha, $in_label); $balanceB = $get_available_balance($arb_aa, $assetB); $final_pAB = 1/$pBA * (1 + $balanceB/$denom * $share); { data: {final_price: $final_pAB}, assetB: $assetB, } }; }", "messages": [ { "app": "state", "state": "{ $h = $calc_arb_params(); bounce("library only"); }" } ] } ]
Technical information
Fees:
11,240 bytes
(451 headers, 10789 payload)
Level:10300601
Witnessed level:10300589
Main chain index:9930720
Latest included mc index:9930719
Status:stable/confirmed/final