tx · 4Rz6QXGDCKArTGBRscR8mpMVtPjuoEdFgBiHmqCeaFur

3My57n5zbpAautjmhCnsfXEpsowtrZwoyU2:  -0.01000000 Waves

2020.04.08 16:23 [945373] smart account 3My57n5zbpAautjmhCnsfXEpsowtrZwoyU2 > SELF 0.00000000 Waves

{ "type": 13, "id": "4Rz6QXGDCKArTGBRscR8mpMVtPjuoEdFgBiHmqCeaFur", "fee": 1000000, "feeAssetId": null, "timestamp": 1586352223000, "version": 1, "sender": "3My57n5zbpAautjmhCnsfXEpsowtrZwoyU2", "senderPublicKey": "72M9zA2RYmHdUa8jfJ3ddzDzQzVahV2gzxxBNQweQieA", "proofs": [ "3ARkTc37C4YxTAEW5op3GN8XpX2C1pyiaouYaNoHpnJox8wTzRwYa14Es7W9SrUKSuLX6uNcoDPaXFuZqxf5MZ8B" ], "script": "base64:AAIDAAAAAAAAABcIARIECgIICBIECgIBCBIAEgMKAQgSAAAAADgBAAAADmdldE51bWJlckJ5S2V5AAAAAQAAAANrZXkEAAAAByRtYXRjaDAJAAQaAAAAAgUAAAAEdGhpcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEAAAAAAAAAAAABAAAADmdldFN0cmluZ0J5S2V5AAAAAQAAAANrZXkEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAEdGhpcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWECAAAAAAEAAAAWZ2V0Qm9vbEJ5QWRkcmVzc0FuZEtleQAAAAIAAAAHYWRkcmVzcwAAAANrZXkEAAAAByRtYXRjaDAJAAQbAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAdCb29sZWFuBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhBwEAAAAYZ2V0U3RyaW5nQnlBZGRyZXNzQW5kS2V5AAAAAgAAAAdhZGRyZXNzAAAAA2tleQQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAdhZGRyZXNzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQIAAAAAAQAAABhnZXROdW1iZXJCeUFkZHJlc3NBbmRLZXkAAAACAAAAB2FkZHJlc3MAAAADa2V5BAAAAAckbWF0Y2gwCQAEGgAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAAAAAAAAAAAAAAAAAAdXQVZFTEVUAAAAAAAF9eEAAAAAAAVQQVVMSQAAAAAAAA9CQAAAAAAIQ0FOQ0VMRUQCAAAACGNhbmNlbGVkAAAAAANORVcCAAAAA25ldwAAAAAGRklMTEVEAgAAAAZmaWxsZWQAAAAAE05ldXRyaW5vQ29udHJhY3RLZXkCAAAAEW5ldXRyaW5vX2NvbnRyYWN0AAAAAAhQcmljZUtleQIAAAAFcHJpY2UAAAAADkJvbmRBc3NldElkS2V5AgAAAA1ib25kX2Fzc2V0X2lkAAAAABJOZXV0cmlub0Fzc2V0SWRLZXkCAAAAEW5ldXRyaW5vX2Fzc2V0X2lkAAAAABJDb250cm9sQ29udHJhY3RLZXkCAAAAEGNvbnRyb2xfY29udHJhY3QAAAAAEUJhbGFuY2VMb2NrZWRrS2V5AgAAAA1iYWxhbmNlX2xvY2tfAAAAABVXYXZlc0xvY2tlZEJhbGFuY2VLZXkJAAEsAAAAAgUAAAARQmFsYW5jZUxvY2tlZGtLZXkCAAAABXdhdmVzAAAAABhOZXV0cmlub0xvY2tlZEJhbGFuY2VLZXkJAAEsAAAAAgUAAAARQmFsYW5jZUxvY2tlZGtLZXkCAAAACG5ldXRyaW5vAAAAAA1GaXJzdE9yZGVyS2V5AgAAAAtvcmRlcl9maXJzdAAAAAAWQ3VycmVudERlZmF1bHRPcmRlcktleQIAAAANb3JkZXJfZGVmYXVsdAEAAAAQZ2V0T3JkZXJQcmljZUtleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAAAxvcmRlcl9wcmljZV8FAAAAB29yZGVySWQBAAAAEGdldE9yZGVyVG90YWxLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgIAAAAMb3JkZXJfdG90YWxfBQAAAAdvcmRlcklkAQAAABBnZXRPcmRlck93bmVyS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAADG9yZGVyX293bmVyXwUAAAAHb3JkZXJJZAEAAAARZ2V0T3JkZXJIZWlnaHRLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgIAAAANb3JkZXJfaGVpZ2h0XwUAAAAHb3JkZXJJZAEAAAARZ2V0T3JkZXJTdGF0dXNLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgIAAAANb3JkZXJfc3RhdHVzXwUAAAAHb3JkZXJJZAEAAAAWZ2V0T3JkZXJGaWxsZWRUb3RhbEtleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAABNvcmRlcl9maWxsZWRfdG90YWxfBQAAAAdvcmRlcklkAQAAAA9nZXRQcmV2T3JkZXJLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgIAAAALb3JkZXJfcHJldl8FAAAAB29yZGVySWQBAAAAD2dldE5leHRPcmRlcktleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAAAtvcmRlcl9uZXh0XwUAAAAHb3JkZXJJZAEAAAAWY29udmVydE5ldXRyaW5vVG9XYXZlcwAAAAIAAAAGYW1vdW50AAAABXByaWNlCQAAawAAAAMJAABrAAAAAwUAAAAGYW1vdW50AAAAAAAAAABkBQAAAAVwcmljZQUAAAAHV0FWRUxFVAUAAAAFUEFVTEkBAAAAFmNvbnZlcnRXYXZlc1RvTmV1dHJpbm8AAAACAAAABmFtb3VudAAAAAVwcmljZQkAAGsAAAADCQAAawAAAAMFAAAABmFtb3VudAUAAAAFcHJpY2UAAAAAAAAAAGQFAAAABVBBVUxJBQAAAAdXQVZFTEVUAQAAABJjb252ZXJ0V2F2ZXNUb0JvbmQAAAACAAAABmFtb3VudAAAAAVwcmljZQkBAAAAFmNvbnZlcnRXYXZlc1RvTmV1dHJpbm8AAAACBQAAAAZhbW91bnQFAAAABXByaWNlAAAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAAE05ldXRyaW5vQ29udHJhY3RLZXkAAAAAD2NvbnRyb2xDb250cmFjdAkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABCQEAAAAYZ2V0U3RyaW5nQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAUAAAASQ29udHJvbENvbnRyYWN0S2V5AAAAABNsaXF1aWRhdGlvbkNvbnRyYWN0BQAAAAR0aGlzAAAAAA9uZXV0cmlub0Fzc2V0SWQJAAJZAAAAAQkBAAAAGGdldFN0cmluZ0J5QWRkcmVzc0FuZEtleQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAAEk5ldXRyaW5vQXNzZXRJZEtleQAAAAALYm9uZEFzc2V0SWQJAAJZAAAAAQIAAAAsNm5TcFZ5Tkg3eU02OWVnNDQ2d3JRUjk0aXBiYmNtWk1VMUVOUHdhbkM5N2cAAAAACmZpcnN0T3JkZXIJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAADUZpcnN0T3JkZXJLZXkAAAAACWlzQmxvY2tlZAkBAAAAFmdldEJvb2xCeUFkZHJlc3NBbmRLZXkAAAACBQAAAA9jb250cm9sQ29udHJhY3QCAAAACmlzX2Jsb2NrZWQAAAAADGN1cnJlbnRQcmljZQkBAAAAGGdldE51bWJlckJ5QWRkcmVzc0FuZEtleQAAAAIFAAAAD2NvbnRyb2xDb250cmFjdAUAAAAIUHJpY2VLZXkAAAAAFW5ldXRyaW5vTG9ja2VkQmFsYW5jZQAAAAAAAAAAAAAAAAASd2F2ZXNMb2NrZWRCYWxhbmNlAAAAAAAAAAAAAAAAAAdyZXNlcnZlAAAAAAA7msoAAAAAAA5uZXV0cmlub1N1cHBseQAAAAAABfXhAAAAAAAHc3VycGx1cwkAAGUAAAACBQAAAAdyZXNlcnZlBQAAAA5uZXV0cmlub1N1cHBseQEAAAANZ2V0T3JkZXJQcmljZQAAAAEAAAACaWQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABBnZXRPcmRlclByaWNlS2V5AAAAAQUAAAACaWQBAAAADWdldE9yZGVyVG90YWwAAAABAAAAAmlkCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAQZ2V0T3JkZXJUb3RhbEtleQAAAAEFAAAAAmlkAQAAAA1nZXRPcmRlck93bmVyAAAAAQAAAAJpZAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAEGdldE9yZGVyT3duZXJLZXkAAAABBQAAAAJpZAEAAAAOZ2V0T3JkZXJTdGF0dXMAAAABAAAAAmlkCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAARZ2V0T3JkZXJTdGF0dXNLZXkAAAABBQAAAAJpZAEAAAATZ2V0T3JkZXJGaWxsZWRUb3RhbAAAAAEAAAACaWQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABZnZXRPcmRlckZpbGxlZFRvdGFsS2V5AAAAAQUAAAACaWQBAAAADmdldE9yZGVySGVpZ2h0AAAAAQAAAAJpZAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAEWdldE9yZGVySGVpZ2h0S2V5AAAAAQUAAAACaWQBAAAADGdldFByZXZPcmRlcgAAAAEAAAACaWQJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAAA9nZXRQcmV2T3JkZXJLZXkAAAABBQAAAAJpZAEAAAAMZ2V0TmV4dE9yZGVyAAAAAQAAAAJpZAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAD2dldE5leHRPcmRlcktleQAAAAEFAAAAAmlkAAAAABNjdXJyZW50RGVmYXVsdE9yZGVyCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABBQAAABZDdXJyZW50RGVmYXVsdE9yZGVyS2V5AQAAABtnZW5lcmF0ZURhdGFFbnRyeVRvQWRkT3JkZXIAAAAGAAAABXByaWNlAAAACm5ld09yZGVySWQAAAADaW52AAAACXByZXZPcmRlcgAAAAluZXh0T3JkZXIAAAAKZmlyc3RPcmRlcgQAAAAGYW1vdW50AAAAAAAAD0JABAAAABBpc09uZUZvck9uZU9yZGVyCQAAAAAAAAIFAAAABXByaWNlAAAAAAAAAABkCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAPZ2V0UHJldk9yZGVyS2V5AAAAAQUAAAAKbmV3T3JkZXJJZAUAAAAJcHJldk9yZGVyCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAPZ2V0TmV4dE9yZGVyS2V5AAAAAQUAAAAKbmV3T3JkZXJJZAUAAAAJbmV4dE9yZGVyCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAPZ2V0TmV4dE9yZGVyS2V5AAAAAQUAAAAJcHJldk9yZGVyAwkAAAAAAAACBQAAAAlwcmV2T3JkZXICAAAAAAUAAAAJcHJldk9yZGVyBQAAAApuZXdPcmRlcklkCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAPZ2V0UHJldk9yZGVyS2V5AAAAAQUAAAAJbmV4dE9yZGVyAwkAAAAAAAACBQAAAAluZXh0T3JkZXICAAAAAAUAAAAJbmV4dE9yZGVyBQAAAApuZXdPcmRlcklkCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAA1GaXJzdE9yZGVyS2V5AwkAAAAAAAACBQAAAApmaXJzdE9yZGVyAgAAAAAFAAAACm5ld09yZGVySWQFAAAACmZpcnN0T3JkZXIJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABBnZXRPcmRlclByaWNlS2V5AAAAAQUAAAAKbmV3T3JkZXJJZAUAAAAFcHJpY2UJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABBnZXRPcmRlclRvdGFsS2V5AAAAAQUAAAAKbmV3T3JkZXJJZAUAAAAGYW1vdW50CQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAQZ2V0T3JkZXJPd25lcktleQAAAAEFAAAACm5ld09yZGVySWQJAAQlAAAAAQgFAAAAA2ludgAAAAZjYWxsZXIJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABFnZXRPcmRlckhlaWdodEtleQAAAAEFAAAACm5ld09yZGVySWQFAAAABmhlaWdodAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAEWdldE9yZGVyU3RhdHVzS2V5AAAAAQUAAAAKbmV3T3JkZXJJZAUAAAADTkVXCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAABZDdXJyZW50RGVmYXVsdE9yZGVyS2V5AwUAAAAQaXNPbmVGb3JPbmVPcmRlcgUAAAAKbmV3T3JkZXJJZAUAAAATY3VycmVudERlZmF1bHRPcmRlcgUAAAADbmlsAQAAABtpbnRlcm5hbEFkZExpcXVpZGF0aW9uT3JkZXIAAAADAAAAAWkAAAAFcHJpY2UAAAAJcHJldk9yZGVyBAAAAAZhbW91bnQAAAAAAAAPQkAEAAAACm5ld09yZGVySWQJAAJYAAAAAQkAAfUAAAABCQAAywAAAAIJAADLAAAAAgkAAMsAAAACCQABmgAAAAEFAAAABmFtb3VudAgIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwkAAZoAAAABBQAAAAZoZWlnaHQIBQAAAAFpAAAADXRyYW5zYWN0aW9uSWQEAAAABW93bmVyCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAAQaXNFbXB0eVByZXZPcmRlcgkAAAAAAAACBQAAAAlwcmV2T3JkZXICAAAAAAQAAAARaXNFbXB0eUZpcnN0T3JkZXIJAAAAAAAAAgUAAAAKZmlyc3RPcmRlcgIAAAAAAwcJAAACAAAAAQIAAAAnb3JkZXIgYW1vdW50IG11c3QgYmUgaGlnaGVyIHRoYW4gMSBOU0JUAwkAAGYAAAACAAAAAAAAAABkBQAAAAVwcmljZQkAAAIAAAABCQABLAAAAAICAAAATHByaWNlIHNob3VsZCBiZSBlcXVhbCBvciBoaWdoZXIgdGhhbiAxIG5zYnQgZm9yIDEgdXNkbi4gaS5lLiA+PSAxMDA7IHByaWNlOiAJAAGkAAAAAQUAAAAFcHJpY2UDCQEAAAACIT0AAAACCQEAAAANZ2V0T3JkZXJPd25lcgAAAAEFAAAACm5ld09yZGVySWQCAAAAAAkAAAIAAAABAgAAABphbiBvcmRlciBpcyBhbHJlYWR5IGV4aXN0cwMDCQEAAAABIQAAAAEFAAAAEGlzRW1wdHlQcmV2T3JkZXIJAQAAAAIhPQAAAAIJAQAAAA5nZXRPcmRlclN0YXR1cwAAAAEFAAAACXByZXZPcmRlcgUAAAADTkVXBwkAAAIAAAABAgAAABxwcmV2IG9yZGVyIHN0YXR1cyBpcyBub3QgbmV3AwMFAAAAEWlzRW1wdHlGaXJzdE9yZGVyCQEAAAABIQAAAAEFAAAAEGlzRW1wdHlQcmV2T3JkZXIHCQAAAgAAAAECAAAAGXdyb25nIHByZXYgb3JkZXIgcGFyYW1ldHIEAAAACW5leHRPcmRlcgMFAAAAEGlzRW1wdHlQcmV2T3JkZXIFAAAACmZpcnN0T3JkZXIJAQAAAAxnZXROZXh0T3JkZXIAAAABBQAAAAlwcmV2T3JkZXIEAAAAEGlzRW1wdHlOZXh0T3JkZXIJAAAAAAAAAgUAAAAJbmV4dE9yZGVyAgAAAAADBQAAABFpc0VtcHR5Rmlyc3RPcmRlcgkBAAAACFdyaXRlU2V0AAAAAQkBAAAAG2dlbmVyYXRlRGF0YUVudHJ5VG9BZGRPcmRlcgAAAAYFAAAABXByaWNlBQAAAApuZXdPcmRlcklkBQAAAAFpBQAAAAlwcmV2T3JkZXIFAAAACW5leHRPcmRlcgUAAAAKZmlyc3RPcmRlcgQAAAAObmV4dE9yZGVyUHJpY2UJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABBnZXRPcmRlclByaWNlS2V5AAAAAQUAAAAJbmV4dE9yZGVyBAAAAA5wcmV2T3JkZXJQcmljZQkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAEGdldE9yZGVyUHJpY2VLZXkAAAABBQAAAAlwcmV2T3JkZXIEAAAAEGlzTmV4dE9yZGVyRXJyb3IDCQEAAAABIQAAAAEFAAAAEGlzRW1wdHlOZXh0T3JkZXIJAABnAAAAAgUAAAAFcHJpY2UFAAAADm5leHRPcmRlclByaWNlBwQAAAAQaXNQcmV2T3JkZXJFcnJvcgMJAQAAAAEhAAAAAQUAAAAQaXNFbXB0eVByZXZPcmRlcgkAAGYAAAACBQAAAA5wcmV2T3JkZXJQcmljZQUAAAAFcHJpY2UHAwMFAAAAEGlzTmV4dE9yZGVyRXJyb3IGBQAAABBpc1ByZXZPcmRlckVycm9yCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAH2ludmFsaWQgb3JkZXIgaXNQcmV2T3JkZXJFcnJvcjoJAAGlAAAAAQUAAAAQaXNQcmV2T3JkZXJFcnJvcgIAAAASIGlzTmV4dE9yZGVyRXJyb3I6CQABpQAAAAEFAAAAEGlzTmV4dE9yZGVyRXJyb3IJAQAAAAhXcml0ZVNldAAAAAEJAQAAABtnZW5lcmF0ZURhdGFFbnRyeVRvQWRkT3JkZXIAAAAGBQAAAAVwcmljZQUAAAAKbmV3T3JkZXJJZAUAAAABaQUAAAAJcHJldk9yZGVyBQAAAAluZXh0T3JkZXIFAAAACmZpcnN0T3JkZXIBAAAAGmNvbXB1dGVDdXJyZW50RGVmYXVsdE9yZGVyAAAAAQAAAAJpZAMJAQAAAAIhPQAAAAIFAAAAAmlkBQAAABNjdXJyZW50RGVmYXVsdE9yZGVyBQAAABNjdXJyZW50RGVmYXVsdE9yZGVyAgAAAAAAAAAFAAAAAWkBAAAAE2RlZ3VnS2V5VmFsdWVXcml0ZXIAAAACAAAAA2tleQAAAAN2YWwJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAA2tleQUAAAADdmFsBQAAAANuaWwAAAABaQEAAAAcYWRkTGlxdWlkYXRpb25PcmRlcldpdGhQcmljZQAAAAIAAAAFcHJpY2UAAAAJcHJldk9yZGVyCQEAAAAbaW50ZXJuYWxBZGRMaXF1aWRhdGlvbk9yZGVyAAAAAwUAAAABaQUAAAAFcHJpY2UFAAAACXByZXZPcmRlcgAAAAFpAQAAABNhZGRMaXF1aWRhdGlvbk9yZGVyAAAAAAkBAAAAG2ludGVybmFsQWRkTGlxdWlkYXRpb25PcmRlcgAAAAMFAAAAAWkAAAAAAAAAAGQFAAAAE2N1cnJlbnREZWZhdWx0T3JkZXIAAAABaQEAAAALY2FuY2VsT3JkZXIAAAABAAAAB29yZGVySWQEAAAABW93bmVyCQEAAAANZ2V0T3JkZXJPd25lcgAAAAEFAAAAB29yZGVySWQEAAAABmFtb3VudAkAAGUAAAACCQEAAAANZ2V0T3JkZXJUb3RhbAAAAAEFAAAAB29yZGVySWQJAQAAABNnZXRPcmRlckZpbGxlZFRvdGFsAAAAAQUAAAAHb3JkZXJJZAQAAAAGY2FsbGVyCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAAJbmV4dE9yZGVyCQEAAAAMZ2V0TmV4dE9yZGVyAAAAAQUAAAAHb3JkZXJJZAQAAAAJcHJldk9yZGVyCQEAAAAMZ2V0UHJldk9yZGVyAAAAAQUAAAAHb3JkZXJJZAMFAAAACWlzQmxvY2tlZAkAAAIAAAABAgAAAFljb250cmFjdCBpcyBibG9ja2VkIGJ5IEVNRVJHRU5DWSBTSFVURE9XTiBhY3Rpb25zIHVudGlsIHJlYWN0aXZhdGlvbiBieSBlbWVyZ2VuY3kgb3JhY2xlcwMJAQAAAAIhPQAAAAIFAAAABW93bmVyBQAAAAZjYWxsZXIJAAACAAAAAQIAAAARcGVybWlzc2lvbiBkZW5pZWQDCQEAAAACIT0AAAACCQEAAAAOZ2V0T3JkZXJTdGF0dXMAAAABBQAAAAdvcmRlcklkBQAAAANORVcJAAACAAAAAQIAAAAUaW52YWxpZCBvcmRlciBzdGF0dXMJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAABZDdXJyZW50RGVmYXVsdE9yZGVyS2V5CQEAAAAaY29tcHV0ZUN1cnJlbnREZWZhdWx0T3JkZXIAAAABBQAAAAdvcmRlcklkCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAA1GaXJzdE9yZGVyS2V5AwkAAAAAAAACBQAAAApmaXJzdE9yZGVyBQAAAAdvcmRlcklkBQAAAAluZXh0T3JkZXIFAAAACmZpcnN0T3JkZXIJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAAA9nZXROZXh0T3JkZXJLZXkAAAABBQAAAAlwcmV2T3JkZXIFAAAACW5leHRPcmRlcgkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAD2dldFByZXZPcmRlcktleQAAAAEFAAAACW5leHRPcmRlcgUAAAAJcHJldk9yZGVyCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAARZ2V0T3JkZXJTdGF0dXNLZXkAAAABBQAAAAdvcmRlcklkBQAAAAhDQU5DRUxFRAUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAGYW1vdW50BQAAAAtib25kQXNzZXRJZAUAAAADbmlsAAAAAWkBAAAADWxpcXVpZGF0ZUJvbmQAAAAABAAAABJsaXF1aWRhdGlvbkJhbGFuY2UFAAAAB3N1cnBsdXMEAAAAD3N1cnBsdXNQb3NpdGl2ZQMJAABnAAAAAgAAAAAAAAAAAAUAAAAHc3VycGx1cwAAAAAAAAAAAAUAAAAHc3VycGx1cwQAAAAKdXNkbkFtb3VudAMJAABnAAAAAgUAAAAPc3VycGx1c1Bvc2l0aXZlBQAAABJsaXF1aWRhdGlvbkJhbGFuY2UFAAAAEmxpcXVpZGF0aW9uQmFsYW5jZQUAAAAPc3VycGx1c1Bvc2l0aXZlAwkAAAAAAAACBQAAABJsaXF1aWRhdGlvbkJhbGFuY2UAAAAAAAAAAAAJAAACAAAAAQIAAAAgd2l0aG91dCBiYXNlIHRva2VucyB0byBsaXF1aWRhdGUDCQAAAAAAAAIFAAAACmZpcnN0T3JkZXICAAAAAAkAAAIAAAABAgAAAA9lbXB0eSBvcmRlcmJvb2sEAAAACW5leHRPcmRlcgkBAAAADGdldE5leHRPcmRlcgAAAAEFAAAACmZpcnN0T3JkZXIEAAAAC2ZpbGxlZFRvdGFsCQEAAAATZ2V0T3JkZXJGaWxsZWRUb3RhbAAAAAEFAAAACmZpcnN0T3JkZXIEAAAACm9yZGVyUHJpY2UJAQAAAA1nZXRPcmRlclByaWNlAAAAAQUAAAAKZmlyc3RPcmRlcgQAAAANcmVtYWluZWRUb3RhbAkAAGUAAAACCQEAAAANZ2V0T3JkZXJUb3RhbAAAAAEFAAAACmZpcnN0T3JkZXIFAAAAC2ZpbGxlZFRvdGFsBAAAABJmaWxsT3JkZXJDb25kaXRpb24JAABnAAAAAgUAAAAKdXNkbkFtb3VudAUAAAANcmVtYWluZWRUb3RhbAQAAAATZmlsbGFibGVPcmRlckFtb3VudAMFAAAAEmZpbGxPcmRlckNvbmRpdGlvbgUAAAANcmVtYWluZWRUb3RhbAUAAAAKdXNkbkFtb3VudAQAAAAabmJUb2tlbnNMaXF1aWRhdGVDb25kaXRpb24JAABnAAAAAgkAAGsAAAADCQAAZAAAAAIFAAAAB3N1cnBsdXMFAAAADm5ldXRyaW5vU3VwcGx5AAAAAAAAAABkBQAAAA5uZXV0cmlub1N1cHBseQUAAAAKb3JkZXJQcmljZQMJAQAAAAEhAAAAAQUAAAAabmJUb2tlbnNMaXF1aWRhdGVDb25kaXRpb24JAAACAAAAAQkAASwAAAACAgAAABdpbm5hcHJvcHJpYXRlIHN1cnBsdXM6IAkAAaQAAAABBQAAAAdzdXJwbHVzAwcJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAG2RlYnVnfCBmaWxsT3JkZXJDb25kaXRpb246IAkAAaUAAAABBQAAABJmaWxsT3JkZXJDb25kaXRpb24CAAAAFzsgZmlsbGFibGVPcmRlckFtb3VudDogCQABpAAAAAEFAAAAE2ZpbGxhYmxlT3JkZXJBbW91bnQCAAAAETsgcmVtYWluZWRUb3RhbDogCQABpAAAAAEFAAAADXJlbWFpbmVkVG90YWwEAAAACW5ld1N0YXR1cwMDBQAAABJmaWxsT3JkZXJDb25kaXRpb24JAAAAAAAAAgUAAAANcmVtYWluZWRUb3RhbAAAAAAAAAAAAAcFAAAABkZJTExFRAUAAAADTkVXCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAPZ2V0UHJldk9yZGVyS2V5AAAAAQUAAAAJbmV4dE9yZGVyAwkAAAAAAAACBQAAAAluZXdTdGF0dXMFAAAABkZJTExFRAIAAAAABQAAAApmaXJzdE9yZGVyCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAA1GaXJzdE9yZGVyS2V5AwkAAAAAAAACBQAAAAluZXdTdGF0dXMFAAAABkZJTExFRAUAAAAJbmV4dE9yZGVyBQAAAApmaXJzdE9yZGVyCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAWZ2V0T3JkZXJGaWxsZWRUb3RhbEtleQAAAAEFAAAACmZpcnN0T3JkZXIJAABkAAAAAgUAAAALZmlsbGVkVG90YWwFAAAAE2ZpbGxhYmxlT3JkZXJBbW91bnQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABFnZXRPcmRlclN0YXR1c0tleQAAAAEFAAAACmZpcnN0T3JkZXIFAAAACW5ld1N0YXR1cwkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAWQ3VycmVudERlZmF1bHRPcmRlcktleQkBAAAAGmNvbXB1dGVDdXJyZW50RGVmYXVsdE9yZGVyAAAAAQUAAAAKZmlyc3RPcmRlcgUAAAADbmlsAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXmXGbiV", "chainId": 84, "height": 945373, "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 3 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+func getNumberByKey (key) = match getInteger(this, key) {
5+ case a: Int =>
6+ a
7+ case _ =>
8+ 0
9+}
10+
11+
12+func getStringByKey (key) = match getString(this, key) {
13+ case a: String =>
14+ a
15+ case _ =>
16+ ""
17+}
18+
19+
20+func getBoolByAddressAndKey (address,key) = match getBoolean(address, key) {
21+ case a: Boolean =>
22+ a
23+ case _ =>
24+ false
25+}
26+
27+
28+func getStringByAddressAndKey (address,key) = match getString(address, key) {
29+ case a: String =>
30+ a
31+ case _ =>
32+ ""
33+}
34+
35+
36+func getNumberByAddressAndKey (address,key) = match getInteger(address, key) {
37+ case a: Int =>
38+ a
39+ case _ =>
40+ 0
41+}
42+
43+
44+let WAVELET = 100000000
45+
46+let PAULI = 1000000
47+
48+let CANCELED = "canceled"
49+
50+let NEW = "new"
51+
52+let FILLED = "filled"
53+
54+let NeutrinoContractKey = "neutrino_contract"
55+
56+let PriceKey = "price"
57+
58+let BondAssetIdKey = "bond_asset_id"
59+
60+let NeutrinoAssetIdKey = "neutrino_asset_id"
61+
62+let ControlContractKey = "control_contract"
63+
64+let BalanceLockedkKey = "balance_lock_"
65+
66+let WavesLockedBalanceKey = (BalanceLockedkKey + "waves")
67+
68+let NeutrinoLockedBalanceKey = (BalanceLockedkKey + "neutrino")
69+
70+let FirstOrderKey = "order_first"
71+
72+let CurrentDefaultOrderKey = "order_default"
73+
74+func getOrderPriceKey (orderId) = ("order_price_" + orderId)
75+
76+
77+func getOrderTotalKey (orderId) = ("order_total_" + orderId)
78+
79+
80+func getOrderOwnerKey (orderId) = ("order_owner_" + orderId)
81+
82+
83+func getOrderHeightKey (orderId) = ("order_height_" + orderId)
84+
85+
86+func getOrderStatusKey (orderId) = ("order_status_" + orderId)
87+
88+
89+func getOrderFilledTotalKey (orderId) = ("order_filled_total_" + orderId)
90+
91+
92+func getPrevOrderKey (orderId) = ("order_prev_" + orderId)
93+
94+
95+func getNextOrderKey (orderId) = ("order_next_" + orderId)
96+
97+
98+func convertNeutrinoToWaves (amount,price) = fraction(fraction(amount, 100, price), WAVELET, PAULI)
99+
100+
101+func convertWavesToNeutrino (amount,price) = fraction(fraction(amount, price, 100), PAULI, WAVELET)
102+
103+
104+func convertWavesToBond (amount,price) = convertWavesToNeutrino(amount, price)
105+
106+
107+let neutrinoContract = addressFromStringValue(getStringByKey(NeutrinoContractKey))
108+
109+let controlContract = addressFromStringValue(getStringByAddressAndKey(neutrinoContract, ControlContractKey))
110+
111+let liquidationContract = this
112+
113+let neutrinoAssetId = fromBase58String(getStringByAddressAndKey(neutrinoContract, NeutrinoAssetIdKey))
114+
115+let bondAssetId = fromBase58String("6nSpVyNH7yM69eg446wrQR94ipbbcmZMU1ENPwanC97g")
116+
117+let firstOrder = getStringByKey(FirstOrderKey)
118+
119+let isBlocked = getBoolByAddressAndKey(controlContract, "is_blocked")
120+
121+let currentPrice = getNumberByAddressAndKey(controlContract, PriceKey)
122+
123+let neutrinoLockedBalance = 0
124+
125+let wavesLockedBalance = 0
126+
127+let reserve = 1000000000
128+
129+let neutrinoSupply = 100000000
130+
131+let surplus = (reserve - neutrinoSupply)
132+
133+func getOrderPrice (id) = getNumberByKey(getOrderPriceKey(id))
134+
135+
136+func getOrderTotal (id) = getNumberByKey(getOrderTotalKey(id))
137+
138+
139+func getOrderOwner (id) = getStringByKey(getOrderOwnerKey(id))
140+
141+
142+func getOrderStatus (id) = getStringByKey(getOrderStatusKey(id))
143+
144+
145+func getOrderFilledTotal (id) = getNumberByKey(getOrderFilledTotalKey(id))
146+
147+
148+func getOrderHeight (id) = getNumberByKey(getOrderHeightKey(id))
149+
150+
151+func getPrevOrder (id) = getStringByKey(getPrevOrderKey(id))
152+
153+
154+func getNextOrder (id) = getStringByKey(getNextOrderKey(id))
155+
156+
157+let currentDefaultOrder = getStringByKey(CurrentDefaultOrderKey)
158+
159+func generateDataEntryToAddOrder (price,newOrderId,inv,prevOrder,nextOrder,firstOrder) = {
160+ let amount = 1000000
161+ let isOneForOneOrder = (price == 100)
162+[DataEntry(getPrevOrderKey(newOrderId), prevOrder), DataEntry(getNextOrderKey(newOrderId), nextOrder), DataEntry(getNextOrderKey(prevOrder), if ((prevOrder == ""))
163+ then prevOrder
164+ else newOrderId), DataEntry(getPrevOrderKey(nextOrder), if ((nextOrder == ""))
165+ then nextOrder
166+ else newOrderId), DataEntry(FirstOrderKey, if ((firstOrder == ""))
167+ then newOrderId
168+ else firstOrder), DataEntry(getOrderPriceKey(newOrderId), price), DataEntry(getOrderTotalKey(newOrderId), amount), DataEntry(getOrderOwnerKey(newOrderId), toString(inv.caller)), DataEntry(getOrderHeightKey(newOrderId), height), DataEntry(getOrderStatusKey(newOrderId), NEW), DataEntry(CurrentDefaultOrderKey, if (isOneForOneOrder)
169+ then newOrderId
170+ else currentDefaultOrder)]
171+ }
172+
173+
174+func internalAddLiquidationOrder (i,price,prevOrder) = {
175+ let amount = 1000000
176+ let newOrderId = toBase58String(keccak256((((toBytes(amount) + i.caller.bytes) + toBytes(height)) + i.transactionId)))
177+ let owner = toString(i.caller)
178+ let isEmptyPrevOrder = (prevOrder == "")
179+ let isEmptyFirstOrder = (firstOrder == "")
180+ if (false)
181+ then throw("order amount must be higher than 1 NSBT")
182+ else if ((100 > price))
183+ then throw(("price should be equal or higher than 1 nsbt for 1 usdn. i.e. >= 100; price: " + toString(price)))
184+ else if ((getOrderOwner(newOrderId) != ""))
185+ then throw("an order is already exists")
186+ else if (if (!(isEmptyPrevOrder))
187+ then (getOrderStatus(prevOrder) != NEW)
188+ else false)
189+ then throw("prev order status is not new")
190+ else if (if (isEmptyFirstOrder)
191+ then !(isEmptyPrevOrder)
192+ else false)
193+ then throw("wrong prev order parametr")
194+ else {
195+ let nextOrder = if (isEmptyPrevOrder)
196+ then firstOrder
197+ else getNextOrder(prevOrder)
198+ let isEmptyNextOrder = (nextOrder == "")
199+ if (isEmptyFirstOrder)
200+ then WriteSet(generateDataEntryToAddOrder(price, newOrderId, i, prevOrder, nextOrder, firstOrder))
201+ else {
202+ let nextOrderPrice = getNumberByKey(getOrderPriceKey(nextOrder))
203+ let prevOrderPrice = getNumberByKey(getOrderPriceKey(prevOrder))
204+ let isNextOrderError = if (!(isEmptyNextOrder))
205+ then (price >= nextOrderPrice)
206+ else false
207+ let isPrevOrderError = if (!(isEmptyPrevOrder))
208+ then (prevOrderPrice > price)
209+ else false
210+ if (if (isNextOrderError)
211+ then true
212+ else isPrevOrderError)
213+ then throw(((("invalid order isPrevOrderError:" + toString(isPrevOrderError)) + " isNextOrderError:") + toString(isNextOrderError)))
214+ else WriteSet(generateDataEntryToAddOrder(price, newOrderId, i, prevOrder, nextOrder, firstOrder))
215+ }
216+ }
217+ }
218+
219+
220+func computeCurrentDefaultOrder (id) = if ((id != currentDefaultOrder))
221+ then currentDefaultOrder
222+ else ""
223+
224+
225+@Callable(i)
226+func degugKeyValueWriter (key,val) = WriteSet([DataEntry(key, val)])
227+
228+
229+
230+@Callable(i)
231+func addLiquidationOrderWithPrice (price,prevOrder) = internalAddLiquidationOrder(i, price, prevOrder)
232+
233+
234+
235+@Callable(i)
236+func addLiquidationOrder () = internalAddLiquidationOrder(i, 100, currentDefaultOrder)
237+
238+
239+
240+@Callable(i)
241+func cancelOrder (orderId) = {
242+ let owner = getOrderOwner(orderId)
243+ let amount = (getOrderTotal(orderId) - getOrderFilledTotal(orderId))
244+ let caller = toString(i.caller)
245+ let nextOrder = getNextOrder(orderId)
246+ let prevOrder = getPrevOrder(orderId)
247+ if (isBlocked)
248+ then throw("contract is blocked by EMERGENCY SHUTDOWN actions until reactivation by emergency oracles")
249+ else if ((owner != caller))
250+ then throw("permission denied")
251+ else if ((getOrderStatus(orderId) != NEW))
252+ then throw("invalid order status")
253+ else ScriptResult(WriteSet([DataEntry(CurrentDefaultOrderKey, computeCurrentDefaultOrder(orderId)), DataEntry(FirstOrderKey, if ((firstOrder == orderId))
254+ then nextOrder
255+ else firstOrder), DataEntry(getNextOrderKey(prevOrder), nextOrder), DataEntry(getPrevOrderKey(nextOrder), prevOrder), DataEntry(getOrderStatusKey(orderId), CANCELED)]), TransferSet([ScriptTransfer(i.caller, amount, bondAssetId)]))
256+ }
257+
258+
259+
260+@Callable(i)
261+func liquidateBond () = {
262+ let liquidationBalance = surplus
263+ let surplusPositive = if ((0 >= surplus))
264+ then 0
265+ else surplus
266+ let usdnAmount = if ((surplusPositive >= liquidationBalance))
267+ then liquidationBalance
268+ else surplusPositive
269+ if ((liquidationBalance == 0))
270+ then throw("without base tokens to liquidate")
271+ else if ((firstOrder == ""))
272+ then throw("empty orderbook")
273+ else {
274+ let nextOrder = getNextOrder(firstOrder)
275+ let filledTotal = getOrderFilledTotal(firstOrder)
276+ let orderPrice = getOrderPrice(firstOrder)
277+ let remainedTotal = (getOrderTotal(firstOrder) - filledTotal)
278+ let fillOrderCondition = (usdnAmount >= remainedTotal)
279+ let fillableOrderAmount = if (fillOrderCondition)
280+ then remainedTotal
281+ else usdnAmount
282+ let nbTokensLiquidateCondition = (fraction((surplus + neutrinoSupply), 100, neutrinoSupply) >= orderPrice)
283+ if (!(nbTokensLiquidateCondition))
284+ then throw(("innapropriate surplus: " + toString(surplus)))
285+ else if (false)
286+ then throw(((((("debug| fillOrderCondition: " + toString(fillOrderCondition)) + "; fillableOrderAmount: ") + toString(fillableOrderAmount)) + "; remainedTotal: ") + toString(remainedTotal)))
287+ else {
288+ let newStatus = if (if (fillOrderCondition)
289+ then (remainedTotal == 0)
290+ else false)
291+ then FILLED
292+ else NEW
293+ WriteSet([DataEntry(getPrevOrderKey(nextOrder), if ((newStatus == FILLED))
294+ then ""
295+ else firstOrder), DataEntry(FirstOrderKey, if ((newStatus == FILLED))
296+ then nextOrder
297+ else firstOrder), DataEntry(getOrderFilledTotalKey(firstOrder), (filledTotal + fillableOrderAmount)), DataEntry(getOrderStatusKey(firstOrder), newStatus), DataEntry(CurrentDefaultOrderKey, computeCurrentDefaultOrder(firstOrder))])
298+ }
299+ }
300+ }
301+
302+
303+@Verifier(tx)
304+func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
305+

github/deemru/w8io/3ef1775 
29.47 ms