Definition: [
    "autonomous agent",
    {
        "bounce_fees": {
            "base": 10000
        },
        "init": "{
            // admin stuff
                $AA_OWNER = "O7NYCFUL5XIJTYE3O4MKGMGMTN6ATQAJ"; // to collect the dust
                $AA_NAME = "THAANKS";
            // intructions
                $INSTRUCTIONS_USE_CASES = "Be first to use 'token = <received token>' after the request time and before the acceptable delay to receive the associated reward. To subscribe as an helper and have a chance to be picked up later use: 'subscribe = true'. To unsubscribe use: 'unsubscribe = true'. ";
                $INSTRUCTIONS_ASK_HELP = "You are an AA and want to propose a reward to be triggered in the futur? use 'ask_help = <true>' with optionaly 'helper = <address>' if you want to propose an helper. Use 'private_mode = true' to force the triggering to be done by the specific helper. If you need to be trigger after a given time, use 'request_time = <timestamp>' and if you want to give a dead line use 'acceptable_delay = <delay in seconds>'. ";
            // definitive constantes    
                $DEFAULT_ACCEPTABLE_DELAY = 10*24*60*60;
            // trigger variables
                $user = trigger.address;
                $i = trigger.data;
        }",
        "messages": {
            "cases": [
                {
                    "if": "{ !!$i.ask_help }",
                    "init": "{
                            if ($i.ask_help != "true") bounce ($INSTRUCTIONS_ASK_HELP);
                            // preparing 
                                $aa = $i.aa otherwise $user;
                                $requested_time = $i.requested_time otherwise timestamp;
                                $acceptable_delay = $i.acceptable_delay otherwise $DEFAULT_ACCEPTABLE_DELAY;
                                $reward_amount = trigger.output[[asset!=base]].amount otherwise trigger.output[[asset=base]].amount otherwise 0;
                                $reward_asset = trigger.output[[asset!=base]].asset otherwise "base";
                            // defining helper
                                $good_guy_count = var["good_guy_count"] otherwise bounce ("No good guy available, use 'helper = <address>'!");
                                $helper = $i.helper otherwise $good_guy_count > 0 ? 
                                    var["good_guys_"||number_from_seed(timestamp,0, $good_guy_count)] : bounce ("No helper defined ! ");
                            // token used to store var about AA needs for a given time
                                $token = sha256($aa||$requested_time);
            }",
                    "messages": [
                        {
                            "app": "data",
                            "payload": {
                                "message": "{"Get "||$reward_amount||" "||$reward_asset||" if you are first to send back this 'token = <token received below>'' to me between "||timestamp_to_string($requested_time)||" and "||timestamp_to_string($requested_time+$acceptable_delay, 'datetime')}",
                                "token": "{$token}"
                            }
                        },
                        {
                            "app": "payment",
                            "payload": {
                                "asset": "base",
                                "outputs": [
                                    {
                                        "address": "{$helper}",
                                        "amount": "{4}"
                                    }
                                ]
                            }
                        },
                        {
                            "app": "state",
                            "state": "{ 
                                var[$token||"_aa"] = $aa;    
                                var[$token||"_helper"] = $helper;                  var[$token||"_private_mode"] = $i.private_mode;
                                var[$token||"_reward_amount"] = $reward_amount;    var[$token||"_reward_asset"] = $reward_asset;
                                var[$token||"_requested_time"] = $requested_time;  var[$token||"_acceptable_delay"] = $acceptable_delay;
                                response['message'] = $helper||" has been asked for help ^^"; 
                            }"
                        }
                    ]
                },
                {
                    "if": "{ $i.token }",
                    "init": "{ 
                            // existing?
                   $token = $i.token otherwise bounce ($INSTRUCTIONS_TRIGGER_FOR_REWARD);
                            // been overtaken?
                  if (!var[$token||"_aa"]) bounce ("Too late someone was quicker (or you mistype the token)!"); 
                            // too early ? 
                                $requested_time = var[$token||"_requested_time"];
                                if ($requested_time > timestamp)bounce ("Too early, try at "||timestamp_to_string($requested_time));
                            
                            // too late ?
                                if (timestamp > $requested_time + var[$token||"_delay"]) bounce ("Too late, sorry !");
                            
                            // prepare rewards !
                                $bytes = trigger.output[[asset=base]].amount - 2000; // to post this TX and to give 1000 to AA
                                $reward_in_bytes = var[$token||"_reward_asset"] == "base" ? var[$token||"_reward_amount"] + $bytes: $bytes;
                                $reward_in_other = var[$token||"_reward_asset"] != "base" ? var[$token||"_reward_amount"] : false;
            }",
                    "messages": [
                        {
                            "if": "{ !!$reward_in_other }",
                            "app": "payment",
                            "payload": {
                                "asset": "{ var[$token||"_reward_asset"] }",
                                "outputs": [
                                    {
                                        "address": "{ $user }",
                                        "amount": "{ $reward_in_other }"
                                    }
                                ]
                            }
                        },
                        {
                            "app": "payment",
                            "payload": {
                                "asset": "base",
                                "outputs": [
                                    {
                                        "address": "{ $user }",
                                        "amount": "{ $reward_in_bytes }"
                                    },
                                    {
                                        "address": "{ $aa }",
                                        "amount": "{ 1000 }"
                                    }
                                ]
                            }
                        },
                        {
                            "app": "state",
                            "state": "{ 
                                        var[$token||"_aa"] = false;   
                                        var[$token||"_helper"] = false;                    var[$token||"_private_mode"] = false;
                                        var[$token||"_reward_amount"] = false;             var[$token||"_reward_asset"] = false;
                                        var[$token||"_requested_time"] = false;            var[$token||"_acceptable_delay"] = false;
                                        response['message'] = trigger.address||" has been rewarded ^^"; 
                                }"
                        }
                    ]
                },
                {
                    "if": "{ $i.subscribe }",
                    "init": "{ if (var[$user]) bounce ("You are motivated, but once is enough!"); }",
                    "messages": [
                        {
                            "app": "state",
                            "state": "{ 
               var["good_guy_count"] += 1;
               var[$user] = var["good_guy_count"];
               var["good_guys_"||var["good_guy_count"]] = $user;
               response['message'] = "Subscribed ^^. "; 
            }"
                        }
                    ]
                },
                {
                    "if": "{ $i.unsubscribe }",
                    "init": "{ if (!var[$user]) bounce ("You were not register!"); }",
                    "messages": [
                        {
                            "app": "state",
                            "state": "{ 
               var["good_guy_count"] -= 1;
               $number = var[$user];
               var[$user] = false;
               var["good_guys_"||$number] = false;
               response['message'] = "Unsubscribed ^^. "; 
            }"
                        }
                    ]
                },
                {
                    "init": "{ 
               if ($user != $AA_OWNER) bounce ($INSTRUCTIONS_USE_CASES); 
            }",
                    "messages": [
                        {
                            "app": "payment",
                            "payload": {
                                "asset": "{'base'}",
                                "outputs": [
                                    {
                                        "address": "{$AA_OWNER}",
                                        "amount": "{$reward}"
                                    }
                                ]
                            }
                        }
                    ]
                }
            ]
        }
    }
]