tx · 5gMK6KRbNrKTgwPe7SiYQVaUUa2GZiQcMpQWckSfytkc

3PG2vMhK5CPqsCDodvLGzQ84QkoHXCJ3oNP:  -0.14000000 Waves

2020.04.16 13:41 [2020162] smart account 3PG2vMhK5CPqsCDodvLGzQ84QkoHXCJ3oNP > SELF 0.00000000 Waves

{ "type": 13, "id": "5gMK6KRbNrKTgwPe7SiYQVaUUa2GZiQcMpQWckSfytkc", "fee": 14000000, "feeAssetId": null, "timestamp": 1587032285548, "version": 1, "sender": "3PG2vMhK5CPqsCDodvLGzQ84QkoHXCJ3oNP", "senderPublicKey": "5RM3w4ysmDbtgfswnVNPx7DQkNwVAG3RoxNFHgt6ToNU", "proofs": [ "2TALuS96Ayqq8WGHUpXUwdkfms1qxuJNKJEwUAumKF26bKNoUSUwGXVpnABRYvcNprY6Qtn5Xp8aeSSjuDHfeRqb", "QY9H3ceZ9wHpepanD6J7mesHXRf8ggYtYSP2rG7Z5FWVDZzoS7xRXHuQrAnEURcANHq95cxyU2F3YryYPcTzVWe", "3zBc9bhXxF7SkvC59w6iKbM9zs1uBRoT9gv8TwUQnEJNfESss539NRzUDJ5JQ9TpdqpvA2VYzWTfEEa9sr9AwFpd" ], "script": "base64:AAIDAAAAAAAAAA8IARIECgIBCBIDCgEIEgAAAAA2AQAAAA5nZXROdW1iZXJCeUtleQAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEGgAAAAIFAAAABHRoaXMFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAAAAAAAAAAAAAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAgAAAAABAAAAFmdldEJvb2xCeUFkZHJlc3NBbmRLZXkAAAACAAAAB2FkZHJlc3MAAAADa2V5BAAAAAckbWF0Y2gwCQAEGwAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAHQm9vbGVhbgQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQcBAAAAGGdldFN0cmluZ0J5QWRkcmVzc0FuZEtleQAAAAIAAAAHYWRkcmVzcwAAAANrZXkEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWECAAAAAAEAAAAYZ2V0TnVtYmVyQnlBZGRyZXNzQW5kS2V5AAAAAgAAAAdhZGRyZXNzAAAAA2tleQQAAAAHJG1hdGNoMAkABBoAAAACBQAAAAdhZGRyZXNzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQAAAAAAAAAAAAAAAAAHV0FWRUxFVAAAAAAABfXhAAAAAAAFUEFVTEkAAAAAAAAPQkAAAAAADU1JTk9SREVSVE9UQUwJAABoAAAAAgAAAAAAAAAACgUAAAAHV0FWRUxFVAAAAAAGTUFYUk9JAAAAAAAAAABfAAAAAAhDQU5DRUxFRAIAAAAIY2FuY2VsZWQAAAAAA05FVwIAAAADbmV3AAAAAAZGSUxMRUQCAAAABmZpbGxlZAAAAAATTmV1dHJpbm9Db250cmFjdEtleQIAAAARbmV1dHJpbm9fY29udHJhY3QAAAAACFByaWNlS2V5AgAAAAVwcmljZQAAAAAOQm9uZEFzc2V0SWRLZXkCAAAADWJvbmRfYXNzZXRfaWQAAAAAEk5ldXRyaW5vQXNzZXRJZEtleQIAAAARbmV1dHJpbm9fYXNzZXRfaWQAAAAAEkNvbnRyb2xDb250cmFjdEtleQIAAAAQY29udHJvbF9jb250cmFjdAAAAAARQmFsYW5jZUxvY2tlZGtLZXkCAAAADWJhbGFuY2VfbG9ja18AAAAAFVdhdmVzTG9ja2VkQmFsYW5jZUtleQkAASwAAAACBQAAABFCYWxhbmNlTG9ja2Vka0tleQIAAAAFd2F2ZXMAAAAAGE5ldXRyaW5vTG9ja2VkQmFsYW5jZUtleQkAASwAAAACBQAAABFCYWxhbmNlTG9ja2Vka0tleQIAAAAIbmV1dHJpbm8AAAAAFkxpcXVpZGF0aW9uQ29udHJhY3RLZXkCAAAAFGxpcXVpZGF0aW9uX2NvbnRyYWN0AAAAAA1GaXJzdE9yZGVyS2V5AgAAAAtvcmRlcl9maXJzdAEAAAASZ2V0Um9pQnlPcmRlcklkS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAAEGRlYnVnX29yZGVyX3JvaV8FAAAAB29yZGVySWQBAAAAEGdldE9yZGVyUHJpY2VLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgIAAAAMb3JkZXJfcHJpY2VfBQAAAAdvcmRlcklkAQAAABBnZXRPcmRlclRvdGFsS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAADG9yZGVyX3RvdGFsXwUAAAAHb3JkZXJJZAEAAAAQZ2V0T3JkZXJPd25lcktleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAAAxvcmRlcl9vd25lcl8FAAAAB29yZGVySWQBAAAAEWdldE9yZGVySGVpZ2h0S2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAADW9yZGVyX2hlaWdodF8FAAAAB29yZGVySWQBAAAAEWdldE9yZGVyU3RhdHVzS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAADW9yZGVyX3N0YXR1c18FAAAAB29yZGVySWQBAAAAFmdldE9yZGVyRmlsbGVkVG90YWxLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgIAAAATb3JkZXJfZmlsbGVkX3RvdGFsXwUAAAAHb3JkZXJJZAEAAAAPZ2V0UHJldk9yZGVyS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAAC29yZGVyX3ByZXZfBQAAAAdvcmRlcklkAQAAAA9nZXROZXh0T3JkZXJLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgIAAAALb3JkZXJfbmV4dF8FAAAAB29yZGVySWQBAAAAFmNvbnZlcnROZXV0cmlub1RvV2F2ZXMAAAACAAAABmFtb3VudAAAAAVwcmljZQkAAGsAAAADCQAAawAAAAMFAAAABmFtb3VudAAAAAAAAAAAZAUAAAAFcHJpY2UFAAAAB1dBVkVMRVQFAAAABVBBVUxJAQAAABZjb252ZXJ0V2F2ZXNUb05ldXRyaW5vAAAAAgAAAAZhbW91bnQAAAAFcHJpY2UJAABrAAAAAwkAAGsAAAADBQAAAAZhbW91bnQFAAAABXByaWNlAAAAAAAAAABkBQAAAAVQQVVMSQUAAAAHV0FWRUxFVAEAAAASY29udmVydFdhdmVzVG9Cb25kAAAAAgAAAAZhbW91bnQAAAAFcHJpY2UJAQAAABZjb252ZXJ0V2F2ZXNUb05ldXRyaW5vAAAAAgUAAAAGYW1vdW50BQAAAAVwcmljZQEAAAASY29udmVydEJvbmRUb1dhdmVzAAAAAgAAAAZhbW91bnQAAAAFcHJpY2UJAQAAABZjb252ZXJ0TmV1dHJpbm9Ub1dhdmVzAAAAAgUAAAAGYW1vdW50BQAAAAVwcmljZQAAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABAgAAACMzUEM5QmZSd0pXV2l3OUFSRUUyQjNlV3pDa3MzQ1l0ZzR5bwAAAAAPY29udHJvbENvbnRyYWN0CQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAECAAAAIzNQNUJmZDU4UFBmTnZCTTJIeThRZmJjRHFNZU50emc3S2ZQAAAAABNsaXF1aWRhdGlvbkNvbnRyYWN0CQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAECAAAAIzNQNFBDeHNKcU16UUJBTG84ekFOSHRCRFpSUnF1b2JIUXA3AAAAAA9uZXV0cmlub0Fzc2V0SWQJAAJZAAAAAQIAAAAsREcyeEZrUGREd0tVb0JrekdBaFF0THBTR3pmWExpQ1lQRXplS0gyQWQyNHAAAAAAC2JvbmRBc3NldElkCQACWQAAAAECAAAALDZuU3BWeU5IN3lNNjllZzQ0NndyUVI5NGlwYmJjbVpNVTFFTlB3YW5DOTdnAAAAAAlpc0Jsb2NrZWQJAQAAABZnZXRCb29sQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAPY29udHJvbENvbnRyYWN0AgAAAAppc19ibG9ja2VkAAAAAAxjdXJyZW50UHJpY2UJAQAAABhnZXROdW1iZXJCeUFkZHJlc3NBbmRLZXkAAAACBQAAAA9jb250cm9sQ29udHJhY3QFAAAACFByaWNlS2V5AAAAABVuZXV0cmlub0xvY2tlZEJhbGFuY2UJAQAAABhnZXROdW1iZXJCeUFkZHJlc3NBbmRLZXkAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0BQAAABhOZXV0cmlub0xvY2tlZEJhbGFuY2VLZXkAAAAAB3Jlc2VydmUJAABlAAAAAgkBAAAADHdhdmVzQmFsYW5jZQAAAAEFAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAABhnZXROdW1iZXJCeUFkZHJlc3NBbmRLZXkAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0BQAAABVXYXZlc0xvY2tlZEJhbGFuY2VLZXkAAAAADm5ldXRyaW5vU3VwcGx5CQAAZQAAAAIJAABlAAAAAgkAAGQAAAACBQAAABVuZXV0cmlub0xvY2tlZEJhbGFuY2UICQEAAAAHZXh0cmFjdAAAAAEJAAPsAAAAAQUAAAAPbmV1dHJpbm9Bc3NldElkAAAACHF1YW50aXR5CQAD6wAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAAD25ldXRyaW5vQXNzZXRJZAkAA+sAAAACBQAAABNsaXF1aWRhdGlvbkNvbnRyYWN0BQAAAA9uZXV0cmlub0Fzc2V0SWQAAAAAB2RlZmljaXQJAABlAAAAAgUAAAAObmV1dHJpbm9TdXBwbHkJAQAAABZjb252ZXJ0V2F2ZXNUb05ldXRyaW5vAAAAAgUAAAAHcmVzZXJ2ZQUAAAAMY3VycmVudFByaWNlAAAAAApmaXJzdE9yZGVyCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABBQAAAA1GaXJzdE9yZGVyS2V5AQAAAA1nZXRPcmRlclByaWNlAAAAAQAAAAJpZAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAEGdldE9yZGVyUHJpY2VLZXkAAAABBQAAAAJpZAEAAAANZ2V0T3JkZXJUb3RhbAAAAAEAAAACaWQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABBnZXRPcmRlclRvdGFsS2V5AAAAAQUAAAACaWQBAAAADWdldE9yZGVyT3duZXIAAAABAAAAAmlkCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAQZ2V0T3JkZXJPd25lcktleQAAAAEFAAAAAmlkAQAAAA5nZXRPcmRlclN0YXR1cwAAAAEAAAACaWQJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAABFnZXRPcmRlclN0YXR1c0tleQAAAAEFAAAAAmlkAQAAABNnZXRPcmRlckZpbGxlZFRvdGFsAAAAAQAAAAJpZAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAFmdldE9yZGVyRmlsbGVkVG90YWxLZXkAAAABBQAAAAJpZAEAAAAMZ2V0UHJldk9yZGVyAAAAAQAAAAJpZAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAD2dldFByZXZPcmRlcktleQAAAAEFAAAAAmlkAQAAAAxnZXROZXh0T3JkZXIAAAABAAAAAmlkCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAPZ2V0TmV4dE9yZGVyS2V5AAAAAQUAAAACaWQAAAADAAAAAWkBAAAAD2FkZEJ1eUJvbmRPcmRlcgAAAAIAAAAFcHJpY2UAAAAJcHJldk9yZGVyBAAAAANwbXQJAQAAAAdleHRyYWN0AAAAAQgFAAAAAWkAAAAHcGF5bWVudAQAAAAKbmV3T3JkZXJJZAkAAlgAAAABCQAB9QAAAAEJAADLAAAAAgkAAMsAAAACCQAAywAAAAIJAADLAAAAAgkA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BQAAAAZoZWlnaHQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABFnZXRPcmRlclN0YXR1c0tleQAAAAEFAAAACm5ld09yZGVySWQFAAAAA05FVwkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACAgAAABlkZWJ1Z19vcmRlcl9jdXJyZW50UHJpY2VfBQAAAApuZXdPcmRlcklkBQAAAAxjdXJyZW50UHJpY2UJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABJnZXRSb2lCeU9yZGVySWRLZXkAAAABBQAAAApuZXdPcmRlcklkBQAAAANyb2kFAAAAA25pbAAAAAFpAQAAAAtjYW5jZWxPcmRlcgAAAAEAAAAHb3JkZXJJZAQAAAAFb3duZXIJAQAAAA1nZXRPcmRlck93bmVyAAAAAQUAAAAHb3JkZXJJZAQAAAAGYW1vdW50CQAAZQAAAAIJAQAAAA1nZXRPcmRlclRvdGFsAAAAAQUAAAAHb3JkZXJJZAkBAAAAE2dldE9yZGVyRmlsbGVkVG90YWwAAAABBQAAAAdvcmRlcklkBAAAAAZjYWxsZXIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAAluZXh0T3JkZXIJAQAAAAxnZXROZXh0T3JkZXIAAAABBQAAAAdvcmRlcklkBAAAAAlwcmV2T3JkZXIJAQAAAAxnZXRQcmV2T3JkZXIAAAABBQAAAAdvcmRlcklkAwUAAAAJaXNCbG9ja2VkCQAAAgAAAAECAAAAWWNvbnRyYWN0IGlzIGJsb2NrZWQgYnkgRU1FUkdFTkNZIFNIVVRET1dOIGFjdGlvbnMgdW50aWwgcmVhY3RpdmF0aW9uIGJ5IGVtZXJnZW5jeSBvcmFjbGVzAwkBAAAAAiE9AAAAAgUAAAAFb3duZXIFAAAABmNhbGxlcgkAAAIAAAABAgAAABFwZXJtaXNzaW9uIGRlbmllZAMJAQAAAAIhPQAAAAIJAQAAAA5nZXRPcmRlclN0YXR1cwAAAAEFAAAAB29yZGVySWQFAAAAA05FVwkAAAIAAAABAgAAABRpbnZhbGlkIG9yZGVyIHN0YXR1cwkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAADUZpcnN0T3JkZXJLZXkDCQAAAAAAAAIFAAAACmZpcnN0T3JkZXIFAAAAB29yZGVySWQFAAAACW5leHRPcmRlcgUAAAAKZmlyc3RPcmRlcgkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAD2dldE5leHRPcmRlcktleQAAAAEFAAAACXByZXZPcmRlcgUAAAAJbmV4dE9yZGVyCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAPZ2V0UHJldk9yZGVyS2V5AAAAAQUAAAAJbmV4dE9yZGVyBQAAAAlwcmV2T3JkZXIJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABFnZXRPcmRlclN0YXR1c0tleQAAAAEFAAAAB29yZGVySWQFAAAACENBTkNFTEVEBQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAZhbW91bnQFAAAABHVuaXQFAAAAA25pbAAAAAFpAQAAAAhzZWxsQm9uZAAAAAAEAAAAC2JvbmRCYWxhbmNlCQAD6wAAAAIFAAAABHRoaXMFAAAAC2JvbmRBc3NldElkBAAAAAxyZXR1cm5BbW91bnQJAABlAAAAAgUAAAALYm9uZEJhbGFuY2UFAAAADm5ldXRyaW5vU3VwcGx5AwUAAAAJaXNCbG9ja2VkCQAAAgAAAAECAAAAWWNvbnRyYWN0IGlzIGJsb2NrZWQgYnkgRU1FUkdFTkNZIFNIVVRET1dOIGFjdGlvbnMgdW50aWwgcmVhY3RpdmF0aW9uIGJ5IGVtZXJnZW5jeSBvcmFjbGVzAwkAAAAAAAACBQAAAAtib25kQmFsYW5jZQAAAAAAAAAAAAkAAAIAAAABAgAAABt3aXRob3V0IGJhc2UgdG9rZW5zIHRvIHNlbGwDCQAAZgAAAAIFAAAADHJldHVybkFtb3VudAAAAAAAAAAAAAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAABBuZXV0cmlub0NvbnRyYWN0BQAAAAxyZXR1cm5BbW91bnQFAAAAC2JvbmRBc3NldElkBQAAAANuaWwDCQAAAAAAAAIFAAAACmZpcnN0T3JkZXICAAAAAAkAAAIAAAABAgAAAA9lbXB0eSBvcmRlcmJvb2sEAAAACW5leHRPcmRlcgkBAAAADGdldE5leHRPcmRlcgAAAAEFAAAACmZpcnN0T3JkZXIEAAAAC2ZpbGxlZFRvdGFsCQEAAAATZ2V0T3JkZXJGaWxsZWRUb3RhbAAAAAEFAAAACmZpcnN0T3JkZXIEAAAACm9yZGVyUHJpY2UJAQAAAA1nZXRPcmRlclByaWNlAAAAAQUAAAAKZmlyc3RPcmRlcgQAAAADcm9pCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAASZ2V0Um9pQnlPcmRlcklkS2V5AAAAAQUAAAAKZmlyc3RPcmRlcgQAAAAVcHJpY2VXYXZlc0J5Qm9uZENlbnRzCQAAawAAAAMJAABkAAAAAgAAAAAAAAAAZAUAAAADcm9pBQAAAAxjdXJyZW50UHJpY2UAAAAAAAAAAGQEAAAADXJlbWFpbmVkVG90YWwJAABlAAAAAgkBAAAADWdldE9yZGVyVG90YWwAAAABBQAAAApmaXJzdE9yZGVyBQAAAAtmaWxsZWRUb3RhbAQAAAAUYW1vdW50VG9FeGVjdXRlT3JkZXIJAQAAABJjb252ZXJ0V2F2ZXNUb0JvbmQAAAACBQAAAA1yZW1haW5lZFRvdGFsBQAAABVwcmljZVdhdmVzQnlCb25kQ2VudHMEAAAAEmZpbGxPcmRlckNvbmRpdGlvbgkAAGcAAAACBQAAAAtib25kQmFsYW5jZQUAAAAUYW1vdW50VG9FeGVjdXRlT3JkZXIEAAAAE2ZpbGxhYmxlT3JkZXJBbW91bnQDBQAAABJmaWxsT3JkZXJDb25kaXRpb24FAAAAFGFtb3VudFRvRXhlY3V0ZU9yZGVyBQAAAAtib25kQmFsYW5jZQQAAAAbdG90YWxPcmRlcldhdmVsZXRlc1JlcXVpcmVkCQEAAAASY29udmVydEJvbmRUb1dhdmVzAAAAAgUAAAATZmlsbGFibGVPcmRlckFtb3VudAUAAAAVcHJpY2VXYXZlc0J5Qm9uZENlbnRzBAAAABVuYlRva2Vuc1NlbGxDb25kaXRpb24JAABnAAAAAgkAAGsAAAADBQAAAAdkZWZpY2l0AAAAAAAAAABkBQAAAA5uZXV0cmlub1N1cHBseQUAAAADcm9pAwkBAAAAASEAAAABBQAAABVuYlRva2Vuc1NlbGxDb25kaXRpb24JAAACAAAAAQkAASwAAAACAgAAABNpbm5hcHJvcHJpYXRlIHJvaTogCQABpAAAAAEFAAAAA3JvaQMJAAAAAAAAAgUAAAAUYW1vdW50VG9FeGVjdXRlT3JkZXIAAAAAAAAAAAAJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAA1GaXJzdE9yZGVyS2V5BQAAAAluZXh0T3JkZXIJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAAA9nZXRQcmV2T3JkZXJLZXkAAAABBQAAAAluZXh0T3JkZXICAAAAAAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAEWdldE9yZGVyU3RhdHVzS2V5AAAAAQUAAAAKZmlyc3RPcmRlcgUAAAAGRklMTEVEBQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABCQEAAAANZ2V0T3JkZXJPd25lcgAAAAEFAAAACmZpcnN0T3JkZXIFAAAADXJlbWFpbmVkVG90YWwFAAAABHVuaXQFAAAAA25pbAMJAAAAAAAAAgUAAAAbdG90YWxPcmRlcldhdmVsZXRlc1JlcXVpcmVkAAAAAAAAAAAACQAAAgAAAAECAAAAH2Nhbm5vdCBmaWxsIG9yZGVyIGF0IHRoZSBtb21lbnQEAAAACW5ld1N0YXR1cwMDBQAAABJmaWxsT3JkZXJDb25kaXRpb24DCQAAAAAAAAIFAAAADXJlbWFpbmVkVG90YWwAAAAAAAAAAAAGCQAAAAAAAAIFAAAADXJlbWFpbmVkVG90YWwFAAAAG3RvdGFsT3JkZXJXYXZlbGV0ZXNSZXF1aXJlZAcFAAAABkZJTExFRAUAAAADTkVXCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAD2dldFByZXZPcmRlcktleQAAAAEFAAAACW5leHRPcmRlcgMJAAAAAAAAAgUAAAAJbmV3U3RhdHVzBQAAAAZGSUxMRUQCAAAAAAUAAAAKZmlyc3RPcmRlcgkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAANRmlyc3RPcmRlcktleQMJAAAAAAAAAgUAAAAJbmV3U3RhdHVzBQAAAAZGSUxMRUQFAAAACW5leHRPcmRlcgUAAAAKZmlyc3RPcmRlcgkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAFmdldE9yZGVyRmlsbGVkVG90YWxLZXkAAAABBQAAAApmaXJzdE9yZGVyCQAAZAAAAAIFAAAAC2ZpbGxlZFRvdGFsBQAAABt0b3RhbE9yZGVyV2F2ZWxldGVzUmVxdWlyZWQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABFnZXRPcmRlclN0YXR1c0tleQAAAAEFAAAACmZpcnN0T3JkZXIFAAAACW5ld1N0YXR1cwUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQkBAAAADWdldE9yZGVyT3duZXIAAAABBQAAAApmaXJzdE9yZGVyBQAAABNmaWxsYWJsZU9yZGVyQW1vdW50BQAAAAtib25kQXNzZXRJZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAABBuZXV0cmlub0NvbnRyYWN0BQAAABt0b3RhbE9yZGVyV2F2ZWxldGVzUmVxdWlyZWQFAAAABHVuaXQFAAAAA25pbAAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAAEAAAAEHB1YktleUFkbWluc0xpc3QJAARMAAAAAgIAAAAsQkxFb2d1elBWS1ZUZlh4eFQzVzdScWY4YVVtMmdnQzlWZW1kMk1RYXdNMkcJAARMAAAAAgIAAAAsRldWZmZZcjJBTG1ITWVqWm0zV3FlTHo2U2R5bTNnTEZHdEpuNEtUd3lVNXgJAARMAAAAAgIAAAAsM1doMkxhV2NiNWdnN0sycFBjVzNFcDZFQXVSQnpZa0FncmRwdDQzalRERmEJAARMAAAAAgIAAAAsNVdSWEZTandjVGJOZktjSnM4WnFYbVNTV1lzU1ZKVXRNdk1xWmo1aEg0TmMFAAAAA25pbAQAAAAFY291bnQJAABkAAAAAgkAAGQAAAACCQAAZAAAAAIDCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAkAAlkAAAABCQABkQAAAAIFAAAAEHB1YktleUFkbWluc0xpc3QAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAADCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAQkAAlkAAAABCQABkQAAAAIFAAAAEHB1YktleUFkbWluc0xpc3QAAAAAAAAAAAEAAAAAAAAAAAEAAAAAAAAAAAADCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAgkAAlkAAAABCQABkQAAAAIFAAAAEHB1YktleUFkbWluc0xpc3QAAAAAAAAAAAIAAAAAAAAAAAEAAAAAAAAAAAADCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAwkAAlkAAAABCQABkQAAAAIFAAAAEHB1YktleUFkbWluc0xpc3QAAAAAAAAAAAMAAAAAAAAAAAIAAAAAAAAAAAAJAABnAAAAAgUAAAAFY291bnQAAAAAAAAAAAPjDXJD", "chainId": 87, "height": 2020162, "spentComplexity": 0 } View: original | compacted Prev: 8Nseudzdg2oaYuuojoTrNNVYtPz5mseFGLKcg3XcFWM Next: 3RT7no7NPzufXne5WMe15g2az8pkdTzpZJjTfFy8uAHD Diff:
OldNewDifferences
4545
4646 let PAULI = 1000000
4747
48-let PERCENTACCURACY = 1000
49-
5048 let MINORDERTOTAL = (10 * WAVELET)
5149
52-let MAXROI = 100
50+let MAXROI = 95
5351
5452 let CANCELED = "canceled"
5553
164162 @Callable(i)
165163 func addBuyBondOrder (price,prevOrder) = {
166164 let pmt = extract(i.payment)
167- let orderId = toBase58String(keccak256(((((toBytes(price) + toBytes(pmt.amount)) + i.caller.bytes) + toBytes(height)) + i.transactionId)))
165+ let newOrderId = toBase58String(keccak256(((((toBytes(price) + toBytes(pmt.amount)) + i.caller.bytes) + toBytes(height)) + i.transactionId)))
168166 let priceWavesByBondCents = fraction(100, 100, price)
169167 let roi = fraction((priceWavesByBondCents - currentPrice), 100, currentPrice)
170168 if (isBlocked)
171- then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
172- else if ((0 >= deficit))
173- then throw("there is no ability to add order during proficit")
174- else if ((MINORDERTOTAL > pmt.amount))
175- then throw(("min order total equals " + toString(MINORDERTOTAL)))
176- else if ((roi > MAXROI))
177- then throw("max setOrder ROI is 100%")
178- else if ((0 >= roi))
179- then throw("min setOrder ROI is more than 0%")
180- else if (isDefined(pmt.assetId))
181- then throw("can use waves only")
182- else if ((0 >= price))
183- then throw("price less zero")
184- else if ((getOrderOwner(orderId) != ""))
185- then throw("order exists")
186- else if (if ((prevOrder != ""))
187- then (getOrderStatus(prevOrder) != NEW)
188- else false)
189- then throw("prev order status is not new")
190- else {
191- let owner = toString(i.caller)
192- let nextOrder = if ((prevOrder == ""))
193- then firstOrder
194- else getNextOrder(prevOrder)
195- let nextOrderRoi = getNumberByKey(getRoiByOrderIdKey(nextOrder))
196- let isNextOrderError = if (if ((nextOrder != ""))
197- then (roi >= nextOrderRoi)
198- else false)
199- then true
200- else false
201- let prevOrderRoi = getNumberByKey(getRoiByOrderIdKey(prevOrder))
202- let isPrevOrderError = if (if ((prevOrder != ""))
203- then (prevOrderRoi > roi)
204- else false)
205- then true
206- else false
207- if (if (isNextOrderError)
208- then true
209- else isPrevOrderError)
210- then throw(((("invalid order isPrevOrderError:" + toString(isPrevOrderError)) + " isNextOrderError:") + toString(isNextOrderError)))
211- else WriteSet([DataEntry(getPrevOrderKey(orderId), prevOrder), DataEntry(getNextOrderKey(orderId), nextOrder), DataEntry(getNextOrderKey(prevOrder), if ((prevOrder == ""))
212- then ""
213- else orderId), DataEntry(getPrevOrderKey(nextOrder), if ((nextOrder == ""))
214- then ""
215- else orderId), DataEntry(FirstOrderKey, if (if ((firstOrder == ""))
169+ then throw("contract is blocked by EMERGENCY SHUTDOWN actions until reactivation by emergency oracles")
170+ else if ((MINORDERTOTAL > pmt.amount))
171+ then throw(("min order total equals " + toString(MINORDERTOTAL)))
172+ else if ((roi > MAXROI))
173+ then throw("max setOrder ROI is 95%")
174+ else if (if ((deficit > 0))
175+ then (0 > roi)
176+ else false)
177+ then throw("can't place order with negative roi during deficit")
178+ else if ((-(MAXROI) > roi))
179+ then throw("min setOrder ROI is -95%")
180+ else if ((roi == 0))
181+ then throw("roi should not be equal to 0")
182+ else if (isDefined(pmt.assetId))
183+ then throw("can use waves only")
184+ else if ((0 >= price))
185+ then throw("price less zero")
186+ else if ((getOrderOwner(newOrderId) != ""))
187+ then throw("order exists")
188+ else if (if ((prevOrder != ""))
189+ then (getOrderStatus(prevOrder) != NEW)
190+ else false)
191+ then throw("prev order status is not new")
192+ else {
193+ let owner = toString(i.caller)
194+ let nextOrder = if ((prevOrder == ""))
195+ then firstOrder
196+ else getNextOrder(prevOrder)
197+ let nextOrderRoi = getNumberByKey(getRoiByOrderIdKey(nextOrder))
198+ let isNextOrderError = if (if ((nextOrder != ""))
199+ then (roi >= nextOrderRoi)
200+ else false)
216201 then true
217- else (firstOrder == nextOrder))
218- then orderId
219- else firstOrder), DataEntry(getOrderPriceKey(orderId), price), DataEntry(getOrderTotalKey(orderId), pmt.amount), DataEntry(getOrderOwnerKey(orderId), owner), DataEntry(getOrderHeightKey(orderId), height), DataEntry(getOrderStatusKey(orderId), NEW), DataEntry(("debug_order_currentPrice_" + orderId), currentPrice), DataEntry(getRoiByOrderIdKey(orderId), roi)])
220- }
202+ else false
203+ let prevOrderRoi = getNumberByKey(getRoiByOrderIdKey(prevOrder))
204+ let isPrevOrderError = if (if ((prevOrder != ""))
205+ then (prevOrderRoi > roi)
206+ else false)
207+ then true
208+ else false
209+ if (if (isNextOrderError)
210+ then true
211+ else isPrevOrderError)
212+ then throw(((("invalid order isPrevOrderError:" + toString(isPrevOrderError)) + " isNextOrderError:") + toString(isNextOrderError)))
213+ else WriteSet([DataEntry(getPrevOrderKey(newOrderId), prevOrder), DataEntry(getNextOrderKey(newOrderId), nextOrder), DataEntry(getNextOrderKey(prevOrder), if ((prevOrder == ""))
214+ then ""
215+ else newOrderId), DataEntry(getPrevOrderKey(nextOrder), if ((nextOrder == ""))
216+ then ""
217+ else newOrderId), DataEntry(FirstOrderKey, if (if ((firstOrder == ""))
218+ then true
219+ else (firstOrder == nextOrder))
220+ then newOrderId
221+ else firstOrder), DataEntry(getOrderPriceKey(newOrderId), price), DataEntry(getOrderTotalKey(newOrderId), pmt.amount), DataEntry(getOrderOwnerKey(newOrderId), owner), DataEntry(getOrderHeightKey(newOrderId), height), DataEntry(getOrderStatusKey(newOrderId), NEW), DataEntry(("debug_order_currentPrice_" + newOrderId), currentPrice), DataEntry(getRoiByOrderIdKey(newOrderId), roi)])
222+ }
221223 }
222224
223225
230232 let nextOrder = getNextOrder(orderId)
231233 let prevOrder = getPrevOrder(orderId)
232234 if (isBlocked)
233- then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
235+ then throw("contract is blocked by EMERGENCY SHUTDOWN actions until reactivation by emergency oracles")
234236 else if ((owner != caller))
235237 then throw("permission denied")
236238 else if ((getOrderStatus(orderId) != NEW))
245247 @Callable(i)
246248 func sellBond () = {
247249 let bondBalance = assetBalance(this, bondAssetId)
248- let deficitPositive = if ((0 >= deficit))
249- then 0
250- else deficit
251- let bondAmount = if ((deficitPositive >= bondBalance))
252- then bondBalance
253- else deficitPositive
254- let returnAmount = if ((deficitPositive >= bondBalance))
255- then 0
256- else (bondBalance - deficitPositive)
257- if (if ((deficitPositive == 0))
258- then (bondBalance == 0)
259- else false)
260- then throw("without deficit")
250+ let returnAmount = (bondBalance - neutrinoSupply)
251+ if (isBlocked)
252+ then throw("contract is blocked by EMERGENCY SHUTDOWN actions until reactivation by emergency oracles")
261253 else if ((bondBalance == 0))
262- then throw("without bonds to sell")
254+ then throw("without base tokens to sell")
263255 else if ((returnAmount > 0))
264256 then TransferSet([ScriptTransfer(neutrinoContract, returnAmount, bondAssetId)])
265257 else if ((firstOrder == ""))
268260 let nextOrder = getNextOrder(firstOrder)
269261 let filledTotal = getOrderFilledTotal(firstOrder)
270262 let orderPrice = getOrderPrice(firstOrder)
271- let priceWavesByBondCents = fraction(100, 100, orderPrice)
272263 let roi = getNumberByKey(getRoiByOrderIdKey(firstOrder))
264+ let priceWavesByBondCents = fraction((100 + roi), currentPrice, 100)
273265 let remainedTotal = (getOrderTotal(firstOrder) - filledTotal)
274266 let amountToExecuteOrder = convertWavesToBond(remainedTotal, priceWavesByBondCents)
275- let fillOrderCondition = (bondAmount >= amountToExecuteOrder)
267+ let fillOrderCondition = (bondBalance >= amountToExecuteOrder)
276268 let fillableOrderAmount = if (fillOrderCondition)
277269 then amountToExecuteOrder
278- else bondAmount
270+ else bondBalance
279271 let totalOrderWaveletesRequired = convertBondToWaves(fillableOrderAmount, priceWavesByBondCents)
280- if (if ((roi > fraction(deficit, 100, neutrinoSupply)))
281- then true
282- else (0 >= deficitPositive))
283- then throw(("deficit should be higther or equal than roi: " + toString(roi)))
272+ let nbTokensSellCondition = (fraction(deficit, 100, neutrinoSupply) >= roi)
273+ if (!(nbTokensSellCondition))
274+ then throw(("innapropriate roi: " + toString(roi)))
284275 else if ((amountToExecuteOrder == 0))
285- then ScriptResult(WriteSet([DataEntry(FirstOrderKey, nextOrder), DataEntry(getPrevOrderKey(nextOrder), ""), DataEntry(FirstOrderKey, nextOrder), DataEntry(getOrderStatusKey(firstOrder), FILLED)]), TransferSet([ScriptTransfer(addressFromStringValue(getOrderOwner(firstOrder)), remainedTotal, unit)]))
276+ then ScriptResult(WriteSet([DataEntry(FirstOrderKey, nextOrder), DataEntry(getPrevOrderKey(nextOrder), ""), DataEntry(getOrderStatusKey(firstOrder), FILLED)]), TransferSet([ScriptTransfer(addressFromStringValue(getOrderOwner(firstOrder)), remainedTotal, unit)]))
286277 else if ((totalOrderWaveletesRequired == 0))
287278 then throw("cannot fill order at the moment")
288279 else {
289280 let newStatus = if (if (fillOrderCondition)
290- then (remainedTotal == 0)
281+ then if ((remainedTotal == 0))
282+ then true
283+ else (remainedTotal == totalOrderWaveletesRequired)
291284 else false)
292285 then FILLED
293286 else NEW
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func getNumberByKey (key) = match getInteger(this, key) {
55 case a: Int =>
66 a
77 case _ =>
88 0
99 }
1010
1111
1212 func getStringByKey (key) = match getString(this, key) {
1313 case a: String =>
1414 a
1515 case _ =>
1616 ""
1717 }
1818
1919
2020 func getBoolByAddressAndKey (address,key) = match getBoolean(address, key) {
2121 case a: Boolean =>
2222 a
2323 case _ =>
2424 false
2525 }
2626
2727
2828 func getStringByAddressAndKey (address,key) = match getString(address, key) {
2929 case a: String =>
3030 a
3131 case _ =>
3232 ""
3333 }
3434
3535
3636 func getNumberByAddressAndKey (address,key) = match getInteger(address, key) {
3737 case a: Int =>
3838 a
3939 case _ =>
4040 0
4141 }
4242
4343
4444 let WAVELET = 100000000
4545
4646 let PAULI = 1000000
4747
48-let PERCENTACCURACY = 1000
49-
5048 let MINORDERTOTAL = (10 * WAVELET)
5149
52-let MAXROI = 100
50+let MAXROI = 95
5351
5452 let CANCELED = "canceled"
5553
5654 let NEW = "new"
5755
5856 let FILLED = "filled"
5957
6058 let NeutrinoContractKey = "neutrino_contract"
6159
6260 let PriceKey = "price"
6361
6462 let BondAssetIdKey = "bond_asset_id"
6563
6664 let NeutrinoAssetIdKey = "neutrino_asset_id"
6765
6866 let ControlContractKey = "control_contract"
6967
7068 let BalanceLockedkKey = "balance_lock_"
7169
7270 let WavesLockedBalanceKey = (BalanceLockedkKey + "waves")
7371
7472 let NeutrinoLockedBalanceKey = (BalanceLockedkKey + "neutrino")
7573
7674 let LiquidationContractKey = "liquidation_contract"
7775
7876 let FirstOrderKey = "order_first"
7977
8078 func getRoiByOrderIdKey (orderId) = ("debug_order_roi_" + orderId)
8179
8280
8381 func getOrderPriceKey (orderId) = ("order_price_" + orderId)
8482
8583
8684 func getOrderTotalKey (orderId) = ("order_total_" + orderId)
8785
8886
8987 func getOrderOwnerKey (orderId) = ("order_owner_" + orderId)
9088
9189
9290 func getOrderHeightKey (orderId) = ("order_height_" + orderId)
9391
9492
9593 func getOrderStatusKey (orderId) = ("order_status_" + orderId)
9694
9795
9896 func getOrderFilledTotalKey (orderId) = ("order_filled_total_" + orderId)
9997
10098
10199 func getPrevOrderKey (orderId) = ("order_prev_" + orderId)
102100
103101
104102 func getNextOrderKey (orderId) = ("order_next_" + orderId)
105103
106104
107105 func convertNeutrinoToWaves (amount,price) = fraction(fraction(amount, 100, price), WAVELET, PAULI)
108106
109107
110108 func convertWavesToNeutrino (amount,price) = fraction(fraction(amount, price, 100), PAULI, WAVELET)
111109
112110
113111 func convertWavesToBond (amount,price) = convertWavesToNeutrino(amount, price)
114112
115113
116114 func convertBondToWaves (amount,price) = convertNeutrinoToWaves(amount, price)
117115
118116
119117 let neutrinoContract = addressFromStringValue("3PC9BfRwJWWiw9AREE2B3eWzCks3CYtg4yo")
120118
121119 let controlContract = addressFromStringValue("3P5Bfd58PPfNvBM2Hy8QfbcDqMeNtzg7KfP")
122120
123121 let liquidationContract = addressFromStringValue("3P4PCxsJqMzQBALo8zANHtBDZRRquobHQp7")
124122
125123 let neutrinoAssetId = fromBase58String("DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p")
126124
127125 let bondAssetId = fromBase58String("6nSpVyNH7yM69eg446wrQR94ipbbcmZMU1ENPwanC97g")
128126
129127 let isBlocked = getBoolByAddressAndKey(controlContract, "is_blocked")
130128
131129 let currentPrice = getNumberByAddressAndKey(controlContract, PriceKey)
132130
133131 let neutrinoLockedBalance = getNumberByAddressAndKey(neutrinoContract, NeutrinoLockedBalanceKey)
134132
135133 let reserve = (wavesBalance(neutrinoContract) - getNumberByAddressAndKey(neutrinoContract, WavesLockedBalanceKey))
136134
137135 let neutrinoSupply = (((neutrinoLockedBalance + extract(assetInfo(neutrinoAssetId)).quantity) - assetBalance(neutrinoContract, neutrinoAssetId)) - assetBalance(liquidationContract, neutrinoAssetId))
138136
139137 let deficit = (neutrinoSupply - convertWavesToNeutrino(reserve, currentPrice))
140138
141139 let firstOrder = getStringByKey(FirstOrderKey)
142140
143141 func getOrderPrice (id) = getNumberByKey(getOrderPriceKey(id))
144142
145143
146144 func getOrderTotal (id) = getNumberByKey(getOrderTotalKey(id))
147145
148146
149147 func getOrderOwner (id) = getStringByKey(getOrderOwnerKey(id))
150148
151149
152150 func getOrderStatus (id) = getStringByKey(getOrderStatusKey(id))
153151
154152
155153 func getOrderFilledTotal (id) = getNumberByKey(getOrderFilledTotalKey(id))
156154
157155
158156 func getPrevOrder (id) = getStringByKey(getPrevOrderKey(id))
159157
160158
161159 func getNextOrder (id) = getStringByKey(getNextOrderKey(id))
162160
163161
164162 @Callable(i)
165163 func addBuyBondOrder (price,prevOrder) = {
166164 let pmt = extract(i.payment)
167- let orderId = toBase58String(keccak256(((((toBytes(price) + toBytes(pmt.amount)) + i.caller.bytes) + toBytes(height)) + i.transactionId)))
165+ let newOrderId = toBase58String(keccak256(((((toBytes(price) + toBytes(pmt.amount)) + i.caller.bytes) + toBytes(height)) + i.transactionId)))
168166 let priceWavesByBondCents = fraction(100, 100, price)
169167 let roi = fraction((priceWavesByBondCents - currentPrice), 100, currentPrice)
170168 if (isBlocked)
171- then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
172- else if ((0 >= deficit))
173- then throw("there is no ability to add order during proficit")
174- else if ((MINORDERTOTAL > pmt.amount))
175- then throw(("min order total equals " + toString(MINORDERTOTAL)))
176- else if ((roi > MAXROI))
177- then throw("max setOrder ROI is 100%")
178- else if ((0 >= roi))
179- then throw("min setOrder ROI is more than 0%")
180- else if (isDefined(pmt.assetId))
181- then throw("can use waves only")
182- else if ((0 >= price))
183- then throw("price less zero")
184- else if ((getOrderOwner(orderId) != ""))
185- then throw("order exists")
186- else if (if ((prevOrder != ""))
187- then (getOrderStatus(prevOrder) != NEW)
188- else false)
189- then throw("prev order status is not new")
190- else {
191- let owner = toString(i.caller)
192- let nextOrder = if ((prevOrder == ""))
193- then firstOrder
194- else getNextOrder(prevOrder)
195- let nextOrderRoi = getNumberByKey(getRoiByOrderIdKey(nextOrder))
196- let isNextOrderError = if (if ((nextOrder != ""))
197- then (roi >= nextOrderRoi)
198- else false)
199- then true
200- else false
201- let prevOrderRoi = getNumberByKey(getRoiByOrderIdKey(prevOrder))
202- let isPrevOrderError = if (if ((prevOrder != ""))
203- then (prevOrderRoi > roi)
204- else false)
205- then true
206- else false
207- if (if (isNextOrderError)
208- then true
209- else isPrevOrderError)
210- then throw(((("invalid order isPrevOrderError:" + toString(isPrevOrderError)) + " isNextOrderError:") + toString(isNextOrderError)))
211- else WriteSet([DataEntry(getPrevOrderKey(orderId), prevOrder), DataEntry(getNextOrderKey(orderId), nextOrder), DataEntry(getNextOrderKey(prevOrder), if ((prevOrder == ""))
212- then ""
213- else orderId), DataEntry(getPrevOrderKey(nextOrder), if ((nextOrder == ""))
214- then ""
215- else orderId), DataEntry(FirstOrderKey, if (if ((firstOrder == ""))
169+ then throw("contract is blocked by EMERGENCY SHUTDOWN actions until reactivation by emergency oracles")
170+ else if ((MINORDERTOTAL > pmt.amount))
171+ then throw(("min order total equals " + toString(MINORDERTOTAL)))
172+ else if ((roi > MAXROI))
173+ then throw("max setOrder ROI is 95%")
174+ else if (if ((deficit > 0))
175+ then (0 > roi)
176+ else false)
177+ then throw("can't place order with negative roi during deficit")
178+ else if ((-(MAXROI) > roi))
179+ then throw("min setOrder ROI is -95%")
180+ else if ((roi == 0))
181+ then throw("roi should not be equal to 0")
182+ else if (isDefined(pmt.assetId))
183+ then throw("can use waves only")
184+ else if ((0 >= price))
185+ then throw("price less zero")
186+ else if ((getOrderOwner(newOrderId) != ""))
187+ then throw("order exists")
188+ else if (if ((prevOrder != ""))
189+ then (getOrderStatus(prevOrder) != NEW)
190+ else false)
191+ then throw("prev order status is not new")
192+ else {
193+ let owner = toString(i.caller)
194+ let nextOrder = if ((prevOrder == ""))
195+ then firstOrder
196+ else getNextOrder(prevOrder)
197+ let nextOrderRoi = getNumberByKey(getRoiByOrderIdKey(nextOrder))
198+ let isNextOrderError = if (if ((nextOrder != ""))
199+ then (roi >= nextOrderRoi)
200+ else false)
216201 then true
217- else (firstOrder == nextOrder))
218- then orderId
219- else firstOrder), DataEntry(getOrderPriceKey(orderId), price), DataEntry(getOrderTotalKey(orderId), pmt.amount), DataEntry(getOrderOwnerKey(orderId), owner), DataEntry(getOrderHeightKey(orderId), height), DataEntry(getOrderStatusKey(orderId), NEW), DataEntry(("debug_order_currentPrice_" + orderId), currentPrice), DataEntry(getRoiByOrderIdKey(orderId), roi)])
220- }
202+ else false
203+ let prevOrderRoi = getNumberByKey(getRoiByOrderIdKey(prevOrder))
204+ let isPrevOrderError = if (if ((prevOrder != ""))
205+ then (prevOrderRoi > roi)
206+ else false)
207+ then true
208+ else false
209+ if (if (isNextOrderError)
210+ then true
211+ else isPrevOrderError)
212+ then throw(((("invalid order isPrevOrderError:" + toString(isPrevOrderError)) + " isNextOrderError:") + toString(isNextOrderError)))
213+ else WriteSet([DataEntry(getPrevOrderKey(newOrderId), prevOrder), DataEntry(getNextOrderKey(newOrderId), nextOrder), DataEntry(getNextOrderKey(prevOrder), if ((prevOrder == ""))
214+ then ""
215+ else newOrderId), DataEntry(getPrevOrderKey(nextOrder), if ((nextOrder == ""))
216+ then ""
217+ else newOrderId), DataEntry(FirstOrderKey, if (if ((firstOrder == ""))
218+ then true
219+ else (firstOrder == nextOrder))
220+ then newOrderId
221+ else firstOrder), DataEntry(getOrderPriceKey(newOrderId), price), DataEntry(getOrderTotalKey(newOrderId), pmt.amount), DataEntry(getOrderOwnerKey(newOrderId), owner), DataEntry(getOrderHeightKey(newOrderId), height), DataEntry(getOrderStatusKey(newOrderId), NEW), DataEntry(("debug_order_currentPrice_" + newOrderId), currentPrice), DataEntry(getRoiByOrderIdKey(newOrderId), roi)])
222+ }
221223 }
222224
223225
224226
225227 @Callable(i)
226228 func cancelOrder (orderId) = {
227229 let owner = getOrderOwner(orderId)
228230 let amount = (getOrderTotal(orderId) - getOrderFilledTotal(orderId))
229231 let caller = toString(i.caller)
230232 let nextOrder = getNextOrder(orderId)
231233 let prevOrder = getPrevOrder(orderId)
232234 if (isBlocked)
233- then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
235+ then throw("contract is blocked by EMERGENCY SHUTDOWN actions until reactivation by emergency oracles")
234236 else if ((owner != caller))
235237 then throw("permission denied")
236238 else if ((getOrderStatus(orderId) != NEW))
237239 then throw("invalid order status")
238240 else ScriptResult(WriteSet([DataEntry(FirstOrderKey, if ((firstOrder == orderId))
239241 then nextOrder
240242 else firstOrder), DataEntry(getNextOrderKey(prevOrder), nextOrder), DataEntry(getPrevOrderKey(nextOrder), prevOrder), DataEntry(getOrderStatusKey(orderId), CANCELED)]), TransferSet([ScriptTransfer(i.caller, amount, unit)]))
241243 }
242244
243245
244246
245247 @Callable(i)
246248 func sellBond () = {
247249 let bondBalance = assetBalance(this, bondAssetId)
248- let deficitPositive = if ((0 >= deficit))
249- then 0
250- else deficit
251- let bondAmount = if ((deficitPositive >= bondBalance))
252- then bondBalance
253- else deficitPositive
254- let returnAmount = if ((deficitPositive >= bondBalance))
255- then 0
256- else (bondBalance - deficitPositive)
257- if (if ((deficitPositive == 0))
258- then (bondBalance == 0)
259- else false)
260- then throw("without deficit")
250+ let returnAmount = (bondBalance - neutrinoSupply)
251+ if (isBlocked)
252+ then throw("contract is blocked by EMERGENCY SHUTDOWN actions until reactivation by emergency oracles")
261253 else if ((bondBalance == 0))
262- then throw("without bonds to sell")
254+ then throw("without base tokens to sell")
263255 else if ((returnAmount > 0))
264256 then TransferSet([ScriptTransfer(neutrinoContract, returnAmount, bondAssetId)])
265257 else if ((firstOrder == ""))
266258 then throw("empty orderbook")
267259 else {
268260 let nextOrder = getNextOrder(firstOrder)
269261 let filledTotal = getOrderFilledTotal(firstOrder)
270262 let orderPrice = getOrderPrice(firstOrder)
271- let priceWavesByBondCents = fraction(100, 100, orderPrice)
272263 let roi = getNumberByKey(getRoiByOrderIdKey(firstOrder))
264+ let priceWavesByBondCents = fraction((100 + roi), currentPrice, 100)
273265 let remainedTotal = (getOrderTotal(firstOrder) - filledTotal)
274266 let amountToExecuteOrder = convertWavesToBond(remainedTotal, priceWavesByBondCents)
275- let fillOrderCondition = (bondAmount >= amountToExecuteOrder)
267+ let fillOrderCondition = (bondBalance >= amountToExecuteOrder)
276268 let fillableOrderAmount = if (fillOrderCondition)
277269 then amountToExecuteOrder
278- else bondAmount
270+ else bondBalance
279271 let totalOrderWaveletesRequired = convertBondToWaves(fillableOrderAmount, priceWavesByBondCents)
280- if (if ((roi > fraction(deficit, 100, neutrinoSupply)))
281- then true
282- else (0 >= deficitPositive))
283- then throw(("deficit should be higther or equal than roi: " + toString(roi)))
272+ let nbTokensSellCondition = (fraction(deficit, 100, neutrinoSupply) >= roi)
273+ if (!(nbTokensSellCondition))
274+ then throw(("innapropriate roi: " + toString(roi)))
284275 else if ((amountToExecuteOrder == 0))
285- then ScriptResult(WriteSet([DataEntry(FirstOrderKey, nextOrder), DataEntry(getPrevOrderKey(nextOrder), ""), DataEntry(FirstOrderKey, nextOrder), DataEntry(getOrderStatusKey(firstOrder), FILLED)]), TransferSet([ScriptTransfer(addressFromStringValue(getOrderOwner(firstOrder)), remainedTotal, unit)]))
276+ then ScriptResult(WriteSet([DataEntry(FirstOrderKey, nextOrder), DataEntry(getPrevOrderKey(nextOrder), ""), DataEntry(getOrderStatusKey(firstOrder), FILLED)]), TransferSet([ScriptTransfer(addressFromStringValue(getOrderOwner(firstOrder)), remainedTotal, unit)]))
286277 else if ((totalOrderWaveletesRequired == 0))
287278 then throw("cannot fill order at the moment")
288279 else {
289280 let newStatus = if (if (fillOrderCondition)
290- then (remainedTotal == 0)
281+ then if ((remainedTotal == 0))
282+ then true
283+ else (remainedTotal == totalOrderWaveletesRequired)
291284 else false)
292285 then FILLED
293286 else NEW
294287 ScriptResult(WriteSet([DataEntry(getPrevOrderKey(nextOrder), if ((newStatus == FILLED))
295288 then ""
296289 else firstOrder), DataEntry(FirstOrderKey, if ((newStatus == FILLED))
297290 then nextOrder
298291 else firstOrder), DataEntry(getOrderFilledTotalKey(firstOrder), (filledTotal + totalOrderWaveletesRequired)), DataEntry(getOrderStatusKey(firstOrder), newStatus)]), TransferSet([ScriptTransfer(addressFromStringValue(getOrderOwner(firstOrder)), fillableOrderAmount, bondAssetId), ScriptTransfer(neutrinoContract, totalOrderWaveletesRequired, unit)]))
299292 }
300293 }
301294 }
302295
303296
304297 @Verifier(tx)
305298 func verify () = {
306299 let pubKeyAdminsList = ["BLEoguzPVKVTfXxxT3W7Rqf8aUm2ggC9Vemd2MQawM2G", "FWVffYr2ALmHMejZm3WqeLz6Sdym3gLFGtJn4KTwyU5x", "3Wh2LaWcb5gg7K2pPcW3Ep6EAuRBzYkAgrdpt43jTDFa", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"]
307300 let count = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0])))
308301 then 1
309302 else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(pubKeyAdminsList[1])))
310303 then 1
311304 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(pubKeyAdminsList[2])))
312305 then 1
313306 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[3], fromBase58String(pubKeyAdminsList[3])))
314307 then 2
315308 else 0))
316309 (count >= 3)
317310 }
318311

github/deemru/w8io/0e76f2f 
96.86 ms