tx · BaNz1e9wsvwNELjxB2YyhBHgcJvx8X28vXroJjB3JjYX

3PHMz1nGiPAHCFHfPQcW18ovsb5VgCCGzfJ:  -0.02700000 Waves

2024.02.05 15:14 [4028727] smart account 3PHMz1nGiPAHCFHfPQcW18ovsb5VgCCGzfJ > SELF 0.00000000 Waves

{ "type": 13, "id": "BaNz1e9wsvwNELjxB2YyhBHgcJvx8X28vXroJjB3JjYX", "fee": 2700000, "feeAssetId": null, "timestamp": 1707135354592, "version": 2, "chainId": 87, "sender": "3PHMz1nGiPAHCFHfPQcW18ovsb5VgCCGzfJ", "senderPublicKey": "75XcdocCZDdHda5bUegEwkcDk2Tt4i8yZcUzZmwS1ooA", "proofs": [ "52u1rTWMnZbiwsfs799U7z8vrf3irJYT3A2amPYPSFAMHn4vaiut5tAfUF7h3autd6aNdnCcrU7HMQiz58qjvowg" ], "script": "base64:BgInCAISBAoCCAQSAwoBCBIDCgEIEgMKAQgSABIAEgMKAQgSAwoBCBIALwAGU2NhbGU4AIDC1y8ACXNlbnRpbmVscwkAzAgCCQEHQWRkcmVzcwEBGgFX1+EjUY58q4ha1dcol3XYiHXTj64jBabhCQDMCAIJAQdBZGRyZXNzAQEaAVf4+voCJsBRi+xqO0YzSdIccbB1i/mkypoJAMwIAgkBB0FkZHJlc3MBARoBV0kBGPZDfz9MbOFndeW35Jcv3lAtsoPd8QkAzAgCCQEHQWRkcmVzcwEBGgFXS8NszvszWENYQ1EQ7u/uIRAXS/J4y3wyBQNuaWwADWJhY2tlbmRDYWxsZXIJAQdBZGRyZXNzAQEaAVfJHNfeTF8LA4Ccr7yVO4hazH+crESuo2cAD29yZGVyYm9va09yYWNsZQkBB0FkZHJlc3MBARoBV+zlqYlG/aOqpXgS89UamjWD3Wewn8WidgAFeHRuSWQBILYmKcME9c5TkaQOS3UkL2SMUbH6369UKb1I0h0qsqrRAAh4dG5JZFN0cgIsREcyeEZrUGREd0tVb0JrekdBaFF0THBTR3pmWExpQ1lQRXplS0gyQWQyNHAABmV0aFN0cgIsM1Z1VjVXVG1EejQ3RG1kbjNRcGNZanpiU2RpcGpRRTRKTWROZTF4WnBYMTMAB3N0YWJsZXMJAMwIAgIsOXdjM0xYTkE0VEVCc1h5S3RvTEU5bXJiREQ3V01IWHZYckNqWnZhYkxBc2kJAMwIAgIsSEdnYWJUcVVTOFd0VkZVSnpmbXJURE1nRWNjSnVaTEJQaEZnUUZ4dm5zb1cFA25pbAAIdG9rZW5JZHMJAMwIAgIsNm5TcFZ5Tkg3eU02OWVnNDQ2d3JRUjk0aXBiYmNtWk1VMUVOUHdhbkM5N2cJAMwIAgIsRWhpZTV4WXBlTjhvcDFDY3RjNmFHVXJxeDhqcTNqdGYxRFNqWERiZm03YVQJAMwIAgIsNExISHZZR05LSlVnNWhqNjVhR0Q1dmdTY3ZDQm1McGRSRnRqb2t2Q2pTTDgJAMwIAgIsQzFpV3NLR3FMd2pIVW5kaVE3aVhwZG1QdW05UGVDREZmeVhCZEpKb3NEUlMJAMwIAgIsMzROOVljRUVUTFduOTNxWVE2NEVzUDF4ODl0U3J1SlU0NFJyRU1TWFhFUEoJAMwIAgIsNlh0SGpwWGJzOVJSSlAyU3I5R1V5VnF6QUNjYnk5VGtUaEhYbmpWQzVDREoJAMwIAgIsSEVCOFFhdzl4cldwV3M4dEhzaUFUWUdCV0RCdFAyUzdrY1BBTHJNdTQzQVMJAMwIAgIsQWpzbzZuVFRqcHR1MlVITHg2aGZTWFZ0SEZ0UkJKQ2tLWWQ1U0F5ajd6ZjUJAMwIAgIsRFNiYmhMc1NUZURnNUxzaXVmazJBbmVoM0RqVnFKdVByMk05dVUxZ3d5NXAJAMwIAgIsQXRxdjU5RVl6akZHdWl0S1ZuTVJrNkg4RnVram9WM2t0UG9yYkV5czI1b24JAMwIAgIsMnRoc0FDdUhtekRNdU5lelBNMzJ3ZzlhM0J3VXpCV0RlU0tha2d6M2N3MjEJAMwIAgIrWWlOYm9mRnpDMTdqRUhIQ013clJjcHk5TXJyamFiTU1MWnhnOGc1eG1mNwkAzAgCAiw4dDREUFdUd1B6cGF0SEE5QWtUeFdBQjQ3VEhuWXpCc0Rub1k3ZlFxYkc5MQkAzAgCAixBdDhENk5GRnBoZUNidktWbmpWb2VMTDg0RW84TlpuNm92TWFueGZMYUZXTAkAzAgCAiw2cGhLMjJ6dEdCVzEyN2dVRm1kTUVIS0IzQ1ZkNlpoV294Mld0d0prYnFUcQkAzAgCAiwzVnVWNVdUbUR6NDdEbWRuM1FwY1lqemJTZGlwalFFNEpNZE5lMXhacFgxMwkAzAgCAiw5d2MzTFhOQTRURUJzWHlLdG9MRTltcmJERDdXTUhYdlhyQ2padmFiTEFzaQUDbmlsABB0b2tlbklzQmFzZUFzc2V0CQDMCAIHCQDMCAIHCQDMCAIHCQDMCAIHCQDMCAIGCQDMCAIGCQDMCAIHCQDMCAIHCQDMCAIHCQDMCAIHCQDMCAIHCQDMCAIHCQDMCAIHCQDMCAIHCQDMCAIGCQDMCAIHCQDMCAIGCQDMCAIGBQNuaWwADXRva2VuRGVjaW1hbHMJAMwIAgDAhD0JAMwIAgCAwtcvCQDMCAIAgMLXLwkAzAgCAIDC1y8JAMwIAgDAhD0JAMwIAgDAhD0JAMwIAgCAwtcvCQDMCAIAgMLXLwkAzAgCAIDC1y8JAMwIAgCAwtcvCQDMCAIAgMLXLwkAzAgCAIDC1y8JAMwIAgCAwtcvCQDMCAIAwIQ9CQDMCAIAwIQ9CQDMCAIAgMLXLwkAzAgCAMCEPQkAzAgCAMCEPQUDbmlsAA90b2tlbldYV2F2ZXNMUHMJAMwIAgIsRFplQTdSYlZhYjk4cjYxaFZINXpjRlpYd05BTFBKR2dxMWV5SGFuZHNLS1cJAMwIAgIsNzJFNE1NRkhuZ3NpeHFBa05aQ1JKTUxUbWdBUDludWZkc1hleG5TNXF4VngJAMwIAgIsRlRUSm5CNnhHNENLWkVKTWdzZ3FqbWdiemN5SDh5YTN0VjhMUVAyR0NEczcJAMwIAgIsM1VueXRObmtkNDhmSG9mSFBCcDU5QmtwWkExdU1TSjhQZGhXVUN1ZXJpY3MJAMwIAgIsQnlKdFZ1WWk1OEN0ZGp0YXNEdVRxdGdldjhxV2tkSnliRjdyWTF4b3NtaEUJAMwIAgIsQm9YdWY5ZXdKU0UxVU1yS2liWm1pZ3pDNnRCenY4UkZUZVptb2ZFb3MyWkoJAMwIAgIsN0c2ODd1aTNtNTlvQWQ2cWt5bmkydnQ3N2JIRjRiYkE2eGNQZkRvM3VpVHUJAMwIAgIsRU1zWnBxY1Q4TnVNWVpDRVBIenZyaFFDUUtoZlhqZGVla1p2Y1dwSHNOdmgJAMwIAgIsRTNZaFVSTnNDbWpVYVlOaWdINkFheUx4Ymg5dTgxdVZHVTNadkhLem5ZNXYJAMwIAgIsQmlTekZlOG5TTDc4b1phZWJmb2luNXZCWjVQemU2ZDdrYWVpakxxcjV4WmUJAMwIAgIsQUtRc0VRb2VpbktSRnRkeDZyaEtXY3BrQU11NmNiRExkdFNXblI4dHBCQ3EJAMwIAgIsRGpnd1c0Q01KRWZwemo3U0xGRlBpQ3FmMXpmbUFnZjFNRDVnQVM4U2pLdDQJAMwIAgIACQDMCAICLEYzczkyVlJkcHBFdExWQVA2OTdDVE02QXpaSkVDUmNvTXg1a2oyRmtHdjRNCQDMCAICLDZpTUI2TEtTcmd2OXdhRXZFbk42WWR5eDdkZnhQbkdjVHc4MzE4V1ZtNWJSCQDMCAICLEU2TVVHU1VpZVNzcTZRaUpjYnA2UkVkUVh5anA2dVBXTGl0bnA5R2R0c3VoCQDMCAICLDZLV3BucExrNkdOaDVIRzljdDlwTkRDWUZXSkJvQUFzaFpzcDREOGpjRnBWCQDMCAICAAUDbmlsAA90b2tlbldYWFROUG9vbHMJAMwIAgIACQDMCAICAAkAzAgCAgAJAMwIAgIjM1AzWTM4enltQ0hvVE02cWNFOUpjRUE4cmhhR1RRYlZNZ3UJAMwIAgIACQDMCAICAAkAzAgCAiMzUDYxNXlYZVE5UXU0cUJNMVFHaW1Heml4eU1TNVc0S3R1ZwkAzAgCAiMzUEVrRDVMdUhHV2hVZmdCVzFvd1pGeFZ5ZFlvV2pWNkppYQkAzAgCAiMzUDVIalBvd2dpcGlWQjNVdlhwaERpUHZLczQyNFdDOXhRdwkAzAgCAiMzUENFTnBFS2U4YXR3RUxaN29DU21jZEVmY1J1S1RyVXg5OQkAzAgCAgAJAMwIAgIACQDMCAICIzNQSDgzMmVLbnc2N1BGdkpmVWc5S256NkJITTg3UXZqTWVMCQDMCAICAAkAzAgCAiMzUEdjWXpvVWZRRVFraFJnckJxbUc1V3BjN0ExbmNGdlJ0TQkAzAgCAgAJAMwIAgIACQDMCAICAAUDbmlsAA50b2tlblN3b3BQb29scwkAzAgCAiMzUDJWNjNYZDZCdmlEa2VNenhoVXcyU0p5b2pCeVJ6OGE4bQkAzAgCAiMzUDI3UzlWMzZrdzJNY2pXUlozN0F4VHg4aXdrZDdIWHc2VwkAzAgCAiMzUDZETGRKVFAyRXlTcTlNRmRKdTZiZVVldnJRZDJzVlZCaAkAzAgCAgAJAMwIAgIACQDMCAICAAkAzAgCAiMzUEJIeUV3bUVSUjFDRWtyVE5iUGoyYmd5aXNUZlBScWZlZQkAzAgCAiMzUERTWHd3QTJ4QXRteGVvMmJlYkRQM0FBNXluWjJLcmdudwkAzAgCAiMzUEo0OFAzcDJ3dldVamdRYVFpWjJjRmJyOHFteE1va0JHZAkAzAgCAiMzUEtpNEczVlgyazQyWlNtTk5ybXZnZERIN0p6UmFVaFk3UgkAzAgCAgAJAMwIAgIACQDMCAICIzNQQ3d2bnMyZG5tb2JENlo0Y1I4NnY5OHM3TGdNWll5Z0V5CQDMCAICIzNQTHA5S3JkcmJXQXZTRkhHSlZFYXN6VXVicXV6M002bWZlCQDMCAICAAkAzAgCAgAJAMwIAgIACQDMCAICAAUDbmlsAApscFRva2VuSWRzCQDMCAICLDlkYnBTcjhkMThxV1F4bjVmSkpTUzFMTFE4Q21TWjZnWW1qdVBSemczUkJNCQDMCAICLDlNS2l4UnQ5ck5SeWFKQ1QycGV4YlhrdXZwWkJkSlJFZFRVMzZiR2l0OGl3CQDMCAICLDZiWmJSbW91N003d1hCdW5NWFFuWjRSbTY2SHhaRjNLZk1FaUZ3azN3bW5BCQDMCAICK1hqZEpLV3RQWUN6NTg1UUI3TG54RFA3NlVHUnVrYXplZER1YlV4OURIUUgJAMwIAgIsRUE3c2lHTVNUeHo2RXRkcGtDaVZXUUh1cEZUNU43VWJ2UXJXOWt2eENFNDIFA25pbAALbHBUb2tlbkJhc2UJAMwIAgIsQXRxdjU5RVl6akZHdWl0S1ZuTVJrNkg4RnVram9WM2t0UG9yYkV5czI1b24JAMwIAgIFV0FWRVMJAMwIAgIFV0FWRVMJAMwIAgIFV0FWRVMJAMwIAgIsM1Z1VjVXVG1EejQ3RG1kbjNRcGNZanpiU2RpcGpRRTRKTWROZTF4WnBYMTMFA25pbAALbHBUb2tlblBvb2wJAMwIAgkBB0FkZHJlc3MBARoBV76mSii9AJleh5A76ohLq7pjgLF/UUsEDQkAzAgCCQEHQWRkcmVzcwEBGgFXGuxwbi4sl64A1TNuR20jEf9SoAJwPdWrCQDMCAIJAQdBZGRyZXNzAQEaAVd3fwtdLh7A+SLuBE0CCrsD63aXOyCB6yYJAMwIAgkBB0FkZHJlc3MBARoBVw5aceg7GvwyONbfJykDPJw63Iy1Pmy34wkAzAgCCQEHQWRkcmVzcwEBGgFXG9cdIxxZJ2N+N0sZx83U3Oa4c/QIdsyVBQNuaWwAEGxwVG9rZW5CYXNlU2hhcmUJAMwIAgCAh6cOCQDMCAIAgNrECQkAzAgCAIDaxAkJAMwIAgCAmZsQCQDMCAIAgJChDwUDbmlsABJscFRva2VuUmVzZXJ2ZUJhc2UJAMwIAgIACQDMCAICAAkAzAgCAgAJAMwIAgIsM1Z1VjVXVG1EejQ3RG1kbjNRcGNZanpiU2RpcGpRRTRKTWROZTF4WnBYMTMJAMwIAgIABQNuaWwAE2xwVG9rZW5SZXNlcnZlU2hhcmUJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgDAlN4PCQDMCAIAAAUDbmlsAAx3eExwVG9rZW5JZHMJAMwIAgIrclpNUTZnMzFMcjdzUEFhQW9ZYzRVMlBIQ1ZhdVR1S1VTelViSnRVeVBaTgUDbmlsAA53eExwVW5kZXJseWluZwkAzAgCCQDMCAICLDl3YzNMWE5BNFRFQnNYeUt0b0xFOW1yYkREN1dNSFh2WHJDalp2YWJMQXNpCQDMCAICLEhHZ2FiVHFVUzhXdFZGVUp6Zm1yVERNZ0VjY0p1WkxCUGhGZ1FGeHZuc29XBQNuaWwFA25pbAARd3hfcmVzdEFkZHJlc3NTdHICIzNQOE1vUG5zYXVyb2ZrMVZ5aHNkQUZrZVE2aWpwSllYQ3BXAAt3eF9yZXN0RGFwcAkBEUBleHRyTmF0aXZlKDEwNjIpAQURd3hfcmVzdEFkZHJlc3NTdHIADHN3b3BSZXN0RGFwcAkBEUBleHRyTmF0aXZlKDEwNjIpAQIjM1A1NmpOUXpFQ1hucldwbmJiU0pLdzdFb29vNmZrVWFNUHAAD29yYWNsZVRvbGVyYW5jZQDoBwAPc2h1dGRvd25UcmlnZ2VyALgXAAt1cGRhdGVEZWxheQAAAAtyZXZpc2lvbk51bQIAAANTRVACAl9fAQhhc1N0cmluZwEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAFAXMJAAIBAhhmYWlsIHRvIGNhc3QgaW50byBTdHJpbmcBBWFzSW50AQF2BAckbWF0Y2gwBQF2AwkAAQIFByRtYXRjaDACA0ludAQBaQUHJG1hdGNoMAUBaQkAAgECFWZhaWwgdG8gY2FzdCBpbnRvIEludAENdHJ5R2V0SW50ZWdlcgEDa2V5BAckbWF0Y2gwCQCaCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgNJbnQEAWIFByRtYXRjaDAFAWIAAAENZ2V0QXNzZXRCeXRlcwEKYXNzZXRJZFN0cgMJAAACBQphc3NldElkU3RyAgVXQVZFUwUEdW5pdAkA2QQBBQphc3NldElkU3RyAA5kb3JhQWRkcmVzc1N0cgIjM1BLa29qS2RkNkJCelRmMVJYYlFWZlVEcmFORlhYSEt6UUYAC2RvcmFBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQ5kb3JhQWRkcmVzc1N0cgANeHRuVXNkUHJpY2VYNgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFC2RvcmFBZGRyZXNzAhYlcyVzX19wcmljZV9fVVNETi1VU0RUAiRET1JBIGRvZXNuJ3QgY29udGFpbiBVU0ROL1VTRFQgcHJpY2UACndhdmVzUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFC2RvcmFBZGRyZXNzAhclcyVzX19wcmljZV9fV0FWRVMtVVNEVAAMZXRoRG9yYVByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQtkb3JhQWRkcmVzcwIVJXMlc19fcHJpY2VfX0VUSC1VU0RUAQ1nZXRUb2tlblByaWNlAgh0b2tlbk51bQ93YXZlc1VzZFByaWNlWDYECnRva2VuSWRTdHIJAJEDAgUIdG9rZW5JZHMFCHRva2VuTnVtBAd0b2tlbklkCQDZBAEFCnRva2VuSWRTdHIDCQECIT0CCQDPCAIFB3N0YWJsZXMFCnRva2VuSWRTdHIFBHVuaXQJAJQKAgDAhD0CEnN0YWJsZSB0b2tlbiBwcmljZQQNd3hfVDFXYXZlc19scAkAkQMCBQ90b2tlbldYV2F2ZXNMUHMFCHRva2VuTnVtBAskdDA2NDU5NzE3NQMJAAACBQ13eF9UMVdhdmVzX2xwAgAJAJQKAgAAAAAEDHd4UmVzdFJlc3VsdAkAtQkCCQEIYXNTdHJpbmcBCQD8BwQFC3d4X3Jlc3REYXBwAhFwb29sU3RhdHNSRUFET05MWQkAzAgCBQ13eF9UMVdhdmVzX2xwBQNuaWwFA25pbAICX18ECyR0MDY2ODM2Nzc1AwkAkQMCBRB0b2tlbklzQmFzZUFzc2V0BQh0b2tlbk51bQkAlAoCAAEAAgkAlAoCAAIAAQQOd2F2ZXNJblBhaXJOdW0IBQskdDA2NjgzNjc3NQJfMQQOdG9rZW5JblBhaXJOdW0IBQskdDA2NjgzNjc3NQJfMgQSd3hfVDFXYXZlc19XQVZFU3g4CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUMd3hSZXN0UmVzdWx0BQ53YXZlc0luUGFpck51bQQPd3hfVDFXYXZlc19UMXg4CQBrAwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDHd4UmVzdFJlc3VsdAUOdG9rZW5JblBhaXJOdW0AgMLXLwkAkQMCBQ10b2tlbkRlY2ltYWxzBQh0b2tlbk51bQQXd3hfVDFXYXZlc19UMVVzZFByaWNlWDYJAGsDBRJ3eF9UMVdhdmVzX1dBVkVTeDgFD3dhdmVzVXNkUHJpY2VYNgUPd3hfVDFXYXZlc19UMXg4BBF3eF9UMVdhdmVzX1dlaWdodAUPd3hfVDFXYXZlc19UMXg4CQCUCgIFF3d4X1QxV2F2ZXNfVDFVc2RQcmljZVg2BRF3eF9UMVdhdmVzX1dlaWdodAQXd3hfVDFXYXZlc19UMVVzZFByaWNlWDYIBQskdDA2NDU5NzE3NQJfMQQRd3hfVDFXYXZlc19XZWlnaHQIBQskdDA2NDU5NzE3NQJfMgQTd3hfVDFYdG5fQWRkcmVzc1N0cgkAkQMCBQ90b2tlbldYWFROUG9vbHMFCHRva2VuTnVtBAskdDA3MjM3NzY2OAMJAAACBRN3eF9UMVh0bl9BZGRyZXNzU3RyAgAJAJQKAgAAAAAEEHd4X1QxWHRuX0FkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFE3d4X1QxWHRuX0FkZHJlc3NTdHIEDnd4X1QxWHRuX1hUTng2CQDwBwIFEHd4X1QxWHRuX0FkZHJlc3MFBXh0bklkBA13eF9UMVh0bl9UMXg4CQDwBwIFEHd4X1QxWHRuX0FkZHJlc3MFB3Rva2VuSWQJAJQKAgkAawMJAGgCBQ53eF9UMVh0bl9YVE54NgkAaQIJAJEDAgUNdG9rZW5EZWNpbWFscwUIdG9rZW5OdW0AwIQ9BQ14dG5Vc2RQcmljZVg2BQ13eF9UMVh0bl9UMXg4BQ13eF9UMVh0bl9UMXg4BBV3eF9UMVh0bl9UMVVzZFByaWNlWDYIBQskdDA3MjM3NzY2OAJfMQQPd3hfVDFYdG5fV2VpZ2h0CAULJHQwNzIzNzc2NjgCXzIEFXN3b3BfVDFYdG5fQWRkcmVzc1N0cgkAkQMCBQ50b2tlblN3b3BQb29scwUIdG9rZW5OdW0ECyR0MDc3MzE4MzQ5AwkAAAIFFXN3b3BfVDFYdG5fQWRkcmVzc1N0cgIACQCUCgIAAAAABBJzd29wX1QxWHRuX0FkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFFXN3b3BfVDFYdG5fQWRkcmVzc1N0cgQXc3dvcF9UMVh0bl9UMVh0blByaWNlWDYJAQVhc0ludAEJAPwHBAUMc3dvcFJlc3REYXBwAhFjYWxjR2V0QW1vdW50Q1BNTQkAzAgCBRVzd29wX1QxWHRuX0FkZHJlc3NTdHIJAMwIAgIjM1A4OHFrMUt6RjFCS2pEN2ZDN0xqTlZBS000ZXpmZjVXRTYJAMwIAgUKdG9rZW5JZFN0cgkAzAgCCQCRAwIFDXRva2VuRGVjaW1hbHMFCHRva2VuTnVtBQNuaWwFA25pbAQXc3dvcF9UMVh0bl9UMVVzZFByaWNlWDYJAGsDBRdzd29wX1QxWHRuX1QxWHRuUHJpY2VYNgUNeHRuVXNkUHJpY2VYNgDAhD0EEXN3b3BfVDFYdG5fV2VpZ2h0CQERQGV4dHJOYXRpdmUoMTA1MCkCBRJzd29wX1QxWHRuX0FkZHJlc3MCD0FfYXNzZXRfYmFsYW5jZQkAlAoCBRdzd29wX1QxWHRuX1QxVXNkUHJpY2VYNgURc3dvcF9UMVh0bl9XZWlnaHQEF3N3b3BfVDFYdG5fVDFVc2RQcmljZVg2CAULJHQwNzczMTgzNDkCXzEEEXN3b3BfVDFYdG5fV2VpZ2h0CAULJHQwNzczMTgzNDkCXzIEAVcJAGQCCQBkAgURd3hfVDFXYXZlc19XZWlnaHQFD3d4X1QxWHRuX1dlaWdodAURc3dvcF9UMVh0bl9XZWlnaHQEDFQxVXNkUHJpY2VYNgkAZAIJAGQCCQBrAwUXd3hfVDFXYXZlc19UMVVzZFByaWNlWDYFEXd4X1QxV2F2ZXNfV2VpZ2h0BQFXCQBrAwUVd3hfVDFYdG5fVDFVc2RQcmljZVg2BQ93eF9UMVh0bl9XZWlnaHQFAVcJAGsDBRdzd29wX1QxWHRuX1QxVXNkUHJpY2VYNgURc3dvcF9UMVh0bl9XZWlnaHQFAVcEBWRlYnVnCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICDVQxVXNkUHJpY2VYNj0JAKQDAQUMVDFVc2RQcmljZVg2Ahkgd3hfVDFXYXZlc19UMVVzZFByaWNlWDY9CQCkAwEFF3d4X1QxV2F2ZXNfVDFVc2RQcmljZVg2Ahcgd3hfVDFYdG5fVDFVc2RQcmljZVg2PQkApAMBBRV3eF9UMVh0bl9UMVVzZFByaWNlWDYCGSBzd29wX1QxWHRuX1QxVXNkUHJpY2VYNj0JAKQDAQUXc3dvcF9UMVh0bl9UMVVzZFByaWNlWDYJAJQKAgUMVDFVc2RQcmljZVg2BQVkZWJ1ZwATbGFzdFVwZGF0ZWRCbG9ja0tleQIQbGFzdFVwZGF0ZWRCbG9jawAHbjE1TGlzdAkAzAgCAAEJAMwIAgABCQDMCAIAAQkAzAgCAAEJAMwIAgABCQDMCAIAAQkAzAgCAAEJAMwIAgABCQDMCAIAAQkAzAgCAAEJAMwIAgABCQDMCAIAAQkAzAgCAAEJAMwIAgABCQDMCAIAAQUDbmlsAQ9nZXRQcmljZURhdGFLZXkCBWJsb2NrB3Rva2VuSWQJAKwCAgkArAICCQCsAgICBmJsb2NrXwkApAMBBQVibG9jawIBXwUHdG9rZW5JZAENZ2V0UHJpY2VWYWx1ZQIHdG9rZW5JZAVibG9jawkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9vcmRlcmJvb2tPcmFjbGUJAQ9nZXRQcmljZURhdGFLZXkCBQVibG9jawUHdG9rZW5JZAAAARNnZXRMYXN0VXBkYXRlZEJsb2NrAAQQbGFzdFVwZGF0ZWRCbG9jawkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFD29yZGVyYm9va09yYWNsZQUTbGFzdFVwZGF0ZWRCbG9ja0tleQIgTGFzdCB1cGRhdGVkIGJsb2NrIGtleSBub3QgZm91bmQDCQBnAgAABRBsYXN0VXBkYXRlZEJsb2NrCQACAQITSW52YWxpZCBibG9jayB2YWx1ZQMJAGYCCQBlAgUGaGVpZ2h0BRBsYXN0VXBkYXRlZEJsb2NrAAoJAAIBAi5UaGUgcHJpY2UgaGFzIG5vdCBiZWVuIHVwZGF0ZWQgZm9yIGEgbG9uZyB0aW1lBRBsYXN0VXBkYXRlZEJsb2NrAQxnZXRQcmljZUxpc3QCBWFjY3VtBG5leHQECyR0MDk3OTA5ODMxBQVhY2N1bQQGcmVzdWx0CAULJHQwOTc5MDk4MzECXzEEBWJsb2NrCAULJHQwOTc5MDk4MzECXzIEB3Rva2VuSWQIBQskdDA5NzkwOTgzMQJfMwQDc3VtCAULJHQwOTc5MDk4MzECXzQECnByaWNlVmFsdWUJAQ1nZXRQcmljZVZhbHVlAgUHdG9rZW5JZAUFYmxvY2sECW5leHRCbG9jawkAZQIFBWJsb2NrBQRuZXh0AwkAZgIFCnByaWNlVmFsdWUAAAkAlgoECQDNCAIFBnJlc3VsdAUKcHJpY2VWYWx1ZQUJbmV4dEJsb2NrBQd0b2tlbklkCQBkAgUDc3VtBQpwcmljZVZhbHVlCQCWCgQFBnJlc3VsdAUJbmV4dEJsb2NrBQd0b2tlbklkBQNzdW0BEGdldE9yZGVyYm9va1R3YXABCnRva2VuSWRTdHIEA2ludgkA/AcEBQR0aGlzAhJnZXRPcmRlcmJvb2tUd2FwMTUJAMwIAgUKdG9rZW5JZFN0cgkAzAgCBwUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYEDm9yZGVyYm9va1ByaWNlCgABQAUDaW52AwkAAQIFAUACDihJbnQsIEJvb2xlYW4pBQFACQACAQkArAICCQADAQUBQAIjIGNvdWxkbid0IGJlIGNhc3QgdG8gKEludCwgQm9vbGVhbikDCQAAAgUOb3JkZXJib29rUHJpY2UFDm9yZGVyYm9va1ByaWNlBQ5vcmRlcmJvb2tQcmljZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBaQESZ2V0T3JkZXJib29rVHdhcDE1Agd0b2tlbklkBWRlYnVnBBBsYXN0VXBkYXRlZEJsb2NrCQETZ2V0TGFzdFVwZGF0ZWRCbG9jawAEBXR1cGxlCgACJGwFB24xNUxpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQFA25pbAUQbGFzdFVwZGF0ZWRCbG9jawUHdG9rZW5JZAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQxnZXRQcmljZUxpc3QCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPBApwcmljZXNMaXN0CAUFdHVwbGUCXzEEA3N1bQgFBXR1cGxlAl80BAdhdmVyYWdlCQBrAwUDc3VtAMCEPQkAawMJAJADAQUKcHJpY2VzTGlzdADAhD0AAQQIaXNMb2NrZWQJAQt2YWx1ZU9yRWxzZQIJAJsIAgUPb3JkZXJib29rT3JhY2xlCQCsAgIFB3Rva2VuSWQCB19sb2NrZWQHAwUFZGVidWcJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIJYXZlcmFnZTogCQCkAwEFB2F2ZXJhZ2UCDCwgaXNMb2NrZWQ6IAkApQMBBQhpc0xvY2tlZAICLCACD3ByaWNlTGlzdFNpemU6IAkApAMBCQCQAwEFCnByaWNlc0xpc3QCBywgc3VtOiAJAKQDAQUDc3VtCQCUCgIFA25pbAkAlAoCBQdhdmVyYWdlBQhpc0xvY2tlZAFpARR1cGRhdGVXeExwVG9rZW5QcmljZQEKYXNzZXRJZFN0cgQIdG9rZW5OdW0JAQV2YWx1ZQEJAM8IAgUMd3hMcFRva2VuSWRzBQphc3NldElkU3RyBAp1bmRlcmx5aW5nCQCRAwIFDnd4THBVbmRlcmx5aW5nBQh0b2tlbk51bQQQdW5kZXJseWluZzFQcmljZQMJAAACCQCRAwIFCnVuZGVybHlpbmcAAAIFV0FWRVMFCndhdmVzUHJpY2UDCQECIT0CCQDPCAIFB3N0YWJsZXMJAJEDAgUKdW5kZXJseWluZwAABQR1bml0AMCEPQgJAQ1nZXRUb2tlblByaWNlAgkBBXZhbHVlAQkAzwgCBQh0b2tlbklkcwkAkQMCBQp1bmRlcmx5aW5nAAAFCndhdmVzUHJpY2UCXzEEE3VuZGVybHlpbmcxRGVjaW1hbHMDCQAAAgkAkQMCBQp1bmRlcmx5aW5nAAACBVdBVkVTAAgJAQV2YWx1ZQEICQEFdmFsdWUBCQDsBwEJANkEAQkAkQMCBQp1bmRlcmx5aW5nAAAIZGVjaW1hbHMEEHVuZGVybHlpbmcyUHJpY2UDCQAAAgkAkQMCBQp1bmRlcmx5aW5nAAECBVdBVkVTBQp3YXZlc1ByaWNlAwkBAiE9AgkAzwgCBQdzdGFibGVzCQCRAwIFCnVuZGVybHlpbmcAAQUEdW5pdADAhD0ICQENZ2V0VG9rZW5QcmljZQIJAQV2YWx1ZQEJAM8IAgUIdG9rZW5JZHMJAJEDAgUKdW5kZXJseWluZwABBQp3YXZlc1ByaWNlAl8xBBN1bmRlcmx5aW5nMkRlY2ltYWxzAwkAAAIJAJEDAgUKdW5kZXJseWluZwABAgVXQVZFUwAICQEFdmFsdWUBCAkBBXZhbHVlAQkA7AcBCQDZBAEJAJEDAgUKdW5kZXJseWluZwABCGRlY2ltYWxzBBB1bmRlcmx5aW5nMVNjYWxlAwkAAAIFE3VuZGVybHlpbmcxRGVjaW1hbHMACAUGU2NhbGU4AMCEPQQQdW5kZXJseWluZzJTY2FsZQMJAAACBRN1bmRlcmx5aW5nMkRlY2ltYWxzAAgFBlNjYWxlOADAhD0EA2ludgoAAUAJAPwHBAULd3hfcmVzdERhcHACF3Bvb2xFdmFsdWF0ZUdldFJFQURPTkxZCQDMCAIFCmFzc2V0SWRTdHIJAMwIAgCAwtcvBQNuaWwFA25pbAMJAAECBQFAAgZTdHJpbmcFAUAJAAIBCQCsAgIJAAMBBQFAAhsgY291bGRuJ3QgYmUgY2FzdCB0byBTdHJpbmcDCQAAAgUDaW52BQNpbnYEBHZhbHMJALUJAgUDaW52AgJfXwQRdW5kZXJseWluZzFBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQR2YWxzAAEEEXVuZGVybHlpbmcyQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEdmFscwACBAp0b2tlblByaWNlCQBkAgkAawMFEHVuZGVybHlpbmcxUHJpY2UFEXVuZGVybHlpbmcxQW1vdW50BRB1bmRlcmx5aW5nMVNjYWxlCQBrAwUQdW5kZXJseWluZzJQcmljZQURdW5kZXJseWluZzJBbW91bnQFEHVuZGVybHlpbmcyU2NhbGUECGxhc3RUd2FwCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgUKYXNzZXRJZFN0cgIHX3R3YXA1QgQKbGFzdEhlaWdodAkBDXRyeUdldEludGVnZXIBCQCsAgIFCmFzc2V0SWRTdHICCl9sYXN0QmxvY2sDCQECIT0CCAUBaQxvcmlnaW5DYWxsZXIFDWJhY2tlbmRDYWxsZXIJAAIBAhphdmFpbGFibGUgZm9yIGJhY2tlbmQgb25seQMJAGYCBQt1cGRhdGVEZWxheQkAZQIFBmhlaWdodAUKbGFzdEhlaWdodAUDbmlsAwMJAAACBQpsYXN0SGVpZ2h0AAAGCQBmAgkAZQIFBmhlaWdodAUKbGFzdEhlaWdodABkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCmFzc2V0SWRTdHICB190d2FwNUIFCnRva2VuUHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYXNzZXRJZFN0cgIKX2xhc3RCbG9jawUGaGVpZ2h0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUKYXNzZXRJZFN0cgILX2xhc3RQcmljZXMJAKQDAQUKdG9rZW5QcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQphc3NldElkU3RyAgpfcmlza0xldmVsAAEFA25pbAQKbGFzdFByaWNlcwkAtQkCCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIFCmFzc2V0SWRTdHICC19sYXN0UHJpY2VzAgEsBAluZXdQcmljZXMJAMwIAgkApAMBBQp0b2tlblByaWNlBQpsYXN0UHJpY2VzCgEKc3VtSGFuZGxlcgIFYWNjdW0EbmV4dAkAZAIFBWFjY3VtCQENcGFyc2VJbnRWYWx1ZQEFBG5leHQEB25ld1R3YXAJAGkCCgACJGwFCW5ld1ByaWNlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEKc3VtSGFuZGxlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgkAkAMBBQluZXdQcmljZXMECXByaWNlRGlmZgkAawMFCnRva2VuUHJpY2UAkE4JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpsYXN0UHJpY2VzCQBlAgkAkAMBBQpsYXN0UHJpY2VzAAEEC3ByaWNlRGlmZk9rAwkAZgIJAGQCAJBOBQ9zaHV0ZG93blRyaWdnZXIFCXByaWNlRGlmZgkAZgIFCXByaWNlRGlmZgkAZQIAkE4FD3NodXRkb3duVHJpZ2dlcgcECXJpc2tMZXZlbAMFC3ByaWNlRGlmZk9rAAEAAgMJAGcCAAUJAJADAQUJbmV3UHJpY2VzBAl1cGRQcmljZXMJALkJAgUJbmV3UHJpY2VzAgEsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCmFzc2V0SWRTdHICB190d2FwNUIFB25ld1R3YXAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYXNzZXRJZFN0cgIKX2xhc3RCbG9jawUGaGVpZ2h0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUKYXNzZXRJZFN0cgILX2xhc3RQcmljZXMFCXVwZFByaWNlcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQphc3NldElkU3RyAgpfcmlza0xldmVsBQlyaXNrTGV2ZWwFA25pbAQJdXBkUHJpY2VzCQC5CQIJANEIAgUJbmV3UHJpY2VzCQBlAgkAkAMBBQluZXdQcmljZXMAAQIBLAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQphc3NldElkU3RyAgdfdHdhcDVCBQduZXdUd2FwCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCmFzc2V0SWRTdHICCl9sYXN0QmxvY2sFBmhlaWdodAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCmFzc2V0SWRTdHICC19sYXN0UHJpY2VzBQl1cGRQcmljZXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYXNzZXRJZFN0cgIKX3Jpc2tMZXZlbAUJcmlza0xldmVsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQESdXBkYXRlTHBUb2tlblByaWNlAQphc3NldElkU3RyBAh0b2tlbk51bQkBBXZhbHVlAQkAzwgCBQpscFRva2VuSWRzBQphc3NldElkU3RyBAliYXNlSWRTdHIJAJEDAgULbHBUb2tlbkJhc2UFCHRva2VuTnVtBAliYXNlUHJpY2UDCQAAAgUJYmFzZUlkU3RyAgVXQVZFUwUKd2F2ZXNQcmljZQgJAQ1nZXRUb2tlblByaWNlAgkBBXZhbHVlAQkAzwgCBQh0b2tlbklkcwUJYmFzZUlkU3RyBQp3YXZlc1ByaWNlAl8xBAxiYXNlUXVhbnRpdHkJARFAZXh0ck5hdGl2ZSgxMDUwKQIJAJEDAgULbHBUb2tlblBvb2wFCHRva2VuTnVtCQCsAgIJAKwCAgIHZ2xvYmFsXwUJYmFzZUlkU3RyAghfYmFsYW5jZQQNdG9rZW5RdWFudGl0eQgJAQV2YWx1ZQEJAOwHAQkBBXZhbHVlAQkBDWdldEFzc2V0Qnl0ZXMBBQphc3NldElkU3RyCHF1YW50aXR5BAp0b2tlblByaWNlCQBrAwkAawMJAGsDBQliYXNlUHJpY2UFDGJhc2VRdWFudGl0eQDAhD0FBlNjYWxlOAkAkQMCBRBscFRva2VuQmFzZVNoYXJlBQh0b2tlbk51bQDAhD0FDXRva2VuUXVhbnRpdHkEEXRva2VuUmVzZXJ2ZVByaWNlAwkBAiE9AgkAkQMCBRJscFRva2VuUmVzZXJ2ZUJhc2UFCHRva2VuTnVtAgAECmJhc2UySWRTdHIJAJEDAgUSbHBUb2tlblJlc2VydmVCYXNlBQh0b2tlbk51bQQKYmFzZTJQcmljZQMJAAACBQpiYXNlMklkU3RyAgVXQVZFUwUKd2F2ZXNQcmljZQMJAAACBQpiYXNlMklkU3RyAiwzVnVWNVdUbUR6NDdEbWRuM1FwY1lqemJTZGlwalFFNEpNZE5lMXhacFgxMwUMZXRoRG9yYVByaWNlAwkAAAIFCmJhc2UySWRTdHIFCHh0bklkU3RyCQBoAgUNeHRuVXNkUHJpY2VYNgBkCAkBDWdldFRva2VuUHJpY2UCCQEFdmFsdWUBCQDPCAIFCHRva2VuSWRzBQpiYXNlMklkU3RyBQp3YXZlc1ByaWNlAl8xBA1iYXNlMlF1YW50aXR5CQERQGV4dHJOYXRpdmUoMTA1MCkCCQCRAwIFC2xwVG9rZW5Qb29sBQh0b2tlbk51bQkArAICCQCsAgICB2dsb2JhbF8FCmJhc2UySWRTdHICCF9iYWxhbmNlCQBrAwkAawMJAGsDBQpiYXNlMlByaWNlBQ1iYXNlMlF1YW50aXR5AMCEPQUGU2NhbGU4CQCRAwIFE2xwVG9rZW5SZXNlcnZlU2hhcmUFCHRva2VuTnVtAMCEPQUNdG9rZW5RdWFudGl0eQUKdG9rZW5QcmljZQQIbGFzdFR3YXAJAQ10cnlHZXRJbnRlZ2VyAQkArAICBQphc3NldElkU3RyAgdfdHdhcDVCBApsYXN0SGVpZ2h0CQENdHJ5R2V0SW50ZWdlcgEJAKwCAgUKYXNzZXRJZFN0cgIKX2xhc3RCbG9jawMJAQIhPQIIBQFpDG9yaWdpbkNhbGxlcgUNYmFja2VuZENhbGxlcgkAAgECGmF2YWlsYWJsZSBmb3IgYmFja2VuZCBvbmx5AwkAZgIAAgkAZQIFBmhlaWdodAUKbGFzdEhlaWdodAUDbmlsAwMJAAACBQpsYXN0SGVpZ2h0AAAGCQBmAgkAZQIFBmhlaWdodAUKbGFzdEhlaWdodABkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCmFzc2V0SWRTdHICB190d2FwNUIFCnRva2VuUHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYXNzZXRJZFN0cgIKX2xhc3RCbG9jawUGaGVpZ2h0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUKYXNzZXRJZFN0cgILX2xhc3RQcmljZXMJAKQDAQUKdG9rZW5QcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQphc3NldElkU3RyAgpfcmlza0xldmVsAAEFA25pbAQKbGFzdFByaWNlcwkAtQkCCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIFCmFzc2V0SWRTdHICC19sYXN0UHJpY2VzAgEsBAluZXdQcmljZXMJAMwIAgkApAMBBQp0b2tlblByaWNlBQpsYXN0UHJpY2VzCgEKc3VtSGFuZGxlcgIFYWNjdW0EbmV4dAkAZAIFBWFjY3VtCQENcGFyc2VJbnRWYWx1ZQEFBG5leHQEB25ld1R3YXAJAGkCCgACJGwFCW5ld1ByaWNlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEKc3VtSGFuZGxlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgkAkAMBBQluZXdQcmljZXMECXByaWNlRGlmZgkAawMFCnRva2VuUHJpY2UAkE4JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpsYXN0UHJpY2VzCQBlAgkAkAMBBQpsYXN0UHJpY2VzAAEECnByaWNlRGlmZjIJAGsDBQp0b2tlblByaWNlAJBOBRF0b2tlblJlc2VydmVQcmljZQMDCQEBIQEJAGYCAIRSBQpwcmljZURpZmYyCQBmAgUKcHJpY2VEaWZmMgCcSgcFA25pbAQLcHJpY2VEaWZmT2sDCQBmAgkAZAIAkE4FD3NodXRkb3duVHJpZ2dlcgUJcHJpY2VEaWZmCQBmAgUJcHJpY2VEaWZmCQBlAgCQTgUPc2h1dGRvd25UcmlnZ2VyBwQJcmlza0xldmVsAwULcHJpY2VEaWZmT2sAAQACBA1uZXdQcmljZXNTaXplCQCQAwEFCW5ld1ByaWNlcwMJAGcCAAUFDW5ld1ByaWNlc1NpemUECXVwZFByaWNlcwkAuQkCBQluZXdQcmljZXMCASwJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYXNzZXRJZFN0cgIHX3R3YXA1QgUHbmV3VHdhcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQphc3NldElkU3RyAgpfbGFzdEJsb2NrBQZoZWlnaHQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQphc3NldElkU3RyAgtfbGFzdFByaWNlcwUJdXBkUHJpY2VzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCmFzc2V0SWRTdHICCl9yaXNrTGV2ZWwFCXJpc2tMZXZlbAUDbmlsBAl1cGRQcmljZXMJALkJAgkA0QgCBQluZXdQcmljZXMJAGUCBQ1uZXdQcmljZXNTaXplAAECASwJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYXNzZXRJZFN0cgIHX3R3YXA1QgUHbmV3VHdhcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQphc3NldElkU3RyAgpfbGFzdEJsb2NrBQZoZWlnaHQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQphc3NldElkU3RyAgtfbGFzdFByaWNlcwUJdXBkUHJpY2VzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCmFzc2V0SWRTdHICCl9yaXNrTGV2ZWwFCXJpc2tMZXZlbAUDbmlsAWkBEHVwZGF0ZVRva2VuUHJpY2UBCmFzc2V0SWRTdHIECnRva2VuUHJpY2UDCQAAAgUKYXNzZXRJZFN0cgIFV0FWRVMFCndhdmVzUHJpY2UDCQAAAgUKYXNzZXRJZFN0cgUIeHRuSWRTdHIFDXh0blVzZFByaWNlWDYEDHByaWNlSW5Qb29scwgJAQ1nZXRUb2tlblByaWNlAgkBBXZhbHVlAQkAzwgCBQh0b2tlbklkcwUKYXNzZXRJZFN0cgUKd2F2ZXNQcmljZQJfMQMJAAACBQphc3NldElkU3RyBQZldGhTdHIECGV0aFByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQtkb3JhQWRkcmVzcwIVJXMlc19fcHJpY2VfX0VUSC1VU0RUBARjb21wCQBrAwUMcHJpY2VJblBvb2xzAJBOBQhldGhQcmljZQMDCQBmAgUEY29tcAkAZQIAkE4FD29yYWNsZVRvbGVyYW5jZQkAZgIJAGQCAJBOBQ9vcmFjbGVUb2xlcmFuY2UFBGNvbXAHBQxwcmljZUluUG9vbHMJAAIBAjJpbnRlcm5hbCBFVEggcHJpY2UgZG9lc24ndCBtYXRjaCB3aXRoIGdsb2JhbCBwcmljZQMJAQIhPQIJAM8IAgUHc3RhYmxlcwUKYXNzZXRJZFN0cgUEdW5pdADAhD0FDHByaWNlSW5Qb29scwQIbGFzdFR3YXAJAQ10cnlHZXRJbnRlZ2VyAQkArAICBQphc3NldElkU3RyAgdfdHdhcDVCBApsYXN0SGVpZ2h0CQENdHJ5R2V0SW50ZWdlcgEJAKwCAgUKYXNzZXRJZFN0cgIKX2xhc3RCbG9jawMJAQIhPQIIBQFpDG9yaWdpbkNhbGxlcgUNYmFja2VuZENhbGxlcgkAAgECGmF2YWlsYWJsZSBmb3IgYmFja2VuZCBvbmx5AwkAZgIAAgkAZQIFBmhlaWdodAUKbGFzdEhlaWdodAUDbmlsAwMJAAACBQpsYXN0SGVpZ2h0AAAGCQBmAgkAZQIFBmhlaWdodAUKbGFzdEhlaWdodAAeCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCmFzc2V0SWRTdHICB190d2FwNUIFCnRva2VuUHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYXNzZXRJZFN0cgIKX2xhc3RCbG9jawUGaGVpZ2h0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUKYXNzZXRJZFN0cgILX2xhc3RQcmljZXMJAKQDAQUKdG9rZW5QcmljZQUDbmlsBApsYXN0UHJpY2VzCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgUKYXNzZXRJZFN0cgILX2xhc3RQcmljZXMCASwECW5ld1ByaWNlcwkAzAgCCQCkAwEFCnRva2VuUHJpY2UFCmxhc3RQcmljZXMKAQpzdW1IYW5kbGVyAgVhY2N1bQRuZXh0CQBkAgUFYWNjdW0JAQ1wYXJzZUludFZhbHVlAQUEbmV4dAQHbmV3VHdhcAkAaQIKAAIkbAUJbmV3UHJpY2VzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQpzdW1IYW5kbGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGCQCQAwEFCW5ld1ByaWNlcwQTb3JkZXJib29rVHdhcFJlc3VsdAkBEGdldE9yZGVyYm9va1R3YXABBQphc3NldElkU3RyAwkAAAIFE29yZGVyYm9va1R3YXBSZXN1bHQFE29yZGVyYm9va1R3YXBSZXN1bHQEDSR0MDE5NjEyMTk2NzAFE29yZGVyYm9va1R3YXBSZXN1bHQEDW9yZGVyYm9va1R3YXAIBQ0kdDAxOTYxMjE5NjcwAl8xBA9vcmRlcmJvb2tMb2NrZWQIBQ0kdDAxOTYxMjE5NjcwAl8yBA90d2Fwc0NvbXBhcmlzb24DCQECIT0CBQ1vcmRlcmJvb2tUd2FwAAAJAGsDBQduZXdUd2FwAJBOBQ1vcmRlcmJvb2tUd2FwCQACAQkArAICAhpvcmRlcmJvb2sgcmVzdWx0IHplcm8gZm9yIAUKYXNzZXRJZFN0cgQMdHdhcHNTaW1pbGFyAwkAZgIFD3R3YXBzQ29tcGFyaXNvbgkAZQIAkE4FD29yYWNsZVRvbGVyYW5jZQkAZgIJAGQCAJBOBQ9vcmFjbGVUb2xlcmFuY2UFD3R3YXBzQ29tcGFyaXNvbgcECXByaWNlRGlmZgkAawMFCnRva2VuUHJpY2UAkE4JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpsYXN0UHJpY2VzCQBlAgkAkAMBBQpsYXN0UHJpY2VzAAEEC3ByaWNlRGlmZk9rAwkAZgIJAGQCAJBOBQ9zaHV0ZG93blRyaWdnZXIFCXByaWNlRGlmZgkAZgIFCXByaWNlRGlmZgkAZQIAkE4FD3NodXRkb3duVHJpZ2dlcgcECXJpc2tMZXZlbAkAZAIJAGQCAwUMdHdhcHNTaW1pbGFyAAEAAgMFD29yZGVyYm9va0xvY2tlZAABAAADCQEBIQEFC3ByaWNlRGlmZk9rAAEAAAQNbmV3UHJpY2VzU2l6ZQkAkAMBBQluZXdQcmljZXMDCQEBIQEFDHR3YXBzU2ltaWxhcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQphc3NldElkU3RyAgpfcmlza0xldmVsBQlyaXNrTGV2ZWwFA25pbAMJAGcCAAUFDW5ld1ByaWNlc1NpemUECXVwZFByaWNlcwkAuQkCBQluZXdQcmljZXMCASwJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYXNzZXRJZFN0cgIHX3R3YXA1QgUHbmV3VHdhcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQphc3NldElkU3RyAgpfbGFzdEJsb2NrBQZoZWlnaHQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQphc3NldElkU3RyAgtfbGFzdFByaWNlcwUJdXBkUHJpY2VzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCmFzc2V0SWRTdHICCl9yaXNrTGV2ZWwFCXJpc2tMZXZlbAUDbmlsBAl1cGRQ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XzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAMJAAACBQNyZXMFA3JlcwQCaTIJAPwHBAUEdGhpcwIUdXBkYXRlV3hMcFRva2VuUHJpY2UJAMwIAgkAkQMCBQx3eExwVG9rZW5JZHMAAAUDbmlsBQNuaWwDCQAAAgUCaTIFAmkyBQNyZXMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENaW5pdE5ld01hc3RlcgEGbWFzdGVyBAlhZGRyZXNzT0sEByRtYXRjaDAJAKYIAQUGbWFzdGVyAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAGBwMJAQEhAQUJYWRkcmVzc09LCQACAQkArAICAhJpbmNvcnJlY3QgYWRkcmVzcyAFBm1hc3RlcgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECHGF2YWlsYWJsZSBmb3Igc2VsZiBjYWxsIG9ubHkJAMwIAgkBC1N0cmluZ0VudHJ5AgIPdmVyaWZpZXJfbWFzdGVyBQZtYXN0ZXIFA25pbAFpARByZXF1ZXN0TmV3TWFzdGVyAQluZXdNYXN0ZXIECWFkZHJlc3NPSwQHJG1hdGNoMAkApggBBQluZXdNYXN0ZXIDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAYHAwkBASEBBQlhZGRyZXNzT0sJAAIBCQCsAgICEmluY29ycmVjdCBhZGRyZXNzIAUJbmV3TWFzdGVyAwkAAAIJAM8IAgUJc2VudGluZWxzCAUBaQZjYWxsZXIFBHVuaXQJAAIBAg53aGl0ZWxpc3Qgb25seQkAzAgCCQELU3RyaW5nRW50cnkCAhJ2ZXJpZmllcl9uZXdNYXN0ZXIFCW5ld01hc3RlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgIfdmVyaWZpZXJfbmV3TWFzdGVyRWxpZ2libGVBZnRlcgkAZAIFBmhlaWdodACQTgUDbmlsAWkBEWFjdGl2YXRlTmV3TWFzdGVyAAQOZWxpZ2libGVIZWlnaHQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCH3ZlcmlmaWVyX25ld01hc3RlckVsaWdpYmxlQWZ0ZXIECW5ld01hc3RlcgkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwISdmVyaWZpZXJfbmV3TWFzdGVyAwkAAAIJAM8IAgUJc2VudGluZWxzCAUBaQZjYWxsZXIFBHVuaXQJAAIBAg53aGl0ZWxpc3Qgb25seQMJAGYCBQ5lbGlnaWJsZUhlaWdodAUGaGVpZ2h0CQACAQIibmV3IG1hc3RlciBjYW5ub3QgYmUgYWN0aXZhdGVkIHlldAkAzAgCCQELRGVsZXRlRW50cnkBAhJ2ZXJpZmllcl9uZXdNYXN0ZXIJAMwIAgkBC0RlbGV0ZUVudHJ5AQIfdmVyaWZpZXJfbmV3TWFzdGVyRWxpZ2libGVBZnRlcgkAzAgCCQELU3RyaW5nRW50cnkCAg92ZXJpZmllcl9tYXN0ZXIFCW5ld01hc3RlcgUDbmlsAQJ0eAEGdmVyaWZ5AAQNbWFzdGVyQWRkcmVzcwkAoggBAg92ZXJpZmllcl9tYXN0ZXIEEGFwcHJvdmVkQnlNYXN0ZXIEByRtYXRjaDAFDW1hc3RlckFkZHJlc3MDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAF4BQckbWF0Y2gwBAckbWF0Y2gxCQCaCAIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAXgJAKwCAgILYXBwcm92ZWRUeF8JANgEAQgFAnR4AmlkAwkAAQIFByRtYXRjaDECA0ludAQBeQUHJG1hdGNoMQUBeQAAAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5CQBmAgUQYXBwcm92ZWRCeU1hc3RlcgAAB1wubqM=", "height": 4028727, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Bg27BHi8SiTRRTa6Y5E6iv5WJNRoBPYijMpcKi6HGhHy Next: H2mMg1oAJNHS4hyu7QFAerzJcpBb6WAB4YubmoRs4C6t Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let Scale8 = 100000000
55
66 let sentinels = [Address(base58'3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL'), Address(base58'3PQdNxynJy5mche2kxMVc5shXWzK8Gstq3o'), Address(base58'3P8auNWJkxxByyJtwErFXaxiXcGM45qQ1hA'), Address(base58'3P8qVX189qpoTJZQQQdKS9endHK5sxWsvrd')]
77
88 let backendCaller = Address(base58'3PLGH6sG6ND59GU6gFXHKQRuL5bdpWFs6U6')
99
1010 let orderbookOracle = Address(base58'3PPXVKjN6nRMzXeegcYhfiic96pd2c98Ekm')
1111
1212 let xtnId = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
1313
1414 let xtnIdStr = "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p"
1515
1616 let ethStr = "3VuV5WTmDz47Dmdn3QpcYjzbSdipjQE4JMdNe1xZpX13"
1717
1818 let stables = ["9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi", "HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW"]
1919
2020 let tokenIds = ["6nSpVyNH7yM69eg446wrQR94ipbbcmZMU1ENPwanC97g", "Ehie5xYpeN8op1Cctc6aGUrqx8jq3jtf1DSjXDbfm7aT", "4LHHvYGNKJUg5hj65aGD5vgScvCBmLpdRFtjokvCjSL8", "C1iWsKGqLwjHUndiQ7iXpdmPum9PeCDFfyXBdJJosDRS", "34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ", "6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ", "HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS", "Ajso6nTTjptu2UHLx6hfSXVtHFtRBJCkKYd5SAyj7zf5", "DSbbhLsSTeDg5Lsiufk2Aneh3DjVqJuPr2M9uU1gwy5p", "Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on", "2thsACuHmzDMuNezPM32wg9a3BwUzBWDeSKakgz3cw21", "YiNbofFzC17jEHHCMwrRcpy9MrrjabMMLZxg8g5xmf7", "8t4DPWTwPzpatHA9AkTxWAB47THnYzBsDnoY7fQqbG91", "At8D6NFFpheCbvKVnjVoeLL84Eo8NZn6ovManxfLaFWL", "6phK22ztGBW127gUFmdMEHKB3CVd6ZhWox2WtwJkbqTq", "3VuV5WTmDz47Dmdn3QpcYjzbSdipjQE4JMdNe1xZpX13", "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi"]
2121
2222 let tokenIsBaseAsset = [false, false, false, false, true, true, false, false, false, false, false, false, false, false, true, false, true, true]
2323
2424 let tokenDecimals = [1000000, 100000000, 100000000, 100000000, 1000000, 1000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000, 1000000, 1000000, 100000000, 1000000, 1000000]
2525
2626 let tokenWXWavesLPs = ["DZeA7RbVab98r61hVH5zcFZXwNALPJGgq1eyHandsKKW", "72E4MMFHngsixqAkNZCRJMLTmgAP9nufdsXexnS5qxVx", "FTTJnB6xG4CKZEJMgsgqjmgbzcyH8ya3tV8LQP2GCDs7", "3UnytNnkd48fHofHPBp59BkpZA1uMSJ8PdhWUCuerics", "ByJtVuYi58CtdjtasDuTqtgev8qWkdJybF7rY1xosmhE", "BoXuf9ewJSE1UMrKibZmigzC6tBzv8RFTeZmofEos2ZJ", "7G687ui3m59oAd6qkyni2vt77bHF4bbA6xcPfDo3uiTu", "EMsZpqcT8NuMYZCEPHzvrhQCQKhfXjdeekZvcWpHsNvh", "E3YhURNsCmjUaYNigH6AayLxbh9u81uVGU3ZvHKznY5v", "BiSzFe8nSL78oZaebfoin5vBZ5Pze6d7kaeijLqr5xZe", "AKQsEQoeinKRFtdx6rhKWcpkAMu6cbDLdtSWnR8tpBCq", "DjgwW4CMJEfpzj7SLFFPiCqf1zfmAgf1MD5gAS8SjKt4", "", "F3s92VRdppEtLVAP697CTM6AzZJECRcoMx5kj2FkGv4M", "6iMB6LKSrgv9waEvEnN6Ydyx7dfxPnGcTw8318WVm5bR", "E6MUGSUieSsq6QiJcbp6REdQXyjp6uPWLitnp9Gdtsuh", "6KWpnpLk6GNh5HG9ct9pNDCYFWJBoAAshZsp4D8jcFpV", ""]
2727
2828 let tokenWXXTNPools = ["", "", "", "3P3Y38zymCHoTM6qcE9JcEA8rhaGTQbVMgu", "", "", "3P615yXeQ9Qu4qBM1QGimGzixyMS5W4Ktug", "3PEkD5LuHGWhUfgBW1owZFxVydYoWjV6Jia", "3P5HjPowgipiVB3UvXphDiPvKs424WC9xQw", "3PCENpEKe8atwELZ7oCSmcdEfcRuKTrUx99", "", "", "3PH832eKnw67PFvJfUg9Knz6BHM87QvjMeL", "", "3PGcYzoUfQEQkhRgrBqmG5Wpc7A1ncFvRtM", "", "", ""]
2929
3030 let tokenSwopPools = ["3P2V63Xd6BviDkeMzxhUw2SJyojByRz8a8m", "3P27S9V36kw2McjWRZ37AxTx8iwkd7HXw6W", "3P6DLdJTP2EySq9MFdJu6beUevrQd2sVVBh", "", "", "", "3PBHyEwmERR1CEkrTNbPj2bgyisTfPRqfee", "3PDSXwwA2xAtmxeo2bebDP3AA5ynZ2Krgnw", "3PJ48P3p2wvWUjgQaQiZ2cFbr8qmxMokBGd", "3PKi4G3VX2k42ZSmNNrmvgdDH7JzRaUhY7R", "", "", "3PCwvns2dnmobD6Z4cR86v98s7LgMZYygEy", "3PLp9KrdrbWAvSFHGJVEaszUubquz3M6mfe", "", "", "", ""]
3131
3232 let lpTokenIds = ["9dbpSr8d18qWQxn5fJJSS1LLQ8CmSZ6gYmjuPRzg3RBM", "9MKixRt9rNRyaJCT2pexbXkuvpZBdJREdTU36bGit8iw", "6bZbRmou7M7wXBunMXQnZ4Rm66HxZF3KfMEiFwk3wmnA", "XjdJKWtPYCz585QB7LnxDP76UGRukazedDubUx9DHQH", "EA7siGMSTxz6EtdpkCiVWQHupFT5N7UbvQrW9kvxCE42"]
3333
3434 let lpTokenBase = ["Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on", "WAVES", "WAVES", "WAVES", "3VuV5WTmDz47Dmdn3QpcYjzbSdipjQE4JMdNe1xZpX13"]
3535
3636 let lpTokenPool = [Address(base58'3PKJxKhn9MrzcvZv689bUpZgh4rurEgoKC8'), Address(base58'3P4PFYKHyxitgwVb4WVWEcdH7ZsuR4GgcXC'), Address(base58'3PCpjLGo4wDuv23kjmGF6mHs86Bf3soYvAq'), Address(base58'3P3EnYA57kMZ8kXVVThi1ZZApZeXUQHqtEe'), Address(base58'3P4U6fo7BZHDymQK82G5pveGPH7CA6PbKit')]
3737
3838 let lpTokenBaseShare = [30000000, 20000000, 20000000, 34000000, 32000000]
3939
4040 let lpTokenReserveBase = ["", "", "", "3VuV5WTmDz47Dmdn3QpcYjzbSdipjQE4JMdNe1xZpX13", ""]
4141
4242 let lpTokenReserveShare = [0, 0, 0, 33000000, 0]
4343
4444 let wxLpTokenIds = ["rZMQ6g31Lr7sPAaAoYc4U2PHCVauTuKUSzUbJtUyPZN"]
4545
4646 let wxLpUnderlying = [["9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi", "HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW"]]
4747
4848 let wx_restAddressStr = "3P8MoPnsaurofk1VyhsdAFkeQ6ijpJYXCpW"
4949
5050 let wx_restDapp = addressFromStringValue(wx_restAddressStr)
5151
5252 let swopRestDapp = addressFromStringValue("3P56jNQzECXnrWpnbbSJKw7Eooo6fkUaMPp")
5353
5454 let oracleTolerance = 1000
5555
5656 let shutdownTrigger = 3000
5757
5858 let updateDelay = 0
5959
6060 let revisionNum = ""
6161
6262 let SEP = "__"
6363
6464 func asString (v) = match v {
6565 case s: String =>
6666 s
6767 case _ =>
6868 throw("fail to cast into String")
6969 }
7070
7171
7272 func asInt (v) = match v {
7373 case i: Int =>
7474 i
7575 case _ =>
7676 throw("fail to cast into Int")
7777 }
7878
7979
8080 func tryGetInteger (key) = match getInteger(this, key) {
8181 case b: Int =>
8282 b
8383 case _ =>
8484 0
8585 }
8686
8787
8888 func getAssetBytes (assetIdStr) = if ((assetIdStr == "WAVES"))
8989 then unit
9090 else fromBase58String(assetIdStr)
9191
9292
9393 let doraAddressStr = "3PKkojKdd6BBzTf1RXbQVfUDraNFXXHKzQF"
9494
9595 let doraAddress = addressFromStringValue(doraAddressStr)
9696
9797 let xtnUsdPriceX6 = valueOrErrorMessage(getInteger(doraAddress, "%s%s__price__USDN-USDT"), "DORA doesn't contain USDN/USDT price")
9898
9999 let wavesPrice = getIntegerValue(doraAddress, "%s%s__price__WAVES-USDT")
100100
101101 let ethDoraPrice = getIntegerValue(doraAddress, "%s%s__price__ETH-USDT")
102102
103103 func getTokenPrice (tokenNum,wavesUsdPriceX6) = {
104104 let tokenIdStr = tokenIds[tokenNum]
105105 let tokenId = fromBase58String(tokenIdStr)
106106 if ((indexOf(stables, tokenIdStr) != unit))
107107 then $Tuple2(1000000, "stable token price")
108108 else {
109109 let wx_T1Waves_lp = tokenWXWavesLPs[tokenNum]
110110 let $t064597175 = if ((wx_T1Waves_lp == ""))
111111 then $Tuple2(0, 0)
112112 else {
113113 let wxRestResult = split(asString(invoke(wx_restDapp, "poolStatsREADONLY", [wx_T1Waves_lp], nil)), "__")
114114 let $t066836775 = if (tokenIsBaseAsset[tokenNum])
115115 then $Tuple2(1, 2)
116116 else $Tuple2(2, 1)
117117 let wavesInPairNum = $t066836775._1
118118 let tokenInPairNum = $t066836775._2
119119 let wx_T1Waves_WAVESx8 = parseIntValue(wxRestResult[wavesInPairNum])
120120 let wx_T1Waves_T1x8 = fraction(parseIntValue(wxRestResult[tokenInPairNum]), 100000000, tokenDecimals[tokenNum])
121121 let wx_T1Waves_T1UsdPriceX6 = fraction(wx_T1Waves_WAVESx8, wavesUsdPriceX6, wx_T1Waves_T1x8)
122122 let wx_T1Waves_Weight = wx_T1Waves_T1x8
123123 $Tuple2(wx_T1Waves_T1UsdPriceX6, wx_T1Waves_Weight)
124124 }
125125 let wx_T1Waves_T1UsdPriceX6 = $t064597175._1
126126 let wx_T1Waves_Weight = $t064597175._2
127127 let wx_T1Xtn_AddressStr = tokenWXXTNPools[tokenNum]
128128 let $t072377668 = if ((wx_T1Xtn_AddressStr == ""))
129129 then $Tuple2(0, 0)
130130 else {
131131 let wx_T1Xtn_Address = addressFromStringValue(wx_T1Xtn_AddressStr)
132132 let wx_T1Xtn_XTNx6 = assetBalance(wx_T1Xtn_Address, xtnId)
133133 let wx_T1Xtn_T1x8 = assetBalance(wx_T1Xtn_Address, tokenId)
134134 $Tuple2(fraction((wx_T1Xtn_XTNx6 * (tokenDecimals[tokenNum] / 1000000)), xtnUsdPriceX6, wx_T1Xtn_T1x8), wx_T1Xtn_T1x8)
135135 }
136136 let wx_T1Xtn_T1UsdPriceX6 = $t072377668._1
137137 let wx_T1Xtn_Weight = $t072377668._2
138138 let swop_T1Xtn_AddressStr = tokenSwopPools[tokenNum]
139139 let $t077318349 = if ((swop_T1Xtn_AddressStr == ""))
140140 then $Tuple2(0, 0)
141141 else {
142142 let swop_T1Xtn_Address = addressFromStringValue(swop_T1Xtn_AddressStr)
143143 let swop_T1Xtn_T1XtnPriceX6 = asInt(invoke(swopRestDapp, "calcGetAmountCPMM", [swop_T1Xtn_AddressStr, "3P88qk1KzF1BKjD7fC7LjNVAKM4ezff5WE6", tokenIdStr, tokenDecimals[tokenNum]], nil))
144144 let swop_T1Xtn_T1UsdPriceX6 = fraction(swop_T1Xtn_T1XtnPriceX6, xtnUsdPriceX6, 1000000)
145145 let swop_T1Xtn_Weight = getIntegerValue(swop_T1Xtn_Address, "A_asset_balance")
146146 $Tuple2(swop_T1Xtn_T1UsdPriceX6, swop_T1Xtn_Weight)
147147 }
148148 let swop_T1Xtn_T1UsdPriceX6 = $t077318349._1
149149 let swop_T1Xtn_Weight = $t077318349._2
150150 let W = ((wx_T1Waves_Weight + wx_T1Xtn_Weight) + swop_T1Xtn_Weight)
151151 let T1UsdPriceX6 = ((fraction(wx_T1Waves_T1UsdPriceX6, wx_T1Waves_Weight, W) + fraction(wx_T1Xtn_T1UsdPriceX6, wx_T1Xtn_Weight, W)) + fraction(swop_T1Xtn_T1UsdPriceX6, swop_T1Xtn_Weight, W))
152152 let debug = ((((((("T1UsdPriceX6=" + toString(T1UsdPriceX6)) + " wx_T1Waves_T1UsdPriceX6=") + toString(wx_T1Waves_T1UsdPriceX6)) + " wx_T1Xtn_T1UsdPriceX6=") + toString(wx_T1Xtn_T1UsdPriceX6)) + " swop_T1Xtn_T1UsdPriceX6=") + toString(swop_T1Xtn_T1UsdPriceX6))
153153 $Tuple2(T1UsdPriceX6, debug)
154154 }
155155 }
156156
157157
158158 let lastUpdatedBlockKey = "lastUpdatedBlock"
159159
160160 let n15List = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
161161
162162 func getPriceDataKey (block,tokenId) = ((("block_" + toString(block)) + "_") + tokenId)
163163
164164
165165 func getPriceValue (tokenId,block) = valueOrElse(getInteger(orderbookOracle, getPriceDataKey(block, tokenId)), 0)
166166
167167
168168 func getLastUpdatedBlock () = {
169169 let lastUpdatedBlock = valueOrErrorMessage(getInteger(orderbookOracle, lastUpdatedBlockKey), "Last updated block key not found")
170170 if ((0 >= lastUpdatedBlock))
171171 then throw("Invalid block value")
172172 else if (((height - lastUpdatedBlock) > 10))
173173 then throw("The price has not been updated for a long time")
174174 else lastUpdatedBlock
175175 }
176176
177177
178178 func getPriceList (accum,next) = {
179179 let $t097909831 = accum
180180 let result = $t097909831._1
181181 let block = $t097909831._2
182182 let tokenId = $t097909831._3
183183 let sum = $t097909831._4
184184 let priceValue = getPriceValue(tokenId, block)
185185 let nextBlock = (block - next)
186186 if ((priceValue > 0))
187187 then $Tuple4((result :+ priceValue), nextBlock, tokenId, (sum + priceValue))
188188 else $Tuple4(result, nextBlock, tokenId, sum)
189189 }
190190
191191
192192 func getOrderbookTwap (tokenIdStr) = {
193193 let inv = invoke(this, "getOrderbookTwap15", [tokenIdStr, false], nil)
194194 if ((inv == inv))
195195 then {
196196 let orderbookPrice = {
197197 let @ = inv
198198 if ($isInstanceOf(@, "(Int, Boolean)"))
199199 then @
200200 else throw(($getType(@) + " couldn't be cast to (Int, Boolean)"))
201201 }
202202 if ((orderbookPrice == orderbookPrice))
203203 then orderbookPrice
204204 else throw("Strict value is not equal to itself.")
205205 }
206206 else throw("Strict value is not equal to itself.")
207207 }
208208
209209
210210 @Callable(i)
211211 func getOrderbookTwap15 (tokenId,debug) = {
212212 let lastUpdatedBlock = getLastUpdatedBlock()
213213 let tuple = {
214214 let $l = n15List
215215 let $s = size($l)
216216 let $acc0 = $Tuple4(nil, lastUpdatedBlock, tokenId, 0)
217217 func $f0_1 ($a,$i) = if (($i >= $s))
218218 then $a
219219 else getPriceList($a, $l[$i])
220220
221221 func $f0_2 ($a,$i) = if (($i >= $s))
222222 then $a
223223 else throw("List size exceeds 15")
224224
225225 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
226226 }
227227 let pricesList = tuple._1
228228 let sum = tuple._4
229229 let average = fraction(sum, 1000000, fraction(size(pricesList), 1000000, 1))
230230 let isLocked = valueOrElse(getBoolean(orderbookOracle, (tokenId + "_locked")), false)
231231 if (debug)
232232 then throw((((((((("average: " + toString(average)) + ", isLocked: ") + toString(isLocked)) + ", ") + "priceListSize: ") + toString(size(pricesList))) + ", sum: ") + toString(sum)))
233233 else $Tuple2(nil, $Tuple2(average, isLocked))
234234 }
235235
236236
237237
238238 @Callable(i)
239239 func updateWxLpTokenPrice (assetIdStr) = {
240240 let tokenNum = value(indexOf(wxLpTokenIds, assetIdStr))
241241 let underlying = wxLpUnderlying[tokenNum]
242242 let underlying1Price = if ((underlying[0] == "WAVES"))
243243 then wavesPrice
244244 else if ((indexOf(stables, underlying[0]) != unit))
245245 then 1000000
246246 else getTokenPrice(value(indexOf(tokenIds, underlying[0])), wavesPrice)._1
247247 let underlying1Decimals = if ((underlying[0] == "WAVES"))
248248 then 8
249249 else value(value(assetInfo(fromBase58String(underlying[0]))).decimals)
250250 let underlying2Price = if ((underlying[1] == "WAVES"))
251251 then wavesPrice
252252 else if ((indexOf(stables, underlying[1]) != unit))
253253 then 1000000
254254 else getTokenPrice(value(indexOf(tokenIds, underlying[1])), wavesPrice)._1
255255 let underlying2Decimals = if ((underlying[1] == "WAVES"))
256256 then 8
257257 else value(value(assetInfo(fromBase58String(underlying[1]))).decimals)
258258 let underlying1Scale = if ((underlying1Decimals == 8))
259259 then Scale8
260260 else 1000000
261261 let underlying2Scale = if ((underlying2Decimals == 8))
262262 then Scale8
263263 else 1000000
264264 let inv = {
265265 let @ = invoke(wx_restDapp, "poolEvaluateGetREADONLY", [assetIdStr, 100000000], nil)
266266 if ($isInstanceOf(@, "String"))
267267 then @
268268 else throw(($getType(@) + " couldn't be cast to String"))
269269 }
270270 if ((inv == inv))
271271 then {
272272 let vals = split(inv, "__")
273273 let underlying1Amount = parseIntValue(vals[1])
274274 let underlying2Amount = parseIntValue(vals[2])
275275 let tokenPrice = (fraction(underlying1Price, underlying1Amount, underlying1Scale) + fraction(underlying2Price, underlying2Amount, underlying2Scale))
276276 let lastTwap = tryGetInteger((assetIdStr + "_twap5B"))
277277 let lastHeight = tryGetInteger((assetIdStr + "_lastBlock"))
278278 if ((i.originCaller != backendCaller))
279279 then throw("available for backend only")
280280 else if ((updateDelay > (height - lastHeight)))
281281 then nil
282282 else if (if ((lastHeight == 0))
283283 then true
284284 else ((height - lastHeight) > 100))
285285 then [IntegerEntry((assetIdStr + "_twap5B"), tokenPrice), IntegerEntry((assetIdStr + "_lastBlock"), height), StringEntry((assetIdStr + "_lastPrices"), toString(tokenPrice)), IntegerEntry((assetIdStr + "_riskLevel"), 1)]
286286 else {
287287 let lastPrices = split(getStringValue((assetIdStr + "_lastPrices")), ",")
288288 let newPrices = toString(tokenPrice) :: lastPrices
289289 func sumHandler (accum,next) = (accum + parseIntValue(next))
290290
291291 let newTwap = ({
292292 let $l = newPrices
293293 let $s = size($l)
294294 let $acc0 = 0
295295 func $f0_1 ($a,$i) = if (($i >= $s))
296296 then $a
297297 else sumHandler($a, $l[$i])
298298
299299 func $f0_2 ($a,$i) = if (($i >= $s))
300300 then $a
301301 else throw("List size exceeds 6")
302302
303303 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
304304 } / size(newPrices))
305305 let priceDiff = fraction(tokenPrice, 10000, parseIntValue(lastPrices[(size(lastPrices) - 1)]))
306306 let priceDiffOk = if (((10000 + shutdownTrigger) > priceDiff))
307307 then (priceDiff > (10000 - shutdownTrigger))
308308 else false
309309 let riskLevel = if (priceDiffOk)
310310 then 1
311311 else 2
312312 if ((5 >= size(newPrices)))
313313 then {
314314 let updPrices = makeString(newPrices, ",")
315315 [IntegerEntry((assetIdStr + "_twap5B"), newTwap), IntegerEntry((assetIdStr + "_lastBlock"), height), StringEntry((assetIdStr + "_lastPrices"), updPrices), IntegerEntry((assetIdStr + "_riskLevel"), riskLevel)]
316316 }
317317 else {
318318 let updPrices = makeString(removeByIndex(newPrices, (size(newPrices) - 1)), ",")
319319 [IntegerEntry((assetIdStr + "_twap5B"), newTwap), IntegerEntry((assetIdStr + "_lastBlock"), height), StringEntry((assetIdStr + "_lastPrices"), updPrices), IntegerEntry((assetIdStr + "_riskLevel"), riskLevel)]
320320 }
321321 }
322322 }
323323 else throw("Strict value is not equal to itself.")
324324 }
325325
326326
327327
328328 @Callable(i)
329329 func updateLpTokenPrice (assetIdStr) = {
330330 let tokenNum = value(indexOf(lpTokenIds, assetIdStr))
331331 let baseIdStr = lpTokenBase[tokenNum]
332332 let basePrice = if ((baseIdStr == "WAVES"))
333333 then wavesPrice
334334 else getTokenPrice(value(indexOf(tokenIds, baseIdStr)), wavesPrice)._1
335335 let baseQuantity = getIntegerValue(lpTokenPool[tokenNum], (("global_" + baseIdStr) + "_balance"))
336336 let tokenQuantity = value(assetInfo(value(getAssetBytes(assetIdStr)))).quantity
337337 let tokenPrice = fraction(fraction(fraction(basePrice, baseQuantity, 1000000), Scale8, lpTokenBaseShare[tokenNum]), 1000000, tokenQuantity)
338338 let tokenReservePrice = if ((lpTokenReserveBase[tokenNum] != ""))
339339 then {
340340 let base2IdStr = lpTokenReserveBase[tokenNum]
341341 let base2Price = if ((base2IdStr == "WAVES"))
342342 then wavesPrice
343343 else if ((base2IdStr == "3VuV5WTmDz47Dmdn3QpcYjzbSdipjQE4JMdNe1xZpX13"))
344344 then ethDoraPrice
345345 else if ((base2IdStr == xtnIdStr))
346346 then (xtnUsdPriceX6 * 100)
347347 else getTokenPrice(value(indexOf(tokenIds, base2IdStr)), wavesPrice)._1
348348 let base2Quantity = getIntegerValue(lpTokenPool[tokenNum], (("global_" + base2IdStr) + "_balance"))
349349 fraction(fraction(fraction(base2Price, base2Quantity, 1000000), Scale8, lpTokenReserveShare[tokenNum]), 1000000, tokenQuantity)
350350 }
351351 else tokenPrice
352352 let lastTwap = tryGetInteger((assetIdStr + "_twap5B"))
353353 let lastHeight = tryGetInteger((assetIdStr + "_lastBlock"))
354354 if ((i.originCaller != backendCaller))
355355 then throw("available for backend only")
356356 else if ((2 > (height - lastHeight)))
357357 then nil
358358 else if (if ((lastHeight == 0))
359359 then true
360360 else ((height - lastHeight) > 100))
361361 then [IntegerEntry((assetIdStr + "_twap5B"), tokenPrice), IntegerEntry((assetIdStr + "_lastBlock"), height), StringEntry((assetIdStr + "_lastPrices"), toString(tokenPrice)), IntegerEntry((assetIdStr + "_riskLevel"), 1)]
362362 else {
363363 let lastPrices = split(getStringValue((assetIdStr + "_lastPrices")), ",")
364364 let newPrices = toString(tokenPrice) :: lastPrices
365365 func sumHandler (accum,next) = (accum + parseIntValue(next))
366366
367367 let newTwap = ({
368368 let $l = newPrices
369369 let $s = size($l)
370370 let $acc0 = 0
371371 func $f0_1 ($a,$i) = if (($i >= $s))
372372 then $a
373373 else sumHandler($a, $l[$i])
374374
375375 func $f0_2 ($a,$i) = if (($i >= $s))
376376 then $a
377377 else throw("List size exceeds 6")
378378
379379 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
380380 } / size(newPrices))
381381 let priceDiff = fraction(tokenPrice, 10000, parseIntValue(lastPrices[(size(lastPrices) - 1)]))
382382 let priceDiff2 = fraction(tokenPrice, 10000, tokenReservePrice)
383383 if (if (!((10500 > priceDiff2)))
384384 then (priceDiff2 > 9500)
385385 else false)
386386 then nil
387387 else {
388388 let priceDiffOk = if (((10000 + shutdownTrigger) > priceDiff))
389389 then (priceDiff > (10000 - shutdownTrigger))
390390 else false
391391 let riskLevel = if (priceDiffOk)
392392 then 1
393393 else 2
394394 let newPricesSize = size(newPrices)
395395 if ((5 >= newPricesSize))
396396 then {
397397 let updPrices = makeString(newPrices, ",")
398398 [IntegerEntry((assetIdStr + "_twap5B"), newTwap), IntegerEntry((assetIdStr + "_lastBlock"), height), StringEntry((assetIdStr + "_lastPrices"), updPrices), IntegerEntry((assetIdStr + "_riskLevel"), riskLevel)]
399399 }
400400 else {
401401 let updPrices = makeString(removeByIndex(newPrices, (newPricesSize - 1)), ",")
402402 [IntegerEntry((assetIdStr + "_twap5B"), newTwap), IntegerEntry((assetIdStr + "_lastBlock"), height), StringEntry((assetIdStr + "_lastPrices"), updPrices), IntegerEntry((assetIdStr + "_riskLevel"), riskLevel)]
403403 }
404404 }
405405 }
406406 }
407407
408408
409409
410410 @Callable(i)
411411 func updateTokenPrice (assetIdStr) = {
412412 let tokenPrice = if ((assetIdStr == "WAVES"))
413413 then wavesPrice
414414 else if ((assetIdStr == xtnIdStr))
415415 then xtnUsdPriceX6
416416 else {
417417 let priceInPools = getTokenPrice(value(indexOf(tokenIds, assetIdStr)), wavesPrice)._1
418418 if ((assetIdStr == ethStr))
419419 then {
420420 let ethPrice = getIntegerValue(doraAddress, "%s%s__price__ETH-USDT")
421421 let comp = fraction(priceInPools, 10000, ethPrice)
422422 if (if ((comp > (10000 - oracleTolerance)))
423423 then ((10000 + oracleTolerance) > comp)
424424 else false)
425425 then priceInPools
426426 else throw("internal ETH price doesn't match with global price")
427427 }
428428 else if ((indexOf(stables, assetIdStr) != unit))
429429 then 1000000
430430 else priceInPools
431431 }
432432 let lastTwap = tryGetInteger((assetIdStr + "_twap5B"))
433433 let lastHeight = tryGetInteger((assetIdStr + "_lastBlock"))
434434 if ((i.originCaller != backendCaller))
435435 then throw("available for backend only")
436436 else if ((2 > (height - lastHeight)))
437437 then nil
438438 else if (if ((lastHeight == 0))
439439 then true
440440 else ((height - lastHeight) > 30))
441441 then [IntegerEntry((assetIdStr + "_twap5B"), tokenPrice), IntegerEntry((assetIdStr + "_lastBlock"), height), StringEntry((assetIdStr + "_lastPrices"), toString(tokenPrice))]
442442 else {
443443 let lastPrices = split(getStringValue((assetIdStr + "_lastPrices")), ",")
444444 let newPrices = toString(tokenPrice) :: lastPrices
445445 func sumHandler (accum,next) = (accum + parseIntValue(next))
446446
447447 let newTwap = ({
448448 let $l = newPrices
449449 let $s = size($l)
450450 let $acc0 = 0
451451 func $f0_1 ($a,$i) = if (($i >= $s))
452452 then $a
453453 else sumHandler($a, $l[$i])
454454
455455 func $f0_2 ($a,$i) = if (($i >= $s))
456456 then $a
457457 else throw("List size exceeds 6")
458458
459459 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
460460 } / size(newPrices))
461461 let orderbookTwapResult = getOrderbookTwap(assetIdStr)
462462 if ((orderbookTwapResult == orderbookTwapResult))
463463 then {
464464 let $t01961219670 = orderbookTwapResult
465465 let orderbookTwap = $t01961219670._1
466466 let orderbookLocked = $t01961219670._2
467467 let twapsComparison = if ((orderbookTwap != 0))
468468 then fraction(newTwap, 10000, orderbookTwap)
469469 else throw(("orderbook result zero for " + assetIdStr))
470470 let twapsSimilar = if ((twapsComparison > (10000 - oracleTolerance)))
471471 then ((10000 + oracleTolerance) > twapsComparison)
472472 else false
473473 let priceDiff = fraction(tokenPrice, 10000, parseIntValue(lastPrices[(size(lastPrices) - 1)]))
474474 let priceDiffOk = if (((10000 + shutdownTrigger) > priceDiff))
475475 then (priceDiff > (10000 - shutdownTrigger))
476476 else false
477477 let riskLevel = (((if (twapsSimilar)
478478 then 1
479479 else 2) + (if (orderbookLocked)
480480 then 1
481481 else 0)) + (if (!(priceDiffOk))
482482 then 1
483483 else 0))
484484 let newPricesSize = size(newPrices)
485485 if (!(twapsSimilar))
486486 then [IntegerEntry((assetIdStr + "_riskLevel"), riskLevel)]
487487 else if ((5 >= newPricesSize))
488488 then {
489489 let updPrices = makeString(newPrices, ",")
490490 [IntegerEntry((assetIdStr + "_twap5B"), newTwap), IntegerEntry((assetIdStr + "_lastBlock"), height), StringEntry((assetIdStr + "_lastPrices"), updPrices), IntegerEntry((assetIdStr + "_riskLevel"), riskLevel)]
491491 }
492492 else {
493493 let updPrices = makeString(removeByIndex(newPrices, (newPricesSize - 1)), ",")
494494 [IntegerEntry((assetIdStr + "_twap5B"), newTwap), IntegerEntry((assetIdStr + "_lastBlock"), height), StringEntry((assetIdStr + "_lastPrices"), updPrices), IntegerEntry((assetIdStr + "_riskLevel"), riskLevel)]
495495 }
496496 }
497497 else throw("Strict value is not equal to itself.")
498498 }
499499 }
500500
501501
502502
503503 @Callable(i)
504504 func updateTokens () = if ((i.originCaller != backendCaller))
505505 then throw("available for backend only")
506506 else {
507507 let i1 = invoke(this, "updateTokenPrice", ["WAVES"], nil)
508508 if ((i1 == i1))
509509 then {
510510 let i2 = invoke(this, "updateTokenPrice", [xtnIdStr], nil)
511511 if ((i2 == i2))
512512 then {
513513 func callu (accum,next) = {
514514 let i3 = invoke(this, "updateTokenPrice", [next], nil)
515515 if ((i3 == i3))
516516 then nil
517517 else throw("Strict value is not equal to itself.")
518518 }
519519
520520 let res = {
521521 let $l = tokenIds
522522 let $s = size($l)
523523 let $acc0 = nil
524524 func $f0_1 ($a,$i) = if (($i >= $s))
525525 then $a
526526 else callu($a, $l[$i])
527527
528528 func $f0_2 ($a,$i) = if (($i >= $s))
529529 then $a
530530 else throw("List size exceeds 20")
531531
532532 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
533533 }
534534 if ((res == res))
535535 then res
536536 else throw("Strict value is not equal to itself.")
537537 }
538538 else throw("Strict value is not equal to itself.")
539539 }
540540 else throw("Strict value is not equal to itself.")
541541 }
542542
543543
544544
545545 @Callable(i)
546546 func updateLPTokens () = if ((i.originCaller != backendCaller))
547547 then throw("available for backend only")
548548 else {
549549 func callu (accum,next) = {
550550 let i1 = invoke(this, "updateLpTokenPrice", [next], nil)
551551 if ((i1 == i1))
552552 then nil
553553 else throw("Strict value is not equal to itself.")
554554 }
555555
556556 let res = {
557557 let $l = lpTokenIds
558558 let $s = size($l)
559559 let $acc0 = nil
560560 func $f0_1 ($a,$i) = if (($i >= $s))
561561 then $a
562562 else callu($a, $l[$i])
563563
564564 func $f0_2 ($a,$i) = if (($i >= $s))
565565 then $a
566566 else throw("List size exceeds 20")
567567
568568 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
569569 }
570570 if ((res == res))
571571 then {
572572 let i2 = invoke(this, "updateWxLpTokenPrice", [wxLpTokenIds[0]], nil)
573573 if ((i2 == i2))
574574 then res
575575 else throw("Strict value is not equal to itself.")
576576 }
577577 else throw("Strict value is not equal to itself.")
578578 }
579579
580580
581581
582582 @Callable(i)
583583 func initNewMaster (master) = {
584584 let addressOK = match addressFromString(master) {
585585 case a: Address =>
586586 true
587587 case _ =>
588588 false
589589 }
590590 if (!(addressOK))
591591 then throw(("incorrect address " + master))
592592 else if ((i.caller != this))
593593 then throw("available for self call only")
594594 else [StringEntry("verifier_master", master)]
595595 }
596596
597597
598598
599599 @Callable(i)
600600 func requestNewMaster (newMaster) = {
601601 let addressOK = match addressFromString(newMaster) {
602602 case a: Address =>
603603 true
604604 case _ =>
605605 false
606606 }
607607 if (!(addressOK))
608608 then throw(("incorrect address " + newMaster))
609609 else if ((indexOf(sentinels, i.caller) == unit))
610610 then throw("whitelist only")
611611 else [StringEntry("verifier_newMaster", newMaster), IntegerEntry("verifier_newMasterEligibleAfter", (height + 10000))]
612612 }
613613
614614
615615
616616 @Callable(i)
617617 func activateNewMaster () = {
618618 let eligibleHeight = getIntegerValue(this, "verifier_newMasterEligibleAfter")
619619 let newMaster = getStringValue(this, "verifier_newMaster")
620620 if ((indexOf(sentinels, i.caller) == unit))
621621 then throw("whitelist only")
622622 else if ((eligibleHeight > height))
623623 then throw("new master cannot be activated yet")
624624 else [DeleteEntry("verifier_newMaster"), DeleteEntry("verifier_newMasterEligibleAfter"), StringEntry("verifier_master", newMaster)]
625625 }
626626
627627
628628 @Verifier(tx)
629629 func verify () = {
630630 let masterAddress = getString("verifier_master")
631631 let approvedByMaster = match masterAddress {
632632 case x: String =>
633633 match getInteger(addressFromStringValue(x), ("approvedTx_" + toBase58String(tx.id))) {
634634 case y: Int =>
635635 y
636636 case _ =>
637637 0
638638 }
639639 case _ =>
640640 1
641641 }
642642 if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
643643 then (approvedByMaster > 0)
644644 else false
645645 }
646646

github/deemru/w8io/3ef1775 
58.36 ms