tx · 3Xh51vjjHpkyobLb6suDqfnp9cNnEuxdteHzDpvzCSe4

3My71eA5781UVppziZNzPzoaXoQ79XLfpou:  -0.01400000 Waves

2020.09.04 07:06 [1162132] smart account 3My71eA5781UVppziZNzPzoaXoQ79XLfpou > SELF 0.00000000 Waves

{ "type": 13, "id": "3Xh51vjjHpkyobLb6suDqfnp9cNnEuxdteHzDpvzCSe4", "fee": 1400000, "feeAssetId": null, "timestamp": 1599192446695, "version": 2, "chainId": 84, "sender": "3My71eA5781UVppziZNzPzoaXoQ79XLfpou", "senderPublicKey": "xu7oh5A3xfh5PtSRAoZLCyetRFpcf6bq7bCzGtTCUyL", "proofs": [ "3yyz4RAPDvcDacJATmsfWv7RHPSfJcaPoFhyJo5ZnbnRdhsfit3TY6QEeB3avaV22W5uFi92WHoPoAfN94yNAr8P" ], "script": "base64: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AAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWIFAAAAByRtYXRjaDAFAAAAAWIJAAACAAAAAQIAAAAvWW91IGFyZSBub3Qgd2hpdGUgbGlzdGVkLCBwbGVhc2UgY29udGFjdCBmaXJzdC4BAAAAC2tleVVzZXJBZGRyAAAAAQAAAApjYWxsZXJBZGRyCQABLAAAAAICAAAABXVzZXJfBQAAAApjYWxsZXJBZGRyAQAAAAtrZXlVc2VyTmFtZQAAAAEAAAAKY2FsbGVyQWRkcgkAASwAAAACAgAAAAp1c2VyX25hbWVfBQAAAApjYWxsZXJBZGRyAQAAAAtrZXlVc2VyRGVzYwAAAAEAAAAKY2FsbGVyQWRkcgkAASwAAAACAgAAAAp1c2VyX2Rlc2NfBQAAAApjYWxsZXJBZGRyAQAAAA1rZXlVc2VyU29jaWFsAAAAAQAAAApjYWxsZXJBZGRyCQABLAAAAAICAAAADHVzZXJfc29jaWFsXwUAAAAKY2FsbGVyQWRkcgEAAAAMa2V5VXNlclRodW1iAAAAAQAAAApjYWxsZXJBZGRyCQABLAAAAAICAAAAC3VzZXJfdGh1bWJfBQAAAApjYWxsZXJBZGRyAQAAAA9rZXlVc2VySXNBcnRpc3QAAAABAAAACmNhbGxlckFkZHIJAAEsAAAAAgIAAAAOdXNlcl9pc2FydGlzdF8FAAAACmNhbGxlckFkZHIBAAAADWtleVVzZXJTdGF0dXMAAAABAAAACmNhbGxlckFkZHIJAAEsAAAAAgIAAAAMdXNlcl9zdGF0dXNfBQAAAApjYWxsZXJBZGRyAQAAAAtrZXlVc2VyRGF0ZQAAAAEAAAAKY2FsbGVyQWRkcgkAASwAAAACAgAAAAp1c2VyX2RhdGVfBQAAAApjYWxsZXJBZGRyAQAAAAprZXlBcnREYXRlAAAAAgAAAApjYWxsZXJBZGRyAAAABWFydElkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAlhcnRfZGF0ZV8FAAAABWFydElkAgAAAAFfBQAAAApjYWxsZXJBZGRyAQAAAAprZXlBcnROYW1lAAAAAgAAAApjYWxsZXJBZGRyAAAABWFydElkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAlhcnRfbmFtZV8FAAAABWFydElkAgAAAAFfBQAAAApjYWxsZXJBZGRyAQAAAAprZXlBcnREZXNjAAAAAgAAAApjYWxsZXJBZGRyAAAABWFydElkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAlhcnRfZGVzY18FAAAABWFydElkAgAAAAFfBQAAAApjYWxsZXJBZGRyAQAAABBrZXlBcnREaXNwbGF5Q2lkAAAAAgAAAApjYWxsZXJBZGRyAAAABWFydElkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABBhcnRfZGlzcGxheV9jaWRfBQAAAAVhcnRJZAIAAAABXwUAAAAKY2FsbGVyQWRkcgEAAAAQa2V5QXJ0RXhwb3J0SGFzaAAAAAIAAAAKY2FsbGVyQWRkcgAAAAVhcnRJZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAQYXJ0X2V4cG9ydF9oYXNoXwUAAAAFYXJ0SWQCAAAAAV8FAAAACmNhbGxlckFkZHIBAAAAD2tleUFydEV4cG9ydENpZAAAAAIAAAAKY2FsbGVyQWRkcgAAAAVhcnRJZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAPYXJ0X2V4cG9ydF9jaWRfBQAAAAVhcnRJZAIAAAABXwUAAAAKY2FsbGVyQWRkcgEAAAANa2V5QXJ0TWF4TWludAAAAAIAAAAKY2FsbGVyQWRkcgAAAAVhcnRJZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAMYXJ0X21heG1pbnRfBQAAAAVhcnRJZAIAAAABXwUAAAAKY2FsbGVyQWRkcgEAAAAMa2V5QXJ0U2lnbklEAAAAAgAAAApjYWxsZXJBZGRyAAAABWFydElkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAthcnRfc2lnbmlkXwUAAAAFYXJ0SWQCAAAAAV8FAAAACmNhbGxlckFkZHIBAAAADGtleUFydElzc3VlZAAAAAIAAAAKY2FsbGVyQWRkcgAAAAVhcnRJZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAALYXJ0X2lzc3VlZF8FAAAABWFydElkAgAAAAFfBQAAAApjYWxsZXJBZGRyAQAAAAxrZXlBcnRPblNhbGUAAAACAAAACmNhbGxlckFkZHIAAAAFYXJ0SWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAC2FydF9vbnNhbGVfBQAAAAVhcnRJZAIAAAABXwUAAAAKY2FsbGVyQWRkcgEAAAARa2V5QXJ0TGljZW5jZUhhc2gAAAACAAAACmNhbGxlckFkZHIAAAAFYXJ0SWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAEWFydF9saWNlbmNlX2hhc2hfBQAAAAVhcnRJZAIAAAABXwUAAAAKY2FsbGVyQWRkcgEAAAAQa2V5QXJ0TGljZW5jZUNpZAAAAAIAAAAKY2FsbGVyQWRkcgAAAAVhcnRJZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAQYXJ0X2xpY2VuY2VfY2lkXwUAAAAFYXJ0SWQCAAAAAV8FAAAACmNhbGxlckFkZHIBAAAACmtleUFydFRhZ3MAAAACAAAACmNhbGxlckFkZHIAAAAFYXJ0SWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACWFydF90YWdzXwUAAAAFYXJ0SWQCAAAAAV8FAAAACmNhbGxlckFkZHIBAAAACmtleUFydFR5cGUAAAACAAAACmNhbGxlckFkZHIAAAAFYXJ0SWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACWFydF90eXBlXwUAAAAFYXJ0SWQCAAAAAV8FAAAACmNhbGxlckFkZHIBAAAAEWtleUFydE93bmVyQnlIYXNoAAAAAQAAAApzaGEyNTZIYXNoCQABLAAAAAICAAAAEmFydF9vd25lcl9ieV9oYXNoXwUAAAAKc2hhMjU2SGFzaAEAAAAVa2V5QXJ0VHhpZEJ5SGFzaE93bmVyAAAAAgAAAApzaGEyNTZIYXNoAAAACmNhbGxlckFkZHIJAAEsAAAAAgIAAAAXYXJ0X3R4aWRfYnlfaGFzaF9vd25lcl8JAAJYAAAAAQkAC1QAAAABCQABmwAAAAEJAAEsAAAAAgUAAAAKc2hhMjU2SGFzaAUAAAAKY2FsbGVyQWRkcgAAAAcAAAABaQEAAAAMcmVzZXRTdG9yYWdlAAAAAAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABAgAAAEAxNDM0OTRmM2ZiZDJjZjMxOTYyNmY3ZGRjMjVkZTEzMzkxMGNiMTA4MDEyMWJjYTk2MzQ3MTg1YzljczI1YWEyBQAAAANuaWwAAAABaQEAAAAMcmVnaXN0ZXJVc2VyAAAABAAAAARuYW1lAAAAC2Rlc2NyaXB0aW9uAAAABXRodW1iAAAABnNvY2lhbAQAAAAKY2FsbGVyQWRkcgkABCUAAAABCQEAAAAUYWRkcmVzc0Zyb21QdWJsaWNLZXkAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkEAAAAC3VzZXJBbGxvd2VkCQEAAAANdmVyaWZ5QWRkcmVzcwAAAAEFAAAACmNhbGxlckFkZHIEAAAAAmlkCQACWAAAAAEIBQAAAAFpAAAADXRyYW5zYWN0aW9uSWQEAAAAB25ld1VzZXIJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAAEsAAAAAgIAAAAFdXNlcl8FAAAACmNhbGxlckFkZHIEAAAACXRpbWVzdGFtcAgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXADCQEAAAABIQAAAAEFAAAAC3VzZXJBbGxvd2VkCQAAAgAAAAECAAAATVlvdSBhcmUgbm93IGFsbG93ZWQgdG8gcmVnaXN0ZXIgeWV0LCBwbGVhc2UgY29udGFjdCB1cyBmaXJzdCB0byBnZXQgYXBwcm92ZWQuAwMJAAAAAAAAAgUAAAAEbmFtZQIAAAAABgkAAAAAAAACBQAAAAtkZXNjcmlwdGlvbgIAAAAACQAAAgAAAAECAAAAJE5hbWUgYW5kIGRlc2NyaXB0aW9uIGNhbm5vdCBiZSBlbXB0eQMJAABmAAAAAgkAATEAAAABBQAAAAtkZXNjcmlwdGlvbgAAAAAAAAACWAkAAAIAAAABAgAAACo2MDAgQ2hhcmFjdGVycyBtYXhpbXVtIGZvciB0aGUgZGVzY3JpcHRpb24DCQAAAAAAAAIFAAAAB25ld1VzZXICAAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAC2tleVVzZXJEYXRlAAAAAQUAAAAKY2FsbGVyQWRkcgUAAAAJdGltZXN0YW1wCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAtrZXlVc2VyQWRkcgAAAAEFAAAACmNhbGxlckFkZHIJAAEsAAAAAgkAASwAAAACBQAAAAJpZAIAAAABXwkAAaQAAAABCAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAALa2V5VXNlck5hbWUAAAABBQAAAApjYWxsZXJBZGRyBQAAAARuYW1lCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAtrZXlVc2VyRGVzYwAAAAEFAAAACmNhbGxlckFkZHIFAAAAC2Rlc2NyaXB0aW9uCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAA1rZXlVc2VyU29jaWFsAAAAAQUAAAAKY2FsbGVyQWRkcgUAAAAGc29jaWFsCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAxrZXlVc2VyVGh1bWIAAAABBQAAAApjYWxsZXJBZGRyBQAAAAV0aHVtYgkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgkBAAAAD2tleVVzZXJJc0FydGlzdAAAAAEFAAAACmNhbGxlckFkZHIHCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAA1rZXlVc2VyU3RhdHVzAAAAAQUAAAAKY2FsbGVyQWRkcgUAAAALdXNlckNyZWF0ZWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgIAAAAObGFzdF9pbnZva2VfaWQFAAAAAmlkBQAAAANuaWwJAAACAAAAAQIAAAA3VGhpcyB1c2VyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCwgdXNlIHVwZGF0ZVVzZXIgaW5zdGVhZAAAAAFpAQAAAAp1cGRhdGVVc2VyAAAABAAAAARuYW1lAAAAC2Rlc2NyaXB0aW9uAAAABXRodW1iAAAABnNvY2lhbAQAAAAKY2FsbGVyQWRkcgkABCUAAAABCQEAAAAUYWRkcmVzc0Zyb21QdWJsaWNLZXkAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkEAAAAC3VzZXJBbGxvd2VkCQEAAAANdmVyaWZ5QWRkcmVzcwAAAAEFAAAACmNhbGxlckFkZHIEAAAAAmlkCQACWAAAAAEIBQAAAAFpAAAADXRyYW5zYWN0aW9uSWQEAAAAB25ld1VzZXIJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAAEsAAAAAgIAAAAFdXNlcl8FAAAACmNhbGxlckFkZHIEAAAACXRpbWVzdGFtcAgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXADCQEAAAABIQAAAAEFAAAAC3VzZXJBbGxvd2VkCQAAAgAAAAECAAAAMVlvdSBhcmUgbm93IGFsbG93ZWQgdG8gdXBkYXRlIHlvdXIgaW5mb3MgYW55bW9yZS4DAwkAAAAAAAACBQAAAARuYW1lAgAAAAAGCQAAAAAAAAIFAAAAC2Rlc2NyaXB0aW9uAgAAAAAJAAACAAAAAQIAAAAkTmFtZSBhbmQgZGVzY3JpcHRpb24gY2Fubm90IGJlIGVtcHR5AwkAAGYAAAACCQABMQAAAAEFAAAAC2Rlc2NyaXB0aW9uAAAAAAAAAAJYCQAAAgAAAAECAAAAKjYwMCBDaGFyYWN0ZXJzIG1heGltdW0gZm9yIHRoZSBkZXNjcmlwdGlvbgMJAQAAAAIhPQAAAAIFAAAAB25ld1VzZXICAAAAAAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAALa2V5VXNlck5hbWUAAAABBQAAAApjYWxsZXJBZGRyBQAAAARuYW1lCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAtrZXlVc2VyRGVzYwAAAAEFAAAACmNhbGxlckFkZHIFAAAAC2Rlc2NyaXB0aW9uCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAA1rZXlVc2VyU29jaWFsAAAAAQUAAAAKY2FsbGVyQWRkcgUAAAAGc29jaWFsCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAxrZXlVc2VyVGh1bWIAAAABBQAAAApjYWxsZXJBZGRyBQAAAAV0aHVtYgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACAgAAAA5sYXN0X2ludm9rZV9pZAUAAAACaWQFAAAAA25pbAkAAAIAAAABAgAAACdQbGVhc2UgcmVnaXN0ZXIgZmlyc3Qgd2l0aCByZWdpc3RlclVzZXIAAAAGaW52b2tlAQAAAAphZGRBcnR3b3JrAAAADAAAAApzaGEyNTZIYXNoAAAABnNpZ25JRAAAAARuYW1lAAAAC2Rlc2NyaXB0aW9uAAAABHRhZ3MAAAAEdHlwZQAAAAdtYXhtaW50AAAACmNpZERpc3BsYXkAAAAMc2hhMjU2RXhwb3J0AAAACWNpZEV4cG9ydAAAAA1zaGEyNTZMaWNlbmNlAAAACmNpZExpY2VuY2UEAAAABWFydElkCQACWAAAAAEIBQAAAAZpbnZva2UAAAANdHJhbnNhY3Rpb25JZAQAAAANY2FsbGVyQWRkcmVzcwkAAlgAAAABCAgFAAAABmludm9rZQAAAAZjYWxsZXIAAAAFYnl0ZXMEAAAACmVudHJ5RXhpc3QJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAABVrZXlBcnRUeGlkQnlIYXNoT3duZXIAAAACBQAAAApzaGEyNTZIYXNoBQAAAA1jYWxsZXJBZGRyZXNzAwkBAAAAAiE9AAAAAgUAAAAKZW50cnlFeGlzdAIAAAAACQAAAgAAAAECAAAAKllvdSBhbHJlYWR5IGFkZGVkIHRoaXMgYXJ0d29yayBvbiBTaWduIEFydAQAAAAJaGFzaEV4aXN0CQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAARa2V5QXJ0T3duZXJCeUhhc2gAAAABBQAAAApzaGEyNTZIYXNoAwkBAAAAAiE9AAAAAgUAAAAJaGFzaEV4aXN0AgAAAAAJAAACAAAAAQIAAAAzVGhpcyBhcnR3b3JrIGhhc2ggaXMgYWxyZWFkeSByZWdpc3RlcmVkIG9uIFNpZ24gQXJ0BAAAAA9pc1NpZ25DZXJ0aWZpZWQJAQAAABRjaGVja1NpZ25DZXJ0aWZpY2F0ZQAAAAMFAAAABnNpZ25JRAUAAAANY2FsbGVyQWRkcmVzcwUAAAAKc2hhMjU2SGFzaAMJAQAAAAEhAAAAAQUAAAAPaXNTaWduQ2VydGlmaWVkCQAAAgAAAAECAAAAS1NpZ24gQ2VydGlmaWNhdGUgbm90IGZvdW5kIG9uIFNpZ24td2ViLmFwcCBzbWFydCBjb250cmFjdCBmb3IgdGhpcyBhZGRyZXNzLgMJAAAAAAAAAgkAATEAAAABBQAAAARuYW1lAAAAAAAAAAAACQAAAgAAAAECAAAAFVRpdGxlIGNhbm5vdCBiZSBlbXB0eQMJAABmAAAAAgkAATEAAAABBQAAAARuYW1lAAAAAAAAAABkCQAAAgAAAAECAAAAIzEwMCBDaGFyYWN0ZXJzIG1heGltdW0gZm9yIHRoZSBuYW1lAwkAAGYAAAACCQABMQAAAAEFAAAAC2Rlc2NyaXB0aW9uAAAAAAAAAAPoCQAAAgAAAAECAAAAKzEwMDAgQ2hhcmFjdGVycyBtYXhpbXVtIGZvciB0aGUgZGVzY3JpcHRpb24DCQAAAAAAAAIJAAExAAAAAQUAAAALZGVzY3JpcHRpb24AAAAAAAAAAAAJAAACAAAAAQIAAAAbRGVzY3JpcHRpb24gY2Fubm90IGJlIGVtcHR5BAAAAAh0YWdzTGlzdAkABLUAAAACBQAAAAR0YWdzAgAAAAEsAwkAAGYAAAACCQABkAAAAAEFAAAACHRhZ3NMaXN0AAAAAAAAAAAFCQAAAgAAAAECAAAAOFRhZ3Mgc2hvdWxkIGJlIG1heGltdW0gNSBzaW5nbGUgd29yZCBzZXBhcmF0ZWQgYnkgc3BhY2UuBAAAABB1c2VySXNSZWdpc3RlcmVkBAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABHRoaXMJAAEsAAAAAgIAAAAMdXNlcl9zdGF0dXNfBQAAAA1jYWxsZXJBZGRyZXNzAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAXMFAAAAByRtYXRjaDAFAAAAAXMFAAAAEHVzZXJVbnJlZ2lzdGVyZWQEAAAACXRpbWVzdGFtcAgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXADAwkBAAAACWlzRGVmaW5lZAAAAAEFAAAAEHVzZXJJc1JlZ2lzdGVyZWQJAAAAAAAAAgUAAAAQdXNlcklzUmVnaXN0ZXJlZAUAAAAQdXNlclVucmVnaXN0ZXJlZAcJAAACAAAAAQIAAAA4UGxlYXNlIHJlZ2lzdGVyIHRoaXMgYWNjb3VudCBmaXJzdCB3aXRoICJVc2VyIGluZm9zIiB0YWIDCQAAAAAAAAIFAAAAEHVzZXJJc1JlZ2lzdGVyZWQFAAAADXVzZXJTdXNwZW5kZWQJAAACAAAAAQIAAAAZWW91ciBhY2NvdW50IGlzIHN1c3BlbmRlZAMJAABmAAAAAgUAAAAHbWF4bWludAAAAAAAAAAACgkAAAIAAAABAgAAAB9NYXhpbXVtIDEwIGVkaXRpb25zIHBlciBhcnR3b3JrAwkBAAAAAiE9AAAAAgkAATEAAAABBQAAAApzaGEyNTZIYXNoAAAAAAAAAABACQAAAgAAAAECAAAAMUhhc2ggc2hvdWxkIGJlIHNoYTI1NiBzdHJpbmcgY29tcG9zZWQgb2YgNjQgY2hhci4JAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEWtleUFydE93bmVyQnlIYXNoAAAAAQUAAAAKc2hhMjU2SGFzaAUAAAANY2FsbGVyQWRkcmVzcwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAVa2V5QXJ0VHhpZEJ5SGFzaE93bmVyAAAAAgUAAAAKc2hhMjU2SGFzaAUAAAANY2FsbGVyQWRkcmVzcwUAAAAFYXJ0SWQJAARMAAAAAgkBAAAADEJvb2xlYW5FbnRyeQAAAAIJAQAAAA9rZXlVc2VySXNBcnRpc3QAAAABBQAAAA1jYWxsZXJBZGRyZXNzBgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAACmtleUFydERhdGUAAAACBQAAAA1jYWxsZXJBZGRyZXNzBQAAAAVhcnRJZAUAAAAJdGltZXN0YW1wCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAprZXlBcnROYW1lAAAAAgUAAAANY2FsbGVyQWRkcmVzcwUAAAAFYXJ0SWQFAAAABG5hbWUJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAACmtleUFydERlc2MAAAACBQAAAA1jYWxsZXJBZGRyZXNzBQAAAAVhcnRJZAUAAAALZGVzY3JpcHRpb24JAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEGtleUFydERpc3BsYXlDaWQAAAACBQAAAA1jYWxsZXJBZGRyZXNzBQAAAAVhcnRJZAUAAAAKY2lkRGlzcGxheQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAPa2V5QXJ0RXhwb3J0Q2lkAAAAAgUAAAANY2FsbGVyQWRkcmVzcwUAAAAFYXJ0SWQFAAAACWNpZEV4cG9ydAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAQa2V5QXJ0RXhwb3J0SGFzaAAAAAIFAAAADWNhbGxlckFkZHJlc3MFAAAABWFydElkBQAAAAxzaGEyNTZFeHBvcnQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEWtleUFydExpY2VuY2VIYXNoAAAAAgUAAAANY2FsbGVyQWRkcmVzcwUAAAAFYXJ0SWQFAAAADXNoYTI1NkxpY2VuY2UJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEGtleUFydExpY2VuY2VDaWQAAAACBQAAAA1jYWxsZXJBZGRyZXNzBQAAAAVhcnRJZAUAAAAKY2lkTGljZW5jZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAKa2V5QXJ0VHlwZQAAAAIFAAAADWNhbGxlckFkZHJlc3MFAAAABWFydElkBQAAAAR0eXBlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAprZXlBcnRUYWdzAAAAAgUAAAANY2FsbGVyQWRkcmVzcwUAAAAFYXJ0SWQFAAAABHRhZ3MJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAA1rZXlBcnRNYXhNaW50AAAAAgUAAAANY2FsbGVyQWRkcmVzcwUAAAAFYXJ0SWQFAAAAB21heG1pbnQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAADGtleUFydFNpZ25JRAAAAAIFAAAADWNhbGxlckFkZHJlc3MFAAAABWFydElkBQAAAAZzaWduSUQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAxrZXlBcnRJc3N1ZWQAAAACBQAAAA1jYWxsZXJBZGRyZXNzBQAAAAVhcnRJZAAAAAAAAAAAAAkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgkBAAAADGtleUFydE9uU2FsZQAAAAIFAAAADWNhbGxlckFkZHJlc3MFAAAABWFydElkBwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACAgAAAA5sYXN0X2ludm9rZV9pZAUAAAAFYXJ0SWQFAAAAA25pbAAAAAZpbnZva2UBAAAADXVwZGF0ZUFydHdvcmsAAAALAAAABHR4aWQAAAAEbmFtZQAAAAtkZXNjcmlwdGlvbgAAAAR0YWdzAAAABHR5cGUAAAAHbWF4bWludAAAAApjaWREaXNwbGF5AAAADHNoYTI1NkV4cG9ydAAAAAljaWRFeHBvcnQAAAANc2hhMjU2TGljZW5jZQAAAApjaWRMaWNlbmNlBAAAAAh1cGRhdGVJZAkAAlgAAAABCAUAAAAGaW52b2tlAAAADXRyYW5zYWN0aW9uSWQEAAAADWNhbGxlckFkZHJlc3MJAAJYAAAAAQgIBQAAAAZpbnZva2UAAAAGY2FsbGVyAAAABWJ5dGVzBAAAAAplbnRyeUV4aXN0CQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAlhcnRfbmFtZV8FAAAABHR4aWQCAAAAAV8FAAAADWNhbGxlckFkZHJlc3MDCQAAAAAAAAIFAAAACmVudHJ5RXhpc3QCAAAAAAkAAAIAAAABAgAAADFUaGlzIGVudHJ5IGRvZXNuJ3QgZXhpc3Qgb3IgeW91IGFyZSBub3QgdGhlIG93bmVyAwkAAAAAAAACCQABMQAAAAEFAAAABG5hbWUAAAAAAAAAAAAJAAACAAAAAQIAAAAVVGl0bGUgY2Fubm90IGJlIGVtcHR5AwkAAGYAAAACCQABMQAAAAEFAAAABG5hbWUAAAAAAAAAAGQJAAACAAAAAQIAAAAjMTAwIENoYXJhY3RlcnMgbWF4aW11bSBmb3IgdGhlIG5hbWUDCQAAZgAAAAIJAAExAAAAAQUAAAALZGVzY3JpcHRpb24AAAAAAAAAA+gJAAACAAAAAQIAAAArMTAwMCBDaGFyYWN0ZXJzIG1heGltdW0gZm9yIHRoZSBkZXNjcmlwdGlvbgMJAAAAAAAAAgkAATEAAAABBQAAAAtkZXNjcmlwdGlvbgAAAAAAAAAAAAkAAAIAAAABAgAAABtEZXNjcmlwdGlvbiBjYW5ub3QgYmUgZW1wdHkEAAAACHRhZ3NMaXN0CQAEtQAAAAIFAAAABHRhZ3MCAAAAASwDCQAAZgAAAAIJAAGQAAAAAQUAAAAIdGFnc0xpc3QAAAAAAAAAAAUJAAACAAAAAQIAAAA4VGFncyBzaG91bGQgYmUgbWF4aW11bSA1IHNpbmdsZSB3b3JkIHNlcGFyYXRlZCBieSBzcGFjZS4EAAAAEHVzZXJJc1JlZ2lzdGVyZWQEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAEdGhpcwkAASwAAAACAgAAAAx1c2VyX3N0YXR1c18FAAAADWNhbGxlckFkZHJlc3MDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABcwUAAAAHJG1hdGNoMAUAAAABcwUAAAAQdXNlclVucmVnaXN0ZXJlZAMDCQEAAAAJaXNEZWZpbmVkAAAAAQUAAAAQdXNlcklzUmVnaXN0ZXJlZAkAAAAAAAACBQAAABB1c2VySXNSZWdpc3RlcmVkBQAAABB1c2VyVW5yZWdpc3RlcmVkBwkAAAIAAAABAgAAADhQbGVhc2UgcmVnaXN0ZXIgdGhpcyBhY2NvdW50IGZpcnN0IHdpdGggIlVzZXIgaW5mb3MiIHRhYgMJAAAAAAAAAgUAAAAQdXNlcklzUmVnaXN0ZXJlZAUAAAANdXNlclN1c3BlbmRlZAkAAAIAAAABAgAAABlZb3VyIGFjY291bnQgaXMgc3VzcGVuZGVkAwkAAGYAAAACBQAAAAdtYXhtaW50AAAAAAAAAAAKCQAAAgAAAAECAAAAH01heGltdW0gMTAgZWRpdGlvbnMgcGVyIGFydHdvcmsJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAACmtleUFydE5hbWUAAAACBQAAAA1jYWxsZXJBZGRyZXNzBQAAAAR0eGlkBQAAAARuYW1lCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAprZXlBcnREZXNjAAAAAgUAAAANY2FsbGVyQWRkcmVzcwUAAAAEdHhpZAUAAAALZGVzY3JpcHRpb24JAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEGtleUFydERpc3BsYXlDaWQAAAACBQAAAA1jYWxsZXJBZGRyZXNzBQAAAAR0eGlkBQAAAApjaWREaXNwbGF5CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABBrZXlBcnRFeHBvcnRIYXNoAAAAAgUAAAANY2FsbGVyQWRkcmVzcwUAAAAEdHhpZAUAAAAMc2hhMjU2RXhwb3J0CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAA9rZXlBcnRFeHBvcnRDaWQAAAACBQAAAA1jYWxsZXJBZGRyZXNzBQAAAAR0eGlkBQAAAAljaWRFeHBvcnQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEWtleUFydExpY2VuY2VIYXNoAAAAAgUAAAANY2FsbGVyQWRkcmVzcwUAAAAEdHhpZAUAAAANc2hhMjU2TGljZW5jZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAQa2V5QXJ0TGljZW5jZUNpZAAAAAIFAAAADWNhbGxlckFkZHJlc3MFAAAABHR4aWQFAAAACmNpZExpY2VuY2UJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAACmtleUFydFR5cGUAAAACBQAAAA1jYWxsZXJBZGRyZXNzBQAAAAR0eGlkBQAAAAR0eXBlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAprZXlBcnRUYWdzAAAAAgUAAAANY2FsbGVyQWRkcmVzcwUAAAAEdHhpZAUAAAAEdGFncwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACAgAAAA5sYXN0X2ludm9rZV9pZAUAAAAIdXBkYXRlSWQFAAAAA25pbAAAAAZpbnZva2UBAAAAC3NlbGxBcnR3b3JrAAAAAgAAAARoYXNoAAAABXByaWNlBAAAAAJpZAkAAlgAAAABCAUAAAAGaW52b2tlAAAADXRyYW5zYWN0aW9uSWQEAAAADWNhbGxlckFkZHJlc3MJAAJYAAAAAQgIBQAAAAZpbnZva2UAAAAGY2FsbGVyAAAABWJ5dGVzBAAAAAllbnRyeURhdGUIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wBAAAAAdlbnRyeUlECQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQABLAAAAAIJAAEsAAAAAgUAAAAEaGFzaAIAAAABXwUAAAANY2FsbGVyQWRkcmVzcwMJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEFAAAAB2VudHJ5SUQJAAACAAAAAQIAAAAyVGhpcyBhcnR3b3JrIGRvZXNuJ3QgZXhpdCBvciB5b3UgYXJlIG5vdCB0aGUgb3duZXIEAAAAEHVzZXJJc1JlZ2lzdGVyZWQJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAAEsAAAAAgIAAAAMdXNl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", "height": 1162132, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8Vr7VuoUW8bxgcNgjGCnSWqXiAT5fmEGsDo5XfpHTce Next: xAPcJQueKZTDeoQ9PZxgpzUrFSWiaJvJPCqUS4YZdNV Diff:
OldNewDifferences
7171 case b: Boolean =>
7272 b
7373 case _ =>
74- throw("You are not white listed, please contact first.")
74+ throw("You are not allowed, please contact us first.")
7575 }
76+
77+
78+func verifyStatus (addr) = match getString(userWhitelist, ("status_" + addr)) {
79+ case b: String =>
80+ b
81+ case _ =>
82+ throw("You are not white listed, please contact first.")
83+}
7684
7785
7886 func keyUserAddr (callerAddr) = ("user_" + callerAddr)
168176 else if ((size(description) > 600))
169177 then throw("600 Characters maximum for the description")
170178 else if ((newUser == ""))
171- then [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), BooleanEntry(keyUserIsArtist(callerAddr), false), StringEntry(keyUserStatus(callerAddr), userCreated)]
179+ then [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), BooleanEntry(keyUserIsArtist(callerAddr), false), StringEntry(keyUserStatus(callerAddr), userCreated), StringEntry("last_invoke_id", id)]
172180 else throw("This user is already registered, use updateUser instead")
173181 }
174182
190198 else if ((size(description) > 600))
191199 then throw("600 Characters maximum for the description")
192200 else if ((newUser != ""))
193- then [StringEntry(keyUserName(callerAddr), name), StringEntry(keyUserDesc(callerAddr), description), StringEntry(keyUserSocial(callerAddr), social), StringEntry(keyUserThumb(callerAddr), thumb)]
201+ then [StringEntry(keyUserName(callerAddr), name), StringEntry(keyUserDesc(callerAddr), description), StringEntry(keyUserSocial(callerAddr), social), StringEntry(keyUserThumb(callerAddr), thumb), StringEntry("last_invoke_id", id)]
194202 else throw("Please register first with registerUser")
195203 }
196204
241249 then throw("Maximum 10 editions per artwork")
242250 else if ((size(sha256Hash) != 64))
243251 then throw("Hash should be sha256 string composed of 64 char.")
244- else [StringEntry(keyArtOwnerByHash(sha256Hash), callerAddress), StringEntry(keyArtTxidByHashOwner(sha256Hash, callerAddress), artId), BooleanEntry(keyUserIsArtist(callerAddress), true), 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)]
252+ else [StringEntry(keyArtOwnerByHash(sha256Hash), callerAddress), StringEntry(keyArtTxidByHashOwner(sha256Hash, callerAddress), artId), BooleanEntry(keyUserIsArtist(callerAddress), true), 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("last_invoke_id", artId)]
245253 }
246254 }
247255 }
252260
253261 @Callable(invoke)
254262 func updateArtwork (txid,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = {
263+ let updateId = toBase58String(invoke.transactionId)
255264 let callerAddress = toBase58String(invoke.caller.bytes)
256265 let entryExist = getStringByKey(((("art_name_" + txid) + "_") + callerAddress))
257266 if ((entryExist == ""))
283292 then throw("Your account is suspended")
284293 else if ((maxmint > 10))
285294 then throw("Maximum 10 editions per artwork")
286- else [StringEntry(keyArtName(callerAddress, txid), name), StringEntry(keyArtDesc(callerAddress, txid), description), StringEntry(keyArtDisplayCid(callerAddress, txid), cidDisplay), StringEntry(keyArtExportHash(callerAddress, txid), sha256Export), StringEntry(keyArtExportCid(callerAddress, txid), cidExport), StringEntry(keyArtLicenceHash(callerAddress, txid), sha256Licence), StringEntry(keyArtLicenceCid(callerAddress, txid), cidLicence), StringEntry(keyArtType(callerAddress, txid), type), StringEntry(keyArtTags(callerAddress, txid), tags)]
295+ else [StringEntry(keyArtName(callerAddress, txid), name), StringEntry(keyArtDesc(callerAddress, txid), description), StringEntry(keyArtDisplayCid(callerAddress, txid), cidDisplay), StringEntry(keyArtExportHash(callerAddress, txid), sha256Export), StringEntry(keyArtExportCid(callerAddress, txid), cidExport), StringEntry(keyArtLicenceHash(callerAddress, txid), sha256Licence), StringEntry(keyArtLicenceCid(callerAddress, txid), cidLicence), StringEntry(keyArtType(callerAddress, txid), type), StringEntry(keyArtTags(callerAddress, txid), tags), StringEntry("last_invoke_id", updateId)]
287296 }
288297 }
289298 }
317326 let sellStatus = if ((price > 0))
318327 then true
319328 else false
320-[BooleanEntry(((("art_onsale_" + entryID) + "_") + callerAddress), sellStatus), IntegerEntry(((("art_price_" + entryID) + "_") + callerAddress), price)]
329+[BooleanEntry(((("art_onsale_" + entryID) + "_") + callerAddress), sellStatus), IntegerEntry(((("art_price_" + entryID) + "_") + callerAddress), price), StringEntry("last_invoke_id", id)]
321330 }
322331 }
323332 }
363372 let sellStatus = if ((newAmountSold == maxCanSell))
364373 then false
365374 else true
366-[IntegerEntry(((("art_issued_" + entryID) + "_") + issuer), newAmountSold), StringEntry(((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + entryID) + "_") + issuer), ((((((callerAddress + "_") + toString(entryDate)) + "_") + id) + "_") + toString(artworkPrice))), IntegerEntry("total_nft_issued", (totalNFT + 1)), issueNFT, BooleanEntry(((("art_onsale_" + entryID) + "_") + callerAddress), sellStatus), ScriptTransfer(Address(fromBase58String(issuer)), amount, assetId), ScriptTransfer(invoke.caller, 1, idNFT)]
375+[IntegerEntry(((("art_issued_" + entryID) + "_") + issuer), newAmountSold), StringEntry(((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + entryID) + "_") + issuer), ((((((callerAddress + "_") + toString(entryDate)) + "_") + id) + "_") + toString(artworkPrice))), IntegerEntry("total_nft_issued", (totalNFT + 1)), StringEntry("last_invoke_id", id), issueNFT, BooleanEntry(((("art_onsale_" + entryID) + "_") + callerAddress), sellStatus), ScriptTransfer(Address(fromBase58String(issuer)), amount, assetId), ScriptTransfer(invoke.caller, 1, idNFT)]
367376 }
368377 }
369378 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let storageVerifier = value(addressFromString("3N2s5RtaHPBenCsx2ECcoFRbYHx3noZhXW1"))
55
66 let userWhitelist = value(addressFromString("3MpJEb36ZQyk1haKnocayJcYM31cNPXPiK3"))
77
88 let signVerifier = value(addressFromString("3NC28hSivrmsTUXaYD1x6L362J4ZpUnoTdB"))
99
1010 let acceptedToken = base58'Gf9t8FA4H3ssoZPCwrg3KwUFCci8zuUFP9ssRsUY3s6a'
1111
1212 let usdnID = "3KFXBGGLCjA5Z2DuW4Dq9fDDrHjJJP1ZEkaoajSzuKsC"
1313
1414 let VERIFIEDONLY = true
1515
1616 let userCreated = "CREATED"
1717
1818 let userVerified = "VERIFIED"
1919
2020 let userSuspended = "SUSPENDED"
2121
2222 let userUnregistered = "UNREGISTERED"
2323
2424 let onSale = "ON_SALE"
2525
2626 let sold = "SOLD"
2727
2828 let canceled = "CANCELED"
2929
3030 func getStringByKey (key) = match getString(this, key) {
3131 case a: String =>
3232 a
3333 case _ =>
3434 ""
3535 }
3636
3737
3838 func getIntegerByKey (key) = match getInteger(this, key) {
3939 case i: Int =>
4040 i
4141 case _ =>
4242 0
4343 }
4444
4545
4646 func checkSignCertificate (signID,Owner,sha256Hash) = match getString(signVerifier, ((("data_fc_" + signID) + "_") + Owner)) {
4747 case a: String =>
4848 if (contains(a, sha256Hash))
4949 then true
5050 else false
5151 case _ =>
5252 false
5353 }
5454
5555
5656 func validateNFTs (accumulator,id) = {
5757 let assetDetails = value(assetInfo(fromBase58String(id)))
5858 if (if (if ((assetDetails.quantity != 1))
5959 then true
6060 else (assetDetails.decimals != 0))
6161 then true
6262 else (assetDetails.reissuable != false))
6363 then (accumulator + 0)
6464 else (accumulator + 1)
6565 }
6666
6767
6868 func verifyAddress (addr) = if (!(VERIFIEDONLY))
6969 then true
7070 else match getBoolean(userWhitelist, addr) {
7171 case b: Boolean =>
7272 b
7373 case _ =>
74- throw("You are not white listed, please contact first.")
74+ throw("You are not allowed, please contact us first.")
7575 }
76+
77+
78+func verifyStatus (addr) = match getString(userWhitelist, ("status_" + addr)) {
79+ case b: String =>
80+ b
81+ case _ =>
82+ throw("You are not white listed, please contact first.")
83+}
7684
7785
7886 func keyUserAddr (callerAddr) = ("user_" + callerAddr)
7987
8088
8189 func keyUserName (callerAddr) = ("user_name_" + callerAddr)
8290
8391
8492 func keyUserDesc (callerAddr) = ("user_desc_" + callerAddr)
8593
8694
8795 func keyUserSocial (callerAddr) = ("user_social_" + callerAddr)
8896
8997
9098 func keyUserThumb (callerAddr) = ("user_thumb_" + callerAddr)
9199
92100
93101 func keyUserIsArtist (callerAddr) = ("user_isartist_" + callerAddr)
94102
95103
96104 func keyUserStatus (callerAddr) = ("user_status_" + callerAddr)
97105
98106
99107 func keyUserDate (callerAddr) = ("user_date_" + callerAddr)
100108
101109
102110 func keyArtDate (callerAddr,artId) = ((("art_date_" + artId) + "_") + callerAddr)
103111
104112
105113 func keyArtName (callerAddr,artId) = ((("art_name_" + artId) + "_") + callerAddr)
106114
107115
108116 func keyArtDesc (callerAddr,artId) = ((("art_desc_" + artId) + "_") + callerAddr)
109117
110118
111119 func keyArtDisplayCid (callerAddr,artId) = ((("art_display_cid_" + artId) + "_") + callerAddr)
112120
113121
114122 func keyArtExportHash (callerAddr,artId) = ((("art_export_hash_" + artId) + "_") + callerAddr)
115123
116124
117125 func keyArtExportCid (callerAddr,artId) = ((("art_export_cid_" + artId) + "_") + callerAddr)
118126
119127
120128 func keyArtMaxMint (callerAddr,artId) = ((("art_maxmint_" + artId) + "_") + callerAddr)
121129
122130
123131 func keyArtSignID (callerAddr,artId) = ((("art_signid_" + artId) + "_") + callerAddr)
124132
125133
126134 func keyArtIssued (callerAddr,artId) = ((("art_issued_" + artId) + "_") + callerAddr)
127135
128136
129137 func keyArtOnSale (callerAddr,artId) = ((("art_onsale_" + artId) + "_") + callerAddr)
130138
131139
132140 func keyArtLicenceHash (callerAddr,artId) = ((("art_licence_hash_" + artId) + "_") + callerAddr)
133141
134142
135143 func keyArtLicenceCid (callerAddr,artId) = ((("art_licence_cid_" + artId) + "_") + callerAddr)
136144
137145
138146 func keyArtTags (callerAddr,artId) = ((("art_tags_" + artId) + "_") + callerAddr)
139147
140148
141149 func keyArtType (callerAddr,artId) = ((("art_type_" + artId) + "_") + callerAddr)
142150
143151
144152 func keyArtOwnerByHash (sha256Hash) = ("art_owner_by_hash_" + sha256Hash)
145153
146154
147155 func keyArtTxidByHashOwner (sha256Hash,callerAddr) = ("art_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + callerAddr)))))
148156
149157
150158 @Callable(i)
151159 func resetStorage () = [DeleteEntry("143494f3fbd2cf319626f7ddc25de133910cb1080121bca96347185c9cs25aa2")]
152160
153161
154162
155163 @Callable(i)
156164 func registerUser (name,description,thumb,social) = {
157165 let callerAddr = toString(addressFromPublicKey(i.callerPublicKey))
158166 let userAllowed = verifyAddress(callerAddr)
159167 let id = toBase58String(i.transactionId)
160168 let newUser = getStringByKey(("user_" + callerAddr))
161169 let timestamp = lastBlock.timestamp
162170 if (!(userAllowed))
163171 then throw("You are now allowed to register yet, please contact us first to get approved.")
164172 else if (if ((name == ""))
165173 then true
166174 else (description == ""))
167175 then throw("Name and description cannot be empty")
168176 else if ((size(description) > 600))
169177 then throw("600 Characters maximum for the description")
170178 else if ((newUser == ""))
171- then [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), BooleanEntry(keyUserIsArtist(callerAddr), false), StringEntry(keyUserStatus(callerAddr), userCreated)]
179+ then [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), BooleanEntry(keyUserIsArtist(callerAddr), false), StringEntry(keyUserStatus(callerAddr), userCreated), StringEntry("last_invoke_id", id)]
172180 else throw("This user is already registered, use updateUser instead")
173181 }
174182
175183
176184
177185 @Callable(i)
178186 func updateUser (name,description,thumb,social) = {
179187 let callerAddr = toString(addressFromPublicKey(i.callerPublicKey))
180188 let userAllowed = verifyAddress(callerAddr)
181189 let id = toBase58String(i.transactionId)
182190 let newUser = getStringByKey(("user_" + callerAddr))
183191 let timestamp = lastBlock.timestamp
184192 if (!(userAllowed))
185193 then throw("You are now allowed to update your infos anymore.")
186194 else if (if ((name == ""))
187195 then true
188196 else (description == ""))
189197 then throw("Name and description cannot be empty")
190198 else if ((size(description) > 600))
191199 then throw("600 Characters maximum for the description")
192200 else if ((newUser != ""))
193- then [StringEntry(keyUserName(callerAddr), name), StringEntry(keyUserDesc(callerAddr), description), StringEntry(keyUserSocial(callerAddr), social), StringEntry(keyUserThumb(callerAddr), thumb)]
201+ then [StringEntry(keyUserName(callerAddr), name), StringEntry(keyUserDesc(callerAddr), description), StringEntry(keyUserSocial(callerAddr), social), StringEntry(keyUserThumb(callerAddr), thumb), StringEntry("last_invoke_id", id)]
194202 else throw("Please register first with registerUser")
195203 }
196204
197205
198206
199207 @Callable(invoke)
200208 func addArtwork (sha256Hash,signID,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = {
201209 let artId = toBase58String(invoke.transactionId)
202210 let callerAddress = toBase58String(invoke.caller.bytes)
203211 let entryExist = getStringByKey(keyArtTxidByHashOwner(sha256Hash, callerAddress))
204212 if ((entryExist != ""))
205213 then throw("You already added this artwork on Sign Art")
206214 else {
207215 let hashExist = getStringByKey(keyArtOwnerByHash(sha256Hash))
208216 if ((hashExist != ""))
209217 then throw("This artwork hash is already registered on Sign Art")
210218 else {
211219 let isSignCertified = checkSignCertificate(signID, callerAddress, sha256Hash)
212220 if (!(isSignCertified))
213221 then throw("Sign Certificate not found on Sign-web.app smart contract for this address.")
214222 else if ((size(name) == 0))
215223 then throw("Title cannot be empty")
216224 else if ((size(name) > 100))
217225 then throw("100 Characters maximum for the name")
218226 else if ((size(description) > 1000))
219227 then throw("1000 Characters maximum for the description")
220228 else if ((size(description) == 0))
221229 then throw("Description cannot be empty")
222230 else {
223231 let tagsList = split(tags, ",")
224232 if ((size(tagsList) > 5))
225233 then throw("Tags should be maximum 5 single word separated by space.")
226234 else {
227235 let userIsRegistered = match getString(this, ("user_status_" + callerAddress)) {
228236 case s: String =>
229237 s
230238 case _ =>
231239 userUnregistered
232240 }
233241 let timestamp = lastBlock.timestamp
234242 if (if (isDefined(userIsRegistered))
235243 then (userIsRegistered == userUnregistered)
236244 else false)
237245 then throw("Please register this account first with \"User infos\" tab")
238246 else if ((userIsRegistered == userSuspended))
239247 then throw("Your account is suspended")
240248 else if ((maxmint > 10))
241249 then throw("Maximum 10 editions per artwork")
242250 else if ((size(sha256Hash) != 64))
243251 then throw("Hash should be sha256 string composed of 64 char.")
244- else [StringEntry(keyArtOwnerByHash(sha256Hash), callerAddress), StringEntry(keyArtTxidByHashOwner(sha256Hash, callerAddress), artId), BooleanEntry(keyUserIsArtist(callerAddress), true), 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)]
252+ else [StringEntry(keyArtOwnerByHash(sha256Hash), callerAddress), StringEntry(keyArtTxidByHashOwner(sha256Hash, callerAddress), artId), BooleanEntry(keyUserIsArtist(callerAddress), true), 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("last_invoke_id", artId)]
245253 }
246254 }
247255 }
248256 }
249257 }
250258
251259
252260
253261 @Callable(invoke)
254262 func updateArtwork (txid,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = {
263+ let updateId = toBase58String(invoke.transactionId)
255264 let callerAddress = toBase58String(invoke.caller.bytes)
256265 let entryExist = getStringByKey(((("art_name_" + txid) + "_") + callerAddress))
257266 if ((entryExist == ""))
258267 then throw("This entry doesn't exist or you are not the owner")
259268 else if ((size(name) == 0))
260269 then throw("Title cannot be empty")
261270 else if ((size(name) > 100))
262271 then throw("100 Characters maximum for the name")
263272 else if ((size(description) > 1000))
264273 then throw("1000 Characters maximum for the description")
265274 else if ((size(description) == 0))
266275 then throw("Description cannot be empty")
267276 else {
268277 let tagsList = split(tags, ",")
269278 if ((size(tagsList) > 5))
270279 then throw("Tags should be maximum 5 single word separated by space.")
271280 else {
272281 let userIsRegistered = match getString(this, ("user_status_" + callerAddress)) {
273282 case s: String =>
274283 s
275284 case _ =>
276285 userUnregistered
277286 }
278287 if (if (isDefined(userIsRegistered))
279288 then (userIsRegistered == userUnregistered)
280289 else false)
281290 then throw("Please register this account first with \"User infos\" tab")
282291 else if ((userIsRegistered == userSuspended))
283292 then throw("Your account is suspended")
284293 else if ((maxmint > 10))
285294 then throw("Maximum 10 editions per artwork")
286- else [StringEntry(keyArtName(callerAddress, txid), name), StringEntry(keyArtDesc(callerAddress, txid), description), StringEntry(keyArtDisplayCid(callerAddress, txid), cidDisplay), StringEntry(keyArtExportHash(callerAddress, txid), sha256Export), StringEntry(keyArtExportCid(callerAddress, txid), cidExport), StringEntry(keyArtLicenceHash(callerAddress, txid), sha256Licence), StringEntry(keyArtLicenceCid(callerAddress, txid), cidLicence), StringEntry(keyArtType(callerAddress, txid), type), StringEntry(keyArtTags(callerAddress, txid), tags)]
295+ else [StringEntry(keyArtName(callerAddress, txid), name), StringEntry(keyArtDesc(callerAddress, txid), description), StringEntry(keyArtDisplayCid(callerAddress, txid), cidDisplay), StringEntry(keyArtExportHash(callerAddress, txid), sha256Export), StringEntry(keyArtExportCid(callerAddress, txid), cidExport), StringEntry(keyArtLicenceHash(callerAddress, txid), sha256Licence), StringEntry(keyArtLicenceCid(callerAddress, txid), cidLicence), StringEntry(keyArtType(callerAddress, txid), type), StringEntry(keyArtTags(callerAddress, txid), tags), StringEntry("last_invoke_id", updateId)]
287296 }
288297 }
289298 }
290299
291300
292301
293302 @Callable(invoke)
294303 func sellArtwork (hash,price) = {
295304 let id = toBase58String(invoke.transactionId)
296305 let callerAddress = toBase58String(invoke.caller.bytes)
297306 let entryDate = lastBlock.timestamp
298307 let entryID = getStringByKey(((hash + "_") + callerAddress))
299308 if (!(isDefined(entryID)))
300309 then throw("This artwork doesn't exit or you are not the owner")
301310 else {
302311 let userIsRegistered = getStringByKey(("user_status_" + callerAddress))
303312 if ((userIsRegistered == ""))
304313 then throw("Please register this account first")
305314 else {
306315 let amountSold = getIntegerByKey(((("art_issued_" + entryID) + "_") + callerAddress))
307316 let maxCanSell = getIntegerByKey(((("art_maxmint_" + entryID) + "_") + callerAddress))
308317 if ((amountSold == maxCanSell))
309318 then throw("You reached the max edition allowed to sell for this edition.")
310319 else if ((userIsRegistered == userSuspended))
311320 then throw("Your account is suspended")
312321 else if (!(isDefined(entryID)))
313322 then throw("This artwork desn't exist")
314323 else if ((size(hash) != 64))
315324 then throw("This hash is incorrect.")
316325 else {
317326 let sellStatus = if ((price > 0))
318327 then true
319328 else false
320-[BooleanEntry(((("art_onsale_" + entryID) + "_") + callerAddress), sellStatus), IntegerEntry(((("art_price_" + entryID) + "_") + callerAddress), price)]
329+[BooleanEntry(((("art_onsale_" + entryID) + "_") + callerAddress), sellStatus), IntegerEntry(((("art_price_" + entryID) + "_") + callerAddress), price), StringEntry("last_invoke_id", id)]
321330 }
322331 }
323332 }
324333 }
325334
326335
327336
328337 @Callable(invoke)
329338 func buyArtwork (hash,issuer) = {
330339 let id = toBase58String(invoke.transactionId)
331340 let callerAddress = toBase58String(invoke.caller.bytes)
332341 let totalNFT = getIntegerByKey("total_nft_issued")
333342 let entryID = getStringByKey(((hash + "_") + issuer))
334343 if ((entryID == ""))
335344 then throw("This artwork doesn't exit or you are not the owner")
336345 else {
337346 let userIsRegistered = getStringByKey(("user_status_" + callerAddress))
338347 if (!(isDefined(userIsRegistered)))
339348 then throw("Please register this account first")
340349 else {
341350 let alreadySoldList = getStringByKey(((("art_sold_" + entryID) + "_") + issuer))
342351 let amountSold = getIntegerByKey(((("art_issued_" + entryID) + "_") + issuer))
343352 let artworkPrice = getIntegerByKey(((("art_price_" + entryID) + "_") + issuer))
344353 if ((artworkPrice == 0))
345354 then throw("This artwork is not for sell")
346355 else {
347356 let maxCanSell = getIntegerByKey(((("art_maxmint_" + entryID) + "_") + issuer))
348357 let payment = value(invoke.payments[0])
349358 let amount = value(payment.amount)
350359 let assetId = if (isDefined(payment.assetId))
351360 then throw("Only Waves token accepted at the moment")
352361 else unit
353362 if ((amountSold == maxCanSell))
354363 then throw("Cannot buy this artwork anymore")
355364 else if ((artworkPrice != amount))
356365 then throw("Payment don't match seller price")
357366 else {
358367 let newAmountSold = (amountSold + 1)
359368 let entryDate = lastBlock.timestamp
360369 let issueMeta = (((((((((((((("{\"version\": 1,\"artID\": \"" + entryID) + "\",\"maxIssuable\": \"") + toString(maxCanSell)) + "\",\"signID\": \"SA_") + toString((totalNFT + 1))) + "\", \"creator\": \"") + issuer) + "\", \"issue\": \"") + toString(newAmountSold)) + "/") + toString(maxCanSell)) + "\", \"hash\": ") + hash) + "}")
361370 let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
362371 let idNFT = calculateAssetId(issueNFT)
363372 let sellStatus = if ((newAmountSold == maxCanSell))
364373 then false
365374 else true
366-[IntegerEntry(((("art_issued_" + entryID) + "_") + issuer), newAmountSold), StringEntry(((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + entryID) + "_") + issuer), ((((((callerAddress + "_") + toString(entryDate)) + "_") + id) + "_") + toString(artworkPrice))), IntegerEntry("total_nft_issued", (totalNFT + 1)), issueNFT, BooleanEntry(((("art_onsale_" + entryID) + "_") + callerAddress), sellStatus), ScriptTransfer(Address(fromBase58String(issuer)), amount, assetId), ScriptTransfer(invoke.caller, 1, idNFT)]
375+[IntegerEntry(((("art_issued_" + entryID) + "_") + issuer), newAmountSold), StringEntry(((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + entryID) + "_") + issuer), ((((((callerAddress + "_") + toString(entryDate)) + "_") + id) + "_") + toString(artworkPrice))), IntegerEntry("total_nft_issued", (totalNFT + 1)), StringEntry("last_invoke_id", id), issueNFT, BooleanEntry(((("art_onsale_" + entryID) + "_") + callerAddress), sellStatus), ScriptTransfer(Address(fromBase58String(issuer)), amount, assetId), ScriptTransfer(invoke.caller, 1, idNFT)]
367376 }
368377 }
369378 }
370379 }
371380 }
372381
373382

github/deemru/w8io/169f3d6 
74.47 ms