Skip to content
This repository was archived by the owner on Nov 3, 2023. It is now read-only.
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 0a7c8e2

Browse files
committedAug 2, 2023
update template, setup UI
1 parent 39675f5 commit 0a7c8e2

File tree

13 files changed

+999
-290
lines changed

13 files changed

+999
-290
lines changed
 

‎intermediate-en/session_3/dao/.copier-answers.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY
2-
_commit: 0.2.1-22-gd5c2296
3-
_src_path: https://github.com/algorandfoundation/algokit-fullstack-template
2+
_commit: 0.3.0
3+
_src_path: gh:algorandfoundation/algokit-fullstack-template
44
author_email: your@email.tld
55
author_name: Your-Name
66
cloud_provider: none

‎intermediate-en/session_3/dao/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ This project uses [GitHub Actions](https://docs.github.com/en/actions/learn-gith
3030

3131
For pushes to `main` branch, after the above checks pass, the following deployment actions are performed:
3232
- The smart contract(s) are deployed to TestNet using [AlgoNode](https://algonode.io).
33-
- The frontend application is deployed to a provider of your choice (Netflify, Vercel, etc.). See [frontend README](frontend/README.md) for more information.
33+
- The frontend application is deployed to a provider of your choice (Netlify, Vercel, etc.). See [frontend README](frontend/README.md) for more information.
3434

3535
> Please note deployment of smart contracts is done via `algokit deploy` command which can be invoked both via CI as seen on this project, or locally. For more information on how to use `algokit deploy` please see [AlgoKit documentation](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/deploy.md).
3636

‎intermediate-en/session_3/dao/backend/.copier-answers.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY
2-
_commit: 1.6.0-38-gd30492e
3-
_src_path: https://github.com/algorandfoundation/algokit-beaker-default-template
2+
_commit: 1.7.0
3+
_src_path: gh:algorandfoundation/algokit-beaker-default-template
44
algod_port: 4001
55
algod_server: http://localhost
66
algod_token: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

‎intermediate-en/session_3/dao/backend/smart_contracts/artifacts/dao/application.json

+14-24
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
{
22
"hints": {
3-
"create()void": {
4-
"call_config": {
5-
"no_op": "CREATE"
6-
}
7-
},
83
"add_proposal((string,string,string,byte[32]))void": {
94
"structs": {
105
"proposal": {
@@ -15,15 +10,15 @@
1510
"string"
1611
],
1712
[
18-
"unit_name",
13+
"url",
1914
"string"
2015
],
2116
[
22-
"url",
17+
"unit_name",
2318
"string"
2419
],
2520
[
26-
"hash",
21+
"metadata_hash",
2722
"byte[32]"
2823
]
2924
]
@@ -33,7 +28,7 @@
3328
"no_op": "CALL"
3429
}
3530
},
36-
"vote(address)void": {
31+
"vote(uint64)void": {
3732
"call_config": {
3833
"no_op": "CALL"
3934
}
@@ -45,13 +40,13 @@
4540
}
4641
},
4742
"source": {
48-
"approval": "I3ByYWdtYSB2ZXJzaW9uIDgKaW50Y2Jsb2NrIDAgMSA0IDIKYnl0ZWNibG9jayAweDc3Njk2ZTZlNjk2ZTY3NWY3MDcyNmY3MDZmNzM2MTZjIDB4CnR4bmEgQXBwbGljYXRpb25BcmdzIDAKcHVzaGJ5dGVzIDB4NGM1YzYxYmEgLy8gImNyZWF0ZSgpdm9pZCIKPT0KYm56IG1haW5fbDgKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMApwdXNoYnl0ZXMgMHhlZmE4YjQ0YiAvLyAiYWRkX3Byb3Bvc2FsKChzdHJpbmcsc3RyaW5nLHN0cmluZyxieXRlWzMyXSkpdm9pZCIKPT0KYm56IG1haW5fbDcKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMApwdXNoYnl0ZXMgMHg2MjhjZTMyZCAvLyAidm90ZShhZGRyZXNzKXZvaWQiCj09CmJueiBtYWluX2w2CnR4bmEgQXBwbGljYXRpb25BcmdzIDAKcHVzaGJ5dGVzIDB4NTU4OGRjYjQgLy8gIm1pbnQoKXZvaWQiCj09CmJueiBtYWluX2w1CmVycgptYWluX2w1Ogp0eG4gT25Db21wbGV0aW9uCmludGNfMCAvLyBOb09wCj09CnR4biBBcHBsaWNhdGlvbklECmludGNfMCAvLyAwCiE9CiYmCmFzc2VydApjYWxsc3ViIG1pbnRjYXN0ZXJfNwppbnRjXzEgLy8gMQpyZXR1cm4KbWFpbl9sNjoKdHhuIE9uQ29tcGxldGlvbgppbnRjXzAgLy8gTm9PcAo9PQp0eG4gQXBwbGljYXRpb25JRAppbnRjXzAgLy8gMAohPQomJgphc3NlcnQKY2FsbHN1YiB2b3RlY2FzdGVyXzYKaW50Y18xIC8vIDEKcmV0dXJuCm1haW5fbDc6CnR4biBPbkNvbXBsZXRpb24KaW50Y18wIC8vIE5vT3AKPT0KdHhuIEFwcGxpY2F0aW9uSUQKaW50Y18wIC8vIDAKIT0KJiYKYXNzZXJ0CmNhbGxzdWIgYWRkcHJvcG9zYWxjYXN0ZXJfNQppbnRjXzEgLy8gMQpyZXR1cm4KbWFpbl9sODoKdHhuIE9uQ29tcGxldGlvbgppbnRjXzAgLy8gTm9PcAo9PQp0eG4gQXBwbGljYXRpb25JRAppbnRjXzAgLy8gMAo9PQomJgphc3NlcnQKY2FsbHN1YiBjcmVhdGVjYXN0ZXJfNAppbnRjXzEgLy8gMQpyZXR1cm4KCi8vIGNyZWF0ZQpjcmVhdGVfMDoKcHJvdG8gMCAwCnB1c2hieXRlcyAweDYzNzU3MjcyNjU2ZTc0NWY3MDcyNmY3MDZmNzM2MTZjNWY2OTY0IC8vICJjdXJyZW50X3Byb3Bvc2FsX2lkIgppbnRjXzAgLy8gMAphcHBfZ2xvYmFsX3B1dApieXRlY18wIC8vICJ3aW5uaW5nX3Byb3Bvc2FsIgpieXRlY18xIC8vICIiCmFwcF9nbG9iYWxfcHV0CnJldHN1YgoKLy8gYWRkX3Byb3Bvc2FsCmFkZHByb3Bvc2FsXzE6CnByb3RvIDEgMAppbnRjXzAgLy8gMAppbnRjXzAgLy8gMApmcmFtZV9idXJ5IDAKdHhuIFNlbmRlcgpib3hfZGVsCnBvcAp0eG4gU2VuZGVyCmZyYW1lX2RpZyAtMQpib3hfcHV0CnR4biBTZW5kZXIKYm94X2RlbApwb3AKdHhuIFNlbmRlcgpmcmFtZV9kaWcgMAppdG9iCmJveF9wdXQKcmV0c3ViCgovLyB2b3RlCnZvdGVfMjoKcHJvdG8gMSAwCmludGNfMCAvLyAwCmZyYW1lX2RpZyAtMQpib3hfZ2V0CnN0b3JlIDEKc3RvcmUgMApsb2FkIDEKYXNzZXJ0CmxvYWQgMApidG9pCmludGNfMSAvLyAxCisKYnl0ZWNfMCAvLyAid2lubmluZ19wcm9wb3NhbCIKYXBwX2dsb2JhbF9nZXQKYm94X2dldApzdG9yZSAzCnN0b3JlIDIKbG9hZCAzCmFzc2VydApsb2FkIDIKYnRvaQo+CmJ6IHZvdGVfMl9sMgpieXRlY18wIC8vICJ3aW5uaW5nX3Byb3Bvc2FsIgpmcmFtZV9kaWcgLTEKYXBwX2dsb2JhbF9wdXQKdm90ZV8yX2wyOgpmcmFtZV9kaWcgLTEKYm94X2dldApzdG9yZSAxCnN0b3JlIDAKbG9hZCAxCmFzc2VydApsb2FkIDAKYnRvaQppbnRjXzEgLy8gMQorCmZyYW1lX2J1cnkgMApmcmFtZV9kaWcgLTEKYm94X2RlbApwb3AKZnJhbWVfZGlnIC0xCmZyYW1lX2RpZyAwCml0b2IKYm94X3B1dApyZXRzdWIKCi8vIG1pbnQKbWludF8zOgpwcm90byAwIDAKaW50Y18wIC8vIDAKYnl0ZWNfMSAvLyAiIgpkdXBuIDQKZnJhbWVfZGlnIDEKZnJhbWVfZGlnIDEKaW50Y18yIC8vIDQKZXh0cmFjdF91aW50MTYKZGlnIDEKbGVuCnN1YnN0cmluZzMKZnJhbWVfYnVyeSAyCmZyYW1lX2RpZyAxCmV4dHJhY3QgNiAzMgpmcmFtZV9idXJ5IDMKZnJhbWVfZGlnIDEKZnJhbWVfZGlnIDEKaW50Y18wIC8vIDAKZXh0cmFjdF91aW50MTYKZnJhbWVfZGlnIDEKaW50Y18zIC8vIDIKZXh0cmFjdF91aW50MTYKc3Vic3RyaW5nMwpmcmFtZV9idXJ5IDQKZnJhbWVfZGlnIDEKZnJhbWVfZGlnIDEKaW50Y18zIC8vIDIKZXh0cmFjdF91aW50MTYKZnJhbWVfZGlnIDEKaW50Y18yIC8vIDQKZXh0cmFjdF91aW50MTYKc3Vic3RyaW5nMwpmcmFtZV9idXJ5IDUKYnl0ZWNfMCAvLyAid2lubmluZ19wcm9wb3NhbCIKYXBwX2dsb2JhbF9nZXQKZnJhbWVfYnVyeSAwCmZyYW1lX2RpZyAwCml0b2IKYm94X2dldApzdG9yZSA1CnN0b3JlIDQKbG9hZCA1CmFzc2VydApsb2FkIDQKZnJhbWVfYnVyeSAxCml0eG5fYmVnaW4KcHVzaGludCAzIC8vIGFjZmcKaXR4bl9maWVsZCBUeXBlRW51bQppbnRjXzEgLy8gMQppdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VG90YWwKZnJhbWVfZGlnIDIKZXh0cmFjdCAyIDAKaXR4bl9maWVsZCBDb25maWdBc3NldFVSTApmcmFtZV9kaWcgMwppdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TWV0YWRhdGFIYXNoCmZyYW1lX2RpZyA0CmV4dHJhY3QgMiAwCml0eG5fZmllbGQgQ29uZmlnQXNzZXROYW1lCmZyYW1lX2RpZyA1CmV4dHJhY3QgMiAwCml0eG5fZmllbGQgQ29uZmlnQXNzZXRVbml0TmFtZQppdHhuX3N1Ym1pdApyZXRzdWIKCi8vIGNyZWF0ZV9jYXN0ZXIKY3JlYXRlY2FzdGVyXzQ6CnByb3RvIDAgMApjYWxsc3ViIGNyZWF0ZV8wCnJldHN1YgoKLy8gYWRkX3Byb3Bvc2FsX2Nhc3RlcgphZGRwcm9wb3NhbGNhc3Rlcl81Ogpwcm90byAwIDAKYnl0ZWNfMSAvLyAiIgp0eG5hIEFwcGxpY2F0aW9uQXJncyAxCmZyYW1lX2J1cnkgMApmcmFtZV9kaWcgMApjYWxsc3ViIGFkZHByb3Bvc2FsXzEKcmV0c3ViCgovLyB2b3RlX2Nhc3Rlcgp2b3RlY2FzdGVyXzY6CnByb3RvIDAgMApieXRlY18xIC8vICIiCnR4bmEgQXBwbGljYXRpb25BcmdzIDEKZnJhbWVfYnVyeSAwCmZyYW1lX2RpZyAwCmNhbGxzdWIgdm90ZV8yCnJldHN1YgoKLy8gbWludF9jYXN0ZXIKbWludGNhc3Rlcl83Ogpwcm90byAwIDAKY2FsbHN1YiBtaW50XzMKcmV0c3Vi",
43+
"approval": "I3ByYWdtYSB2ZXJzaW9uIDgKaW50Y2Jsb2NrIDAgMSAyIDQKYnl0ZWNibG9jayAweDc2MmQgMHg2Mzc1NzI3MjY1NmU3NDVmNzA3MjZmNzA2ZjczNjE2YzVmNjk2NCAweDc3Njk2ZTZlNjk2ZTY3NWY3MDcyNmY3MDZmNzM2MTZjIDB4NzAyZCAweAp0eG4gTnVtQXBwQXJncwppbnRjXzAgLy8gMAo9PQpibnogbWFpbl9sOAp0eG5hIEFwcGxpY2F0aW9uQXJncyAwCnB1c2hieXRlcyAweGVmYThiNDRiIC8vICJhZGRfcHJvcG9zYWwoKHN0cmluZyxzdHJpbmcsc3RyaW5nLGJ5dGVbMzJdKSl2b2lkIgo9PQpibnogbWFpbl9sNwp0eG5hIEFwcGxpY2F0aW9uQXJncyAwCnB1c2hieXRlcyAweDMxZDVjMzAwIC8vICJ2b3RlKHVpbnQ2NCl2b2lkIgo9PQpibnogbWFpbl9sNgp0eG5hIEFwcGxpY2F0aW9uQXJncyAwCnB1c2hieXRlcyAweDU1ODhkY2I0IC8vICJtaW50KCl2b2lkIgo9PQpibnogbWFpbl9sNQplcnIKbWFpbl9sNToKdHhuIE9uQ29tcGxldGlvbgppbnRjXzAgLy8gTm9PcAo9PQp0eG4gQXBwbGljYXRpb25JRAppbnRjXzAgLy8gMAohPQomJgphc3NlcnQKY2FsbHN1YiBtaW50Y2FzdGVyXzYKaW50Y18xIC8vIDEKcmV0dXJuCm1haW5fbDY6CnR4biBPbkNvbXBsZXRpb24KaW50Y18wIC8vIE5vT3AKPT0KdHhuIEFwcGxpY2F0aW9uSUQKaW50Y18wIC8vIDAKIT0KJiYKYXNzZXJ0CmNhbGxzdWIgdm90ZWNhc3Rlcl81CmludGNfMSAvLyAxCnJldHVybgptYWluX2w3Ogp0eG4gT25Db21wbGV0aW9uCmludGNfMCAvLyBOb09wCj09CnR4biBBcHBsaWNhdGlvbklECmludGNfMCAvLyAwCiE9CiYmCmFzc2VydApjYWxsc3ViIGFkZHByb3Bvc2FsY2FzdGVyXzQKaW50Y18xIC8vIDEKcmV0dXJuCm1haW5fbDg6CnR4biBPbkNvbXBsZXRpb24KaW50Y18wIC8vIE5vT3AKPT0KYm56IG1haW5fbDEwCmVycgptYWluX2wxMDoKdHhuIEFwcGxpY2F0aW9uSUQKaW50Y18wIC8vIDAKPT0KYXNzZXJ0CmNhbGxzdWIgY3JlYXRlXzAKaW50Y18xIC8vIDEKcmV0dXJuCgovLyBjcmVhdGUKY3JlYXRlXzA6CnByb3RvIDAgMApieXRlY18xIC8vICJjdXJyZW50X3Byb3Bvc2FsX2lkIgppbnRjXzAgLy8gMAphcHBfZ2xvYmFsX3B1dApieXRlY18yIC8vICJ3aW5uaW5nX3Byb3Bvc2FsIgppbnRjXzAgLy8gMAphcHBfZ2xvYmFsX3B1dApyZXRzdWIKCi8vIGFkZF9wcm9wb3NhbAphZGRwcm9wb3NhbF8xOgpwcm90byAxIDAKaW50Y18wIC8vIDAKZHVwCmJ5dGVjXzEgLy8gImN1cnJlbnRfcHJvcG9zYWxfaWQiCmFwcF9nbG9iYWxfZ2V0CmZyYW1lX2J1cnkgMAppbnRjXzAgLy8gMApmcmFtZV9idXJ5IDEKYnl0ZWNfMyAvLyAicC0iCmZyYW1lX2RpZyAwCml0b2IKY29uY2F0CmJveF9kZWwKcG9wCmJ5dGVjXzMgLy8gInAtIgpmcmFtZV9kaWcgMAppdG9iCmNvbmNhdApmcmFtZV9kaWcgLTEKYm94X3B1dApieXRlY18wIC8vICJ2LSIKZnJhbWVfZGlnIDAKaXRvYgpjb25jYXQKYm94X2RlbApwb3AKYnl0ZWNfMCAvLyAidi0iCmZyYW1lX2RpZyAwCml0b2IKY29uY2F0CmZyYW1lX2RpZyAxCml0b2IKYm94X3B1dApieXRlY18xIC8vICJjdXJyZW50X3Byb3Bvc2FsX2lkIgpieXRlY18xIC8vICJjdXJyZW50X3Byb3Bvc2FsX2lkIgphcHBfZ2xvYmFsX2dldAppbnRjXzEgLy8gMQorCmFwcF9nbG9iYWxfcHV0CnJldHN1YgoKLy8gdm90ZQp2b3RlXzI6CnByb3RvIDEgMAppbnRjXzAgLy8gMApkdXAKYnl0ZWNfMiAvLyAid2lubmluZ19wcm9wb3NhbCIKYXBwX2dsb2JhbF9nZXQKZnJhbWVfYnVyeSAxCmJ5dGVjXzAgLy8gInYtIgpmcmFtZV9kaWcgLTEKaXRvYgpjb25jYXQKYm94X2dldApzdG9yZSAxCnN0b3JlIDAKbG9hZCAxCmFzc2VydApsb2FkIDAKYnRvaQppbnRjXzEgLy8gMQorCmZyYW1lX2J1cnkgMApieXRlY18wIC8vICJ2LSIKZnJhbWVfZGlnIC0xCml0b2IKY29uY2F0CmJveF9nZXQKc3RvcmUgMQpzdG9yZSAwCmxvYWQgMQphc3NlcnQKbG9hZCAwCmJ0b2kKaW50Y18xIC8vIDEKKwpieXRlY18wIC8vICJ2LSIKZnJhbWVfZGlnIDEKaXRvYgpjb25jYXQKYm94X2dldApzdG9yZSAzCnN0b3JlIDIKbG9hZCAzCmFzc2VydApsb2FkIDIKYnRvaQo+CmJ6IHZvdGVfMl9sMgpieXRlY18yIC8vICJ3aW5uaW5nX3Byb3Bvc2FsIgpmcmFtZV9kaWcgLTEKYXBwX2dsb2JhbF9wdXQKdm90ZV8yX2wyOgpieXRlY18wIC8vICJ2LSIKZnJhbWVfZGlnIC0xCml0b2IKY29uY2F0CmJveF9kZWwKcG9wCmJ5dGVjXzAgLy8gInYtIgpmcmFtZV9kaWcgLTEKaXRvYgpjb25jYXQKZnJhbWVfZGlnIDAKaXRvYgpib3hfcHV0CnJldHN1YgoKLy8gbWludAptaW50XzM6CnByb3RvIDAgMAppbnRjXzAgLy8gMApieXRlYyA0IC8vICIiCmR1cG4gNApieXRlY18yIC8vICJ3aW5uaW5nX3Byb3Bvc2FsIgphcHBfZ2xvYmFsX2dldApmcmFtZV9idXJ5IDAKYnl0ZWNfMyAvLyAicC0iCmZyYW1lX2RpZyAwCml0b2IKY29uY2F0CmJveF9nZXQKc3RvcmUgNQpzdG9yZSA0CmxvYWQgNQphc3NlcnQKbG9hZCA0CmZyYW1lX2J1cnkgMQpmcmFtZV9kaWcgMQpmcmFtZV9kaWcgMQppbnRjXzIgLy8gMgpleHRyYWN0X3VpbnQxNgpmcmFtZV9kaWcgMQppbnRjXzMgLy8gNApleHRyYWN0X3VpbnQxNgpzdWJzdHJpbmczCmZyYW1lX2J1cnkgMgpmcmFtZV9kaWcgMQpmcmFtZV9kaWcgMQppbnRjXzAgLy8gMApleHRyYWN0X3VpbnQxNgpmcmFtZV9kaWcgMQppbnRjXzIgLy8gMgpleHRyYWN0X3VpbnQxNgpzdWJzdHJpbmczCmZyYW1lX2J1cnkgMwpmcmFtZV9kaWcgMQpmcmFtZV9kaWcgMQppbnRjXzMgLy8gNApleHRyYWN0X3VpbnQxNgpkaWcgMQpsZW4Kc3Vic3RyaW5nMwpmcmFtZV9idXJ5IDQKZnJhbWVfZGlnIDEKZXh0cmFjdCA2IDMyCmZyYW1lX2J1cnkgNQppdHhuX2JlZ2luCnB1c2hpbnQgMyAvLyBhY2ZnCml0eG5fZmllbGQgVHlwZUVudW0KaW50Y18xIC8vIDEKaXR4bl9maWVsZCBDb25maWdBc3NldFRvdGFsCmZyYW1lX2RpZyAyCmV4dHJhY3QgMiAwCml0eG5fZmllbGQgQ29uZmlnQXNzZXRVUkwKZnJhbWVfZGlnIDMKZXh0cmFjdCAyIDAKaXR4bl9maWVsZCBDb25maWdBc3NldE5hbWUKZnJhbWVfZGlnIDQKZXh0cmFjdCAyIDAKaXR4bl9maWVsZCBDb25maWdBc3NldFVuaXROYW1lCmZyYW1lX2RpZyA1Cml0eG5fZmllbGQgQ29uZmlnQXNzZXRNZXRhZGF0YUhhc2gKaXR4bl9zdWJtaXQKcmV0c3ViCgovLyBhZGRfcHJvcG9zYWxfY2FzdGVyCmFkZHByb3Bvc2FsY2FzdGVyXzQ6CnByb3RvIDAgMApieXRlYyA0IC8vICIiCnR4bmEgQXBwbGljYXRpb25BcmdzIDEKZnJhbWVfYnVyeSAwCmZyYW1lX2RpZyAwCmNhbGxzdWIgYWRkcHJvcG9zYWxfMQpyZXRzdWIKCi8vIHZvdGVfY2FzdGVyCnZvdGVjYXN0ZXJfNToKcHJvdG8gMCAwCmludGNfMCAvLyAwCnR4bmEgQXBwbGljYXRpb25BcmdzIDEKYnRvaQpmcmFtZV9idXJ5IDAKZnJhbWVfZGlnIDAKY2FsbHN1YiB2b3RlXzIKcmV0c3ViCgovLyBtaW50X2Nhc3RlcgptaW50Y2FzdGVyXzY6CnByb3RvIDAgMApjYWxsc3ViIG1pbnRfMwpyZXRzdWI=",
4944
"clear": "I3ByYWdtYSB2ZXJzaW9uIDgKcHVzaGludCAwIC8vIDAKcmV0dXJu"
5045
},
5146
"state": {
5247
"global": {
53-
"num_byte_slices": 1,
54-
"num_uints": 1
48+
"num_byte_slices": 0,
49+
"num_uints": 2
5550
},
5651
"local": {
5752
"num_byte_slices": 0,
@@ -67,7 +62,7 @@
6762
"descr": ""
6863
},
6964
"winning_proposal": {
70-
"type": "bytes",
65+
"type": "uint64",
7166
"key": "winning_proposal",
7267
"descr": ""
7368
}
@@ -80,15 +75,8 @@
8075
}
8176
},
8277
"contract": {
83-
"name": "dao",
78+
"name": "DAO",
8479
"methods": [
85-
{
86-
"name": "create",
87-
"args": [],
88-
"returns": {
89-
"type": "void"
90-
}
91-
},
9280
{
9381
"name": "add_proposal",
9482
"args": [
@@ -105,8 +93,8 @@
10593
"name": "vote",
10694
"args": [
10795
{
108-
"type": "address",
109-
"name": "proposer"
96+
"type": "uint64",
97+
"name": "proposal_id"
11098
}
11199
],
112100
"returns": {
@@ -123,5 +111,7 @@
123111
],
124112
"networks": {}
125113
},
126-
"bare_call_config": {}
114+
"bare_call_config": {
115+
"no_op": "CREATE"
116+
}
127117
}
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
#pragma version 8
2-
intcblock 0 1 4 2
3-
bytecblock 0x77696e6e696e675f70726f706f73616c 0x
4-
txna ApplicationArgs 0
5-
pushbytes 0x4c5c61ba // "create()void"
2+
intcblock 0 1 2 4
3+
bytecblock 0x762d 0x63757272656e745f70726f706f73616c5f6964 0x77696e6e696e675f70726f706f73616c 0x702d 0x
4+
txn NumAppArgs
5+
intc_0 // 0
66
==
77
bnz main_l8
88
txna ApplicationArgs 0
99
pushbytes 0xefa8b44b // "add_proposal((string,string,string,byte[32]))void"
1010
==
1111
bnz main_l7
1212
txna ApplicationArgs 0
13-
pushbytes 0x628ce32d // "vote(address)void"
13+
pushbytes 0x31d5c300 // "vote(uint64)void"
1414
==
1515
bnz main_l6
1616
txna ApplicationArgs 0
@@ -27,7 +27,7 @@ intc_0 // 0
2727
!=
2828
&&
2929
assert
30-
callsub mintcaster_7
30+
callsub mintcaster_6
3131
intc_1 // 1
3232
return
3333
main_l6:
@@ -39,7 +39,7 @@ intc_0 // 0
3939
!=
4040
&&
4141
assert
42-
callsub votecaster_6
42+
callsub votecaster_5
4343
intc_1 // 1
4444
return
4545
main_l7:
@@ -51,59 +51,90 @@ intc_0 // 0
5151
!=
5252
&&
5353
assert
54-
callsub addproposalcaster_5
54+
callsub addproposalcaster_4
5555
intc_1 // 1
5656
return
5757
main_l8:
5858
txn OnCompletion
5959
intc_0 // NoOp
6060
==
61+
bnz main_l10
62+
err
63+
main_l10:
6164
txn ApplicationID
6265
intc_0 // 0
6366
==
64-
&&
6567
assert
66-
callsub createcaster_4
68+
callsub create_0
6769
intc_1 // 1
6870
return
6971

7072
// create
7173
create_0:
7274
proto 0 0
73-
pushbytes 0x63757272656e745f70726f706f73616c5f6964 // "current_proposal_id"
75+
bytec_1 // "current_proposal_id"
7476
intc_0 // 0
7577
app_global_put
76-
bytec_0 // "winning_proposal"
77-
bytec_1 // ""
78+
bytec_2 // "winning_proposal"
79+
intc_0 // 0
7880
app_global_put
7981
retsub
8082

8183
// add_proposal
8284
addproposal_1:
8385
proto 1 0
8486
intc_0 // 0
85-
intc_0 // 0
87+
dup
88+
bytec_1 // "current_proposal_id"
89+
app_global_get
8690
frame_bury 0
87-
txn Sender
91+
intc_0 // 0
92+
frame_bury 1
93+
bytec_3 // "p-"
94+
frame_dig 0
95+
itob
96+
concat
8897
box_del
8998
pop
90-
txn Sender
99+
bytec_3 // "p-"
100+
frame_dig 0
101+
itob
102+
concat
91103
frame_dig -1
92104
box_put
93-
txn Sender
105+
bytec_0 // "v-"
106+
frame_dig 0
107+
itob
108+
concat
94109
box_del
95110
pop
96-
txn Sender
111+
bytec_0 // "v-"
97112
frame_dig 0
98113
itob
114+
concat
115+
frame_dig 1
116+
itob
99117
box_put
118+
bytec_1 // "current_proposal_id"
119+
bytec_1 // "current_proposal_id"
120+
app_global_get
121+
intc_1 // 1
122+
+
123+
app_global_put
100124
retsub
101125

102126
// vote
103127
vote_2:
104128
proto 1 0
105129
intc_0 // 0
130+
dup
131+
bytec_2 // "winning_proposal"
132+
app_global_get
133+
frame_bury 1
134+
bytec_0 // "v-"
106135
frame_dig -1
136+
itob
137+
concat
107138
box_get
108139
store 1
109140
store 0
@@ -113,8 +144,24 @@ load 0
113144
btoi
114145
intc_1 // 1
115146
+
116-
bytec_0 // "winning_proposal"
117-
app_global_get
147+
frame_bury 0
148+
bytec_0 // "v-"
149+
frame_dig -1
150+
itob
151+
concat
152+
box_get
153+
store 1
154+
store 0
155+
load 1
156+
assert
157+
load 0
158+
btoi
159+
intc_1 // 1
160+
+
161+
bytec_0 // "v-"
162+
frame_dig 1
163+
itob
164+
concat
118165
box_get
119166
store 3
120167
store 2
@@ -124,25 +171,20 @@ load 2
124171
btoi
125172
>
126173
bz vote_2_l2
127-
bytec_0 // "winning_proposal"
174+
bytec_2 // "winning_proposal"
128175
frame_dig -1
129176
app_global_put
130177
vote_2_l2:
178+
bytec_0 // "v-"
131179
frame_dig -1
132-
box_get
133-
store 1
134-
store 0
135-
load 1
136-
assert
137-
load 0
138-
btoi
139-
intc_1 // 1
140-
+
141-
frame_bury 0
142-
frame_dig -1
180+
itob
181+
concat
143182
box_del
144183
pop
184+
bytec_0 // "v-"
145185
frame_dig -1
186+
itob
187+
concat
146188
frame_dig 0
147189
itob
148190
box_put
@@ -152,49 +194,51 @@ retsub
152194
mint_3:
153195
proto 0 0
154196
intc_0 // 0
155-
bytec_1 // ""
197+
bytec 4 // ""
156198
dupn 4
199+
bytec_2 // "winning_proposal"
200+
app_global_get
201+
frame_bury 0
202+
bytec_3 // "p-"
203+
frame_dig 0
204+
itob
205+
concat
206+
box_get
207+
store 5
208+
store 4
209+
load 5
210+
assert
211+
load 4
212+
frame_bury 1
157213
frame_dig 1
158214
frame_dig 1
159-
intc_2 // 4
215+
intc_2 // 2
216+
extract_uint16
217+
frame_dig 1
218+
intc_3 // 4
160219
extract_uint16
161-
dig 1
162-
len
163220
substring3
164221
frame_bury 2
165222
frame_dig 1
166-
extract 6 32
167-
frame_bury 3
168-
frame_dig 1
169223
frame_dig 1
170224
intc_0 // 0
171225
extract_uint16
172226
frame_dig 1
173-
intc_3 // 2
227+
intc_2 // 2
174228
extract_uint16
175229
substring3
176-
frame_bury 4
177-
frame_dig 1
230+
frame_bury 3
178231
frame_dig 1
179-
intc_3 // 2
180-
extract_uint16
181232
frame_dig 1
182-
intc_2 // 4
233+
intc_3 // 4
183234
extract_uint16
235+
dig 1
236+
len
184237
substring3
238+
frame_bury 4
239+
frame_dig 1
240+
extract 6 32
185241
frame_bury 5
186-
bytec_0 // "winning_proposal"
187-
app_global_get
188-
frame_bury 0
189-
frame_dig 0
190-
itob
191-
box_get
192-
store 5
193-
store 4
194-
load 5
195-
assert
196-
load 4
197-
frame_bury 1
198242
itxn_begin
199243
pushint 3 // acfg
200244
itxn_field TypeEnum
@@ -204,44 +248,39 @@ frame_dig 2
204248
extract 2 0
205249
itxn_field ConfigAssetURL
206250
frame_dig 3
207-
itxn_field ConfigAssetMetadataHash
208-
frame_dig 4
209251
extract 2 0
210252
itxn_field ConfigAssetName
211-
frame_dig 5
253+
frame_dig 4
212254
extract 2 0
213255
itxn_field ConfigAssetUnitName
256+
frame_dig 5
257+
itxn_field ConfigAssetMetadataHash
214258
itxn_submit
215259
retsub
216260

217-
// create_caster
218-
createcaster_4:
219-
proto 0 0
220-
callsub create_0
221-
retsub
222-
223261
// add_proposal_caster
224-
addproposalcaster_5:
262+
addproposalcaster_4:
225263
proto 0 0
226-
bytec_1 // ""
264+
bytec 4 // ""
227265
txna ApplicationArgs 1
228266
frame_bury 0
229267
frame_dig 0
230268
callsub addproposal_1
231269
retsub
232270

233271
// vote_caster
234-
votecaster_6:
272+
votecaster_5:
235273
proto 0 0
236-
bytec_1 // ""
274+
intc_0 // 0
237275
txna ApplicationArgs 1
276+
btoi
238277
frame_bury 0
239278
frame_dig 0
240279
callsub vote_2
241280
retsub
242281

243282
// mint_caster
244-
mintcaster_7:
283+
mintcaster_6:
245284
proto 0 0
246285
callsub mint_3
247286
retsub

‎intermediate-en/session_3/dao/backend/smart_contracts/artifacts/dao/client.ts

+47-65
Large diffs are not rendered by default.

‎intermediate-en/session_3/dao/backend/smart_contracts/artifacts/dao/contract.json

+3-10
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
11
{
2-
"name": "dao",
2+
"name": "DAO",
33
"methods": [
4-
{
5-
"name": "create",
6-
"args": [],
7-
"returns": {
8-
"type": "void"
9-
}
10-
},
114
{
125
"name": "add_proposal",
136
"args": [
@@ -24,8 +17,8 @@
2417
"name": "vote",
2518
"args": [
2619
{
27-
"type": "address",
28-
"name": "proposer"
20+
"type": "uint64",
21+
"name": "proposal_id"
2922
}
3023
],
3124
"returns": {

‎intermediate-en/session_3/dao/backend/smart_contracts/dao/contract.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -58,15 +58,15 @@ class DAOState:
5858
app = beaker.Application("DAO", state=DAOState)
5959

6060

61-
@app.create
61+
@app.create(bare=True)
6262
def create() -> pt.Expr:
6363
return app.initialize_global_state()
6464

6565

6666
# In box storage:
6767
# proposal[id] = given proposal
6868
# votes[id] = 0
69-
@app.opt_in
69+
@app.external
7070
def add_proposal(proposal: Proposal) -> pt.Expr:
7171
proposal_id = app.state.current_proposal_id.get()
7272
new_id = proposal_id + pt.Int(1)

‎intermediate-en/session_3/dao/frontend/.copier-answers.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY
2-
_commit: 0.7.1-18-g8c04365
3-
_src_path: https://github.com/algorandfoundation/algokit-react-frontend-template
2+
_commit: 0.8.0
3+
_src_path: gh:algorandfoundation/algokit-react-frontend-template
44
algod_port: 4001
55
algod_server: http://localhost
66
algod_token: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

‎intermediate-en/session_3/dao/frontend/README.md

+24-1
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,27 @@ This project makes use of React and Tailwind to provider a base project configur
5858
It has also been configured to have a productive dev experience out of the box in [VS Code](https://code.visualstudio.com/), see the [.vscode](./.vscode) folder.
5959
# Integrating with smart contracts and application clients
6060

61-
Refer to the detailed guidance on [integrating with smart contracts and application clients](./src/contracts/README.md). In essence, for any smart contract codebase generated with AlgoKit or ther tools that produce compile contracts into ARC34 compliant app specifications, you can use the `algokit generate` command to generate TypeScript or Python typed client. Once generated simply drag and drop the generated client into `./src/contracts` and import it into your React components as you see fit.
61+
Refer to the detailed guidance on [integrating with smart contracts and application clients](./src/contracts/README.md). In essence, for any smart contract codebase generated with AlgoKit or other tools that produce compile contracts into ARC34 compliant app specifications, you can use the `algokit generate` command to generate TypeScript or Python typed client. Once generated simply drag and drop the generated client into `./src/contracts` and import it into your React components as you see fit.
62+
63+
# Vite compatibility with `js-algorand-sdk` and `algokit clients`
64+
65+
If you are receiving `address malformed` errors when sending direct calls to abi methods on AlgoKit typed clients where ABI parameters expect ABI transactions to be passed, this is a known edge case and a bug that occurs on [Vite in dev mode](https://github.com/vitejs/vite/issues/9528). A fix is in the works on [js-algorand-sdk](https://github.com/algorand/js-algorand-sdk/issues/740) side (which is used as a main low-level dependency by AlgoKit to generate typed clients), but in the meantime you can use a simple workaround described below:
66+
67+
```ts
68+
Instead of:
69+
70+
const response = await myAlgoKitTypedClient
71+
.someExternalMethod({
72+
some_txn_param: someTxnObject,
73+
})
74+
75+
use:
76+
77+
const response = await appClient
78+
.compose()
79+
.someExternalMethod({
80+
some_txn_param: someTxnObject,
81+
})
82+
.execute()
83+
```
84+

‎intermediate-en/session_3/dao/frontend/src/App.tsx

+68-41
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1+
/* eslint-disable @typescript-eslint/no-non-null-assertion */
12
import { DeflyWalletConnect } from '@blockshake/defly-connect'
23
import { DaffiWalletConnect } from '@daffiwallet/connect'
34
import { PeraWalletConnect } from '@perawallet/connect'
45
import { PROVIDER_ID, ProvidersArray, WalletProvider, useInitializeProviders, useWallet } from '@txnlab/use-wallet'
56
import algosdk from 'algosdk'
67
import { SnackbarProvider } from 'notistack'
7-
import { useState } from 'react'
8+
import { useRef, useState } from 'react'
89
import AppCalls from './components/AppCalls'
910
import ConnectWallet from './components/ConnectWallet'
10-
import Transact from './components/Transact'
1111
import { getAlgodConfigFromViteEnvironment } from './utils/network/getAlgoClientConfigs'
1212

1313
let providersArray: ProvidersArray
@@ -26,24 +26,20 @@ if (import.meta.env.VITE_ALGOD_NETWORK === '') {
2626

2727
export default function App() {
2828
const [openWalletModal, setOpenWalletModal] = useState<boolean>(false)
29-
const [openDemoModal, setOpenDemoModal] = useState<boolean>(false)
30-
const [appCallsDemoModal, setAppCallsDemoModal] = useState<boolean>(false)
3129
const { activeAddress } = useWallet()
30+
const [appID, setAppID] = useState<number>(0)
31+
const nftName = useRef<HTMLInputElement>(null)
32+
const unitName = useRef<HTMLInputElement>(null)
33+
const fileUpload = useRef<HTMLInputElement>(null)
34+
const voteProposalID = useRef<HTMLInputElement>(null)
35+
const web3StorageToken = useRef<HTMLInputElement>(null)
36+
37+
const algodConfig = getAlgodConfigFromViteEnvironment()
3238

3339
const toggleWalletModal = () => {
3440
setOpenWalletModal(!openWalletModal)
3541
}
3642

37-
const toggleDemoModal = () => {
38-
setOpenDemoModal(!openDemoModal)
39-
}
40-
41-
const toggleAppCallsModal = () => {
42-
setAppCallsDemoModal(!appCallsDemoModal)
43-
}
44-
45-
const algodConfig = getAlgodConfigFromViteEnvironment()
46-
4743
const walletProviders = useInitializeProviders({
4844
providers: providersArray,
4945
nodeConfig: {
@@ -61,44 +57,75 @@ export default function App() {
6157
<div className="hero min-h-screen bg-teal-400">
6258
<div className="hero-content text-center rounded-lg p-6 max-w-md bg-white mx-auto">
6359
<div className="max-w-md">
64-
<h1 className="text-4xl">
65-
Welcome to <div className="font-bold">AlgoKit 🙂</div>
66-
</h1>
67-
<p className="py-6">
68-
This starter has been generated using official AlgoKit React template. Refer to the resource below for next steps.
69-
</p>
60+
<h1 className="text-4xl">NFT Minting DAO</h1>
61+
<p className="py-6">This is the DAO app interface for the intermediate bootcamp!</p>
7062

7163
<div className="grid">
72-
<a
73-
data-test-id="getting-started"
74-
className="btn btn-primary m-2"
75-
target="_blank"
76-
href="https://github.com/algorandfoundation/algokit-cli"
77-
>
78-
Getting started
79-
</a>
64+
<label className="label m-2">
65+
App ID
66+
<input
67+
type="number"
68+
value={appID}
69+
className="input input-bordered"
70+
readOnly={true}
71+
onChange={(e) => (e.target.valueAsNumber ? setAppID(e.target.valueAsNumber) : setAppID(0))}
72+
/>
73+
</label>
8074

8175
<div className="divider" />
8276
<button data-test-id="connect-wallet" className="btn m-2" onClick={toggleWalletModal}>
8377
Wallet Connection
8478
</button>
8579

86-
{activeAddress && (
87-
<button data-test-id="transactions-demo" className="btn m-2" onClick={toggleDemoModal}>
88-
Transactions Demo
89-
</button>
90-
)}
80+
{activeAddress && appID == 0 && <AppCalls appID={appID} method="create" setAppID={setAppID} />}
9181

92-
{activeAddress && (
93-
<button data-test-id="appcalls-demo" className="btn m-2" onClick={toggleAppCallsModal}>
94-
Contract Interactions Demo
95-
</button>
82+
{activeAddress && appID !== 0 && (
83+
<div>
84+
<div className="divider" />
85+
<label className="label m-2">
86+
Name
87+
<input defaultValue="DAO NFT" className="input input-bordered" ref={nftName} />
88+
</label>
89+
90+
<label className="label m-2">
91+
Unit Name
92+
<input defaultValue="DNFT" className="input input-bordered" ref={unitName} />
93+
</label>
94+
95+
<label className="label m-2">
96+
web3.storage Token
97+
<input defaultValue="API TOKEN" className="input input-bordered" ref={unitName} />
98+
</label>
99+
100+
<label className="label m-2">
101+
Image
102+
<input type="file" className="file-input file-input-bordered m-2" accept="image/png, image/jpeg" ref={fileUpload} />
103+
</label>
104+
105+
<AppCalls
106+
appID={appID}
107+
method="add_proposal"
108+
file={fileUpload.current?.files ? fileUpload.current.files[0] : undefined}
109+
name={nftName.current ? nftName.current.value : ''}
110+
unitName={unitName.current ? unitName.current.value : ''}
111+
web3StorageToken={web3StorageToken.current ? web3StorageToken.current.value : ''}
112+
/>
113+
114+
<div className="divider" />
115+
<label className="label m-2">
116+
Proposal ID
117+
<input type="number" defaultValue="0" className="input input-bordered" ref={voteProposalID} />
118+
</label>
119+
120+
<AppCalls appID={appID} method="vote" proposalID={voteProposalID.current ? voteProposalID.current.valueAsNumber : 0} />
121+
122+
<div className="divider" />
123+
<AppCalls appID={appID} method="mint" />
124+
</div>
96125
)}
97-
</div>
98126

99-
<ConnectWallet openModal={openWalletModal} closeModal={toggleWalletModal} />
100-
<Transact openModal={openDemoModal} setModalState={setOpenDemoModal} />
101-
<AppCalls openModal={appCallsDemoModal} setModalState={setAppCallsDemoModal} />
127+
<ConnectWallet openModal={openWalletModal} closeModal={toggleWalletModal} />
128+
</div>
102129
</div>
103130
</div>
104131
</div>

‎intermediate-en/session_3/dao/frontend/src/components/AppCalls.tsx

+70-69
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,37 @@
1+
/* eslint-disable @typescript-eslint/no-non-null-assertion */
2+
/* eslint-disable no-console */
13
import * as algokit from '@algorandfoundation/algokit-utils'
2-
import { TransactionSignerAccount } from '@algorandfoundation/algokit-utils/types/account'
3-
import { AppDetails } from '@algorandfoundation/algokit-utils/types/app-client'
44
import { useWallet } from '@txnlab/use-wallet'
55
import { useSnackbar } from 'notistack'
66
import { useState } from 'react'
77
import { DaoClient } from '../contracts/dao'
8-
import { getAlgodConfigFromViteEnvironment, getIndexerConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs'
8+
import { getAlgodConfigFromViteEnvironment } from '../utils/network/getAlgoClientConfigs'
99

10-
interface AppCallsInterface {
11-
openModal: boolean
12-
setModalState: (value: boolean) => void
13-
}
10+
type AppCallProps = {
11+
appID: number
12+
} & (
13+
| {
14+
method: 'create'
15+
setAppID: React.Dispatch<React.SetStateAction<number>>
16+
}
17+
| {
18+
method: 'add_proposal'
19+
name: string
20+
unitName: string
21+
file: File | undefined
22+
web3StorageToken: string
23+
}
24+
| {
25+
method: 'vote'
26+
proposalID: number
27+
}
28+
| {
29+
method: 'mint'
30+
}
31+
)
1432

15-
const AppCalls = ({ openModal, setModalState }: AppCallsInterface) => {
33+
const AppCalls = (props: AppCallProps) => {
1634
const [loading, setLoading] = useState<boolean>(false)
17-
const [contractInput, setContractInput] = useState<string>('')
1835

1936
const algodConfig = getAlgodConfigFromViteEnvironment()
2037
const algodClient = algokit.getAlgoClient({
@@ -23,77 +40,61 @@ const AppCalls = ({ openModal, setModalState }: AppCallsInterface) => {
2340
token: algodConfig.token,
2441
})
2542

26-
const indexerConfig = getIndexerConfigFromViteEnvironment()
27-
const indexer = algokit.getAlgoIndexerClient({
28-
server: indexerConfig.server,
29-
port: indexerConfig.port,
30-
token: indexerConfig.token,
31-
})
32-
3343
const { enqueueSnackbar } = useSnackbar()
3444
const { signer, activeAddress } = useWallet()
3545

36-
const sendAppCall = async () => {
37-
setLoading(true)
46+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
47+
const sender = { signer, addr: activeAddress! }
3848

39-
const appDetails = {
40-
resolveBy: 'creatorAndName',
41-
sender: { signer, addr: activeAddress } as TransactionSignerAccount,
42-
creatorAddress: activeAddress,
43-
findExistingUsing: indexer,
44-
} as AppDetails
49+
const appClient = new DaoClient(
50+
{
51+
resolveBy: 'id',
52+
id: props.appID,
53+
sender,
54+
},
55+
algodClient,
56+
)
4557

46-
const appClient = new DaoClient(appDetails, algodClient)
58+
let text: string
59+
let callMethod: () => Promise<void>
60+
switch (props.method) {
61+
case 'create':
62+
text = 'Create App'
63+
callMethod = async () => {
64+
setLoading(true)
4765

48-
// Please note, in typical production scenarios,
49-
// you wouldn't want to use deploy directly from your frontend.
50-
// Instead, you would deploy your contract on your backend and reference it by id.
51-
// Given the simplicity of the starter contract, we are deploying it on the frontend
52-
// for demonstration purposes.
53-
const deployParams = {
54-
onSchemaBreak: 'append',
55-
onUpdate: 'append',
56-
}
57-
await appClient.deploy(deployParams).catch((e: Error) => {
58-
enqueueSnackbar(`Error deploying the contract: ${e.message}`, { variant: 'error' })
59-
setLoading(false)
60-
return
61-
})
66+
try {
67+
await appClient.create.bare()
68+
} catch (e) {
69+
enqueueSnackbar(`Error deploying the contract: ${(e as Error).message}`, { variant: 'error' })
70+
setLoading(false)
71+
return
72+
}
6273

63-
const response = await appClient.hello({ name: contractInput }).catch((e: Error) => {
64-
enqueueSnackbar(`Error calling the contract: ${e.message}`, { variant: 'error' })
65-
setLoading(false)
66-
return
67-
})
74+
const { appId } = await appClient.appClient.getAppReference()
75+
setLoading(false)
6876

69-
enqueueSnackbar(`Response from the contract: ${response?.return}`, { variant: 'success' })
70-
setLoading(false)
77+
props.setAppID(Number(appId))
78+
}
79+
break
80+
case 'add_proposal':
81+
text = 'Propose'
82+
callMethod = async () => {}
83+
break
84+
case 'vote':
85+
text = 'Vote'
86+
callMethod = async () => {}
87+
break
88+
case 'mint':
89+
text = 'Mint'
90+
callMethod = async () => {}
91+
break
7192
}
7293

7394
return (
74-
<dialog id="appcalls_modal" className={`modal ${openModal ? 'modal-open' : ''} bg-slate-200`}>
75-
<form method="dialog" className="modal-box">
76-
<h3 className="font-bold text-lg">Say hello to your Algorand smart contract</h3>
77-
<br />
78-
<input
79-
type="text"
80-
placeholder="Provide input to hello function"
81-
className="input input-bordered w-full"
82-
value={contractInput}
83-
onChange={(e) => {
84-
setContractInput(e.target.value)
85-
}}
86-
/>
87-
<div className="modal-action ">
88-
<button className="btn" onClick={() => setModalState(!openModal)}>
89-
Close
90-
</button>
91-
<button className={`btn`} onClick={sendAppCall}>
92-
{loading ? <span className="loading loading-spinner" /> : 'Send application call'}
93-
</button>
94-
</div>
95-
</form>
96-
</dialog>
95+
<button className={`btn m-2`} onClick={callMethod}>
96+
{loading ? <span className="loading loading-spinner" /> : text}
97+
</button>
9798
)
9899
}
99100

‎intermediate-en/session_3/dao/frontend/src/contracts/dao.ts

+654
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)
This repository has been archived.