Skip to content

Commit fd045ff

Browse files
committed
adding deref type to get the underlying value of the reference type
1 parent 57cf6e4 commit fd045ff

File tree

2 files changed

+74
-0
lines changed

2 files changed

+74
-0
lines changed

pyteal/ast/abi/reference_type.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
from pyteal.ast.abi.uint import Uint, UintTypeSpec
2+
from pyteal.ast.expr import Expr
3+
from pyteal.ast.txn import Txn
24

35

46
class AccountTypeSpec(UintTypeSpec):
@@ -25,6 +27,9 @@ class Account(Uint):
2527
def __init__(self) -> None:
2628
super().__init__(AccountTypeSpec())
2729

30+
def deref(self)->Expr:
31+
return Txn.accounts[self.stored_value.load()]
32+
2833

2934
Account.__module__ = "pyteal"
3035

@@ -53,6 +58,9 @@ class Asset(Uint):
5358
def __init__(self) -> None:
5459
super().__init__(AssetTypeSpec())
5560

61+
def deref(self)->Expr:
62+
return Txn.assets[self.stored_value.load()]
63+
5664

5765
Asset.__module__ = "pyteal"
5866

@@ -81,5 +89,7 @@ class Application(Uint):
8189
def __init__(self) -> None:
8290
super().__init__(ApplicationTypeSpec())
8391

92+
def deref(self)->Expr:
93+
return Txn.applications[self.stored_value.load()]
8494

8595
Application.__module__ = "pyteal"

pyteal/ast/abi/reference_type_test.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,28 @@ def test_Account_set():
9090
assert actual == expected
9191

9292

93+
def test_Account_deref():
94+
val_to_set = 2
95+
value = abi.Account()
96+
value.set(val_to_set)
97+
expr = value.deref()
98+
assert expr.type_of() == pt.TealType.bytes
99+
assert expr.has_return() is False
100+
101+
expected = pt.TealSimpleBlock(
102+
[
103+
pt.TealOp(None, pt.Op.load, value.stored_value.slot),
104+
pt.TealOp(None, pt.Op.txnas, 'Accounts'),
105+
]
106+
)
107+
actual, _ = expr.__teal__(options)
108+
actual.addIncoming()
109+
actual = pt.TealBlock.NormalizeBlocks(actual)
110+
111+
with pt.TealComponent.Context.ignoreExprEquality():
112+
assert actual == expected
113+
114+
93115
def test_Asset_str():
94116
assert str(abi.AssetTypeSpec()) == "asset"
95117

@@ -175,6 +197,27 @@ def test_Asset_set():
175197
with pt.TealComponent.Context.ignoreExprEquality():
176198
assert actual == expected
177199

200+
def test_Asset_deref():
201+
val_to_set = 2
202+
value = abi.Asset()
203+
value.set(val_to_set)
204+
expr = value.deref()
205+
assert expr.type_of() == pt.TealType.uint64
206+
assert expr.has_return() is False
207+
208+
expected = pt.TealSimpleBlock(
209+
[
210+
pt.TealOp(None, pt.Op.load, value.stored_value.slot),
211+
pt.TealOp(None, pt.Op.txnas, 'Assets'),
212+
]
213+
)
214+
actual, _ = expr.__teal__(options)
215+
actual.addIncoming()
216+
actual = pt.TealBlock.NormalizeBlocks(actual)
217+
218+
with pt.TealComponent.Context.ignoreExprEquality():
219+
assert actual == expected
220+
178221

179222
def test_Application_str():
180223
assert str(abi.ApplicationTypeSpec()) == "application"
@@ -260,3 +303,24 @@ def test_Application_set():
260303

261304
with pt.TealComponent.Context.ignoreExprEquality():
262305
assert actual == expected
306+
307+
def test_Application_deref():
308+
val_to_set = 2
309+
value = abi.Application()
310+
value.set(val_to_set)
311+
expr = value.deref()
312+
assert expr.type_of() == pt.TealType.uint64
313+
assert expr.has_return() is False
314+
315+
expected = pt.TealSimpleBlock(
316+
[
317+
pt.TealOp(None, pt.Op.load, value.stored_value.slot),
318+
pt.TealOp(None, pt.Op.txnas, 'Applications'),
319+
]
320+
)
321+
actual, _ = expr.__teal__(options)
322+
actual.addIncoming()
323+
actual = pt.TealBlock.NormalizeBlocks(actual)
324+
325+
with pt.TealComponent.Context.ignoreExprEquality():
326+
assert actual == expected

0 commit comments

Comments
 (0)