tx · 7pz4Zto5oFkVMu55VJizdhvUkBeES52L4uweQcsfmPo8

3MyDtNTkCNyRCw3o2qv5BPPS7vvUosiQe6F:  -0.01400000 Waves

2019.11.18 17:58 [770716] smart account 3MyDtNTkCNyRCw3o2qv5BPPS7vvUosiQe6F > SELF 0.00000000 Waves

{ "type": 13, "id": "7pz4Zto5oFkVMu55VJizdhvUkBeES52L4uweQcsfmPo8", "fee": 1400000, "feeAssetId": null, "timestamp": 1574089136325, "version": 1, "sender": "3MyDtNTkCNyRCw3o2qv5BPPS7vvUosiQe6F", "senderPublicKey": "3z5txV1G5GKezwMRCHZDkLThqb1Yggepxvi2wq6iP6oz", "proofs": [ "2db2iDDpVMm24HUAYhb2cd46nhLWLeo43bbckGHCMYD2VhrzkzFDc4p4nmm4KMRfzGmACWKRD3v91qNqyxXTRtP2" ], "script": "base64:AAIDAAAAAAAAACwIARIAEgASBQoDCAEIEgASAwoBCBIAEgYKBAgBAQgSAwoBCBIHCgUICAEBCAAAAGIBAAAADmdldE51bWJlckJ5S2V5AAAAAQAAAANrZXkEAAAAByRtYXRjaDAJAAQaAAAAAgUAAAAEdGhpcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEAAAAAAAAAAAABAAAADmdldFN0cmluZ0J5S2V5AAAAAQAAAANrZXkEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAEdGhpcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWECAAAAAAEAAAAMZ2V0Qm9vbEJ5S2V5AAAAAQAAAANrZXkEAAAAByRtYXRjaDAJAAQbAAAAAgUAAAAEdGhpcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAdCb29sZWFuBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhBwEAAAAYZ2V0TnVtYmVyQnlBZGRyZXNzQW5kS2V5AAAAAgAAAAdhZGRyZXNzAAAAA2tleQQAAAAHJG1hdGNoMAkABBoAAAACCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEFAAAAB2FkZHJlc3MFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAAAAAAAAAAAAAQAAABhnZXRTdHJpbmdCeUFkZHJlc3NBbmRLZXkAAAACAAAAB2FkZHJlc3MAAAADa2V5BAAAAAckbWF0Y2gwCQAEHQAAAAIJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQUAAAAHYWRkcmVzcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWECAAAAAAEAAAAWZ2V0Qm9vbEJ5QWRkcmVzc0FuZEtleQAAAAIAAAAHYWRkcmVzcwAAAANrZXkEAAAAByRtYXRjaDAJAAQbAAAAAgkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABBQAAAAdhZGRyZXNzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAB0Jvb2xlYW4EAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEHAAAAAAxTRU5EVFhFWFBJUkUAAAAAAAAAAB4AAAAAD0xJU1RTUExJVFNZTUJPTAIAAAABXwAAAAAOTElTVERBVEFTWU1CT0wCAAAAASsAAAAAB1dBVkVMRVQAAAAAAAX14QAAAAAABVBBVUxJAAAAAAAAAABkAAAAAA1DUllUSUNBTFNIQVJFAAAAAAAAAAAUAAAAAAxMRUFTSU5HU0hBUkUAAAAAAAAAAFoAAAAADUxFQVNJTlRYQ09VTlQAAAAAAAAAAAoAAAAADURFRklDSVRPRkZTRVQAAAAAAAAAAAoAAAAADFdBVkVTQVNTRVRJRAIAAAAFd2F2ZXMAAAAACENBTkNFTEVEAgAAAAhjYW5jZWxlZAAAAAADTkVXAgAAAANuZXcAAAAAEk5ldXRyaW5vQXNzZXRJZEtleQIAAAARbmV1dHJpbm9fYXNzZXRfaWQAAAAADkJvbmRBc3NldElkS2V5AgAAAA1ib25kX2Fzc2V0X2lkAAAAABJSZXNlcnZlQ29udHJhY3RLZXkCAAAAEHJlc2VydmVfY29udHJhY3QAAAAAEkF1Y3Rpb25Db250cmFjdEtleQIAAAAQYXVjdGlvbl9jb250cmFjdAAAAAAWTGlxdWlkYXRpb25Db250cmFjdEtleQIAAAAUbGlxdWlkYXRpb25fY29udHJhY3QAAAAADlJQRENvbnRyYWN0S2V5AgAAAAxycGRfY29udHJhY3QAAAAAEUNvbnRvbENvbnRyYWN0S2V5AgAAABBjb250cm9sX2NvbnRyYWN0AAAAABZCYWxhbmNlTG9ja0ludGVydmFsS2V5AgAAABViYWxhbmNlX2xvY2tfaW50ZXJ2YWwAAAAAFU1pbldhdmVzU3dhcEFtb3VudEtleQIAAAAVbWluX3dhdmVzX3N3YXBfYW1vdW50AAAAABhNaW5OZXV0cmlub1N3YXBBbW91bnRLZXkCAAAAGG1pbl9uZXV0cmlub19zd2FwX2Ftb3VudAAAAAAOTm9kZUFkZHJlc3NLZXkCAAAADG5vZGVfYWRkcmVzcwAAAAAVTm9kZU9yYWNsZVByb3ZpZGVyS2V5AgAAABRvcmFjbGVfbm9kZV9wcm92aWRlcgAAAAASTGVhc2luZ0ludGVydmFsS2V5AgAAABBsZWFzaW5nX2ludGVydmFsAAAAAA1SUERCYWxhbmNlS2V5AgAAAAtycGRfYmFsYW5jZQEAAAAYZ2V0UlBEQ29udHJhY3RCYWxhbmNlS2V5AAAAAQAAAAdhc3NldElkCQABLAAAAAIJAAEsAAAAAgUAAAANUlBEQmFsYW5jZUtleQIAAAABXwkAAlgAAAABBQAAAAdhc3NldElkAAAAAAhQcmljZUtleQIAAAAFcHJpY2UAAAAADVByaWNlSW5kZXhLZXkCAAAAC3ByaWNlX2luZGV4AAAAAAxJc0Jsb2NrZWRLZXkCAAAACmlzX2Jsb2NrZWQAAAAAFUxlYXNpbmdFeHBpcmVCbG9ja0tleQIAAAAUbGVhc2luZ19leHBpcmVfYmxvY2sAAAAADklzUmViYWxhbmNlS2V5AgAAAAxpc19yZWJhbGFuY2UAAAAAEUxlYXNpbmdUeENvdW50S2V5AgAAAA1sZWFzaW5nX2luZGV4AAAAABBMZWFzaW5nQW1vdW50S2V5AgAAAA5sZWFzaW5nX2Ftb3VudAEAAAASZ2V0UHJpY2VIaXN0b3J5S2V5AAAAAQAAAAVibG9jawkAASwAAAACCQABLAAAAAIFAAAACFByaWNlS2V5AgAAAAFfCQABpAAAAAEFAAAABWJsb2NrAQAAABhnZXRIZWlnaHRQcmljZUJ5SW5kZXhLZXkAAAABAAAABWluZGV4CQABLAAAAAIJAAEsAAAAAgUAAAANUHJpY2VJbmRleEtleQIAAAABXwkAAaQAAAABBQAAAAVpbmRleAAAAAAPUlBEU3luY0luZGV4S2V5AgAAAA5ycGRfc3luY19pbmRleAEAAAAgZ2V0UlBEU25hcHNob3RDb250cmFjdEJhbGFuY2VLZXkAAAACAAAABWNvdW50AAAAB2Fzc2V0SWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgUAAAANUlBEQmFsYW5jZUtleQIAAAABXwkAAlgAAAABBQAAAAdhc3NldElkAgAAAAFfCQABpAAAAAEFAAAABWNvdW50AQAAAB1nZXRDYW5jZWxMZWFzZVR4UmVzZXJ2ZUZlZUtleQAAAAEAAAAEaGFzaAkAASwAAAACCQABLAAAAAICAAAAG2NhbmNlbF9sZWFzZV90eF9yZXNlcnZlX2ZlZQIAAAABXwUAAAAEaGFzaAEAAAAaZ2V0QWNjb3VudExvY2tlZEJhbGFuY2VLZXkAAAACAAAABW93bmVyAAAAB2Fzc2V0SWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACGJhbGFuY2VfBQAAAAdhc3NldElkAgAAAAFfBQAAAAVvd25lcgEAAAAYZ2V0QmFsYW5jZVVubG9ja0Jsb2NrS2V5AAAAAQAAAAVvd25lcgkAASwAAAACAgAAAA5iYWxhbmNlX2Jsb2NrXwUAAAAFb3duZXIBAAAAD2dldFJQRFByb2ZpdEtleQAAAAEAAAAFY291bnQJAAEsAAAAAgkAASwAAAACAgAAAApycGRfcHJvZml0AgAAAAFfCQABpAAAAAEFAAAABWNvdW50AQAAABNnZXRMb2NrZWRCYWxhbmNlS2V5AAAAAQAAAAdhc3NldElkCQABLAAAAAICAAAACGJhbGFuY2VfBQAAAAdhc3NldElkAQAAABNnZXRMZWFzZVR4U3RhdHVzS2V5AAAAAQAAAARoYXNoCQABLAAAAAIJAAEsAAAAAgIAAAAPbGVhc2VfdHhfc3RhdHVzAgAAAAFfBQAAAARoYXNoAQAAABlnZXRMZWFzZVR4QW1vdW50QnlIYXNoS2V5AAAAAQAAAARoYXNoCQABLAAAAAIJAAEsAAAAAgUAAAAQTGVhc2luZ0Ftb3VudEtleQIAAAABXwUAAAAEaGFzaAEAAAAYZ2V0TGVhc2VUeEJ5dGVzQnlIYXNoS2V5AAAAAQAAAARoYXNoCQABLAAAAAIJAAEsAAAAAgIAAAAIbGVhc2VfdHgCAAAAAV8FAAAABGhhc2gBAAAAHGdldExlYXNlVHhFeHBpcmVTZW5kQmxvY2tLZXkAAAABAAAABGhhc2gJAAEsAAAAAgkAASwAAAACAgAAABNsZWFzaW5nX2V4cGlyZV9zZW5kAgAAAAFfBQAAAARoYXNoAQAAABZjb252ZXJ0TmV1dHJpbm9Ub1dhdmVzAAAAAgAAAAZhbW91bnQAAAAFcHJpY2UJAABpAAAAAgkAAGgAAAACCQAAaQAAAAIJAABoAAAAAgUAAAAGYW1vdW50AAAAAAAAAABkBQAAAAVwcmljZQUAAAAHV0FWRUxFVAUAAAAFUEFVTEkBAAAAFmNvbnZlcnRXYXZlc1RvTmV1dHJpbm8AAAACAAAABmFtb3VudAAAAAVwcmljZQkAAGkAAAACCQAAaAAAAAIJAABpAAAAAgkAAGgAAAACBQAAAAZhbW91bnQFAAAABXByaWNlAAAAAAAAAABkBQAAAAVQQVVMSQUAAAAHV0FWRUxFVAEAAAAVY29udmVydE5ldXRyaW5vVG9Cb25kAAAAAQAAAAZhbW91bnQJAABpAAAAAgUAAAAGYW1vdW50BQAAAAVQQVVMSQEAAAAVY29udmVydEJvbmRUb05ldXRyaW5vAAAAAQAAAAZhbW91bnQJAABoAAAAAgUAAAAGYW1vdW50BQAAAAVQQVVMSQEAAAASY29udmVydFdhdmVzVG9Cb25kAAAAAgAAAAZhbW91bnQAAAAFcHJpY2UJAQAAABVjb252ZXJ0TmV1dHJpbm9Ub0JvbmQAAAABCQEAAAAWY29udmVydFdhdmVzVG9OZXV0cmlubwAAAAIFAAAABmFtb3VudAUAAAAFcHJpY2UBAAAAEGdldExvY2tlZEJhbGFuY2UAAAABAAAAB2Fzc2V0SWQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABNnZXRMb2NrZWRCYWxhbmNlS2V5AAAAAQUAAAAHYXNzZXRJZAAAAAATbGlxdWlkYXRpb25Db250cmFjdAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAAWTGlxdWlkYXRpb25Db250cmFjdEtleQAAAAAVbmV1dHJpbm9Bc3NldElkU3RyaW5nCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABBQAAABJOZXV0cmlub0Fzc2V0SWRLZXkAAAAAD25ldXRyaW5vQXNzZXRJZAkAAlkAAAABBQAAABVuZXV0cmlub0Fzc2V0SWRTdHJpbmcAAAAAD3Jlc2VydmVDb250cmFjdAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAASUmVzZXJ2ZUNvbnRyYWN0S2V5AAAAAA9hdWN0aW9uQ29udHJhY3QJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAAEkF1Y3Rpb25Db250cmFjdEtleQAAAAALcnBkQ29udHJhY3QJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAADlJQRENvbnRyYWN0S2V5AAAAAA9jb250cm9sQ29udHJhY3QJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAAEUNvbnRvbENvbnRyYWN0S2V5AAAAAAxjdXJyZW50UHJpY2UJAQAAABhnZXROdW1iZXJCeUFkZHJlc3NBbmRLZXkAAAACBQAAAA9jb250cm9sQ29udHJhY3QFAAAACFByaWNlS2V5AAAAAApwcmljZUluZGV4CQEAAAAYZ2V0TnVtYmVyQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAPY29udHJvbENvbnRyYWN0BQAAAA1QcmljZUluZGV4S2V5AAAAAAlpc0Jsb2NrZWQJAQAAABZnZXRCb29sQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAPY29udHJvbENvbnRyYWN0BQAAAAxJc0Jsb2NrZWRLZXkAAAAADmxlYXNpbmdUeENvdW50CQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABBQAAABFMZWFzaW5nVHhDb3VudEtleQAAAAALaXNSZWJhbGFuY2UJAQAAAAxnZXRCb29sQnlLZXkAAAABBQAAAA5Jc1JlYmFsYW5jZUtleQAAAAAPbGVhc2luZ0ludGVydmFsCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABBQAAABJMZWFzaW5nSW50ZXJ2YWxLZXkAAAAAEmxlYXNpbmdFeHBpcmVCbG9jawkBAAAADmdldE51bWJlckJ5S2V5AAAAAQUAAAAVTGVhc2luZ0V4cGlyZUJsb2NrS2V5AAAAAA1sZWFzaW5nQW1vdW50CQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABBQAAABBMZWFzaW5nQW1vdW50S2V5AAAAAAtub2RlQWRkcmVzcwkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAAOTm9kZUFkZHJlc3NLZXkAAAAAFW5vZGVPcmFjbGVQcm92aWRlcktleQkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAAVTm9kZU9yYWNsZVByb3ZpZGVyS2V5AAAAAAxycGRTeW5jSW5kZXgJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEFAAAAD1JQRFN5bmNJbmRleEtleQAAAAATYmFsYW5jZUxvY2tJbnRlcnZhbAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQUAAAAWQmFsYW5jZUxvY2tJbnRlcnZhbEtleQAAAAASbWluV2F2ZXNTd2FwQW1vdW50CQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABBQAAABVNaW5XYXZlc1N3YXBBbW91bnRLZXkAAAAAFW1pbk5ldXRyaW5vU3dhcEFtb3VudAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQUAAAAYTWluTmV1dHJpbm9Td2FwQW1vdW50S2V5AAAAAAdyZXNlcnZlCQAAZQAAAAIJAQAAAAx3YXZlc0JhbGFuY2UAAAABBQAAAAR0aGlzCQEAAAAQZ2V0TG9ja2VkQmFsYW5jZQAAAAEFAAAADFdBVkVTQVNTRVRJRAAAAAAVcmVzZXJ2ZVdpdGhvdXRMZWFzaW5nCQAAZQAAAAIFAAAAB3Jlc2VydmUFAAAADWxlYXNpbmdBbW91bnQAAAAAC2JvbmRBc3NldElkCQACWQAAAAEJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAADkJvbmRBc3NldElkS2V5AAAAAApib25kU3VwcGx5CQAAZQAAAAIICQEAAAAHZXh0cmFjdAAAAAEJAAPsAAAAAQUAAAALYm9uZEFzc2V0SWQAAAAIcXVhbnRpdHkJAAPrAAAAAgUAAAAEdGhpcwUAAAALYm9uZEFzc2V0SWQAAAAADm5ldXRyaW5vU3VwcGx5CQAAZAAAAAIJAABlAAAAAggJAQAAAAdleHRyYWN0AAAAAQkAA+wAAAABBQAAAA9uZXV0cmlub0Fzc2V0SWQAAAAIcXVhbnRpdHkJAAPrAAAAAgUAAAAEdGhpcwUAAAAPbmV1dHJpbm9Bc3NldElkCQEAAAAQZ2V0TG9ja2VkQmFsYW5jZQAAAAEFAAAAFW5ldXRyaW5vQXNzZXRJZFN0cmluZwAAAAAHc3VycGx1cwkAAGUAAAACCQEAAAAWY29udmVydFdhdmVzVG9OZXV0cmlubwAAAAIFAAAAB3Jlc2VydmUFAAAADGN1cnJlbnRQcmljZQUAAAAObmV1dHJpbm9TdXBwbHkAAAAAB2RlZmljaXQJAABlAAAAAgUAAAAObmV1dHJpbm9TdXBwbHkJAQAAABZjb252ZXJ0V2F2ZXNUb05ldXRyaW5vAAAAAgUAAAAHcmVzZXJ2ZQUAAAAMY3VycmVudFByaWNlAQAAABVnZXRSUERDb250cmFjdEJhbGFuY2UAAAABAAAAB2Fzc2V0SWQJAQAAABhnZXROdW1iZXJCeUFkZHJlc3NBbmRLZXkAAAACBQAAAAtycGRDb250cmFjdAkBAAAAGGdldFJQRENvbnRyYWN0QmFsYW5jZUtleQAAAAEFAAAAB2Fzc2V0SWQBAAAAD2dldFByaWNlSGlzdG9yeQAAAAEAAAAFYmxvY2sJAQAAABhnZXROdW1iZXJCeUFkZHJlc3NBbmRLZXkAAAACBQAAAA9jb250cm9sQ29udHJhY3QJAQAAABJnZXRQcmljZUhpc3RvcnlLZXkAAAABBQAAAAVibG9jawEAAAAVZ2V0SGVpZ2h0UHJpY2VCeUluZGV4AAAAAQAAAAVpbmRleAkBAAAAGGdldE51bWJlckJ5QWRkcmVzc0FuZEtleQAAAAIFAAAAD2NvbnRyb2xDb250cmFjdAkBAAAAGGdldEhlaWdodFByaWNlQnlJbmRleEtleQAAAAEFAAAABWluZGV4AQAAABpnZXRDYW5jZWxMZWFzZVR4UmVzZXJ2ZUZlZQAAAAEAAAAEaGFzaAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAHWdldENhbmNlbExlYXNlVHhSZXNlcnZlRmVlS2V5AAAAAQUAAAAEaGFzaAEAAAAXZ2V0QWNjb3VudExvY2tlZEJhbGFuY2UAAAACAAAABW93bmVyAAAAB2Fzc2V0SWQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABpnZXRBY2NvdW50TG9ja2VkQmFsYW5jZUtleQAAAAIFAAAABW93bmVyBQAAAAdhc3NldElkAQAAABVnZXRVbmxvY2tCYWxhbmNlQmxvY2sAAAABAAAABW93bmVyCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAYZ2V0QmFsYW5jZVVubG9ja0Jsb2NrS2V5AAAAAQUAAAAFb3duZXIBAAAADGdldFJQRFByb2ZpdAAAAAEAAAAFY291bnQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAAA9nZXRSUERQcm9maXRLZXkAAAABBQAAAAVjb3VudAEAAAAQZ2V0TGVhc2VUeFN0YXR1cwAAAAEAAAAEaGFzaAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAE2dldExlYXNlVHhTdGF0dXNLZXkAAAABBQAAAARoYXNoAQAAABZnZXRMZWFzZVR4QW1vdW50QnlIYXNoAAAAAQAAAARoYXNoCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAZZ2V0TGVhc2VUeEFtb3VudEJ5SGFzaEtleQAAAAEFAAAABGhhc2gBAAAAFWdldExlYXNlVHhCeXRlc0J5SGFzaAAAAAEAAAAEaGFzaAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAGGdldExlYXNlVHhCeXRlc0J5SGFzaEtleQAAAAEFAAAABGhhc2gBAAAAGWdldExlYXNlVHhFeHBpcmVTZW5kQmxvY2sAAAABAAAABGhhc2gJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABxnZXRMZWFzZVR4RXhwaXJlU2VuZEJsb2NrS2V5AAAAAQUAAAAEaGFzaAAAAAkAAAABaQEAAAATc3dhcFdhdmVzVG9OZXV0cmlubwAAAAAEAAAAA3BtdAkBAAAAB2V4dHJhY3QAAAABCAUAAAABaQAAAAdwYXltZW50BAAAAAdhY2NvdW50CQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgMJAABmAAAAAgUAAAASbWluV2F2ZXNTd2FwQW1vdW50CAUAAAADcG10AAAABmFtb3VudAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAtYW4gYW1vdW50IGlzIGxlc3MgdGhhbiBtaW4gYXZhaWxhYmxlIGFtb3VudDogCQABpAAAAAEFAAAAEm1pbldhdmVzU3dhcEFtb3VudAIAAAAJIHdhdmVsZXRzAwkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAANwbXQAAAAHYXNzZXRJZAkAAAIAAAABAgAAABJjYW4gdXNlIHdhdmVzIG9ubHkDBQAAAAlpc0Jsb2NrZWQJAAACAAAAAQIAAABaY29udHJhY3QgaXMgYmxvY2tlZCBieSBFTUVSR0VOQ1kgU0hVVERPV04gYWN0aW9ucyB1bnRpbGwgcmVhY3RpdmF0aW9uIGJ5IGVtZXJnZW5jeSBvcmFjbGVzAwkAAGYAAAACCQEAAAAVZ2V0VW5sb2NrQmFsYW5jZUJsb2NrAAAAAQUAAAAHYWNjb3VudAUAAAAGaGVpZ2h0CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAAAZhd2FpdCAJAAGkAAAAAQkAAGUAAAACCQEAAAAVZ2V0VW5sb2NrQmFsYW5jZUJsb2NrAAAAAQUAAAAHYWNjb3VudAUAAAAGaGVpZ2h0AgAAAAcgYmxvY2tzAwkBAAAAAiE9AAAAAgkBAAAAF2dldEFjY291bnRMb2NrZWRCYWxhbmNlAAAAAgUAAAAHYWNjb3VudAUAAAAMV0FWRVNBU1NFVElEAAAAAAAAAAAACQAAAgAAAAECAAAAInBsZWFzZSB3aXRoZHJhdyBsb2NrZWQgZnVuZHMgZmlyc3QJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABpnZXRBY2NvdW50TG9ja2VkQmFsYW5jZUtleQAAAAIFAAAAB2FjY291bnQFAAAADFdBVkVTQVNTRVRJRAgFAAAAA3BtdAAAAAZhbW91bnQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABhnZXRCYWxhbmNlVW5sb2NrQmxvY2tLZXkAAAABBQAAAAdhY2NvdW50CQAAZAAAAAIFAAAABmhlaWdodAUAAAATYmFsYW5jZUxvY2tJbnRlcnZhbAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAE2dldExvY2tlZEJhbGFuY2VLZXkAAAABBQAAAAxXQVZFU0FTU0VUSUQJAABkAAAAAgkBAAAAEGdldExvY2tlZEJhbGFuY2UAAAABBQAAAAxXQVZFU0FTU0VUSUQIBQAAAANwbXQAAAAGYW1vdW50BQAAAANuaWwAAAABaQEAAAATc3dhcE5ldXRyaW5vVG9XYXZlcwAAAAAEAAAAA3BtdAkBAAAAB2V4dHJhY3QAAAABCAUAAAABaQAAAAdwYXltZW50BAAAAAdhY2NvdW50CQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgMJAABmAAAAAgUAAAAVbWluTmV1dHJpbm9Td2FwQW1vdW50CAUAAAADcG10AAAABmFtb3VudAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAtYW4gYW1vdW50IGlzIGxlc3MgdGhhbiBtaW4gYXZhaWxhYmxlIGFtb3VudDogCQABpAAAAAEFAAAAFW1pbk5ldXRyaW5vU3dhcEFtb3VudAIAAAAPIG5ldXRyaW5vIGNlbnRzAwUAAAAJaXNCbG9ja2VkCQAAAgAAAAECAAAAWmNvbnRyYWN0IGlzIGJsb2NrZWQgYnkgRU1FUkdFTkNZIFNIVVRET1dOIGFjdGlvbnMgdW50aWxsIHJlYWN0aXZhdGlvbiBieSBlbWVyZ2VuY3kgb3JhY2xlcwMJAQAAAAIhPQAAAAIIBQAAAANwbXQAAAAHYXNzZXRJZAUAAAAPbmV1dHJpbm9Bc3NldElkCQAAAgAAAAECAAAAKGNhbiB1c2UgYXBwcm9wcmlhdGUgbmV1dHJpbm8gdG9rZW5zIG9ubHkDCQAAZgAAAAIJAQAAABVnZXRVbmxvY2tCYWxhbmNlQmxvY2sAAAABBQAAAAdhY2NvdW50BQAAAAZoZWlnaHQJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAABmF3YWl0IAkAAaQAAAABCQAAZQAAAAIJAQAAABVnZXRVbmxvY2tCYWxhbmNlQmxvY2sAAAABBQAAAAdhY2NvdW50BQAAAAZoZWlnaHQCAAAAByBibG9ja3MDCQEAAAACIT0AAAACCQEAAAAXZ2V0QWNjb3VudExvY2tlZEJhbGFuY2UAAAACBQAAAAdhY2NvdW50BQAAABVuZXV0cmlub0Fzc2V0SWRTdHJpbmcAAAAAAAAAAAAJAAACAAAAAQIAAAAicGxlYXNlIHdpdGhkcmF3IGxvY2tlZCBmdW5kcyBmaXJzdAQAAAAQbmV3TG9ja2VkQmFsYW5jZQkAAGQAAAACCQEAAAAQZ2V0TG9ja2VkQmFsYW5jZQAAAAEFAAAAFW5ldXRyaW5vQXNzZXRJZFN0cmluZwgFAAAAA3BtdAAAAAZhbW91bnQJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABpnZXRBY2NvdW50TG9ja2VkQmFsYW5jZUtleQAAAAIFAAAAB2FjY291bnQFAAAAFW5ldXRyaW5vQXNzZXRJZFN0cmluZwgFAAAAA3BtdAAAAAZhbW91bnQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABhnZXRCYWxhbmNlVW5sb2NrQmxvY2tLZXkAAAABBQAAAAdhY2NvdW50CQAAZAAAAAIFAAAABmhlaWdodAUAAAATYmFsYW5jZUxvY2tJbnRlcnZhbAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAE2dldExvY2tlZEJhbGFuY2VLZXkAAAABBQAAABVuZXV0cmlub0Fzc2V0SWRTdHJpbmcFAAAAEG5ld0xvY2tlZEJhbGFuY2UJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAADklzUmViYWxhbmNlS2V5AwkAAGcAAAACBQAAABVyZXNlcnZlV2l0aG91dExlYXNpbmcJAQAAABZjb252ZXJ0TmV1dHJpbm9Ub1dhdmVzAAAAAgUAAAAQbmV3TG9ja2VkQmFsYW5jZQUAAAAMY3VycmVudFByaWNlBwYFAAAAA25pbAAAAAFpAQAAAAh3aXRoZHJhdwAAAAMAAAAHYWNjb3VudAAAAAVpbmRleAAAAA1sb2NrZWRBc3NldElkBAAAAAx1bmxvY2tIZWlnaHQJAQAAABVnZXRVbmxvY2tCYWxhbmNlQmxvY2sAAAABBQAAAAdhY2NvdW50BAAAAA1sb2NrZWRCYWxhbmNlCQEAAAAXZ2V0QWNjb3VudExvY2tlZEJhbGFuY2UAAAACBQAAAAdhY2NvdW50BQAAAA1sb2NrZWRBc3NldElkBAAAAAtpbmRleEhlaWdodAkBAAAAFWdldEhlaWdodFByaWNlQnlJbmRleAAAAAEFAAAABWluZGV4BAAAAA9uZXh0SW5kZXhIZWlnaHQJAQAAABVnZXRIZWlnaHRQcmljZUJ5SW5kZXgAAAABCQAAZAAAAAIFAAAABWluZGV4AAAAAAAAAAABBAAAAAxwcmljZUJ5SW5kZXgJAQAAAA9nZXRQcmljZUhpc3RvcnkAAAABBQAAAAtpbmRleEhlaWdodAQAAAAGYW1vdW50AwkAAAAAAAACBQAAAA1sb2NrZWRBc3NldElkBQAAABVuZXV0cmlub0Fzc2V0SWRTdHJpbmcJAQAAABZjb252ZXJ0TmV1dHJpbm9Ub1dhdmVzAAAAAgUAAAANbG9ja2VkQmFsYW5jZQUAAAAMcHJpY2VCeUluZGV4CQEAAAAWY29udmVydFdhdmVzVG9OZXV0cmlubwAAAAIFAAAADWxvY2tlZEJhbGFuY2UFAAAADHByaWNlQnlJbmRleAMFAAAACWlzQmxvY2tlZAkAAAIAAAABAgAAAFpjb250cmFjdCBpcyBibG9ja2VkIGJ5IEVNRVJHRU5DWSBTSFVURE9XTiBhY3Rpb25zIHVudGlsbCByZWFjdGl2YXRpb24gYnkgZW1lcmdlbmN5IG9yYWNsZXMDCQAAZwAAAAIAAAAAAAAAAAAFAAAABmFtb3VudAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAVYmFsYW5jZSBlcXVhbHMgemVybyAoBQAAAA1sb2NrZWRBc3NldElkAgAAAAEpAwkAAGYAAAACBQAAAAx1bmxvY2tIZWlnaHQFAAAABmhlaWdodAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAARcGxlYXNlIHdhaXQgZm9yOiAJAAGkAAAAAQUAAAAMdW5sb2NrSGVpZ2h0AgAAACUgYmxvY2sgaGVpZ2h0IHRvIHdpdGhkcmF3IFdBVkVTIGZ1bmRzAwMDCQAAZgAAAAIFAAAABWluZGV4BQAAAApwcmljZUluZGV4BgkAAGYAAAACBQAAAAtpbmRleEhlaWdodAUAAAAMdW5sb2NrSGVpZ2h0BgMJAQAAAAIhPQAAAAIFAAAAD25leHRJbmRleEhlaWdodAAAAAAAAAAAAAkAAGcAAAACBQAAAAx1bmxvY2tIZWlnaHQFAAAAD25leHRJbmRleEhlaWdodAcJAAACAAAAAQIAAAAbaW52YWxpZCBwcmljZSBoaXN0b3J5IGluZGV4CQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAGmdldEFjY291bnRMb2NrZWRCYWxhbmNlS2V5AAAAAgUAAAAHYWNjb3VudAUAAAANbG9ja2VkQXNzZXRJZAAAAAAAAAAAAAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAE2dldExvY2tlZEJhbGFuY2VLZXkAAAABBQAAAA1sb2NrZWRBc3NldElkCQAAZQAAAAIJAQAAABBnZXRMb2NrZWRCYWxhbmNlAAAAAQUAAAANbG9ja2VkQXNzZXRJZAUAAAANbG9ja2VkQmFsYW5jZQUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQUAAAAHYWNjb3VudAUAAAAGYW1vdW50AwkAAAAAAAACBQAAAA1sb2NrZWRBc3NldElkBQAAABVuZXV0cmlub0Fzc2V0SWRTdHJpbmcFAAAABHVuaXQFAAAAD25ldXRyaW5vQXNzZXRJZAUAAAADbmlsAAAAAWkBAAAAEXRyYW5zZmVyVG9BdWN0aW9uAAAAAAQAAAARZGVmaWNpdEJvbmRBbW91bnQJAABlAAAAAgkBAAAAFWNvbnZlcnROZXV0cmlub1RvQm9uZAAAAAEFAAAAB2RlZmljaXQJAAPrAAAAAgkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABBQAAAA9hdWN0aW9uQ29udHJhY3QFAAAAC2JvbmRBc3NldElkBAAAAAtzdXJwbHVzQm9uZAkAAGUAAAACCQEAAAAVY29udmVydE5ldXRyaW5vVG9Cb25kAAAAAQUAAAAHc3VycGx1cwkAA+sAAAACCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEFAAAAD2F1Y3Rpb25Db250cmFjdAUAAAAPbmV1dHJpbm9Bc3NldElkAwUAAAAJaXNCbG9ja2VkCQAAAgAAAAECAAAAWmNvbnRyYWN0IGlzIGJsb2NrZWQgYnkgRU1FUkdFTkNZIFNIVVRET1dOIGFjdGlvbnMgdW50aWxsIHJlYWN0aXZhdGlvbiBieSBlbWVyZ2VuY3kgb3JhY2xlcwMJAABnAAAAAgUAAAARZGVmaWNpdEJvbmRBbW91bnQJAABpAAAAAgkAAGgAAAACCQEAAAAVY29udmVydE5ldXRyaW5vVG9Cb25kAAAAAQUAAAAObmV1dHJpbm9TdXBwbHkFAAAADURFRklDSVRPRkZTRVQAAAAAAAAAAGQJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABBQAAAA9hdWN0aW9uQ29udHJhY3QFAAAAEWRlZmljaXRCb25kQW1vdW50BQAAAAtib25kQXNzZXRJZAUAAAADbmlsAwkAAGYAAAACBQAAAAtzdXJwbHVzQm9uZAAAAAAAAAAAAAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEFAAAAE2xpcXVpZGF0aW9uQ29udHJhY3QJAQAAABVjb252ZXJ0Qm9uZFRvTmV1dHJpbm8AAAABBQAAAAtzdXJwbHVzQm9uZAUAAAAPbmV1dHJpbm9Bc3NldElkBQAAAANuaWwJAAACAAAAAQIAAAAlYm9uZCB3ZXJlIGdlbmVyYXRlZCBvciBkbyBub3QgbmVlZCBpdAAAAAFpAQAAAAh0cmFuc2ZlcgAAAAEAAAAHYWNjb3VudAQAAAADcG10CQEAAAAHZXh0cmFjdAAAAAEIBQAAAAFpAAAAB3BheW1lbnQJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABBQAAAAdhY2NvdW50CAUAAAADcG10AAAABmFtb3VudAgFAAAAA3BtdAAAAAdhc3NldElkBQAAAANuaWwAAAABaQEAAAAKbm9kZVJld2FyZAAAAAAEAAAAA3BtdAkBAAAABXZhbHVlAAAAAQgFAAAAAWkAAAAHcGF5bWVudAMJAQAAAAIhPQAAAAIIBQAAAAFpAAAABmNhbGxlcgkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABBQAAAAtub2RlQWRkcmVzcwkAAAIAAAABAgAAAEdvbmx5IG5vZGUgYWNjb3VudCBpcyBhYmxlIHRvIHRyYW5zZmVyIHN0YWtpbmcgcmV3YXJkcyBmcm9tIG1haW4gYWNjb3VudAMJAQAAAAlpc0RlZmluZWQAAAABCAUAAAADcG10AAAAB2Fzc2V0SWQJAAACAAAAAQIAAAAZd2F2ZXMgdG9rZW5zIG9ubHkgYWxsb3dlZAQAAAAGYW1vdW50CQEAAAAWY29udmVydFdhdmVzVG9OZXV0cmlubwAAAAIIBQAAAANwbXQAAAAGYW1vdW50BQAAAAxjdXJyZW50UHJpY2UEAAAAD25ld1JwZFN5bmNJbmRleAkAAGQAAAACBQAAAAxycGRTeW5jSW5kZXgAAAAAAAAAAAEJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAA9SUERTeW5jSW5kZXhLZXkFAAAAD25ld1JwZFN5bmNJbmRleAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAD2dldFJQRFByb2ZpdEtleQAAAAEFAAAADHJwZFN5bmNJbmRleAUAAAAGYW1vdW50CQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAgZ2V0UlBEU25hcHNob3RDb250cmFjdEJhbGFuY2VLZXkAAAACBQAAAAxycGRTeW5jSW5kZXgFAAAAD25ldXRyaW5vQXNzZXRJZAkBAAAAFWdldFJQRENvbnRyYWN0QmFsYW5jZQAAAAEFAAAAD25ldXRyaW5vQXNzZXRJZAUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQUAAAALcnBkQ29udHJhY3QFAAAABmFtb3VudAUAAAAPbmV1dHJpbm9Bc3NldElkBQAAAANuaWwAAAABaQEAAAATcmVnaXN0cmF0aW9uTGVhc2VUeAAAAAQAAAAPc2VuZGVyUHVibGljS2V5AAAAA2ZlZQAAAAl0aW1lc3RhbXAAAAALbGVhc2VUeEhhc2gEAAAAEHRvdGFsRnJlZVJlc2VydmUJAABlAAAAAgkAAGkAAAACCQAAaAAAAAIFAAAAB3Jlc2VydmUFAAAADExFQVNJTkdTSEFSRQAAAAAAAAAAZAkBAAAAFmNvbnZlcnROZXV0cmlub1RvV2F2ZXMAAAACCQEAAAAQZ2V0TG9ja2VkQmFsYW5jZQAAAAEFAAAAFW5ldXRyaW5vQXNzZXRJZFN0cmluZwUAAAAMY3VycmVudFByaWNlBAAAAAZhbW91bnQJAABpAAAAAgUAAAAQdG90YWxGcmVlUmVzZXJ2ZQUAAAANTEVBU0lO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YUVudHJ5AAAAAgUAAAAQTGVhc2luZ0Ftb3VudEtleQkAAGQAAAACBQAAAA1sZWFzaW5nQW1vdW50BQAAAAZhbW91bnQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAFUxlYXNpbmdFeHBpcmVCbG9ja0tleQMJAABmAAAAAgUAAAAGaGVpZ2h0BQAAABJsZWFzaW5nRXhwaXJlQmxvY2sJAABkAAAAAgUAAAAGaGVpZ2h0BQAAAA9sZWFzaW5nSW50ZXJ2YWwFAAAAEmxlYXNpbmdFeHBpcmVCbG9jawkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAE2dldExlYXNlVHhTdGF0dXNLZXkAAAABBQAAAAZ0eEhhc2gFAAAAA05FVwkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAHGdldExlYXNlVHhFeHBpcmVTZW5kQmxvY2tLZXkAAAABBQAAAAZ0eEhhc2gJAABkAAAAAgUAAAAGaGVpZ2h0BQAAAAxTRU5EVFhFWFBJUkUJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABlnZXRMZWFzZVR4QW1vdW50QnlIYXNoS2V5AAAAAQUAAAAGdHhIYXNoBQAAAAZhbW91bnQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABhnZXRMZWFzZVR4Qnl0ZXNCeUhhc2hLZXkAAAABBQAAAAZ0eEhhc2gJAAJaAAAAAQUAAAAHdHhCeXRlcwUAAAADbmlsAAAAAWkBAAAAEmNhbmNlbFN0dWNrTGVhc2VUeAAAAAEAAAAGdHhIYXNoAwMDCQAAAAAAAAIJAQAAABBnZXRMZWFzZVR4U3RhdHVzAAAAAQUAAAAGdHhIYXNoBQAAAANORVcJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEJAAPpAAAAAQkAAlkAAAABBQAAAAZ0eEhhc2gHCQAAZgAAAAIFAAAABmhlaWdodAkBAAAAGWdldExlYXNlVHhFeHBpcmVTZW5kQmxvY2sAAAABBQAAAAZ0eEhhc2gHBAAAAAZhbW91bnQJAQAAABZnZXRMZWFzZVR4QW1vdW50QnlIYXNoAAAAAQUAAAAGdHhIYXNoCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAABFMZWFzaW5nVHhDb3VudEtleQkAAGUAAAACBQAAAA5sZWFzaW5nVHhDb3VudAAAAAAAAAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAQTGVhc2luZ0Ftb3VudEtleQkAAGUAAAACBQAAAA1sZWFzaW5nQW1vdW50BQAAAAZhbW91bnQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABNnZXRMZWFzZVR4U3RhdHVzS2V5AAAAAQUAAAAGdHhIYXNoBQAAAAhDQU5DRUxFRAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAOSXNSZWJhbGFuY2VLZXkDCQAAZwAAAAIJAABlAAAAAgUAAAAVcmVzZXJ2ZVdpdGhvdXRMZWFzaW5nBQAAAAZhbW91bnQJAQAAABZjb252ZXJ0TmV1dHJpbm9Ub1dhdmVzAAAAAgkBAAAAEGdldExvY2tlZEJhbGFuY2UAAAABBQAAABVuZXV0cmlub0Fzc2V0SWRTdHJpbmcFAAAADGN1cnJlbnRQcmljZQcGBQAAAANuaWwJAAACAAAAAQIAAAAPaW52YWxpZCB0eCBoYXNoAAAAAWkBAAAAFXJlZ2lzdHJhdGlvblVubGVhc2VUeAAAAAUAAAANY2hhaW5JZFN0cmluZwAAAA9zZW5kZXJQdWJsaWNLZXkAAAADZmVlAAAACXRpbWVzdGFtcAAAAAtsZWFzZVR4SGFzaAQAAAAHdHhCeXRlcwkAAMsAAAACCQAAywAAAAIJAADLAAAAAgkAAMsAAAACCQAAywAAAAIBAAAAAgkCCQABmwAAAAEFAAAADWNoYWluSWRTdHJpbmcJAAJZAAAAAQUAAAAPc2VuZGVyUHVibGljS2V5CQABmgAAAAEFAAAAA2ZlZQkAAZoAAAABBQAAAAl0aW1lc3RhbXAJAAJZAAAAAQUAAAALbGVhc2VUeEhhc2gEAAAABnR4SGFzaAkAAfYAAAABBQAAAAd0eEJ5dGVzAwkBAAAAAiE9AAAAAgkBAAAAEGdldExlYXNlVHhTdGF0dXMAAAABBQAAAAtsZWFzZVR4SGFzaAUAAAADTkVXCQAAAgAAAAECAAAAEWludmFsaWQgdHggc3RhdHVzAwkBAAAAAiE9AAAAAgUAAAAEdGhpcwkBAAAAFGFkZHJlc3NGcm9tUHVibGljS2V5AAAAAQkAAlkAAAABBQAAAA9zZW5kZXJQdWJsaWNLZXkJAAACAAAAAQIAAAAOaW52YWxpZCBwdWJLZXkDCQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABCQAD6QAAAAEFAAAABnR4SGFzaAkAAAIAAAABAgAAACxibG9ja2NoYWluIGRvZXMgbm90IGNvbnRhaW4gdGhpcyB0cmFuc2FjdGlvbgQAAAAGYW1vdW50CQEAAAAWZ2V0TGVhc2VUeEFtb3VudEJ5SGFzaAAAAAEFAAAAC2xlYXNlVHhIYXNoCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAABFMZWFzaW5nVHhDb3VudEtleQkAAGUAAAACBQAAAA5sZWFzaW5nVHhDb3VudAAAAAAAAAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAQTGVhc2luZ0Ftb3VudEtleQkAAGUAAAACBQAAAA1sZWFzaW5nQW1vdW50BQAAAAZhbW91bnQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABNnZXRMZWFzZVR4U3RhdHVzS2V5AAAAAQUAAAALbGVhc2VUeEhhc2gFAAAACENBTkNFTEVECQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAA5Jc1JlYmFsYW5jZUtleQMJAABnAAAAAgkAAGUAAAACBQAAABVyZXNlcnZlV2l0aG91dExlYXNpbmcFAAAABmFtb3VudAkBAAAAFmNvbnZlcnROZXV0cmlub1RvV2F2ZXMAAAACCQEAAAAQZ2V0TG9ja2VkQmFsYW5jZQAAAAEFAAAAFW5ldXRyaW5vQXNzZXRJZFN0cmluZwUAAAAMY3VycmVudFByaWNlBwYFAAAAA25pbAAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAAEAAAAAmlkCQACWAAAAAEIBQAAAAJ0eAAAAAJpZAQAAAAHJG1hdGNoMAUAAAACdHgDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAEExlYXNlVHJhbnNhY3Rpb24EAAAAB2xlYXNlVHgFAAAAByRtYXRjaDADAwkAAGcAAAACBQAAABJsZWFzaW5nRXhwaXJlQmxvY2sFAAAABmhlaWdodAkAAGcAAAACCQEAAAAZZ2V0TGVhc2VUeEV4cGlyZVNlbmRCbG9jawAAAAEFAAAAAmlkBQAAAAZoZWlnaHQHCQAAAAAAAAIJAQAAABBnZXRMZWFzZVR4U3RhdHVzAAAAAQUAAAACaWQFAAAAA05FVwcDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAFkxlYXNlQ2FuY2VsVHJhbnNhY3Rpb24EAAAACXVubGVhc2VUeAUAAAAHJG1hdGNoMAQAAAAHbGVhc2VJZAkAAlgAAAABCAUAAAAJdW5sZWFzZVR4AAAAB2xlYXNlSWQDAwMJAABmAAAAAgUAAAAGaGVpZ2h0BQAAABJsZWFzaW5nRXhwaXJlQmxvY2sGBQAAAAtpc1JlYmFsYW5jZQkAAAAAAAACCAUAAAAJdW5sZWFzZVR4AAAAA2ZlZQkBAAAAGmdldENhbmNlbExlYXNlVHhSZXNlcnZlRmVlAAAAAQUAAAAHbGVhc2VJZAcJAAAAAAAAAgkBAAAAEGdldExlYXNlVHhTdGF0dXMAAAABBQAAAAdsZWFzZUlkBQAAAANORVcHCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAgFAAAAAnR4AAAAD3NlbmRlclB1YmxpY0tleRYTJkg=", "chainId": 84, "height": 770716, "spentComplexity": 0 } View: original | compacted Prev: 58WAMj2f6x9KH3G2YpFkzmBBSzkRX3ciBz66VBz5eiJU Next: Ak6Sw71rxMuS9tCgNnvEvpTEsAgwyvfvk99iYHHgFP1q 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
6262 let CRYTICALSHARE = 20
6363
6464 let LEASINGSHARE = 90
6565
6666 let LEASINTXCOUNT = 10
6767
6868 let DEFICITOFFSET = 10
6969
7070 let WAVESASSETID = "waves"
7171
7272 let CANCELED = "canceled"
7373
7474 let NEW = "new"
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
8484 let LiquidationContractKey = "liquidation_contract"
8585
8686 let RPDContractKey = "rpd_contract"
8787
8888 let ContolContractKey = "control_contract"
8989
9090 let BalanceLockIntervalKey = "balance_lock_interval"
9191
9292 let MinWavesSwapAmountKey = "min_waves_swap_amount"
9393
9494 let MinNeutrinoSwapAmountKey = "min_neutrino_swap_amount"
9595
9696 let NodeAddressKey = "node_address"
9797
9898 let NodeOracleProviderKey = "oracle_node_provider"
9999
100100 let LeasingIntervalKey = "leasing_interval"
101101
102102 let RPDBalanceKey = "rpd_balance"
103103
104104 func getRPDContractBalanceKey (assetId) = ((RPDBalanceKey + "_") + toBase58String(assetId))
105105
106106
107107 let PriceKey = "price"
108108
109109 let PriceIndexKey = "price_index"
110110
111111 let IsBlockedKey = "is_blocked"
112112
113113 let LeasingExpireBlockKey = "leasing_expire_block"
114114
115115 let IsRebalanceKey = "is_rebalance"
116116
117117 let LeasingTxCountKey = "leasing_index"
118118
119119 let LeasingAmountKey = "leasing_amount"
120120
121121 func getPriceHistoryKey (block) = ((PriceKey + "_") + toString(block))
122122
123123
124124 func getHeightPriceByIndexKey (index) = ((PriceIndexKey + "_") + toString(index))
125125
126126
127127 let RPDSyncIndexKey = "rpd_sync_index"
128128
129129 func getRPDSnapshotContractBalanceKey (count,assetId) = ((((RPDBalanceKey + "_") + toBase58String(assetId)) + "_") + toString(count))
130130
131131
132132 func getCancelLeaseTxReserveFeeKey (hash) = (("cancel_lease_tx_reserve_fee" + "_") + hash)
133133
134134
135135 func getAccountLockedBalanceKey (owner,assetId) = ((("balance_" + assetId) + "_") + owner)
136136
137137
138138 func getBalanceUnlockBlockKey (owner) = ("balance_block_" + owner)
139139
140140
141141 func getRPDProfitKey (count) = (("rpd_profit" + "_") + toString(count))
142142
143143
144144 func getLockedBalanceKey (assetId) = ("balance_" + assetId)
145145
146146
147147 func getLeaseTxStatusKey (hash) = (("lease_tx_status" + "_") + hash)
148148
149149
150150 func getLeaseTxAmountByHashKey (hash) = ((LeasingAmountKey + "_") + hash)
151151
152152
153153 func getLeaseTxBytesByHashKey (hash) = (("lease_tx" + "_") + hash)
154154
155155
156156 func getLeaseTxExpireSendBlockKey (hash) = (("leasing_expire_send" + "_") + hash)
157157
158158
159159 func convertNeutrinoToWaves (amount,price) = ((((amount * 100) / price) * WAVELET) / PAULI)
160160
161161
162162 func convertWavesToNeutrino (amount,price) = ((((amount * price) / 100) * PAULI) / WAVELET)
163163
164164
165165 func convertNeutrinoToBond (amount) = (amount / PAULI)
166166
167167
168168 func convertBondToNeutrino (amount) = (amount * PAULI)
169169
170170
171171 func convertWavesToBond (amount,price) = convertNeutrinoToBond(convertWavesToNeutrino(amount, price))
172172
173173
174174 func getLockedBalance (assetId) = getNumberByKey(getLockedBalanceKey(assetId))
175175
176176
177177 let liquidationContract = getStringByKey(LiquidationContractKey)
178178
179179 let neutrinoAssetIdString = getStringByKey(NeutrinoAssetIdKey)
180180
181181 let neutrinoAssetId = fromBase58String(neutrinoAssetIdString)
182182
183183 let reserveContract = getStringByKey(ReserveContractKey)
184184
185185 let auctionContract = getStringByKey(AuctionContractKey)
186186
187187 let rpdContract = getStringByKey(RPDContractKey)
188188
189189 let controlContract = getStringByKey(ContolContractKey)
190190
191191 let currentPrice = getNumberByAddressAndKey(controlContract, PriceKey)
192192
193193 let priceIndex = getNumberByAddressAndKey(controlContract, PriceIndexKey)
194194
195195 let isBlocked = getBoolByAddressAndKey(controlContract, IsBlockedKey)
196196
197197 let leasingTxCount = getNumberByKey(LeasingTxCountKey)
198198
199199 let isRebalance = getBoolByKey(IsRebalanceKey)
200200
201201 let leasingInterval = getNumberByKey(LeasingIntervalKey)
202202
203203 let leasingExpireBlock = getNumberByKey(LeasingExpireBlockKey)
204204
205205 let leasingAmount = getNumberByKey(LeasingAmountKey)
206206
207207 let nodeAddress = getStringByKey(NodeAddressKey)
208208
209209 let nodeOracleProviderKey = getStringByKey(NodeOracleProviderKey)
210210
211211 let rpdSyncIndex = getNumberByKey(RPDSyncIndexKey)
212212
213213 let balanceLockInterval = getNumberByKey(BalanceLockIntervalKey)
214214
215215 let minWavesSwapAmount = getNumberByKey(MinWavesSwapAmountKey)
216216
217217 let minNeutrinoSwapAmount = getNumberByKey(MinNeutrinoSwapAmountKey)
218218
219219 let reserve = (wavesBalance(this) - getLockedBalance(WAVESASSETID))
220220
221221 let reserveWithoutLeasing = (reserve - leasingAmount)
222222
223223 let bondAssetId = fromBase58String(getStringByKey(BondAssetIdKey))
224224
225225 let bondSupply = (extract(assetInfo(bondAssetId)).quantity - assetBalance(this, bondAssetId))
226226
227227 let neutrinoSupply = ((extract(assetInfo(neutrinoAssetId)).quantity - assetBalance(this, neutrinoAssetId)) + getLockedBalance(neutrinoAssetIdString))
228228
229229 let surplus = (convertWavesToNeutrino(reserve, currentPrice) - neutrinoSupply)
230230
231231 let deficit = (neutrinoSupply - convertWavesToNeutrino(reserve, currentPrice))
232232
233233 func getRPDContractBalance (assetId) = getNumberByAddressAndKey(rpdContract, getRPDContractBalanceKey(assetId))
234234
235235
236236 func getPriceHistory (block) = getNumberByAddressAndKey(controlContract, getPriceHistoryKey(block))
237237
238238
239239 func getHeightPriceByIndex (index) = getNumberByAddressAndKey(controlContract, getHeightPriceByIndexKey(index))
240240
241241
242242 func getCancelLeaseTxReserveFee (hash) = getNumberByKey(getCancelLeaseTxReserveFeeKey(hash))
243243
244244
245245 func getAccountLockedBalance (owner,assetId) = getNumberByKey(getAccountLockedBalanceKey(owner, assetId))
246246
247247
248248 func getUnlockBalanceBlock (owner) = getNumberByKey(getBalanceUnlockBlockKey(owner))
249249
250250
251251 func getRPDProfit (count) = getNumberByKey(getRPDProfitKey(count))
252252
253253
254254 func getLeaseTxStatus (hash) = getStringByKey(getLeaseTxStatusKey(hash))
255255
256256
257257 func getLeaseTxAmountByHash (hash) = getNumberByKey(getLeaseTxAmountByHashKey(hash))
258258
259259
260260 func getLeaseTxBytesByHash (hash) = getStringByKey(getLeaseTxBytesByHashKey(hash))
261261
262262
263263 func getLeaseTxExpireSendBlock (hash) = getNumberByKey(getLeaseTxExpireSendBlockKey(hash))
264264
265265
266266 @Callable(i)
267267 func swapWavesToNeutrino () = {
268268 let pmt = extract(i.payment)
269269 let account = toString(i.caller)
270270 if ((minWavesSwapAmount > pmt.amount))
271271 then throw((("an amount is less than min available amount: " + toString(minWavesSwapAmount)) + " wavelets"))
272272 else if (isDefined(pmt.assetId))
273273 then throw("can use waves only")
274274 else if (isBlocked)
275275 then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
276276 else if ((getUnlockBalanceBlock(account) > height))
277277 then throw((("await " + toString((getUnlockBalanceBlock(account) - height))) + " blocks"))
278278 else if ((getAccountLockedBalance(account, WAVESASSETID) != 0))
279279 then throw("please withdraw locked funds first")
280280 else WriteSet([DataEntry(getAccountLockedBalanceKey(account, WAVESASSETID), pmt.amount), DataEntry(getBalanceUnlockBlockKey(account), (height + balanceLockInterval)), DataEntry(getLockedBalanceKey(WAVESASSETID), (getLockedBalance(WAVESASSETID) + pmt.amount))])
281281 }
282282
283283
284284
285285 @Callable(i)
286286 func swapNeutrinoToWaves () = {
287287 let pmt = extract(i.payment)
288288 let account = toString(i.caller)
289289 if ((minNeutrinoSwapAmount > pmt.amount))
290290 then throw((("an amount is less than min available amount: " + toString(minNeutrinoSwapAmount)) + " neutrino cents"))
291291 else if (isBlocked)
292292 then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
293293 else if ((pmt.assetId != neutrinoAssetId))
294294 then throw("can use appropriate neutrino tokens only")
295295 else if ((getUnlockBalanceBlock(account) > height))
296296 then throw((("await " + toString((getUnlockBalanceBlock(account) - height))) + " blocks"))
297297 else if ((getAccountLockedBalance(account, neutrinoAssetIdString) != 0))
298298 then throw("please withdraw locked funds first")
299299 else {
300300 let newLockedBalance = (getLockedBalance(neutrinoAssetIdString) + pmt.amount)
301301 WriteSet([DataEntry(getAccountLockedBalanceKey(account, neutrinoAssetIdString), pmt.amount), DataEntry(getBalanceUnlockBlockKey(account), (height + balanceLockInterval)), DataEntry(getLockedBalanceKey(neutrinoAssetIdString), newLockedBalance), DataEntry(IsRebalanceKey, if ((reserveWithoutLeasing >= convertNeutrinoToWaves(newLockedBalance, currentPrice)))
302302 then false
303303 else true)])
304304 }
305305 }
306306
307307
308308
309309 @Callable(i)
310310 func withdraw (account,index,lockedAssetId) = {
311311 let unlockHeight = getUnlockBalanceBlock(account)
312312 let lockedBalance = getAccountLockedBalance(account, lockedAssetId)
313313 let indexHeight = getHeightPriceByIndex(index)
314314 let nextIndexHeight = getHeightPriceByIndex((index + 1))
315315 let priceByIndex = getPriceHistory(indexHeight)
316316 let amount = if ((lockedAssetId == neutrinoAssetIdString))
317317 then convertNeutrinoToWaves(lockedBalance, priceByIndex)
318318 else convertWavesToNeutrino(lockedBalance, priceByIndex)
319319 if (isBlocked)
320320 then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
321321 else if ((0 >= amount))
322322 then throw((("balance equals zero (" + lockedAssetId) + ")"))
323323 else if ((unlockHeight > height))
324324 then throw((("please wait for: " + toString(unlockHeight)) + " block height to withdraw WAVES funds"))
325325 else if (if (if ((index > priceIndex))
326326 then true
327327 else (indexHeight > unlockHeight))
328328 then true
329329 else if ((nextIndexHeight != 0))
330330 then (unlockHeight >= nextIndexHeight)
331331 else false)
332332 then throw("invalid price history index")
333333 else ScriptResult(WriteSet([DataEntry(getAccountLockedBalanceKey(account, lockedAssetId), 0), DataEntry(getLockedBalanceKey(lockedAssetId), (getLockedBalance(lockedAssetId) - lockedBalance))]), TransferSet([ScriptTransfer(addressFromStringValue(account), amount, if ((lockedAssetId == neutrinoAssetIdString))
334334 then unit
335335 else neutrinoAssetId)]))
336336 }
337337
338338
339339
340340 @Callable(i)
341341 func transferToAuction () = {
342342 let deficitBondAmount = (convertNeutrinoToBond(deficit) - assetBalance(addressFromStringValue(auctionContract), bondAssetId))
343343 let surplusBond = (convertNeutrinoToBond(surplus) - assetBalance(addressFromStringValue(auctionContract), neutrinoAssetId))
344344 if (isBlocked)
345345 then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
346346 else if ((deficitBondAmount >= ((convertNeutrinoToBond(neutrinoSupply) * DEFICITOFFSET) / 100)))
347347 then TransferSet([ScriptTransfer(addressFromStringValue(auctionContract), deficitBondAmount, bondAssetId)])
348348 else if ((surplusBond > 0))
349349 then TransferSet([ScriptTransfer(addressFromStringValue(liquidationContract), convertBondToNeutrino(surplusBond), neutrinoAssetId)])
350350 else throw("bond were generated or do not need it")
351351 }
352352
353353
354354
355355 @Callable(i)
356356 func transfer (account) = {
357357 let pmt = extract(i.payment)
358358 TransferSet([ScriptTransfer(addressFromStringValue(account), pmt.amount, pmt.assetId)])
359359 }
360360
361361
362362
363363 @Callable(i)
364364 func nodeReward () = {
365365 let pmt = value(i.payment)
366366 if ((i.caller != addressFromStringValue(nodeAddress)))
367367 then throw("only node account is able to transfer staking rewards from main account")
368368 else if (isDefined(pmt.assetId))
369369 then throw("waves tokens only allowed")
370370 else {
371371 let amount = convertWavesToNeutrino(pmt.amount, currentPrice)
372372 let newRpdSyncIndex = (rpdSyncIndex + 1)
373373 ScriptResult(WriteSet([DataEntry(RPDSyncIndexKey, newRpdSyncIndex), DataEntry(getRPDProfitKey(rpdSyncIndex), amount), DataEntry(getRPDSnapshotContractBalanceKey(rpdSyncIndex, neutrinoAssetId), getRPDContractBalance(neutrinoAssetId))]), TransferSet([ScriptTransfer(addressFromStringValue(rpdContract), amount, neutrinoAssetId)]))
374374 }
375375 }
376376
377377
378378
379379 @Callable(i)
380380 func registrationLeaseTx (senderPublicKey,fee,timestamp,leaseTxHash) = {
381381 let totalFreeReserve = (((reserve * LEASINGSHARE) / 100) - convertNeutrinoToWaves(getLockedBalance(neutrinoAssetIdString), currentPrice))
382382 let amount = (totalFreeReserve / LEASINTXCOUNT)
383383 let txBytes = (((((base58'3h1H' + fromBase58String(senderPublicKey)) + fromBase58String(nodeAddress)) + toBytes(amount)) + toBytes(fee)) + toBytes(timestamp))
384384 let txHashBytes = blake2b256(txBytes)
385385 let txHash = toBase58String(txHashBytes)
386386 let pmt = extract(i.payment)
387387 if ((toString(i.caller) == nodeOracleProviderKey))
388388 then throw("invalid caller")
389389 else if (isDefined(pmt.assetId))
390390 then throw("invalid paymtn asset")
391391 else if ((leaseTxHash != txHash))
392392 then throw((("invalid tx hash(amount:" + toString(amount)) + ")"))
393393 else if ((leasingTxCount >= LEASINTXCOUNT))
394394 then throw("the number of leasing transactions is equal to the maximum")
395395 else if ((this != addressFromPublicKey(fromBase58String(senderPublicKey))))
396396 then throw("invalid pubKey")
397397 else if (if ((lastBlock.timestamp > timestamp))
398398 then true
399399 else (timestamp > (lastBlock.timestamp + 5400000)))
400400 then throw((("invalid timestamp(lastBlock: " + toString(lastBlock.timestamp)) + ")"))
401401 else if ((getLeaseTxStatus(txHash) != ""))
402402 then throw("tx is exist")
403403 else if ((pmt.amount != (fee * 2)))
404404 then throw("invalid payment amount")
405405 else if (if ((fee > 1000000))
406406 then true
407407 else (500000 > fee))
408408 then throw("invalid fee")
409409 else if (((totalFreeReserve - (leasingAmount + amount)) > reserveWithoutLeasing))
410410 then throw((("invalid amount(result:" + toString(((totalFreeReserve - (leasingAmount + amount)) > reserveWithoutLeasing))) + ")"))
411411 else WriteSet([DataEntry(getCancelLeaseTxReserveFeeKey(txHash), fee), DataEntry(LeasingTxCountKey, if ((getLeaseTxStatus(txHash) == ""))
412412 then (leasingTxCount + 1)
413413 else leasingTxCount), DataEntry(LeasingAmountKey, (leasingAmount + amount)), DataEntry(LeasingExpireBlockKey, if ((height > leasingExpireBlock))
414414 then (height + leasingInterval)
415415 else leasingExpireBlock), DataEntry(getLeaseTxStatusKey(txHash), NEW), DataEntry(getLeaseTxExpireSendBlockKey(txHash), (height + SENDTXEXPIRE)), DataEntry(getLeaseTxAmountByHashKey(txHash), amount), DataEntry(getLeaseTxBytesByHashKey(txHash), toBase64String(txBytes))])
416416 }
417417
418418
419419
420420 @Callable(i)
421421 func cancelStuckLeaseTx (txHash) = if (if (if ((getLeaseTxStatus(txHash) == NEW))
422422 then !(isDefined(transactionHeightById(fromBase58String(txHash))))
423423 else false)
424424 then (height > getLeaseTxExpireSendBlock(txHash))
425425 else false)
426426 then {
427427 let amount = getLeaseTxAmountByHash(txHash)
428428 WriteSet([DataEntry(LeasingTxCountKey, (leasingTxCount - 1)), DataEntry(LeasingAmountKey, (leasingAmount - amount)), DataEntry(getLeaseTxStatusKey(txHash), CANCELED), DataEntry(IsRebalanceKey, if (((reserveWithoutLeasing - amount) >= convertNeutrinoToWaves(getLockedBalance(neutrinoAssetIdString), currentPrice)))
429429 then false
430430 else true)])
431431 }
432432 else throw("invalid tx hash")
433433
434434
435435
436436 @Callable(i)
437437 func registrationUnleaseTx (chainIdString,senderPublicKey,fee,timestamp,leaseTxHash) = {
438438 let txBytes = (((((base58'gm' + toBytes(chainIdString)) + fromBase58String(senderPublicKey)) + toBytes(fee)) + toBytes(timestamp)) + fromBase58String(leaseTxHash))
439439 let txHash = blake2b256(txBytes)
440440 if ((getLeaseTxStatus(leaseTxHash) != NEW))
441441 then throw("invalid tx status")
442442 else if ((this != addressFromPublicKey(fromBase58String(senderPublicKey))))
443443 then throw("invalid pubKey")
444444 else if (!(isDefined(transactionHeightById(txHash))))
445445 then throw("blockchain does not contain this transaction")
446446 else {
447447 let amount = getLeaseTxAmountByHash(leaseTxHash)
448448 WriteSet([DataEntry(LeasingTxCountKey, (leasingTxCount - 1)), DataEntry(LeasingAmountKey, (leasingAmount - amount)), DataEntry(getLeaseTxStatusKey(leaseTxHash), CANCELED), DataEntry(IsRebalanceKey, if (((reserveWithoutLeasing - amount) >= convertNeutrinoToWaves(getLockedBalance(neutrinoAssetIdString), currentPrice)))
449449 then false
450450 else true)])
451451 }
452452 }
453453
454454
455455 @Verifier(tx)
456456 func verify () = {
457457 let id = toBase58String(tx.id)
458458 match tx {
459459 case leaseTx: LeaseTransaction =>
460460 if (if ((leasingExpireBlock >= height))
461461 then (getLeaseTxExpireSendBlock(id) >= height)
462462 else false)
463463 then (getLeaseTxStatus(id) == NEW)
464464 else false
465465 case unleaseTx: LeaseCancelTransaction =>
466466 let leaseId = toBase58String(unleaseTx.leaseId)
467467 if (if (if ((height > leasingExpireBlock))
468468 then true
469469 else isRebalance)
470470 then (unleaseTx.fee == getCancelLeaseTxReserveFee(leaseId))
471471 else false)
472472 then (getLeaseTxStatus(leaseId) == NEW)
473473 else false
474474 case _ =>
475475 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
476476 }
477477 }
478478

github/deemru/w8io/3ef1775 
65.65 ms