[
"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");
}"
}
]
}
]