tx · 28yb5QgKjt9wrS5jJZhQqsqTviFuq1DKZSQkgQcwpDbJ

3N2Tdcx5fzxJAKP5hMp9W35Cp1EFzfiJ1zG:  -0.01400000 Waves

2020.10.16 12:22 [1222947] smart account 3N2Tdcx5fzxJAKP5hMp9W35Cp1EFzfiJ1zG > SELF 0.00000000 Waves

{ "type": 13, "id": "28yb5QgKjt9wrS5jJZhQqsqTviFuq1DKZSQkgQcwpDbJ", "fee": 1400000, "feeAssetId": null, "timestamp": 1602840175452, "version": 2, "chainId": 84, "sender": "3N2Tdcx5fzxJAKP5hMp9W35Cp1EFzfiJ1zG", "senderPublicKey": "9SULUbW7L2jV2nv8v48Kdzox4cZ8jEfg778yJHJpgVwM", "proofs": [ "AZ9AczMwNGDrh9k4YtyXsBZxGpVVNHHmfa9z8vHJzQ68wgsGyMM9oVvw9Mw3VAHoNNt6jgwBKGMc2hRL4Yn6pQ1" ], "script": "base64:AAIEAAAAAAAAAFoIAhIGCgQICAgIEgMKAQgSBgoECAgICBIECgIICBIDCgEIEg4KDAgICAgICAEICAgICBINCgsICAgICAEICAgICBIECgIICBIGCgQIAQEIEgQKAggIEgMKAQgAAAA5AAAAAAlvcmFjbGVGZWUJAQAAAAV2YWx1ZQAAAAEJAAQmAAAAAQIAAAAjM04yczVSdGFIUEJlbkNzeDJFQ2NvRlJiWUh4M25vWmhYVzEAAAAACHNpZ25EYXBwCQEAAAAFdmFsdWUAAAABCQAEJgAAAAECAAAAIzNOQzI4aFNpdnJtc1RVWGFZRDF4NkwzNjJKNFpwVW5vVGRCAAAAAAtmZWVSZWNlaXZlcgIAAAAjM04xRTZ0WGRkUm9WYVJmUTlkUTN2ZzVMYVcyZnNkOEhLdWIAAAAAC3NpZ25Bc3NldElkAQAAACDopWq8yndC8nBhMjVKT0WDubke5ZlnF8Nx6tkLoQSt6wAAAAALdXNkbkFzc2V0SWQBAAAAIA/yHBKs5MQ8muxGGqslqLDsugcrRsxtiHLwteKSSQG0AAAAAAx3YXZlc0Fzc2V0SWQBAAAAAAAAAAAHc2lnbkN1dAAAAAAAAAAACAAAAAAHdXNkbkN1dAAAAAAAAAAACgAAAAAId2F2ZXNDdXQAAAAAAAAAAAoAAAAABWFkbWluAgAAACMzTXNHNmpQTkNyVkpVdFlCN1hKQnhTN3V0V3NYQWY0bjlWcAAAAAAGYWRtaW4yAgAAACMzTXptNFZMd3NOOXVad2JUTXpQajNYdXhWNmtFZkFSOFVETgAAAAAPV0hJVEVMSVNURURPTkxZBgAAAAALZGFwcFJ1bm5pbmcGAAAAAA5tYWludGVuYW5jZU1TRwIAAAAdU0lHTiBBcnQgaXMgdW5kZXIgbWFpbnRlbmFuY2UAAAAAC3VzZXJBbGxvd2VkAgAAAAdBTExPV0VEAAAAAA51c2VyUmVnaXN0ZXJlZAIAAAAKUkVHSVNURVJFRAAAAAAMdXNlclZlcmlmaWVkAgAAAAhWRVJJRklFRAAAAAANdXNlclN1c3BlbmRlZAIAAAAJU1VTUEVOREVEAAAAAAt1c2VyUmVtb3ZlZAIAAAAHUkVNT1ZFRAAAAAAQdXNlclVucmVnaXN0ZXJlZAIAAAAMVU5SRUdJU1RFUkVEAAAAAAl1c2VyUmVz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dm9rZV9pZAUAAAACaWQFAAAAA25pbAAAAAFpAQAAABBjaGFuZ2VVc2VyU3RhdHVzAAAAAgAAAAdhZGRyZXNzAAAABnN0YXR1cwMJAQAAAAEhAAAAAQUAAAALZGFwcFJ1bm5pbmcJAAACAAAAAQUAAAAObWFpbnRlbmFuY2VNU0cEAAAABmNhbGxlcgkABCUAAAABCQEAAAAUYWRkcmVzc0Zyb21QdWJsaWNLZXkAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkEAAAAAmlkCQACWAAAAAEIBQAAAAFpAAAADXRyYW5zYWN0aW9uSWQEAAAADWN1cnJlbnRTdGF0dXMJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAAA1rZXlVc2VyU3RhdHVzAAAAAQUAAAAHYWRkcmVzcwQAAAALc3RhdHVzVG9TZXQDCQAAAAAAAAIFAAAABnN0YXR1cwUAAAAMdXNlclZlcmlmaWVkBQAAAAx1c2VyVmVyaWZpZWQDCQAAAAAAAAIFAAAABnN0YXR1cwUAAAAOdXNlclJlZ2lzdGVyZWQFAAAADnVzZXJSZWdpc3RlcmVkAwkAAAAAAAACBQAAAAZzdGF0dXMFAAAADXVzZXJTdXNwZW5kZWQFAAAADXVzZXJTdXNwZW5kZWQDCQAAAAAAAAIFAAAABnN0YXR1cwUAAAALdXNlclJlbW92ZWQFAAAAC3VzZXJSZW1vdmVkAwkAAAAAAAACBQAAAAZzdGF0dXMFAAAAC3VzZXJBbGxvd2VkBQAAAAt1c2VyQWxsb3dlZAMDCQAAAAAAAAIFAAAABnN0YXR1cwUAAAAJdXNlclJlc2V0CQAAAAAAAAIFAAAADWN1cnJlbnRTdGF0dXMFAAAAC3VzZXJBbGxvd2VkBwIAAAAACQAAAgAAAAECAAAADlVua25vd24gc3RhdHVzAwMJAAAAAAAAAgUAAAANY3VycmVudFN0YXR1cwUAAAALdXNlckFsbG93ZWQJAAAAAAAAAgUAAAAGc3RhdHVzBQAAAAt1c2VyQWxsb3dlZAcJAAACAAAAAQIAAAAUVXNlciBhbHJlYWR5IGFsbG93ZWQDAwkAAAAAAAACBQAAAA1jdXJyZW50U3RhdHVzBQAAAA51c2VyUmVnaXN0ZXJlZAkAAAAAAAACBQAAAAZzdGF0dXMFAAAA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AAAAAQIAAAAmT25seSBTSUdOIHRva2VuIGFjY2VwdGVkIGF0IHRoZSBtb21lbnQEAAAAGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UEAAAAByRtYXRjaDAJAAQaAAAAAgUAAAAJb3JhY2xlRmVlCQABLAAAAAICAAAAEmNlcnRpZmljYXRpb25fZmVlXwkAAlgAAAABBQAAAAtzaWduQXNzZXRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAVwcmljZQUAAAAHJG1hdGNoMAUAAAAFcHJpY2UJAAACAAAAAQIAAAAZUHJpY2UgdW5kZWZpbmVkIGluIG9yYWNsZQMJAQAAAAIhPQAAAAIFAAAABmFtb3VudAUAAAAZY3VycmVudENlcnRpZmljYXRpb25QcmljZQkAAAIAAAABCQABLAAAAAICAAAAGVBheW1lbnQgYW1vdW50IHNob3VsZCBiZSAJAAGkAAAAAQUAAAAZY3VycmVudENlcnRpZmljYXRpb25QcmljZQQAAAAKZW50cnlFeGlzdAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAFWtleUFydFR4aWRCeUhhc2hPd25lcgAAAAIFAAAACnNoYTI1Nkhhc2gFAAAABmNhbGxlcgMJAQAAAAIhPQAAAAIFAAAACmVudHJ5RXhpc3QCAAAAAAkAAAIAAAABAgAAABRZb3UgYWxyZWFkeSBhZGRlZCBpdAQAAAAJaGFzaEV4aXN0CQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAARa2V5QXJ0T3duZXJCeUhhc2gAAAABBQAAAApzaGEyNTZIYXNoAwkBAAAAAiE9AAAAAgUAAAAJaGFzaEV4aXN0AgAAAAAJAAACAAAAAQIAAAAXSGFzaCBhbHJlYWR5IHJlZ2lzdGVyZWQEAAAAD2lzU2lnbkNlcnRpZmllZAkBAAAAFGNoZWNrU2lnbkNlcnRpZmljYXRlAAAAAwUAAAAGc2lnbklEBQAAAAZjYWxsZXIFAAAACnNoYTI1Nkhhc2gDCQEAAAABIQAAAAEFAAAAD2lzU2lnbkNlcnRpZmllZAkAAAIAAAABAgAAACxTaWduIENlcnRpZmljYXRlIG5vdCBmb3VuZCBmb3IgdGhpcyBhZGRyZXNzLgMJAAAAAAAAAgkA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AAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEGtleUFydERpc3BsYXlDaWQAAAACBQAAAAZjYWxsZXIFAAAABHR4aWQFAAAACmNpZERpc3BsYXkJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAD2tleUFydEV4cG9ydENpZAAAAAIFAAAABmNhbGxlcgUAAAAEdHhpZAUAAAAJY2lkRXhwb3J0CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABBrZXlBcnRFeHBvcnRIYXNoAAAAAgUAAAAGY2FsbGVyBQAAAAR0eGlkBQAAAAxzaGEyNTZFeHBvcnQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEGtleUFydExpY2VuY2VDaWQAAAACBQAAAAZjYWxsZXIFAAAABHR4aWQFAAAACmNpZExpY2VuY2UJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEWtleUFydExpY2VuY2VIYXNoAAAAAgUAAAAGY2FsbGVyBQAAAAR0eGlkBQAAAA1zaGEyNTZMaWNlbmNlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAANa2V5QXJ0TWF4TWludAAAAAIFAAAABmNhbGxlcgUAAAAEdHhpZAUAAAAHbWF4bWludAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAKa2V5QXJ0VGFncwAAAAIFAAAABmNhbGxlcgUAAAAEdHhpZAUAAAAEdGFncwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAKa2V5QXJ0VHlwZQAAAAIFAAAABmNhbGxlcgUAAAAEdHhpZAUAAAAEdHlwZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACAgAAAA5sYXN0X2ludm9rZV9pZAUAAAAIdXBkYXRlSWQFAAAAA25pbAkAAAIAAAABAgAAAA5BbHJlYWR5IG1pbnRlZAAAAAFpAQAAAA1kZWxldGVBcnR3b3JrAAAAAgAAAAVhcnRJZAAAAAdhZGRyZXNzBAAAAAZjYWxsZXIJAAQlAAAAAQkBAAAAFGFkZHJlc3NGcm9tUHVibGljS2V5AAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BAAAAAJpZAkAAlgAAAABCAUAAAABaQAAAA10cmFuc2FjdGlvbklkBAAAAAxhZGRyZXNzVG9Vc2UDAwkAAAAAAAACBQAAAAZjYWxsZXIFAAAABWFkbWluBgkAAAAAAAACBQAAAAZjYWxsZXIFAAAABmFkbWluMgUAAAAHYWRkcmVzcwUAAAAGY2FsbGVyBAAAAAplbnRyeUV4aXN0BAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABHRoaXMJAQAAAAprZXlBcnROYW1lAAAAAgUAAAAMYWRkcmVzc1RvVXNlBQAAAAVhcnRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFzBQAAAAckbWF0Y2gwBQAAAAFzCQAAAgAAAAECAAAAD05vIGFydCBtYXRjaGluZwQAAAANYXJ0d29ya01pbnRlZAQAAAAHJG1hdGNoMAkABBoAAAACBQAAAAR0aGlzCQEAAAAMa2V5QXJ0SXNzdWVkAAAAAgUAAAAMYWRkcmVzc1RvVXNlBQAAAAVhcnRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFiBQAAAAckbWF0Y2gwAwkBAAAAAiE9AAAAAgUAAAABYgAAAAAAAAAAAAYHBwQAAAAHbWF4TWludAkBAAAAD2dldEludGVnZXJCeUtleQAAAAEJAQAAAA1rZXlBcnRNYXhNaW50AAAAAgUAAAAMYWRkcmVzc1RvVXNlBQAAAAVhcnRJZAQAAAAKc2hhMjU2SGFzaAQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAR0aGlzCQEAAAAUa2V5QXJ0SGFzaEJ5VHhpZEFkZHIAAAACBQAAAAxhZGRyZXNzVG9Vc2UFAAAABWFydElkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAXMFAAAAByRtYXRjaDAFAAAAAXMJAAACAAAAAQIAAAAUTm8gYXJ0IGhhc2ggbWF0Y2hpbmcEAAAABnNpZ25JRAQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAR0aGlzCQEAAAAMa2V5QXJ0U2lnbklEAAAAAgUAAAAMYWRkcmVzc1RvVXNlBQAAAAVhcnRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFzBQAAAAckbWF0Y2gwBQAAAAFzCQAAAgAAAAECAAAAE05vIFNJR04gSUQgbWF0Y2hpbmcEAAAADGRhdGFUb0RlbGV0ZQkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAKa2V5QXJ0RGF0ZQAAAAIFAAAADGFkZHJlc3NUb1VzZQUAAAAFYXJ0SWQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAACmtleUFydE5hbWUAAAACBQAAAAxhZGRyZXNzVG9Vc2UFAAAABWFydElkCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAAAprZXlBcnREZXNjAAAAAgUAAAAMYWRkcmVzc1RvVXNlBQAAAAVhcnRJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAQa2V5QXJ0RGlzcGxheUNpZAAAAAIFAAAADGFkZHJlc3NUb1VzZQUAAAAFYXJ0SWQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAAD2tleUFydEV4cG9ydENpZAAAAAIFAAAADGFkZHJlc3NUb1VzZQUAAAAFYXJ0SWQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAAEGtleUFydEV4cG9ydEhhc2gAAAACBQAAAAxhZGRyZXNzVG9Vc2UFAAAABWFydElkCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAABFrZXlBcnRMaWNlbmNlSGFzaAAAAAIFAAAADGFkZHJlc3NUb1VzZQUAAAAFYXJ0SWQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAAEGtleUFydExpY2VuY2VDaWQAAAACBQAAAAxhZGRyZXNzVG9Vc2UFAAAABWFydElkCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAAAprZXlBcnRUeXBlAAAAAgUAAAAMYWRkcmVzc1RvVXNlBQAAAAVhcnRJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAKa2V5QXJ0VGFncwAAAAIFAAAADGFkZHJlc3NUb1VzZQUAAAAFYXJ0SWQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAADWtleUFydE1heE1pbnQAAAACBQAAAAxhZGRyZXNzVG9Vc2UFAAAABWFydElkCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAAAxrZXlBcnRTaWduSUQAAAACBQAAAAxhZGRyZXNzVG9Vc2UFAAAABWFydElkCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAAAxrZXlBcnRJc3N1ZWQAAAACBQAAAAxhZGRyZXNzVG9Vc2UFAAAABWFydElkCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAAAxrZXlBcnRPblNhbGUAAAACBQAAAAxhZGRyZXNzVG9Vc2UFAAAABWFydElkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAICAAAADmxhc3RfaW52b2tlX2lkBQAAAAJpZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAARa2V5QXJ0T3duZXJCeUhhc2gAAAABBQAAAApzaGEyNTZIYXNoCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAABNrZXlBcnRBcnRpZEJ5U2lnbmlkAAAAAgUAAAAMYWRkcmVzc1RvVXNlBQAAAAZzaWduSUQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAAFWtleUFydFR4aWRCeUhhc2hPd25lcgAAAAIFAAAACnNoYTI1Nkhhc2gFAAAADGFkZHJlc3NUb1VzZQkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAALa2V5QXJ0UHJpY2UAAAACBQAAAAxhZGRyZXNzVG9Vc2UFAAAABWFydElkCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAAA1rZXlBcnRNYXhNaW50AAAAAgUAAAAMYWRkcmVzc1RvVXNlBQAAAAVhcnRJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAVa2V5QXJ0QXNzZXRJZEFjY2VwdGVkAAAAAgUAAAAMYWRkcmVzc1RvVXNlBQAAAAVhcnRJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAOYXJ0X3Nv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cmluZ0J5S2V5AAAAAQkBAAAAEGtleUFydERpc3BsYXlDaWQAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkBAAAAAlleHBvcnRDSUQJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAAA9rZXlBcnRFeHBvcnRDaWQAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkBAAAAApleHBvcnRIYXNoCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAQa2V5QXJ0RXhwb3J0SGFzaAAAAAIFAAAABmlzc3VlcgUAAAAFYXJ0SWQEAAAACmxpY2VuY2VDSUQJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAABBrZXlBcnRMaWNlbmNlQ2lkAAAAAgUAAAAGaXNzdWVyBQAAAAVhcnRJZAQAAAALbGljZW5jZUhhc2gJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAABFrZXlBcnRMaWNlbmNlSGFzaAAAAAIFAAAABmlzc3VlcgUAAAAFYXJ0SWQEAAAAC2Rlc2NyaXB0aW9uCQABLwAAAAIJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAAAprZXlBcnREZXNjAAAAAgUAAAAGaXNzdWVyBQAAAAVhcnRJZAAAAAAAAAAAMgQAAAAKYW1vdW50U29sZAkBAAAAD2dldEludGVnZXJCeUtleQAAAAEJAQAAAAxrZXlBcnRJc3N1ZWQAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkBAAAAAxhcnR3b3JrUHJpY2UJAQAAAA9nZXRJbnRlZ2VyQnlLZXkAAAABCQEAAAALa2V5QXJ0UHJpY2UAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkBAAAAAhpc09uU2FsZQkBAAAAD2dldEJvb2xlYW5CeUtleQAAAAEJAQAAAAxrZXlBcnRPblNhbGUAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkBAAAAAxwcmljZUFzc2V0SWQJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAABVrZXlBcnRBc3NldElkQWNjZXB0ZWQAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkBAAAAApzb3VyY2VIYXNoCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAUa2V5QXJ0SGFzaEJ5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", "height": 1222947, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Dx9vfNH8Yn9kaTyA6kX3LEkrdu5ocbuSeUVzKJNj3LFT Next: DBcES3ySzFDTDxaNvfMkziDtgx6pcUpbptS7Bckz4uta Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let storageVerifier = value(addressFromString("3N2s5RtaHPBenCsx2ECcoFRbYHx3noZhXW1"))
4+let oracleFee = value(addressFromString("3N2s5RtaHPBenCsx2ECcoFRbYHx3noZhXW1"))
55
6-let signVerifier = value(addressFromString("3NC28hSivrmsTUXaYD1x6L362J4ZpUnoTdB"))
6+let signDapp = value(addressFromString("3NC28hSivrmsTUXaYD1x6L362J4ZpUnoTdB"))
77
88 let feeReceiver = "3N1E6tXddRoVaRfQ9dQ3vg5LaW2fsd8HKub"
99
2525
2626 let WHITELISTEDONLY = true
2727
28+let dappRunning = true
29+
30+let maintenanceMSG = "SIGN Art is under maintenance"
31+
2832 let userAllowed = "ALLOWED"
2933
3034 let userRegistered = "REGISTERED"
3842 let userUnregistered = "UNREGISTERED"
3943
4044 let userReset = "RESET"
41-
42-let onSale = "ON_SALE"
43-
44-let sold = "SOLD"
45-
46-let canceled = "CANCELED"
4745
4846 func getStringByKey (key) = match getString(this, key) {
4947 case a: String =>
6967 }
7068
7169
72-func checkSignCertificate (signID,Owner,sha256Hash) = match getString(signVerifier, ((("data_fc_" + signID) + "_") + Owner)) {
70+func checkSignCertificate (signID,Owner,sha256Hash) = match getString(signDapp, ((("data_fc_" + signID) + "_") + Owner)) {
7371 case a: String =>
7472 if (contains(a, sha256Hash))
7573 then true
8987 func validateHash (hash) = (65 > size(hash))
9088
9189
92-func keyUserAddr (callerAddr) = ("user_" + callerAddr)
90+func keyUserAddr (caller) = ("user_" + caller)
9391
9492
95-func keyUserName (callerAddr) = ("user_name_" + callerAddr)
93+func keyUserName (caller) = ("user_name_" + caller)
9694
9795
98-func keyUserDesc (callerAddr) = ("user_desc_" + callerAddr)
96+func keyUserDesc (caller) = ("user_desc_" + caller)
9997
10098
101-func keyUserSocial (callerAddr) = ("user_social_" + callerAddr)
99+func keyUserSocial (caller) = ("user_social_" + caller)
102100
103101
104-func keyUserThumb (callerAddr) = ("user_thumb_" + callerAddr)
102+func keyUserThumb (caller) = ("user_thumb_" + caller)
105103
106104
107-func keyUserStatus (callerAddr) = ("user_status_" + callerAddr)
105+func keyUserStatus (caller) = ("user_status_" + caller)
108106
109107
110-func keyUserDate (callerAddr) = ("user_date_" + callerAddr)
108+func keyUserDate (caller) = ("user_date_" + caller)
111109
112110
113-func keyArtDate (callerAddr,artId) = ((("art_date_" + artId) + "_") + callerAddr)
111+func keyArtDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
114112
115113
116-func keyArtName (callerAddr,artId) = ((("art_name_" + artId) + "_") + callerAddr)
114+func keyArtName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
117115
118116
119-func keyArtDesc (callerAddr,artId) = ((("art_desc_" + artId) + "_") + callerAddr)
117+func keyArtDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
120118
121119
122-func keyArtDisplayCid (callerAddr,artId) = ((("art_display_cid_" + artId) + "_") + callerAddr)
120+func keyArtDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
123121
124122
125-func keyArtExportHash (callerAddr,artId) = ((("art_export_hash_" + artId) + "_") + callerAddr)
123+func keyArtExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
126124
127125
128-func keyArtExportCid (callerAddr,artId) = ((("art_export_cid_" + artId) + "_") + callerAddr)
126+func keyArtExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
129127
130128
131-func keyArtMaxMint (callerAddr,artId) = ((("art_maxmint_" + artId) + "_") + callerAddr)
129+func keyArtMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
132130
133131
134-func keyArtSignID (callerAddr,artId) = ((("art_signid_" + artId) + "_") + callerAddr)
132+func keyArtSignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
135133
136134
137-func keyArtIssued (callerAddr,artId) = ((("art_issued_" + artId) + "_") + callerAddr)
135+func keyArtIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
138136
139137
140-func keyArtOnSale (callerAddr,artId) = ((("art_onsale_" + artId) + "_") + callerAddr)
138+func keyArtOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
141139
142140
143-func keyArtLicenceHash (callerAddr,artId) = ((("art_licence_hash_" + artId) + "_") + callerAddr)
141+func keyArtLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
144142
145143
146-func keyArtLicenceCid (callerAddr,artId) = ((("art_licence_cid_" + artId) + "_") + callerAddr)
144+func keyArtLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
147145
148146
149-func keyArtTags (callerAddr,artId) = ((("art_tags_" + artId) + "_") + callerAddr)
147+func keyArtTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
150148
151149
152-func keyArtType (callerAddr,artId) = ((("art_type_" + artId) + "_") + callerAddr)
150+func keyArtType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
153151
154152
155-func keyArtPrice (callerAddr,artId) = ((("art_price_" + artId) + "_") + callerAddr)
153+func keyArtPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
156154
157155
158-func keyArtAssetIdAccepted (callerAddr,artId) = ((("art_assetAccepted_" + artId) + "_") + callerAddr)
156+func keyArtAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
159157
160158
161-func keyArtHashByTxidAddr (callerAddr,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + callerAddr)
159+func keyArtHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
162160
163161
164162 func keyArtOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
165163
166164
167-func keyArtArtidBySignid (callerAddr,signId) = ((("get_artidbysignid_" + signId) + "_") + callerAddr)
165+func keyArtArtidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
168166
169167
170-func keyArtTxidByHashOwner (sha256Hash,callerAddr) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + callerAddr)))))
168+func keyArtTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
171169
172170
173171 func validateAllCID (cidDisplay,cidExport,cidLicence) = if (if ((cidDisplay != ""))
174172 then !(validateCID(cidDisplay))
175173 else false)
176- then throw("Wrong Display CID length")
174+ then throw("Wrong Display CID")
177175 else if (if ((cidExport != ""))
178176 then !(validateCID(cidExport))
179177 else false)
180- then throw("Wrong Export CID length")
178+ then throw("Wrong Export CID")
181179 else if (if ((cidLicence != ""))
182180 then !(validateCID(cidLicence))
183181 else false)
184- then throw("Wrong Licence CID length")
182+ then throw("Wrong Licence CID")
185183 else true
186184
187185
188186 func validateAllHash (sha256Export,sha256Licence) = if (if ((sha256Export != ""))
189187 then !(validateHash(sha256Export))
190188 else false)
191- then throw("Export Hash should be 64 characters maximum")
189+ then throw("Export Hash 64 char. max")
192190 else if (if ((sha256Licence != ""))
193191 then !(validateHash(sha256Licence))
194192 else false)
195- then throw("Licence Hash should be 64 characters maximum")
193+ then throw("Licence Hash 64 char. max")
196194 else true
197195
198196
204202
205203
206204 @Callable(i)
207-func registerUser (name,description,thumb,social) = {
208- let callerAddr = toString(addressFromPublicKey(i.callerPublicKey))
209- let userCanRegister = getStringByKey(keyUserStatus(callerAddr))
210- let id = toBase58String(i.transactionId)
211- let timestamp = lastBlock.timestamp
212- if (if ((userCanRegister == userSuspended))
213- then true
214- else (userCanRegister == userRemoved))
215- then throw("You are now allowed to register, your account have been suspended/ removed.")
216- else if ((userCanRegister == userRegistered))
217- then throw("You are already registered, please use update method instead.")
218- else if (if ((userCanRegister == ""))
219- then WHITELISTEDONLY
220- else false)
221- then throw("You are now allowed to register yet, please contact us first to get approved.")
222- else if (if ((name == ""))
223- then true
224- else (description == ""))
225- then throw("Name and description cannot be empty")
226- else if ((size(description) > 600))
227- then throw("600 Characters maximum for the description")
228- else [IntegerEntry(keyUserDate(callerAddr), timestamp), StringEntry(keyUserAddr(callerAddr), ((id + "_") + toString(lastBlock.timestamp))), StringEntry(keyUserName(callerAddr), name), StringEntry(keyUserDesc(callerAddr), description), StringEntry(keyUserSocial(callerAddr), social), StringEntry(keyUserThumb(callerAddr), thumb), StringEntry(keyUserStatus(callerAddr), userRegistered), StringEntry("last_invoke_id", id)]
229- }
205+func registerUser (name,description,thumb,social) = if (!(dappRunning))
206+ then throw(maintenanceMSG)
207+ else {
208+ let caller = toString(addressFromPublicKey(i.callerPublicKey))
209+ let canRegister = getStringByKey(keyUserStatus(caller))
210+ let id = toBase58String(i.transactionId)
211+ let timestamp = lastBlock.timestamp
212+ if (if ((canRegister == userSuspended))
213+ then true
214+ else (canRegister == userRemoved))
215+ then throw("Account suspended/ removed.")
216+ else if ((canRegister == userRegistered))
217+ then throw("Already registered")
218+ else if (if ((canRegister == ""))
219+ then WHITELISTEDONLY
220+ else false)
221+ then throw("Can't register, get approved first.")
222+ else if (if ((name == ""))
223+ then true
224+ else (description == ""))
225+ then throw("Name and description cannot be empty")
226+ else if ((size(description) > 600))
227+ then throw("600 Char. max description")
228+ else [IntegerEntry(keyUserDate(caller), timestamp), StringEntry(keyUserAddr(caller), ((id + "_") + toString(lastBlock.timestamp))), StringEntry(keyUserName(caller), name), StringEntry(keyUserDesc(caller), description), StringEntry(keyUserSocial(caller), social), StringEntry(keyUserThumb(caller), thumb), StringEntry(keyUserStatus(caller), userRegistered), StringEntry("last_invoke_id", id)]
229+ }
230230
231231
232232
233233 @Callable(i)
234234 func deleteEntry (entry) = {
235- let callerAddr = toString(addressFromPublicKey(i.callerPublicKey))
236- if ((callerAddr == admin))
235+ let caller = toString(addressFromPublicKey(i.callerPublicKey))
236+ if ((caller == admin))
237237 then [DeleteEntry(entry)]
238238 else throw("no")
239239 }
241241
242242
243243 @Callable(i)
244-func updateUser (name,description,thumb,social) = {
245- let callerAddr = toString(addressFromPublicKey(i.callerPublicKey))
246- let userCanRegister = getStringByKey(keyUserStatus(callerAddr))
247- if (if ((userCanRegister == userSuspended))
248- then true
249- else (userCanRegister == userRemoved))
250- then throw("You are now allowed to register, your account have been suspended/ removed.")
251- else if (if ((userCanRegister == ""))
244+func updateUser (name,description,thumb,social) = if (!(dappRunning))
245+ then throw(maintenanceMSG)
246+ else {
247+ let id = toBase58String(i.transactionId)
248+ let caller = toString(addressFromPublicKey(i.callerPublicKey))
249+ let canUpdate = getStringByKey(keyUserStatus(caller))
250+ if (if ((canUpdate == userSuspended))
252251 then true
253- else (userCanRegister == userAllowed))
254- then throw("Please register first with registerUser")
255- else {
256- let id = toBase58String(i.transactionId)
257- let timestamp = lastBlock.timestamp
258- if (if ((name == ""))
252+ else (canUpdate == userRemoved))
253+ then throw("Account suspended/ removed.")
254+ else if (if ((canUpdate == ""))
255+ then true
256+ else (canUpdate == userAllowed))
257+ then throw("Register first")
258+ else if (if ((name == ""))
259259 then true
260260 else (description == ""))
261- then throw("Name and description cannot be empty")
261+ then throw("Name & description cannot be empty")
262262 else if ((size(description) > 600))
263- then throw("600 Characters maximum for the description")
264- else [StringEntry(keyUserName(callerAddr), name), StringEntry(keyUserDesc(callerAddr), description), StringEntry(keyUserSocial(callerAddr), social), StringEntry(keyUserThumb(callerAddr), thumb), StringEntry("last_invoke_id", id)]
265- }
266- }
263+ then throw("600 Char. max for description")
264+ else [StringEntry(keyUserName(caller), name), StringEntry(keyUserDesc(caller), description), StringEntry(keyUserSocial(caller), social), StringEntry(keyUserThumb(caller), thumb), StringEntry("last_invoke_id", id)]
265+ }
267266
268267
269268
270269 @Callable(i)
271-func changeUserStatus (address,status) = {
272- let callerAddr = toString(addressFromPublicKey(i.callerPublicKey))
273- let id = toBase58String(i.transactionId)
274- let currentStatus = getStringByKey(keyUserStatus(address))
275- let statusToSet = if ((status == userVerified))
276- then userVerified
277- else if ((status == userRegistered))
278- then userRegistered
279- else if ((status == userSuspended))
280- then userSuspended
281- else if ((status == userRemoved))
282- then userRemoved
283- else if ((status == userAllowed))
284- then userAllowed
285- else if (if ((status == userReset))
286- then (currentStatus == userAllowed)
287- else false)
288- then ""
289- else throw("Unknown status")
290- if (if ((currentStatus == userAllowed))
291- then (status == userAllowed)
292- else false)
293- then throw("This user is already allowed")
294- else if (if ((currentStatus == userRegistered))
270+func changeUserStatus (address,status) = if (!(dappRunning))
271+ then throw(maintenanceMSG)
272+ else {
273+ let caller = toString(addressFromPublicKey(i.callerPublicKey))
274+ let id = toBase58String(i.transactionId)
275+ let currentStatus = getStringByKey(keyUserStatus(address))
276+ let statusToSet = if ((status == userVerified))
277+ then userVerified
278+ else if ((status == userRegistered))
279+ then userRegistered
280+ else if ((status == userSuspended))
281+ then userSuspended
282+ else if ((status == userRemoved))
283+ then userRemoved
284+ else if ((status == userAllowed))
285+ then userAllowed
286+ else if (if ((status == userReset))
287+ then (currentStatus == userAllowed)
288+ else false)
289+ then ""
290+ else throw("Unknown status")
291+ if (if ((currentStatus == userAllowed))
295292 then (status == userAllowed)
296293 else false)
297- then throw("This user is already allowed and registered")
298- else if (if ((currentStatus == userVerified))
294+ then throw("User already allowed")
295+ else if (if ((currentStatus == userRegistered))
299296 then (status == userAllowed)
300297 else false)
301- then throw("This user is already allowed and verified")
302- else if (if ((callerAddr == admin))
303- then true
304- else (callerAddr == admin2))
305- then [StringEntry(keyUserStatus(address), statusToSet), StringEntry("last_invoke_id", id)]
306- else throw(((("You are not allowed to change user status " + callerAddr) + " / ") + admin))
307- }
298+ then throw("User already allowed & registered")
299+ else if (if ((currentStatus == userVerified))
300+ then (status == userAllowed)
301+ else false)
302+ then throw("User already allowed & verified")
303+ else if (if ((caller == admin))
304+ then true
305+ else (caller == admin2))
306+ then [StringEntry(keyUserStatus(address), statusToSet), StringEntry("last_invoke_id", id)]
307+ else throw(((("Not allowed to change user status " + caller) + " / ") + admin))
308+ }
308309
309310
310311
311312 @Callable(i)
312313 func creditUser (address) = {
313- let callerAddr = toString(addressFromPublicKey(i.callerPublicKey))
314+ let caller = toString(addressFromPublicKey(i.callerPublicKey))
314315 let id = toBase58String(i.transactionId)
315- if (if ((callerAddr == admin))
316+ if (if ((caller == admin))
316317 then true
317- else (callerAddr == admin2))
318+ else (caller == admin2))
318319 then [ScriptTransfer(Address(fromBase58String(address)), 150000000000, signAssetId)]
319- else throw("You are not allowed to do that")
320+ else throw("Not allowed")
320321 }
321322
322323
323324
324325 @Callable(invoke)
325-func addArtwork (sha256Hash,signID,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = {
326- let artId = toBase58String(invoke.transactionId)
327- let callerAddress = toBase58String(invoke.caller.bytes)
328- if (!(validateAllCID(cidDisplay, cidExport, cidLicence)))
329- then throw("Problem with CID")
330- else if (!(validateHash(sha256Hash)))
331- then throw("Hash should be 64 characters maximum")
332- else if (!(validateAllHash(sha256Export, sha256Licence)))
333- then throw("Problem with Hashes")
334- else if ((size(invoke.payments) == 0))
335- then throw("No payment attached")
336- else {
337- let payment = value(invoke.payments[0])
338- let amount = value(payment.amount)
339- let assetId = if (if (isDefined(payment.assetId))
340- then (payment.assetId == signAssetId)
341- else false)
342- then payment.assetId
343- else throw("Only SIGN token accepted at the moment")
344- let currentCertificationPrice = match getInteger(storageVerifier, ("certification_fee_" + toBase58String(signAssetId))) {
345- case price: Int =>
346- price
347- case _ =>
348- throw("Price undefined in oracle")
349- }
350- if ((amount != currentCertificationPrice))
351- then throw(("Payment amount should be " + toString(currentCertificationPrice)))
352- else {
353- let entryExist = getStringByKey(keyArtTxidByHashOwner(sha256Hash, callerAddress))
354- if ((entryExist != ""))
355- then throw("You already added it on Sign Art")
356- else {
357- let hashExist = getStringByKey(keyArtOwnerByHash(sha256Hash))
358- if ((hashExist != ""))
359- then throw("Hash already registered on Sign Art")
360- else {
361- let isSignCertified = checkSignCertificate(signID, callerAddress, sha256Hash)
362- if (!(isSignCertified))
363- then throw("Sign Certificate not found for this address.")
364- else if ((size(cidDisplay) == 0))
365- then throw("Display CID cannot be empty")
366- else if (!(validateString(name, 100)))
367- then throw("100 Char. max for the name")
368- else if (!(validateString(description, 1000)))
369- then throw("1000 Char. max for the description")
370- else if ((size(split(tags, ",")) > 5))
371- then throw("5 tags max.")
372- else {
373- let userIsRegistered = match getString(this, ("user_status_" + callerAddress)) {
374- case s: String =>
375- s
376- case _ =>
377- userUnregistered
378- }
379- let timestamp = lastBlock.timestamp
380- if (if (isDefined(userIsRegistered))
381- then (userIsRegistered == userUnregistered)
382- else false)
383- then throw("Register this account first with \"User infos\" tab")
384- else if ((userIsRegistered == userSuspended))
385- then throw("Account suspended")
386- else if ((userIsRegistered == userRemoved))
387- then throw("Account removed")
388- else if ((maxmint > 10))
389- then throw("10 editions max per artwork")
390- else if ((size(sha256Hash) != 64))
391- then throw("Hash should be 64 char.")
392- else [StringEntry(keyArtOwnerByHash(sha256Hash), callerAddress), StringEntry(keyArtTxidByHashOwner(sha256Hash, callerAddress), artId), IntegerEntry(keyArtDate(callerAddress, artId), timestamp), StringEntry(keyArtName(callerAddress, artId), name), StringEntry(keyArtDesc(callerAddress, artId), description), StringEntry(keyArtDisplayCid(callerAddress, artId), cidDisplay), StringEntry(keyArtExportCid(callerAddress, artId), cidExport), StringEntry(keyArtExportHash(callerAddress, artId), sha256Export), StringEntry(keyArtLicenceHash(callerAddress, artId), sha256Licence), StringEntry(keyArtLicenceCid(callerAddress, artId), cidLicence), StringEntry(keyArtType(callerAddress, artId), type), StringEntry(keyArtTags(callerAddress, artId), tags), IntegerEntry(keyArtMaxMint(callerAddress, artId), maxmint), StringEntry(keyArtSignID(callerAddress, artId), signID), IntegerEntry(keyArtIssued(callerAddress, artId), 0), BooleanEntry(keyArtOnSale(callerAddress, artId), false), StringEntry(keyArtArtidBySignid(callerAddress, signID), artId), StringEntry("last_invoke_id", artId), StringEntry(keyArtHashByTxidAddr(callerAddress, artId), sha256Hash), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, assetId)]
393- }
394- }
395- }
396- }
397- }
398- }
326+func addArtwork (sha256Hash,signID,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = if (!(dappRunning))
327+ then throw(maintenanceMSG)
328+ else {
329+ let artId = toBase58String(invoke.transactionId)
330+ let caller = toBase58String(invoke.caller.bytes)
331+ if (!(validateAllCID(cidDisplay, cidExport, cidLicence)))
332+ then throw("Problem with CID")
333+ else if (!(validateHash(sha256Hash)))
334+ then throw("Hash should be 64 characters maximum")
335+ else if (!(validateAllHash(sha256Export, sha256Licence)))
336+ then throw("Problem with Hashes")
337+ else if ((size(invoke.payments) == 0))
338+ then throw("No payment attached")
339+ else {
340+ let payment = value(invoke.payments[0])
341+ let amount = value(payment.amount)
342+ let assetId = if (if (isDefined(payment.assetId))
343+ then (payment.assetId == signAssetId)
344+ else false)
345+ then payment.assetId
346+ else throw("Only SIGN token accepted at the moment")
347+ let currentCertificationPrice = match getInteger(oracleFee, ("certification_fee_" + toBase58String(signAssetId))) {
348+ case price: Int =>
349+ price
350+ case _ =>
351+ throw("Price undefined in oracle")
352+ }
353+ if ((amount != currentCertificationPrice))
354+ then throw(("Payment amount should be " + toString(currentCertificationPrice)))
355+ else {
356+ let entryExist = getStringByKey(keyArtTxidByHashOwner(sha256Hash, caller))
357+ if ((entryExist != ""))
358+ then throw("You already added it")
359+ else {
360+ let hashExist = getStringByKey(keyArtOwnerByHash(sha256Hash))
361+ if ((hashExist != ""))
362+ then throw("Hash already registered")
363+ else {
364+ let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
365+ if (!(isSignCertified))
366+ then throw("Sign Certificate not found for this address.")
367+ else if ((size(cidDisplay) == 0))
368+ then throw("Display CID cannot be empty")
369+ else if (!(validateString(name, 100)))
370+ then throw("100 Char. max name")
371+ else if (!(validateString(description, 1000)))
372+ then throw("1000 Char. max description")
373+ else if ((size(split(tags, ",")) > 5))
374+ then throw("5 tags max.")
375+ else {
376+ let userIsRegistered = match getString(this, ("user_status_" + caller)) {
377+ case s: String =>
378+ s
379+ case _ =>
380+ userUnregistered
381+ }
382+ let timestamp = lastBlock.timestamp
383+ if (if (isDefined(userIsRegistered))
384+ then (userIsRegistered == userUnregistered)
385+ else false)
386+ then throw("Register this account first with \"User infos\" tab")
387+ else if ((userIsRegistered == userSuspended))
388+ then throw("Account suspended")
389+ else if ((userIsRegistered == userRemoved))
390+ then throw("Account removed")
391+ else if ((maxmint > 10))
392+ then throw("10 editions max")
393+ else if ((size(sha256Hash) != 64))
394+ then throw("Hash 64 char. max")
395+ else [StringEntry(keyArtOwnerByHash(sha256Hash), caller), StringEntry(keyArtTxidByHashOwner(sha256Hash, caller), artId), IntegerEntry(keyArtDate(caller, artId), timestamp), StringEntry(keyArtName(caller, artId), name), StringEntry(keyArtDesc(caller, artId), description), StringEntry(keyArtDisplayCid(caller, artId), cidDisplay), StringEntry(keyArtExportCid(caller, artId), cidExport), StringEntry(keyArtExportHash(caller, artId), sha256Export), StringEntry(keyArtLicenceHash(caller, artId), sha256Licence), StringEntry(keyArtLicenceCid(caller, artId), cidLicence), StringEntry(keyArtType(caller, artId), type), StringEntry(keyArtTags(caller, artId), tags), IntegerEntry(keyArtMaxMint(caller, artId), maxmint), StringEntry(keyArtSignID(caller, artId), signID), IntegerEntry(keyArtIssued(caller, artId), 0), BooleanEntry(keyArtOnSale(caller, artId), false), StringEntry(keyArtArtidBySignid(caller, signID), artId), StringEntry("last_invoke_id", artId), StringEntry(keyArtHashByTxidAddr(caller, artId), sha256Hash), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, assetId)]
396+ }
397+ }
398+ }
399+ }
400+ }
401+ }
399402
400403
401404
402405 @Callable(invoke)
403-func updateArtwork (txid,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = {
404- let updateId = toBase58String(invoke.transactionId)
405- let callerAddress = toBase58String(invoke.caller.bytes)
406- if (!(validateAllCID(cidDisplay, cidExport, cidLicence)))
407- then throw("Problem with CID")
408- else if (!(validateAllHash(sha256Export, sha256Licence)))
409- then throw("Problem with Hashes")
410- else {
411- let entryExist = getStringByKey(keyArtName(callerAddress, txid))
412- if ((entryExist == ""))
413- then throw("Entry not found")
414- else if (!(validateString(name, 100)))
415- then throw("100 Char. max for the name")
416- else if (!(validateString(description, 1000)))
417- then throw("1000 Char. max for the description")
418- else {
419- let artworkMinted = match getInteger(this, keyArtIssued(callerAddress, txid)) {
420- case b: Int =>
421- if ((b == 0))
422- then false
423- else true
424- case _ =>
425- false
426- }
427- if ((size(split(tags, ",")) > 5))
428- then throw("5 tags max.")
429- else {
430- let userIsRegistered = match getString(this, ("user_status_" + callerAddress)) {
431- case s: String =>
432- s
433- case _ =>
434- userUnregistered
435- }
436- if (if (isDefined(userIsRegistered))
437- then (userIsRegistered == userUnregistered)
438- else false)
439- then throw("Register this account first with \"User infos\" tab")
440- else if ((userIsRegistered == userSuspended))
441- then throw("Account suspended")
442- else if ((userIsRegistered == userRemoved))
443- then throw("Account removed")
444- else if ((maxmint > 10))
445- then throw("M10 editions max per artwork")
446- else if (!(artworkMinted))
447- then [StringEntry(keyArtName(callerAddress, txid), name), StringEntry(keyArtDesc(callerAddress, txid), description), StringEntry(keyArtDisplayCid(callerAddress, txid), cidDisplay), StringEntry(keyArtExportCid(callerAddress, txid), cidExport), StringEntry(keyArtExportHash(callerAddress, txid), sha256Export), StringEntry(keyArtLicenceCid(callerAddress, txid), cidLicence), StringEntry(keyArtLicenceHash(callerAddress, txid), sha256Licence), IntegerEntry(keyArtMaxMint(callerAddress, txid), maxmint), StringEntry(keyArtTags(callerAddress, txid), tags), StringEntry(keyArtType(callerAddress, txid), type), StringEntry("last_invoke_id", updateId)]
448- else throw("Artwork already minted")
449- }
450- }
451- }
452- }
406+func updateArtwork (txid,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = if (!(dappRunning))
407+ then throw(maintenanceMSG)
408+ else {
409+ let updateId = toBase58String(invoke.transactionId)
410+ let caller = toBase58String(invoke.caller.bytes)
411+ if (!(validateAllCID(cidDisplay, cidExport, cidLicence)))
412+ then throw("Problem with CID")
413+ else if (!(validateAllHash(sha256Export, sha256Licence)))
414+ then throw("Problem with Hashes")
415+ else {
416+ let entryExist = getStringByKey(keyArtName(caller, txid))
417+ if ((entryExist == ""))
418+ then throw("Entry not found")
419+ else if (!(validateString(name, 100)))
420+ then throw("100 Char. max name")
421+ else if (!(validateString(description, 1000)))
422+ then throw("1000 Char. max description")
423+ else {
424+ let artworkMinted = match getInteger(this, keyArtIssued(caller, txid)) {
425+ case b: Int =>
426+ if ((b == 0))
427+ then false
428+ else true
429+ case _ =>
430+ false
431+ }
432+ if ((size(split(tags, ",")) > 5))
433+ then throw("5 tags max.")
434+ else {
435+ let userIsRegistered = match getString(this, ("user_status_" + caller)) {
436+ case s: String =>
437+ s
438+ case _ =>
439+ userUnregistered
440+ }
441+ if (if (isDefined(userIsRegistered))
442+ then (userIsRegistered == userUnregistered)
443+ else false)
444+ then throw("Register first with \"User infos\"")
445+ else if ((userIsRegistered == userSuspended))
446+ then throw("Account suspended")
447+ else if ((userIsRegistered == userRemoved))
448+ then throw("Account removed")
449+ else if ((maxmint > 10))
450+ then throw("10 editions max per artwork")
451+ else if (!(artworkMinted))
452+ then [StringEntry(keyArtName(caller, txid), name), StringEntry(keyArtDesc(caller, txid), description), StringEntry(keyArtDisplayCid(caller, txid), cidDisplay), StringEntry(keyArtExportCid(caller, txid), cidExport), StringEntry(keyArtExportHash(caller, txid), sha256Export), StringEntry(keyArtLicenceCid(caller, txid), cidLicence), StringEntry(keyArtLicenceHash(caller, txid), sha256Licence), IntegerEntry(keyArtMaxMint(caller, txid), maxmint), StringEntry(keyArtTags(caller, txid), tags), StringEntry(keyArtType(caller, txid), type), StringEntry("last_invoke_id", updateId)]
453+ else throw("Already minted")
454+ }
455+ }
456+ }
457+ }
453458
454459
455460
456461 @Callable(i)
457462 func deleteArtwork (artId,address) = {
458- let callerAddress = toString(addressFromPublicKey(i.callerPublicKey))
463+ let caller = toString(addressFromPublicKey(i.callerPublicKey))
459464 let id = toBase58String(i.transactionId)
460- let addressToUse = if (if ((callerAddress == admin))
465+ let addressToUse = if (if ((caller == admin))
461466 then true
462- else (callerAddress == admin2))
467+ else (caller == admin2))
463468 then address
464- else callerAddress
469+ else caller
465470 let entryExist = match getString(this, keyArtName(addressToUse, artId)) {
466471 case s: String =>
467472 s
468473 case _ =>
469- throw("No artwork matching")
474+ throw("No art matching")
470475 }
471476 let artworkMinted = match getInteger(this, keyArtIssued(addressToUse, artId)) {
472477 case b: Int =>
481486 case s: String =>
482487 s
483488 case _ =>
484- throw("No artwork hash matching")
489+ throw("No art hash matching")
485490 }
486491 let signID = match getString(this, keyArtSignID(addressToUse, artId)) {
487492 case s: String =>
490495 throw("No SIGN ID matching")
491496 }
492497 let dataToDelete = [DeleteEntry(keyArtDate(addressToUse, artId)), DeleteEntry(keyArtName(addressToUse, artId)), DeleteEntry(keyArtDesc(addressToUse, artId)), DeleteEntry(keyArtDisplayCid(addressToUse, artId)), DeleteEntry(keyArtExportCid(addressToUse, artId)), DeleteEntry(keyArtExportHash(addressToUse, artId)), DeleteEntry(keyArtLicenceHash(addressToUse, artId)), DeleteEntry(keyArtLicenceCid(addressToUse, artId)), DeleteEntry(keyArtType(addressToUse, artId)), DeleteEntry(keyArtTags(addressToUse, artId)), DeleteEntry(keyArtMaxMint(addressToUse, artId)), DeleteEntry(keyArtSignID(addressToUse, artId)), DeleteEntry(keyArtIssued(addressToUse, artId)), DeleteEntry(keyArtOnSale(addressToUse, artId)), StringEntry("last_invoke_id", id), DeleteEntry(keyArtOwnerByHash(sha256Hash)), DeleteEntry(keyArtArtidBySignid(addressToUse, signID)), DeleteEntry(keyArtTxidByHashOwner(sha256Hash, addressToUse)), DeleteEntry(keyArtPrice(addressToUse, artId)), DeleteEntry(keyArtMaxMint(addressToUse, artId)), DeleteEntry(keyArtAssetIdAccepted(addressToUse, artId)), DeleteEntry(((((("art_sold_1_of_" + toString(maxMint)) + "_") + artId) + "_") + addressToUse)), DeleteEntry(((((("art_sold_2_of_" + toString(maxMint)) + "_") + artId) + "_") + addressToUse)), DeleteEntry(((((("art_sold_3_of_" + toString(maxMint)) + "_") + artId) + "_") + addressToUse)), DeleteEntry(((((("art_sold_4_of_" + toString(maxMint)) + "_") + artId) + "_") + addressToUse)), DeleteEntry(((((("art_sold_5_of_" + toString(maxMint)) + "_") + artId) + "_") + addressToUse)), DeleteEntry(((((("art_sold_6_of_" + toString(maxMint)) + "_") + artId) + "_") + addressToUse)), DeleteEntry(((((("art_sold_7_of_" + toString(maxMint)) + "_") + artId) + "_") + addressToUse)), DeleteEntry(((((("art_sold_8_of_" + toString(maxMint)) + "_") + artId) + "_") + addressToUse)), DeleteEntry(((((("art_sold_9_of_" + toString(maxMint)) + "_") + artId) + "_") + addressToUse)), DeleteEntry(((((("art_sold_10_of_" + toString(maxMint)) + "_") + artId) + "_") + addressToUse))]
493- if (if ((callerAddress == admin))
498+ if (if ((caller == admin))
494499 then true
495- else (callerAddress == admin2))
496- then dataToDelete
500+ else (caller == admin2))
501+ then (dataToDelete ++ [StringEntry(((("ban_" + artId) + "_") + addressToUse), caller)])
497502 else if (!(artworkMinted))
498- then dataToDelete
499- else throw("Artwork already minted, you cannot delete it")
503+ then if (!(dappRunning))
504+ then throw(maintenanceMSG)
505+ else dataToDelete
506+ else throw("Art already minted, cannot delete")
500507 }
501508
502509
503510
504511 @Callable(invoke)
505-func sellArtwork (artId,price,maxMint,assetId) = {
506- let id = toBase58String(invoke.transactionId)
507- let callerAddress = toBase58String(invoke.caller.bytes)
508- let sellDate = lastBlock.timestamp
509- let exportCID = getStringByKey(keyArtExportCid(callerAddress, artId))
510- if ((size(split(exportCID, "/")[0]) != 59))
511- then throw("You cannot sell artwork with no export file")
512- else {
513- let exportHash = getStringByKey(keyArtExportHash(callerAddress, artId))
514- if ((size(exportHash) != 64))
515- then throw("You cannot sell artwork with no export hash")
516- else if (if (if ((assetId != toBase58String(signAssetId)))
517- then (assetId != toBase58String(wavesAssetId))
518- else false)
519- then (assetId != toBase58String(usdnAssetId))
520- else false)
521- then throw("Only SIGN, USDN or WAVES accepted")
522- else {
523- let artworkName = match getString(this, keyArtName(callerAddress, artId)) {
524- case s: String =>
525- s
526- case _ =>
527- throw("This artwork doesn't match")
528- }
529- let userIsRegistered = match getString(this, keyUserStatus(callerAddress)) {
530- case s: String =>
531- s
532- case _ =>
533- throw("Register this account first")
534- }
535- let amountSold = getIntegerByKey(keyArtIssued(callerAddress, artId))
536- let maxCanSell = getIntegerByKey(keyArtMaxMint(callerAddress, artId))
537- if (if ((amountSold != 0))
538- then (amountSold == maxCanSell)
539- else false)
540- then throw("Max edition reached.")
541- else if (if ((amountSold > 0))
542- then (maxCanSell != maxMint)
512+func sellArtwork (artId,price,maxMint,assetId) = if (!(dappRunning))
513+ then throw(maintenanceMSG)
514+ else {
515+ let id = toBase58String(invoke.transactionId)
516+ let caller = toBase58String(invoke.caller.bytes)
517+ let sellDate = lastBlock.timestamp
518+ let exportCID = getStringByKey(keyArtExportCid(caller, artId))
519+ if ((size(split(exportCID, "/")[0]) != 59))
520+ then throw("You cannot sell art with no export file")
521+ else {
522+ let exportHash = getStringByKey(keyArtExportHash(caller, artId))
523+ if ((size(exportHash) != 64))
524+ then throw("You cannot sell art with no export hash")
525+ else if (if (if ((assetId != toBase58String(signAssetId)))
526+ then (assetId != toBase58String(wavesAssetId))
527+ else false)
528+ then (assetId != toBase58String(usdnAssetId))
529+ else false)
530+ then throw("Only SIGN, USDN or WAVES accepted")
531+ else {
532+ let artworkName = match getString(this, keyArtName(caller, artId)) {
533+ case s: String =>
534+ s
535+ case _ =>
536+ throw("This art doesn't match")
537+ }
538+ let userIsRegistered = match getString(this, keyUserStatus(caller)) {
539+ case s: String =>
540+ s
541+ case _ =>
542+ throw("Register this account first")
543+ }
544+ let amountSold = getIntegerByKey(keyArtIssued(caller, artId))
545+ let maxCanSell = getIntegerByKey(keyArtMaxMint(caller, artId))
546+ if (if ((amountSold != 0))
547+ then (amountSold == maxCanSell)
543548 else false)
544- then throw("Cannot change maximum issuable anymore")
545- else if ((userIsRegistered == userSuspended))
546- then throw("Account suspended")
547- else if ((userIsRegistered == userRemoved))
548- then throw("Account deleted")
549- else {
550- let sellStatus = if ((price > 0))
551- then true
552- else false
553-[BooleanEntry(keyArtOnSale(callerAddress, artId), sellStatus), IntegerEntry(keyArtPrice(callerAddress, artId), price), IntegerEntry(keyArtMaxMint(callerAddress, artId), maxMint), StringEntry(keyArtAssetIdAccepted(callerAddress, artId), assetId), StringEntry("last_invoke_id", id)]
554- }
555- }
556- }
557- }
549+ then throw("Max edition reached.")
550+ else if (if ((amountSold > 0))
551+ then (maxCanSell != maxMint)
552+ else false)
553+ then throw("Cannot change maximum issuable anymore")
554+ else if ((userIsRegistered == userSuspended))
555+ then throw("Account suspended")
556+ else if ((userIsRegistered == userRemoved))
557+ then throw("Account deleted")
558+ else {
559+ let sellStatus = if ((price > 0))
560+ then true
561+ else false
562+[BooleanEntry(keyArtOnSale(caller, artId), sellStatus), IntegerEntry(keyArtPrice(caller, artId), price), IntegerEntry(keyArtMaxMint(caller, artId), maxMint), StringEntry(keyArtAssetIdAccepted(caller, artId), assetId), StringEntry("last_invoke_id", id)]
563+ }
564+ }
565+ }
566+ }
558567
559568
560569
561570 @Callable(invoke)
562-func buyArtwork (artId,issuer) = {
563- let id = toBase58String(invoke.transactionId)
564- let callerAddress = toBase58String(invoke.caller.bytes)
565- let totalNFT = getIntegerByKey("total_nft_issued")
566- let signID = getStringByKey(keyArtSignID(issuer, artId))
567- let artworkName = match getString(this, keyArtName(issuer, artId)) {
568- case s: String =>
569- s
570- case _ =>
571- throw("Artwork doesn't exit")
572- }
573- let displayCID = getStringByKey(keyArtDisplayCid(issuer, artId))
574- let exportCID = getStringByKey(keyArtExportCid(issuer, artId))
575- let exportHash = getStringByKey(keyArtExportHash(issuer, artId))
576- let licenceCID = getStringByKey(keyArtLicenceCid(issuer, artId))
577- let licenceHash = getStringByKey(keyArtLicenceHash(issuer, artId))
578- let description = take(getStringByKey(keyArtDesc(issuer, artId)), 50)
579- let amountSold = getIntegerByKey(keyArtIssued(issuer, artId))
580- let artworkPrice = getIntegerByKey(keyArtPrice(issuer, artId))
581- let isOnSale = getBooleanByKey(keyArtOnSale(issuer, artId))
582- let priceAssetId = getStringByKey(keyArtAssetIdAccepted(issuer, artId))
583- let sourceHash = getStringByKey(keyArtHashByTxidAddr(issuer, artId))
584- if ((artworkPrice == 0))
585- then throw("Artwork not for sell")
586- else if (!(isOnSale))
587- then throw("Artwork not for sale")
588- else {
589- let maxCanSell = getIntegerByKey(keyArtMaxMint(issuer, artId))
590- let payment = value(invoke.payments[0])
591- let amount = value(payment.amount)
592- let assetId = if (if (isDefined(payment.assetId))
593- then (payment.assetId == fromBase58String(priceAssetId))
594- else false)
595- then payment.assetId
596- else throw((("Only " + priceAssetId) + " token id accepted at the moment"))
597- let cut = if ((priceAssetId == toBase58String(signAssetId)))
598- then 8
599- else 10
600- let amountForSign = ((amount / 100) * cut)
601- let amountForCreator = (amount - amountForSign)
602- if ((amountSold == maxCanSell))
603- then throw("Artwork sold out")
604- else if ((artworkPrice != amount))
605- then throw("Payment don't match")
606- else {
607- let newAmountSold = (amountSold + 1)
608- let entryDate = lastBlock.timestamp
609- let issueMeta = (((((((((((((((((((((((((((("{\"version\": 1,
571+func buyArtwork (artId,issuer) = if (!(dappRunning))
572+ then throw(maintenanceMSG)
573+ else {
574+ let id = toBase58String(invoke.transactionId)
575+ let caller = toBase58String(invoke.caller.bytes)
576+ let totalNFT = getIntegerByKey("total_nft_issued")
577+ let signID = getStringByKey(keyArtSignID(issuer, artId))
578+ let artworkName = match getString(this, keyArtName(issuer, artId)) {
579+ case s: String =>
580+ s
581+ case _ =>
582+ throw("Art doesn't exist")
583+ }
584+ let displayCID = getStringByKey(keyArtDisplayCid(issuer, artId))
585+ let exportCID = getStringByKey(keyArtExportCid(issuer, artId))
586+ let exportHash = getStringByKey(keyArtExportHash(issuer, artId))
587+ let licenceCID = getStringByKey(keyArtLicenceCid(issuer, artId))
588+ let licenceHash = getStringByKey(keyArtLicenceHash(issuer, artId))
589+ let description = take(getStringByKey(keyArtDesc(issuer, artId)), 50)
590+ let amountSold = getIntegerByKey(keyArtIssued(issuer, artId))
591+ let artworkPrice = getIntegerByKey(keyArtPrice(issuer, artId))
592+ let isOnSale = getBooleanByKey(keyArtOnSale(issuer, artId))
593+ let priceAssetId = getStringByKey(keyArtAssetIdAccepted(issuer, artId))
594+ let sourceHash = getStringByKey(keyArtHashByTxidAddr(issuer, artId))
595+ if ((artworkPrice == 0))
596+ then throw("Art not for sell")
597+ else if (!(isOnSale))
598+ then throw("Art not for sale")
599+ else {
600+ let maxCanSell = getIntegerByKey(keyArtMaxMint(issuer, artId))
601+ let payment = value(invoke.payments[0])
602+ let amount = value(payment.amount)
603+ let assetId = if (if (isDefined(payment.assetId))
604+ then (payment.assetId == fromBase58String(priceAssetId))
605+ else false)
606+ then payment.assetId
607+ else throw((("Only " + priceAssetId) + " token id accepted at the moment"))
608+ let cut = if ((priceAssetId == toBase58String(signAssetId)))
609+ then 8
610+ else 10
611+ let amountForSign = ((amount / 100) * cut)
612+ let amountForCreator = (amount - amountForSign)
613+ if ((amountSold == maxCanSell))
614+ then throw("Art sold out")
615+ else if ((artworkPrice != amount))
616+ then throw("Payment don't match")
617+ else {
618+ let newAmountSold = (amountSold + 1)
619+ let entryDate = lastBlock.timestamp
620+ let issueMeta = (((((((((((((((((((((((((((("{\"version\": 1,
610621 \"creator\": \"" + issuer) + "\",
611622 \"artID\": \"") + artId) + "\",
612623 \"signID\": \"") + signID) + "\",
620631 \"export_hash\": \"") + exportHash) + "\",
621632 \"licence_cid\": \"") + licenceCID) + "\",
622633 \"licence_hash\": \"") + licenceHash) + "\"}")
623- let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
624- let idNFT = calculateAssetId(issueNFT)
625- let sellStatus = if ((newAmountSold == maxCanSell))
626- then false
627- else true
628-[IntegerEntry(keyArtIssued(issuer, artId), newAmountSold), StringEntry(((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer), ((((((((callerAddress + "_") + toString(entryDate)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId)), IntegerEntry("total_nft_issued", (totalNFT + 1)), BooleanEntry(keyArtOnSale(issuer, artId), sellStatus), StringEntry("last_invoke_id", id), issueNFT, ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId), ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId), ScriptTransfer(invoke.caller, 1, idNFT)]
629- }
630- }
631- }
634+ let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
635+ let idNFT = calculateAssetId(issueNFT)
636+ let sellStatus = if ((newAmountSold == maxCanSell))
637+ then false
638+ else true
639+[IntegerEntry(keyArtIssued(issuer, artId), newAmountSold), StringEntry(((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer), ((((((((caller + "_") + toString(entryDate)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId)), IntegerEntry("total_nft_issued", (totalNFT + 1)), BooleanEntry(keyArtOnSale(issuer, artId), sellStatus), StringEntry("last_invoke_id", id), issueNFT, ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId), ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId), ScriptTransfer(invoke.caller, 1, idNFT)]
640+ }
641+ }
642+ }
632643
633644
634645
635646 @Callable(i)
636647 func deleteUser (address) = {
637- let callerAddr = toString(addressFromPublicKey(i.callerPublicKey))
648+ let caller = toString(addressFromPublicKey(i.callerPublicKey))
638649 let id = toBase58String(i.transactionId)
639- if (if ((callerAddr == admin))
650+ if (if ((caller == admin))
640651 then true
641- else (callerAddr == admin2))
652+ else (caller == admin2))
642653 then [DeleteEntry(keyUserDate(address)), DeleteEntry(keyUserAddr(address)), DeleteEntry(keyUserName(address)), DeleteEntry(keyUserDesc(address)), DeleteEntry(keyUserSocial(address)), DeleteEntry(keyUserThumb(address)), StringEntry(keyUserStatus(address), userRemoved), StringEntry("last_invoke_id", id)]
643- else throw("You are not allowed")
654+ else throw("Not allowed")
644655 }
645656
646657
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let storageVerifier = value(addressFromString("3N2s5RtaHPBenCsx2ECcoFRbYHx3noZhXW1"))
4+let oracleFee = value(addressFromString("3N2s5RtaHPBenCsx2ECcoFRbYHx3noZhXW1"))
55
6-let signVerifier = value(addressFromString("3NC28hSivrmsTUXaYD1x6L362J4ZpUnoTdB"))
6+let signDapp = value(addressFromString("3NC28hSivrmsTUXaYD1x6L362J4ZpUnoTdB"))
77
88 let feeReceiver = "3N1E6tXddRoVaRfQ9dQ3vg5LaW2fsd8HKub"
99
1010 let signAssetId = base58'Gf9t8FA4H3ssoZPCwrg3KwUFCci8zuUFP9ssRsUY3s6a'
1111
1212 let usdnAssetId = base58'25FEqEjRkqK6yCkiT7Lz6SAYz7gUFCtxfCChnrVFD5AT'
1313
1414 let wavesAssetId = base58''
1515
1616 let signCut = 8
1717
1818 let usdnCut = 10
1919
2020 let wavesCut = 10
2121
2222 let admin = "3MsG6jPNCrVJUtYB7XJBxS7utWsXAf4n9Vp"
2323
2424 let admin2 = "3Mzm4VLwsN9uZwbTMzPj3XuxV6kEfAR8UDN"
2525
2626 let WHITELISTEDONLY = true
2727
28+let dappRunning = true
29+
30+let maintenanceMSG = "SIGN Art is under maintenance"
31+
2832 let userAllowed = "ALLOWED"
2933
3034 let userRegistered = "REGISTERED"
3135
3236 let userVerified = "VERIFIED"
3337
3438 let userSuspended = "SUSPENDED"
3539
3640 let userRemoved = "REMOVED"
3741
3842 let userUnregistered = "UNREGISTERED"
3943
4044 let userReset = "RESET"
41-
42-let onSale = "ON_SALE"
43-
44-let sold = "SOLD"
45-
46-let canceled = "CANCELED"
4745
4846 func getStringByKey (key) = match getString(this, key) {
4947 case a: String =>
5048 a
5149 case _ =>
5250 ""
5351 }
5452
5553
5654 func getIntegerByKey (key) = match getInteger(this, key) {
5755 case i: Int =>
5856 i
5957 case _ =>
6058 0
6159 }
6260
6361
6462 func getBooleanByKey (key) = match getBoolean(this, key) {
6563 case i: Boolean =>
6664 i
6765 case _ =>
6866 false
6967 }
7068
7169
72-func checkSignCertificate (signID,Owner,sha256Hash) = match getString(signVerifier, ((("data_fc_" + signID) + "_") + Owner)) {
70+func checkSignCertificate (signID,Owner,sha256Hash) = match getString(signDapp, ((("data_fc_" + signID) + "_") + Owner)) {
7371 case a: String =>
7472 if (contains(a, sha256Hash))
7573 then true
7674 else false
7775 case _ =>
7876 false
7977 }
8078
8179
8280 func validateCID (cid) = if (if ((75 > size(cid)))
8381 then (60 > size(split(cid, "/")[0]))
8482 else false)
8583 then (16 > size(split(cid, "/")[1]))
8684 else false
8785
8886
8987 func validateHash (hash) = (65 > size(hash))
9088
9189
92-func keyUserAddr (callerAddr) = ("user_" + callerAddr)
90+func keyUserAddr (caller) = ("user_" + caller)
9391
9492
95-func keyUserName (callerAddr) = ("user_name_" + callerAddr)
93+func keyUserName (caller) = ("user_name_" + caller)
9694
9795
98-func keyUserDesc (callerAddr) = ("user_desc_" + callerAddr)
96+func keyUserDesc (caller) = ("user_desc_" + caller)
9997
10098
101-func keyUserSocial (callerAddr) = ("user_social_" + callerAddr)
99+func keyUserSocial (caller) = ("user_social_" + caller)
102100
103101
104-func keyUserThumb (callerAddr) = ("user_thumb_" + callerAddr)
102+func keyUserThumb (caller) = ("user_thumb_" + caller)
105103
106104
107-func keyUserStatus (callerAddr) = ("user_status_" + callerAddr)
105+func keyUserStatus (caller) = ("user_status_" + caller)
108106
109107
110-func keyUserDate (callerAddr) = ("user_date_" + callerAddr)
108+func keyUserDate (caller) = ("user_date_" + caller)
111109
112110
113-func keyArtDate (callerAddr,artId) = ((("art_date_" + artId) + "_") + callerAddr)
111+func keyArtDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
114112
115113
116-func keyArtName (callerAddr,artId) = ((("art_name_" + artId) + "_") + callerAddr)
114+func keyArtName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
117115
118116
119-func keyArtDesc (callerAddr,artId) = ((("art_desc_" + artId) + "_") + callerAddr)
117+func keyArtDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
120118
121119
122-func keyArtDisplayCid (callerAddr,artId) = ((("art_display_cid_" + artId) + "_") + callerAddr)
120+func keyArtDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
123121
124122
125-func keyArtExportHash (callerAddr,artId) = ((("art_export_hash_" + artId) + "_") + callerAddr)
123+func keyArtExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
126124
127125
128-func keyArtExportCid (callerAddr,artId) = ((("art_export_cid_" + artId) + "_") + callerAddr)
126+func keyArtExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
129127
130128
131-func keyArtMaxMint (callerAddr,artId) = ((("art_maxmint_" + artId) + "_") + callerAddr)
129+func keyArtMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
132130
133131
134-func keyArtSignID (callerAddr,artId) = ((("art_signid_" + artId) + "_") + callerAddr)
132+func keyArtSignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
135133
136134
137-func keyArtIssued (callerAddr,artId) = ((("art_issued_" + artId) + "_") + callerAddr)
135+func keyArtIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
138136
139137
140-func keyArtOnSale (callerAddr,artId) = ((("art_onsale_" + artId) + "_") + callerAddr)
138+func keyArtOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
141139
142140
143-func keyArtLicenceHash (callerAddr,artId) = ((("art_licence_hash_" + artId) + "_") + callerAddr)
141+func keyArtLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
144142
145143
146-func keyArtLicenceCid (callerAddr,artId) = ((("art_licence_cid_" + artId) + "_") + callerAddr)
144+func keyArtLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
147145
148146
149-func keyArtTags (callerAddr,artId) = ((("art_tags_" + artId) + "_") + callerAddr)
147+func keyArtTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
150148
151149
152-func keyArtType (callerAddr,artId) = ((("art_type_" + artId) + "_") + callerAddr)
150+func keyArtType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
153151
154152
155-func keyArtPrice (callerAddr,artId) = ((("art_price_" + artId) + "_") + callerAddr)
153+func keyArtPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
156154
157155
158-func keyArtAssetIdAccepted (callerAddr,artId) = ((("art_assetAccepted_" + artId) + "_") + callerAddr)
156+func keyArtAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
159157
160158
161-func keyArtHashByTxidAddr (callerAddr,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + callerAddr)
159+func keyArtHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
162160
163161
164162 func keyArtOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
165163
166164
167-func keyArtArtidBySignid (callerAddr,signId) = ((("get_artidbysignid_" + signId) + "_") + callerAddr)
165+func keyArtArtidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
168166
169167
170-func keyArtTxidByHashOwner (sha256Hash,callerAddr) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + callerAddr)))))
168+func keyArtTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
171169
172170
173171 func validateAllCID (cidDisplay,cidExport,cidLicence) = if (if ((cidDisplay != ""))
174172 then !(validateCID(cidDisplay))
175173 else false)
176- then throw("Wrong Display CID length")
174+ then throw("Wrong Display CID")
177175 else if (if ((cidExport != ""))
178176 then !(validateCID(cidExport))
179177 else false)
180- then throw("Wrong Export CID length")
178+ then throw("Wrong Export CID")
181179 else if (if ((cidLicence != ""))
182180 then !(validateCID(cidLicence))
183181 else false)
184- then throw("Wrong Licence CID length")
182+ then throw("Wrong Licence CID")
185183 else true
186184
187185
188186 func validateAllHash (sha256Export,sha256Licence) = if (if ((sha256Export != ""))
189187 then !(validateHash(sha256Export))
190188 else false)
191- then throw("Export Hash should be 64 characters maximum")
189+ then throw("Export Hash 64 char. max")
192190 else if (if ((sha256Licence != ""))
193191 then !(validateHash(sha256Licence))
194192 else false)
195- then throw("Licence Hash should be 64 characters maximum")
193+ then throw("Licence Hash 64 char. max")
196194 else true
197195
198196
199197 func validateString (str,max) = if ((size(str) == 0))
200198 then throw("Field cannot be is empty")
201199 else if ((size(str) > max))
202200 then throw((str + " is too long"))
203201 else true
204202
205203
206204 @Callable(i)
207-func registerUser (name,description,thumb,social) = {
208- let callerAddr = toString(addressFromPublicKey(i.callerPublicKey))
209- let userCanRegister = getStringByKey(keyUserStatus(callerAddr))
210- let id = toBase58String(i.transactionId)
211- let timestamp = lastBlock.timestamp
212- if (if ((userCanRegister == userSuspended))
213- then true
214- else (userCanRegister == userRemoved))
215- then throw("You are now allowed to register, your account have been suspended/ removed.")
216- else if ((userCanRegister == userRegistered))
217- then throw("You are already registered, please use update method instead.")
218- else if (if ((userCanRegister == ""))
219- then WHITELISTEDONLY
220- else false)
221- then throw("You are now allowed to register yet, please contact us first to get approved.")
222- else if (if ((name == ""))
223- then true
224- else (description == ""))
225- then throw("Name and description cannot be empty")
226- else if ((size(description) > 600))
227- then throw("600 Characters maximum for the description")
228- else [IntegerEntry(keyUserDate(callerAddr), timestamp), StringEntry(keyUserAddr(callerAddr), ((id + "_") + toString(lastBlock.timestamp))), StringEntry(keyUserName(callerAddr), name), StringEntry(keyUserDesc(callerAddr), description), StringEntry(keyUserSocial(callerAddr), social), StringEntry(keyUserThumb(callerAddr), thumb), StringEntry(keyUserStatus(callerAddr), userRegistered), StringEntry("last_invoke_id", id)]
229- }
205+func registerUser (name,description,thumb,social) = if (!(dappRunning))
206+ then throw(maintenanceMSG)
207+ else {
208+ let caller = toString(addressFromPublicKey(i.callerPublicKey))
209+ let canRegister = getStringByKey(keyUserStatus(caller))
210+ let id = toBase58String(i.transactionId)
211+ let timestamp = lastBlock.timestamp
212+ if (if ((canRegister == userSuspended))
213+ then true
214+ else (canRegister == userRemoved))
215+ then throw("Account suspended/ removed.")
216+ else if ((canRegister == userRegistered))
217+ then throw("Already registered")
218+ else if (if ((canRegister == ""))
219+ then WHITELISTEDONLY
220+ else false)
221+ then throw("Can't register, get approved first.")
222+ else if (if ((name == ""))
223+ then true
224+ else (description == ""))
225+ then throw("Name and description cannot be empty")
226+ else if ((size(description) > 600))
227+ then throw("600 Char. max description")
228+ else [IntegerEntry(keyUserDate(caller), timestamp), StringEntry(keyUserAddr(caller), ((id + "_") + toString(lastBlock.timestamp))), StringEntry(keyUserName(caller), name), StringEntry(keyUserDesc(caller), description), StringEntry(keyUserSocial(caller), social), StringEntry(keyUserThumb(caller), thumb), StringEntry(keyUserStatus(caller), userRegistered), StringEntry("last_invoke_id", id)]
229+ }
230230
231231
232232
233233 @Callable(i)
234234 func deleteEntry (entry) = {
235- let callerAddr = toString(addressFromPublicKey(i.callerPublicKey))
236- if ((callerAddr == admin))
235+ let caller = toString(addressFromPublicKey(i.callerPublicKey))
236+ if ((caller == admin))
237237 then [DeleteEntry(entry)]
238238 else throw("no")
239239 }
240240
241241
242242
243243 @Callable(i)
244-func updateUser (name,description,thumb,social) = {
245- let callerAddr = toString(addressFromPublicKey(i.callerPublicKey))
246- let userCanRegister = getStringByKey(keyUserStatus(callerAddr))
247- if (if ((userCanRegister == userSuspended))
248- then true
249- else (userCanRegister == userRemoved))
250- then throw("You are now allowed to register, your account have been suspended/ removed.")
251- else if (if ((userCanRegister == ""))
244+func updateUser (name,description,thumb,social) = if (!(dappRunning))
245+ then throw(maintenanceMSG)
246+ else {
247+ let id = toBase58String(i.transactionId)
248+ let caller = toString(addressFromPublicKey(i.callerPublicKey))
249+ let canUpdate = getStringByKey(keyUserStatus(caller))
250+ if (if ((canUpdate == userSuspended))
252251 then true
253- else (userCanRegister == userAllowed))
254- then throw("Please register first with registerUser")
255- else {
256- let id = toBase58String(i.transactionId)
257- let timestamp = lastBlock.timestamp
258- if (if ((name == ""))
252+ else (canUpdate == userRemoved))
253+ then throw("Account suspended/ removed.")
254+ else if (if ((canUpdate == ""))
255+ then true
256+ else (canUpdate == userAllowed))
257+ then throw("Register first")
258+ else if (if ((name == ""))
259259 then true
260260 else (description == ""))
261- then throw("Name and description cannot be empty")
261+ then throw("Name & description cannot be empty")
262262 else if ((size(description) > 600))
263- then throw("600 Characters maximum for the description")
264- else [StringEntry(keyUserName(callerAddr), name), StringEntry(keyUserDesc(callerAddr), description), StringEntry(keyUserSocial(callerAddr), social), StringEntry(keyUserThumb(callerAddr), thumb), StringEntry("last_invoke_id", id)]
265- }
266- }
263+ then throw("600 Char. max for description")
264+ else [StringEntry(keyUserName(caller), name), StringEntry(keyUserDesc(caller), description), StringEntry(keyUserSocial(caller), social), StringEntry(keyUserThumb(caller), thumb), StringEntry("last_invoke_id", id)]
265+ }
267266
268267
269268
270269 @Callable(i)
271-func changeUserStatus (address,status) = {
272- let callerAddr = toString(addressFromPublicKey(i.callerPublicKey))
273- let id = toBase58String(i.transactionId)
274- let currentStatus = getStringByKey(keyUserStatus(address))
275- let statusToSet = if ((status == userVerified))
276- then userVerified
277- else if ((status == userRegistered))
278- then userRegistered
279- else if ((status == userSuspended))
280- then userSuspended
281- else if ((status == userRemoved))
282- then userRemoved
283- else if ((status == userAllowed))
284- then userAllowed
285- else if (if ((status == userReset))
286- then (currentStatus == userAllowed)
287- else false)
288- then ""
289- else throw("Unknown status")
290- if (if ((currentStatus == userAllowed))
291- then (status == userAllowed)
292- else false)
293- then throw("This user is already allowed")
294- else if (if ((currentStatus == userRegistered))
270+func changeUserStatus (address,status) = if (!(dappRunning))
271+ then throw(maintenanceMSG)
272+ else {
273+ let caller = toString(addressFromPublicKey(i.callerPublicKey))
274+ let id = toBase58String(i.transactionId)
275+ let currentStatus = getStringByKey(keyUserStatus(address))
276+ let statusToSet = if ((status == userVerified))
277+ then userVerified
278+ else if ((status == userRegistered))
279+ then userRegistered
280+ else if ((status == userSuspended))
281+ then userSuspended
282+ else if ((status == userRemoved))
283+ then userRemoved
284+ else if ((status == userAllowed))
285+ then userAllowed
286+ else if (if ((status == userReset))
287+ then (currentStatus == userAllowed)
288+ else false)
289+ then ""
290+ else throw("Unknown status")
291+ if (if ((currentStatus == userAllowed))
295292 then (status == userAllowed)
296293 else false)
297- then throw("This user is already allowed and registered")
298- else if (if ((currentStatus == userVerified))
294+ then throw("User already allowed")
295+ else if (if ((currentStatus == userRegistered))
299296 then (status == userAllowed)
300297 else false)
301- then throw("This user is already allowed and verified")
302- else if (if ((callerAddr == admin))
303- then true
304- else (callerAddr == admin2))
305- then [StringEntry(keyUserStatus(address), statusToSet), StringEntry("last_invoke_id", id)]
306- else throw(((("You are not allowed to change user status " + callerAddr) + " / ") + admin))
307- }
298+ then throw("User already allowed & registered")
299+ else if (if ((currentStatus == userVerified))
300+ then (status == userAllowed)
301+ else false)
302+ then throw("User already allowed & verified")
303+ else if (if ((caller == admin))
304+ then true
305+ else (caller == admin2))
306+ then [StringEntry(keyUserStatus(address), statusToSet), StringEntry("last_invoke_id", id)]
307+ else throw(((("Not allowed to change user status " + caller) + " / ") + admin))
308+ }
308309
309310
310311
311312 @Callable(i)
312313 func creditUser (address) = {
313- let callerAddr = toString(addressFromPublicKey(i.callerPublicKey))
314+ let caller = toString(addressFromPublicKey(i.callerPublicKey))
314315 let id = toBase58String(i.transactionId)
315- if (if ((callerAddr == admin))
316+ if (if ((caller == admin))
316317 then true
317- else (callerAddr == admin2))
318+ else (caller == admin2))
318319 then [ScriptTransfer(Address(fromBase58String(address)), 150000000000, signAssetId)]
319- else throw("You are not allowed to do that")
320+ else throw("Not allowed")
320321 }
321322
322323
323324
324325 @Callable(invoke)
325-func addArtwork (sha256Hash,signID,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = {
326- let artId = toBase58String(invoke.transactionId)
327- let callerAddress = toBase58String(invoke.caller.bytes)
328- if (!(validateAllCID(cidDisplay, cidExport, cidLicence)))
329- then throw("Problem with CID")
330- else if (!(validateHash(sha256Hash)))
331- then throw("Hash should be 64 characters maximum")
332- else if (!(validateAllHash(sha256Export, sha256Licence)))
333- then throw("Problem with Hashes")
334- else if ((size(invoke.payments) == 0))
335- then throw("No payment attached")
336- else {
337- let payment = value(invoke.payments[0])
338- let amount = value(payment.amount)
339- let assetId = if (if (isDefined(payment.assetId))
340- then (payment.assetId == signAssetId)
341- else false)
342- then payment.assetId
343- else throw("Only SIGN token accepted at the moment")
344- let currentCertificationPrice = match getInteger(storageVerifier, ("certification_fee_" + toBase58String(signAssetId))) {
345- case price: Int =>
346- price
347- case _ =>
348- throw("Price undefined in oracle")
349- }
350- if ((amount != currentCertificationPrice))
351- then throw(("Payment amount should be " + toString(currentCertificationPrice)))
352- else {
353- let entryExist = getStringByKey(keyArtTxidByHashOwner(sha256Hash, callerAddress))
354- if ((entryExist != ""))
355- then throw("You already added it on Sign Art")
356- else {
357- let hashExist = getStringByKey(keyArtOwnerByHash(sha256Hash))
358- if ((hashExist != ""))
359- then throw("Hash already registered on Sign Art")
360- else {
361- let isSignCertified = checkSignCertificate(signID, callerAddress, sha256Hash)
362- if (!(isSignCertified))
363- then throw("Sign Certificate not found for this address.")
364- else if ((size(cidDisplay) == 0))
365- then throw("Display CID cannot be empty")
366- else if (!(validateString(name, 100)))
367- then throw("100 Char. max for the name")
368- else if (!(validateString(description, 1000)))
369- then throw("1000 Char. max for the description")
370- else if ((size(split(tags, ",")) > 5))
371- then throw("5 tags max.")
372- else {
373- let userIsRegistered = match getString(this, ("user_status_" + callerAddress)) {
374- case s: String =>
375- s
376- case _ =>
377- userUnregistered
378- }
379- let timestamp = lastBlock.timestamp
380- if (if (isDefined(userIsRegistered))
381- then (userIsRegistered == userUnregistered)
382- else false)
383- then throw("Register this account first with \"User infos\" tab")
384- else if ((userIsRegistered == userSuspended))
385- then throw("Account suspended")
386- else if ((userIsRegistered == userRemoved))
387- then throw("Account removed")
388- else if ((maxmint > 10))
389- then throw("10 editions max per artwork")
390- else if ((size(sha256Hash) != 64))
391- then throw("Hash should be 64 char.")
392- else [StringEntry(keyArtOwnerByHash(sha256Hash), callerAddress), StringEntry(keyArtTxidByHashOwner(sha256Hash, callerAddress), artId), IntegerEntry(keyArtDate(callerAddress, artId), timestamp), StringEntry(keyArtName(callerAddress, artId), name), StringEntry(keyArtDesc(callerAddress, artId), description), StringEntry(keyArtDisplayCid(callerAddress, artId), cidDisplay), StringEntry(keyArtExportCid(callerAddress, artId), cidExport), StringEntry(keyArtExportHash(callerAddress, artId), sha256Export), StringEntry(keyArtLicenceHash(callerAddress, artId), sha256Licence), StringEntry(keyArtLicenceCid(callerAddress, artId), cidLicence), StringEntry(keyArtType(callerAddress, artId), type), StringEntry(keyArtTags(callerAddress, artId), tags), IntegerEntry(keyArtMaxMint(callerAddress, artId), maxmint), StringEntry(keyArtSignID(callerAddress, artId), signID), IntegerEntry(keyArtIssued(callerAddress, artId), 0), BooleanEntry(keyArtOnSale(callerAddress, artId), false), StringEntry(keyArtArtidBySignid(callerAddress, signID), artId), StringEntry("last_invoke_id", artId), StringEntry(keyArtHashByTxidAddr(callerAddress, artId), sha256Hash), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, assetId)]
393- }
394- }
395- }
396- }
397- }
398- }
326+func addArtwork (sha256Hash,signID,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = if (!(dappRunning))
327+ then throw(maintenanceMSG)
328+ else {
329+ let artId = toBase58String(invoke.transactionId)
330+ let caller = toBase58String(invoke.caller.bytes)
331+ if (!(validateAllCID(cidDisplay, cidExport, cidLicence)))
332+ then throw("Problem with CID")
333+ else if (!(validateHash(sha256Hash)))
334+ then throw("Hash should be 64 characters maximum")
335+ else if (!(validateAllHash(sha256Export, sha256Licence)))
336+ then throw("Problem with Hashes")
337+ else if ((size(invoke.payments) == 0))
338+ then throw("No payment attached")
339+ else {
340+ let payment = value(invoke.payments[0])
341+ let amount = value(payment.amount)
342+ let assetId = if (if (isDefined(payment.assetId))
343+ then (payment.assetId == signAssetId)
344+ else false)
345+ then payment.assetId
346+ else throw("Only SIGN token accepted at the moment")
347+ let currentCertificationPrice = match getInteger(oracleFee, ("certification_fee_" + toBase58String(signAssetId))) {
348+ case price: Int =>
349+ price
350+ case _ =>
351+ throw("Price undefined in oracle")
352+ }
353+ if ((amount != currentCertificationPrice))
354+ then throw(("Payment amount should be " + toString(currentCertificationPrice)))
355+ else {
356+ let entryExist = getStringByKey(keyArtTxidByHashOwner(sha256Hash, caller))
357+ if ((entryExist != ""))
358+ then throw("You already added it")
359+ else {
360+ let hashExist = getStringByKey(keyArtOwnerByHash(sha256Hash))
361+ if ((hashExist != ""))
362+ then throw("Hash already registered")
363+ else {
364+ let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
365+ if (!(isSignCertified))
366+ then throw("Sign Certificate not found for this address.")
367+ else if ((size(cidDisplay) == 0))
368+ then throw("Display CID cannot be empty")
369+ else if (!(validateString(name, 100)))
370+ then throw("100 Char. max name")
371+ else if (!(validateString(description, 1000)))
372+ then throw("1000 Char. max description")
373+ else if ((size(split(tags, ",")) > 5))
374+ then throw("5 tags max.")
375+ else {
376+ let userIsRegistered = match getString(this, ("user_status_" + caller)) {
377+ case s: String =>
378+ s
379+ case _ =>
380+ userUnregistered
381+ }
382+ let timestamp = lastBlock.timestamp
383+ if (if (isDefined(userIsRegistered))
384+ then (userIsRegistered == userUnregistered)
385+ else false)
386+ then throw("Register this account first with \"User infos\" tab")
387+ else if ((userIsRegistered == userSuspended))
388+ then throw("Account suspended")
389+ else if ((userIsRegistered == userRemoved))
390+ then throw("Account removed")
391+ else if ((maxmint > 10))
392+ then throw("10 editions max")
393+ else if ((size(sha256Hash) != 64))
394+ then throw("Hash 64 char. max")
395+ else [StringEntry(keyArtOwnerByHash(sha256Hash), caller), StringEntry(keyArtTxidByHashOwner(sha256Hash, caller), artId), IntegerEntry(keyArtDate(caller, artId), timestamp), StringEntry(keyArtName(caller, artId), name), StringEntry(keyArtDesc(caller, artId), description), StringEntry(keyArtDisplayCid(caller, artId), cidDisplay), StringEntry(keyArtExportCid(caller, artId), cidExport), StringEntry(keyArtExportHash(caller, artId), sha256Export), StringEntry(keyArtLicenceHash(caller, artId), sha256Licence), StringEntry(keyArtLicenceCid(caller, artId), cidLicence), StringEntry(keyArtType(caller, artId), type), StringEntry(keyArtTags(caller, artId), tags), IntegerEntry(keyArtMaxMint(caller, artId), maxmint), StringEntry(keyArtSignID(caller, artId), signID), IntegerEntry(keyArtIssued(caller, artId), 0), BooleanEntry(keyArtOnSale(caller, artId), false), StringEntry(keyArtArtidBySignid(caller, signID), artId), StringEntry("last_invoke_id", artId), StringEntry(keyArtHashByTxidAddr(caller, artId), sha256Hash), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, assetId)]
396+ }
397+ }
398+ }
399+ }
400+ }
401+ }
399402
400403
401404
402405 @Callable(invoke)
403-func updateArtwork (txid,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = {
404- let updateId = toBase58String(invoke.transactionId)
405- let callerAddress = toBase58String(invoke.caller.bytes)
406- if (!(validateAllCID(cidDisplay, cidExport, cidLicence)))
407- then throw("Problem with CID")
408- else if (!(validateAllHash(sha256Export, sha256Licence)))
409- then throw("Problem with Hashes")
410- else {
411- let entryExist = getStringByKey(keyArtName(callerAddress, txid))
412- if ((entryExist == ""))
413- then throw("Entry not found")
414- else if (!(validateString(name, 100)))
415- then throw("100 Char. max for the name")
416- else if (!(validateString(description, 1000)))
417- then throw("1000 Char. max for the description")
418- else {
419- let artworkMinted = match getInteger(this, keyArtIssued(callerAddress, txid)) {
420- case b: Int =>
421- if ((b == 0))
422- then false
423- else true
424- case _ =>
425- false
426- }
427- if ((size(split(tags, ",")) > 5))
428- then throw("5 tags max.")
429- else {
430- let userIsRegistered = match getString(this, ("user_status_" + callerAddress)) {
431- case s: String =>
432- s
433- case _ =>
434- userUnregistered
435- }
436- if (if (isDefined(userIsRegistered))
437- then (userIsRegistered == userUnregistered)
438- else false)
439- then throw("Register this account first with \"User infos\" tab")
440- else if ((userIsRegistered == userSuspended))
441- then throw("Account suspended")
442- else if ((userIsRegistered == userRemoved))
443- then throw("Account removed")
444- else if ((maxmint > 10))
445- then throw("M10 editions max per artwork")
446- else if (!(artworkMinted))
447- then [StringEntry(keyArtName(callerAddress, txid), name), StringEntry(keyArtDesc(callerAddress, txid), description), StringEntry(keyArtDisplayCid(callerAddress, txid), cidDisplay), StringEntry(keyArtExportCid(callerAddress, txid), cidExport), StringEntry(keyArtExportHash(callerAddress, txid), sha256Export), StringEntry(keyArtLicenceCid(callerAddress, txid), cidLicence), StringEntry(keyArtLicenceHash(callerAddress, txid), sha256Licence), IntegerEntry(keyArtMaxMint(callerAddress, txid), maxmint), StringEntry(keyArtTags(callerAddress, txid), tags), StringEntry(keyArtType(callerAddress, txid), type), StringEntry("last_invoke_id", updateId)]
448- else throw("Artwork already minted")
449- }
450- }
451- }
452- }
406+func updateArtwork (txid,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = if (!(dappRunning))
407+ then throw(maintenanceMSG)
408+ else {
409+ let updateId = toBase58String(invoke.transactionId)
410+ let caller = toBase58String(invoke.caller.bytes)
411+ if (!(validateAllCID(cidDisplay, cidExport, cidLicence)))
412+ then throw("Problem with CID")
413+ else if (!(validateAllHash(sha256Export, sha256Licence)))
414+ then throw("Problem with Hashes")
415+ else {
416+ let entryExist = getStringByKey(keyArtName(caller, txid))
417+ if ((entryExist == ""))
418+ then throw("Entry not found")
419+ else if (!(validateString(name, 100)))
420+ then throw("100 Char. max name")
421+ else if (!(validateString(description, 1000)))
422+ then throw("1000 Char. max description")
423+ else {
424+ let artworkMinted = match getInteger(this, keyArtIssued(caller, txid)) {
425+ case b: Int =>
426+ if ((b == 0))
427+ then false
428+ else true
429+ case _ =>
430+ false
431+ }
432+ if ((size(split(tags, ",")) > 5))
433+ then throw("5 tags max.")
434+ else {
435+ let userIsRegistered = match getString(this, ("user_status_" + caller)) {
436+ case s: String =>
437+ s
438+ case _ =>
439+ userUnregistered
440+ }
441+ if (if (isDefined(userIsRegistered))
442+ then (userIsRegistered == userUnregistered)
443+ else false)
444+ then throw("Register first with \"User infos\"")
445+ else if ((userIsRegistered == userSuspended))
446+ then throw("Account suspended")
447+ else if ((userIsRegistered == userRemoved))
448+ then throw("Account removed")
449+ else if ((maxmint > 10))
450+ then throw("10 editions max per artwork")
451+ else if (!(artworkMinted))
452+ then [StringEntry(keyArtName(caller, txid), name), StringEntry(keyArtDesc(caller, txid), description), StringEntry(keyArtDisplayCid(caller, txid), cidDisplay), StringEntry(keyArtExportCid(caller, txid), cidExport), StringEntry(keyArtExportHash(caller, txid), sha256Export), StringEntry(keyArtLicenceCid(caller, txid), cidLicence), StringEntry(keyArtLicenceHash(caller, txid), sha256Licence), IntegerEntry(keyArtMaxMint(caller, txid), maxmint), StringEntry(keyArtTags(caller, txid), tags), StringEntry(keyArtType(caller, txid), type), StringEntry("last_invoke_id", updateId)]
453+ else throw("Already minted")
454+ }
455+ }
456+ }
457+ }
453458
454459
455460
456461 @Callable(i)
457462 func deleteArtwork (artId,address) = {
458- let callerAddress = toString(addressFromPublicKey(i.callerPublicKey))
463+ let caller = toString(addressFromPublicKey(i.callerPublicKey))
459464 let id = toBase58String(i.transactionId)
460- let addressToUse = if (if ((callerAddress == admin))
465+ let addressToUse = if (if ((caller == admin))
461466 then true
462- else (callerAddress == admin2))
467+ else (caller == admin2))
463468 then address
464- else callerAddress
469+ else caller
465470 let entryExist = match getString(this, keyArtName(addressToUse, artId)) {
466471 case s: String =>
467472 s
468473 case _ =>
469- throw("No artwork matching")
474+ throw("No art matching")
470475 }
471476 let artworkMinted = match getInteger(this, keyArtIssued(addressToUse, artId)) {
472477 case b: Int =>
473478 if ((b != 0))
474479 then true
475480 else false
476481 case _ =>
477482 false
478483 }
479484 let maxMint = getIntegerByKey(keyArtMaxMint(addressToUse, artId))
480485 let sha256Hash = match getString(this, keyArtHashByTxidAddr(addressToUse, artId)) {
481486 case s: String =>
482487 s
483488 case _ =>
484- throw("No artwork hash matching")
489+ throw("No art hash matching")
485490 }
486491 let signID = match getString(this, keyArtSignID(addressToUse, artId)) {
487492 case s: String =>
488493 s
489494 case _ =>
490495 throw("No SIGN ID matching")
491496 }
492497 let dataToDelete = [DeleteEntry(keyArtDate(addressToUse, artId)), DeleteEntry(keyArtName(addressToUse, artId)), DeleteEntry(keyArtDesc(addressToUse, artId)), DeleteEntry(keyArtDisplayCid(addressToUse, artId)), DeleteEntry(keyArtExportCid(addressToUse, artId)), DeleteEntry(keyArtExportHash(addressToUse, artId)), DeleteEntry(keyArtLicenceHash(addressToUse, artId)), DeleteEntry(keyArtLicenceCid(addressToUse, artId)), DeleteEntry(keyArtType(addressToUse, artId)), DeleteEntry(keyArtTags(addressToUse, artId)), DeleteEntry(keyArtMaxMint(addressToUse, artId)), DeleteEntry(keyArtSignID(addressToUse, artId)), DeleteEntry(keyArtIssued(addressToUse, artId)), DeleteEntry(keyArtOnSale(addressToUse, artId)), StringEntry("last_invoke_id", id), DeleteEntry(keyArtOwnerByHash(sha256Hash)), DeleteEntry(keyArtArtidBySignid(addressToUse, signID)), DeleteEntry(keyArtTxidByHashOwner(sha256Hash, addressToUse)), DeleteEntry(keyArtPrice(addressToUse, artId)), DeleteEntry(keyArtMaxMint(addressToUse, artId)), DeleteEntry(keyArtAssetIdAccepted(addressToUse, artId)), DeleteEntry(((((("art_sold_1_of_" + toString(maxMint)) + "_") + artId) + "_") + addressToUse)), DeleteEntry(((((("art_sold_2_of_" + toString(maxMint)) + "_") + artId) + "_") + addressToUse)), DeleteEntry(((((("art_sold_3_of_" + toString(maxMint)) + "_") + artId) + "_") + addressToUse)), DeleteEntry(((((("art_sold_4_of_" + toString(maxMint)) + "_") + artId) + "_") + addressToUse)), DeleteEntry(((((("art_sold_5_of_" + toString(maxMint)) + "_") + artId) + "_") + addressToUse)), DeleteEntry(((((("art_sold_6_of_" + toString(maxMint)) + "_") + artId) + "_") + addressToUse)), DeleteEntry(((((("art_sold_7_of_" + toString(maxMint)) + "_") + artId) + "_") + addressToUse)), DeleteEntry(((((("art_sold_8_of_" + toString(maxMint)) + "_") + artId) + "_") + addressToUse)), DeleteEntry(((((("art_sold_9_of_" + toString(maxMint)) + "_") + artId) + "_") + addressToUse)), DeleteEntry(((((("art_sold_10_of_" + toString(maxMint)) + "_") + artId) + "_") + addressToUse))]
493- if (if ((callerAddress == admin))
498+ if (if ((caller == admin))
494499 then true
495- else (callerAddress == admin2))
496- then dataToDelete
500+ else (caller == admin2))
501+ then (dataToDelete ++ [StringEntry(((("ban_" + artId) + "_") + addressToUse), caller)])
497502 else if (!(artworkMinted))
498- then dataToDelete
499- else throw("Artwork already minted, you cannot delete it")
503+ then if (!(dappRunning))
504+ then throw(maintenanceMSG)
505+ else dataToDelete
506+ else throw("Art already minted, cannot delete")
500507 }
501508
502509
503510
504511 @Callable(invoke)
505-func sellArtwork (artId,price,maxMint,assetId) = {
506- let id = toBase58String(invoke.transactionId)
507- let callerAddress = toBase58String(invoke.caller.bytes)
508- let sellDate = lastBlock.timestamp
509- let exportCID = getStringByKey(keyArtExportCid(callerAddress, artId))
510- if ((size(split(exportCID, "/")[0]) != 59))
511- then throw("You cannot sell artwork with no export file")
512- else {
513- let exportHash = getStringByKey(keyArtExportHash(callerAddress, artId))
514- if ((size(exportHash) != 64))
515- then throw("You cannot sell artwork with no export hash")
516- else if (if (if ((assetId != toBase58String(signAssetId)))
517- then (assetId != toBase58String(wavesAssetId))
518- else false)
519- then (assetId != toBase58String(usdnAssetId))
520- else false)
521- then throw("Only SIGN, USDN or WAVES accepted")
522- else {
523- let artworkName = match getString(this, keyArtName(callerAddress, artId)) {
524- case s: String =>
525- s
526- case _ =>
527- throw("This artwork doesn't match")
528- }
529- let userIsRegistered = match getString(this, keyUserStatus(callerAddress)) {
530- case s: String =>
531- s
532- case _ =>
533- throw("Register this account first")
534- }
535- let amountSold = getIntegerByKey(keyArtIssued(callerAddress, artId))
536- let maxCanSell = getIntegerByKey(keyArtMaxMint(callerAddress, artId))
537- if (if ((amountSold != 0))
538- then (amountSold == maxCanSell)
539- else false)
540- then throw("Max edition reached.")
541- else if (if ((amountSold > 0))
542- then (maxCanSell != maxMint)
512+func sellArtwork (artId,price,maxMint,assetId) = if (!(dappRunning))
513+ then throw(maintenanceMSG)
514+ else {
515+ let id = toBase58String(invoke.transactionId)
516+ let caller = toBase58String(invoke.caller.bytes)
517+ let sellDate = lastBlock.timestamp
518+ let exportCID = getStringByKey(keyArtExportCid(caller, artId))
519+ if ((size(split(exportCID, "/")[0]) != 59))
520+ then throw("You cannot sell art with no export file")
521+ else {
522+ let exportHash = getStringByKey(keyArtExportHash(caller, artId))
523+ if ((size(exportHash) != 64))
524+ then throw("You cannot sell art with no export hash")
525+ else if (if (if ((assetId != toBase58String(signAssetId)))
526+ then (assetId != toBase58String(wavesAssetId))
527+ else false)
528+ then (assetId != toBase58String(usdnAssetId))
529+ else false)
530+ then throw("Only SIGN, USDN or WAVES accepted")
531+ else {
532+ let artworkName = match getString(this, keyArtName(caller, artId)) {
533+ case s: String =>
534+ s
535+ case _ =>
536+ throw("This art doesn't match")
537+ }
538+ let userIsRegistered = match getString(this, keyUserStatus(caller)) {
539+ case s: String =>
540+ s
541+ case _ =>
542+ throw("Register this account first")
543+ }
544+ let amountSold = getIntegerByKey(keyArtIssued(caller, artId))
545+ let maxCanSell = getIntegerByKey(keyArtMaxMint(caller, artId))
546+ if (if ((amountSold != 0))
547+ then (amountSold == maxCanSell)
543548 else false)
544- then throw("Cannot change maximum issuable anymore")
545- else if ((userIsRegistered == userSuspended))
546- then throw("Account suspended")
547- else if ((userIsRegistered == userRemoved))
548- then throw("Account deleted")
549- else {
550- let sellStatus = if ((price > 0))
551- then true
552- else false
553-[BooleanEntry(keyArtOnSale(callerAddress, artId), sellStatus), IntegerEntry(keyArtPrice(callerAddress, artId), price), IntegerEntry(keyArtMaxMint(callerAddress, artId), maxMint), StringEntry(keyArtAssetIdAccepted(callerAddress, artId), assetId), StringEntry("last_invoke_id", id)]
554- }
555- }
556- }
557- }
549+ then throw("Max edition reached.")
550+ else if (if ((amountSold > 0))
551+ then (maxCanSell != maxMint)
552+ else false)
553+ then throw("Cannot change maximum issuable anymore")
554+ else if ((userIsRegistered == userSuspended))
555+ then throw("Account suspended")
556+ else if ((userIsRegistered == userRemoved))
557+ then throw("Account deleted")
558+ else {
559+ let sellStatus = if ((price > 0))
560+ then true
561+ else false
562+[BooleanEntry(keyArtOnSale(caller, artId), sellStatus), IntegerEntry(keyArtPrice(caller, artId), price), IntegerEntry(keyArtMaxMint(caller, artId), maxMint), StringEntry(keyArtAssetIdAccepted(caller, artId), assetId), StringEntry("last_invoke_id", id)]
563+ }
564+ }
565+ }
566+ }
558567
559568
560569
561570 @Callable(invoke)
562-func buyArtwork (artId,issuer) = {
563- let id = toBase58String(invoke.transactionId)
564- let callerAddress = toBase58String(invoke.caller.bytes)
565- let totalNFT = getIntegerByKey("total_nft_issued")
566- let signID = getStringByKey(keyArtSignID(issuer, artId))
567- let artworkName = match getString(this, keyArtName(issuer, artId)) {
568- case s: String =>
569- s
570- case _ =>
571- throw("Artwork doesn't exit")
572- }
573- let displayCID = getStringByKey(keyArtDisplayCid(issuer, artId))
574- let exportCID = getStringByKey(keyArtExportCid(issuer, artId))
575- let exportHash = getStringByKey(keyArtExportHash(issuer, artId))
576- let licenceCID = getStringByKey(keyArtLicenceCid(issuer, artId))
577- let licenceHash = getStringByKey(keyArtLicenceHash(issuer, artId))
578- let description = take(getStringByKey(keyArtDesc(issuer, artId)), 50)
579- let amountSold = getIntegerByKey(keyArtIssued(issuer, artId))
580- let artworkPrice = getIntegerByKey(keyArtPrice(issuer, artId))
581- let isOnSale = getBooleanByKey(keyArtOnSale(issuer, artId))
582- let priceAssetId = getStringByKey(keyArtAssetIdAccepted(issuer, artId))
583- let sourceHash = getStringByKey(keyArtHashByTxidAddr(issuer, artId))
584- if ((artworkPrice == 0))
585- then throw("Artwork not for sell")
586- else if (!(isOnSale))
587- then throw("Artwork not for sale")
588- else {
589- let maxCanSell = getIntegerByKey(keyArtMaxMint(issuer, artId))
590- let payment = value(invoke.payments[0])
591- let amount = value(payment.amount)
592- let assetId = if (if (isDefined(payment.assetId))
593- then (payment.assetId == fromBase58String(priceAssetId))
594- else false)
595- then payment.assetId
596- else throw((("Only " + priceAssetId) + " token id accepted at the moment"))
597- let cut = if ((priceAssetId == toBase58String(signAssetId)))
598- then 8
599- else 10
600- let amountForSign = ((amount / 100) * cut)
601- let amountForCreator = (amount - amountForSign)
602- if ((amountSold == maxCanSell))
603- then throw("Artwork sold out")
604- else if ((artworkPrice != amount))
605- then throw("Payment don't match")
606- else {
607- let newAmountSold = (amountSold + 1)
608- let entryDate = lastBlock.timestamp
609- let issueMeta = (((((((((((((((((((((((((((("{\"version\": 1,
571+func buyArtwork (artId,issuer) = if (!(dappRunning))
572+ then throw(maintenanceMSG)
573+ else {
574+ let id = toBase58String(invoke.transactionId)
575+ let caller = toBase58String(invoke.caller.bytes)
576+ let totalNFT = getIntegerByKey("total_nft_issued")
577+ let signID = getStringByKey(keyArtSignID(issuer, artId))
578+ let artworkName = match getString(this, keyArtName(issuer, artId)) {
579+ case s: String =>
580+ s
581+ case _ =>
582+ throw("Art doesn't exist")
583+ }
584+ let displayCID = getStringByKey(keyArtDisplayCid(issuer, artId))
585+ let exportCID = getStringByKey(keyArtExportCid(issuer, artId))
586+ let exportHash = getStringByKey(keyArtExportHash(issuer, artId))
587+ let licenceCID = getStringByKey(keyArtLicenceCid(issuer, artId))
588+ let licenceHash = getStringByKey(keyArtLicenceHash(issuer, artId))
589+ let description = take(getStringByKey(keyArtDesc(issuer, artId)), 50)
590+ let amountSold = getIntegerByKey(keyArtIssued(issuer, artId))
591+ let artworkPrice = getIntegerByKey(keyArtPrice(issuer, artId))
592+ let isOnSale = getBooleanByKey(keyArtOnSale(issuer, artId))
593+ let priceAssetId = getStringByKey(keyArtAssetIdAccepted(issuer, artId))
594+ let sourceHash = getStringByKey(keyArtHashByTxidAddr(issuer, artId))
595+ if ((artworkPrice == 0))
596+ then throw("Art not for sell")
597+ else if (!(isOnSale))
598+ then throw("Art not for sale")
599+ else {
600+ let maxCanSell = getIntegerByKey(keyArtMaxMint(issuer, artId))
601+ let payment = value(invoke.payments[0])
602+ let amount = value(payment.amount)
603+ let assetId = if (if (isDefined(payment.assetId))
604+ then (payment.assetId == fromBase58String(priceAssetId))
605+ else false)
606+ then payment.assetId
607+ else throw((("Only " + priceAssetId) + " token id accepted at the moment"))
608+ let cut = if ((priceAssetId == toBase58String(signAssetId)))
609+ then 8
610+ else 10
611+ let amountForSign = ((amount / 100) * cut)
612+ let amountForCreator = (amount - amountForSign)
613+ if ((amountSold == maxCanSell))
614+ then throw("Art sold out")
615+ else if ((artworkPrice != amount))
616+ then throw("Payment don't match")
617+ else {
618+ let newAmountSold = (amountSold + 1)
619+ let entryDate = lastBlock.timestamp
620+ let issueMeta = (((((((((((((((((((((((((((("{\"version\": 1,
610621 \"creator\": \"" + issuer) + "\",
611622 \"artID\": \"") + artId) + "\",
612623 \"signID\": \"") + signID) + "\",
613624 \"artwork_name\": \"") + artworkName) + "\",
614625 \"artwork_desc\": \"") + description) + "\",
615626 \"issue\": \"") + toString(newAmountSold)) + "/") + toString(maxCanSell)) + "\",
616627 \"maxIssuable\": \"") + toString(maxCanSell)) + "\",
617628 \"source_hash\": \"") + sourceHash) + "\",
618629 \"display_cid\": \"") + displayCID) + "\",
619630 \"export_cid\": \"") + exportCID) + "\",
620631 \"export_hash\": \"") + exportHash) + "\",
621632 \"licence_cid\": \"") + licenceCID) + "\",
622633 \"licence_hash\": \"") + licenceHash) + "\"}")
623- let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
624- let idNFT = calculateAssetId(issueNFT)
625- let sellStatus = if ((newAmountSold == maxCanSell))
626- then false
627- else true
628-[IntegerEntry(keyArtIssued(issuer, artId), newAmountSold), StringEntry(((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer), ((((((((callerAddress + "_") + toString(entryDate)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId)), IntegerEntry("total_nft_issued", (totalNFT + 1)), BooleanEntry(keyArtOnSale(issuer, artId), sellStatus), StringEntry("last_invoke_id", id), issueNFT, ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId), ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId), ScriptTransfer(invoke.caller, 1, idNFT)]
629- }
630- }
631- }
634+ let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
635+ let idNFT = calculateAssetId(issueNFT)
636+ let sellStatus = if ((newAmountSold == maxCanSell))
637+ then false
638+ else true
639+[IntegerEntry(keyArtIssued(issuer, artId), newAmountSold), StringEntry(((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer), ((((((((caller + "_") + toString(entryDate)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId)), IntegerEntry("total_nft_issued", (totalNFT + 1)), BooleanEntry(keyArtOnSale(issuer, artId), sellStatus), StringEntry("last_invoke_id", id), issueNFT, ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId), ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId), ScriptTransfer(invoke.caller, 1, idNFT)]
640+ }
641+ }
642+ }
632643
633644
634645
635646 @Callable(i)
636647 func deleteUser (address) = {
637- let callerAddr = toString(addressFromPublicKey(i.callerPublicKey))
648+ let caller = toString(addressFromPublicKey(i.callerPublicKey))
638649 let id = toBase58String(i.transactionId)
639- if (if ((callerAddr == admin))
650+ if (if ((caller == admin))
640651 then true
641- else (callerAddr == admin2))
652+ else (caller == admin2))
642653 then [DeleteEntry(keyUserDate(address)), DeleteEntry(keyUserAddr(address)), DeleteEntry(keyUserName(address)), DeleteEntry(keyUserDesc(address)), DeleteEntry(keyUserSocial(address)), DeleteEntry(keyUserThumb(address)), StringEntry(keyUserStatus(address), userRemoved), StringEntry("last_invoke_id", id)]
643- else throw("You are not allowed")
654+ else throw("Not allowed")
644655 }
645656
646657

github/deemru/w8io/6500d08 
176.28 ms