2019.10.25 19:03 [1766074] smart account 3PC9BfRwJWWiw9AREE2B3eWzCks3CYtg4yo > SELF 0.00000000 Waves

{ "type": 13, "id": "73j1bwzmZ2vHDzcx1DMbgX1FXJwyBAHFFSR52YuwB7md", "fee": 1400000, "feeAssetId": null, "timestamp": 1572019442982, "version": 1, "sender": "3PC9BfRwJWWiw9AREE2B3eWzCks3CYtg4yo", "senderPublicKey": "BRnVwSVctnV8pge5vRpsJdWnkjWEJspFb6QvrmZvu3Ht", "proofs": [ "4PvdBSQZMEEpiK8zvyzPqEKusoCutdJaZz3rRkA5XritJMd5nYQpR2orwrRtS2CD1yFyiMKwv9FKFJp87dvNkWpe" ], "script": "base64:AAIDAAAAAAAAAC0IARIAEgASAwoBCBIAEgASAwoBCBIAEgMKAQgSABIGCgQIAQEBEgYKBAgIAQEAAABrAQAAAA5nZXROdW1iZXJCeUtleQAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEGgAAAAIFAAAABHRoaXMFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAAAAAAAAAAAAAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAgAAAAABAAAADGdldEJvb2xCeUtleQAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEGwAAAAIFAAAABHRoaXMFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAHQm9vbGVhbgQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQcBAAAAGGdldE51bWJlckJ5QWRkcmVzc0FuZEtleQAAAAIAAAAHYWRkcmVzcwAAAANrZXkEAAAAByRtYXRjaDAJAAQaAAAAAgkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABBQAAAAdhZGRyZXNzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQAAAAAAAAAAAAEAAAAYZ2V0U3RyaW5nQnlBZGRyZXNzQW5kS2V5AAAAAgAAAAdhZGRyZXNzAAAAA2tleQQAAAAHJG1hdGNoMAkABB0AAAACCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEFAAAAB2FkZHJlc3MFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAgAAAAABAAAAFmdldEJvb2xCeUFkZHJlc3NBbmRLZXkAAAACAAAAB2FkZHJlc3MAAAADa2V5BAAAAAckbWF0Y2gwCQAEGwAAAAIJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQUAAAAHYWRkcmVzcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAdCb29sZWFuBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhBwEAAAAFaXNJbnQAAAABAAAAA3ZhbAQAAAAHJG1hdGNoMAUAAAADdmFsAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWEFAAAAByRtYXRjaDAGBwAAAAAPTElTVFNQTElUU1lNQk9MAgAAAAFfAAAAAA5MSVNUREFUQVNZTUJPTAIAAAABKwAAAAAHV0FWRUxFVAAAAAAABfXhAAAAAAAFUEFVTEkAAAAAAAAAAGQAAAAADUNSWVRJQ0FMU0hBUkUAAAAAAAAAABQAAAAADExFQVNJTkdTSEFSRQAAAAAAAAAAMgAAAAAIQ0FOQ0VMRUQCAAAACGNhbmNlbGVkAAAAAANORVcCAAAAA25ldwAAAAAGRklMTEVEAgAAAAZmaWxsZWQAAAAAEk5ldXRyaW5vQXNzZXRJZEtleQIAAAARbmV1dHJpbm9fYXNzZXRfaWQAAAAADkJvbmRBc3NldElkS2V5AgAAAA1ib25kX2Fzc2V0X2lkAAAAABJBdWN0aW9uQ29udHJhY3RLZXkCAAAAEGF1Y3Rpb25fY29udHJhY3QAAAAADlJQRENvbnRyYWN0S2V5AgAAAAxycGRfY29udHJhY3QAAAAAEUNvbnRvbENvbnRyYWN0S2V5AgAAABBjb250cm9sX2NvbnRyYWN0AAAAABZCYWxhbmNlTG9ja0ludGVydmFsS2V5AgAAABViYWxhbmNlX2xvY2tfaW50ZXJ2YWwAAAAAFU1pbldhdmVzU3dhcEFtb3VudEtleQIAAAAVbWluX3dhdmVzX3N3YXBfYW1vdW50AAAAABhNaW5OZXV0cmlub1N3YXBBbW91bnRLZXkCAAAAGG1pbl9uZXV0cmlub19zd2FwX2Ftb3VudAAAAAAOTm9kZUFkZHJlc3NLZXkCAAAADG5vZGVfYWRkcmVzcwAAAAASTGVhc2luZ0ludGVydmFsS2V5AgAAABBsZWFzaW5nX2ludGVydmFsAAAAAAhQcmljZUtleQIAAAAFcHJpY2UAAAAAF1NjcmlwdFVwZGF0ZUludGVydmFsS2V5AgAAABZzY3JpcHRfdXBkYXRlX2ludGVydmFsAAAAABJOZXV0cmlub0JhbGFuY2VLZXkCAAAACW5ldXRyaW5vXwAAAAAPV2F2ZXNCYWxhbmNlS2V5AgAAAAZ3YXZlc18AAAAAFUJhbGFuY2VVbmxvY2tCbG9ja0tleQIAAAAOYmFsYW5jZV9ibG9ja18AAAAADE9yZGVyYm9va0tleQIAAAAJb3JkZXJib29rAAAAAA1PcmRlclRvdGFsS2V5AgAAAAxvcmRlcl90b3RhbF8AAAAADU9yZGVyT3duZXJLZXkCAAAADG9yZGVyX293bmVyXwAAAAAOT3JkZXJIZWlnaHRLZXkCAAAADW9yZGVyX2hlaWdodF8AAAAAE09yZGVyRmlsbGVkVG90YWxLZXkCAAAAE29yZGVyX2ZpbGxlZF90b3RhbF8AAAAADk9yZGVyU3RhdHVzS2V5AgAAAA1vcmRlcl9zdGF0dXNfAAAAAA9SUERTeW5jSW5kZXhLZXkCAAAADnJwZF9zeW5jX2luZGV4AAAAAAxSUERQcm9maXRLZXkCAAAACnJwZF9wcm9maXQAAAAADVJQREJhbGFuY2VLZXkCAAAAC3JwZF9iYWxhbmNlAAAAAAxJc0Jsb2NrZWRLZXkCAAAACmlzX2Jsb2NrZWQAAAAAGUlzTGVhc2luZ1Byb2ZpdFR4RXhpc3RLZXkCAAAAEWlzX2xlYXNpbmdfcHJvZml0AAAAABRTY3JpcHRVcGRhdGVCbG9ja0tleQIAAAATc2NyaXB0X3VwZGF0ZV9ibG9jawAAAAAKTGVhc2VUeEtleQIAAAAIbGVhc2VfdHgAAAAADkxlYXNlVHhIYXNoS2V5AgAAAA1sZWFzZV90eF9oYXNoAAAAABBMZWFzaW5nQW1vdW50S2V5AgAAAA5sZWFzaW5nX2Ftb3VudAAAAAAZTGVhc2VUeEV4cGlyZVNlbmRCbG9ja0tleQIAAAATbGVhc2luZ19leHBpcmVfc2VuZAAAAAAVTGVhc2luZ0V4cGlyZUJsb2NrS2V5AgAAABRsZWFzaW5nX2V4cGlyZV9ibG9jawAAAAAOSXNSZWJhbGFuY2VLZXkCAAAADGlzX3JlYmFsYW5jZQAAAAAUU3dhcExvY2tlZEJhbGFuY2VLZXkCAAAAE3N3YXBfbG9ja2VkX2JhbGFuY2UBAAAAIGdldFJQRFNuYXBzaG90Q29udHJhY3RCYWxhbmNlS2V5AAAAAgAAAAVjb3VudAAAAAdhc3NldElkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIFAAAADVJQREJhbGFuY2VLZXkCAAAAAV8JAAJYAAAAAQUAAAAHYXNzZXRJZAIAAAABXwkAAaQAAAABBQAAAAVjb3VudAEAAAAYZ2V0UlBEQ29udHJhY3RCYWxhbmNlS2V5AAAAAQAAAAdhc3NldElkCQABLAAAAAIJAAEsAAAAAgUAAAANUlBEQmFsYW5jZUtleQIAAAABXwkAAlgAAAABBQAAAAdhc3NldElkAQAAAA9nZXRSUERQcm9maXRLZXkAAAABAAAABWNvdW50CQABLAAAAAIJAAEsAAAAAgUAAAAMUlBEUHJvZml0S2V5AgAAAAFfCQABpAAAAAEFAAAABWNvdW50AQAAABVnZXROZXV0cmlub0JhbGFuY2VLZXkAAAABAAAABW93bmVyCQABLAAAAAIFAAAAEk5ldXRyaW5vQmFsYW5jZUtleQUAAAAFb3duZXIBAAAAEmdldFdhdmVzQmFsYW5jZUtleQAAAAEAAAAFb3duZXIJAAEsAAAAAgUAAAAPV2F2ZXNCYWxhbmNlS2V5BQAAAAVvd25lcgEAAAAYZ2V0QmFsYW5jZVVubG9ja0Jsb2NrS2V5AAAAAQAAAAVvd25lcgkAASwAAAACBQAAABVCYWxhbmNlVW5sb2NrQmxvY2tLZXkFAAAABW93bmVyAQAAABBnZXRPcmRlclRvdGFsS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAIFAAAADU9yZGVyVG90YWxLZXkFAAAAB29yZGVySWQBAAAAEGdldE9yZGVyT3duZXJLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgUAAAANT3JkZXJPd25lcktleQUAAAAHb3JkZXJJZAEAAAARZ2V0T3JkZXJIZWlnaHRLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgUAAAAOT3JkZXJIZWlnaHRLZXkFAAAAB29yZGVySWQBAAAAEWdldE9yZGVyU3RhdHVzS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAIFAAAADk9yZGVyU3RhdHVzS2V5BQAAAAdvcmRlcklkAQAAABZnZXRPcmRlckZpbGxlZFRvdGFsS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAIFAAAAE09yZGVyRmlsbGVkVG90YWxLZXkFAAAAB29yZGVySWQAAAAAD2NvbnRyb2xDb250cmFjdAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAARQ29udG9sQ29udHJhY3RLZXkAAAAABXByaWNlCQEAAAAYZ2V0TnVtYmVyQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAPY29udHJvbENvbnRyYWN0BQAAAAhQcmljZUtleQEAAAAWY29udmVydE5ldXRyaW5vVG9XYXZlcwAAAAEAAAAGYW1vdW50CQAAaQAAAAIJAABoAAAAAgkAAGkAAAACCQAAaAAAAAIFAAAABmFtb3VudAAAAAAAAAAAZAUAAAAFcHJpY2UFAAAAB1dBVkVMRVQFAAAABVBBVUxJAQAAABZjb252ZXJ0V2F2ZXNUb05ldXRyaW5vAAAAAQAAAAZhbW91bnQJAABpAAAAAgkAAGgAAAACCQAAaQAAAAIJAABoAAAAAgUAAAAGYW1vdW50BQAAAAVwcmljZQAAAAAAAAAAZAUAAAAFUEFVTEkFAAAAB1dBVkVMRVQBAAAAFWNvbnZlcnROZXV0cmlub1RvQm9uZAAAAAEAAAAGYW1vdW50CQAAaQAAAAIFAAAABmFtb3VudAUAAAAFUEFVTEkBAAAAFWNvbnZlcnRCb25kVG9OZXV0cmlubwAAAAEAAAAGYW1vdW50CQAAaAAAAAIFAAAABmFtb3VudAUAAAAFUEFVTEkBAAAAEmNvbnZlcnRXYXZlc1RvQm9uZAAAAAEAAAAGYW1vdW50CQEAAAAVY29udmVydE5ldXRyaW5vVG9Cb25kAAAAAQkBAAAAFmNvbnZlcnRXYXZlc1RvTmV1dHJpbm8AAAABBQAAAAZhbW91bnQAAAAAC2lzUmViYWxhbmNlCQEAAAAMZ2V0Qm9vbEJ5S2V5AAAAAQUAAAAOSXNSZWJhbGFuY2VLZXkAAAAAD2xlYXNpbmdJbnRlcnZhbAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQUAAAASTGVhc2luZ0ludGVydmFsS2V5AAAAABZsZWFzZVR4RXhwaXJlU2VuZEJsb2NrCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABBQAAABlMZWFzZVR4RXhwaXJlU2VuZEJsb2NrS2V5AAAAABJsZWFzaW5nRXhwaXJlQmxvY2sJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEFAAAAFUxlYXNpbmdFeHBpcmVCbG9ja0tleQAAAAALbGVhc2VUeEhhc2gJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAADkxlYXNlVHhIYXNoS2V5AAAAAAxsZWFzZVR4Qnl0ZXMJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAACkxlYXNlVHhLZXkAAAAADWxlYXNpbmdBbW91bnQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEFAAAAEExlYXNpbmdBbW91bnRLZXkAAAAAEXN3YXBMb2NrZWRCYWxhbmNlCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABBQAAABRTd2FwTG9ja2VkQmFsYW5jZUtleQAAAAALbm9kZUFkZHJlc3MJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAADk5vZGVBZGRyZXNzS2V5AAAAABRzY3JpcHRVcGRhdGVJbnRlcnZhbAkBAAAAGGdldE51bWJlckJ5QWRkcmVzc0FuZEtleQAAAAIFAAAAEUNvbnRvbENvbnRyYWN0S2V5BQAAABdTY3JpcHRVcGRhdGVJbnRlcnZhbEtleQAAAAARc2NyaXB0VXBkYXRlQmxvY2sJAQAAABhnZXROdW1iZXJCeUFkZHJlc3NBbmRLZXkAAAACBQAAAA9jb250cm9sQ29udHJhY3QFAAAAFFNjcmlwdFVwZGF0ZUJsb2NrS2V5AAAAAAxycGRTeW5jSW5kZXgJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEFAAAAD1JQRFN5bmNJbmRleEtleQAAAAATYmFsYW5jZUxvY2tJbnRlcnZhbAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQUAAAAWQmFsYW5jZUxvY2tJbnRlcnZhbEtleQAAAAAJaXNCbG9ja2VkCQEAAAAWZ2V0Qm9vbEJ5QWRkcmVzc0FuZEtleQAAAAIFAAAAD2NvbnRyb2xDb250cmFjdAUAAAAMSXNCbG9ja2VkS2V5AAAAABJtaW5XYXZlc1N3YXBBbW91bnQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEFAAAAFU1pbldhdmVzU3dhcEFtb3VudEtleQAAAAAVbWluTmV1dHJpbm9Td2FwQW1vdW50CQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABBQAAABhNaW5OZXV0cmlub1N3YXBBbW91bnRLZXkAAAAAD25ldXRyaW5vQXNzZXRJZAkAAlkAAAABCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABBQAAABJOZXV0cmlub0Fzc2V0SWRLZXkAAAAAD2F1Y3Rpb25Db250cmFjdAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAASQXVjdGlvbkNvbnRyYWN0S2V5AAAAAAtycGRDb250cmFjdAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAAOUlBEQ29udHJhY3RLZXkAAAAAB3Jlc2VydmUJAABlAAAAAgkBAAAADHdhdmVzQmFsYW5jZQAAAAEFAAAABHRoaXMFAAAAEXN3YXBMb2NrZWRCYWxhbmNlAAAAABVyZXNlcnZlV2l0aG91dExlYXNpbmcJAABlAAAAAgkAAGUAAAACCQEAAAAMd2F2ZXNCYWxhbmNlAAAAAQUAAAAEdGhpcwkAAGgAAAACBQAAAA1sZWFzaW5nQW1vdW50AwkBAAAABWlzSW50AAAAAQkAA+kAAAABCQACWQAAAAEFAAAAC2xlYXNlVHhIYXNoAAAAAAAAAAABAAAAAAAAAAAABQAAABFzd2FwTG9ja2VkQmFsYW5jZQAAAAAJb3JkZXJib29rCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABBQAAAAxPcmRlcmJvb2tLZXkAAAAAC2JvbmRBc3NldElkCQACWQAAAAEJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAADkJvbmRBc3NldElkS2V5AAAAAApib25kU3VwcGx5BAAAAARpbmZvCQEAAAAHZXh0cmFjdAAAAAEJAAPsAAAAAQUAAAALYm9uZEFzc2V0SWQJAABlAAAAAggFAAAABGluZm8AAAAIcXVhbnRpdHkJAAPrAAAAAgUAAAAEdGhpcwUAAAALYm9uZEFzc2V0SWQAAAAADm5ldXRyaW5vU3VwcGx5BAAAAARpbmZvCQEAAAAHZXh0cmFjdAAAAAEJAAPsAAAAAQUAAAAPbmV1dHJpbm9Bc3NldElkCQAAZQAAAAIIBQAAAARpbmZvAAAACHF1YW50aXR5CQAD6wAAAAIFAAAABHRoaXMFAAAAD25ldXRyaW5vQXNzZXRJZAAAAAAHc3VycGx1cwkAAGUAAAACCQEAAAAWY29udmVydFdhdmVzVG9OZXV0cmlubwAAAAEFAAAAB3Jlc2VydmUFAAAADm5ldXRyaW5vU3VwcGx5AAAAAAdkZWZpY2l0CQAAZQAAAAIFAAAADm5ldXRyaW5vU3VwcGx5CQEAAAAWY29udmVydFdhdmVzVG9OZXV0cmlubwAAAAEFAAAAB3Jlc2VydmUBAAAAFWdldFJQRENvbnRyYWN0QmFsYW5jZQAAAAEAAAAHYXNzZXRJZAkBAAAAGGdldE51bWJlckJ5QWRkcmVzc0FuZEtleQAAAAIFAAAAC3JwZENvbnRyYWN0CQEAAAAYZ2V0UlBEQ29udHJhY3RCYWxhbmNlS2V5AAAAAQUAAAAHYXNzZXRJZAEAAAAPZ2V0V2F2ZXNCYWxhbmNlAAAAAQAAAAVvd25lcgkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAEmdldFdhdmVzQmFsYW5jZUtleQAAAAEFAAAABW93bmVyAQAAABJnZXROZXV0cmlub0JhbGFuY2UAAAABAAAABW93bmVyCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAVZ2V0TmV1dHJpbm9CYWxhbmNlS2V5AAAAAQUAAAAFb3duZXIBAAAAFWdldFVubG9ja0JhbGFuY2VCbG9jawAAAAEAAAAFb3duZXIJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABhnZXRCYWxhbmNlVW5sb2NrQmxvY2tLZXkAAAABBQAAAAVvd25lcgEAAAANZ2V0T3JkZXJUb3RhbAAAAAEAAAACaWQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABBnZXRPcmRlclRvdGFsS2V5AAAAAQUAAAACaWQBAAAADWdldE9yZGVyT3duZXIAAAABAAAAAmlkCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAQZ2V0T3JkZXJPd25lcktleQAAAAEFAAAAAmlkAQAAAA5nZXRPcmRlclN0YXR1cwAAAAEAAAACaWQJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAABFnZXRPcmRlclN0YXR1c0tleQAAAAEFAAAA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BQAAABRTd2FwTG9ja2VkQmFsYW5jZUtleQkAAGQAAAACBQAAABFzd2FwTG9ja2VkQmFsYW5jZQUAAAAGYW1vdW50BQAAAANuaWwAAAABaQEAAAAId2l0aGRyYXcAAAABAAAAB2FjY291bnQDCQAAZgAAAAIJAQAAABVnZXRVbmxvY2tCYWxhbmNlQmxvY2sAAAABBQAAAAdhY2NvdW50BQAAAAZoZWlnaHQJAAACAAAAAQIAAAAkd2FpdCBhIGNvdXBsZSBvZiBibG9ja3MgZm9yIHdpdGhkcmF3CQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAEmdldFdhdmVzQmFsYW5jZUtleQAAAAEFAAAAB2FjY291bnQAAAAAAAAAAAAJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABVnZXROZXV0cmlub0JhbGFuY2VLZXkAAAABBQAAAAdhY2NvdW50AAAAAAAAAAAACQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAABRTd2FwTG9ja2VkQmFsYW5jZUtleQkAAGUAAAACBQAAABFzd2FwTG9ja2VkQmFsYW5jZQkBAAAAD2dldFdhdmVzQmFsYW5jZQAAAAEFAAAAB2FjY291bnQFAAAAA25pbAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEFAAAAB2FjY291bnQJAQAAABJnZXROZXV0cmlub0JhbGFuY2UAAAABBQAAAAdhY2NvdW50BQAAAA9uZXV0cmlub0Fzc2V0SWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABBQAAAAdhY2NvdW50CQEAAAAPZ2V0V2F2ZXNCYWxhbmNlAAAAAQUAAAAHYWNjb3VudAUAAAAEdW5pdAUAAAADbmlsAAAAAWkBAAAADGdlbmVyYXRlQm9uZAAAAAAEAAAADmJhbGFuY2VBdWN0aW9uCQAD6wAAAAIJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQUAAAAPYXVjdGlvbkNvbnRyYWN0BQAAAAtib25kQXNzZXRJZAQAAAAGYW1vdW50CQAAZQAAAAIJAQAAABVjb252ZXJ0TmV1dHJpbm9Ub0JvbmQAAAABBQAAAAdkZWZpY2l0BQAAAA5iYWxhbmNlQXVjdGlvbgMFAAAACWlzQmxvY2tlZAkAAAIAAAABAgAAABNjb250cmFjdCBpcyBibG9ja2VkAwkAAGcAAAACBQAAAAZhbW91bnQAAAAAAAAAAAoJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABBQAAAA9hdWN0aW9uQ29udHJhY3QFAAAABmFtb3VudAUAAAALYm9uZEFzc2V0SWQFAAAAA25pbAkAAAIAAAABAgAAACVib25kIHdlcmUgZ2VuZXJhdGVkIG9yIGRvIG5vdCBuZWVkIGl0AAAAAWkBAAAACHNldE9yZGVyAAAAAAQAAAADcG10CQEAAAAHZXh0cmFjdAAAAAEIBQAAAAFpAAAAB3BheW1lbnQEAAAACm5ld09yZGVySWQJAAJYAAAAAQkAAfUAAAABCQAAywAAAAIJAADLAAAAAgkAAZoAAAABCAUAAAADcG10AAAABmFtb3VudAgIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwkAAZoAAAABBQAAAAZoZWlnaHQDCQEAAAACIT0AAAACCAUAAAADcG10AAAAB2Fzc2V0SWQFAAAAC2JvbmRBc3NldElkCQAAAgAAAAECAAAAEWNhbiB1c2UgYm9uZCBvbmx5AwkBAAAAAiE9AAAAAgkBAAAADWdldE9yZGVyT3duZXIAAAABBQAAAApuZXdPcmRlcklkAgAAAAAJAAACAAAAAQIAAAAMb3JkZXIgZXhpc3RzCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAxPcmRlcmJvb2tLZXkJAQAAAAhhZGRPcmRlcgAAAAEFAAAACm5ld09yZGVySWQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABBnZXRPcmRlclRvdGFsS2V5AAAAAQUAAAAKbmV3T3JkZXJJZAgFAAAAA3BtdAAAAAZhbW91bnQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABBnZXRPcmRlck93bmVyS2V5AAAAAQUAAAAKbmV3T3JkZXJJZAkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABFnZXRPcmRlckhlaWdodEtleQAAAAEFAAAACm5ld09yZGVySWQFAAAABmhlaWdodAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAEWdldE9yZGVyU3RhdHVzS2V5AAAAAQUAAAAKbmV3T3JkZXJJZAUAAAADTkVXBQAAAANuaWwAAAABaQEAAAALY2FuY2VsT3JkZXIAAAABAAAAB29yZGVySWQEAAAABW93bmVyCQEAAAANZ2V0T3JkZXJPd25lcgAAAAEFAAAAB29yZGVySWQEAAAABmFtb3VudAkAAGUAAAACCQEAAAANZ2V0T3JkZXJUb3RhbAAAAAEFAAAAB29yZGVySWQJAQAAABNnZXRPcmRlckZpbGxlZFRvdGFsAAAAAQUAAAAHb3JkZXJJZAMJAQAAAAIhPQAAAAIFAAAABW93bmVyCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgkAAAIAAAABAgAAABFwZXJtaXNzaW9uIGRlbmllZAMJAQAAAAIhPQAAAAIJAQAAAA5nZXRPcmRlclN0YXR1cwAAAAEFAAAAB29yZGVySWQFAAAAA05FVwkAAAIAAAABAgAAABRpbnZhbGlkIG9yZGVyIHN0YXR1cwkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAADE9yZGVyYm9va0tleQkBAAAACWRyb3BPcmRlcgAAAAEFAAAAB29yZGVySWQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABFnZXRPcmRlclN0YXR1c0tleQAAAAEFAAAAB29yZGVySWQFAAAACENBTkNFTEVEBQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAZhbW91bnQFAAAAC2JvbmRBc3NldElkBQAAAANuaWwAAAABaQEAAAAMZXhlY3V0ZU9yZGVyAAAAAAQAAAAHb3JkZXJJZAkAAZEAAAACCQAEtQAAAAIFAAAACW9yZGVyYm9vawUAAAAPTElTVFNQTElUU1lNQk9MAAAAAAAAAAAABAAAAApvcmRlclRvdGFsCQEAAAANZ2V0T3JkZXJUb3RhbAAAAAEFAAAAB29yZGVySWQEAAAACm9yZGVyT3duZXIJAQAAAA1nZXRPcmRlck93bmVyAAAAAQUAAAAHb3JkZXJJZAQAAAALZmlsbGVkVG90YWwJAQAAABNnZXRPcmRlckZpbGxlZFRvdGFsAAAAAQUAAAAHb3JkZXJJZAQAAAALc3VycGx1c0JvbmQJAQAAABVjb252ZXJ0TmV1dHJpbm9Ub0JvbmQAAAABBQAAAAdzdXJwbHVzAwUAAAAJaXNCbG9ja2VkCQAAAgAAAAECAAAAE2NvbnRyYWN0IGlzIGJsb2NrZWQDCQAAZwAAAAIAAAAAAAAAAAAFAAAAC3N1cnBsdXNCb25kCQAAAgAAAAECAAAAGXN1cnBsdXMgaXMgbGVzcyB0aGFuIHplcm8DAwkAAAAAAAACBQAAAApvcmRlck93bmVyAgAAAAAJAABnAAAAAgUAAAALc3VycGx1c0JvbmQAAAAAAAAAAAoHBAAAAA9uZXdScGRTeW5jSW5kZXgJAABkAAAAAgUAAAAMcnBkU3luY0luZGV4AAAAAAAAAAABCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAPUlBEU3luY0luZGV4S2V5BQAAAA9uZXdScGRTeW5jSW5kZXgJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAAA9nZXRSUERQcm9maXRLZXkAAAABBQAAAAxycGRTeW5jSW5kZXgFAAAAB3N1cnBsdXMJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAACBnZXRSUERTbmFwc2hvdENvbnRyYWN0QmFsYW5jZUtleQAAAAIFAAAADHJwZFN5bmNJbmRleAUAAAAPbmV1dHJpbm9Bc3NldElkCQEAAAAVZ2V0UlBEQ29udHJhY3RCYWxhbmNlAAAAAQUAAAAPbmV1dHJpbm9Bc3NldElkBQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABBQAAAAtycGRDb250cmFjdAUAAAAHc3VycGx1cwUAAAAPbmV1dHJpbm9Bc3NldElkBQAAAANuaWwEAAAABmFtb3VudAkAAGUAAAACBQAAAApvcmRlclRvdGFsBQAAAAtmaWxsZWRUb3RhbAQAAAAGc3RhdHVzAwkAAGcAAAACBQAAAAtzdXJwbHVzQm9uZAUAAAAGYW1vdW50BQAAAAZGSUxMRUQFAAAAA05FVwQAAAAObmV3RmlsbGVkVG90YWwDCQAAZwAAAAIFAAAAC3N1cnBsdXNCb25kBQAAAAZhbW91bnQFAAAABmFtb3VudAUAAAALc3VycGx1c0JvbmQJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAxPcmRlcmJvb2tLZXkDCQAAZwAAAAIFAAAAC3N1cnBsdXNCb25kBQAAAAZhbW91bnQJAQAAAAlkcm9wT3JkZXIAAAABBQAAAAdvcmRlcklkBQAAAAlvcmRlcmJvb2sJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABZnZXRPcmRlckZpbGxlZFRvdGFsS2V5AAAAAQUAAAAHb3JkZXJJZAkAAGQAAAACBQAAAAtmaWxsZWRUb3RhbAUAAAAObmV3RmlsbGVkVG90YWwJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABFnZXRPcmRlclN0YXR1c0tleQAAAAEFAAAAB29yZGVySWQFAAAABnN0YXR1cwUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQUAAAAKb3JkZXJPd25lcgkBAAAAFWNvbnZlcnRCb25kVG9OZXV0cmlu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", "chainId": 87, "height": 1766074, "spentComplexity": 0 } View: original | compacted Prev: k1RYjLjKpBf9yPQd5G8diR9Bz6oyx541fYDVe54yjaW Next: 4NaoQwY1ZoYuk1CYjT3FZ9LAmDswxugHhQsRfuEnBdRv Diff:
OldNewDifferences
297297
298298
299299 @Callable(i)
300-func setPrice () = WriteSet([DataEntry(PriceKey, price)])
301-
302-
303-
304-@Callable(i)
305300 func swapWavesToNeutrino () = {
306301 let pmt = extract(i.payment)
307302 if ((minWavesSwapAmount > pmt.amount))
406401 then FILLED
407402 else NEW
408403 let newFilledTotal = if ((surplusBond >= amount))
409- then orderTotal
404+ then amount
410405 else surplusBond
411406 ScriptResult(WriteSet([DataEntry(OrderbookKey, if ((surplusBond >= amount))
412407 then dropOrder(orderId)
481476 then throw("invalid pubKey")
482477 else if (!(isInt(transactionHeightById(txHash))))
483478 then throw("blockchain does not contain this transaction")
484- else if (if ((fee > 1000000))
485- then true
486- else (500000 > fee))
487- then throw("invalid fee")
488- else WriteSet([DataEntry(LeaseTxKey, ""), DataEntry(LeaseTxHashKey, ""), DataEntry(LeasingAmountKey, 0), DataEntry(LeaseTxExpireSendBlockKey, 0), DataEntry(LeasingExpireBlockKey, 0), DataEntry(IsRebalanceKey, false)])
479+ else WriteSet([DataEntry(LeaseTxKey, ""), DataEntry(LeaseTxHashKey, ""), DataEntry(LeasingAmountKey, 0), DataEntry(LeaseTxExpireSendBlockKey, 0), DataEntry(LeasingExpireBlockKey, 0), DataEntry(IsRebalanceKey, false)])
489480 }
490481
491482
498489 then (leaseTxExpireSendBlock >= height)
499490 else false
500491 case unleaseTx: LeaseCancelTransaction =>
501- if ((fromBase58String(leaseTxHash) == unleaseTx.leaseId))
492+ if (if ((fromBase58String(leaseTxHash) == unleaseTx.leaseId))
502493 then if ((height > leasingExpireBlock))
503494 then true
504495 else isRebalance
496+ else false)
497+ then if ((unleaseTx.fee >= 500000))
498+ then (1000000 >= unleaseTx.fee)
499+ else false
505500 else false
506501 case _ =>
507502 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func getNumberByKey (key) = match getInteger(this, key) {
55 case a: Int =>
66 a
77 case _ =>
88 0
99 }
1010
1111
1212 func getStringByKey (key) = match getString(this, key) {
1313 case a: String =>
1414 a
1515 case _ =>
1616 ""
1717 }
1818
1919
2020 func getBoolByKey (key) = match getBoolean(this, key) {
2121 case a: Boolean =>
2222 a
2323 case _ =>
2424 false
2525 }
2626
2727
2828 func getNumberByAddressAndKey (address,key) = match getInteger(addressFromStringValue(address), key) {
2929 case a: Int =>
3030 a
3131 case _ =>
3232 0
3333 }
3434
3535
3636 func getStringByAddressAndKey (address,key) = match getString(addressFromStringValue(address), key) {
3737 case a: String =>
3838 a
3939 case _ =>
4040 ""
4141 }
4242
4343
4444 func getBoolByAddressAndKey (address,key) = match getBoolean(addressFromStringValue(address), key) {
4545 case a: Boolean =>
4646 a
4747 case _ =>
4848 false
4949 }
5050
5151
5252 func isInt (val) = match val {
5353 case a: Int =>
5454 true
5555 case _ =>
5656 false
5757 }
5858
5959
6060 let LISTSPLITSYMBOL = "_"
6161
6262 let LISTDATASYMBOL = "+"
6363
6464 let WAVELET = 100000000
6565
6666 let PAULI = 100
6767
6868 let CRYTICALSHARE = 20
6969
7070 let LEASINGSHARE = 50
7171
7272 let CANCELED = "canceled"
7373
7474 let NEW = "new"
7575
7676 let FILLED = "filled"
7777
7878 let NeutrinoAssetIdKey = "neutrino_asset_id"
7979
8080 let BondAssetIdKey = "bond_asset_id"
8181
8282 let AuctionContractKey = "auction_contract"
8383
8484 let RPDContractKey = "rpd_contract"
8585
8686 let ContolContractKey = "control_contract"
8787
8888 let BalanceLockIntervalKey = "balance_lock_interval"
8989
9090 let MinWavesSwapAmountKey = "min_waves_swap_amount"
9191
9292 let MinNeutrinoSwapAmountKey = "min_neutrino_swap_amount"
9393
9494 let NodeAddressKey = "node_address"
9595
9696 let LeasingIntervalKey = "leasing_interval"
9797
9898 let PriceKey = "price"
9999
100100 let ScriptUpdateIntervalKey = "script_update_interval"
101101
102102 let NeutrinoBalanceKey = "neutrino_"
103103
104104 let WavesBalanceKey = "waves_"
105105
106106 let BalanceUnlockBlockKey = "balance_block_"
107107
108108 let OrderbookKey = "orderbook"
109109
110110 let OrderTotalKey = "order_total_"
111111
112112 let OrderOwnerKey = "order_owner_"
113113
114114 let OrderHeightKey = "order_height_"
115115
116116 let OrderFilledTotalKey = "order_filled_total_"
117117
118118 let OrderStatusKey = "order_status_"
119119
120120 let RPDSyncIndexKey = "rpd_sync_index"
121121
122122 let RPDProfitKey = "rpd_profit"
123123
124124 let RPDBalanceKey = "rpd_balance"
125125
126126 let IsBlockedKey = "is_blocked"
127127
128128 let IsLeasingProfitTxExistKey = "is_leasing_profit"
129129
130130 let ScriptUpdateBlockKey = "script_update_block"
131131
132132 let LeaseTxKey = "lease_tx"
133133
134134 let LeaseTxHashKey = "lease_tx_hash"
135135
136136 let LeasingAmountKey = "leasing_amount"
137137
138138 let LeaseTxExpireSendBlockKey = "leasing_expire_send"
139139
140140 let LeasingExpireBlockKey = "leasing_expire_block"
141141
142142 let IsRebalanceKey = "is_rebalance"
143143
144144 let SwapLockedBalanceKey = "swap_locked_balance"
145145
146146 func getRPDSnapshotContractBalanceKey (count,assetId) = ((((RPDBalanceKey + "_") + toBase58String(assetId)) + "_") + toString(count))
147147
148148
149149 func getRPDContractBalanceKey (assetId) = ((RPDBalanceKey + "_") + toBase58String(assetId))
150150
151151
152152 func getRPDProfitKey (count) = ((RPDProfitKey + "_") + toString(count))
153153
154154
155155 func getNeutrinoBalanceKey (owner) = (NeutrinoBalanceKey + owner)
156156
157157
158158 func getWavesBalanceKey (owner) = (WavesBalanceKey + owner)
159159
160160
161161 func getBalanceUnlockBlockKey (owner) = (BalanceUnlockBlockKey + owner)
162162
163163
164164 func getOrderTotalKey (orderId) = (OrderTotalKey + orderId)
165165
166166
167167 func getOrderOwnerKey (orderId) = (OrderOwnerKey + orderId)
168168
169169
170170 func getOrderHeightKey (orderId) = (OrderHeightKey + orderId)
171171
172172
173173 func getOrderStatusKey (orderId) = (OrderStatusKey + orderId)
174174
175175
176176 func getOrderFilledTotalKey (orderId) = (OrderFilledTotalKey + orderId)
177177
178178
179179 let controlContract = getStringByKey(ContolContractKey)
180180
181181 let price = getNumberByAddressAndKey(controlContract, PriceKey)
182182
183183 func convertNeutrinoToWaves (amount) = ((((amount * 100) / price) * WAVELET) / PAULI)
184184
185185
186186 func convertWavesToNeutrino (amount) = ((((amount * price) / 100) * PAULI) / WAVELET)
187187
188188
189189 func convertNeutrinoToBond (amount) = (amount / PAULI)
190190
191191
192192 func convertBondToNeutrino (amount) = (amount * PAULI)
193193
194194
195195 func convertWavesToBond (amount) = convertNeutrinoToBond(convertWavesToNeutrino(amount))
196196
197197
198198 let isRebalance = getBoolByKey(IsRebalanceKey)
199199
200200 let leasingInterval = getNumberByKey(LeasingIntervalKey)
201201
202202 let leaseTxExpireSendBlock = getNumberByKey(LeaseTxExpireSendBlockKey)
203203
204204 let leasingExpireBlock = getNumberByKey(LeasingExpireBlockKey)
205205
206206 let leaseTxHash = getStringByKey(LeaseTxHashKey)
207207
208208 let leaseTxBytes = getStringByKey(LeaseTxKey)
209209
210210 let leasingAmount = getNumberByKey(LeasingAmountKey)
211211
212212 let swapLockedBalance = getNumberByKey(SwapLockedBalanceKey)
213213
214214 let nodeAddress = getStringByKey(NodeAddressKey)
215215
216216 let scriptUpdateInterval = getNumberByAddressAndKey(ContolContractKey, ScriptUpdateIntervalKey)
217217
218218 let scriptUpdateBlock = getNumberByAddressAndKey(controlContract, ScriptUpdateBlockKey)
219219
220220 let rpdSyncIndex = getNumberByKey(RPDSyncIndexKey)
221221
222222 let balanceLockInterval = getNumberByKey(BalanceLockIntervalKey)
223223
224224 let isBlocked = getBoolByAddressAndKey(controlContract, IsBlockedKey)
225225
226226 let minWavesSwapAmount = getNumberByKey(MinWavesSwapAmountKey)
227227
228228 let minNeutrinoSwapAmount = getNumberByKey(MinNeutrinoSwapAmountKey)
229229
230230 let neutrinoAssetId = fromBase58String(getStringByKey(NeutrinoAssetIdKey))
231231
232232 let auctionContract = getStringByKey(AuctionContractKey)
233233
234234 let rpdContract = getStringByKey(RPDContractKey)
235235
236236 let reserve = (wavesBalance(this) - swapLockedBalance)
237237
238238 let reserveWithoutLeasing = ((wavesBalance(this) - (leasingAmount * (if (isInt(transactionHeightById(fromBase58String(leaseTxHash))))
239239 then 1
240240 else 0))) - swapLockedBalance)
241241
242242 let orderbook = getStringByKey(OrderbookKey)
243243
244244 let bondAssetId = fromBase58String(getStringByKey(BondAssetIdKey))
245245
246246 let bondSupply = {
247247 let info = extract(assetInfo(bondAssetId))
248248 (info.quantity - assetBalance(this, bondAssetId))
249249 }
250250
251251 let neutrinoSupply = {
252252 let info = extract(assetInfo(neutrinoAssetId))
253253 (info.quantity - assetBalance(this, neutrinoAssetId))
254254 }
255255
256256 let surplus = (convertWavesToNeutrino(reserve) - neutrinoSupply)
257257
258258 let deficit = (neutrinoSupply - convertWavesToNeutrino(reserve))
259259
260260 func getRPDContractBalance (assetId) = getNumberByAddressAndKey(rpdContract, getRPDContractBalanceKey(assetId))
261261
262262
263263 func getWavesBalance (owner) = getNumberByKey(getWavesBalanceKey(owner))
264264
265265
266266 func getNeutrinoBalance (owner) = getNumberByKey(getNeutrinoBalanceKey(owner))
267267
268268
269269 func getUnlockBalanceBlock (owner) = getNumberByKey(getBalanceUnlockBlockKey(owner))
270270
271271
272272 func getOrderTotal (id) = getNumberByKey(getOrderTotalKey(id))
273273
274274
275275 func getOrderOwner (id) = getStringByKey(getOrderOwnerKey(id))
276276
277277
278278 func getOrderStatus (id) = getStringByKey(getOrderStatusKey(id))
279279
280280
281281 func getOrderFilledTotal (id) = getNumberByKey(getOrderFilledTotalKey(id))
282282
283283
284284 func getRPDProfit (count) = getNumberByKey(getRPDProfitKey(count))
285285
286286
287287 func getOrderElementById (id) = (id + LISTSPLITSYMBOL)
288288
289289
290290 func addOrder (orderId) = (orderbook + getOrderElementById(orderId))
291291
292292
293293 func dropOrder (orderId) = {
294294 let parts = split(orderbook, getOrderElementById(orderId))
295295 (parts[0] + parts[1])
296296 }
297297
298298
299299 @Callable(i)
300-func setPrice () = WriteSet([DataEntry(PriceKey, price)])
301-
302-
303-
304-@Callable(i)
305300 func swapWavesToNeutrino () = {
306301 let pmt = extract(i.payment)
307302 if ((minWavesSwapAmount > pmt.amount))
308303 then throw("amount less min")
309304 else if (isDefined(pmt.assetId))
310305 then throw("can use waves only")
311306 else if (isBlocked)
312307 then throw("contract is blocked")
313308 else {
314309 let amount = convertWavesToNeutrino(pmt.amount)
315310 TransferSet([ScriptTransfer(i.caller, amount, neutrinoAssetId)])
316311 }
317312 }
318313
319314
320315
321316 @Callable(i)
322317 func swapNeutrinoToWaves () = {
323318 let pmt = extract(i.payment)
324319 if ((minNeutrinoSwapAmount > pmt.amount))
325320 then throw("amount less min")
326321 else if (isBlocked)
327322 then throw("contract is blocked")
328323 else if ((pmt.assetId != neutrinoAssetId))
329324 then throw("can use neutrino only")
330325 else {
331326 let account = toBase58String(i.caller.bytes)
332327 let amount = convertNeutrinoToWaves(pmt.amount)
333328 WriteSet([DataEntry(getWavesBalanceKey(account), (getWavesBalance(account) + amount)), DataEntry(getBalanceUnlockBlockKey(account), (height + balanceLockInterval)), DataEntry(IsRebalanceKey, (((reserve * CRYTICALSHARE) / 100) >= (reserveWithoutLeasing - amount))), DataEntry(SwapLockedBalanceKey, (swapLockedBalance + amount))])
334329 }
335330 }
336331
337332
338333
339334 @Callable(i)
340335 func withdraw (account) = if ((getUnlockBalanceBlock(account) > height))
341336 then throw("wait a couple of blocks for withdraw")
342337 else ScriptResult(WriteSet([DataEntry(getWavesBalanceKey(account), 0), DataEntry(getNeutrinoBalanceKey(account), 0), DataEntry(SwapLockedBalanceKey, (swapLockedBalance - getWavesBalance(account)))]), TransferSet([ScriptTransfer(addressFromStringValue(account), getNeutrinoBalance(account), neutrinoAssetId), ScriptTransfer(addressFromStringValue(account), getWavesBalance(account), unit)]))
343338
344339
345340
346341 @Callable(i)
347342 func generateBond () = {
348343 let balanceAuction = assetBalance(addressFromStringValue(auctionContract), bondAssetId)
349344 let amount = (convertNeutrinoToBond(deficit) - balanceAuction)
350345 if (isBlocked)
351346 then throw("contract is blocked")
352347 else if ((amount >= 10))
353348 then TransferSet([ScriptTransfer(addressFromStringValue(auctionContract), amount, bondAssetId)])
354349 else throw("bond were generated or do not need it")
355350 }
356351
357352
358353
359354 @Callable(i)
360355 func setOrder () = {
361356 let pmt = extract(i.payment)
362357 let newOrderId = toBase58String(keccak256(((toBytes(pmt.amount) + i.caller.bytes) + toBytes(height))))
363358 if ((pmt.assetId != bondAssetId))
364359 then throw("can use bond only")
365360 else if ((getOrderOwner(newOrderId) != ""))
366361 then throw("order exists")
367362 else WriteSet([DataEntry(OrderbookKey, addOrder(newOrderId)), DataEntry(getOrderTotalKey(newOrderId), pmt.amount), DataEntry(getOrderOwnerKey(newOrderId), toString(i.caller)), DataEntry(getOrderHeightKey(newOrderId), height), DataEntry(getOrderStatusKey(newOrderId), NEW)])
368363 }
369364
370365
371366
372367 @Callable(i)
373368 func cancelOrder (orderId) = {
374369 let owner = getOrderOwner(orderId)
375370 let amount = (getOrderTotal(orderId) - getOrderFilledTotal(orderId))
376371 if ((owner != toString(i.caller)))
377372 then throw("permission denied")
378373 else if ((getOrderStatus(orderId) != NEW))
379374 then throw("invalid order status")
380375 else ScriptResult(WriteSet([DataEntry(OrderbookKey, dropOrder(orderId)), DataEntry(getOrderStatusKey(orderId), CANCELED)]), TransferSet([ScriptTransfer(i.caller, amount, bondAssetId)]))
381376 }
382377
383378
384379
385380 @Callable(i)
386381 func executeOrder () = {
387382 let orderId = split(orderbook, LISTSPLITSYMBOL)[0]
388383 let orderTotal = getOrderTotal(orderId)
389384 let orderOwner = getOrderOwner(orderId)
390385 let filledTotal = getOrderFilledTotal(orderId)
391386 let surplusBond = convertNeutrinoToBond(surplus)
392387 if (isBlocked)
393388 then throw("contract is blocked")
394389 else if ((0 >= surplusBond))
395390 then throw("surplus is less than zero")
396391 else if (if ((orderOwner == ""))
397392 then (surplusBond >= 10)
398393 else false)
399394 then {
400395 let newRpdSyncIndex = (rpdSyncIndex + 1)
401396 ScriptResult(WriteSet([DataEntry(RPDSyncIndexKey, newRpdSyncIndex), DataEntry(getRPDProfitKey(rpdSyncIndex), surplus), DataEntry(getRPDSnapshotContractBalanceKey(rpdSyncIndex, neutrinoAssetId), getRPDContractBalance(neutrinoAssetId))]), TransferSet([ScriptTransfer(addressFromStringValue(rpdContract), surplus, neutrinoAssetId)]))
402397 }
403398 else {
404399 let amount = (orderTotal - filledTotal)
405400 let status = if ((surplusBond >= amount))
406401 then FILLED
407402 else NEW
408403 let newFilledTotal = if ((surplusBond >= amount))
409- then orderTotal
404+ then amount
410405 else surplusBond
411406 ScriptResult(WriteSet([DataEntry(OrderbookKey, if ((surplusBond >= amount))
412407 then dropOrder(orderId)
413408 else orderbook), DataEntry(getOrderFilledTotalKey(orderId), (filledTotal + newFilledTotal)), DataEntry(getOrderStatusKey(orderId), status)]), TransferSet([ScriptTransfer(addressFromStringValue(orderOwner), convertBondToNeutrino(newFilledTotal), neutrinoAssetId)]))
414409 }
415410 }
416411
417412
418413
419414 @Callable(i)
420415 func transfer (account) = {
421416 let pmt = extract(i.payment)
422417 if (isDefined(pmt.assetId))
423418 then throw("can use waves only at the moment")
424419 else TransferSet([ScriptTransfer(addressFromStringValue(account), pmt.amount, unit)])
425420 }
426421
427422
428423
429424 @Callable(i)
430425 func nodeReward () = {
431426 let pmt = value(i.payment)
432427 if ((i.caller != addressFromStringValue(nodeAddress)))
433428 then throw("permission denied")
434429 else if (isDefined(pmt.assetId))
435430 then throw("waves only")
436431 else {
437432 let amount = convertWavesToNeutrino(pmt.amount)
438433 let newRpdSyncIndex = (rpdSyncIndex + 1)
439434 ScriptResult(WriteSet([DataEntry(RPDSyncIndexKey, newRpdSyncIndex), DataEntry(getRPDProfitKey(rpdSyncIndex), amount), DataEntry(getRPDSnapshotContractBalanceKey(rpdSyncIndex, neutrinoAssetId), getRPDContractBalance(neutrinoAssetId))]), TransferSet([ScriptTransfer(addressFromStringValue(rpdContract), amount, neutrinoAssetId)]))
440435 }
441436 }
442437
443438
444439
445440 @Callable(i)
446441 func registrationLeaseTx (senderPublicKey,amount,fee,timestamp) = {
447442 let txBytes = (((((base58'3h1H' + fromBase58String(senderPublicKey)) + fromBase58String(nodeAddress)) + toBytes(amount)) + toBytes(fee)) + toBytes(timestamp))
448443 let balance = ((reserve * LEASINGSHARE) / 100)
449444 let txHashBytes = blake2b256(txBytes)
450445 let txHash = toBase58String(txHashBytes)
451446 if ((this != addressFromPublicKey(fromBase58String(senderPublicKey))))
452447 then throw("invalid pubKey")
453448 else if (if ((lastBlock.timestamp > timestamp))
454449 then true
455450 else (timestamp > (lastBlock.timestamp + 5400000)))
456451 then throw((("invalid timestamp(lastBlock: " + toString(lastBlock.timestamp)) + ")"))
457452 else if (if ((leaseTxHash != ""))
458453 then if (isInt(transactionHeightById(fromBase58String(leaseTxHash))))
459454 then true
460455 else (leaseTxExpireSendBlock >= height)
461456 else false)
462457 then throw("leasing not canceled")
463458 else if (if ((fee > 1000000))
464459 then true
465460 else (500000 > fee))
466461 then throw("invalid fee")
467462 else if (if ((amount != balance))
468463 then true
469464 else (amount == 0))
470465 then throw((("invalid amount(leaseAmount:" + toString(balance)) + ")"))
471466 else WriteSet([DataEntry(LeaseTxKey, toBase64String(txBytes)), DataEntry(LeaseTxHashKey, txHash), DataEntry(LeasingAmountKey, balance), DataEntry(LeaseTxExpireSendBlockKey, (height + 30)), DataEntry(LeasingExpireBlockKey, (height + leasingInterval))])
472467 }
473468
474469
475470
476471 @Callable(i)
477472 func registrationUnleaseTx (chainIdString,senderPublicKey,fee,timestamp) = {
478473 let txBytes = (((((base58'gm' + toBytes(chainIdString)) + fromBase58String(senderPublicKey)) + toBytes(fee)) + toBytes(timestamp)) + fromBase58String(leaseTxHash))
479474 let txHash = blake2b256(txBytes)
480475 if ((this != addressFromPublicKey(fromBase58String(senderPublicKey))))
481476 then throw("invalid pubKey")
482477 else if (!(isInt(transactionHeightById(txHash))))
483478 then throw("blockchain does not contain this transaction")
484- else if (if ((fee > 1000000))
485- then true
486- else (500000 > fee))
487- then throw("invalid fee")
488- else WriteSet([DataEntry(LeaseTxKey, ""), DataEntry(LeaseTxHashKey, ""), DataEntry(LeasingAmountKey, 0), DataEntry(LeaseTxExpireSendBlockKey, 0), DataEntry(LeasingExpireBlockKey, 0), DataEntry(IsRebalanceKey, false)])
479+ else WriteSet([DataEntry(LeaseTxKey, ""), DataEntry(LeaseTxHashKey, ""), DataEntry(LeasingAmountKey, 0), DataEntry(LeaseTxExpireSendBlockKey, 0), DataEntry(LeasingExpireBlockKey, 0), DataEntry(IsRebalanceKey, false)])
489480 }
490481
491482
492483 @Verifier(tx)
493484 func verify () = match tx {
494485 case leaseTx: LeaseTransaction =>
495486 if (if ((fromBase58String(leaseTxHash) == leaseTx.id))
496487 then (leasingExpireBlock >= height)
497488 else false)
498489 then (leaseTxExpireSendBlock >= height)
499490 else false
500491 case unleaseTx: LeaseCancelTransaction =>
501- if ((fromBase58String(leaseTxHash) == unleaseTx.leaseId))
492+ if (if ((fromBase58String(leaseTxHash) == unleaseTx.leaseId))
502493 then if ((height > leasingExpireBlock))
503494 then true
504495 else isRebalance
496+ else false)
497+ then if ((unleaseTx.fee >= 500000))
498+ then (1000000 >= unleaseTx.fee)
499+ else false
505500 else false
506501 case _ =>
507502 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
508503 }
509504

github/deemru/w8io/786bc32 
124.36 ms