tx · 7ypagv9w9kBvxMsMGPyzJuh98vkaJt6emL2Rg96KLEtZ 3PD1sd55PYzmGUrQ896Qt3uvdbtgjCVpajE: -0.00400000 Waves 2022.08.23 20:39 [3262914] smart account 3PD1sd55PYzmGUrQ896Qt3uvdbtgjCVpajE > SELF 0.00000000 Waves
{ "type": 13, "id": "7ypagv9w9kBvxMsMGPyzJuh98vkaJt6emL2Rg96KLEtZ", "fee": 400000, "feeAssetId": null, "timestamp": 1661276434024, "version": 2, "chainId": 87, "sender": "3PD1sd55PYzmGUrQ896Qt3uvdbtgjCVpajE", "senderPublicKey": "GokNVLddb43BhUkdo2fpeMvk9yczRjnasz6pFVha7u1n", "proofs": [ "z9uZZoAha6R6ud6jEZ2Y7Q82nCFTRzMPFS7xdSQDHQbXn9vm2KaYFiVjvL89BiCxqcTmZFPHyGHMLXgV3XB176u" ], "script": "base64:BgIGCAISABIACQAQY3JlYXRlTkZUQWRkcmVzcwkBB0FkZHJlc3MBARoBV5PdxNIX5yAK/fchEk7w8HZnJoMDeNRcTAATem9tYmllSXNzdWVyQWRkcmVzcwkBB0FkZHJlc3MBARoBVzwia2+DPLzn0NsAUzuxeI+PJBHmuBOukwAScHVua3NJc3N1ZXJBZGRyZXNzCQEHQWRkcmVzcwEBGgFXS+xPjera0gSnSXFRUVq2krtB1F+FwuxoABNhbGllbnNJc3N1ZXJBZGRyZXNzCQEHQWRkcmVzcwEBGgFXa8tPpNumumqoNfvKdRF0dc6oz4cuF9IYABVtYWRQdW5rc0lzc3VlckFkZHJlc3MJAQdBZGRyZXNzAQEaAVe2FZAHGGJgl+unSJcp8qs1zX7kAqoNhtkBD2lzVmFsaWROZnRBc3NldAEFYXNzZXQDAwkAAAIIBQVhc3NldAhkZWNpbWFscwAACQAAAggFBWFzc2V0CnJlaXNzdWFibGUHBwkAAAIIBQVhc3NldAhxdWFudGl0eQABBwESaXNXYXZlc1B1bmtzSXNzdWVyAQVhc3NldAQHJG1hdGNoMAkAzwgCCQDMCAIFE3pvbWJpZUlzc3VlckFkZHJlc3MJAMwIAgUScHVua3NJc3N1ZXJBZGRyZXNzCQDMCAIFE2FsaWVuc0lzc3VlckFkZHJlc3MJAMwIAgUVbWFkUHVua3NJc3N1ZXJBZGRyZXNzBQNuaWwIBQVhc3NldAZpc3N1ZXIDCQABAgUHJG1hdGNoMAIDSW50BAF4BQckbWF0Y2gwBgcBCnZhbHVlQnlLZXkCBGRhdGEDa2V5CgEEZmluZAIFYWNjdW0EbmV4dAMJAQhjb250YWlucwIFBG5leHQJAKwCAgkArAICAgEiBQNrZXkCAyI6IAkAswICCQCwAgIJAJEDAgkAtQkCBQRuZXh0AgI6IAABAAEAAQUFYWNjdW0KAAIkbAUEZGF0YQoAAiRzCQCQAwEFAiRsCgAFJGFjYzACAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEZmluZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUBD2dldElzc3VlclBhcmFtcwEFYXNzZXQDCQAAAggFBWFzc2V0Bmlzc3VlcgUVbWFkUHVua3NJc3N1ZXJBZGRyZXNzBAVpbWFnZQkBEUBleHRyTmF0aXZlKDEwNTMpAgUVbWFkUHVua3NJc3N1ZXJBZGRyZXNzCQCsAgIJANgEAQgFBWFzc2V0AmlkAgRfdXJsBAR0eXBlCQERQGV4dHJOYXRpdmUoMTA1MykCBRVtYWRQdW5rc0lzc3VlckFkZHJlc3MJAKwCAgkA2AQBCAUFYXNzZXQCaWQCBV90eXBlCQDMCAIIBQVhc3NldARuYW1lCQDMCAIJAKwCAgkArAICCQCsAgICBlR5cGU6IAUEdHlwZQICLiAIBQVhc3NldAtkZXNjcmlwdGlvbgkAzAgCBQVpbWFnZQkAzAgCAg1XYXZlc01hZFB1bmtzBQNuaWwECnBhcnNlZERhdGEJALUJAgkAswICCQCwAgIIBQVhc3NldAtkZXNjcmlwdGlvbgABAAECAiwgAwkAAAIIBQVhc3NldAZpc3N1ZXIFEnB1bmtzSXNzdWVyQWRkcmVzcwkAzAgCCAUFYXNzZXQEbmFtZQkAzAgCAkhXQVZFUyBQVU5LUyBpcyB0aGUgZmlyc3QgY29sbGVjdGlvbiBvZiBkaWdpdGFsIHB1bmtzIG9uIFdhdmVzIGJsb2NrY2hhaW4JAMwIAgkBCnZhbHVlQnlLZXkCBQpwYXJzZWREYXRhAgN1cmwJAMwIAgIKV2F2ZXNQdW5rcwUDbmlsAwkAAAIIBQVhc3NldAZpc3N1ZXIFE3pvbWJpZUlzc3VlckFkZHJlc3MJAMwIAggFBWFzc2V0BG5hbWUJAMwIAgI+U2Vjb25kIENoYXB0ZXIgb2YgdGhlIGZpcnN0LWV2ZXIgTkZULXB1bmtzIG9uIFdBVkVTIGJsb2NrY2hhaW4JAMwIAgkBCnZhbHVlQnlLZXkCBQpwYXJzZWREYXRhAgN1cmwJAMwIAgIRV2F2ZXNQdW5rcyBab21iaWUFA25pbAMJAAACCAUFYXNzZXQGaXNzdWVyBRNhbGllbnNJc3N1ZXJBZGRyZXNzCQDMCAIIBQVhc3NldARuYW1lCQDMCAICO1dlIGhhcyB0YWtlbiByb290cyBhbW9uZyB5b3UgYW5kIGZlZWQgb24geW91ciBjdWx0dXJhbCBjb2RlCQDMCAIJAQp2YWx1ZUJ5S2V5AgUKcGFyc2VkRGF0YQIDdXJsCQDMCAICFFdhdmVzUHVua3MgTWVtYWxpZW5zBQNuaWwJAAIBAhlXcm9uZyBORlQgYXNzZXQgZm9yIGlzc3VlAgFpAQRsb2NrAAQKYWRkcmVzc1N0cgkApQgBCAUBaQZjYWxsZXIEB2Fzc2V0SWQJAQV2YWx1ZQEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQFYXNzZXQJAQV2YWx1ZQEJAOwHAQUHYXNzZXRJZAQJYXNzZXREZXNjCAUFYXNzZXQLZGVzY3JpcHRpb24DAwMJAAACCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAABCQEPaXNWYWxpZE5mdEFzc2V0AQUFYXNzZXQHCQESaXNXYXZlc1B1bmtzSXNzdWVyAQUFYXNzZXQHBAtpc3N1ZVBhcmFtcwkBD2dldElzc3VlclBhcmFtcwEFBWFzc2V0BA5mYWtlSXNzdWVJZFN0cgQHJG1hdGNoMAkA/AcEBRBjcmVhdGVORlRBZGRyZXNzAgljcmVhdGVORlQFC2lzc3VlUGFyYW1zBQNuaWwDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwBQFzCQACAQIrU29tZXRoaW5nIHdlbnQgd3JvbmcgZHVyaW5nIGNyZWF0aW9uIG9mIE5GVAMJAAACBQ5mYWtlSXNzdWVJZFN0cgUOZmFrZUlzc3VlSWRTdHIJAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIAAQkA2QQBBQ5mYWtlSXNzdWVJZFN0cgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIEbmZ0XwUOZmFrZUlzc3VlSWRTdHICCF9hc3NldElkCQDYBAEIBQVhc3NldAJpZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIEbmZ0XwUOZmFrZUlzc3VlSWRTdHICB19jYWxsZXIFCmFkZHJlc3NTdHIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBG5mdF8FDmZha2VJc3N1ZUlkU3RyAgZfb3duZXIJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyBQNuaWwFDmZha2VJc3N1ZUlkU3RyCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQITSXZhbGlkIE5GVCBhdHRhY2hlZAFpAQZ1bmxvY2sABAphZGRyZXNzU3RyCQClCAEIBQFpBmNhbGxlcgQHYXNzZXRJZAkBBXZhbHVlAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBA1jYWxsZXJBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKwCAgIEbmZ0XwkA2AQBBQdhc3NldElkAgdfY2FsbGVyBAxvd25lckFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkArAICAgRuZnRfCQDYBAEFB2Fzc2V0SWQCBl9vd25lcgQVb3JpZ2luYWxOZnRBc3NldElkU3RyCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKwCAgIEbmZ0XwkA2AQBBQdhc3NldElkAghfYXNzZXRJZAQIbmZ0QXNzZXQJAQV2YWx1ZQEJAOwHAQUHYXNzZXRJZAMDAwkAAAIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAEJAQ9pc1ZhbGlkTmZ0QXNzZXQBBQhuZnRBc3NldAcJAAACBQphZGRyZXNzU3RyBQ1jYWxsZXJBZGRyZXNzBwQHaW52QnVybgkA/AcEBRBjcmVhdGVORlRBZGRyZXNzAgdidXJuTkZUBQNuaWwJAMwIAgkAkQMCCAUBaQhwYXltZW50cwAABQNuaWwDCQAAAgUHaW52QnVybgUHaW52QnVybgkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgABCQDZBAEFFW9yaWdpbmFsTmZ0QXNzZXRJZFN0cgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIEbmZ0XwkA2AQBBQdhc3NldElkAghfYXNzZXRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIEbmZ0XwkA2AQBBQdhc3NldElkAgdfY2FsbGVyCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgRuZnRfCQDYBAEFB2Fzc2V0SWQCBl9vd25lcgUDbmlsBRVvcmlnaW5hbE5mdEFzc2V0SWRTdHIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAhNJdmFsaWQgTkZUIGF0dGFjaGVkAQJ0eAEGdmVyaWZ5AAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleT3HY1o=", "height": 3262914, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: cUohQiFDAALEssTkG2hY4qdYAqkneWKMDN8YcRV3dVe Next: BYpqW2mQuzDYuk8yDeXioxjwdBVC5hYzVbz4XmFx2aSq Diff:
Old | New | Differences | |
---|---|---|---|
49 | 49 | func getIssuerParams (asset) = if ((asset.issuer == madPunksIssuerAddress)) | |
50 | 50 | then { | |
51 | 51 | let image = getStringValue(madPunksIssuerAddress, (toBase58String(asset.id) + "_url")) | |
52 | - | let fract = getStringValue(madPunksIssuerAddress, (toBase58String(asset.id) + "_fraction")) | |
53 | 52 | let type = getStringValue(madPunksIssuerAddress, (toBase58String(asset.id) + "_type")) | |
54 | - | [asset.name, | |
53 | + | [asset.name, ((("Type: " + type) + ". ") + asset.description), image, "WavesMadPunks"] | |
55 | 54 | } | |
56 | 55 | else { | |
57 | 56 | let parsedData = split(dropRight(drop(asset.description, 1), 1), ", ") |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let createNFTAddress = Address(base58'3PFQjjDMiZKQZdu5JqTHD7HwgSXyp9Rw9By') | |
5 | 5 | ||
6 | 6 | let zombieIssuerAddress = Address(base58'3P7QrWH1ETLfKAJcFHYPJmQusNbDuW98Hop') | |
7 | 7 | ||
8 | 8 | let punksIssuerAddress = Address(base58'3P8rLVnwrTf4k5AB3emuduhZZb1yKcitTHy') | |
9 | 9 | ||
10 | 10 | let aliensIssuerAddress = Address(base58'3PBkrb5LrGDvCwkx4VHZzZkqMNvvGqrJJWj') | |
11 | 11 | ||
12 | 12 | let madPunksIssuerAddress = Address(base58'3PJXfYMavRVzBDXqsFfwkLdEV7yuF5RToya') | |
13 | 13 | ||
14 | 14 | func isValidNftAsset (asset) = if (if ((asset.decimals == 0)) | |
15 | 15 | then (asset.reissuable == false) | |
16 | 16 | else false) | |
17 | 17 | then (asset.quantity == 1) | |
18 | 18 | else false | |
19 | 19 | ||
20 | 20 | ||
21 | 21 | func isWavesPunksIssuer (asset) = match indexOf([zombieIssuerAddress, punksIssuerAddress, aliensIssuerAddress, madPunksIssuerAddress], asset.issuer) { | |
22 | 22 | case x: Int => | |
23 | 23 | true | |
24 | 24 | case _ => | |
25 | 25 | false | |
26 | 26 | } | |
27 | 27 | ||
28 | 28 | ||
29 | 29 | func valueByKey (data,key) = { | |
30 | 30 | func find (accum,next) = if (contains(next, (("\"" + key) + "\": "))) | |
31 | 31 | then dropRight(drop(split(next, ": ")[1], 1), 1) | |
32 | 32 | else accum | |
33 | 33 | ||
34 | 34 | let $l = data | |
35 | 35 | let $s = size($l) | |
36 | 36 | let $acc0 = "" | |
37 | 37 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
38 | 38 | then $a | |
39 | 39 | else find($a, $l[$i]) | |
40 | 40 | ||
41 | 41 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
42 | 42 | then $a | |
43 | 43 | else throw("List size exceeds 5") | |
44 | 44 | ||
45 | 45 | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5) | |
46 | 46 | } | |
47 | 47 | ||
48 | 48 | ||
49 | 49 | func getIssuerParams (asset) = if ((asset.issuer == madPunksIssuerAddress)) | |
50 | 50 | then { | |
51 | 51 | let image = getStringValue(madPunksIssuerAddress, (toBase58String(asset.id) + "_url")) | |
52 | - | let fract = getStringValue(madPunksIssuerAddress, (toBase58String(asset.id) + "_fraction")) | |
53 | 52 | let type = getStringValue(madPunksIssuerAddress, (toBase58String(asset.id) + "_type")) | |
54 | - | [asset.name, | |
53 | + | [asset.name, ((("Type: " + type) + ". ") + asset.description), image, "WavesMadPunks"] | |
55 | 54 | } | |
56 | 55 | else { | |
57 | 56 | let parsedData = split(dropRight(drop(asset.description, 1), 1), ", ") | |
58 | 57 | if ((asset.issuer == punksIssuerAddress)) | |
59 | 58 | then [asset.name, "WAVES PUNKS is the first collection of digital punks on Waves blockchain", valueByKey(parsedData, "url"), "WavesPunks"] | |
60 | 59 | else if ((asset.issuer == zombieIssuerAddress)) | |
61 | 60 | then [asset.name, "Second Chapter of the first-ever NFT-punks on WAVES blockchain", valueByKey(parsedData, "url"), "WavesPunks Zombie"] | |
62 | 61 | else if ((asset.issuer == aliensIssuerAddress)) | |
63 | 62 | then [asset.name, "We has taken roots among you and feed on your cultural code", valueByKey(parsedData, "url"), "WavesPunks Memaliens"] | |
64 | 63 | else throw("Wrong NFT asset for issue") | |
65 | 64 | } | |
66 | 65 | ||
67 | 66 | ||
68 | 67 | @Callable(i) | |
69 | 68 | func lock () = { | |
70 | 69 | let addressStr = toString(i.caller) | |
71 | 70 | let assetId = value(i.payments[0].assetId) | |
72 | 71 | let asset = value(assetInfo(assetId)) | |
73 | 72 | let assetDesc = asset.description | |
74 | 73 | if (if (if ((i.payments[0].amount == 1)) | |
75 | 74 | then isValidNftAsset(asset) | |
76 | 75 | else false) | |
77 | 76 | then isWavesPunksIssuer(asset) | |
78 | 77 | else false) | |
79 | 78 | then { | |
80 | 79 | let issueParams = getIssuerParams(asset) | |
81 | 80 | let fakeIssueIdStr = match invoke(createNFTAddress, "createNFT", issueParams, nil) { | |
82 | 81 | case s: String => | |
83 | 82 | s | |
84 | 83 | case _ => | |
85 | 84 | throw("Something went wrong during creation of NFT") | |
86 | 85 | } | |
87 | 86 | if ((fakeIssueIdStr == fakeIssueIdStr)) | |
88 | 87 | then $Tuple2([ScriptTransfer(i.caller, 1, fromBase58String(fakeIssueIdStr)), StringEntry((("nft_" + fakeIssueIdStr) + "_assetId"), toBase58String(asset.id)), StringEntry((("nft_" + fakeIssueIdStr) + "_caller"), addressStr), StringEntry((("nft_" + fakeIssueIdStr) + "_owner"), toString(i.originCaller))], fakeIssueIdStr) | |
89 | 88 | else throw("Strict value is not equal to itself.") | |
90 | 89 | } | |
91 | 90 | else throw("Ivalid NFT attached") | |
92 | 91 | } | |
93 | 92 | ||
94 | 93 | ||
95 | 94 | ||
96 | 95 | @Callable(i) | |
97 | 96 | func unlock () = { | |
98 | 97 | let addressStr = toString(i.caller) | |
99 | 98 | let assetId = value(i.payments[0].assetId) | |
100 | 99 | let callerAddress = getStringValue(this, (("nft_" + toBase58String(assetId)) + "_caller")) | |
101 | 100 | let ownerAddress = getStringValue(this, (("nft_" + toBase58String(assetId)) + "_owner")) | |
102 | 101 | let originalNftAssetIdStr = getStringValue(this, (("nft_" + toBase58String(assetId)) + "_assetId")) | |
103 | 102 | let nftAsset = value(assetInfo(assetId)) | |
104 | 103 | if (if (if ((i.payments[0].amount == 1)) | |
105 | 104 | then isValidNftAsset(nftAsset) | |
106 | 105 | else false) | |
107 | 106 | then (addressStr == callerAddress) | |
108 | 107 | else false) | |
109 | 108 | then { | |
110 | 109 | let invBurn = invoke(createNFTAddress, "burnNFT", nil, [i.payments[0]]) | |
111 | 110 | if ((invBurn == invBurn)) | |
112 | 111 | then $Tuple2([ScriptTransfer(i.caller, 1, fromBase58String(originalNftAssetIdStr)), DeleteEntry((("nft_" + toBase58String(assetId)) + "_assetId")), DeleteEntry((("nft_" + toBase58String(assetId)) + "_caller")), DeleteEntry((("nft_" + toBase58String(assetId)) + "_owner"))], originalNftAssetIdStr) | |
113 | 112 | else throw("Strict value is not equal to itself.") | |
114 | 113 | } | |
115 | 114 | else throw("Ivalid NFT attached") | |
116 | 115 | } | |
117 | 116 | ||
118 | 117 | ||
119 | 118 | @Verifier(tx) | |
120 | 119 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
121 | 120 |
github/deemru/w8io/873ac7e 44.17 ms ◑