Skip to content

Commit cf7fb08

Browse files
committed
fix: deployment send params aren't passed into the composer
1 parent 6d7bb66 commit cf7fb08

File tree

4 files changed

+225
-4
lines changed

4 files changed

+225
-4
lines changed

src/algokit_utils/applications/app_deployer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -488,7 +488,7 @@ def _replace_app(
488488
composer.add_app_delete(delete_params)
489489
delete_txn_index = composer.count() - 1
490490

491-
result = composer.send()
491+
result = composer.send(deployment.send_params)
492492

493493
create_result = SendAppCreateTransactionResult[ABIReturn].from_composer_result(result, create_txn_index)
494494
delete_result = SendAppTransactionResult[ABIReturn].from_composer_result(result, delete_txn_index)
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
{
2+
"name": "DeleteAbiWithInner",
3+
"structs": {},
4+
"methods": [
5+
{
6+
"name": "create",
7+
"args": [],
8+
"returns": {
9+
"type": "void"
10+
},
11+
"actions": {
12+
"create": ["NoOp"],
13+
"call": []
14+
},
15+
"readonly": false,
16+
"events": [],
17+
"recommendations": {}
18+
},
19+
{
20+
"name": "delete",
21+
"args": [
22+
{
23+
"type": "uint64",
24+
"name": "app_id"
25+
}
26+
],
27+
"returns": {
28+
"type": "void"
29+
},
30+
"actions": {
31+
"create": [],
32+
"call": ["DeleteApplication"]
33+
},
34+
"readonly": false,
35+
"events": [],
36+
"recommendations": {}
37+
}
38+
],
39+
"arcs": [22, 28],
40+
"networks": {},
41+
"state": {
42+
"schema": {
43+
"global": {
44+
"ints": 0,
45+
"bytes": 1
46+
},
47+
"local": {
48+
"ints": 0,
49+
"bytes": 0
50+
}
51+
},
52+
"keys": {
53+
"global": {
54+
"greeting": {
55+
"keyType": "AVMString",
56+
"valueType": "AVMString",
57+
"key": "Z3JlZXRpbmc="
58+
}
59+
},
60+
"local": {},
61+
"box": {}
62+
},
63+
"maps": {
64+
"global": {},
65+
"local": {},
66+
"box": {}
67+
}
68+
},
69+
"bareActions": {
70+
"create": [],
71+
"call": []
72+
},
73+
"sourceInfo": {
74+
"approval": {
75+
"sourceInfo": [
76+
{
77+
"pc": [50],
78+
"errorMessage": "OnCompletion is not DeleteApplication"
79+
},
80+
{
81+
"pc": [66],
82+
"errorMessage": "OnCompletion is not NoOp"
83+
},
84+
{
85+
"pc": [70],
86+
"errorMessage": "can only call when creating"
87+
},
88+
{
89+
"pc": [53],
90+
"errorMessage": "can only call when not creating"
91+
}
92+
],
93+
"pcOffsetMethod": "cblocks"
94+
},
95+
"clear": {
96+
"sourceInfo": [],
97+
"pcOffsetMethod": "none"
98+
}
99+
},
100+
"source": {
101+
"approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyB0ZXN0cy5hcnRpZmFjdHMuZGVsZXRlX2FiaV93aXRoX2lubmVyLmNvbnRyYWN0LkRlbGV0ZUFiaVdpdGhJbm5lci5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgVE1QTF9ERUxFVEFCTEUKICAgIGJ5dGVjYmxvY2sgVE1QTF9HUkVFVElORwogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gY29udHJhY3QucHk6MTEKICAgIC8vIHNlbGYuZ3JlZXRpbmcgPSBUZW1wbGF0ZVZhcltTdHJpbmddKCJHUkVFVElORyIpCiAgICBwdXNoYnl0ZXMgImdyZWV0aW5nIgogICAgYnl0ZWNfMCAvLyBUTVBMX0dSRUVUSU5HCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBjb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBEZWxldGVBYmlXaXRoSW5uZXIoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2FmdGVyX2lmX2Vsc2VANwogICAgcHVzaGJ5dGVzcyAweDRjNWM2MWJhIDB4OGEzOWU3OWYgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiLCBtZXRob2QgImRlbGV0ZSh1aW50NjQpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY3JlYXRlX3JvdXRlQDUgbWFpbl9kZWxldGVfcm91dGVANgoKbWFpbl9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBjb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBEZWxldGVBYmlXaXRoSW5uZXIoQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXR1cm4KCm1haW5fZGVsZXRlX3JvdXRlQDY6CiAgICAvLyBjb250cmFjdC5weToxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgRGVsZXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gY29udHJhY3QucHk6OQogICAgLy8gY2xhc3MgRGVsZXRlQWJpV2l0aElubmVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBjb250cmFjdC5weToxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdKQogICAgY2FsbHN1YiBkZWxldGUKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY3JlYXRlX3JvdXRlQDU6CiAgICAvLyBjb250cmFjdC5weToxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5kZWxldGVfYWJpX3dpdGhfaW5uZXIuY29udHJhY3QuRGVsZXRlQWJpV2l0aElubmVyLmRlbGV0ZShhcHBfaWQ6IHVpbnQ2NCkgLT4gdm9pZDoKZGVsZXRlOgogICAgLy8gY29udHJhY3QucHk6MTctMTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIC8vIGRlZiBkZWxldGUoc2VsZiwgYXBwX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGNvbnRyYWN0LnB5OjE5CiAgICAvLyBhcmM0LmFiaV9jYWxsKCJub19vcCIsIGFwcF9pZD1hcHBfaWQpCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGJ5dGVzIDB4NzcyOWViMzIgLy8gbWV0aG9kICJub19vcCgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29udHJhY3QucHk6MjAKICAgIC8vIGFzc2VydCBUZW1wbGF0ZVZhcltib29sXSgiREVMRVRBQkxFIikKICAgIGludGNfMiAvLyBUTVBMX0RFTEVUQUJMRQogICAgYXNzZXJ0CiAgICByZXRzdWIK",
102+
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"
103+
},
104+
"byteCode": {
105+
"approval": "CiADAAEAJgEAMRhAAAyACGdyZWV0aW5nKGcxG0EAFYICBExcYboEijnnnzYaAI4CABQAAiJDMRmBBRJEMRhENhoBF4gADCNDMRkURDEYFEQjQ4oBALGL/7IYgAR3KesyshqBBrIQIrIBsyREiQ==",
106+
"clear": "CoEBQw=="
107+
},
108+
"compilerInfo": {
109+
"compiler": "puya",
110+
"compilerVersion": {
111+
"major": 4,
112+
"minor": 4,
113+
"patch": 4
114+
}
115+
},
116+
"events": [],
117+
"templateVariables": {
118+
"DELETABLE": {
119+
"type": "AVMUint64"
120+
},
121+
"GREETING": {
122+
"type": "AVMString"
123+
}
124+
}
125+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from algopy import (
2+
ARC4Contract,
3+
arc4,
4+
UInt64,
5+
TemplateVar,
6+
String
7+
)
8+
9+
class DeleteAbiWithInner(ARC4Contract):
10+
def __init__(self) -> None:
11+
self.greeting = TemplateVar[String]("GREETING")
12+
13+
@arc4.abimethod(create="require")
14+
def create(self) -> None:
15+
return
16+
17+
@arc4.abimethod(allow_actions=["DeleteApplication"])
18+
def delete(self, app_id: UInt64) -> None:
19+
arc4.abi_call("no_op", app_id=app_id)
20+
assert TemplateVar[bool]("DELETABLE")

tests/transactions/test_fee_coverage.py

Lines changed: 79 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,18 @@
77

88
from algokit_utils import SigningAccount
99
from algokit_utils.algorand import AlgorandClient
10-
from algokit_utils.applications.app_client import AppClient, AppClientMethodCallParams, FundAppAccountParams
11-
from algokit_utils.applications.app_factory import AppFactoryCreateMethodCallParams, AppFactoryCreateParams
12-
from algokit_utils.models.amount import AlgoAmount
10+
from algokit_utils.applications.app_client import (
11+
AppClient,
12+
AppClientMethodCallCreateParams,
13+
AppClientMethodCallParams,
14+
FundAppAccountParams,
15+
)
16+
from algokit_utils.applications.app_deployer import OnUpdate
17+
from algokit_utils.applications.app_factory import (
18+
AppFactoryCreateMethodCallParams,
19+
AppFactoryCreateParams,
20+
)
21+
from algokit_utils.models.amount import AlgoAmount, micro_algo
1322
from algokit_utils.transactions.transaction_composer import PaymentParams
1423

1524

@@ -692,3 +701,70 @@ def _assert_min_fee(self, app_client: AppClient, params: AppClientMethodCallPara
692701

693702
with pytest.raises(Exception, match="fee too small"):
694703
app_client.send.call(params_copy)
704+
705+
706+
class TestAppDeployerFees:
707+
@pytest.fixture
708+
def algorand(self) -> AlgorandClient:
709+
algorand = AlgorandClient.default_localnet()
710+
sp = algorand.client.algod.suggested_params()
711+
sp.min_fee = 1000
712+
algorand.set_suggested_params_cache(suggested_params=sp)
713+
return algorand
714+
715+
@pytest.fixture
716+
def inner_app_id(self, algorand: AlgorandClient, funded_account: SigningAccount) -> int:
717+
# Load inner fee contract spec
718+
spec_path = Path(__file__).parent.parent / "artifacts" / "inner-fee" / "application.json"
719+
inner_fee_spec = json.loads(spec_path.read_text())
720+
721+
# Create app factory
722+
factory = algorand.client.get_app_factory(app_spec=inner_fee_spec, default_sender=funded_account.address)
723+
724+
# Create app
725+
app_client, _ = factory.send.bare.create()
726+
return app_client.app_id
727+
728+
def test_delete_abi_inner_app_call_fees_should_be_covered(
729+
self, algorand: AlgorandClient, funded_account: SigningAccount, inner_app_id: int
730+
) -> None:
731+
# contract spec
732+
contract_spec_path = Path(__file__).parent.parent / "artifacts" / "delete_abi_with_inner" / "application.json"
733+
contract_spec = json.loads(contract_spec_path.read_text())
734+
735+
# Create app factory
736+
factory = algorand.client.get_app_factory(app_spec=contract_spec, default_sender=funded_account.address)
737+
738+
# Deploy the app and fund the account
739+
app_client, _ = factory.deploy(
740+
compilation_params={
741+
"deploy_time_params": {
742+
"GREETING": "Hello",
743+
},
744+
"deletable": True,
745+
},
746+
create_params=AppClientMethodCallCreateParams(
747+
method="create", args=[inner_app_id], max_fee=micro_algo(200_000)
748+
),
749+
)
750+
app_client.fund_app_account(FundAppAccountParams(amount=AlgoAmount.from_algo(3)))
751+
752+
# Replace the app, the delete call has inner app call
753+
_, replace_deploy_result = factory.deploy(
754+
compilation_params={
755+
"deploy_time_params": {
756+
"GREETING": "Hello!",
757+
},
758+
"deletable": True,
759+
},
760+
on_update=OnUpdate.ReplaceApp,
761+
create_params=AppClientMethodCallCreateParams(
762+
method="create", args=[inner_app_id], max_fee=micro_algo(200_000)
763+
),
764+
delete_params=AppClientMethodCallParams(method="delete", args=[inner_app_id], max_fee=micro_algo(200_000)),
765+
send_params={"populate_app_call_resources": True, "cover_app_call_inner_transaction_fees": True},
766+
)
767+
768+
assert replace_deploy_result.create_result is not None
769+
assert replace_deploy_result.delete_result is not None
770+
assert replace_deploy_result.delete_result.confirmation is not None

0 commit comments

Comments
 (0)