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