Definition: [
"autonomous agent",
{
"init": "{
$BOUNCER = 'V23L3YLZVOLQ473QVRGODFRIDSBDOSUJ';
$attestor = trigger.data.attestor and is_valid_address(trigger.data.attestor) ? trigger.data.attestor : false;
$field = trigger.data.attestor and typeof(trigger.data.field) == 'string' ? trigger.data.field : false;
if(trigger.output[[asset!=base]].asset != 'none')
$asset = trigger.output[[asset!=base]].asset;
}",
"messages": {
"cases": [
{
"if": "{var['last_address']}",
"messages": [
{
"app": "payment",
"payload": {
"asset": "base",
"outputs": [
{
"address": "{var['last_address']}"
}
]
}
},
{
"app": "state",
"state": "{
var['last_address'] = false;
}"
}
]
},
{
"messages": [
{
"app": "payment",
"payload": {
"asset": "{$asset}",
"outputs": [
{
"address": "{trigger.address}",
"amount": "{trigger.output[[asset!=base]]}"
}
]
}
},
{
"app": "payment",
"payload": {
"asset": "base",
"outputs": [
{
"address": "{$BOUNCER}",
"amount": "{trigger.output[[asset=base]]-8000}"
}
]
}
},
{
"app": "definition",
"payload": {
"definition": [
"autonomous agent",
{
"{'init'}": "{
"{$ASSET = '"||$asset||"';"
|| ($attestor?("$ATTESTOR_ADDR = '"||$attestor||"';if(!attestation[[attestors=$ATTESTOR_ADDR, address=trigger.address,ifnone=false]]"||($field?("['"||$field||"']"):"")||") bounce('Not allowed to use, please attest your address with '||$ATTESTOR_ADDR);"):"")
|| "$BYTE_INP = 10000;"
|| "$FREE_LIMIT = 3000;"
|| "$ADDR = 'a';$PERM = 'p';$BYTE = 'b';$TOTAL = 'total';"
|| "$base = trigger.output[[asset=base]];"
|| "$trigger_cost = unit[trigger.unit].headers_commission + unit[trigger.unit].payload_commission;"
|| "$addr = trigger.address;"
|| "$balance = balance[base] - $base - storage_size;"
|| "$free_mode = ($balance - var[$TOTAL]) > $FREE_LIMIT ;"
|| "$addr_key = $ADDR || $addr;"
|| "$addr_q = var[$addr_key];"
|| "$byte_key = $BYTE || $addr;"
|| "$base_inp = $base + ($free_mode?$trigger_cost:0);"
|| "$value = trigger.data.value;"
|| "if(!trigger.data.approve AND $value AND (typeof($value) != 'number' OR $value <= 0)) bounce('Value param invalid');"
|| "if(trigger.output[[asset!=base]].asset != 'none')"
|| "$asset = trigger.output[[asset!=base]].asset;}"
}",
"messages": {
"{'cases'}": [
{
"{'if'}": "{
"{trigger.data.approve AND $base == $BYTE_INP}"
}",
"{'init'}": "{
"{$approve = trigger.data.approve;"
|| "$perm_key = $PERM || $addr || $approve;"
|| "if(!is_valid_address($approve) OR $approve == $addr) bounce('approve param invalid, specify address to approve instead of any other value');"
|| "if(!$value) bounce('Value param missing');"
|| "if(typeof($value) != 'number' OR $value < 0) bounce('Value param invalid');}"
}",
"messages": [
{
"app": "state",
"{'state'}": "{
"{var[$perm_key] = $value;"
|| "if(var[$perm_key] == 0) var[$perm_key] = false;"
|| "var[$byte_key] += $base_inp;"
|| "var[$TOTAL] += $base_inp;"
|| "response['message'] = 'Approved '||$approve||' to spend '||$value ||' from your account';}"
}"
}
]
},
{
"{'if'}": "{
"{trigger.data.withdraw_bytes AND $base == $BYTE_INP}"
}",
"{'init'}": "{
"{$user_bal = var[$byte_key];"
|| "if(!$user_bal) bounce('No bytes to withdraw');"
|| "$w_amount = $balance < $user_bal ? $balance : $user_bal;"
|| "$wt = round($w_amount / $BYTE_INP);"
|| "$w_fee = !!$ATTESTOR_ADDR AND $free_mode ?0 : (($wt > 2) ? 462+$wt*60 : 522);}"
}",
"messages": [
{
"app": "payment",
"payload": {
"asset": "base",
"outputs": [
{
"address": "{"{$addr}"}",
"amount": "{"{$w_amount + $base - $w_fee}"}"
}
]
}
},
{
"app": "state",
"{'state'}": "{
"{var[$byte_key] = false;"
|| "var[$TOTAL] -= $w_amount;"
|| "response['message'] = 'Withdrawn '||$w_amount||' bytes less '||$w_fee||' fee from your account';}"
}"
}
]
},
{
"{'if'}": "{
"{$asset AND $base == $BYTE_INP}"
}",
"{'init'}": "{
"{if($asset == 'ambiguous') bounce('Only 1 asset per tx');"
|| "if($asset != $ASSET) bounce('You must deposit '||$ASSET);"
|| "$asset_inp = trigger.output[[asset!=base]];}"
}",
"messages": [
{
"app": "state",
"{'state'}": "{
"{var[$addr_key] += $asset_inp;"
|| "var[$byte_key] += $base_inp;"
|| "var[$TOTAL] += $base_inp;"
|| "response['message'] = 'Added '||$asset_inp||' to your account';}"
}"
}
]
},
{
"{'if'}": "{
"{trigger.data.withdraw AND $base == $BYTE_INP}"
}",
"{'init'}": "{
"{if(!$addr_q) bounce('Nothing to withdraw');"
|| "$max_w = $addr_q-($addr_q % 1);"
|| "if(!$value) bounce('Value param missing, max to withdraw '||$max_w) ;"
|| "$w_amount = $value - ($value % 1);"
|| "if($w_amount <= 0) bounce('Max to withdraw '||$max_w);"
|| "if($w_amount > $max_w) bounce('Not enough asset, max to withdraw '||$max_w);}"
}",
"messages": [
{
"app": "payment",
"payload": {
"asset": "{"{$ASSET}"}",
"outputs": [
{
"address": "{"{$addr}"}",
"amount": "{"{$w_amount}"}"
}
]
}
},
{
"app": "state",
"{'state'}": "{
"{if(!!$ATTESTOR_ADDR AND $free_mode)"
|| "$w_fee = 0;"
|| "else"
|| "$w_fee = unit[response_unit].headers_commission + unit[response_unit].payload_commission;"
|| "var[$addr_key] -= $w_amount;"
|| "if(var[$addr_key] == 0) var[$addr_key]=false;"
|| "var[$byte_key] += ($base_inp-$w_fee);"
|| "var[$TOTAL] += ($base_inp-$w_fee);"
|| "response['message'] = 'Withdrawn '||$w_amount||' from your account';}"
}"
}
]
},
{
"{'if'}": "{
"{trigger.data.transfer AND $base == $BYTE_INP}"
}",
"{'init'}": "{
"{$to = trigger.data.transfer;"
|| "if(!is_valid_address($to) OR $to == $addr) bounce('transfer param invalid, specify address to instead of any other value');"
|| "if(!$addr_q) bounce('No funds found');"
|| "if(!$value) bounce('Value param missing');"
|| "if($value > $addr_q) bounce('You have max '||$addr_q);}"
}",
"messages": [
{
"app": "state",
"{'state'}": "{
"{var[$ADDR|| $to] += $value;"
|| "var[$addr_key] -= $value;"
|| "if(var[$addr_key] == 0) var[$addr_key] = false;"
|| "var[$byte_key] += $base_inp;"
|| "var[$TOTAL] += $base_inp;"
|| "response['message'] = 'Transferred '||$value||' to '||$to;}"
}"
}
]
},
{
"{'if'}": "{
"{trigger.data.transfer_from AND $base == $BYTE_INP}"
}",
"{'init'}": "{
"{$from = trigger.data.transfer_from;"
|| "$to = trigger.data.to;"
|| "$from_key = $ADDR|| $from;"
|| "$perm_key = $PERM || $from || $addr;"
|| "if(!is_valid_address($from)) bounce('transfer_from param invalid, specify from address instead of any other value');"
|| "if(!$to) bounce('To param missing');"
|| "if(!is_valid_address($to)) bounce('To param invalid');"
|| "if(!var[$from_key]) bounce('Account have no funds');"
|| "if(!$value) bounce('Value param missing');"
|| "if(!var[$perm_key]) bounce('Not allowed to spend');"
|| "if(var[$perm_key] < $value) bounce('You can spend max '||var[$perm_key]);"
|| "if(var[$from_key] < $value) bounce('Account have '||var[$from_key]);}"
}",
"messages": [
{
"app": "state",
"{'state'}": "{
"{var[$ADDR|| $to] += $value;"
|| "var[$from_key] -= $value;"
|| "if(var[$from_key] == 0) var[$from_key] = false;"
|| "var[$perm_key] -= $value;"
|| "if(var[$perm_key] == 0) var[$perm_key] = false;"
|| "var[$byte_key] += $base_inp;"
|| "var[$TOTAL] += $base_inp;"
|| "response['message'] = 'Transferred '||$value||' to '||$to;}"
}"
}
]
},
{
"messages": [
{
"app": "state",
"{'state'}": "{
"{if(trigger.output[[asset!=base]].asset != 'none') bounce('Allowed asset: '||$ASSET);"
|| "response['asset'] = 'Allowed asset: '||$ASSET;"
|| "response['accepted_params'] = 'withdraw, transfer, transfer_from, approve, withdraw_bytes';"
|| "response['usage'] = 'Send '||$BYTE_INP||' bytes and param = 1 for continue.';"
|| "response['message'] = 'Received donation for funding AA operation, thaanks!';}"
}"
}
]
}
]
}
}
]
}
},
{
"app": "state",
"state": "{
if(!$asset) bounce('You must send an asset');
if($asset == 'ambiguous') bounce('Only 1 asset per tx');
response['message']='AA for '||$asset||'created';
$definition_address = unit[response_unit].messages[[.app='definition']].payload.address;
response['address'] = $definition_address;
var['last_address'] = $definition_address;
if($attestor){
if($field){
response['security'] = $attestor||' will have to give permission and will be able to block accounts';
}
else{
response['security'] = $attestor||' will have to give permission but will not be able to block accounts, specify an attestation field using field param in other case';
}
}
else{
if(var[$asset]) bounce('Proxy AA already registered: '||var[$asset]);
var[$asset] = unit[response_unit].messages[[.app='definition']].payload.address;
response['security'] = 'Free access, nobody will be able to block anyone. Use here attestor param to restrict AA to certain addresses';
}
}"
}
]
}
]
}
}
]