tx · 8otCbNPTA6D5g3bgxP5T9BvpCRGbS1nmvZMbfwNY3Lcn

3N8rwRVNrxgqwFiVCNyX2Zyy6Lzgd1fDctN:  -0.01400000 Waves

2022.01.13 17:57 [1877332] smart account 3N8rwRVNrxgqwFiVCNyX2Zyy6Lzgd1fDctN > SELF 0.00000000 Waves

{ "type": 13, "id": "8otCbNPTA6D5g3bgxP5T9BvpCRGbS1nmvZMbfwNY3Lcn", "fee": 1400000, "feeAssetId": null, "timestamp": 1642085922779, "version": 2, "chainId": 84, "sender": "3N8rwRVNrxgqwFiVCNyX2Zyy6Lzgd1fDctN", "senderPublicKey": "2SGdJb3x9Ak59xjRyHMHFxLvh6dC5m37urdsBJy3f6TU", "proofs": [ "3FiKqZFxyeLasDc6oKMqjPkZxNH69cAQ6KhDLCC991yJ99E4K1NATtmc7awKTzUvpRtCBDpKDtYgD1SB8DGzzwaT", "g9zmoYYSMUG2Rv7raC5vngBXmjBT9MTdaxb8gPcnJtxN6xAJBPPEe5dvVx8qveDcT8hQFro5vWRGRNjmJjd7nXy" ], "script": "base64:AAIFAAAAAAAAACYIAhIAEgMKAQESBAoCAQESABIECgIBARIAEgASABIFCgMEAQgSAAAAAFEAAAAAB3ZlcnNpb24CAAAABTIuMC4wAAAAAAhrVmVyc2lvbgIAAAAHdmVyc2lvbgAAAAAHa0FjdGl2ZQIAAAAGYWN0aXZlAAAAAAlrQXNzZXRJZEECAAAACkFfYXNzZXRfaWQAAAAACWtBc3NldElkQgIAAAAKQl9hc3NldF9pZAAAAAAJa0JhbGFuY2VBAgAAAA9BX2Fzc2V0X2JhbGFuY2UAAAAACWtCYWxhbmNlQgIAAAAPQl9hc3NldF9iYWxhbmNlAAAAAA1rU2hhcmVBc3NldElkAgAAAA5zaGFyZV9hc3NldF9pZAAAAAARa1NoYXJlQXNzZXRTdXBwbHkCAAAAEnNoYXJlX2Fzc2V0X3N1cHBseQAAAAAEa0ZlZQIAAAAKY29tbWlzc2lvbgAAAAASa0ZlZVNjYWxlRGVsaW1pdGVyAgAAABpjb21taXNzaW9uX3NjYWxlX2RlbGltaXRlcgAAAAAKa0ludmFyaWFudAIAAAAJaW52YXJpYW50AAAAAAZrQ2F1c2UCAAAADnNodXRkb3duX2NhdXNlAAAAABJrZXlVU0ROTlNCVEFkZHJlc3MCAAAAGHN0YWtpbmdfdXNkbm5zYnRfYWRkcmVzcwAAAAAOa2V5RVVSTkFkZHJlc3MCAAAAFHN0YWtpbmdfZXVybl9hZGRyZXNzAAAAAA9rZXlBZG1pblB1YktleTECAAAAC2FkbWluX3B1Yl8xAAAAAA9rZXlBZG1pblB1YktleTICAAAAC2FkbWluX3B1Yl8yAAAAAA9rZXlBZG1pblB1YktleTMCAAAAC2FkbWluX3B1Yl8zAAAAABRVU0ROVG9XYXZlc0V4Y2hhbmdlcgkBAAAAB0FkZHJlc3MAAAABAQAAABoBV6ugnY67/HaJPzVO8b2xSyoDl1hFH8eK8wAAAAAGb3JhY2xlCQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFXiv8IaJo1ukDNYXTyEjfepjfw+jjO6B44AQAAAAtnZXRBZG1pblB1YgAAAAEAAAALa2V5QWRtaW5QdWIEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAGb3JhY2xlBQAAAAtrZXlBZG1pblB1YgMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAZzdHJpbmcFAAAAByRtYXRjaDAJAAJZAAAAAQUAAAAGc3RyaW5nBAAAAAdub3RoaW5nBQAAAAckbWF0Y2gwCQAAAgAAAAECAAAAGUFkbWluIHB1YmxpYyBrZXkgaXMgZW1wdHkAAAAADGFkbWluUHViS2V5MQkBAAAAC2dldEFkbWluUHViAAAAAQUAAAAPa2V5QWRtaW5QdWJLZXkxAAAAAAxhZG1pblB1YktleTIJAQAAAAtnZXRBZG1pblB1YgAAAAEFAAAAD2tleUFkbWluUHViS2V5MgAAAAAMYWRtaW5QdWJLZXkzCQEAAAALZ2V0QWRtaW5QdWIAAAABBQAAAA9rZXlBZG1pblB1YktleTMAAAAADGFkbVN0YXJ0U3RvcAEAAAAgBM915WTQwQ9OZ7kfE2TEGg3qhCRCMX0zkF1AWAqdk0oAAAAACmFkbVN0YWtpbmcBAAAAIATPdeVk0MEPTme5HxNkxBoN6oQkQjF9M5BdQFgKnZNKAAAAAA13YWxsZXRBZGRyZXNzCQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFU3z1Ll4lYWd4V4ORRC1bdPXpfvbV/hSGJAAAAAARVU0ROAQAAACBvJKPKqzDcUimY6CxhWu5afyNNwi11u+mdqlTg0tAHwQAAAAAERVVSTgEAAAAgxATa31oPRrY4Sz5O5VjyfCj/rasckTCYnMksON/Ekr8AAAAADXN0YWtpbmdBc3NldHMJAARMAAAAAgkAAlgAAAABBQAAAARVU0ROCQAETAAAAAIJAAJYAAAAAQUAAAAERVVSTgUAAAADbmlsAAAAABZzdGFraW5nVVNETk5TQlRBZGRyZXNzCQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABm9yYWNsZQUAAAASa2V5VVNETk5TQlRBZGRyZXNzAgAAABdubyB1c2RuIHN0YWtpbmcgYWRkcmVzcwAAAAASc3Rha2luZ0VVUk5BZGRyZXNzCQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABm9yYWNsZQUAAAAOa2V5RVVSTkFkZHJlc3MCAAAAF25vIHVzZG4gc3Rha2luZyBhZGRyZXNzAAAAAAhpc0FjdGl2ZQkBAAAAEUBleHRyTmF0aXZlKDEwNTEpAAAAAgUAAAAEdGhpcwUAAAAHa0FjdGl2ZQAAAAALc3RyQXNzZXRJZEEJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAABHRoaXMFAAAACWtBc3NldElkQQAAAAALc3RyQXNzZXRJZEIJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAABHRoaXMFAAAACWtBc3NldElkQgAAAAAIYXNzZXRJZEEDCQAAAAAAAAIFAAAAC3N0ckFzc2V0SWRBAgAAAAVXQVZFUwUAAAAEdW5pdAkAAlkAAAABBQAAAAtzdHJBc3NldElkQQAAAAAIYXNzZXRJZEIDCQAAAAAAAAIFAAAAC3N0ckFzc2V0SWRCAgAAAAVXQVZFUwUAAAAEdW5pdAkAAlkAAAABBQAAAAtzdHJBc3NldElkQgAAAAAKYXNzZXROYW1lQQQAAAAHJG1hdGNoMAUAAAAIYXNzZXRJZEEDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAACkJ5dGVWZWN0b3IEAAAAAmlkBQAAAAckbWF0Y2gwCAkBAAAABXZhbHVlAAAAAQkAA+wAAAABBQAAAAJpZAAAAARuYW1lAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAARVbml0BAAAAAV3YXZlcwUAAAAHJG1hdGNoMAIAAAAFV0FWRVMJAAACAAAAAQIAAAALTWF0Y2ggZXJyb3IAAAAACmFzc2V0TmFtZUIEAAAAByRtYXRjaDAFAAAACGFzc2V0SWRCAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAAJpZAUAAAAHJG1hdGNoMAgJAQAAAAV2YWx1ZQAAAAEJAAPsAAAAAQUAAAACaWQAAAAEbmFtZQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAQAAAAFd2F2ZXMFAAAAByRtYXRjaDACAAAABVdBVkVTCQAAAgAAAAECAAAAC01hdGNoIGVycm9yAAAAAAhiYWxhbmNlQQkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwUAAAAJa0JhbGFuY2VBAAAAAAhiYWxhbmNlQgkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwUAAAAJa0JhbGFuY2VCAAAAAAxzaGFyZUFzc2V0SWQJAAJZAAAAAQkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAEdGhpcwUAAAANa1NoYXJlQXNzZXRJZAAAAAAQc2hhcmVBc3NldFN1cHBseQkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwUAAAARa1NoYXJlQXNzZXRTdXBwbHkAAAAACWludmFyaWFudAkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwUAAAAKa0ludmFyaWFudAAAAAADZmVlAAAAAAAAAAH0AAAAAA1mZWVHb3Zlcm5hbmNlAAAAAAAAAADIAAAAAAlmZWVTY2FsZTYAAAAAAAAPQkAAAAAABnNjYWxlMwAAAAAAAAAD6AAAAAAGc2NhbGU4AAAAAAAF9eEAAAAAAAdzY2FsZTEyAAAAAOjUpRAAAAAAAA5zbGlwcGFnZVNjYWxlMwAAAAAAAAAD6AAAAAAHZGlnaXRzOAAAAAAAAAAACAAAAAANZEFwcFRocmVzaG9sZAAAAAAAAAAAMgAAAAATZEFwcFRocmVzaG9sZFNjYWxlMgAAAAAAAAAAZAAAAAAVZXhjaGFuZ2VSYXRpb0xpbWl0TWluAAAAAAAFXUqAAAAAABVleGNoYW5nZVJhdGlvTGltaXRNYXgAAAAAAAaOd4AAAAAABWFscGhhAAAAAAAAAAAyAAAAAAthbHBoYURpZ2l0cwAAAAAAAAAAAgAAAAAEYmV0YQAAAAAAAr3ngAEAAAAOYWNjb3VudEJhbGFuY2UAAAABAAAAB2Fzc2V0SWQEAAAAByRtYXRjaDAFAAAAB2Fzc2V0SWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAACkJ5dGVWZWN0b3IEAAAAAmlkBQAAAAckbWF0Y2gwCQAD8AAAAAIFAAAABHRoaXMFAAAAAmlkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAARVbml0BAAAAAV3YXZlcwUAAAAHJG1hdGNoMAgJAAPvAAAAAQUAAAAEdGhpcwAAAAlhdmFpbGFibGUJAAACAAAAAQIAAAALTWF0Y2ggZXJyb3IBAAAADHN0YWtlZEFtb3VudAAAAAEAAAAHYXNzZXRJZAQAAAAWc3Rha2VkQW1vdW50Q2FsY3VsYXRlZAQAAAAHJG1hdGNoMAUAAAAHYXNzZXRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKQnl0ZVZlY3RvcgQAAAADYUlkBQAAAAckbWF0Y2gwAwkAAAAAAAACBQAAAANhSWQFAAAABFVTRE4JAAQaAAAAAgUAAAAWc3Rha2luZ1VTRE5OU0JUQWRkcmVzcwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAMcnBkX2JhbGFuY2VfCQACWAAAAAEFAAAAA2FJZAIAAAABXwkABCUAAAABBQAAAAR0aGlzAwkAAAAAAAACBQAAAANhSWQFAAAABEVVUk4JAAQaAAAAAgUAAAASc3Rha2luZ0VVUk5BZGRyZXNzCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABglcyVzJXNfX3N0YWtpbmdCYWxhbmNlX18JAAJYAAAAAQUAAAADYUlkAgAAAAJfXwkABCUAAAABBQAAAAR0aGlzAAAAAAAAAAAAAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAARVbml0AAAAAAAAAAAACQAAAgAAAAECAAAAC01hdGNoIGVycm9yBAAAAAckbWF0Y2gwBQAAABZzdGFrZWRBbW91bnRDYWxjdWxhdGVkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWkFAAAAByRtYXRjaDAFAAAAAWkAAAAAAAAAAAAAAAAADXN0YWtlZEFtb3VudEEJAQAAAAxzdGFrZWRBbW91bnQAAAABBQAAAAhhc3NldElkQQAAAAANc3Rha2VkQW1vdW50QgkBAAAADHN0YWtlZEFtb3VudAAAAAEFAAAACGFzc2V0SWRCAAAAABFhdmFpbGFibGVCYWxhbmNlQQkAAGUAAAACBQAAAAhiYWxhbmNlQQUAAAANc3Rha2VkQW1vdW50QQAAAAARYXZhaWxhYmxlQmFsYW5jZUIJAABlAAAAAgUAAAAIYmFsYW5jZUIFAAAADXN0YWtlZEFtb3VudEIAAAAAGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEEJAABkAAAAAgkBAAAADmFjY291bnRCYWxhbmNlAAAAAQUAAAAIYXNzZXRJZEEFAAAADXN0YWtlZEFtb3VudEEAAAAAGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEIJAABkAAAAAgkBAAAADmFjY291bnRCYWxhbmNlAAAAAQUAAAAIYXNzZXRJZEIFAAAADXN0YWtlZEFtb3VudEIAAAAAEGhhc0Vub3VnaEJhbGFuY2UDCQAAZwAAAAIFAAAAGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEEFAAAACGJhbGFuY2VBCQAAZwAAAAIFAAAAGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEIFAAAACGJhbGFuY2VCBwEAAAAIc2tld25lc3MAAAACAAAAAXgAAAABeQkAAGkAAAACCQAAaQAAAAIJAABkAAAAAgkAAGsAAAADBQAAAAdzY2FsZTEyBQAAAAF4BQAAAAF5CQAAawAAAAMFAAAAB3NjYWxlMTIFAAAAAXkFAAAAAXgAAAAAAAAAAAIAAAAAAAAAJxABAAAADWludmFyaWFudENhbGMAAAACAAAAAXgAAAABeQQAAAACc2sJAQAAAAhza2V3bmVzcwAAAAIFAAAAAXgFAAAAAXkJAABkAAAAAgkAAGsAAAADCQAAZAAAAAIFAAAAAXgFAAAAAXkFAAAABnNjYWxlOAkAAGwAAAAGBQAAAAJzawUAAAAHZGlnaXRzOAUAAAAFYWxwaGEFAAAAC2FscGhhRGlnaXRzBQAAAAdkaWdpdHM4BQAAAAdDRUlMSU5HCQAAaAAAAAIAAAAAAAAAAAIJAABrAAAAAwkAAGwAAAAGCQAAawAAAAMFAAAAAXgFAAAAAXkFAAAABnNjYWxlOAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAQkAAGkAAAACBQAAAAdkaWdpdHM4AAAAAAAAAAACBQAAAARET1dOCQAAbAAAAAYJAABlAAAAAgUAAAACc2sFAAAABGJldGEFAAAAB2RpZ2l0czgFAAAABWFscGhhBQAAAAthbHBoYURpZ2l0cwUAAAAHZGlnaXRzOAUAAAAERE9XTgUAAAAGc2NhbGU4AQAAABNjYWxjdWxhdGVTZW5kQW1vdW50AAAABAAAABVhbW91bnRUb1NlbmRFc3RpbWF0ZWQAAAAVbWluVG9rZW5SZWNlaXZlQW1vdW50AAAAEnRva2VuUmVjZWl2ZUFtb3VudAAAAAd0b2tlbklkBAAAAA1zbGlwcGFnZVZhbHVlCQAAZQAAAAIFAAAABnNjYWxlOAkAAGkAAAACCQAAaAAAAAIFAAAABnNjYWxlOAAAAAAAAAAAAQAAAAAAAJiWgAQAAAAeZGVsdGFCZXR3ZWVuTWF4QW5kTWluU2VuZFZhbHVlCQAAZQAAAAIFAAAAFWFtb3VudFRvU2VuZEVzdGltYXRlZAUAAAAVbWluVG9rZW5SZWNlaXZlQW1vdW50BAAAAAF4CQAAZAAAAAIFAAAACGJhbGFuY2VBBQAAABJ0b2tlblJlY2VpdmVBbW91bnQEAAAAAXkJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAAEnRva2VuUmVjZWl2ZUFtb3VudAQAAAAMaW52YXJpYW50TmV3AwkAAAAAAAACBQAAAAd0b2tlbklkBQAAAAhhc3NldElkQQkBAAAADWludmFyaWFudENhbGMAAAACBQAAAAF4CQAAZQAAAAIFAAAACGJhbGFuY2VCBQAAABVhbW91bnRUb1NlbmRFc3RpbWF0ZWQDCQAAAAAAAAIFAAAAB3Rva2VuSWQFAAAACGFzc2V0SWRCCQEAAAANaW52YXJpYW50Q2FsYwAAAAIJAABlAAAAAgUAAAAIYmFsYW5jZUEFAAAAFWFtb3VudFRvU2VuZEVzdGltYXRlZAUAAAABeQkAAAIAAAABAgAAABZXcm9uZyBhc3NldCBpbiBwYXltZW50BAAAABdpbnZhcmlhbnRFc3RpbWF0ZWRSYXRpbwkAAGsAAAADBQAAAAZzY2FsZTgFAAAACWludmFyaWFudAUAAAAMaW52YXJpYW50TmV3CgEAAAANZ2V0U3RlcEFtb3VudAAAAAIAAAADYWNjAAAABHN0ZXADCQAAAAAAAAIFAAAAA2FjYwD//////////wQAAAAMYW1vdW50VG9TZW5kCQAAZQAAAAIFAAAAFWFtb3VudFRvU2VuZEVzdGltYXRlZAkAAGkAAAACCQAAaAAAAAIFAAAABHN0ZXAFAAAAHmRlbHRhQmV0d2Vlbk1heEFuZE1pblNlbmRWYWx1ZQAAAAAAAAAABQQAAAANc3RlcEludmFyaWFudAMJAAAAAAAAAgUAAAAHdG9rZW5JZAUAAAAIYXNzZXRJZEEJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgUAAAABeAkAAGUAAAACBQAA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bnRlZ2VyRW50cnkAAAACBQAAABFrU2hhcmVBc3NldFN1cHBseQUAAAASc2hhcmVJbml0aWFsU3VwcGx5CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAASc2hhcmVJbml0aWFsU3VwcGx5BQAAAAxzaGFyZUlzc3VlSWQFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAAFnJlcGxlbmlzaFdpdGhUd29Ub2tlbnMAAAABAAAAEXNsaXBwYWdlVG9sZXJhbmNlBAAAAAtwbXRBc3NldElkQQgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAQAAAALcG10QXNzZXRJZEIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABAAAAB2Fzc2V0SWQEAAAACnBtdEFtb3VudEEICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAQAAAAKcG10QW1vdW50QggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEAAAAGYW1vdW50BAAAAA0kdDAxMTkyMTExOTk4CQEAAAAMZ2V0QXNzZXRJbmZvAAAAAQUAAAALcG10QXNzZXRJZEEEAAAADnBtdFN0ckFzc2V0SWRBCAUAAAANJHQwMTE5MjExMTk5OAAAAAJfMQQAAAANcG10QXNzZXROYW1lQQgFAAAADSR0MDExOTIxMTE5OTgAAAACXzIEAAAADHBtdERlY2ltYWxzQQgFAAAADSR0MDExOTIxMTE5OTgAAAACXzMEAAAADSR0MDEyMDAzMTIxOTcJAQAAAAxnZXRBc3NldEluZm8AAAABBQAAAAtwbXRBc3NldElkQgQAAAAOcG10U3RyQXNzZXRJZEIIBQAAAA0kdDAxMjAwMzEyMTk3AAAAAl8xBAAAAA1wbXRBc3NldE5hbWVCCAUAAAANJHQwMTIwMDMxMjE5NwAAAAJfMgQAAAAMcG10RGVjaW1hbHNCCAUAAAANJHQwMTIwMDMxMjE5NwAAAAJfMwQAAAAKdG9rZW5SYXRpbwkAAGsAAAADCQAAawAAAAMFAAAABnNjYWxlOAUAAAAIYmFsYW5jZUEFAAAACnBtdEFtb3VudEEFAAAABnNjYWxlMwkAAGsAAAADBQAAAAZzY2FsZTgFAAAACGJhbGFuY2VCBQAAAApwbXRBbW91bnRCBAAAABNyYXRpb1NoYXJlVG9rZW5zSW5BCQAAawAAAAMFAAAABnNjYWxlOAUAAAAKcG10QW1vdW50QQUAAAAIYmFsYW5jZUEEAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkIJAABrAAAAAwUAAAAGc2NhbGU4BQAAAApwbXRBbW91bnRCBQAAAAhiYWxhbmNlQgQAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50CQAAawAAAAMJAAGXAAAAAQkABEwAAAACBQAAABNyYXRpb1NoYXJlVG9rZW5zSW5BCQAETAAAAAIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkIFAAAAA25pbAUAAAAQc2hhcmVBc3NldFN1cHBseQUAAAAGc2NhbGU4BAAAABNpbnZhcmlhbnRDYWxjdWxhdGVkCQEAAAANaW52YXJpYW50Q2FsYwAAAAIJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAACnBtdEFtb3VudEEJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAACnBtdEFtb3VudEIDCQEAAAABIQAAAAEFAAAACGlzQWN0aXZlCQEAAAAPdGhyb3dJc0luYWN0aXZlAAAAAAMDCQAAZgAAAAIAAAAAAAAAAAAFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBgkAAGYAAAACBQAAABFzbGlwcGFnZVRvbGVyYW5jZQAAAAAAAAAACgkAAAIAAAABAgAAACBTbGlwcGFnZSB0b2xlcmFuY2UgbXVzdCBiZSA8PSAxJQMJAQAAAAIhPQAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAIJAAACAAAAAQIAAAAcVHdvIGF0dGFjaGVkIGFzc2V0cyBleHBlY3RlZAMDCQEAAAACIT0AAAACBQAAAAtwbXRBc3NldElkQQUAAAAIYXNzZXRJZEEGCQEAAAACIT0AAAACBQAAAAtwbXRBc3NldElkQgUAAAAIYXNzZXRJZEIJAQAAAAt0aHJvd0Fzc2V0cwAAAAADAwkAAGYAAAACCQAAaQAAAAIJAABoAAAAAgUAAAAGc2NhbGUzCQAAZQAAAAIFAAAADnNsaXBwYWdlU2NhbGUzBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAAOc2xpcHBhZ2VTY2FsZTMFAAAACnRva2VuUmF0aW8GCQAAZgAAAAIFAAAACnRva2VuUmF0aW8JAABpAAAAAgkAAGgAAAACBQAAAAZzY2FsZTMJAABkAAAAAgUAAAAOc2xpcHBhZ2VTY2FsZTMFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBQAAAA5zbGlwcGFnZVNjYWxlMwkAAAIAAAABAgAAAD1JbmNvcnJlY3QgYXNzZXRzIGFtb3VudDogYW1vdW50cyBtdXN0IGhhdmUgdGhlIGNvbnRyYWN0IHJhdGlvAwkAAAAAAAACBQAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQAAAAAAAAAAAAJAAACAAAAAQIAAAAdVG9vIHNtYWxsIGFtb3VudCB0byByZXBsZW5pc2gDCQEAAAABIQAAAAEFAAAAEGhhc0Vub3VnaEJhbGFuY2UJAAROAAAAAgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAACnBtdEFtb3VudEEFAAAAC3BtdEFzc2V0SWRBCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAKcG10QW1vdW50QgUAAAALcG10QXNzZXRJZEIFAAAAA25pbAkBAAAAEXN1c3BlbmRTdXNwaWNpb3VzAAAAAAQAAAAGc3Rha2UxAwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAADXN0YWtpbmdBc3NldHMFAAAADnBtdFN0ckFzc2V0SWRBCQAD/AAAAAQFAAAABHRoaXMCAAAADHN0YWtlVW5zdGFrZQkABEwAAAACBgkABEwAAAACBQAAAApwbXRBbW91bnRBCQAETAAAAAIFAAAADnBtdFN0ckFzc2V0SWRBBQAAAANuaWwFAAAAA25pbAAAAAAAAAAAAAMJAAAAAAAAAgUAAAAGc3Rha2UxBQAAAAZzdGFrZTEEAAAABnN0YWtlMgMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAA1zdGFraW5nQXNzZXRzBQAAAA5wbXRTdHJBc3NldElkQgkAA/wAAAAEBQAAAAR0aGlzAgAAAAxzdGFrZVVuc3Rha2UJAARMAAAAAgYJAARMAAAAAgUAAAAKcG10QW1vdW50QgkABEwAAAACBQAAAA5wbXRTdHJBc3NldElkQgUAAAADbmlsBQAAAANuaWwAAAAAAAAAAAADCQAAAAAAAAIFAAAABnN0YWtlMgUAAAAGc3Rha2UyCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUEJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAACnBtdEFtb3VudEEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACWtCYWxhbmNlQgkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAAKcG10QW1vdW50QgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAARa1NoYXJlQXNzZXRTdXBwbHkJAABkAAAAAgUAAAAQc2hhcmVBc3NldFN1cHBseQUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAprSW52YXJpYW50BQAAABNpbnZhcmlhbnRDYWxjdWxhdGVkCQAETAAAAAIJAQAAAAdSZWlzc3VlAAAAAwUAAAAMc2hhcmVBc3NldElkBQAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQGCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50BQAAAAxzaGFyZUFzc2V0SWQFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAAFXJlcGxlbmlzaFdpdGhPbmVUb2tlbgAAAAIAAAATdmlydHVhbFN3YXBUb2tlblBheQAAABN2aXJ0dWFsU3dhcFRv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AAcFAAAAE3ZpcnR1YWxTd2FwVG9rZW5HZXQJAABlAAAAAgUAAAAJcG10QW1vdW50BQAAABN2aXJ0dWFsU3dhcFRva2VuUGF5CQAAZQAAAAIFAAAACGJhbGFuY2VBBQAAABN2aXJ0dWFsU3dhcFRva2VuR2V0CQAAZAAAAAIFAAAACGJhbGFuY2VCBQAAABN2aXJ0dWFsU3dhcFRva2VuUGF5CQEAAAANaW52YXJpYW50Q2FsYwAAAAIFAAAACGJhbGFuY2VBCQAAZAAAAAIFAAAACGJhbGFuY2VCBQAAAAlwbXRBbW91bnQFAAAACGJhbGFuY2VBCQAAZAAAAAIFAAAACGJhbGFuY2VCBQAAAAlwbXRBbW91bnQEAAAAEXZpcnR1YWxSZXBsZW5pc2hBCAUAAAANJHQwMTU2NjExNjQyNgAAAAJfMQQAAAARdmlydHVhbFJlcGxlbmlzaEIIBQAAAA0kdDAxNTY2MTE2NDI2AAAAAl8yBAAAABFiYWxhbmNlQWZ0ZXJTd2FwQQgFAAAADSR0MDE1NjYxMTY0MjYAAAACXzMEAAAAEWJhbGFuY2VBZnRlclN3YXBCCAUAAAANJHQwMTU2NjExNjQyNgAAAAJfNAQAAAATaW52YXJpYW50Q2FsY3VsYXRlZAgFAAAADSR0MDE1NjYxMTY0MjYAAAACXzUEAAAAC25ld0JhbGFuY2VBCAUAAAANJHQwMTU2NjExNjQyNgAAAAJfNgQAAAALbmV3QmFsYW5jZUIIBQAAAA0kdDAxNTY2MTE2NDI2AAAAAl83BAAAAA9uZXdCYWxhbmNlRW50cnkDCQAAAAAAAAIFAAAACnBtdEFzc2V0SWQFAAAACGFzc2V0SWRBCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VBBQAAAAtuZXdCYWxhbmNlQQkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACWtCYWxhbmNlQgUAAAALbmV3QmFsYW5jZUIEAAAADGludmFyaWFudE5ldwkBAAAADWludmFyaWFudENhbGMAAAACBQAAABFiYWxhbmNlQWZ0ZXJTd2FwQQUAAAARYmFsYW5jZUFmdGVyU3dhcEIEAAAAF2ludmFyaWFudEVzdGltYXRlZFJhdGlvCQAAawAAAAMFAAAABnNjYWxlOAUAAAAJaW52YXJpYW50BQAAAAxpbnZhcmlhbnROZXcEAAAAJXJhdGlvVmlydHVhbEJhbGFuY2VUb1ZpcnR1YWxSZXBsZW5pc2gJAABpAAAAAgkAAGsAAAADCQAAaAAAAAIFAAAABnNjYWxlOAUAAAAGc2NhbGU4BQAAABFiYWxhbmNlQWZ0ZXJTd2FwQQUAAAARYmFsYW5jZUFmdGVyU3dhcEIJAABrAAAAAwUAAAAGc2NhbGU4BQAAABF2aXJ0dWFsUmVwbGVuaXNoQQUAAAARdmlydHVhbFJlcGxlbmlzaEIEAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQJAABrAAAAAwkAAGQAAAACBQAAAAtuZXdCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUIFAAAADWRBcHBUaHJlc2hvbGQJAABoAAAAAgAAAAAAAAAAAgUAAAATZEFwcFRocmVzaG9sZFNjYWxlMgMDCQAAZwAAAAIFAAAAF3NsaXBwYWdlVmFsdWVNaW5Gb3JTd2FwBQAAABdpbnZhcmlhbnRFc3RpbWF0ZWRSYXRpbwYJAABmAAAAAgUAAAAJaW52YXJpYW50BQAAAAxpbnZhcmlhbnROZXcJAAACAAAAAQIAAAA6SW5jb3JyZWN0IHZpcnR1YWxTd2FwVG9rZW5QYXkgb3IgdmlydHVhbFN3YXBUb2tlbkdldCB2YWx1ZQMDCQAAZgAAAAIFAAAAHHNsaXBwYWdlVmFsdWVNaW5Gb3JSZXBsZW5pc2gFAAAAJXJhdGlvVmlydHVhbEJhbGFuY2VUb1ZpcnR1YWxSZXBsZW5pc2gGCQAAZgAAAAIFAAAAJXJhdGlvVmlydHVhbEJhbGFuY2VUb1ZpcnR1YWxSZXBsZW5pc2gFAAAAHHNsaXBwYWdlVmFsdWVNYXhGb3JSZXBsZW5pc2gJAAACAAAAAQIAAABsU3dhcCB3aXRoIHZpcnR1YWxTd2FwVG9rZW5QYXkgYW5kIHZpcnR1YWxTd2FwVG9rZW5HZXQgaXMgcG9zc2libGUsIGJ1dCByYXRpbyBhZnRlciB2aXJ0dWFsIHN3YXAgaXMgaW5jb3JyZWN0AwMJAABmAAAAAgUAAAATZEFwcFRocmVzaG9sZEFtb3VudAUAAAALbmV3QmFsYW5jZUEGCQAAZgAAAAIFAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQFAAAAC25ld0JhbGFuY2VCCQEAAAAOdGhyb3dUaHJlc2hvbGQAAAADBQAAABNkQXBwVGhyZXNob2xkQW1vdW50BQAAAAtuZXdCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUIEAAAABnN0YWtlMQMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAA1zdGFraW5nQXNzZXRzBQAAAA1wbXRTdHJBc3NldElkCQAD/AAAAAQFAAAABHRoaXMCAAAADHN0YWtlVW5zdGFrZQkABEwAAAACBgkABEwAAAACBQAAAAlwbXRBbW91bnQJAARMAAAAAgUAAAANcG10U3RyQXNzZXRJZAUAAAADbmlsBQAAAANuaWwAAAAAAAAAAAADCQAAAAAAAAIFAAAABnN0YWtlMQUAAAAGc3Rha2UxBAAAABNyYXRpb1NoYXJlVG9rZW5zSW5BCQAAawAAAAMFAAAAEXZpcnR1YWxSZXBsZW5pc2hBBQAAAAZzY2FsZTgFAAAAEWJhbGFuY2VBZnRlclN3YXBBBAAAABNyYXRpb1NoYXJlVG9rZW5zSW5CCQAAawAAAAMFAAAAEXZpcnR1YWxSZXBsZW5pc2hCBQAAAAZzY2FsZTgFAAAAEWJhbGFuY2VBZnRlclN3YXBCBAAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQJAABrAAAAAwkAAZcAAAABCQAETAAAAAIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEJAARMAAAAAgUAAAATcmF0aW9TaGFyZVRva2Vuc0luQgUAAAADbmlsBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAAAZzY2FsZTgJAARMAAAAAgkBAAAAB1JlaXNzdWUAAAADBQAAAAxzaGFyZUFzc2V0SWQFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAYJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQFAAAADHNoYXJlQXNzZXRJZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAARa1NoYXJlQXNzZXRTdXBwbHkJAABkAAAAAgUAAAAQc2hhcmVBc3NldFN1cHBseQUAAAAVc2hhcmVUb2tlblRvUGF5QW1v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AAprSW52YXJpYW50BQAAABNpbnZhcmlhbnRDYWxjdWxhdGVkCQAETAAAAAIJAQAAAARCdXJuAAAAAgUAAAAMc2hhcmVBc3NldElkBQAAAAlwbXRBbW91bnQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAxhbW91bnRUb1BheUEFAAAACGFzc2V0SWRBCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAMYW1vdW50VG9QYXlCBQAAAAhhc3NldElkQgUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAIZXhjaGFuZ2UAAAACAAAAGGVzdGltYXRlZEFtb3VudFRvUmVjZWl2ZQAAABJtaW5BbW91bnRUb1JlY2VpdmUEAAAADSR0MDIwMzA5MjAzODQJAAUUAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50CAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkBAAAAAlwbXRBbW91bnQIBQAAAA0kdDAyMDMwOTIwMzg0AAAAAl8xBAAAAApwbXRBc3NldElkCAUAAAANJHQwMjAzMDkyMDM4NAAAAAJfMgMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAQAAAA90aHJvd0lzSW5hY3RpdmUAAAAAAwkAAGcAAAACAAAAAAAAAAAABQAAABhlc3RpbWF0ZWRBbW91bnRUb1JlY2VpdmUJAAACAAAAAQkAASwAAAACAgAAACtFc3RpbWF0ZWQgYW1vdW50IG11c3QgYmUgcG9zaXRpdmUuIEFjdHVhbDogCQABpAAAAAEFAAAAGGVzdGltYXRlZEFtb3VudFRvUmVjZWl2ZQMJAABmAAAAAgUAAAASbWluQW1vdW50VG9SZWNlaXZlBQAAABhlc3RpbWF0ZWRBbW91bnRUb1JlY2VpdmUJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAA7TWluaW1hbCBhbW91bnQgY2FuJ3QgYmUgZ3JlYXRlciB0aGFuIGVzdGltYXRlZC4gRXN0aW1hdGVkOiAJAAGkAAAAAQUAAAAYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlAgAAAAsuIE1pbmltYWw6IAkAAaQAAAABBQAAABJtaW5BbW91bnRUb1JlY2VpdmUDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABCQAAAgAAAAECAAAAHU9uZSBhdHRhY2hlZCBwYXltZW50IGV4cGVjdGVkAwkBAAAAASEAAAABBQAAABBoYXNFbm91Z2hCYWxhbmNlCQAETgAAAAIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAlwbXRBbW91bnQFAAAACnBtdEFzc2V0SWQFAAAAA25pbAkBAAAAEXN1c3BlbmRTdXNwaWNpb3VzAAAAAAMDCQEAAAACIT0AAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQQkBAAAAAiE9AAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEIHCQEAAAALdGhyb3dBc3NldHMAAAAAAwkAAGYAAAACAAAAAAAAmJaABQAAAAlwbXRBbW91bnQJAAACAAAAAQIAAAAwT25seSBzd2FwIG9mIDEwLjAwMDAwMCBvciBtb3JlIHRva2VucyBpcyBhbGxvd2VkAwMJAABmAAAAAgUAAAAVZXhjaGFuZ2VSYXRpb0xpbWl0TWluCQAAawAAAAMFAAAABnNjYWxlOAUAAAASbWluQW1vdW50VG9SZWNlaXZlBQAAAAlwbXRBbW91bnQGCQAAZgAAAAIJAABrAAAAAwUAAAAGc2NhbGU4BQAAABhlc3RpbWF0ZWRBbW91bnRUb1JlY2VpdmUFAAAACXBtdEFtb3VudAUAAAAVZXhjaGFuZ2VSYXRpb0xpbWl0TWF4CQAAAgAAAAECAAAAHEluY29ycmVjdCBhcmdzIGFuZCBwbXQgcmF0aW8EAAAAC3NlbmRBc3NldElkAwkAAAAAAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQQUAAAAIYXNzZXRJZEIFAAAACGFzc2V0SWRBBAAAAAZhbW91bnQJAQAAABNjYWxjdWxhdGVTZW5kQW1vdW50AAAABAUAAAAYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlBQAAABJtaW5BbW91bnRUb1JlY2VpdmUFAAAACXBtdEFtb3VudAUAAAAKcG10QXNzZXRJZAQAAAAQZ292ZXJuYW5jZVJld2FyZAkAAGsAAAADBQAAAAZhbW91bnQFAAAADWZlZUdvdmVybmFuY2UFAAAACWZlZVNjYWxlNgQAAAAOYW1vdW50TWludXNGZWUJAABrAAAAAwUAAAAGYW1vdW50CQAAZQAAAAIFAAAACWZlZVNjYWxlNgUAAAADZmVlBQAAAAlmZWVTY2FsZTYEAAAADSR0MDIxODA2MjIwNjgDCQAAAAAAAAIFAAAACnBtdEFzc2V0SWQFAAAACGFzc2V0SWRBCQAFFAAAAAIJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAACXBtdEFtb3VudAkAAGUAAAACCQAAZQAAAAIFAAAACGJhbGFuY2VCBQAAAA5hbW91bnRNaW51c0ZlZQUAAAAQZ292ZXJuYW5jZVJld2FyZAkABRQAAAACCQAAZQAAAAIJAABlAAAAAgUAAAAIYmFsYW5jZUEFAAAADmFtb3VudE1pbnVzRmVlBQAAABBnb3Zlcm5hbmNlUmV3YXJkCQAAZAAAAAIFAAAACGJhbGFuY2VCBQAAAAlwbXRBbW91bnQEAAAAC25ld0JhbGFuY2VBCAUAAAANJHQwMjE4MDYyMjA2OAAAAAJfMQQAAAALbmV3QmFsYW5jZUIIBQAAAA0kdDAyMTgwNjIyMDY4AAAAAl8yBAAAABNkQXBwVGhyZXNob2xkQW1vdW50CQAAawAAAAMJAABkAAAAAgUAAAALbmV3QmFsYW5jZUEFAAAAC25ld0JhbGFuY2VCBQAAAA1kQXBwVGhyZXNob2xkCQAAaAAAAAIAAAAAAAAAAAIFAAAAE2RBcHBUaHJlc2hvbGRTY2FsZTIDAwkAAGYAAAACBQAAABNkQXBwVGhyZXNob2xkQW1vdW50BQAAAAtuZXdCYWxhbmNlQQYJAABmAAAAAgUAAAATZEFwcFRocmVzaG9sZEFtb3VudAUAAAALbmV3QmFsYW5jZUIJAQAAAA50aHJvd1RocmVzaG9sZAAAAAMFAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQFAAAAC25ld0JhbGFuY2VBBQAAAAtuZXdCYWxhbmNlQgQAAAANJHQwMjIzNjYyMjQzOQkBAAAADGdldEFzc2V0SW5mbwAAAAEFAAAACnBtdEFzc2V0SWQEAAAADXBtdFN0ckFzc2V0SWQIBQAAAA0kdDAyMjM2NjIyNDM5AAAAAl8xBAAAAAxwbXRBc3NldE5hbWUIBQAAAA0kdDAyMjM2NjIyNDM5AAAAAl8yBAAAAAtwbXREZWNpbWFscwgFAAAADSR0MDIyMzY2MjI0MzkAAAACXzMEAAAADSR0MDIyNDUyMjI1MjkJAQAAAAxnZXRBc3NldEluZm8AAAABBQAAAAtzZW5kQXNzZXRJZAQAAAAOc2VuZFN0ckFzc2V0SWQIBQAAAA0kdDAyMjQ1MjIyNTI5AAAAAl8xBAAAAA1zZW5kQXNzZXROYW1lCAUAAAANJHQwMjI0NTIyMjUyOQAAAAJfMgQAAAAMc2VuZERlY2ltYWxzCAUAAAANJHQwMjI0NTIyMjUyOQAAAAJfMwQAAAAGc3Rha2UxAwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAADXN0YWtpbmdBc3NldHMFAAAADXBtdFN0ckFzc2V0SWQJAAP8AAAABAUAAAAEdGhpcwIAAAAMc3Rha2VVbnN0YWtlCQAETAAAAAIGCQAETAAAAAIFAAAACXBtdEFtb3VudAkABEwAAAACBQAAAA1wbXRTdHJBc3NldElkBQAAAANuaWwFAAAAA25pbAAAAAAAAAAAAAMJAAAAAAAAAgUAAAAGc3Rha2UxBQAAAAZzdGFrZTEEAAAABnN0YWtlMgMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAA1zdGFraW5nQXNzZXRzBQAAAA5zZW5kU3RyQXNzZXRJZAkAA/wAAAAEBQAAAAR0aGlzAgAAAAxzdGFrZVVuc3Rha2UJAARMAAAAAgcJAARMAAAAAgkAAGQAAAACBQAAAA5hbW91bnRNaW51c0ZlZQUAAAAQZ292ZXJuYW5jZVJld2FyZAkABEwAAAACBQAAAA5zZW5kU3RyQXNzZXRJZAUAAAADbmlsBQAAAANuaWwAAAAAAAAAAAADCQAAAAAAAAIFAAAABnN0YWtlMgUAAAAGc3Rha2UyCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUEFAAAAC25ld0JhbGFuY2VBCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUIFAAAAC25ld0JhbGFuY2VCCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAprSW52YXJpYW50CQEAAAANaW52YXJpYW50Q2FsYwAAAAIFAAAAC25ld0JhbGFuY2VBBQAAAAtuZXdCYWxhbmNlQgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAADmFtb3VudE1pbnVzRmVlBQAAAAtzZW5kQXNzZXRJZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAA13YWxsZXRBZGRyZXNzBQAAABBnb3Zlcm5hbmNlUmV3YXJkBQAAAAtzZW5kQXNzZXRJZAUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAIc2h1dGRvd24AAAAAAwkBAAAAASEAAAABBQAAAAhpc0FjdGl2ZQkAAAIAAAABCQABLAAAAAICAAAAIkRBcHAgaXMgYWxyZWFkeSBzdXNwZW5kZWQuIENhdXNlOiAJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAAGa0NhdXNlAgAAABp0aGUgY2F1c2Ugd2Fzbid0IHNwZWNpZmllZAMJAQAAAAEhAAAAAQkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkxCQAETAAAAAIFAAAADGFkbWluUHViS2V5MgkABEwAAAACBQAAAAxhZG1pblB1YktleTMJAARMAAAAAgUAAAAMYWRtU3RhcnRTdG9wBQAAAANuaWwIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQkBAAAADnRocm93T25seUFkbWluAAAAAAkBAAAAB3N1c3BlbmQAAAABAgAAAA9QYXVzZWQgYnkgYWRtaW4AAAABaQEAAAAIYWN0aXZhdGUAAAAAAwUAAAAIaXNBY3RpdmUJAQAAAA10aHJvd0lzQWN0aXZlAAAAAAMJAQAAAAEhAAAAAQkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkxCQAETAAAAAIFAAAADGFkbWluUHViS2V5MgkABEwAAAACBQAAAAxhZG1pblB1YktleTMJAARMAAAAAgUAAAAMYWRtU3RhcnRTdG9wBQAAAANuaWwIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQkBAAAADnRocm93T25seUFkbWluAAAAAAkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAAHa0FjdGl2ZQYJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQUAAAAGa0NhdXNlBQAAAANuaWwAAAABaQEAAAAZdGFrZUludG9BY2NvdW50RXh0cmFGdW5kcwAAAAAEAAAADWFtb3VudEVucm9sbEEJAABlAAAAAgUAAAAZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQQUAAAAIYmFsYW5jZUEEAAAADWFtb3VudEVucm9sbEIJAABlAAAAAgUAAAAZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQgUAAAAIYmFsYW5jZUIEAAAADGludmFyaWFudE5ldwkBAAAADWludmFyaWFudENhbGMAAAACCQAAZAAAAAIFAAAACGJhbGFuY2VBBQAAAA1hbW91bnRFbnJvbGxBCQAAZAAAAAIFAAAACGJhbGFuY2VCBQAAAA1hbW91bnRFbnJvbGxCAwkBAAAAASEAAAABBQAAAAhpc0FjdGl2ZQkBAAAAD3Rocm93SXNJbmFjdGl2ZQAAAAADCQEAAAACIT0AAAACCAUAAAABaQAAAAZjYWxsZXIFAAAADXdhbGxldEFkZHJlc3MJAAACAAAAAQIAAAAmT25seSB0aGUgd2FsbGV0IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24DAwkAAGYAAAACAAAAAAAAAAAABQAAAA1hbW91bnRFbnJvbGxBBgkAAGYAAAACAAAAAAAAAAAABQAAAA1hbW91bnRFbnJvbGxCCQEAAAAHc3VzcGVuZAAAAAECAAAAFkVu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", "height": 1877332, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9CCaQKPy8sF9RDApJzp4xjeFPExFh1fM3x9vB3fxLMFm Next: none Diff:
OldNewDifferences
3737
3838 let keyAdminPubKey3 = "admin_pub_3"
3939
40-let USDNToWavesExchanger = Address(base58'3N8PGkzXhbtTvEwEQTtE2xiTJmsDEQ9XfoZ')
40+let USDNToWavesExchanger = Address(base58'3PHaNgomBkrvEL2QnuJarQVJa71wjw9qiqG')
4141
42-let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
42+let oracle = Address(base58'3PEbqViERCoKnmcSULh6n2aiMvUdSQdCsom')
4343
4444 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
4545 case string: String =>
5959
6060 let admStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
6161
62-let govAddr = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
63-
64-let stakingAddress = Address(base58'3N6q7sCGSSLBUXDdjBdYGTJbZGZfhhh8cNg')
62+let walletAddress = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
6563
6664 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
6765
293291
294292 func calcStakingParams (stake,amount,assetId) = if (stake)
295293 then {
296- let $t088268892 = calcStakingFuncAndAddres(stake, assetId)
297- let call = $t088268892._1
298- let stakingAddr = $t088268892._2
294+ let $t087598825 = calcStakingFuncAndAddres(stake, assetId)
295+ let call = $t087598825._1
296+ let stakingAddr = $t087598825._2
299297 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
300298 }
301299 else {
302- let $t089789044 = calcStakingFuncAndAddres(stake, assetId)
303- let call = $t089789044._1
304- let stakingAddr = $t089789044._2
300+ let $t089118977 = calcStakingFuncAndAddres(stake, assetId)
301+ let call = $t089118977._1
302+ let stakingAddr = $t089118977._2
305303 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
306304 }
307305
308306
309307 @Callable(i)
310308 func init () = {
311- let $t091499226 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
312- let pmtAmountA = $t091499226._1
313- let pmtAssetIdA = $t091499226._2
314- let $t092319308 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
315- let pmtAmountB = $t092319308._1
316- let pmtAssetIdB = $t092319308._2
317- let $t093139390 = getAssetInfo(pmtAssetIdA)
318- let pmtStrAssetIdA = $t093139390._1
319- let pmtAssetNameA = $t093139390._2
320- let pmtDecimalsA = $t093139390._3
321- let $t093959472 = getAssetInfo(pmtAssetIdB)
322- let pmtStrAssetIdB = $t093959472._1
323- let pmtAssetNameB = $t093959472._2
324- let pmtDecimalsB = $t093959472._3
309+ let $t090829159 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
310+ let pmtAmountA = $t090829159._1
311+ let pmtAssetIdA = $t090829159._2
312+ let $t091649241 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
313+ let pmtAmountB = $t091649241._1
314+ let pmtAssetIdB = $t091649241._2
315+ let $t092469323 = getAssetInfo(pmtAssetIdA)
316+ let pmtStrAssetIdA = $t092469323._1
317+ let pmtAssetNameA = $t092469323._2
318+ let pmtDecimalsA = $t092469323._3
319+ let $t093289405 = getAssetInfo(pmtAssetIdB)
320+ let pmtStrAssetIdB = $t093289405._1
321+ let pmtAssetNameB = $t093289405._2
322+ let pmtDecimalsB = $t093289405._3
325323 if (isDefined(getBoolean(this, kActive)))
326324 then throwIsActive()
327325 else if ((pmtAssetIdA == pmtAssetIdB))
358356 let pmtAssetIdB = i.payments[1].assetId
359357 let pmtAmountA = i.payments[0].amount
360358 let pmtAmountB = i.payments[1].amount
361- let $t01198812065 = getAssetInfo(pmtAssetIdA)
362- let pmtStrAssetIdA = $t01198812065._1
363- let pmtAssetNameA = $t01198812065._2
364- let pmtDecimalsA = $t01198812065._3
365- let $t01207012264 = getAssetInfo(pmtAssetIdB)
366- let pmtStrAssetIdB = $t01207012264._1
367- let pmtAssetNameB = $t01207012264._2
368- let pmtDecimalsB = $t01207012264._3
359+ let $t01192111998 = getAssetInfo(pmtAssetIdA)
360+ let pmtStrAssetIdA = $t01192111998._1
361+ let pmtAssetNameA = $t01192111998._2
362+ let pmtDecimalsA = $t01192111998._3
363+ let $t01200312197 = getAssetInfo(pmtAssetIdB)
364+ let pmtStrAssetIdB = $t01200312197._1
365+ let pmtAssetNameB = $t01200312197._2
366+ let pmtDecimalsB = $t01200312197._3
369367 let tokenRatio = fraction(fraction(scale8, balanceA, pmtAmountA), scale3, fraction(scale8, balanceB, pmtAmountB))
370368 let ratioShareTokensInA = fraction(scale8, pmtAmountA, balanceA)
371369 let ratioShareTokensInB = fraction(scale8, pmtAmountB, balanceB)
412410
413411 @Callable(i)
414412 func replenishWithOneToken (virtualSwapTokenPay,virtualSwapTokenGet) = {
415- let $t01456314638 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
416- let pmtAmount = $t01456314638._1
417- let pmtAssetId = $t01456314638._2
418- let $t01464314716 = getAssetInfo(pmtAssetId)
419- let pmtStrAssetId = $t01464314716._1
420- let pmtAssetName = $t01464314716._2
421- let pmtDecimals = $t01464314716._3
413+ let $t01449614571 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
414+ let pmtAmount = $t01449614571._1
415+ let pmtAssetId = $t01449614571._2
416+ let $t01457614649 = getAssetInfo(pmtAssetId)
417+ let pmtStrAssetId = $t01457614649._1
418+ let pmtAssetName = $t01457614649._2
419+ let pmtDecimals = $t01457614649._3
422420 let pmtMinThreshold = 5000000
423421 let thresholdValueForMinTolerance = 50000000
424422 let tolerance = if ((thresholdValueForMinTolerance > pmtAmount))
440438 else false)
441439 then throwAssets()
442440 else {
443- let $t01572816493 = if ((pmtAssetId == assetIdA))
441+ let $t01566116426 = if ((pmtAssetId == assetIdA))
444442 then $Tuple7((pmtAmount - virtualSwapTokenPay), virtualSwapTokenGet, (balanceA + virtualSwapTokenPay), (balanceB - virtualSwapTokenGet), invariantCalc((balanceA + pmtAmount), balanceB), (balanceA + pmtAmount), balanceB)
445443 else $Tuple7(virtualSwapTokenGet, (pmtAmount - virtualSwapTokenPay), (balanceA - virtualSwapTokenGet), (balanceB + virtualSwapTokenPay), invariantCalc(balanceA, (balanceB + pmtAmount)), balanceA, (balanceB + pmtAmount))
446- let virtualReplenishA = $t01572816493._1
447- let virtualReplenishB = $t01572816493._2
448- let balanceAfterSwapA = $t01572816493._3
449- let balanceAfterSwapB = $t01572816493._4
450- let invariantCalculated = $t01572816493._5
451- let newBalanceA = $t01572816493._6
452- let newBalanceB = $t01572816493._7
444+ let virtualReplenishA = $t01566116426._1
445+ let virtualReplenishB = $t01566116426._2
446+ let balanceAfterSwapA = $t01566116426._3
447+ let balanceAfterSwapB = $t01566116426._4
448+ let invariantCalculated = $t01566116426._5
449+ let newBalanceA = $t01566116426._6
450+ let newBalanceB = $t01566116426._7
453451 let newBalanceEntry = if ((pmtAssetId == assetIdA))
454452 then IntegerEntry(kBalanceA, newBalanceA)
455453 else IntegerEntry(kBalanceB, newBalanceB)
489487
490488 @Callable(i)
491489 func withdraw () = {
492- let $t01871918862 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
493- let pmtAmount = $t01871918862._1
494- let pmtAssetId = $t01871918862._2
490+ let $t01865218795 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
491+ let pmtAmount = $t01865218795._1
492+ let pmtAssetId = $t01865218795._2
495493 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
496494 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
497495 let invariantCalculated = invariantCalc((balanceA - amountToPayA), (balanceB - amountToPayB))
524522
525523 @Callable(i)
526524 func exchange (estimatedAmountToReceive,minAmountToReceive) = {
527- let $t02037620451 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
528- let pmtAmount = $t02037620451._1
529- let pmtAssetId = $t02037620451._2
525+ let $t02030920384 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
526+ let pmtAmount = $t02030920384._1
527+ let pmtAssetId = $t02030920384._2
530528 if (!(isActive))
531529 then throwIsInactive()
532530 else if ((0 >= estimatedAmountToReceive))
554552 let amount = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
555553 let governanceReward = fraction(amount, feeGovernance, feeScale6)
556554 let amountMinusFee = fraction(amount, (feeScale6 - fee), feeScale6)
557- let $t02187322135 = if ((pmtAssetId == assetIdA))
555+ let $t02180622068 = if ((pmtAssetId == assetIdA))
558556 then $Tuple2((balanceA + pmtAmount), ((balanceB - amountMinusFee) - governanceReward))
559557 else $Tuple2(((balanceA - amountMinusFee) - governanceReward), (balanceB + pmtAmount))
560- let newBalanceA = $t02187322135._1
561- let newBalanceB = $t02187322135._2
558+ let newBalanceA = $t02180622068._1
559+ let newBalanceB = $t02180622068._2
562560 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
563561 if (if ((dAppThresholdAmount > newBalanceA))
564562 then true
565563 else (dAppThresholdAmount > newBalanceB))
566564 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
567565 else {
568- let $t02243322506 = getAssetInfo(pmtAssetId)
569- let pmtStrAssetId = $t02243322506._1
570- let pmtAssetName = $t02243322506._2
571- let pmtDecimals = $t02243322506._3
572- let $t02251922596 = getAssetInfo(sendAssetId)
573- let sendStrAssetId = $t02251922596._1
574- let sendAssetName = $t02251922596._2
575- let sendDecimals = $t02251922596._3
566+ let $t02236622439 = getAssetInfo(pmtAssetId)
567+ let pmtStrAssetId = $t02236622439._1
568+ let pmtAssetName = $t02236622439._2
569+ let pmtDecimals = $t02236622439._3
570+ let $t02245222529 = getAssetInfo(sendAssetId)
571+ let sendStrAssetId = $t02245222529._1
572+ let sendAssetName = $t02245222529._2
573+ let sendDecimals = $t02245222529._3
576574 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
577575 then invoke(this, "stakeUnstake", [true, pmtAmount, pmtStrAssetId], nil)
578576 else 0
582580 then invoke(this, "stakeUnstake", [false, (amountMinusFee + governanceReward), sendStrAssetId], nil)
583581 else 0
584582 if ((stake2 == stake2))
585- then [IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kInvariant, invariantCalc(newBalanceA, newBalanceB)), ScriptTransfer(i.caller, amountMinusFee, sendAssetId), ScriptTransfer(govAddr, governanceReward, sendAssetId)]
583+ then [IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kInvariant, invariantCalc(newBalanceA, newBalanceB)), ScriptTransfer(i.caller, amountMinusFee, sendAssetId), ScriptTransfer(walletAddress, governanceReward, sendAssetId)]
586584 else throw("Strict value is not equal to itself.")
587585 }
588586 else throw("Strict value is not equal to itself.")
611609
612610
613611 @Callable(i)
614-func takeIntoAccountExtraFunds (amountLeave) = {
615- let uncountableA = (accountBalanceWithStakedA - balanceA)
616- let uncountableB = (accountBalanceWithStakedB - balanceB)
617- let amountEnrollA = (uncountableA - (if ((assetIdA == unit))
618- then amountLeave
619- else 0))
620- let amountEnrollB = (uncountableB - (if ((assetIdB == unit))
621- then amountLeave
622- else 0))
612+func takeIntoAccountExtraFunds () = {
613+ let amountEnrollA = (accountBalanceWithStakedA - balanceA)
614+ let amountEnrollB = (accountBalanceWithStakedB - balanceB)
623615 let invariantNew = invariantCalc((balanceA + amountEnrollA), (balanceB + amountEnrollB))
624616 if (!(isActive))
625617 then throwIsInactive()
626- else if ((i.caller != this))
627- then throwOnlyAdmin()
628- else if ((0 > amountLeave))
629- then throw(("Argument 'amountLeave' cannot be negative. Actual: " + toString(amountLeave)))
630- else if (if ((0 > uncountableA))
631- then true
632- else (0 > uncountableB))
633- then suspend("Enroll amount negative")
634- else if (if ((0 > amountEnrollA))
635- then true
636- else (0 > amountEnrollB))
637- then throw("Too large amountLeave")
638- else {
639- let stake1 = if (if (containsElement(stakingAssets, strAssetIdA))
640- then (amountEnrollA > 0)
641- else false)
642- then invoke(this, "stakeUnstake", [true, amountEnrollA, strAssetIdA], nil)
643- else 0
644- if ((stake1 == stake1))
645- then {
646- let stake2 = if (if (containsElement(stakingAssets, strAssetIdB))
647- then (amountEnrollB > 0)
648- else false)
649- then invoke(this, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
650- else 0
651- if ((stake2 == stake2))
652- then [IntegerEntry(kInvariant, invariantNew), IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
653- else throw("Strict value is not equal to itself.")
654- }
655- else throw("Strict value is not equal to itself.")
656- }
618+ else if ((i.caller != walletAddress))
619+ then throw("Only the wallet can call this function")
620+ else if (if ((0 > amountEnrollA))
621+ then true
622+ else (0 > amountEnrollB))
623+ then suspend("Enroll amount negative")
624+ else if (if ((amountEnrollA == 0))
625+ then (amountEnrollB == 0)
626+ else false)
627+ then throw("No money to take")
628+ else {
629+ let stake1 = if (if (containsElement(stakingAssets, strAssetIdA))
630+ then (amountEnrollA > 0)
631+ else false)
632+ then invoke(this, "stakeUnstake", [true, amountEnrollA, strAssetIdA], nil)
633+ else 0
634+ if ((stake1 == stake1))
635+ then {
636+ let stake2 = if (if (containsElement(stakingAssets, strAssetIdB))
637+ then (amountEnrollB > 0)
638+ else false)
639+ then invoke(this, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
640+ else 0
641+ if ((stake2 == stake2))
642+ then [IntegerEntry(kInvariant, invariantNew), IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
643+ else throw("Strict value is not equal to itself.")
644+ }
645+ else throw("Strict value is not equal to itself.")
646+ }
657647 }
658648
659649
662652 func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
663653 then throw("Only contract itself can invoke this function")
664654 else {
665- let $t02592426027 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
666- let call = $t02592426027._1
667- let addr = $t02592426027._2
668- let params = $t02592426027._3
669- let payments = $t02592426027._4
655+ let $t02559125694 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
656+ let call = $t02559125694._1
657+ let addr = $t02559125694._2
658+ let params = $t02559125694._3
659+ let payments = $t02559125694._4
670660 let inv = invoke(addr, call, params, payments)
671661 if ((inv == inv))
672662 then nil
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let version = "2.0.0"
55
66 let kVersion = "version"
77
88 let kActive = "active"
99
1010 let kAssetIdA = "A_asset_id"
1111
1212 let kAssetIdB = "B_asset_id"
1313
1414 let kBalanceA = "A_asset_balance"
1515
1616 let kBalanceB = "B_asset_balance"
1717
1818 let kShareAssetId = "share_asset_id"
1919
2020 let kShareAssetSupply = "share_asset_supply"
2121
2222 let kFee = "commission"
2323
2424 let kFeeScaleDelimiter = "commission_scale_delimiter"
2525
2626 let kInvariant = "invariant"
2727
2828 let kCause = "shutdown_cause"
2929
3030 let keyUSDNNSBTAddress = "staking_usdnnsbt_address"
3131
3232 let keyEURNAddress = "staking_eurn_address"
3333
3434 let keyAdminPubKey1 = "admin_pub_1"
3535
3636 let keyAdminPubKey2 = "admin_pub_2"
3737
3838 let keyAdminPubKey3 = "admin_pub_3"
3939
40-let USDNToWavesExchanger = Address(base58'3N8PGkzXhbtTvEwEQTtE2xiTJmsDEQ9XfoZ')
40+let USDNToWavesExchanger = Address(base58'3PHaNgomBkrvEL2QnuJarQVJa71wjw9qiqG')
4141
42-let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
42+let oracle = Address(base58'3PEbqViERCoKnmcSULh6n2aiMvUdSQdCsom')
4343
4444 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
4545 case string: String =>
4646 fromBase58String(string)
4747 case nothing =>
4848 throw("Admin public key is empty")
4949 }
5050
5151
5252 let adminPubKey1 = getAdminPub(keyAdminPubKey1)
5353
5454 let adminPubKey2 = getAdminPub(keyAdminPubKey2)
5555
5656 let adminPubKey3 = getAdminPub(keyAdminPubKey3)
5757
5858 let admStartStop = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
5959
6060 let admStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
6161
62-let govAddr = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
63-
64-let stakingAddress = Address(base58'3N6q7sCGSSLBUXDdjBdYGTJbZGZfhhh8cNg')
62+let walletAddress = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
6563
6664 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
6765
6866 let EURN = base58'ECBCkHS68DckpBrzLeoRgYbFg7sCVqR176mPqbXsj9pA'
6967
7068 let stakingAssets = [toBase58String(USDN), toBase58String(EURN)]
7169
7270 let stakingUSDNNSBTAddress = Address(fromBase58String(valueOrErrorMessage(getString(oracle, keyUSDNNSBTAddress), "no usdn staking address")))
7371
7472 let stakingEURNAddress = Address(fromBase58String(valueOrErrorMessage(getString(oracle, keyEURNAddress), "no usdn staking address")))
7573
7674 let isActive = getBooleanValue(this, kActive)
7775
7876 let strAssetIdA = getStringValue(this, kAssetIdA)
7977
8078 let strAssetIdB = getStringValue(this, kAssetIdB)
8179
8280 let assetIdA = if ((strAssetIdA == "WAVES"))
8381 then unit
8482 else fromBase58String(strAssetIdA)
8583
8684 let assetIdB = if ((strAssetIdB == "WAVES"))
8785 then unit
8886 else fromBase58String(strAssetIdB)
8987
9088 let assetNameA = match assetIdA {
9189 case id: ByteVector =>
9290 value(assetInfo(id)).name
9391 case waves: Unit =>
9492 "WAVES"
9593 case _ =>
9694 throw("Match error")
9795 }
9896
9997 let assetNameB = match assetIdB {
10098 case id: ByteVector =>
10199 value(assetInfo(id)).name
102100 case waves: Unit =>
103101 "WAVES"
104102 case _ =>
105103 throw("Match error")
106104 }
107105
108106 let balanceA = getIntegerValue(this, kBalanceA)
109107
110108 let balanceB = getIntegerValue(this, kBalanceB)
111109
112110 let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
113111
114112 let shareAssetSupply = getIntegerValue(this, kShareAssetSupply)
115113
116114 let invariant = getIntegerValue(this, kInvariant)
117115
118116 let fee = 500
119117
120118 let feeGovernance = 200
121119
122120 let feeScale6 = 1000000
123121
124122 let scale3 = 1000
125123
126124 let scale8 = 100000000
127125
128126 let scale12 = 1000000000000
129127
130128 let slippageScale3 = 1000
131129
132130 let digits8 = 8
133131
134132 let dAppThreshold = 50
135133
136134 let dAppThresholdScale2 = 100
137135
138136 let exchangeRatioLimitMin = 90000000
139137
140138 let exchangeRatioLimitMax = 110000000
141139
142140 let alpha = 50
143141
144142 let alphaDigits = 2
145143
146144 let beta = 46000000
147145
148146 func accountBalance (assetId) = match assetId {
149147 case id: ByteVector =>
150148 assetBalance(this, id)
151149 case waves: Unit =>
152150 wavesBalance(this).available
153151 case _ =>
154152 throw("Match error")
155153 }
156154
157155
158156 func stakedAmount (assetId) = {
159157 let stakedAmountCalculated = match assetId {
160158 case aId: ByteVector =>
161159 if ((aId == USDN))
162160 then getInteger(stakingUSDNNSBTAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
163161 else if ((aId == EURN))
164162 then getInteger(stakingEURNAddress, ((("%s%s%s__stakingBalance__" + toBase58String(aId)) + "__") + toString(this)))
165163 else 0
166164 case _: Unit =>
167165 0
168166 case _ =>
169167 throw("Match error")
170168 }
171169 match stakedAmountCalculated {
172170 case i: Int =>
173171 i
174172 case _ =>
175173 0
176174 }
177175 }
178176
179177
180178 let stakedAmountA = stakedAmount(assetIdA)
181179
182180 let stakedAmountB = stakedAmount(assetIdB)
183181
184182 let availableBalanceA = (balanceA - stakedAmountA)
185183
186184 let availableBalanceB = (balanceB - stakedAmountB)
187185
188186 let accountBalanceWithStakedA = (accountBalance(assetIdA) + stakedAmountA)
189187
190188 let accountBalanceWithStakedB = (accountBalance(assetIdB) + stakedAmountB)
191189
192190 let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
193191 then (accountBalanceWithStakedB >= balanceB)
194192 else false
195193
196194 func skewness (x,y) = (((fraction(scale12, x, y) + fraction(scale12, y, x)) / 2) / 10000)
197195
198196
199197 func invariantCalc (x,y) = {
200198 let sk = skewness(x, y)
201199 (fraction((x + y), scale8, pow(sk, digits8, alpha, alphaDigits, digits8, CEILING)) + (2 * fraction(pow(fraction(x, y, scale8), 0, 5, 1, (digits8 / 2), DOWN), pow((sk - beta), digits8, alpha, alphaDigits, digits8, DOWN), scale8)))
202200 }
203201
204202
205203 func calculateSendAmount (amountToSendEstimated,minTokenReceiveAmount,tokenReceiveAmount,tokenId) = {
206204 let slippageValue = (scale8 - ((scale8 * 1) / 10000000))
207205 let deltaBetweenMaxAndMinSendValue = (amountToSendEstimated - minTokenReceiveAmount)
208206 let x = (balanceA + tokenReceiveAmount)
209207 let y = (balanceB + tokenReceiveAmount)
210208 let invariantNew = if ((tokenId == assetIdA))
211209 then invariantCalc(x, (balanceB - amountToSendEstimated))
212210 else if ((tokenId == assetIdB))
213211 then invariantCalc((balanceA - amountToSendEstimated), y)
214212 else throw("Wrong asset in payment")
215213 let invariantEstimatedRatio = fraction(scale8, invariant, invariantNew)
216214 func getStepAmount (acc,step) = if ((acc == -1))
217215 then {
218216 let amountToSend = (amountToSendEstimated - ((step * deltaBetweenMaxAndMinSendValue) / 5))
219217 let stepInvariant = if ((tokenId == assetIdA))
220218 then invariantCalc(x, (balanceB - amountToSend))
221219 else invariantCalc((balanceA - amountToSend), y)
222220 if ((stepInvariant > invariant))
223221 then amountToSend
224222 else -1
225223 }
226224 else acc
227225
228226 let stepAmount = {
229227 let $l = [1, 2, 3, 4, 5]
230228 let $s = size($l)
231229 let $acc0 = -1
232230 func $f0_1 ($a,$i) = if (($i >= $s))
233231 then $a
234232 else getStepAmount($a, $l[$i])
235233
236234 func $f0_2 ($a,$i) = if (($i >= $s))
237235 then $a
238236 else throw("List size exceeds 5")
239237
240238 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
241239 }
242240 if ((0 > stepAmount))
243241 then throw("something went wrong while working with amountToSend")
244242 else if (if ((invariantEstimatedRatio > slippageValue))
245243 then (invariantNew > invariant)
246244 else false)
247245 then amountToSendEstimated
248246 else stepAmount
249247 }
250248
251249
252250 func getAssetInfo (assetId) = match assetId {
253251 case id: ByteVector =>
254252 let stringId = toBase58String(id)
255253 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
256254 $Tuple3(stringId, info.name, info.decimals)
257255 case waves: Unit =>
258256 $Tuple3("WAVES", "WAVES", 8)
259257 case _ =>
260258 throw("Match error")
261259 }
262260
263261
264262 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
265263
266264
267265 func throwIsActive () = throw("DApp is already active")
268266
269267
270268 func throwIsInactive () = throw("DApp is inactive at this moment")
271269
272270
273271 func throwOnlyAdmin () = throw("Only admin can call this function")
274272
275273
276274 func throwAssets () = throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
277275
278276
279277 func throwThreshold (threshold,amountA,amountB) = throw(((((((((("New balance in assets of the DApp is less than threshold " + toString(threshold)) + ": ") + toString(amountA)) + " ") + assetNameA) + ", ") + toString(amountB)) + " ") + assetNameB))
280278
281279
282280 func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB) + ". State: ") + toString(accountBalance(assetIdA))) + " ") + assetNameA) + ", ") + toString(accountBalance(assetIdB))) + " ") + assetNameB))
283281
284282
285283 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
286284 then if ((assetId == USDN))
287285 then $Tuple2("lockNeutrino", stakingUSDNNSBTAddress)
288286 else $Tuple2("startStaking", stakingEURNAddress)
289287 else if ((assetId == USDN))
290288 then $Tuple2("unlockNeutrino", stakingUSDNNSBTAddress)
291289 else $Tuple2("stopStaking", stakingEURNAddress)
292290
293291
294292 func calcStakingParams (stake,amount,assetId) = if (stake)
295293 then {
296- let $t088268892 = calcStakingFuncAndAddres(stake, assetId)
297- let call = $t088268892._1
298- let stakingAddr = $t088268892._2
294+ let $t087598825 = calcStakingFuncAndAddres(stake, assetId)
295+ let call = $t087598825._1
296+ let stakingAddr = $t087598825._2
299297 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
300298 }
301299 else {
302- let $t089789044 = calcStakingFuncAndAddres(stake, assetId)
303- let call = $t089789044._1
304- let stakingAddr = $t089789044._2
300+ let $t089118977 = calcStakingFuncAndAddres(stake, assetId)
301+ let call = $t089118977._1
302+ let stakingAddr = $t089118977._2
305303 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
306304 }
307305
308306
309307 @Callable(i)
310308 func init () = {
311- let $t091499226 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
312- let pmtAmountA = $t091499226._1
313- let pmtAssetIdA = $t091499226._2
314- let $t092319308 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
315- let pmtAmountB = $t092319308._1
316- let pmtAssetIdB = $t092319308._2
317- let $t093139390 = getAssetInfo(pmtAssetIdA)
318- let pmtStrAssetIdA = $t093139390._1
319- let pmtAssetNameA = $t093139390._2
320- let pmtDecimalsA = $t093139390._3
321- let $t093959472 = getAssetInfo(pmtAssetIdB)
322- let pmtStrAssetIdB = $t093959472._1
323- let pmtAssetNameB = $t093959472._2
324- let pmtDecimalsB = $t093959472._3
309+ let $t090829159 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
310+ let pmtAmountA = $t090829159._1
311+ let pmtAssetIdA = $t090829159._2
312+ let $t091649241 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
313+ let pmtAmountB = $t091649241._1
314+ let pmtAssetIdB = $t091649241._2
315+ let $t092469323 = getAssetInfo(pmtAssetIdA)
316+ let pmtStrAssetIdA = $t092469323._1
317+ let pmtAssetNameA = $t092469323._2
318+ let pmtDecimalsA = $t092469323._3
319+ let $t093289405 = getAssetInfo(pmtAssetIdB)
320+ let pmtStrAssetIdB = $t093289405._1
321+ let pmtAssetNameB = $t093289405._2
322+ let pmtDecimalsB = $t093289405._3
325323 if (isDefined(getBoolean(this, kActive)))
326324 then throwIsActive()
327325 else if ((pmtAssetIdA == pmtAssetIdB))
328326 then throw("Assets must be different")
329327 else {
330328 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
331329 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
332330 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
333331 let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
334332 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
335333 let shareIssueId = calculateAssetId(shareIssue)
336334 let invariantCalculated = invariantCalc(pmtAmountA, pmtAmountB)
337335 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
338336 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
339337 else 0
340338 if ((stake1 == stake1))
341339 then {
342340 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
343341 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
344342 else 0
345343 if ((stake2 == stake2))
346344 then [StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceA, pmtAmountA), IntegerEntry(kBalanceB, pmtAmountB), IntegerEntry(kInvariant, invariantCalculated), IntegerEntry(kFee, fee), IntegerEntry(kFeeScaleDelimiter, feeScale6), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareIssueId)]
347345 else throw("Strict value is not equal to itself.")
348346 }
349347 else throw("Strict value is not equal to itself.")
350348 }
351349 }
352350
353351
354352
355353 @Callable(i)
356354 func replenishWithTwoTokens (slippageTolerance) = {
357355 let pmtAssetIdA = i.payments[0].assetId
358356 let pmtAssetIdB = i.payments[1].assetId
359357 let pmtAmountA = i.payments[0].amount
360358 let pmtAmountB = i.payments[1].amount
361- let $t01198812065 = getAssetInfo(pmtAssetIdA)
362- let pmtStrAssetIdA = $t01198812065._1
363- let pmtAssetNameA = $t01198812065._2
364- let pmtDecimalsA = $t01198812065._3
365- let $t01207012264 = getAssetInfo(pmtAssetIdB)
366- let pmtStrAssetIdB = $t01207012264._1
367- let pmtAssetNameB = $t01207012264._2
368- let pmtDecimalsB = $t01207012264._3
359+ let $t01192111998 = getAssetInfo(pmtAssetIdA)
360+ let pmtStrAssetIdA = $t01192111998._1
361+ let pmtAssetNameA = $t01192111998._2
362+ let pmtDecimalsA = $t01192111998._3
363+ let $t01200312197 = getAssetInfo(pmtAssetIdB)
364+ let pmtStrAssetIdB = $t01200312197._1
365+ let pmtAssetNameB = $t01200312197._2
366+ let pmtDecimalsB = $t01200312197._3
369367 let tokenRatio = fraction(fraction(scale8, balanceA, pmtAmountA), scale3, fraction(scale8, balanceB, pmtAmountB))
370368 let ratioShareTokensInA = fraction(scale8, pmtAmountA, balanceA)
371369 let ratioShareTokensInB = fraction(scale8, pmtAmountB, balanceB)
372370 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
373371 let invariantCalculated = invariantCalc((balanceA + pmtAmountA), (balanceB + pmtAmountB))
374372 if (!(isActive))
375373 then throwIsInactive()
376374 else if (if ((0 > slippageTolerance))
377375 then true
378376 else (slippageTolerance > 10))
379377 then throw("Slippage tolerance must be <= 1%")
380378 else if ((size(i.payments) != 2))
381379 then throw("Two attached assets expected")
382380 else if (if ((pmtAssetIdA != assetIdA))
383381 then true
384382 else (pmtAssetIdB != assetIdB))
385383 then throwAssets()
386384 else if (if ((((scale3 * (slippageScale3 - slippageTolerance)) / slippageScale3) > tokenRatio))
387385 then true
388386 else (tokenRatio > ((scale3 * (slippageScale3 + slippageTolerance)) / slippageScale3)))
389387 then throw("Incorrect assets amount: amounts must have the contract ratio")
390388 else if ((shareTokenToPayAmount == 0))
391389 then throw("Too small amount to replenish")
392390 else if (!(hasEnoughBalance))
393391 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
394392 else {
395393 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
396394 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
397395 else 0
398396 if ((stake1 == stake1))
399397 then {
400398 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
401399 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
402400 else 0
403401 if ((stake2 == stake2))
404402 then [IntegerEntry(kBalanceA, (balanceA + pmtAmountA)), IntegerEntry(kBalanceB, (balanceB + pmtAmountB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), IntegerEntry(kInvariant, invariantCalculated), Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId)]
405403 else throw("Strict value is not equal to itself.")
406404 }
407405 else throw("Strict value is not equal to itself.")
408406 }
409407 }
410408
411409
412410
413411 @Callable(i)
414412 func replenishWithOneToken (virtualSwapTokenPay,virtualSwapTokenGet) = {
415- let $t01456314638 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
416- let pmtAmount = $t01456314638._1
417- let pmtAssetId = $t01456314638._2
418- let $t01464314716 = getAssetInfo(pmtAssetId)
419- let pmtStrAssetId = $t01464314716._1
420- let pmtAssetName = $t01464314716._2
421- let pmtDecimals = $t01464314716._3
413+ let $t01449614571 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
414+ let pmtAmount = $t01449614571._1
415+ let pmtAssetId = $t01449614571._2
416+ let $t01457614649 = getAssetInfo(pmtAssetId)
417+ let pmtStrAssetId = $t01457614649._1
418+ let pmtAssetName = $t01457614649._2
419+ let pmtDecimals = $t01457614649._3
422420 let pmtMinThreshold = 5000000
423421 let thresholdValueForMinTolerance = 50000000
424422 let tolerance = if ((thresholdValueForMinTolerance > pmtAmount))
425423 then 100000
426424 else 1
427425 let slippageValueMinForReplenish = (scale8 - ((scale8 * tolerance) / 10000000))
428426 let slippageValueMaxForReplenish = (scale8 + ((scale8 * tolerance) / 10000000))
429427 let slippageValueMinForSwap = (scale8 - ((scale8 * 1) / 10000000))
430428 if (!(isActive))
431429 then throwIsInactive()
432430 else if ((pmtMinThreshold > pmtAmount))
433431 then throw((((("Payment amount " + toString(pmtAmount)) + " does not exceed the minimum amount of ") + toString(pmtMinThreshold)) + " tokens"))
434432 else if ((size(i.payments) != 1))
435433 then throw("One attached payment expected")
436434 else if (!(hasEnoughBalance))
437435 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
438436 else if (if ((pmtAssetId != assetIdA))
439437 then (pmtAssetId != assetIdB)
440438 else false)
441439 then throwAssets()
442440 else {
443- let $t01572816493 = if ((pmtAssetId == assetIdA))
441+ let $t01566116426 = if ((pmtAssetId == assetIdA))
444442 then $Tuple7((pmtAmount - virtualSwapTokenPay), virtualSwapTokenGet, (balanceA + virtualSwapTokenPay), (balanceB - virtualSwapTokenGet), invariantCalc((balanceA + pmtAmount), balanceB), (balanceA + pmtAmount), balanceB)
445443 else $Tuple7(virtualSwapTokenGet, (pmtAmount - virtualSwapTokenPay), (balanceA - virtualSwapTokenGet), (balanceB + virtualSwapTokenPay), invariantCalc(balanceA, (balanceB + pmtAmount)), balanceA, (balanceB + pmtAmount))
446- let virtualReplenishA = $t01572816493._1
447- let virtualReplenishB = $t01572816493._2
448- let balanceAfterSwapA = $t01572816493._3
449- let balanceAfterSwapB = $t01572816493._4
450- let invariantCalculated = $t01572816493._5
451- let newBalanceA = $t01572816493._6
452- let newBalanceB = $t01572816493._7
444+ let virtualReplenishA = $t01566116426._1
445+ let virtualReplenishB = $t01566116426._2
446+ let balanceAfterSwapA = $t01566116426._3
447+ let balanceAfterSwapB = $t01566116426._4
448+ let invariantCalculated = $t01566116426._5
449+ let newBalanceA = $t01566116426._6
450+ let newBalanceB = $t01566116426._7
453451 let newBalanceEntry = if ((pmtAssetId == assetIdA))
454452 then IntegerEntry(kBalanceA, newBalanceA)
455453 else IntegerEntry(kBalanceB, newBalanceB)
456454 let invariantNew = invariantCalc(balanceAfterSwapA, balanceAfterSwapB)
457455 let invariantEstimatedRatio = fraction(scale8, invariant, invariantNew)
458456 let ratioVirtualBalanceToVirtualReplenish = (fraction((scale8 * scale8), balanceAfterSwapA, balanceAfterSwapB) / fraction(scale8, virtualReplenishA, virtualReplenishB))
459457 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
460458 if (if ((slippageValueMinForSwap >= invariantEstimatedRatio))
461459 then true
462460 else (invariant > invariantNew))
463461 then throw("Incorrect virtualSwapTokenPay or virtualSwapTokenGet value")
464462 else if (if ((slippageValueMinForReplenish > ratioVirtualBalanceToVirtualReplenish))
465463 then true
466464 else (ratioVirtualBalanceToVirtualReplenish > slippageValueMaxForReplenish))
467465 then throw("Swap with virtualSwapTokenPay and virtualSwapTokenGet is possible, but ratio after virtual swap is incorrect")
468466 else if (if ((dAppThresholdAmount > newBalanceA))
469467 then true
470468 else (dAppThresholdAmount > newBalanceB))
471469 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
472470 else {
473471 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
474472 then invoke(this, "stakeUnstake", [true, pmtAmount, pmtStrAssetId], nil)
475473 else 0
476474 if ((stake1 == stake1))
477475 then {
478476 let ratioShareTokensInA = fraction(virtualReplenishA, scale8, balanceAfterSwapA)
479477 let ratioShareTokensInB = fraction(virtualReplenishB, scale8, balanceAfterSwapB)
480478 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
481479 [Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), newBalanceEntry, IntegerEntry(kInvariant, invariantCalculated)]
482480 }
483481 else throw("Strict value is not equal to itself.")
484482 }
485483 }
486484 }
487485
488486
489487
490488 @Callable(i)
491489 func withdraw () = {
492- let $t01871918862 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
493- let pmtAmount = $t01871918862._1
494- let pmtAssetId = $t01871918862._2
490+ let $t01865218795 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
491+ let pmtAmount = $t01865218795._1
492+ let pmtAssetId = $t01865218795._2
495493 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
496494 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
497495 let invariantCalculated = invariantCalc((balanceA - amountToPayA), (balanceB - amountToPayB))
498496 if (!(isActive))
499497 then throwIsInactive()
500498 else if ((size(i.payments) != 1))
501499 then throw("One attached payment expected")
502500 else if ((pmtAssetId != shareAssetId))
503501 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
504502 else if (!(hasEnoughBalance))
505503 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
506504 else {
507505 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
508506 then invoke(this, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
509507 else 0
510508 if ((stake1 == stake1))
511509 then {
512510 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
513511 then invoke(this, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
514512 else 0
515513 if ((stake2 == stake2))
516514 then [IntegerEntry(kBalanceA, (balanceA - amountToPayA)), IntegerEntry(kBalanceB, (balanceB - amountToPayB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply - pmtAmount)), IntegerEntry(kInvariant, invariantCalculated), Burn(shareAssetId, pmtAmount), ScriptTransfer(i.caller, amountToPayA, assetIdA), ScriptTransfer(i.caller, amountToPayB, assetIdB)]
517515 else throw("Strict value is not equal to itself.")
518516 }
519517 else throw("Strict value is not equal to itself.")
520518 }
521519 }
522520
523521
524522
525523 @Callable(i)
526524 func exchange (estimatedAmountToReceive,minAmountToReceive) = {
527- let $t02037620451 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
528- let pmtAmount = $t02037620451._1
529- let pmtAssetId = $t02037620451._2
525+ let $t02030920384 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
526+ let pmtAmount = $t02030920384._1
527+ let pmtAssetId = $t02030920384._2
530528 if (!(isActive))
531529 then throwIsInactive()
532530 else if ((0 >= estimatedAmountToReceive))
533531 then throw(("Estimated amount must be positive. Actual: " + toString(estimatedAmountToReceive)))
534532 else if ((minAmountToReceive > estimatedAmountToReceive))
535533 then throw(((("Minimal amount can't be greater than estimated. Estimated: " + toString(estimatedAmountToReceive)) + ". Minimal: ") + toString(minAmountToReceive)))
536534 else if ((size(i.payments) != 1))
537535 then throw("One attached payment expected")
538536 else if (!(hasEnoughBalance))
539537 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
540538 else if (if ((pmtAssetId != assetIdA))
541539 then (pmtAssetId != assetIdB)
542540 else false)
543541 then throwAssets()
544542 else if ((10000000 > pmtAmount))
545543 then throw("Only swap of 10.000000 or more tokens is allowed")
546544 else if (if ((exchangeRatioLimitMin > fraction(scale8, minAmountToReceive, pmtAmount)))
547545 then true
548546 else (fraction(scale8, estimatedAmountToReceive, pmtAmount) > exchangeRatioLimitMax))
549547 then throw("Incorrect args and pmt ratio")
550548 else {
551549 let sendAssetId = if ((pmtAssetId == assetIdA))
552550 then assetIdB
553551 else assetIdA
554552 let amount = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
555553 let governanceReward = fraction(amount, feeGovernance, feeScale6)
556554 let amountMinusFee = fraction(amount, (feeScale6 - fee), feeScale6)
557- let $t02187322135 = if ((pmtAssetId == assetIdA))
555+ let $t02180622068 = if ((pmtAssetId == assetIdA))
558556 then $Tuple2((balanceA + pmtAmount), ((balanceB - amountMinusFee) - governanceReward))
559557 else $Tuple2(((balanceA - amountMinusFee) - governanceReward), (balanceB + pmtAmount))
560- let newBalanceA = $t02187322135._1
561- let newBalanceB = $t02187322135._2
558+ let newBalanceA = $t02180622068._1
559+ let newBalanceB = $t02180622068._2
562560 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
563561 if (if ((dAppThresholdAmount > newBalanceA))
564562 then true
565563 else (dAppThresholdAmount > newBalanceB))
566564 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
567565 else {
568- let $t02243322506 = getAssetInfo(pmtAssetId)
569- let pmtStrAssetId = $t02243322506._1
570- let pmtAssetName = $t02243322506._2
571- let pmtDecimals = $t02243322506._3
572- let $t02251922596 = getAssetInfo(sendAssetId)
573- let sendStrAssetId = $t02251922596._1
574- let sendAssetName = $t02251922596._2
575- let sendDecimals = $t02251922596._3
566+ let $t02236622439 = getAssetInfo(pmtAssetId)
567+ let pmtStrAssetId = $t02236622439._1
568+ let pmtAssetName = $t02236622439._2
569+ let pmtDecimals = $t02236622439._3
570+ let $t02245222529 = getAssetInfo(sendAssetId)
571+ let sendStrAssetId = $t02245222529._1
572+ let sendAssetName = $t02245222529._2
573+ let sendDecimals = $t02245222529._3
576574 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
577575 then invoke(this, "stakeUnstake", [true, pmtAmount, pmtStrAssetId], nil)
578576 else 0
579577 if ((stake1 == stake1))
580578 then {
581579 let stake2 = if (containsElement(stakingAssets, sendStrAssetId))
582580 then invoke(this, "stakeUnstake", [false, (amountMinusFee + governanceReward), sendStrAssetId], nil)
583581 else 0
584582 if ((stake2 == stake2))
585- then [IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kInvariant, invariantCalc(newBalanceA, newBalanceB)), ScriptTransfer(i.caller, amountMinusFee, sendAssetId), ScriptTransfer(govAddr, governanceReward, sendAssetId)]
583+ then [IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kInvariant, invariantCalc(newBalanceA, newBalanceB)), ScriptTransfer(i.caller, amountMinusFee, sendAssetId), ScriptTransfer(walletAddress, governanceReward, sendAssetId)]
586584 else throw("Strict value is not equal to itself.")
587585 }
588586 else throw("Strict value is not equal to itself.")
589587 }
590588 }
591589 }
592590
593591
594592
595593 @Callable(i)
596594 func shutdown () = if (!(isActive))
597595 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
598596 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, admStartStop], i.callerPublicKey)))
599597 then throwOnlyAdmin()
600598 else suspend("Paused by admin")
601599
602600
603601
604602 @Callable(i)
605603 func activate () = if (isActive)
606604 then throwIsActive()
607605 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, admStartStop], i.callerPublicKey)))
608606 then throwOnlyAdmin()
609607 else [BooleanEntry(kActive, true), DeleteEntry(kCause)]
610608
611609
612610
613611 @Callable(i)
614-func takeIntoAccountExtraFunds (amountLeave) = {
615- let uncountableA = (accountBalanceWithStakedA - balanceA)
616- let uncountableB = (accountBalanceWithStakedB - balanceB)
617- let amountEnrollA = (uncountableA - (if ((assetIdA == unit))
618- then amountLeave
619- else 0))
620- let amountEnrollB = (uncountableB - (if ((assetIdB == unit))
621- then amountLeave
622- else 0))
612+func takeIntoAccountExtraFunds () = {
613+ let amountEnrollA = (accountBalanceWithStakedA - balanceA)
614+ let amountEnrollB = (accountBalanceWithStakedB - balanceB)
623615 let invariantNew = invariantCalc((balanceA + amountEnrollA), (balanceB + amountEnrollB))
624616 if (!(isActive))
625617 then throwIsInactive()
626- else if ((i.caller != this))
627- then throwOnlyAdmin()
628- else if ((0 > amountLeave))
629- then throw(("Argument 'amountLeave' cannot be negative. Actual: " + toString(amountLeave)))
630- else if (if ((0 > uncountableA))
631- then true
632- else (0 > uncountableB))
633- then suspend("Enroll amount negative")
634- else if (if ((0 > amountEnrollA))
635- then true
636- else (0 > amountEnrollB))
637- then throw("Too large amountLeave")
638- else {
639- let stake1 = if (if (containsElement(stakingAssets, strAssetIdA))
640- then (amountEnrollA > 0)
641- else false)
642- then invoke(this, "stakeUnstake", [true, amountEnrollA, strAssetIdA], nil)
643- else 0
644- if ((stake1 == stake1))
645- then {
646- let stake2 = if (if (containsElement(stakingAssets, strAssetIdB))
647- then (amountEnrollB > 0)
648- else false)
649- then invoke(this, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
650- else 0
651- if ((stake2 == stake2))
652- then [IntegerEntry(kInvariant, invariantNew), IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
653- else throw("Strict value is not equal to itself.")
654- }
655- else throw("Strict value is not equal to itself.")
656- }
618+ else if ((i.caller != walletAddress))
619+ then throw("Only the wallet can call this function")
620+ else if (if ((0 > amountEnrollA))
621+ then true
622+ else (0 > amountEnrollB))
623+ then suspend("Enroll amount negative")
624+ else if (if ((amountEnrollA == 0))
625+ then (amountEnrollB == 0)
626+ else false)
627+ then throw("No money to take")
628+ else {
629+ let stake1 = if (if (containsElement(stakingAssets, strAssetIdA))
630+ then (amountEnrollA > 0)
631+ else false)
632+ then invoke(this, "stakeUnstake", [true, amountEnrollA, strAssetIdA], nil)
633+ else 0
634+ if ((stake1 == stake1))
635+ then {
636+ let stake2 = if (if (containsElement(stakingAssets, strAssetIdB))
637+ then (amountEnrollB > 0)
638+ else false)
639+ then invoke(this, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
640+ else 0
641+ if ((stake2 == stake2))
642+ then [IntegerEntry(kInvariant, invariantNew), IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
643+ else throw("Strict value is not equal to itself.")
644+ }
645+ else throw("Strict value is not equal to itself.")
646+ }
657647 }
658648
659649
660650
661651 @Callable(i)
662652 func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
663653 then throw("Only contract itself can invoke this function")
664654 else {
665- let $t02592426027 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
666- let call = $t02592426027._1
667- let addr = $t02592426027._2
668- let params = $t02592426027._3
669- let payments = $t02592426027._4
655+ let $t02559125694 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
656+ let call = $t02559125694._1
657+ let addr = $t02559125694._2
658+ let params = $t02559125694._3
659+ let payments = $t02559125694._4
670660 let inv = invoke(addr, call, params, payments)
671661 if ((inv == inv))
672662 then nil
673663 else throw("Strict value is not equal to itself.")
674664 }
675665
676666
677667
678668 @Callable(i)
679669 func stakeAll () = if (!(isActive))
680670 then throw("DApp is inactive at this moment")
681671 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, admStartStop], i.callerPublicKey)))
682672 then throw("Only admin can call this function")
683673 else {
684674 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
685675 then {
686676 let amountA = (balanceA - stakedAmountA)
687677 if ((amountA > 0))
688678 then invoke(this, "stakeUnstake", [true, amountA, strAssetIdA], nil)
689679 else 0
690680 }
691681 else 0
692682 if ((stake1 == stake1))
693683 then {
694684 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
695685 then {
696686 let amountB = (balanceB - stakedAmountB)
697687 if ((amountB > 0))
698688 then invoke(this, "stakeUnstake", [true, amountB, strAssetIdB], nil)
699689 else 0
700690 }
701691 else 0
702692 if ((stake2 == stake2))
703693 then nil
704694 else throw("Strict value is not equal to itself.")
705695 }
706696 else throw("Strict value is not equal to itself.")
707697 }
708698
709699
710700 @Verifier(tx)
711701 func verify () = {
712702 let multiSignedByAdmins = {
713703 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
714704 then 1
715705 else 0
716706 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
717707 then 1
718708 else 0
719709 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
720710 then 1
721711 else 0
722712 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
723713 }
724714 match tx {
725715 case inv: InvokeScriptTransaction =>
726716 let callTakeIntoAccount = if ((inv.dApp == this))
727717 then (inv.function == "takeIntoAccountExtraFunds")
728718 else false
729719 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
730720 then true
731721 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
732722 then true
733723 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
734724 then true
735725 else sigVerify(tx.bodyBytes, tx.proofs[0], admStaking)
736726 if (if (callTakeIntoAccount)
737727 then signedByAdmin
738728 else false)
739729 then true
740730 else multiSignedByAdmins
741731 case _ =>
742732 multiSignedByAdmins
743733 }
744734 }
745735

github/deemru/w8io/026f985 
101.75 ms