tx · 7LR9Pr52xmmaZu6o3EnnbbGb2z7jQ4krESZFp9Dpyx8J 3P5Bfd58PPfNvBM2Hy8QfbcDqMeNtzg7KfP: -0.02200000 Waves 2023.09.02 15:31 [3803431] smart account 3P5Bfd58PPfNvBM2Hy8QfbcDqMeNtzg7KfP > SELF 0.00000000 Waves
{ "type": 13, "id": "7LR9Pr52xmmaZu6o3EnnbbGb2z7jQ4krESZFp9Dpyx8J", "fee": 2200000, "feeAssetId": null, "timestamp": 1693662190390, "version": 2, "chainId": 87, "sender": "3P5Bfd58PPfNvBM2Hy8QfbcDqMeNtzg7KfP", "senderPublicKey": "GqXuX2WHNr3WUqTaeH2YCySFY45NAJoE9RmY9bEWkzh", "proofs": [ "aMNF2h4u8tMSXHRQrWJvnJpnkmoQ7SVLpC7iuRu3JgF92QANfcvAUaLGL5mMG7j4zfkKVQv68ftiMNLKha7ifST", "2KtZR82RQcvm5MkNpsM2oZnFUQuS1Rvc2Brcv8BxX7oa71yHc2ZzrvCBNB6vrDRHqvatQt7Msf7im8KK4Zffukhs", "", "5N7QoQYeeVUouXN8jvBoiV5ckFiX3VkTs5rXXEhCVq6Jd8L2eFVDuiFZY7PvjebFHosQKVRU7DPMrLTYGTZfHL9p" ], "script": "base64:BgIvCAISEQoPCAgICAgICAgICAgICAgIEgMKAQgSDAoKAQIBAgECAQIBAhIFCgMBAQg/AAtyZXZpc2lvbk51bQIAAANTRVACAl9fAQhhc1N0cmluZwEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAFAXMJAAIBAhhmYWlsIHRvIGNhc3QgaW50byBTdHJpbmcBBWFzSW50AQF2BAckbWF0Y2gwBQF2AwkAAQIFByRtYXRjaDACA0ludAQBaQUHJG1hdGNoMAUBaQkAAgECFWZhaWwgdG8gY2FzdCBpbnRvIEludAAZSWR4Q29udHJvbENmZ05ldXRyaW5vRGFwcAABABhJZHhDb250cm9sQ2ZnQXVjdGlvbkRhcHAAAgAUSWR4Q29udHJvbENmZ1JwZERhcHAAAwAVSWR4Q29udHJvbENmZ01hdGhEYXBwAAQAHElkeENvbnRyb2xDZmdMaXF1aWRhdGlvbkRhcHAABQAVSWR4Q29udHJvbENmZ1Jlc3REYXBwAAYAHUlkeENvbnRyb2xDZmdOb2RlUmVnaXN0cnlEYXBwAAcAHElkeENvbnRyb2xDZmdOc2J0U3Rha2luZ0RhcHAACAAZSWR4Q29udHJvbENmZ01lZGlhdG9yRGFwcAAJABxJZHhDb250cm9sQ2ZnU3VyZlN0YWtpbmdEYXBwAAoAIElkeENvbnRyb2xDZmdHbnNidENvbnRyb2xsZXJEYXBwAAsAF0lkeENvbnRyb2xDZmdSZXN0VjJEYXBwAAwAG0lkeENvbnRyb2xDZmdHb3Zlcm5hbmNlRGFwcAANABxJZHhDb250cm9sQ2ZnUGVnUHJvdmlkZXJEYXBwAA4BEGtleUNvbnRyb2xDb25maWcAAhElc19fY29udHJvbENvbmZpZwEPa2V5UHJpY2VCeUFzc2V0AQphc3NldElkU3RyCQC5CQIJAMwIAgIcJXMlcyVzX19jb21tb25fX3ByaWNlQnlBc3NldAkAzAgCBQphc3NldElkU3RyBQNuaWwFA1NFUAEVa2V5QmxhY2tTd2FuVGhyZXNob2xkAAInJXMlc19fY29udHJvbENvbmZpZ19fYmxhY2tTd2FuVGhyZXNob2xkAQ5kYXRhQ29udHJvbENmZw8QbmV1dHJpbm9Db250cmFjdA9hdWN0aW9uQ29udHJhY3QLcnBkQ29udHJhY3QMbWF0aENvbnRyYWN0E2xpcXVpZGF0aW9uQ29udHJhY3QMcmVzdENvbnRyYWN0FG5vZGVSZWdpc3RyeUNvbnRyYWN0E25zYnRTdGFraW5nQ29udHJhY3QQbWVkaWF0b3JDb250cmFjdBNzdXJmU3Rha2luZ0NvbnRyYWN0F2duc2J0Q29udHJvbGxlckNvbnRyYWN0DnJlc3RWMkNvbnRyYWN0EmdvdmVybmFuY2VDb250cmFjdAxkb3JhQ29udHJhY3QTcG9vbHNGYWNhZGVDb250cmFjdAkAugkCCQDMCAICHiVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcwkAzAgCBRBuZXV0cmlub0NvbnRyYWN0CQDMCAIFD2F1Y3Rpb25Db250cmFjdAkAzAgCBQtycGRDb250cmFjdAkAzAgCBQxtYXRoQ29udHJhY3QJAMwIAgUTbGlxdWlkYXRpb25Db250cmFjdAkAzAgCBQxyZXN0Q29udHJhY3QJAMwIAgUUbm9kZVJlZ2lzdHJ5Q29udHJhY3QJAMwIAgUTbnNidFN0YWtpbmdDb250cmFjdAkAzAgCBRBtZWRpYXRvckNvbnRyYWN0CQDMCAIFE3N1cmZTdGFraW5nQ29udHJhY3QJAMwIAgUXZ25zYnRDb250cm9sbGVyQ29udHJhY3QJAMwIAgUOcmVzdFYyQ29udHJhY3QJAMwIAgUSZ292ZXJuYW5jZUNvbnRyYWN0CQDMCAIFDGRvcmFDb250cmFjdAkAzAgCBRNwb29sc0ZhY2FkZUNvbnRyYWN0BQNuaWwFA1NFUAEWY29udmVydFdhdmVzVG9OZXV0cmlubwIGYW1vdW50BXByaWNlCQBrAwkAawMFBmFtb3VudAUFcHJpY2UAwIQ9AMCEPQCAwtcvARhnZXROdW1iZXJCeUFkZHJlc3NBbmRLZXkCB2FkZHJlc3MDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFB2FkZHJlc3MFA2tleQAAARhnZXRTdHJpbmdCeUFkZHJlc3NBbmRLZXkCB2FkZHJlc3MDa2V5CQELdmFsdWVPckVsc2UCCQCdCAIFB2FkZHJlc3MFA2tleQIAARZjb252ZXJ0SnNvbkFycmF5VG9MaXN0AQlqc29uQXJyYXkJALUJAgUJanNvbkFycmF5AgEsAAVwcmljZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzAgVwcmljZQAAAApwcmljZUluZGV4CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMCC3ByaWNlX2luZGV4AAAACWlzQmxvY2tlZAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzAgppc19ibG9ja2VkBwAScGVyY2VudFByaWNlT2Zmc2V0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARVrZXlCbGFja1N3YW5UaHJlc2hvbGQAAAcADXB1YktleU9yYWNsZXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwIHb3JhY2xlcwIAABFwdWJLZXlPcmFjbGVzTGlzdAkBFmNvbnZlcnRKc29uQXJyYXlUb0xpc3QBBQ1wdWJLZXlPcmFjbGVzAA9uZXV0cmlub0FkZHJlc3MJAQdBZGRyZXNzAQEaAVdwBGKmR5vprVZolMvvhYwwgiAomggUlrIAEmxpcXVpZGF0aW9uQWRkcmVzcwkBB0FkZHJlc3MBARoBVxrqScv6Cn7KCH8o1Z+Vjgx7abWpOJEfSAANbmV1dHJpbm9Bc3NldAEgtiYpwwT1zlORpA5LdSQvZIxRsfrfr1QpvUjSHSqyqtEAD2NvbnRyb2xDb250cmFjdAUEdGhpcwEPZ2V0U3RyaW5nT3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFB2FkZHJlc3MFA2tleQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQdhZGRyZXNzCQDMCAICAS4JAMwIAgUDa2V5CQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgABGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIKY29udHJvbENmZwNpZHgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFCmNvbnRyb2xDZmcFA2lkeAkArAICAi1Db250cm9sIGNmZyBkb2Vzbid0IGNvbnRhaW4gYWRkcmVzcyBhdCBpbmRleCAJAKQDAQUDaWR4AApjb250cm9sQ2ZnCQC8CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQR0aGlzCQEQa2V5Q29udHJvbENvbmZpZwAFA1NFUAASZ292ZXJuYW5jZUNvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUKY29udHJvbENmZwUbSWR4Q29udHJvbENmZ0dvdmVybmFuY2VEYXBwABVuZXV0cmlub0xvY2tlZEJhbGFuY2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPbmV1dHJpbm9BZGRyZXNzAhViYWxhbmNlX2xvY2tfbmV1dHJpbm8AAAASd2F2ZXNMb2NrZWRCYWxhbmNlCQELdmFsdWVPckVsc2UCCQCaCAIFD25ldXRyaW5vQWRkcmVzcwISYmFsYW5jZV9sb2NrX3dhdmVzAAAAB3Jlc2VydmUJAGUCCAkA7wcBBQ9uZXV0cmlub0FkZHJlc3MHcmVndWxhcgUSd2F2ZXNMb2NrZWRCYWxhbmNlAA5uZXV0cmlub1N1cHBseQkAZQIJAGUCCQBkAgUVbmV1dHJpbm9Mb2NrZWRCYWxhbmNlCAkBBXZhbHVlAQkA7AcBBQ1uZXV0cmlub0Fzc2V0CHF1YW50aXR5CQDwBwIFD25ldXRyaW5vQWRkcmVzcwUNbmV1dHJpbm9Bc3NldAkA8AcCBRJsaXF1aWRhdGlvbkFkZHJlc3MFDW5ldXRyaW5vQXNzZXQAB2RlZmljaXQJAGUCBQ5uZXV0cmlub1N1cHBseQkBFmNvbnZlcnRXYXZlc1RvTmV1dHJpbm8CBQdyZXNlcnZlBQVwcmljZQAOZG9yYUFkZHJlc3NTdHICIzNQS2tvaktkZDZCQnpUZjFSWGJRVmZVRHJhTkZYWEhLelFGAAtkb3JhQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQUOZG9yYUFkZHJlc3NTdHIADXh0blVzZFByaWNlWDYJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQtkb3JhQWRkcmVzcwIWJXMlc19fcHJpY2VfX1VTRE4tVVNEVAIkRE9SQSBkb2Vzbid0IGNvbnRhaW4gVVNETi9VU0RUIHByaWNlABF3eF9yZXN0QWRkcmVzc1N0cgIjM1A4TW9QbnNhdXJvZmsxVnloc2RBRmtlUTZpanBKWVhDcFcAC3d4X3Jlc3REYXBwCQERQGV4dHJOYXRpdmUoMTA2MikBBRF3eF9yZXN0QWRkcmVzc1N0cgAMc3dvcFJlc3REYXBwCQERQGV4dHJOYXRpdmUoMTA2MikBAiMzUDU2ak5RekVDWG5yV3BuYmJTSkt3N0Vvb282ZmtVYU1QcAAFeHRuSWQFDW5ldXRyaW5vQXNzZXQACHh0bklkU3RyCQDYBAEFBXh0bklkAAd3eElkU3RyAixBdHF2NTlFWXpqRkd1aXRLVm5NUms2SDhGdWtqb1Yza3RQb3JiRXlzMjVvbgAEd3hJZAkA2QQBBQd3eElkU3RyAAp2aXJlc0lkU3RyAixEU2JiaExzU1RlRGc1THNpdWZrMkFuZWgzRGpWcUp1UHIyTTl1VTFnd3k1cAAHdmlyZXNJZAkA2QQBBQp2aXJlc0lkU3RyARFmaW5kUHJpY2VzSW5SYW5nZQEGcHJpY2VzBA9taW5QZXJjZW50Qm91bmQAWgQPbWF4UGVyY2VudEJvdW5kAG4EAnAwCQCRAwIFBnByaWNlcwAABAZjaGVjazADCQBnAgAACQCRAwIFBnByaWNlcwAACQDMCAIAAAUDbmlsBANwMDEJAGkCCQBoAgkAkQMCBQZwcmljZXMAAQBkBQJwMAQDcDAyCQBpAgkAaAIJAJEDAgUGcHJpY2VzAAIAZAUCcDAEA3AwMwkAaQIJAGgCCQCRAwIFBnByaWNlcwADAGQFAnAwBANwMDQJAGkCCQBoAgkAkQMCBQZwcmljZXMABABkBQJwMAQGYXJyYXkxAwMJAGYCBQ9tYXhQZXJjZW50Qm91bmQFA3AwMQkAZgIFA3AwMQUPbWluUGVyY2VudEJvdW5kBwkAzAgCAAEJAMwIAgAABQNuaWwJAMwIAgAABQNuaWwEBmFycmF5MgMDCQBmAgUPbWF4UGVyY2VudEJvdW5kBQNwMDIJAGYCBQNwMDIFD21pblBlcmNlbnRCb3VuZAcJAMwIAgACBQZhcnJheTEFBmFycmF5MQQGYXJyYXkzAwMJAGYCBQ9tYXhQZXJjZW50Qm91bmQFA3AwMwkAZgIFA3AwMwUPbWluUGVyY2VudEJvdW5kBwkAzAgCAAMFBmFycmF5MgUGYXJyYXkyAwMJAGYCBQ9tYXhQZXJjZW50Qm91bmQFA3AwNAkAZgIFA3AwNAUPbWluUGVyY2VudEJvdW5kBwkAzAgCAAQFBmFycmF5MwUGYXJyYXkzBAZjaGVjazEDCQBnAgkAkAMBBQZjaGVjazAAAwUGY2hlY2swBAJwMQkAkQMCBQZwcmljZXMAAQMJAGcCAAAFAnAxCQDMCAIAAQUDbmlsBANwMTAJAGkCCQBoAgkAkQMCBQZwcmljZXMAAABkBQJwMQQDcDEyCQBpAgkAaAIJAJEDAgUGcHJpY2VzAAIAZAUCcDEEA3AxMwkAaQIJAGgCCQCRAwIFBnByaWNlcwADAGQFAnAxBANwMTQJAGkCCQBoAgkAkQMCBQZwcmljZXMABABkBQJwMQQGYXJyYXkxAwMJAGYCBQ9tYXhQZXJjZW50Qm91bmQFA3AxMAkAZgIFA3AxMAUPbWluUGVyY2VudEJvdW5kBwkAzAgCAAAJAMwIAgABBQNuaWwJAMwIAgABBQNuaWwEBmFycmF5MgMDCQBmAgUPbWF4UGVyY2VudEJvdW5kBQNwMTIJAGYCBQNwMTIFD21pblBlcmNlbnRCb3VuZAcJAMwIAgACBQZhcnJheTEFBmFycmF5MQQGYXJyYXkzAwMJAGYCBQ9tYXhQZXJjZW50Qm91bmQFA3AxMwkAZgIFA3AxMwUPbWluUGVyY2VudEJvdW5kBwkAzAgCAAMFBmFycmF5MgUGYXJyYXkyAwMJAGYCBQ9tYXhQZXJjZW50Qm91bmQFA3AxNAkAZgIFA3AxNAUPbWluUGVyY2VudEJvdW5kBwkAzAgCAAQFBmFycmF5MwUGYXJyYXkzBAZjaGVjazIDCQBnAgkAkAMBBQZjaGVjazEAAwUGY2hlY2sxBAJwMgkAkQMCBQZwcmljZXMAAgMJAGcCAAAFAnAyCQDMCAIAAgUDbmlsBANwMjAJAGkCCQBoAgkAkQMCBQZwcmljZXMAAABkBQJwMgQDcDIxCQBpAgkAaAIJAJEDAgUGcHJpY2VzAAEAZAUCcDIEA3AyMwkAaQIJAGgCCQCRAwIFBnByaWNlcwADAGQFAnAyBANwMjQJAGkCCQBoAgkAkQMCBQZwcmljZXMABABkBQJwMgQGYXJyYXkxAwMJAGYCBQ9tYXhQZXJjZW50Qm91bmQFA3AyMAkAZgIFA3AyMAUPbWluUGVyY2VudEJvdW5kBwkAzAgCAAAJAMwIAgACBQNuaWwJAMwIAgACBQNuaWwEBmFycmF5MgMDCQBmAgUPbWF4UGVyY2VudEJvdW5kBQNwMjEJAGYCBQNwMjEFD21pblBlcmNlbnRCb3VuZAcJAMwIAgABBQZhcnJheTEFBmFycmF5MQQGYXJyYXkzAwMJAGYCBQ9tYXhQZXJjZW50Qm91bmQFA3AyMwkAZgIFA3AyMwUPbWluUGVyY2VudEJvdW5kBwkAzAgCAAMFBmFycmF5MgUGYXJyYXkyAwMJAGYCBQ9tYXhQZXJjZW50Qm91bmQFA3AyNAkAZgIFA3AyNAUPbWluUGVyY2VudEJvdW5kBwkAzAgCAAQFBmFycmF5MwUGYXJyYXkzBAZjaGVjazMDCQBnAgkAkAMBBQZjaGVjazIAAwUGY2hlY2syBAJwMwkAkQMCBQZwcmljZXMAAwMJAGcCAAAFAnAzCQDMCAIAAwUDbmlsBANwMzAJAGkCCQBoAgkAkQMCBQZwcmljZXMAAABkBQJwMwQDcDMxCQBpAgkAaAIJAJEDAgUGcHJpY2VzAAEAZAUCcDMEA3AzMgkAaQIJAGgCCQCRAwIFBnByaWNlcwACAGQFAnAzBANwMzQJAGkCCQBoAgkAkQMCBQZwcmljZXMABABkBQJwMwQGYXJyYXkxAwMJAGYCBQ9tYXhQZXJjZW50Qm91bmQFA3AzMAkAZgIFA3AzMAUPbWluUGVyY2VudEJvdW5kBwkAzAgCAAAJAMwIAgADBQNuaWwJAMwIAgADBQNuaWwEBmFycmF5MgMDCQBmAgUPbWF4UGVyY2VudEJvdW5kBQNwMzEJAGYCBQNwMzEFD21pblBlcmNlbnRCb3VuZAcJAMwIAgABBQZhcnJheTEFBmFycmF5MQQGYXJyYXkzAwMJAGYCBQ9tYXhQZXJjZW50Qm91bmQFA3AzMgkAZgIFA3AzMgUPbWluUGVyY2VudEJvdW5kBwkAzAgCAAIFBmFycmF5MgUGYXJyYXkyAwMJAGYCBQ9tYXhQZXJjZW50Qm91bmQFA3AzNAkAZgIFA3AzNAUPbWluUGVyY2VudEJvdW5kBwkAzAgCAAQFBmFycmF5MwUGYXJyYXkzAwkAZwIJAJADAQUGY2hlY2szAAMFBmNoZWNrMwQCcDQJAJEDAgUGcHJpY2VzAAQDCQBnAgAABQJwNAkAzAgCAAQFA25pbAQDcDQwCQBpAgkAaAIJAJEDAgUGcHJpY2VzAAAAZAUCcDQEA3A0MQkAaQIJAGgCCQCRAwIFBnByaWNlcwABAGQFAnA0BANwNDIJAGkCCQBoAgkAkQMCBQZwcmljZXMAAgBkBQJwNAQDcDQzCQBpAgkAaAIJAJEDAgUGcHJpY2VzAAMAZAUCcDQEBmFycmF5MQMDCQBmAgUPbWF4UGVyY2VudEJvdW5kBQNwNDAJAGYCBQNwNDAFD21pblBlcmNlbnRCb3VuZAcJAMwIAgAACQDMCAIABAUDbmlsCQDMCAIABAUDbmlsBAZhcnJheTIDAwkAZgIFD21heFBlcmNlbnRCb3VuZAUDcDQxCQBmAgUDcDQxBQ9taW5QZXJjZW50Qm91bmQHCQDMCAIAAQUGYXJyYXkxBQZhcnJheTEEBmFycmF5MwMDCQBmAgUPbWF4UGVyY2VudEJvdW5kBQNwNDIJAGYCBQNwNDIFD21pblBlcmNlbnRCb3VuZAcJAMwIAgACBQZhcnJheTIFBmFycmF5MgMDCQBmAgUPbWF4UGVyY2VudEJvdW5kBQNwNDMJAGYCBQNwNDMFD21pblBlcmNlbnRCb3VuZAcJAMwIAgADBQZhcnJheTMFBmFycmF5MwESZm9ybWF0dGluZ1ByaWNlTXNnAQVwcmljZQkAmwMBCQCsAgIJAKwCAgkArAICCQCsAgICE1dBVkVTTkVVVFJJTk9QUkVGSVgCAV8JAKQDAQUGaGVpZ2h0AgFfCQCkAwEFBXByaWNlAQpQcmljZUVudHJ5AwhuZXdQcmljZQphc3NldElkU3RyDW5ld1ByaWNlSW5kZXgECWhlaWdodFN0cgkApAMBBQZoZWlnaHQEEG5ld1ByaWNlSW5kZXhTdHIJAKQDAQUNbmV3UHJpY2VJbmRleAQQcHJpY2VCeUhlaWdodEtFWQkAuQkCCQDMCAICHyVzJXMlcyVkX19jb21tb25fX3ByaWNlQnlIZWlnaHQJAMwIAgUKYXNzZXRJZFN0cgkAzAgCBQloZWlnaHRTdHIFA25pbAUDU0VQBA9wcmljZUJ5SW5kZXhLRVkJALkJAgkAzAgCAh4lcyVzJXMlZF9fY29tbW9uX19wcmljZUJ5SW5kZXgJAMwIAgUKYXNzZXRJZFN0cgkAzAgCBRBuZXdQcmljZUluZGV4U3RyBQNuaWwFA1NFUAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBD2tleVByaWNlQnlBc3NldAEFCmFzc2V0SWRTdHIFCG5ld1ByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9wcmljZUJ5SW5kZXhLRVkFCG5ld1ByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRBwcmljZUJ5SGVpZ2h0S0VZBQhuZXdQcmljZQUDbmlsARdmaW5hbGl6ZVZpcmVzVXNkT25jaGFpbgEPd2F2ZXNVc2RQcmljZVg2BBB3eF9WaXJlc1dhdmVzX2xwAixFM1loVVJOc0NtalVhWU5pZ0g2QWF5THhiaDl1ODF1VkdVM1p2SEt6blk1dgQMd3hSZXN0UmVzdWx0CQC1CQIJAQhhc1N0cmluZwEJAPwHBAULd3hfcmVzdERhcHACEXBvb2xTdGF0c1JFQURPTkxZCQDMCAIFEHd4X1ZpcmVzV2F2ZXNfbHAFA25pbAUDbmlsAgJfXwQVd3hfVmlyZXNXYXZlc19XQVZFU3g4CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUMd3hSZXN0UmVzdWx0AAIEFXd4X1ZpcmVzV2F2ZXNfVklSRVN4OAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDHd4UmVzdFJlc3VsdAABBB13eF9WaXJlc1dhdmVzX1ZpcmVzVXNkUHJpY2VYNgkAawMFFXd4X1ZpcmVzV2F2ZXNfV0FWRVN4OAUPd2F2ZXNVc2RQcmljZVg2BRV3eF9WaXJlc1dhdmVzX1ZJUkVTeDgEFHd4X1ZpcmVzV2F2ZXNfV2VpZ2h0BRV3eF9WaXJlc1dhdmVzX1ZJUkVTeDgEFnd4X1ZpcmVzWHRuX0FkZHJlc3NTdHICIzNQNUhqUG93Z2lwaVZCM1V2WHBoRGlQdktzNDI0V0M5eFF3BBN3eF9WaXJlc1h0bl9BZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBRZ3eF9WaXJlc1h0bl9BZGRyZXNzU3RyBBF3eF9WaXJlc1h0bl9YVE54NgkA8AcCBRN3eF9WaXJlc1h0bl9BZGRyZXNzBQV4dG5JZAQTd3hfVmlyZXNYdG5fVklSRVN4OAkA8AcCBRN3eF9WaXJlc1h0bl9BZGRyZXNzBQd2aXJlc0lkBBt3eF9WaXJlc1h0bl9WaXJlc1VzZFByaWNlWDYJAGsDCQBoAgURd3hfVmlyZXNYdG5fWFROeDYAZAUNeHRuVXNkUHJpY2VYNgUTd3hfVmlyZXNYdG5fVklSRVN4OAQSd3hfVmlyZXNYdG5fV2VpZ2h0BRN3eF9WaXJlc1h0bl9WSVJFU3g4BBhzd29wX1ZpcmVzWHRuX0FkZHJlc3NTdHICIzNQSjQ4UDNwMnd2V1VqZ1FhUWlaMmNGYnI4cW14TW9rQkdkBBVzd29wX1ZpcmVzWHRuX0FkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFGHN3b3BfVmlyZXNYdG5fQWRkcmVzc1N0cgQdc3dvcF9WaXJlc1h0bl9WaXJlc1h0blByaWNlWDYJAQVhc0ludAEJAPwHBAUMc3dvcFJlc3REYXBwAhFjYWxjR2V0QW1vdW50Q1BNTQkAzAgCBRhzd29wX1ZpcmVzWHRuX0FkZHJlc3NTdHIJAMwIAgIjM1A4OHFrMUt6RjFCS2pEN2ZDN0xqTlZBS000ZXpmZjVXRTYJAMwIAgUKdmlyZXNJZFN0cgkAzAgCAIDC1y8FA25pbAUDbmlsBB1zd29wX1ZpcmVzWHRuX1ZpcmVzVXNkUHJpY2VYNgkAawMFHXN3b3BfVmlyZXNYdG5fVmlyZXNYdG5QcmljZVg2BQ14dG5Vc2RQcmljZVg2AMCEPQQUc3dvcF9WaXJlc1h0bl9XZWlnaHQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFFXN3b3BfVmlyZXNYdG5fQWRkcmVzcwIPQV9hc3NldF9iYWxhbmNlBAFXCQBkAgkAZAIFFHd4X1ZpcmVzV2F2ZXNfV2VpZ2h0BRJ3eF9WaXJlc1h0bl9XZWlnaHQFFHN3b3BfVmlyZXNYdG5fV2VpZ2h0BA92aXJlc1VzZFByaWNlWDYJAGQCCQBkAgkAawMFHXd4X1ZpcmVzV2F2ZXNfVmlyZXNVc2RQcmljZVg2BRR3eF9WaXJlc1dhdmVzX1dlaWdodAUBVwkAawMFG3d4X1ZpcmVzWHRuX1ZpcmVzVXNkUHJpY2VYNgUSd3hfVmlyZXNYdG5fV2VpZ2h0BQFXCQBrAwUdc3dvcF9WaXJlc1h0bl9WaXJlc1VzZFByaWNlWDYFFHN3b3BfVmlyZXNYdG5fV2VpZ2h0BQFXBAVkZWJ1ZwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg54dG5Vc2RQcmljZVg2PQkApAMBBQ14dG5Vc2RQcmljZVg2Ah8gd3hfVmlyZXNXYXZlc19WaXJlc1VzZFByaWNlWDY9CQCkAwEFHXd4X1ZpcmVzV2F2ZXNfVmlyZXNVc2RQcmljZVg2Ah0gd3hfVmlyZXNYdG5fVmlyZXNVc2RQcmljZVg2PQkApAMBBRt3eF9WaXJlc1h0bl9WaXJlc1VzZFByaWNlWDYCHyBzd29wX1ZpcmVzWHRuX1ZpcmVzVXNkUHJpY2VYNj0JAKQDAQUdc3dvcF9WaXJlc1h0bl9WaXJlc1VzZFByaWNlWDYJAJQKAgUPdmlyZXNVc2RQcmljZVg2BQVkZWJ1ZwEUZmluYWxpemVXeFVzZE9uY2hhaW4BD3dhdmVzVXNkUHJpY2VYNgQNd3hfV3hXYXZlc19scAIsQmlTekZlOG5TTDc4b1phZWJmb2luNXZCWjVQemU2ZDdrYWVpakxxcjV4WmUEDHd4UmVzdFJlc3VsdAkAtQkCCQEIYXNTdHJpbmcBCQD8BwQFC3d4X3Jlc3REYXBwAhFwb29sU3RhdHNSRUFET05MWQkAzAgCBQ13eF9XeFdhdmVzX2xwBQNuaWwFA25pbAICX18EEXd4X1d4V2F2ZXNfV2VpZ2h0ANCGAwQSd3hfV3hXYXZlc19XQVZFU3g4CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUMd3hSZXN0UmVzdWx0AAIED3d4X1d4V2F2ZXNfV1h4OAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDHd4UmVzdFJlc3VsdAABBBd3eF9XeFdhdmVzX1d4VXNkUHJpY2VYNgkAawMFEnd4X1d4V2F2ZXNfV0FWRVN4OAUPd2F2ZXNVc2RQcmljZVg2BQ93eF9XeFdhdmVzX1dYeDgEE3d4X1d4WHRuX0FkZHJlc3NTdHICIzNQQ0VOcEVLZThhdHdFTFo3b0NTbWNkRWZjUnVLVHJVeDk5BBB3eF9XeFh0bl9BZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBRN3eF9XeFh0bl9BZGRyZXNzU3RyBA93eF9XeFh0bl9XZWlnaHQA0IYDBA53eF9XeFh0bl9YVE54NgkA8AcCBRB3eF9XeFh0bl9BZGRyZXNzBQV4dG5JZAQNd3hfV3hYdG5fV1h4OAkA8AcCBRB3eF9XeFh0bl9BZGRyZXNzBQR3eElkBBV3eF9XeFh0bl9XeFVzZFByaWNlWDYJAGsDCQBoAgUOd3hfV3hYdG5fWFROeDYAZAUNeHRuVXNkUHJpY2VYNgUNd3hfV3hYdG5fV1h4OAQVc3dvcF9XeFh0bl9BZGRyZXNzU3RyAiMzUEtpNEczVlgyazQyWlNtTk5ybXZnZERIN0p6UmFVaFk3UgQRc3dvcF9XeFh0bl9XZWlnaHQAiCcEF3N3b3BfV3hYdG5fV3hYdG5QcmljZVg2CQEFYXNJbnQBCQD8BwQFDHN3b3BSZXN0RGFwcAIRY2FsY0dldEFtb3VudENQTU0JAMwIAgUVc3dvcF9XeFh0bl9BZGRyZXNzU3RyCQDMCAICIzNQODhxazFLekYxQktqRDdmQzdMak5WQUtNNGV6ZmY1V0U2CQDMCAIFB3d4SWRTdHIJAMwIAgCAwtcvBQNuaWwFA25pbAQXc3dvcF9XeFh0bl9XeFVzZFByaWNlWDYJAGsDBRdzd29wX1d4WHRuX1d4WHRuUHJpY2VYNgUNeHRuVXNkUHJpY2VYNgDAhD0EAVcJAGQCCQBkAgURd3hfV3hXYXZlc19XZWlnaHQFD3d4X1d4WHRuX1dlaWdodAURc3dvcF9XeFh0bl9XZWlnaHQEDHd4VXNkUHJpY2VYNgkAZAIJAGQCCQBrAwUXd3hfV3hXYXZlc19XeFVzZFByaWNlWDYFEXd4X1d4V2F2ZXNfV2VpZ2h0BQFXCQBrAwUVd3hfV3hYdG5fV3hVc2RQcmljZVg2BQ93eF9XeFh0bl9XZWlnaHQFAVcJAGsDBRdzd29wX1d4WHRuX1d4VXNkUHJpY2VYNgURc3dvcF9XeFh0bl9XZWlnaHQFAVcEBWRlYnVnCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICDnh0blVzZFByaWNlWDY9CQCkAwEFDXh0blVzZFByaWNlWDYCGSB3eF9XeFdhdmVzX1d4VXNkUHJpY2VYNj0JAKQDAQUXd3hfV3hXYXZlc19XeFVzZFByaWNlWDYCFyB3eF9XeFh0bl9XeFVzZFByaWNlWDY9CQCkAwEFFXd4X1d4WHRuX1d4VXNkUHJpY2VYNgIZIHN3b3BfV3hYdG5fV3hVc2RQcmljZVg2PQkApAMBBRdzd29wX1d4WHRuX1d4VXNkUHJpY2VYNgkAlAoCBQx3eFVzZFByaWNlWDYFBWRlYnVnAQtjaGVja1ByaWNlcwMNbmV3V2F2ZXNQcmljZQpuZXdXeFByaWNlDW5ld1ZpcmVzUHJpY2UKAQtpc0JsYWNrU3dhbgIFY3VyUHIFbmV3UHIDCQBnAgUFbmV3UHIJAGQCBQVjdXJQcgkAaQIJAGgCBQVjdXJQcgUScGVyY2VudFByaWNlT2Zmc2V0AGQGCQBnAgkAZQIFBWN1clByCQBpAgkAaAIFBWN1clByBRJwZXJjZW50UHJpY2VPZmZzZXQAZAUFbmV3UHIEB3d4UHJpY2UJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBD2tleVByaWNlQnlBc3NldAEFB3d4SWRTdHIAAAQKdmlyZXNQcmljZQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEPa2V5UHJpY2VCeUFzc2V0AQUKdmlyZXNJZFN0cgAAAwkBC2lzQmxhY2tTd2FuAgUFcHJpY2UFDW5ld1dhdmVzUHJpY2UJAJUKAwYCBVdBVkVTBQ1uZXdXYXZlc1ByaWNlAwkBC2lzQmxhY2tTd2FuAgUHd3hQcmljZQUKbmV3V3hQcmljZQkAlQoDBgUHd3hJZFN0cgUKbmV3V3hQcmljZQMJAQtpc0JsYWNrU3dhbgIFCnZpcmVzUHJpY2UFDW5ld1ZpcmVzUHJpY2UJAJUKAwYFCnZpcmVzSWRTdHIFDW5ld1ZpcmVzUHJpY2UJAJUKAwcCAAAABAFpAQ1jb25zdHJ1Y3RvclYxDxBuZXV0cmlub0NvbnRyYWN0D2F1Y3Rpb25Db250cmFjdAtycGRDb250cmFjdAxtYXRoQ29udHJhY3QTbGlxdWlkYXRpb25Db250cmFjdAxyZXN0Q29udHJhY3QUbm9kZVJlZ2lzdHJ5Q29udHJhY3QTbnNidFN0YWtpbmdDb250cmFjdBBtZWRpYXRvckNvbnRyYWN0E3N1cmZTdGFraW5nQ29udHJhY3QXZ25zYnRDb250cm9sbGVyQ29udHJhY3QOcmVzdFYyQ29udHJhY3QSZ292ZXJuYW5jZUNvbnRyYWN0DGRvcmFDb250cmFjdBNwb29sc0ZhY2FkZUNvbnRyYWN0AwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIScGVybWlzc2lvbnMgZGVuaWVkCQDMCAIJAQtTdHJpbmdFbnRyeQIJARBrZXlDb250cm9sQ29uZmlnAAkBDmRhdGFDb250cm9sQ2ZnDwUQbmV1dHJpbm9Db250cmFjdAUPYXVjdGlvbkNvbnRyYWN0BQtycGRDb250cmFjdAUMbWF0aENvbnRyYWN0BRNsaXF1aWRhdGlvbkNvbnRyYWN0BQxyZXN0Q29udHJhY3QFFG5vZGVSZWdpc3RyeUNvbnRyYWN0BRNuc2J0U3Rha2luZ0NvbnRyYWN0BRBtZWRpYXRvckNvbnRyYWN0BRNzdXJmU3Rha2luZ0NvbnRyYWN0BRdnbnNidENvbnRyb2xsZXJDb250cmFjdAUOcmVzdFYyQ29udHJhY3QFEmdvdmVybmFuY2VDb250cmFjdAUMZG9yYUNvbnRyYWN0BRNwb29sc0ZhY2FkZUNvbnRyYWN0BQNuaWwBaQEVY2FsbEVtZXJnZW5jeVNodXRkb3duAQZyZWFzb24EGkF1dG9FbWVyZ2VuY3lPcmFjbGVBZGRyZXNzAiMzUDdpaEZWeEJOYkhLMjM3VE5kUHhUMXhIRXU4cEhleFhUcgQNY2FsbGVyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIDAwkBAiE9AgUaQXV0b0VtZXJnZW5jeU9yYWNsZUFkZHJlc3MFDWNhbGxlckFkZHJlc3MJAQIhPQIJAKUIAQUSZ292ZXJuYW5jZUNvbnRyYWN0BQ1jYWxsZXJBZGRyZXNzBwkAAgECPWNhbGxlciBtdXN0IGJlIG9uZSBhbiBlbWVyZ2VuY3kgb3JhY2xlIG9yIEdvdmVybmFuY2UgY29udHJhY3QJAMwIAgkBDEJvb2xlYW5FbnRyeQICCmlzX2Jsb2NrZWQGCQDMCAIJAQtTdHJpbmdFbnRyeQICEWlzX2Jsb2NrZWRfY2FsbGVyBQ1jYWxsZXJBZGRyZXNzCQDMCAIJAQtTdHJpbmdFbnRyeQICEWlzX2Jsb2NrZWRfcmVhc29uBQZyZWFzb24FA25pbAFpARRmaW5hbGl6ZUN1cnJlbnRQcmljZQoGcHJpY2UxBXNpZ24xBnByaWNlMgVzaWduMgZwcmljZTMFc2lnbjMGcHJpY2U0BXNpZ240BnByaWNlNQVzaWduNQMFCWlzQmxvY2tlZAkAAgECWmNvbnRyYWN0IGlzIGJsb2NrZWQgYnkgRU1FUkdFTkNZIFNIVVRET1dOIGFjdGlvbnMgdW50aWxsIHJlYWN0aXZhdGlvbiBieSBlbWVyZ2VuY3kgb3JhY2xlcwMJAQIhPQIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICAgZwcmljZV8JAKQDAQUGaGVpZ2h0AAAAAAkAAgECD3dhaXQgbmV4dCBibG9jawMJAQIhPQIJAJEDAgURcHViS2V5T3JhY2xlc0xpc3QJAGoCBQZoZWlnaHQABQkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkJAAIBCQCsAgIJAKwCAgkArAICAhpPdXQgb2YgdHVybiBmaW5hbGl6YXRpb246IAkApAMBBQZoZWlnaHQCHSBibG9jayBzaG91bGQgYmUgZmluYWxpemUgYnkgCQCRAwIFEXB1YktleU9yYWNsZXNMaXN0CQBqAgUGaGVpZ2h0AAUEBnByaWNlcwkAzAgCAwkAxBMDCQESZm9ybWF0dGluZ1ByaWNlTXNnAQUGcHJpY2UxBQVzaWduMQkA2QQBCQCRAwIFEXB1YktleU9yYWNsZXNMaXN0AAAFBnByaWNlMQAACQDMCAIDCQDEEwMJARJmb3JtYXR0aW5nUHJpY2VNc2cBBQZwcmljZTIFBXNpZ24yCQDZBAEJAJEDAgURcHViS2V5T3JhY2xlc0xpc3QAAQUGcHJpY2UyAAAJAMwIAgMJAMQTAwkBEmZvcm1hdHRpbmdQcmljZU1zZwEFBnByaWNlMwUFc2lnbjMJANkEAQkAkQMCBRFwdWJLZXlPcmFjbGVzTGlzdAACBQZwcmljZTMAAAkAzAgCAwkAxBMDCQESZm9ybWF0dGluZ1ByaWNlTXNnAQUGcHJpY2U0BQVzaWduNAkA2QQBCQCRAwIFEXB1YktleU9yYWNsZXNMaXN0AAMFBnByaWNlNAAACQDMCAIDCQDEEwMJARJmb3JtYXR0aW5nUHJpY2VNc2cBBQZwcmljZTUFBXNpZ241CQDZBAEJAJEDAgURcHViS2V5T3JhY2xlc0xpc3QABAUGcHJpY2U1AAAFA25pbAQOemVyb1ByaWNlQ291bnQDCQAAAgkAkQMCBQZwcmljZXMAAAAAAAEJAGQCAAADCQAAAgkAkQMCBQZwcmljZXMAAQAAAAEJAGQCAAADCQAAAgkAkQMCBQZwcmljZXMAAgAAAAEJAGQCAAADCQAAAgkAkQMCBQZwcmljZXMAAwAAAAEJAGQCAAADCQAAAgkAkQMCBQZwcmljZXMABAAAAAEAAAMJAGcCBQ56ZXJvUHJpY2VDb3VudAADCQACAQIgMyBwcmljZXMgb3IgbW9yZSBhcmUgZXF1YWxzIHRvIDAEDXByaWNlc0luUmFuZ2UJARFmaW5kUHJpY2VzSW5SYW5nZQEFBnByaWNlcwQTcHJpY2VQcm92aWRpbmdDb3VudAkAkAMBBQ1wcmljZXNJblJhbmdlAwkAZgIAAwUTcHJpY2VQcm92aWRpbmdDb3VudAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICOkNvdWxkIG5vdCBmaW5hbGl6ZSBwcmljZSBiZWNhdXNlIG9mIGJpZyB2YXJpYXRpb246IGhlaWdodD0JAKQDAQUGaGVpZ2h0AgEKCQCRAwIFEXB1YktleU9yYWNsZXNMaXN0AAACAT0JAKQDAQkAkQMCBQZwcmljZXMAAAIBCgkAkQMCBRFwdWJLZXlPcmFjbGVzTGlzdAABAgE9CQCkAwEJAJEDAgUGcHJpY2VzAAECAQoJAJEDAgURcHViS2V5T3JhY2xlc0xpc3QAAgIBPQkApAMBCQCRAwIFBnByaWNlcwACAgEKCQCRAwIFEXB1YktleU9yYWNsZXNMaXN0AAMCAT0JAKQDAQkAkQMCBQZwcmljZXMAAwIBCgkAkQMCBRFwdWJLZXlPcmFjbGVzTGlzdAAEAgE9CQCkAwEJAJEDAgUGcHJpY2VzAAQEBHN1bTEJAGQCCQBkAgkAkQMCBQZwcmljZXMJAJEDAgUNcHJpY2VzSW5SYW5nZQAACQCRAwIFBnByaWNlcwkAkQMCBQ1wcmljZXNJblJhbmdlAAEJAJEDAgUGcHJpY2VzCQCRAwIFDXByaWNlc0luUmFuZ2UAAgQEc3VtMgMJAGcCBRNwcmljZVByb3ZpZGluZ0NvdW50AAQJAGQCBQRzdW0xCQCRAwIFBnByaWNlcwkAkQMCBQ1wcmljZXNJblJhbmdlAAMFBHN1bTEECHByaWNlU3VtAwkAZwIFE3ByaWNlUHJvdmlkaW5nQ291bnQABQkAZAIFBHN1bTIJAJEDAgUGcHJpY2VzCQCRAwIFDXByaWNlc0luUmFuZ2UABAUEc3VtMgMJAGcCBRNwcmljZVByb3ZpZGluZ0NvdW50AAYJAAIBAh5JbnZhbGlkIHByaWNlc0luUmFuZ2UgY3JlYXRpb24ECG5ld1ByaWNlCQBpAgUIcHJpY2VTdW0FE3ByaWNlUHJvdmlkaW5nQ291bnQECnd4VXNkVHVwbGUJARRmaW5hbGl6ZVd4VXNkT25jaGFpbgEFCG5ld1ByaWNlBA1uZXdXeFVzZFByaWNlCAUKd3hVc2RUdXBsZQJfMQQHd3hEZWJ1ZwgFCnd4VXNkVHVwbGUCXzIEDXZpcmVzVXNkVHVwbGUJARdmaW5hbGl6ZVZpcmVzVXNkT25jaGFpbgEFCG5ld1ByaWNlBBBuZXdWaXJlc1VzZFByaWNlCAUNdmlyZXNVc2RUdXBsZQJfMQQKdmlyZXNEZWJ1ZwgFDXZpcmVzVXNkVHVwbGUCXzIEDSR0MDE5NDUwMTk1NTQJAQtjaGVja1ByaWNlcwMFCG5ld1ByaWNlBQ1uZXdXeFVzZFByaWNlBRBuZXdWaXJlc1VzZFByaWNlBAtzaG91bGRCbG9jawgFDSR0MDE5NDUwMTk1NTQCXzEEDWJsb2NraW5nQXNzZXQIBQ0kdDAxOTQ1MDE5NTU0Al8yBA1ibG9ja2luZ1ByaWNlCAUNJHQwMTk0NTAxOTU1NAJfMwMFC3Nob3VsZEJsb2NrBAZyZWFzb24CP2F1dG9tYXRpYyBlbWVyZ2VuY3kgc2h1dGRvd24gYmVjYXVzZSBvZiBsYXJnZSBwcmljZSB2YXJpYWJpbGl0eQkAzAgCCQEMQm9vbGVhbkVudHJ5AgIKaXNfYmxvY2tlZAYJAMwIAgkBC1N0cmluZ0VudHJ5AgIRaXNfYmxvY2tlZF9jYWxsZXIJAKUIAQUEdGhpcwkAzAgCCQELU3RyaW5nRW50cnkCAhFpc19ibG9ja2VkX3JlYXNvbgUGcmVhc29uCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEmJsYWNrX3N3YXJtX3ByaWNlXwkApAMBBQZoZWlnaHQFDWJsb2NraW5nUHJpY2UJAMwIAgkBC1N0cmluZ0VudHJ5AgIQYmxhY2tfc3dhbl90b2tlbgUNYmxvY2tpbmdBc3NldAUDbmlsBA1uZXdQcmljZUluZGV4CQBkAgUKcHJpY2VJbmRleAABCQDNCAIJAM0IAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgIFcHJpY2UFCG5ld1ByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICBnByaWNlXwkApAMBBQZoZWlnaHQFCG5ld1ByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICDHByaWNlX2luZGV4XwkApAMBBQ1uZXdQcmljZUluZGV4BQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQICC3ByaWNlX2luZGV4BQ1uZXdQcmljZUluZGV4CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICDmluZGV4QnlIZWlnaHRfCQCkAwEFBmhlaWdodAUNbmV3UHJpY2VJbmRleAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAg1wcmljZUJ5SW5kZXhfCQCkAwEFDW5ld1ByaWNlSW5kZXgFCG5ld1ByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICCGRlZmljaXRfCQCkAwEFBmhlaWdodAUHZGVmaWNpdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAg9uZXV0cmlub1N1cHBseV8JAKQDAQUGaGVpZ2h0BQ5uZXV0cmlub1N1cHBseQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhBkZWZpY2l0X3BlcmNlbnRfCQCkAwEFBmhlaWdodAMJAQIhPQIFDm5ldXRyaW5vU3VwcGx5AAAJAGkCCQBoAgUHZGVmaWNpdABkBQ5uZXV0cmlub1N1cHBseQAABQNuaWwJAQpQcmljZUVudHJ5AwUIbmV3UHJpY2UCBVdBVkVTBQ1uZXdQcmljZUluZGV4CQEKUHJpY2VFbnRyeQMFDW5ld1d4VXNkUHJpY2UFB3d4SWRTdHIFDW5ld1ByaWNlSW5kZXgJAQpQcmljZUVudHJ5AwUQbmV3VmlyZXNVc2RQcmljZQUKdmlyZXNJZFN0cgUNbmV3UHJpY2VJbmRleAkBC1N0cmluZ0VudHJ5AgIPZGVidWdfd3hVc2RDYWxjBQd3eERlYnVnCQELU3RyaW5nRW50cnkCAhJkZWJ1Z192aXJlc1VzZENhbGMFCnZpcmVzRGVidWcBaQENdmFsaWRhdGVQcmljZQMRYXZlcmFnaW5nUGVyaW9kTXMLdG9sZXJhbmNlWDYKYXNzZXRJZFN0cgkAlAoCBQNuaWwGAQJ0eAEGdmVyaWZ5AAQTcHViS2V5QWRtaW5zTGlzdFN0cgkAuQkCCQDMCAICLEdKZExTYUxpdjVLN3h1ZWphYzhtY1JjSG95bzNkUHJFU3J2a3RHM2E2TUFSCQDMCAICLEVZd1ptVVJkNUtLYVFSQmpzVmE2ZzhEUGlzRm9TNlNvdlJKdEZpTDVnTUhVCQDMCAICLER0bUFmdURkQ3JISzhzcGRBZUFZenE2TXNaZWdlRDlnbnNycHVUUmtDYlZBCQDMCAICLDVXUlhGU2p3Y1RiTmZLY0pzOFpxWG1TU1dZc1NWSlV0TXZNcVpqNWhINE5jBQNuaWwFA1NFUAQQcHViS2V5QWRtaW5zTGlzdAkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD2NvbnRyb2xDb250cmFjdAIMJXNfX211bHRpc2lnBRNwdWJLZXlBZG1pbnNMaXN0U3RyBQNTRVAEBWNvdW50CQBkAgkAZAIJAGQCAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAkA2QQBCQCRAwIFEHB1YktleUFkbWluc0xpc3QAAAABAAADCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABCQDZBAEJAJEDAgUQcHViS2V5QWRtaW5zTGlzdAABAAEAAAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIJANkEAQkAkQMCBRBwdWJLZXlBZG1pbnNMaXN0AAIAAQAAAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAwkA2QQBCQCRAwIFEHB1YktleUFkbWluc0xpc3QAAwACAAAJAGcCBQVjb3VudAADzOzxSA==", "height": 3803431, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6DsWgcVbmrjw7GQUAUbenBdxPEEXhsTR1at5x7B4Hw7o Next: 9oz6cQypNLsm7kn9pfwe21UVdRN4bpPUmsTeitxEAdnJ Diff:
Old | New | Differences | |
---|---|---|---|
58 | 58 | func w () = "%s__controlConfig" | |
59 | 59 | ||
60 | 60 | ||
61 | - | func x (y | |
61 | + | func x (y) = makeString(["%s%s%s__common__priceByAsset", y], b) | |
62 | 62 | ||
63 | 63 | ||
64 | - | func | |
64 | + | func z () = "%s%s__controlConfig__blackSwanThreshold" | |
65 | 65 | ||
66 | 66 | ||
67 | - | func | |
67 | + | func A (B,C,D,E,F,G,H,I,J,K,L,M,N,O,P) = makeString_2C(["%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", B, C, D, E, F, G, H, I, J, K, L, M, N, O, P], b) | |
68 | 68 | ||
69 | 69 | ||
70 | - | func | |
70 | + | func Q (R,S) = fraction(fraction(R, S, 1000000), 1000000, 100000000) | |
71 | 71 | ||
72 | 72 | ||
73 | - | func | |
73 | + | func T (U,V) = valueOrElse(getInteger(addressFromStringValue(U), V), 0) | |
74 | 74 | ||
75 | 75 | ||
76 | - | let P = valueOrElse(getInteger(this, "price"), 0) | |
77 | - | ||
78 | - | let W = valueOrElse(getInteger(this, "price_index"), 0) | |
79 | - | ||
80 | - | let X = valueOrElse(getBoolean(this, "is_blocked"), false) | |
81 | - | ||
82 | - | let Y = 7 | |
83 | - | ||
84 | - | let Z = valueOrElse(getString(this, "oracles"), "") | |
85 | - | ||
86 | - | let aa = U(Z) | |
87 | - | ||
88 | - | let ab = Address(base58'3PC9BfRwJWWiw9AREE2B3eWzCks3CYtg4yo') | |
89 | - | ||
90 | - | let ac = Address(base58'3P4PCxsJqMzQBALo8zANHtBDZRRquobHQp7') | |
91 | - | ||
92 | - | let ad = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p' | |
93 | - | ||
94 | - | let ae = this | |
95 | - | ||
96 | - | func af (R,S) = valueOrErrorMessage(getString(R, S), makeString(["mandatory ", toString(R), ".", S, " is not defined"], "")) | |
76 | + | func W (U,V) = valueOrElse(getString(U, V), "") | |
97 | 77 | ||
98 | 78 | ||
99 | - | func | |
79 | + | func X (Y) = split(Y, ",") | |
100 | 80 | ||
101 | 81 | ||
102 | - | let | |
82 | + | let S = valueOrElse(getInteger(this, "price"), 0) | |
103 | 83 | ||
104 | - | let | |
84 | + | let Z = valueOrElse(getInteger(this, "price_index"), 0) | |
105 | 85 | ||
106 | - | let | |
86 | + | let aa = valueOrElse(getBoolean(this, "is_blocked"), false) | |
107 | 87 | ||
108 | - | let | |
88 | + | let ab = valueOrElse(getInteger(this, z()), 7) | |
109 | 89 | ||
110 | - | let | |
90 | + | let ac = valueOrElse(getString(this, "oracles"), "") | |
111 | 91 | ||
112 | - | let | |
92 | + | let ad = X(ac) | |
113 | 93 | ||
114 | - | let | |
94 | + | let ae = Address(base58'3PC9BfRwJWWiw9AREE2B3eWzCks3CYtg4yo') | |
115 | 95 | ||
116 | - | let | |
96 | + | let af = Address(base58'3P4PCxsJqMzQBALo8zANHtBDZRRquobHQp7') | |
117 | 97 | ||
118 | - | let | |
98 | + | let ag = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p' | |
119 | 99 | ||
120 | - | let | |
100 | + | let ah = this | |
121 | 101 | ||
122 | - | let ar = "3P8MoPnsaurofk1VyhsdAFkeQ6ijpJYXCpW" | |
102 | + | func ai (U,V) = valueOrErrorMessage(getString(U, V), makeString(["mandatory ", toString(U), ".", V, " is not defined"], "")) | |
103 | + | ||
104 | + | ||
105 | + | func aj (ak,al) = valueOrErrorMessage(addressFromString(ak[al]), ("Control cfg doesn't contain address at index " + toString(al))) | |
106 | + | ||
107 | + | ||
108 | + | let ak = split_4C(ai(this, w()), b) | |
109 | + | ||
110 | + | let N = aj(ak, u) | |
111 | + | ||
112 | + | let am = valueOrElse(getInteger(ae, "balance_lock_neutrino"), 0) | |
113 | + | ||
114 | + | let an = valueOrElse(getInteger(ae, "balance_lock_waves"), 0) | |
115 | + | ||
116 | + | let ao = (wavesBalance(ae).regular - an) | |
117 | + | ||
118 | + | let ap = (((am + value(assetInfo(ag)).quantity) - assetBalance(ae, ag)) - assetBalance(af, ag)) | |
119 | + | ||
120 | + | let aq = (ap - Q(ao, S)) | |
121 | + | ||
122 | + | let ar = "3PKkojKdd6BBzTf1RXbQVfUDraNFXXHKzQF" | |
123 | 123 | ||
124 | 124 | let as = addressFromStringValue(ar) | |
125 | 125 | ||
126 | - | let at = | |
126 | + | let at = valueOrErrorMessage(getInteger(as, "%s%s__price__USDN-USDT"), "DORA doesn't contain USDN/USDT price") | |
127 | 127 | ||
128 | - | let au = | |
128 | + | let au = "3P8MoPnsaurofk1VyhsdAFkeQ6ijpJYXCpW" | |
129 | 129 | ||
130 | - | let av = | |
130 | + | let av = addressFromStringValue(au) | |
131 | 131 | ||
132 | - | let aw = " | |
132 | + | let aw = addressFromStringValue("3P56jNQzECXnrWpnbbSJKw7Eooo6fkUaMPp") | |
133 | 133 | ||
134 | - | let ax = | |
134 | + | let ax = ag | |
135 | 135 | ||
136 | - | let ay = | |
136 | + | let ay = toBase58String(ax) | |
137 | 137 | ||
138 | - | let az = | |
138 | + | let az = "Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on" | |
139 | 139 | ||
140 | - | func aA (aB) = { | |
141 | - | let aC = 90 | |
142 | - | let aD = 110 | |
143 | - | let aE = aB[0] | |
144 | - | let aF = if ((0 >= aB[0])) | |
140 | + | let aA = fromBase58String(az) | |
141 | + | ||
142 | + | let aB = "DSbbhLsSTeDg5Lsiufk2Aneh3DjVqJuPr2M9uU1gwy5p" | |
143 | + | ||
144 | + | let aC = fromBase58String(aB) | |
145 | + | ||
146 | + | func aD (aE) = { | |
147 | + | let aF = 90 | |
148 | + | let aG = 110 | |
149 | + | let aH = aE[0] | |
150 | + | let aI = if ((0 >= aE[0])) | |
145 | 151 | then [0] | |
146 | 152 | else { | |
147 | - | let | |
148 | - | let | |
149 | - | let | |
150 | - | let | |
151 | - | let | |
152 | - | then ( | |
153 | + | let aJ = ((aE[1] * 100) / aH) | |
154 | + | let aK = ((aE[2] * 100) / aH) | |
155 | + | let aL = ((aE[3] * 100) / aH) | |
156 | + | let aM = ((aE[4] * 100) / aH) | |
157 | + | let aN = if (if ((aG > aJ)) | |
158 | + | then (aJ > aF) | |
153 | 159 | else false) | |
154 | 160 | then [1, 0] | |
155 | 161 | else [0] | |
156 | - | let | |
157 | - | then ( | |
162 | + | let aO = if (if ((aG > aK)) | |
163 | + | then (aK > aF) | |
158 | 164 | else false) | |
159 | - | then 2 :: | |
160 | - | else | |
161 | - | let | |
162 | - | then ( | |
165 | + | then 2 :: aN | |
166 | + | else aN | |
167 | + | let aP = if (if ((aG > aL)) | |
168 | + | then (aL > aF) | |
163 | 169 | else false) | |
164 | - | then 3 :: | |
165 | - | else | |
166 | - | if (if (( | |
167 | - | then ( | |
170 | + | then 3 :: aO | |
171 | + | else aO | |
172 | + | if (if ((aG > aM)) | |
173 | + | then (aM > aF) | |
168 | 174 | else false) | |
169 | - | then 4 :: | |
170 | - | else | |
175 | + | then 4 :: aP | |
176 | + | else aP | |
171 | 177 | } | |
172 | - | let | |
173 | - | then | |
178 | + | let aQ = if ((size(aI) >= 3)) | |
179 | + | then aI | |
174 | 180 | else { | |
175 | - | let | |
176 | - | if ((0 >= | |
181 | + | let aR = aE[1] | |
182 | + | if ((0 >= aR)) | |
177 | 183 | then [1] | |
178 | 184 | else { | |
179 | - | let | |
180 | - | let | |
181 | - | let | |
182 | - | let | |
183 | - | let | |
184 | - | then ( | |
185 | + | let aS = ((aE[0] * 100) / aR) | |
186 | + | let aT = ((aE[2] * 100) / aR) | |
187 | + | let aU = ((aE[3] * 100) / aR) | |
188 | + | let aV = ((aE[4] * 100) / aR) | |
189 | + | let aN = if (if ((aG > aS)) | |
190 | + | then (aS > aF) | |
185 | 191 | else false) | |
186 | 192 | then [0, 1] | |
187 | 193 | else [1] | |
188 | - | let | |
189 | - | then ( | |
194 | + | let aO = if (if ((aG > aT)) | |
195 | + | then (aT > aF) | |
190 | 196 | else false) | |
191 | - | then 2 :: | |
192 | - | else | |
193 | - | let | |
194 | - | then ( | |
197 | + | then 2 :: aN | |
198 | + | else aN | |
199 | + | let aP = if (if ((aG > aU)) | |
200 | + | then (aU > aF) | |
195 | 201 | else false) | |
196 | - | then 3 :: | |
197 | - | else | |
198 | - | if (if (( | |
199 | - | then ( | |
202 | + | then 3 :: aO | |
203 | + | else aO | |
204 | + | if (if ((aG > aV)) | |
205 | + | then (aV > aF) | |
200 | 206 | else false) | |
201 | - | then 4 :: | |
202 | - | else | |
207 | + | then 4 :: aP | |
208 | + | else aP | |
203 | 209 | } | |
204 | 210 | } | |
205 | - | let | |
206 | - | then | |
211 | + | let aW = if ((size(aQ) >= 3)) | |
212 | + | then aQ | |
207 | 213 | else { | |
208 | - | let | |
209 | - | if ((0 >= | |
214 | + | let aX = aE[2] | |
215 | + | if ((0 >= aX)) | |
210 | 216 | then [2] | |
211 | 217 | else { | |
212 | - | let | |
213 | - | let | |
214 | - | let | |
215 | - | let | |
216 | - | let | |
217 | - | then ( | |
218 | + | let aY = ((aE[0] * 100) / aX) | |
219 | + | let aZ = ((aE[1] * 100) / aX) | |
220 | + | let ba = ((aE[3] * 100) / aX) | |
221 | + | let bb = ((aE[4] * 100) / aX) | |
222 | + | let aN = if (if ((aG > aY)) | |
223 | + | then (aY > aF) | |
218 | 224 | else false) | |
219 | 225 | then [0, 2] | |
220 | 226 | else [2] | |
221 | - | let | |
222 | - | then ( | |
227 | + | let aO = if (if ((aG > aZ)) | |
228 | + | then (aZ > aF) | |
223 | 229 | else false) | |
224 | - | then 1 :: | |
225 | - | else | |
226 | - | let | |
227 | - | then ( | |
230 | + | then 1 :: aN | |
231 | + | else aN | |
232 | + | let aP = if (if ((aG > ba)) | |
233 | + | then (ba > aF) | |
228 | 234 | else false) | |
229 | - | then 3 :: | |
230 | - | else | |
231 | - | if (if (( | |
232 | - | then ( | |
235 | + | then 3 :: aO | |
236 | + | else aO | |
237 | + | if (if ((aG > bb)) | |
238 | + | then (bb > aF) | |
233 | 239 | else false) | |
234 | - | then 4 :: | |
235 | - | else | |
240 | + | then 4 :: aP | |
241 | + | else aP | |
236 | 242 | } | |
237 | 243 | } | |
238 | - | let | |
239 | - | then | |
244 | + | let bc = if ((size(aW) >= 3)) | |
245 | + | then aW | |
240 | 246 | else { | |
241 | - | let | |
242 | - | if ((0 >= | |
247 | + | let bd = aE[3] | |
248 | + | if ((0 >= bd)) | |
243 | 249 | then [3] | |
244 | 250 | else { | |
245 | - | let | |
246 | - | let | |
247 | - | let | |
248 | - | let | |
249 | - | let | |
250 | - | then ( | |
251 | + | let be = ((aE[0] * 100) / bd) | |
252 | + | let bf = ((aE[1] * 100) / bd) | |
253 | + | let bg = ((aE[2] * 100) / bd) | |
254 | + | let bh = ((aE[4] * 100) / bd) | |
255 | + | let aN = if (if ((aG > be)) | |
256 | + | then (be > aF) | |
251 | 257 | else false) | |
252 | 258 | then [0, 3] | |
253 | 259 | else [3] | |
254 | - | let | |
255 | - | then ( | |
260 | + | let aO = if (if ((aG > bf)) | |
261 | + | then (bf > aF) | |
256 | 262 | else false) | |
257 | - | then 1 :: | |
258 | - | else | |
259 | - | let | |
260 | - | then ( | |
263 | + | then 1 :: aN | |
264 | + | else aN | |
265 | + | let aP = if (if ((aG > bg)) | |
266 | + | then (bg > aF) | |
261 | 267 | else false) | |
262 | - | then 2 :: | |
263 | - | else | |
264 | - | if (if (( | |
265 | - | then ( | |
268 | + | then 2 :: aO | |
269 | + | else aO | |
270 | + | if (if ((aG > bh)) | |
271 | + | then (bh > aF) | |
266 | 272 | else false) | |
267 | - | then 4 :: | |
268 | - | else | |
273 | + | then 4 :: aP | |
274 | + | else aP | |
269 | 275 | } | |
270 | 276 | } | |
271 | - | if ((size( | |
272 | - | then | |
277 | + | if ((size(bc) >= 3)) | |
278 | + | then bc | |
273 | 279 | else { | |
274 | - | let | |
275 | - | if ((0 >= | |
280 | + | let bi = aE[4] | |
281 | + | if ((0 >= bi)) | |
276 | 282 | then [4] | |
277 | 283 | else { | |
278 | - | let | |
279 | - | let | |
280 | - | let | |
281 | - | let | |
282 | - | let | |
283 | - | then ( | |
284 | + | let bj = ((aE[0] * 100) / bi) | |
285 | + | let bk = ((aE[1] * 100) / bi) | |
286 | + | let bl = ((aE[2] * 100) / bi) | |
287 | + | let bm = ((aE[3] * 100) / bi) | |
288 | + | let aN = if (if ((aG > bj)) | |
289 | + | then (bj > aF) | |
284 | 290 | else false) | |
285 | 291 | then [0, 4] | |
286 | 292 | else [4] | |
287 | - | let | |
288 | - | then ( | |
293 | + | let aO = if (if ((aG > bk)) | |
294 | + | then (bk > aF) | |
289 | 295 | else false) | |
290 | - | then 1 :: | |
291 | - | else | |
292 | - | let | |
293 | - | then ( | |
296 | + | then 1 :: aN | |
297 | + | else aN | |
298 | + | let aP = if (if ((aG > bl)) | |
299 | + | then (bl > aF) | |
294 | 300 | else false) | |
295 | - | then 2 :: | |
296 | - | else | |
297 | - | if (if (( | |
298 | - | then ( | |
301 | + | then 2 :: aO | |
302 | + | else aO | |
303 | + | if (if ((aG > bm)) | |
304 | + | then (bm > aF) | |
299 | 305 | else false) | |
300 | - | then 3 :: | |
301 | - | else | |
306 | + | then 3 :: aP | |
307 | + | else aP | |
302 | 308 | } | |
303 | 309 | } | |
304 | 310 | } | |
305 | 311 | ||
306 | 312 | ||
307 | - | func | |
313 | + | func bn (S) = toBytes((((("WAVESNEUTRINOPREFIX" + "_") + toString(height)) + "_") + toString(S))) | |
308 | 314 | ||
309 | 315 | ||
310 | - | func bl (bm,bn,bo) = { | |
311 | - | let bp = toString(height) | |
312 | - | let bq = toString(bo) | |
313 | - | let br = makeString(["%s%s%s__common__priceByAsset", bn], b) | |
314 | - | let bs = makeString(["%s%s%s%d__common__priceByHeight", bn, bp], b) | |
315 | - | let bt = makeString(["%s%s%s%d__common__priceByIndex", bn, bq], b) | |
316 | - | [IntegerEntry(br, bm), IntegerEntry(bt, bm), IntegerEntry(bs, bm)] | |
316 | + | func bo (bp,y,bq) = { | |
317 | + | let br = toString(height) | |
318 | + | let bs = toString(bq) | |
319 | + | let bt = makeString(["%s%s%s%d__common__priceByHeight", y, br], b) | |
320 | + | let bu = makeString(["%s%s%s%d__common__priceByIndex", y, bs], b) | |
321 | + | [IntegerEntry(x(y), bp), IntegerEntry(bu, bp), IntegerEntry(bt, bp)] | |
317 | 322 | } | |
318 | 323 | ||
319 | 324 | ||
320 | - | func | |
321 | - | let | |
322 | - | let | |
323 | - | let | |
324 | - | let | |
325 | - | let | |
326 | - | let | |
327 | - | let | |
328 | - | let | |
329 | - | let | |
330 | - | let | |
331 | - | let | |
332 | - | let | |
333 | - | let | |
334 | - | let | |
335 | - | let | |
336 | - | let | |
337 | - | let | |
338 | - | let | |
339 | - | let | |
340 | - | let | |
341 | - | $Tuple2( | |
325 | + | func bv (bw) = { | |
326 | + | let bx = "E3YhURNsCmjUaYNigH6AayLxbh9u81uVGU3ZvHKznY5v" | |
327 | + | let by = split(c(invoke(av, "poolStatsREADONLY", [bx], nil)), "__") | |
328 | + | let bz = parseIntValue(by[2]) | |
329 | + | let bA = parseIntValue(by[1]) | |
330 | + | let bB = fraction(bz, bw, bA) | |
331 | + | let bC = bA | |
332 | + | let bD = "3P5HjPowgipiVB3UvXphDiPvKs424WC9xQw" | |
333 | + | let bE = addressFromStringValue(bD) | |
334 | + | let bF = assetBalance(bE, ax) | |
335 | + | let bG = assetBalance(bE, aC) | |
336 | + | let bH = fraction((bF * 100), at, bG) | |
337 | + | let bI = bG | |
338 | + | let bJ = "3PJ48P3p2wvWUjgQaQiZ2cFbr8qmxMokBGd" | |
339 | + | let bK = addressFromStringValue(bJ) | |
340 | + | let bL = g(invoke(aw, "calcGetAmountCPMM", [bJ, "3P88qk1KzF1BKjD7fC7LjNVAKM4ezff5WE6", aB, 100000000], nil)) | |
341 | + | let bM = fraction(bL, at, 1000000) | |
342 | + | let bN = getIntegerValue(bK, "A_asset_balance") | |
343 | + | let bO = ((bC + bI) + bN) | |
344 | + | let bP = ((fraction(bB, bC, bO) + fraction(bH, bI, bO)) + fraction(bM, bN, bO)) | |
345 | + | let bQ = ((((((("xtnUsdPriceX6=" + toString(at)) + " wx_ViresWaves_ViresUsdPriceX6=") + toString(bB)) + " wx_ViresXtn_ViresUsdPriceX6=") + toString(bH)) + " swop_ViresXtn_ViresUsdPriceX6=") + toString(bM)) | |
346 | + | $Tuple2(bP, bQ) | |
342 | 347 | } | |
343 | 348 | ||
344 | 349 | ||
345 | - | func bQ (bv) = { | |
346 | - | let bR = "BiSzFe8nSL78oZaebfoin5vBZ5Pze6d7kaeijLqr5xZe" | |
347 | - | let bx = split(c(invoke(as, "poolStatsREADONLY", [bR], nil)), "__") | |
348 | - | let bS = 50000 | |
349 | - | let bT = parseIntValue(bx[2]) | |
350 | - | let bU = parseIntValue(bx[1]) | |
351 | - | let bV = fraction(bT, bv, bU) | |
352 | - | let bW = "3PCENpEKe8atwELZ7oCSmcdEfcRuKTrUx99" | |
353 | - | let bX = addressFromStringValue(bW) | |
354 | - | let bY = 50000 | |
355 | - | let bZ = assetBalance(bX, au) | |
356 | - | let ca = assetBalance(bX, ax) | |
357 | - | let cb = fraction((bZ * 100), aq, ca) | |
358 | - | let cc = "3PKi4G3VX2k42ZSmNNrmvgdDH7JzRaUhY7R" | |
359 | - | let cd = 5000 | |
360 | - | let ce = g(invoke(at, "calcGetAmountCPMM", [cc, "3P88qk1KzF1BKjD7fC7LjNVAKM4ezff5WE6", aw, 100000000], nil)) | |
361 | - | let cf = fraction(ce, aq, 1000000) | |
362 | - | let bN = ((bS + bY) + cd) | |
363 | - | let cg = ((fraction(bV, bS, bN) + fraction(cb, bY, bN)) + fraction(cf, cd, bN)) | |
364 | - | let bP = ((((((("xtnUsdPriceX6=" + toString(aq)) + " wx_WxWaves_WxUsdPriceX6=") + toString(bV)) + " wx_WxXtn_WxUsdPriceX6=") + toString(cb)) + " swop_WxXtn_WxUsdPriceX6=") + toString(cf)) | |
365 | - | $Tuple2(cg, bP) | |
350 | + | func bR (bw) = { | |
351 | + | let bS = "BiSzFe8nSL78oZaebfoin5vBZ5Pze6d7kaeijLqr5xZe" | |
352 | + | let by = split(c(invoke(av, "poolStatsREADONLY", [bS], nil)), "__") | |
353 | + | let bT = 50000 | |
354 | + | let bU = parseIntValue(by[2]) | |
355 | + | let bV = parseIntValue(by[1]) | |
356 | + | let bW = fraction(bU, bw, bV) | |
357 | + | let bX = "3PCENpEKe8atwELZ7oCSmcdEfcRuKTrUx99" | |
358 | + | let bY = addressFromStringValue(bX) | |
359 | + | let bZ = 50000 | |
360 | + | let ca = assetBalance(bY, ax) | |
361 | + | let cb = assetBalance(bY, aA) | |
362 | + | let cc = fraction((ca * 100), at, cb) | |
363 | + | let cd = "3PKi4G3VX2k42ZSmNNrmvgdDH7JzRaUhY7R" | |
364 | + | let ce = 5000 | |
365 | + | let cf = g(invoke(aw, "calcGetAmountCPMM", [cd, "3P88qk1KzF1BKjD7fC7LjNVAKM4ezff5WE6", az, 100000000], nil)) | |
366 | + | let cg = fraction(cf, at, 1000000) | |
367 | + | let bO = ((bT + bZ) + ce) | |
368 | + | let ch = ((fraction(bW, bT, bO) + fraction(cc, bZ, bO)) + fraction(cg, ce, bO)) | |
369 | + | let bQ = ((((((("xtnUsdPriceX6=" + toString(at)) + " wx_WxWaves_WxUsdPriceX6=") + toString(bW)) + " wx_WxXtn_WxUsdPriceX6=") + toString(cc)) + " swop_WxXtn_WxUsdPriceX6=") + toString(cg)) | |
370 | + | $Tuple2(ch, bQ) | |
371 | + | } | |
372 | + | ||
373 | + | ||
374 | + | func ci (cj,ck,cl) = { | |
375 | + | func cm (cn,co) = if ((co >= (cn + ((cn * ab) / 100)))) | |
376 | + | then true | |
377 | + | else ((cn - ((cn * ab) / 100)) >= co) | |
378 | + | ||
379 | + | let cp = valueOrElse(getInteger(x(az)), 0) | |
380 | + | let cq = valueOrElse(getInteger(x(aB)), 0) | |
381 | + | if (cm(S, cj)) | |
382 | + | then $Tuple3(true, "WAVES", cj) | |
383 | + | else if (cm(cp, ck)) | |
384 | + | then $Tuple3(true, az, ck) | |
385 | + | else if (cm(cq, cl)) | |
386 | + | then $Tuple3(true, aB, cl) | |
387 | + | else $Tuple3(false, "", 0) | |
366 | 388 | } | |
367 | 389 | ||
368 | 390 | ||
369 | 391 | @Callable(h) | |
370 | - | func constructorV1 ( | |
392 | + | func constructorV1 (B,C,D,E,F,G,H,I,J,K,L,M,N,O,P) = if ((h.caller != this)) | |
371 | 393 | then throw("permissions denied") | |
372 | - | else [StringEntry(w(), | |
394 | + | else [StringEntry(w(), A(B, C, D, E, F, G, H, I, J, K, L, M, N, O, P))] | |
373 | 395 | ||
374 | 396 | ||
375 | 397 | ||
376 | 398 | @Callable(h) | |
377 | - | func callEmergencyShutdown ( | |
378 | - | let | |
379 | - | let | |
380 | - | if (if (( | |
381 | - | then (toString( | |
399 | + | func callEmergencyShutdown (cr) = { | |
400 | + | let cs = "3P7ihFVxBNbHK237TNdPxT1xHEu8pHexXTr" | |
401 | + | let ct = toString(h.caller) | |
402 | + | if (if ((cs != ct)) | |
403 | + | then (toString(N) != ct) | |
382 | 404 | else false) | |
383 | 405 | then throw("caller must be one an emergency oracle or Governance contract") | |
384 | - | else [BooleanEntry("is_blocked", true), StringEntry("is_blocked_caller", | |
406 | + | else [BooleanEntry("is_blocked", true), StringEntry("is_blocked_caller", ct), StringEntry("is_blocked_reason", cr)] | |
385 | 407 | } | |
386 | 408 | ||
387 | 409 | ||
388 | 410 | ||
389 | 411 | @Callable(h) | |
390 | - | func finalizeCurrentPrice ( | |
412 | + | func finalizeCurrentPrice (cu,cv,cw,cx,cy,cz,cA,cB,cC,cD) = if (aa) | |
391 | 413 | then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles") | |
392 | 414 | else if ((valueOrElse(getInteger(this, ("price_" + toString(height))), 0) != 0)) | |
393 | 415 | then throw("wait next block") | |
394 | - | else if (( | |
395 | - | then throw(((("Out of turn finalization: " + toString(height)) + " block should be finalize by ") + | |
416 | + | else if ((ad[(height % 5)] != toBase58String(h.callerPublicKey))) | |
417 | + | then throw(((("Out of turn finalization: " + toString(height)) + " block should be finalize by ") + ad[(height % 5)])) | |
396 | 418 | else { | |
397 | - | let | |
398 | - | then | |
399 | - | else 0, if (sigVerify_8Kb( | |
400 | - | then | |
401 | - | else 0, if (sigVerify_8Kb( | |
402 | - | then | |
403 | - | else 0, if (sigVerify_8Kb( | |
404 | - | then | |
405 | - | else 0, if (sigVerify_8Kb( | |
406 | - | then | |
419 | + | let aE = [if (sigVerify_8Kb(bn(cu), cv, fromBase58String(ad[0]))) | |
420 | + | then cu | |
421 | + | else 0, if (sigVerify_8Kb(bn(cw), cx, fromBase58String(ad[1]))) | |
422 | + | then cw | |
423 | + | else 0, if (sigVerify_8Kb(bn(cy), cz, fromBase58String(ad[2]))) | |
424 | + | then cy | |
425 | + | else 0, if (sigVerify_8Kb(bn(cA), cB, fromBase58String(ad[3]))) | |
426 | + | then cA | |
427 | + | else 0, if (sigVerify_8Kb(bn(cC), cD, fromBase58String(ad[4]))) | |
428 | + | then cC | |
407 | 429 | else 0] | |
408 | - | let | |
430 | + | let cE = if ((aE[0] == 0)) | |
409 | 431 | then 1 | |
410 | - | else (0 + (if (( | |
432 | + | else (0 + (if ((aE[1] == 0)) | |
411 | 433 | then 1 | |
412 | - | else (0 + (if (( | |
434 | + | else (0 + (if ((aE[2] == 0)) | |
413 | 435 | then 1 | |
414 | - | else (0 + (if (( | |
436 | + | else (0 + (if ((aE[3] == 0)) | |
415 | 437 | then 1 | |
416 | - | else (0 + (if (( | |
438 | + | else (0 + (if ((aE[4] == 0)) | |
417 | 439 | then 1 | |
418 | 440 | else 0)))))))) | |
419 | - | if (( | |
441 | + | if ((cE >= 3)) | |
420 | 442 | then throw("3 prices or more are equals to 0") | |
421 | 443 | else { | |
422 | - | let | |
423 | - | let | |
424 | - | if ((3 > | |
444 | + | let cF = aD(aE) | |
445 | + | let cG = size(cF) | |
446 | + | if ((3 > cG)) | |
425 | 447 | then throw(((((((((((((((((((((("Could not finalize price because of big variation: height=" + toString(height)) + " | |
426 | - | ") + | |
427 | - | ") + | |
428 | - | ") + | |
429 | - | ") + | |
430 | - | ") + | |
448 | + | ") + ad[0]) + "=") + toString(aE[0])) + " | |
449 | + | ") + ad[1]) + "=") + toString(aE[1])) + " | |
450 | + | ") + ad[2]) + "=") + toString(aE[2])) + " | |
451 | + | ") + ad[3]) + "=") + toString(aE[3])) + " | |
452 | + | ") + ad[4]) + "=") + toString(aE[4]))) | |
431 | 453 | else { | |
432 | - | let | |
433 | - | let | |
434 | - | then ( | |
435 | - | else | |
436 | - | let | |
437 | - | then ( | |
438 | - | else | |
439 | - | if (( | |
454 | + | let cH = ((aE[cF[0]] + aE[cF[1]]) + aE[cF[2]]) | |
455 | + | let cI = if ((cG >= 4)) | |
456 | + | then (cH + aE[cF[3]]) | |
457 | + | else cH | |
458 | + | let cJ = if ((cG >= 5)) | |
459 | + | then (cI + aE[cF[4]]) | |
460 | + | else cI | |
461 | + | if ((cG >= 6)) | |
440 | 462 | then throw("Invalid pricesInRange creation") | |
441 | 463 | else { | |
442 | - | let bm = (cz / cw) | |
443 | - | let cA = bQ(bm) | |
444 | - | let cB = cA._1 | |
445 | - | let cC = cA._2 | |
446 | - | let cD = bu(bm) | |
447 | - | let cE = cD._1 | |
448 | - | let cF = cD._2 | |
449 | - | if (if ((bm >= (P + ((P * Y) / 100)))) | |
450 | - | then true | |
451 | - | else ((P - ((P * Y) / 100)) >= bm)) | |
464 | + | let bp = (cJ / cG) | |
465 | + | let cK = bR(bp) | |
466 | + | let cL = cK._1 | |
467 | + | let cM = cK._2 | |
468 | + | let cN = bv(bp) | |
469 | + | let cO = cN._1 | |
470 | + | let cP = cN._2 | |
471 | + | let cQ = ci(bp, cL, cO) | |
472 | + | let cR = cQ._1 | |
473 | + | let cS = cQ._2 | |
474 | + | let cT = cQ._3 | |
475 | + | if (cR) | |
452 | 476 | then { | |
453 | - | let | |
454 | - | [BooleanEntry("is_blocked", true), StringEntry("is_blocked_caller", toString(this)), StringEntry("is_blocked_reason", | |
477 | + | let cr = "automatic emergency shutdown because of large price variability" | |
478 | + | [BooleanEntry("is_blocked", true), StringEntry("is_blocked_caller", toString(this)), StringEntry("is_blocked_reason", cr), IntegerEntry(("black_swarm_price_" + toString(height)), cT), StringEntry("black_swan_token", cS)] | |
455 | 479 | } | |
456 | 480 | else { | |
457 | - | let | |
458 | - | ((((([IntegerEntry("price", | |
459 | - | then (( | |
460 | - | else 0)] ++ | |
481 | + | let bq = (Z + 1) | |
482 | + | ((((([IntegerEntry("price", bp), IntegerEntry(("price_" + toString(height)), bp), IntegerEntry(("price_index_" + toString(bq)), height), IntegerEntry("price_index", bq), IntegerEntry(("indexByHeight_" + toString(height)), bq), IntegerEntry(("priceByIndex_" + toString(bq)), bp), IntegerEntry(("deficit_" + toString(height)), aq), IntegerEntry(("neutrinoSupply_" + toString(height)), ap), IntegerEntry(("deficit_percent_" + toString(height)), if ((ap != 0)) | |
483 | + | then ((aq * 100) / ap) | |
484 | + | else 0)] ++ bo(bp, "WAVES", bq)) ++ bo(cL, az, bq)) ++ bo(cO, aB, bq)) :+ StringEntry("debug_wxUsdCalc", cM)) :+ StringEntry("debug_viresUsdCalc", cP)) | |
461 | 485 | } | |
462 | 486 | } | |
463 | 487 | } | |
467 | 491 | ||
468 | 492 | ||
469 | 493 | @Callable(h) | |
470 | - | func validatePrice ( | |
494 | + | func validatePrice (cU,cV,y) = $Tuple2(nil, true) | |
471 | 495 | ||
472 | 496 | ||
473 | - | @Verifier( | |
474 | - | func | |
475 | - | let | |
476 | - | let | |
477 | - | let | |
497 | + | @Verifier(cW) | |
498 | + | func cX () = { | |
499 | + | let cY = makeString(["GJdLSaLiv5K7xuejac8mcRcHoyo3dPrESrvktG3a6MAR", "EYwZmURd5KKaQRBjsVa6g8DPisFoS6SovRJtFiL5gMHU", "DtmAfuDdCrHK8spdAeAYzq6MsZegeD9gnsrpuTRkCbVA", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"], b) | |
500 | + | let cZ = split(valueOrElse(getString(ah, "%s__multisig"), cY), b) | |
501 | + | let da = ((((if (sigVerify(cW.bodyBytes, cW.proofs[0], fromBase58String(cZ[0]))) | |
478 | 502 | then 1 | |
479 | - | else 0) + (if (sigVerify( | |
503 | + | else 0) + (if (sigVerify(cW.bodyBytes, cW.proofs[1], fromBase58String(cZ[1]))) | |
480 | 504 | then 1 | |
481 | - | else 0)) + (if (sigVerify( | |
505 | + | else 0)) + (if (sigVerify(cW.bodyBytes, cW.proofs[2], fromBase58String(cZ[2]))) | |
482 | 506 | then 1 | |
483 | - | else 0)) + (if (sigVerify( | |
507 | + | else 0)) + (if (sigVerify(cW.bodyBytes, cW.proofs[3], fromBase58String(cZ[3]))) | |
484 | 508 | then 2 | |
485 | 509 | else 0)) | |
486 | - | ( | |
510 | + | (da >= 3) | |
487 | 511 | } | |
488 | 512 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let a = "" | |
5 | 5 | ||
6 | 6 | let b = "__" | |
7 | 7 | ||
8 | 8 | func c (d) = { | |
9 | 9 | let e = d | |
10 | 10 | if ($isInstanceOf(e, "String")) | |
11 | 11 | then { | |
12 | 12 | let f = e | |
13 | 13 | f | |
14 | 14 | } | |
15 | 15 | else throw("fail to cast into String") | |
16 | 16 | } | |
17 | 17 | ||
18 | 18 | ||
19 | 19 | func g (d) = { | |
20 | 20 | let e = d | |
21 | 21 | if ($isInstanceOf(e, "Int")) | |
22 | 22 | then { | |
23 | 23 | let h = e | |
24 | 24 | h | |
25 | 25 | } | |
26 | 26 | else throw("fail to cast into Int") | |
27 | 27 | } | |
28 | 28 | ||
29 | 29 | ||
30 | 30 | let i = 1 | |
31 | 31 | ||
32 | 32 | let j = 2 | |
33 | 33 | ||
34 | 34 | let k = 3 | |
35 | 35 | ||
36 | 36 | let l = 4 | |
37 | 37 | ||
38 | 38 | let m = 5 | |
39 | 39 | ||
40 | 40 | let n = 6 | |
41 | 41 | ||
42 | 42 | let o = 7 | |
43 | 43 | ||
44 | 44 | let p = 8 | |
45 | 45 | ||
46 | 46 | let q = 9 | |
47 | 47 | ||
48 | 48 | let r = 10 | |
49 | 49 | ||
50 | 50 | let s = 11 | |
51 | 51 | ||
52 | 52 | let t = 12 | |
53 | 53 | ||
54 | 54 | let u = 13 | |
55 | 55 | ||
56 | 56 | let v = 14 | |
57 | 57 | ||
58 | 58 | func w () = "%s__controlConfig" | |
59 | 59 | ||
60 | 60 | ||
61 | - | func x (y | |
61 | + | func x (y) = makeString(["%s%s%s__common__priceByAsset", y], b) | |
62 | 62 | ||
63 | 63 | ||
64 | - | func | |
64 | + | func z () = "%s%s__controlConfig__blackSwanThreshold" | |
65 | 65 | ||
66 | 66 | ||
67 | - | func | |
67 | + | func A (B,C,D,E,F,G,H,I,J,K,L,M,N,O,P) = makeString_2C(["%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", B, C, D, E, F, G, H, I, J, K, L, M, N, O, P], b) | |
68 | 68 | ||
69 | 69 | ||
70 | - | func | |
70 | + | func Q (R,S) = fraction(fraction(R, S, 1000000), 1000000, 100000000) | |
71 | 71 | ||
72 | 72 | ||
73 | - | func | |
73 | + | func T (U,V) = valueOrElse(getInteger(addressFromStringValue(U), V), 0) | |
74 | 74 | ||
75 | 75 | ||
76 | - | let P = valueOrElse(getInteger(this, "price"), 0) | |
77 | - | ||
78 | - | let W = valueOrElse(getInteger(this, "price_index"), 0) | |
79 | - | ||
80 | - | let X = valueOrElse(getBoolean(this, "is_blocked"), false) | |
81 | - | ||
82 | - | let Y = 7 | |
83 | - | ||
84 | - | let Z = valueOrElse(getString(this, "oracles"), "") | |
85 | - | ||
86 | - | let aa = U(Z) | |
87 | - | ||
88 | - | let ab = Address(base58'3PC9BfRwJWWiw9AREE2B3eWzCks3CYtg4yo') | |
89 | - | ||
90 | - | let ac = Address(base58'3P4PCxsJqMzQBALo8zANHtBDZRRquobHQp7') | |
91 | - | ||
92 | - | let ad = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p' | |
93 | - | ||
94 | - | let ae = this | |
95 | - | ||
96 | - | func af (R,S) = valueOrErrorMessage(getString(R, S), makeString(["mandatory ", toString(R), ".", S, " is not defined"], "")) | |
76 | + | func W (U,V) = valueOrElse(getString(U, V), "") | |
97 | 77 | ||
98 | 78 | ||
99 | - | func | |
79 | + | func X (Y) = split(Y, ",") | |
100 | 80 | ||
101 | 81 | ||
102 | - | let | |
82 | + | let S = valueOrElse(getInteger(this, "price"), 0) | |
103 | 83 | ||
104 | - | let | |
84 | + | let Z = valueOrElse(getInteger(this, "price_index"), 0) | |
105 | 85 | ||
106 | - | let | |
86 | + | let aa = valueOrElse(getBoolean(this, "is_blocked"), false) | |
107 | 87 | ||
108 | - | let | |
88 | + | let ab = valueOrElse(getInteger(this, z()), 7) | |
109 | 89 | ||
110 | - | let | |
90 | + | let ac = valueOrElse(getString(this, "oracles"), "") | |
111 | 91 | ||
112 | - | let | |
92 | + | let ad = X(ac) | |
113 | 93 | ||
114 | - | let | |
94 | + | let ae = Address(base58'3PC9BfRwJWWiw9AREE2B3eWzCks3CYtg4yo') | |
115 | 95 | ||
116 | - | let | |
96 | + | let af = Address(base58'3P4PCxsJqMzQBALo8zANHtBDZRRquobHQp7') | |
117 | 97 | ||
118 | - | let | |
98 | + | let ag = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p' | |
119 | 99 | ||
120 | - | let | |
100 | + | let ah = this | |
121 | 101 | ||
122 | - | let ar = "3P8MoPnsaurofk1VyhsdAFkeQ6ijpJYXCpW" | |
102 | + | func ai (U,V) = valueOrErrorMessage(getString(U, V), makeString(["mandatory ", toString(U), ".", V, " is not defined"], "")) | |
103 | + | ||
104 | + | ||
105 | + | func aj (ak,al) = valueOrErrorMessage(addressFromString(ak[al]), ("Control cfg doesn't contain address at index " + toString(al))) | |
106 | + | ||
107 | + | ||
108 | + | let ak = split_4C(ai(this, w()), b) | |
109 | + | ||
110 | + | let N = aj(ak, u) | |
111 | + | ||
112 | + | let am = valueOrElse(getInteger(ae, "balance_lock_neutrino"), 0) | |
113 | + | ||
114 | + | let an = valueOrElse(getInteger(ae, "balance_lock_waves"), 0) | |
115 | + | ||
116 | + | let ao = (wavesBalance(ae).regular - an) | |
117 | + | ||
118 | + | let ap = (((am + value(assetInfo(ag)).quantity) - assetBalance(ae, ag)) - assetBalance(af, ag)) | |
119 | + | ||
120 | + | let aq = (ap - Q(ao, S)) | |
121 | + | ||
122 | + | let ar = "3PKkojKdd6BBzTf1RXbQVfUDraNFXXHKzQF" | |
123 | 123 | ||
124 | 124 | let as = addressFromStringValue(ar) | |
125 | 125 | ||
126 | - | let at = | |
126 | + | let at = valueOrErrorMessage(getInteger(as, "%s%s__price__USDN-USDT"), "DORA doesn't contain USDN/USDT price") | |
127 | 127 | ||
128 | - | let au = | |
128 | + | let au = "3P8MoPnsaurofk1VyhsdAFkeQ6ijpJYXCpW" | |
129 | 129 | ||
130 | - | let av = | |
130 | + | let av = addressFromStringValue(au) | |
131 | 131 | ||
132 | - | let aw = " | |
132 | + | let aw = addressFromStringValue("3P56jNQzECXnrWpnbbSJKw7Eooo6fkUaMPp") | |
133 | 133 | ||
134 | - | let ax = | |
134 | + | let ax = ag | |
135 | 135 | ||
136 | - | let ay = | |
136 | + | let ay = toBase58String(ax) | |
137 | 137 | ||
138 | - | let az = | |
138 | + | let az = "Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on" | |
139 | 139 | ||
140 | - | func aA (aB) = { | |
141 | - | let aC = 90 | |
142 | - | let aD = 110 | |
143 | - | let aE = aB[0] | |
144 | - | let aF = if ((0 >= aB[0])) | |
140 | + | let aA = fromBase58String(az) | |
141 | + | ||
142 | + | let aB = "DSbbhLsSTeDg5Lsiufk2Aneh3DjVqJuPr2M9uU1gwy5p" | |
143 | + | ||
144 | + | let aC = fromBase58String(aB) | |
145 | + | ||
146 | + | func aD (aE) = { | |
147 | + | let aF = 90 | |
148 | + | let aG = 110 | |
149 | + | let aH = aE[0] | |
150 | + | let aI = if ((0 >= aE[0])) | |
145 | 151 | then [0] | |
146 | 152 | else { | |
147 | - | let | |
148 | - | let | |
149 | - | let | |
150 | - | let | |
151 | - | let | |
152 | - | then ( | |
153 | + | let aJ = ((aE[1] * 100) / aH) | |
154 | + | let aK = ((aE[2] * 100) / aH) | |
155 | + | let aL = ((aE[3] * 100) / aH) | |
156 | + | let aM = ((aE[4] * 100) / aH) | |
157 | + | let aN = if (if ((aG > aJ)) | |
158 | + | then (aJ > aF) | |
153 | 159 | else false) | |
154 | 160 | then [1, 0] | |
155 | 161 | else [0] | |
156 | - | let | |
157 | - | then ( | |
162 | + | let aO = if (if ((aG > aK)) | |
163 | + | then (aK > aF) | |
158 | 164 | else false) | |
159 | - | then 2 :: | |
160 | - | else | |
161 | - | let | |
162 | - | then ( | |
165 | + | then 2 :: aN | |
166 | + | else aN | |
167 | + | let aP = if (if ((aG > aL)) | |
168 | + | then (aL > aF) | |
163 | 169 | else false) | |
164 | - | then 3 :: | |
165 | - | else | |
166 | - | if (if (( | |
167 | - | then ( | |
170 | + | then 3 :: aO | |
171 | + | else aO | |
172 | + | if (if ((aG > aM)) | |
173 | + | then (aM > aF) | |
168 | 174 | else false) | |
169 | - | then 4 :: | |
170 | - | else | |
175 | + | then 4 :: aP | |
176 | + | else aP | |
171 | 177 | } | |
172 | - | let | |
173 | - | then | |
178 | + | let aQ = if ((size(aI) >= 3)) | |
179 | + | then aI | |
174 | 180 | else { | |
175 | - | let | |
176 | - | if ((0 >= | |
181 | + | let aR = aE[1] | |
182 | + | if ((0 >= aR)) | |
177 | 183 | then [1] | |
178 | 184 | else { | |
179 | - | let | |
180 | - | let | |
181 | - | let | |
182 | - | let | |
183 | - | let | |
184 | - | then ( | |
185 | + | let aS = ((aE[0] * 100) / aR) | |
186 | + | let aT = ((aE[2] * 100) / aR) | |
187 | + | let aU = ((aE[3] * 100) / aR) | |
188 | + | let aV = ((aE[4] * 100) / aR) | |
189 | + | let aN = if (if ((aG > aS)) | |
190 | + | then (aS > aF) | |
185 | 191 | else false) | |
186 | 192 | then [0, 1] | |
187 | 193 | else [1] | |
188 | - | let | |
189 | - | then ( | |
194 | + | let aO = if (if ((aG > aT)) | |
195 | + | then (aT > aF) | |
190 | 196 | else false) | |
191 | - | then 2 :: | |
192 | - | else | |
193 | - | let | |
194 | - | then ( | |
197 | + | then 2 :: aN | |
198 | + | else aN | |
199 | + | let aP = if (if ((aG > aU)) | |
200 | + | then (aU > aF) | |
195 | 201 | else false) | |
196 | - | then 3 :: | |
197 | - | else | |
198 | - | if (if (( | |
199 | - | then ( | |
202 | + | then 3 :: aO | |
203 | + | else aO | |
204 | + | if (if ((aG > aV)) | |
205 | + | then (aV > aF) | |
200 | 206 | else false) | |
201 | - | then 4 :: | |
202 | - | else | |
207 | + | then 4 :: aP | |
208 | + | else aP | |
203 | 209 | } | |
204 | 210 | } | |
205 | - | let | |
206 | - | then | |
211 | + | let aW = if ((size(aQ) >= 3)) | |
212 | + | then aQ | |
207 | 213 | else { | |
208 | - | let | |
209 | - | if ((0 >= | |
214 | + | let aX = aE[2] | |
215 | + | if ((0 >= aX)) | |
210 | 216 | then [2] | |
211 | 217 | else { | |
212 | - | let | |
213 | - | let | |
214 | - | let | |
215 | - | let | |
216 | - | let | |
217 | - | then ( | |
218 | + | let aY = ((aE[0] * 100) / aX) | |
219 | + | let aZ = ((aE[1] * 100) / aX) | |
220 | + | let ba = ((aE[3] * 100) / aX) | |
221 | + | let bb = ((aE[4] * 100) / aX) | |
222 | + | let aN = if (if ((aG > aY)) | |
223 | + | then (aY > aF) | |
218 | 224 | else false) | |
219 | 225 | then [0, 2] | |
220 | 226 | else [2] | |
221 | - | let | |
222 | - | then ( | |
227 | + | let aO = if (if ((aG > aZ)) | |
228 | + | then (aZ > aF) | |
223 | 229 | else false) | |
224 | - | then 1 :: | |
225 | - | else | |
226 | - | let | |
227 | - | then ( | |
230 | + | then 1 :: aN | |
231 | + | else aN | |
232 | + | let aP = if (if ((aG > ba)) | |
233 | + | then (ba > aF) | |
228 | 234 | else false) | |
229 | - | then 3 :: | |
230 | - | else | |
231 | - | if (if (( | |
232 | - | then ( | |
235 | + | then 3 :: aO | |
236 | + | else aO | |
237 | + | if (if ((aG > bb)) | |
238 | + | then (bb > aF) | |
233 | 239 | else false) | |
234 | - | then 4 :: | |
235 | - | else | |
240 | + | then 4 :: aP | |
241 | + | else aP | |
236 | 242 | } | |
237 | 243 | } | |
238 | - | let | |
239 | - | then | |
244 | + | let bc = if ((size(aW) >= 3)) | |
245 | + | then aW | |
240 | 246 | else { | |
241 | - | let | |
242 | - | if ((0 >= | |
247 | + | let bd = aE[3] | |
248 | + | if ((0 >= bd)) | |
243 | 249 | then [3] | |
244 | 250 | else { | |
245 | - | let | |
246 | - | let | |
247 | - | let | |
248 | - | let | |
249 | - | let | |
250 | - | then ( | |
251 | + | let be = ((aE[0] * 100) / bd) | |
252 | + | let bf = ((aE[1] * 100) / bd) | |
253 | + | let bg = ((aE[2] * 100) / bd) | |
254 | + | let bh = ((aE[4] * 100) / bd) | |
255 | + | let aN = if (if ((aG > be)) | |
256 | + | then (be > aF) | |
251 | 257 | else false) | |
252 | 258 | then [0, 3] | |
253 | 259 | else [3] | |
254 | - | let | |
255 | - | then ( | |
260 | + | let aO = if (if ((aG > bf)) | |
261 | + | then (bf > aF) | |
256 | 262 | else false) | |
257 | - | then 1 :: | |
258 | - | else | |
259 | - | let | |
260 | - | then ( | |
263 | + | then 1 :: aN | |
264 | + | else aN | |
265 | + | let aP = if (if ((aG > bg)) | |
266 | + | then (bg > aF) | |
261 | 267 | else false) | |
262 | - | then 2 :: | |
263 | - | else | |
264 | - | if (if (( | |
265 | - | then ( | |
268 | + | then 2 :: aO | |
269 | + | else aO | |
270 | + | if (if ((aG > bh)) | |
271 | + | then (bh > aF) | |
266 | 272 | else false) | |
267 | - | then 4 :: | |
268 | - | else | |
273 | + | then 4 :: aP | |
274 | + | else aP | |
269 | 275 | } | |
270 | 276 | } | |
271 | - | if ((size( | |
272 | - | then | |
277 | + | if ((size(bc) >= 3)) | |
278 | + | then bc | |
273 | 279 | else { | |
274 | - | let | |
275 | - | if ((0 >= | |
280 | + | let bi = aE[4] | |
281 | + | if ((0 >= bi)) | |
276 | 282 | then [4] | |
277 | 283 | else { | |
278 | - | let | |
279 | - | let | |
280 | - | let | |
281 | - | let | |
282 | - | let | |
283 | - | then ( | |
284 | + | let bj = ((aE[0] * 100) / bi) | |
285 | + | let bk = ((aE[1] * 100) / bi) | |
286 | + | let bl = ((aE[2] * 100) / bi) | |
287 | + | let bm = ((aE[3] * 100) / bi) | |
288 | + | let aN = if (if ((aG > bj)) | |
289 | + | then (bj > aF) | |
284 | 290 | else false) | |
285 | 291 | then [0, 4] | |
286 | 292 | else [4] | |
287 | - | let | |
288 | - | then ( | |
293 | + | let aO = if (if ((aG > bk)) | |
294 | + | then (bk > aF) | |
289 | 295 | else false) | |
290 | - | then 1 :: | |
291 | - | else | |
292 | - | let | |
293 | - | then ( | |
296 | + | then 1 :: aN | |
297 | + | else aN | |
298 | + | let aP = if (if ((aG > bl)) | |
299 | + | then (bl > aF) | |
294 | 300 | else false) | |
295 | - | then 2 :: | |
296 | - | else | |
297 | - | if (if (( | |
298 | - | then ( | |
301 | + | then 2 :: aO | |
302 | + | else aO | |
303 | + | if (if ((aG > bm)) | |
304 | + | then (bm > aF) | |
299 | 305 | else false) | |
300 | - | then 3 :: | |
301 | - | else | |
306 | + | then 3 :: aP | |
307 | + | else aP | |
302 | 308 | } | |
303 | 309 | } | |
304 | 310 | } | |
305 | 311 | ||
306 | 312 | ||
307 | - | func | |
313 | + | func bn (S) = toBytes((((("WAVESNEUTRINOPREFIX" + "_") + toString(height)) + "_") + toString(S))) | |
308 | 314 | ||
309 | 315 | ||
310 | - | func bl (bm,bn,bo) = { | |
311 | - | let bp = toString(height) | |
312 | - | let bq = toString(bo) | |
313 | - | let br = makeString(["%s%s%s__common__priceByAsset", bn], b) | |
314 | - | let bs = makeString(["%s%s%s%d__common__priceByHeight", bn, bp], b) | |
315 | - | let bt = makeString(["%s%s%s%d__common__priceByIndex", bn, bq], b) | |
316 | - | [IntegerEntry(br, bm), IntegerEntry(bt, bm), IntegerEntry(bs, bm)] | |
316 | + | func bo (bp,y,bq) = { | |
317 | + | let br = toString(height) | |
318 | + | let bs = toString(bq) | |
319 | + | let bt = makeString(["%s%s%s%d__common__priceByHeight", y, br], b) | |
320 | + | let bu = makeString(["%s%s%s%d__common__priceByIndex", y, bs], b) | |
321 | + | [IntegerEntry(x(y), bp), IntegerEntry(bu, bp), IntegerEntry(bt, bp)] | |
317 | 322 | } | |
318 | 323 | ||
319 | 324 | ||
320 | - | func | |
321 | - | let | |
322 | - | let | |
323 | - | let | |
324 | - | let | |
325 | - | let | |
326 | - | let | |
327 | - | let | |
328 | - | let | |
329 | - | let | |
330 | - | let | |
331 | - | let | |
332 | - | let | |
333 | - | let | |
334 | - | let | |
335 | - | let | |
336 | - | let | |
337 | - | let | |
338 | - | let | |
339 | - | let | |
340 | - | let | |
341 | - | $Tuple2( | |
325 | + | func bv (bw) = { | |
326 | + | let bx = "E3YhURNsCmjUaYNigH6AayLxbh9u81uVGU3ZvHKznY5v" | |
327 | + | let by = split(c(invoke(av, "poolStatsREADONLY", [bx], nil)), "__") | |
328 | + | let bz = parseIntValue(by[2]) | |
329 | + | let bA = parseIntValue(by[1]) | |
330 | + | let bB = fraction(bz, bw, bA) | |
331 | + | let bC = bA | |
332 | + | let bD = "3P5HjPowgipiVB3UvXphDiPvKs424WC9xQw" | |
333 | + | let bE = addressFromStringValue(bD) | |
334 | + | let bF = assetBalance(bE, ax) | |
335 | + | let bG = assetBalance(bE, aC) | |
336 | + | let bH = fraction((bF * 100), at, bG) | |
337 | + | let bI = bG | |
338 | + | let bJ = "3PJ48P3p2wvWUjgQaQiZ2cFbr8qmxMokBGd" | |
339 | + | let bK = addressFromStringValue(bJ) | |
340 | + | let bL = g(invoke(aw, "calcGetAmountCPMM", [bJ, "3P88qk1KzF1BKjD7fC7LjNVAKM4ezff5WE6", aB, 100000000], nil)) | |
341 | + | let bM = fraction(bL, at, 1000000) | |
342 | + | let bN = getIntegerValue(bK, "A_asset_balance") | |
343 | + | let bO = ((bC + bI) + bN) | |
344 | + | let bP = ((fraction(bB, bC, bO) + fraction(bH, bI, bO)) + fraction(bM, bN, bO)) | |
345 | + | let bQ = ((((((("xtnUsdPriceX6=" + toString(at)) + " wx_ViresWaves_ViresUsdPriceX6=") + toString(bB)) + " wx_ViresXtn_ViresUsdPriceX6=") + toString(bH)) + " swop_ViresXtn_ViresUsdPriceX6=") + toString(bM)) | |
346 | + | $Tuple2(bP, bQ) | |
342 | 347 | } | |
343 | 348 | ||
344 | 349 | ||
345 | - | func bQ (bv) = { | |
346 | - | let bR = "BiSzFe8nSL78oZaebfoin5vBZ5Pze6d7kaeijLqr5xZe" | |
347 | - | let bx = split(c(invoke(as, "poolStatsREADONLY", [bR], nil)), "__") | |
348 | - | let bS = 50000 | |
349 | - | let bT = parseIntValue(bx[2]) | |
350 | - | let bU = parseIntValue(bx[1]) | |
351 | - | let bV = fraction(bT, bv, bU) | |
352 | - | let bW = "3PCENpEKe8atwELZ7oCSmcdEfcRuKTrUx99" | |
353 | - | let bX = addressFromStringValue(bW) | |
354 | - | let bY = 50000 | |
355 | - | let bZ = assetBalance(bX, au) | |
356 | - | let ca = assetBalance(bX, ax) | |
357 | - | let cb = fraction((bZ * 100), aq, ca) | |
358 | - | let cc = "3PKi4G3VX2k42ZSmNNrmvgdDH7JzRaUhY7R" | |
359 | - | let cd = 5000 | |
360 | - | let ce = g(invoke(at, "calcGetAmountCPMM", [cc, "3P88qk1KzF1BKjD7fC7LjNVAKM4ezff5WE6", aw, 100000000], nil)) | |
361 | - | let cf = fraction(ce, aq, 1000000) | |
362 | - | let bN = ((bS + bY) + cd) | |
363 | - | let cg = ((fraction(bV, bS, bN) + fraction(cb, bY, bN)) + fraction(cf, cd, bN)) | |
364 | - | let bP = ((((((("xtnUsdPriceX6=" + toString(aq)) + " wx_WxWaves_WxUsdPriceX6=") + toString(bV)) + " wx_WxXtn_WxUsdPriceX6=") + toString(cb)) + " swop_WxXtn_WxUsdPriceX6=") + toString(cf)) | |
365 | - | $Tuple2(cg, bP) | |
350 | + | func bR (bw) = { | |
351 | + | let bS = "BiSzFe8nSL78oZaebfoin5vBZ5Pze6d7kaeijLqr5xZe" | |
352 | + | let by = split(c(invoke(av, "poolStatsREADONLY", [bS], nil)), "__") | |
353 | + | let bT = 50000 | |
354 | + | let bU = parseIntValue(by[2]) | |
355 | + | let bV = parseIntValue(by[1]) | |
356 | + | let bW = fraction(bU, bw, bV) | |
357 | + | let bX = "3PCENpEKe8atwELZ7oCSmcdEfcRuKTrUx99" | |
358 | + | let bY = addressFromStringValue(bX) | |
359 | + | let bZ = 50000 | |
360 | + | let ca = assetBalance(bY, ax) | |
361 | + | let cb = assetBalance(bY, aA) | |
362 | + | let cc = fraction((ca * 100), at, cb) | |
363 | + | let cd = "3PKi4G3VX2k42ZSmNNrmvgdDH7JzRaUhY7R" | |
364 | + | let ce = 5000 | |
365 | + | let cf = g(invoke(aw, "calcGetAmountCPMM", [cd, "3P88qk1KzF1BKjD7fC7LjNVAKM4ezff5WE6", az, 100000000], nil)) | |
366 | + | let cg = fraction(cf, at, 1000000) | |
367 | + | let bO = ((bT + bZ) + ce) | |
368 | + | let ch = ((fraction(bW, bT, bO) + fraction(cc, bZ, bO)) + fraction(cg, ce, bO)) | |
369 | + | let bQ = ((((((("xtnUsdPriceX6=" + toString(at)) + " wx_WxWaves_WxUsdPriceX6=") + toString(bW)) + " wx_WxXtn_WxUsdPriceX6=") + toString(cc)) + " swop_WxXtn_WxUsdPriceX6=") + toString(cg)) | |
370 | + | $Tuple2(ch, bQ) | |
371 | + | } | |
372 | + | ||
373 | + | ||
374 | + | func ci (cj,ck,cl) = { | |
375 | + | func cm (cn,co) = if ((co >= (cn + ((cn * ab) / 100)))) | |
376 | + | then true | |
377 | + | else ((cn - ((cn * ab) / 100)) >= co) | |
378 | + | ||
379 | + | let cp = valueOrElse(getInteger(x(az)), 0) | |
380 | + | let cq = valueOrElse(getInteger(x(aB)), 0) | |
381 | + | if (cm(S, cj)) | |
382 | + | then $Tuple3(true, "WAVES", cj) | |
383 | + | else if (cm(cp, ck)) | |
384 | + | then $Tuple3(true, az, ck) | |
385 | + | else if (cm(cq, cl)) | |
386 | + | then $Tuple3(true, aB, cl) | |
387 | + | else $Tuple3(false, "", 0) | |
366 | 388 | } | |
367 | 389 | ||
368 | 390 | ||
369 | 391 | @Callable(h) | |
370 | - | func constructorV1 ( | |
392 | + | func constructorV1 (B,C,D,E,F,G,H,I,J,K,L,M,N,O,P) = if ((h.caller != this)) | |
371 | 393 | then throw("permissions denied") | |
372 | - | else [StringEntry(w(), | |
394 | + | else [StringEntry(w(), A(B, C, D, E, F, G, H, I, J, K, L, M, N, O, P))] | |
373 | 395 | ||
374 | 396 | ||
375 | 397 | ||
376 | 398 | @Callable(h) | |
377 | - | func callEmergencyShutdown ( | |
378 | - | let | |
379 | - | let | |
380 | - | if (if (( | |
381 | - | then (toString( | |
399 | + | func callEmergencyShutdown (cr) = { | |
400 | + | let cs = "3P7ihFVxBNbHK237TNdPxT1xHEu8pHexXTr" | |
401 | + | let ct = toString(h.caller) | |
402 | + | if (if ((cs != ct)) | |
403 | + | then (toString(N) != ct) | |
382 | 404 | else false) | |
383 | 405 | then throw("caller must be one an emergency oracle or Governance contract") | |
384 | - | else [BooleanEntry("is_blocked", true), StringEntry("is_blocked_caller", | |
406 | + | else [BooleanEntry("is_blocked", true), StringEntry("is_blocked_caller", ct), StringEntry("is_blocked_reason", cr)] | |
385 | 407 | } | |
386 | 408 | ||
387 | 409 | ||
388 | 410 | ||
389 | 411 | @Callable(h) | |
390 | - | func finalizeCurrentPrice ( | |
412 | + | func finalizeCurrentPrice (cu,cv,cw,cx,cy,cz,cA,cB,cC,cD) = if (aa) | |
391 | 413 | then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles") | |
392 | 414 | else if ((valueOrElse(getInteger(this, ("price_" + toString(height))), 0) != 0)) | |
393 | 415 | then throw("wait next block") | |
394 | - | else if (( | |
395 | - | then throw(((("Out of turn finalization: " + toString(height)) + " block should be finalize by ") + | |
416 | + | else if ((ad[(height % 5)] != toBase58String(h.callerPublicKey))) | |
417 | + | then throw(((("Out of turn finalization: " + toString(height)) + " block should be finalize by ") + ad[(height % 5)])) | |
396 | 418 | else { | |
397 | - | let | |
398 | - | then | |
399 | - | else 0, if (sigVerify_8Kb( | |
400 | - | then | |
401 | - | else 0, if (sigVerify_8Kb( | |
402 | - | then | |
403 | - | else 0, if (sigVerify_8Kb( | |
404 | - | then | |
405 | - | else 0, if (sigVerify_8Kb( | |
406 | - | then | |
419 | + | let aE = [if (sigVerify_8Kb(bn(cu), cv, fromBase58String(ad[0]))) | |
420 | + | then cu | |
421 | + | else 0, if (sigVerify_8Kb(bn(cw), cx, fromBase58String(ad[1]))) | |
422 | + | then cw | |
423 | + | else 0, if (sigVerify_8Kb(bn(cy), cz, fromBase58String(ad[2]))) | |
424 | + | then cy | |
425 | + | else 0, if (sigVerify_8Kb(bn(cA), cB, fromBase58String(ad[3]))) | |
426 | + | then cA | |
427 | + | else 0, if (sigVerify_8Kb(bn(cC), cD, fromBase58String(ad[4]))) | |
428 | + | then cC | |
407 | 429 | else 0] | |
408 | - | let | |
430 | + | let cE = if ((aE[0] == 0)) | |
409 | 431 | then 1 | |
410 | - | else (0 + (if (( | |
432 | + | else (0 + (if ((aE[1] == 0)) | |
411 | 433 | then 1 | |
412 | - | else (0 + (if (( | |
434 | + | else (0 + (if ((aE[2] == 0)) | |
413 | 435 | then 1 | |
414 | - | else (0 + (if (( | |
436 | + | else (0 + (if ((aE[3] == 0)) | |
415 | 437 | then 1 | |
416 | - | else (0 + (if (( | |
438 | + | else (0 + (if ((aE[4] == 0)) | |
417 | 439 | then 1 | |
418 | 440 | else 0)))))))) | |
419 | - | if (( | |
441 | + | if ((cE >= 3)) | |
420 | 442 | then throw("3 prices or more are equals to 0") | |
421 | 443 | else { | |
422 | - | let | |
423 | - | let | |
424 | - | if ((3 > | |
444 | + | let cF = aD(aE) | |
445 | + | let cG = size(cF) | |
446 | + | if ((3 > cG)) | |
425 | 447 | then throw(((((((((((((((((((((("Could not finalize price because of big variation: height=" + toString(height)) + " | |
426 | - | ") + | |
427 | - | ") + | |
428 | - | ") + | |
429 | - | ") + | |
430 | - | ") + | |
448 | + | ") + ad[0]) + "=") + toString(aE[0])) + " | |
449 | + | ") + ad[1]) + "=") + toString(aE[1])) + " | |
450 | + | ") + ad[2]) + "=") + toString(aE[2])) + " | |
451 | + | ") + ad[3]) + "=") + toString(aE[3])) + " | |
452 | + | ") + ad[4]) + "=") + toString(aE[4]))) | |
431 | 453 | else { | |
432 | - | let | |
433 | - | let | |
434 | - | then ( | |
435 | - | else | |
436 | - | let | |
437 | - | then ( | |
438 | - | else | |
439 | - | if (( | |
454 | + | let cH = ((aE[cF[0]] + aE[cF[1]]) + aE[cF[2]]) | |
455 | + | let cI = if ((cG >= 4)) | |
456 | + | then (cH + aE[cF[3]]) | |
457 | + | else cH | |
458 | + | let cJ = if ((cG >= 5)) | |
459 | + | then (cI + aE[cF[4]]) | |
460 | + | else cI | |
461 | + | if ((cG >= 6)) | |
440 | 462 | then throw("Invalid pricesInRange creation") | |
441 | 463 | else { | |
442 | - | let bm = (cz / cw) | |
443 | - | let cA = bQ(bm) | |
444 | - | let cB = cA._1 | |
445 | - | let cC = cA._2 | |
446 | - | let cD = bu(bm) | |
447 | - | let cE = cD._1 | |
448 | - | let cF = cD._2 | |
449 | - | if (if ((bm >= (P + ((P * Y) / 100)))) | |
450 | - | then true | |
451 | - | else ((P - ((P * Y) / 100)) >= bm)) | |
464 | + | let bp = (cJ / cG) | |
465 | + | let cK = bR(bp) | |
466 | + | let cL = cK._1 | |
467 | + | let cM = cK._2 | |
468 | + | let cN = bv(bp) | |
469 | + | let cO = cN._1 | |
470 | + | let cP = cN._2 | |
471 | + | let cQ = ci(bp, cL, cO) | |
472 | + | let cR = cQ._1 | |
473 | + | let cS = cQ._2 | |
474 | + | let cT = cQ._3 | |
475 | + | if (cR) | |
452 | 476 | then { | |
453 | - | let | |
454 | - | [BooleanEntry("is_blocked", true), StringEntry("is_blocked_caller", toString(this)), StringEntry("is_blocked_reason", | |
477 | + | let cr = "automatic emergency shutdown because of large price variability" | |
478 | + | [BooleanEntry("is_blocked", true), StringEntry("is_blocked_caller", toString(this)), StringEntry("is_blocked_reason", cr), IntegerEntry(("black_swarm_price_" + toString(height)), cT), StringEntry("black_swan_token", cS)] | |
455 | 479 | } | |
456 | 480 | else { | |
457 | - | let | |
458 | - | ((((([IntegerEntry("price", | |
459 | - | then (( | |
460 | - | else 0)] ++ | |
481 | + | let bq = (Z + 1) | |
482 | + | ((((([IntegerEntry("price", bp), IntegerEntry(("price_" + toString(height)), bp), IntegerEntry(("price_index_" + toString(bq)), height), IntegerEntry("price_index", bq), IntegerEntry(("indexByHeight_" + toString(height)), bq), IntegerEntry(("priceByIndex_" + toString(bq)), bp), IntegerEntry(("deficit_" + toString(height)), aq), IntegerEntry(("neutrinoSupply_" + toString(height)), ap), IntegerEntry(("deficit_percent_" + toString(height)), if ((ap != 0)) | |
483 | + | then ((aq * 100) / ap) | |
484 | + | else 0)] ++ bo(bp, "WAVES", bq)) ++ bo(cL, az, bq)) ++ bo(cO, aB, bq)) :+ StringEntry("debug_wxUsdCalc", cM)) :+ StringEntry("debug_viresUsdCalc", cP)) | |
461 | 485 | } | |
462 | 486 | } | |
463 | 487 | } | |
464 | 488 | } | |
465 | 489 | } | |
466 | 490 | ||
467 | 491 | ||
468 | 492 | ||
469 | 493 | @Callable(h) | |
470 | - | func validatePrice ( | |
494 | + | func validatePrice (cU,cV,y) = $Tuple2(nil, true) | |
471 | 495 | ||
472 | 496 | ||
473 | - | @Verifier( | |
474 | - | func | |
475 | - | let | |
476 | - | let | |
477 | - | let | |
497 | + | @Verifier(cW) | |
498 | + | func cX () = { | |
499 | + | let cY = makeString(["GJdLSaLiv5K7xuejac8mcRcHoyo3dPrESrvktG3a6MAR", "EYwZmURd5KKaQRBjsVa6g8DPisFoS6SovRJtFiL5gMHU", "DtmAfuDdCrHK8spdAeAYzq6MsZegeD9gnsrpuTRkCbVA", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"], b) | |
500 | + | let cZ = split(valueOrElse(getString(ah, "%s__multisig"), cY), b) | |
501 | + | let da = ((((if (sigVerify(cW.bodyBytes, cW.proofs[0], fromBase58String(cZ[0]))) | |
478 | 502 | then 1 | |
479 | - | else 0) + (if (sigVerify( | |
503 | + | else 0) + (if (sigVerify(cW.bodyBytes, cW.proofs[1], fromBase58String(cZ[1]))) | |
480 | 504 | then 1 | |
481 | - | else 0)) + (if (sigVerify( | |
505 | + | else 0)) + (if (sigVerify(cW.bodyBytes, cW.proofs[2], fromBase58String(cZ[2]))) | |
482 | 506 | then 1 | |
483 | - | else 0)) + (if (sigVerify( | |
507 | + | else 0)) + (if (sigVerify(cW.bodyBytes, cW.proofs[3], fromBase58String(cZ[3]))) | |
484 | 508 | then 2 | |
485 | 509 | else 0)) | |
486 | - | ( | |
510 | + | (da >= 3) | |
487 | 511 | } | |
488 | 512 |
github/deemru/w8io/6500d08 162.82 ms ◑