2022.06.26 11:36 [3178762] smart account 3PC9BfRwJWWiw9AREE2B3eWzCks3CYtg4yo > SELF 0.00000000 Waves

{ "type": 13, "id": "F8nTKySWeVnKND6Bu5ni6jf9ACcQi1PwhLTi9xUQP2aT", "fee": 14000000, "feeAssetId": null, "timestamp": 1656233094711, "version": 1, "sender": "3PC9BfRwJWWiw9AREE2B3eWzCks3CYtg4yo", "senderPublicKey": "BRnVwSVctnV8pge5vRpsJdWnkjWEJspFb6QvrmZvu3Ht", "proofs": [ "5VEVnTUQAHEkUtujYwEamnNyNgCmSMs5j1hcwkLt5vkm5zoXYZtkVDjeyrtZAUXrSESQbVSvtgyuusrkfbBYprxZ", "2UGLHJ2NVijv2Cu9mUcF4EHEXnkeGhnuJx7BsHyXRSKrvWnjnTcCyJTDUqNAgCmCzj4bauJqvAy58HiiHWSNSNgY", "5QL7Mz5y6oSSgtg7MLS6HZU7ZbEc2oZzRejsVPzuLcbmkBbiUbxmph5mg1kk1FSKsVrNVKWMi3SLa4TADiveGeHh", "44JK3pu5Gk69xSeiy3NmFchcVXSCRtwFJDzcwUpwjoupTZgh9NqfgDKZPGLgYiW8Sz93K6MUQ1uUVo3huZ6sxx9b" ], "script": "base64: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ZXRBbW91bnQAAAAAAAAAAAAAAAAADElkeEZlZUFtb3VudAAAAAAAAAAAAQAAAAAOSWR4R3Jvc3NBbW91bnQAAAAAAAAAAAIAAAAAEk5ldXRyaW5vQXNzZXRJZEtleQIAAAARbmV1dHJpbm9fYXNzZXRfaWQAAAAADkJvbmRBc3NldElkS2V5AgAAAA1ib25kX2Fzc2V0X2lkAAAAABJBdWN0aW9uQ29udHJhY3RLZXkCAAAAEGF1Y3Rpb25fY29udHJhY3QAAAAAFk5zYnRTdGFraW5nQ29udHJhY3RLZXkCAAAAE25zYnRTdGFraW5nQ29udHJhY3QAAAAAFkxpcXVpZGF0aW9uQ29udHJhY3RLZXkCAAAAFGxpcXVpZGF0aW9uX2NvbnRyYWN0AAAAAA5SUERDb250cmFjdEtleQIAAAAMcnBkX2NvbnRyYWN0AAAAABFDb250b2xDb250cmFjdEtleQIAAAAQY29udHJvbF9jb250cmFjdAAAAAAPTWF0aENvbnRyYWN0S2V5AgAAAA1tYXRoX2NvbnRyYWN0AAAAABtCYWxhbmNlV2F2ZXNMb2NrSW50ZXJ2YWxLZXkCAAAAG2JhbGFuY2Vfd2F2ZXNfbG9ja19pbnRlcnZhbAAAAAAeQmFsYW5jZU5ldXRyaW5vTG9ja0ludGVydmFsS2V5AgAAAB5iYWxhbmNlX25ldXRyaW5vX2xvY2tfaW50ZXJ2YWwAAAAAFU1pbldhdmVzU3dhcEFtb3VudEtleQIAAAAVbWluX3dhdmVzX3N3YXBfYW1vdW50AAAAABhNaW5OZXV0cmlub1N3YXBBbW91bnRLZXkCAAAAGG1pbl9uZXV0cmlub19zd2FwX2Ftb3VudAAAAAAbTm9kZU9yYWNsZVByb3ZpZGVyUHViS2V5S2V5AgAAABRub2RlX29yYWNsZV9wcm92aWRlcgAAAAAVTmV1dHJpbm9PdXRGZWVQYXJ0S2V5AgAAABhuZXV0cmlub091dF9zd2FwX2ZlZVBhcnQAAAAAEldhdmVzT3V0RmVlUGFydEtleQIAAAAVd2F2ZXNPdXRfc3dhcF9mZWVQYXJ0AAAAABVGZWVzTWFuYWdlckFkZHJlc3NLZXkCAAAAFGZlZXNfbWFuYWdlcl9hZGRyZXNzAQAAAA9rZXlOb2RlUmVnaXN0cnkAAAABAAAA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bG9ja18FAAAACHN3YXBUeXBlAQAAABR0b3RhbExvY2tlZEJ5VXNlcktFWQAAAAIAAAAIc3dhcFR5cGUAAAAFb3duZXIJAAS5AAAAAgkABEwAAAACAgAAAAxiYWxhbmNlX2xvY2sJAARMAAAAAgUAAAAIc3dhcFR5cGUJAARMAAAAAgUAAAAFb3duZXIFAAAAA25pbAIAAAABXwEAAAAWYmFsYW5jZUxvY2tJbnRlcnZhbEtFWQAAAAEAAAAIc3dhcFR5cGUJAAEsAAAAAgkAASwAAAACAgAAAAhiYWxhbmNlXwUAAAAIc3dhcFR5cGUCAAAADl9sb2NrX2ludGVydmFsAQAAABpub2RlQmFsYW5jZUxvY2tJbnRlcnZhbEtFWQAAAAACAAAAGmJhbGFuY2Vfbm9kZV9sb2NrX2ludGVydmFsAQAAAA1vdXRGZWVQYXJ0S0VZAAAAAQAAAAhzd2FwVHlwZQkAASwAAAACBQAAAAhzd2FwVHlwZQIAAAAQT3V0X3N3YXBfZmVlUGFydAEAAAARc3dhcHNUaW1lZnJhbWVLRVkAAAAAAgAAAA9zd2Fwc190aW1lZnJhbWUBAAAAEW1pblN3YXBBbW91bnRSRUFEAAAAAQAAAAhzd2FwVHlwZQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAQbWluU3dhcEFtb3VudEtFWQAAAAEFAAAACHN3YXBUeXBlAAAAAAAAAAAAAQAAABJzd2Fwc1RpbWVmcmFtZVJFQUQAAAAACQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAABFzd2Fwc1RpbWVmcmFtZUtFWQAAAAAAAAAAAAAABaABAAAAD3RvdGFsTG9ja2VkUkVBRAAAAAEAAAAIc3dhcFR5cGUJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAADnRvdGFsTG9ja2VkS0VZAAAAAQUAAAAIc3dhcFR5cGUAAAAAAAAAAAABAAAAFXRvdGFsTG9ja2VkQnlVc2VyUkVBRAAAAAIAAAAIc3dhcFR5cGUAAAAFb3duZXIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAFHRvdGFsTG9ja2VkQnlVc2VyS0VZAAAAAgUAAAAIc3dhcFR5cGUFAAAABW93bmVyAAAAAAAAAAAAAQAAABdiYWxhbmNlTG9ja0ludGVydmFsUkVBRAAAAAEAAAAIc3dhcFR5cGUJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAFmJhbGFuY2VMb2NrSW50ZXJ2YWxLRVkAAAABBQAAAAhzd2FwVHlwZQAAAAAAAAAFoAEAAAAbbm9kZUJhbGFuY2VMb2NrSW50ZXJ2YWxSRUFEAAAAAAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAabm9kZUJhbGFuY2VMb2NrSW50ZXJ2YWxLRVkAAAAAAAAAAAAAAAABAQAAABhrZXlTd2FwVXNlclNwZW50SW5QZXJpb2QAAAABAAAAC3VzZXJBZGRyZXNzCQAEuQAAAAIJAARMAAAAAgIAAAAEJXMlcwkABEwAAAACAgAAABVzd2FwVXNlclNwZW50SW5QZXJpb2QJAARMAAAAAgUAAAALdXNlckFkZHJlc3MFAAAAA25pbAUAAAADU0VQAQAAABVrZXlVc2VyTGFzdFN3YXBIZWlnaHQAAAABAAAAC3VzZXJBZGRyZXNzCQAEuQAAAAIJAARMAAAAAgIAAAAEJXMlcwkABEwAAAACAgAAABJ1c2VyTGFzdFN3YXBIZWlnaHQJAARMAAAAAgUAAAALdXNlckFkZHJlc3MFAAAAA25pbAUAAAADU0VQAQAAABVmZWVNYW5hZ2VyQWRkcmVzc1JFQUQAAAAACQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAAFUZlZXNNYW5hZ2VyQWRkcmVzc0tleQkAASwAAAACBQAAABVGZWVzTWFuYWdlckFkZHJlc3NLZXkCAAAAESBpcyBub3Qgc3BlY2lmaWVkCQABLAAAAAIFAAAAFUZlZXNNYW5hZ2VyQWRkcmVzc0tleQIAAAAXIGludmFsaWQgYWRkcmVzcyBmb3JtYXQBAAAAFmNvbnZlcnROZXV0cmlub1RvV2F2ZXMAAAACAAAABmFtb3VudAAAAAVwcmljZQkAAGsAAAADCQAAawAAAAMFAAAABmFtb3VudAUAAAAIUFJJQ0VMRVQFAAAABXByaWNlBQAAAAdXQVZFTEVUBQAAAAVQQVVMSQEAAAAWY29udmVydFdhdmVzVG9OZXV0cmlubwAAAAIAAAAGYW1vdW50AAAABXByaWNlCQAAawAAAAMJAABrAAAAAwUAAAAGYW1vdW50BQAAAAVwcmljZQUAAAAIUFJJQ0VMRVQFAAAABVBBVUxJBQAAAAdXQVZFTEVUAQAAABJjb252ZXJ0V2F2ZXNUb0JvbmQAAAACAAAABmFtb3VudAAAAAVwcmljZQkBAAAAFmNvbnZlcnRXYXZlc1RvTmV1dHJpbm8AAAACBQAAAAZhbW91bnQFAAAABXByaWNlAQAAABZjb252ZXJ0SnNvbkFycmF5VG9MaXN0AAAAAQAAAAlqc29uQXJyYXkJAAS1AAAAAgUAAAAJanNvbkFycmF5AgAAAAEsAQAAABFtaW5Td2FwQW1vdW50RkFJTAAAAAIAAAAIc3dhcFR5cGUAAAANbWluU3dhcEFtb3VudAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABhUaGUgc3BlY2lmaWVkIGFtb3VudCBpbiAFAAAACHN3YXBUeXBlAgAAACsgc3dhcCBpcyBsZXNzIHRoYW4gdGhlIHJlcXVpcmVkIG1pbmltdW0gb2YgCQABpAAAAAEFAAAADW1pblN3YXBBbW91bnQBAAAAFWVtZXJnZW5jeVNodXRkb3duRkFJTAAAAAAJAAACAAAAAQIAAABaY29udHJhY3QgaXMgYmxvY2tlZCBieSBFTUVSR0VOQ1kgU0hVVERPV04gYWN0aW9ucyB1bnRpbGwgcmVhY3RpdmF0aW9uIGJ5IGVtZXJnZW5jeSBvcmFjbGVzAQAAAA5wcmljZUluZGV4RkFJTAAAAAUAAAAFaW5kZXgAAAAKcHJpY2VJbmRleAAAAAtpbmRleEhlaWdodAAAAAx1bmxvY2tIZWlnaHQAAAAPcHJldkluZGV4SGVpZ2h0CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAI2ludmFsaWQgcHJpY2UgaGlzdG9yeSBpbmRleDogaW5kZXg9CQABpAAAAAEFAAAABWluZGV4AgAAAAwgcHJpY2VJbmRleD0JAAGkAAAAAQUAAAAKcHJpY2VJbmRleAIAAAANIGluZGV4SGVpZ2h0PQkAAaQAAAABBQAAAAtpbmRleEhlaWdodAIAAAAOIHVubG9ja0hlaWdodD0JAAGkAAAAAQUAAAAMdW5sb2NrSGVpZ2h0AgAAABEgcHJldkluZGV4SGVpZ2h0PQkAAaQAAAABBQAAAA9wcmV2SW5kZXhIZWlnaHQAAAAAE2xpcXVpZGF0aW9uQ29udHJhY3QJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAAFkxpcXVpZGF0aW9uQ29udHJhY3RLZXkAAAAAFm5zYnRTdGFraW5nQ29udHJhY3RTdHIJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAAFk5zYnRTdGFraW5nQ29udHJhY3RLZXkAAAAAD25ldXRyaW5vQXNzZXRJZAkAAlkAAAABCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABBQAAABJOZXV0cmlub0Fzc2V0SWRLZXkAAAAAD2F1Y3Rpb25Db250cmFjdAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAASQXVjdGlvbkNvbnRyYWN0S2V5AAAAAAtycGRDb250cmFjdAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAAOUlBEQ29udHJhY3RLZXkAAAAAEmNvbnRyb2xDb250cmFjdFN0cgkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAARQ29udG9sQ29udHJhY3RLZXkAAAAAD2NvbnRyb2xDb250cmFjdAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAASY29udHJvbENvbnRyYWN0U3RyAAAAABNtYXRoQ29udHJhY3RBZGRyZXNzCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABBQAAAA9NYXRoQ29udHJhY3RLZXkAAAAACnByaWNlSW5kZXgJAQAAABhnZXROdW1iZXJCeUFkZHJlc3NBbmRLZXkAAAACBQAAABJjb250cm9sQ29udHJhY3RTdHIFAAAADVByaWNlSW5kZXhLZXkAAAAACWlzQmxvY2tlZAkBAAAAFmdldEJvb2xCeUFkZHJlc3NBbmRLZXkAAAACBQAAABJjb250cm9sQ29udHJhY3RTdHIFAAAADElzQmxvY2tlZEtleQAAAAAYbm9kZU9yYWNsZVByb3ZpZGVyUHViS2V5CQACWQAAAAEJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAAG05vZGVPcmFjbGVQcm92aWRlclB1YktleUtleQAAAAALYm9uZEFzc2V0SWQJAAJZAAAAAQIAAAAsNm5TcFZ5Tkg3eU02OWVnNDQ2d3JRUjk0aXBiYmNtWk1VMUVOUHdhbkM5N2cAAAAAFWRlcHJlY2F0ZWRCb25kQXNzZXRJZAkAAlkAAAABAgAAACw5NzVha1pCZm5NajUxM1U3TVphSEt6UXJtc0V4NWFFM3dkV0tUckhCaGJqRgAAAAAQbmV1dHJpbm9Db250cmFjdAUAAAAEdGhpcwAAAAAMbWF0aENvbnRyYWN0CQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAABNtYXRoQ29udHJhY3RBZGRyZXNzAAAAABNuc2J0U3Rha2luZ0NvbnRyYWN0CQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAABZuc2J0U3Rha2luZ0NvbnRyYWN0U3RyAAAAAAxjdXJyZW50UHJpY2UJAQAAABhnZXROdW1iZXJCeUFkZHJlc3NBbmRLZXkAAAACBQAAABJjb250cm9sQ29udHJhY3RTdHIFAAAACFByaWNlS2V5AQAAABtjaGVja0lzVmFsaWRNaW5TcG9uc29yZWRGZWUAAAABAAAAAnR4BAAAAA5NSU5UUkFOU0ZFUkZFRQAAAAAAAAGGoAQAAAAWU3BvbnNvcmVkRmVlVXBwZXJCb3VuZAAAAAAAAAAD6AQAAAAPcmVhbE5ldXRyaW5vRmVlCQEAAAAWY29udmVydFdhdmVzVG9OZXV0cmlubwAAAAIFAAAADk1JTlRSQU5TRkVSRkVFBQAAAAxjdXJyZW50UHJpY2UEAAAADm1pbk5ldXRyaW5vRmVlCQAAaAAAAAIFAAAAD3JlYWxOZXV0cmlub0ZlZQAAAAAAAAAAAgQAAAAObWF4TmV1dHJpbm9GZWUJAABrAAAAAwUAAAAPcmVhbE5ldXRyaW5vRmVlBQAAABZTcG9uc29yZWRGZWVVcHBlckJvdW5kAAAAAAAAAABkBAAAAAhpbnB1dEZlZQkBAAAABXZhbHVlAAAAAQgFAAAAAnR4AAAAFG1pblNwb25zb3JlZEFzc2V0RmVlAwMJAABnAAAAAgUAAAAIaW5wdXRGZWUFAAAADm1pbk5ldXRyaW5vRmVlCQAAZwAAAAIFAAAADm1heE5ldXRyaW5vRmVlBQAAAAhpbnB1dEZlZQcJAAAAAAAAAggFAAAAAnR4AAAAB2Fzc2V0SWQFAAAAD25ldXRyaW5vQXNzZXRJZAcBAAAAD2dldFByaWNlSGlzdG9yeQAAAAEAAAAFYmxvY2sJAQAAABhnZXROdW1iZXJCeUFkZHJlc3NBbmRLZXkAAAACBQAAABJjb250cm9sQ29udHJhY3RTdHIJAQAAABJnZXRQcmljZUhpc3RvcnlLZXkAAAABBQAAAAVibG9jawEAAAAVZ2V0SGVpZ2h0UHJpY2VCeUluZGV4AAAAAQAAAAVpbmRleAkBAAAAGGdldE51bWJlckJ5QWRkcmVzc0FuZEtleQAAAAIFAAAAEmNvbnRyb2xDb250cmFjdFN0cgkBAAAAGGdldEhlaWdodFByaWNlQnlJbmRleEtleQAAAAEFAAAABWluZGV4AQAAABZrZXlMb2NrUGFyYW1Vc2VyQW1vdW50AAAAAQAAAAt1c2VyQWRkcmVzcwkABLkAAAACCQAETAAAAAICAAAABiVzJXMlcwkABEwAAAACAgAAAAtwYXJhbUJ5VXNlcgkABEwAAAACBQAAAAt1c2VyQWRkcmVzcwkABEwAAAACAgAAAAZhbW91bnQFAAAAA25pbAUAAAADU0VQAAAAAAxzSWR4U3dhcFR5cGUAAAAAAAAAAAEAAAAACnNJZHhTdGF0dXMAAAAAAAAAAAIAAAAADHNJZHhJbkFtb3VudAAAAAAAAAAAAwAAAAAJc0lkeFByaWNlAAAAAAAAAAAEAAAAABBzSWR4T3V0TmV0QW1vdW50AAAAAAAAAAAFAAAAABBzSWR4T3V0RmVlQW1vdW50AAAAAAAAAAAGAAAAAA9zSWR4U3RhcnRIZWlnaHQAAAAAAAAAAAcAAAAAEnNJZHhTdGFydFRpbWVzdGFtcAAAAAAAAAAACAAAAAANc0lkeEVuZEhlaWdodAAAAAAAAAAACQAAAAAQc0lkeEVuZFRpbWVzdGFtcAAAAAAAAAAACgAAAAAUc0lkeFNlbGZVbmxvY2tIZWlnaHQAAAAAAAAAAAsAAAAAFHNJZHhSYW5kVW5sb2NrSGVpZ2h0AAAAAAAAAAAMAAAAAAlzSWR4SW5kZXgAAAAAAAAAAA0AAAAAEHNJZHhXaXRoZHJhd1R4SWQAAAAAAAAAAA4AAAAAC3NJZHhNaW5SYW5kAAAAAAAAAAAPAAAAAAtzSWR4TWF4UmFuZAAAAAAAAAAAEAEAAAAHc3dhcEtFWQAAAAIAAAALdXNlckFkZHJlc3MAAAAEdHhJZAkABLkAAAACCQAETAAAAAICAAAABCVzJXMJAARMAAAAAgUAAAALdXNlckFkZHJlc3MJAARMAAAAAgUAAAAEdHhJZAUAAAADbmlsBQAAAANTRVABAAAAC3N0clN3YXBEQVRBAAAAEAAAAAhzd2FwVHlwZQAAAAZzdGF0dXMAAAAIaW5BbW91bnQAAAAFcHJpY2UAAAAMb3V0TmV0QW1vdW50AAAADG91dEZlZUFtb3VudAAAAAtzdGFydEhlaWdodAAAAA5zdGFydFRpbWVzdGFtcAAAAAllbmRIZWlnaHQAAAAMZW5kVGltZXN0YW1wAAAAEHNlbGZVbmxvY2tIZWlnaHQAAAAQcmFuZFVubG9ja0hlaWdodAAAAAVpbmRleAAAAAx3aXRoZHJhd1R4SWQAAAAHcmFuZE1pbgAAAAdyYW5kTWF4CQAEuQAAAAIJAARMAAAAAgIAAAAcJXMlcyVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlcwkABEwAAAACBQAAAAhzd2FwVHlwZQkABEwAAAACBQAAAAZzdGF0dXMJAARMAAAAAgUAAAAIaW5BbW91bnQJAARMAAAAAgUAAAAFcHJpY2UJAARMAAAAAgUAAAAMb3V0TmV0QW1vdW50CQAETAAAAAIFAAAADG91dEZlZUFtb3VudAkABEwAAAACBQAAAAtzdGFydEhlaWdodAkABEwAAAACBQAAAA5zdGFydFRpbWVzdGFtcAkABEwAAAACBQAAAAllbmRIZWlnaHQJAARMAAAAAgUAAAAMZW5kVGltZXN0YW1wCQAETAAAAAIFAAAAEHNlbGZVbmxvY2tIZWlnaHQJAARMAAAAAgUAAAAQcmFuZFVubG9ja0hlaWdodAkABEwAAAACBQAAAAVpbmRleAkABEwAAAACBQAAAAx3aXRoZHJhd1R4SWQJAARMAAAAAgUAAAAHcmFuZE1pbgkABEwAAAACBQAAAAdyYW5kTWF4BQAAAANuaWwFAAAAA1NFUAEAAAAPcGVuZGluZ1N3YXBEQVRBAAAAAwAAAAhzd2FwVHlwZQAAAA1pbkFzc2V0QW1vdW50AAAAEHNlbGZVbmxvY2tIZWlnaHQJAQAAAAtzdHJTd2FwREFUQQAAABAFAAAACHN3YXBUeXBlAgAAAAdQRU5ESU5HCQABpAAAAAEFAAAADWluQXNzZXRBbW91bnQCAAAAATACAAAAATACAAAAATAJAAGkAAAAAQUAAAAGaGVpZ2h0CQABpAAAAAEIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wAgAAAAEwAgAAAAEwCQABpAAAAAEFAAAAEHNlbGZVbmxvY2tIZWlnaHQCAAAAATACAAAAATACAAAABE5VTEwCAAAAATACAAAAATABAAAADmZpbmlzaFN3YXBEQVRBAAAABwAAAAlkYXRhQXJyYXkAAAAFcHJpY2UAAAAMb3V0TmV0QW1vdW50AAAADG91dEZlZUFtb3VudAAAABByYW5kVW5sb2NrSGVpZ2h0AAAABWluZGV4AAAADHdpdGhkcmF3VHhJZAkBAAAAC3N0clN3YXBEQVRBAAAAEAkAAZEAAAACBQAAAAlkYXRhQXJyYXkFAAAADHNJZHhTd2FwVHlwZQIAAAAIRklOSVNIRUQJAAGRAAAAAgUAAAAJZGF0YUFycmF5BQAAAAxzSWR4SW5BbW91bnQJAAGkAAAAAQUAAAAFcHJpY2UJAAGkAAAAAQUAAAAMb3V0TmV0QW1vdW50CQABpAAAAAEFAAAADG91dEZlZUFtb3VudAkAAZEAAAACBQAAAAlkYXRhQXJyYXkFAAAAD3NJZHhTdGFydEhlaWdodAkAAZEAAAACBQAAAAlkYXRhQXJyYXkFAAAAEnNJZHhTdGFydFRpbWVzdGFtcAkAAaQAAAABBQAAAAZoZWlnaHQJAAGkAAAAAQgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAJAAGRAAAAAgUAAAAJZGF0YUFycmF5BQAAABRzSWR4U2VsZlVubG9ja0hlaWdodAkAAaQAAAABBQAAABByYW5kVW5sb2NrSGVpZ2h0CQABpAAAAAEFAAAABWluZGV4BQAAAAx3aXRoZHJhd1R4SWQJAAGRAAAA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CQEAAAALTGVhc2VDYW5jZWwAAAABCQEAAAAFdmFsdWUAAAABBQAAAAhvbGRMZWFzZQUAAAADbmlsBQAAAANuaWwEAAAADmxlYXNlQW1vdW50S2V5CQEAAAARZ2V0TGVhc2VBbW91bnRLZXkAAAABBQAAAAlub2RlSW5kZXgEAAAABWxlYXNlCQAERAAAAAIJAQAAABxnZXRTdGFraW5nTm9kZUFkZHJlc3NCeUluZGV4AAAAAQUAAAAJbm9kZUluZGV4BQAAAA5uZXdMZWFzZUFtb3VudAkABE4AAAACBQAAAA51bmxlYXNlT3JFbXB0eQkABEwAAAACBQAAAAVsZWFzZQkABEwAAAACCQEAAAALQmluYXJ5RW50cnkAAAACBQAAAApsZWFzZUlkS2V5CQEAAAAFbGNhbGMAAAABBQAAAAVsZWFzZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAEWdldExlYXNlQW1vdW50S2V5AAAAAQUAAAAJbm9kZUluZGV4BQAAAA5uZXdMZWFzZUFtb3VudAUAAAADbmlsBQAAAANuaWwBAAAADHJlYWROb2RlSW5mbwAAAAEAAAAHbm9kZUlkeAQAAAALbm9kZUFkZHJlc3MJAQAAABxnZXRTdGFraW5nTm9kZUFkZHJlc3NCeUluZGV4AAAAAQUAAAAHbm9kZUlkeAQAAAAMbGVhc2VkQW10S0VZCQEAAAARZ2V0TGVhc2VBbW91bnRLZXkAAAABBQAAAAdub2RlSWR4BAAAAAlsZWFzZWRBbXQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEFAAAADGxlYXNlZEFtdEtFWQQAAAAKbGVhc2VJZEtFWQkBAAAADWdldExlYXNlSWRLZXkAAAABBQAAAAdub2RlSWR4BAAAAAdsZWFzZUlkCQEAAAAFdmFsdWUAAAABCQAEHAAAAAIFAAAABHRoaXMFAAAACmxlYXNlSWRLRVkJAAUXAAAABQUAAAALbm9kZUFkZHJlc3MFAAAADGxlYXNlZEFtdEtFWQUAAAAJbGVhc2VkQW10BQAAAApsZWFzZUlkS0VZBQAAAAdsZWFzZUlkAQAAAApjb21tb25Td2FwAAAABQAAAAhzd2FwVHlwZQAAAAlwbXRBbW91bnQAAAAOdXNlckFkZHJlc3NTdHIAAAAGdHhJZDU4AAAAG3N3YXBQYXJhbXNCeVVzZXJTWVNSRUFET05MWQQAAAANJHQwMTY2NDkxNjcyOQUAAAAbc3dhcFBhcmFtc0J5VXNlclNZU1JFQURPTkxZBAAAAAxzd2FwTGltaXRNYXgIBQAAAA0kdDAxNjY0OTE2NzI5AAAAAl8xBAAAAA5zd2FwTGltaXRTcGVudAgFAAAADSR0MDE2NjQ5MTY3MjkAAAACXzIEAAAADmJsY2tzMkxtdFJlc2V0CAUAAAANJHQwMTY2NDkxNjcyOQAAAAJfMwQAAAANbWluU3dhcEFtb3VudAkBAAAAEW1pblN3YXBBbW91bnRSRUFEAAAAAQUAAAAIc3dhcFR5cGUEAAAAC3RvdGFsTG9ja2VkCQEAAAAPdG90YWxMb2NrZWRSRUFEAAAAAQUAAAAIc3dhcFR5cGUEAAAAEXRvdGFsTG9ja2VkQnlVc2VyCQEAAAAVdG90YWxMb2NrZWRCeVVzZXJSRUFEAAAAAgUAAAAIc3dhcFR5cGUFAAAADnVzZXJBZGRyZXNzU3RyBAAAAAtub2RlQWRkcmVzcwkBAAAAFWdldFN0YWtpbmdOb2RlQnlJbmRleAAAAAEAAAAAAAAAAAAEAAAADHByaWNlQnlJbmRleAkBAAAAD2dldFByaWNlSGlzdG9yeQAAAAEJAQAAABVnZXRIZWlnaHRQcmljZUJ5SW5kZXgAAAABBQAAAApwcmljZUluZGV4BAAAAAxpc1N3YXBCeU5vZGUJAAAAAAAAAgUAAAALbm9kZUFkZHJlc3MFAAAADnVzZXJBZGRyZXNzU3RyBAAAABZiYWxhbmNlTG9ja01heEludGVydmFsAwUAAAAMaXNTd2FwQnlOb2RlCQEAAAAbbm9kZUJhbGFuY2VMb2NrSW50ZXJ2YWxSRUFEAAAAAAkBAAAAF2JhbGFuY2VMb2NrSW50ZXJ2YWxSRUFEAAAAAQUAAAAIc3dhcFR5cGUEAAAAEHNlbGZVbmxvY2tIZWlnaHQJAABkAAAAAgUAAAAGaGVpZ2h0BQAAABZiYWxhbmNlTG9ja01heEludGVydmFsBAAAAA5zd2FwVXNkblZvbHVtZQMJAAAAAAAAAgUAAAAIc3dhcFR5cGUCAAAACG5ldXRyaW5vBQAAAAlwbXRBbW91bnQJAQAAABZjb252ZXJ0V2F2ZXNUb05ldXRyaW5vAAAAAgUAAAAJcG10QW1vdW50BQAAAAxwcmljZUJ5SW5kZXgDCQAAZgAAAAIFAAAADW1pblN3YXBBbW91bnQFAAAACXBtdEFtb3VudAkBAAAAEW1pblN3YXBBbW91bnRGQUlMAAAAAgUAAAAIc3dhcFR5cGUFAAAADW1pblN3YXBBbW91bnQDAwkBAAAAASEAAAABBQAAAAxpc1N3YXBCeU5vZGUJAABmAAAAAgUAAAAOc3dhcExpbWl0U3BlbnQAAAAAAAAAAAAHCQAAAgAAAAEJAAEsAAAAAgIAAAA6WW91IGhhdmUgZXhjZWVkZWQgc3dhcCBsaW1pdCEgTmV4dCBhbGxvd2VkIHN3YXAgaGVpZ2h0IGlzIAkAAaQAAAABCQAAZAAAAAIFAAAABmhlaWdodAUAAAAOYmxja3MyTG10UmVzZXQDAwkBAAAAASEAAAABBQAAAAxpc1N3YXBCeU5vZGUJAABmAAAAAgUAAAAOc3dhcFVzZG5Wb2x1bWUFAAAADHN3YXBMaW1pdE1heAcJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAuWW91IGhhdmUgZXhjZWVkZWQgeW91ciBzd2FwIGxpbWl0ISBSZXF1ZXN0ZWQ6IAkAAaQAAAABBQAAAA5zd2FwVXNkblZvbHVtZQIAAAANLCBhdmFpbGFibGU6IAkAAaQAAAABBQAAAAxzd2FwTGltaXRNYXgDBQAAAAlpc0Jsb2NrZWQJAQAAABVlbWVyZ2VuY3lTaHV0ZG93bkZBSUwAAAAABAAAAAlsZWFzZVBhcnQDCQAAAAAAAAIFAAAACHN3YXBUeXBlAgAAAAV3YXZlcwkBAAAAFnByZXBhcmVVbmxlYXNlQW5kTGVhc2UAAAABAAAAAAAAAAAABQAAAANuaWwJAAUUAAAAAgkABE4AAAACCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAYa2V5U3dhcFVzZXJTcGVudEluUGVyaW9kAAAAAQUAAAAOdXNlckFkZHJlc3NTdHIFAAAADnN3YXBVc2RuVm9sdW1lCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAVa2V5VXNlckxhc3RTd2FwSGVpZ2h0AAAAAQUAAAAOdXNlckFkZHJlc3NTdHIFAAAABmhlaWdodAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAFHRvdGFsTG9ja2VkQnlVc2VyS0VZAAAAAgUAAAAIc3dhcFR5cGUFAAAADnVzZXJBZGRyZXNzU3RyCQAAZAAAAAIFAAAAEXRvdGFsTG9ja2VkQnlVc2VyBQAAAAlwbXRBbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABhnZXRCYWxhbmNlVW5sb2NrQmxvY2tLZXkAAAABBQAAAA51c2VyQWRkcmVzc1N0cgUAAAAQc2VsZlVubG9ja0hlaWdodAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADnRvdGFsTG9ja2VkS0VZAAAAAQUAAAAIc3dhcFR5cGUJAABkAAAAAgUAAAALdG90YWxMb2NrZWQFAAAACXBtdEFtb3VudAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAHc3dhcEtFWQAAAAIFAAAADnVzZXJBZGRyZXNzU3RyBQAAAAZ0eElkNTgJAQAAAA9wZW5kaW5nU3dhcERBVEEAAAADBQAAAAhzd2FwVHlwZQUAAAAJcG10QW1vdW50BQAAABBzZWxmVW5sb2NrSGVpZ2h0BQAAAANuaWwFAAAACWxlYXNlUGFydAUAAAAEdW5pdAEAAAAOY29tbW9uV2l0aGRyYXcAAAAEAAAAB2FjY291bnQAAAAFaW5kZXgAAAAIc3dhcFR4SWQAAAAMd2l0aGRyYXdUeElkBAAAAAt1c2VyQWRkcmVzcwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAAHYWNjb3VudAQAAAARZmVlTWFuYWdlckFkZHJlc3MJAQAAABVmZWVNYW5hZ2VyQWRkcmVzc1JFQUQAAAAABAAAAAlkYXRhQXJyYXkJAQAAABJzd2FwRGF0YUZhaWxPclJFQUQAAAACBQAAAAdhY2NvdW50BQAAAAhzd2FwVHhJZAQAAAAQc2VsZlVubG9ja0hlaWdodAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAACWRhdGFBcnJheQUAAAAUc0lkeFNlbGZVbmxvY2tIZWlnaHQEAAAACHN3YXBUeXBlCQABkQAAAAIFAAAACWRhdGFBcnJheQUAAAAMc0lkeFN3YXBUeXBlBAAAAAhpbkFtb3VudAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAACWRhdGFBcnJheQUAAAAMc0lkeEluQW1vdW50BAAAAApzd2FwU3RhdHVzCQABkQAAAAIFAAAACWRhdGFBcnJheQUAAAAKc0lkeFN0YXR1cwQAAAALc3RhcnRIZWlnaHQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAlkYXRhQXJyYXkFAAAAD3NJZHhTdGFydEhlaWdodAQAAAAKb3V0RmVlUGFydAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAANb3V0RmVlUGFydEtFWQAAAAEFAAAACHN3YXBUeXBlBQAAAA5ERUZBVUxUU1dBUEZFRQQAAAALdG90YWxMb2NrZWQJAQAAAA90b3RhbExvY2tlZFJFQUQAAAABBQAAAAhzd2FwVHlwZQQAAAARdG90YWxMb2NrZWRCeVVzZXIJAQAAABV0b3RhbExvY2tlZEJ5VXNlclJFQUQAAAACBQAAAAhzd2FwVHlwZQUAAAAHYWNjb3VudAQAAAAMdW5sb2NrSGVpZ2h0BQAAABBzZWxmVW5sb2NrSGVpZ2h0BAAAAAtpbmRleEhlaWdodAkBAAAAFWdldEhlaWdodFByaWNlQnlJbmRleAAAAAEFAAAABWluZGV4BAAAAA9wcmV2SW5kZXhIZWlnaHQJAQAAABVnZXRIZWlnaHRQcmljZUJ5SW5kZXgAAAABCQAAZQAAAAIFAAAABWluZGV4AAAAAAAAAAABBAAAAAxwcmljZUJ5SW5kZXgJAQAAAA9nZXRQcmljZUhpc3RvcnkAAAABBQAAAAtpbmRleEhlaWdodAQAAAATb3V0QW1vdW50R3Jvc3NUdXBsZQMJAAAAAAAAAgUAAAAIc3dhcFR5cGUCAAAABXdhdmVzCQAFFAAAAAIJAQAAABZjb252ZXJ0V2F2ZXNUb05ldXRyaW5vAAAAAgUAAAAIaW5BbW91bnQFAAAADHByaWNlQnlJbmRleAUAAAAPbmV1dHJpbm9Bc3NldElkAwkAAAAAAAACBQAAAAhzd2FwVHlwZQIAAAAIbmV1dHJpbm8JAAUUAAAAAgkBAAAAFmNvbnZlcnROZXV0cmlub1RvV2F2ZXMAAAACBQAAAAhpbkFtb3VudAUAAAAMcHJpY2VCeUluZGV4BQAAAAR1bml0CQAAAgAAAAEJAAEsAAAAAgIAAAAWVW5zdXBwb3J0ZWQgc3dhcCB0eXBlIAUAAAAIc3dhcFR5cGUEAAAADHBheW91dHNBcnJheQkBAAAACWFwcGx5RmVlcwAAAAIIBQAAABNvdXRBbW91bnRHcm9zc1R1cGxlAAAAAl8xBQAAAApvdXRGZWVQYXJ0BAAAAAxvdXROZXRBbW91bnQJAAGRAAAAAgUAAAAMcGF5b3V0c0FycmF5BQAAAAxJZHhOZXRBbW91bnQEAAAADG91dEZlZUFtb3VudAkAAZEAAAACBQAAAAxwYXlvdXRzQXJyYXkFAAAADElkeEZlZUFtb3VudAMFAAAACWlzQmxvY2tlZAkBAAAAFWVtZXJnZW5jeVNodXRkb3duRkFJTAAAAAADCQEAAAACIT0AAAACBQAAAApzd2FwU3RhdHVzAgAAAAdQRU5ESU5HCQAAAgAAAAECAAAAH3N3YXAgaGFzIGJlZW4gYWxyZWFkeSBwcm9jZXNzZWQDCQAAZgAAAAIFAAAADHVubG9ja0hlaWdodAUAAAAGaGVpZ2h0CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAABFwbGVhc2Ugd2FpdCBmb3I6IAkAAaQAAAABBQAAAAx1bmxvY2tIZWlnaHQCAAAAHyBibG9jayBoZWlnaHQgdG8gd2l0aGRyYXcgZnVuZHMDAwMJAABmAAAAAgUAAAAFaW5kZXgFAAAACnByaWNlSW5kZXgGCQAAZgAAAAIFAAAADHVubG9ja0hlaWdodAUAAAALaW5kZXhIZWlnaHQGAwkBAAAAAiE9AAAAAgUAAAAPcHJldkluZGV4SGVpZ2h0AAAAAAAAAAAACQAAZwAAAAIFAAAAD3ByZXZJbmRleEhlaWdodAUAAAAMdW5sb2NrSGVpZ2h0BwkBAAAADnByaWNlSW5kZXhGQUlMAAAABQUAAAAFaW5kZXgFAAAACnByaWNlSW5kZXgFAAAAC2luZGV4SGVpZ2h0BQAAAAx1bmxvY2tIZWlnaHQFAAAAD3ByZXZJbmRleEhlaWdodAMJAABnAAAAAgAAAAAAAAAAAAkAAZEAAAACBQAAAAxwYXlvdXRzQXJyYXkFAAAADklkeEdyb3NzQW1vdW50CQAAAgAAAAECAAAAE2JhbGFuY2UgZXF1YWxzIHplcm8DAwkAAGYAAAACAAAAAAAAAAAABQAAAApvdXRGZWVQYXJ0BgkAAGcAAAACBQAAAApvdXRGZWVQYXJ0BQAAAAVQQVVMSQkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAB5pbnZhbGlkIG91dEZlZVBhcnQgY29uZmlnIGZvciAFAAAACHN3YXBUeXBlAgAAABIgc3dhcDogb3V0RmVlUGFydD0JAAGkAAAAAQUAAAAKb3V0RmVlUGFydAQAAAANdW5sZWFzZUFtb3VudAMDCQAAAAAAAAIFAAAACHN3YXBUeXBlAgAAAAhuZXV0cmlubwkAAGYAAAACCAUAAAATb3V0QW1vdW50R3Jvc3NUdXBsZQAAAAJfMQAAAAAAAAAAAAcIBQAAABNvdXRBbW91bnRHcm9zc1R1cGxlAAAAAl8xAAAAAAAAAAAABAAAAAVzdGF0ZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAFHRvdGFsTG9ja2VkQnlVc2VyS0VZAAAAAgUAAAAIc3dhcFR5cGUFAAAAB2FjY291bnQJAABlAAAAAgUAAAARdG90YWxMb2NrZWRCeVVzZXIFAAAACGluQW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAOdG90YWxMb2NrZWRLRVkAAAABBQAAAAhzd2FwVHlwZQkAAGUAAAACBQAAAAt0b3RhbExvY2tlZAUAAAAIaW5BbW91bnQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAALdXNlckFkZHJlc3MFAAAADG91dE5ldEFtb3VudAgFAAAAE291dEFtb3VudEdyb3NzVHVwbGUAAAACXzIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAB3N3YXBLRVkAAAACBQAAAAdhY2NvdW50BQAAAAhzd2FwVHhJZAkBAAAADmZpbmlzaFN3YXBEQVRBAAAABwUAAAAJZGF0YUFycmF5BQAAAAxwcmljZUJ5SW5kZXgFAAAADG91dE5ldEFtb3VudAUAAAAMb3V0RmVlQW1vdW50BQAAAAx1bmxvY2tIZWlnaHQFAAAABWluZGV4BQAAAAx3aXRoZHJhd1R4SWQFAAAAA25pbAkABRUAAAADBQAAAAVzdGF0ZQkBAAAAD0F0dGFjaGVkUGF5bWVudAAAAAIIBQAAABNvdXRBbW91bnRHcm9zc1R1cGxlAAAAAl8yBQAAAAxvdXRGZWVBbW91bnQFAAAADXVubGVhc2VBbW91bnQAAAAKAAAAAWkBAAAAC2NvbnN0cnVjdG9yAAAADAAAABJuZXV0cmlub0Fzc2V0SWRQcm0AAAAOYm9uZEFzc2V0SWRQcm0AAAASYXVjdGlvbkNvbnRyYWN0UHJtAAAAFmxpcXVpZGF0aW9uQ29udHJhY3RQcm0AAAAOcnBkQ29udHJhY3RQcm0AAAAbbm9kZU9yYWNsZVByb3ZpZGVyUHViS2V5UHJtAAAAG2JhbGFuY2VXYXZlc0xvY2tJbnRlcnZhbFBybQAAAB5iYWxhbmNlTmV1dHJpbm9Mb2NrSW50ZXJ2YWxQcm0AAAAVbWluV2F2ZXNTd2FwQW1vdW50UHJtAAAAGG1pbk5ldXRyaW5vU3dhcEFtb3VudFBybQAAABVuZXV0cmlub091dEZlZVBhcnRQcm0AAAASd2F2ZXNPdXRGZWVQYXJ0UHJtBAAAAAtjaGVja0NhbGxlcgkBAAAACHRoaXNPbmx5AAAAAQUAAAABaQMJAAAAAAAAAgUAAAALY2hlY2tDYWxsZXIFAAAAC2NoZWNrQ2FsbGVyAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAkAAAIAAAABAgAAABNubyBwYXltZW50cyBhbGxvd2VkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAEk5ldXRyaW5vQXNzZXRJZEtleQUAAAASbmV1dHJpbm9Bc3NldElkUHJtCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAADkJvbmRBc3NldElkS2V5BQAAAA5ib25kQXNzZXRJZFBybQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAABJBdWN0aW9uQ29udHJhY3RLZXkFAAAAEmF1Y3Rpb25Db250cmFjdFBybQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAABZMaXF1aWRhdGlvbkNvbnRyYWN0S2V5BQAAABZsaXF1aWRhdGlvbkNvbnRyYWN0UHJtCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAADlJQRENvbnRyYWN0S2V5BQAAAA5ycGRDb250cmFjdFBybQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAABtOb2RlT3JhY2xlUHJvdmlkZXJQdWJLZXlLZXkFAAAAG25vZGVPcmFjbGVQcm92aWRlclB1YktleVBybQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAbQmFsYW5jZVdhdmVzTG9ja0ludGVydmFsS2V5BQAAABtiYWxhbmNlV2F2ZXNMb2NrSW50ZXJ2YWxQcm0JAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAHkJhbGFuY2VOZXV0cmlub0xvY2tJbnRlcnZhbEtleQUAAAAeYmFsYW5jZU5ldXRyaW5vTG9ja0ludGVydmFsUHJtCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABVNaW5XYXZlc1N3YXBBbW91bnRLZXkFAAAAFW1pbldhdmVzU3dhcEFtb3VudFBybQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAYTWluTmV1dHJpbm9Td2FwQW1vdW50S2V5BQAAABhtaW5OZXV0cmlub1N3YXBBbW91bnRQcm0JAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAFU5ldXRyaW5vT3V0RmVlUGFydEtleQUAAAAVbmV1dHJpbm9PdXRGZWVQYXJ0UHJtCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABJXYXZlc091dEZlZVBhcnRLZXkFAAAAEndhdmVzT3V0RmVlUGFydFBybQUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAA1jb25zdHJ1Y3RvclYyAAAAAwAAAAxtYXRoQ29udHJhY3QAAAATbnNidFN0YWtpbmdDb250cmFjdAAAABRzd2Fwc1RpbWVmcmFtZUJsb2NrcwQAAAALY2hlY2tDYWxsZXIJAQAAAAh0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RWxzZQAAAAIJAAQiAAAAAQIAAAAcJXMlc19fY2ZnX19sZWFzaW5nTWFuYWdlclB1YgIAAAAsN0FVTVg1NHVrWU1ZdlBtbWE3eW9GZjVOalpoczRCdTVuejNFejlFVjhzdXIEAAAABm1uZ1B1YgkAAlkAAAABBQAAAAdtbmdQdWJTBAAAAA5ub2RlUmVnQWRkclN0cgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABCIAAAABAgAAAB8lcyVzX19jZmdfX25vZGVzUmVnaXN0cnlBZGRyZXNzAgAAACMzUDl2S3FRS2pVZG1wWEFmaVdhdThrclJFWUFZMVhyNjlwRQQAAAALbm9kZVJlZ0FkZHIJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAADm5vZGVSZWdBZGRyU3RyBAAAABFsR3JvdXBOb2RlTGlzdEtFWQkBAAAAGGdldExlYXNlR3JvdXBOb2RlTGlzdEtleQAAAAEFAAAACGdyb3VwTnVtBAAAAApsR3JOb2RlT3B0CQAEHQAAAAIFAAAABHRoaXMFAAAAEWxHcm91cE5vZGVMaXN0S0VZAwkBAAAACWlzRGVmaW5lZAAAAAEFAAAACmxHck5vZGVPcHQJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAABmdyb3VwIAkAAaQAAAABBQAAAAhncm91cE51bQIAAAAUIGFscmVhZHkgaW5pdGlhbGl6ZWQEAAAABW5MaXN0CQAEtQAAAAIFAAAABm5MaXN0UwUAAAADU0VQBAAAAAhleHBDb3VudAkAAZAAAAABBQAAAAVuSWR4cwMJAQAAAAIhPQAAAAIIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQUAAAAGbW5nUHViCQAAAgAAAAECAAAAHmFwcHJvdmVMZWFzaW5ncyBub3QgYXV0aG9yaXplZAQAAAANJHQwMjcyNDIyNzMwNAkBAAAADHJlYWROb2RlSW5mbwAAAAEAAAAAAAAAAAAEAAAABm5BZGRyMAgFAAAADSR0MDI3MjQyMjczMDQAAAACXzEEAAAACGxBbXRLRVkwCAUAAAANJHQwMjcyNDIyNzMwNAAAAAJfMgQAAAAFbEFtdDAIBQAAAA0kdDAyNzI0MjI3MzA0AAAAAl8zBAAAAAdsSWRLRVkwCAUAAAANJHQwMjcyNDIy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AAAAAgUAAAAGaGVpZ2h0BQAAAA5sYXN0U3dhcEhlaWdodAQAAAARaXNTd2FwVGltZWxpZmVOZXcJAABnAAAAAgUAAAAZcGFzc2VkQmxvY2tzQWZ0ZXJMYXN0U3dhcAUAAAAXc3dhcExpbWl0VGltZWxpZmVCbG9ja3MEAAAADnN3YXBMaW1pdFNwZW50AwUAAAARaXNTd2FwVGltZWxpZmVOZXcAAAAAAAAAAAAJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAGGtleVN3YXBVc2VyU3BlbnRJblBlcmlvZAAAAAEFAAAADnVzZXJBZGRyZXNzU3RyAAAAAAAAAAAABAAAAA5ibGNrczJMbXRSZXNldAMFAAAAEWlzU3dhcFRpbWVsaWZlTmV3AAAAAAAAAAAACQAAZQAAAAIFAAAAF3N3YXBMaW1pdFRpbWVsaWZlQmxvY2tzBQAAABlwYXNzZWRCbG9ja3NBZnRlckxhc3RTd2FwCQAFFAAAAAIFAAAAA25pbAkABRcAAAAFBQAAAAxzd2FwTGltaXRNYXgFAAAADnN3YXBMaW1pdFNwZW50BQAAAA5ibGNrczJMbXRSZXNldAUAAAAIZ25zYnRBbXQFAAAADWduc2J0QW10VG90YWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAQAAAACaWQJAAJYAAAAAQgFAAAAAnR4AAAAAmlkBAAAABNwdWJLZXlBZG1pbnNMaXN0U3RyCQAEuQAAAAIJAARMAAAAAgIAAAAsR0pkTFNhTGl2NUs3eHVlamFjOG1jUmNIb3lvM2RQckVTcnZrdEczYTZNQVIJAARMAAAAAgIAAAAsRVl3Wm1VUmQ1S0thUVJCanNWYTZnOERQaXNGb1M2U292Ukp0RmlMNWdNSFUJAARMAAAAAgIAAAAsRHRtQWZ1RGRDckhLOHNwZEFlQVl6cTZNc1plZ2VEOWduc3JwdVRSa0NiVkEJAARMAAAAAgIAAAAsNVdSWEZTandjVGJOZktjSnM4WnFYbVNTV1lzU1ZKVXRNdk1xWmo1aEg0TmMFAAAAA25pbAUAAAADU0VQBAAAABBwdWJLZXlBZG1pbnNMaXN0CQAEtQAAAAIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAPY29udHJvbENvbnRyYWN0AgAAAAwlc19fbXVsdGlzaWcFAAAAE3B1YktleUFkbWluc0xpc3RTdHIFAAAAA1NFUAQAAAAFY291bnQJAABkAAAAAgkAAGQAAAACCQAAZAAAAAIDCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAkAAlkAAAABCQABkQAAAAIFAAAAEHB1YktleUFkbWluc0xpc3QAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAADCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAQkAAlkAAAABCQABkQAAAAIFAAAAEHB1YktleUFkbWluc0xpc3QAAAAAAAAAAAEAAAAAAAAAAAEAAAAAAAAAAAADCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAgkAAlkAAAABCQABkQAAAAIFAAAAEHB1YktleUFkbWluc0xpc3QAAAAAAAAAAAIAAAAAAAAAAAEAAAAAAAAAAAADCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAwkAAlkAAAABCQABkQAAAAIFAAAAEHB1YktleUFkbWluc0xpc3QAAAAAAAAAAAMAAAAAAAAAAAIAAAAAAAAAAAAEAAAAByRtYXRjaDAFAAAAAnR4AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABVTcG9uc29yRmVlVHJhbnNhY3Rpb24EAAAACXNwb25zb3JUeAUAAAAHJG1hdGNoMAMJAQAAABtjaGVja0lzVmFsaWRNaW5TcG9uc29yZWRGZWUAAAABBQAAAAlzcG9uc29yVHgJAABnAAAAAgUAAAAFY291bnQAAAAAAAAAAAMHCQAAZwAAAAIFAAAABWNvdW50AAAAAAAAAAADXIXJug==", "chainId": 87, "height": 3178762, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DGXi5G7e3V7w9tE5cozZBow8awPHPhgjJbDHU4bXrn5U Next: CXT7k9xw21RWt7bJJzsd33bqgs9kTBEZZUwQqYr1fDHe Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let revisionNum = "b3ff7472a1d54a9f0c8f6d6665c4458c36a31e48"
5+
46 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), (("Mandatory this." + key) + " is not defined"))
57
68
2527 func getBoolByAddressAndKey (address,key) = valueOrElse(getBoolean(addressFromStringValue(address), key), false)
2628
2729
28-func asAnyList (val) = match val {
29- case valAnyLyst: List[Any] =>
30- valAnyLyst
30+func asAnyList (v) = match v {
31+ case l: List[Any] =>
32+ l
3133 case _ =>
3234 throw("fail to cast into List[Any]")
3335 }
3436
3537
36-func asString (val) = match val {
37- case valStr: String =>
38- valStr
38+func asString (v) = match v {
39+ case s: String =>
40+ s
3941 case _ =>
4042 throw("fail to cast into String")
4143 }
4244
4345
44-func asInt (val) = match val {
45- case valInt: Int =>
46- valInt
46+func asInt (v) = match v {
47+ case i: Int =>
48+ i
4749 case _ =>
4850 throw("fail to cast into Int")
4951 }
5052
5153
52-func asSwapParamsSTRUCT (val) = match val {
54+func asPayment (v) = match v {
55+ case p: AttachedPayment =>
56+ p
57+ case _ =>
58+ throw("fail to cast into AttachedPayment")
59+}
60+
61+
62+func asSwapParamsSTRUCT (v) = match v {
5363 case struct: (Int, Int, Int, Int, Int) =>
5464 struct
5565 case _ =>
5666 throw("fail to cast into Int")
5767 }
5868
59-
60-let pubKeyAdminsList = ["GJdLSaLiv5K7xuejac8mcRcHoyo3dPrESrvktG3a6MAR", "FWVffYr2ALmHMejZm3WqeLz6Sdym3gLFGtJn4KTwyU5x", "3Wh2LaWcb5gg7K2pPcW3Ep6EAuRBzYkAgrdpt43jTDFa", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"]
6169
6270 let SEP = "__"
6371
228236
229237 let rpdContract = getStringByKey(RPDContractKey)
230238
231-let controlContract = getStringByKey(ContolContractKey)
239+let controlContractStr = getStringByKey(ContolContractKey)
240+
241+let controlContract = addressFromStringValue(controlContractStr)
232242
233243 let mathContractAddress = getStringByKey(MathContractKey)
234244
235-let priceIndex = getNumberByAddressAndKey(controlContract, PriceIndexKey)
245+let priceIndex = getNumberByAddressAndKey(controlContractStr, PriceIndexKey)
236246
237-let isBlocked = getBoolByAddressAndKey(controlContract, IsBlockedKey)
247+let isBlocked = getBoolByAddressAndKey(controlContractStr, IsBlockedKey)
238248
239249 let nodeOracleProviderPubKey = fromBase58String(getStringByKey(NodeOracleProviderPubKeyKey))
240250
248258
249259 let nsbtStakingContract = addressFromStringValue(nsbtStakingContractStr)
250260
251-let currentPrice = getNumberByAddressAndKey(controlContract, PriceKey)
261+let currentPrice = getNumberByAddressAndKey(controlContractStr, PriceKey)
252262
253263 func checkIsValidMinSponsoredFee (tx) = {
254264 let MINTRANSFERFEE = 100000
265275 }
266276
267277
268-func getPriceHistory (block) = getNumberByAddressAndKey(controlContract, getPriceHistoryKey(block))
278+func getPriceHistory (block) = getNumberByAddressAndKey(controlContractStr, getPriceHistoryKey(block))
269279
270280
271-func getHeightPriceByIndex (index) = getNumberByAddressAndKey(controlContract, getHeightPriceByIndexKey(index))
281+func getHeightPriceByIndex (index) = getNumberByAddressAndKey(controlContractStr, getHeightPriceByIndexKey(index))
272282
273283
274284 func keyLockParamUserAmount (userAddress) = makeString(["%s%s%s", "paramByUser", userAddress, "amount"], SEP)
379389 }
380390
381391
392+func readNodeInfo (nodeIdx) = {
393+ let nodeAddress = getStakingNodeAddressByIndex(nodeIdx)
394+ let leasedAmtKEY = getLeaseAmountKey(nodeIdx)
395+ let leasedAmt = getNumberByKey(leasedAmtKEY)
396+ let leaseIdKEY = getLeaseIdKey(nodeIdx)
397+ let leaseId = value(getBinary(this, leaseIdKEY))
398+ $Tuple5(nodeAddress, leasedAmtKEY, leasedAmt, leaseIdKEY, leaseId)
399+ }
400+
401+
382402 func commonSwap (swapType,pmtAmount,userAddressStr,txId58,swapParamsByUserSYSREADONLY) = {
383- let $t01636716447 = swapParamsByUserSYSREADONLY
384- let swapLimitMax = $t01636716447._1
385- let swapLimitSpent = $t01636716447._2
386- let blcks2LmtReset = $t01636716447._3
403+ let $t01664916729 = swapParamsByUserSYSREADONLY
404+ let swapLimitMax = $t01664916729._1
405+ let swapLimitSpent = $t01664916729._2
406+ let blcks2LmtReset = $t01664916729._3
387407 let minSwapAmount = minSwapAmountREAD(swapType)
388408 let totalLocked = totalLockedREAD(swapType)
389409 let totalLockedByUser = totalLockedByUserREAD(swapType, userAddressStr)
463483 else (outFeePart >= PAULI))
464484 then throw(((("invalid outFeePart config for " + swapType) + " swap: outFeePart=") + toString(outFeePart)))
465485 else {
466- let leasePart = if (if ((swapType == "neutrino"))
486+ let unleaseAmount = if (if ((swapType == "neutrino"))
467487 then (outAmountGrossTuple._1 > 0)
468488 else false)
469- then prepareUnleaseAndLease(outAmountGrossTuple._1)
470- else nil
471- let state = (leasePart ++ [IntegerEntry(totalLockedByUserKEY(swapType, account), (totalLockedByUser - inAmount)), IntegerEntry(totalLockedKEY(swapType), (totalLocked - inAmount)), ScriptTransfer(userAddress, outNetAmount, outAmountGrossTuple._2), StringEntry(swapKEY(account, swapTxId), finishSwapDATA(dataArray, priceByIndex, outNetAmount, outFeeAmount, unlockHeight, index, withdrawTxId))])
472- $Tuple2(state, AttachedPayment(outAmountGrossTuple._2, outFeeAmount))
489+ then outAmountGrossTuple._1
490+ else 0
491+ let state = [IntegerEntry(totalLockedByUserKEY(swapType, account), (totalLockedByUser - inAmount)), IntegerEntry(totalLockedKEY(swapType), (totalLocked - inAmount)), ScriptTransfer(userAddress, outNetAmount, outAmountGrossTuple._2), StringEntry(swapKEY(account, swapTxId), finishSwapDATA(dataArray, priceByIndex, outNetAmount, outFeeAmount, unlockHeight, index, withdrawTxId))]
492+ $Tuple3(state, AttachedPayment(outAmountGrossTuple._2, outFeeAmount), unleaseAmount)
473493 }
474- }
475-
476-
477-func readNodeInfo (nodeIdx) = {
478- let nodeAddress = getStakingNodeAddressByIndex(nodeIdx)
479- let leasedAmtKEY = getLeaseAmountKey(nodeIdx)
480- let leasedAmt = getNumberByKey(leasedAmtKEY)
481- let leaseIdKEY = getLeaseIdKey(nodeIdx)
482- let leaseId = value(getBinary(this, leaseIdKEY))
483- $Tuple5(nodeAddress, leasedAmtKEY, leasedAmt, leaseIdKEY, leaseId)
484494 }
485495
486496
545555
546556
547557 @Callable(i)
548-func withdraw (account,index,swapTxId) = if ((size(i.payments) != 0))
549- then throw("no payments allowed")
550- else {
551- let $t02524625350 = commonWithdraw(account, index, swapTxId, toBase58String(i.transactionId))
552- let state = $t02524625350._1
553- let depositPayment = $t02524625350._2
554- let nsbtStakingDeposit = invoke(nsbtStakingContract, "deposit", nil, [depositPayment])
555- if ((nsbtStakingDeposit == nsbtStakingDeposit))
556- then state
557- else throw("Strict value is not equal to itself.")
558- }
558+func withdraw (account,index,swapTxId) = {
559+ let txId = toBase58String(i.transactionId)
560+ if ((size(i.payments) != 0))
561+ then throw("no payments allowed")
562+ else {
563+ let commonTuple = commonWithdraw(account, index, swapTxId, txId)
564+ let state = commonTuple._1
565+ let fee = commonTuple._2
566+ let unleaseAmt = commonTuple._3
567+ let unleaseInvOrEmpty = invoke(this, "internalUnleaseAndLease", [unleaseAmt], nil)
568+ if ((unleaseInvOrEmpty == unleaseInvOrEmpty))
569+ then if ((0 >= fee.amount))
570+ then state
571+ else {
572+ let nsbtStakingReward = invoke(nsbtStakingContract, "deposit", nil, [fee])
573+ if ((nsbtStakingReward == nsbtStakingReward))
574+ then state
575+ else throw("Strict value is not equal to itself.")
576+ }
577+ else throw("Strict value is not equal to itself.")
578+ }
579+ }
559580
560581
561582
562583 @Callable(i)
563-func transferToAuction () = if ((size(i.payments) != 0))
564- then throw("no payments allowed")
565- else {
566- let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsREADONLY", nil, nil))
567- let reserve = asInt(neutrinoMetrics[3])
568- let neutrinoSupply = asInt(neutrinoMetrics[5])
569- let surplus = asInt(neutrinoMetrics[6])
570- let nsbtSupply = asInt(neutrinoMetrics[9])
571- let auctionNBAmount = (neutrinoSupply - assetBalance(addressFromStringValue(auctionContract), bondAssetId))
572- let surplusWithLiquidation = (surplus - assetBalance(addressFromStringValue(liquidationContract), neutrinoAssetId))
573- if (isBlocked)
574- then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
575- else if ((auctionNBAmount > (1 * PAULI)))
576- then [ScriptTransfer(addressFromStringValue(auctionContract), auctionNBAmount, bondAssetId)]
577- else if ((surplusWithLiquidation >= (1 * PAULI)))
578- then [ScriptTransfer(addressFromStringValue(liquidationContract), surplusWithLiquidation, neutrinoAssetId)]
579- else throw(((((((("bond were generated or do not need it. Deficit:" + toString(auctionNBAmount)) + "|") + toString(0)) + ". Surplus:") + toString(surplusWithLiquidation)) + "|") + toString(surplus)))
580- }
584+func internalUnleaseAndLease (unleaseAmount) = if ((i.caller != this))
585+ then throw("internalUnleaseAndLease is not public method")
586+ else prepareUnleaseAndLease(unleaseAmount)
581587
582588
583589
613619 if ((i.callerPublicKey != mngPub))
614620 then throw("approveLeasings not authorized")
615621 else {
616- let $t02852028582 = readNodeInfo(0)
617- let nAddr0 = $t02852028582._1
618- let lAmtKEY0 = $t02852028582._2
619- let lAmt0 = $t02852028582._3
620- let lIdKEY0 = $t02852028582._4
621- let lId0 = $t02852028582._5
622- let $t02858528647 = readNodeInfo(1)
623- let nAddr1 = $t02858528647._1
624- let lAmtKEY1 = $t02858528647._2
625- let lAmt1 = $t02858528647._3
626- let lIdKEY1 = $t02858528647._4
627- let lId1 = $t02858528647._5
622+ let $t02724227304 = readNodeInfo(0)
623+ let nAddr0 = $t02724227304._1
624+ let lAmtKEY0 = $t02724227304._2
625+ let lAmt0 = $t02724227304._3
626+ let lIdKEY0 = $t02724227304._4
627+ let lId0 = $t02724227304._5
628+ let $t02730727369 = readNodeInfo(1)
629+ let nAddr1 = $t02730727369._1
630+ let lAmtKEY1 = $t02730727369._2
631+ let lAmt1 = $t02730727369._3
632+ let lIdKEY1 = $t02730727369._4
633+ let lId1 = $t02730727369._5
628634 let newL0 = Lease(nAddr0, (lAmt0 - ((lAmt * expCount) / 2)))
629635 let newL1 = Lease(nAddr1, (lAmt1 - ((lAmt * expCount) / 2)))
630636 let validation = invoke(nodeRegAddr, "validateAndApproveLeasings", [nListS], nil)
685691 @Verifier(tx)
686692 func verify () = {
687693 let id = toBase58String(tx.id)
694+ let pubKeyAdminsListStr = makeString(["GJdLSaLiv5K7xuejac8mcRcHoyo3dPrESrvktG3a6MAR", "EYwZmURd5KKaQRBjsVa6g8DPisFoS6SovRJtFiL5gMHU", "DtmAfuDdCrHK8spdAeAYzq6MsZegeD9gnsrpuTRkCbVA", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"], SEP)
695+ let pubKeyAdminsList = split(valueOrElse(getString(controlContract, "%s__multisig"), pubKeyAdminsListStr), SEP)
688696 let count = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0])))
689697 then 1
690698 else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(pubKeyAdminsList[1])))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let revisionNum = "b3ff7472a1d54a9f0c8f6d6665c4458c36a31e48"
5+
46 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), (("Mandatory this." + key) + " is not defined"))
57
68
79 func lcalc (l) = calculateLeaseId(l)
810
911
1012 func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0)
1113
1214
1315 func getStringByKey (key) = valueOrElse(getString(this, key), "")
1416
1517
1618 func getBoolByKey (key) = valueOrElse(getBoolean(this, key), false)
1719
1820
1921 func getNumberByAddressAndKey (address,key) = valueOrElse(getInteger(addressFromStringValue(address), key), 0)
2022
2123
2224 func getStringByAddressAndKey (address,key) = valueOrElse(getString(addressFromStringValue(address), key), "")
2325
2426
2527 func getBoolByAddressAndKey (address,key) = valueOrElse(getBoolean(addressFromStringValue(address), key), false)
2628
2729
28-func asAnyList (val) = match val {
29- case valAnyLyst: List[Any] =>
30- valAnyLyst
30+func asAnyList (v) = match v {
31+ case l: List[Any] =>
32+ l
3133 case _ =>
3234 throw("fail to cast into List[Any]")
3335 }
3436
3537
36-func asString (val) = match val {
37- case valStr: String =>
38- valStr
38+func asString (v) = match v {
39+ case s: String =>
40+ s
3941 case _ =>
4042 throw("fail to cast into String")
4143 }
4244
4345
44-func asInt (val) = match val {
45- case valInt: Int =>
46- valInt
46+func asInt (v) = match v {
47+ case i: Int =>
48+ i
4749 case _ =>
4850 throw("fail to cast into Int")
4951 }
5052
5153
52-func asSwapParamsSTRUCT (val) = match val {
54+func asPayment (v) = match v {
55+ case p: AttachedPayment =>
56+ p
57+ case _ =>
58+ throw("fail to cast into AttachedPayment")
59+}
60+
61+
62+func asSwapParamsSTRUCT (v) = match v {
5363 case struct: (Int, Int, Int, Int, Int) =>
5464 struct
5565 case _ =>
5666 throw("fail to cast into Int")
5767 }
5868
59-
60-let pubKeyAdminsList = ["GJdLSaLiv5K7xuejac8mcRcHoyo3dPrESrvktG3a6MAR", "FWVffYr2ALmHMejZm3WqeLz6Sdym3gLFGtJn4KTwyU5x", "3Wh2LaWcb5gg7K2pPcW3Ep6EAuRBzYkAgrdpt43jTDFa", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"]
6169
6270 let SEP = "__"
6371
6472 let WAVELET = 100000000
6573
6674 let PAULI = 1000000
6775
6876 let PRICELET = 1000000
6977
7078 let DEFAULTSWAPFEE = 20000
7179
7280 let IdxNetAmount = 0
7381
7482 let IdxFeeAmount = 1
7583
7684 let IdxGrossAmount = 2
7785
7886 let NeutrinoAssetIdKey = "neutrino_asset_id"
7987
8088 let BondAssetIdKey = "bond_asset_id"
8189
8290 let AuctionContractKey = "auction_contract"
8391
8492 let NsbtStakingContractKey = "nsbtStakingContract"
8593
8694 let LiquidationContractKey = "liquidation_contract"
8795
8896 let RPDContractKey = "rpd_contract"
8997
9098 let ContolContractKey = "control_contract"
9199
92100 let MathContractKey = "math_contract"
93101
94102 let BalanceWavesLockIntervalKey = "balance_waves_lock_interval"
95103
96104 let BalanceNeutrinoLockIntervalKey = "balance_neutrino_lock_interval"
97105
98106 let MinWavesSwapAmountKey = "min_waves_swap_amount"
99107
100108 let MinNeutrinoSwapAmountKey = "min_neutrino_swap_amount"
101109
102110 let NodeOracleProviderPubKeyKey = "node_oracle_provider"
103111
104112 let NeutrinoOutFeePartKey = "neutrinoOut_swap_feePart"
105113
106114 let WavesOutFeePartKey = "wavesOut_swap_feePart"
107115
108116 let FeesManagerAddressKey = "fees_manager_address"
109117
110118 func keyNodeRegistry (address) = ("%s__" + address)
111119
112120
113121 let PriceKey = "price"
114122
115123 let PriceIndexKey = "price_index"
116124
117125 let IsBlockedKey = "is_blocked"
118126
119127 func getPriceHistoryKey (block) = ((PriceKey + "_") + toString(block))
120128
121129
122130 func getHeightPriceByIndexKey (index) = ((PriceIndexKey + "_") + toString(index))
123131
124132
125133 func getStakingNodeByIndex (idx) = getStringByKey(makeString(["%s%d%s", "lease", toString(idx), "nodeAddress"], SEP))
126134
127135
128136 func getStakingNodeAddressByIndex (idx) = addressFromStringValue(getStakingNodeByIndex(idx))
129137
130138
131139 func getReservedAmountForSponsorship () = valueOrElse(getInteger(this, makeString(["%s%s", "lease", "sponsorshipWavesReserve"], SEP)), (1000 * WAVELET))
132140
133141
134142 func getBalanceUnlockBlockKey (owner) = ("balance_unlock_block_" + owner)
135143
136144
137145 func getLeaseIdKey (nodeIndex) = makeString(["%s%d%s", "lease", toString(nodeIndex), "id"], SEP)
138146
139147
140148 func getLeaseIdByAddressKey (nodeAddress) = makeString(["%s%s%s", "leaseByAddress", nodeAddress, "id"], SEP)
141149
142150
143151 func getLeaseAmountKey (nodeIndex) = makeString(["%s%d%s", "lease", toString(nodeIndex), "amount"], SEP)
144152
145153
146154 func getLeaseAmountByAddressKey (nodeAddress) = makeString(["%s%s%s", "leaseByAddress", nodeAddress, "amount"], SEP)
147155
148156
149157 func getLeaseGroupNodeListKey (groupNum) = makeString(["%s%d%s", "leaseGroup", toString(groupNum), "nodeList"], SEP)
150158
151159
152160 func minSwapAmountKEY (swapType) = (("min_" + swapType) + "_swap_amount")
153161
154162
155163 func totalLockedKEY (swapType) = ("balance_lock_" + swapType)
156164
157165
158166 func totalLockedByUserKEY (swapType,owner) = makeString(["balance_lock", swapType, owner], "_")
159167
160168
161169 func balanceLockIntervalKEY (swapType) = (("balance_" + swapType) + "_lock_interval")
162170
163171
164172 func nodeBalanceLockIntervalKEY () = "balance_node_lock_interval"
165173
166174
167175 func outFeePartKEY (swapType) = (swapType + "Out_swap_feePart")
168176
169177
170178 func swapsTimeframeKEY () = "swaps_timeframe"
171179
172180
173181 func minSwapAmountREAD (swapType) = valueOrElse(getInteger(this, minSwapAmountKEY(swapType)), 0)
174182
175183
176184 func swapsTimeframeREAD () = valueOrElse(getInteger(this, swapsTimeframeKEY()), 1440)
177185
178186
179187 func totalLockedREAD (swapType) = valueOrElse(getInteger(this, totalLockedKEY(swapType)), 0)
180188
181189
182190 func totalLockedByUserREAD (swapType,owner) = valueOrElse(getInteger(this, totalLockedByUserKEY(swapType, owner)), 0)
183191
184192
185193 func balanceLockIntervalREAD (swapType) = valueOrElse(getInteger(this, balanceLockIntervalKEY(swapType)), 1440)
186194
187195
188196 func nodeBalanceLockIntervalREAD () = valueOrElse(getInteger(this, nodeBalanceLockIntervalKEY()), 1)
189197
190198
191199 func keySwapUserSpentInPeriod (userAddress) = makeString(["%s%s", "swapUserSpentInPeriod", userAddress], SEP)
192200
193201
194202 func keyUserLastSwapHeight (userAddress) = makeString(["%s%s", "userLastSwapHeight", userAddress], SEP)
195203
196204
197205 func feeManagerAddressREAD () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, FeesManagerAddressKey), (FeesManagerAddressKey + " is not specified"))), (FeesManagerAddressKey + " invalid address format"))
198206
199207
200208 func convertNeutrinoToWaves (amount,price) = fraction(fraction(amount, PRICELET, price), WAVELET, PAULI)
201209
202210
203211 func convertWavesToNeutrino (amount,price) = fraction(fraction(amount, price, PRICELET), PAULI, WAVELET)
204212
205213
206214 func convertWavesToBond (amount,price) = convertWavesToNeutrino(amount, price)
207215
208216
209217 func convertJsonArrayToList (jsonArray) = split(jsonArray, ",")
210218
211219
212220 func minSwapAmountFAIL (swapType,minSwapAmount) = throw(((("The specified amount in " + swapType) + " swap is less than the required minimum of ") + toString(minSwapAmount)))
213221
214222
215223 func emergencyShutdownFAIL () = throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
216224
217225
218226 func priceIndexFAIL (index,priceIndex,indexHeight,unlockHeight,prevIndexHeight) = throw(((((((((("invalid price history index: index=" + toString(index)) + " priceIndex=") + toString(priceIndex)) + " indexHeight=") + toString(indexHeight)) + " unlockHeight=") + toString(unlockHeight)) + " prevIndexHeight=") + toString(prevIndexHeight)))
219227
220228
221229 let liquidationContract = getStringByKey(LiquidationContractKey)
222230
223231 let nsbtStakingContractStr = getStringByKey(NsbtStakingContractKey)
224232
225233 let neutrinoAssetId = fromBase58String(getStringByKey(NeutrinoAssetIdKey))
226234
227235 let auctionContract = getStringByKey(AuctionContractKey)
228236
229237 let rpdContract = getStringByKey(RPDContractKey)
230238
231-let controlContract = getStringByKey(ContolContractKey)
239+let controlContractStr = getStringByKey(ContolContractKey)
240+
241+let controlContract = addressFromStringValue(controlContractStr)
232242
233243 let mathContractAddress = getStringByKey(MathContractKey)
234244
235-let priceIndex = getNumberByAddressAndKey(controlContract, PriceIndexKey)
245+let priceIndex = getNumberByAddressAndKey(controlContractStr, PriceIndexKey)
236246
237-let isBlocked = getBoolByAddressAndKey(controlContract, IsBlockedKey)
247+let isBlocked = getBoolByAddressAndKey(controlContractStr, IsBlockedKey)
238248
239249 let nodeOracleProviderPubKey = fromBase58String(getStringByKey(NodeOracleProviderPubKeyKey))
240250
241251 let bondAssetId = fromBase58String("6nSpVyNH7yM69eg446wrQR94ipbbcmZMU1ENPwanC97g")
242252
243253 let deprecatedBondAssetId = fromBase58String("975akZBfnMj513U7MZaHKzQrmsEx5aE3wdWKTrHBhbjF")
244254
245255 let neutrinoContract = this
246256
247257 let mathContract = addressFromStringValue(mathContractAddress)
248258
249259 let nsbtStakingContract = addressFromStringValue(nsbtStakingContractStr)
250260
251-let currentPrice = getNumberByAddressAndKey(controlContract, PriceKey)
261+let currentPrice = getNumberByAddressAndKey(controlContractStr, PriceKey)
252262
253263 func checkIsValidMinSponsoredFee (tx) = {
254264 let MINTRANSFERFEE = 100000
255265 let SponsoredFeeUpperBound = 1000
256266 let realNeutrinoFee = convertWavesToNeutrino(MINTRANSFERFEE, currentPrice)
257267 let minNeutrinoFee = (realNeutrinoFee * 2)
258268 let maxNeutrinoFee = fraction(realNeutrinoFee, SponsoredFeeUpperBound, 100)
259269 let inputFee = value(tx.minSponsoredAssetFee)
260270 if (if ((inputFee >= minNeutrinoFee))
261271 then (maxNeutrinoFee >= inputFee)
262272 else false)
263273 then (tx.assetId == neutrinoAssetId)
264274 else false
265275 }
266276
267277
268-func getPriceHistory (block) = getNumberByAddressAndKey(controlContract, getPriceHistoryKey(block))
278+func getPriceHistory (block) = getNumberByAddressAndKey(controlContractStr, getPriceHistoryKey(block))
269279
270280
271-func getHeightPriceByIndex (index) = getNumberByAddressAndKey(controlContract, getHeightPriceByIndexKey(index))
281+func getHeightPriceByIndex (index) = getNumberByAddressAndKey(controlContractStr, getHeightPriceByIndexKey(index))
272282
273283
274284 func keyLockParamUserAmount (userAddress) = makeString(["%s%s%s", "paramByUser", userAddress, "amount"], SEP)
275285
276286
277287 let sIdxSwapType = 1
278288
279289 let sIdxStatus = 2
280290
281291 let sIdxInAmount = 3
282292
283293 let sIdxPrice = 4
284294
285295 let sIdxOutNetAmount = 5
286296
287297 let sIdxOutFeeAmount = 6
288298
289299 let sIdxStartHeight = 7
290300
291301 let sIdxStartTimestamp = 8
292302
293303 let sIdxEndHeight = 9
294304
295305 let sIdxEndTimestamp = 10
296306
297307 let sIdxSelfUnlockHeight = 11
298308
299309 let sIdxRandUnlockHeight = 12
300310
301311 let sIdxIndex = 13
302312
303313 let sIdxWithdrawTxId = 14
304314
305315 let sIdxMinRand = 15
306316
307317 let sIdxMaxRand = 16
308318
309319 func swapKEY (userAddress,txId) = makeString(["%s%s", userAddress, txId], SEP)
310320
311321
312322 func strSwapDATA (swapType,status,inAmount,price,outNetAmount,outFeeAmount,startHeight,startTimestamp,endHeight,endTimestamp,selfUnlockHeight,randUnlockHeight,index,withdrawTxId,randMin,randMax) = makeString(["%s%s%d%d%d%d%d%d%d%d%d%d%d%s", swapType, status, inAmount, price, outNetAmount, outFeeAmount, startHeight, startTimestamp, endHeight, endTimestamp, selfUnlockHeight, randUnlockHeight, index, withdrawTxId, randMin, randMax], SEP)
313323
314324
315325 func pendingSwapDATA (swapType,inAssetAmount,selfUnlockHeight) = strSwapDATA(swapType, "PENDING", toString(inAssetAmount), "0", "0", "0", toString(height), toString(lastBlock.timestamp), "0", "0", toString(selfUnlockHeight), "0", "0", "NULL", "0", "0")
316326
317327
318328 func finishSwapDATA (dataArray,price,outNetAmount,outFeeAmount,randUnlockHeight,index,withdrawTxId) = strSwapDATA(dataArray[sIdxSwapType], "FINISHED", dataArray[sIdxInAmount], toString(price), toString(outNetAmount), toString(outFeeAmount), dataArray[sIdxStartHeight], dataArray[sIdxStartTimestamp], toString(height), toString(lastBlock.timestamp), dataArray[sIdxSelfUnlockHeight], toString(randUnlockHeight), toString(index), withdrawTxId, dataArray[sIdxMinRand], dataArray[sIdxMaxRand])
319329
320330
321331 func swapDataFailOrREAD (userAddress,swapTxId) = {
322332 let swapKey = swapKEY(userAddress, swapTxId)
323333 split(valueOrErrorMessage(getString(this, swapKey), ("no swap data for " + swapKey)), SEP)
324334 }
325335
326336
327337 func applyFees (amountGross,feePart) = {
328338 let feeAmount = fraction(amountGross, feePart, PAULI)
329339 [(amountGross - feeAmount), feeAmount, amountGross]
330340 }
331341
332342
333343 func abs (x) = if ((0 > x))
334344 then -(x)
335345 else x
336346
337347
338348 func selectNode (unleaseAmount) = {
339349 let amountToLease = ((wavesBalance(neutrinoContract).available - unleaseAmount) - getReservedAmountForSponsorship())
340350 let oldLeased0 = getNumberByKey(getLeaseAmountKey(0))
341351 let oldLeased1 = getNumberByKey(getLeaseAmountKey(1))
342352 let newLeased0 = (amountToLease + oldLeased0)
343353 let newLeased1 = (amountToLease + oldLeased1)
344354 if (if ((newLeased0 > 0))
345355 then true
346356 else (newLeased1 > 0))
347357 then {
348358 let delta0 = abs((newLeased0 - oldLeased1))
349359 let delta1 = abs((newLeased1 - oldLeased0))
350360 if ((delta1 >= delta0))
351361 then $Tuple2(0, newLeased0)
352362 else $Tuple2(1, newLeased1)
353363 }
354364 else $Tuple2(-1, 0)
355365 }
356366
357367
358368 func thisOnly (i) = if ((i.caller != this))
359369 then throw("Permission denied: this contract only allowed")
360370 else true
361371
362372
363373 func prepareUnleaseAndLease (unleaseAmount) = {
364374 let nodeTuple = selectNode(unleaseAmount)
365375 let nodeIndex = nodeTuple._1
366376 let newLeaseAmount = nodeTuple._2
367377 if ((newLeaseAmount > 0))
368378 then {
369379 let leaseIdKey = getLeaseIdKey(nodeIndex)
370380 let oldLease = getBinary(this, leaseIdKey)
371381 let unleaseOrEmpty = if (isDefined(oldLease))
372382 then [LeaseCancel(value(oldLease))]
373383 else nil
374384 let leaseAmountKey = getLeaseAmountKey(nodeIndex)
375385 let lease = Lease(getStakingNodeAddressByIndex(nodeIndex), newLeaseAmount)
376386 (unleaseOrEmpty ++ [lease, BinaryEntry(leaseIdKey, lcalc(lease)), IntegerEntry(getLeaseAmountKey(nodeIndex), newLeaseAmount)])
377387 }
378388 else nil
379389 }
380390
381391
392+func readNodeInfo (nodeIdx) = {
393+ let nodeAddress = getStakingNodeAddressByIndex(nodeIdx)
394+ let leasedAmtKEY = getLeaseAmountKey(nodeIdx)
395+ let leasedAmt = getNumberByKey(leasedAmtKEY)
396+ let leaseIdKEY = getLeaseIdKey(nodeIdx)
397+ let leaseId = value(getBinary(this, leaseIdKEY))
398+ $Tuple5(nodeAddress, leasedAmtKEY, leasedAmt, leaseIdKEY, leaseId)
399+ }
400+
401+
382402 func commonSwap (swapType,pmtAmount,userAddressStr,txId58,swapParamsByUserSYSREADONLY) = {
383- let $t01636716447 = swapParamsByUserSYSREADONLY
384- let swapLimitMax = $t01636716447._1
385- let swapLimitSpent = $t01636716447._2
386- let blcks2LmtReset = $t01636716447._3
403+ let $t01664916729 = swapParamsByUserSYSREADONLY
404+ let swapLimitMax = $t01664916729._1
405+ let swapLimitSpent = $t01664916729._2
406+ let blcks2LmtReset = $t01664916729._3
387407 let minSwapAmount = minSwapAmountREAD(swapType)
388408 let totalLocked = totalLockedREAD(swapType)
389409 let totalLockedByUser = totalLockedByUserREAD(swapType, userAddressStr)
390410 let nodeAddress = getStakingNodeByIndex(0)
391411 let priceByIndex = getPriceHistory(getHeightPriceByIndex(priceIndex))
392412 let isSwapByNode = (nodeAddress == userAddressStr)
393413 let balanceLockMaxInterval = if (isSwapByNode)
394414 then nodeBalanceLockIntervalREAD()
395415 else balanceLockIntervalREAD(swapType)
396416 let selfUnlockHeight = (height + balanceLockMaxInterval)
397417 let swapUsdnVolume = if ((swapType == "neutrino"))
398418 then pmtAmount
399419 else convertWavesToNeutrino(pmtAmount, priceByIndex)
400420 if ((minSwapAmount > pmtAmount))
401421 then minSwapAmountFAIL(swapType, minSwapAmount)
402422 else if (if (!(isSwapByNode))
403423 then (swapLimitSpent > 0)
404424 else false)
405425 then throw(("You have exceeded swap limit! Next allowed swap height is " + toString((height + blcks2LmtReset))))
406426 else if (if (!(isSwapByNode))
407427 then (swapUsdnVolume > swapLimitMax)
408428 else false)
409429 then throw(((("You have exceeded your swap limit! Requested: " + toString(swapUsdnVolume)) + ", available: ") + toString(swapLimitMax)))
410430 else if (isBlocked)
411431 then emergencyShutdownFAIL()
412432 else {
413433 let leasePart = if ((swapType == "waves"))
414434 then prepareUnleaseAndLease(0)
415435 else nil
416436 $Tuple2(([IntegerEntry(keySwapUserSpentInPeriod(userAddressStr), swapUsdnVolume), IntegerEntry(keyUserLastSwapHeight(userAddressStr), height), IntegerEntry(totalLockedByUserKEY(swapType, userAddressStr), (totalLockedByUser + pmtAmount)), IntegerEntry(getBalanceUnlockBlockKey(userAddressStr), selfUnlockHeight), IntegerEntry(totalLockedKEY(swapType), (totalLocked + pmtAmount)), StringEntry(swapKEY(userAddressStr, txId58), pendingSwapDATA(swapType, pmtAmount, selfUnlockHeight))] ++ leasePart), unit)
417437 }
418438 }
419439
420440
421441 func commonWithdraw (account,index,swapTxId,withdrawTxId) = {
422442 let userAddress = addressFromStringValue(account)
423443 let feeManagerAddress = feeManagerAddressREAD()
424444 let dataArray = swapDataFailOrREAD(account, swapTxId)
425445 let selfUnlockHeight = parseIntValue(dataArray[sIdxSelfUnlockHeight])
426446 let swapType = dataArray[sIdxSwapType]
427447 let inAmount = parseIntValue(dataArray[sIdxInAmount])
428448 let swapStatus = dataArray[sIdxStatus]
429449 let startHeight = parseIntValue(dataArray[sIdxStartHeight])
430450 let outFeePart = valueOrElse(getInteger(this, outFeePartKEY(swapType)), DEFAULTSWAPFEE)
431451 let totalLocked = totalLockedREAD(swapType)
432452 let totalLockedByUser = totalLockedByUserREAD(swapType, account)
433453 let unlockHeight = selfUnlockHeight
434454 let indexHeight = getHeightPriceByIndex(index)
435455 let prevIndexHeight = getHeightPriceByIndex((index - 1))
436456 let priceByIndex = getPriceHistory(indexHeight)
437457 let outAmountGrossTuple = if ((swapType == "waves"))
438458 then $Tuple2(convertWavesToNeutrino(inAmount, priceByIndex), neutrinoAssetId)
439459 else if ((swapType == "neutrino"))
440460 then $Tuple2(convertNeutrinoToWaves(inAmount, priceByIndex), unit)
441461 else throw(("Unsupported swap type " + swapType))
442462 let payoutsArray = applyFees(outAmountGrossTuple._1, outFeePart)
443463 let outNetAmount = payoutsArray[IdxNetAmount]
444464 let outFeeAmount = payoutsArray[IdxFeeAmount]
445465 if (isBlocked)
446466 then emergencyShutdownFAIL()
447467 else if ((swapStatus != "PENDING"))
448468 then throw("swap has been already processed")
449469 else if ((unlockHeight > height))
450470 then throw((("please wait for: " + toString(unlockHeight)) + " block height to withdraw funds"))
451471 else if (if (if ((index > priceIndex))
452472 then true
453473 else (unlockHeight > indexHeight))
454474 then true
455475 else if ((prevIndexHeight != 0))
456476 then (prevIndexHeight >= unlockHeight)
457477 else false)
458478 then priceIndexFAIL(index, priceIndex, indexHeight, unlockHeight, prevIndexHeight)
459479 else if ((0 >= payoutsArray[IdxGrossAmount]))
460480 then throw("balance equals zero")
461481 else if (if ((0 > outFeePart))
462482 then true
463483 else (outFeePart >= PAULI))
464484 then throw(((("invalid outFeePart config for " + swapType) + " swap: outFeePart=") + toString(outFeePart)))
465485 else {
466- let leasePart = if (if ((swapType == "neutrino"))
486+ let unleaseAmount = if (if ((swapType == "neutrino"))
467487 then (outAmountGrossTuple._1 > 0)
468488 else false)
469- then prepareUnleaseAndLease(outAmountGrossTuple._1)
470- else nil
471- let state = (leasePart ++ [IntegerEntry(totalLockedByUserKEY(swapType, account), (totalLockedByUser - inAmount)), IntegerEntry(totalLockedKEY(swapType), (totalLocked - inAmount)), ScriptTransfer(userAddress, outNetAmount, outAmountGrossTuple._2), StringEntry(swapKEY(account, swapTxId), finishSwapDATA(dataArray, priceByIndex, outNetAmount, outFeeAmount, unlockHeight, index, withdrawTxId))])
472- $Tuple2(state, AttachedPayment(outAmountGrossTuple._2, outFeeAmount))
489+ then outAmountGrossTuple._1
490+ else 0
491+ let state = [IntegerEntry(totalLockedByUserKEY(swapType, account), (totalLockedByUser - inAmount)), IntegerEntry(totalLockedKEY(swapType), (totalLocked - inAmount)), ScriptTransfer(userAddress, outNetAmount, outAmountGrossTuple._2), StringEntry(swapKEY(account, swapTxId), finishSwapDATA(dataArray, priceByIndex, outNetAmount, outFeeAmount, unlockHeight, index, withdrawTxId))]
492+ $Tuple3(state, AttachedPayment(outAmountGrossTuple._2, outFeeAmount), unleaseAmount)
473493 }
474- }
475-
476-
477-func readNodeInfo (nodeIdx) = {
478- let nodeAddress = getStakingNodeAddressByIndex(nodeIdx)
479- let leasedAmtKEY = getLeaseAmountKey(nodeIdx)
480- let leasedAmt = getNumberByKey(leasedAmtKEY)
481- let leaseIdKEY = getLeaseIdKey(nodeIdx)
482- let leaseId = value(getBinary(this, leaseIdKEY))
483- $Tuple5(nodeAddress, leasedAmtKEY, leasedAmt, leaseIdKEY, leaseId)
484494 }
485495
486496
487497 @Callable(i)
488498 func constructor (neutrinoAssetIdPrm,bondAssetIdPrm,auctionContractPrm,liquidationContractPrm,rpdContractPrm,nodeOracleProviderPubKeyPrm,balanceWavesLockIntervalPrm,balanceNeutrinoLockIntervalPrm,minWavesSwapAmountPrm,minNeutrinoSwapAmountPrm,neutrinoOutFeePartPrm,wavesOutFeePartPrm) = {
489499 let checkCaller = thisOnly(i)
490500 if ((checkCaller == checkCaller))
491501 then if ((size(i.payments) != 0))
492502 then throw("no payments allowed")
493503 else [StringEntry(NeutrinoAssetIdKey, neutrinoAssetIdPrm), StringEntry(BondAssetIdKey, bondAssetIdPrm), StringEntry(AuctionContractKey, auctionContractPrm), StringEntry(LiquidationContractKey, liquidationContractPrm), StringEntry(RPDContractKey, rpdContractPrm), StringEntry(NodeOracleProviderPubKeyKey, nodeOracleProviderPubKeyPrm), IntegerEntry(BalanceWavesLockIntervalKey, balanceWavesLockIntervalPrm), IntegerEntry(BalanceNeutrinoLockIntervalKey, balanceNeutrinoLockIntervalPrm), IntegerEntry(MinWavesSwapAmountKey, minWavesSwapAmountPrm), IntegerEntry(MinNeutrinoSwapAmountKey, minNeutrinoSwapAmountPrm), IntegerEntry(NeutrinoOutFeePartKey, neutrinoOutFeePartPrm), IntegerEntry(WavesOutFeePartKey, wavesOutFeePartPrm)]
494504 else throw("Strict value is not equal to itself.")
495505 }
496506
497507
498508
499509 @Callable(i)
500510 func constructorV2 (mathContract,nsbtStakingContract,swapsTimeframeBlocks) = {
501511 let checkCaller = thisOnly(i)
502512 if ((checkCaller == checkCaller))
503513 then if ((size(i.payments) != 0))
504514 then throw("no payments allowed")
505515 else [StringEntry(MathContractKey, mathContract), StringEntry(NsbtStakingContractKey, nsbtStakingContract), IntegerEntry(swapsTimeframeKEY(), swapsTimeframeBlocks)]
506516 else throw("Strict value is not equal to itself.")
507517 }
508518
509519
510520
511521 @Callable(i)
512522 func swapWavesToNeutrino () = if ((size(i.payments) != 1))
513523 then throw("swapWavesToNeutrino require only one payment")
514524 else {
515525 let pmt = value(i.payments[0])
516526 if (isDefined(pmt.assetId))
517527 then throw("Only Waves token is allowed for swapping.")
518528 else {
519529 let userAddress = toString(i.caller)
520530 let txId58 = toBase58String(i.transactionId)
521531 let swapParamsSTRUCT = asSwapParamsSTRUCT(invoke(this, "swapParamsByUserSYSREADONLY", [userAddress, 0], nil))
522532 let commonSwapResult = commonSwap("waves", pmt.amount, userAddress, txId58, swapParamsSTRUCT)
523533 commonSwapResult
524534 }
525535 }
526536
527537
528538
529539 @Callable(i)
530540 func swapNeutrinoToWaves () = if ((size(i.payments) != 1))
531541 then throw("swapNeutrinoToWaves require only one payment")
532542 else {
533543 let pmt = value(i.payments[0])
534544 if ((pmt.assetId != neutrinoAssetId))
535545 then throw("Only appropriate Neutrino tokens are allowed for swapping.")
536546 else {
537547 let userAddress = toString(i.caller)
538548 let txId58 = toBase58String(i.transactionId)
539549 let swapParamsSTRUCT = asSwapParamsSTRUCT(invoke(this, "swapParamsByUserSYSREADONLY", [userAddress, 0], nil))
540550 let commonSwapResult = commonSwap("neutrino", pmt.amount, userAddress, txId58, swapParamsSTRUCT)
541551 commonSwapResult
542552 }
543553 }
544554
545555
546556
547557 @Callable(i)
548-func withdraw (account,index,swapTxId) = if ((size(i.payments) != 0))
549- then throw("no payments allowed")
550- else {
551- let $t02524625350 = commonWithdraw(account, index, swapTxId, toBase58String(i.transactionId))
552- let state = $t02524625350._1
553- let depositPayment = $t02524625350._2
554- let nsbtStakingDeposit = invoke(nsbtStakingContract, "deposit", nil, [depositPayment])
555- if ((nsbtStakingDeposit == nsbtStakingDeposit))
556- then state
557- else throw("Strict value is not equal to itself.")
558- }
558+func withdraw (account,index,swapTxId) = {
559+ let txId = toBase58String(i.transactionId)
560+ if ((size(i.payments) != 0))
561+ then throw("no payments allowed")
562+ else {
563+ let commonTuple = commonWithdraw(account, index, swapTxId, txId)
564+ let state = commonTuple._1
565+ let fee = commonTuple._2
566+ let unleaseAmt = commonTuple._3
567+ let unleaseInvOrEmpty = invoke(this, "internalUnleaseAndLease", [unleaseAmt], nil)
568+ if ((unleaseInvOrEmpty == unleaseInvOrEmpty))
569+ then if ((0 >= fee.amount))
570+ then state
571+ else {
572+ let nsbtStakingReward = invoke(nsbtStakingContract, "deposit", nil, [fee])
573+ if ((nsbtStakingReward == nsbtStakingReward))
574+ then state
575+ else throw("Strict value is not equal to itself.")
576+ }
577+ else throw("Strict value is not equal to itself.")
578+ }
579+ }
559580
560581
561582
562583 @Callable(i)
563-func transferToAuction () = if ((size(i.payments) != 0))
564- then throw("no payments allowed")
565- else {
566- let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsREADONLY", nil, nil))
567- let reserve = asInt(neutrinoMetrics[3])
568- let neutrinoSupply = asInt(neutrinoMetrics[5])
569- let surplus = asInt(neutrinoMetrics[6])
570- let nsbtSupply = asInt(neutrinoMetrics[9])
571- let auctionNBAmount = (neutrinoSupply - assetBalance(addressFromStringValue(auctionContract), bondAssetId))
572- let surplusWithLiquidation = (surplus - assetBalance(addressFromStringValue(liquidationContract), neutrinoAssetId))
573- if (isBlocked)
574- then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
575- else if ((auctionNBAmount > (1 * PAULI)))
576- then [ScriptTransfer(addressFromStringValue(auctionContract), auctionNBAmount, bondAssetId)]
577- else if ((surplusWithLiquidation >= (1 * PAULI)))
578- then [ScriptTransfer(addressFromStringValue(liquidationContract), surplusWithLiquidation, neutrinoAssetId)]
579- else throw(((((((("bond were generated or do not need it. Deficit:" + toString(auctionNBAmount)) + "|") + toString(0)) + ". Surplus:") + toString(surplusWithLiquidation)) + "|") + toString(surplus)))
580- }
584+func internalUnleaseAndLease (unleaseAmount) = if ((i.caller != this))
585+ then throw("internalUnleaseAndLease is not public method")
586+ else prepareUnleaseAndLease(unleaseAmount)
581587
582588
583589
584590 @Callable(i)
585591 func transferUsdnToUser (amount,addr) = if ((i.caller != addressFromStringValue(auctionContract)))
586592 then throw("Only auction contract is authorized")
587593 else [ScriptTransfer(addressFromStringValue(addr), amount, neutrinoAssetId)]
588594
589595
590596
591597 @Callable(i)
592598 func acceptWaves () = if ((i.caller != addressFromStringValue(auctionContract)))
593599 then throw("Currently only auction contract is allowed to call")
594600 else $Tuple2(prepareUnleaseAndLease(0), "success")
595601
596602
597603
598604 @Callable(i)
599605 func approveLeasings (nListS,groupNum) = {
600606 let lAmt = (500000 * WAVELET)
601607 let nIdxs = [0, 1, 2, 3, 4, 5, 6, 7]
602608 let mngPubS = valueOrElse(getString("%s%s__cfg__leasingManagerPub"), "7AUMX54ukYMYvPmma7yoFf5NjZhs4Bu5nz3Ez9EV8sur")
603609 let mngPub = fromBase58String(mngPubS)
604610 let nodeRegAddrStr = valueOrElse(getString("%s%s__cfg__nodesRegistryAddress"), "3P9vKqQKjUdmpXAfiWau8krREYAY1Xr69pE")
605611 let nodeRegAddr = addressFromStringValue(nodeRegAddrStr)
606612 let lGroupNodeListKEY = getLeaseGroupNodeListKey(groupNum)
607613 let lGrNodeOpt = getString(this, lGroupNodeListKEY)
608614 if (isDefined(lGrNodeOpt))
609615 then throw((("group " + toString(groupNum)) + " already initialized"))
610616 else {
611617 let nList = split(nListS, SEP)
612618 let expCount = size(nIdxs)
613619 if ((i.callerPublicKey != mngPub))
614620 then throw("approveLeasings not authorized")
615621 else {
616- let $t02852028582 = readNodeInfo(0)
617- let nAddr0 = $t02852028582._1
618- let lAmtKEY0 = $t02852028582._2
619- let lAmt0 = $t02852028582._3
620- let lIdKEY0 = $t02852028582._4
621- let lId0 = $t02852028582._5
622- let $t02858528647 = readNodeInfo(1)
623- let nAddr1 = $t02858528647._1
624- let lAmtKEY1 = $t02858528647._2
625- let lAmt1 = $t02858528647._3
626- let lIdKEY1 = $t02858528647._4
627- let lId1 = $t02858528647._5
622+ let $t02724227304 = readNodeInfo(0)
623+ let nAddr0 = $t02724227304._1
624+ let lAmtKEY0 = $t02724227304._2
625+ let lAmt0 = $t02724227304._3
626+ let lIdKEY0 = $t02724227304._4
627+ let lId0 = $t02724227304._5
628+ let $t02730727369 = readNodeInfo(1)
629+ let nAddr1 = $t02730727369._1
630+ let lAmtKEY1 = $t02730727369._2
631+ let lAmt1 = $t02730727369._3
632+ let lIdKEY1 = $t02730727369._4
633+ let lId1 = $t02730727369._5
628634 let newL0 = Lease(nAddr0, (lAmt0 - ((lAmt * expCount) / 2)))
629635 let newL1 = Lease(nAddr1, (lAmt1 - ((lAmt * expCount) / 2)))
630636 let validation = invoke(nodeRegAddr, "validateAndApproveLeasings", [nListS], nil)
631637 if ((validation == validation))
632638 then {
633639 func forEachNodeValidateAndGenerateLease (a,i) = {
634640 let node = nList[i]
635641 let la = Lease(addressFromStringValue(node), lAmt)
636642 (a ++ [la, BinaryEntry(getLeaseIdByAddressKey(node), lcalc(la)), IntegerEntry(getLeaseAmountByAddressKey(node), lAmt)])
637643 }
638644
639645 ([StringEntry(lGroupNodeListKEY, nListS), BinaryEntry(lIdKEY0, lcalc(newL0)), BinaryEntry(lIdKEY1, lcalc(newL1)), IntegerEntry(lAmtKEY0, newL0.amount), IntegerEntry(lAmtKEY1, newL1.amount), LeaseCancel(lId0), LeaseCancel(lId1), newL0, newL1] ++ {
640646 let $l = nIdxs
641647 let $s = size($l)
642648 let $acc0 = nil
643649 func $f0_1 ($a,$i) = if (($i >= $s))
644650 then $a
645651 else forEachNodeValidateAndGenerateLease($a, $l[$i])
646652
647653 func $f0_2 ($a,$i) = if (($i >= $s))
648654 then $a
649655 else throw("List size exceeds 8")
650656
651657 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
652658 })
653659 }
654660 else throw("Strict value is not equal to itself.")
655661 }
656662 }
657663 }
658664
659665
660666
661667 @Callable(i)
662668 func swapParamsByUserSYSREADONLY (userAddressStr,nsbtDiff) = {
663669 let nsbtData = asAnyList(invoke(nsbtStakingContract, "nsbtStakingSYSREADONLY", [userAddressStr], nil))
664670 if ((nsbtData == nsbtData))
665671 then {
666672 let gnsbtAmt = (asInt(nsbtData[0]) + nsbtDiff)
667673 let gnsbtAmtTotal = (asInt(nsbtData[1]) + nsbtDiff)
668674 let swapLimitMax = asInt(invoke(mathContract, "calcSwapLimitREADONLY", [gnsbtAmt], nil))
669675 let lastSwapHeight = valueOrElse(getInteger(this, keyUserLastSwapHeight(userAddressStr)), 0)
670676 let swapLimitTimelifeBlocks = swapsTimeframeREAD()
671677 let passedBlocksAfterLastSwap = (height - lastSwapHeight)
672678 let isSwapTimelifeNew = (passedBlocksAfterLastSwap >= swapLimitTimelifeBlocks)
673679 let swapLimitSpent = if (isSwapTimelifeNew)
674680 then 0
675681 else valueOrElse(getInteger(this, keySwapUserSpentInPeriod(userAddressStr)), 0)
676682 let blcks2LmtReset = if (isSwapTimelifeNew)
677683 then 0
678684 else (swapLimitTimelifeBlocks - passedBlocksAfterLastSwap)
679685 $Tuple2(nil, $Tuple5(swapLimitMax, swapLimitSpent, blcks2LmtReset, gnsbtAmt, gnsbtAmtTotal))
680686 }
681687 else throw("Strict value is not equal to itself.")
682688 }
683689
684690
685691 @Verifier(tx)
686692 func verify () = {
687693 let id = toBase58String(tx.id)
694+ let pubKeyAdminsListStr = makeString(["GJdLSaLiv5K7xuejac8mcRcHoyo3dPrESrvktG3a6MAR", "EYwZmURd5KKaQRBjsVa6g8DPisFoS6SovRJtFiL5gMHU", "DtmAfuDdCrHK8spdAeAYzq6MsZegeD9gnsrpuTRkCbVA", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"], SEP)
695+ let pubKeyAdminsList = split(valueOrElse(getString(controlContract, "%s__multisig"), pubKeyAdminsListStr), SEP)
688696 let count = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0])))
689697 then 1
690698 else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(pubKeyAdminsList[1])))
691699 then 1
692700 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(pubKeyAdminsList[2])))
693701 then 1
694702 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[3], fromBase58String(pubKeyAdminsList[3])))
695703 then 2
696704 else 0))
697705 match tx {
698706 case sponsorTx: SponsorFeeTransaction =>
699707 if (checkIsValidMinSponsoredFee(sponsorTx))
700708 then (count >= 3)
701709 else false
702710 case _ =>
703711 (count >= 3)
704712 }
705713 }
706714

github/deemru/w8io/786bc32 
127.71 ms