Unit ID
YONtJPWCY4TeSSV7fbRWcw+SnqwGeFgudbLtmYvOa84=
Received
30.03.2023 22:31:18
Confirmation delay (full node)
3 minutes 35 seconds
Confirmation delay (light node)
5 minutes 37 seconds
Messages
Definition
Definition: [ "autonomous agent", { "bounce_fees": { "base": 10000 }, "doc_url": "https://example.com/doc_urls/{{aa_address}}.json", "init": "{ $OWNER_ADDRESS = var["OWNER"] OTHERWISE "VQN5XWXW23OQSUANCE4ZYVHTLMKPGZQ5"; $SERVER_PUBKEY = var["SERVER_PUBKEY"] OTHERWISE "Ao9xdDJANk2Bp8BonIlW7OwNo94W92otlFFqu/YVxfUq"; $ONE_WEEK = 1000; $ONE_MONTH = 2000; require(exists(trigger.data.method), "trigger.data.method is mandatory"); require(typeof(trigger.data.method) == "string", "trigger.data.method must be a string"); }", "getters": "{ $bankroll = ()=>var["BANKROLL"]; $owner = ()=>var["OWNER"]; $pubkey = ()=>var["SERVER_PUBKEY"]; $pubkey_of = ($address)=>{ $definition = definition[$address]; require($definition[0] == "sig", "That address is not a single-sig address"); require(length($definition[0]) != 2, "That address is not a single-sig address"); return $definition[1].pubkey; }; $withdrawal_status_of = ($address, $asset)=>var["w_" || $asset || "_" || $address] OTHERWISE false; $nonce_of = ($address)=>var["nonce_" || $address] OTHERWISE 0; $deposits_of = ($address, $asset)=>var["balance_" || $asset || "_" || $address] OTHERWISE 0; }", "messages": { "cases": [ { "if": "{trigger.address != $OWNER_ADDRESS}", "init": "{ require(exists(trigger.data.state), "trigger.data.state is mandatory"); require(exists(trigger.data.signature), "trigger.data.signature is mandatory"); require(is_valid_sig(trigger.data.state, $SERVER_PUBKEY, trigger.data.signature), "Bad signed message"); $signed_state = json_parse(trigger.data.state); $state = { nonce: $nonce_of(trigger.address), withdrawal_status: $withdrawal_status_of(trigger.address, trigger.data.asset), deposits: $deposits_of(trigger.address) }; if ($state.withdrawal_status AND trigger.data.method != "withdraw") bounce("You are awaiting to withdraw, the only allowed action is withdrawing after the timer expires"); $caller_pk = $pubkey_of(trigger.address); require($signed_state.nonce > $state.nonce, "Old signed state"); }", "messages": { "cases": [ { "if": "{trigger.data.method == "request_withdrawal"}", "init": "{ require(exists(trigger.data.asset), "trigger.data.asset is mandatory"); $asset_deposits = $deposits_of(trigger.address, trigger.data.asset); require($asset_deposits > (trigger.data.asset == "base" ? 1000 : 0), "Not enough balance to withdraw"); }", "messages": [ { "app": "state", "state": "{ var["BANKROLL_" || trigger.data.asset] -= $signed_state.balances[trigger.data.asset]; var["w_" || trigger.data.asset || "_" || trigger.address] = {amount: $signed_state.balance - (params.asset == "base" ? 1000 : 0), time: timestamp + $ONE_WEEK}; }" } ] }, { "if": "{trigger.data.method == "withdraw"}", "init": "{ require($state.withdrawal_status.time < timestamp, "You have to wait"); require(exists(trigger.data.asset), "trigger.data.asset is mandatory"); }", "messages": [ { "app": "payment", "payload": { "asset": "{trigger.data.asset}", "outputs": [ { "address": "{trigger.address}", "amount": "{$state.withdrawal_status.amount}" } ] } }, { "app": "state", "state": "{ var["deposits_" || trigger.data.asset || "_" || trigger.address] = 0; var["w_" || trigger.data.asset || "_" || trigger.address] = false; }" } ] }, { "if": "{trigger.data.method == "deposit"}", "init": "{ require(exists(trigger.data.asset), "trigger.data.asset is mandatory"); }", "messages": [ { "app": "state", "state": "{ var["deposits_" || trigger.data.asset || "_" || trigger.address] += trigger.output[[asset=trigger.data.asset]].amount; }" } ] } ] } }, { "if": "{trigger.address == $OWNER_ADDRESS}", "messages": { "cases": [ { "if": "{trigger.data.method == "deposit"}", "init": "{ require(exists(trigger.data.asset), "trigger.data.asset is mandatory"); log(unit[trigger.unit]); }", "messages": [ { "app": "state", "state": "{ var["BANKROLL_" || trigger.data.asset] += trigger.output[[asset=trigger.data.asset]].amount; }" } ] }, { "if": "{trigger.data.method == "prove_player_wrong"}", "init": "{ require(exists(trigger.data.server_seed) AND typeof(trigger.data.server_seed) == "number" AND trigger.data.server_seed > 0, "Invalid server_seed"); $player_message = json_parse(trigger.data.player_message); $player_pubkey = $pubkey_of($player_message.address); require(exists(trigger.data.player_message) AND is_valid_sig(trigger.data.player_message, $player_pubkey, trigger.data.player_signature), "Invalid signed player message"); // //{ // nonce: 1, // address: "AAAAAA", // server_seed_hash: "Asasasas", // client_seed: "aaaa", // balances: { // "base": 100, // "aasahsdgdsa": 12000 // ... // }, // action: { // method: "play", // game_address: "AAAAAA", // params: { // asset: "base" // hilo: "hi", // wager_amount: 1222 // } // } //} // $last_known_player_nonce = $nonce_of($player_message.address); require($player_message.nonce > $last_known_player_nonce, "Player-signed nonce is older than the last known nonce"); require(sha256(trigger.data.server_seed) == $player_message.server_seed_hash, "Server seed does not match player server_seed hash"); $game_result = $player_message.game_address#10.$sq($player_message, trigger.data.server_seed); $player_balance = $player_message.balances[$player_message.action.params.asset] + $game_result.amount; }", "messages": [ { "if": "{is_valid_amount($player_balance + $game_result.amount)}", "app": "payment", "payload": { "asset": "{$player_message.action.params.asset}", "outputs": [ { "address": "{$player_message.address}", "amount": "{$player_balance - ($player_message.action.params.asset == "base" ? 1000 : 0)}" } ] } }, { "app": "state", "state": "{ var["BANKROLL_" || $player_message.action.params.asset] += $deposits_of($player_message.address) - $player_balance; var["w_" || $player_message.action.params.asset || "_" || $player_message.address] = false; }" } ] }, { "if": "{trigger.data.method == "change_owner"}", "init": "{ require(exists(trigger.data.new_owner), "trigger.data.new_owner is mandatory"); require(is_valid_address(trigger.data.new_owner), "trigger.data.new_owner is not a valid address"); require(exists(trigger.data.pubkey), "trigger.data.pubkey is mandatory"); }", "messages": [ { "app": "state", "state": "{ var["OWNER"] = trigger.data.new_owner; var["SERVER_PUBKEY"] = trigger.data.pubkey; }" } ] }, { "if": "{trigger.data.method == "request_withdraw"}", "messages": [ { "app": "state", "state": "{ var["withdraw_time"] = timestamp + $ONE_MONTH; }" } ] }, { "if": "{trigger.data.method == "withdraw"}", "init": "{ require(var["withdraw_time"] < timestamp, "You have to wait longer before withdrawing"); require(exists(trigger.data.asset), "trigger.data.asset is mandatory"); }", "messages": [ { "app": "payment", "payload": { "asset": "{trigger.data.asset}", "outputs": [ { "address": "{$OWNER_ADDRESS}", "amount": "{min(trigger.data.amount, var["BANKROLL_" || trigger.data.asset])}" } ] } }, { "app": "state", "state": "{ var["withdraw_time"] = false; }" } ] } ] } } ] } } ]
Technical information
Fees:
7,810 bytes
(452 headers, 7358 payload)
Level:3017613
Witnessed level:3017605
Main chain index:2992600
Latest included mc index:2992599
Status:stable/confirmed/final