Skip to content

Commit 6af1a8e

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

File tree

2 files changed

+77
-0
lines changed

2 files changed

+77
-0
lines changed

pyteal/ast/abi/reference_type.py

Lines changed: 11 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,8 @@ 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()]
94+
8495

8596
Application.__module__ = "pyteal"

pyteal/ast/abi/reference_type_test.py

Lines changed: 66 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

@@ -176,6 +198,28 @@ def test_Asset_set():
176198
assert actual == expected
177199

178200

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

@@ -260,3 +304,25 @@ def test_Application_set():
260304

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

0 commit comments

Comments
 (0)