Unit ID
nSPdEpMfojmszHY1y64j9cptui8MTUVgbPN+1fhb4oQ=
Received
25.09.2019 00:02:38
Confirmation delay (full node)
3 minutes 45 seconds
Confirmation delay (light node)
6 minutes 31 seconds
Messages
Definition
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'; } }" } ] } ] } } ]
Technical information
Fees:
8,552 bytes
(353 headers, 8199 payload)
Level:1076655
Witnessed level:1076648
Main chain index:1075418
Latest included mc index:1075417
Status:stable/confirmed/final