tx · 7yTcDBLfPYvyzFuLGZbQMRNTwKcFvbNTrBUvQvxhEVAY

3Mr6LNXTo2cMvNMrka9pV1pwHZFXVHULoue:  -0.01400000 Waves

2021.12.02 10:51 [1816381] smart account 3Mr6LNXTo2cMvNMrka9pV1pwHZFXVHULoue > SELF 0.00000000 Waves

{ "type": 13, "id": "7yTcDBLfPYvyzFuLGZbQMRNTwKcFvbNTrBUvQvxhEVAY", "fee": 1400000, "feeAssetId": null, "timestamp": 1638431526487, "version": 2, "chainId": 84, "sender": "3Mr6LNXTo2cMvNMrka9pV1pwHZFXVHULoue", "senderPublicKey": "9tHFZ3PMkyXBYPkjU77RdMPEGBzfm7BWxfuHvGjgdrv5", "proofs": [ "38n2nKVRLTU9QrAdLXiR3DtWQVzJgFW9hrHjXfstExfdDoQjffhwNejrTX5Tz6ueCyD8WTEiAhNqhmXX6raPbVLy" ], "script": "base64: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", "height": 1816381, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Dq3yM1iJ9TYCWftAZCCw7yhh38B1iNB6DBK5smJiTXWs Next: 68vEkzF76dyop3nTFC7sVep9KXsXBrKaZsiCfpvWZXKu Diff:
OldNewDifferences
55
66
77 func ownerKey (asset) = (asset + "_owner")
8+
9+
10+func issuerKey (asset) = (asset + "_issuer")
811
912
1013 func tryGetInteger (key) = {
5356 then asset.reissuable
5457 else false)
5558 then throw("Asset is not NFT")
56- else [IntegerEntry(priceKey(assetIdStr), price), StringEntry(ownerKey(assetIdStr), toBase58String(i.caller.bytes))]
59+ else [IntegerEntry(priceKey(assetIdStr), price), StringEntry(ownerKey(assetIdStr), toBase58String(i.caller.bytes)), StringEntry(issuerKey(assetIdStr), toBase58String(asset.issuer.bytes))]
5760 }
5861
5962
8386 then throw("Payment must be in Waves tokens only")
8487 else if ((price > firstPayment.amount))
8588 then throw("Insufficient funds")
86- else [ScriptTransfer(i.caller, 1, fromBase58String(assetStr)), ScriptTransfer(owner, price, unit), DeleteEntry(priceKey(assetStr)), DeleteEntry(ownerKey(assetStr))]
89+ else {
90+ let fee = ((price / 100) * 5)
91+[ScriptTransfer(i.caller, 1, fromBase58String(assetStr)), ScriptTransfer(owner, (price - fee), unit), DeleteEntry(priceKey(assetStr)), DeleteEntry(ownerKey(assetStr)), DeleteEntry(issuerKey(assetStr))]
92+ }
8793 }
8894
8995
99105 }
100106 if ((ownerStr != toBase58String(i.caller.bytes)))
101107 then throw("The calling address is not the owner of the NFT token")
102- else [ScriptTransfer(i.caller, 1, fromBase58String(assetStr)), DeleteEntry(priceKey(assetStr)), DeleteEntry(ownerKey(assetStr))]
108+ else [ScriptTransfer(i.caller, 1, fromBase58String(assetStr)), DeleteEntry(priceKey(assetStr)), DeleteEntry(ownerKey(assetStr)), DeleteEntry(issuerKey(assetStr))]
103109 }
104110
105111
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func priceKey (asset) = (asset + "_price")
55
66
77 func ownerKey (asset) = (asset + "_owner")
8+
9+
10+func issuerKey (asset) = (asset + "_issuer")
811
912
1013 func tryGetInteger (key) = {
1114 let val = match getInteger(this, key) {
1215 case b: Int =>
1316 b
1417 case _ =>
1518 0
1619 }
1720 val
1821 }
1922
2023
2124 func tryGetString (key) = {
2225 let val = match getString(this, key) {
2326 case b: String =>
2427 b
2528 case _ =>
2629 ""
2730 }
2831 val
2932 }
3033
3134
3235 @Callable(i)
3336 func offerForSale (price) = {
3437 let firstPayment = value(i.payments[0])
3538 let assetId = match firstPayment.assetId {
3639 case id: ByteVector =>
3740 id
3841 case w: Unit =>
3942 throw("Asset is not NFT")
4043 case _ =>
4144 throw("Match error")
4245 }
4346 let assetIdStr = toBase58String(assetId)
4447 let asset = match assetInfo(assetId) {
4548 case a: Asset =>
4649 a
4750 case _ =>
4851 throw("Error getting information about asset")
4952 }
5053 if (if (if ((asset.quantity != 1))
5154 then (asset.decimals != 0)
5255 else false)
5356 then asset.reissuable
5457 else false)
5558 then throw("Asset is not NFT")
56- else [IntegerEntry(priceKey(assetIdStr), price), StringEntry(ownerKey(assetIdStr), toBase58String(i.caller.bytes))]
59+ else [IntegerEntry(priceKey(assetIdStr), price), StringEntry(ownerKey(assetIdStr), toBase58String(i.caller.bytes)), StringEntry(issuerKey(assetIdStr), toBase58String(asset.issuer.bytes))]
5760 }
5861
5962
6063
6164 @Callable(i)
6265 func buy (assetStr) = {
6366 let price = tryGetInteger(priceKey(assetStr))
6467 let ownerStr = tryGetString(ownerKey(assetStr))
6568 let owner = match addressFromString(ownerStr) {
6669 case a: Address =>
6770 a
6871 case _ =>
6972 throw("Address parsing error")
7073 }
7174 let firstPayment = value(i.payments[0])
7275 let firstPaymentBool = match firstPayment.assetId {
7376 case t: ByteVector =>
7477 true
7578 case w: Unit =>
7679 false
7780 case _ =>
7881 throw("Match error")
7982 }
8083 if ((price == 0))
8184 then throw("This NFT is not for sale")
8285 else if (firstPaymentBool)
8386 then throw("Payment must be in Waves tokens only")
8487 else if ((price > firstPayment.amount))
8588 then throw("Insufficient funds")
86- else [ScriptTransfer(i.caller, 1, fromBase58String(assetStr)), ScriptTransfer(owner, price, unit), DeleteEntry(priceKey(assetStr)), DeleteEntry(ownerKey(assetStr))]
89+ else {
90+ let fee = ((price / 100) * 5)
91+[ScriptTransfer(i.caller, 1, fromBase58String(assetStr)), ScriptTransfer(owner, (price - fee), unit), DeleteEntry(priceKey(assetStr)), DeleteEntry(ownerKey(assetStr)), DeleteEntry(issuerKey(assetStr))]
92+ }
8793 }
8894
8995
9096
9197 @Callable(i)
9298 func cancelSelling (assetStr) = {
9399 let ownerStr = tryGetString(ownerKey(assetStr))
94100 let owner = match addressFromString(ownerStr) {
95101 case a: Address =>
96102 a
97103 case _ =>
98104 throw("Address parsing error")
99105 }
100106 if ((ownerStr != toBase58String(i.caller.bytes)))
101107 then throw("The calling address is not the owner of the NFT token")
102- else [ScriptTransfer(i.caller, 1, fromBase58String(assetStr)), DeleteEntry(priceKey(assetStr)), DeleteEntry(ownerKey(assetStr))]
108+ else [ScriptTransfer(i.caller, 1, fromBase58String(assetStr)), DeleteEntry(priceKey(assetStr)), DeleteEntry(ownerKey(assetStr)), DeleteEntry(issuerKey(assetStr))]
103109 }
104110
105111
106112 @Verifier(tx)
107113 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
108114

github/deemru/w8io/c3f4982 
26.14 ms