tx · 94SdDqDtnQB83EEpWpLHKs1p47UEh2A1MNfhvBtjFTBv

3P4PCxsJqMzQBALo8zANHtBDZRRquobHQp7:  -0.14000000 Waves

2022.06.26 11:03 [3178727] smart account 3P4PCxsJqMzQBALo8zANHtBDZRRquobHQp7 > SELF 0.00000000 Waves

{ "type": 13, "id": "94SdDqDtnQB83EEpWpLHKs1p47UEh2A1MNfhvBtjFTBv", "fee": 14000000, "feeAssetId": null, "timestamp": 1656233094711, "version": 1, "sender": "3P4PCxsJqMzQBALo8zANHtBDZRRquobHQp7", "senderPublicKey": "H8Gooqgk4486MkqEQVwACpgoyEjt5Px4eskysnEDZ1nR", "proofs": [ "5VEVnTUQAHEkUtujYwEamnNyNgCmSMs5j1hcwkLt5vkm5zoXYZtkVDjeyrtZAUXrSESQbVSvtgyuusrkfbBYprxZ", "D9Q22NXPfRjZvGqMFGYYXETKA2Wk7z3Wf8xydUzVdfDMYW7m6eg2W9uzCao82yAYWv8tbq1SNG2aJUbUmAehPKs", "3wyDdRUXSxVEEY2YsDBiwoEQdXRXs4z14bS7T4f2EXMkLEh221xsFWYBhm6E3jmvb2CYfT6t4gYGFRtvMy9uVfRU", "2CyFKpk2ticbG9dMS9uWwBtX7oaoP5gV1Y41bct18iWxYq93nTr7TpbdYQUWsqsaApVqrQqUhsaKZNep6dJo3EBX" ], "script": "base64:AAIEAAAAAAAAABEIAhIECgIBCBIAEgMKAQgSAAAAAD0AAAAAC3JldmlzaW9uTnVtAgAAAChiM2ZmNzQ3MmExZDU0YTlmMGM4ZjZkNjY2NWM0NDU4YzM2YTMxZTQ4AQAAAA5nZXROdW1iZXJCeUtleQAAAAEAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAA2tleQAAAAAAAAAAAAEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAANrZXkCAAAAAAEAAAAWZ2V0Qm9vbEJ5QWRkcmVzc0FuZEtleQAAAAIAAAAHYWRkcmVzcwAAAANrZXkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQbAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5BwEAAAAYZ2V0U3RyaW5nQnlBZGRyZXNzQW5kS2V5AAAAAgAAAAdhZGRyZXNzAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAdhZGRyZXNzBQAAAANrZXkCAAAAAAEAAAAYZ2V0TnVtYmVyQnlBZGRyZXNzQW5kS2V5AAAAAgAAAAdhZGRyZXNzAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAdhZGRyZXNzBQAAAANrZXkAAAAAAAAAAAAAAAAAA1NFUAIAAAACX18AAAAAB1dBVkVMRVQAAAAAAAX14QAAAAAABVBBVUxJAAAAAAAAD0JAAAAAAAhQUklDRUxFVAAAAAAAAA9CQAAAAAAIQ0FOQ0VMRUQCAAAACGNhbmNlbGVkAAAAAANORVcCAAAAA25ldwAAAAAGRklMTEVEAgAAAAZmaWxsZWQAAAAAE05ldXRyaW5vQ29udHJhY3RLZXkCAAAAEW5ldXRyaW5vX2NvbnRyYWN0AAAAAAhQcmljZUtleQIAAAAFcHJpY2UAAAAADkJvbmRBc3NldElkS2V5AgAAAA1ib25kX2Fzc2V0X2lkAAAAABJOZXV0cmlub0Fzc2V0SWRLZXkCAAAAEW5ldXRyaW5vX2Fzc2V0X2lkAAAAABJDb250cm9sQ29udHJhY3RLZXkCAAAAEGNvbnRyb2xfY29udHJhY3QAAAAAEkF1Y3Rpb25Db250cmFjdEtleQIAAAAQYXVjdGlvbl9jb250cmFjdAAAAAARQmFsYW5jZUxvY2tlZGtLZXkCAAAADWJhbGFuY2VfbG9ja18AAAAAFVdhdmVzTG9ja2VkQmFsYW5jZUtleQkAASwAAAACBQAAABFCYWxhbmNlTG9ja2Vka0tleQIAAAAFd2F2ZXMAAAAAGE5ldXRyaW5vTG9ja2VkQmFsYW5jZUtleQkAASwAAAACBQAAABFCYWxhbmNlTG9ja2Vka0tleQIAAAAIbmV1dHJpbm8AAAAADUZpcnN0T3JkZXJLZXkCAAAAC29yZGVyX2ZpcnN0AAAAABZDdXJyZW50RGVmYXVsdE9yZGVyS2V5AgAAAA1vcmRlcl9kZWZhdWx0AQAAABBnZXRPcmRlclByaWNlS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAADG9yZGVyX3ByaWNlXwUAAAAHb3JkZXJJZAEAAAAQZ2V0T3JkZXJUb3RhbEtleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAAAxvcmRlcl90b3RhbF8FAAAAB29yZGVySWQBAAAAEGdldE9yZGVyT3duZXJLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgIAAAAMb3JkZXJfb3duZXJfBQAAAAdvcmRlcklkAQAAABFnZXRPcmRlckhlaWdodEtleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAAA1vcmRlcl9oZWlnaHRfBQAAAAdvcmRlcklkAQAAABFnZXRPcmRlclN0YXR1c0tleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAAA1vcmRlcl9zdGF0dXNfBQAAAAdvcmRlcklkAQAAABZnZXRPcmRlckZpbGxlZFRvdGFsS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAAE29yZGVyX2ZpbGxlZF90b3RhbF8FAAAAB29yZGVySWQBAAAAD2dldFByZXZPcmRlcktleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAAAtvcmRlcl9wcmV2XwUAAAAHb3JkZXJJZAEAAAAPZ2V0TmV4dE9yZGVyS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAAC29yZGVyX25leHRfBQAAAAdvcmRlcklkAQAAABZjb252ZXJ0TmV1dHJpbm9Ub1dhdmVzAAAAAgAAAAZhbW91bnQAAAAFcHJpY2UJAABrAAAAAwkAAGsAAAADBQAAAAZhbW91bnQFAAAACFBSSUNFTEVUBQAAAAVwcmljZQUAAAAHV0FWRUxFVAUAAAAFUEFVTEkBAAAAFmNvbnZlcnRXYXZlc1RvTmV1dHJpbm8AAAACAAAABmFtb3VudAAAAAVwcmljZQkAAGsAAAADCQAAawAAAAMFAAAABmFtb3VudAUAAAAFcHJpY2UFAAAACFBSSUNFTEVUBQAAAAVQQVVMSQUAAAAHV0FWRUxFVAEAAAASY29udmVydFdhdmVzVG9Cb25kAAAAAgAAAAZhbW91bnQAAAAFcHJpY2UJAQAAABZjb252ZXJ0V2F2ZXNUb05ldXRyaW5vAAAAAgUAAAAGYW1vdW50BQAAAAVwcmljZQAAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAATTmV1dHJpbm9Db250cmFjdEtleQAAAAAPY29udHJvbENvbnRyYWN0CQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAAYZ2V0U3RyaW5nQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAUAAAASQ29udHJvbENvbnRyYWN0S2V5AAAAAA9hdWN0aW9uQ29udHJhY3QJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAQAAABhnZXRTdHJpbmdCeUFkZHJlc3NBbmRLZXkAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0BQAAABJBdWN0aW9uQ29udHJhY3RLZXkAAAAAE2xpcXVpZGF0aW9uQ29udHJhY3QFAAAABHRoaXMAAAAAD25ldXRyaW5vQXNzZXRJZAkAAlkAAAABCQEAAAAYZ2V0U3RyaW5nQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAUAAAASTmV1dHJpbm9Bc3NldElkS2V5AAAAAAtib25kQXNzZXRJZAkAAlkAAAABAgAAACw2blNwVnlOSDd5TTY5ZWc0NDZ3clFSOTRpcGJiY21aTVUxRU5Qd2FuQzk3ZwAAAAAKZmlyc3RPcmRlcgkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAANRmlyc3RPcmRlcktleQAAAAAJaXNCbG9ja2VkCQEAAAAWZ2V0Qm9vbEJ5QWRkcmVzc0FuZEtleQAAAAIFAAAAD2NvbnRyb2xDb250cmFjdAIAAAAKaXNfYmxvY2tlZAAAAAAMY3VycmVudFByaWNlCQEAAAAYZ2V0TnVtYmVyQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAPY29udHJvbENvbnRyYWN0BQAAAAhQcmljZUtleQAAAAAVbmV1dHJpbm9Mb2NrZWRCYWxhbmNlCQEAAAAYZ2V0TnVtYmVyQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAUAAAAYTmV1dHJpbm9Mb2NrZWRCYWxhbmNlS2V5AAAAABJ3YXZlc0xvY2tlZEJhbGFuY2UJAQAAABhnZXROdW1iZXJCeUFkZHJlc3NBbmRLZXkAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0BQAAABVXYXZlc0xvY2tlZEJhbGFuY2VLZXkAAAAAB3Jlc2VydmUJAABlAAAAAggJAAPvAAAAAQUAAAAQbmV1dHJpbm9Db250cmFjdAAAAAdyZWd1bGFyBQAAABJ3YXZlc0xvY2tlZEJhbGFuY2UAAAAADm5ldXRyaW5vU3VwcGx5CQAAZQAAAAIJAABlAAAAAgkAAGQAAAACBQAAABVuZXV0cmlub0xvY2tlZEJhbGFuY2UICQEAAAAFdmFsdWUAAAABCQAD7AAAAAEFAAAAD25ldXRyaW5vQXNzZXRJZAAAAAhxdWFudGl0eQkAA/AAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0BQAAAA9uZXV0cmlub0Fzc2V0SWQJAAPwAAAAAgUAAAATbGlxdWlkYXRpb25Db250cmFjdAUAAAAPbmV1dHJpbm9Bc3NldElkAAAAAAdzdXJwbHVzCQAAZQAAAAIJAQAAABZjb252ZXJ0V2F2ZXNUb05ldXRyaW5vAAAAAgUAAAAHcmVzZXJ2ZQUAAAAMY3VycmVudFByaWNlBQAAAA5uZXV0cmlub1N1cHBseQEAAAANZ2V0T3JkZXJQcmljZQAAAAEAAAACaWQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABBnZXRPcmRlclByaWNlS2V5AAAAAQUAAAACaWQBAAAADWdldE9yZGVyVG90YWwAAAABAAAAAmlkCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAQZ2V0T3JkZXJUb3RhbEtleQAAAAEFAAAAAmlkAQAAAA1nZXRPcmRlck93bmVyAAAAAQAAAAJpZAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAEGdldE9yZGVyT3duZXJLZXkAAAABBQAAAAJpZAEAAAAOZ2V0T3JkZXJTdGF0dXMAAAABAAAAAmlkCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAARZ2V0T3JkZXJTdGF0dXNLZXkAAAABBQAAAAJpZAEAAAATZ2V0T3JkZXJGaWxsZWRUb3RhbAAAAAEAAAACaWQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABZnZXRPcmRlckZpbGxlZFRvdGFsS2V5AAAAAQUAAAACaWQBAAAADmdldE9yZGVySGVpZ2h0AAAAAQAAAAJpZAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAEWdldE9yZGVySGVpZ2h0S2V5AAAAAQUAAAACaWQBAAAADGdldFByZXZPcmRlcgAAAAEAAAACaWQJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAAA9nZXRQcmV2T3JkZXJLZXkAAAABBQAAAAJpZAEAAAAMZ2V0TmV4dE9yZGVyAAAAAQAAAAJpZAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAD2dldE5leHRPcmRlcktleQAAAAEFAAAAAmlkAAAAABNjdXJyZW50RGVmYXVsdE9yZGVyCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABBQAAABZDdXJyZW50RGVmYXVsdE9yZGVyS2V5AQAAABtnZW5lcmF0ZURhdGFFbnRyeVRvQWRkT3JkZXIAAAAGAAAABXByaWNlAAAACm5ld09yZGVySWQAAAABaQAAAAlwcmV2T3JkZXIAAAAJbmV4dE9yZGVyAAAACmZpcnN0T3JkZXIEAAAABmFtb3VudAgJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50BAAAABBpc09uZUZvck9uZU9yZGVyCQAAAAAAAAIFAAAABXByaWNlAAAAAAAAAABkBAAAABBpc0ZpcnN0T3JkZXJFbXR5CQAAAAAAAAIFAAAACmZpcnN0T3JkZXICAAAAAAQAAAApaXNOZXdPcmRlclByaWNlTG93ZXJUaGFuQ3VycmVudEZpcnN0T3JkZXIJAABmAAAAAgkBAAAADWdldE9yZGVyUHJpY2UAAAABBQAAAApmaXJzdE9yZGVyBQAAAAVwcmljZQQAAAANbmV3Rmlyc3RPcmRlcgMFAAAAEGlzRmlyc3RPcmRlckVtdHkFAAAACm5ld09yZGVySWQDBQAAAClpc05ld09yZGVyUHJpY2VMb3dlclRoYW5DdXJyZW50Rmlyc3RPcmRlcgUAAAAKbmV3T3JkZXJJZAUAAAAKZmlyc3RPcmRlcgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAPZ2V0UHJldk9yZGVyS2V5AAAAAQUAAAAKbmV3T3JkZXJJZAUAAAAJcHJldk9yZGVyCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAA9nZXROZXh0T3JkZXJLZXkAAAABBQAAAApuZXdPcmRlcklkBQAAAAluZXh0T3JkZXIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAD2dldE5leHRPcmRlcktleQAAAAEFAAAACXByZXZPcmRlcgMJAAAAAAAAAgUAAAAJcHJldk9yZGVyAgAAAAAFAAAACXByZXZPcmRlcgUAAAAKbmV3T3JkZXJJZAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAPZ2V0UHJldk9yZGVyS2V5AAAAAQUAAAAJbmV4dE9yZGVyAwkAAAAAAAACBQAAAAluZXh0T3JkZXICAAAAAAUAAAAJbmV4dE9yZGVyBQAAAApuZXdPcmRlcklkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAADUZpcnN0T3JkZXJLZXkFAAAADW5ld0ZpcnN0T3JkZXIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABBnZXRPcmRlclByaWNlS2V5AAAAAQUAAAAKbmV3T3JkZXJJZAUAAAAFcHJpY2UJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABBnZXRPcmRlclRvdGFsS2V5AAAAAQUAAAAKbmV3T3JkZXJJZAUAAAAGYW1vdW50CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABBnZXRPcmRlck93bmVyS2V5AAAAAQUAAAAKbmV3T3JkZXJJZAkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABFnZXRPcmRlckhlaWdodEtleQAAAAEFAAAACm5ld09yZGVySWQFAAAABmhlaWdodAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAARZ2V0T3JkZXJTdGF0dXNLZXkAAAABBQAAAApuZXdPcmRlcklkBQAAAANORVcJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAWQ3VycmVudERlZmF1bHRPcmRlcktleQMFAAAAEGlzT25lRm9yT25lT3JkZXIFAAAACm5ld09yZGVySWQFAAAAE2N1cnJlbnREZWZhdWx0T3JkZXIFAAAAA25pbAEAAAAbaW50ZXJuYWxBZGRMaXF1aWRhdGlvbk9yZGVyAAAAAwAAAAFpAAAABXByaWNlAAAACXByZXZPcmRlcgQAAAADcG10CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAAApuZXdPcmRlcklkCQACWAAAAAEJAAH1AAAAAQkAAMsAAAACCQAAywAAAAIJAADLAAAAAgkAAZoAAAABCAUAAAADcG10AAAABmFtb3VudAgIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwkAAZoAAAABBQAAAAZoZWlnaHQIBQAAAAFpAAAADXRyYW5zYWN0aW9uSWQEAAAABW93bmVyCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAAQaXNFbXB0eVByZXZPcmRlcgkAAAAAAAACBQAAAAlwcmV2T3JkZXICAAAAAAQAAAARaXNFbXB0eUZpcnN0T3JkZXIJAAAAAAAAAgUAAAAKZmlyc3RPcmRlcgIAAAAAAwUAAAAJaXNCbG9ja2VkCQAAAgAAAAECAAAAWWNvbnRyYWN0IGlzIGJsb2NrZWQgYnkgRU1FUkdFTkNZIFNIVVRET1dOIGFjdGlvbnMgdW50aWwgcmVhY3RpdmF0aW9uIGJ5IGVtZXJnZW5jeSBvcmFjbGVzAwkAAGYAAAACBQAAAAVQQVVMSQgFAAAAA3BtdAAAAAZhbW91bnQJAAACAAAAAQIAAAApb3JkZXIgYW1vdW50IHNob3VsZCBiZSBoaWdoZXIgdGhhbiAxIE5TQlQDCQAAZgAAAAIAAAAAAAAAAGQFAAAABXByaWNlCQAAAgAAAAEJAAEsAAAAAgIAAABMcHJpY2Ugc2hvdWxkIGJlIGVxdWFsIG9yIGhpZ2hlciB0aGFuIDEgbnNidCBmb3IgMSB1c2RuLiBpLmUuID49IDEwMDsgcHJpY2U6IAkAAaQAAAABBQAAAAVwcmljZQMJAQAAAAIhPQAAAAIIBQAAAANwbXQAAAAHYXNzZXRJZAUAAAALYm9uZEFzc2V0SWQJAAACAAAAAQIAAAA0Y2FuIHVzZSBhcHByb3ByaWF0ZSBuZXV0cmlubyBiYXNlIHRva2VucyAobnNidCkgb25seQMJAQAAAAIhPQAAAAIJAQAAAA1nZXRPcmRlck93bmVyAAAAAQUAAAAKbmV3T3JkZXJJZAIAAAAACQAAAgAAAAECAAAAGHRoZSBvcmRlciBhbHJlYWR5IGV4aXN0cwMDCQEAAAABIQAAAAEFAAAAEGlzRW1wdHlQcmV2T3JkZXIJAQAAAAIhPQAAAAIJAQAAAA5nZXRPcmRlclN0YXR1cwAAAAEFAAAACXByZXZPcmRlcgUAAAADTkVXBwkAAAIAAAABAgAAABxwcmV2IG9yZGVyIHN0YXR1cyBpcyBub3QgbmV3AwMFAAAAEWlzRW1wdHlGaXJzdE9yZGVyCQEAAAABIQAAAAEFAAAAEGlzRW1wdHlQcmV2T3JkZXIHCQAAAgAAAAECAAAAGndyb25nIHByZXYgb3JkZXIgcGFyYW1ldGVyBAAAAAluZXh0T3JkZXIDBQAAABBpc0VtcHR5UHJldk9yZGVyBQAAAApmaXJzdE9yZGVyCQEAAAAMZ2V0TmV4dE9yZGVyAAAAAQUAAAAJcHJldk9yZGVyBAAAABBpc0VtcHR5TmV4dE9yZGVyCQAAAAAAAAIFAAAACW5leHRPcmRlcgIAAAAAAwUAAAARaXNFbXB0eUZpcnN0T3JkZXIJAQAAABtnZW5lcmF0ZURhdGFFbnRyeVRvQWRkT3JkZXIAAAAGBQAAAAVwcmljZQUAAAAKbmV3T3JkZXJJZAUAAAABaQUAAAAJcHJldk9yZGVyBQAAAAluZXh0T3JkZXIFAAAACmZpcnN0T3JkZXIEAAAADm5leHRPcmRlclByaWNlCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAQZ2V0T3JkZXJQcmljZUtleQAAAAEFAAAACW5leHRPcmRlcgQAAAAOcHJldk9yZGVyUHJpY2UJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABBnZXRPcmRlclByaWNlS2V5AAAAAQUAAAAJcHJldk9yZGVyBAAAABBpc05leHRPcmRlckVycm9yAwkBAAAAASEAAAABBQAAABBpc0VtcHR5TmV4dE9yZGVyCQAAZwAAAAIFAAAABXByaWNlBQAAAA5uZXh0T3JkZXJQcmljZQcEAAAAEGlzUHJldk9yZGVyRXJyb3IDCQEAAAABIQAAAAEFAAAAEGlzRW1wdHlQcmV2T3JkZXIJAABmAAAAAgUAAAAOcHJldk9yZGVyUHJpY2UFAAAABXByaWNlBwMDBQAAABBpc05leHRPcmRlckVycm9yBgUAAAAQaXNQcmV2T3JkZXJFcnJvcgkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAB9pbnZhbGlkIG9yZGVyIGlzUHJldk9yZGVyRXJyb3I6CQABpQAAAAEFAAAAEGlzUHJldk9yZGVyRXJyb3ICAAAAEiBpc05leHRPcmRlckVycm9yOgkAAaUAAAABBQAAABBpc05leHRPcmRlckVycm9yCQEAAAAbZ2VuZXJhdGVEYXRhRW50cnlUb0FkZE9yZGVyAAAABgUAAAAFcHJpY2UFAAAACm5ld09yZGVySWQFAAAAAWkFAAAACXByZXZPcmRlcgUAAAAJbmV4dE9yZGVyBQAAAApmaXJzdE9yZGVyAQAAABpjb21wdXRlQ3VycmVudERlZmF1bHRPcmRlcgAAAAEAAAACaWQDCQEAAAACIT0AAAACBQAAAAJpZAUAAAATY3VycmVudERlZmF1bHRPcmRlcgUAAAATY3VycmVudERlZmF1bHRPcmRlcgIAAAAAAAAABAAAAAFpAQAAABxhZGRMaXF1aWRhdGlvbk9yZGVyV2l0aFByaWNlAAAAAgAAAAVwcmljZQAAAAlwcmV2T3JkZXIJAAACAAAAAQIAAABUTWV0aG9kIGhhcyBiZWVuIGRlcHJlY2F0ZWQ6IHBsZWFzZSB1c2UgYWRkTGlxdWlkYXRpb25PcmRlciBtZXRob2Qgd2l0aG91dCBwYXJhbWV0ZXJzAAAAAWkBAAAAE2FkZExpcXVpZGF0aW9uT3JkZXIAAAAACQEAAAAbaW50ZXJuYWxBZGRMaXF1aWRhdGlvbk9yZGVyAAAAAwUAAAABaQAAAAAAAAAAZAUAAAATY3VycmVudERlZmF1bHRPcmRlcgAAAAFpAQAAAAtjYW5jZWxPcmRlcgAAAAEAAAAHb3JkZXJJZAQAAAAFb3duZXIJAQAAAA1nZXRPcmRlck93bmVyAAAAAQUAAAAHb3JkZXJJZAQAAAAGYW1vdW50CQAAZQAAAAIJAQAAAA1nZXRPcmRlclRvdGFsAAAAAQUAAAAHb3JkZXJJZAkBAAAAE2dldE9yZGVyRmlsbGVkVG90YWwAAAABBQAAAAdvcmRlcklkBAAAAAZjYWxsZXIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAAluZXh0T3JkZXIJAQAAAAxnZXROZXh0T3JkZXIAAAABBQAAAAdvcmRlcklkBAAAAAlwcmV2T3JkZXIJAQAAAAxnZXRQcmV2T3JkZXIAAAABBQAAAAdvcmRlcklkBAAAAA5pc0RlZmF1bHRPcmRlcgkAAAAAAAACBQAAAAdvcmRlcklkBQAAABNjdXJyZW50RGVmYXVsdE9yZGVyBAAAABZpc1ByZXZDYW5CZWNvbWVEZWZhdWx0CQAAAAAAAAIJAQAAAA5nZXRPcmRlclN0YXR1cwAAAAEFAAAACXByZXZPcmRlcgUAAAADTkVXBAAAAA9uZXdEZWZhdWx0T3JkZXIDBQAAAA5pc0RlZmF1bHRPcmRlcgMFAAAAFmlzUHJldkNhbkJlY29tZURlZmF1bHQFAAAACXByZXZPcmRlcgIAAAAABQAAABNjdXJyZW50RGVmYXVsdE9yZGVyAwUAAAAJaXNCbG9ja2VkCQAAAgAAAAECAAAAWWNvbnRyYWN0IGlzIGJsb2NrZWQgYnkgRU1FUkdFTkNZIFNIVVRET1dOIGFjdGlvbnMgdW50aWwgcmVhY3RpdmF0aW9uIGJ5IGVtZXJnZW5jeSBvcmFjbGVzAwkBAAAAAiE9AAAAAgUAAAAFb3duZXIFAAAABmNhbGxlcgkAAAIAAAABAgAAABFwZXJtaXNzaW9uIGRlbmllZAMJAQAAAAIhPQAAAAIJAQAAAA5nZXRPcmRlclN0YXR1cwAAAAEFAAAAB29yZGVySWQFAAAAA05FVwkAAAIAAAABAgAAABRpbnZhbGlkIG9yZGVyIHN0YXR1cwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAABZDdXJyZW50RGVmYXVsdE9yZGVyS2V5BQAAAA9uZXdEZWZhdWx0T3JkZXIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAANRmlyc3RPcmRlcktleQMJAAAAAAAAAgUAAAAKZmlyc3RPcmRlcgUAAAAHb3JkZXJJZAUAAAAJbmV4dE9yZGVyBQAAAApmaXJzdE9yZGVyCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAA9nZXROZXh0T3JkZXJLZXkAAAABBQAAAAlwcmV2T3JkZXIFAAAACW5leHRPcmRlcgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAPZ2V0UHJldk9yZGVyS2V5AAAAAQUAAAAJbmV4dE9yZGVyBQAAAAlwcmV2T3JkZXIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEWdldE9yZGVyU3RhdHVzS2V5AAAAAQUAAAAHb3JkZXJJZAUAAAAIQ0FOQ0VMRUQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAZhbW91bnQFAAAAC2JvbmRBc3NldElkBQAAAANuaWwAAAABaQEAAAANbGlxdWlkYXRlQm9uZAAAAAAEAAAAEmxpcXVpZGF0aW9uQmFsYW5jZQkAA/AAAAACBQAAAAR0aGlzBQAAAA9uZXV0cmlub0Fzc2V0SWQEAAAAD3N1cnBsdXNQb3NpdGl2ZQMJAABnAAAAAgAAAAAAAAAAAAUAAAAHc3VycGx1cwAAAAAAAAAAAAUAAAAHc3VycGx1cwQAAAAKdXNkbkFtb3VudAMJAABnAAAAAgUAAAAPc3VycGx1c1Bvc2l0aXZlBQAAABJsaXF1aWRhdGlvbkJhbGFuY2UFAAAAEmxpcXVpZGF0aW9uQmFsYW5jZQUAAAAPc3VycGx1c1Bvc2l0aXZlBAAAAAxyZXR1cm5BbW91bnQDCQAAZwAAAAIFAAAAD3N1cnBsdXNQb3NpdGl2ZQUAAAASbGlxdWlkYXRpb25CYWxhbmNlAAAAAAAAAAAACQAAZQAAAAIFAAAAEmxpcXVpZGF0aW9uQmFsYW5jZQUAAAAPc3VycGx1c1Bvc2l0aXZlAwUAAAAJaXNCbG9ja2VkCQAAAgAAAAECAAAAWWNvbnRyYWN0IGlzIGJsb2NrZWQgYnkgRU1FUkdFTkNZIFNIVVRET1dOIGFjdGlvbnMgdW50aWwgcmVhY3RpdmF0aW9uIGJ5IGVtZXJnZW5jeSBvcmFjbGVzAwkAAAAAAAACBQAAABJsaXF1aWRhdGlvbkJhbGFuY2UAAAAAAAAAAAAJAAACAAAAAQIAAAAgd2l0aG91dCBiYXNlIHRva2VucyB0byBsaXF1aWRhdGUDCQAAZgAAAAIFAAAADHJldHVybkFtb3VudAAAAAAAAAAAAAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAABBuZXV0cmlub0NvbnRyYWN0BQAAAAxyZXR1cm5BbW91bnQFAAAAD25ldXRyaW5vQXNzZXRJZAUAAAADbmlsAwkAAAAAAAACBQAAAApmaXJzdE9yZGVyAgAAAAAJAAACAAAAAQIAAAAPZW1wdHkgb3JkZXJib29rBAAAAAluZXh0T3JkZXIJAQAAAAxnZXROZXh0T3JkZXIAAAABBQAAAApmaXJzdE9yZGVyBAAAAAtmaWxsZWRUb3RhbAkBAAAAE2dldE9yZGVyRmlsbGVkVG90YWwAAAABBQAAAApmaXJzdE9yZGVyBAAAAA5uc2J0MlVzZG5QcmljZQkBAAAADWdldE9yZGVyUHJpY2UAAAABBQAAAApmaXJzdE9yZGVyBAAAAA1yZW1haW5lZFRvdGFsCQAAZQAAAAIJAQAAAA1nZXRPcmRlclRvdGFsAAAAAQUAAAAKZmlyc3RPcmRlcgUAAAALZmlsbGVkVG90YWwEAAAAIHRvdGFsVVNETlJlcXVpcmVkVG9GaWxsT3JkZXJYMTAwCQAAawAAAAMFAAAADXJlbWFpbmVkVG90YWwFAAAADm5zYnQyVXNkblByaWNlAAAAAAAAAAABBAAAABx0b3RhbFVTRE5SZXF1aXJlZFRvRmlsbE9yZGVyCQAAaQAAAAIFAAAAIHRvdGFsVVNETlJlcXVpcmVkVG9GaWxsT3JkZXJYMTAwAAAAAAAAAABkBAAAABNpc09yZGVyRnVsbHlGaWxhYmxlCQAAZwAAAAIFAAAACnVzZG5BbW91bnQFAAAAHHRvdGFsVVNETlJlcXVpcmVkVG9GaWxsT3JkZXIEAAAAF2ZpbGxhYmxlT3JkZXJBbW91bnRYMTAwAwUAAAATaXNPcmRlckZ1bGx5RmlsYWJsZQUAAAAgdG90YWxVU0ROUmVxdWlyZWRUb0ZpbGxPcmRlclgxMDAJAABoAAAAAgUAAAAKdXNkbkFtb3VudAAAAAAAAAAAZAQAAAAQZmluYWxOQlRGaWxsYWJsZQkAAGsAAAADBQAAABdmaWxsYWJsZU9yZGVyQW1vdW50WDEwMAAAAAAAAAAAAQUAAAAObnNidDJVc2RuUHJpY2UEAAAAE2ZpbGxhYmxlT3JkZXJBbW91bnQJAABpAAAAAgUAAAAXZmlsbGFibGVPcmRlckFtb3VudFgxMDAAAAAAAAAAAGQEAAAAGm5iVG9rZW5zTGlxdWlkYXRlQ29uZGl0aW9uCQAAZwAAAAIJAABrAAAAAwkAAGQAAAACBQAAAAdzdXJwbHVzBQAAAA5uZXV0cmlub1N1cHBseQAAAAAAAAAAZAUAAAAObmV1dHJpbm9TdXBwbHkFAAAADm5zYnQyVXNkblByaWNlAwkBAAAAASEAAAABBQAAABpuYlRva2Vuc0xpcXVpZGF0ZUNvbmRpdGlvbgkAAAIAAAABCQABLAAAAAICAAAAF2lubmFwcm9wcmlhdGUgc3VycGx1czogCQABpAAAAAEFAAAAB3N1cnBsdXMEAAAAEmlzTm90aGluZ1RvRmlsbE5vdwkAAAAAAAACBQAAAA1yZW1haW5lZFRvdGFsAAAAAAAAAAAABAAAABRpc05vdGhpbmdUb0ZpbGxBdEFsbAkAAAAAAAACCQAAZAAAAAIFAAAAC2ZpbGxlZFRvdGFsBQAAABBmaW5hbE5CVEZpbGxhYmxlCQEAAAANZ2V0T3JkZXJUb3RhbAAAAAEFAAAACmZpcnN0T3JkZXIEAAAACW5ld1N0YXR1cwMDBQAAABNpc09yZGVyRnVsbHlGaWxhYmxlAwUAAAASaXNOb3RoaW5nVG9GaWxsTm93BgUAAAAUaXNOb3RoaW5nVG9GaWxsQXRBbGwHBQAAAAZGSUxMRUQFAAAAA05FVwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAPZ2V0UHJldk9yZGVyS2V5AAAAAQUAAAAJbmV4dE9yZGVyAwkAAAAAAAACBQAAAAluZXdTdGF0dXMFAAAABkZJTExFRAIAAAAABQAAAApmaXJzdE9yZGVyCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAADUZpcnN0T3JkZXJLZXkDCQAAAAAAAAIFAAAACW5ld1N0YXR1cwUAAAAGRklMTEVEBQAAAAluZXh0T3JkZXIFAAAACmZpcnN0T3JkZXIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABZnZXRPcmRlckZpbGxlZFRvdGFsS2V5AAAAAQUAAAAKZmlyc3RPcmRlcgkAAGQAAAACBQAAAAtmaWxsZWRUb3RhbAUAAAAQZmluYWxOQlRGaWxsYWJsZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAARZ2V0T3JkZXJTdGF0dXNLZXkAAAABBQAAAApmaXJzdE9yZGVyBQAAAAluZXdTdGF0dXMJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAWQ3VycmVudERlZmF1bHRPcmRlcktleQMJAAAAAAAAAgUAAAAJbmV3U3RhdHVzBQAAAANORVcFAAAAE2N1cnJlbnREZWZhdWx0T3JkZXIJAQAAABpjb21wdXRlQ3VycmVudERlZmF1bHRPcmRlcgAAAAEFAAAACmZpcnN0T3JkZXIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAADWdldE9yZGVyT3duZXIAAAABBQAAAApmaXJzdE9yZGVyBQAAABNmaWxsYWJsZU9yZGVyQW1vdW50BQAAAA9uZXV0cmlub0Fzc2V0SWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAPYXVjdGlvbkNvbnRyYWN0BQAAABBmaW5hbE5CVEZpbGxhYmxlBQAAAAtib25kQXNzZXRJZAUAAAADbmlsAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAQAAAATcHViS2V5QWRtaW5zTGlzdFN0cgkABLkAAAACCQAETAAAAAICAAAALEdKZExTYUxpdjVLN3h1ZWphYzhtY1JjSG95bzNkUHJFU3J2a3RHM2E2TUFSCQAETAAAAAICAAAALEVZd1ptVVJkNUtLYVFSQmpzVmE2ZzhEUGlzRm9TNlNvdlJKdEZpTDVnTUhVCQAETAAAAAICAAAALER0bUFmdURkQ3JISzhzcGRBZUFZenE2TXNaZWdlRDlnbnNycHVUUmtDYlZBCQAETAAAAAICAAAALDVXUlhGU2p3Y1RiTmZLY0pzOFpxWG1TU1dZc1NWSlV0TXZNcVpqNWhINE5jBQAAAANuaWwFAAAAA1NFUAQAAAAQcHViS2V5QWRtaW5zTGlzdAkABLUAAAACCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAAD2NvbnRyb2xDb250cmFjdAIAAAAMJXNfX211bHRpc2lnBQAAABNwdWJLZXlBZG1pbnNMaXN0U3RyBQAAAANTRVAEAAAABWNvdW50CQAAZAAAAAIJAABkAAAAAgkAAGQAAAACAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAJAAJZAAAAAQkAAZEAAAACBQAAABBwdWJLZXlBZG1pbnNMaXN0AAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAEJAAJZAAAAAQkAAZEAAAACBQAAABBwdWJLZXlBZG1pbnNMaXN0AAAAAAAAAAABAAAAAAAAAAABAAAAAAAAAAAAAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAIJAAJZAAAAAQkAAZEAAAACBQAAABBwdWJLZXlBZG1pbnNMaXN0AAAAAAAAAAACAAAAAAAAAAABAAAAAAAAAAAAAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAMJAAJZAAAAAQkAAZEAAAACBQAAABBwdWJLZXlBZG1pbnNMaXN0AAAAAAAAAAADAAAAAAAAAAACAAAAAAAAAAAACQAAZwAAAAIFAAAABWNvdW50AAAAAAAAAAADPF3ceQ==", "chainId": 87, "height": 3178727, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Ed8RL16f4pd7rhwLQvBLdJgrkqfULRrp2XiB8J1jJEXa Next: DxWGX8z1i5MzLbdzh6cfZYKdSfGj9FwR119GFVMVrLBH Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let revisionNum = "b3ff7472a1d54a9f0c8f6d6665c4458c36a31e48"
5+
46 func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0)
57
68
1517
1618 func getNumberByAddressAndKey (address,key) = valueOrElse(getInteger(address, key), 0)
1719
20+
21+let SEP = "__"
1822
1923 let WAVELET = 100000000
2024
309313
310314 @Verifier(tx)
311315 func verify () = {
312- let pubKeyAdminsList = ["GJdLSaLiv5K7xuejac8mcRcHoyo3dPrESrvktG3a6MAR", "FWVffYr2ALmHMejZm3WqeLz6Sdym3gLFGtJn4KTwyU5x", "3Wh2LaWcb5gg7K2pPcW3Ep6EAuRBzYkAgrdpt43jTDFa", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"]
316+ let pubKeyAdminsListStr = makeString(["GJdLSaLiv5K7xuejac8mcRcHoyo3dPrESrvktG3a6MAR", "EYwZmURd5KKaQRBjsVa6g8DPisFoS6SovRJtFiL5gMHU", "DtmAfuDdCrHK8spdAeAYzq6MsZegeD9gnsrpuTRkCbVA", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"], SEP)
317+ let pubKeyAdminsList = split(valueOrElse(getString(controlContract, "%s__multisig"), pubKeyAdminsListStr), SEP)
313318 let count = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0])))
314319 then 1
315320 else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(pubKeyAdminsList[1])))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let revisionNum = "b3ff7472a1d54a9f0c8f6d6665c4458c36a31e48"
5+
46 func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0)
57
68
79 func getStringByKey (key) = valueOrElse(getString(this, key), "")
810
911
1012 func getBoolByAddressAndKey (address,key) = valueOrElse(getBoolean(address, key), false)
1113
1214
1315 func getStringByAddressAndKey (address,key) = valueOrElse(getString(address, key), "")
1416
1517
1618 func getNumberByAddressAndKey (address,key) = valueOrElse(getInteger(address, key), 0)
1719
20+
21+let SEP = "__"
1822
1923 let WAVELET = 100000000
2024
2125 let PAULI = 1000000
2226
2327 let PRICELET = 1000000
2428
2529 let CANCELED = "canceled"
2630
2731 let NEW = "new"
2832
2933 let FILLED = "filled"
3034
3135 let NeutrinoContractKey = "neutrino_contract"
3236
3337 let PriceKey = "price"
3438
3539 let BondAssetIdKey = "bond_asset_id"
3640
3741 let NeutrinoAssetIdKey = "neutrino_asset_id"
3842
3943 let ControlContractKey = "control_contract"
4044
4145 let AuctionContractKey = "auction_contract"
4246
4347 let BalanceLockedkKey = "balance_lock_"
4448
4549 let WavesLockedBalanceKey = (BalanceLockedkKey + "waves")
4650
4751 let NeutrinoLockedBalanceKey = (BalanceLockedkKey + "neutrino")
4852
4953 let FirstOrderKey = "order_first"
5054
5155 let CurrentDefaultOrderKey = "order_default"
5256
5357 func getOrderPriceKey (orderId) = ("order_price_" + orderId)
5458
5559
5660 func getOrderTotalKey (orderId) = ("order_total_" + orderId)
5761
5862
5963 func getOrderOwnerKey (orderId) = ("order_owner_" + orderId)
6064
6165
6266 func getOrderHeightKey (orderId) = ("order_height_" + orderId)
6367
6468
6569 func getOrderStatusKey (orderId) = ("order_status_" + orderId)
6670
6771
6872 func getOrderFilledTotalKey (orderId) = ("order_filled_total_" + orderId)
6973
7074
7175 func getPrevOrderKey (orderId) = ("order_prev_" + orderId)
7276
7377
7478 func getNextOrderKey (orderId) = ("order_next_" + orderId)
7579
7680
7781 func convertNeutrinoToWaves (amount,price) = fraction(fraction(amount, PRICELET, price), WAVELET, PAULI)
7882
7983
8084 func convertWavesToNeutrino (amount,price) = fraction(fraction(amount, price, PRICELET), PAULI, WAVELET)
8185
8286
8387 func convertWavesToBond (amount,price) = convertWavesToNeutrino(amount, price)
8488
8589
8690 let neutrinoContract = addressFromStringValue(getStringByKey(NeutrinoContractKey))
8791
8892 let controlContract = addressFromStringValue(getStringByAddressAndKey(neutrinoContract, ControlContractKey))
8993
9094 let auctionContract = addressFromStringValue(getStringByAddressAndKey(neutrinoContract, AuctionContractKey))
9195
9296 let liquidationContract = this
9397
9498 let neutrinoAssetId = fromBase58String(getStringByAddressAndKey(neutrinoContract, NeutrinoAssetIdKey))
9599
96100 let bondAssetId = fromBase58String("6nSpVyNH7yM69eg446wrQR94ipbbcmZMU1ENPwanC97g")
97101
98102 let firstOrder = getStringByKey(FirstOrderKey)
99103
100104 let isBlocked = getBoolByAddressAndKey(controlContract, "is_blocked")
101105
102106 let currentPrice = getNumberByAddressAndKey(controlContract, PriceKey)
103107
104108 let neutrinoLockedBalance = getNumberByAddressAndKey(neutrinoContract, NeutrinoLockedBalanceKey)
105109
106110 let wavesLockedBalance = getNumberByAddressAndKey(neutrinoContract, WavesLockedBalanceKey)
107111
108112 let reserve = (wavesBalance(neutrinoContract).regular - wavesLockedBalance)
109113
110114 let neutrinoSupply = (((neutrinoLockedBalance + value(assetInfo(neutrinoAssetId)).quantity) - assetBalance(neutrinoContract, neutrinoAssetId)) - assetBalance(liquidationContract, neutrinoAssetId))
111115
112116 let surplus = (convertWavesToNeutrino(reserve, currentPrice) - neutrinoSupply)
113117
114118 func getOrderPrice (id) = getNumberByKey(getOrderPriceKey(id))
115119
116120
117121 func getOrderTotal (id) = getNumberByKey(getOrderTotalKey(id))
118122
119123
120124 func getOrderOwner (id) = getStringByKey(getOrderOwnerKey(id))
121125
122126
123127 func getOrderStatus (id) = getStringByKey(getOrderStatusKey(id))
124128
125129
126130 func getOrderFilledTotal (id) = getNumberByKey(getOrderFilledTotalKey(id))
127131
128132
129133 func getOrderHeight (id) = getNumberByKey(getOrderHeightKey(id))
130134
131135
132136 func getPrevOrder (id) = getStringByKey(getPrevOrderKey(id))
133137
134138
135139 func getNextOrder (id) = getStringByKey(getNextOrderKey(id))
136140
137141
138142 let currentDefaultOrder = getStringByKey(CurrentDefaultOrderKey)
139143
140144 func generateDataEntryToAddOrder (price,newOrderId,i,prevOrder,nextOrder,firstOrder) = {
141145 let amount = value(i.payments[0]).amount
142146 let isOneForOneOrder = (price == 100)
143147 let isFirstOrderEmty = (firstOrder == "")
144148 let isNewOrderPriceLowerThanCurrentFirstOrder = (getOrderPrice(firstOrder) > price)
145149 let newFirstOrder = if (isFirstOrderEmty)
146150 then newOrderId
147151 else if (isNewOrderPriceLowerThanCurrentFirstOrder)
148152 then newOrderId
149153 else firstOrder
150154 [StringEntry(getPrevOrderKey(newOrderId), prevOrder), StringEntry(getNextOrderKey(newOrderId), nextOrder), StringEntry(getNextOrderKey(prevOrder), if ((prevOrder == ""))
151155 then prevOrder
152156 else newOrderId), StringEntry(getPrevOrderKey(nextOrder), if ((nextOrder == ""))
153157 then nextOrder
154158 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)
155159 then newOrderId
156160 else currentDefaultOrder)]
157161 }
158162
159163
160164 func internalAddLiquidationOrder (i,price,prevOrder) = {
161165 let pmt = value(i.payments[0])
162166 let newOrderId = toBase58String(keccak256((((toBytes(pmt.amount) + i.caller.bytes) + toBytes(height)) + i.transactionId)))
163167 let owner = toString(i.caller)
164168 let isEmptyPrevOrder = (prevOrder == "")
165169 let isEmptyFirstOrder = (firstOrder == "")
166170 if (isBlocked)
167171 then throw("contract is blocked by EMERGENCY SHUTDOWN actions until reactivation by emergency oracles")
168172 else if ((PAULI > pmt.amount))
169173 then throw("order amount should be higher than 1 NSBT")
170174 else if ((100 > price))
171175 then throw(("price should be equal or higher than 1 nsbt for 1 usdn. i.e. >= 100; price: " + toString(price)))
172176 else if ((pmt.assetId != bondAssetId))
173177 then throw("can use appropriate neutrino base tokens (nsbt) only")
174178 else if ((getOrderOwner(newOrderId) != ""))
175179 then throw("the order already exists")
176180 else if (if (!(isEmptyPrevOrder))
177181 then (getOrderStatus(prevOrder) != NEW)
178182 else false)
179183 then throw("prev order status is not new")
180184 else if (if (isEmptyFirstOrder)
181185 then !(isEmptyPrevOrder)
182186 else false)
183187 then throw("wrong prev order parameter")
184188 else {
185189 let nextOrder = if (isEmptyPrevOrder)
186190 then firstOrder
187191 else getNextOrder(prevOrder)
188192 let isEmptyNextOrder = (nextOrder == "")
189193 if (isEmptyFirstOrder)
190194 then generateDataEntryToAddOrder(price, newOrderId, i, prevOrder, nextOrder, firstOrder)
191195 else {
192196 let nextOrderPrice = getNumberByKey(getOrderPriceKey(nextOrder))
193197 let prevOrderPrice = getNumberByKey(getOrderPriceKey(prevOrder))
194198 let isNextOrderError = if (!(isEmptyNextOrder))
195199 then (price >= nextOrderPrice)
196200 else false
197201 let isPrevOrderError = if (!(isEmptyPrevOrder))
198202 then (prevOrderPrice > price)
199203 else false
200204 if (if (isNextOrderError)
201205 then true
202206 else isPrevOrderError)
203207 then throw(((("invalid order isPrevOrderError:" + toString(isPrevOrderError)) + " isNextOrderError:") + toString(isNextOrderError)))
204208 else generateDataEntryToAddOrder(price, newOrderId, i, prevOrder, nextOrder, firstOrder)
205209 }
206210 }
207211 }
208212
209213
210214 func computeCurrentDefaultOrder (id) = if ((id != currentDefaultOrder))
211215 then currentDefaultOrder
212216 else ""
213217
214218
215219 @Callable(i)
216220 func addLiquidationOrderWithPrice (price,prevOrder) = throw("Method has been deprecated: please use addLiquidationOrder method without parameters")
217221
218222
219223
220224 @Callable(i)
221225 func addLiquidationOrder () = internalAddLiquidationOrder(i, 100, currentDefaultOrder)
222226
223227
224228
225229 @Callable(i)
226230 func cancelOrder (orderId) = {
227231 let owner = getOrderOwner(orderId)
228232 let amount = (getOrderTotal(orderId) - getOrderFilledTotal(orderId))
229233 let caller = toString(i.caller)
230234 let nextOrder = getNextOrder(orderId)
231235 let prevOrder = getPrevOrder(orderId)
232236 let isDefaultOrder = (orderId == currentDefaultOrder)
233237 let isPrevCanBecomeDefault = (getOrderStatus(prevOrder) == NEW)
234238 let newDefaultOrder = if (isDefaultOrder)
235239 then if (isPrevCanBecomeDefault)
236240 then prevOrder
237241 else ""
238242 else currentDefaultOrder
239243 if (isBlocked)
240244 then throw("contract is blocked by EMERGENCY SHUTDOWN actions until reactivation by emergency oracles")
241245 else if ((owner != caller))
242246 then throw("permission denied")
243247 else if ((getOrderStatus(orderId) != NEW))
244248 then throw("invalid order status")
245249 else [StringEntry(CurrentDefaultOrderKey, newDefaultOrder), StringEntry(FirstOrderKey, if ((firstOrder == orderId))
246250 then nextOrder
247251 else firstOrder), StringEntry(getNextOrderKey(prevOrder), nextOrder), StringEntry(getPrevOrderKey(nextOrder), prevOrder), StringEntry(getOrderStatusKey(orderId), CANCELED), ScriptTransfer(i.caller, amount, bondAssetId)]
248252 }
249253
250254
251255
252256 @Callable(i)
253257 func liquidateBond () = {
254258 let liquidationBalance = assetBalance(this, neutrinoAssetId)
255259 let surplusPositive = if ((0 >= surplus))
256260 then 0
257261 else surplus
258262 let usdnAmount = if ((surplusPositive >= liquidationBalance))
259263 then liquidationBalance
260264 else surplusPositive
261265 let returnAmount = if ((surplusPositive >= liquidationBalance))
262266 then 0
263267 else (liquidationBalance - surplusPositive)
264268 if (isBlocked)
265269 then throw("contract is blocked by EMERGENCY SHUTDOWN actions until reactivation by emergency oracles")
266270 else if ((liquidationBalance == 0))
267271 then throw("without base tokens to liquidate")
268272 else if ((returnAmount > 0))
269273 then [ScriptTransfer(neutrinoContract, returnAmount, neutrinoAssetId)]
270274 else if ((firstOrder == ""))
271275 then throw("empty orderbook")
272276 else {
273277 let nextOrder = getNextOrder(firstOrder)
274278 let filledTotal = getOrderFilledTotal(firstOrder)
275279 let nsbt2UsdnPrice = getOrderPrice(firstOrder)
276280 let remainedTotal = (getOrderTotal(firstOrder) - filledTotal)
277281 let totalUSDNRequiredToFillOrderX100 = fraction(remainedTotal, nsbt2UsdnPrice, 1)
278282 let totalUSDNRequiredToFillOrder = (totalUSDNRequiredToFillOrderX100 / 100)
279283 let isOrderFullyFilable = (usdnAmount >= totalUSDNRequiredToFillOrder)
280284 let fillableOrderAmountX100 = if (isOrderFullyFilable)
281285 then totalUSDNRequiredToFillOrderX100
282286 else (usdnAmount * 100)
283287 let finalNBTFillable = fraction(fillableOrderAmountX100, 1, nsbt2UsdnPrice)
284288 let fillableOrderAmount = (fillableOrderAmountX100 / 100)
285289 let nbTokensLiquidateCondition = (fraction((surplus + neutrinoSupply), 100, neutrinoSupply) >= nsbt2UsdnPrice)
286290 if (!(nbTokensLiquidateCondition))
287291 then throw(("innapropriate surplus: " + toString(surplus)))
288292 else {
289293 let isNothingToFillNow = (remainedTotal == 0)
290294 let isNothingToFillAtAll = ((filledTotal + finalNBTFillable) == getOrderTotal(firstOrder))
291295 let newStatus = if (if (isOrderFullyFilable)
292296 then if (isNothingToFillNow)
293297 then true
294298 else isNothingToFillAtAll
295299 else false)
296300 then FILLED
297301 else NEW
298302 [StringEntry(getPrevOrderKey(nextOrder), if ((newStatus == FILLED))
299303 then ""
300304 else firstOrder), StringEntry(FirstOrderKey, if ((newStatus == FILLED))
301305 then nextOrder
302306 else firstOrder), IntegerEntry(getOrderFilledTotalKey(firstOrder), (filledTotal + finalNBTFillable)), StringEntry(getOrderStatusKey(firstOrder), newStatus), StringEntry(CurrentDefaultOrderKey, if ((newStatus == NEW))
303307 then currentDefaultOrder
304308 else computeCurrentDefaultOrder(firstOrder)), ScriptTransfer(addressFromStringValue(getOrderOwner(firstOrder)), fillableOrderAmount, neutrinoAssetId), ScriptTransfer(auctionContract, finalNBTFillable, bondAssetId)]
305309 }
306310 }
307311 }
308312
309313
310314 @Verifier(tx)
311315 func verify () = {
312- let pubKeyAdminsList = ["GJdLSaLiv5K7xuejac8mcRcHoyo3dPrESrvktG3a6MAR", "FWVffYr2ALmHMejZm3WqeLz6Sdym3gLFGtJn4KTwyU5x", "3Wh2LaWcb5gg7K2pPcW3Ep6EAuRBzYkAgrdpt43jTDFa", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"]
316+ let pubKeyAdminsListStr = makeString(["GJdLSaLiv5K7xuejac8mcRcHoyo3dPrESrvktG3a6MAR", "EYwZmURd5KKaQRBjsVa6g8DPisFoS6SovRJtFiL5gMHU", "DtmAfuDdCrHK8spdAeAYzq6MsZegeD9gnsrpuTRkCbVA", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"], SEP)
317+ let pubKeyAdminsList = split(valueOrElse(getString(controlContract, "%s__multisig"), pubKeyAdminsListStr), SEP)
313318 let count = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0])))
314319 then 1
315320 else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(pubKeyAdminsList[1])))
316321 then 1
317322 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(pubKeyAdminsList[2])))
318323 then 1
319324 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[3], fromBase58String(pubKeyAdminsList[3])))
320325 then 2
321326 else 0))
322327 (count >= 3)
323328 }
324329

github/deemru/w8io/6500d08 
50.46 ms