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