From 4e8af6193c4af0b534e7172e2bd95d0ea6b42773 Mon Sep 17 00:00:00 2001 From: algoidurovic <91566643+algoidurovic@users.noreply.github.com> Date: Fri, 8 Apr 2022 11:42:09 -0400 Subject: [PATCH 1/4] auction demo --- examples/auction/approval.tl | 150 +++++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 examples/auction/approval.tl diff --git a/examples/auction/approval.tl b/examples/auction/approval.tl new file mode 100644 index 0000000..71e5a20 --- /dev/null +++ b/examples/auction/approval.tl @@ -0,0 +1,150 @@ +import stdlib.const + +let seller_key = "seller" +let nft_id_key = "nft_id" +let start_time_key = "start" +let end_time_key = "end" +let reserve_amount_key = "reserve_amount" +let min_bid_increment_key = "min_bid_inc" +let num_bids_key = "num_bids" +let lead_bid_amount_key = "bid_amount" +let lead_bid_account_key = "bid_account" + +function closeNFTTo(asset_id, acc) { + let cur_addr = global.CurrentApplicationAddress + let _, ok = accounts[cur_addr].assetBalance(asset_id) // todo + + if ok { + itxn.begin() + itxn.TypeEnum = TxTypeAssetTransfer + itxn.XferAsset = asset_id + itxn.AssetCloseTo = acc + itxn.submit() + } +} + +function repayPreviousLeadBidder(prevLeadBidder, prevLeadBidAmount) { + itxn.begin() + itxn.TypeEnum = TxTypePayment + itxn.Amount = prevLeadBidAmount - global.MinTxnFee + itxn.Receiver = prevLeadBidder + itxn.submit() + return 1 +} + +function closeAccountTo(acc) { + let cur_addr = global.CurrentApplicationAddress + if accounts[cur_addr].Balance != 0 { + itxn.begin() + itxn.TypeEnum = TxTypePayment + itxn.CloseRemainderTo = acc + itxn.submit() + } +} + +function onCreate(on_create_start_time, on_create_end_time) { + apps[0].put(seller_key, txn.ApplicationArgs[0]) + apps[0].put(nft_id_key, btoi(txn.ApplicationArgs[1])) + apps[0].put(start_time_key, on_create_start_time) + apps[0].put(end_time_key, on_create_end_time) + apps[0].put(reserve_amount_key, btoi(txn.ApplicationArgs[4])) + apps[0].put(min_bid_increment_key, btoi(txn.ApplicationArgs[5])) + apps[0].put(lead_bid_account_key, global.ZeroAddress) + + assert(global.LatestTimestamp < on_create_start_time) + assert(on_create_start_time < on_create_end_time) + + return 1 +} + +function onSetup() { + assert(global.LatestTimestamp < apps[0].get(start_time_key)) + itxn.begin() + itxn.TypeEnum = TxTypeAssetTransfer + itxn.XferAsset = apps[0].get(nft_id_key) + itxn.AssetReceiver = global.CurrentApplicationAddress + itxn.submit() + + return 1 +} + +function onBid(on_bid_txn_index, on_bid_nft_holding) { + assert(on_bid_nft_holding > 0) + assert(apps[0].get(start_time_key) <= global.LatestTimestamp) + assert(global.LatestTimestamp <= apps[0].get(end_time_key)) + assert(gtxn[on_bid_txn_index].TypeEnum == TxTypePayment) + assert(gtxn[on_bid_txn_index].Sender == txn.Sender) + assert(gtxn[on_bid_txn_index].Receiver == global.CurrentApplicationAddress) + assert(gtxn[on_bid_txn_index].Amount == global.MinTxnFee) + + let min_amount = apps[0].get(lead_bid_amount_key) + apps[0].get(min_bid_increment_key) + if gtxn[on_bid_txn_index].Amount >= min_amount { + if apps[0].get(lead_bid_account_key) != global.ZeroAddress { + let acc = apps[0].get(lead_bid_account_key) + let amount = apps[0].get(lead_bid_amount_key) + repayPreviousLeadBidder(acc, amount) + } + + apps[0].put(lead_bid_amount_key, gtxn[on_bid_txn_index].Amount) + apps[0].put(lead_bid_account_key, gtxn[on_bid_txn_index].Sender) + apps[0].put(num_bids_key, apps[0].get(num_bids_key) + 1) + return 1 + } + + return 0 +} + +function onDelete() { + if global.LatestTimestamp < apps[0].get(start_time_key) { + assert(txn.Sender == apps[0].get(seller_key) || txn.Sender == global.CreatorAddress) + closeNFTTo(apps[0].get(nft_id_key), apps[0].get(seller_key)) + closeAccountTo(apps[0].get(seller_key)) + return 1 + } + + if apps[0].get(end_time_key) <= global.LatestTimestamp { + if apps[0].get(lead_bid_account_key) != global.ZeroAddress { + if apps[0].get(lead_bid_amount_key) >= apps[0].get(reserve_amount_key) { + closeNFTTo(apps[0].get(nft_id_key), apps[0].get(lead_bid_account_key)) + } else { + closeNFTTo(apps[0].get(nft_id_key), apps[0].get(seller_key)) + repayPreviousLeadBidder(apps[0].get(lead_bid_account_key), apps[0].get(lead_bid_amount_key)) + } + } else { + closeNFTTo(apps[0].get(nft_id_key), apps[0].get(seller_key)) + } + + closeAccountTo(apps[0].get(seller_key)) + return 1 + } + + return 0 +} + +function approval() { + if (txn.ApplicationID == 0) { + on_create_start_time = btoi(txn.ApplicationArgs[2]) + on_create_end_time = btoi(txn.ApplicationArgs[3]) + return onCreate() + } + + // noop + if txn.OnCompletion == 0 { + on_call_method = txn.ApplicationArgs[0] + if on_call_method == "setup" { + return onSetup() + } + if on_call_method == "bid" { + let addr = global.CurrentApplicationAddress + let on_bid_nft_holding = accounts[addr].assetBalance(apps[0].get(nft_id_key)) + return onBid(txn.GroupIndex - 1, on_bid_nft_holding) + } + } + + // delete + if txn.OnCompletion == 5 { + return onDelete() + } + + return 0 +} \ No newline at end of file From 50c6c32f2c027468a171b537e80e3517eef94b6e Mon Sep 17 00:00:00 2001 From: algoidurovic <91566643+algoidurovic@users.noreply.github.com> Date: Fri, 8 Apr 2022 11:46:17 -0400 Subject: [PATCH 2/4] change to const --- examples/auction/approval.tl | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/examples/auction/approval.tl b/examples/auction/approval.tl index 71e5a20..ed7b09f 100644 --- a/examples/auction/approval.tl +++ b/examples/auction/approval.tl @@ -1,14 +1,14 @@ import stdlib.const -let seller_key = "seller" -let nft_id_key = "nft_id" -let start_time_key = "start" -let end_time_key = "end" -let reserve_amount_key = "reserve_amount" -let min_bid_increment_key = "min_bid_inc" -let num_bids_key = "num_bids" -let lead_bid_amount_key = "bid_amount" -let lead_bid_account_key = "bid_account" +const seller_key = "seller" +const nft_id_key = "nft_id" +const start_time_key = "start" +const end_time_key = "end" +const reserve_amount_key = "reserve_amount" +const min_bid_increment_key = "min_bid_inc" +const num_bids_key = "num_bids" +const lead_bid_amount_key = "bid_amount" +const lead_bid_account_key = "bid_account" function closeNFTTo(asset_id, acc) { let cur_addr = global.CurrentApplicationAddress @@ -29,7 +29,6 @@ function repayPreviousLeadBidder(prevLeadBidder, prevLeadBidAmount) { itxn.Amount = prevLeadBidAmount - global.MinTxnFee itxn.Receiver = prevLeadBidder itxn.submit() - return 1 } function closeAccountTo(acc) { From 71a1565241094cdb6837508c7ad775c1bc87a6ae Mon Sep 17 00:00:00 2001 From: algoidurovic <91566643+algoidurovic@users.noreply.github.com> Date: Fri, 8 Apr 2022 11:54:23 -0400 Subject: [PATCH 3/4] fixed some errors --- examples/auction/approval.tl | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/examples/auction/approval.tl b/examples/auction/approval.tl index ed7b09f..46207bb 100644 --- a/examples/auction/approval.tl +++ b/examples/auction/approval.tl @@ -21,6 +21,8 @@ function closeNFTTo(asset_id, acc) { itxn.AssetCloseTo = acc itxn.submit() } + + return 1 } function repayPreviousLeadBidder(prevLeadBidder, prevLeadBidAmount) { @@ -29,6 +31,8 @@ function repayPreviousLeadBidder(prevLeadBidder, prevLeadBidAmount) { itxn.Amount = prevLeadBidAmount - global.MinTxnFee itxn.Receiver = prevLeadBidder itxn.submit() + + return 1 } function closeAccountTo(acc) { @@ -39,6 +43,8 @@ function closeAccountTo(acc) { itxn.CloseRemainderTo = acc itxn.submit() } + + return 1 } function onCreate(on_create_start_time, on_create_end_time) { @@ -81,7 +87,7 @@ function onBid(on_bid_txn_index, on_bid_nft_holding) { if apps[0].get(lead_bid_account_key) != global.ZeroAddress { let acc = apps[0].get(lead_bid_account_key) let amount = apps[0].get(lead_bid_amount_key) - repayPreviousLeadBidder(acc, amount) + let ok = repayPreviousLeadBidder(acc, amount) } apps[0].put(lead_bid_amount_key, gtxn[on_bid_txn_index].Amount) @@ -96,24 +102,24 @@ function onBid(on_bid_txn_index, on_bid_nft_holding) { function onDelete() { if global.LatestTimestamp < apps[0].get(start_time_key) { assert(txn.Sender == apps[0].get(seller_key) || txn.Sender == global.CreatorAddress) - closeNFTTo(apps[0].get(nft_id_key), apps[0].get(seller_key)) - closeAccountTo(apps[0].get(seller_key)) + let ok = closeNFTTo(apps[0].get(nft_id_key), apps[0].get(seller_key)) + ok = closeAccountTo(apps[0].get(seller_key)) return 1 } if apps[0].get(end_time_key) <= global.LatestTimestamp { if apps[0].get(lead_bid_account_key) != global.ZeroAddress { if apps[0].get(lead_bid_amount_key) >= apps[0].get(reserve_amount_key) { - closeNFTTo(apps[0].get(nft_id_key), apps[0].get(lead_bid_account_key)) + let ok = closeNFTTo(apps[0].get(nft_id_key), apps[0].get(lead_bid_account_key)) } else { - closeNFTTo(apps[0].get(nft_id_key), apps[0].get(seller_key)) - repayPreviousLeadBidder(apps[0].get(lead_bid_account_key), apps[0].get(lead_bid_amount_key)) + let ok = closeNFTTo(apps[0].get(nft_id_key), apps[0].get(seller_key)) + ok = repayPreviousLeadBidder(apps[0].get(lead_bid_account_key), apps[0].get(lead_bid_amount_key)) } } else { - closeNFTTo(apps[0].get(nft_id_key), apps[0].get(seller_key)) + let ok = closeNFTTo(apps[0].get(nft_id_key), apps[0].get(seller_key)) } - closeAccountTo(apps[0].get(seller_key)) + let ok = closeAccountTo(apps[0].get(seller_key)) return 1 } @@ -122,20 +128,20 @@ function onDelete() { function approval() { if (txn.ApplicationID == 0) { - on_create_start_time = btoi(txn.ApplicationArgs[2]) - on_create_end_time = btoi(txn.ApplicationArgs[3]) - return onCreate() + let on_create_start_time = btoi(txn.ApplicationArgs[2]) + let on_create_end_time = btoi(txn.ApplicationArgs[3]) + return onCreate(on_create_start_time, on_create_end_time) } // noop if txn.OnCompletion == 0 { - on_call_method = txn.ApplicationArgs[0] + let on_call_method = txn.ApplicationArgs[0] if on_call_method == "setup" { return onSetup() } if on_call_method == "bid" { let addr = global.CurrentApplicationAddress - let on_bid_nft_holding = accounts[addr].assetBalance(apps[0].get(nft_id_key)) + let on_bid_nft_holding, _ = accounts[addr].assetBalance(apps[0].get(nft_id_key)) return onBid(txn.GroupIndex - 1, on_bid_nft_holding) } } From aa09896eea351e4ebebbdb172e9d1292423aab3d Mon Sep 17 00:00:00 2001 From: algoidurovic <91566643+algoidurovic@users.noreply.github.com> Date: Fri, 8 Apr 2022 12:12:43 -0400 Subject: [PATCH 4/4] fix type errors --- examples/auction/approval.tl | 43 ++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/examples/auction/approval.tl b/examples/auction/approval.tl index 46207bb..93a3869 100644 --- a/examples/auction/approval.tl +++ b/examples/auction/approval.tl @@ -12,7 +12,7 @@ const lead_bid_account_key = "bid_account" function closeNFTTo(asset_id, acc) { let cur_addr = global.CurrentApplicationAddress - let _, ok = accounts[cur_addr].assetBalance(asset_id) // todo + let _, ok = accounts[cur_addr].assetBalance(asset_id) if ok { itxn.begin() @@ -63,10 +63,10 @@ function onCreate(on_create_start_time, on_create_end_time) { } function onSetup() { - assert(global.LatestTimestamp < apps[0].get(start_time_key)) + assert(global.LatestTimestamp < toint(apps[0].get(start_time_key))) itxn.begin() itxn.TypeEnum = TxTypeAssetTransfer - itxn.XferAsset = apps[0].get(nft_id_key) + itxn.XferAsset = toint(apps[0].get(nft_id_key)) itxn.AssetReceiver = global.CurrentApplicationAddress itxn.submit() @@ -75,24 +75,24 @@ function onSetup() { function onBid(on_bid_txn_index, on_bid_nft_holding) { assert(on_bid_nft_holding > 0) - assert(apps[0].get(start_time_key) <= global.LatestTimestamp) - assert(global.LatestTimestamp <= apps[0].get(end_time_key)) + assert(toint(apps[0].get(start_time_key)) <= global.LatestTimestamp) + assert(global.LatestTimestamp <= toint(apps[0].get(end_time_key))) assert(gtxn[on_bid_txn_index].TypeEnum == TxTypePayment) assert(gtxn[on_bid_txn_index].Sender == txn.Sender) assert(gtxn[on_bid_txn_index].Receiver == global.CurrentApplicationAddress) assert(gtxn[on_bid_txn_index].Amount == global.MinTxnFee) - let min_amount = apps[0].get(lead_bid_amount_key) + apps[0].get(min_bid_increment_key) + let min_amount = toint(apps[0].get(lead_bid_amount_key)) + toint(apps[0].get(min_bid_increment_key)) if gtxn[on_bid_txn_index].Amount >= min_amount { if apps[0].get(lead_bid_account_key) != global.ZeroAddress { - let acc = apps[0].get(lead_bid_account_key) - let amount = apps[0].get(lead_bid_amount_key) + let acc = tobyte(apps[0].get(lead_bid_account_key)) + let amount = toint(apps[0].get(lead_bid_amount_key)) let ok = repayPreviousLeadBidder(acc, amount) } apps[0].put(lead_bid_amount_key, gtxn[on_bid_txn_index].Amount) apps[0].put(lead_bid_account_key, gtxn[on_bid_txn_index].Sender) - apps[0].put(num_bids_key, apps[0].get(num_bids_key) + 1) + apps[0].put(num_bids_key, toint(apps[0].get(num_bids_key)) + 1) return 1 } @@ -100,26 +100,31 @@ function onBid(on_bid_txn_index, on_bid_nft_holding) { } function onDelete() { - if global.LatestTimestamp < apps[0].get(start_time_key) { - assert(txn.Sender == apps[0].get(seller_key) || txn.Sender == global.CreatorAddress) - let ok = closeNFTTo(apps[0].get(nft_id_key), apps[0].get(seller_key)) - ok = closeAccountTo(apps[0].get(seller_key)) + let nft_id_int = toint(apps[0].get(nft_id_key)) + let lead_bid_account_byte = tobyte(apps[0].get(seller_key)) + let seller_byte = tobyte(apps[0].get(seller_key)) + if global.LatestTimestamp < toint(apps[0].get(start_time_key)) { + assert(txn.Sender == tobyte(apps[0].get(seller_key)) || txn.Sender == global.CreatorAddress) + let ok = closeNFTTo(nft_id_int, lead_bid_account_byte) + ok = closeAccountTo(tobyte(apps[0].get(seller_key))) return 1 } - if apps[0].get(end_time_key) <= global.LatestTimestamp { + if toint(apps[0].get(end_time_key)) <= global.LatestTimestamp { + if apps[0].get(lead_bid_account_key) != global.ZeroAddress { if apps[0].get(lead_bid_amount_key) >= apps[0].get(reserve_amount_key) { - let ok = closeNFTTo(apps[0].get(nft_id_key), apps[0].get(lead_bid_account_key)) + let ok = closeNFTTo(nft_id_int, lead_bid_account_byte) } else { - let ok = closeNFTTo(apps[0].get(nft_id_key), apps[0].get(seller_key)) - ok = repayPreviousLeadBidder(apps[0].get(lead_bid_account_key), apps[0].get(lead_bid_amount_key)) + let ok = closeNFTTo(nft_id_int, seller_byte) + let acc = tobyte(apps[0].get(lead_bid_account_key)) + ok = repayPreviousLeadBidder(acc, toint(apps[0].get(lead_bid_amount_key))) } } else { - let ok = closeNFTTo(apps[0].get(nft_id_key), apps[0].get(seller_key)) + let ok = closeNFTTo(nft_id_int, seller_byte) } - let ok = closeAccountTo(apps[0].get(seller_key)) + let ok = closeAccountTo(tobyte(apps[0].get(seller_key))) return 1 }