Definition: [
"autonomous agent",
{
"init": "{
// admin
$AA_OWNER = "O7NYCFUL5XIJTYE3O4MKGMGMTN6ATQAJ"; //office_testnet_wallet
$AA_NAME = "FLAAP";
// secondary AAs
$LOPAVAA = "YICOQCAWUSFBIQGBB4HUPQ23U37RA5WG";
$THAANKS = var[$LOPAVAA]["THAANKS_last_version"]; // getting user help for future trigger
$DANAA = var[$LOPAVAA]["DANAA_last_version"]; // last version of Dynamic Asset Name AA;
// forever constantes
$TICKET_PRICE = 10000;
$ROUND_BUYING_PERIOD = 3*60; // seconds
$DRAWING_TIME_DELAY = 5*60; // seconds
$DRAWING_TIME_TOLERANCE = 10*60; // seconds
$PERCENTAGE_FOR_HELPER = 0.5; // 0.5 %
$ATTESTOR = '35IT3ZYKEPQSCXG2F7A7KWNRAD3SZXN4'; // use for not so important random number generation
$INSTRUCTIONS = "Send "|| $TICKET_PRICE ||" units to buy a ticket. ";
// input variables
$asset = trigger.output[[asset!=base]].asset != "none" ? trigger.output[[asset!=base]].asset : "base";
$key = var[$DANAA][$asset||"_shortName"] otherwise $asset;
$dead_line = var[$key||"_dead_line"] otherwise timestamp + $ROUND_BUYING_PERIOD;
}",
"messages": {
"cases": [
{
"if": "{ (timestamp < ($dead_line)) and !(var[$key||"_draw_time"]) }",
"init": "{
if (trigger.output[[asset=$asset]] != $TICKET_PRICE)
bounce ("Ticket price is "||$TICKET_PRICE||" "||$key);
}",
"messages": [
{
"app": "state",
"state": "{
$nop = $key||"_number_of_players";
var[$nop] = !!var[$nop] ? var[$nop] + 1 : 1;
var[$key||"_dead_line"] = $dead_line;
var[$key||"_player_"||var[$nop]] = trigger.address;
var[$key||"_balance"] = var[$key||"_balance"] ?
var[$key||"_balance"] + trigger.output[[asset=$asset]] :
trigger.output[[asset=$asset]];
// if attested address, it plays a role in the seed
if (attestation[[attestors=$ATTESTOR, address=trigger.address, ifnone=false]])
var[$key||"_seed"] = sha256(var[$key||"_seed"]||trigger.address);
response['message'] = "You have enter the lottery ^^";
}"
}
]
},
{
"if": "{ ( (timestamp > $dead_line)) and !(var[$key||"_draw_time"]) }",
"init": "{
$buy_last_ticket = trigger.output[[asset=$asset]] >= $TICKET_PRICE;
if ($buy_last_ticket)
$reimbursement = trigger.output[[asset=$asset]] - $TICKET_PRICE;
else
$reimbursement = trigger.output[[asset=$asset]] - 1000;
// delay before we draw with seed based only on time variable data
$draw_time = timestamp + $DRAWING_TIME_DELAY;
// pick a helper from the players, but someone else or a bot will be able to trigger for the reward
$old_nop = var[$key||"_number_of_players"] otherwise 0;
$nop = $old_nop+1;
if ($nop>1) // si un seul jouer pas tirage au sort
$helper = var[$key||"_player_"||number_from_seed(var[$key||"_seed"], 1, $nop )];
else
$helper = var[$key||"_player_1"];
// calcul reward
$temp = round (var[$key||"_balance"] * $PERCENTAGE_FOR_HELPER / 100);
$reward = ($temp > 10000) ? $temp : 10000;
if (!!trigger.data.debug)
{
bounce ($helper);
}
}",
"messages": [
{
"app": "data",
"payload": {
"helper": "{ $helper }",
"ask_help": "{ "true" }",
"requested_time": "{ $draw_time }",
"acceptable_delay": "{ $DRAWING_TIME_TOLERANCE }"
}
},
{
"app": "payment",
"payload": {
"asset": "{ $asset }",
"outputs": [
{
"address": "{ $THAANKS }",
"amount": "{ $reward }"
},
{
"address": "{ trigger.address }",
"amount": "{ $reimbursement }"
}
]
}
},
{
"app": "state",
"state": "{
if($buy_last_ticket)
{
var[$key||"_number_of_players"] = $nop;
var[$key||"_player_"||$nop] = trigger.address;
var[$key||"_balance"] += trigger.output[[asset=$asset]]-1000;
response['message'] = "You have enter the lottery, and trigger the draw ^^";
}
else
response['message'] = "You have trigger the draw ^^ ";
var[$key||"_balance"] -= $reward;
var[$key||"_seed"] = $helper; // for next helper draw if necessary
var[$key||"_draw_time"] = $draw_time;
}"
}
]
},
{
"if": "{ !!var[$key||"_draw_time"] and var[$key||"_draw_time"] > timestamp }",
"messages": [
{
"app": "state",
"state": "{
bounce ("Too early draw time is set to "|| var[$key||"_draw_time"]);
}"
}
]
},
{
"if": "{ !!var[$key||"_draw_time"] and timestamp < var[$key||"_draw_time"] + $DRAWING_TIME_TOLERANCE }",
"init": "{
// all time variable fixed in the dag
$timestamp = data_feed[[oracles='OPNUXBRSSQQGHKQNEPD2GLWQYEUY5XLD', feed_name='timestamp']];
$total_cap = data_feed[[oracles='F4KHJUCLJKY4JV7M5F754LAJX4EB7M4N', feed_name='TOTAL_CAP']];
$eth_btc_price = data_feed[[oracles='F4KHJUCLJKY4JV7M5F754LAJX4EB7M4N', feed_name='ETH_BTC']];
// and the winner is
$draw_seed = $timestamp||$total_cap||$bitcoin_hash||$eth_btc_price;
$winner_num = number_from_seed($draw_seed, 1, var[$key||"_number_of_players"]);
$winner = var["_player_"||$winner_num];
}",
"messages": [
{
"app": "data",
"payload": {
"message": "{ "You won the lottery!" }"
}
},
{
"app": "payment",
"payload": {
"asset": "{ $asset }",
"outputs": [
{
"address": "{ $winner }",
"amount": "{ var[$key||"_balance"] }"
}
]
}
},
{
"app": "state",
"state": "{
var[$key||"_draw_time"] = false; var[$key||"_dead_line"] = timestamp + $ROUND_BUYING_PERIOD;
var[$key||"_balance"] = false; var[$key||"_number_of_players"] = false;
}"
}
]
},
{
"if": "{ !!var[$key||"_draw_time"] and timestamp > var[$key||"_draw_time"] + $DRAWING_TIME_TOLERANCE }",
"init": "{
// delay before we draw with seed based only on time variable data
$draw_time = timestamp + $DRAWING_TIME_DELAY;
// pick a helper from the players, but someone else or a bot will be able to trigger for the reward
$helper = var[$key||"_player_"||number_from_seed(var[$key||"_seed"], 1, var[$key||"_number_of_players"])];
$temp = round (var[$key||"_balance"] * $PERCENTAGE_FOR_HELPER / 100);
$reward = ($temp > 10000) ? $temp : 10000;
}",
"messages": [
{
"app": "data",
"payload": {
"help": "{ true }",
"helper": "{ $helper }",
"time": "{ $draw_time }",
"delay": "{ $DRAWING_TIME_TOLERANCE }"
}
},
{
"app": "payment",
"payload": {
"asset": "{ $asset }",
"outputs": [
{
"address": "{ $THAANKS }",
"amount": "{ $reward }"
}
]
}
},
{
"app": "state",
"state": "{
var[$key||"_draw_time"] = $draw_time;
var[$key||"_balance"] -= $reward;
var[$key||"_seed"] = $helper;
response['message'] = "AA was not triggered in time, and other random draw time as been piced and a user as been asked for help.";
}"
}
]
},
{
"messages": [
{
"app": "state",
"state": "{ bounce ($INSTRUCTIONS ||$key);}"
}
]
}
]
}
}
]