2020.10.19 16:54 [2291249] smart account 3P3b9ZcfQmAyE9MVoRKE5tfRJSHR4BDXMEo > SELF 0.00000000 Waves

{ "type": 13, "id": "6kP7tai1G9vcndu8iwd1JtxsHKvAiYjmBAQ6E7McpGBG", "fee": 1400000, "feeAssetId": null, "timestamp": 1603115679995, "version": 2, "chainId": 87, "sender": "3P3b9ZcfQmAyE9MVoRKE5tfRJSHR4BDXMEo", "senderPublicKey": "BvoMQVENxUeFiSzGs66VPKRbddcurTqSSuQhBEKHmXiv", "proofs": [ "4BccFDYkMnqCWYVnBMBU5mc3SkFrt37bTHcjKKS7yRky33yG4cgg2LDG7zhJV66dkcTYxjj7szArYiBQ6YjG8Mjd", "26YkbySKYzh7jMnZ5KBPaZ6hs39YkdNaW89M6biffajsBPfPaLAi6TKEz9gYjUYSYYaXu5fTebDorV486kxidZKe" ], "script": "base64:AAIEAAAAAAAAACEIAhILCgkICAgICAgICAESAwoBARIAEgMKAQgSABIAEgAAAABSAAAAAAR0ZW42AAAAAAAAD0JAAAAAAAR0ZW44AAAAAAAF9eEAAAAAABFjb25maWdQcm92aWRlcktleQIAAAAOY29uZmlnUHJvdmlkZXIAAAAADmNvbmZpZ1Byb3ZpZGVyBAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABHRoaXMFAAAAEWNvbmZpZ1Byb3ZpZGVyS2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAXMFAAAAByRtYXRjaDAJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAAXMFAAAABHRoaXMAAAAAB0JVTExLZXkCAAAABkJVTExJZAAAAAAHQkVBUktleQIAAAAGQkVBUklkAAAAAAxtYWluVG9rZW5LZXkCAAAAC21haW5Ub2tlbklkAAAAABFidWxsQ29sbGF0ZXJhbEtleQIAAAAOYnVsbENvbGxhdGVyYWwAAAAAEWJlYXJDb2xsYXRlcmFsS2V5AgAAAA5iZWFyQ29sbGF0ZXJhbAAAAAASYnVsbENpcmN1bGF0aW9uS2V5AgAAAA9idWxsQ2lyY3VsYXRpb24AAAAAEmJlYXJDaXJjdWxhdGlvbktleQIAAAAPYmVhckNpcmN1bGF0aW9uAAAAABJpc3N1ZVBlcmNlbnRpbGVLZXkCAAAAD2lzc3VlUGVyY2VudGlsZQAAAAATcmVkZWVtUGVyY2VudGlsZUtleQIAAAAQcmVkZWVtUGVyY2VudGlsZQAAAAALbWluSXNzdWVLZXkCAAAACG1pbklzc3VlAAAAAAxtaW5SZWRlZW1LZXkCAAAACW1pblJlZGVlbQAAAAAKbWluUG9vbEtleQIAAAAHbWluUG9vbAAAAAASZmVlc0FjY3VtdWxhdGVkS2V5AgAAAA9mZWVzQWNjdW11bGF0ZWQAAAAADHdoaXRlbGlzdEtleQIAAAAOaXNzdWVXaGl0ZUxpc3QAAAAAC29yYWNsZVBLS2V5AgAAAAZvcmFjbGUAAAAAEWxhc3RQcmljZUluZGV4S2V5AgAAAAtwcmljZV9pbmRleAAAAAAQcHJpY2VJbmRleFByZWZpeAIAAAAMcHJpY2VfaW5kZXhfAAAAABFwcmljZUhlaWdodFByZWZpeAIAAAAGcHJpY2VfAAAAABpvcmFjbGVDdXJyZW50UHJpY2VJbmRleEtleQIAAAALcHJpY2VfaW5kZXgAAAAAGmxhc3RSZWJhbGFuY2VQcmljZUluZGV4S2V5AgAAABVsYXN0U2V0dGxlbWVudFByaWNlSWQAAAAADmhlYWRQb2ludGVyS2V5AgAAAAtoZWFkUG9pbnRlcgAAAAAOdGFpbFBvaW50ZXJLZXkCAAAAC3RhaWxQb2ludGVyAAAAAAxxdWV1ZVNpemVLZXkCAAAACXF1ZXVlU2l6ZQAAAAAVcG9vbE1haW5Ub2tlblZhbHVlS2V5AgAAABJwb29sTWFpblRva2VuVmFsdWUAAAAACXBvb2xVcEtleQIAAAAGcG9vbFVwAAAAAApwb29sRHduS2V5AgAAAAdwb29sRHduAAAAABdwb29sVG9rZW5DaXJjdWxhdGlvbktleQIAAAAUcG9vbFRva2VuQ2lyY3VsYXRpb24AAAAADHBvb2xUb2tlbktleQIAAAAJcG9vbFRva2VuAAAAAAdidWxsQ29sCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAARYnVsbENvbGxhdGVyYWxLZXkCAAAAFG5vIGJ1bGxDb2xsYXRlcmFsS2V5AAAAAAdiZWFyQ29sCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAARYmVhckNvbGxhdGVyYWxLZXkCAAAAFG5vIGJlYXJDb2xsYXRlcmFsS2V5AAAAAAhidWxsQ2lyYwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAEmJ1bGxDaXJjdWxhdGlvbktleQIAAAAVbm8gYnVsbENpcmN1bGF0aW9uS2V5AAAAAAhiZWFyQ2lyYwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAEmJlYXJDaXJjdWxhdGlvbktleQIAAAAVbm8gYmVhckNpcmN1bGF0aW9uS2V5AAAAAARCVUxMCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAAHQlVMTEtleQIAAAAKbm8gQlVMTEtleQAAAAAEQkVBUgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAAB0JFQVJLZXkCAAAACm5vIEJFQVJLZXkAAAAACW1haW5Ub2tlbgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAADG1haW5Ub2tlbktleQIAAAAPbm8gbWFpblRva2VuS2V5AAAAAA9pc3N1ZVBlcmNlbnRpbGUJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA5jb25maWdQcm92aWRlcgUAAAASaXNzdWVQZXJjZW50aWxlS2V5AgAAABVubyBpc3N1ZVBlcmNlbnRpbGVLZXkAAAAAEHJlZGVlbVBlcmNlbnRpbGUJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA5jb25maWdQcm92aWRlcgUAAAATcmVkZWVtUGVyY2VudGlsZUtleQIAAAAWbm8gcmVkZWVtUGVyY2VudGlsZUtleQAAAAAIbWluSXNzdWUJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA5jb25maWdQcm92aWRlcgUAAAALbWluSXNzdWVLZXkCAAAADm5vIG1pbklzc3VlS2V5AAAAAAltaW5SZWRlZW0JAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA5jb25maWdQcm92aWRlcgUAAAAMbWluUmVkZWVtS2V5AgAAAA9ubyBtaW5SZWRlZW1LZXkAAAAAB21pblBvb2wJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA5jb25maWdQcm92aWRlcgUAAAAKbWluUG9vbEtleQIAAAANbm8gbWluUG9vbEtleQAAAAAJd2hpdGVsaXN0CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAOY29uZmlnUHJvdmlkZXIFAAAADHdoaXRlbGlzdEtleQIAAAAPbm8gd2hpdGVsaXN0S2V5AQAAAAdhbGxvd2VkAAAAAQAAAAFhAwkAAAAAAAACBQAAAAl3aGl0ZWxpc3QCAAAAAAYJAQAAAAlpc0RlZmluZWQAAAABCQAEswAAAAIFAAAACXdoaXRlbGlzdAkABCUAAAABBQAAAAFhAAAAAAhwb29sTWFpbgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAFXBvb2xNYWluVG9rZW5WYWx1ZUtleQIAAAAYbm8gcG9vbE1haW5Ub2tlblZhbHVlS2V5AAAAAAZwb29sVXAJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAAlwb29sVXBLZXkCAAAADG5vIHBvb2xVcEtleQAAAAAHcG9vbER3bgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAACnBvb2xEd25LZXkCAAAADW5vIHBvb2xEd25LZXkAAAAACXBvb2xUb2tlbgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAADHBvb2xUb2tlbktleQIAAAAPbm8gcG9vbFRva2VuS2V5AAAAABRwb29sVG9rZW5DaXJjdWxhdGlvbgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAF3Bvb2xUb2tlbkNpcmN1bGF0aW9uS2V5AgAAABpubyBwb29sVG9rZW5DaXJjdWxhdGlvbktleQAAAAAQcG9vbEJ1bGxFeHBvc3VyZQkAAGsAAAADBQAAAAdidWxsQ29sBQAAAAZwb29sVXAFAAAACGJ1bGxDaXJjAAAAABBwb29sQmVhckV4cG9zdXJlCQAAawAAAAMFAAAAB2JlYXJDb2wFAAAAB3Bvb2xEd24FAAAACGJlYXJDaXJjAAAAAAlwb29sVmFsdWUJAABkAAAAAgkAAGQAAAACBQAAAAhwb29sTWFpbgUAAAAQcG9vbEJ1bGxFeHBvc3VyZQUAAAAQcG9vbEJlYXJFeHBvc3VyZQAAAAAGb3JhY2xlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEJAAJZAAAAAQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAAC29yYWNsZVBLS2V5AgAAAA5ubyBvcmFjbGVQS0tleQIAAAASYmFkIG9yYWNsZSBhZGRyZXNzAAAAABRyZWJhbGFuY2VkUHJpY2VJbmRleAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAGmxhc3RSZWJhbGFuY2VQcmljZUluZGV4S2V5AgAAABdubyBsYXN0IHJlYmFsYW5jZSBwcmljZQAAAAAQb3JhY2xlUHJpY2VJbmRleAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABm9yYWNsZQUAAAARbGFzdFByaWNlSW5kZXhLZXkJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAE2JhZCBvcmFjbGUgZGF0YSBhdCAJAAQlAAAAAQUAAAAGb3JhY2xlAgAAABA6IG5vIGludGVnZXIgYXQgBQAAABFsYXN0UHJpY2VJbmRleEtleQAAAAAJcXVldWVTaXplCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAADHF1ZXVlU2l6ZUtleQAAAAAAAAAAAAAAAAALaGVhZFBvaW50ZXIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAAOaGVhZFBvaW50ZXJLZXkCAAAAAAAAAAALdGFpbFBvaW50ZXIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAAOdGFpbFBvaW50ZXJLZXkCAAAAAAAAAAAPZmVlc0FjY3VtdWxhdGVkCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAEmZlZXNBY2N1bXVsYXRlZEtleQAAAAAAAAAAAAAAAAAFSVNTVUUCAAAABUlTU1VFAAAAAAZSRURFRU0CAAAABlJFREVFTQAAAAAEUE9PTAIAAAAEUE9PTAAAAAAGVU5QT09MAgAAAAZVTlBPT0wAAAAACmZlZUFkZHJLZXkCAAAACmZlZUFkZHJlc3MAAAAADnN0YWtpbmdBZGRyS2V5AgAAAA5zdGFraW5nQWRkcmVzcwAAAAAPZGFlbW9uUHViS2V5S2V5AgAAAA9kYWVtb25QdWJsaWNLZXkAAAAACmZlZUFkZHJlc3MJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAOY29uZmlnUHJvdmlkZXIFAAAACmZlZUFkZHJLZXkCAAAADW5vIGZlZUFkZHJlc3MCAAAADmJhZCBmZWVBZGRyZXNzAAAAAA5zdGFraW5nQWRkcmVzcwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAADmNvbmZpZ1Byb3ZpZGVyBQAAAA5zdGFraW5nQWRkcktleQIAAAARbm8gc3Rha2luZ0FkZHJlc3MAAAAAD2RhZW1vblB1YmxpY0tleQkAAlkAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAOY29uZmlnUHJvdmlkZXIFAAAAD2RhZW1vblB1YktleUtleQIAAAASbm8gZGFlbW9uUHVibGljS2V5AAAAAApycGRBZGRyZXNzCQAEJgAAAAECAAAAIzNQTmlrTTZ5cDROcWNTVThndXhRdG1SNW9ucjJENGU4eVRKAAAAABBwdWJLZXlBZG1pbnNMaXN0CQAETAAAAAICAAAALDJISHFWOFc5REpheVY1UjZ0QkQyU2I4c3JwaHBvYm9EaTdyMXQxYVBpdW1DCQAETAAAAAICAAAALDVaWGU4MlJSQVNVN3FzaFhNMko5Sk5ZaHFKOUdXWWpqVnEyZ3dVVjVOYXo5CQAETAAAAAICAAAALDVXUlhGU2p3Y1RiTmZLY0pzOFpxWG1TU1dZc1NWSlV0TXZNcVpqNWhINE5jBQAAAANuaWwBAAAADHNhZmVGcmFjdGlvbgAAAAMAAAABYQAAAAFiAAAAAWMDAwkAAAAAAAACBQAAAAFhAAAAAAAAAAAABgkAAAAAAAACBQAAAAFiAAAAAAAAAAAAAAAAAAAAAAAACQAAawAAAAMFAAAAAWEFAAAAAWIFAAAAAWMBAAAADGJ1aWxkTmV3SXRlbQAAAAUAAAAGYWN0aW9uAAAAA2FtdAAAAAV0b2tlbgAAAApwcmljZUluZGV4AAAAB2ludm9rZXIJ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AAAAAgIAAAABfAkAAZEAAAACBQAAAAdwcmV2SXRtAAAAAAAAAAADAgAAAAF8CQABkQAAAAIFAAAAB3ByZXZJdG0AAAAAAAAAAAQCAAAAAXwFAAAAAmlkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAABnByZXZJZAUAAAAOdXBkYXRlZFByZXZJdG0JAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAACaWQFAAAAA2l0bQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAA50YWlsUG9pbnRlcktleQUAAAACaWQJAARMAAAAAgUAAAARaW5jcmVhc2VRdWV1ZVNpemUFAAAAA25pbAEAAAALcG9vbFN1cHBvcnQAAAAHAAAAC2N1ckJ1bGxDb2wwAAAAC2N1ckJlYXJDb2wwAAAADGN1ckJ1bGxDaXJjMAAAAAxjdXJCZWFyQ2lyYzAAAAAMY3VyUG9vbE1haW4wAAAACmN1clBvb2xVcDAAAAALY3VyUG9vbER3bjAKAQAAAAdjbG9zZVVwAAAABwAAAApjdXJCdWxsQ29sAAAACmN1ckJlYXJDb2wAAAALY3VyQnVsbENpcmMAAAALY3VyQmVhckNpcmMAAAALY3VyUG9vbE1haW4AAAAJY3VyUG9vbFVwAAAACmN1clBvb2xEd24EAAAABGRpZmYJAABlAAAAAgUAAAAKY3VyQnVsbENvbAUAAAAKY3VyQmVhckNvbAQAAAAIZXhwb3N1cmUJAABrAAAAAwUAAAAKY3VyQnVsbENvbAUAAAAJY3VyUG9vbFVwBQAAAAtjdXJCdWxsQ2lyYwQAAAAQbGlxdWlkYXRlZFRva2VucwMJAABmAAAAAgUAAAAEZGlmZgUAAAAIZXhwb3N1cmUFAAAACWN1clBvb2xVcAkAAGsAAAADBQAAAARkaWZmBQAAAAtjdXJCdWxsQ2lyYwUAAAAKY3VyQnVsbENvbAQAAAAPbGlxdWlkYXRlZFZhbHVlAwkAAGYAAAACBQAAAARkaWZmBQAAAAhleHBvc3VyZQUAAAAIZXhwb3N1cmUJAABrAAAAAwUAAAAQbGlxdWlkYXRlZFRva2VucwUAAAAKY3VyQnVsbENvbAUAAAALY3VyQnVsbENpcmMJAAUZAAAABwkAAGUAAAACBQAAAApjdXJCdWxsQ29sBQAAAA9saXF1aWRhdGVkVmFsdWUFAAAACmN1ckJlYXJDb2wJAABlAAAAAgUAAAALY3VyQnVsbENpcmMFAAAAEGxpcXVpZGF0ZWRUb2tlbnMFAAAAC2N1ckJlYXJDaXJjCQAAZAAAAAIFAAAAC2N1clBvb2xNYWluBQAAAA9saXF1aWRhdGVkVmFsdWUJAABlAAAAAgUAAAAJY3VyUG9vbFVwBQAAABBsaXF1aWRhdGVkVG9rZW5zBQAAAApjdXJQb29sRHduCgEAAAAIY2xvc2VEd24AAAAHAAAACmN1ckJ1bGxDb2wAAAAKY3VyQmVhckNvbAAAAAtjdXJCdWxsQ2lyYwAAAAtjdXJCZWFyQ2lyYwAAAAtjdXJQb29sTWFpbgAAAAljdXJQb29sVXAAAAAKY3VyUG9vbER3bgQAAAAEZGlmZgkAAGUAAAACBQAAAApjdXJCZWFyQ29sBQAAAApjdXJCdWxsQ29sBAAAAAhleHBvc3VyZQkAAGsAAAADBQAAAApjdXJCZWFyQ29sBQAAAApjdXJQb29sRHduBQAAAAtjdXJCZWFyQ2lyYwQAAAAQbGlxdWlkYXRlZFRva2VucwMJAABmAAAAAgUAAAAEZGlmZgUAAAAIZXhwb3N1cmUFAAAACmN1clBvb2xEd24JAABrAAAAAwUAAAAEZGlmZgUAAAALY3VyQmVhckNpcmMFAAAACmN1ckJlYXJDb2wEAAAAD2xpcXVpZGF0ZWRWYWx1ZQMJAABmAAAAAgUAAAAEZGlmZgUAAAAIZXhwb3N1cmUFAAAACGV4cG9zdXJlCQAAawAAAAMFAAAAEGxpcXVpZGF0ZWRUb2tlbnMFAAAACmN1ckJlYXJDb2wFAAAAC2N1ckJlYXJDaXJjCQAFGQAAAAcFAAAACmN1ckJ1bGxDb2wJAABlAAAAAgUAAAAKY3VyQmVhckNvbAUAAAAPbGlxdWlkYXRlZFZhbHVlBQAAAAtjdXJCdWxsQ2lyYwkAAGUAAAACBQAAAAtjdXJCZWFyQ2lyYwUAAAAQbGlxdWlkYXRlZFRva2VucwkAAGQAAAACBQAAAAtjdXJQb29sTWFpbgUAAAAPbGlxdWlkYXRlZFZhbHVlBQAAAAljdXJQb29sVXAJAABlAAAAAgUAAAAKY3VyUG9vbER3bgUAAAAQbGlxdWlkYXRlZFRva2VucwoBAAAAB29wZW5Ed24AAAAHAAAACmN1ckJ1bGxDb2wAAAAKY3VyQmVhckNvbAAAAAtjdXJCdWxsQ2lyYwAAAAtjdXJCZWFyQ2lyYwAAAAtjdXJQb29sTWFpbgAAAAljdXJQb29sVXAAAAAKY3VyUG9vbER3bgQAAAAEZGlmZgkAAGUAAAACBQAAAApjdXJCdWxsQ29sBQAAAApjdXJCZWFyQ29sBAAAAA5zcGVudFBvb2xWYWx1ZQMJAABmAAAAAgUAAAALY3VyUG9vbE1haW4FAAAABGRpZmYFAAAABGRpZmYFAAAAC2N1clBvb2xNYWluBAAAAA5hY3F1aXJlZFRva2VucwkAAGsAAAADBQAAAA5zcGVudFBvb2xWYWx1ZQUAAAALY3VyQmVhckNpcmMFAAAACmN1ckJlYXJDb2wJAAUZAAAABwUAAAAKY3VyQnVsbENvbAkAAGQAAAACBQAAAApjdXJCZWFyQ29sBQAAAA5zcGVudFBvb2xWYWx1ZQUAAAALY3VyQnVsbENpcmMJAABkAAAAAgUAAAALY3VyQmVhckNpcmMFAAAADmFjcXVpcmVkVG9rZW5zCQAAZQAAAAIFAAAAC2N1clBvb2xNYWluBQAAAA5zcGVudFBvb2xWYWx1ZQUAAAAJY3VyUG9vbFVwCQAAZAAAAAIFAAAACmN1clBvb2xEd24FAAAADmFjcXVpcmVkVG9rZW5zCgEAAAAGb3BlblVwAAAABwAAAApjdXJCdWxsQ29sAAAACmN1ckJlYXJDb2wAAAALY3VyQnVsbENpcmMAAAALY3VyQmVhckNpcmMAAAALY3VyUG9vbE1haW4AAAAJY3VyUG9vbFVwAAAACmN1clBvb2xEd24EAAAABGRpZmYJAABlAAAAAgUAAAAKY3VyQmVhckNvbAUAAAAKY3VyQnVsbENvbAQAAAAOc3BlbnRQb29sVmFsdWUDCQAAZgAAAAIFAAAAC2N1clBvb2xNYWluBQAAAARkaWZmBQAAAARkaWZmBQAAAAtjdXJQb29sTWFpbgQAAAAOYWNxdWlyZWRUb2tlbnMJAABrAAAAAwUAAAAOc3BlbnRQb29sVmFsdWUFAAAAC2N1ckJ1bGxDaXJjBQAAAApjdXJCdWxsQ29sCQAFGQAAAAcJAABkAAAAAgUAAAAKY3VyQnVsbENvbAUA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d24xCAUAAAANJHQwMTEzOTcxMTU4MAAAAAJfNwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAARYnVsbENvbGxhdGVyYWxLZXkFAAAACGJ1bGxDb2wxCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABJidWxsQ2lyY3VsYXRpb25LZXkFAAAACGJ1bGxDaWMxCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABFiZWFyQ29sbGF0ZXJhbEtleQUAAAAIYmVhckNvbDEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEmJlYXJDaXJjdWxhdGlvbktleQUAAAAJYmVhckNpcmMxCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABVwb29sTWFpblRva2VuVmFsdWVLZXkFAAAACXBvb2xNYWluMQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJcG9vbFVwS2V5BQAAAAdwb29sVXAxCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAApwb29sRHduS2V5BQAAAAhwb29sRHduMQUAAAADbmlsAQAAAAdkZXF1ZXVlAAAAAAMJAAAAAAAAAgUAAAAJcXVldWVTaXplAAAAAAAAAAAACQAAAgAAAAECAAAAEW5vdGhpbmcgdG8gc2V0dGxlCgEAAAAKY29sbGVjdEZlZQAAAAEAAAAEZmVlcwkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEmZlZXNBY2N1bXVsYXRlZEtleQkAAGQAAAACBQAAAA9mZWVzQWNjdW11bGF0ZWQFAAAABGZlZXMEAAAAEWRlY3JlYXNlUXVldWVTaXplCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAMcXVldWVTaXplS2V5CQAAZQAAAAIFAAAACXF1ZXVlU2l6ZQAAAAAAAAAAAQQAAAANaXNMYXN0RWxlbWVudAkAAAAAAAACBQAAAAtoZWFkUG9pbnRlcgUAAAALdGFpbFBvaW50ZXIEAAAADW92ZXJ3cml0ZVRhaWwJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAADnRhaWxQb2ludGVyS2V5AgAAAAAEAAAABGRhdGEJAAS1AAAAAgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAAC2hlYWRQb2ludGVyAgAAABBiYWQgaGVhZCBwb2ludGVyAgAAAAF8BAAAAAZhY3Rpb24JAAGRAAAAAgUAAAAEZGF0YQAAAAAAAAAAAAQAAAADYW10CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAEZGF0YQAAAAAAAAAAAQQAAAAFdG9rZW4JAAGRAAAAAgUAAAAEZGF0YQAAAAAAAAAAAgQAAAAKcHJpY2VJbmRleAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAABGRhdGEAAAAAAAAAAAMEAAAAB2ludm9rZXIJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAAGRAAAAAgUAAAAEZGF0YQAAAAAAAAAABAQAAAAEbmV4dAkAAZEAAAACBQAAAARkYXRhAAAAAAAAAAAFBAAAAAVpdGVtcwMJAABmAAAAAgUAAAAUcmViYWxhbmNlZFByaWNlSW5kZXgFAAAACnByaWNlSW5kZXgJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAkY29ycnVwdCBzdGF0ZSwgcmViYWxhbmNlZFByaWNlSW5kZXg9CQABpAAAAAEFAAAAFHJlYmFsYW5jZWRQcmljZUluZGV4AgAAABMsIHJlcXVlc3QgcHJpY2UgaWQ9CQABpAAAAAEFAAAACnByaWNlSW5kZXgDCQAAZgAAAAIFAAAACnByaWNlSW5kZXgFAAAAFHJlYmFsYW5jZWRQcmljZUluZGV4CQAAAgAAAAECAAAAKWNhbid0IGRlcXVldWUsIHRvbyBlYXJseSwgcmViYWxhbmNlIGZpcnN0AwkAAAAAAAACBQAAAAZhY3Rpb24FAAAABUlTU1VFBAAAAAdmZWVTaXplCQAAawAAAAMFAAAAA2FtdAUAAAAPaXNzdWVQZXJjZW50aWxlAAAAAAAAACcQBAAAAA9hZGRlZENvbGxhdGVyYWwJAABlAAAAAgUAAAADYW10BQAAAAdmZWVTaXplAwkAAAAAAAACBQAAAAV0b2tlbgUAAAAEQlVMTAQAAAASYWRkZWRUb0NpcmN1bGF0aW9uCQAAawAAAAMFAAAACGJ1bGxDaXJjBQAAAA9hZGRlZENvbGxhdGVyYWwFAAAAB2J1bGxDb2wJAAROAAAAAgkBAAAAFGFjdGlvbnNXaXRoTWF5YmVQb29sAAAABAkAAGQAAAACBQAAAAdidWxsQ29sBQAAAA9hZGRlZENvbGxhdGVyYWwFAAAAB2JlYXJDb2wJAABkAAAAAgUAAAAIYnVsbENpcmMFAAAAEmFkZGVkVG9DaXJjdWxhdGlvbgUAAAAIYmVhckNpcmMJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAOaGVhZFBvaW50ZXJLZXkFAAAABG5leHQJAARMAAAAAgkBAAAACmNvbGxlY3RGZWUAAAABBQAAAAdmZWVTaXplCQAETAAAAAIFAAAAEWRlY3JlYXNlUXVldWVTaXplCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAB2ludm9rZXIFAAAAEmFkZGVkVG9DaXJjdWxhdGlvbgkAAlkAAAABBQAAAARCVUxMBQAAAANuaWwDCQAAAAAAAAIFAAAABXRva2VuBQAAAARCRUFSBAAAABJhZGRlZFRvQ2lyY3VsYXRpb24JAABrAAAAAwUAAAAIYmVhckNpcmMFAAAAD2FkZGVkQ29sbGF0ZXJhbAUAAAAHYmVhckNvbAkABE4AAAACCQEAAAAUYWN0aW9uc1dpdGhNYXliZVBvb2wAAAAEBQAAAAdidWxsQ29sCQAAZAAAAAIFAAAAB2JlYXJDb2wFAAAAD2FkZGVkQ29sbGF0ZXJhbAUAAAAIYnVsbENpcmMJAABkAAAAAgUAAAAIYmVhckNpcmMFAAAAEmFkZGVkVG9DaXJjdWxhdGlvbgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAA5oZWFkUG9pbnRlcktleQUAAAAEbmV4dAkABEwAAAACCQEAAAAKY29sbGVjdEZlZQAAAAEFAAAAB2ZlZVNpemUJAARMAAAAAgUAAAARZGVjcmVhc2VRdWV1ZVNpemUJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAHaW52b2tlcgUAAAASYWRkZWRUb0NpcmN1bGF0aW9uCQACWQAAAAEFAAAABEJFQVIFAAAAA25pbAkAAAIAAAABAgAAAAxiYWQgdG9rZW4gaWQDCQAAAAAAAAIFAAAABmFjdGlvbgUAAAAGUkVERUVNBAAAAA1yZW1vdmVkVG9rZW5zBQAAAANhbXQDCQAAAAAAAAIFAAAABXRva2VuBQAAAARCVUxMBAAAABFyZW1vdmVkQ29sbGF0ZXJhbAkAAGsAAAADBQAAAAdidWxsQ29sBQAAAA1yZW1vdmVkVG9rZW5zBQAAAAhidWxsQ2lyYwQAAAAHZmVlU2l6ZQkAAGsAAAADBQAAABFyZW1vdmVkQ29sbGF0ZXJhbAUAAAAQcmVkZWVtUGVyY2VudGlsZQAAAAAAAAAnEAQAAAAGcGF5b3V0AwkAAGYAAAACBQAAABFyZW1vdmVkQ29sbGF0ZXJhbAUAAAAHZmVlU2l6ZQkAAGUAAAACBQAAABFyZW1vdmVkQ29sbGF0ZXJhbAUAAAAHZmVlU2l6ZQAAAAAAAAAAAAkABE4AAAACCQEAAAAUYWN0aW9uc1dpdGhNYXliZVBvb2wAAAAECQAAZQAAAAIFAAAAB2J1bGxDb2wFAAAAEXJlbW92ZWRDb2xsYXRlcmFsBQAAAAdiZWFyQ29sCQAAZQAAAAIFAAAACGJ1bGxDaXJjBQAAAA1yZW1vdmVkVG9rZW5zBQAAAAhiZWFyQ2lyYwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAA5oZWFkUG9pbnRlcktleQUAAAAEbmV4dAkABEwAAAACCQEAAAAKY29sbGVjdEZlZQAAAAEFAAAAB2ZlZVNpemUJAARMAAAAAgUAAAARZGVjcmVhc2VRdWV1ZVNpemUJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAHaW52b2tlcgUAAAAGcGF5b3V0CQACWQAAAAEFAAAACW1haW5Ub2tlbgUAAAADbmlsAwkAAAAAAAACBQAAAAV0b2tlbgUAAAAEQkVBUgQAAAARcmVtb3ZlZENvbGxhdGVyYWwJAABrAAAAAwUAAAAHYmVhckNvbAUAAAANcmVtb3ZlZFRva2VucwUAAAAIYmVhckNpcmMEAAAAB2ZlZVNpemUJAABrAAAAAwUAAAARcmVtb3ZlZENvbGxhdGVyYWwFAAAAEHJlZGVlbVBlcmNlbnRpbGUAAAAAAAAAJxAEAAAABnBheW91dAMJAABmAAAAAgUAAAARcmVtb3ZlZENvbGxhdGVyYWwFAAAAB2ZlZVNpemUJAABlAAAAAgUAAAARcmVtb3ZlZENvbGxhdGVyYWwFAAAAB2ZlZVNpemUAAAAAAAAAAAAJAAROAAAAAgkBAAAAFGFjdGlvbnNXaXRoTWF5YmVQb29sAAAABAUAAAAHYnVsbENvbAkAAGUAAAACBQAAAAdiZWFyQ29sBQAAABFyZW1vdmVkQ29sbGF0ZXJhbAUAAAAIYnVsbENpcmMJAABlAAAAAgUAAAAIYmVhckNpcmMFAAAADXJlbW92ZWRUb2tlbnMJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAOaGVhZFBvaW50ZXJLZXkFAAAABG5leHQJAARMAAAAAgkBAAAACmNvbGxlY3RGZWUAAAABBQAAAAdmZWVTaXplCQAETAAAAAIFAAAAEWRlY3JlYXNlUXVldWVTaXplCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAB2ludm9rZXIFAAAABnBheW91dAkAAlkAAAABBQAAAAltYWluVG9rZW4FAAAAA25pbAkAAAIAAAABAgAAAAxiYWQgdG9rZW4gaWQDCQAAAAAAAAIFAAAABmFjdGlvbgUAAAAEUE9PTAQAAAALaXNzdWVUb2tlbnMJAABrAAAAAwUAAAAUcG9vbFRva2VuQ2lyY3VsYXRpb24FAAAAA2FtdAUAAAAJcG9vbFZhbHVlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABVwb29sTWFpblRva2VuVmFsdWVLZXkJAABkAAAAAgUAAAAIcG9vbE1haW4FAAAAA2FtdAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAXcG9vbFRva2VuQ2lyY3VsYXRpb25LZXkJAABkAAAAAgUAAAAUcG9vbFRva2VuQ2lyY3VsYXRpb24FAAAAC2lzc3VlVG9rZW5zCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAADmhlYWRQb2ludGVyS2V5BQAAAARuZXh0CQAETAAAAAIFAAAAEWRlY3JlYXNlUXVldWVTaXplCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAB2ludm9rZXIFAAAAC2lzc3VlVG9rZW5zCQACWQAAAAEFAAAACXBvb2xUb2tlbgUAAAADbmlsAwkAAAAAAAACBQAAAAZhY3Rpb24FAAAABlVOUE9PTAoBAAAABXNoYXJlAAAAAQAAAAFhCQAAawAAAAMFAAAAAWEFAAAAA2FtdAUAAAAUcG9vbFRva2VuQ2lyY3VsYXRpb24EAAAADHVucG9vbGVkTWFpbgkBAAAABXNoYXJlAAAAAQUAAAAIcG9vbE1haW4EAAAACnVucG9vbGVkVXAJAQAAAAVzaGFyZQAAAAEFAAAABnBvb2xVcAQAAAALdW5wb29sZWREd24JAQAAAAVzaGFyZQAAAAEFAAAAB3Bvb2xEd24EAAAAD3VucG9vbGVkVXBWYWx1ZQkAAGsAAAADBQAAAAp1bnBvb2xlZFVwBQAAAAdidWxsQ29sBQAAAAhidWxsQ2lyYwQAAAAQdW5wb29sZWREd25WYWx1ZQkAAGsAAAADBQAAAAt1bnBvb2xlZER3bgUAAAAHYmVhckNvbAUAAAAIYmVhckNpcmMJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAFXBvb2xNYWluVG9rZW5WYWx1ZUtleQkAAGUAAAACBQAAAAhwb29sTWFpbgUAAAAMdW5wb29sZWRNYWluCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABdwb29sVG9rZW5DaXJjdWxhdGlvbktleQkAAGUAAAACBQAAABRwb29sVG9rZW5DaXJjdWxhdGlvbgUAAAADYW10CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlwb29sVXBLZXkJAABlAAAAAgUAAAAGcG9vbFVwBQAAAAp1bnBvb2xlZFVwCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAApwb29sRHduS2V5CQAAZQAAAAIFAAAAB3Bvb2xEd24FAAAAC3VucG9vbGVkRHduCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABJidWxsQ2lyY3VsYXRpb25LZXkJAABlAAAAAgUAAAAIYnVsbENpcmMFAAAACnVucG9vbGVkVXAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEmJlYXJDaXJjdWxhdGlvbktleQkAAGUAAAACBQAAAAhiZWFyQ2lyYwUAAAALdW5wb29sZWREd24JAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEWJ1bGxDb2xsYXRlcmFsS2V5CQAAZQAAAAIFAAAAB2J1bGxDb2wFAAAAD3VucG9vbGVkVXBWYWx1ZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAARYmVhckNvbGxhdGVyYWxLZXkJAABlAAAAAgUAAAAHYmVhckNvbAUAAAAQdW5wb29sZWREd25WYWx1ZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAA5oZWFkUG9pbnRlcktleQUAAAAEbmV4dAkABEwAAAACBQAAABFkZWNyZWFzZVF1ZXVlU2l6ZQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAdpbnZva2VyCQAAZAAAAAIJAABkAAAAAgUAAAAMdW5wb29sZWRNYWluBQAAAA91bnBvb2xlZFVwVmFsdWUFAAAAEHVucG9vbGVkRHduVmFsdWUJAAJZAAAAAQUAAAAJbWFpblRva2VuBQAAAANuaWwJAAACAAAAAQkAASwAAAACAgAAAAxiYWQgYWN0aW9uOiAFAAAABmFjdGlvbgMFAAAADWlzTGFzdEVsZW1lbnQJAARMAAAAAgUAAAANb3ZlcndyaXRlVGFpbAUAAAAFaXRlbXMFAAAABWl0ZW1zAQAAAAlyZWJhbGFuY2UAAAAACgEAAAACTFYAAAADAAAAAXYAAAACcDAAAAACcDEEAAAABWRlbm9tAAAAAAAAAABkBAAAAARwbWF4CQAAaQAAAAIDCQAAZgAAAAIFAAAAAnAxBQAAAAJwMAUAAAACcDEFAAAAAnAwBQAAAAVkZW5vbQQAAAAEcG1pbgkAAGkAAAACAwkAAGYAAAACBQAAAAJwMAUAAAACcDEFAAAAAnAxBQAAAAJwMAUAAAAFZGVub20EAAAAAWEJAABoAAAAAgUAAAAEcG1pbgUAAAAEcG1pbgQAAAABYgkAAGUAAAACCQAAaAAAAAIJAABoAAAAAgAAAAAAAAAACQUAAAAEcG1heAUAAAAEcG1heAkAAGgAAAACCQAAaAAAAAIAAAAAAAAAAA8FAAAABHBtYXgFAAAABHBtaW4JAABrAAAAAwUAAAABdgkAAGQAAAACCQAAaAAAAAIAAAAAAAAAAAYFAAAAAWEFAAAAAWIJAABkAAAAAgkAAGgAAAACAAAAAAAAAAAHBQAAAAFhBQAAAAFiBAAAABFzZXR0bGVkUHJpY2VJbmRleAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAGmxhc3RSZWJhbGFuY2VQcmljZUluZGV4S2V5AgAAABFpbmNvbnNpc3RlbnQgZGF0YQQAAAATdW5zZXR0bGVkUHJpY2VJbmRleAkAAGQAAAACBQAAABFzZXR0bGVkUHJpY2VJbmRleAAAAAAAAAAAAQQAAAASc2V0dGxlZFByaWNlSGVpZ2h0CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAGb3JhY2xlCQABLAAAAAICAAAADHByaWNlX2luZGV4XwkAAaQAAAABBQAAABFzZXR0bGVkUHJpY2VJbmRleAIAAAAoYmFkIG9yYWNsZSBkYXRhIGZvciBzZXR0bGVkIHByaWNlIGhlaWdodAQAAAAMc2V0dGxlZFByaWNlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAGb3JhY2xlCQABLAAAAAICAAAABnByaWNlXwkAAaQAAAABBQAAABJzZXR0bGVkUHJpY2VIZWlnaHQCAAAAGWJhZCBvcmFjbGUgZGF0YSBmb3IgcHJpY2UEAAAAD25leHRQcmljZUhlaWdodAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABm9yYWNsZQkAASwAAAACAgAAAAxwcmljZV9pbmRleF8JAAGkAAAAAQUAAAATdW5zZXR0bGVkUHJpY2VJbmRleAIAAAAUbm8gbmV4dCBwcmljZSBoZWlnaHQEAAAACW5leHRQcmljZQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABm9yYWNsZQkAASwAAAACAgAAAAZwcmljZV8JAAGkAAAAAQUAAAAPbmV4dFByaWNlSGVpZ2h0AgAAAA1ubyBuZXh0IHByaWNlBAAAAAZtaW5Wb2wDCQAAZgAAAAIFAAAAB2JlYXJDb2wFAAAAB2J1bGxDb2wFAAAAB2J1bGxDb2wFAAAAB2JlYXJDb2wEAAAABnJlZGlzdAkBAAAAAkxWAAAAAwUAAAAGbWluVm9sBQAAAAxzZXR0bGVkUHJpY2UFAAAACW5leHRQcmljZQQAAAAKbmV3QnVsbENvbAMJAABmAAAAAgUAAAAJbmV4dFByaWNlBQAAAAxzZXR0bGVkUHJpY2UJAABkAAAAAgUAAAAHYnVsbENvbAUAAAAGcmVkaXN0CQAAZQAAAAIFAAAAB2J1bGxDb2wFAAAABnJlZGlzdAQAAAAKbmV3QmVhckNvbAMJAABmAAAAAgUAAAAJbmV4dFByaWNlBQAAAAxzZXR0bGVkUHJpY2UJAABlAAAAAgUAAAAHYmVhckNvbAUAAAAGcmVkaXN0CQAAZAAAAAIFAAAAB2JlYXJDb2wFAAAABnJlZGlzdAQAAAANJHQwMTk0NDYxOTYzMwkBAAAAC3Bvb2xTdXBwb3J0AAAABwUAAAAKbmV3QnVsbENvbAUAAAAKbmV3QmVhckNvbAUAAAAIYnVsbENpcmMFAAAACGJlYXJDaXJjBQAAAAhwb29sTWFpbgUAAAAGcG9vbFVwBQAAAAdwb29sRHduBAAAAAp1cGRCdWxsQ29sCAUAAAANJHQwMTk0NDYxOTYzMwAAAAJfMQQAAAAKdXBkQmVhckNvbAgFAAAADSR0MDE5NDQ2MTk2MzMAAAACXzIEAAAAC3VwZEJ1bGxDaXJjCAUAAAANJHQwMTk0NDYxOTYzMwAAAAJfMwQAAAALdXBkQmVhckNpcmMIBQAAAA0kdDAxOTQ0NjE5NjMzAAAAAl80BAAAAAt1cGRQb29sTWFpbggFAAAADSR0MDE5NDQ2MTk2MzMAAAACXzUEAAAACXVwZFBvb2xVcAgFAAAADSR0MDE5NDQ2MTk2MzMAAAACXzYEAAAACnVwZFBvb2xEd24IBQAAAA0kdDAxOTQ0NjE5NjMzAAAAAl83CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABFidWxsQ29sbGF0ZXJhbEtleQUAAAAKdXBkQnVsbENvbAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAARYmVhckNvbGxhdGVyYWxLZXkFAAAACnVwZEJlYXJDb2wJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEmJ1bGxDaXJjdWxhdGlvbktl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", "height": 2291249, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: ApXvTbYrhd8crMi5tDukkR9RDcH4mdq3SAkbTwak8E49 Next: 4fVyskYdkp7BWuDeN18a22Jkeouy1LJTWwsYRHJVDQqX Diff:
OldNewDifferences
179179 let diffAbs = if ((diff > 0))
180180 then diff
181181 else (0 - diff)
182- ((2 * diffAbs) + poolMain)
182+ (diffAbs + poolValue)
183183 }
184184 }
185185
270270 if ((curBullCol0 > curBearCol0))
271271 then {
272272 let afterCloseUp = closeUp(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, curPoolMain0, curPoolUp0, curPoolDwn0)
273- let $t01047710614 = afterCloseUp
274- let a = $t01047710614._1
275- let b = $t01047710614._2
276- let c = $t01047710614._3
277- let d = $t01047710614._4
278- let e = $t01047710614._5
279- let f = $t01047710614._6
280- let g = $t01047710614._7
273+ let $t01047210609 = afterCloseUp
274+ let a = $t01047210609._1
275+ let b = $t01047210609._2
276+ let c = $t01047210609._3
277+ let d = $t01047210609._4
278+ let e = $t01047210609._5
279+ let f = $t01047210609._6
280+ let g = $t01047210609._7
281281 if ((f > 0))
282282 then afterCloseUp
283283 else if ((f == 0))
286286 }
287287 else {
288288 let afterCloseDwn = closeDwn(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, curPoolMain0, curPoolUp0, curPoolDwn0)
289- let $t01096511105 = afterCloseDwn
290- let a = $t01096511105._1
291- let b = $t01096511105._2
292- let c = $t01096511105._3
293- let d = $t01096511105._4
294- let e = $t01096511105._5
295- let f = $t01096511105._6
296- let g = $t01096511105._7
289+ let $t01096011100 = afterCloseDwn
290+ let a = $t01096011100._1
291+ let b = $t01096011100._2
292+ let c = $t01096011100._3
293+ let d = $t01096011100._4
294+ let e = $t01096011100._5
295+ let f = $t01096011100._6
296+ let g = $t01096011100._7
297297 if ((g > 0))
298298 then afterCloseDwn
299299 else if ((g == 0))
304304
305305
306306 func actionsWithMaybePool (curBullCol0,curBearCol0,curBullCirc0,curBearCirc0) = {
307- let $t01140211585 = poolSupport(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, poolMain, poolUp, poolDwn)
308- let bullCol1 = $t01140211585._1
309- let bearCol1 = $t01140211585._2
310- let bullCic1 = $t01140211585._3
311- let bearCirc1 = $t01140211585._4
312- let poolMain1 = $t01140211585._5
313- let poolUp1 = $t01140211585._6
314- let poolDwn1 = $t01140211585._7
307+ let $t01139711580 = poolSupport(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, poolMain, poolUp, poolDwn)
308+ let bullCol1 = $t01139711580._1
309+ let bearCol1 = $t01139711580._2
310+ let bullCic1 = $t01139711580._3
311+ let bearCirc1 = $t01139711580._4
312+ let poolMain1 = $t01139711580._5
313+ let poolUp1 = $t01139711580._6
314+ let poolDwn1 = $t01139711580._7
315315 [IntegerEntry(bullCollateralKey, bullCol1), IntegerEntry(bullCirculationKey, bullCic1), IntegerEntry(bearCollateralKey, bearCol1), IntegerEntry(bearCirculationKey, bearCirc1), IntegerEntry(poolMainTokenValueKey, poolMain1), IntegerEntry(poolUpKey, poolUp1), IntegerEntry(poolDwnKey, poolDwn1)]
316316 }
317317
427427 let newBearCol = if ((nextPrice > settledPrice))
428428 then (bearCol - redist)
429429 else (bearCol + redist)
430- let $t01945119638 = poolSupport(newBullCol, newBearCol, bullCirc, bearCirc, poolMain, poolUp, poolDwn)
431- let updBullCol = $t01945119638._1
432- let updBearCol = $t01945119638._2
433- let updBullCirc = $t01945119638._3
434- let updBearCirc = $t01945119638._4
435- let updPoolMain = $t01945119638._5
436- let updPoolUp = $t01945119638._6
437- let updPoolDwn = $t01945119638._7
430+ let $t01944619633 = poolSupport(newBullCol, newBearCol, bullCirc, bearCirc, poolMain, poolUp, poolDwn)
431+ let updBullCol = $t01944619633._1
432+ let updBearCol = $t01944619633._2
433+ let updBullCirc = $t01944619633._3
434+ let updBearCirc = $t01944619633._4
435+ let updPoolMain = $t01944619633._5
436+ let updPoolUp = $t01944619633._6
437+ let updPoolDwn = $t01944619633._7
438438 [IntegerEntry(bullCollateralKey, updBullCol), IntegerEntry(bearCollateralKey, updBearCol), IntegerEntry(bullCirculationKey, updBullCirc), IntegerEntry(bearCirculationKey, updBearCirc), IntegerEntry(poolMainTokenValueKey, updPoolMain), IntegerEntry(poolUpKey, updPoolUp), IntegerEntry(poolDwnKey, updPoolDwn), IntegerEntry(lastRebalancePriceIndexKey, unsettledPriceIndex)]
439439 }
440440
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let ten6 = 1000000
55
66 let ten8 = 100000000
77
88 let configProviderKey = "configProvider"
99
1010 let configProvider = match getString(this, configProviderKey) {
1111 case s: String =>
1212 addressFromStringValue(s)
1313 case _ =>
1414 this
1515 }
1616
1717 let BULLKey = "BULLId"
1818
1919 let BEARKey = "BEARId"
2020
2121 let mainTokenKey = "mainTokenId"
2222
2323 let bullCollateralKey = "bullCollateral"
2424
2525 let bearCollateralKey = "bearCollateral"
2626
2727 let bullCirculationKey = "bullCirculation"
2828
2929 let bearCirculationKey = "bearCirculation"
3030
3131 let issuePercentileKey = "issuePercentile"
3232
3333 let redeemPercentileKey = "redeemPercentile"
3434
3535 let minIssueKey = "minIssue"
3636
3737 let minRedeemKey = "minRedeem"
3838
3939 let minPoolKey = "minPool"
4040
4141 let feesAccumulatedKey = "feesAccumulated"
4242
4343 let whitelistKey = "issueWhiteList"
4444
4545 let oraclePKKey = "oracle"
4646
4747 let lastPriceIndexKey = "price_index"
4848
4949 let priceIndexPrefix = "price_index_"
5050
5151 let priceHeightPrefix = "price_"
5252
5353 let oracleCurrentPriceIndexKey = "price_index"
5454
5555 let lastRebalancePriceIndexKey = "lastSettlementPriceId"
5656
5757 let headPointerKey = "headPointer"
5858
5959 let tailPointerKey = "tailPointer"
6060
6161 let queueSizeKey = "queueSize"
6262
6363 let poolMainTokenValueKey = "poolMainTokenValue"
6464
6565 let poolUpKey = "poolUp"
6666
6767 let poolDwnKey = "poolDwn"
6868
6969 let poolTokenCirculationKey = "poolTokenCirculation"
7070
7171 let poolTokenKey = "poolToken"
7272
7373 let bullCol = valueOrErrorMessage(getInteger(this, bullCollateralKey), "no bullCollateralKey")
7474
7575 let bearCol = valueOrErrorMessage(getInteger(this, bearCollateralKey), "no bearCollateralKey")
7676
7777 let bullCirc = valueOrErrorMessage(getInteger(this, bullCirculationKey), "no bullCirculationKey")
7878
7979 let bearCirc = valueOrErrorMessage(getInteger(this, bearCirculationKey), "no bearCirculationKey")
8080
8181 let BULL = valueOrErrorMessage(getString(this, BULLKey), "no BULLKey")
8282
8383 let BEAR = valueOrErrorMessage(getString(this, BEARKey), "no BEARKey")
8484
8585 let mainToken = valueOrErrorMessage(getString(this, mainTokenKey), "no mainTokenKey")
8686
8787 let issuePercentile = valueOrErrorMessage(getInteger(configProvider, issuePercentileKey), "no issuePercentileKey")
8888
8989 let redeemPercentile = valueOrErrorMessage(getInteger(configProvider, redeemPercentileKey), "no redeemPercentileKey")
9090
9191 let minIssue = valueOrErrorMessage(getInteger(configProvider, minIssueKey), "no minIssueKey")
9292
9393 let minRedeem = valueOrErrorMessage(getInteger(configProvider, minRedeemKey), "no minRedeemKey")
9494
9595 let minPool = valueOrErrorMessage(getInteger(configProvider, minPoolKey), "no minPoolKey")
9696
9797 let whitelist = valueOrErrorMessage(getString(configProvider, whitelistKey), "no whitelistKey")
9898
9999 func allowed (a) = if ((whitelist == ""))
100100 then true
101101 else isDefined(indexOf(whitelist, toString(a)))
102102
103103
104104 let poolMain = valueOrErrorMessage(getInteger(this, poolMainTokenValueKey), "no poolMainTokenValueKey")
105105
106106 let poolUp = valueOrErrorMessage(getInteger(this, poolUpKey), "no poolUpKey")
107107
108108 let poolDwn = valueOrErrorMessage(getInteger(this, poolDwnKey), "no poolDwnKey")
109109
110110 let poolToken = valueOrErrorMessage(getString(this, poolTokenKey), "no poolTokenKey")
111111
112112 let poolTokenCirculation = valueOrErrorMessage(getInteger(this, poolTokenCirculationKey), "no poolTokenCirculationKey")
113113
114114 let poolBullExposure = fraction(bullCol, poolUp, bullCirc)
115115
116116 let poolBearExposure = fraction(bearCol, poolDwn, bearCirc)
117117
118118 let poolValue = ((poolMain + poolBullExposure) + poolBearExposure)
119119
120120 let oracle = valueOrErrorMessage(addressFromPublicKey(fromBase58String(valueOrErrorMessage(getString(this, oraclePKKey), "no oraclePKKey"))), "bad oracle address")
121121
122122 let rebalancedPriceIndex = valueOrErrorMessage(getInteger(this, lastRebalancePriceIndexKey), "no last rebalance price")
123123
124124 let oraclePriceIndex = valueOrErrorMessage(getInteger(oracle, lastPriceIndexKey), ((("bad oracle data at " + toString(oracle)) + ": no integer at ") + lastPriceIndexKey))
125125
126126 let queueSize = valueOrElse(getInteger(this, queueSizeKey), 0)
127127
128128 let headPointer = valueOrElse(getString(this, headPointerKey), "")
129129
130130 let tailPointer = valueOrElse(getString(this, tailPointerKey), "")
131131
132132 let feesAccumulated = valueOrElse(getInteger(this, feesAccumulatedKey), 0)
133133
134134 let ISSUE = "ISSUE"
135135
136136 let REDEEM = "REDEEM"
137137
138138 let POOL = "POOL"
139139
140140 let UNPOOL = "UNPOOL"
141141
142142 let feeAddrKey = "feeAddress"
143143
144144 let stakingAddrKey = "stakingAddress"
145145
146146 let daemonPubKeyKey = "daemonPublicKey"
147147
148148 let feeAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configProvider, feeAddrKey), "no feeAddress")), "bad feeAddress")
149149
150150 let stakingAddress = valueOrErrorMessage(getString(configProvider, stakingAddrKey), "no stakingAddress")
151151
152152 let daemonPublicKey = fromBase58String(valueOrErrorMessage(getString(configProvider, daemonPubKeyKey), "no daemonPublicKey"))
153153
154154 let rpdAddress = addressFromString("3PNikM6yp4NqcSU8guxQtmR5onr2D4e8yTJ")
155155
156156 let pubKeyAdminsList = ["2HHqV8W9DJayV5R6tBD2Sb8srphpoboDi7r1t1aPiumC", "5ZXe82RRASU7qshXM2J9JNYhqJ9GWYjjVq2gwUV5Naz9", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"]
157157
158158 func safeFraction (a,b,c) = if (if ((a == 0))
159159 then true
160160 else (b == 0))
161161 then 0
162162 else fraction(a, b, c)
163163
164164
165165 func buildNewItem (action,amt,token,priceIndex,invoker) = (((((((((action + "|") + toString(amt)) + "|") + token) + "|") + toString(priceIndex)) + "|") + invoker) + "|")
166166
167167
168168 func maxIssue (tokenId) = {
169169 let poolInvestment = if ((poolUp > 0))
170170 then BULL
171171 else BEAR
172172 if ((tokenId != poolInvestment))
173173 then poolMain
174174 else {
175175 let $t053745463 = $Tuple2((bullCol - poolBullExposure), (bearCol - poolBearExposure))
176176 let userBullCol = $t053745463._1
177177 let userBearCol = $t053745463._2
178178 let diff = (userBullCol - userBearCol)
179179 let diffAbs = if ((diff > 0))
180180 then diff
181181 else (0 - diff)
182- ((2 * diffAbs) + poolMain)
182+ (diffAbs + poolValue)
183183 }
184184 }
185185
186186
187187 func validateRequestRedeem (inv) = if ((inv.caller == this))
188188 then throw("can't do")
189189 else {
190190 func errorMessage (got) = throw(((((("only BULL(" + BULL) + ") or BEAR(") + BEAR) + ") tokens are accepted, received: ") + got))
191191
192192 let assetId = toBase58String(valueOrErrorMessage(value(inv.payments[0]).assetId, "waves are not accepted here"))
193193 if (if ((assetId != BEAR))
194194 then (assetId != BULL)
195195 else false)
196196 then errorMessage(assetId)
197197 else {
198198 let attachedAmount = inv.payments[0].amount
199199 let col = if ((assetId == BEAR))
200200 then bearCol
201201 else bullCol
202202 let circ = if ((assetId == BEAR))
203203 then bearCirc
204204 else bullCirc
205205 let estimated = fraction(col, attachedAmount, circ)
206206 if ((minRedeem > estimated))
207207 then throw((((((((((("Attached payment too small. Min redeem amount is " + toString((minRedeem / 1000000))) + " USDN, ") + "attached amount: ") + toString(attachedAmount)) + ", col: ") + toString(col)) + ", circ: ") + toString(circ)) + ", estimated: ") + toString(estimated)))
208208 else unit
209209 }
210210 }
211211
212212
213213 func enqueue (id,action,amt,token,priceIndex,invoker) = {
214214 let increaseQueueSize = IntegerEntry(queueSizeKey, (queueSize + 1))
215215 let itm = buildNewItem(action, amt, token, priceIndex, invoker)
216216 if ((queueSize == 0))
217217 then [StringEntry(headPointerKey, id), StringEntry(tailPointerKey, id), StringEntry(id, itm), increaseQueueSize]
218218 else {
219219 let prevId = valueOrErrorMessage(getString(this, tailPointerKey), "can't get tail pointer")
220220 let prevItm = split(valueOrErrorMessage(getString(this, prevId), "can't resolve pointer"), "|")
221221 let updatedPrevItm = ((((((((((prevItm[0] + "|") + prevItm[1]) + "|") + prevItm[2]) + "|") + prevItm[3]) + "|") + prevItm[4]) + "|") + id)
222222 [StringEntry(prevId, updatedPrevItm), StringEntry(id, itm), StringEntry(tailPointerKey, id), increaseQueueSize]
223223 }
224224 }
225225
226226
227227 func poolSupport (curBullCol0,curBearCol0,curBullCirc0,curBearCirc0,curPoolMain0,curPoolUp0,curPoolDwn0) = {
228228 func closeUp (curBullCol,curBearCol,curBullCirc,curBearCirc,curPoolMain,curPoolUp,curPoolDwn) = {
229229 let diff = (curBullCol - curBearCol)
230230 let exposure = fraction(curBullCol, curPoolUp, curBullCirc)
231231 let liquidatedTokens = if ((diff > exposure))
232232 then curPoolUp
233233 else fraction(diff, curBullCirc, curBullCol)
234234 let liquidatedValue = if ((diff > exposure))
235235 then exposure
236236 else fraction(liquidatedTokens, curBullCol, curBullCirc)
237237 $Tuple7((curBullCol - liquidatedValue), curBearCol, (curBullCirc - liquidatedTokens), curBearCirc, (curPoolMain + liquidatedValue), (curPoolUp - liquidatedTokens), curPoolDwn)
238238 }
239239
240240 func closeDwn (curBullCol,curBearCol,curBullCirc,curBearCirc,curPoolMain,curPoolUp,curPoolDwn) = {
241241 let diff = (curBearCol - curBullCol)
242242 let exposure = fraction(curBearCol, curPoolDwn, curBearCirc)
243243 let liquidatedTokens = if ((diff > exposure))
244244 then curPoolDwn
245245 else fraction(diff, curBearCirc, curBearCol)
246246 let liquidatedValue = if ((diff > exposure))
247247 then exposure
248248 else fraction(liquidatedTokens, curBearCol, curBearCirc)
249249 $Tuple7(curBullCol, (curBearCol - liquidatedValue), curBullCirc, (curBearCirc - liquidatedTokens), (curPoolMain + liquidatedValue), curPoolUp, (curPoolDwn - liquidatedTokens))
250250 }
251251
252252 func openDwn (curBullCol,curBearCol,curBullCirc,curBearCirc,curPoolMain,curPoolUp,curPoolDwn) = {
253253 let diff = (curBullCol - curBearCol)
254254 let spentPoolValue = if ((curPoolMain > diff))
255255 then diff
256256 else curPoolMain
257257 let acquiredTokens = fraction(spentPoolValue, curBearCirc, curBearCol)
258258 $Tuple7(curBullCol, (curBearCol + spentPoolValue), curBullCirc, (curBearCirc + acquiredTokens), (curPoolMain - spentPoolValue), curPoolUp, (curPoolDwn + acquiredTokens))
259259 }
260260
261261 func openUp (curBullCol,curBearCol,curBullCirc,curBearCirc,curPoolMain,curPoolUp,curPoolDwn) = {
262262 let diff = (curBearCol - curBullCol)
263263 let spentPoolValue = if ((curPoolMain > diff))
264264 then diff
265265 else curPoolMain
266266 let acquiredTokens = fraction(spentPoolValue, curBullCirc, curBullCol)
267267 $Tuple7((curBullCol + spentPoolValue), curBearCol, (curBullCirc + acquiredTokens), curBearCirc, (curPoolMain - spentPoolValue), (curPoolUp + acquiredTokens), curPoolDwn)
268268 }
269269
270270 if ((curBullCol0 > curBearCol0))
271271 then {
272272 let afterCloseUp = closeUp(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, curPoolMain0, curPoolUp0, curPoolDwn0)
273- let $t01047710614 = afterCloseUp
274- let a = $t01047710614._1
275- let b = $t01047710614._2
276- let c = $t01047710614._3
277- let d = $t01047710614._4
278- let e = $t01047710614._5
279- let f = $t01047710614._6
280- let g = $t01047710614._7
273+ let $t01047210609 = afterCloseUp
274+ let a = $t01047210609._1
275+ let b = $t01047210609._2
276+ let c = $t01047210609._3
277+ let d = $t01047210609._4
278+ let e = $t01047210609._5
279+ let f = $t01047210609._6
280+ let g = $t01047210609._7
281281 if ((f > 0))
282282 then afterCloseUp
283283 else if ((f == 0))
284284 then openDwn(a, b, c, d, e, f, g)
285285 else throw("poolUp < 0")
286286 }
287287 else {
288288 let afterCloseDwn = closeDwn(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, curPoolMain0, curPoolUp0, curPoolDwn0)
289- let $t01096511105 = afterCloseDwn
290- let a = $t01096511105._1
291- let b = $t01096511105._2
292- let c = $t01096511105._3
293- let d = $t01096511105._4
294- let e = $t01096511105._5
295- let f = $t01096511105._6
296- let g = $t01096511105._7
289+ let $t01096011100 = afterCloseDwn
290+ let a = $t01096011100._1
291+ let b = $t01096011100._2
292+ let c = $t01096011100._3
293+ let d = $t01096011100._4
294+ let e = $t01096011100._5
295+ let f = $t01096011100._6
296+ let g = $t01096011100._7
297297 if ((g > 0))
298298 then afterCloseDwn
299299 else if ((g == 0))
300300 then openUp(a, b, c, d, e, f, g)
301301 else throw("poolDwn < 0")
302302 }
303303 }
304304
305305
306306 func actionsWithMaybePool (curBullCol0,curBearCol0,curBullCirc0,curBearCirc0) = {
307- let $t01140211585 = poolSupport(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, poolMain, poolUp, poolDwn)
308- let bullCol1 = $t01140211585._1
309- let bearCol1 = $t01140211585._2
310- let bullCic1 = $t01140211585._3
311- let bearCirc1 = $t01140211585._4
312- let poolMain1 = $t01140211585._5
313- let poolUp1 = $t01140211585._6
314- let poolDwn1 = $t01140211585._7
307+ let $t01139711580 = poolSupport(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, poolMain, poolUp, poolDwn)
308+ let bullCol1 = $t01139711580._1
309+ let bearCol1 = $t01139711580._2
310+ let bullCic1 = $t01139711580._3
311+ let bearCirc1 = $t01139711580._4
312+ let poolMain1 = $t01139711580._5
313+ let poolUp1 = $t01139711580._6
314+ let poolDwn1 = $t01139711580._7
315315 [IntegerEntry(bullCollateralKey, bullCol1), IntegerEntry(bullCirculationKey, bullCic1), IntegerEntry(bearCollateralKey, bearCol1), IntegerEntry(bearCirculationKey, bearCirc1), IntegerEntry(poolMainTokenValueKey, poolMain1), IntegerEntry(poolUpKey, poolUp1), IntegerEntry(poolDwnKey, poolDwn1)]
316316 }
317317
318318
319319 func dequeue () = if ((queueSize == 0))
320320 then throw("nothing to settle")
321321 else {
322322 func collectFee (fees) = IntegerEntry(feesAccumulatedKey, (feesAccumulated + fees))
323323
324324 let decreaseQueueSize = IntegerEntry(queueSizeKey, (queueSize - 1))
325325 let isLastElement = (headPointer == tailPointer)
326326 let overwriteTail = StringEntry(tailPointerKey, "")
327327 let data = split(valueOrErrorMessage(getString(this, headPointer), "bad head pointer"), "|")
328328 let action = data[0]
329329 let amt = parseIntValue(data[1])
330330 let token = data[2]
331331 let priceIndex = parseIntValue(data[3])
332332 let invoker = addressFromStringValue(data[4])
333333 let next = data[5]
334334 let items = if ((rebalancedPriceIndex > priceIndex))
335335 then throw(((("corrupt state, rebalancedPriceIndex=" + toString(rebalancedPriceIndex)) + ", request price id=") + toString(priceIndex)))
336336 else if ((priceIndex > rebalancedPriceIndex))
337337 then throw("can't dequeue, too early, rebalance first")
338338 else if ((action == ISSUE))
339339 then {
340340 let feeSize = fraction(amt, issuePercentile, 10000)
341341 let addedCollateral = (amt - feeSize)
342342 if ((token == BULL))
343343 then {
344344 let addedToCirculation = fraction(bullCirc, addedCollateral, bullCol)
345345 (actionsWithMaybePool((bullCol + addedCollateral), bearCol, (bullCirc + addedToCirculation), bearCirc) ++ [StringEntry(headPointerKey, next), collectFee(feeSize), decreaseQueueSize, ScriptTransfer(invoker, addedToCirculation, fromBase58String(BULL))])
346346 }
347347 else if ((token == BEAR))
348348 then {
349349 let addedToCirculation = fraction(bearCirc, addedCollateral, bearCol)
350350 (actionsWithMaybePool(bullCol, (bearCol + addedCollateral), bullCirc, (bearCirc + addedToCirculation)) ++ [StringEntry(headPointerKey, next), collectFee(feeSize), decreaseQueueSize, ScriptTransfer(invoker, addedToCirculation, fromBase58String(BEAR))])
351351 }
352352 else throw("bad token id")
353353 }
354354 else if ((action == REDEEM))
355355 then {
356356 let removedTokens = amt
357357 if ((token == BULL))
358358 then {
359359 let removedCollateral = fraction(bullCol, removedTokens, bullCirc)
360360 let feeSize = fraction(removedCollateral, redeemPercentile, 10000)
361361 let payout = if ((removedCollateral > feeSize))
362362 then (removedCollateral - feeSize)
363363 else 0
364364 (actionsWithMaybePool((bullCol - removedCollateral), bearCol, (bullCirc - removedTokens), bearCirc) ++ [StringEntry(headPointerKey, next), collectFee(feeSize), decreaseQueueSize, ScriptTransfer(invoker, payout, fromBase58String(mainToken))])
365365 }
366366 else if ((token == BEAR))
367367 then {
368368 let removedCollateral = fraction(bearCol, removedTokens, bearCirc)
369369 let feeSize = fraction(removedCollateral, redeemPercentile, 10000)
370370 let payout = if ((removedCollateral > feeSize))
371371 then (removedCollateral - feeSize)
372372 else 0
373373 (actionsWithMaybePool(bullCol, (bearCol - removedCollateral), bullCirc, (bearCirc - removedTokens)) ++ [StringEntry(headPointerKey, next), collectFee(feeSize), decreaseQueueSize, ScriptTransfer(invoker, payout, fromBase58String(mainToken))])
374374 }
375375 else throw("bad token id")
376376 }
377377 else if ((action == POOL))
378378 then {
379379 let issueTokens = fraction(poolTokenCirculation, amt, poolValue)
380380 [IntegerEntry(poolMainTokenValueKey, (poolMain + amt)), IntegerEntry(poolTokenCirculationKey, (poolTokenCirculation + issueTokens)), StringEntry(headPointerKey, next), decreaseQueueSize, ScriptTransfer(invoker, issueTokens, fromBase58String(poolToken))]
381381 }
382382 else if ((action == UNPOOL))
383383 then {
384384 func share (a) = fraction(a, amt, poolTokenCirculation)
385385
386386 let unpooledMain = share(poolMain)
387387 let unpooledUp = share(poolUp)
388388 let unpooledDwn = share(poolDwn)
389389 let unpooledUpValue = fraction(unpooledUp, bullCol, bullCirc)
390390 let unpooledDwnValue = fraction(unpooledDwn, bearCol, bearCirc)
391391 [IntegerEntry(poolMainTokenValueKey, (poolMain - unpooledMain)), IntegerEntry(poolTokenCirculationKey, (poolTokenCirculation - amt)), IntegerEntry(poolUpKey, (poolUp - unpooledUp)), IntegerEntry(poolDwnKey, (poolDwn - unpooledDwn)), IntegerEntry(bullCirculationKey, (bullCirc - unpooledUp)), IntegerEntry(bearCirculationKey, (bearCirc - unpooledDwn)), IntegerEntry(bullCollateralKey, (bullCol - unpooledUpValue)), IntegerEntry(bearCollateralKey, (bearCol - unpooledDwnValue)), StringEntry(headPointerKey, next), decreaseQueueSize, ScriptTransfer(invoker, ((unpooledMain + unpooledUpValue) + unpooledDwnValue), fromBase58String(mainToken))]
392392 }
393393 else throw(("bad action: " + action))
394394 if (isLastElement)
395395 then overwriteTail :: items
396396 else items
397397 }
398398
399399
400400 func rebalance () = {
401401 func LV (v,p0,p1) = {
402402 let denom = 100
403403 let pmax = ((if ((p1 > p0))
404404 then p1
405405 else p0) / denom)
406406 let pmin = ((if ((p0 > p1))
407407 then p1
408408 else p0) / denom)
409409 let a = (pmin * pmin)
410410 let b = (((9 * pmax) * pmax) - ((15 * pmax) * pmin))
411411 fraction(v, ((6 * a) + b), ((7 * a) + b))
412412 }
413413
414414 let settledPriceIndex = valueOrErrorMessage(getInteger(this, lastRebalancePriceIndexKey), "inconsistent data")
415415 let unsettledPriceIndex = (settledPriceIndex + 1)
416416 let settledPriceHeight = valueOrErrorMessage(getInteger(oracle, ("price_index_" + toString(settledPriceIndex))), "bad oracle data for settled price height")
417417 let settledPrice = valueOrErrorMessage(getInteger(oracle, ("price_" + toString(settledPriceHeight))), "bad oracle data for price")
418418 let nextPriceHeight = valueOrErrorMessage(getInteger(oracle, ("price_index_" + toString(unsettledPriceIndex))), "no next price height")
419419 let nextPrice = valueOrErrorMessage(getInteger(oracle, ("price_" + toString(nextPriceHeight))), "no next price")
420420 let minVol = if ((bearCol > bullCol))
421421 then bullCol
422422 else bearCol
423423 let redist = LV(minVol, settledPrice, nextPrice)
424424 let newBullCol = if ((nextPrice > settledPrice))
425425 then (bullCol + redist)
426426 else (bullCol - redist)
427427 let newBearCol = if ((nextPrice > settledPrice))
428428 then (bearCol - redist)
429429 else (bearCol + redist)
430- let $t01945119638 = poolSupport(newBullCol, newBearCol, bullCirc, bearCirc, poolMain, poolUp, poolDwn)
431- let updBullCol = $t01945119638._1
432- let updBearCol = $t01945119638._2
433- let updBullCirc = $t01945119638._3
434- let updBearCirc = $t01945119638._4
435- let updPoolMain = $t01945119638._5
436- let updPoolUp = $t01945119638._6
437- let updPoolDwn = $t01945119638._7
430+ let $t01944619633 = poolSupport(newBullCol, newBearCol, bullCirc, bearCirc, poolMain, poolUp, poolDwn)
431+ let updBullCol = $t01944619633._1
432+ let updBearCol = $t01944619633._2
433+ let updBullCirc = $t01944619633._3
434+ let updBearCirc = $t01944619633._4
435+ let updPoolMain = $t01944619633._5
436+ let updPoolUp = $t01944619633._6
437+ let updPoolDwn = $t01944619633._7
438438 [IntegerEntry(bullCollateralKey, updBullCol), IntegerEntry(bearCollateralKey, updBearCol), IntegerEntry(bullCirculationKey, updBullCirc), IntegerEntry(bearCirculationKey, updBearCirc), IntegerEntry(poolMainTokenValueKey, updPoolMain), IntegerEntry(poolUpKey, updPoolUp), IntegerEntry(poolDwnKey, updPoolDwn), IntegerEntry(lastRebalancePriceIndexKey, unsettledPriceIndex)]
439439 }
440440
441441
442442 @Callable(inv)
443443 func init (config,oraclePK,nameup,namedwn,descUp,descDwn,poolName,poolDesc,denom) = if (isDefined(getString(this, BULLKey)))
444444 then throw("already initialized")
445445 else {
446446 let totalOwnedMainToken = inv.payments[0].amount
447447 let bulls = (totalOwnedMainToken / 3)
448448 let bears = bulls
449449 let pools = ((totalOwnedMainToken - bulls) - bears)
450450 if (if (if ((bears == 0))
451451 then true
452452 else (bulls == 0))
453453 then true
454454 else (pools == 0))
455455 then throw("can't init balances")
456456 else {
457457 let oracleCurrentPriceIndex = valueOrErrorMessage(getInteger(valueOrErrorMessage(addressFromPublicKey(fromBase58String(oraclePK)), "bad oracle address"), lastPriceIndexKey), "can't find last oracle price index")
458458 let bull = Issue(nameup, descUp, ((100 * ten6) * ten6), 6, true)
459459 let bear = Issue(namedwn, descDwn, ((100 * ten6) * ten6), 6, true)
460460 let pool = Issue(poolName, poolDesc, ((100 * ten6) * ten6), 6, true)
461461 let buid = calculateAssetId(bull)
462462 let beid = calculateAssetId(bear)
463463 let poid = calculateAssetId(pool)
464464 [bull, bear, pool, StringEntry(BULLKey, toBase58String(buid)), StringEntry(BEARKey, toBase58String(beid)), StringEntry(mainTokenKey, toBase58String(value(inv.payments[0].assetId))), StringEntry(poolTokenKey, toBase58String(poid)), StringEntry(oraclePKKey, oraclePK), IntegerEntry(lastRebalancePriceIndexKey, oracleCurrentPriceIndex), IntegerEntry(bullCollateralKey, bulls), IntegerEntry(bearCollateralKey, bears), IntegerEntry(bullCirculationKey, (bulls / denom)), IntegerEntry(bearCirculationKey, (bears / denom)), IntegerEntry(poolTokenCirculationKey, (pools / denom)), IntegerEntry(poolDwnKey, 0), IntegerEntry(poolUpKey, 0), IntegerEntry(poolMainTokenValueKey, pools), StringEntry(configProviderKey, config), ScriptTransfer(inv.caller, (bulls / denom), buid), ScriptTransfer(inv.caller, (bears / denom), beid), ScriptTransfer(inv.caller, (pools / denom), poid)]
465465 }
466466 }
467467
468468
469469
470470 @Callable(i)
471471 func withdrawFee (amount) = if ((amount > feesAccumulated))
472472 then throw(("too much. available: " + toString(feesAccumulated)))
473473 else [IntegerEntry(feesAccumulatedKey, (feesAccumulated - amount)), ScriptTransfer(feeAddress, amount, fromBase58String(mainToken))]
474474
475475
476476
477477 @Callable(inv)
478478 func requestRedeem () = if ((validateRequestRedeem(inv) == unit))
479479 then {
480480 let assetId = toBase58String(valueOrErrorMessage(inv.payments[0].assetId, "waves are not accepted here"))
481481 enqueue(toBase58String(inv.transactionId), REDEEM, inv.payments[0].amount, assetId, (oraclePriceIndex + 1), toString(inv.caller))
482482 }
483483 else throw("doesn't happen")
484484
485485
486486
487487 @Callable(inv)
488488 func requestIssue (tokenId) = if ((inv.caller == this))
489489 then throw("can't do")
490490 else if (!(allowed(inv.caller)))
491491 then throw("only whitelisted can do")
492492 else {
493493 let errorMessage = throw((((((("only BULL(" + BULL) + ") or BEAR(") + BEAR) + ") tokens are available in exchange for USDN(") + mainToken) + ")"))
494494 if (if ((tokenId != BULL))
495495 then (tokenId != BEAR)
496496 else false)
497497 then errorMessage
498498 else if ((inv.payments[0].assetId != fromBase58String(mainToken)))
499499 then errorMessage
500500 else if ((minIssue > inv.payments[0].amount))
501501 then throw((("Attached payment too small. Min required: " + toString((minIssue / 1000000))) + " USDN"))
502502 else {
503503 let maxAllowed = maxIssue(tokenId)
504504 if (if ((whitelist == ""))
505505 then (inv.payments[0].amount > maxAllowed)
506506 else false)
507507 then throw((("trying to issue more than pool can handle. Max attachment allowed = " + toString((maxAllowed / 1000000))) + " USDN"))
508508 else enqueue(toBase58String(inv.transactionId), ISSUE, inv.payments[0].amount, tokenId, (oraclePriceIndex + 1), toString(inv.caller))
509509 }
510510 }
511511
512512
513513
514514 @Callable(inv)
515515 func settle () = {
516516 let queueEmpty = (headPointer == "")
517517 let canRebalance = (oraclePriceIndex > rebalancedPriceIndex)
518518 if (queueEmpty)
519519 then if (canRebalance)
520520 then rebalance()
521521 else throw("[OK] all done, carry on")
522522 else {
523523 let data = split(valueOrErrorMessage(getString(this, headPointer), "bad head pointer"), "|")
524524 let priceIndex = parseIntValue(data[3])
525525 if ((priceIndex > rebalancedPriceIndex))
526526 then if (canRebalance)
527527 then rebalance()
528528 else throw("[OK] need to wait")
529529 else if ((priceIndex == rebalancedPriceIndex))
530530 then dequeue()
531531 else throw("corrupt data, future price id already rebalanced")
532532 }
533533 }
534534
535535
536536
537537 @Callable(inv)
538538 func requestPool () = if (!(allowed(inv.caller)))
539539 then throw("only whitelisted can do")
540540 else {
541541 let errMessage = (("main token must be attached(" + mainToken) + ")")
542542 let pmt = inv.payments[0]
543543 if ((pmt.assetId != fromBase58String(mainToken)))
544544 then throw(errMessage)
545545 else if ((minPool > pmt.amount))
546546 then throw(((("pool at least " + toString(minPool)) + " ") + mainToken))
547547 else enqueue(toBase58String(inv.transactionId), POOL, inv.payments[0].amount, "", (oraclePriceIndex + 1), toString(inv.caller))
548548 }
549549
550550
551551
552552 @Callable(inv)
553553 func requestUnpool () = {
554554 let errMessage = (("only pool token allowed(" + poolToken) + ")")
555555 let pmt = inv.payments[0]
556556 if ((pmt.assetId != fromBase58String(poolToken)))
557557 then throw(errMessage)
558558 else {
559559 let estimate = fraction(poolValue, pmt.amount, poolTokenCirculation)
560560 if ((minPool > estimate))
561561 then throw(((("unpool at least for" + toString(minPool)) + " ") + mainToken))
562562 else enqueue(toBase58String(inv.transactionId), UNPOOL, inv.payments[0].amount, "", (oraclePriceIndex + 1), toString(inv.caller))
563563 }
564564 }
565565
566566
567567 @Verifier(tx)
568568 func verify () = {
569569 let initial = if (!(isDefined(getString(this, BULLKey))))
570570 then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
571571 else false
572572 let adminAction = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0])))
573573 then 1
574574 else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(pubKeyAdminsList[1])))
575575 then 1
576576 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(pubKeyAdminsList[2])))
577577 then 1
578578 else 0)) > 1)
579579 let stakingAction = match tx {
580580 case tx: InvokeScriptTransaction =>
581581 let signedCorrectly = sigVerify(tx.bodyBytes, tx.proofs[0], daemonPublicKey)
582582 let feesCorrect = if ((tx.feeAssetId == unit))
583583 then ((1000 * 1000) >= tx.fee)
584584 else false
585585 let dappCorrect = (tx.dApp == rpdAddress)
586586 let unlock = (tx.function == "unlockNeutrino")
587587 let lock = if (if ((tx.function == "lockNeutrinoSP"))
588588 then (tx.args[0] == stakingAddress)
589589 else false)
590590 then (wavesBalance(this).available >= ten8)
591591 else false
592592 let funcCorrect = if (lock)
593593 then true
594594 else unlock
595595 if (if (if (signedCorrectly)
596596 then feesCorrect
597597 else false)
598598 then dappCorrect
599599 else false)
600600 then funcCorrect
601601 else false
602602 case _ =>
603603 false
604604 }
605605 if (if (initial)
606606 then true
607607 else adminAction)
608608 then true
609609 else stakingAction
610610 }
611611

github/deemru/w8io/786bc32 
110.45 ms