| 1 | [ |
| 2 | "autonomous agent", |
| 3 | { |
| 4 | "doc_url": "https://raw.githubusercontent.com/jldevelops/aa-lottery-oracle/master/description.json", |
| 5 | "getters": "{ |
| 6 | $ENTRY = => params.entry > 10000 ? params.entry : 10000; |
| 7 | $TRIGGER_FEE = => params.trigger_fee; |
| 8 | $ORACLE = => params.oracle; |
| 9 | $FEED_NAME = => params.feed_name; |
| 10 | |
| 11 | $triggerPot = => var['tickets_sold'] * $TRIGGER_FEE(); |
| 12 | $winnerPot = => var['tickets_sold'] * $ENTRY() - $triggerPot(); |
| 13 | $actualWinner = => var['tickets_sold'] > 1 ? number_from_seed(data_feed[[oracles=$ORACLE(), feed_name=$FEED_NAME()]],var['tickets_sold']-1) : 0; |
| 14 | $isWinnerTicket = $ti => var['amount_'||$ti[0]] ? (($ti[1]+0) <= var['winner_'||$ti[0]] AND ($ti[2]+0) > var['winner_'||$ti[0]]) : false; |
| 15 | $now = => timestamp_to_string(timestamp, 'date'); |
| 16 | $day = => var['today'] ? var['today'] : $now(); |
| 17 | $isTriggerAvailable = => $now() != $day() AND var['tickets_sold'] > 0; |
| 18 | }", |
| 19 | "init": "{ |
| 20 | $opFee = => (balance[base] - storage_size - var['user_bytes'] - trigger.output[[asset=base]]) > 20000 ? 0 : 5000; |
| 21 | if(trigger.output[[asset!=base]].asset != 'none') |
| 22 | bounce('no asset'); |
| 23 | }", |
| 24 | "messages": { |
| 25 | "cases": [ |
| 26 | { |
| 27 | "if": "{trigger.data.trigger AND $isTriggerAvailable() AND trigger.output[[asset=base]] >= 10000}", |
| 28 | "messages": [ |
| 29 | { |
| 30 | "app": "payment", |
| 31 | "payload": { |
| 32 | "asset": "base", |
| 33 | "outputs": [ |
| 34 | { |
| 35 | "address": "{trigger.address}", |
| 36 | "amount": "{$triggerPot() + trigger.output[[asset=base]] - $opFee()}" |
| 37 | } |
| 38 | ] |
| 39 | } |
| 40 | }, |
| 41 | { |
| 42 | "app": "state", |
| 43 | "state": "{ |
| 44 | $d = $day(); |
| 45 | var['winner_'||$d] = $actualWinner(); |
| 46 | var['amount_'||$d] = $winnerPot(); |
| 47 | var['user_bytes'] -= $triggerPot(); |
| 48 | var['today'] = $now(); |
| 49 | var['tickets_sold'] = 0; |
| 50 | response['message'] = 'Winner ticket '||$d||': '||var['winner_'||$d]; |
| 51 | }" |
| 52 | } |
| 53 | ] |
| 54 | }, |
| 55 | { |
| 56 | "init": "{ |
| 57 | if($isTriggerAvailable()) |
| 58 | bounce('Trigger reward available, send trigger = 1 to win '||$triggerPot()||' bytes'); |
| 59 | if(trigger.data.trigger) |
| 60 | bounce('Trigger reward not available'); |
| 61 | $ticket = var[trigger.address]; |
| 62 | if($ticket AND $ticket[0] == $day()) |
| 63 | bounce('Address already registered'); |
| 64 | }", |
| 65 | "messages": [ |
| 66 | { |
| 67 | "if": "{$ticket AND $isWinnerTicket($ticket)}", |
| 68 | "app": "payment", |
| 69 | "payload": { |
| 70 | "asset": "base", |
| 71 | "outputs": [ |
| 72 | { |
| 73 | "address": "{trigger.address}", |
| 74 | "amount": "{var['amount_'||$ticket[0]] + trigger.output[[asset=base]] - $opFee()}" |
| 75 | } |
| 76 | ] |
| 77 | } |
| 78 | }, |
| 79 | { |
| 80 | "app": "state", |
| 81 | "state": "{ |
| 82 | if($ticket AND $isWinnerTicket($ticket)){ |
| 83 | var['user_bytes'] -= var['amount_'||$ticket[0]]; |
| 84 | var['amount_'||$ticket[0]] = false; |
| 85 | var['winner_'||$ticket[0]] = false; |
| 86 | response['message'] = 'You won '||$ticket[0]||' draw. Congratulations!'; |
| 87 | } |
| 88 | else{ |
| 89 | if((trigger.output[[asset=base]] % $ENTRY()) != 0) |
| 90 | bounce('Amount has to be multiple of '||$ENTRY()||' bytes. An address can buy tickets once a day.'); |
| 91 | if(!var['today'] OR (var['tickets_sold'] == 0 AND $now() != $day())) |
| 92 | var['today'] = $now(); |
| 93 | $tickets = trigger.output[[asset=base]] / $ENTRY(); |
| 94 | var[trigger.address] = [$day(), var['tickets_sold']+0, ($tickets + var['tickets_sold'])]; |
| 95 | var['user_bytes'] += trigger.output[[asset=base]]; |
| 96 | var['tickets_sold'] += $tickets; |
| 97 | response['message'] = 'You bought '||$tickets||' tickets. Actual winner pot: '||$winnerPot()||' bytes. Actual trigger pot: '||$triggerPot()||' bytes'; |
| 98 | } |
| 99 | }" |
| 100 | } |
| 101 | ] |
| 102 | } |
| 103 | ] |
| 104 | } |
| 105 | } |
| 106 | ] |