Use Case: Auction Agent
-----------------------

An Auction Agent is an AT that will allow people to send funds which will be refunded back to them (minus a
minimum fee) if someone else sends more. A "buy now" price would become an instant "auction finish" and the
actual auction finish will need to use some "random" data so that the exact end of the auction isn't easily
manipulated. If bid is more than "buy now" the difference is refunded.

Variables
---------

@00 ==> @timestamp
@01 ==> @decision_time
@02 ==> @txid
@03 ==> @balance
@04 ==> @tx_info
@05 ==> @buy_now
@06 ==> @target_acc
@07 ==> @best_bid
@08 ==> @tx_source
@09 ==> @best_account

Functions
----------

20 (0x14) = get a time stamp value for the last block in the blockchain
21 (0x15) = get txid for the first tx after the provided time stamp
22 (0x16) = get a time stamp value for a given txid
23 (0x17) = get ticket for a given txid
24 (0x18) = get source account/address for a given txid
26 (0x1a) = pay account balance to a given account/address
27 (0x1b) = get funds amount for a given txid
28 (0x1c) = get tx type and subtype for a given txid
31 (0x1f) = pay given funds amount to a given account/address

Sample Function Data:
---------------------

balance 1000
function 020 0x0000000000000000 true
function +021 0x0000000000000064,0x0000000000000065,0x0000000000000066,0x0000000000000167,0x0000000000000000 false
function 022 0x0000000000013a80,0x0000000000023a80,0x000000000ff9f9af,0x000000000ff9f9bf,0x0000000000000000 false
function 023 0x000000000000ff00,0x000000000000ee00,0x0000000000004400,0x0100000000000000,0x0000000000000000 false
function 024 0x1111000000000000,0x2222000000000000,0x3333000000000000,0x4444000000000000,0x0000000000000000 false
function 025 0 true
function 027 0x0000000000000066,0x0000000000000068,0x000000000000095,0x0000000000000064,0x0000000000000069 false
function 028 0x0000000000000000 true

Sample Run Output:
------------------

func: 20 rc: 0000000000000000
func1: 21 with 0 rc: 0000000000000064
func1: 22 with 100 rc: 0000000000013a80
func1: 28 with 100 rc: 0000000000000000
func1: 27 with 100 rc: 0000000000000066
payout 100 to account: 00000000
func1: 24 with 100 rc: 1111000000000000
func1: 21 with 80512 rc: 0000000000000065
func1: 22 with 101 rc: 0000000000023a80
func1: 28 with 101 rc: 0000000000000000
func1: 27 with 101 rc: 0000000000000068
payout 102 to account: 1111000000000000
func1: 24 with 101 rc: 2222000000000000
func1: 21 with 146048 rc: 0000000000000066
func1: 22 with 102 rc: 000000000ff9f9af
func1: 23 with 102 rc: 0000000000004400
func1: 28 with 102 rc: 0000000000000000
func1: 27 with 102 rc: 0000000000000095
payout 104 to account: 2222000000000000
func1: 24 with 102 rc: 3333000000000000
func1: 21 with 268040623 rc: 0000000000000167
func1: 22 with 359 rc: 000000000ff9f9bf
func1: 23 with 359 rc: 0100000000000000
func1: 24 with 359 rc: 4444000000000000
func1: 27 with 359 rc: 0000000000000064
payout 100 to account: 4444000000000000
payout 149 to account: 3333000000000000
func1: 21 with 268040639 rc: 0000000000000000
payout 379 to account: 286331153
(stopped - zero balance)

Script Assembly
---------------

if @timestamp not zero goto loop                         1e0000000041
get last block timestamp and put in @timestamp           35140000000000
set @decision_time                                       0101000000c55d0a0000000000
set @buy_now (to 10000)                                  01050000006401000000000000
set @target_acc                                          01060000001111111100000000
set @best_bid to (100)                                   01070000006400000000000000

:loop
get tx at after @timestamp and store in @txid            3615000200000000000000
if @txid is zero finish                                  2602000000

get timestamp for @txid and store in @timestamp          3616000000000002000000
if @timestamp < @decision_time goto no-decision          2000000000010000000f
goto decision                                            1a6d010000

:no-decision
get type for @txid and store in @tx_info                 361c000400000002000000
if @tx_info is zero goto continue                        1b040000000b
goto loop                                                1a41000000

:continue
get amount for @txid and store in @tx_info               361b000400000002000000
if @tx_info <= @best_bid goto :refund-bid                22040000000700000038

send @best_bid to @best_account                          341f000700000009000000
set @best_bid to @tx_info                                020700000004000000
get account for @tx_id and store in @best_account        3618000900000002000000

if @best_bid >= @buy_now goto buynow                     2107000000050000002a
goto loop                                                1a41000000

:refund-bid
get account for @tx_id and store in @tx_source           3618000800000002000000
send @tx_info to @tx_source                              341f000400000008000000
goto loop                                                1a41000000

:buynow
send @buy_now to @target_acc                             341f000500000006000000
if @best_bid == @buy_now goto payout                     23070000000500000027
set @tx_info to @best_bid                                020400000007000000
subtract @buy_now to @tx_info                            07040000000500000000

:payout
send @tx_info to @best_account                           341f000400000009000000

:refund loop
get tx after @timestamp and store in @txid               3615000200000000000000
if @txid is non zero goto refund cont                    1e020000000f
set pcs                                                  30
send balance to target_acc                               331a0006000000
finish                                                   28

:refund cont
get type for @txid and store in @tx_info                 361c000400000002000000
if @tx_info is zero go to skip                           1b0400000027

get account for @txid and put in @tx_source              3618000800000002000000
get amount for @txid and put in @tx_info                 361b000400000002000000
send @tx_info to @tx_source                              341f000400000008000000

:skip
get timestamp for @txid and store in @timestamp          3616000000000002000000
goto refund loop                                         1a11010000

:decision
get rand for txid and store in @tx_info                  3617000400000002000000
AND 1 to @tx_info                                        0b0400000001000000
if @tx_info is zero goto finalize                        1b040000000b
goto no-decision                                         1a6b000000

:finalize
get account for @txid and put in @tx_source              3618000800000002000000
get amount for @txid and put in @tx_info                 361b000400000002000000
send @tx_info to @tx_source                              341f000400000008000000
send @best_bid to @best_account                          341f000700000009000000
goto refund loop                                         1a01110000

Assembly Code
-------------

00000000* BNZ $00000000 :00000041
00000006  FUN @00000000 20
0000000d  SET @00000001 #00000000000a5dc5
0000001a  SET @00000005 #0000000000000164
00000027  SET @00000006 #0000000011111111
00000034  SET @00000007 #0000000000000064
00000041  FUN @00000002 21 $00000000
0000004c  FIZ @00000002
00000051  FUN @00000000 22 $00000002
0000005c  BLT $00000000 $00000001 :0000006b
00000066  JMP :0000016d
0000006b  FUN @00000004 28 $00000002
00000076  BZR $00000004 :00000081
0000007c  JMP :00000041
00000081  FUN @00000004 27 $00000002
0000008c  BLE $00000004 $00000007 :000000c4
00000096  FUN 31 $00000007 $00000009
000000a1  SET @00000007 $00000004
000000aa  FUN @00000009 24 $00000002
000000b5  BGE $00000007 $00000005 :000000df
000000bf  JMP :00000041
000000c4  FUN @00000008 24 $00000002
000000cf  FUN 31 $00000004 $00000008
000000da  JMP :00000041
000000df  FUN 31 $00000005 $00000006
000000ea  BEQ $00000007 $00000005 :00000111
000000f4  SET @00000004 $00000007
000000fd  SUB @00000004 $00000005
00000106  FUN 31 $00000004 $00000009
00000111  FUN @00000002 21 $00000000
0000011c  BNZ $00000002 :0000012b
00000122  PCS
00000123  FUN 26 $00000006
0000012a  FIN
0000012b  FUN @00000004 28 $00000002
00000136  BZR $00000004 :0000015d
0000013c  FUN @00000008 24 $00000002
00000147  FUN @00000004 27 $00000002
00000152  FUN 31 $00000004 $00000008
0000015d  FUN @00000000 22 $00000002
00000168  JMP :00000111
0000016d  FUN @00000004 23 $00000002
00000178  AND @00000004 $0000000000000001
00000181  BZR $00000004 :0000018c
00000187  JMP :0000006b
0000018c  FUN @00000008 24 $00000002
00000197  FUN @00000004 27 $00000002
000001a2  FUN 31 $00000004 $00000008
000001ad  FUN 31 $00000007 $00000009
000001b8  JMP :00000111

Machine Code
------------

1e0000000041351400000000000101000000c55d0a00000000000105000000640100000000000001060000001111111100000000
010700000064000000000000003615000200000000000000260200000036160000000000020000002000000000010000000f1a6d
010000361c0004000000020000001b040000000b1a41000000361b00040000000200000022040000000700000038341f00070000
000900000002070000000400000036180009000000020000002107000000050000002a1a41000000361800080000000200000034
1f0004000000080000001a41000000341f0005000000060000002307000000050000002702040000000700000007040000000500
0000341f00040000000900000036150002000000000000001e020000000f30331a000600000028361c0004000000020000001b04
000000273618000800000002000000361b000400000002000000341f00040000000800000036160000000000020000001a110100
0036170004000000020000000b04000000010000001b040000000b1a6b0000003618000800000002000000361b00040000000200
0000341f000400000008000000341f0007000000090000001a11010000