2022.05.04 22:52 [3102880] smart account 3PATXDVE53rKJtkwXYV3tvuLVS2fDtGtKCc > SELF 0.00000000 Waves
{ "type": 13, "id": "sHiCe6ABmpXMSUJ1hVGjwG2gbFsdP2ebW4MeqbcyBSL", "fee": 1400000, "feeAssetId": null, "timestamp": 1651693984454, "version": 2, "chainId": 87, "sender": "3PATXDVE53rKJtkwXYV3tvuLVS2fDtGtKCc", "senderPublicKey": "3pJsmGRpWHpqyaAjeX7BacMEfYx32LMNN4qwxQqASBmi", "proofs": [ "vTkbQPiJtWxG1BH9eTCVtJJ8Bsmgdhvm3h94nibureWcGN9M6r2Fy2rH7W5kr2QwGd8UjfJpyq4MHqQscH78Kw8" ], "script": "base64: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", "height": 3102880, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7RZELC3E4yn8u9NTfg9nt8RaxZgF6qb9ckvDt4kYuJxR Next: 5AHiDwMYtfNWfbrGZfZMcTDonQ8ghA5HAc4f26ny9pp4 Diff:
Old | New | Differences | |
---|---|---|---|
108 | 108 | let royaltyPart = fraction(buyOutPrice, royaltyPercent, 100) | |
109 | 109 | let marketFee = fraction(buyOutPrice, 5, 100) | |
110 | 110 | if ((pmt.assetId == buyOutAsset.id)) | |
111 | - | then $Tuple2([ScriptTransfer(i.caller, 1, nftAsset.id), ScriptTransfer(Address(fromBase58String(sellerStr)), (buyOutPrice - royaltyPart), buyOutAsset.id), ScriptTransfer(Address(fromBase58String(royaltyReceiver)), royaltyPart, buyOutAsset.id), ScriptTransfer(marketFeeAddress, marketFee, buyOutAsset.id), DeleteEntry((("nft_" + nftId) + "_buyOutPrice")), DeleteEntry((("nft_" + nftId) + "_buyOutAssetId")), DeleteEntry((("nft_" + nftId) + "_royaltyReceiver")), DeleteEntry((("nft_" + nftId) + "_seller")), DeleteEntry(((("address_" + sellerStr) + "_nft_") + nftId)), DeleteEntry((((("address_" + sellerStr) + "_nft_") + nftId) + "_startSaleAt"))], toBase58String(nftAsset.id)) | |
111 | + | then $Tuple2([ScriptTransfer(i.caller, 1, nftAsset.id), ScriptTransfer(Address(fromBase58String(sellerStr)), ((buyOutPrice - royaltyPart) - marketFee), buyOutAsset.id), ScriptTransfer(Address(fromBase58String(royaltyReceiver)), royaltyPart, buyOutAsset.id), ScriptTransfer(marketFeeAddress, marketFee, buyOutAsset.id), DeleteEntry((("nft_" + nftId) + "_buyOutPrice")), DeleteEntry((("nft_" + nftId) + "_buyOutAssetId")), DeleteEntry((("nft_" + nftId) + "_royaltyReceiver")), DeleteEntry((("nft_" + nftId) + "_seller")), DeleteEntry(((("address_" + sellerStr) + "_nft_") + nftId)), DeleteEntry((((("address_" + sellerStr) + "_nft_") + nftId) + "_startSaleAt"))], toBase58String(nftAsset.id)) | |
112 | 112 | else throw("The buyout asset does not match the purchase asset") | |
113 | 113 | } | |
114 | 114 | else throw("Payment amount must be greater than zero") |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let createNftDapp = base58'3PFQjjDMiZKQZdu5JqTHD7HwgSXyp9Rw9By' | |
5 | 5 | ||
6 | 6 | let marketFeeAddress = Address(base58'3PEa88W5it7LVPVwtpZDfYajQQWkxFNG8qf') | |
7 | 7 | ||
8 | 8 | let royaltyPercent = 10 | |
9 | 9 | ||
10 | 10 | func checkNFT (asset) = if (if (if ((asset.issuer.bytes == createNftDapp)) | |
11 | 11 | then (asset.decimals == 0) | |
12 | 12 | else false) | |
13 | 13 | then (asset.reissuable == false) | |
14 | 14 | else false) | |
15 | 15 | then (asset.quantity == 1) | |
16 | 16 | else false | |
17 | 17 | ||
18 | 18 | ||
19 | 19 | func tryGetInteger (key) = match getInteger(this, key) { | |
20 | 20 | case b: Int => | |
21 | 21 | b | |
22 | 22 | case _ => | |
23 | 23 | 0 | |
24 | 24 | } | |
25 | 25 | ||
26 | 26 | ||
27 | 27 | func tryGetString (key) = match getString(this, key) { | |
28 | 28 | case b: String => | |
29 | 29 | b | |
30 | 30 | case _ => | |
31 | 31 | "" | |
32 | 32 | } | |
33 | 33 | ||
34 | 34 | ||
35 | 35 | func tryGetAssetInfo (assetId,errorMsg) = match assetInfo(fromBase58String(assetId)) { | |
36 | 36 | case a: Asset => | |
37 | 37 | a | |
38 | 38 | case _ => | |
39 | 39 | throw(errorMsg) | |
40 | 40 | } | |
41 | 41 | ||
42 | 42 | ||
43 | 43 | func getAssetString (assetId) = match assetId { | |
44 | 44 | case b: ByteVector => | |
45 | 45 | toBase58String(b) | |
46 | 46 | case _ => | |
47 | 47 | "WAVES" | |
48 | 48 | } | |
49 | 49 | ||
50 | 50 | ||
51 | 51 | func getAssetBytes (assetIdStr) = if ((assetIdStr == "WAVES")) | |
52 | 52 | then unit | |
53 | 53 | else fromBase58String(assetIdStr) | |
54 | 54 | ||
55 | 55 | ||
56 | 56 | @Callable(i) | |
57 | 57 | func sellNFT (buyOutPrice,buyOutAssetId) = { | |
58 | 58 | let pmt = if (if ((size(i.payments) == 1)) | |
59 | 59 | then (i.payments[0].amount == 1) | |
60 | 60 | else false) | |
61 | 61 | then i.payments[0] | |
62 | 62 | else throw("NFT not listed as payment") | |
63 | 63 | let buyOutAsset = getAssetBytes(buyOutAssetId) | |
64 | 64 | if (isDefined(pmt.assetId)) | |
65 | 65 | then { | |
66 | 66 | let nftId = value(pmt.assetId) | |
67 | 67 | let nft = match assetInfo(nftId) { | |
68 | 68 | case a: Asset => | |
69 | 69 | a | |
70 | 70 | case _ => | |
71 | 71 | throw("Can't find NFT") | |
72 | 72 | } | |
73 | 73 | if (checkNFT(nft)) | |
74 | 74 | then if ((buyOutPrice > 0)) | |
75 | 75 | then { | |
76 | 76 | let assetNameStr = toBase58String(nft.id) | |
77 | 77 | let royaltyReceiver = match getString(Address(createNftDapp), (("nft_" + assetNameStr) + "_issuer")) { | |
78 | 78 | case a: String => | |
79 | 79 | a | |
80 | 80 | case _ => | |
81 | 81 | toString(i.caller) | |
82 | 82 | } | |
83 | 83 | [IntegerEntry((("nft_" + assetNameStr) + "_buyOutPrice"), buyOutPrice), StringEntry((("nft_" + assetNameStr) + "_buyOutAssetId"), getAssetString(buyOutAsset)), StringEntry((("nft_" + assetNameStr) + "_royaltyReceiver"), royaltyReceiver), StringEntry((("nft_" + assetNameStr) + "_seller"), toString(i.originCaller)), StringEntry(((("address_" + toString(i.originCaller)) + "_nft_") + assetNameStr), assetNameStr), IntegerEntry((((("address_" + toString(i.originCaller)) + "_nft_") + assetNameStr) + "_startSaleAt"), height)] | |
84 | 84 | } | |
85 | 85 | else throw("Price must be greater than zero") | |
86 | 86 | else throw("NFT issued by another dapp") | |
87 | 87 | } | |
88 | 88 | else throw("NFT is not attached to the transaction") | |
89 | 89 | } | |
90 | 90 | ||
91 | 91 | ||
92 | 92 | ||
93 | 93 | @Callable(i) | |
94 | 94 | func buyNFT (nftId) = { | |
95 | 95 | let pmt = if ((size(i.payments) == 1)) | |
96 | 96 | then i.payments[0] | |
97 | 97 | else throw("Attached payment is required") | |
98 | 98 | let buyOutPrice = tryGetInteger((("nft_" + nftId) + "_buyOutPrice")) | |
99 | 99 | let buyOutAssetId = tryGetString((("nft_" + nftId) + "_buyOutAssetId")) | |
100 | 100 | let royaltyReceiver = tryGetString((("nft_" + nftId) + "_royaltyReceiver")) | |
101 | 101 | let sellerStr = tryGetString((("nft_" + nftId) + "_seller")) | |
102 | 102 | let nftAsset = tryGetAssetInfo(nftId, "NFT not found") | |
103 | 103 | let buyOutAsset = tryGetAssetInfo(buyOutAssetId, "Buyout asset not found") | |
104 | 104 | if (if ((buyOutPrice > 0)) | |
105 | 105 | then (pmt.amount >= buyOutPrice) | |
106 | 106 | else false) | |
107 | 107 | then { | |
108 | 108 | let royaltyPart = fraction(buyOutPrice, royaltyPercent, 100) | |
109 | 109 | let marketFee = fraction(buyOutPrice, 5, 100) | |
110 | 110 | if ((pmt.assetId == buyOutAsset.id)) | |
111 | - | then $Tuple2([ScriptTransfer(i.caller, 1, nftAsset.id), ScriptTransfer(Address(fromBase58String(sellerStr)), (buyOutPrice - royaltyPart), buyOutAsset.id), ScriptTransfer(Address(fromBase58String(royaltyReceiver)), royaltyPart, buyOutAsset.id), ScriptTransfer(marketFeeAddress, marketFee, buyOutAsset.id), DeleteEntry((("nft_" + nftId) + "_buyOutPrice")), DeleteEntry((("nft_" + nftId) + "_buyOutAssetId")), DeleteEntry((("nft_" + nftId) + "_royaltyReceiver")), DeleteEntry((("nft_" + nftId) + "_seller")), DeleteEntry(((("address_" + sellerStr) + "_nft_") + nftId)), DeleteEntry((((("address_" + sellerStr) + "_nft_") + nftId) + "_startSaleAt"))], toBase58String(nftAsset.id)) | |
111 | + | then $Tuple2([ScriptTransfer(i.caller, 1, nftAsset.id), ScriptTransfer(Address(fromBase58String(sellerStr)), ((buyOutPrice - royaltyPart) - marketFee), buyOutAsset.id), ScriptTransfer(Address(fromBase58String(royaltyReceiver)), royaltyPart, buyOutAsset.id), ScriptTransfer(marketFeeAddress, marketFee, buyOutAsset.id), DeleteEntry((("nft_" + nftId) + "_buyOutPrice")), DeleteEntry((("nft_" + nftId) + "_buyOutAssetId")), DeleteEntry((("nft_" + nftId) + "_royaltyReceiver")), DeleteEntry((("nft_" + nftId) + "_seller")), DeleteEntry(((("address_" + sellerStr) + "_nft_") + nftId)), DeleteEntry((((("address_" + sellerStr) + "_nft_") + nftId) + "_startSaleAt"))], toBase58String(nftAsset.id)) | |
112 | 112 | else throw("The buyout asset does not match the purchase asset") | |
113 | 113 | } | |
114 | 114 | else throw("Payment amount must be greater than zero") | |
115 | 115 | } | |
116 | 116 | ||
117 | 117 | ||
118 | 118 | ||
119 | 119 | @Callable(i) | |
120 | 120 | func cancelSell (nftId) = { | |
121 | 121 | let sellerStr = tryGetString((("nft_" + nftId) + "_seller")) | |
122 | 122 | let nftAsset = tryGetAssetInfo(nftId, "NFT not found") | |
123 | 123 | if (if ((size(sellerStr) > 0)) | |
124 | 124 | then (sellerStr == toString(i.originCaller)) | |
125 | 125 | else false) | |
126 | 126 | then $Tuple2([ScriptTransfer(i.caller, 1, nftAsset.id), DeleteEntry((("nft_" + nftId) + "_buyOutPrice")), DeleteEntry((("nft_" + nftId) + "_buyOutAssetId")), DeleteEntry((("nft_" + nftId) + "_royaltyReceiver")), DeleteEntry((("nft_" + nftId) + "_seller")), DeleteEntry(((("address_" + sellerStr) + "_nft_") + nftId)), DeleteEntry((((("address_" + sellerStr) + "_nft_") + nftId) + "_startSaleAt"))], nftId) | |
127 | 127 | else throw("You are not a seller") | |
128 | 128 | } | |
129 | 129 | ||
130 | 130 | ||
131 | 131 | @Verifier(tx) | |
132 | 132 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
133 | 133 |
github/deemru/w8io/786bc32 49.29 ms ◑