summaryrefslogtreecommitdiff
path: root/test/scripts/e2e_subs/example.py
blob: 9e4e97097ace4e4dedbee50e63c47d8ef7125fc8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#!/usr/bin/env python

import os
import sys
from goal import Goal

import algosdk.transaction as txn
from datetime import datetime

stamp = datetime.now().strftime("%Y%m%d_%H%M%S")
print(f"{os.path.basename(sys.argv[0])} start {stamp}")

goal = Goal(sys.argv[1])

joe = goal.new_account()
flo = goal.new_account()

# Pays

pay = goal.pay(goal.account, receiver=joe, amt=10000)  # under min balance
txid, err = goal.send(pay, confirm=False)              # errors early
assert "balance 10000 below min 100000" in str(err), err

pay = goal.pay(goal.account, receiver=joe, amt=500_000)
txinfo, err = goal.send(pay)
assert not err, err
tx = txinfo['txn']['txn']
assert tx['amt'] == 500_000
assert tx['fee'] == 1000
assert goal.balance(joe) == 500_000

# Asset creation
acfg = goal.acfg(joe,
                 total=10_000, unit_name='oz', asset_name='Gold',
                 freeze=flo)
txinfo, err = goal.send(acfg)
assert not err, err
gold = txinfo['asset-index']
assert goal.balance(joe, gold) == 10_000

# Asset transfer
axfer = goal.axfer(joe, goal.account, 50, gold)
txinfo, err = goal.send(axfer)
assert err
assert goal.balance(joe, gold) == 10_000

optin = goal.axfer(goal.account, goal.account, 0, gold)
txinfo, err = goal.send(optin)
assert not err, err

axfer = goal.axfer(joe, goal.account, 50, gold)
txinfo, err = goal.send(axfer)
assert not err, err
assert goal.balance(joe, gold) == 9_950
assert goal.balance(goal.account, gold) == 50

txinfo, err = goal.send(goal.pay(goal.account, receiver=flo, amt=1500_000))
assert not err, err

# Freezing, and txgroup
assert not goal.holding(goal.account, gold)[1]
freeze1 = goal.afrz(flo, gold, goal.account, True)
freeze2 = goal.afrz(flo, gold, joe, True)
txinfo, err = goal.send_group([freeze1, freeze2])
assert not err, err
assert goal.holding(goal.account, gold)[1]
assert goal.holding(joe, gold)[1]

# App create
teal = "test/scripts/e2e_subs/tealprogs"
approval = goal.assemble(os.path.join(teal, "app-escrow.teal"))
yes = goal.assemble("#pragma version 2\nint 28")  # 28 is just to uniquify
create = goal.appl(flo, 0,
                   local_schema=(1, 0),
                   global_schema=(0, 4),
                   approval_program=approval,
                   clear_program=yes)
txinfo, err = goal.send(create)
app_id = txinfo['application-index']
assert app_id

# app_create is a convenience wrapper around appl
create = goal.app_create(flo, approval, local_schema=(1, 0))
txinfo, err = goal.send(create)
assert not err, err

app2_id = txinfo['application-index']
assert app_id

app_info = goal.app_info(app_id)
assert app_info['local-state-schema']['num-uint'] == 1, app_info

# App opt-in
optin = goal.appl(joe, app2_id, txn.OnComplete.OptInOC)
txinfo, err = goal.send(optin)
assert not err, err

# convenience wrapper
optin = goal.app_optin(joe, app_id)
txinfo, err = goal.send(optin)
assert not err, err

# App call, with group
deposit = goal.appl(joe, app_id, app_args=["deposit():void"])
payin = goal.pay(goal.account, goal.app_address(app_id), 150_000)
txinfo, err = goal.send_group([deposit, payin])
assert not err, err

app_info = goal.app_info(app_id)
global_state = goal.app_read(app_id)
assert global_state[b'debug'] == b'deposit', global_state
local_state = goal.app_read(app_id, joe)
assert local_state[b'balance'] == 150_000, local_state

# Pay to logicsig, and spend from there, which requires signing by logicsig
fund = goal.pay(goal.account, goal.logic_address(yes), 110_000)
txinfo, err = goal.send(fund)
assert not err, err

spend = goal.pay(goal.logic_address(yes), joe, 2_000)
spend = goal.sign_with_program(spend, yes)
txinfo, err = goal.send(spend)
assert not err, err
assert goal.balance(goal.logic_address(yes)) == 107_000, goal.balance(goal.logic_address(yes))

stamp = datetime.now().strftime("%Y%m%d_%H%M%S")
print(f"{os.path.basename(sys.argv[0])} OK {stamp}")