Definition: [
"autonomous agent",
{
"doc_url": "https://oswap-frontend.herokuapp.com/exchange.json",
"init": "{
$asset = params.asset;
$liquidity_asset = var['liquidity_asset'];
$liquidity_supply = var['liquidity_supply'];
$bytes_reserve = balance[base] - trigger.output[[asset=base]];
$asset_reserve = balance[$asset] - trigger.output[[asset=$asset]];
if (trigger.data.recipient AND !is_valid_address(trigger.data.recipient))
bounce('wrong recipient address');
$recipient = trigger.data.recipient OTHERWISE trigger.address;
$min_bytes = trigger.data.min_bytes;
$min_assets = trigger.data.min_assets;
$deadline = trigger.data.deadline;
}",
"messages": {
"cases": [
{
"if": "{trigger.data.define AND !$liquidity_asset AND $asset}",
"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": "state",
"state": "{
var['liquidity_asset'] = response_unit;
response['liquidity_asset'] = response_unit;
}"
}
]
},
{
"if": "{$liquidity_asset AND trigger.output[[asset=base]] > 1e4 AND trigger.output[[asset=$asset]] > 0}",
"init": "{
if ($asset_reserve == 0 OR $bytes_reserve == 0) {
$issue_amount = balance[base];
return;
}
$current_ratio = $asset_reserve / $bytes_reserve;
$expected_asset_amount = round($current_ratio * trigger.output[[asset=base]]);
if ($expected_asset_amount != trigger.output[[asset=$asset]])
bounce('wrong ratio of amounts, expected ' || $expected_asset_amount || ' of asset');
$investor_share = trigger.output[[asset=base]] / $bytes_reserve;
$issue_amount = round($investor_share * $liquidity_supply);
}",
"messages": [
{
"app": "payment",
"payload": {
"asset": "{$liquidity_asset}",
"outputs": [
{
"address": "{$recipient}",
"amount": "{$issue_amount}"
}
]
}
},
{
"app": "state",
"state": "{
var['liquidity_supply'] += $issue_amount;
response['provider'] = trigger.address;
response['byte_amount'] = trigger.output[[asset=base]];
response['asset_amount'] = trigger.output[[asset=$asset]];
response['liquidity_minted'] = $issue_amount;
}"
}
]
},
{
"if": "{$liquidity_asset AND trigger.output[[asset=$liquidity_asset]]}",
"init": "{
$liquidity_asset_amount = trigger.output[[asset=$liquidity_asset]];
$investor_share = $liquidity_asset_amount / $liquidity_supply;
$byte_amount = round($investor_share * balance[base]);
$asset_amount = round($investor_share * balance[$asset]);
}",
"messages": [
{
"app": "payment",
"payload": {
"asset": "base",
"outputs": [
{
"address": "{$recipient}",
"amount": "{$byte_amount}"
}
]
}
},
{
"app": "payment",
"payload": {
"asset": "{$asset}",
"outputs": [
{
"address": "{$recipient}",
"amount": "{$asset_amount}"
}
]
}
},
{
"app": "state",
"state": "{
var['liquidity_supply'] -= $liquidity_asset_amount;
response['provider'] = trigger.address;
response['byte_amount'] = $byte_amount;
response['asset_amount'] = $asset_amount;
}"
}
]
},
{
"if": "{trigger.output[[asset=base]] > 1e4 AND trigger.output[[asset=$asset]] == 0 AND $liquidity_supply}",
"init": "{
if ($deadline AND $deadline < timestamp) bounce('expired deadline');
$numerator = trigger.output[[asset=base]] * $asset_reserve * 997;
$denominator = $bytes_reserve * 1000 + trigger.output[[asset=base]] * 997;
$amount = round($numerator / $denominator);
if ($min_assets AND $amount < $min_assets) bounce('slippage limit');
response['buyer'] = trigger.address;
response['bytes_sold'] = trigger.output[[asset=base]];
response['assets_bought'] = $amount;
}",
"messages": [
{
"app": "payment",
"payload": {
"asset": "{$asset}",
"outputs": [
{
"address": "{$recipient}",
"amount": "{$amount}"
}
]
}
}
]
},
{
"if": "{trigger.output[[asset=$asset]] > 0 AND $liquidity_supply}",
"init": "{
if ($deadline AND $deadline < timestamp) bounce('expired deadline');
$numerator = trigger.output[[asset=$asset]] * $bytes_reserve * 997;
$denominator = $asset_reserve * 1000 + trigger.output[[asset=$asset]] * 997;
$amount = round($numerator / $denominator);
if ($min_bytes AND $amount < $min_bytes) bounce('slippage limit');
response['buyer'] = trigger.address;
response['assets_sold'] = trigger.output[[asset=$asset]];
response['bytes_bought'] = $amount;
}",
"messages": [
{
"app": "payment",
"payload": {
"asset": "base",
"outputs": [
{
"address": "{$recipient}",
"amount": "{$amount}"
}
]
}
}
]
}
]
}
}
]