Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

알고랜드 2세션 과제 #3

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,217 @@
#pragma version 10

smart_contracts.personal_bank.contract.PersonalBank.approval_program:
// smart_contracts/personal_bank/contract.py:14
// class PersonalBank(ARC4Contract):
txn NumAppArgs
bz main_bare_routing@7
method "opt_in_to_app()void"
method "deposit(pay)uint64"
method "withdraw()uint64"
txna ApplicationArgs 0
match main_opt_in_to_app_route@2 main_deposit_route@3 main_withdraw_route@4
err // reject transaction

main_opt_in_to_app_route@2:
// smart_contracts/personal_bank/contract.py:18
// @arc4.abimethod(allow_actions=["OptIn"]) #외부에서 호출가능한 메소드다! 뒤에 decorator를 달 수 있음 -> allow_actions 같이, 호출하고 같이 실행되는 것
txn OnCompletion
int OptIn
==
assert // OnCompletion is OptIn
txn ApplicationID
assert // is not creating
callsub opt_in_to_app
int 1
return

main_deposit_route@3:
// smart_contracts/personal_bank/contract.py:22
// @arc4.abimethod #decorator에 아무 것도 없으면 noOpt, 추가적으로 실행할 것이 없음
txn OnCompletion
!
assert // OnCompletion is NoOp
txn ApplicationID
assert // is not creating
// smart_contracts/personal_bank/contract.py:14
// class PersonalBank(ARC4Contract):
txn GroupIndex
int 1
-
dup
gtxns TypeEnum
int pay
==
assert // transaction type is pay
// smart_contracts/personal_bank/contract.py:22
// @arc4.abimethod #decorator에 아무 것도 없으면 noOpt, 추가적으로 실행할 것이 없음
callsub deposit
itob
byte 0x151f7c75
swap
concat
log
int 1
return

main_withdraw_route@4:
// smart_contracts/personal_bank/contract.py:39
// @arc4.abimethod(allow_actions=["CloseOut"]) # lcoal state 상태를 삭제, optOut 시킴 -> 묶였던 내 algo 수량도 풀림
txn OnCompletion
int CloseOut
==
assert // OnCompletion is CloseOut
txn ApplicationID
assert // is not creating
callsub withdraw
itob
byte 0x151f7c75
swap
concat
log
int 1
return

main_bare_routing@7:
// smart_contracts/personal_bank/contract.py:14
// class PersonalBank(ARC4Contract):
txn OnCompletion
!
assert // reject transaction
txn ApplicationID
!
assert // is creating
int 1
return


// smart_contracts.personal_bank.contract.PersonalBank.opt_in_to_app() -> void:
opt_in_to_app:
// smart_contracts/personal_bank/contract.py:18-19
// @arc4.abimethod(allow_actions=["OptIn"]) #외부에서 호출가능한 메소드다! 뒤에 decorator를 달 수 있음 -> allow_actions 같이, 호출하고 같이 실행되는 것
// def opt_in_to_app(self) -> None: #OptIn을 시도했을 때 onComplete로 실행되는 함수
proto 0 0
// smart_contracts/personal_bank/contract.py:20
// self.balance[Txn.sender] = UInt64(0) # Txn을 하는 sender의 Balance를 조회하고 그 값을 0으로 초기화
txn Sender
byte "balance"
int 0
app_local_put
retsub


// smart_contracts.personal_bank.contract.PersonalBank.deposit(ptxn: uint64) -> uint64:
deposit:
// smart_contracts/personal_bank/contract.py:22-23
// @arc4.abimethod #decorator에 아무 것도 없으면 noOpt, 추가적으로 실행할 것이 없음
// def deposit(self, ptxn: gtxn.PaymentTransaction) -> UInt64: # 스마트계약은 지갑이 없기 때문에 연동되는 지갑에 보내야함 -> 2개의 트랜잭션을 묶어줌 gtxn.PaymentTransaction
proto 1 1
// smart_contracts/personal_bank/contract.py:24
// assert ptxn.amount > 0, "Deposit amount must be greater than 0" # assert 를 사용하여 호출하기 전에 맞는 상황인지 확인
frame_dig -1
gtxns Amount
dup
assert // Deposit amount must be greater than 0
// smart_contracts/personal_bank/contract.py:27
// ptxn.receiver == Global.current_application_address # Global.current ~ = 스마트 계약의 앱계정의 주소와 같은지 확인함
frame_dig -1
gtxns Receiver
global CurrentApplicationAddress
==
// smart_contracts/personal_bank/contract.py:25-28
// #ptxn : 같이 묶인 트랜잭션 안에 amount 라는 property -> algo를 몇개 보낼것인지 그게 0이상인지
// assert (
// ptxn.receiver == Global.current_application_address # Global.current ~ = 스마트 계약의 앱계정의 주소와 같은지 확인함
// ), "Deposit receiver must be the contract address"
assert // Deposit receiver must be the contract address
// smart_contracts/personal_bank/contract.py:29
// assert ptxn.sender == Txn.sender, "Deposit sender must be the caller" # 돈을 보내는 사람이 이 계약을 호출하는 사람과 같은지 확인
frame_dig -1
gtxns Sender
txn Sender
==
assert // Deposit sender must be the caller
// smart_contracts/personal_bank/contract.py:31
// Txn.sender, Global.current_application_id # 이 계정이 optIn이 되어있는지 체크 -> 스마트 계약이 optIn이 되었는지 -> 따라서 id를 확인
txn Sender
global CurrentApplicationID
// smart_contracts/personal_bank/contract.py:30-32
// assert op.app_opted_in( # Txn.sender = 메소드를 호출한 계정
// Txn.sender, Global.current_application_id # 이 계정이 optIn이 되어있는지 체크 -> 스마트 계약이 optIn이 되었는지 -> 따라서 id를 확인
// ), "Deposit sender must opt-in to the app first."
app_opted_in
assert // Deposit sender must opt-in to the app first.
// smart_contracts/personal_bank/contract.py:34
// self.balance[Txn.sender] += ptxn.amount
txn Sender
int 0
byte "balance"
app_local_get_ex
assert // check balance exists for account
+
txn Sender
byte "balance"
uncover 2
app_local_put
// smart_contracts/personal_bank/contract.py:35
// user_balance = self.balance[Txn.sender] # 누구한테 얼마한테 받았는지 기록함 / 유저마다 다른 상태를 기록하므로 localState 사용
txn Sender
int 0
byte "balance"
app_local_get_ex
assert // check balance exists for account
// smart_contracts/personal_bank/contract.py:37
// return user_balance
retsub


// smart_contracts.personal_bank.contract.PersonalBank.withdraw() -> uint64:
withdraw:
// smart_contracts/personal_bank/contract.py:39-40
// @arc4.abimethod(allow_actions=["CloseOut"]) # lcoal state 상태를 삭제, optOut 시킴 -> 묶였던 내 algo 수량도 풀림
// def withdraw(self) -> UInt64:
proto 0 1
// smart_contracts/personal_bank/contract.py:41
// userBalance = self.balance[Txn.sender]
txn Sender
int 0
byte "balance"
app_local_get_ex
assert // check balance exists for account
// smart_contracts/personal_bank/contract.py:43-48
// itxn.Payment( # inner transaction 만들 수 있음, 그 중에서 algo를 보내는 payment
// receiver=Txn.sender,
// sender=Global.current_application_address,
// amount=userBalance,
// fee=0, # 가스비, inner transaction도 가스비를 요구함, 설정을 한 해주면 앱 계정이 지불하게 됨, fee = 0 으로 설정해줘야 호출하는 사람이 가스비를 대신 지불함
// ).submit()
itxn_begin
// smart_contracts/personal_bank/contract.py:44
// receiver=Txn.sender,
txn Sender
// smart_contracts/personal_bank/contract.py:45
// sender=Global.current_application_address,
global CurrentApplicationAddress
dig 2
itxn_field Amount
itxn_field Sender
itxn_field Receiver
// smart_contracts/personal_bank/contract.py:43
// itxn.Payment( # inner transaction 만들 수 있음, 그 중에서 algo를 보내는 payment
int pay
itxn_field TypeEnum
// smart_contracts/personal_bank/contract.py:47
// fee=0, # 가스비, inner transaction도 가스비를 요구함, 설정을 한 해주면 앱 계정이 지불하게 됨, fee = 0 으로 설정해줘야 호출하는 사람이 가스비를 대신 지불함
int 0
itxn_field Fee
// smart_contracts/personal_bank/contract.py:43-48
// itxn.Payment( # inner transaction 만들 수 있음, 그 중에서 algo를 보내는 payment
// receiver=Txn.sender,
// sender=Global.current_application_address,
// amount=userBalance,
// fee=0, # 가스비, inner transaction도 가스비를 요구함, 설정을 한 해주면 앱 계정이 지불하게 됨, fee = 0 으로 설정해줘야 호출하는 사람이 가스비를 대신 지불함
// ).submit()
itxn_submit
// smart_contracts/personal_bank/contract.py:50
// return userBalance
retsub
Loading