tx · 8mD5fFf3sZ58QNXZXKatW8bBoBjHcjt9aZLQHGueMK8z

3PC9BfRwJWWiw9AREE2B3eWzCks3CYtg4yo:  -0.01400000 Waves

2019.11.19 15:42 [1802362] smart account 3PC9BfRwJWWiw9AREE2B3eWzCks3CYtg4yo > SELF 0.00000000 Waves

{ "type": 13, "id": "8mD5fFf3sZ58QNXZXKatW8bBoBjHcjt9aZLQHGueMK8z", "fee": 1400000, "feeAssetId": null, "timestamp": 1574167356699, "version": 1, "sender": "3PC9BfRwJWWiw9AREE2B3eWzCks3CYtg4yo", "senderPublicKey": "BRnVwSVctnV8pge5vRpsJdWnkjWEJspFb6QvrmZvu3Ht", "proofs": [ "5Kyp8cY29siWmzX8zEHZ1bfs8UtGWwo6n27ZHSh5HyC8gS9VQe6pimJZ8jPnLYe23Lsd3imbayrNKsDcBK6UyBes" ], "script": "base64:AAIDAAAAAAAAABUIARIAEgASBAoCCAESABIDCgEIEgAAAABlAQAAAA5nZXROdW1iZXJCeUtleQAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEGgAAAAIFAAAABHRoaXMFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAAAAAAAAAAAAAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAgAAAAABAAAADGdldEJvb2xCeUtleQAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEGwAAAAIFAAAABHRoaXMFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAHQm9vbGVhbgQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQcBAAAAGGdldE51bWJlckJ5QWRkcmVzc0FuZEtleQAAAAIAAAAHYWRkcmVzcwAAAANrZXkEAAAAByRtYXRjaDAJAAQaAAAAAgkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABBQAAAAdhZGRyZXNzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQAAAAAAAAAAAAEAAAAYZ2V0U3RyaW5nQnlBZGRyZXNzQW5kS2V5AAAAAgAAAAdhZGRyZXNzAAAAA2tleQQAAAAHJG1hdGNoMAkABB0AAAACCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEFAAAAB2FkZHJlc3MFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAgAAAAABAAAAFmdldEJvb2xCeUFkZHJlc3NBbmRLZXkAAAACAAAAB2FkZHJlc3MAAAADa2V5BAAAAAckbWF0Y2gwCQAEGwAAAAIJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQUAAAAHYWRkcmVzcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAdCb29sZWFuBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhBwAAAAAMU0VORFRYRVhQSVJFAAAAAAAAAAAeAAAAAA9MSVNUU1BMSVRTWU1CT0wCAAAAAV8AAAAADkxJU1REQVRBU1lNQk9MAgAAAAErAAAAAAdXQVZFTEVUAAAAAAAF9eEAAAAAAAVQQVVMSQAAAAAAAAAAZAAAAAANQ1JZVElDQUxTSEFSRQAAAAAAAAAAFAAAAAAMTEVBU0lOR1NIQVJFAAAAAAAAAABaAAAAAA1MRUFTSU5UWENPVU5UAAAAAAAAAAAKAAAAAA1ERUZJQ0lUT0ZGU0VUAAAAAAAAAAAKAAAAAAxXQVZFU0FTU0VUSUQCAAAABXdhdmVzAAAAAAhDQU5DRUxFRAIAAAAIY2FuY2VsZWQAAAAAA05FVwIAAAADbmV3AAAAABJOZXV0cmlub0Fzc2V0SWRLZXkCAAAAEW5ldXRyaW5vX2Fzc2V0X2lkAAAAAA5Cb25kQXNzZXRJZEtleQIAAAANYm9uZF9hc3NldF9pZAAAAAASUmVzZXJ2ZUNvbnRyYWN0S2V5AgAAABByZXNlcnZlX2NvbnRyYWN0AAAAABJBdWN0aW9uQ29udHJhY3RLZXkCAAAAEGF1Y3Rpb25fY29udHJhY3QAAAAAFkxpcXVpZGF0aW9uQ29udHJhY3RLZXkCAAAAFGxpcXVpZGF0aW9uX2NvbnRyYWN0AAAAAA5SUERDb250cmFjdEtleQIAAAAMcnBkX2NvbnRyYWN0AAAAABFDb250b2xDb250cmFjdEtleQIAAAAQY29udHJvbF9jb250cmFjdAAAAAAWQmFsYW5jZUxvY2tJbnRlcnZhbEtleQIAAAAVYmFsYW5jZV9sb2NrX2ludGVydmFsAAAAABVNaW5XYXZlc1N3YXBBbW91bnRLZXkCAAAAFW1pbl93YXZlc19zd2FwX2Ftb3VudAAAAAAYTWluTmV1dHJpbm9Td2FwQW1vdW50S2V5AgAAABhtaW5fbmV1dHJpbm9fc3dhcF9hbW91bnQAAAAADk5vZGVBZGRyZXNzS2V5AgAAAAxub2RlX2FkZHJlc3MAAAAAFU5vZGVPcmFjbGVQcm92aWRlcktleQIAAAAUb3JhY2xlX25vZGVfcHJvdmlkZXIAAAAAEkxlYXNpbmdJbnRlcnZhbEtleQIAAAAQbGVhc2luZ19pbnRlcnZhbAAAAAANUlBEQmFsYW5jZUtleQIAAAALcnBkX2JhbGFuY2UBAAAAGGdldFJQRENvbnRyYWN0QmFsYW5jZUtleQAAAAEAAAAHYXNzZXRJZAkAASwAAAACCQABLAAAAAIFAAAADVJQREJhbGFuY2VLZXkCAAAAAV8JAAJYAAAAAQUAAAAHYXNzZXRJZAAAAAAIUHJpY2VLZXkCAAAABXByaWNlAAAAAA1QcmljZUluZGV4S2V5AgAAAAtwcmljZV9pbmRleAAAAAAMSXNCbG9ja2VkS2V5AgAAAAppc19ibG9ja2VkAAAAABVMZWFzaW5nRXhwaXJlQmxvY2tLZXkCAAAAFGxlYXNpbmdfZXhwaXJlX2Jsb2NrAAAAABFMZWFzaW5nVHhDb3VudEtleQIAAAANbGVhc2luZ19pbmRleAAAAAAQTGVhc2luZ0Ftb3VudEtleQIAAAAObGVhc2luZ19hbW91bnQBAAAAEmdldFByaWNlSGlzdG9yeUtleQAAAAEAAAAFYmxvY2sJAAEsAAAAAgkAASwAAAACBQAAAAhQcmljZUtleQIAAAABXwkAAaQAAAABBQAAAAVibG9jawEAAAAYZ2V0SGVpZ2h0UHJpY2VCeUluZGV4S2V5AAAAAQAAAAVpbmRleAkAASwAAAACCQABLAAAAAIFAAAADVByaWNlSW5kZXhLZXkCAAAAAV8JAAGkAAAAAQUAAAAFaW5kZXgAAAAAD1JQRFN5bmNJbmRleEtleQIAAAAOcnBkX3N5bmNfaW5kZXgAAAAAEEJhbGFuY2VMb2NlZGtLZXkCAAAADWJhbGFuY2VfbG9ja18AAAAAFVdhdmVzTG9ja2VkQmFsYW5jZUtleQkAASwAAAACBQAAABBCYWxhbmNlTG9jZWRrS2V5AgAAAAV3YXZlcwAAAAAYTmV1dHJpbm9Mb2NrZWRCYWxhbmNlS2V5CQABLAAAAAIFAAAAEEJhbGFuY2VMb2NlZGtLZXkCAAAACG5ldXRyaW5vAQAAACBnZXRSUERTbmFwc2hvdENvbnRyYWN0QmFsYW5jZUtleQAAAAIAAAAFY291bnQAAAAHYXNzZXRJZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAA1SUERCYWxhbmNlS2V5AgAAAAFfCQACWAAAAAEFAAAAB2Fzc2V0SWQCAAAAAV8JAAGkAAAAAQUAAAAFY291bnQBAAAAHWdldENhbmNlbExlYXNlVHhSZXNlcnZlRmVlS2V5AAAAAQAAAARoYXNoCQABLAAAAAIJAAEsAAAAAgIAAAAbY2FuY2VsX2xlYXNlX3R4X3Jlc2VydmVfZmVlAgAAAAFfBQAAAARoYXNoAQAAABhnZXRXYXZlc0xvY2tlZEJhbGFuY2VLZXkAAAABAAAABW93bmVyCQABLAAAAAIJAAEsAAAAAgUAAAAVV2F2ZXNMb2NrZWRCYWxhbmNlS2V5AgAAAAFfBQAAAAVvd25lcgEAAAAbZ2V0TmV1dHJpbm9Mb2NrZWRCYWxhbmNlS2V5AAAAAQAAAAVvd25lcgkAASwAAAACCQABLAAAAAIFAAAAGE5ldXRyaW5vTG9ja2VkQmFsYW5jZUtleQIAAAABXwUAAAAFb3duZXIBAAAAGGdldEJhbGFuY2VVbmxvY2tCbG9ja0tleQAAAAEAAAAFb3duZXIJAAEsAAAAAgIAAAAVYmFsYW5jZV91bmxvY2tfYmxvY2tfBQAAAAVvd25lcgEAAAAPZ2V0UlBEUHJvZml0S2V5AAAAAQAAAAVjb3VudAkAASwAAAACCQABLAAAAAICAAAACnJwZF9wcm9maXQCAAAAAV8JAAGkAAAAAQUAAAAFY291bnQBAAAAE2dldExlYXNlVHhTdGF0dXNLZXkAAAABAAAABGhhc2gJAAEsAAAAAgkAASwAAAACAgAAAA9sZWFzZV90eF9zdGF0dXMCAAAAAV8FAAAABGhhc2gBAAAAGWdldExlYXNlVHhBbW91bnRCeUhhc2hLZXkAAAABAAAABGhhc2gJAAEsAAAAAgkAASwAAAACBQAAABBMZWFzaW5nQW1vdW50S2V5AgAAAAFfBQAAAARoYXNoAQAAABhnZXRMZWFzZVR4Qnl0ZXNCeUhhc2hLZXkAAAABAAAABGhhc2gJAAEsAAAAAgkAASwAAAACAgAAAAhsZWFzZV90eAIAAAABXwUAAAAEaGFzaAEAAAAcZ2V0TGVhc2VUeEV4cGlyZVNlbmRCbG9ja0tleQAAAAEAAAAEaGFzaAkAASwAAAACCQABLAAAAAICAAAAE2xlYXNpbmdfZXhwaXJlX3NlbmQCAAAAAV8FAAAABGhhc2gBAAAAFmNvbnZlcnROZXV0cmlub1RvV2F2ZXMAAAACAAAABmFtb3VudAAAAAVwcmljZQkAAGkAAAACCQAAaAAAAAIJAABpAAAAAgkAAGgAAAACBQAAAAZhbW91bnQAAAAAAAAAAGQFAAAABXByaWNlBQAAAAdXQVZFTEVUBQAAAAVQQVVMSQEAAAAWY29udmVydFdhdmVzVG9OZXV0cmlubwAAAAIAAAAGYW1vdW50AAAABXByaWNlCQAAaQAAAAIJAABoAAAAAgkAAGkAAAACCQAAaAAAAAIFAAAABmFtb3VudAUAAAAFcHJpY2UAAAAAAAAAAGQFAAAABVBBVUxJBQAAAAdXQVZFTEVUAQAAABVjb252ZXJ0TmV1dHJpbm9Ub0JvbmQAAAABAAAABmFtb3VudAkAAGkAAAACBQAAAAZhbW91bnQFAAAABVBBVUxJAQAAABVjb252ZXJ0Qm9uZFRvTmV1dHJpbm8AAAABAAAABmFtb3VudAkAAGgAAAACBQAAAAZhbW91bnQFAAAABVBBVUxJAQAAABJjb252ZXJ0V2F2ZXNUb0JvbmQAAAACAAAABmFtb3VudAAAAAVwcmljZQkBAAAAFWNvbnZlcnROZXV0cmlub1RvQm9uZAAAAAEJAQAAABZjb252ZXJ0V2F2ZXNUb05ldXRyaW5vAAAAAgUAAAAGYW1vdW50BQAAAAVwcmljZQAAAAAVbmV1dHJpbm9Mb2NrZWRCYWxhbmNlCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABBQAAABhOZXV0cmlub0xvY2tlZEJhbGFuY2VLZXkAAAAAEndhdmVzTG9ja2VkQmFsYW5jZQkBAAAADmdldE51bWJlckJ5S2V5AAAAAQUAAAAVV2F2ZXNMb2NrZWRCYWxhbmNlS2V5AAAAABNsaXF1aWRhdGlvbkNvbnRyYWN0CQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABBQAAABZMaXF1aWRhdGlvbkNvbnRyYWN0S2V5AAAAABVuZXV0cmlub0Fzc2V0SWRTdHJpbmcJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAAEk5ldXRyaW5vQXNzZXRJZEtleQAAAAAPbmV1dHJpbm9Bc3NldElkCQACWQAAAAEFAAAAFW5ldXRyaW5vQXNzZXRJZFN0cmluZwAAAAAPcmVzZXJ2ZUNvbnRyYWN0CQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABBQAAABJSZXNlcnZlQ29udHJhY3RLZXkAAAAAD2F1Y3Rpb25Db250cmFjdAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAASQXVjdGlvbkNvbnRyYWN0S2V5AAAAAAtycGRDb250cmFjdAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAAOUlBEQ29udHJhY3RLZXkAAAAAD2NvbnRyb2xDb250cmFjdAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAARQ29udG9sQ29udHJhY3RLZXkAAAAADGN1cnJlbnRQcmljZQkBAAAAGGdldE51bWJlckJ5QWRkcmVzc0FuZEtleQAAAAIFAAAAD2NvbnRyb2xDb250cmFjdAUAAAAIUHJpY2VLZXkAAAAACnByaWNlSW5kZXgJAQAAABhnZXROdW1iZXJCeUFkZHJlc3NBbmRLZXkAAAACBQAAAA9jb250cm9sQ29udHJhY3QFAAAADVByaWNlSW5kZXhLZXkAAAAACWlzQmxvY2tlZAkBAAAAFmdldEJvb2xCeUFkZHJlc3NBbmRLZXkAAAACBQAAAA9jb250cm9sQ29udHJhY3QFAAAADElzQmxvY2tlZEtleQAAAAAObGVhc2luZ1R4Q291bnQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEFAAAAEUxlYXNpbmdUeENvdW50S2V5AAAAAA9sZWFzaW5nSW50ZXJ2YWwJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEFAAAAEkxlYXNpbmdJbnRlcnZhbEtleQAAAAASbGVhc2luZ0V4cGlyZUJsb2NrCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABBQAAABVMZWFzaW5nRXhwaXJlQmxvY2tLZXkAAAAADWxlYXNpbmdBbW91bnQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEFAAAAEExlYXNpbmdBbW91bnRLZXkAAAAAC25vZGVBZGRyZXNzCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABBQAAAA5Ob2RlQWRkcmVzc0tleQAAAAASbm9kZU9yYWNsZVByb3ZpZGVyCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABBQAAABVOb2RlT3JhY2xlUHJvdmlkZXJLZXkAAAAADHJwZFN5bmNJbmRleAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQUAAAAPUlBEU3luY0luZGV4S2V5AAAAABNiYWxhbmNlTG9ja0ludGVydmFsCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABBQAAABZCYWxhbmNlTG9ja0ludGVydmFsS2V5AAAAABJtaW5XYXZlc1N3YXBBbW91bnQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEFAAAAFU1pbldhdmVzU3dhcEFtb3VudEtleQAAAAAVbWluTmV1dHJpbm9Td2FwQW1vdW50CQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABBQAAABhNaW5OZXV0cmlub1N3YXBBbW91bnRLZXkAAAAAB3Jlc2VydmUJAABlAAAAAgkBAAAADHdhdmVzQmFsYW5jZQAAAAEFAAAABHRoaXMFAAAAEndhdmVzTG9ja2VkQmFsYW5jZQAAAAAVcmVzZXJ2ZVdpdGhvdXRMZWFzaW5nCQAAZQAAAAIFAAAAB3Jlc2VydmUFAAAADWxlYXNpbmdBbW91bnQAAAAAC2JvbmRBc3NldElkCQACWQAAAAEJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAADkJvbmRBc3NldElkS2V5AAAAAApib25kU3VwcGx5CQAAZQAAAAIICQEAAAAHZXh0cmFjdAAAAAEJAAPsAAAAAQUAAAALYm9uZEFzc2V0SWQAAAAIcXVhbnRpdHkJAAPrAAAAAgUAAAAEdGhpcwUAAAALYm9uZEFzc2V0SWQAAAAADm5ldXRyaW5vU3VwcGx5CQAAZAAAAAIJAABlAAAAAggJAQAAAAdleHRyYWN0AAAAAQkAA+wAAAABBQAAAA9uZXV0cmlub0Fzc2V0SWQAAAAIcXVhbnRpdHkJAAPrAAAAAgUAAAAEdGhpcwUAAAAPbmV1dHJpbm9Bc3NldElkBQAAABVuZXV0cmlub0xvY2tlZEJhbGFuY2UAAAAAB3N1cnBsdXMJAABlAAAAAgkBAAAAFmNvbnZlcnRXYXZlc1RvTmV1dHJpbm8AAAACBQAAAAdyZXNlcnZlBQAAAAxjdXJyZW50UHJpY2UFAAAADm5ldXRyaW5vU3VwcGx5AAAAAAdkZWZpY2l0CQAAZQAAAAIFAAAADm5ldXRyaW5vU3VwcGx5CQEAAAAWY29udmVydFdhdmVzVG9OZXV0cmlubwAAAAIFAAAAB3Jlc2VydmUFAAAADGN1cnJlbnRQcmljZQEAAAAVZ2V0UlBEQ29udHJhY3RCYWxhbmNlAAAAAQAAAAdhc3NldElkCQEAAAAYZ2V0TnVtYmVyQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAALcnBkQ29udHJhY3QJAQAAABhnZXRSUERDb250cmFjdEJhbGFuY2VLZXkAAAABBQAAAAdhc3NldElkAQAAAA9nZXRQcmljZUhpc3RvcnkAAAABAAAABWJsb2NrCQEAAAAYZ2V0TnVtYmVyQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAPY29udHJvbENvbnRyYWN0CQEAAAASZ2V0UHJpY2VIaXN0b3J5S2V5AAAAAQUAAAAFYmxvY2sBAAAAFWdldEhlaWdodFByaWNlQnlJbmRleAAAAAEAAAAFaW5kZXgJAQAAABhnZXROdW1iZXJCeUFkZHJlc3NBbmRLZXkAAAACBQAAAA9jb250cm9sQ29udHJhY3QJAQAAABhnZXRIZWlnaHRQcmljZUJ5SW5kZXhLZXkAAAABBQAAAAVpbmRleAEAAAAaZ2V0Q2FuY2VsTGVhc2VUeFJlc2VydmVGZWUAAAABAAAABGhhc2gJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAAB1nZXRDYW5jZWxMZWFzZVR4UmVzZXJ2ZUZlZUtleQAAAAEFAAAABGhhc2gBAAAAFWdldFdhdmVzTG9ja2VkQmFsYW5jZQAAAAEAAAAFb3duZXIJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABhnZXRXYXZlc0xvY2tlZEJhbGFuY2VLZXkAAAABBQAAAAVvd25lcgEAAAAYZ2V0TmV1dHJpbm9Mb2NrZWRCYWxhbmNlAAAAAQAAAAVvd25lcgkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAG2dldE5ldXRyaW5vTG9ja2VkQmFsYW5jZUtleQAAAAEFAAAABW93bmVyAQAAABVnZXRVbmxvY2tCYWxhbmNlQmxvY2sAAAABAAAABW93bmVyCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAYZ2V0QmFsYW5jZVVubG9ja0Jsb2NrS2V5AAAAAQUAAAAFb3duZXIBAAAADGdldFJQRFByb2ZpdAAAAAEAAAAFY291bnQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAAA9nZXRSUERQcm9maXRLZXkAAAABBQAAAAVjb3VudAEAAAAQZ2V0TGVhc2VUeFN0YXR1cwAAAAEAAAAEaGFzaAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAE2dldExlYXNlVHhTdGF0dXNLZXkAAAABBQAAAARoYXNoAQAAABZnZXRMZWFzZVR4QW1vdW50QnlIYXNoAAAAAQAAAARoYXNoCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAZZ2V0TGVhc2VUeEFtb3VudEJ5SGFzaEtleQAAAAEFAAAABGhhc2gBAAAAFWdldExlYXNlVHhCeXRlc0J5SGFzaAAAAAEAAAAEaGFzaAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAGGdldExlYXNlVHhCeXRlc0J5SGFzaEtleQAAAAEFAAAABGhhc2gBAAAAGWdldExlYXNlVHhFeHBpcmVTZW5kQmxvY2sAAAABAAAABGhhc2gJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABxnZXRMZWFzZVR4RXhwaXJlU2VuZEJsb2NrS2V5AAAAAQUAAAAEaGFzaAAAAAYAAAABaQEAAAATc3dhcFdhdmVzVG9OZXV0cmlubwAAAAAEAAAAA3BtdAkBAAAAB2V4dHJhY3QAAAABCAUAAAABaQAAAAdwYXltZW50BAAAAAdhY2NvdW50CQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgMJAABmAAAAAgUAAAASbWluV2F2ZXNTd2FwQW1vdW50CAUAAAADcG10AAAABmFtb3VudAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAtYW4gYW1vdW50IGlzIGxlc3MgdGhhbiBtaW4gYXZhaWxhYmxlIGFtb3VudDogCQABpAAAAAEFAAAAEm1pbldhdmVzU3dhcEFtb3VudAIAAAAJIHdhdmVsZXRzAwkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAANwbXQAAAAHYXNzZXRJZAkAAAIAAAABAgAAABJjYW4gdXNlIHdhdmVzIG9ubHkDBQAAAAlpc0Jsb2NrZWQJAAACAAAAAQIAAABaY29udHJhY3QgaXMgYmxvY2tlZCBieSBFTUVSR0VOQ1kgU0hVVERPV04gYWN0aW9ucyB1bnRpbGwgcmVhY3RpdmF0aW9uIGJ5IGVtZXJnZW5jeSBvcmFjbGVzAwkAAGYAAAACCQEAAAAVZ2V0VW5sb2NrQmFsYW5jZUJsb2NrAAAAAQUAAAAHYWNjb3VudAUAAAAGaGVpZ2h0CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAAAZhd2FpdCAJAAGkAAAAAQkAAGUAAAACCQEAAAAVZ2V0VW5sb2NrQmFsYW5jZUJsb2NrAAAAAQUAAAAHYWNjb3VudAUAAAAGaGVpZ2h0AgAAAAcgYmxvY2tzAwMJAQAAAAIhPQAAAAIJAQAAABhnZXROZXV0cmlub0xvY2tlZEJhbGFuY2UAAAABBQAAAAdhY2NvdW50AAAAAAAAAAAABgkBAAAAAiE9AAAAAgkBAAAAFWdldFdhdmVzTG9ja2VkQmFsYW5jZQAAAAEFAAAAB2FjY291bnQAAAAAAAAAAAAJAAACAAAAAQIAAAAicGxlYXNlIHdpdGhkcmF3IGxvY2tlZCBmdW5kcyBmaXJzdAkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAGGdldFdhdmVzTG9ja2VkQmFsYW5jZUtleQAAAAEFAAAAB2FjY291bnQIBQAAAANwbXQAAAAGYW1vdW50CQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAYZ2V0QmFsYW5jZVVubG9ja0Jsb2NrS2V5AAAAAQUAAAAHYWNjb3VudAkAAGQAAAACBQAAAAZoZWlnaHQFAAAAE2JhbGFuY2VMb2NrSW50ZXJ2YWwJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAFVdhdmVzTG9ja2VkQmFsYW5jZUtleQkAAGQAAAACBQAAABJ3YXZlc0xvY2tlZEJhbGFuY2UIBQAAAANwbXQAAAAGYW1vdW50BQAAAANuaWwAAAABaQEAAAATc3dhcE5ldXRyaW5vVG9XYXZlcwAAAAAEAAAAA3BtdAkBAAAAB2V4dHJhY3QAAAABCAUAAAABaQAAAAdwYXltZW50BAAAAAdhY2NvdW50CQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgMJAABmAAAAAgUAAAAVbWluTmV1dHJpbm9Td2FwQW1vdW50CAUAAAADcG10AAAABmFtb3VudAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAtYW4gYW1vdW50IGlzIGxlc3MgdGhhbiBtaW4gYXZhaWxhYmxlIGFtb3VudDogCQABpAAAAAEFAAAAFW1pbk5ldXRyaW5vU3dhcEFtb3VudAIAAAAPIG5ldXRyaW5vIGNlbnRzAwUAAAAJaXNCbG9ja2VkCQAAAgAAAAECAAAAWmNvbnRyYWN0IGlzIGJsb2NrZWQgYnkgRU1FUkdFTkNZIFNIVVRET1dOIGFjdGlvbnMgdW50aWxsIHJlYWN0aXZhdGlvbiBieSBlbWVyZ2VuY3kgb3JhY2xlcwMJAQAAAAIhPQAAAAIIBQAAAANwbXQAAAAHYXNzZXRJZAUAAAAPbmV1dHJpbm9Bc3NldElkCQAAAgAAAAECAAAAKGNhbiB1c2UgYXBwcm9wcmlhdGUgbmV1dHJpbm8gdG9rZW5zIG9ubHkDCQAAZgAAAAIJAQAAABVnZXRVbmxvY2tCYWxhbmNlQmxvY2sAAAABBQAAAAdhY2NvdW50BQAAAAZoZWlnaHQJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAABmF3YWl0IAkAAaQAAAABCQAAZQAAAAIJAQAAABVnZXRVbmxvY2tCYWxhbmNlQmxvY2sAAAABBQAAAAdhY2NvdW50BQAAAAZoZWlnaHQCAAAAByBibG9ja3MDAwkBAAAAAiE9AAAAAgkBAAAAGGdldE5ldXRyaW5vTG9ja2VkQmFsYW5jZQAAAAEFAAAAB2FjY291bnQAAAAAAAAAAAAGCQEAAAACIT0AAAACCQEAAAAVZ2V0V2F2ZXNMb2NrZWRCYWxhbmNlAAAAAQUAAAAHYWNjb3VudAAAAAAAAAAAAAkAAAIAAAABAgAAACJwbGVhc2Ugd2l0aGRyYXcgbG9ja2VkIGZ1bmRzIGZpcnN0CQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAbZ2V0TmV1dHJpbm9Mb2NrZWRCYWxhbmNlS2V5AAAAAQUAAAAHYWNjb3VudAgFAAAAA3BtdAAAAAZhbW91bnQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABhnZXRXYXZlc0xvY2tlZEJhbGFuY2VLZXkAAAABBQAAAAdhY2NvdW50CQAAZAAAAAIFAAAABmhlaWdodAUAAAATYmFsYW5jZUxvY2tJbnRlcnZhbAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAYTmV1dHJpbm9Mb2NrZWRCYWxhbmNlS2V5CQAAZAAAAAIFAAAAFW5ldXRyaW5vTG9ja2VkQmFsYW5jZQgFAAAAA3BtdAAAAAZhbW91bnQFAAAAA25pbAAAAAFpAQAAAAh3aXRoZHJhdwAAAAIAAAAHYWNjb3VudAAAAAVpbmRleAQAAAAMdW5sb2NrSGVpZ2h0CQEAAAAVZ2V0VW5sb2NrQmFsYW5jZUJsb2NrAAAAAQUAAAAHYWNjb3VudAQAAAAWdXNlcldhdmVzTG9ja2VkQmFsYW5jZQkBAAAAFWdldFdhdmVzTG9ja2VkQmFsYW5jZQAAAAEFAAAAB2FjY291bnQEAAAAGXVzZXJOZXV0cmlub0xvY2tlZEJhbGFuY2UJAQAAABhnZXROZXV0cmlub0xvY2tlZEJhbGFuY2UAAAABBQAAAAdhY2NvdW50BAAAAAtpbmRleEhlaWdodAkBAAAAFWdldEhlaWdodFByaWNlQnlJbmRleAAAAAEFAAAABWluZGV4BAAAAA9uZXh0SW5kZXhIZWlnaHQJAQAAABVnZXRIZWlnaHRQcmljZUJ5SW5kZXgAAAABCQAAZAAAAAIFAAAABWluZGV4AAAAAAAAAAABBAAAAAxwcmljZUJ5SW5kZXgJAQAAAA9nZXRQcmljZUhpc3RvcnkAAAABBQAAAAtpbmRleEhlaWdodAQAAAAObmV1dHJpbm9BbW91bnQJAQAAABZjb252ZXJ0V2F2ZXNUb05ldXRyaW5vAAAAAgUAAAAWdXNlcldhdmVzTG9ja2VkQmFsYW5jZQUAAAAMcHJpY2VCeUluZGV4BAAAAAt3YXZlc0Ftb3VudAkBAAAAFmNvbnZlcnROZXV0cmlub1RvV2F2ZXMAAAACBQAAABl1c2VyTmV1dHJpbm9Mb2NrZWRCYWxhbmNlBQAAAAxwcmljZUJ5SW5kZXgDBQAAAAlpc0Jsb2NrZWQJAAACAAAAAQIAAABaY29udHJhY3QgaXMgYmxvY2tlZCBieSBFTUVSR0VOQ1kgU0hVVERPV04gYWN0aW9ucyB1bnRpbGwgcmVhY3RpdmF0aW9uIGJ5IGVtZXJnZW5jeSBvcmFjbGVzAwkAAGYAAAACBQAAAAx1bmxvY2tIZWlnaHQFAAAABmhlaWdodAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAARcGxlYXNlIHdhaXQgZm9yOiAJAAGkAAAAAQUAAAAMdW5sb2NrSGVpZ2h0AgAAACUgYmxvY2sgaGVpZ2h0IHRvIHdpdGhkcmF3IFdBVkVTIGZ1bmRzAwMDCQAAZgAAAAIFAAAABWluZGV4BQAAAApwcmljZUluZGV4BgkAAGYAAAACBQAAAAtpbmRleEhlaWdodAUAAAAMdW5sb2NrSGVpZ2h0BgMJAQAAAAIhPQAAAAIFAAAAD25leHRJbmRleEhlaWdodAAAAAAAAAAAAAkAAGcAAAACBQAAAAx1bmxvY2tIZWlnaHQFAAAAD25leHRJbmRleEhlaWdodAcJAAACAAAAAQIAAAAbaW52YWxpZCBwcmljZSBoaXN0b3J5IGluZGV4AwMJAABnAAAAAgAAAAAAAAAAAAUAAAAObmV1dHJpbm9BbW91bnQJAABnAAAAAgAAAAAAAAAAAAUAAAALd2F2ZXNBbW91bnQHCQAAAgAAAAECAAAAE2JhbGFuY2UgZXF1YWxzIHplcm8JAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAYZ2V0V2F2ZXNMb2NrZWRCYWxhbmNlS2V5AAAAAQUAAAAHYWNjb3VudAAAAAAAAAAAAAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAG2dldE5ldXRyaW5vTG9ja2VkQmFsYW5jZUtleQAAAAEFAAAAB2FjY291bnQAAAAAAAAAAAAJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAFVdhdmVzTG9ja2VkQmFsYW5jZUtleQkAAGUAAAACBQAAABJ3YXZlc0xvY2tlZEJhbGFuY2UFAAAAFnVzZXJXYXZlc0xvY2tlZEJhbGFuY2UJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAGE5ldXRyaW5vTG9ja2VkQmFsYW5jZUtleQkAAGUAAAACBQAAABVuZXV0cmlub0xvY2tlZEJhbGFuY2UFAAAAGXVzZXJOZXV0cmlub0xvY2tlZEJhbGFuY2UFAAAAA25pbAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEFAAAAB2FjY291bnQFAAAAC3dhdmVzQW1vdW50BQAAAAR1bml0CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQUAAAAHYWNjb3VudAUAAAAObmV1dHJpbm9BbW91bnQFAAAAD25ldXRyaW5vQXNzZXRJZAUAAAADbmlsAAAAAWkBAAAAEXRyYW5zZmVyVG9BdWN0aW9uAAAAAAQAAAARZGVmaWNpdEJvbmRBbW91bnQJAABlAAAAAgkBAAAAFWNvbnZlcnROZXV0cmlub1RvQm9uZAAAAAEFAAAAB2RlZmljaXQJAAPrAAAAAgkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABBQAAAA9hdWN0aW9uQ29udHJhY3QFAAAAC2JvbmRBc3NldElkBAAAAAtzdXJwbHVzQm9uZAkAAGUAAAACCQEAAAAVY29udmVydE5ldXRyaW5vVG9Cb25kAAAAAQUAAAAHc3VycGx1cwkAA+sAAAACCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEFAAAAD2F1Y3Rpb25Db250cmFjdAUAAAAPbmV1dHJpbm9Bc3NldElkAwUAAAAJaXNCbG9ja2VkCQAAAgAAAAECAAAAWmNvbnRyYWN0IGlzIGJsb2NrZWQgYnkgRU1FUkdFTkNZIFNIVVRET1dOIGFjdGlvbnMgdW50aWxsIHJlYWN0aXZhdGlvbiBieSBlbWVyZ2VuY3kgb3JhY2xlcwMJAABnAAAAAgUAAAARZGVmaWNpdEJvbmRBbW91bnQJAABpAAAAAgkAAGgAAAACCQEAAAAVY29udmVydE5ldXRyaW5vVG9Cb25kAAAAAQUAAAAObmV1dHJpbm9TdXBwbHkFAAAADURFRklDSVRPRkZTRVQAAAAAAAAAAGQJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABBQAAAA9hdWN0aW9uQ29udHJhY3QFAAAAEWRlZmljaXRCb25kQW1vdW50BQAAAAtib25kQXNzZXRJZAUAAAADbmlsAwkAAGYAAAACBQAAAAtzdXJwbHVzQm9uZAAAAAAAAAAAAAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEFAAAAE2xpcXVpZGF0aW9uQ29udHJhY3QJAQAAABVjb252ZXJ0Qm9uZFRvTmV1dHJpbm8AAAABBQAAAAtzdXJwbHVzQm9uZAUAAAAPbmV1dHJpbm9Bc3NldElkBQAAAANuaWwJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAL2JvbmQgd2VyZSBnZW5lcmF0ZWQgb3IgZG8gbm90IG5lZWQgaXQuIERlZmljaXQ6CQABpAAAAAEFAAAAEWRlZmljaXRCb25kQW1vdW50AgAAAAF8CQABpAAAAAEJAABpAAAAAgkAAGgAAAACBQAAAA5uZXV0cmlub1N1cHBseQUAAAANREVGSUNJVE9GRlNFVAAAAAAAAAAAZAIAAAAKLiBTdXJwbHVzOgkAAaQAAAABBQAAAAtzdXJwbHVzQm9uZAAAAAFpAQAAAAh0cmFuc2ZlcgAAAAEAAAAHYWNjb3VudAQAAAADcG10CQEAAAAHZXh0cmFjdAAAAAEIBQAAAAFpAAAAB3BheW1lbnQJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABBQAAAAdhY2NvdW50CAUAAAADcG10AAAABmFtb3VudAgFAAAAA3BtdAAAAAdhc3NldElkBQAAAANuaWwAAAABaQEAAAAKbm9kZVJld2FyZAAAAAAEAAAAA3BtdAkBAAAABXZhbHVlAAAAAQgFAAAAAWkAAAAHcGF5bWVudAMJAQAAAAIhPQAAAAIIBQAAAAFpAAAABmNhbGxlcgkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABBQAAAAtub2RlQWRkcmVzcwkAAAIAAAABAgAAAEdvbmx5IG5vZGUgYWNjb3VudCBpcyBhYmxlIHRvIHRyYW5zZmVyIHN0YWtpbmcgcmV3YXJkcyBmcm9tIG1haW4gYWNjb3VudAMJAQAAAAlpc0RlZmluZWQAAAABCAUAAAADcG10AAAAB2Fzc2V0SWQJAAACAAAAAQIAAAAZd2F2ZXMgdG9rZW5zIG9ubHkgYWxsb3dlZAQAAAAGYW1vdW50CQEAAAAWY29udmVydFdhdmVzVG9OZXV0cmlubwAAAAIIBQAAAANwbXQAAAAGYW1vdW50BQAAAAxjdXJyZW50UHJpY2UEAAAAD25ld1JwZFN5bmNJbmRleAkAAGQAAAACBQAAAAxycGRTeW5jSW5kZXgAAAAAAAAAAAEJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAA9SUERTeW5jSW5kZXhLZXkFAAAAD25ld1JwZFN5bmNJbmRleAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAD2dldFJQRFByb2ZpdEtleQAAAAEFAAAADHJwZFN5bmNJbmRleAUAAAAGYW1vdW50CQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAgZ2V0UlBEU25hcHNob3RDb250cmFjdEJhbGFuY2VLZXkAAAACBQAAAAxycGRTeW5jSW5kZXgFAAAAD25ldXRyaW5vQXNzZXRJZAkBAAAAFWdldFJQRENvbnRyYWN0QmFsYW5jZQAAAAEFAAAAD25ldXRyaW5vQXNzZXRJZAUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQUAAAALcnBkQ29udHJhY3QFAAAABmFtb3VudAUAAAAPbmV1dHJpbm9Bc3NldElkBQAAAANuaWwAAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAABAAAAAJpZAkAAlgAAAABCAUAAAACdHgAAAACaWQEAAAAByRtYXRjaDAFAAAAAnR4AwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAWTGVhc2VDYW5jZWxUcmFuc2FjdGlvbgYJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAQTGVhc2VUcmFuc2FjdGlvbgQAAAAJbGVhc2luZ1R4BQAAAAckbWF0Y2gwAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXkJAAAAAAAAAgkBAAAAEWFkZHJlc3NGcm9tU3RyaW5nAAAAAQUAAAASbm9kZU9yYWNsZVByb3ZpZGVyCQEAAAAUYWRkcmVzc0Zyb21QdWJsaWNLZXkAAAABCAUAAAACdHgAAAAPc2VuZGVyUHVibGljS2V5BwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXnRjIhK", "chainId": 87, "height": 1802362, "spentComplexity": 0 } View: original | compacted Prev: CWVytCpCF2o5zLVzfiXWJGxixXZjerzeaAiVzL6iVRkP Next: 4TrBmd5tZyny5ywkKMbKzoqf8buadp49FeEJTKmsgE4h Diff:
OldNewDifferences
5959
6060 let PAULI = 100
6161
62-let CRITICALSHARE = 20
62+let CRYTICALSHARE = 20
6363
6464 let LEASINGSHARE = 90
6565
66-let LEASINGTXCOUNT = 10
66+let LEASINTXCOUNT = 10
67+
68+let DEFICITOFFSET = 10
69+
70+let WAVESASSETID = "waves"
6771
6872 let CANCELED = "canceled"
6973
7074 let NEW = "new"
71-
72-let FILLED = "filled"
73-
74-let DEFICITOFFSET = 10
7575
7676 let NeutrinoAssetIdKey = "neutrino_asset_id"
7777
8181
8282 let AuctionContractKey = "auction_contract"
8383
84+let LiquidationContractKey = "liquidation_contract"
85+
8486 let RPDContractKey = "rpd_contract"
8587
86-let ControlContractKey = "control_contract"
88+let ContolContractKey = "control_contract"
8789
8890 let BalanceLockIntervalKey = "balance_lock_interval"
8991
9799
98100 let LeasingIntervalKey = "leasing_interval"
99101
102+let RPDBalanceKey = "rpd_balance"
103+
104+func getRPDContractBalanceKey (assetId) = ((RPDBalanceKey + "_") + toBase58String(assetId))
105+
106+
100107 let PriceKey = "price"
101108
102109 let PriceIndexKey = "price_index"
103110
104-let ScriptUpdateIntervalKey = "script_update_interval"
105-
106-let NeutrinoBalanceKey = "neutrino_"
107-
108-let BalanceUnlockBlockKey = "balance_block_"
109-
110-let OrderbookKey = "orderbook"
111-
112-let OrderTotalKey = "order_total_"
113-
114-let OrderOwnerKey = "order_owner_"
115-
116-let OrderHeightKey = "order_height_"
117-
118-let OrderFilledTotalKey = "order_filled_total_"
119-
120-let OrderStatusKey = "order_status_"
121-
122-let RPDSyncIndexKey = "rpd_sync_index"
123-
124-let RPDProfitKey = "rpd_profit"
125-
126-let RPDBalanceKey = "rpd_balance"
127-
128111 let IsBlockedKey = "is_blocked"
129-
130-let IsLeasingProfitTxExistKey = "is_leasing_profit"
131-
132-let ScriptUpdateBlockKey = "script_update_block"
133-
134-let LeaseTxKey = "lease_tx"
135-
136-let LeaseTxStatusKey = "lease_tx_status"
137-
138-let LeasingAmountKey = "leasing_amount"
139-
140-let LeaseTxExpireSendBlockKey = "leasing_expire_send"
141112
142113 let LeasingExpireBlockKey = "leasing_expire_block"
143114
144-let IsRebalanceKey = "is_rebalance"
145-
146-let SwapNeutrinoLockedBalanceKey = "swap_neutrino_locked_balance"
147-
148115 let LeasingTxCountKey = "leasing_index"
149116
150-let CancelLeaseTxReserveFeeKey = "cancel_lease_tx_reserve_fee"
151-
152-func getRPDSnapshotContractBalanceKey (count,assetId) = ((((RPDBalanceKey + "_") + toBase58String(assetId)) + "_") + toString(count))
153-
154-
155-func getRPDContractBalanceKey (assetId) = ((RPDBalanceKey + "_") + toBase58String(assetId))
156-
157-
158-func getRPDProfitKey (count) = ((RPDProfitKey + "_") + toString(count))
159-
160-
161-func getNeutrinoBalanceKey (owner) = (NeutrinoBalanceKey + owner)
162-
163-
164-func getBalanceUnlockBlockKey (owner) = (BalanceUnlockBlockKey + owner)
165-
166-
167-func getOrderTotalKey (orderId) = (OrderTotalKey + orderId)
168-
169-
170-func getOrderOwnerKey (orderId) = (OrderOwnerKey + orderId)
171-
172-
173-func getOrderHeightKey (orderId) = (OrderHeightKey + orderId)
174-
175-
176-func getOrderStatusKey (orderId) = (OrderStatusKey + orderId)
177-
178-
179-func getOrderFilledTotalKey (orderId) = (OrderFilledTotalKey + orderId)
180-
117+let LeasingAmountKey = "leasing_amount"
181118
182119 func getPriceHistoryKey (block) = ((PriceKey + "_") + toString(block))
183120
185122 func getHeightPriceByIndexKey (index) = ((PriceIndexKey + "_") + toString(index))
186123
187124
188-func getLeaseTxStatusKey (hash) = ((LeaseTxStatusKey + "_") + hash)
125+let RPDSyncIndexKey = "rpd_sync_index"
126+
127+let BalanceLocedkKey = "balance_lock_"
128+
129+let WavesLockedBalanceKey = (BalanceLocedkKey + "waves")
130+
131+let NeutrinoLockedBalanceKey = (BalanceLocedkKey + "neutrino")
132+
133+func getRPDSnapshotContractBalanceKey (count,assetId) = ((((RPDBalanceKey + "_") + toBase58String(assetId)) + "_") + toString(count))
134+
135+
136+func getCancelLeaseTxReserveFeeKey (hash) = (("cancel_lease_tx_reserve_fee" + "_") + hash)
137+
138+
139+func getWavesLockedBalanceKey (owner) = ((WavesLockedBalanceKey + "_") + owner)
140+
141+
142+func getNeutrinoLockedBalanceKey (owner) = ((NeutrinoLockedBalanceKey + "_") + owner)
143+
144+
145+func getBalanceUnlockBlockKey (owner) = ("balance_unlock_block_" + owner)
146+
147+
148+func getRPDProfitKey (count) = (("rpd_profit" + "_") + toString(count))
149+
150+
151+func getLeaseTxStatusKey (hash) = (("lease_tx_status" + "_") + hash)
189152
190153
191154 func getLeaseTxAmountByHashKey (hash) = ((LeasingAmountKey + "_") + hash)
192155
193156
194-func getLeaseTxBytesByHashKey (hash) = ((LeaseTxKey + "_") + hash)
157+func getLeaseTxBytesByHashKey (hash) = (("lease_tx" + "_") + hash)
195158
196159
197-func getLeaseTxExpireSendBlockKey (hash) = ((LeaseTxExpireSendBlockKey + "_") + hash)
160+func getLeaseTxExpireSendBlockKey (hash) = (("leasing_expire_send" + "_") + hash)
198161
199162
200-func getCancelLeaseTxReserveFeeKey (hash) = ((CancelLeaseTxReserveFeeKey + "_") + hash)
163+func convertNeutrinoToWaves (amount,price) = ((((amount * 100) / price) * WAVELET) / PAULI)
201164
202165
203-let neutrinoAssetId = fromBase58String(getStringByKey(NeutrinoAssetIdKey))
204-
205-let reserveContract = getStringByKey(ReserveContractKey)
206-
207-let auctionContract = getStringByKey(AuctionContractKey)
208-
209-let rpdContract = getStringByKey(RPDContractKey)
210-
211-let controlContract = getStringByKey(ControlContractKey)
212-
213-let price = getNumberByAddressAndKey(controlContract, PriceKey)
214-
215-let priceIndex = getNumberByAddressAndKey(controlContract, PriceIndexKey)
216-
217-func convertNeutrinoToWavesByPrice (amount,convertPrice) = ((((amount * 100) / convertPrice) * WAVELET) / PAULI)
218-
219-
220-func convertNeutrinoToWaves (amount) = ((((amount * 100) / price) * WAVELET) / PAULI)
221-
222-
223-func convertWavesToNeutrino (amount) = ((((amount * price) / 100) * PAULI) / WAVELET)
166+func convertWavesToNeutrino (amount,price) = ((((amount * price) / 100) * PAULI) / WAVELET)
224167
225168
226169 func convertNeutrinoToBond (amount) = (amount / PAULI)
229172 func convertBondToNeutrino (amount) = (amount * PAULI)
230173
231174
232-func convertWavesToBond (amount) = convertNeutrinoToBond(convertWavesToNeutrino(amount))
175+func convertWavesToBond (amount,price) = convertNeutrinoToBond(convertWavesToNeutrino(amount, price))
233176
177+
178+let neutrinoLockedBalance = getNumberByKey(NeutrinoLockedBalanceKey)
179+
180+let wavesLockedBalance = getNumberByKey(WavesLockedBalanceKey)
181+
182+let liquidationContract = getStringByKey(LiquidationContractKey)
183+
184+let neutrinoAssetIdString = getStringByKey(NeutrinoAssetIdKey)
185+
186+let neutrinoAssetId = fromBase58String(neutrinoAssetIdString)
187+
188+let reserveContract = getStringByKey(ReserveContractKey)
189+
190+let auctionContract = getStringByKey(AuctionContractKey)
191+
192+let rpdContract = getStringByKey(RPDContractKey)
193+
194+let controlContract = getStringByKey(ContolContractKey)
195+
196+let currentPrice = getNumberByAddressAndKey(controlContract, PriceKey)
197+
198+let priceIndex = getNumberByAddressAndKey(controlContract, PriceIndexKey)
234199
235200 let isBlocked = getBoolByAddressAndKey(controlContract, IsBlockedKey)
236201
237202 let leasingTxCount = getNumberByKey(LeasingTxCountKey)
238-
239-let isRebalance = getBoolByKey(IsRebalanceKey)
240203
241204 let leasingInterval = getNumberByKey(LeasingIntervalKey)
242205
244207
245208 let leasingAmount = getNumberByKey(LeasingAmountKey)
246209
247-let swapNeutrinoLockedBalance = getNumberByKey(SwapNeutrinoLockedBalanceKey)
248-
249210 let nodeAddress = getStringByKey(NodeAddressKey)
250211
251-let nodeOracleProviderKey = getStringByKey(NodeOracleProviderKey)
212+let nodeOracleProvider = getStringByKey(NodeOracleProviderKey)
252213
253214 let rpdSyncIndex = getNumberByKey(RPDSyncIndexKey)
254215
258219
259220 let minNeutrinoSwapAmount = getNumberByKey(MinNeutrinoSwapAmountKey)
260221
261-let reserve = wavesBalance(this)
222+let reserve = (wavesBalance(this) - wavesLockedBalance)
262223
263224 let reserveWithoutLeasing = (reserve - leasingAmount)
264225
265-let orderbook = getStringByKey(OrderbookKey)
266-
267226 let bondAssetId = fromBase58String(getStringByKey(BondAssetIdKey))
268227
269-let bondSupply = {
270- let info = extract(assetInfo(bondAssetId))
271- (info.quantity - assetBalance(this, bondAssetId))
272- }
228+let bondSupply = (extract(assetInfo(bondAssetId)).quantity - assetBalance(this, bondAssetId))
273229
274-let neutrinoSupply = {
275- let info = extract(assetInfo(neutrinoAssetId))
276- ((info.quantity - assetBalance(this, neutrinoAssetId)) + swapNeutrinoLockedBalance)
277- }
230+let neutrinoSupply = ((extract(assetInfo(neutrinoAssetId)).quantity - assetBalance(this, neutrinoAssetId)) + neutrinoLockedBalance)
278231
279-let surplus = (convertWavesToNeutrino(reserve) - neutrinoSupply)
232+let surplus = (convertWavesToNeutrino(reserve, currentPrice) - neutrinoSupply)
280233
281-let deficit = (neutrinoSupply - convertWavesToNeutrino(reserve))
234+let deficit = (neutrinoSupply - convertWavesToNeutrino(reserve, currentPrice))
282235
283236 func getRPDContractBalance (assetId) = getNumberByAddressAndKey(rpdContract, getRPDContractBalanceKey(assetId))
284237
292245 func getCancelLeaseTxReserveFee (hash) = getNumberByKey(getCancelLeaseTxReserveFeeKey(hash))
293246
294247
295-func getNeutrinoBalance (owner) = getNumberByKey(getNeutrinoBalanceKey(owner))
248+func getWavesLockedBalance (owner) = getNumberByKey(getWavesLockedBalanceKey(owner))
249+
250+
251+func getNeutrinoLockedBalance (owner) = getNumberByKey(getNeutrinoLockedBalanceKey(owner))
296252
297253
298254 func getUnlockBalanceBlock (owner) = getNumberByKey(getBalanceUnlockBlockKey(owner))
299-
300-
301-func getOrderTotal (id) = getNumberByKey(getOrderTotalKey(id))
302-
303-
304-func getOrderOwner (id) = getStringByKey(getOrderOwnerKey(id))
305-
306-
307-func getOrderStatus (id) = getStringByKey(getOrderStatusKey(id))
308-
309-
310-func getOrderFilledTotal (id) = getNumberByKey(getOrderFilledTotalKey(id))
311255
312256
313257 func getRPDProfit (count) = getNumberByKey(getRPDProfitKey(count))
325269 func getLeaseTxExpireSendBlock (hash) = getNumberByKey(getLeaseTxExpireSendBlockKey(hash))
326270
327271
328-func getOrderElementById (id) = (id + LISTSPLITSYMBOL)
329-
330-
331-func addOrder (orderId) = (orderbook + getOrderElementById(orderId))
332-
333-
334-func dropOrder (orderId) = {
335- let parts = split(orderbook, getOrderElementById(orderId))
336- (parts[0] + parts[1])
337- }
338-
339-
340272 @Callable(i)
341273 func swapWavesToNeutrino () = {
342274 let pmt = extract(i.payment)
343- let wavesAmount = ((pmt.amount * 98) / 100)
275+ let account = toString(i.caller)
344276 if ((minWavesSwapAmount > pmt.amount))
345- then throw((("The specified Waves amount is less than the required minimum of " + toString(minWavesSwapAmount)) + " wavelets."))
277+ then throw((("an amount is less than min available amount: " + toString(minWavesSwapAmount)) + " wavelets"))
346278 else if (isDefined(pmt.assetId))
347- then throw("Only Waves token is allowed for swapping.")
279+ then throw("can use waves only")
348280 else if (isBlocked)
349- then throw("The contract is blocked by EMERGENCY SHUTDOWN. Please wait for reactivation by emergency oracles.")
350- else {
351- let amount = convertWavesToNeutrino(wavesAmount)
352- TransferSet([ScriptTransfer(i.caller, amount, neutrinoAssetId)])
353- }
281+ then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
282+ else if ((getUnlockBalanceBlock(account) > height))
283+ then throw((("await " + toString((getUnlockBalanceBlock(account) - height))) + " blocks"))
284+ else if (if ((getNeutrinoLockedBalance(account) != 0))
285+ then true
286+ else (getWavesLockedBalance(account) != 0))
287+ then throw("please withdraw locked funds first")
288+ else WriteSet([DataEntry(getWavesLockedBalanceKey(account), pmt.amount), DataEntry(getBalanceUnlockBlockKey(account), (height + balanceLockInterval)), DataEntry(WavesLockedBalanceKey, (wavesLockedBalance + pmt.amount))])
354289 }
355290
356291
360295 let pmt = extract(i.payment)
361296 let account = toString(i.caller)
362297 if ((minNeutrinoSwapAmount > pmt.amount))
363- then throw((("The specified Neutrino amount is less than the required minimum of " + toString(minNeutrinoSwapAmount)) + " Neutrino cents."))
298+ then throw((("an amount is less than min available amount: " + toString(minNeutrinoSwapAmount)) + " neutrino cents"))
364299 else if (isBlocked)
365- then throw("The contract is blocked by EMERGENCY SHUTDOWN. Please wait for reactivation by emergency oracles.")
300+ then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
366301 else if ((pmt.assetId != neutrinoAssetId))
367- then throw("Only appropriate Neutrino tokens are allowed for swapping.")
302+ then throw("can use appropriate neutrino tokens only")
368303 else if ((getUnlockBalanceBlock(account) > height))
369- then throw((("Please wait for " + toString((getUnlockBalanceBlock(account) - height))) + " blocks to complete."))
370- else if ((getNeutrinoBalance(account) != 0))
371- then throw("Please withdraw locked Neutrinos first.")
372- else {
373- let neutrinoAmount = pmt.amount
374- let newSwapNeutrinoLockedBalance = (swapNeutrinoLockedBalance + neutrinoAmount)
375- WriteSet([DataEntry(getNeutrinoBalanceKey(account), (getNeutrinoBalance(account) + neutrinoAmount)), DataEntry(getBalanceUnlockBlockKey(account), (height + balanceLockInterval)), DataEntry(SwapNeutrinoLockedBalanceKey, newSwapNeutrinoLockedBalance), DataEntry(IsRebalanceKey, if ((reserveWithoutLeasing >= convertNeutrinoToWaves(newSwapNeutrinoLockedBalance)))
376- then false
377- else true)])
378- }
304+ then throw((("await " + toString((getUnlockBalanceBlock(account) - height))) + " blocks"))
305+ else if (if ((getNeutrinoLockedBalance(account) != 0))
306+ then true
307+ else (getWavesLockedBalance(account) != 0))
308+ then throw("please withdraw locked funds first")
309+ else WriteSet([DataEntry(getNeutrinoLockedBalanceKey(account), pmt.amount), DataEntry(getWavesLockedBalanceKey(account), (height + balanceLockInterval)), DataEntry(NeutrinoLockedBalanceKey, (neutrinoLockedBalance + pmt.amount))])
379310 }
380311
381312
383314 @Callable(i)
384315 func withdraw (account,index) = {
385316 let unlockHeight = getUnlockBalanceBlock(account)
386- let neutrinoAmount = getNeutrinoBalance(account)
317+ let userWavesLockedBalance = getWavesLockedBalance(account)
318+ let userNeutrinoLockedBalance = getNeutrinoLockedBalance(account)
387319 let indexHeight = getHeightPriceByIndex(index)
388320 let nextIndexHeight = getHeightPriceByIndex((index + 1))
389- let indexPrice = getPriceHistory(indexHeight)
390- let amount = convertNeutrinoToWavesByPrice(neutrinoAmount, indexPrice)
321+ let priceByIndex = getPriceHistory(indexHeight)
322+ let neutrinoAmount = convertWavesToNeutrino(userWavesLockedBalance, priceByIndex)
323+ let wavesAmount = convertNeutrinoToWaves(userNeutrinoLockedBalance, priceByIndex)
391324 if (isBlocked)
392- then throw("The contract is blocked by EMERGENCY SHUTDOWN. Please wait for reactivation by emergency oracles.")
393- else if ((0 >= amount))
394- then throw("No funds are available for withdrawal.")
395- else if ((unlockHeight > height))
396- then throw((("Please wait for the " + toString(unlockHeight)) + " block height to complete withdrawal."))
397- else if (if (if ((index > priceIndex))
398- then true
399- else (indexHeight > unlockHeight))
400- then true
401- else if ((nextIndexHeight != 0))
402- then (unlockHeight >= nextIndexHeight)
403- else false)
404- then throw("Invalid price history index.")
405- else ScriptResult(WriteSet([DataEntry(getNeutrinoBalanceKey(account), (getNeutrinoBalance(account) - neutrinoAmount)), DataEntry(SwapNeutrinoLockedBalanceKey, (swapNeutrinoLockedBalance - neutrinoAmount))]), TransferSet([ScriptTransfer(addressFromStringValue(account), amount, unit)]))
325+ then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
326+ else if ((unlockHeight > height))
327+ then throw((("please wait for: " + toString(unlockHeight)) + " block height to withdraw WAVES funds"))
328+ else if (if (if ((index > priceIndex))
329+ then true
330+ else (indexHeight > unlockHeight))
331+ then true
332+ else if ((nextIndexHeight != 0))
333+ then (unlockHeight >= nextIndexHeight)
334+ else false)
335+ then throw("invalid price history index")
336+ else if (if ((0 >= neutrinoAmount))
337+ then (0 >= wavesAmount)
338+ else false)
339+ then throw("balance equals zero")
340+ else ScriptResult(WriteSet([DataEntry(getWavesLockedBalanceKey(account), 0), DataEntry(getNeutrinoLockedBalanceKey(account), 0), DataEntry(WavesLockedBalanceKey, (wavesLockedBalance - userWavesLockedBalance)), DataEntry(NeutrinoLockedBalanceKey, (neutrinoLockedBalance - userNeutrinoLockedBalance))]), TransferSet([ScriptTransfer(addressFromStringValue(account), wavesAmount, unit), ScriptTransfer(addressFromStringValue(account), neutrinoAmount, neutrinoAssetId)]))
406341 }
407342
408343
409344
410345 @Callable(i)
411-func generateBond () = {
412- let balanceAuction = assetBalance(addressFromStringValue(auctionContract), bondAssetId)
413- let amount = (convertNeutrinoToBond(deficit) - balanceAuction)
346+func transferToAuction () = {
347+ let deficitBondAmount = (convertNeutrinoToBond(deficit) - assetBalance(addressFromStringValue(auctionContract), bondAssetId))
348+ let surplusBond = (convertNeutrinoToBond(surplus) - assetBalance(addressFromStringValue(auctionContract), neutrinoAssetId))
414349 if (isBlocked)
415- then throw("The contract is blocked by EMERGENCY SHUTDOWN. Please wait for reactivation by emergency oracles.")
416- else if ((amount >= ((neutrinoSupply * DEFICITOFFSET) / 100)))
417- then TransferSet([ScriptTransfer(addressFromStringValue(auctionContract), amount, bondAssetId)])
418- else throw("Bonds were already generated or there is not enough deficit.")
419- }
420-
421-
422-
423-@Callable(i)
424-func setOrder () = {
425- let pmt = extract(i.payment)
426- let newOrderId = toBase58String(keccak256(((toBytes(pmt.amount) + i.caller.bytes) + toBytes(height))))
427- if ((pmt.assetId != bondAssetId))
428- then throw("Can use appropriate Neutrino Bond tokens only.")
429- else if ((getOrderOwner(newOrderId) != ""))
430- then throw("This order already exists.")
431- 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)])
432- }
433-
434-
435-
436-@Callable(i)
437-func cancelOrder (orderId) = {
438- let owner = getOrderOwner(orderId)
439- let amount = (getOrderTotal(orderId) - getOrderFilledTotal(orderId))
440- if ((owner != toString(i.caller)))
441- then throw("Only the owner of bond liquidation request can cancel it.")
442- else if ((getOrderStatus(orderId) != NEW))
443- then throw("Invalid liquidation request status.")
444- else ScriptResult(WriteSet([DataEntry(OrderbookKey, dropOrder(orderId)), DataEntry(getOrderStatusKey(orderId), CANCELED)]), TransferSet([ScriptTransfer(i.caller, amount, bondAssetId)]))
445- }
446-
447-
448-
449-@Callable(i)
450-func executeOrder () = {
451- let orderId = split(orderbook, LISTSPLITSYMBOL)[0]
452- let orderTotal = getOrderTotal(orderId)
453- let orderOwner = getOrderOwner(orderId)
454- let filledTotal = getOrderFilledTotal(orderId)
455- let surplusBond = convertNeutrinoToBond(surplus)
456- if (isBlocked)
457- then throw("The contract is blocked by EMERGENCY SHUTDOWN. Please wait for reactivation by emergency oracles.")
458- else if ((0 >= surplusBond))
459- then throw("There is no surplus on the smart contract at the moment.")
460- else if ((orderbook == ""))
461- then throw("The orderbook is empty.")
462- else {
463- let amount = (orderTotal - filledTotal)
464- let status = if ((surplusBond >= amount))
465- then FILLED
466- else NEW
467- let newFilledTotal = if ((surplusBond >= amount))
468- then amount
469- else surplusBond
470- ScriptResult(WriteSet([DataEntry(OrderbookKey, if ((surplusBond >= amount))
471- then dropOrder(orderId)
472- else orderbook), DataEntry(getOrderFilledTotalKey(orderId), (filledTotal + newFilledTotal)), DataEntry(getOrderStatusKey(orderId), status)]), TransferSet([ScriptTransfer(addressFromStringValue(orderOwner), convertBondToNeutrino(newFilledTotal), neutrinoAssetId)]))
473- }
350+ then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
351+ else if ((deficitBondAmount >= ((convertNeutrinoToBond(neutrinoSupply) * DEFICITOFFSET) / 100)))
352+ then TransferSet([ScriptTransfer(addressFromStringValue(auctionContract), deficitBondAmount, bondAssetId)])
353+ else if ((surplusBond > 0))
354+ then TransferSet([ScriptTransfer(addressFromStringValue(liquidationContract), convertBondToNeutrino(surplusBond), neutrinoAssetId)])
355+ else throw(((((("bond were generated or do not need it. Deficit:" + toString(deficitBondAmount)) + "|") + toString(((neutrinoSupply * DEFICITOFFSET) / 100))) + ". Surplus:") + toString(surplusBond)))
474356 }
475357
476358
487369 func nodeReward () = {
488370 let pmt = value(i.payment)
489371 if ((i.caller != addressFromStringValue(nodeAddress)))
490- then throw("Only a node account is able to transfer staking rewards.")
372+ then throw("only node account is able to transfer staking rewards from main account")
491373 else if (isDefined(pmt.assetId))
492- then throw("Only Waves tokens are allowed.")
374+ then throw("waves tokens only allowed")
493375 else {
494- let amount = convertWavesToNeutrino(pmt.amount)
376+ let amount = convertWavesToNeutrino(pmt.amount, currentPrice)
495377 let newRpdSyncIndex = (rpdSyncIndex + 1)
496378 ScriptResult(WriteSet([DataEntry(RPDSyncIndexKey, newRpdSyncIndex), DataEntry(getRPDProfitKey(rpdSyncIndex), amount), DataEntry(getRPDSnapshotContractBalanceKey(rpdSyncIndex, neutrinoAssetId), getRPDContractBalance(neutrinoAssetId))]), TransferSet([ScriptTransfer(addressFromStringValue(rpdContract), amount, neutrinoAssetId)]))
497379 }
498- }
499-
500-
501-
502-@Callable(i)
503-func registrationLeaseTx (senderPublicKey,fee,timestamp,leaseTxHash) = {
504- let totalFreeReserve = (((reserve * LEASINGSHARE) / 100) - convertNeutrinoToWaves(swapNeutrinoLockedBalance))
505- let amount = (totalFreeReserve / LEASINGTXCOUNT)
506- let txBytes = (((((base58'3h1H' + fromBase58String(senderPublicKey)) + fromBase58String(nodeAddress)) + toBytes(amount)) + toBytes(fee)) + toBytes(timestamp))
507- let txHashBytes = blake2b256(txBytes)
508- let txHash = toBase58String(txHashBytes)
509- let pmt = extract(i.payment)
510- if ((toString(i.caller) == nodeOracleProviderKey))
511- then throw("invalid caller")
512- else if (isDefined(pmt.assetId))
513- then throw("invalid payment asset")
514- else if ((leaseTxHash != txHash))
515- then throw((("invalid tx hash (amount: " + toString(amount)) + ")"))
516- else if ((leasingTxCount >= LEASINGTXCOUNT))
517- then throw("the number of leasing transactions exceeds the limit")
518- else if ((this != addressFromPublicKey(fromBase58String(senderPublicKey))))
519- then throw("invalid public key")
520- else if (if ((lastBlock.timestamp > timestamp))
521- then true
522- else (timestamp > (lastBlock.timestamp + 5400000)))
523- then throw((("invalid timestamp (lastBlock: " + toString(lastBlock.timestamp)) + ")"))
524- else if ((getLeaseTxStatus(txHash) != ""))
525- then throw("This tx already exists.")
526- else if ((pmt.amount != (fee * 2)))
527- then throw("invalid payment amount")
528- else if (if ((fee > 1000000))
529- then true
530- else (500000 > fee))
531- then throw("invalid fee")
532- else if (((totalFreeReserve - (leasingAmount + amount)) > reserveWithoutLeasing))
533- then throw((("invalid amount(result:" + toString(((totalFreeReserve - (leasingAmount + amount)) > reserveWithoutLeasing))) + ")"))
534- else WriteSet([DataEntry(getCancelLeaseTxReserveFeeKey(txHash), fee), DataEntry(LeasingTxCountKey, if ((getLeaseTxStatus(txHash) == ""))
535- then (leasingTxCount + 1)
536- else leasingTxCount), DataEntry(LeasingAmountKey, (leasingAmount + amount)), DataEntry(LeasingExpireBlockKey, if ((height > leasingExpireBlock))
537- then (height + leasingInterval)
538- else leasingExpireBlock), DataEntry(getLeaseTxStatusKey(txHash), NEW), DataEntry(getLeaseTxExpireSendBlockKey(txHash), (height + SENDTXEXPIRE)), DataEntry(getLeaseTxAmountByHashKey(txHash), amount), DataEntry(getLeaseTxBytesByHashKey(txHash), toBase64String(txBytes))])
539- }
540-
541-
542-
543-@Callable(i)
544-func cancelStuckLeaseTx (txHash) = if (if (if ((getLeaseTxStatus(txHash) == NEW))
545- then !(isDefined(transactionHeightById(fromBase58String(txHash))))
546- else false)
547- then (height > getLeaseTxExpireSendBlock(txHash))
548- else false)
549- then {
550- let amount = getLeaseTxAmountByHash(txHash)
551- WriteSet([DataEntry(LeasingTxCountKey, (leasingTxCount - 1)), DataEntry(LeasingAmountKey, (leasingAmount - amount)), DataEntry(getLeaseTxStatusKey(txHash), CANCELED), DataEntry(IsRebalanceKey, if (((reserveWithoutLeasing - amount) >= convertNeutrinoToWaves(swapNeutrinoLockedBalance)))
552- then false
553- else true)])
554- }
555- else throw("invalid tx hash")
556-
557-
558-
559-@Callable(i)
560-func registrationUnleaseTx (chainIdString,senderPublicKey,fee,timestamp,leaseTxHash) = {
561- let txBytes = (((((base58'gm' + toBytes(chainIdString)) + fromBase58String(senderPublicKey)) + toBytes(fee)) + toBytes(timestamp)) + fromBase58String(leaseTxHash))
562- let txHash = blake2b256(txBytes)
563- if ((getLeaseTxStatus(leaseTxHash) != NEW))
564- then throw("invalid tx status")
565- else if ((this != addressFromPublicKey(fromBase58String(senderPublicKey))))
566- then throw("invalid pubKey")
567- else if (!(isDefined(transactionHeightById(txHash))))
568- then throw("blockchain does not contain this transaction")
569- else {
570- let amount = getLeaseTxAmountByHash(leaseTxHash)
571- WriteSet([DataEntry(LeasingTxCountKey, (leasingTxCount - 1)), DataEntry(LeasingAmountKey, (leasingAmount - amount)), DataEntry(getLeaseTxStatusKey(leaseTxHash), CANCELED), DataEntry(IsRebalanceKey, if (((reserveWithoutLeasing - amount) >= convertNeutrinoToWaves(swapNeutrinoLockedBalance)))
572- then false
573- else true)])
574- }
575380 }
576381
577382
579384 func verify () = {
580385 let id = toBase58String(tx.id)
581386 match tx {
582- case leaseTx: LeaseTransaction =>
583- if (if ((leasingExpireBlock >= height))
584- then (getLeaseTxExpireSendBlock(id) >= height)
585- else false)
586- then (getLeaseTxStatus(id) == NEW)
587- else false
588- case unleaseTx: LeaseCancelTransaction =>
589- let leaseId = toBase58String(unleaseTx.leaseId)
590- if (if (if ((height > leasingExpireBlock))
591- then true
592- else isRebalance)
593- then (unleaseTx.fee == getCancelLeaseTxReserveFee(leaseId))
594- else false)
595- then (getLeaseTxStatus(leaseId) == NEW)
387+ case leasingTx: LeaseCancelTransaction|LeaseTransaction =>
388+ if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
389+ then (addressFromString(nodeOracleProvider) == addressFromPublicKey(tx.senderPublicKey))
596390 else false
597391 case _ =>
598392 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 let SENDTXEXPIRE = 30
5353
5454 let LISTSPLITSYMBOL = "_"
5555
5656 let LISTDATASYMBOL = "+"
5757
5858 let WAVELET = 100000000
5959
6060 let PAULI = 100
6161
62-let CRITICALSHARE = 20
62+let CRYTICALSHARE = 20
6363
6464 let LEASINGSHARE = 90
6565
66-let LEASINGTXCOUNT = 10
66+let LEASINTXCOUNT = 10
67+
68+let DEFICITOFFSET = 10
69+
70+let WAVESASSETID = "waves"
6771
6872 let CANCELED = "canceled"
6973
7074 let NEW = "new"
71-
72-let FILLED = "filled"
73-
74-let DEFICITOFFSET = 10
7575
7676 let NeutrinoAssetIdKey = "neutrino_asset_id"
7777
7878 let BondAssetIdKey = "bond_asset_id"
7979
8080 let ReserveContractKey = "reserve_contract"
8181
8282 let AuctionContractKey = "auction_contract"
8383
84+let LiquidationContractKey = "liquidation_contract"
85+
8486 let RPDContractKey = "rpd_contract"
8587
86-let ControlContractKey = "control_contract"
88+let ContolContractKey = "control_contract"
8789
8890 let BalanceLockIntervalKey = "balance_lock_interval"
8991
9092 let MinWavesSwapAmountKey = "min_waves_swap_amount"
9193
9294 let MinNeutrinoSwapAmountKey = "min_neutrino_swap_amount"
9395
9496 let NodeAddressKey = "node_address"
9597
9698 let NodeOracleProviderKey = "oracle_node_provider"
9799
98100 let LeasingIntervalKey = "leasing_interval"
99101
102+let RPDBalanceKey = "rpd_balance"
103+
104+func getRPDContractBalanceKey (assetId) = ((RPDBalanceKey + "_") + toBase58String(assetId))
105+
106+
100107 let PriceKey = "price"
101108
102109 let PriceIndexKey = "price_index"
103110
104-let ScriptUpdateIntervalKey = "script_update_interval"
105-
106-let NeutrinoBalanceKey = "neutrino_"
107-
108-let BalanceUnlockBlockKey = "balance_block_"
109-
110-let OrderbookKey = "orderbook"
111-
112-let OrderTotalKey = "order_total_"
113-
114-let OrderOwnerKey = "order_owner_"
115-
116-let OrderHeightKey = "order_height_"
117-
118-let OrderFilledTotalKey = "order_filled_total_"
119-
120-let OrderStatusKey = "order_status_"
121-
122-let RPDSyncIndexKey = "rpd_sync_index"
123-
124-let RPDProfitKey = "rpd_profit"
125-
126-let RPDBalanceKey = "rpd_balance"
127-
128111 let IsBlockedKey = "is_blocked"
129-
130-let IsLeasingProfitTxExistKey = "is_leasing_profit"
131-
132-let ScriptUpdateBlockKey = "script_update_block"
133-
134-let LeaseTxKey = "lease_tx"
135-
136-let LeaseTxStatusKey = "lease_tx_status"
137-
138-let LeasingAmountKey = "leasing_amount"
139-
140-let LeaseTxExpireSendBlockKey = "leasing_expire_send"
141112
142113 let LeasingExpireBlockKey = "leasing_expire_block"
143114
144-let IsRebalanceKey = "is_rebalance"
145-
146-let SwapNeutrinoLockedBalanceKey = "swap_neutrino_locked_balance"
147-
148115 let LeasingTxCountKey = "leasing_index"
149116
150-let CancelLeaseTxReserveFeeKey = "cancel_lease_tx_reserve_fee"
151-
152-func getRPDSnapshotContractBalanceKey (count,assetId) = ((((RPDBalanceKey + "_") + toBase58String(assetId)) + "_") + toString(count))
153-
154-
155-func getRPDContractBalanceKey (assetId) = ((RPDBalanceKey + "_") + toBase58String(assetId))
156-
157-
158-func getRPDProfitKey (count) = ((RPDProfitKey + "_") + toString(count))
159-
160-
161-func getNeutrinoBalanceKey (owner) = (NeutrinoBalanceKey + owner)
162-
163-
164-func getBalanceUnlockBlockKey (owner) = (BalanceUnlockBlockKey + owner)
165-
166-
167-func getOrderTotalKey (orderId) = (OrderTotalKey + orderId)
168-
169-
170-func getOrderOwnerKey (orderId) = (OrderOwnerKey + orderId)
171-
172-
173-func getOrderHeightKey (orderId) = (OrderHeightKey + orderId)
174-
175-
176-func getOrderStatusKey (orderId) = (OrderStatusKey + orderId)
177-
178-
179-func getOrderFilledTotalKey (orderId) = (OrderFilledTotalKey + orderId)
180-
117+let LeasingAmountKey = "leasing_amount"
181118
182119 func getPriceHistoryKey (block) = ((PriceKey + "_") + toString(block))
183120
184121
185122 func getHeightPriceByIndexKey (index) = ((PriceIndexKey + "_") + toString(index))
186123
187124
188-func getLeaseTxStatusKey (hash) = ((LeaseTxStatusKey + "_") + hash)
125+let RPDSyncIndexKey = "rpd_sync_index"
126+
127+let BalanceLocedkKey = "balance_lock_"
128+
129+let WavesLockedBalanceKey = (BalanceLocedkKey + "waves")
130+
131+let NeutrinoLockedBalanceKey = (BalanceLocedkKey + "neutrino")
132+
133+func getRPDSnapshotContractBalanceKey (count,assetId) = ((((RPDBalanceKey + "_") + toBase58String(assetId)) + "_") + toString(count))
134+
135+
136+func getCancelLeaseTxReserveFeeKey (hash) = (("cancel_lease_tx_reserve_fee" + "_") + hash)
137+
138+
139+func getWavesLockedBalanceKey (owner) = ((WavesLockedBalanceKey + "_") + owner)
140+
141+
142+func getNeutrinoLockedBalanceKey (owner) = ((NeutrinoLockedBalanceKey + "_") + owner)
143+
144+
145+func getBalanceUnlockBlockKey (owner) = ("balance_unlock_block_" + owner)
146+
147+
148+func getRPDProfitKey (count) = (("rpd_profit" + "_") + toString(count))
149+
150+
151+func getLeaseTxStatusKey (hash) = (("lease_tx_status" + "_") + hash)
189152
190153
191154 func getLeaseTxAmountByHashKey (hash) = ((LeasingAmountKey + "_") + hash)
192155
193156
194-func getLeaseTxBytesByHashKey (hash) = ((LeaseTxKey + "_") + hash)
157+func getLeaseTxBytesByHashKey (hash) = (("lease_tx" + "_") + hash)
195158
196159
197-func getLeaseTxExpireSendBlockKey (hash) = ((LeaseTxExpireSendBlockKey + "_") + hash)
160+func getLeaseTxExpireSendBlockKey (hash) = (("leasing_expire_send" + "_") + hash)
198161
199162
200-func getCancelLeaseTxReserveFeeKey (hash) = ((CancelLeaseTxReserveFeeKey + "_") + hash)
163+func convertNeutrinoToWaves (amount,price) = ((((amount * 100) / price) * WAVELET) / PAULI)
201164
202165
203-let neutrinoAssetId = fromBase58String(getStringByKey(NeutrinoAssetIdKey))
204-
205-let reserveContract = getStringByKey(ReserveContractKey)
206-
207-let auctionContract = getStringByKey(AuctionContractKey)
208-
209-let rpdContract = getStringByKey(RPDContractKey)
210-
211-let controlContract = getStringByKey(ControlContractKey)
212-
213-let price = getNumberByAddressAndKey(controlContract, PriceKey)
214-
215-let priceIndex = getNumberByAddressAndKey(controlContract, PriceIndexKey)
216-
217-func convertNeutrinoToWavesByPrice (amount,convertPrice) = ((((amount * 100) / convertPrice) * WAVELET) / PAULI)
218-
219-
220-func convertNeutrinoToWaves (amount) = ((((amount * 100) / price) * WAVELET) / PAULI)
221-
222-
223-func convertWavesToNeutrino (amount) = ((((amount * price) / 100) * PAULI) / WAVELET)
166+func convertWavesToNeutrino (amount,price) = ((((amount * price) / 100) * PAULI) / WAVELET)
224167
225168
226169 func convertNeutrinoToBond (amount) = (amount / PAULI)
227170
228171
229172 func convertBondToNeutrino (amount) = (amount * PAULI)
230173
231174
232-func convertWavesToBond (amount) = convertNeutrinoToBond(convertWavesToNeutrino(amount))
175+func convertWavesToBond (amount,price) = convertNeutrinoToBond(convertWavesToNeutrino(amount, price))
233176
177+
178+let neutrinoLockedBalance = getNumberByKey(NeutrinoLockedBalanceKey)
179+
180+let wavesLockedBalance = getNumberByKey(WavesLockedBalanceKey)
181+
182+let liquidationContract = getStringByKey(LiquidationContractKey)
183+
184+let neutrinoAssetIdString = getStringByKey(NeutrinoAssetIdKey)
185+
186+let neutrinoAssetId = fromBase58String(neutrinoAssetIdString)
187+
188+let reserveContract = getStringByKey(ReserveContractKey)
189+
190+let auctionContract = getStringByKey(AuctionContractKey)
191+
192+let rpdContract = getStringByKey(RPDContractKey)
193+
194+let controlContract = getStringByKey(ContolContractKey)
195+
196+let currentPrice = getNumberByAddressAndKey(controlContract, PriceKey)
197+
198+let priceIndex = getNumberByAddressAndKey(controlContract, PriceIndexKey)
234199
235200 let isBlocked = getBoolByAddressAndKey(controlContract, IsBlockedKey)
236201
237202 let leasingTxCount = getNumberByKey(LeasingTxCountKey)
238-
239-let isRebalance = getBoolByKey(IsRebalanceKey)
240203
241204 let leasingInterval = getNumberByKey(LeasingIntervalKey)
242205
243206 let leasingExpireBlock = getNumberByKey(LeasingExpireBlockKey)
244207
245208 let leasingAmount = getNumberByKey(LeasingAmountKey)
246209
247-let swapNeutrinoLockedBalance = getNumberByKey(SwapNeutrinoLockedBalanceKey)
248-
249210 let nodeAddress = getStringByKey(NodeAddressKey)
250211
251-let nodeOracleProviderKey = getStringByKey(NodeOracleProviderKey)
212+let nodeOracleProvider = getStringByKey(NodeOracleProviderKey)
252213
253214 let rpdSyncIndex = getNumberByKey(RPDSyncIndexKey)
254215
255216 let balanceLockInterval = getNumberByKey(BalanceLockIntervalKey)
256217
257218 let minWavesSwapAmount = getNumberByKey(MinWavesSwapAmountKey)
258219
259220 let minNeutrinoSwapAmount = getNumberByKey(MinNeutrinoSwapAmountKey)
260221
261-let reserve = wavesBalance(this)
222+let reserve = (wavesBalance(this) - wavesLockedBalance)
262223
263224 let reserveWithoutLeasing = (reserve - leasingAmount)
264225
265-let orderbook = getStringByKey(OrderbookKey)
266-
267226 let bondAssetId = fromBase58String(getStringByKey(BondAssetIdKey))
268227
269-let bondSupply = {
270- let info = extract(assetInfo(bondAssetId))
271- (info.quantity - assetBalance(this, bondAssetId))
272- }
228+let bondSupply = (extract(assetInfo(bondAssetId)).quantity - assetBalance(this, bondAssetId))
273229
274-let neutrinoSupply = {
275- let info = extract(assetInfo(neutrinoAssetId))
276- ((info.quantity - assetBalance(this, neutrinoAssetId)) + swapNeutrinoLockedBalance)
277- }
230+let neutrinoSupply = ((extract(assetInfo(neutrinoAssetId)).quantity - assetBalance(this, neutrinoAssetId)) + neutrinoLockedBalance)
278231
279-let surplus = (convertWavesToNeutrino(reserve) - neutrinoSupply)
232+let surplus = (convertWavesToNeutrino(reserve, currentPrice) - neutrinoSupply)
280233
281-let deficit = (neutrinoSupply - convertWavesToNeutrino(reserve))
234+let deficit = (neutrinoSupply - convertWavesToNeutrino(reserve, currentPrice))
282235
283236 func getRPDContractBalance (assetId) = getNumberByAddressAndKey(rpdContract, getRPDContractBalanceKey(assetId))
284237
285238
286239 func getPriceHistory (block) = getNumberByAddressAndKey(controlContract, getPriceHistoryKey(block))
287240
288241
289242 func getHeightPriceByIndex (index) = getNumberByAddressAndKey(controlContract, getHeightPriceByIndexKey(index))
290243
291244
292245 func getCancelLeaseTxReserveFee (hash) = getNumberByKey(getCancelLeaseTxReserveFeeKey(hash))
293246
294247
295-func getNeutrinoBalance (owner) = getNumberByKey(getNeutrinoBalanceKey(owner))
248+func getWavesLockedBalance (owner) = getNumberByKey(getWavesLockedBalanceKey(owner))
249+
250+
251+func getNeutrinoLockedBalance (owner) = getNumberByKey(getNeutrinoLockedBalanceKey(owner))
296252
297253
298254 func getUnlockBalanceBlock (owner) = getNumberByKey(getBalanceUnlockBlockKey(owner))
299-
300-
301-func getOrderTotal (id) = getNumberByKey(getOrderTotalKey(id))
302-
303-
304-func getOrderOwner (id) = getStringByKey(getOrderOwnerKey(id))
305-
306-
307-func getOrderStatus (id) = getStringByKey(getOrderStatusKey(id))
308-
309-
310-func getOrderFilledTotal (id) = getNumberByKey(getOrderFilledTotalKey(id))
311255
312256
313257 func getRPDProfit (count) = getNumberByKey(getRPDProfitKey(count))
314258
315259
316260 func getLeaseTxStatus (hash) = getStringByKey(getLeaseTxStatusKey(hash))
317261
318262
319263 func getLeaseTxAmountByHash (hash) = getNumberByKey(getLeaseTxAmountByHashKey(hash))
320264
321265
322266 func getLeaseTxBytesByHash (hash) = getStringByKey(getLeaseTxBytesByHashKey(hash))
323267
324268
325269 func getLeaseTxExpireSendBlock (hash) = getNumberByKey(getLeaseTxExpireSendBlockKey(hash))
326270
327271
328-func getOrderElementById (id) = (id + LISTSPLITSYMBOL)
329-
330-
331-func addOrder (orderId) = (orderbook + getOrderElementById(orderId))
332-
333-
334-func dropOrder (orderId) = {
335- let parts = split(orderbook, getOrderElementById(orderId))
336- (parts[0] + parts[1])
337- }
338-
339-
340272 @Callable(i)
341273 func swapWavesToNeutrino () = {
342274 let pmt = extract(i.payment)
343- let wavesAmount = ((pmt.amount * 98) / 100)
275+ let account = toString(i.caller)
344276 if ((minWavesSwapAmount > pmt.amount))
345- then throw((("The specified Waves amount is less than the required minimum of " + toString(minWavesSwapAmount)) + " wavelets."))
277+ then throw((("an amount is less than min available amount: " + toString(minWavesSwapAmount)) + " wavelets"))
346278 else if (isDefined(pmt.assetId))
347- then throw("Only Waves token is allowed for swapping.")
279+ then throw("can use waves only")
348280 else if (isBlocked)
349- then throw("The contract is blocked by EMERGENCY SHUTDOWN. Please wait for reactivation by emergency oracles.")
350- else {
351- let amount = convertWavesToNeutrino(wavesAmount)
352- TransferSet([ScriptTransfer(i.caller, amount, neutrinoAssetId)])
353- }
281+ then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
282+ else if ((getUnlockBalanceBlock(account) > height))
283+ then throw((("await " + toString((getUnlockBalanceBlock(account) - height))) + " blocks"))
284+ else if (if ((getNeutrinoLockedBalance(account) != 0))
285+ then true
286+ else (getWavesLockedBalance(account) != 0))
287+ then throw("please withdraw locked funds first")
288+ else WriteSet([DataEntry(getWavesLockedBalanceKey(account), pmt.amount), DataEntry(getBalanceUnlockBlockKey(account), (height + balanceLockInterval)), DataEntry(WavesLockedBalanceKey, (wavesLockedBalance + pmt.amount))])
354289 }
355290
356291
357292
358293 @Callable(i)
359294 func swapNeutrinoToWaves () = {
360295 let pmt = extract(i.payment)
361296 let account = toString(i.caller)
362297 if ((minNeutrinoSwapAmount > pmt.amount))
363- then throw((("The specified Neutrino amount is less than the required minimum of " + toString(minNeutrinoSwapAmount)) + " Neutrino cents."))
298+ then throw((("an amount is less than min available amount: " + toString(minNeutrinoSwapAmount)) + " neutrino cents"))
364299 else if (isBlocked)
365- then throw("The contract is blocked by EMERGENCY SHUTDOWN. Please wait for reactivation by emergency oracles.")
300+ then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
366301 else if ((pmt.assetId != neutrinoAssetId))
367- then throw("Only appropriate Neutrino tokens are allowed for swapping.")
302+ then throw("can use appropriate neutrino tokens only")
368303 else if ((getUnlockBalanceBlock(account) > height))
369- then throw((("Please wait for " + toString((getUnlockBalanceBlock(account) - height))) + " blocks to complete."))
370- else if ((getNeutrinoBalance(account) != 0))
371- then throw("Please withdraw locked Neutrinos first.")
372- else {
373- let neutrinoAmount = pmt.amount
374- let newSwapNeutrinoLockedBalance = (swapNeutrinoLockedBalance + neutrinoAmount)
375- WriteSet([DataEntry(getNeutrinoBalanceKey(account), (getNeutrinoBalance(account) + neutrinoAmount)), DataEntry(getBalanceUnlockBlockKey(account), (height + balanceLockInterval)), DataEntry(SwapNeutrinoLockedBalanceKey, newSwapNeutrinoLockedBalance), DataEntry(IsRebalanceKey, if ((reserveWithoutLeasing >= convertNeutrinoToWaves(newSwapNeutrinoLockedBalance)))
376- then false
377- else true)])
378- }
304+ then throw((("await " + toString((getUnlockBalanceBlock(account) - height))) + " blocks"))
305+ else if (if ((getNeutrinoLockedBalance(account) != 0))
306+ then true
307+ else (getWavesLockedBalance(account) != 0))
308+ then throw("please withdraw locked funds first")
309+ else WriteSet([DataEntry(getNeutrinoLockedBalanceKey(account), pmt.amount), DataEntry(getWavesLockedBalanceKey(account), (height + balanceLockInterval)), DataEntry(NeutrinoLockedBalanceKey, (neutrinoLockedBalance + pmt.amount))])
379310 }
380311
381312
382313
383314 @Callable(i)
384315 func withdraw (account,index) = {
385316 let unlockHeight = getUnlockBalanceBlock(account)
386- let neutrinoAmount = getNeutrinoBalance(account)
317+ let userWavesLockedBalance = getWavesLockedBalance(account)
318+ let userNeutrinoLockedBalance = getNeutrinoLockedBalance(account)
387319 let indexHeight = getHeightPriceByIndex(index)
388320 let nextIndexHeight = getHeightPriceByIndex((index + 1))
389- let indexPrice = getPriceHistory(indexHeight)
390- let amount = convertNeutrinoToWavesByPrice(neutrinoAmount, indexPrice)
321+ let priceByIndex = getPriceHistory(indexHeight)
322+ let neutrinoAmount = convertWavesToNeutrino(userWavesLockedBalance, priceByIndex)
323+ let wavesAmount = convertNeutrinoToWaves(userNeutrinoLockedBalance, priceByIndex)
391324 if (isBlocked)
392- then throw("The contract is blocked by EMERGENCY SHUTDOWN. Please wait for reactivation by emergency oracles.")
393- else if ((0 >= amount))
394- then throw("No funds are available for withdrawal.")
395- else if ((unlockHeight > height))
396- then throw((("Please wait for the " + toString(unlockHeight)) + " block height to complete withdrawal."))
397- else if (if (if ((index > priceIndex))
398- then true
399- else (indexHeight > unlockHeight))
400- then true
401- else if ((nextIndexHeight != 0))
402- then (unlockHeight >= nextIndexHeight)
403- else false)
404- then throw("Invalid price history index.")
405- else ScriptResult(WriteSet([DataEntry(getNeutrinoBalanceKey(account), (getNeutrinoBalance(account) - neutrinoAmount)), DataEntry(SwapNeutrinoLockedBalanceKey, (swapNeutrinoLockedBalance - neutrinoAmount))]), TransferSet([ScriptTransfer(addressFromStringValue(account), amount, unit)]))
325+ then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
326+ else if ((unlockHeight > height))
327+ then throw((("please wait for: " + toString(unlockHeight)) + " block height to withdraw WAVES funds"))
328+ else if (if (if ((index > priceIndex))
329+ then true
330+ else (indexHeight > unlockHeight))
331+ then true
332+ else if ((nextIndexHeight != 0))
333+ then (unlockHeight >= nextIndexHeight)
334+ else false)
335+ then throw("invalid price history index")
336+ else if (if ((0 >= neutrinoAmount))
337+ then (0 >= wavesAmount)
338+ else false)
339+ then throw("balance equals zero")
340+ else ScriptResult(WriteSet([DataEntry(getWavesLockedBalanceKey(account), 0), DataEntry(getNeutrinoLockedBalanceKey(account), 0), DataEntry(WavesLockedBalanceKey, (wavesLockedBalance - userWavesLockedBalance)), DataEntry(NeutrinoLockedBalanceKey, (neutrinoLockedBalance - userNeutrinoLockedBalance))]), TransferSet([ScriptTransfer(addressFromStringValue(account), wavesAmount, unit), ScriptTransfer(addressFromStringValue(account), neutrinoAmount, neutrinoAssetId)]))
406341 }
407342
408343
409344
410345 @Callable(i)
411-func generateBond () = {
412- let balanceAuction = assetBalance(addressFromStringValue(auctionContract), bondAssetId)
413- let amount = (convertNeutrinoToBond(deficit) - balanceAuction)
346+func transferToAuction () = {
347+ let deficitBondAmount = (convertNeutrinoToBond(deficit) - assetBalance(addressFromStringValue(auctionContract), bondAssetId))
348+ let surplusBond = (convertNeutrinoToBond(surplus) - assetBalance(addressFromStringValue(auctionContract), neutrinoAssetId))
414349 if (isBlocked)
415- then throw("The contract is blocked by EMERGENCY SHUTDOWN. Please wait for reactivation by emergency oracles.")
416- else if ((amount >= ((neutrinoSupply * DEFICITOFFSET) / 100)))
417- then TransferSet([ScriptTransfer(addressFromStringValue(auctionContract), amount, bondAssetId)])
418- else throw("Bonds were already generated or there is not enough deficit.")
419- }
420-
421-
422-
423-@Callable(i)
424-func setOrder () = {
425- let pmt = extract(i.payment)
426- let newOrderId = toBase58String(keccak256(((toBytes(pmt.amount) + i.caller.bytes) + toBytes(height))))
427- if ((pmt.assetId != bondAssetId))
428- then throw("Can use appropriate Neutrino Bond tokens only.")
429- else if ((getOrderOwner(newOrderId) != ""))
430- then throw("This order already exists.")
431- 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)])
432- }
433-
434-
435-
436-@Callable(i)
437-func cancelOrder (orderId) = {
438- let owner = getOrderOwner(orderId)
439- let amount = (getOrderTotal(orderId) - getOrderFilledTotal(orderId))
440- if ((owner != toString(i.caller)))
441- then throw("Only the owner of bond liquidation request can cancel it.")
442- else if ((getOrderStatus(orderId) != NEW))
443- then throw("Invalid liquidation request status.")
444- else ScriptResult(WriteSet([DataEntry(OrderbookKey, dropOrder(orderId)), DataEntry(getOrderStatusKey(orderId), CANCELED)]), TransferSet([ScriptTransfer(i.caller, amount, bondAssetId)]))
445- }
446-
447-
448-
449-@Callable(i)
450-func executeOrder () = {
451- let orderId = split(orderbook, LISTSPLITSYMBOL)[0]
452- let orderTotal = getOrderTotal(orderId)
453- let orderOwner = getOrderOwner(orderId)
454- let filledTotal = getOrderFilledTotal(orderId)
455- let surplusBond = convertNeutrinoToBond(surplus)
456- if (isBlocked)
457- then throw("The contract is blocked by EMERGENCY SHUTDOWN. Please wait for reactivation by emergency oracles.")
458- else if ((0 >= surplusBond))
459- then throw("There is no surplus on the smart contract at the moment.")
460- else if ((orderbook == ""))
461- then throw("The orderbook is empty.")
462- else {
463- let amount = (orderTotal - filledTotal)
464- let status = if ((surplusBond >= amount))
465- then FILLED
466- else NEW
467- let newFilledTotal = if ((surplusBond >= amount))
468- then amount
469- else surplusBond
470- ScriptResult(WriteSet([DataEntry(OrderbookKey, if ((surplusBond >= amount))
471- then dropOrder(orderId)
472- else orderbook), DataEntry(getOrderFilledTotalKey(orderId), (filledTotal + newFilledTotal)), DataEntry(getOrderStatusKey(orderId), status)]), TransferSet([ScriptTransfer(addressFromStringValue(orderOwner), convertBondToNeutrino(newFilledTotal), neutrinoAssetId)]))
473- }
350+ then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
351+ else if ((deficitBondAmount >= ((convertNeutrinoToBond(neutrinoSupply) * DEFICITOFFSET) / 100)))
352+ then TransferSet([ScriptTransfer(addressFromStringValue(auctionContract), deficitBondAmount, bondAssetId)])
353+ else if ((surplusBond > 0))
354+ then TransferSet([ScriptTransfer(addressFromStringValue(liquidationContract), convertBondToNeutrino(surplusBond), neutrinoAssetId)])
355+ else throw(((((("bond were generated or do not need it. Deficit:" + toString(deficitBondAmount)) + "|") + toString(((neutrinoSupply * DEFICITOFFSET) / 100))) + ". Surplus:") + toString(surplusBond)))
474356 }
475357
476358
477359
478360 @Callable(i)
479361 func transfer (account) = {
480362 let pmt = extract(i.payment)
481363 TransferSet([ScriptTransfer(addressFromStringValue(account), pmt.amount, pmt.assetId)])
482364 }
483365
484366
485367
486368 @Callable(i)
487369 func nodeReward () = {
488370 let pmt = value(i.payment)
489371 if ((i.caller != addressFromStringValue(nodeAddress)))
490- then throw("Only a node account is able to transfer staking rewards.")
372+ then throw("only node account is able to transfer staking rewards from main account")
491373 else if (isDefined(pmt.assetId))
492- then throw("Only Waves tokens are allowed.")
374+ then throw("waves tokens only allowed")
493375 else {
494- let amount = convertWavesToNeutrino(pmt.amount)
376+ let amount = convertWavesToNeutrino(pmt.amount, currentPrice)
495377 let newRpdSyncIndex = (rpdSyncIndex + 1)
496378 ScriptResult(WriteSet([DataEntry(RPDSyncIndexKey, newRpdSyncIndex), DataEntry(getRPDProfitKey(rpdSyncIndex), amount), DataEntry(getRPDSnapshotContractBalanceKey(rpdSyncIndex, neutrinoAssetId), getRPDContractBalance(neutrinoAssetId))]), TransferSet([ScriptTransfer(addressFromStringValue(rpdContract), amount, neutrinoAssetId)]))
497379 }
498- }
499-
500-
501-
502-@Callable(i)
503-func registrationLeaseTx (senderPublicKey,fee,timestamp,leaseTxHash) = {
504- let totalFreeReserve = (((reserve * LEASINGSHARE) / 100) - convertNeutrinoToWaves(swapNeutrinoLockedBalance))
505- let amount = (totalFreeReserve / LEASINGTXCOUNT)
506- let txBytes = (((((base58'3h1H' + fromBase58String(senderPublicKey)) + fromBase58String(nodeAddress)) + toBytes(amount)) + toBytes(fee)) + toBytes(timestamp))
507- let txHashBytes = blake2b256(txBytes)
508- let txHash = toBase58String(txHashBytes)
509- let pmt = extract(i.payment)
510- if ((toString(i.caller) == nodeOracleProviderKey))
511- then throw("invalid caller")
512- else if (isDefined(pmt.assetId))
513- then throw("invalid payment asset")
514- else if ((leaseTxHash != txHash))
515- then throw((("invalid tx hash (amount: " + toString(amount)) + ")"))
516- else if ((leasingTxCount >= LEASINGTXCOUNT))
517- then throw("the number of leasing transactions exceeds the limit")
518- else if ((this != addressFromPublicKey(fromBase58String(senderPublicKey))))
519- then throw("invalid public key")
520- else if (if ((lastBlock.timestamp > timestamp))
521- then true
522- else (timestamp > (lastBlock.timestamp + 5400000)))
523- then throw((("invalid timestamp (lastBlock: " + toString(lastBlock.timestamp)) + ")"))
524- else if ((getLeaseTxStatus(txHash) != ""))
525- then throw("This tx already exists.")
526- else if ((pmt.amount != (fee * 2)))
527- then throw("invalid payment amount")
528- else if (if ((fee > 1000000))
529- then true
530- else (500000 > fee))
531- then throw("invalid fee")
532- else if (((totalFreeReserve - (leasingAmount + amount)) > reserveWithoutLeasing))
533- then throw((("invalid amount(result:" + toString(((totalFreeReserve - (leasingAmount + amount)) > reserveWithoutLeasing))) + ")"))
534- else WriteSet([DataEntry(getCancelLeaseTxReserveFeeKey(txHash), fee), DataEntry(LeasingTxCountKey, if ((getLeaseTxStatus(txHash) == ""))
535- then (leasingTxCount + 1)
536- else leasingTxCount), DataEntry(LeasingAmountKey, (leasingAmount + amount)), DataEntry(LeasingExpireBlockKey, if ((height > leasingExpireBlock))
537- then (height + leasingInterval)
538- else leasingExpireBlock), DataEntry(getLeaseTxStatusKey(txHash), NEW), DataEntry(getLeaseTxExpireSendBlockKey(txHash), (height + SENDTXEXPIRE)), DataEntry(getLeaseTxAmountByHashKey(txHash), amount), DataEntry(getLeaseTxBytesByHashKey(txHash), toBase64String(txBytes))])
539- }
540-
541-
542-
543-@Callable(i)
544-func cancelStuckLeaseTx (txHash) = if (if (if ((getLeaseTxStatus(txHash) == NEW))
545- then !(isDefined(transactionHeightById(fromBase58String(txHash))))
546- else false)
547- then (height > getLeaseTxExpireSendBlock(txHash))
548- else false)
549- then {
550- let amount = getLeaseTxAmountByHash(txHash)
551- WriteSet([DataEntry(LeasingTxCountKey, (leasingTxCount - 1)), DataEntry(LeasingAmountKey, (leasingAmount - amount)), DataEntry(getLeaseTxStatusKey(txHash), CANCELED), DataEntry(IsRebalanceKey, if (((reserveWithoutLeasing - amount) >= convertNeutrinoToWaves(swapNeutrinoLockedBalance)))
552- then false
553- else true)])
554- }
555- else throw("invalid tx hash")
556-
557-
558-
559-@Callable(i)
560-func registrationUnleaseTx (chainIdString,senderPublicKey,fee,timestamp,leaseTxHash) = {
561- let txBytes = (((((base58'gm' + toBytes(chainIdString)) + fromBase58String(senderPublicKey)) + toBytes(fee)) + toBytes(timestamp)) + fromBase58String(leaseTxHash))
562- let txHash = blake2b256(txBytes)
563- if ((getLeaseTxStatus(leaseTxHash) != NEW))
564- then throw("invalid tx status")
565- else if ((this != addressFromPublicKey(fromBase58String(senderPublicKey))))
566- then throw("invalid pubKey")
567- else if (!(isDefined(transactionHeightById(txHash))))
568- then throw("blockchain does not contain this transaction")
569- else {
570- let amount = getLeaseTxAmountByHash(leaseTxHash)
571- WriteSet([DataEntry(LeasingTxCountKey, (leasingTxCount - 1)), DataEntry(LeasingAmountKey, (leasingAmount - amount)), DataEntry(getLeaseTxStatusKey(leaseTxHash), CANCELED), DataEntry(IsRebalanceKey, if (((reserveWithoutLeasing - amount) >= convertNeutrinoToWaves(swapNeutrinoLockedBalance)))
572- then false
573- else true)])
574- }
575380 }
576381
577382
578383 @Verifier(tx)
579384 func verify () = {
580385 let id = toBase58String(tx.id)
581386 match tx {
582- case leaseTx: LeaseTransaction =>
583- if (if ((leasingExpireBlock >= height))
584- then (getLeaseTxExpireSendBlock(id) >= height)
585- else false)
586- then (getLeaseTxStatus(id) == NEW)
587- else false
588- case unleaseTx: LeaseCancelTransaction =>
589- let leaseId = toBase58String(unleaseTx.leaseId)
590- if (if (if ((height > leasingExpireBlock))
591- then true
592- else isRebalance)
593- then (unleaseTx.fee == getCancelLeaseTxReserveFee(leaseId))
594- else false)
595- then (getLeaseTxStatus(leaseId) == NEW)
387+ case leasingTx: LeaseCancelTransaction|LeaseTransaction =>
388+ if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
389+ then (addressFromString(nodeOracleProvider) == addressFromPublicKey(tx.senderPublicKey))
596390 else false
597391 case _ =>
598392 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
599393 }
600394 }
601395

github/deemru/w8io/3ef1775 
114.11 ms