tx · FJmsq4fQF9yhts64tyLztzpBkfRbMXUYdrCJPoSR5jHp

3P4PCxsJqMzQBALo8zANHtBDZRRquobHQp7:  -0.14000000 Waves

2020.09.07 06:29 [2230048] smart account 3P4PCxsJqMzQBALo8zANHtBDZRRquobHQp7 > SELF 0.00000000 Waves

{ "type": 13, "id": "FJmsq4fQF9yhts64tyLztzpBkfRbMXUYdrCJPoSR5jHp", "fee": 14000000, "feeAssetId": null, "timestamp": 1599451253682, "version": 1, "sender": "3P4PCxsJqMzQBALo8zANHtBDZRRquobHQp7", "senderPublicKey": "H8Gooqgk4486MkqEQVwACpgoyEjt5Px4eskysnEDZ1nR", "proofs": [ "", "Ao7NhWUKDn6i2yeTbdZws76ZSmH1i6aqVBMrG8m8aGhrgChaqCCZyrrEWqRLjJYq6pywqkTZf6HfW9WD2ew2cKa", "", "hJ8Amt5oXqdFWmRUZdpN9gFhKVrPR4cU1p1ohukF6WVpe4B1jdxRwbGeTBNYoAn8GVgXVxEPXrpTHYrVjZr3MNP" ], "script": "base64:AAIEAAAAAAAAABEIAhIECgIBCBIAEgMKAQgSAAAAADkBAAAADmdldE51bWJlckJ5S2V5AAAAAQAAAANrZXkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAADa2V5AAAAAAAAAAAAAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQIAAAAAAQAAABZnZXRCb29sQnlBZGRyZXNzQW5kS2V5AAAAAgAAAAdhZGRyZXNzAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBsAAAACBQAAAAdhZGRyZXNzBQAAAANrZXkHAQAAABhnZXRTdHJpbmdCeUFkZHJlc3NBbmRLZXkAAAACAAAAB2FkZHJlc3MAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQIAAAAAAQAAABhnZXROdW1iZXJCeUFkZHJlc3NBbmRLZXkAAAACAAAAB2FkZHJlc3MAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQAAAAAAAAAAAAAAAAAHV0FWRUxFVAAAAAAABfXhAAAAAAAFUEFVTEkAAAAAAAAPQkAAAAAACFBSSUNFTEVUAAAAAAAAD0JAAAAAAAhDQU5DRUxFRAIAAAAIY2FuY2VsZWQAAAAAA05FVwIAAAADbmV3AAAAAAZGSUxMRUQCAAAABmZpbGxlZAAAAAATTmV1dHJpbm9Db250cmFjdEtleQIAAAARbmV1dHJpbm9fY29udHJhY3QAAAAACFByaWNlS2V5AgAAAAVwcmljZQAAAAAOQm9uZEFzc2V0SWRLZXkCAAAADWJvbmRfYXNzZXRfaWQAAAAAEk5ldXRyaW5vQXNzZXRJZEtleQIAAAARbmV1dHJpbm9fYXNzZXRfaWQAAAAAEkNvbnRyb2xDb250cmFjdEtleQIAAAAQY29udHJvbF9jb250cmFjdAAAAAARQmFsYW5jZUxvY2tlZGtLZXkCAAAADWJhbGFuY2VfbG9ja18AAAAAFVdhdmVzTG9ja2VkQmFsYW5jZUtleQkAASwAAAACBQAAABFCYWxhbmNlTG9ja2Vka0tleQIAAAAFd2F2ZXMAAAAAGE5ldXRyaW5vTG9ja2VkQmFsYW5jZUtleQkAASwAAAACBQAAABFCYWxhbmNlTG9ja2Vka0tleQIAAAAIbmV1dHJpbm8AAAAADUZpcnN0T3JkZXJLZXkCAAAAC29yZGVyX2ZpcnN0AAAAABZDdXJyZW50RGVmYXVsdE9yZGVyS2V5AgAAAA1vcmRlcl9kZWZhdWx0AQAAABBnZXRPcmRlclByaWNlS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAADG9yZGVyX3ByaWNlXwUAAAAHb3JkZXJJZAEAAAAQZ2V0T3JkZXJUb3RhbEtleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAAAxvcmRlcl90b3RhbF8FAAAAB29yZGVySWQBAAAAEGdldE9yZGVyT3duZXJLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgIAAAAMb3JkZXJfb3duZXJfBQAAAAdvcmRlcklkAQAAABFnZXRPcmRlckhlaWdodEtleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAAA1vcmRlcl9oZWlnaHRfBQAAAAdvcmRlcklkAQAAABFnZXRPcmRlclN0YXR1c0tleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAAA1vcmRlcl9zdGF0dXNfBQAAAAdvcmRlcklkAQAAABZnZXRPcmRlckZpbGxlZFRvdGFsS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAAE29yZGVyX2ZpbGxlZF90b3RhbF8FAAAAB29yZGVySWQBAAAAD2dldFByZXZPcmRlcktleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAAAtvcmRlcl9wcmV2XwUAAAAHb3JkZXJJZAEAAAAPZ2V0TmV4dE9yZGVyS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAAC29yZGVyX25leHRfBQAAAAdvcmRlcklkAQAAABZjb252ZXJ0TmV1dHJpbm9Ub1dhdmVzAAAAAgAAAAZhbW91bnQAAAAFcHJpY2UJAABrAAAAAwkAAGsAAAADBQAAAAZhbW91bnQFAAAACFBSSUNFTEVUBQAAAAVwcmljZQUAAAAHV0FWRUxFVAUAAAAFUEFVTEkBAAAAFmNvbnZlcnRXYXZlc1RvTmV1dHJpbm8AAAACAAAABmFtb3VudAAAAAVwcmljZQkAAGsAAAADCQAAawAAAAMFAAAABmFtb3VudAUAAAAFcHJpY2UFAAAACFBSSUNFTEVUBQAAAAVQQVVMSQUAAAAHV0FWRUxFVAEAAAASY29udmVydFdhdmVzVG9Cb25kAAAAAgAAAAZhbW91bnQAAAAFcHJpY2UJAQAAABZjb252ZXJ0V2F2ZXNUb05ldXRyaW5vAAAAAgUAAAAGYW1vdW50BQAAAAVwcmljZQAAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAATTmV1dHJpbm9Db250cmFjdEtleQAAAAAPY29udHJvbENvbnRyYWN0CQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAAYZ2V0U3RyaW5nQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAUAAAASQ29udHJvbENvbnRyYWN0S2V5AAAAABNsaXF1aWRhdGlvbkNvbnRyYWN0BQAAAAR0aGlzAAAAAA9uZXV0cmlub0Fzc2V0SWQJAAJZAAAAAQkBAAAAGGdldFN0cmluZ0J5QWRkcmVzc0FuZEtleQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAAEk5ldXRyaW5vQXNzZXRJZEtleQAAAAALYm9uZEFzc2V0SWQJAAJZAAAAAQIAAAAsNm5TcFZ5Tkg3eU02OWVnNDQ2d3JRUjk0aXBiYmNtWk1VMUVOUHdhbkM5N2cAAAAACmZpcnN0T3JkZXIJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAADUZpcnN0T3JkZXJLZXkAAAAACWlzQmxvY2tlZAkBAAAAFmdldEJvb2xCeUFkZHJlc3NBbmRLZXkAAAACBQAAAA9jb250cm9sQ29udHJhY3QCAAAACmlzX2Jsb2NrZWQAAAAADGN1cnJlbnRQcmljZQkBAAAAGGdldE51bWJlckJ5QWRkcmVzc0FuZEtleQAAAAIFAAAAD2NvbnRyb2xDb250cmFjdAUAAAAIUHJpY2VLZXkAAAAAFW5ldXRyaW5vTG9ja2VkQmFsYW5jZQkBAAAAGGdldE51bWJlckJ5QWRkcmVzc0FuZEtleQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAAGE5ldXRyaW5vTG9ja2VkQmFsYW5jZUtleQAAAAASd2F2ZXNMb2NrZWRCYWxhbmNlCQEAAAAYZ2V0TnVtYmVyQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAUAAAAVV2F2ZXNMb2NrZWRCYWxhbmNlS2V5AAAAAAdyZXNlcnZlCQAAZQAAAAIICQAD7wAAAAEFAAAAEG5ldXRyaW5vQ29udHJhY3QAAAAHcmVndWxhcgUAAAASd2F2ZXNMb2NrZWRCYWxhbmNlAAAAAA5uZXV0cmlub1N1cHBseQkAAGUAAAACCQAAZQAAAAIJAABkAAAAAgUAAAAVbmV1dHJpbm9Mb2NrZWRCYWxhbmNlCAkBAAAABXZhbHVlAAAAAQkAA+wAAAABBQAAAA9uZXV0cmlub0Fzc2V0SWQAAAAIcXVhbnRpdHkJAAPwAAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAUAAAAPbmV1dHJpbm9Bc3NldElkCQAD8AAAAAIFAAAAE2xpcXVpZGF0aW9uQ29udHJhY3QFAAAAD25ldXRyaW5vQXNzZXRJZAAAAAAHc3VycGx1cwkAAGUAAAACCQEAAAAWY29udmVydFdhdmVzVG9OZXV0cmlubwAAAAIFAAAAB3Jlc2VydmUFAAAADGN1cnJlbnRQcmljZQUAAAAObmV1dHJpbm9TdXBwbHkBAAAADWdldE9yZGVyUHJpY2UAAAABAAAAAmlkCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAQZ2V0T3JkZXJQcmljZUtleQAAAAEFAAAAAmlkAQAAAA1nZXRPcmRlclRvdGFsAAAAAQAAAAJpZAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAEGdldE9yZGVyVG90YWxLZXkAAAABBQAAAAJpZAEAAAANZ2V0T3JkZXJPd25lcgAAAAEAAAACaWQJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAABBnZXRPcmRlck93bmVyS2V5AAAAAQUAAAACaWQBAAAADmdldE9yZGVyU3RhdHVzAAAAAQAAAAJpZAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAEWdldE9yZGVyU3RhdHVzS2V5AAAAAQUAAAACaWQBAAAAE2dldE9yZGVyRmlsbGVkVG90YWwAAAABAAAAAmlkCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAWZ2V0T3JkZXJGaWxsZWRUb3RhbEtleQAAAAEFAAAAAmlkAQAAAA5nZXRPcmRlckhlaWdodAAAAAEAAAACaWQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABFnZXRPcmRlckhlaWdodEtleQAAAAEFAAAAAmlkAQAAAAxnZXRQcmV2T3JkZXIAAAABAAAAAmlkCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAPZ2V0UHJldk9yZGVyS2V5AAAAAQUAAAACaWQBAAAADGdldE5leHRPcmRlcgAAAAEAAAACaWQJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAAA9nZXROZXh0T3JkZXJLZXkAAAABBQAAAAJpZAAAAAATY3VycmVudERlZmF1bHRPcmRlcgkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAAWQ3VycmVudERlZmF1bHRPcmRlcktleQEAAAAbZ2VuZXJhdGVEYXRhRW50cnlUb0FkZE9yZGVyAAAABgAAAAVwcmljZQAAAApuZXdPcmRlcklkAAAAAWkAAAAJcHJldk9yZGVyAAAACW5leHRPcmRlcgAAAApmaXJzdE9yZGVyBAAAAAZhbW91bnQICQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAQAAAAQaXNPbmVGb3JPbmVPcmRlcgkAAAAAAAACBQAAAAVwcmljZQAAAAAAAAAAZAQAAAAQaXNGaXJzdE9yZGVyRW10eQkAAAAAAAACBQAAAApmaXJzdE9yZGVyAgAAAAAEAAAAKWlzTmV3T3JkZXJQcmljZUxvd2VyVGhhbkN1cnJlbnRGaXJzdE9yZGVyCQAAZgAAAAIJAQAAAA1nZXRPcmRlclByaWNlAAAAAQUAAAAKZmlyc3RPcmRlcgUAAAAFcHJpY2UEAAAADW5ld0ZpcnN0T3JkZXIDBQAAABBpc0ZpcnN0T3JkZXJFbXR5BQAAAApuZXdPcmRlcklkAwUAAAApaXNOZXdPcmRlclByaWNlTG93ZXJUaGFuQ3VycmVudEZpcnN0T3JkZXIFAAAACm5ld09yZGVySWQFAAAACmZpcnN0T3JkZXIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAD2dldFByZXZPcmRlcktleQAAAAEFAAAACm5ld09yZGVySWQFAAAACXByZXZPcmRlcgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAPZ2V0TmV4dE9yZGVyS2V5AAAAAQUAAAAKbmV3T3JkZXJJZAUAAAAJbmV4dE9yZGVyCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAA9nZXROZXh0T3JkZXJLZXkAAAABBQAAAAlwcmV2T3JkZXIDCQAAAAAAAAIFAAAACXByZXZPcmRlcgIAAAAABQAAAAlwcmV2T3JkZXIFAAAACm5ld09yZGVySWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAD2dldFByZXZPcmRlcktleQAAAAEFAAAACW5leHRPcmRlcgMJAAAAAAAAAgUAAAAJbmV4dE9yZGVyAgAAAAAFAAAACW5leHRPcmRlcgUAAAAKbmV3T3JkZXJJZAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAA1GaXJzdE9yZGVyS2V5BQAAAA1uZXdGaXJzdE9yZGVyCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAQZ2V0T3JkZXJQcmljZUtleQAAAAEFAAAACm5ld09yZGVySWQFAAAABXByaWNlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAQZ2V0T3JkZXJUb3RhbEtleQAAAAEFAAAACm5ld09yZGVySWQFAAAABmFtb3VudAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAQZ2V0T3JkZXJPd25lcktleQAAAAEFAAAACm5ld09yZGVySWQJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAARZ2V0T3JkZXJIZWlnaHRLZXkAAAABBQAAAApuZXdPcmRlcklkBQAAAAZoZWlnaHQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEWdldE9yZGVyU3RhdHVzS2V5AAAAAQUAAAAKbmV3T3JkZXJJZAUAAAADTkVXCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAFkN1cnJlbnREZWZhdWx0T3JkZXJLZXkDBQAAABBpc09uZUZvck9uZU9yZGVyBQAAAApuZXdPcmRlcklkBQAAABNjdXJyZW50RGVmYXVsdE9yZGVyBQAAAANuaWwBAAAAG2ludGVybmFsQWRkTGlxdWlkYXRpb25PcmRlcgAAAAMAAAABaQAAAAVwcmljZQAAAAlwcmV2T3JkZXIEAAAAA3BtdAkBAAAABXZhbHVlAAAAAQkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAQAAAAKbmV3T3JkZXJJZAkAAlgAAAABCQAB9QAAAAEJAADLAAAAAgkAAMsAAAACCQAAywAAAAIJAAGaAAAAAQgFAAAAA3BtdAAAAAZhbW91bnQICAUAAAABaQAAAAZjYWxsZXIAAAAFYnl0ZXMJAAGaAAAAAQUAAAAGaGVpZ2h0CAUAAAABaQAAAA10cmFuc2FjdGlvbklkBAAAAAVvd25lcgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAAEGlzRW1wdHlQcmV2T3JkZXIJAAAAAAAAAgUAAAAJcHJldk9yZGVyAgAAAAAEAAAAEWlzRW1wdHlGaXJzdE9yZGVyCQAAAAAAAAIFAAAACmZpcnN0T3JkZXICAAAAAAMFAAAACWlzQmxvY2tlZAkAAAIAAAABAgAAAFljb250cmFjdCBpcyBibG9ja2VkIGJ5IEVNRVJHRU5DWSBTSFVURE9XTiBhY3Rpb25zIHVudGlsIHJlYWN0aXZhdGlvbiBieSBlbWVyZ2VuY3kgb3JhY2xlcwMJAABmAAAAAgUAAAAFUEFVTEkIBQAAAANwbXQAAAAGYW1vdW50CQAAAgAAAAECAAAAKW9yZGVyIGFtb3VudCBzaG91bGQgYmUgaGlnaGVyIHRoYW4gMSBOU0JUAwkAAGYAAAACAAAAAAAAAABkBQAAAAVwcmljZQkAAAIAAAABCQABLAAAAAICAAAATHByaWNlIHNob3VsZCBiZSBlcXVhbCBvciBoaWdoZXIgdGhhbiAxIG5zYnQgZm9yIDEgdXNkbi4gaS5lLiA+PSAxMDA7IHByaWNlOiAJAAGkAAAAAQUAAAAFcHJpY2UDCQEAAAACIT0AAAACCAUAAAADcG10AAAAB2Fzc2V0SWQFAAAAC2JvbmRBc3NldElkCQAAAgAAAAECAAAANGNhbiB1c2UgYXBwcm9wcmlhdGUgbmV1dHJpbm8gYmFzZSB0b2tlbnMgKG5zYnQpIG9ubHkDCQEAAAACIT0AAAACCQEAAAANZ2V0T3JkZXJPd25lcgAAAAEFAAAACm5ld09yZGVySWQCAAAAAAkAAAIAAAABAgAAABh0aGUgb3JkZXIgYWxyZWFkeSBleGlzdHMDAwkBAAAAASEAAAABBQAAABBpc0VtcHR5UHJldk9yZGVyCQEAAAACIT0AAAACCQEAAAAOZ2V0T3JkZXJTdGF0dXMAAAABBQAAAAlwcmV2T3JkZXIFAAAAA05FVwcJAAACAAAAAQIAAAAccHJldiBvcmRlciBzdGF0dXMgaXMgbm90IG5ldwMDBQAAABFpc0VtcHR5Rmlyc3RPcmRlcgkBAAAAASEAAAABBQAAABBpc0VtcHR5UHJldk9yZGVyBwkAAAIAAAABAgAAABp3cm9uZyBwcmV2IG9yZGVyIHBhcmFtZXRlcgQAAAAJbmV4dE9yZGVyAwUAAAAQaXNFbXB0eVByZXZPcmRlcgUAAAAKZmlyc3RPcmRlcgkBAAAADGdldE5leHRPcmRlcgAAAAEFAAAACXByZXZPcmRlcgQAAAAQaXNFbXB0eU5leHRPcmRlcgkAAAAAAAACBQAAAAluZXh0T3JkZXICAAAAAAMFAAAAEWlzRW1wdHlGaXJzdE9yZGVyCQEAAAAbZ2VuZXJhdGVEYXRhRW50cnlUb0FkZE9yZGVyAAAABgUAAAAFcHJpY2UFAAAACm5ld09yZGVySWQFAAAAAWkFAAAACXByZXZPcmRlcgUAAAAJbmV4dE9yZGVyBQAAAApmaXJzdE9yZGVyBAAAAA5uZXh0T3JkZXJQcmljZQkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAEGdldE9yZGVyUHJpY2VLZXkAAAABBQAAAAluZXh0T3JkZXIEAAAADnByZXZPcmRlclByaWNlCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAQZ2V0T3JkZXJQcmljZUtleQAAAAEFAAAACXByZXZPcmRlcgQAAAAQaXNOZXh0T3JkZXJFcnJvcgMJAQAAAAEhAAAAAQUAAAAQaXNFbXB0eU5leHRPcmRlcgkAAGcAAAACBQAAAAVwcmljZQUAAAAObmV4dE9yZGVyUHJpY2UHBAAAABBpc1ByZXZPcmRlckVycm9yAwkBAAAAASEAAAABBQAAABBpc0VtcHR5UHJldk9yZGVyCQAAZgAAAAIFAAAADnByZXZPcmRlclByaWNlBQAAAAVwcmljZQcDAwUAAAAQaXNOZXh0T3JkZXJFcnJvcgYFAAAAEGlzUHJldk9yZGVyRXJyb3IJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAfaW52YWxpZCBvcmRlciBpc1ByZXZPcmRlckVycm9yOgkAAaUAAAABBQAAABBpc1ByZXZPcmRlckVycm9yAgAAABIgaXNOZXh0T3JkZXJFcnJvcjoJAAGlAAAAAQUAAAAQaXNOZXh0T3JkZXJFcnJvcgkBAAAAG2dlbmVyYXRlRGF0YUVudHJ5VG9BZGRPcmRlcgAAAAYFAAAABXByaWNlBQAAAApuZXdPcmRlcklkBQAAAAFpBQAAAAlwcmV2T3JkZXIFAAAACW5leHRPcmRlcgUAAAAKZmlyc3RPcmRlcgEAAAAaY29tcHV0ZUN1cnJlbnREZWZhdWx0T3JkZXIAAAABAAAAAmlkAwkBAAAAAiE9AAAAAgUAAAACaWQFAAAAE2N1cnJlbnREZWZhdWx0T3JkZXIFAAAAE2N1cnJlbnREZWZhdWx0T3JkZXICAAAAAAAAAAQAAAABaQEAAAAcYWRkTGlxdWlkYXRpb25PcmRlcldpdGhQcmljZQAAAAIAAAAFcHJpY2UAAAAJcHJldk9yZGVyCQEAAAAbaW50ZXJuYWxBZGRMaXF1aWRhdGlvbk9yZGVyAAAAAwUAAAABaQUAAAAFcHJpY2UFAAAACXByZXZPcmRlcgAAAAFpAQAAABNhZGRMaXF1aWRhdGlvbk9yZGVyAAAAAAkBAAAAG2ludGVybmFsQWRkTGlxdWlkYXRpb25PcmRlcgAAAAMFAAAAAWkAAAAAAAAAAGQFAAAAE2N1cnJlbnREZWZhdWx0T3JkZXIAAAABaQEAAAALY2FuY2VsT3JkZXIAAAABAAAAB29yZGVySWQEAAAABW93bmVyCQEAAAANZ2V0T3JkZXJPd25lcgAAAAEFAAAAB29yZGVySWQEAAAABmFtb3VudAkAAGUAAAACCQEAAAANZ2V0T3JkZXJUb3RhbAAAAAEFAAAAB29yZGVySWQJAQAAABNnZXRPcmRlckZpbGxlZFRvdGFsAAAAAQUAAAAHb3JkZXJJZAQAAAAGY2FsbGVyCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAAJbmV4dE9yZGVyCQEAAAAMZ2V0TmV4dE9yZGVyAAAAAQUAAAAHb3JkZXJJZAQAAAAJcHJldk9yZGVyCQEAAAAMZ2V0UHJldk9yZGVyAAAAAQUAAAAHb3JkZXJJZAQAAAAOaXNEZWZhdWx0T3JkZXIJAAAAAAAAAgUAAAAHb3JkZXJJZAUAAAATY3VycmVudERlZmF1bHRPcmRlcgQAAAAWaXNQcmV2Q2FuQmVjb21lRGVmYXVsdAkAAAAAAAACCQEAAAAOZ2V0T3JkZXJTdGF0dXMAAAABBQAAAAlwcmV2T3JkZXIFAAAAA05FVwQAAAAPbmV3RGVmYXVsdE9yZGVyAwUAAAAOaXNEZWZhdWx0T3JkZXIDBQAAABZpc1ByZXZDYW5CZWNvbWVEZWZhdWx0BQAAAAlwcmV2T3JkZXICAAAAAAUAAAATY3VycmVudERlZmF1bHRPcmRlcgMFAAAACWlzQmxvY2tlZAkAAAIAAAABAgAAAFljb250cmFjdCBpcyBibG9ja2VkIGJ5IEVNRVJHRU5DWSBTSFVURE9XTiBhY3Rpb25zIHVudGlsIHJlYWN0aXZhdGlvbiBieSBlbWVyZ2VuY3kgb3JhY2xlcwMJAQAAAAIhPQAAAAIFAAAABW93bmVyBQAAAAZjYWxsZXIJAAACAAAAAQIAAAARcGVybWlzc2lvbiBkZW5pZWQDCQEAAAACIT0AAAACCQEAAAAOZ2V0T3JkZXJTdGF0dXMAAAABBQAAAAdvcmRlcklkBQAAAANORVcJAAACAAAAAQIAAAAUaW52YWxpZCBvcmRlciBzdGF0dXMJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAWQ3VycmVudERlZmF1bHRPcmRlcktleQUAAAAPbmV3RGVmYXVsdE9yZGVyCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAADUZpcnN0T3JkZXJLZXkDCQAAAAAAAAIFAAAACmZpcnN0T3JkZXIFAAAAB29yZGVySWQFAAAACW5leHRPcmRlcgUAAAAKZmlyc3RPcmRlcgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAPZ2V0TmV4dE9yZGVyS2V5AAAAAQUAAAAJcHJldk9yZGVyBQAAAAluZXh0T3JkZXIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAD2dldFByZXZPcmRlcktleQAAAAEFAAAACW5leHRPcmRlcgUAAAAJcHJldk9yZGVyCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABFnZXRPcmRlclN0YXR1c0tleQAAAAEFAAAAB29yZGVySWQFAAAACENBTkNFTEVECQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAGYW1vdW50BQAAAAtib25kQXNzZXRJZAUAAAADbmlsAAAAAWkBAAAADWxpcXVpZGF0ZUJvbmQAAAAABAAAABJsaXF1aWRhdGlvbkJhbGFuY2UJAAPwAAAAAgUAAAAEdGhpcwUAAAAPbmV1dHJpbm9Bc3NldElkBAAAAA9zdXJwbHVzUG9zaXRpdmUDCQAAZwAAAAIAAAAAAAAAAAAFAAAAB3N1cnBsdXMAAAAAAAAAAAAFAAAAB3N1cnBsdXMEAAAACnVzZG5BbW91bnQDCQAAZwAAAAIFAAAAD3N1cnBsdXNQb3NpdGl2ZQUAAAASbGlxdWlkYXRpb25CYWxhbmNlBQAAABJsaXF1aWRhdGlvbkJhbGFuY2UFAAAAD3N1cnBsdXNQb3NpdGl2ZQQAAAAMcmV0dXJuQW1vdW50AwkAAGcAAAACBQAAAA9zdXJwbHVzUG9zaXRpdmUFAAAAEmxpcXVpZGF0aW9uQmFsYW5jZQAAAAAAAAAAAAkAAGUAAAACBQAAABJsaXF1aWRhdGlvbkJhbGFuY2UFAAAAD3N1cnBsdXNQb3NpdGl2ZQMFAAAACWlzQmxvY2tlZAkAAAIAAAABAgAAAFljb250cmFjdCBpcyBibG9ja2VkIGJ5IEVNRVJHRU5DWSBTSFVURE9XTiBhY3Rpb25zIHVudGlsIHJlYWN0aXZhdGlvbiBieSBlbWVyZ2VuY3kgb3JhY2xlcwMJAAAAAAAAAgUAAAASbGlxdWlkYXRpb25CYWxhbmNlAAAAAAAAAAAACQAAAgAAAAECAAAAIHdpdGhvdXQgYmFzZSB0b2tlbnMgdG8gbGlxdWlkYXRlAwkAAGYAAAACBQAAAAxyZXR1cm5BbW91bnQAAAAAAAAAAAAJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAQbmV1dHJpbm9Db250cmFjdAUAAAAMcmV0dXJuQW1vdW50BQAAAA9uZXV0cmlub0Fzc2V0SWQFAAAAA25pbAMJAAAAAAAAAgUAAAAKZmlyc3RPcmRlcgIAAAAACQAAAgAAAAECAAAAD2VtcHR5IG9yZGVyYm9vawQAAAAJbmV4dE9yZGVyCQEAAAAMZ2V0TmV4dE9yZGVyAAAAAQUAAAAKZmlyc3RPcmRlcgQAAAALZmlsbGVkVG90YWwJAQAAABNnZXRPcmRlckZpbGxlZFRvdGFsAAAAAQUAAAAKZmlyc3RPcmRlcgQAAAAObnNidDJVc2RuUHJpY2UJAQAAAA1nZXRPcmRlclByaWNlAAAAAQUAAAAKZmlyc3RPcmRlcgQAAAANcmVtYWluZWRUb3RhbAkAAGUAAAACCQEAAAANZ2V0T3JkZXJUb3RhbAAAAAEFAAAACmZpcnN0T3JkZXIFAAAAC2ZpbGxlZFRvdGFsBAAAACB0b3RhbFVTRE5SZXF1aXJlZFRvRmlsbE9yZGVyWDEwMAkAAGsAAAADBQAAAA1yZW1haW5lZFRvdGFsBQAAAA5uc2J0MlVzZG5QcmljZQAAAAAAAAAAAQQAAAAcdG90YWxVU0ROUmVxdWlyZWRUb0ZpbGxPcmRlcgkAAGkAAAACBQAAACB0b3RhbFVTRE5SZXF1aXJlZFRvRmlsbE9yZGVyWDEwMAAAAAAAAAAAZAQAAAATaXNPcmRlckZ1bGx5RmlsYWJsZQkAAGcAAAACBQAAAAp1c2RuQW1vdW50BQAAABx0b3RhbFVTRE5SZXF1aXJlZFRvRmlsbE9yZGVyBAAAABdmaWxsYWJsZU9yZGVyQW1vdW50WDEwMAMFAAAAE2lzT3JkZXJGdWxseUZpbGFibGUFAAAAIHRvdGFsVVNETlJlcXVpcmVkVG9GaWxsT3JkZXJYMTAwCQAAaAAAAAIFAAAACnVzZG5BbW91bnQAAAAAAAAAAGQEAAAAEGZpbmFsTkJURmlsbGFibGUJAABrAAAAAwUAAAAXZmlsbGFibGVPcmRlckFtb3VudFgxMDAAAAAAAAAAAAEFAAAADm5zYnQyVXNkblByaWNlBAAAABNmaWxsYWJsZU9yZGVyQW1vdW50CQAAaQAAAAIFAAAAF2ZpbGxhYmxlT3JkZXJBbW91bnRYMTAwAAAAAAAAAABkBAAAABpuYlRva2Vuc0xpcXVpZGF0ZUNvbmRpdGlvbgkAAGcAAAACCQAAawAAAAMJAABkAAAAAgUAAAAHc3VycGx1cwUAAAAObmV1dHJpbm9TdXBwbHkAAAAAAAAAAGQFAAAADm5ldXRyaW5vU3VwcGx5BQAAAA5uc2J0MlVzZG5QcmljZQMJAQAAAAEhAAAAAQUAAAAabmJUb2tlbnNMaXF1aWRhdGVDb25kaXRpb24JAAACAAAAAQkAASwAAAACAgAAABdpbm5hcHJvcHJpYXRlIHN1cnBsdXM6IAkAAaQAAAABBQAAAAdzdXJwbHVzBAAAABJpc05vdGhpbmdUb0ZpbGxOb3cJAAAAAAAAAgUAAAANcmVtYWluZWRUb3RhbAAAAAAAAAAAAAQAAAAUaXNOb3RoaW5nVG9GaWxsQXRBbGwJAAAAAAAAAgkAAGQAAAACBQAAAAtmaWxsZWRUb3RhbAUAAAAQZmluYWxOQlRGaWxsYWJsZQkBAAAADWdldE9yZGVyVG90YWwAAAABBQAAAApmaXJzdE9yZGVyBAAAAAluZXdTdGF0dXMDAwUAAAATaXNPcmRlckZ1bGx5RmlsYWJsZQMFAAAAEmlzTm90aGluZ1RvRmlsbE5vdwYFAAAAFGlzTm90aGluZ1RvRmlsbEF0QWxsBwUAAAAGRklMTEVEBQAAAANORVcJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAD2dldFByZXZPcmRlcktleQAAAAEFAAAACW5leHRPcmRlcgMJAAAAAAAAAgUAAAAJbmV3U3RhdHVzBQAAAAZGSUxMRUQCAAAAAAUAAAAKZmlyc3RPcmRlcgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAA1GaXJzdE9yZGVyS2V5AwkAAAAAAAACBQAAAAluZXdTdGF0dXMFAAAABkZJTExFRAUAAAAJbmV4dE9yZGVyBQAAAApmaXJzdE9yZGVyCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAWZ2V0T3JkZXJGaWxsZWRUb3RhbEtleQAAAAEFAAAACmZpcnN0T3JkZXIJAABkAAAAAgUAAAALZmlsbGVkVG90YWwFAAAAEGZpbmFsTkJURmlsbGFibGUJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEWdldE9yZGVyU3RhdHVzS2V5AAAAAQUAAAAKZmlyc3RPcmRlcgUAAAAJbmV3U3RhdHVzCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAFkN1cnJlbnREZWZhdWx0T3JkZXJLZXkDCQAAAAAAAAIFAAAACW5ld1N0YXR1cwUAAAADTkVXBQAAABNjdXJyZW50RGVmYXVsdE9yZGVyCQEAAAAaY29tcHV0ZUN1cnJlbnREZWZhdWx0T3JkZXIAAAABBQAAAApmaXJzdE9yZGVyCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAQAAAA1nZXRPcmRlck93bmVyAAAAAQUAAAAKZmlyc3RPcmRlcgUAAAATZmlsbGFibGVPcmRlckFtb3VudAUAAAAPbmV1dHJpbm9Bc3NldElkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAAEGZpbmFsTkJURmlsbGFibGUFAAAAC2JvbmRBc3NldElkBQAAAANuaWwAAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAABAAAABBwdWJLZXlBZG1pbnNMaXN0CQAETAAAAAICAAAALEJMRW9ndXpQVktWVGZYeHhUM1c3UnFmOGFVbTJnZ0M5VmVtZDJNUWF3TTJHCQAETAAAAAICAAAALEZXVmZmWXIyQUxtSE1lalptM1dxZUx6NlNkeW0zZ0xGR3RKbjRLVHd5VTV4CQAETAAAAAICAAAALDNXaDJMYVdjYjVnZzdLMnBQY1czRXA2RUF1UkJ6WWtBZ3JkcHQ0M2pUREZhCQAETAAAAAICAAAALDVXUlhGU2p3Y1RiTmZLY0pzOFpxWG1TU1dZc1NWSlV0TXZNcVpqNWhINE5jBQAAAANuaWwEAAAABWNvdW50CQAAZAAAAAIJAABkAAAAAgkAAGQAAAACAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAJAAJZAAAAAQkAAZEAAAACBQAAABBwdWJLZXlBZG1pbnNMaXN0AAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAEJAAJZAAAAAQkAAZEAAAACBQAAABBwdWJLZXlBZG1pbnNMaXN0AAAAAAAAAAABAAAAAAAAAAABAAAAAAAAAAAAAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAIJAAJZAAAAAQkAAZEAAAACBQAAABBwdWJLZXlBZG1pbnNMaXN0AAAAAAAAAAACAAAAAAAAAAABAAAAAAAAAAAAAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAMJAAJZAAAAAQkAAZEAAAACBQAAABBwdWJLZXlBZG1pbnNMaXN0AAAAAAAAAAADAAAAAAAAAAACAAAAAAAAAAAACQAAZwAAAAIFAAAABWNvdW50AAAAAAAAAAAD5LgBXA==", "chainId": 87, "height": 2230048, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: ELt2Uz9oH4wSoqWy6hPR8GRWwvndCasRUJzRP46VxJYN Next: 5N9L2rKZ7netVmqVXKbiQgmgPFwyyDRhGMN3uYgePyr8 Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 3 #-}
1+{-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-func getNumberByKey (key) = match getInteger(this, key) {
5- case a: Int =>
6- a
7- case _ =>
8- 0
9-}
4+func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0)
105
116
12-func getStringByKey (key) = match getString(this, key) {
13- case a: String =>
14- a
15- case _ =>
16- ""
17-}
7+func getStringByKey (key) = valueOrElse(getString(this, key), "")
188
199
20-func getBoolByAddressAndKey (address,key) = match getBoolean(address, key) {
21- case a: Boolean =>
22- a
23- case _ =>
24- false
25-}
10+func getBoolByAddressAndKey (address,key) = valueOrElse(getBoolean(address, key), false)
2611
2712
28-func getStringByAddressAndKey (address,key) = match getString(address, key) {
29- case a: String =>
30- a
31- case _ =>
32- ""
33-}
13+func getStringByAddressAndKey (address,key) = valueOrElse(getString(address, key), "")
3414
3515
36-func getNumberByAddressAndKey (address,key) = match getInteger(address, key) {
37- case a: Int =>
38- a
39- case _ =>
40- 0
41-}
16+func getNumberByAddressAndKey (address,key) = valueOrElse(getInteger(address, key), 0)
4217
4318
4419 let WAVELET = 100000000
126101
127102 let wavesLockedBalance = getNumberByAddressAndKey(neutrinoContract, WavesLockedBalanceKey)
128103
129-let reserve = (wavesBalance(neutrinoContract) - wavesLockedBalance)
104+let reserve = (wavesBalance(neutrinoContract).regular - wavesLockedBalance)
130105
131-let neutrinoSupply = (((neutrinoLockedBalance + extract(assetInfo(neutrinoAssetId)).quantity) - assetBalance(neutrinoContract, neutrinoAssetId)) - assetBalance(liquidationContract, neutrinoAssetId))
106+let neutrinoSupply = (((neutrinoLockedBalance + value(assetInfo(neutrinoAssetId)).quantity) - assetBalance(neutrinoContract, neutrinoAssetId)) - assetBalance(liquidationContract, neutrinoAssetId))
132107
133108 let surplus = (convertWavesToNeutrino(reserve, currentPrice) - neutrinoSupply)
134109
159134 let currentDefaultOrder = getStringByKey(CurrentDefaultOrderKey)
160135
161136 func generateDataEntryToAddOrder (price,newOrderId,i,prevOrder,nextOrder,firstOrder) = {
162- let amount = extract(i.payment).amount
137+ let amount = value(i.payments[0]).amount
163138 let isOneForOneOrder = (price == 100)
164139 let isFirstOrderEmty = (firstOrder == "")
165140 let isNewOrderPriceLowerThanCurrentFirstOrder = (getOrderPrice(firstOrder) > price)
168143 else if (isNewOrderPriceLowerThanCurrentFirstOrder)
169144 then newOrderId
170145 else firstOrder
171-[DataEntry(getPrevOrderKey(newOrderId), prevOrder), DataEntry(getNextOrderKey(newOrderId), nextOrder), DataEntry(getNextOrderKey(prevOrder), if ((prevOrder == ""))
146+[StringEntry(getPrevOrderKey(newOrderId), prevOrder), StringEntry(getNextOrderKey(newOrderId), nextOrder), StringEntry(getNextOrderKey(prevOrder), if ((prevOrder == ""))
172147 then prevOrder
173- else newOrderId), DataEntry(getPrevOrderKey(nextOrder), if ((nextOrder == ""))
148+ else newOrderId), StringEntry(getPrevOrderKey(nextOrder), if ((nextOrder == ""))
174149 then nextOrder
175- else newOrderId), DataEntry(FirstOrderKey, newFirstOrder), DataEntry(getOrderPriceKey(newOrderId), price), DataEntry(getOrderTotalKey(newOrderId), amount), DataEntry(getOrderOwnerKey(newOrderId), toString(i.caller)), DataEntry(getOrderHeightKey(newOrderId), height), DataEntry(getOrderStatusKey(newOrderId), NEW), DataEntry(CurrentDefaultOrderKey, if (isOneForOneOrder)
150+ else newOrderId), StringEntry(FirstOrderKey, newFirstOrder), IntegerEntry(getOrderPriceKey(newOrderId), price), IntegerEntry(getOrderTotalKey(newOrderId), amount), StringEntry(getOrderOwnerKey(newOrderId), toString(i.caller)), IntegerEntry(getOrderHeightKey(newOrderId), height), StringEntry(getOrderStatusKey(newOrderId), NEW), StringEntry(CurrentDefaultOrderKey, if (isOneForOneOrder)
176151 then newOrderId
177152 else currentDefaultOrder)]
178153 }
179154
180155
181156 func internalAddLiquidationOrder (i,price,prevOrder) = {
182- let pmt = extract(i.payment)
157+ let pmt = value(i.payments[0])
183158 let newOrderId = toBase58String(keccak256((((toBytes(pmt.amount) + i.caller.bytes) + toBytes(height)) + i.transactionId)))
184159 let owner = toString(i.caller)
185160 let isEmptyPrevOrder = (prevOrder == "")
208183 else getNextOrder(prevOrder)
209184 let isEmptyNextOrder = (nextOrder == "")
210185 if (isEmptyFirstOrder)
211- then WriteSet(generateDataEntryToAddOrder(price, newOrderId, i, prevOrder, nextOrder, firstOrder))
186+ then generateDataEntryToAddOrder(price, newOrderId, i, prevOrder, nextOrder, firstOrder)
212187 else {
213188 let nextOrderPrice = getNumberByKey(getOrderPriceKey(nextOrder))
214189 let prevOrderPrice = getNumberByKey(getOrderPriceKey(prevOrder))
222197 then true
223198 else isPrevOrderError)
224199 then throw(((("invalid order isPrevOrderError:" + toString(isPrevOrderError)) + " isNextOrderError:") + toString(isNextOrderError)))
225- else WriteSet(generateDataEntryToAddOrder(price, newOrderId, i, prevOrder, nextOrder, firstOrder))
200+ else generateDataEntryToAddOrder(price, newOrderId, i, prevOrder, nextOrder, firstOrder)
226201 }
227202 }
228203 }
263238 then throw("permission denied")
264239 else if ((getOrderStatus(orderId) != NEW))
265240 then throw("invalid order status")
266- else ScriptResult(WriteSet([DataEntry(CurrentDefaultOrderKey, newDefaultOrder), DataEntry(FirstOrderKey, if ((firstOrder == orderId))
241+ else [StringEntry(CurrentDefaultOrderKey, newDefaultOrder), StringEntry(FirstOrderKey, if ((firstOrder == orderId))
267242 then nextOrder
268- else firstOrder), DataEntry(getNextOrderKey(prevOrder), nextOrder), DataEntry(getPrevOrderKey(nextOrder), prevOrder), DataEntry(getOrderStatusKey(orderId), CANCELED)]), TransferSet([ScriptTransfer(i.caller, amount, bondAssetId)]))
243+ else firstOrder), StringEntry(getNextOrderKey(prevOrder), nextOrder), StringEntry(getPrevOrderKey(nextOrder), prevOrder), StringEntry(getOrderStatusKey(orderId), CANCELED), ScriptTransfer(i.caller, amount, bondAssetId)]
269244 }
270245
271246
287262 else if ((liquidationBalance == 0))
288263 then throw("without base tokens to liquidate")
289264 else if ((returnAmount > 0))
290- then TransferSet([ScriptTransfer(neutrinoContract, returnAmount, neutrinoAssetId)])
265+ then [ScriptTransfer(neutrinoContract, returnAmount, neutrinoAssetId)]
291266 else if ((firstOrder == ""))
292267 then throw("empty orderbook")
293268 else {
316291 else false)
317292 then FILLED
318293 else NEW
319- ScriptResult(WriteSet([DataEntry(getPrevOrderKey(nextOrder), if ((newStatus == FILLED))
294+[StringEntry(getPrevOrderKey(nextOrder), if ((newStatus == FILLED))
320295 then ""
321- else firstOrder), DataEntry(FirstOrderKey, if ((newStatus == FILLED))
296+ else firstOrder), StringEntry(FirstOrderKey, if ((newStatus == FILLED))
322297 then nextOrder
323- else firstOrder), DataEntry(getOrderFilledTotalKey(firstOrder), (filledTotal + finalNBTFillable)), DataEntry(getOrderStatusKey(firstOrder), newStatus), DataEntry(CurrentDefaultOrderKey, if ((newStatus == NEW))
298+ else firstOrder), IntegerEntry(getOrderFilledTotalKey(firstOrder), (filledTotal + finalNBTFillable)), StringEntry(getOrderStatusKey(firstOrder), newStatus), StringEntry(CurrentDefaultOrderKey, if ((newStatus == NEW))
324299 then currentDefaultOrder
325- else computeCurrentDefaultOrder(firstOrder))]), TransferSet([ScriptTransfer(addressFromStringValue(getOrderOwner(firstOrder)), fillableOrderAmount, neutrinoAssetId), ScriptTransfer(neutrinoContract, finalNBTFillable, bondAssetId)]))
300+ else computeCurrentDefaultOrder(firstOrder)), ScriptTransfer(addressFromStringValue(getOrderOwner(firstOrder)), fillableOrderAmount, neutrinoAssetId), ScriptTransfer(neutrinoContract, finalNBTFillable, bondAssetId)]
326301 }
327302 }
328303 }
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 3 #-}
1+{-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-func getNumberByKey (key) = match getInteger(this, key) {
5- case a: Int =>
6- a
7- case _ =>
8- 0
9-}
4+func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0)
105
116
12-func getStringByKey (key) = match getString(this, key) {
13- case a: String =>
14- a
15- case _ =>
16- ""
17-}
7+func getStringByKey (key) = valueOrElse(getString(this, key), "")
188
199
20-func getBoolByAddressAndKey (address,key) = match getBoolean(address, key) {
21- case a: Boolean =>
22- a
23- case _ =>
24- false
25-}
10+func getBoolByAddressAndKey (address,key) = valueOrElse(getBoolean(address, key), false)
2611
2712
28-func getStringByAddressAndKey (address,key) = match getString(address, key) {
29- case a: String =>
30- a
31- case _ =>
32- ""
33-}
13+func getStringByAddressAndKey (address,key) = valueOrElse(getString(address, key), "")
3414
3515
36-func getNumberByAddressAndKey (address,key) = match getInteger(address, key) {
37- case a: Int =>
38- a
39- case _ =>
40- 0
41-}
16+func getNumberByAddressAndKey (address,key) = valueOrElse(getInteger(address, key), 0)
4217
4318
4419 let WAVELET = 100000000
4520
4621 let PAULI = 1000000
4722
4823 let PRICELET = 1000000
4924
5025 let CANCELED = "canceled"
5126
5227 let NEW = "new"
5328
5429 let FILLED = "filled"
5530
5631 let NeutrinoContractKey = "neutrino_contract"
5732
5833 let PriceKey = "price"
5934
6035 let BondAssetIdKey = "bond_asset_id"
6136
6237 let NeutrinoAssetIdKey = "neutrino_asset_id"
6338
6439 let ControlContractKey = "control_contract"
6540
6641 let BalanceLockedkKey = "balance_lock_"
6742
6843 let WavesLockedBalanceKey = (BalanceLockedkKey + "waves")
6944
7045 let NeutrinoLockedBalanceKey = (BalanceLockedkKey + "neutrino")
7146
7247 let FirstOrderKey = "order_first"
7348
7449 let CurrentDefaultOrderKey = "order_default"
7550
7651 func getOrderPriceKey (orderId) = ("order_price_" + orderId)
7752
7853
7954 func getOrderTotalKey (orderId) = ("order_total_" + orderId)
8055
8156
8257 func getOrderOwnerKey (orderId) = ("order_owner_" + orderId)
8358
8459
8560 func getOrderHeightKey (orderId) = ("order_height_" + orderId)
8661
8762
8863 func getOrderStatusKey (orderId) = ("order_status_" + orderId)
8964
9065
9166 func getOrderFilledTotalKey (orderId) = ("order_filled_total_" + orderId)
9267
9368
9469 func getPrevOrderKey (orderId) = ("order_prev_" + orderId)
9570
9671
9772 func getNextOrderKey (orderId) = ("order_next_" + orderId)
9873
9974
10075 func convertNeutrinoToWaves (amount,price) = fraction(fraction(amount, PRICELET, price), WAVELET, PAULI)
10176
10277
10378 func convertWavesToNeutrino (amount,price) = fraction(fraction(amount, price, PRICELET), PAULI, WAVELET)
10479
10580
10681 func convertWavesToBond (amount,price) = convertWavesToNeutrino(amount, price)
10782
10883
10984 let neutrinoContract = addressFromStringValue(getStringByKey(NeutrinoContractKey))
11085
11186 let controlContract = addressFromStringValue(getStringByAddressAndKey(neutrinoContract, ControlContractKey))
11287
11388 let liquidationContract = this
11489
11590 let neutrinoAssetId = fromBase58String(getStringByAddressAndKey(neutrinoContract, NeutrinoAssetIdKey))
11691
11792 let bondAssetId = fromBase58String("6nSpVyNH7yM69eg446wrQR94ipbbcmZMU1ENPwanC97g")
11893
11994 let firstOrder = getStringByKey(FirstOrderKey)
12095
12196 let isBlocked = getBoolByAddressAndKey(controlContract, "is_blocked")
12297
12398 let currentPrice = getNumberByAddressAndKey(controlContract, PriceKey)
12499
125100 let neutrinoLockedBalance = getNumberByAddressAndKey(neutrinoContract, NeutrinoLockedBalanceKey)
126101
127102 let wavesLockedBalance = getNumberByAddressAndKey(neutrinoContract, WavesLockedBalanceKey)
128103
129-let reserve = (wavesBalance(neutrinoContract) - wavesLockedBalance)
104+let reserve = (wavesBalance(neutrinoContract).regular - wavesLockedBalance)
130105
131-let neutrinoSupply = (((neutrinoLockedBalance + extract(assetInfo(neutrinoAssetId)).quantity) - assetBalance(neutrinoContract, neutrinoAssetId)) - assetBalance(liquidationContract, neutrinoAssetId))
106+let neutrinoSupply = (((neutrinoLockedBalance + value(assetInfo(neutrinoAssetId)).quantity) - assetBalance(neutrinoContract, neutrinoAssetId)) - assetBalance(liquidationContract, neutrinoAssetId))
132107
133108 let surplus = (convertWavesToNeutrino(reserve, currentPrice) - neutrinoSupply)
134109
135110 func getOrderPrice (id) = getNumberByKey(getOrderPriceKey(id))
136111
137112
138113 func getOrderTotal (id) = getNumberByKey(getOrderTotalKey(id))
139114
140115
141116 func getOrderOwner (id) = getStringByKey(getOrderOwnerKey(id))
142117
143118
144119 func getOrderStatus (id) = getStringByKey(getOrderStatusKey(id))
145120
146121
147122 func getOrderFilledTotal (id) = getNumberByKey(getOrderFilledTotalKey(id))
148123
149124
150125 func getOrderHeight (id) = getNumberByKey(getOrderHeightKey(id))
151126
152127
153128 func getPrevOrder (id) = getStringByKey(getPrevOrderKey(id))
154129
155130
156131 func getNextOrder (id) = getStringByKey(getNextOrderKey(id))
157132
158133
159134 let currentDefaultOrder = getStringByKey(CurrentDefaultOrderKey)
160135
161136 func generateDataEntryToAddOrder (price,newOrderId,i,prevOrder,nextOrder,firstOrder) = {
162- let amount = extract(i.payment).amount
137+ let amount = value(i.payments[0]).amount
163138 let isOneForOneOrder = (price == 100)
164139 let isFirstOrderEmty = (firstOrder == "")
165140 let isNewOrderPriceLowerThanCurrentFirstOrder = (getOrderPrice(firstOrder) > price)
166141 let newFirstOrder = if (isFirstOrderEmty)
167142 then newOrderId
168143 else if (isNewOrderPriceLowerThanCurrentFirstOrder)
169144 then newOrderId
170145 else firstOrder
171-[DataEntry(getPrevOrderKey(newOrderId), prevOrder), DataEntry(getNextOrderKey(newOrderId), nextOrder), DataEntry(getNextOrderKey(prevOrder), if ((prevOrder == ""))
146+[StringEntry(getPrevOrderKey(newOrderId), prevOrder), StringEntry(getNextOrderKey(newOrderId), nextOrder), StringEntry(getNextOrderKey(prevOrder), if ((prevOrder == ""))
172147 then prevOrder
173- else newOrderId), DataEntry(getPrevOrderKey(nextOrder), if ((nextOrder == ""))
148+ else newOrderId), StringEntry(getPrevOrderKey(nextOrder), if ((nextOrder == ""))
174149 then nextOrder
175- else newOrderId), DataEntry(FirstOrderKey, newFirstOrder), DataEntry(getOrderPriceKey(newOrderId), price), DataEntry(getOrderTotalKey(newOrderId), amount), DataEntry(getOrderOwnerKey(newOrderId), toString(i.caller)), DataEntry(getOrderHeightKey(newOrderId), height), DataEntry(getOrderStatusKey(newOrderId), NEW), DataEntry(CurrentDefaultOrderKey, if (isOneForOneOrder)
150+ else newOrderId), StringEntry(FirstOrderKey, newFirstOrder), IntegerEntry(getOrderPriceKey(newOrderId), price), IntegerEntry(getOrderTotalKey(newOrderId), amount), StringEntry(getOrderOwnerKey(newOrderId), toString(i.caller)), IntegerEntry(getOrderHeightKey(newOrderId), height), StringEntry(getOrderStatusKey(newOrderId), NEW), StringEntry(CurrentDefaultOrderKey, if (isOneForOneOrder)
176151 then newOrderId
177152 else currentDefaultOrder)]
178153 }
179154
180155
181156 func internalAddLiquidationOrder (i,price,prevOrder) = {
182- let pmt = extract(i.payment)
157+ let pmt = value(i.payments[0])
183158 let newOrderId = toBase58String(keccak256((((toBytes(pmt.amount) + i.caller.bytes) + toBytes(height)) + i.transactionId)))
184159 let owner = toString(i.caller)
185160 let isEmptyPrevOrder = (prevOrder == "")
186161 let isEmptyFirstOrder = (firstOrder == "")
187162 if (isBlocked)
188163 then throw("contract is blocked by EMERGENCY SHUTDOWN actions until reactivation by emergency oracles")
189164 else if ((PAULI > pmt.amount))
190165 then throw("order amount should be higher than 1 NSBT")
191166 else if ((100 > price))
192167 then throw(("price should be equal or higher than 1 nsbt for 1 usdn. i.e. >= 100; price: " + toString(price)))
193168 else if ((pmt.assetId != bondAssetId))
194169 then throw("can use appropriate neutrino base tokens (nsbt) only")
195170 else if ((getOrderOwner(newOrderId) != ""))
196171 then throw("the order already exists")
197172 else if (if (!(isEmptyPrevOrder))
198173 then (getOrderStatus(prevOrder) != NEW)
199174 else false)
200175 then throw("prev order status is not new")
201176 else if (if (isEmptyFirstOrder)
202177 then !(isEmptyPrevOrder)
203178 else false)
204179 then throw("wrong prev order parameter")
205180 else {
206181 let nextOrder = if (isEmptyPrevOrder)
207182 then firstOrder
208183 else getNextOrder(prevOrder)
209184 let isEmptyNextOrder = (nextOrder == "")
210185 if (isEmptyFirstOrder)
211- then WriteSet(generateDataEntryToAddOrder(price, newOrderId, i, prevOrder, nextOrder, firstOrder))
186+ then generateDataEntryToAddOrder(price, newOrderId, i, prevOrder, nextOrder, firstOrder)
212187 else {
213188 let nextOrderPrice = getNumberByKey(getOrderPriceKey(nextOrder))
214189 let prevOrderPrice = getNumberByKey(getOrderPriceKey(prevOrder))
215190 let isNextOrderError = if (!(isEmptyNextOrder))
216191 then (price >= nextOrderPrice)
217192 else false
218193 let isPrevOrderError = if (!(isEmptyPrevOrder))
219194 then (prevOrderPrice > price)
220195 else false
221196 if (if (isNextOrderError)
222197 then true
223198 else isPrevOrderError)
224199 then throw(((("invalid order isPrevOrderError:" + toString(isPrevOrderError)) + " isNextOrderError:") + toString(isNextOrderError)))
225- else WriteSet(generateDataEntryToAddOrder(price, newOrderId, i, prevOrder, nextOrder, firstOrder))
200+ else generateDataEntryToAddOrder(price, newOrderId, i, prevOrder, nextOrder, firstOrder)
226201 }
227202 }
228203 }
229204
230205
231206 func computeCurrentDefaultOrder (id) = if ((id != currentDefaultOrder))
232207 then currentDefaultOrder
233208 else ""
234209
235210
236211 @Callable(i)
237212 func addLiquidationOrderWithPrice (price,prevOrder) = internalAddLiquidationOrder(i, price, prevOrder)
238213
239214
240215
241216 @Callable(i)
242217 func addLiquidationOrder () = internalAddLiquidationOrder(i, 100, currentDefaultOrder)
243218
244219
245220
246221 @Callable(i)
247222 func cancelOrder (orderId) = {
248223 let owner = getOrderOwner(orderId)
249224 let amount = (getOrderTotal(orderId) - getOrderFilledTotal(orderId))
250225 let caller = toString(i.caller)
251226 let nextOrder = getNextOrder(orderId)
252227 let prevOrder = getPrevOrder(orderId)
253228 let isDefaultOrder = (orderId == currentDefaultOrder)
254229 let isPrevCanBecomeDefault = (getOrderStatus(prevOrder) == NEW)
255230 let newDefaultOrder = if (isDefaultOrder)
256231 then if (isPrevCanBecomeDefault)
257232 then prevOrder
258233 else ""
259234 else currentDefaultOrder
260235 if (isBlocked)
261236 then throw("contract is blocked by EMERGENCY SHUTDOWN actions until reactivation by emergency oracles")
262237 else if ((owner != caller))
263238 then throw("permission denied")
264239 else if ((getOrderStatus(orderId) != NEW))
265240 then throw("invalid order status")
266- else ScriptResult(WriteSet([DataEntry(CurrentDefaultOrderKey, newDefaultOrder), DataEntry(FirstOrderKey, if ((firstOrder == orderId))
241+ else [StringEntry(CurrentDefaultOrderKey, newDefaultOrder), StringEntry(FirstOrderKey, if ((firstOrder == orderId))
267242 then nextOrder
268- else firstOrder), DataEntry(getNextOrderKey(prevOrder), nextOrder), DataEntry(getPrevOrderKey(nextOrder), prevOrder), DataEntry(getOrderStatusKey(orderId), CANCELED)]), TransferSet([ScriptTransfer(i.caller, amount, bondAssetId)]))
243+ else firstOrder), StringEntry(getNextOrderKey(prevOrder), nextOrder), StringEntry(getPrevOrderKey(nextOrder), prevOrder), StringEntry(getOrderStatusKey(orderId), CANCELED), ScriptTransfer(i.caller, amount, bondAssetId)]
269244 }
270245
271246
272247
273248 @Callable(i)
274249 func liquidateBond () = {
275250 let liquidationBalance = assetBalance(this, neutrinoAssetId)
276251 let surplusPositive = if ((0 >= surplus))
277252 then 0
278253 else surplus
279254 let usdnAmount = if ((surplusPositive >= liquidationBalance))
280255 then liquidationBalance
281256 else surplusPositive
282257 let returnAmount = if ((surplusPositive >= liquidationBalance))
283258 then 0
284259 else (liquidationBalance - surplusPositive)
285260 if (isBlocked)
286261 then throw("contract is blocked by EMERGENCY SHUTDOWN actions until reactivation by emergency oracles")
287262 else if ((liquidationBalance == 0))
288263 then throw("without base tokens to liquidate")
289264 else if ((returnAmount > 0))
290- then TransferSet([ScriptTransfer(neutrinoContract, returnAmount, neutrinoAssetId)])
265+ then [ScriptTransfer(neutrinoContract, returnAmount, neutrinoAssetId)]
291266 else if ((firstOrder == ""))
292267 then throw("empty orderbook")
293268 else {
294269 let nextOrder = getNextOrder(firstOrder)
295270 let filledTotal = getOrderFilledTotal(firstOrder)
296271 let nsbt2UsdnPrice = getOrderPrice(firstOrder)
297272 let remainedTotal = (getOrderTotal(firstOrder) - filledTotal)
298273 let totalUSDNRequiredToFillOrderX100 = fraction(remainedTotal, nsbt2UsdnPrice, 1)
299274 let totalUSDNRequiredToFillOrder = (totalUSDNRequiredToFillOrderX100 / 100)
300275 let isOrderFullyFilable = (usdnAmount >= totalUSDNRequiredToFillOrder)
301276 let fillableOrderAmountX100 = if (isOrderFullyFilable)
302277 then totalUSDNRequiredToFillOrderX100
303278 else (usdnAmount * 100)
304279 let finalNBTFillable = fraction(fillableOrderAmountX100, 1, nsbt2UsdnPrice)
305280 let fillableOrderAmount = (fillableOrderAmountX100 / 100)
306281 let nbTokensLiquidateCondition = (fraction((surplus + neutrinoSupply), 100, neutrinoSupply) >= nsbt2UsdnPrice)
307282 if (!(nbTokensLiquidateCondition))
308283 then throw(("innapropriate surplus: " + toString(surplus)))
309284 else {
310285 let isNothingToFillNow = (remainedTotal == 0)
311286 let isNothingToFillAtAll = ((filledTotal + finalNBTFillable) == getOrderTotal(firstOrder))
312287 let newStatus = if (if (isOrderFullyFilable)
313288 then if (isNothingToFillNow)
314289 then true
315290 else isNothingToFillAtAll
316291 else false)
317292 then FILLED
318293 else NEW
319- ScriptResult(WriteSet([DataEntry(getPrevOrderKey(nextOrder), if ((newStatus == FILLED))
294+[StringEntry(getPrevOrderKey(nextOrder), if ((newStatus == FILLED))
320295 then ""
321- else firstOrder), DataEntry(FirstOrderKey, if ((newStatus == FILLED))
296+ else firstOrder), StringEntry(FirstOrderKey, if ((newStatus == FILLED))
322297 then nextOrder
323- else firstOrder), DataEntry(getOrderFilledTotalKey(firstOrder), (filledTotal + finalNBTFillable)), DataEntry(getOrderStatusKey(firstOrder), newStatus), DataEntry(CurrentDefaultOrderKey, if ((newStatus == NEW))
298+ else firstOrder), IntegerEntry(getOrderFilledTotalKey(firstOrder), (filledTotal + finalNBTFillable)), StringEntry(getOrderStatusKey(firstOrder), newStatus), StringEntry(CurrentDefaultOrderKey, if ((newStatus == NEW))
324299 then currentDefaultOrder
325- else computeCurrentDefaultOrder(firstOrder))]), TransferSet([ScriptTransfer(addressFromStringValue(getOrderOwner(firstOrder)), fillableOrderAmount, neutrinoAssetId), ScriptTransfer(neutrinoContract, finalNBTFillable, bondAssetId)]))
300+ else computeCurrentDefaultOrder(firstOrder)), ScriptTransfer(addressFromStringValue(getOrderOwner(firstOrder)), fillableOrderAmount, neutrinoAssetId), ScriptTransfer(neutrinoContract, finalNBTFillable, bondAssetId)]
326301 }
327302 }
328303 }
329304
330305
331306 @Verifier(tx)
332307 func verify () = {
333308 let pubKeyAdminsList = ["BLEoguzPVKVTfXxxT3W7Rqf8aUm2ggC9Vemd2MQawM2G", "FWVffYr2ALmHMejZm3WqeLz6Sdym3gLFGtJn4KTwyU5x", "3Wh2LaWcb5gg7K2pPcW3Ep6EAuRBzYkAgrdpt43jTDFa", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"]
334309 let count = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0])))
335310 then 1
336311 else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(pubKeyAdminsList[1])))
337312 then 1
338313 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(pubKeyAdminsList[2])))
339314 then 1
340315 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[3], fromBase58String(pubKeyAdminsList[3])))
341316 then 2
342317 else 0))
343318 (count >= 3)
344319 }
345320

github/deemru/w8io/873ac7e 
97.29 ms