tx · DtMtJBkSCLWH3FuBJoTzHbk9HuMe8oATKPctiBQjrxDQ

3PHMz1nGiPAHCFHfPQcW18ovsb5VgCCGzfJ:  -0.03000000 Waves

2023.11.12 20:12 [3906284] smart account 3PHMz1nGiPAHCFHfPQcW18ovsb5VgCCGzfJ > SELF 0.00000000 Waves

{ "type": 13, "id": "DtMtJBkSCLWH3FuBJoTzHbk9HuMe8oATKPctiBQjrxDQ", "fee": 3000000, "feeAssetId": null, "timestamp": 1699809161396, "version": 2, "chainId": 87, "sender": "3PHMz1nGiPAHCFHfPQcW18ovsb5VgCCGzfJ", "senderPublicKey": "75XcdocCZDdHda5bUegEwkcDk2Tt4i8yZcUzZmwS1ooA", "proofs": [ "2GaNm6rp9zC3wQP9TPJGGQUzribTVjgqGRN3NJ1CFFBRTkzaJGku8tDiJsZ4STg7erA35J3nNu7bSvgxLAdn4t4X" ], "script": "base64:BgIlCAISBAoCCAQSAwoBCBIDCgEIEgMKAQgSABIDCgEIEgMKAQgSACoABlNjYWxlOACAwtcvAAlzZW50aW5lbHMJAMwIAgkBB0FkZHJlc3MBARoBV9fhI1GOfKuIWtXXKJd12Ih104+uIwWm4QkAzAgCCQEHQWRkcmVzcwEBGgFX+Pr6AibAUYvsajtGM0nSHHGwdYv5pMqaCQDMCAIJAQdBZGRyZXNzAQEaAVdJARj2Q38/TGzhZ3Xlt+SXL95QLbKD3fEJAMwIAgkBB0FkZHJlc3MBARoBV0vDbM77M1hDWENREO7v7iEQF0vyeMt8MgUDbmlsAA1iYWNrZW5kQ2FsbGVyCQEHQWRkcmVzcwEBGgFXyRzX3kxfCwOAnK+8lTuIWsx/nKxErqNnAA9vcmRlcmJvb2tPcmFjbGUJAQdBZGRyZXNzAQEaAVfs5amJRv2jqqV4EvPVGpo1g91nsJ/FonYABXh0bklkASC2JinDBPXOU5GkDkt1JC9kjFGx+t+vVCm9SNIdKrKq0QAIeHRuSWRTdHICLERHMnhGa1BkRHdLVW9Ca3pHQWhRdExwU0d6ZlhMaUNZUEV6ZUtIMkFkMjRwAAZldGhTdHICLDNWdVY1V1RtRHo0N0RtZG4zUXBjWWp6YlNkaXBqUUU0Sk1kTmUxeFpwWDEzAAdzdGFibGVzCQDMCAICLDl3YzNMWE5BNFRFQnNYeUt0b0xFOW1yYkREN1dNSFh2WHJDalp2YWJMQXNpCQDMCAICLEhHZ2FiVHFVUzhXdFZGVUp6Zm1yVERNZ0VjY0p1WkxCUGhGZ1FGeHZuc29XBQNuaWwACHRva2VuSWRzCQDMCAICLDZuU3BWeU5IN3lNNjllZzQ0NndyUVI5NGlwYmJjbVpNVTFFTlB3YW5DOTdnCQDMCAICLEVoaWU1eFlwZU44b3AxQ2N0YzZhR1VycXg4anEzanRmMURTalhEYmZtN2FUCQDMCAICLDRMSEh2WUdOS0pVZzVoajY1YUdENXZnU2N2Q0JtTHBkUkZ0am9rdkNqU0w4CQDMCAICLEMxaVdzS0dxTHdqSFVuZGlRN2lYcGRtUHVtOVBlQ0RGZnlYQmRKSm9zRFJTCQDMCAICLDM0TjlZY0VFVExXbjkzcVlRNjRFc1AxeDg5dFNydUpVNDRSckVNU1hYRVBKCQDMCAICLDZYdEhqcFhiczlSUkpQMlNyOUdVeVZxekFDY2J5OVRrVGhIWG5qVkM1Q0RKCQDMCAICLEhFQjhRYXc5eHJXcFdzOHRIc2lBVFlHQldEQnRQMlM3a2NQQUxyTXU0M0FTCQDMCAICLEFqc282blRUanB0dTJVSEx4NmhmU1hWdEhGdFJCSkNrS1lkNVNBeWo3emY1CQDMCAICLERTYmJoTHNTVGVEZzVMc2l1ZmsyQW5laDNEalZxSnVQcjJNOXVVMWd3eTVwCQDMCAICLEF0cXY1OUVZempGR3VpdEtWbk1SazZIOEZ1a2pvVjNrdFBvcmJFeXMyNW9uCQDMCAICLDJ0aHNBQ3VIbXpETXVOZXpQTTMyd2c5YTNCd1V6QldEZVNLYWtnejNjdzIxCQDMCAICK1lpTmJvZkZ6QzE3akVISENNd3JSY3B5OU1ycmphYk1NTFp4ZzhnNXhtZjcJAMwIAgIsOHQ0RFBXVHdQenBhdEhBOUFrVHhXQUI0N1RIbll6QnNEbm9ZN2ZRcWJHOTEJAMwIAgIsQXQ4RDZORkZwaGVDYnZLVm5qVm9lTEw4NEVvOE5abjZvdk1hbnhmTGFGV0wJAMwIAgIsNnBoSzIyenRHQlcxMjdnVUZtZE1FSEtCM0NWZDZaaFdveDJXdHdKa2JxVHEJAMwIAgIsM1Z1VjVXVG1EejQ3RG1kbjNRcGNZanpiU2RpcGpRRTRKTWROZTF4WnBYMTMJAMwIAgIsOXdjM0xYTkE0VEVCc1h5S3RvTEU5bXJiREQ3V01IWHZYckNqWnZhYkxBc2kFA25pbAAQdG9rZW5Jc0Jhc2VBc3NldAkAzAgCBwkAzAgCBwkAzAgCBwkAzAgCBwkAzAgCBgkAzAgCBgkAzAgCBwkAzAgCBwkAzAgCBwkAzAgCBwkAzAgCBwkAzAgCBwkAzAgCBwkAzAgCBwkAzAgCBgkAzAgCBwkAzAgCBgkAzAgCBgUDbmlsAA10b2tlbkRlY2ltYWxzCQDMCAIAwIQ9CQDMCAIAgMLXLwkAzAgCAIDC1y8JAMwIAgCAwtcvCQDMCAIAwIQ9CQDMCAIAwIQ9CQDMCAIAgMLXLwkAzAgCAIDC1y8JAMwIAgCAwtcvCQDMCAIAgMLXLwkAzAgCAIDC1y8JAMwIAgCAwtcvCQDMCAIAgMLXLwkAzAgCAMCEPQkAzAgCAMCEPQkAzAgCAIDC1y8JAMwIAgDAhD0JAMwIAgDAhD0FA25pbAAPdG9rZW5XWFdhdmVzTFBzCQDMCAICLERaZUE3UmJWYWI5OHI2MWhWSDV6Y0ZaWHdOQUxQSkdncTFleUhhbmRzS0tXCQDMCAICLDcyRTRNTUZIbmdzaXhxQWtOWkNSSk1MVG1nQVA5bnVmZHNYZXhuUzVxeFZ4CQDMCAICLEZUVEpuQjZ4RzRDS1pFSk1nc2dxam1nYnpjeUg4eWEzdFY4TFFQMkdDRHM3CQDMCAICLDNVbnl0Tm5rZDQ4ZkhvZkhQQnA1OUJrcFpBMXVNU0o4UGRoV1VDdWVyaWNzCQDMCAICLEJ5SnRWdVlpNThDdGRqdGFzRHVUcXRnZXY4cVdrZEp5YkY3clkxeG9zbWhFCQDMCAICLEJvWHVmOWV3SlNFMVVNcktpYlptaWd6QzZ0Qnp2OFJGVGVabW9mRW9zMlpKCQDMCAICLDdHNjg3dWkzbTU5b0FkNnFreW5pMnZ0NzdiSEY0YmJBNnhjUGZEbzN1aVR1CQDMCAICLEVNc1pwcWNUOE51TVlaQ0VQSHp2cmhRQ1FLaGZYamRlZWtadmNXcEhzTnZoCQDMCAICLEUzWWhVUk5zQ21qVWFZTmlnSDZBYXlMeGJoOXU4MXVWR1UzWnZIS3puWTV2CQDMCAICLEJpU3pGZThuU0w3OG9aYWViZm9pbjV2Qlo1UHplNmQ3a2FlaWpMcXI1eFplCQDMCAICLEFLUXNFUW9laW5LUkZ0ZHg2cmhLV2Nwa0FNdTZjYkRMZHRTV25SOHRwQkNxCQDMCAICLERqZ3dXNENNSkVmcHpqN1NMRkZQaUNxZjF6Zm1BZ2YxTUQ1Z0FTOFNqS3Q0CQDMCAICAAkAzAgCAixGM3M5MlZSZHBwRXRMVkFQNjk3Q1RNNkF6WkpFQ1Jjb014NWtqMkZrR3Y0TQkAzAgCAiw2aU1CNkxLU3Jndjl3YUV2RW5ONllkeXg3ZGZ4UG5HY1R3ODMxOFdWbTViUgkAzAgCAixFNk1VR1NVaWVTc3E2UWlKY2JwNlJFZFFYeWpwNnVQV0xpdG5wOUdkdHN1aAkAzAgCAiw2S1dwbnBMazZHTmg1SEc5Y3Q5cE5EQ1lGV0pCb0FBc2hac3A0RDhqY0ZwVgkAzAgCAgAFA25pbAAPdG9rZW5XWFhUTlBvb2xzCQDMCAICAAkAzAgCAgAJAMwIAgIACQDMCAICIzNQM1kzOHp5bUNIb1RNNnFjRTlKY0VBOHJoYUdUUWJWTWd1CQDMCAICAAkAzAgCAgAJAMwIAgIjM1A2MTV5WGVROVF1NHFCTTFRR2ltR3ppeHlNUzVXNEt0dWcJAMwIAgIjM1BFa0Q1THVIR1doVWZnQlcxb3daRnhWeWRZb1dqVjZKaWEJAMwIAgIjM1A1SGpQb3dnaXBpVkIzVXZYcGhEaVB2S3M0MjRXQzl4UXcJAMwIAgIjM1BDRU5wRUtlOGF0d0VMWjdvQ1NtY2RFZmNSdUtUclV4OTkJAMwIAgIACQDMCAICAAkAzAgCAiMzUEg4MzJlS253NjdQRnZKZlVnOUtuejZCSE04N1F2ak1lTAkAzAgCAgAJAMwIAgIjM1BHY1l6b1VmUUVRa2hSZ3JCcW1HNVdwYzdBMW5jRnZSdE0JAMwIAgIACQDMCAICAAkAzAgCAgAFA25pbAAOdG9rZW5Td29wUG9vbHMJAMwIAgIjM1AyVjYzWGQ2QnZpRGtlTXp4aFV3MlNKeW9qQnlSejhhOG0JAMwIAgIjM1AyN1M5VjM2a3cyTWNqV1JaMzdBeFR4OGl3a2Q3SFh3NlcJAMwIAgIjM1A2RExkSlRQMkV5U3E5TUZkSnU2YmVVZXZyUWQyc1ZWQmgJAMwIAgIACQDMCAICAAkAzAgCAgAJAMwIAgIjM1BCSHlFd21FUlIxQ0VrclROYlBqMmJneWlzVGZQUnFmZWUJAMwIAgIjM1BEU1h3d0EyeEF0bXhlbzJiZWJEUDNBQTV5bloyS3JnbncJAMwIAgIjM1BKNDhQM3Ayd3ZXVWpnUWFRaVoyY0ZicjhxbXhNb2tCR2QJAMwIAgIjM1BLaTRHM1ZYMms0MlpTbU5Ocm12Z2RESDdKelJhVWhZN1IJAMwIAgIACQDMCAICAAkAzAgCAiMzUEN3dm5zMmRubW9iRDZaNGNSODZ2OThzN0xnTVpZeWdFeQkAzAgCAiMzUExwOUtyZHJiV0F2U0ZIR0pWRWFzelV1YnF1ejNNNm1mZQkAzAgCAgAJAMwIAgIACQDMCAICAAkAzAgCAgAFA25pbAAKbHBUb2tlbklkcwkAzAgCAiw5ZGJwU3I4ZDE4cVdReG41ZkpKU1MxTExROENtU1o2Z1ltanVQUnpnM1JCTQkAzAgCAiw5TUtpeFJ0OXJOUnlhSkNUMnBleGJYa3V2cFpCZEpSRWRUVTM2YkdpdDhpdwkAzAgCAiw2YlpiUm1vdTdNN3dYQnVuTVhRblo0Um02Nkh4WkYzS2ZNRWlGd2szd21uQQUDbmlsAAtscFRva2VuQmFzZQkAzAgCAixBdHF2NTlFWXpqRkd1aXRLVm5NUms2SDhGdWtqb1Yza3RQb3JiRXlzMjVvbgkAzAgCAgVXQVZFUwkAzAgCAgVXQVZFUwUDbmlsAAtscFRva2VuUG9vbAkAzAgCCQEHQWRkcmVzcwEBGgFXvqZKKL0AmV6HkDvqiEurumOAsX9RSwQNCQDMCAIJAQdBZGRyZXNzAQEaAVca7HBuLiyXrgDVM25HbSMR/1KgAnA91asJAMwIAgkBB0FkZHJlc3MBARoBV3d/C10uHsD5Iu4ETQIKuwPrdpc7IIHrJgUDbmlsABBscFRva2VuQmFzZVNoYXJlCQDMCAIAgIenDgkAzAgCAIDaxAkJAMwIAgCA2sQJBQNuaWwADHd4THBUb2tlbklkcwkAzAgCAityWk1RNmczMUxyN3NQQWFBb1ljNFUyUEhDVmF1VHVLVVN6VWJKdFV5UFpOBQNuaWwADnd4THBVbmRlcmx5aW5nCQDMCAIJAMwIAgIsOXdjM0xYTkE0VEVCc1h5S3RvTEU5bXJiREQ3V01IWHZYckNqWnZhYkxBc2kJAMwIAgIsSEdnYWJUcVVTOFd0VkZVSnpmbXJURE1nRWNjSnVaTEJQaEZnUUZ4dm5zb1cFA25pbAUDbmlsABF3eF9yZXN0QWRkcmVzc1N0cgIjM1A4TW9QbnNhdXJvZmsxVnloc2RBRmtlUTZpanBKWVhDcFcAC3d4X3Jlc3REYXBwCQERQGV4dHJOYXRpdmUoMTA2MikBBRF3eF9yZXN0QWRkcmVzc1N0cgAMc3dvcFJlc3REYXBwCQERQGV4dHJOYXRpdmUoMTA2MikBAiMzUDU2ak5RekVDWG5yV3BuYmJTSkt3N0Vvb282ZmtVYU1QcAAPb3JhY2xlVG9sZXJhbmNlAOgHAA9zaHV0ZG93blRyaWdnZXIAuBcAC3JldmlzaW9uTnVtAgAAA1NFUAICX18BCGFzU3RyaW5nAQF2BAckbWF0Y2gwBQF2AwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAUBcwkAAgECGGZhaWwgdG8gY2FzdCBpbnRvIFN0cmluZwEFYXNJbnQBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIDSW50BAFpBQckbWF0Y2gwBQFpCQACAQIVZmFpbCB0byBjYXN0IGludG8gSW50AQ10cnlHZXRJbnRlZ2VyAQNrZXkEByRtYXRjaDAJAJoIAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACA0ludAQBYgUHJG1hdGNoMAUBYgAAAQ1nZXRBc3NldEJ5dGVzAQphc3NldElkU3RyAwkAAAIFCmFzc2V0SWRTdHICBVdBVkVTBQR1bml0CQDZBAEFCmFzc2V0SWRTdHIADmRvcmFBZGRyZXNzU3RyAiMzUEtrb2pLZGQ2QkJ6VGYxUlhiUVZmVURyYU5GWFhIS3pRRgALZG9yYUFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDmRvcmFBZGRyZXNzU3RyAA14dG5Vc2RQcmljZVg2CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgULZG9yYUFkZHJlc3MCFiVzJXNfX3ByaWNlX19VU0ROLVVTRFQCJERPUkEgZG9lc24ndCBjb250YWluIFVTRE4vVVNEVCBwcmljZQENZ2V0VG9rZW5QcmljZQIIdG9rZW5OdW0Pd2F2ZXNVc2RQcmljZVg2BAp0b2tlbklkU3RyCQCRAwIFCHRva2VuSWRzBQh0b2tlbk51bQQHdG9rZW5JZAkA2QQBBQp0b2tlbklkU3RyAwkBAiE9AgkAzwgCBQdzdGFibGVzBQp0b2tlbklkU3RyBQR1bml0CQCUCgIAwIQ9AhJzdGFibGUgdG9rZW4gcHJpY2UEDXd4X1QxV2F2ZXNfbHAJAJEDAgUPdG9rZW5XWFdhdmVzTFBzBQh0b2tlbk51bQQLJHQwNTgzMzY1NDkDCQAAAgUNd3hfVDFXYXZlc19scAIACQCUCgIAAAAABAx3eFJlc3RSZXN1bHQJALUJAgkBCGFzU3RyaW5nAQkA/AcEBQt3eF9yZXN0RGFwcAIRcG9vbFN0YXRzUkVBRE9OTFkJAMwIAgUNd3hfVDFXYXZlc19scAUDbmlsBQNuaWwCAl9fBAskdDA2MDU3NjE0OQMJAJEDAgUQdG9rZW5Jc0Jhc2VBc3NldAUIdG9rZW5OdW0JAJQKAgABAAIJAJQKAgACAAEEDndhdmVzSW5QYWlyTnVtCAULJHQwNjA1NzYxNDkCXzEEDnRva2VuSW5QYWlyTnVtCAULJHQwNjA1NzYxNDkCXzIEEnd4X1QxV2F2ZXNfV0FWRVN4OAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDHd4UmVzdFJlc3VsdAUOd2F2ZXNJblBhaXJOdW0ED3d4X1QxV2F2ZXNfVDF4OAkAawMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQx3eFJlc3RSZXN1bHQFDnRva2VuSW5QYWlyTnVtAIDC1y8JAJEDAgUNdG9rZW5EZWNpbWFscwUIdG9rZW5OdW0EF3d4X1QxV2F2ZXNfVDFVc2RQcmljZVg2CQBrAwUSd3hfVDFXYXZlc19XQVZFU3g4BQ93YXZlc1VzZFByaWNlWDYFD3d4X1QxV2F2ZXNfVDF4OAQRd3hfVDFXYXZlc19XZWlnaHQFD3d4X1QxV2F2ZXNfVDF4OAkAlAoCBRd3eF9UMVdhdmVzX1QxVXNkUHJpY2VYNgURd3hfVDFXYXZlc19XZWlnaHQEF3d4X1QxV2F2ZXNfVDFVc2RQcmljZVg2CAULJHQwNTgzMzY1NDkCXzEEEXd4X1QxV2F2ZXNfV2VpZ2h0CAULJHQwNTgzMzY1NDkCXzIEE3d4X1QxWHRuX0FkZHJlc3NTdHIJAJEDAgUPdG9rZW5XWFhUTlBvb2xzBQh0b2tlbk51bQQLJHQwNjYxMTcwNDIDCQAAAgUTd3hfVDFYdG5fQWRkcmVzc1N0cgIACQCUCgIAAAAABBB3eF9UMVh0bl9BZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBRN3eF9UMVh0bl9BZGRyZXNzU3RyBA53eF9UMVh0bl9YVE54NgkA8AcCBRB3eF9UMVh0bl9BZGRyZXNzBQV4dG5JZAQNd3hfVDFYdG5fVDF4OAkA8AcCBRB3eF9UMVh0bl9BZGRyZXNzBQd0b2tlbklkCQCUCgIJAGsDCQBoAgUOd3hfVDFYdG5fWFROeDYJAGkCCQCRAwIFDXRva2VuRGVjaW1hbHMFCHRva2VuTnVtAMCEPQUNeHRuVXNkUHJpY2VYNgUNd3hfVDFYdG5fVDF4OAUNd3hfVDFYdG5fVDF4OAQVd3hfVDFYdG5fVDFVc2RQcmljZVg2CAULJHQwNjYxMTcwNDICXzEED3d4X1QxWHRuX1dlaWdodAgFCyR0MDY2MTE3MDQyAl8yBBVzd29wX1QxWHRuX0FkZHJlc3NTdHIJAJEDAgUOdG9rZW5Td29wUG9vbHMFCHRva2VuTnVtBAskdDA3MTA1NzcyMwMJAAACBRVzd29wX1QxWHRuX0FkZHJlc3NTdHICAAkAlAoCAAAAAAQSc3dvcF9UMVh0bl9BZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBRVzd29wX1QxWHRuX0FkZHJlc3NTdHIEF3N3b3BfVDFYdG5fVDFYdG5QcmljZVg2CQEFYXNJbnQBCQD8BwQFDHN3b3BSZXN0RGFwcAIRY2FsY0dldEFtb3VudENQTU0JAMwIAgUVc3dvcF9UMVh0bl9BZGRyZXNzU3RyCQDMCAICIzNQODhxazFLekYxQktqRDdmQzdMak5WQUtNNGV6ZmY1V0U2CQDMCAIFCnRva2VuSWRTdHIJAMwIAgkAkQMCBQ10b2tlbkRlY2ltYWxzBQh0b2tlbk51bQUDbmlsBQNuaWwEF3N3b3BfVDFYdG5fVDFVc2RQcmljZVg2CQBrAwUXc3dvcF9UMVh0bl9UMVh0blByaWNlWDYFDXh0blVzZFByaWNlWDYAwIQ9BBFzd29wX1QxWHRuX1dlaWdodAkBEUBleHRyTmF0aXZlKDEwNTApAgUSc3dvcF9UMVh0bl9BZGRyZXNzAg9BX2Fzc2V0X2JhbGFuY2UJAJQKAgUXc3dvcF9UMVh0bl9UMVVzZFByaWNlWDYFEXN3b3BfVDFYdG5fV2VpZ2h0BBdzd29wX1QxWHRuX1QxVXNkUHJpY2VYNggFCyR0MDcxMDU3NzIzAl8xBBFzd29wX1QxWHRuX1dlaWdodAgFCyR0MDcxMDU3NzIzAl8yBAFXCQBkAgkAZAIFEXd4X1QxV2F2ZXNfV2VpZ2h0BQ93eF9UMVh0bl9XZWlnaHQFEXN3b3BfVDFYdG5fV2VpZ2h0BAxUMVVzZFByaWNlWDYJAGQCCQBkAgkAawMFF3d4X1QxV2F2ZXNfVDFVc2RQcmljZVg2BRF3eF9UMVdhdmVzX1dlaWdodAUBVwkAawMFFXd4X1QxWHRuX1QxVXNkUHJpY2VYNgUPd3hfVDFYdG5fV2VpZ2h0BQFXCQBrAwUXc3dvcF9UMVh0bl9UMVVzZFByaWNlWDYFEXN3b3BfVDFYdG5fV2VpZ2h0BQFXBAVkZWJ1ZwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg1UMVVzZFByaWNlWDY9CQCkAwEFDFQxVXNkUHJpY2VYNgIZIHd4X1QxV2F2ZXNfVDFVc2RQcmljZVg2PQkApAMBBRd3eF9UMVdhdmVzX1QxVXNkUHJpY2VYNgIXIHd4X1QxWHRuX1QxVXNkUHJpY2VYNj0JAKQDAQUVd3hfVDFYdG5fVDFVc2RQcmljZVg2Ahkgc3dvcF9UMVh0bl9UMVVzZFByaWNlWDY9CQCkAwEFF3N3b3BfVDFYdG5fVDFVc2RQcmljZVg2CQCUCgIFDFQxVXNkUHJpY2VYNgUFZGVidWcAE2xhc3RVcGRhdGVkQmxvY2tLZXkCEGxhc3RVcGRhdGVkQmxvY2sAB24xNUxpc3QJAMwIAgABCQDMCAIAAQkAzAgCAAEJAMwIAgABCQDMCAIAAQkAzAgCAAEJAMwIAgABCQDMCAIAAQkAzAgCAAEJAMwIAgABCQDMCAIAAQkAzAgCAAEJAMwIAgABCQDMCAIAAQkAzAgCAAEFA25pbAEPZ2V0UHJpY2VEYXRhS2V5AgVibG9jawd0b2tlbklkCQCsAgIJAKwCAgkArAICAgZibG9ja18JAKQDAQUFYmxvY2sCAV8FB3Rva2VuSWQBDWdldFByaWNlVmFsdWUCB3Rva2VuSWQFYmxvY2sJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPb3JkZXJib29rT3JhY2xlCQEPZ2V0UHJpY2VEYXRhS2V5AgUFYmxvY2sFB3Rva2VuSWQAAAETZ2V0TGFzdFVwZGF0ZWRCbG9jawAEEGxhc3RVcGRhdGVkQmxvY2sJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ9vcmRlcmJvb2tPcmFjbGUFE2xhc3RVcGRhdGVkQmxvY2tLZXkCIExhc3QgdXBkYXRlZCBibG9jayBrZXkgbm90IGZvdW5kAwkAZwIAAAUQbGFzdFVwZGF0ZWRCbG9jawkAAgECE0ludmFsaWQgYmxvY2sgdmFsdWUDCQBmAgkAZQIFBmhlaWdodAUQbGFzdFVwZGF0ZWRCbG9jawAKCQACAQIuVGhlIHByaWNlIGhhcyBub3QgYmVlbiB1cGRhdGVkIGZvciBhIGxvbmcgdGltZQUQbGFzdFVwZGF0ZWRCbG9jawEMZ2V0UHJpY2VMaXN0AgVhY2N1bQRuZXh0BAskdDA5MTY0OTIwNQUFYWNjdW0EBnJlc3VsdAgFCyR0MDkxNjQ5MjA1Al8xBAVibG9jawgFCyR0MDkxNjQ5MjA1Al8yBAd0b2tlbklkCAULJHQwOTE2NDkyMDUCXzMEA3N1bQgFCyR0MDkxNjQ5MjA1Al80BApwcmljZVZhbHVlCQENZ2V0UHJpY2VWYWx1ZQIFB3Rva2VuSWQFBWJsb2NrBAluZXh0QmxvY2sJAGUCBQVibG9jawUEbmV4dAMJAGYCBQpwcmljZVZhbHVlAAAJAJYKBAkAzQgCBQZyZXN1bHQFCnByaWNlVmFsdWUFCW5leHRCbG9jawUHdG9rZW5JZAkAZAIFA3N1bQUKcHJpY2VWYWx1ZQkAlgoEBQZyZXN1bHQFCW5leHRCbG9jawUHdG9rZW5JZAUDc3VtARBnZXRPcmRlcmJvb2tUd2FwAQp0b2tlbklkU3RyBANpbnYJAPwHBAUEdGhpcwISZ2V0T3JkZXJib29rVHdhcDE1CQDMCAIFCnRva2VuSWRTdHIJAMwIAgcFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BA5vcmRlcmJvb2tQcmljZQoAAUAFA2ludgMJAAECBQFAAg4oSW50LCBCb29sZWFuKQUBQAkAAgEJAKwCAgkAAwEFAUACIyBjb3VsZG4ndCBiZSBjYXN0IHRvIChJbnQsIEJvb2xlYW4pAwkAAAIFDm9yZGVyYm9va1ByaWNlBQ5vcmRlcmJvb2tQcmljZQUOb3JkZXJib29rUHJpY2UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4IAWkBEmdldE9yZGVyYm9va1R3YXAxNQIHdG9rZW5JZAVkZWJ1ZwQQbGFzdFVwZGF0ZWRCbG9jawkBE2dldExhc3RVcGRhdGVkQmxvY2sABAV0dXBsZQoAAiRsBQduMTVMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlgoEBQNuaWwFEGxhc3RVcGRhdGVkQmxvY2sFB3Rva2VuSWQAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEMZ2V0UHJpY2VMaXN0AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQKcHJpY2VzTGlzdAgFBXR1cGxlAl8xBANzdW0IBQV0dXBsZQJfNAQHYXZlcmFnZQkAawMFA3N1bQDAhD0JAGsDCQCQAwEFCnByaWNlc0xpc3QAwIQ9AAEECGlzTG9ja2VkCQELdmFsdWVPckVsc2UCCQCbCAIFD29yZGVyYm9va09yYWNsZQkArAICBQd0b2tlbklkAgdfbG9ja2VkBwMFBWRlYnVnCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCWF2ZXJhZ2U6IAkApAMBBQdhdmVyYWdlAgwsIGlzTG9ja2VkOiAJAKUDAQUIaXNMb2NrZWQCAiwgAg9wcmljZUxpc3RTaXplOiAJAKQDAQkAkAMBBQpwcmljZXNMaXN0AgcsIHN1bTogCQCkAwEFA3N1bQkAlAoCBQNuaWwJAJQKAgUHYXZlcmFnZQUIaXNMb2NrZWQBaQEUdXBkYXRlV3hMcFRva2VuUHJpY2UBCmFzc2V0SWRTdHIECndhdmVzUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFC2RvcmFBZGRyZXNzAhclcyVzX19wcmljZV9fV0FWRVMtVVNEVAQIdG9rZW5OdW0JAQV2YWx1ZQEJAM8IAgUMd3hMcFRva2VuSWRzBQphc3NldElkU3RyBAp1bmRlcmx5aW5nCQCRAwIFDnd4THBVbmRlcmx5aW5nBQh0b2tlbk51bQQQdW5kZXJseWluZzFQcmljZQMJAAACCQCRAwIFCnVuZGVybHlpbmcAAAIFV0FWRVMFCndhdmVzUHJpY2UDCQECIT0CCQDPCAIFB3N0YWJsZXMJAJEDAgUKdW5kZXJseWluZwAABQR1bml0AMCEPQgJAQ1nZXRUb2tlblByaWNlAgkBBXZhbHVlAQkAzwgCBQh0b2tlbklkcwkAkQMCBQp1bmRlcmx5aW5nAAAFCndhdmVzUHJpY2UCXzEEE3VuZGVybHlpbmcxRGVjaW1hbHMDCQAAAgkAkQMCBQp1bmRlcmx5aW5nAAACBVdBVkVTAAgJAQV2YWx1ZQEICQEFdmFsdWUBCQDsBwEJANkEAQkAkQMCBQp1bmRlcmx5aW5nAAAIZGVjaW1hbHMEEHVuZGVybHlpbmcyUHJpY2UDCQAAAgkAkQMCBQp1bmRlcmx5aW5nAAECBVdBVkVTBQp3YXZlc1ByaWNlAwkBAiE9AgkAzwgCBQdzdGFibGVzCQCRAwIFCnVuZGVybHlpbmcAAQUEdW5pdADAhD0ICQENZ2V0VG9rZW5QcmljZQIJAQV2YWx1ZQEJAM8IAgUIdG9rZW5JZHMJAJEDAgUKdW5kZXJseWluZwABBQp3YXZlc1ByaWNlAl8xBBN1bmRlcmx5aW5nMkRlY2ltYWxzAwkAAAIJAJEDAgUKdW5kZXJseWluZwABAgVXQVZFUwAICQEFdmFsdWUBCAkBBXZhbHVlAQkA7AcBCQDZBAEJAJEDAgUKdW5kZXJseWluZwABCGRlY2ltYWxzBBB1bmRlcmx5aW5nMVNjYWxlAwkAAAIFE3VuZGVybHlpbmcxRGVjaW1hbHMACAUGU2NhbGU4AMCEPQQQdW5kZXJseWluZzJTY2FsZQMJAAACBRN1bmRlcmx5aW5nMkRlY2ltYWxzAAgFBlNjYWxlOADAhD0EA2ludgoAAUAJAPwHBAULd3hfcmVzdERhcHACF3Bvb2xFdmFsdWF0ZUdldFJFQURPTkxZCQDMCAIFCmFzc2V0SWRTdHIJAMwIAgCAwtcvBQNuaWwFA25pbAMJAAECBQFAAgZTdHJpbmcFAUAJAAIBCQCsAgIJAAMBBQFAAhsgY291bGRuJ3QgYmUgY2FzdCB0byBTdHJpbmcDCQAAAgUDaW52BQNpbnYEBHZhbHMJALUJAgUDaW52AgJfXwQRdW5kZXJseWluZzFBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQR2YWxzAAEEEXVuZGVybHlpbmcyQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEdmFscwACBAp0b2tlblByaWNlCQBkAgkAawMFEHVuZGVybHlpbmcxUHJpY2UFEXVuZGVybHlpbmcxQW1vdW50BRB1bmRlcmx5aW5nMVNjYWxlCQBrAwUQdW5kZXJseWluZzJQcmljZQURdW5kZXJseWluZzJBbW91bnQFEHVuZGVybHlpbmcyU2NhbGUECGxhc3RUd2FwCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgUKYXNzZXRJZFN0cgIHX3R3YXA1QgQKbGFzdEhlaWdodAkBDXRyeUdldEludGVnZXIBCQCsAgIFCmFzc2V0SWRTdHICCl9sYXN0QmxvY2sDCQECIT0CCAUBaQxvcmlnaW5DYWxsZXIFDWJhY2tlbmRDYWxsZXIJAAIBAhphdmFpbGFibGUgZm9yIGJhY2tlbmQgb25seQMJAGYCAAIJAGUCBQZoZWlnaHQFCmxhc3RIZWlnaHQFA25pbAMDCQAAAgUKbGFzdEhlaWdodAAABgkAZgIJAGUCBQZoZWlnaHQFCmxhc3RIZWlnaHQAZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQphc3NldElkU3RyAgdfdHdhcDVCBQp0b2tlblByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCmFzc2V0SWRTdHICCl9sYXN0QmxvY2sFBmhlaWdodAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCmFzc2V0SWRTdHICC19sYXN0UHJpY2VzCQCkAwEFCnRva2VuUHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYXNzZXRJZFN0cgIKX3Jpc2tMZXZlbAABBQNuaWwECmxhc3RQcmljZXMJALUJAgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQphc3NldElkU3RyAgtfbGFzdFByaWNlcwIBLAQJbmV3UHJpY2VzCQDMCAIJAKQDAQUKdG9rZW5QcmljZQUKbGFzdFByaWNlcwoBCnN1bUhhbmRsZXICBWFjY3VtBG5leHQJAGQCBQVhY2N1bQkBDXBhcnNlSW50VmFsdWUBBQRuZXh0BAduZXdUd2FwCQBpAgoAAiRsBQluZXdQcmljZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCnN1bUhhbmRsZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYJAJADAQUJbmV3UHJpY2VzBAlwcmljZURpZmYJAGsDBQp0b2tlblByaWNlAJBOCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKbGFzdFByaWNlcwkAZQIJAJADAQUKbGFzdFByaWNlcwABBAtwcmljZURpZmZPawMJAGYCCQBkAgCQTgUPc2h1dGRvd25UcmlnZ2VyBQlwcmljZURpZmYJAGYCBQlwcmljZURpZmYJAGUCAJBOBQ9zaHV0ZG93blRyaWdnZXIHBAlyaXNrTGV2ZWwDBQtwcmljZURpZmZPawABAAIDCQBnAgAFCQCQAwEFCW5ld1ByaWNlcwQJdXBkUHJpY2VzCQC5CQIFCW5ld1ByaWNlcwIBLAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQphc3NldElkU3RyAgdfdHdhcDVCBQduZXdUd2FwCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCmFzc2V0SWRTdHICCl9sYXN0QmxvY2sFBmhlaWdodAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCmFzc2V0SWRTdHICC19sYXN0UHJpY2VzBQl1cGRQcmljZXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYXNzZXRJZFN0cgIKX3Jpc2tMZXZlbAUJcmlza0xldmVsBQNuaWwECXVwZFByaWNlcwkAuQkCCQDRCAIFCW5ld1ByaWNlcwkAZQIJAJADAQUJbmV3UHJpY2VzAAECASwJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYXNzZXRJZFN0cgIHX3R3YXA1QgUHbmV3VHdhcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQphc3NldElkU3RyAgpfbGFzdEJsb2NrBQZoZWlnaHQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQphc3NldElkU3RyAgtfbGFzdFByaWNlcwUJdXBkUHJpY2VzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCmFzc2V0SWRTdHICCl9yaXNrTGV2ZWwFCXJpc2tMZXZlbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEnVwZGF0ZUxwVG9rZW5QcmljZQEKYXNzZXRJZFN0cgQKd2F2ZXNQcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgULZG9yYUFkZHJlc3MCFyVzJXNfX3ByaWNlX19XQVZFUy1VU0RUBAh0b2tlbk51bQkBBXZhbHVlAQkAzwgCBQpscFRva2VuSWRzBQphc3NldElkU3RyBAliYXNlSWRTdHIJAJEDAgULbHBUb2tlbkJhc2UFCHRva2VuTnVtBAliYXNlUHJpY2UDCQAAAgUJYmFzZUlkU3RyAgVXQVZFUwUKd2F2ZXNQcmljZQgJAQ1nZXRUb2tlblByaWNlAgkBBXZhbHVlAQkAzwgCBQh0b2tlbklkcwUJYmFzZUlkU3RyBQp3YXZlc1ByaWNlAl8xBAxiYXNlUXVhbnRpdHkJARFAZXh0ck5hdGl2ZSgxMDUwKQIJAJEDAgULbHBUb2tlblBvb2wFCHRva2VuTnVtCQCsAgIJAKwCAgIHZ2xvYmFsXwUJYmFzZUlkU3RyAghfYmFsYW5jZQQNdG9rZW5RdWFudGl0eQgJAQV2YWx1ZQEJAOwHAQkBBXZhbHVlAQkBDWdldEFzc2V0Qnl0ZXMBBQphc3NldElkU3RyCHF1YW50aXR5BAp0b2tlblByaWNlCQBrAwkAawMJAGsDBQliYXNlUHJpY2UFDGJhc2VRdWFudGl0eQDAhD0FBlNjYWxlOAkAkQMCBRBscFRva2VuQmFzZVNoYXJlBQh0b2tlbk51bQDAhD0FDXRva2VuUXVhbnRpdHkECGxhc3RUd2FwCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgUKYXNzZXRJZFN0cgIHX3R3YXA1QgQKbGFzdEhlaWdodAkBDXRyeUdldEludGVnZXIBCQCsAgIFCmFzc2V0SWRTdHICCl9sYXN0QmxvY2sDCQECIT0CCAUBaQxvcmlnaW5DYWxsZXIFDWJhY2tlbmRDYWxsZXIJAAIBAhphdmFpbGFibGUgZm9yIGJhY2tlbmQgb25seQMJAGYCAAIJAGUCBQZoZWlnaHQFCmxhc3RIZWlnaHQFA25pbAMDCQAAAgUKbGFzdEhlaWdodAAABgkAZgIJAGUCBQZoZWlnaHQFCmxhc3RIZWlnaHQAZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQphc3NldElkU3RyAgdfdHdhcDVCBQp0b2tlblByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCmFzc2V0SWRTdHICCl9sYXN0QmxvY2sFBmhlaWdodAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCmFzc2V0SWRTdHICC19sYXN0UHJpY2VzCQCkAwEFCnRva2VuUHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYXNzZXRJZFN0cgIKX3Jpc2tMZXZlbAABBQNuaWwECmxhc3RQcmljZXMJALUJAgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQphc3NldElkU3RyAgtfbGFzdFByaWNlcwIBLAQJbmV3UHJpY2VzCQDMCAIJAKQDAQUKdG9rZW5QcmljZQUKbGFzdFByaWNlcwoBCnN1bUhhbmRsZXICBWFjY3VtBG5leHQJAGQCBQVhY2N1bQkBDXBhcnNlSW50VmFsdWUBBQRuZXh0BAduZXdUd2FwCQBpAgoAAiRsBQluZXdQcmljZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCnN1bUhhbmRsZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYJAJADAQUJbmV3UHJpY2VzBAlwcmljZURpZmYJAGsDBQp0b2tlblByaWNlAJBOCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKbGFzdFByaWNlcwkAZQIJAJADAQUKbGFzdFByaWNlcwABBAtwcmljZURpZmZPawMJAGYCCQBkAgCQTgUPc2h1dGRvd25UcmlnZ2VyBQlwcmljZURpZmYJAGYCBQlwcmljZURpZmYJAGUCAJBOBQ9zaHV0ZG93blRyaWdnZXIHBAlyaXNrTGV2ZWwDBQtwcmljZURpZmZPawABAAIDCQBnAgAFCQCQAwEFCW5ld1ByaWNlcwQJdXBkUHJpY2VzCQC5CQIFCW5ld1ByaWNlcwIBLAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQphc3NldElkU3RyAgdfdHdhcDVCBQduZXdUd2FwCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCmFzc2V0SWRTdHICCl9sYXN0QmxvY2sFBmhlaWdodAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCmFzc2V0SWRTdHICC19sYXN0UHJpY2VzBQl1cGRQcmljZXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYXNzZXRJZFN0cgIKX3Jpc2tMZXZlbAUJcmlza0xldmVsBQNuaWwECXVwZFByaWNlcwkAuQkCCQDRCAIFCW5ld1ByaWNlcwkAZQIJAJADAQUJbmV3UHJpY2VzAAECASwJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYXNzZXRJZFN0cgIHX3R3YXA1QgUHbmV3VHdhcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQphc3NldElkU3RyAgpfbGFzdEJsb2NrBQZoZWlnaHQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQphc3NldElkU3RyAgtfbGFzdFByaWNlcwUJdXBkUHJpY2VzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCmFzc2V0SWRTdHICCl9yaXNrTGV2ZWwFCXJpc2tMZXZlbAUDbmlsAWkBEHVwZGF0ZVRva2VuUHJpY2UBCmFzc2V0SWRTdHIECndhdmVzUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFC2RvcmFBZGRyZXNzAhclcyVzX19wcmljZV9fV0FWRVMtVVNEVAQKdG9rZW5QcmljZQMJAAACBQphc3NldElkU3RyAgVXQVZFUwUKd2F2ZXNQcmljZQMJAAACBQphc3NldElkU3RyBQh4dG5JZFN0cgUNeHRuVXNkUHJpY2VYNgQMcHJpY2VJblBvb2xzCAkBDWdldFRva2VuUHJpY2UCCQEFdmFsdWUBCQDPCAIFCHRva2VuSWRzBQphc3NldElkU3RyBQp3YXZlc1ByaWNlAl8xAwkAAAIFCmFzc2V0SWRTdHIFBmV0aFN0cgQIZXRoUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFC2RvcmFBZGRyZXNzAhUlcyVzX19wcmljZV9fRVRILVVTRFQEBGNvbXAJAGsDBQxwcmljZUluUG9vbHMAkE4FCGV0aFByaWNlAwMJAGYCBQRjb21wCQBlAgCQTgUPb3JhY2xlVG9sZXJhbmNlCQBmAgkAZAIAkE4FD29yYWNsZVRvbGVyYW5jZQUEY29tcAcFDHByaWNlSW5Qb29scwkAAgECMmludGVybmFsIEVUSCBwcmljZSBkb2Vzbid0IG1hdGNoIHdpdGggZ2xvYmFsIHByaWNlAwkBAiE9AgkAzwgCBQdzdGFibGVzBQphc3NldElkU3RyBQR1bml0AMCEPQUMcHJpY2VJblBvb2xzBAhsYXN0VHdhcAkBDXRyeUdldEludGVnZXIBCQCsAgIFCmFzc2V0SWRTdHICB190d2FwNUIECmxhc3RIZWlnaHQJAQ10cnlHZXRJbnRlZ2VyAQkArAICBQphc3NldElkU3RyAgpfbGFzdEJsb2NrAwkBAiE9AggFAWkMb3JpZ2luQ2FsbGVyBQ1iYWNrZW5kQ2FsbGVyCQACAQIaYXZhaWxhYmxlIGZvciBiYWNrZW5kIG9ubHkDCQBmAgACCQBlAgUGaGVpZ2h0BQpsYXN0SGVpZ2h0BQNuaWwDAwkAAAIFCmxhc3RIZWlnaHQAAAYJAGYCCQBlAgUGaGVpZ2h0BQpsYXN0SGVpZ2h0AB4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYXNzZXRJZFN0cgIHX3R3YXA1QgUKdG9rZW5QcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQphc3NldElkU3RyAgpfbGFzdEJsb2NrBQZoZWlnaHQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQphc3NldElkU3RyAgtfbGFzdFByaWNlcwkApAMBBQp0b2tlblByaWNlBQNuaWwECmxhc3RQcmljZXMJALUJAgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQphc3NldElkU3RyAgtfbGFzdFByaWNlcwIBLAQJbmV3UHJpY2VzCQDMCAIJAKQDAQUKdG9rZW5QcmljZQUKbGFzdFByaWNlcwoBCnN1bUhhbmRsZXICBWFjY3VtBG5leHQJAGQCBQVhY2N1bQkBDXBhcnNlSW50VmFsdWUBBQRuZXh0BAduZXdUd2FwCQBpAgoAAiRsBQluZXdQcmljZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCnN1bUhhbmRsZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYJAJADAQUJbmV3UHJpY2VzBBNvcmRlcmJvb2tUd2FwUmVzdWx0CQEQZ2V0T3JkZXJib29rVHdhcAEFCmFzc2V0SWRTdHIDCQAAAgUTb3JkZXJib29rVHdhcFJlc3VsdAUTb3JkZXJib29rVHdhcFJlc3VsdAQNJHQwMTgwNDcxODEwNQUTb3JkZXJib29rVHdhcFJlc3VsdAQNb3JkZXJib29rVHdhcAgFDSR0MDE4MDQ3MTgxMDUCXzEED29yZGVyYm9va0xvY2tlZAgFDSR0MDE4MDQ3MTgxMDUCXzIED3R3YXBzQ29tcGFyaXNvbgMJAQIhPQIFDW9yZGVyYm9va1R3YXAAAAkAawMFB25ld1R3YXAAkE4FDW9yZGVyYm9va1R3YXAJAAIBCQCsAgICGm9yZGVyYm9vayByZXN1bHQgemVybyBmb3IgBQphc3NldElkU3RyBAx0d2Fwc1NpbWlsYXIDCQBmAgUPdHdhcHNDb21wYXJpc29uCQBlAgCQTgUPb3JhY2xlVG9sZXJhbmNlCQBmAgkAZAIAkE4FD29yYWNsZVRvbGVyYW5jZQUPdHdhcHNDb21wYXJpc29uBwQJcHJpY2VEaWZmCQBrAwUKdG9rZW5QcmljZQCQTgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmxhc3RQcmljZXMJAGUCCQCQAwEFCmxhc3RQcmljZXMAAQQLcHJpY2VEaWZmT2sDCQBmAgkAZAIAkE4FD3NodXRkb3duVHJpZ2dlcgUJcHJpY2VEaWZmCQBmAgUJcHJpY2VEaWZmCQBlAgCQTgUPc2h1dGRvd25UcmlnZ2VyBwQJcmlza0xldmVsCQBkAgkAZAIDBQx0d2Fwc1NpbWlsYXIAAQACAwUPb3JkZXJib29rTG9ja2VkAAEAAAMJAQEhAQULcHJpY2VEaWZmT2sAAQAAAwkBASEBBQx0d2Fwc1NpbWlsYXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYXNzZXRJZFN0cgIKX3Jpc2tMZXZlbAUJcmlza0xldmVsBQNuaWwDCQBnAgAFCQCQAwEFCW5ld1ByaWNlcwQJdXBkUHJpY2VzCQC5CQIFCW5ld1ByaWNlcwIBLAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQphc3NldElkU3RyAgdfdHdhcDVCBQduZXdUd2FwCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCmFzc2V0SWRTdHICCl9sYXN0QmxvY2sFBmhlaWdodAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCmFzc2V0SWRTdHICC19sYXN0UHJpY2VzBQl1cGRQcmljZXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYXNzZXRJZFN0cgIKX3Jpc2tMZXZlbAUJcmlza0xldmVsBQNuaWwECXVwZFByaWNlcwkAuQkCCQDRCAIFCW5ld1ByaWNlcwkAZQIJAJADAQUJbmV3UHJpY2VzAAECASwJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYXNzZXRJZFN0cgIHX3R3YXA1QgUHbmV3VHdhcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQphc3NldElkU3RyAgpfbGFzdEJsb2NrBQZoZWlnaHQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQphc3NldElkU3RyAgtfbGFzdFByaWNlcwUJdXBkUHJpY2VzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCmFzc2V0SWRTdHICCl9yaXNrTGV2ZWwFCXJpc2tMZXZlbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDHVwZGF0ZVRva2VucwADCQECIT0CCAUBaQxvcmlnaW5DYWxsZXIFDWJhY2tlbmRDYWxsZXIJAAIBAhphdmFpbGFibGUgZm9yIGJhY2tlbmQgb25seQQCaTEJAPwHBAUEdGhpcwIQdXBkYXRlVG9rZW5QcmljZQkAzAgCAgVXQVZFUwUDbmlsBQNuaWwDCQAAAgUCaTEFAmkxBAJpMgkA/AcEBQR0aGlzAhB1cGRhdGVUb2tlblByaWNlCQDMCAIFCHh0bklkU3RyBQNuaWwFA25pbAMJAAACBQJpMgUCaTIKAQVjYWxsdQIFYWNjdW0EbmV4dAQCaTMJAPwHBAUEdGhpcwIQdXBkYXRlVG9rZW5QcmljZQkAzAgCBQRuZXh0BQNuaWwFA25pbAMJAAACBQJpMwUCaTMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQDcmVzCgACJGwFCHRva2VuSWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQVjYWxsdQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUAwkAAAIFA3JlcwUDcmVzBAJpNAkA/AcEBQR0aGlzAhJ1cGRhdGVMcFRva2VuUHJpY2UJAMwIAgkAkQMCBQpscFRva2VuSWRzAAAFA25pbAUDbmlsAwkAAAIFAmk0BQJpNAQCaTUJAPwHBAUEdGhpcwISdXBkYXRlTHBUb2tlblByaWNlCQDMCAIJAJEDAgUKbHBUb2tlbklkcwABBQNuaWwFA25pbAMJAAACBQJpNQUCaTUEAmk2CQD8BwQFBHRoaXMCEnVwZGF0ZUxwVG9rZW5QcmljZQkAzAgCCQCRAwIFCmxwVG9rZW5JZHMAAgUDbmlsBQNuaWwDCQAAAgUCaTYFAmk2BAJpNwkA/AcEBQR0aGlzAhR1cGRhdGVXeExwVG9rZW5QcmljZQkAzAgCCQCRAwIFDHd4THBUb2tlbklkcwAABQNuaWwFA25pbAMJAAACBQJpNwUCaTcFA3JlcwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ1pbml0TmV3TWFzdGVyAQZtYXN0ZXIECWFkZHJlc3NPSwQHJG1hdGNoMAkApggBBQZtYXN0ZXIDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAYHAwkBASEBBQlhZGRyZXNzT0sJAAIBCQCsAgICEmluY29ycmVjdCBhZGRyZXNzIAUGbWFzdGVyAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIcYXZhaWxhYmxlIGZvciBzZWxmIGNhbGwgb25seQkAzAgCCQELU3RyaW5nRW50cnkCAg92ZXJpZmllcl9tYXN0ZXIFBm1hc3RlcgUDbmlsAWkBEHJlcXVlc3ROZXdNYXN0ZXIBCW5ld01hc3RlcgQJYWRkcmVzc09LBAckbWF0Y2gwCQCmCAEFCW5ld01hc3RlcgMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAFhBQckbWF0Y2gwBgcDCQEBIQEFCWFkZHJlc3NPSwkAAgEJAKwCAgISaW5jb3JyZWN0IGFkZHJlc3MgBQluZXdNYXN0ZXIDCQAAAgkAzwgCBQlzZW50aW5lbHMIBQFpBmNhbGxlcgUEdW5pdAkAAgECDndoaXRlbGlzdCBvbmx5CQDMCAIJAQtTdHJpbmdFbnRyeQICEnZlcmlmaWVyX25ld01hc3RlcgUJbmV3TWFzdGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCAh92ZXJpZmllcl9uZXdNYXN0ZXJFbGlnaWJsZUFmdGVyCQBkAgUGaGVpZ2h0AJBOBQNuaWwBaQERYWN0aXZhdGVOZXdNYXN0ZXIABA5lbGlnaWJsZUhlaWdodAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwIfdmVyaWZpZXJfbmV3TWFzdGVyRWxpZ2libGVBZnRlcgQJbmV3TWFzdGVyCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzAhJ2ZXJpZmllcl9uZXdNYXN0ZXIDCQAAAgkAzwgCBQlzZW50aW5lbHMIBQFpBmNhbGxlcgUEdW5pdAkAAgECDndoaXRlbGlzdCBvbmx5AwkAZgIFDmVsaWdpYmxlSGVpZ2h0BQZoZWlnaHQJAAIBAiJuZXcgbWFzdGVyIGNhbm5vdCBiZSBhY3RpdmF0ZWQgeWV0CQDMCAIJAQtEZWxldGVFbnRyeQECEnZlcmlmaWVyX25ld01hc3RlcgkAzAgCCQELRGVsZXRlRW50cnkBAh92ZXJpZmllcl9uZXdNYXN0ZXJFbGlnaWJsZUFmdGVyCQDMCAIJAQtTdHJpbmdFbnRyeQICD3ZlcmlmaWVyX21hc3RlcgUJbmV3TWFzdGVyBQNuaWwBAnR4AQZ2ZXJpZnkABA1tYXN0ZXJBZGRyZXNzCQCiCAECD3ZlcmlmaWVyX21hc3RlcgQQYXBwcm92ZWRCeU1hc3RlcgQHJG1hdGNoMAUNbWFzdGVyQWRkcmVzcwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXgFByRtYXRjaDAEByRtYXRjaDEJAJoIAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUBeAkArAICAgthcHByb3ZlZFR4XwkA2AQBCAUCdHgCaWQDCQABAgUHJG1hdGNoMQIDSW50BAF5BQckbWF0Y2gxBQF5AAAAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkJAGYCBRBhcHByb3ZlZEJ5TWFzdGVyAAAH9qqe3A==", "height": 3906284, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 96vYVL7hP6bZe9hLB1g8eZd5vPqN2j4i73e2gApou5DF Next: GvRdpbYnP1TfovLmyVRRxb5b29ZvErt7KyCYq9tPwZgm Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let a = Address(base58'3P4kBiU4wr2yV1S5gMfu3MdkVvy7kxXHsKe')
4+let a = 100000000
55
6-let b = 20
6+let b = [Address(base58'3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL'), Address(base58'3PQdNxynJy5mche2kxMVc5shXWzK8Gstq3o'), Address(base58'3P8auNWJkxxByyJtwErFXaxiXcGM45qQ1hA'), Address(base58'3P8qVX189qpoTJZQQQdKS9endHK5sxWsvrd')]
77
8-let c = Address(base58'3P8d1E1BLKoD52y3bQJ1bDTd2TD1gpaLn9t')
8+let c = Address(base58'3PLGH6sG6ND59GU6gFXHKQRuL5bdpWFs6U6')
99
10-let d = Address(base58'3PGFHzVGT4NTigwCKP1NcwoXkodVZwvBuuU')
10+let d = Address(base58'3PPXVKjN6nRMzXeegcYhfiic96pd2c98Ekm')
1111
12-let e = Address(base58'3PDDRRS5gKyDQRpJskzWTdxREHGu1FNpdwg')
12+let e = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
1313
14-let f = [base58'3PBTPFGaKL7qEdj9Tz1QUqbvJUcPNu934j4', base58'3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL', base58'3PAxdDSmN758L5SHSGRC5apEtQE2aApZotG', base58'3PJKmXoHJvVeQXjSJdhtkUcFDtdiQqMbUTD', base58'3PQdNxynJy5mche2kxMVc5shXWzK8Gstq3o', base58'3PHbdpaKzz8EiAngGHaFu2hVuNCdsC67qh3', base58'3P6Ksahs71SiKQgQ4qaZuFAVhqncdi2nvJQ']
14+let f = "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p"
1515
16-func g (h) = !(if (if ((h != Address(base58'3PCqdm1mAoQqR46oZotFanmqb5CLUvrKEo2')))
17- then (h != Address(base58'3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL'))
18- else false)
19- then (h != Address(base58'3PHbdpaKzz8EiAngGHaFu2hVuNCdsC67qh3'))
20- else false)
16+let g = "3VuV5WTmDz47Dmdn3QpcYjzbSdipjQE4JMdNe1xZpX13"
2117
18+let h = ["9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi", "HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW"]
2219
23-func i (j) = {
24- let k = j
25- $Tuple4(20000000, 100000000, 60000000, 400000000)
20+let i = ["6nSpVyNH7yM69eg446wrQR94ipbbcmZMU1ENPwanC97g", "Ehie5xYpeN8op1Cctc6aGUrqx8jq3jtf1DSjXDbfm7aT", "4LHHvYGNKJUg5hj65aGD5vgScvCBmLpdRFtjokvCjSL8", "C1iWsKGqLwjHUndiQ7iXpdmPum9PeCDFfyXBdJJosDRS", "34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ", "6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ", "HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS", "Ajso6nTTjptu2UHLx6hfSXVtHFtRBJCkKYd5SAyj7zf5", "DSbbhLsSTeDg5Lsiufk2Aneh3DjVqJuPr2M9uU1gwy5p", "Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on", "2thsACuHmzDMuNezPM32wg9a3BwUzBWDeSKakgz3cw21", "YiNbofFzC17jEHHCMwrRcpy9MrrjabMMLZxg8g5xmf7", "8t4DPWTwPzpatHA9AkTxWAB47THnYzBsDnoY7fQqbG91", "At8D6NFFpheCbvKVnjVoeLL84Eo8NZn6ovManxfLaFWL", "6phK22ztGBW127gUFmdMEHKB3CVd6ZhWox2WtwJkbqTq", "3VuV5WTmDz47Dmdn3QpcYjzbSdipjQE4JMdNe1xZpX13", "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi"]
21+
22+let j = [false, false, false, false, true, true, false, false, false, false, false, false, false, false, true, false, true, true]
23+
24+let k = [1000000, 100000000, 100000000, 100000000, 1000000, 1000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000, 1000000, 1000000, 100000000, 1000000, 1000000]
25+
26+let l = ["DZeA7RbVab98r61hVH5zcFZXwNALPJGgq1eyHandsKKW", "72E4MMFHngsixqAkNZCRJMLTmgAP9nufdsXexnS5qxVx", "FTTJnB6xG4CKZEJMgsgqjmgbzcyH8ya3tV8LQP2GCDs7", "3UnytNnkd48fHofHPBp59BkpZA1uMSJ8PdhWUCuerics", "ByJtVuYi58CtdjtasDuTqtgev8qWkdJybF7rY1xosmhE", "BoXuf9ewJSE1UMrKibZmigzC6tBzv8RFTeZmofEos2ZJ", "7G687ui3m59oAd6qkyni2vt77bHF4bbA6xcPfDo3uiTu", "EMsZpqcT8NuMYZCEPHzvrhQCQKhfXjdeekZvcWpHsNvh", "E3YhURNsCmjUaYNigH6AayLxbh9u81uVGU3ZvHKznY5v", "BiSzFe8nSL78oZaebfoin5vBZ5Pze6d7kaeijLqr5xZe", "AKQsEQoeinKRFtdx6rhKWcpkAMu6cbDLdtSWnR8tpBCq", "DjgwW4CMJEfpzj7SLFFPiCqf1zfmAgf1MD5gAS8SjKt4", "", "F3s92VRdppEtLVAP697CTM6AzZJECRcoMx5kj2FkGv4M", "6iMB6LKSrgv9waEvEnN6Ydyx7dfxPnGcTw8318WVm5bR", "E6MUGSUieSsq6QiJcbp6REdQXyjp6uPWLitnp9Gdtsuh", "6KWpnpLk6GNh5HG9ct9pNDCYFWJBoAAshZsp4D8jcFpV", ""]
27+
28+let m = ["", "", "", "3P3Y38zymCHoTM6qcE9JcEA8rhaGTQbVMgu", "", "", "3P615yXeQ9Qu4qBM1QGimGzixyMS5W4Ktug", "3PEkD5LuHGWhUfgBW1owZFxVydYoWjV6Jia", "3P5HjPowgipiVB3UvXphDiPvKs424WC9xQw", "3PCENpEKe8atwELZ7oCSmcdEfcRuKTrUx99", "", "", "3PH832eKnw67PFvJfUg9Knz6BHM87QvjMeL", "", "3PGcYzoUfQEQkhRgrBqmG5Wpc7A1ncFvRtM", "", "", ""]
29+
30+let n = ["3P2V63Xd6BviDkeMzxhUw2SJyojByRz8a8m", "3P27S9V36kw2McjWRZ37AxTx8iwkd7HXw6W", "3P6DLdJTP2EySq9MFdJu6beUevrQd2sVVBh", "", "", "", "3PBHyEwmERR1CEkrTNbPj2bgyisTfPRqfee", "3PDSXwwA2xAtmxeo2bebDP3AA5ynZ2Krgnw", "3PJ48P3p2wvWUjgQaQiZ2cFbr8qmxMokBGd", "3PKi4G3VX2k42ZSmNNrmvgdDH7JzRaUhY7R", "", "", "3PCwvns2dnmobD6Z4cR86v98s7LgMZYygEy", "3PLp9KrdrbWAvSFHGJVEaszUubquz3M6mfe", "", "", "", ""]
31+
32+let o = ["9dbpSr8d18qWQxn5fJJSS1LLQ8CmSZ6gYmjuPRzg3RBM", "9MKixRt9rNRyaJCT2pexbXkuvpZBdJREdTU36bGit8iw", "6bZbRmou7M7wXBunMXQnZ4Rm66HxZF3KfMEiFwk3wmnA"]
33+
34+let p = ["Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on", "WAVES", "WAVES"]
35+
36+let q = [Address(base58'3PKJxKhn9MrzcvZv689bUpZgh4rurEgoKC8'), Address(base58'3P4PFYKHyxitgwVb4WVWEcdH7ZsuR4GgcXC'), Address(base58'3PCpjLGo4wDuv23kjmGF6mHs86Bf3soYvAq')]
37+
38+let r = [30000000, 20000000, 20000000]
39+
40+let s = ["rZMQ6g31Lr7sPAaAoYc4U2PHCVauTuKUSzUbJtUyPZN"]
41+
42+let t = [["9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi", "HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW"]]
43+
44+let u = "3P8MoPnsaurofk1VyhsdAFkeQ6ijpJYXCpW"
45+
46+let v = addressFromStringValue(u)
47+
48+let w = addressFromStringValue("3P56jNQzECXnrWpnbbSJKw7Eooo6fkUaMPp")
49+
50+let x = 1000
51+
52+let y = 3000
53+
54+let z = ""
55+
56+let A = "__"
57+
58+func B (C) = {
59+ let D = C
60+ if ($isInstanceOf(D, "String"))
61+ then {
62+ let E = D
63+ E
64+ }
65+ else throw("fail to cast into String")
2666 }
2767
2868
29-let l = [Address(base58'3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL'), Address(base58'3PQdNxynJy5mche2kxMVc5shXWzK8Gstq3o'), Address(base58'3P8auNWJkxxByyJtwErFXaxiXcGM45qQ1hA'), Address(base58'3P8qVX189qpoTJZQQQdKS9endHK5sxWsvrd')]
30-
31-let m = 100000000
32-
33-let n = 10000000000
34-
35-let o = (m * m)
36-
37-let p = 1440
38-
39-func q (r) = {
40- func s (t,u) = ((t + toString(u)) + ",")
41-
42- let v = r
43- let w = size(v)
44- let x = ""
45- func y (z,A) = if ((A >= w))
46- then z
47- else s(z, v[A])
48-
49- func B (z,A) = if ((A >= w))
50- then z
51- else throw("List size exceeds 12")
52-
53- B(y(y(y(y(y(y(y(y(y(y(y(y(x, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
69+func F (C) = {
70+ let D = C
71+ if ($isInstanceOf(D, "Int"))
72+ then {
73+ let G = D
74+ G
75+ }
76+ else throw("fail to cast into Int")
5477 }
5578
5679
57-func C (D) = {
58- let k = getInteger(this, D)
59- if ($isInstanceOf(k, "Int"))
80+func H (I) = {
81+ let D = getInteger(this, I)
82+ if ($isInstanceOf(D, "Int"))
6083 then {
61- let E = k
62- E
84+ let J = D
85+ J
6386 }
6487 else 0
6588 }
6689
6790
68-func F (D) = {
69- let k = getBoolean(this, D)
70- if ($isInstanceOf(k, "Boolean"))
71- then {
72- let E = k
73- E
91+func K (L) = if ((L == "WAVES"))
92+ then unit
93+ else fromBase58String(L)
94+
95+
96+let M = "3PKkojKdd6BBzTf1RXbQVfUDraNFXXHKzQF"
97+
98+let N = addressFromStringValue(M)
99+
100+let O = valueOrErrorMessage(getInteger(N, "%s%s__price__USDN-USDT"), "DORA doesn't contain USDN/USDT price")
101+
102+func P (Q,R) = {
103+ let S = i[Q]
104+ let T = fromBase58String(S)
105+ if ((indexOf(h, S) != unit))
106+ then $Tuple2(1000000, "stable token price")
107+ else {
108+ let U = l[Q]
109+ let V = if ((U == ""))
110+ then $Tuple2(0, 0)
111+ else {
112+ let W = split(B(invoke(v, "poolStatsREADONLY", [U], nil)), "__")
113+ let X = if (j[Q])
114+ then $Tuple2(1, 2)
115+ else $Tuple2(2, 1)
116+ let Y = X._1
117+ let Z = X._2
118+ let aa = parseIntValue(W[Y])
119+ let ab = fraction(parseIntValue(W[Z]), 100000000, k[Q])
120+ let ac = fraction(aa, R, ab)
121+ let ad = ab
122+ $Tuple2(ac, ad)
123+ }
124+ let ac = V._1
125+ let ad = V._2
126+ let ae = m[Q]
127+ let af = if ((ae == ""))
128+ then $Tuple2(0, 0)
129+ else {
130+ let ag = addressFromStringValue(ae)
131+ let ah = assetBalance(ag, e)
132+ let ai = assetBalance(ag, T)
133+ $Tuple2(fraction((ah * (k[Q] / 1000000)), O, ai), ai)
134+ }
135+ let aj = af._1
136+ let ak = af._2
137+ let al = n[Q]
138+ let am = if ((al == ""))
139+ then $Tuple2(0, 0)
140+ else {
141+ let an = addressFromStringValue(al)
142+ let ao = F(invoke(w, "calcGetAmountCPMM", [al, "3P88qk1KzF1BKjD7fC7LjNVAKM4ezff5WE6", S, k[Q]], nil))
143+ let ap = fraction(ao, O, 1000000)
144+ let aq = getIntegerValue(an, "A_asset_balance")
145+ $Tuple2(ap, aq)
146+ }
147+ let ap = am._1
148+ let aq = am._2
149+ let ar = ((ad + ak) + aq)
150+ let as = ((fraction(ac, ad, ar) + fraction(aj, ak, ar)) + fraction(ap, aq, ar))
151+ let at = ((((((("T1UsdPriceX6=" + toString(as)) + " wx_T1Waves_T1UsdPriceX6=") + toString(ac)) + " wx_T1Xtn_T1UsdPriceX6=") + toString(aj)) + " swop_T1Xtn_T1UsdPriceX6=") + toString(ap))
152+ $Tuple2(as, at)
74153 }
75- else false
76154 }
77155
78156
79-func G (D) = {
80- let k = getString(this, D)
81- if ($isInstanceOf(k, "String"))
82- then {
83- let E = k
84- E
85- }
86- else ""
157+let au = "lastUpdatedBlock"
158+
159+let av = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
160+
161+func aw (ax,T) = ((("block_" + toString(ax)) + "_") + T)
162+
163+
164+func ay (T,ax) = valueOrElse(getInteger(d, aw(ax, T)), 0)
165+
166+
167+func az () = {
168+ let aA = valueOrErrorMessage(getInteger(d, au), "Last updated block key not found")
169+ if ((0 >= aA))
170+ then throw("Invalid block value")
171+ else if (((height - aA) > 10))
172+ then throw("The price has not been updated for a long time")
173+ else aA
87174 }
88175
89176
90-func H (D) = {
91- let k = getBinary(this, D)
92- if ($isInstanceOf(k, "ByteVector"))
93- then {
94- let E = k
95- E
96- }
97- else base58''
177+func aB (aC,aD) = {
178+ let aE = aC
179+ let aF = aE._1
180+ let ax = aE._2
181+ let T = aE._3
182+ let aG = aE._4
183+ let aH = ay(T, ax)
184+ let aI = (ax - aD)
185+ if ((aH > 0))
186+ then $Tuple4((aF :+ aH), aI, T, (aG + aH))
187+ else $Tuple4(aF, aI, T, aG)
98188 }
99189
100190
101-func I (J) = {
102- let k = J
103- if ($isInstanceOf(k, "ByteVector"))
191+func aJ (S) = {
192+ let aK = invoke(this, "getOrderbookTwap15", [S, false], nil)
193+ if ((aK == aK))
104194 then {
105- let E = k
106- toBase58String(E)
107- }
108- else "WAVES"
109- }
110-
111-
112-func K (j) = if ((j == "WAVES"))
113- then unit
114- else fromBase58String(j)
115-
116-
117-func L (j) = if ((j == "WAVES"))
118- then wavesBalance(this).available
119- else assetBalance(this, fromBase58String(j))
120-
121-
122-func M () = split(G("setup_tokens"), ",")
123-
124-
125-func N () = {
126- let O = G("setup_maxSupply")
127- if ((O == ""))
128- then [-1, -1, -1, -1, -1, -1, -1]
129- else split(O, ",")
130- }
131-
132-
133-func P (j) = {
134- let Q = fraction(C(("total_supplied_" + j)), C((j + "_sRate")), o)
135- if ((Q == 0))
136- then 0
137- else fraction(m, fraction(C(("total_borrowed_" + j)), C((j + "_bRate")), o), Q)
138- }
139-
140-
141-func R (j) = {
142- let S = P(j)
143- let T = i(j)
144- let U = (T._1 + (if ((T._3 >= S))
145- then fraction(S, T._2, T._3)
146- else (T._2 + fraction((S - T._3), T._4, (100000000 - T._3)))))
147- max([fraction(U, m, (p * 365)), 1])
148- }
149-
150-
151-func V (j) = {
152- let W = R(j)
153- let S = P(j)
154- let X = C("lastRateHeight")
155- let Y = max([C((j + "_bRate")), o])
156- let Z = (Y + ((height - X) * W))
157- let aa = max([C((j + "_sRate")), o])
158- let ab = (aa + ((((height - X) * fraction(W, S, m)) * (100 - b)) / 100))
159-[IntegerEntry((j + "_sRate"), ab), IntegerEntry((j + "_bRate"), Z), IntegerEntry("lastRateHeight", height)]
160- }
161-
162-
163-func ac (j,ad) = {
164- func s (t,ae) = {
165- let af = V(ae)
166- $Tuple2(if ((ae != j))
167- then t._1
168- else if ((ad == "sRate"))
169- then af[0].value
170- else af[1].value, (t._2 ++ af))
171- }
172-
173- let v = M()
174- let w = size(v)
175- let x = $Tuple2(0, nil)
176- func y (z,A) = if ((A >= w))
177- then z
178- else s(z, v[A])
179-
180- func B (z,A) = if ((A >= w))
181- then z
182- else throw("List size exceeds 12")
183-
184- B(y(y(y(y(y(y(y(y(y(y(y(y(x, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
185- }
186-
187-
188-func ag (j) = {
189- let ah = V(j)
190- let Q = fraction(C(("total_supplied_" + j)), ah[0].value, o)
191- fraction(m, fraction(C(("total_borrowed_" + j)), ah[1].value, o), Q)
192- }
193-
194-
195-func ai () = {
196- func s (t,ae) = (t ++ V(ae))
197-
198- let v = M()
199- let w = size(v)
200- let x = nil
201- func y (z,A) = if ((A >= w))
202- then z
203- else s(z, v[A])
204-
205- func B (z,A) = if ((A >= w))
206- then z
207- else throw("List size exceeds 12")
208-
209- B(y(y(y(y(y(y(y(y(y(y(y(y(x, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
210- }
211-
212-
213-func aj (j,ak) = if (if ((j == "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi"))
214- then true
215- else (j == "HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW"))
216- then $Tuple2(1000000, 1000000)
217- else {
218- let al = getIntegerValue(c, (j + "_twap5B"))
219- let am = getIntegerValue(c, (j + "_riskLevel"))
220- if ((ak >= am))
221- then $Tuple2(al, al)
222- else throw((("oracle prices don't match: " + toString(al)) + " is the price, but risk is too high"))
223- }
224-
225-
226-func an (j) = aj(j, 3)
227-
228-
229-func ao (j) = {
230- let ap = if ((j == "WAVES"))
231- then 8
232- else value(assetInfo(fromBase58String(j))).decimals
233- pow(10, 0, ap, 0, 0, DOWN)
234- }
235-
236-
237-func aq (h) = {
238- let ar = invoke(this, "getUserCollateral", [false, h, true, ""], nil)
239- if ((ar == ar))
240- then {
241- let as = {
242- let k = ar
243- if ($isInstanceOf(k, "Int"))
244- then {
245- let at = k
246- at
247- }
248- else throw("issue while doing in-dapp invocation")
195+ let aL = {
196+ let aM = aK
197+ if ($isInstanceOf(aM, "(Int, Boolean)"))
198+ then aM
199+ else throw(($getType(aM) + " couldn't be cast to (Int, Boolean)"))
249200 }
250- if ((as == as))
251- then as
201+ if ((aL == aL))
202+ then aL
252203 else throw("Strict value is not equal to itself.")
253204 }
254205 else throw("Strict value is not equal to itself.")
255206 }
256207
257208
258-@Callable(au)
259-func supply () = if (!(F("setup_active")))
260- then throw("market is stopped")
261- else if (if ((size(au.payments) != 1))
262- then true
263- else (au.payments[0].amount == 0))
264- then throw("1 payment has to be attached")
265- else {
266- let j = I(au.payments[0].assetId)
267- let av = au.payments[0].amount
268- let aw = ac(j, "sRate")
269- let ax = aw._1
270- let ay = aw._2
271- let az = fraction(av, o, ax, DOWN)
272- let h = toString(au.caller)
273- let aA = {
274- let k = getString(("setup_maxSupply_" + j))
275- if ($isInstanceOf(k, "String"))
276- then {
277- let at = k
278- parseIntValue(at)
279- }
280- else C(("setup_maxSupply_" + j))
281- }
282- let aB = an(j)
283- let aC = (C(((h + "_supplied_") + j)) + az)
284- let aD = (C(("total_supplied_" + j)) + az)
285- let U = ac(j, "sRate")._1
286- let aE = ao(j)
287- let aF = fraction(fraction(aD, U, o), aB._1, aE)
288- if ((indexOf(G("setup_tokens"), j) == unit))
289- then throw("this asset is not supported by the market")
290- else if (if ((aA != 0))
291- then (aF > aA)
292- else false)
293- then throw("max total supply for this token reached in the pool")
294- else if ((C(("setup_paused_" + j)) > 0))
295- then throw("this asset can't be supplied or borrowed")
296- else {
297- let aG = if ((G(("setup_autostake_" + j)) != ""))
298- then invoke(this, "stakeToken", [j, av], nil)
299- else unit
300- if ((aG == aG))
301- then ([IntegerEntry(((h + "_supplied_") + j), aC), IntegerEntry(("total_supplied_" + j), aD)] ++ ay)
302- else throw("Strict value is not equal to itself.")
303- }
304- }
209+@Callable(G)
210+func getOrderbookTwap15 (T,at) = {
211+ let aA = az()
212+ let aN = {
213+ let aO = av
214+ let aP = size(aO)
215+ let aQ = $Tuple4(nil, aA, T, 0)
216+ func aR (aS,aT) = if ((aT >= aP))
217+ then aS
218+ else aB(aS, aO[aT])
305219
220+ func aU (aS,aT) = if ((aT >= aP))
221+ then aS
222+ else throw("List size exceeds 15")
306223
307-
308-@Callable(au)
309-func withdraw (j,av) = {
310- let aH = ac(j, "sRate")
311- let ax = aH._1
312- let ay = aH._2
313- let az = fraction(av, o, ax, CEILING)
314- let h = toString(au.caller)
315- let aI = C(("total_supplied_" + j))
316- let aJ = C(("total_borrowed_" + j))
317- let aK = C(((h + "_supplied_") + j))
318- let aL = C(((h + "_borrowed_") + j))
319- let aM = invoke(this, "getUserCollateral", [false, h, true, ((j + ",supplied,") + toString(-(az)))], nil)
320- if ((aM == aM))
321- then {
322- let aN = {
323- let k = aM
324- if ($isInstanceOf(k, "Int"))
325- then {
326- let at = k
327- at
328- }
329- else throw("can't get user collateral value")
330- }
331- if (!(F("setup_active")))
332- then throw("market is stopped")
333- else if ((0 > aN))
334- then throw("you dont have enough collateral for this operation")
335- else if ((az > (aI - aJ)))
336- then throw("this amount is not available on the market")
337- else if ((az > (aK - aL)))
338- then throw("this amount is not available for this user")
339- else {
340- let aG = if ((G(("setup_autostake_" + j)) != ""))
341- then invoke(this, "unstakeToken", [j, av], nil)
342- else unit
343- if ((aG == aG))
344- then ([IntegerEntry(((h + "_supplied_") + j), (C(((h + "_supplied_") + j)) - az)), IntegerEntry(("total_supplied_" + j), (C(("total_supplied_" + j)) - az)), ScriptTransfer(au.caller, av, K(j))] ++ ay)
345- else throw("Strict value is not equal to itself.")
346- }
347- }
348- else throw("Strict value is not equal to itself.")
224+ aU(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aQ, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
225+ }
226+ let aV = aN._1
227+ let aG = aN._4
228+ let aW = fraction(aG, 1000000, fraction(size(aV), 1000000, 1))
229+ let aX = valueOrElse(getBoolean(d, (T + "_locked")), false)
230+ if (at)
231+ then throw((((((((("average: " + toString(aW)) + ", isLocked: ") + toString(aX)) + ", ") + "priceListSize: ") + toString(size(aV))) + ", sum: ") + toString(aG)))
232+ else $Tuple2(nil, $Tuple2(aW, aX))
349233 }
350234
351235
352236
353-@Callable(au)
354-func borrow (j,av) = {
355- let h = toString(au.caller)
356- let aO = ac(j, "bRate")
357- let aP = aO._1
358- let ay = aO._2
359- let az = fraction(av, o, aP, CEILING)
360- let aM = invoke(this, "getUserCollateral", [false, h, true, ((j + ",borrowed,") + toString(az))], nil)
361- if ((aM == aM))
237+@Callable(G)
238+func updateWxLpTokenPrice (L) = {
239+ let aY = getIntegerValue(N, "%s%s__price__WAVES-USDT")
240+ let Q = value(indexOf(s, L))
241+ let aZ = t[Q]
242+ let ba = if ((aZ[0] == "WAVES"))
243+ then aY
244+ else if ((indexOf(h, aZ[0]) != unit))
245+ then 1000000
246+ else P(value(indexOf(i, aZ[0])), aY)._1
247+ let bb = if ((aZ[0] == "WAVES"))
248+ then 8
249+ else value(value(assetInfo(fromBase58String(aZ[0]))).decimals)
250+ let bc = if ((aZ[1] == "WAVES"))
251+ then aY
252+ else if ((indexOf(h, aZ[1]) != unit))
253+ then 1000000
254+ else P(value(indexOf(i, aZ[1])), aY)._1
255+ let bd = if ((aZ[1] == "WAVES"))
256+ then 8
257+ else value(value(assetInfo(fromBase58String(aZ[1]))).decimals)
258+ let be = if ((bb == 8))
259+ then a
260+ else 1000000
261+ let bf = if ((bd == 8))
262+ then a
263+ else 1000000
264+ let aK = {
265+ let aM = invoke(v, "poolEvaluateGetREADONLY", [L, 100000000], nil)
266+ if ($isInstanceOf(aM, "String"))
267+ then aM
268+ else throw(($getType(aM) + " couldn't be cast to String"))
269+ }
270+ if ((aK == aK))
362271 then {
363- let aN = {
364- let k = aM
365- if ($isInstanceOf(k, "Int"))
366- then {
367- let at = k
368- at
369- }
370- else throw("can't get user collateral value")
371- }
372- if (!(F("setup_active")))
373- then throw("market is stopped")
374- else if ((0 > aN))
375- then throw("you have to supply more to borrow")
376- else if ((C(("setup_paused_" + j)) > 0))
377- then throw("this asset can't be supplied or borrowed")
272+ let bg = split(aK, "__")
273+ let bh = parseIntValue(bg[1])
274+ let bi = parseIntValue(bg[2])
275+ let bj = (fraction(ba, bh, be) + fraction(bc, bi, bf))
276+ let bk = H((L + "_twap5B"))
277+ let bl = H((L + "_lastBlock"))
278+ if ((G.originCaller != c))
279+ then throw("available for backend only")
280+ else if ((2 > (height - bl)))
281+ then nil
282+ else if (if ((bl == 0))
283+ then true
284+ else ((height - bl) > 100))
285+ then [IntegerEntry((L + "_twap5B"), bj), IntegerEntry((L + "_lastBlock"), height), StringEntry((L + "_lastPrices"), toString(bj)), IntegerEntry((L + "_riskLevel"), 1)]
378286 else {
379- let aI = C(("total_supplied_" + j))
380- let aJ = C(("total_borrowed_" + j))
381- let aL = C(((h + "_borrowed_") + j))
382- if ((az > (aI - aJ)))
383- then throw("this amount is not available")
287+ let bm = split(getStringValue((L + "_lastPrices")), ",")
288+ let bn = toString(bj) :: bm
289+ func bo (aC,aD) = (aC + parseIntValue(aD))
290+
291+ let bp = ({
292+ let aO = bn
293+ let aP = size(aO)
294+ let aQ = 0
295+ func aR (aS,aT) = if ((aT >= aP))
296+ then aS
297+ else bo(aS, aO[aT])
298+
299+ func aU (aS,aT) = if ((aT >= aP))
300+ then aS
301+ else throw("List size exceeds 6")
302+
303+ aU(aR(aR(aR(aR(aR(aR(aQ, 0), 1), 2), 3), 4), 5), 6)
304+ } / size(bn))
305+ let bq = fraction(bj, 10000, parseIntValue(bm[(size(bm) - 1)]))
306+ let br = if (((10000 + y) > bq))
307+ then (bq > (10000 - y))
308+ else false
309+ let bs = if (br)
310+ then 1
311+ else 2
312+ if ((5 >= size(bn)))
313+ then {
314+ let bt = makeString(bn, ",")
315+[IntegerEntry((L + "_twap5B"), bp), IntegerEntry((L + "_lastBlock"), height), StringEntry((L + "_lastPrices"), bt), IntegerEntry((L + "_riskLevel"), bs)]
316+ }
384317 else {
385- let aG = if ((G(("setup_autostake_" + j)) != ""))
386- then invoke(this, "unstakeToken", [j, av], nil)
387- else unit
388- if ((aG == aG))
389- then ([IntegerEntry(((h + "_borrowed_") + j), (aL + az)), IntegerEntry(("total_borrowed_" + j), (aJ + az)), ScriptTransfer(au.caller, av, K(j))] ++ ay)
390- else throw("Strict value is not equal to itself.")
318+ let bt = makeString(removeByIndex(bn, (size(bn) - 1)), ",")
319+[IntegerEntry((L + "_twap5B"), bp), IntegerEntry((L + "_lastBlock"), height), StringEntry((L + "_lastPrices"), bt), IntegerEntry((L + "_riskLevel"), bs)]
391320 }
392321 }
393322 }
396325
397326
398327
399-@Callable(au)
400-func repay () = if (!(F("setup_active")))
401- then throw("market is stopped")
402- else if (if ((size(au.payments) != 1))
403- then true
404- else (au.payments[0].amount == 0))
405- then throw("1 payment has to be attached")
406- else {
407- let j = I(au.payments[0].assetId)
408- let av = au.payments[0].amount
409- let aQ = ac(j, "bRate")
410- let aP = aQ._1
411- let ay = aQ._2
412- let az = fraction(av, o, aP, CEILING)
413- let h = toString(au.caller)
414- let aI = C(("total_supplied_" + j))
415- let aJ = C(("total_borrowed_" + j))
416- let aL = C(((h + "_borrowed_") + j))
417- let aR = (aL - az)
418- let aS = if ((aR >= 0))
419- then az
420- else aL
421- if ((indexOf(G("setup_tokens"), j) == unit))
422- then throw("this asset is not supported by the market")
328+@Callable(G)
329+func updateLpTokenPrice (L) = {
330+ let aY = getIntegerValue(N, "%s%s__price__WAVES-USDT")
331+ let Q = value(indexOf(o, L))
332+ let bu = p[Q]
333+ let bv = if ((bu == "WAVES"))
334+ then aY
335+ else P(value(indexOf(i, bu)), aY)._1
336+ let bw = getIntegerValue(q[Q], (("global_" + bu) + "_balance"))
337+ let bx = value(assetInfo(value(K(L)))).quantity
338+ let bj = fraction(fraction(fraction(bv, bw, 1000000), a, r[Q]), 1000000, bx)
339+ let bk = H((L + "_twap5B"))
340+ let bl = H((L + "_lastBlock"))
341+ if ((G.originCaller != c))
342+ then throw("available for backend only")
343+ else if ((2 > (height - bl)))
344+ then nil
345+ else if (if ((bl == 0))
346+ then true
347+ else ((height - bl) > 100))
348+ then [IntegerEntry((L + "_twap5B"), bj), IntegerEntry((L + "_lastBlock"), height), StringEntry((L + "_lastPrices"), toString(bj)), IntegerEntry((L + "_riskLevel"), 1)]
423349 else {
424- let aG = if ((G(("setup_autostake_" + j)) != ""))
425- then invoke(this, "stakeToken", [j, av], nil)
426- else unit
427- if ((aG == aG))
428- then (([IntegerEntry(((h + "_borrowed_") + j), (aL - aS)), IntegerEntry(("total_borrowed_" + j), (aJ - aS))] ++ ay) ++ (if ((aR >= 0))
429- then nil
430- else [ScriptTransfer(au.caller, -(aR), au.payments[0].assetId)]))
431- else throw("Strict value is not equal to itself.")
432- }
433- }
350+ let bm = split(getStringValue((L + "_lastPrices")), ",")
351+ let bn = toString(bj) :: bm
352+ func bo (aC,aD) = (aC + parseIntValue(aD))
434353
354+ let bp = ({
355+ let aO = bn
356+ let aP = size(aO)
357+ let aQ = 0
358+ func aR (aS,aT) = if ((aT >= aP))
359+ then aS
360+ else bo(aS, aO[aT])
435361
362+ func aU (aS,aT) = if ((aT >= aP))
363+ then aS
364+ else throw("List size exceeds 6")
436365
437-@Callable(au)
438-func repayFor (h) = if (!(F("setup_active")))
439- then throw("market is stopped")
440- else if ((au.caller != Address(base58'3P4kBiU4wr2yV1S5gMfu3MdkVvy7kxXHsKe')))
441- then throw("available only for reserve fund address")
442- else if ((h == "global"))
443- then throw("you can't repay for everyone :_)")
444- else if (if ((size(au.payments) != 1))
445- then true
446- else (au.payments[0].amount == 0))
447- then throw("1 payment has to be attached")
448- else {
449- let j = I(au.payments[0].assetId)
450- let av = au.payments[0].amount
451- let aT = ac(j, "bRate")
452- let aP = aT._1
453- let ay = aT._2
454- let az = fraction(av, o, aP, CEILING)
455- let aI = C(("total_supplied_" + j))
456- let aJ = C(("total_borrowed_" + j))
457- let aL = C(((h + "_borrowed_") + j))
458- let aR = (aL - az)
459- let aS = if ((aR >= 0))
460- then az
461- else aL
462- if ((indexOf(G("setup_tokens"), j) == unit))
463- then throw("this asset is not supported by the market")
366+ aU(aR(aR(aR(aR(aR(aR(aQ, 0), 1), 2), 3), 4), 5), 6)
367+ } / size(bn))
368+ let bq = fraction(bj, 10000, parseIntValue(bm[(size(bm) - 1)]))
369+ let br = if (((10000 + y) > bq))
370+ then (bq > (10000 - y))
371+ else false
372+ let bs = if (br)
373+ then 1
374+ else 2
375+ if ((5 >= size(bn)))
376+ then {
377+ let bt = makeString(bn, ",")
378+[IntegerEntry((L + "_twap5B"), bp), IntegerEntry((L + "_lastBlock"), height), StringEntry((L + "_lastPrices"), bt), IntegerEntry((L + "_riskLevel"), bs)]
379+ }
464380 else {
465- let aG = if ((G(("setup_autostake_" + j)) != ""))
466- then invoke(this, "stakeToken", [j, av], nil)
467- else unit
468- if ((aG == aG))
469- then (([IntegerEntry(((h + "_borrowed_") + j), (aL - aS)), IntegerEntry(("total_borrowed_" + j), (aJ - aS))] ++ ay) ++ (if ((aR >= 0))
470- then nil
471- else [ScriptTransfer(au.caller, -(aR), au.payments[0].assetId)]))
472- else throw("Strict value is not equal to itself.")
381+ let bt = makeString(removeByIndex(bn, (size(bn) - 1)), ",")
382+[IntegerEntry((L + "_twap5B"), bp), IntegerEntry((L + "_lastBlock"), height), StringEntry((L + "_lastPrices"), bt), IntegerEntry((L + "_riskLevel"), bs)]
473383 }
474384 }
475-
476-
477-
478-@Callable(au)
479-func stakeToken (j,az) = {
480- let aU = getStringValue(e, "setup_supportedAssets")
481- if ((au.caller != this))
482- then throw("only for internal smart contract invocations")
483- else if ((indexOf(aU, j) == unit))
484- then nil
485- else {
486- let aV = C(("autostake_amount_" + j))
487- let aW = invoke(e, "stakeLP", nil, [AttachedPayment(K(j), az)])
488- if ((aW == aW))
489- then [IntegerEntry(("autostake_amount_" + j), (aV + az))]
490- else throw("Strict value is not equal to itself.")
491- }
492385 }
493386
494387
495388
496-@Callable(au)
497-func stakeTokenAll (j) = if ((au.caller != this))
498- then throw("only for internal smart contract invocations")
499- else {
500- let az = L(j)
501- let aG = invoke(this, "stakeToken", [j, az], nil)
502- if ((aG == aG))
389+@Callable(G)
390+func updateTokenPrice (L) = {
391+ let aY = getIntegerValue(N, "%s%s__price__WAVES-USDT")
392+ let bj = if ((L == "WAVES"))
393+ then aY
394+ else if ((L == f))
395+ then O
396+ else {
397+ let by = P(value(indexOf(i, L)), aY)._1
398+ if ((L == g))
399+ then {
400+ let bz = getIntegerValue(N, "%s%s__price__ETH-USDT")
401+ let bA = fraction(by, 10000, bz)
402+ if (if ((bA > (10000 - x)))
403+ then ((10000 + x) > bA)
404+ else false)
405+ then by
406+ else throw("internal ETH price doesn't match with global price")
407+ }
408+ else if ((indexOf(h, L) != unit))
409+ then 1000000
410+ else by
411+ }
412+ let bk = H((L + "_twap5B"))
413+ let bl = H((L + "_lastBlock"))
414+ if ((G.originCaller != c))
415+ then throw("available for backend only")
416+ else if ((2 > (height - bl)))
503417 then nil
504- else throw("Strict value is not equal to itself.")
505- }
418+ else if (if ((bl == 0))
419+ then true
420+ else ((height - bl) > 30))
421+ then [IntegerEntry((L + "_twap5B"), bj), IntegerEntry((L + "_lastBlock"), height), StringEntry((L + "_lastPrices"), toString(bj))]
422+ else {
423+ let bm = split(getStringValue((L + "_lastPrices")), ",")
424+ let bn = toString(bj) :: bm
425+ func bo (aC,aD) = (aC + parseIntValue(aD))
506426
427+ let bp = ({
428+ let aO = bn
429+ let aP = size(aO)
430+ let aQ = 0
431+ func aR (aS,aT) = if ((aT >= aP))
432+ then aS
433+ else bo(aS, aO[aT])
507434
435+ func aU (aS,aT) = if ((aT >= aP))
436+ then aS
437+ else throw("List size exceeds 6")
508438
509-@Callable(au)
510-func unstakeToken (j,az) = {
511- let aU = getStringValue(e, "setup_supportedAssets")
512- if ((au.caller != this))
513- then throw("only for internal smart contract invocations")
514- else if ((indexOf(aU, j) == unit))
515- then nil
516- else {
517- let aV = C(("autostake_amount_" + j))
518- let aW = invoke(e, "unstakeLP", [j, az], nil)
519- if ((aW == aW))
520- then [IntegerEntry(("autostake_amount_" + j), (aV - az))]
521- else throw("Strict value is not equal to itself.")
522- }
439+ aU(aR(aR(aR(aR(aR(aR(aQ, 0), 1), 2), 3), 4), 5), 6)
440+ } / size(bn))
441+ let bB = aJ(L)
442+ if ((bB == bB))
443+ then {
444+ let bC = bB
445+ let bD = bC._1
446+ let bE = bC._2
447+ let bF = if ((bD != 0))
448+ then fraction(bp, 10000, bD)
449+ else throw(("orderbook result zero for " + L))
450+ let bG = if ((bF > (10000 - x)))
451+ then ((10000 + x) > bF)
452+ else false
453+ let bq = fraction(bj, 10000, parseIntValue(bm[(size(bm) - 1)]))
454+ let br = if (((10000 + y) > bq))
455+ then (bq > (10000 - y))
456+ else false
457+ let bs = (((if (bG)
458+ then 1
459+ else 2) + (if (bE)
460+ then 1
461+ else 0)) + (if (!(br))
462+ then 1
463+ else 0))
464+ if (!(bG))
465+ then [IntegerEntry((L + "_riskLevel"), bs)]
466+ else if ((5 >= size(bn)))
467+ then {
468+ let bt = makeString(bn, ",")
469+[IntegerEntry((L + "_twap5B"), bp), IntegerEntry((L + "_lastBlock"), height), StringEntry((L + "_lastPrices"), bt), IntegerEntry((L + "_riskLevel"), bs)]
470+ }
471+ else {
472+ let bt = makeString(removeByIndex(bn, (size(bn) - 1)), ",")
473+[IntegerEntry((L + "_twap5B"), bp), IntegerEntry((L + "_lastBlock"), height), StringEntry((L + "_lastPrices"), bt), IntegerEntry((L + "_riskLevel"), bs)]
474+ }
475+ }
476+ else throw("Strict value is not equal to itself.")
477+ }
523478 }
524479
525480
526481
527-@Callable(au)
528-func addInterest (j,az) = if ((au.caller != this))
529- then throw("only for self invocation")
482+@Callable(G)
483+func updateTokens () = if ((G.originCaller != c))
484+ then throw("available for backend only")
530485 else {
531- let aX = C(("autostake_lastEarned_" + j))
532- let aY = C(("autostake_lastBlock_" + j))
533- let aZ = fraction(az, 80, 100)
534- let ba = if (if ((aY == height))
535- then true
536- else (az == 0))
537- then nil
538- else [IntegerEntry(("autostake_preLastEarned_" + j), aX), IntegerEntry(("autostake_preLastBlock_" + j), aY), IntegerEntry(("autostake_lastEarned_" + j), (aX + aZ)), IntegerEntry(("autostake_lastBlock_" + j), height)]
539- (ba ++ [IntegerEntry((j + "_sRate"), (C((j + "_sRate")) + fraction(o, aZ, C(("total_supplied_" + j)))))])
540- }
486+ let bH = invoke(this, "updateTokenPrice", ["WAVES"], nil)
487+ if ((bH == bH))
488+ then {
489+ let bI = invoke(this, "updateTokenPrice", [f], nil)
490+ if ((bI == bI))
491+ then {
492+ func bJ (aC,aD) = {
493+ let bK = invoke(this, "updateTokenPrice", [aD], nil)
494+ if ((bK == bK))
495+ then nil
496+ else throw("Strict value is not equal to itself.")
497+ }
541498
499+ let bL = {
500+ let aO = i
501+ let aP = size(aO)
502+ let aQ = nil
503+ func aR (aS,aT) = if ((aT >= aP))
504+ then aS
505+ else bJ(aS, aO[aT])
542506
507+ func aU (aS,aT) = if ((aT >= aP))
508+ then aS
509+ else throw("List size exceeds 20")
543510
544-@Callable(au)
545-func addInterestEXTERNAL () = {
546- let az = fraction(au.payments[0].amount, 80, 100)
547- let J = au.payments[0].assetId
548- let j = I(J)
549- let aX = C(("autostake_lastEarned_" + j))
550- let aY = C(("autostake_lastBlock_" + j))
551- let ba = if (if ((aY == height))
552- then true
553- else (az == 0))
554- then nil
555- else [IntegerEntry(("autostake_preLastEarned_" + j), aX), IntegerEntry(("autostake_preLastBlock_" + j), aY), IntegerEntry(("autostake_lastEarned_" + j), (aX + az)), IntegerEntry(("autostake_lastBlock_" + j), height)]
556- (ba ++ [IntegerEntry((j + "_sRate"), (C((j + "_sRate")) + fraction(o, az, C(("total_supplied_" + j)))))])
557- }
558-
559-
560-
561-@Callable(au)
562-func preInit (bb,bc,bd,be) = {
563- func s (t,ae) = (t ++ [IntegerEntry((ae + "_bRate"), o), IntegerEntry((ae + "_sRate"), o)])
564-
565- if ((au.caller != this))
566- then throw("admin only")
567- else {
568- let ah = {
569- let v = split(bb, ",")
570- let w = size(v)
571- let x = nil
572- func y (z,A) = if ((A >= w))
573- then z
574- else s(z, v[A])
575-
576- func B (z,A) = if ((A >= w))
577- then z
578- else throw("List size exceeds 12")
579-
580- B(y(y(y(y(y(y(y(y(y(y(y(y(x, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
581- }
582- ([StringEntry("setup_tokens", bb), StringEntry("setup_ltvs", bc), StringEntry("setup_lts", bd), StringEntry("setup_penalties", be), BooleanEntry("setup_active", true)] ++ ah)
583- }
584- }
585-
586-
587-
588-@Callable(au)
589-func initNewToken (ae,bf,bg,bh) = if ((au.caller != this))
590- then throw("admin only")
591- else [StringEntry("setup_tokens", ((G("setup_tokens") + ",") + ae)), StringEntry("setup_ltvs", ((G("setup_ltvs") + ",") + bf)), StringEntry("setup_lts", ((G("setup_lts") + ",") + bg)), StringEntry("setup_penalties", ((G("setup_penalties") + ",") + bh)), IntegerEntry((ae + "_bRate"), o), IntegerEntry((ae + "_sRate"), o)]
592-
593-
594-
595-@Callable(au)
596-func updateParameter (D,bi) = if (if ((au.caller != this))
597- then (au.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8'))
598- else false)
599- then throw("admin only")
600- else [IntegerEntry(D, parseIntValue(bi))]
601-
602-
603-
604-@Callable(au)
605-func updateString (D,bi) = if (if ((au.caller != this))
606- then (au.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8'))
607- else false)
608- then throw("admin only")
609- else [StringEntry(D, bi)]
610-
611-
612-
613-@Callable(au)
614-func claimToReserveFund (bj) = {
615- let bk = M()
616- let ah = ac(bk[0], "sRate")._2
617- let r = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
618- func s (t,bl) = if ((bl >= size(bk)))
619- then t
620- else {
621- let j = bk[bl]
622- let bm = G(("autostake_amount_" + j))
623- let az = ((((L(j) + C(("autostake_amount_" + j))) + (if ((bm != ""))
624- then parseIntValue(bm)
625- else 0)) + fraction(C(("total_borrowed_" + j)), ah[((bl * 3) + 1)].value, o)) - fraction(C(("total_supplied_" + j)), ah[(bl * 3)].value, o))
626- let aG = if ((G(("setup_autostake_" + j)) != ""))
627- then invoke(this, "unstakeToken", [j, az], nil)
628- else unit
629- if ((aG == aG))
630- then (t ++ [az])
631- else throw("Strict value is not equal to itself.")
632- }
633-
634- let bn = {
635- let v = r
636- let w = size(v)
637- let x = nil
638- func y (z,A) = if ((A >= w))
639- then z
640- else s(z, v[A])
641-
642- func B (z,A) = if ((A >= w))
643- then z
644- else throw("List size exceeds 12")
645-
646- B(y(y(y(y(y(y(y(y(y(y(y(y(x, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
647- }
648- func bo (t,bl) = if ((bl >= size(bk)))
649- then t
650- else {
651- let j = bk[bl]
652- (t ++ [ScriptTransfer(a, max([bn[bl], 0]), K(j))])
653- }
654-
655- if (bj)
656- then throw(q(bn))
657- else $Tuple2({
658- let v = r
659- let w = size(v)
660- let x = nil
661- func bp (z,A) = if ((A >= w))
662- then z
663- else bo(z, v[A])
664-
665- func bq (z,A) = if ((A >= w))
666- then z
667- else throw("List size exceeds 12")
668-
669- bq(bp(bp(bp(bp(bp(bp(bp(bp(bp(bp(bp(bp(x, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
670- }, bn)
671- }
672-
673-
674-
675-@Callable(au)
676-func reSetup (j) = {
677- let br = C("resetup_lastUpdate")
678- if ((p > (height - br)))
679- then throw("can be updated only once per day")
680- else {
681- let bd = split(G("setup_lts"), ",")
682- let bk = M()
683- let S = ag(j)
684- let bs = C((("setup_" + j) + "_tempLT"))
685- let bg = parseIntValue(bk[value(indexOf(bk, j))])
686- if ((S > 90000000))
687- then [IntegerEntry((("setup_" + j) + "_tempLT"), fraction(bs, 9975, 10000))]
688- else if (if ((bg > bs))
689- then (90000000 > S)
690- else false)
691- then [IntegerEntry((("setup_" + j) + "_tempLT"), fraction(bs, 10025, 10000))]
692- else nil
693- }
694- }
695-
696-
697-
698-@Callable(au)
699-func shutdown (bt) = if ((indexOf(f, au.caller.bytes) == unit))
700- then throw("user not in a whitelist")
701- else [BooleanEntry("setup_active", !(bt))]
702-
703-
704-
705-@Callable(au)
706-func liquidate (bj,h,av,bu,bv,bw) = if (!(g(au.caller)))
707- then throw("temporarily available for whitelist only")
708- else if (!(F("setup_active")))
709- then throw("market is stopped")
710- else {
711- let bx = aq(h)
712- if ((bx == bx))
713- then {
714- let by = ac(bu, "sRate")
715- let ax = by._1
716- let bz = by._2
717- let bA = ac(bv, "bRate")
718- let aP = bA._1
719- let bB = bA._2
720- let bC = fraction(av, o, ax)
721- let bD = C(((h + "_supplied_") + bu))
722- let bE = C(((h + "_borrowed_") + bv))
723- let bF = if ((bE > 0))
724- then bE
725- else throw("user has no borrow in this token")
726- if ((bx > 0))
727- then throw("user can't be liquidated")
728- else if ((bC > bD))
729- then throw("position to liquidate is bigger than user's supply")
730- else {
731- let bG = L(bu)
732- if ((bG == bG))
511+ aU(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aQ, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
512+ }
513+ if ((bL == bL))
514+ then {
515+ let bM = invoke(this, "updateLpTokenPrice", [o[0]], nil)
516+ if ((bM == bM))
733517 then {
734- let bH = L(bv)
735- if ((bH == bH))
518+ let bN = invoke(this, "updateLpTokenPrice", [o[1]], nil)
519+ if ((bN == bN))
736520 then {
737- let aG = if ((G(("setup_autostake_" + bu)) != ""))
738- then invoke(this, "unstakeToken", [bu, bC], nil)
739- else unit
740- if ((aG == aG))
521+ let bO = invoke(this, "updateLpTokenPrice", [o[2]], nil)
522+ if ((bO == bO))
741523 then {
742- let bI = invoke(d, "swap", [bw, 0], [AttachedPayment(K(bu), av)])
743- if ((bI == bI))
744- then {
745- let bJ = (bG - L(bu))
746- if ((bJ == bJ))
747- then {
748- let bK = (L(bv) - bH)
749- if ((bK == bK))
750- then {
751- let bL = an(bu)._1
752- let bM = ao(bu)
753- let bN = fraction(bJ, bL, bM)
754- let bO = an(bv)._2
755- let bP = ao(bv)
756- let bQ = fraction(bK, bO, bP)
757- let bh = parseIntValue(split(G("setup_penalties"), ",")[value(indexOf(M(), bv))])
758- let bR = (bQ - fraction(bN, (m - bh), m))
759- let bS = fraction(bJ, o, ax)
760- let bT = fraction(fraction(bK, o, aP), (m - fraction(bR, m, bQ)), m)
761- if ((bJ > av))
762- then throw("more assets exchanged than expected")
763- else if ((0 > bR))
764- then throw("price impact is bigger than liquidation penalty")
765- else [IntegerEntry(((h + "_supplied_") + bu), (bD - bS)), IntegerEntry(((h + "_borrowed_") + bv), (bF - bT)), IntegerEntry(("total_supplied_" + bu), (C(("total_supplied_" + bu)) - bS)), IntegerEntry(("total_borrowed_" + bv), (C(("total_borrowed_" + bv)) - bT))]
766- }
767- else throw("Strict value is not equal to itself.")
768- }
769- else throw("Strict value is not equal to itself.")
770- }
524+ let bP = invoke(this, "updateWxLpTokenPrice", [s[0]], nil)
525+ if ((bP == bP))
526+ then bL
771527 else throw("Strict value is not equal to itself.")
772528 }
773529 else throw("Strict value is not equal to itself.")
776532 }
777533 else throw("Strict value is not equal to itself.")
778534 }
779- }
780- else throw("Strict value is not equal to itself.")
781- }
535+ else throw("Strict value is not equal to itself.")
536+ }
537+ else throw("Strict value is not equal to itself.")
538+ }
539+ else throw("Strict value is not equal to itself.")
540+ }
782541
783542
784543
785-@Callable(au)
786-func liquidateV2 (bj,h,bu) = if (!(g(au.caller)))
787- then throw("temporarily available for whitelist only")
788- else if (!(F("setup_active")))
789- then throw("market is stopped")
790- else {
791- let bU = au.payments[0].assetId
792- let bv = I(bU)
793- let bV = au.payments[0].amount
794- let bx = aq(h)
795- if ((bx == bx))
796- then if ((bx > 0))
797- then throw("user can't be liquidated")
798- else {
799- let bW = M()
800- let bX = value(indexOf(bW, bv))
801- let bY = value(indexOf(bW, bu))
802- let bZ = ac(bv, "bRate")
803- let aP = bZ._1
804- let bz = bZ._2
805- let bO = an(bv)._2
806- let bP = ao(bv)
807- let ca = fraction(bV, bO, bP)
808- let bh = parseIntValue(value(split(G("setup_penalties"), ",")[bX]))
809- let bL = an(bu)._1
810- let bM = ao(bu)
811- let cb = fraction(ca, (m + bh), m)
812- let bC = fraction(cb, bM, bL)
813- let cc = fraction(bV, o, aP)
814- let cd = fraction(bC, o, bz[((bY * 3) + 1)].value)
815- let bD = C(((h + "_supplied_") + bu))
816- let bE = C(((h + "_borrowed_") + bv))
817- let bF = if ((bE > 0))
818- then bE
819- else throw("user has no borrow in this token")
820- if ((cd > bD))
821- then throw("position to liquidate is bigger than user's supply")
822- else {
823- let aG = if ((G(("setup_autostake_" + bu)) != ""))
824- then invoke(this, "unstakeToken", [bu, bC], nil)
825- else unit
826- if ((aG == aG))
827- then if (bj)
828- then throw("liquidation will pass")
829- else ([ScriptTransfer(au.caller, bC, K(bu)), IntegerEntry(((h + "_supplied_") + bu), (bD - cd)), IntegerEntry(((h + "_borrowed_") + bv), (bF - cc)), IntegerEntry(("total_supplied_" + bu), (C(("total_supplied_" + bu)) - cd)), IntegerEntry(("total_borrowed_" + bv), (C(("total_borrowed_" + bv)) - cc))] ++ bz)
830- else throw("Strict value is not equal to itself.")
831- }
832- }
833- else throw("Strict value is not equal to itself.")
834- }
835-
836-
837-
838-@Callable(au)
839-func getUserCollateral (bj,h,ce,cf) = {
840- let bk = M()
841- let bc = split(G("setup_ltvs"), ",")
842- let bd = split(G("setup_lts"), ",")
843- let ah = ac(bk[0], "sRate")._2
844- let cg = split(cf, ",")
845- func s (t,u) = if ((u >= size(bk)))
846- then t
847- else {
848- let ch = C(((h + "_supplied_") + bk[u]))
849- let ci = C(((h + "_borrowed_") + bk[u]))
850- let cj = if ((cf == ""))
851- then if (if ((ci != 0))
852- then true
853- else (ch != 0))
854- then true
855- else false
856- else true
857- if (cj)
858- then {
859- let aE = ao(bk[u])
860- let aB = an(bk[u])
861- ((t + fraction(fraction(fraction((ch + (if (if (if ((cf != ""))
862- then (cg[0] == bk[u])
863- else false)
864- then (cg[1] == "supplied")
865- else false)
866- then parseIntValue(cg[2])
867- else 0)), ah[(u * 3)].value, o), parseIntValue(bc[u]), m), aB._1, aE)) - (if (ce)
868- then fraction(fraction(fraction((ci + (if (if (if ((cf != ""))
869- then (cg[0] == bk[u])
870- else false)
871- then (cg[1] == "borrowed")
872- else false)
873- then parseIntValue(cg[2])
874- else 0)), ah[((u * 3) + 1)].value, o), m, parseIntValue(bd[u])), aB._2, aE)
875- else 0))
876- }
877- else t
878- }
879-
880- let ck = {
881- let v = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
882- let w = size(v)
883- let x = 0
884- func y (z,A) = if ((A >= w))
885- then z
886- else s(z, v[A])
887-
888- func B (z,A) = if ((A >= w))
889- then z
890- else throw("List size exceeds 12")
891-
892- B(y(y(y(y(y(y(y(y(y(y(y(y(x, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
544+@Callable(G)
545+func initNewMaster (bQ) = {
546+ let bR = {
547+ let D = addressFromString(bQ)
548+ if ($isInstanceOf(D, "Address"))
549+ then {
550+ let bS = D
551+ true
552+ }
553+ else false
893554 }
894- if (bj)
895- then throw(toString(ck))
896- else $Tuple2(ah, ck)
555+ if (!(bR))
556+ then throw(("incorrect address " + bQ))
557+ else if ((G.caller != this))
558+ then throw("available for self call only")
559+ else [StringEntry("verifier_master", bQ)]
897560 }
898561
899562
900563
901-@Callable(au)
902-func getPrices (bj) = {
903- let bk = M()
904- func s (t,u) = if ((u >= size(bk)))
905- then t
906- else {
907- let aB = aj(bk[u], 3)
908- ((((t + toString(aB._1)) + ",") + toString(aB._2)) + "|")
909- }
910-
911- let ck = {
912- let v = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
913- let w = size(v)
914- let x = ""
915- func y (z,A) = if ((A >= w))
916- then z
917- else s(z, v[A])
918-
919- func B (z,A) = if ((A >= w))
920- then z
921- else throw("List size exceeds 12")
922-
923- B(y(y(y(y(y(y(y(y(y(y(y(y(x, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
564+@Callable(G)
565+func requestNewMaster (bT) = {
566+ let bR = {
567+ let D = addressFromString(bT)
568+ if ($isInstanceOf(D, "Address"))
569+ then {
570+ let bS = D
571+ true
572+ }
573+ else false
924574 }
925- if (bj)
926- then throw(ck)
927- else $Tuple2(nil, ck)
575+ if (!(bR))
576+ then throw(("incorrect address " + bT))
577+ else if ((indexOf(b, G.caller) == unit))
578+ then throw("whitelist only")
579+ else [StringEntry("verifier_newMaster", bT), IntegerEntry("verifier_newMasterEligibleAfter", (height + 10000))]
928580 }
929581
930582
931583
932-@Callable(au)
933-func calculateUtilizationRatio (j,bj) = if (bj)
934- then throw(toString(ag(j)))
935- else $Tuple2(nil, ag(j))
936-
937-
938-
939-@Callable(au)
940-func calculateOutdatedUR (j,bj) = if (bj)
941- then throw(toString(P(j)))
942- else $Tuple2(nil, P(j))
943-
944-
945-
946-@Callable(au)
947-func calculateTokenRates (bj) = {
948- func s (t,j) = {
949- let ah = V(j)
950- $Tuple2(((((t._1 + toString(ah[1].value)) + "|") + toString(ah[0].value)) + ","), (t._2 ++ ah))
951- }
952-
953- let bn = {
954- let v = M()
955- let w = size(v)
956- let x = $Tuple2("", nil)
957- func y (z,A) = if ((A >= w))
958- then z
959- else s(z, v[A])
960-
961- func B (z,A) = if ((A >= w))
962- then z
963- else throw("List size exceeds 12")
964-
965- B(y(y(y(y(y(y(y(y(y(y(y(y(x, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
966- }
967- if (bj)
968- then throw(bn._1)
969- else $Tuple2(bn._2, bn._1)
584+@Callable(G)
585+func activateNewMaster () = {
586+ let bU = getIntegerValue(this, "verifier_newMasterEligibleAfter")
587+ let bT = getStringValue(this, "verifier_newMaster")
588+ if ((indexOf(b, G.caller) == unit))
589+ then throw("whitelist only")
590+ else if ((bU > height))
591+ then throw("new master cannot be activated yet")
592+ else [DeleteEntry("verifier_newMaster"), DeleteEntry("verifier_newMasterEligibleAfter"), StringEntry("verifier_master", bT)]
970593 }
971594
972595
973-
974-@Callable(au)
975-func calculateTokensInterest (bj) = {
976- func s (t,j) = {
977- let U = fraction(R(j), p, m)
978- ((t + toString(U)) + ",")
979- }
980-
981- let bn = {
982- let v = M()
983- let w = size(v)
984- let x = ""
985- func y (z,A) = if ((A >= w))
986- then z
987- else s(z, v[A])
988-
989- func B (z,A) = if ((A >= w))
990- then z
991- else throw("List size exceeds 12")
992-
993- B(y(y(y(y(y(y(y(y(y(y(y(y(x, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
994- }
995- if (bj)
996- then throw(bn)
997- else $Tuple2(nil, bn)
998- }
999-
1000-
1001-
1002-@Callable(au)
1003-func initNewMaster (cl) = {
1004- let cm = {
1005- let k = addressFromString(cl)
1006- if ($isInstanceOf(k, "Address"))
596+@Verifier(bV)
597+func bW () = {
598+ let bX = getString("verifier_master")
599+ let bY = {
600+ let D = bX
601+ if ($isInstanceOf(D, "String"))
1007602 then {
1008- let cn = k
1009- true
1010- }
1011- else false
1012- }
1013- if (!(cm))
1014- then throw(("incorrect address " + cl))
1015- else if ((au.caller != this))
1016- then throw("available for self call only")
1017- else [StringEntry("verifier_master", cl)]
1018- }
1019-
1020-
1021-
1022-@Callable(au)
1023-func requestNewMaster (co) = {
1024- let cm = {
1025- let k = addressFromString(co)
1026- if ($isInstanceOf(k, "Address"))
1027- then {
1028- let cn = k
1029- true
1030- }
1031- else false
1032- }
1033- if (!(cm))
1034- then throw(("incorrect address " + co))
1035- else if ((indexOf(l, au.caller) == unit))
1036- then throw("whitelist only")
1037- else [StringEntry("verifier_newMaster", co), IntegerEntry("verifier_newMasterEligibleAfter", (height + 10000))]
1038- }
1039-
1040-
1041-
1042-@Callable(au)
1043-func activateNewMaster () = {
1044- let cp = getIntegerValue(this, "verifier_newMasterEligibleAfter")
1045- let co = getStringValue(this, "verifier_newMaster")
1046- if ((indexOf(l, au.caller) == unit))
1047- then throw("whitelist only")
1048- else if ((cp > height))
1049- then throw("new master cannot be activated yet")
1050- else [DeleteEntry("verifier_newMaster"), DeleteEntry("verifier_newMasterEligibleAfter"), StringEntry("verifier_master", co)]
1051- }
1052-
1053-
1054-@Verifier(cq)
1055-func cr () = {
1056- let cs = getString("verifier_master")
1057- let ct = {
1058- let k = cs
1059- if ($isInstanceOf(k, "String"))
1060- then {
1061- let at = k
1062- let cu = getInteger(addressFromStringValue(at), ("approvedTx_" + toBase58String(cq.id)))
1063- if ($isInstanceOf(cu, "Int"))
603+ let bZ = D
604+ let ca = getInteger(addressFromStringValue(bZ), ("approvedTx_" + toBase58String(bV.id)))
605+ if ($isInstanceOf(ca, "Int"))
1064606 then {
1065- let cv = cu
1066- cv
607+ let cb = ca
608+ cb
1067609 }
1068610 else 0
1069611 }
1070612 else 1
1071613 }
1072- if (sigVerify(cq.bodyBytes, cq.proofs[0], cq.senderPublicKey))
1073- then (ct > 0)
614+ if (sigVerify(bV.bodyBytes, bV.proofs[0], bV.senderPublicKey))
615+ then (bY > 0)
1074616 else false
1075617 }
1076618
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let a = Address(base58'3P4kBiU4wr2yV1S5gMfu3MdkVvy7kxXHsKe')
4+let a = 100000000
55
6-let b = 20
6+let b = [Address(base58'3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL'), Address(base58'3PQdNxynJy5mche2kxMVc5shXWzK8Gstq3o'), Address(base58'3P8auNWJkxxByyJtwErFXaxiXcGM45qQ1hA'), Address(base58'3P8qVX189qpoTJZQQQdKS9endHK5sxWsvrd')]
77
8-let c = Address(base58'3P8d1E1BLKoD52y3bQJ1bDTd2TD1gpaLn9t')
8+let c = Address(base58'3PLGH6sG6ND59GU6gFXHKQRuL5bdpWFs6U6')
99
10-let d = Address(base58'3PGFHzVGT4NTigwCKP1NcwoXkodVZwvBuuU')
10+let d = Address(base58'3PPXVKjN6nRMzXeegcYhfiic96pd2c98Ekm')
1111
12-let e = Address(base58'3PDDRRS5gKyDQRpJskzWTdxREHGu1FNpdwg')
12+let e = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
1313
14-let f = [base58'3PBTPFGaKL7qEdj9Tz1QUqbvJUcPNu934j4', base58'3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL', base58'3PAxdDSmN758L5SHSGRC5apEtQE2aApZotG', base58'3PJKmXoHJvVeQXjSJdhtkUcFDtdiQqMbUTD', base58'3PQdNxynJy5mche2kxMVc5shXWzK8Gstq3o', base58'3PHbdpaKzz8EiAngGHaFu2hVuNCdsC67qh3', base58'3P6Ksahs71SiKQgQ4qaZuFAVhqncdi2nvJQ']
14+let f = "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p"
1515
16-func g (h) = !(if (if ((h != Address(base58'3PCqdm1mAoQqR46oZotFanmqb5CLUvrKEo2')))
17- then (h != Address(base58'3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL'))
18- else false)
19- then (h != Address(base58'3PHbdpaKzz8EiAngGHaFu2hVuNCdsC67qh3'))
20- else false)
16+let g = "3VuV5WTmDz47Dmdn3QpcYjzbSdipjQE4JMdNe1xZpX13"
2117
18+let h = ["9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi", "HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW"]
2219
23-func i (j) = {
24- let k = j
25- $Tuple4(20000000, 100000000, 60000000, 400000000)
20+let i = ["6nSpVyNH7yM69eg446wrQR94ipbbcmZMU1ENPwanC97g", "Ehie5xYpeN8op1Cctc6aGUrqx8jq3jtf1DSjXDbfm7aT", "4LHHvYGNKJUg5hj65aGD5vgScvCBmLpdRFtjokvCjSL8", "C1iWsKGqLwjHUndiQ7iXpdmPum9PeCDFfyXBdJJosDRS", "34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ", "6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ", "HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS", "Ajso6nTTjptu2UHLx6hfSXVtHFtRBJCkKYd5SAyj7zf5", "DSbbhLsSTeDg5Lsiufk2Aneh3DjVqJuPr2M9uU1gwy5p", "Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on", "2thsACuHmzDMuNezPM32wg9a3BwUzBWDeSKakgz3cw21", "YiNbofFzC17jEHHCMwrRcpy9MrrjabMMLZxg8g5xmf7", "8t4DPWTwPzpatHA9AkTxWAB47THnYzBsDnoY7fQqbG91", "At8D6NFFpheCbvKVnjVoeLL84Eo8NZn6ovManxfLaFWL", "6phK22ztGBW127gUFmdMEHKB3CVd6ZhWox2WtwJkbqTq", "3VuV5WTmDz47Dmdn3QpcYjzbSdipjQE4JMdNe1xZpX13", "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi"]
21+
22+let j = [false, false, false, false, true, true, false, false, false, false, false, false, false, false, true, false, true, true]
23+
24+let k = [1000000, 100000000, 100000000, 100000000, 1000000, 1000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000, 1000000, 1000000, 100000000, 1000000, 1000000]
25+
26+let l = ["DZeA7RbVab98r61hVH5zcFZXwNALPJGgq1eyHandsKKW", "72E4MMFHngsixqAkNZCRJMLTmgAP9nufdsXexnS5qxVx", "FTTJnB6xG4CKZEJMgsgqjmgbzcyH8ya3tV8LQP2GCDs7", "3UnytNnkd48fHofHPBp59BkpZA1uMSJ8PdhWUCuerics", "ByJtVuYi58CtdjtasDuTqtgev8qWkdJybF7rY1xosmhE", "BoXuf9ewJSE1UMrKibZmigzC6tBzv8RFTeZmofEos2ZJ", "7G687ui3m59oAd6qkyni2vt77bHF4bbA6xcPfDo3uiTu", "EMsZpqcT8NuMYZCEPHzvrhQCQKhfXjdeekZvcWpHsNvh", "E3YhURNsCmjUaYNigH6AayLxbh9u81uVGU3ZvHKznY5v", "BiSzFe8nSL78oZaebfoin5vBZ5Pze6d7kaeijLqr5xZe", "AKQsEQoeinKRFtdx6rhKWcpkAMu6cbDLdtSWnR8tpBCq", "DjgwW4CMJEfpzj7SLFFPiCqf1zfmAgf1MD5gAS8SjKt4", "", "F3s92VRdppEtLVAP697CTM6AzZJECRcoMx5kj2FkGv4M", "6iMB6LKSrgv9waEvEnN6Ydyx7dfxPnGcTw8318WVm5bR", "E6MUGSUieSsq6QiJcbp6REdQXyjp6uPWLitnp9Gdtsuh", "6KWpnpLk6GNh5HG9ct9pNDCYFWJBoAAshZsp4D8jcFpV", ""]
27+
28+let m = ["", "", "", "3P3Y38zymCHoTM6qcE9JcEA8rhaGTQbVMgu", "", "", "3P615yXeQ9Qu4qBM1QGimGzixyMS5W4Ktug", "3PEkD5LuHGWhUfgBW1owZFxVydYoWjV6Jia", "3P5HjPowgipiVB3UvXphDiPvKs424WC9xQw", "3PCENpEKe8atwELZ7oCSmcdEfcRuKTrUx99", "", "", "3PH832eKnw67PFvJfUg9Knz6BHM87QvjMeL", "", "3PGcYzoUfQEQkhRgrBqmG5Wpc7A1ncFvRtM", "", "", ""]
29+
30+let n = ["3P2V63Xd6BviDkeMzxhUw2SJyojByRz8a8m", "3P27S9V36kw2McjWRZ37AxTx8iwkd7HXw6W", "3P6DLdJTP2EySq9MFdJu6beUevrQd2sVVBh", "", "", "", "3PBHyEwmERR1CEkrTNbPj2bgyisTfPRqfee", "3PDSXwwA2xAtmxeo2bebDP3AA5ynZ2Krgnw", "3PJ48P3p2wvWUjgQaQiZ2cFbr8qmxMokBGd", "3PKi4G3VX2k42ZSmNNrmvgdDH7JzRaUhY7R", "", "", "3PCwvns2dnmobD6Z4cR86v98s7LgMZYygEy", "3PLp9KrdrbWAvSFHGJVEaszUubquz3M6mfe", "", "", "", ""]
31+
32+let o = ["9dbpSr8d18qWQxn5fJJSS1LLQ8CmSZ6gYmjuPRzg3RBM", "9MKixRt9rNRyaJCT2pexbXkuvpZBdJREdTU36bGit8iw", "6bZbRmou7M7wXBunMXQnZ4Rm66HxZF3KfMEiFwk3wmnA"]
33+
34+let p = ["Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on", "WAVES", "WAVES"]
35+
36+let q = [Address(base58'3PKJxKhn9MrzcvZv689bUpZgh4rurEgoKC8'), Address(base58'3P4PFYKHyxitgwVb4WVWEcdH7ZsuR4GgcXC'), Address(base58'3PCpjLGo4wDuv23kjmGF6mHs86Bf3soYvAq')]
37+
38+let r = [30000000, 20000000, 20000000]
39+
40+let s = ["rZMQ6g31Lr7sPAaAoYc4U2PHCVauTuKUSzUbJtUyPZN"]
41+
42+let t = [["9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi", "HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW"]]
43+
44+let u = "3P8MoPnsaurofk1VyhsdAFkeQ6ijpJYXCpW"
45+
46+let v = addressFromStringValue(u)
47+
48+let w = addressFromStringValue("3P56jNQzECXnrWpnbbSJKw7Eooo6fkUaMPp")
49+
50+let x = 1000
51+
52+let y = 3000
53+
54+let z = ""
55+
56+let A = "__"
57+
58+func B (C) = {
59+ let D = C
60+ if ($isInstanceOf(D, "String"))
61+ then {
62+ let E = D
63+ E
64+ }
65+ else throw("fail to cast into String")
2666 }
2767
2868
29-let l = [Address(base58'3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL'), Address(base58'3PQdNxynJy5mche2kxMVc5shXWzK8Gstq3o'), Address(base58'3P8auNWJkxxByyJtwErFXaxiXcGM45qQ1hA'), Address(base58'3P8qVX189qpoTJZQQQdKS9endHK5sxWsvrd')]
30-
31-let m = 100000000
32-
33-let n = 10000000000
34-
35-let o = (m * m)
36-
37-let p = 1440
38-
39-func q (r) = {
40- func s (t,u) = ((t + toString(u)) + ",")
41-
42- let v = r
43- let w = size(v)
44- let x = ""
45- func y (z,A) = if ((A >= w))
46- then z
47- else s(z, v[A])
48-
49- func B (z,A) = if ((A >= w))
50- then z
51- else throw("List size exceeds 12")
52-
53- B(y(y(y(y(y(y(y(y(y(y(y(y(x, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
69+func F (C) = {
70+ let D = C
71+ if ($isInstanceOf(D, "Int"))
72+ then {
73+ let G = D
74+ G
75+ }
76+ else throw("fail to cast into Int")
5477 }
5578
5679
57-func C (D) = {
58- let k = getInteger(this, D)
59- if ($isInstanceOf(k, "Int"))
80+func H (I) = {
81+ let D = getInteger(this, I)
82+ if ($isInstanceOf(D, "Int"))
6083 then {
61- let E = k
62- E
84+ let J = D
85+ J
6386 }
6487 else 0
6588 }
6689
6790
68-func F (D) = {
69- let k = getBoolean(this, D)
70- if ($isInstanceOf(k, "Boolean"))
71- then {
72- let E = k
73- E
91+func K (L) = if ((L == "WAVES"))
92+ then unit
93+ else fromBase58String(L)
94+
95+
96+let M = "3PKkojKdd6BBzTf1RXbQVfUDraNFXXHKzQF"
97+
98+let N = addressFromStringValue(M)
99+
100+let O = valueOrErrorMessage(getInteger(N, "%s%s__price__USDN-USDT"), "DORA doesn't contain USDN/USDT price")
101+
102+func P (Q,R) = {
103+ let S = i[Q]
104+ let T = fromBase58String(S)
105+ if ((indexOf(h, S) != unit))
106+ then $Tuple2(1000000, "stable token price")
107+ else {
108+ let U = l[Q]
109+ let V = if ((U == ""))
110+ then $Tuple2(0, 0)
111+ else {
112+ let W = split(B(invoke(v, "poolStatsREADONLY", [U], nil)), "__")
113+ let X = if (j[Q])
114+ then $Tuple2(1, 2)
115+ else $Tuple2(2, 1)
116+ let Y = X._1
117+ let Z = X._2
118+ let aa = parseIntValue(W[Y])
119+ let ab = fraction(parseIntValue(W[Z]), 100000000, k[Q])
120+ let ac = fraction(aa, R, ab)
121+ let ad = ab
122+ $Tuple2(ac, ad)
123+ }
124+ let ac = V._1
125+ let ad = V._2
126+ let ae = m[Q]
127+ let af = if ((ae == ""))
128+ then $Tuple2(0, 0)
129+ else {
130+ let ag = addressFromStringValue(ae)
131+ let ah = assetBalance(ag, e)
132+ let ai = assetBalance(ag, T)
133+ $Tuple2(fraction((ah * (k[Q] / 1000000)), O, ai), ai)
134+ }
135+ let aj = af._1
136+ let ak = af._2
137+ let al = n[Q]
138+ let am = if ((al == ""))
139+ then $Tuple2(0, 0)
140+ else {
141+ let an = addressFromStringValue(al)
142+ let ao = F(invoke(w, "calcGetAmountCPMM", [al, "3P88qk1KzF1BKjD7fC7LjNVAKM4ezff5WE6", S, k[Q]], nil))
143+ let ap = fraction(ao, O, 1000000)
144+ let aq = getIntegerValue(an, "A_asset_balance")
145+ $Tuple2(ap, aq)
146+ }
147+ let ap = am._1
148+ let aq = am._2
149+ let ar = ((ad + ak) + aq)
150+ let as = ((fraction(ac, ad, ar) + fraction(aj, ak, ar)) + fraction(ap, aq, ar))
151+ let at = ((((((("T1UsdPriceX6=" + toString(as)) + " wx_T1Waves_T1UsdPriceX6=") + toString(ac)) + " wx_T1Xtn_T1UsdPriceX6=") + toString(aj)) + " swop_T1Xtn_T1UsdPriceX6=") + toString(ap))
152+ $Tuple2(as, at)
74153 }
75- else false
76154 }
77155
78156
79-func G (D) = {
80- let k = getString(this, D)
81- if ($isInstanceOf(k, "String"))
82- then {
83- let E = k
84- E
85- }
86- else ""
157+let au = "lastUpdatedBlock"
158+
159+let av = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
160+
161+func aw (ax,T) = ((("block_" + toString(ax)) + "_") + T)
162+
163+
164+func ay (T,ax) = valueOrElse(getInteger(d, aw(ax, T)), 0)
165+
166+
167+func az () = {
168+ let aA = valueOrErrorMessage(getInteger(d, au), "Last updated block key not found")
169+ if ((0 >= aA))
170+ then throw("Invalid block value")
171+ else if (((height - aA) > 10))
172+ then throw("The price has not been updated for a long time")
173+ else aA
87174 }
88175
89176
90-func H (D) = {
91- let k = getBinary(this, D)
92- if ($isInstanceOf(k, "ByteVector"))
93- then {
94- let E = k
95- E
96- }
97- else base58''
177+func aB (aC,aD) = {
178+ let aE = aC
179+ let aF = aE._1
180+ let ax = aE._2
181+ let T = aE._3
182+ let aG = aE._4
183+ let aH = ay(T, ax)
184+ let aI = (ax - aD)
185+ if ((aH > 0))
186+ then $Tuple4((aF :+ aH), aI, T, (aG + aH))
187+ else $Tuple4(aF, aI, T, aG)
98188 }
99189
100190
101-func I (J) = {
102- let k = J
103- if ($isInstanceOf(k, "ByteVector"))
191+func aJ (S) = {
192+ let aK = invoke(this, "getOrderbookTwap15", [S, false], nil)
193+ if ((aK == aK))
104194 then {
105- let E = k
106- toBase58String(E)
107- }
108- else "WAVES"
109- }
110-
111-
112-func K (j) = if ((j == "WAVES"))
113- then unit
114- else fromBase58String(j)
115-
116-
117-func L (j) = if ((j == "WAVES"))
118- then wavesBalance(this).available
119- else assetBalance(this, fromBase58String(j))
120-
121-
122-func M () = split(G("setup_tokens"), ",")
123-
124-
125-func N () = {
126- let O = G("setup_maxSupply")
127- if ((O == ""))
128- then [-1, -1, -1, -1, -1, -1, -1]
129- else split(O, ",")
130- }
131-
132-
133-func P (j) = {
134- let Q = fraction(C(("total_supplied_" + j)), C((j + "_sRate")), o)
135- if ((Q == 0))
136- then 0
137- else fraction(m, fraction(C(("total_borrowed_" + j)), C((j + "_bRate")), o), Q)
138- }
139-
140-
141-func R (j) = {
142- let S = P(j)
143- let T = i(j)
144- let U = (T._1 + (if ((T._3 >= S))
145- then fraction(S, T._2, T._3)
146- else (T._2 + fraction((S - T._3), T._4, (100000000 - T._3)))))
147- max([fraction(U, m, (p * 365)), 1])
148- }
149-
150-
151-func V (j) = {
152- let W = R(j)
153- let S = P(j)
154- let X = C("lastRateHeight")
155- let Y = max([C((j + "_bRate")), o])
156- let Z = (Y + ((height - X) * W))
157- let aa = max([C((j + "_sRate")), o])
158- let ab = (aa + ((((height - X) * fraction(W, S, m)) * (100 - b)) / 100))
159-[IntegerEntry((j + "_sRate"), ab), IntegerEntry((j + "_bRate"), Z), IntegerEntry("lastRateHeight", height)]
160- }
161-
162-
163-func ac (j,ad) = {
164- func s (t,ae) = {
165- let af = V(ae)
166- $Tuple2(if ((ae != j))
167- then t._1
168- else if ((ad == "sRate"))
169- then af[0].value
170- else af[1].value, (t._2 ++ af))
171- }
172-
173- let v = M()
174- let w = size(v)
175- let x = $Tuple2(0, nil)
176- func y (z,A) = if ((A >= w))
177- then z
178- else s(z, v[A])
179-
180- func B (z,A) = if ((A >= w))
181- then z
182- else throw("List size exceeds 12")
183-
184- B(y(y(y(y(y(y(y(y(y(y(y(y(x, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
185- }
186-
187-
188-func ag (j) = {
189- let ah = V(j)
190- let Q = fraction(C(("total_supplied_" + j)), ah[0].value, o)
191- fraction(m, fraction(C(("total_borrowed_" + j)), ah[1].value, o), Q)
192- }
193-
194-
195-func ai () = {
196- func s (t,ae) = (t ++ V(ae))
197-
198- let v = M()
199- let w = size(v)
200- let x = nil
201- func y (z,A) = if ((A >= w))
202- then z
203- else s(z, v[A])
204-
205- func B (z,A) = if ((A >= w))
206- then z
207- else throw("List size exceeds 12")
208-
209- B(y(y(y(y(y(y(y(y(y(y(y(y(x, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
210- }
211-
212-
213-func aj (j,ak) = if (if ((j == "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi"))
214- then true
215- else (j == "HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW"))
216- then $Tuple2(1000000, 1000000)
217- else {
218- let al = getIntegerValue(c, (j + "_twap5B"))
219- let am = getIntegerValue(c, (j + "_riskLevel"))
220- if ((ak >= am))
221- then $Tuple2(al, al)
222- else throw((("oracle prices don't match: " + toString(al)) + " is the price, but risk is too high"))
223- }
224-
225-
226-func an (j) = aj(j, 3)
227-
228-
229-func ao (j) = {
230- let ap = if ((j == "WAVES"))
231- then 8
232- else value(assetInfo(fromBase58String(j))).decimals
233- pow(10, 0, ap, 0, 0, DOWN)
234- }
235-
236-
237-func aq (h) = {
238- let ar = invoke(this, "getUserCollateral", [false, h, true, ""], nil)
239- if ((ar == ar))
240- then {
241- let as = {
242- let k = ar
243- if ($isInstanceOf(k, "Int"))
244- then {
245- let at = k
246- at
247- }
248- else throw("issue while doing in-dapp invocation")
195+ let aL = {
196+ let aM = aK
197+ if ($isInstanceOf(aM, "(Int, Boolean)"))
198+ then aM
199+ else throw(($getType(aM) + " couldn't be cast to (Int, Boolean)"))
249200 }
250- if ((as == as))
251- then as
201+ if ((aL == aL))
202+ then aL
252203 else throw("Strict value is not equal to itself.")
253204 }
254205 else throw("Strict value is not equal to itself.")
255206 }
256207
257208
258-@Callable(au)
259-func supply () = if (!(F("setup_active")))
260- then throw("market is stopped")
261- else if (if ((size(au.payments) != 1))
262- then true
263- else (au.payments[0].amount == 0))
264- then throw("1 payment has to be attached")
265- else {
266- let j = I(au.payments[0].assetId)
267- let av = au.payments[0].amount
268- let aw = ac(j, "sRate")
269- let ax = aw._1
270- let ay = aw._2
271- let az = fraction(av, o, ax, DOWN)
272- let h = toString(au.caller)
273- let aA = {
274- let k = getString(("setup_maxSupply_" + j))
275- if ($isInstanceOf(k, "String"))
276- then {
277- let at = k
278- parseIntValue(at)
279- }
280- else C(("setup_maxSupply_" + j))
281- }
282- let aB = an(j)
283- let aC = (C(((h + "_supplied_") + j)) + az)
284- let aD = (C(("total_supplied_" + j)) + az)
285- let U = ac(j, "sRate")._1
286- let aE = ao(j)
287- let aF = fraction(fraction(aD, U, o), aB._1, aE)
288- if ((indexOf(G("setup_tokens"), j) == unit))
289- then throw("this asset is not supported by the market")
290- else if (if ((aA != 0))
291- then (aF > aA)
292- else false)
293- then throw("max total supply for this token reached in the pool")
294- else if ((C(("setup_paused_" + j)) > 0))
295- then throw("this asset can't be supplied or borrowed")
296- else {
297- let aG = if ((G(("setup_autostake_" + j)) != ""))
298- then invoke(this, "stakeToken", [j, av], nil)
299- else unit
300- if ((aG == aG))
301- then ([IntegerEntry(((h + "_supplied_") + j), aC), IntegerEntry(("total_supplied_" + j), aD)] ++ ay)
302- else throw("Strict value is not equal to itself.")
303- }
304- }
209+@Callable(G)
210+func getOrderbookTwap15 (T,at) = {
211+ let aA = az()
212+ let aN = {
213+ let aO = av
214+ let aP = size(aO)
215+ let aQ = $Tuple4(nil, aA, T, 0)
216+ func aR (aS,aT) = if ((aT >= aP))
217+ then aS
218+ else aB(aS, aO[aT])
305219
220+ func aU (aS,aT) = if ((aT >= aP))
221+ then aS
222+ else throw("List size exceeds 15")
306223
307-
308-@Callable(au)
309-func withdraw (j,av) = {
310- let aH = ac(j, "sRate")
311- let ax = aH._1
312- let ay = aH._2
313- let az = fraction(av, o, ax, CEILING)
314- let h = toString(au.caller)
315- let aI = C(("total_supplied_" + j))
316- let aJ = C(("total_borrowed_" + j))
317- let aK = C(((h + "_supplied_") + j))
318- let aL = C(((h + "_borrowed_") + j))
319- let aM = invoke(this, "getUserCollateral", [false, h, true, ((j + ",supplied,") + toString(-(az)))], nil)
320- if ((aM == aM))
321- then {
322- let aN = {
323- let k = aM
324- if ($isInstanceOf(k, "Int"))
325- then {
326- let at = k
327- at
328- }
329- else throw("can't get user collateral value")
330- }
331- if (!(F("setup_active")))
332- then throw("market is stopped")
333- else if ((0 > aN))
334- then throw("you dont have enough collateral for this operation")
335- else if ((az > (aI - aJ)))
336- then throw("this amount is not available on the market")
337- else if ((az > (aK - aL)))
338- then throw("this amount is not available for this user")
339- else {
340- let aG = if ((G(("setup_autostake_" + j)) != ""))
341- then invoke(this, "unstakeToken", [j, av], nil)
342- else unit
343- if ((aG == aG))
344- then ([IntegerEntry(((h + "_supplied_") + j), (C(((h + "_supplied_") + j)) - az)), IntegerEntry(("total_supplied_" + j), (C(("total_supplied_" + j)) - az)), ScriptTransfer(au.caller, av, K(j))] ++ ay)
345- else throw("Strict value is not equal to itself.")
346- }
347- }
348- else throw("Strict value is not equal to itself.")
224+ aU(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aQ, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
225+ }
226+ let aV = aN._1
227+ let aG = aN._4
228+ let aW = fraction(aG, 1000000, fraction(size(aV), 1000000, 1))
229+ let aX = valueOrElse(getBoolean(d, (T + "_locked")), false)
230+ if (at)
231+ then throw((((((((("average: " + toString(aW)) + ", isLocked: ") + toString(aX)) + ", ") + "priceListSize: ") + toString(size(aV))) + ", sum: ") + toString(aG)))
232+ else $Tuple2(nil, $Tuple2(aW, aX))
349233 }
350234
351235
352236
353-@Callable(au)
354-func borrow (j,av) = {
355- let h = toString(au.caller)
356- let aO = ac(j, "bRate")
357- let aP = aO._1
358- let ay = aO._2
359- let az = fraction(av, o, aP, CEILING)
360- let aM = invoke(this, "getUserCollateral", [false, h, true, ((j + ",borrowed,") + toString(az))], nil)
361- if ((aM == aM))
237+@Callable(G)
238+func updateWxLpTokenPrice (L) = {
239+ let aY = getIntegerValue(N, "%s%s__price__WAVES-USDT")
240+ let Q = value(indexOf(s, L))
241+ let aZ = t[Q]
242+ let ba = if ((aZ[0] == "WAVES"))
243+ then aY
244+ else if ((indexOf(h, aZ[0]) != unit))
245+ then 1000000
246+ else P(value(indexOf(i, aZ[0])), aY)._1
247+ let bb = if ((aZ[0] == "WAVES"))
248+ then 8
249+ else value(value(assetInfo(fromBase58String(aZ[0]))).decimals)
250+ let bc = if ((aZ[1] == "WAVES"))
251+ then aY
252+ else if ((indexOf(h, aZ[1]) != unit))
253+ then 1000000
254+ else P(value(indexOf(i, aZ[1])), aY)._1
255+ let bd = if ((aZ[1] == "WAVES"))
256+ then 8
257+ else value(value(assetInfo(fromBase58String(aZ[1]))).decimals)
258+ let be = if ((bb == 8))
259+ then a
260+ else 1000000
261+ let bf = if ((bd == 8))
262+ then a
263+ else 1000000
264+ let aK = {
265+ let aM = invoke(v, "poolEvaluateGetREADONLY", [L, 100000000], nil)
266+ if ($isInstanceOf(aM, "String"))
267+ then aM
268+ else throw(($getType(aM) + " couldn't be cast to String"))
269+ }
270+ if ((aK == aK))
362271 then {
363- let aN = {
364- let k = aM
365- if ($isInstanceOf(k, "Int"))
366- then {
367- let at = k
368- at
369- }
370- else throw("can't get user collateral value")
371- }
372- if (!(F("setup_active")))
373- then throw("market is stopped")
374- else if ((0 > aN))
375- then throw("you have to supply more to borrow")
376- else if ((C(("setup_paused_" + j)) > 0))
377- then throw("this asset can't be supplied or borrowed")
272+ let bg = split(aK, "__")
273+ let bh = parseIntValue(bg[1])
274+ let bi = parseIntValue(bg[2])
275+ let bj = (fraction(ba, bh, be) + fraction(bc, bi, bf))
276+ let bk = H((L + "_twap5B"))
277+ let bl = H((L + "_lastBlock"))
278+ if ((G.originCaller != c))
279+ then throw("available for backend only")
280+ else if ((2 > (height - bl)))
281+ then nil
282+ else if (if ((bl == 0))
283+ then true
284+ else ((height - bl) > 100))
285+ then [IntegerEntry((L + "_twap5B"), bj), IntegerEntry((L + "_lastBlock"), height), StringEntry((L + "_lastPrices"), toString(bj)), IntegerEntry((L + "_riskLevel"), 1)]
378286 else {
379- let aI = C(("total_supplied_" + j))
380- let aJ = C(("total_borrowed_" + j))
381- let aL = C(((h + "_borrowed_") + j))
382- if ((az > (aI - aJ)))
383- then throw("this amount is not available")
287+ let bm = split(getStringValue((L + "_lastPrices")), ",")
288+ let bn = toString(bj) :: bm
289+ func bo (aC,aD) = (aC + parseIntValue(aD))
290+
291+ let bp = ({
292+ let aO = bn
293+ let aP = size(aO)
294+ let aQ = 0
295+ func aR (aS,aT) = if ((aT >= aP))
296+ then aS
297+ else bo(aS, aO[aT])
298+
299+ func aU (aS,aT) = if ((aT >= aP))
300+ then aS
301+ else throw("List size exceeds 6")
302+
303+ aU(aR(aR(aR(aR(aR(aR(aQ, 0), 1), 2), 3), 4), 5), 6)
304+ } / size(bn))
305+ let bq = fraction(bj, 10000, parseIntValue(bm[(size(bm) - 1)]))
306+ let br = if (((10000 + y) > bq))
307+ then (bq > (10000 - y))
308+ else false
309+ let bs = if (br)
310+ then 1
311+ else 2
312+ if ((5 >= size(bn)))
313+ then {
314+ let bt = makeString(bn, ",")
315+[IntegerEntry((L + "_twap5B"), bp), IntegerEntry((L + "_lastBlock"), height), StringEntry((L + "_lastPrices"), bt), IntegerEntry((L + "_riskLevel"), bs)]
316+ }
384317 else {
385- let aG = if ((G(("setup_autostake_" + j)) != ""))
386- then invoke(this, "unstakeToken", [j, av], nil)
387- else unit
388- if ((aG == aG))
389- then ([IntegerEntry(((h + "_borrowed_") + j), (aL + az)), IntegerEntry(("total_borrowed_" + j), (aJ + az)), ScriptTransfer(au.caller, av, K(j))] ++ ay)
390- else throw("Strict value is not equal to itself.")
318+ let bt = makeString(removeByIndex(bn, (size(bn) - 1)), ",")
319+[IntegerEntry((L + "_twap5B"), bp), IntegerEntry((L + "_lastBlock"), height), StringEntry((L + "_lastPrices"), bt), IntegerEntry((L + "_riskLevel"), bs)]
391320 }
392321 }
393322 }
394323 else throw("Strict value is not equal to itself.")
395324 }
396325
397326
398327
399-@Callable(au)
400-func repay () = if (!(F("setup_active")))
401- then throw("market is stopped")
402- else if (if ((size(au.payments) != 1))
403- then true
404- else (au.payments[0].amount == 0))
405- then throw("1 payment has to be attached")
406- else {
407- let j = I(au.payments[0].assetId)
408- let av = au.payments[0].amount
409- let aQ = ac(j, "bRate")
410- let aP = aQ._1
411- let ay = aQ._2
412- let az = fraction(av, o, aP, CEILING)
413- let h = toString(au.caller)
414- let aI = C(("total_supplied_" + j))
415- let aJ = C(("total_borrowed_" + j))
416- let aL = C(((h + "_borrowed_") + j))
417- let aR = (aL - az)
418- let aS = if ((aR >= 0))
419- then az
420- else aL
421- if ((indexOf(G("setup_tokens"), j) == unit))
422- then throw("this asset is not supported by the market")
328+@Callable(G)
329+func updateLpTokenPrice (L) = {
330+ let aY = getIntegerValue(N, "%s%s__price__WAVES-USDT")
331+ let Q = value(indexOf(o, L))
332+ let bu = p[Q]
333+ let bv = if ((bu == "WAVES"))
334+ then aY
335+ else P(value(indexOf(i, bu)), aY)._1
336+ let bw = getIntegerValue(q[Q], (("global_" + bu) + "_balance"))
337+ let bx = value(assetInfo(value(K(L)))).quantity
338+ let bj = fraction(fraction(fraction(bv, bw, 1000000), a, r[Q]), 1000000, bx)
339+ let bk = H((L + "_twap5B"))
340+ let bl = H((L + "_lastBlock"))
341+ if ((G.originCaller != c))
342+ then throw("available for backend only")
343+ else if ((2 > (height - bl)))
344+ then nil
345+ else if (if ((bl == 0))
346+ then true
347+ else ((height - bl) > 100))
348+ then [IntegerEntry((L + "_twap5B"), bj), IntegerEntry((L + "_lastBlock"), height), StringEntry((L + "_lastPrices"), toString(bj)), IntegerEntry((L + "_riskLevel"), 1)]
423349 else {
424- let aG = if ((G(("setup_autostake_" + j)) != ""))
425- then invoke(this, "stakeToken", [j, av], nil)
426- else unit
427- if ((aG == aG))
428- then (([IntegerEntry(((h + "_borrowed_") + j), (aL - aS)), IntegerEntry(("total_borrowed_" + j), (aJ - aS))] ++ ay) ++ (if ((aR >= 0))
429- then nil
430- else [ScriptTransfer(au.caller, -(aR), au.payments[0].assetId)]))
431- else throw("Strict value is not equal to itself.")
432- }
433- }
350+ let bm = split(getStringValue((L + "_lastPrices")), ",")
351+ let bn = toString(bj) :: bm
352+ func bo (aC,aD) = (aC + parseIntValue(aD))
434353
354+ let bp = ({
355+ let aO = bn
356+ let aP = size(aO)
357+ let aQ = 0
358+ func aR (aS,aT) = if ((aT >= aP))
359+ then aS
360+ else bo(aS, aO[aT])
435361
362+ func aU (aS,aT) = if ((aT >= aP))
363+ then aS
364+ else throw("List size exceeds 6")
436365
437-@Callable(au)
438-func repayFor (h) = if (!(F("setup_active")))
439- then throw("market is stopped")
440- else if ((au.caller != Address(base58'3P4kBiU4wr2yV1S5gMfu3MdkVvy7kxXHsKe')))
441- then throw("available only for reserve fund address")
442- else if ((h == "global"))
443- then throw("you can't repay for everyone :_)")
444- else if (if ((size(au.payments) != 1))
445- then true
446- else (au.payments[0].amount == 0))
447- then throw("1 payment has to be attached")
448- else {
449- let j = I(au.payments[0].assetId)
450- let av = au.payments[0].amount
451- let aT = ac(j, "bRate")
452- let aP = aT._1
453- let ay = aT._2
454- let az = fraction(av, o, aP, CEILING)
455- let aI = C(("total_supplied_" + j))
456- let aJ = C(("total_borrowed_" + j))
457- let aL = C(((h + "_borrowed_") + j))
458- let aR = (aL - az)
459- let aS = if ((aR >= 0))
460- then az
461- else aL
462- if ((indexOf(G("setup_tokens"), j) == unit))
463- then throw("this asset is not supported by the market")
366+ aU(aR(aR(aR(aR(aR(aR(aQ, 0), 1), 2), 3), 4), 5), 6)
367+ } / size(bn))
368+ let bq = fraction(bj, 10000, parseIntValue(bm[(size(bm) - 1)]))
369+ let br = if (((10000 + y) > bq))
370+ then (bq > (10000 - y))
371+ else false
372+ let bs = if (br)
373+ then 1
374+ else 2
375+ if ((5 >= size(bn)))
376+ then {
377+ let bt = makeString(bn, ",")
378+[IntegerEntry((L + "_twap5B"), bp), IntegerEntry((L + "_lastBlock"), height), StringEntry((L + "_lastPrices"), bt), IntegerEntry((L + "_riskLevel"), bs)]
379+ }
464380 else {
465- let aG = if ((G(("setup_autostake_" + j)) != ""))
466- then invoke(this, "stakeToken", [j, av], nil)
467- else unit
468- if ((aG == aG))
469- then (([IntegerEntry(((h + "_borrowed_") + j), (aL - aS)), IntegerEntry(("total_borrowed_" + j), (aJ - aS))] ++ ay) ++ (if ((aR >= 0))
470- then nil
471- else [ScriptTransfer(au.caller, -(aR), au.payments[0].assetId)]))
472- else throw("Strict value is not equal to itself.")
381+ let bt = makeString(removeByIndex(bn, (size(bn) - 1)), ",")
382+[IntegerEntry((L + "_twap5B"), bp), IntegerEntry((L + "_lastBlock"), height), StringEntry((L + "_lastPrices"), bt), IntegerEntry((L + "_riskLevel"), bs)]
473383 }
474384 }
475-
476-
477-
478-@Callable(au)
479-func stakeToken (j,az) = {
480- let aU = getStringValue(e, "setup_supportedAssets")
481- if ((au.caller != this))
482- then throw("only for internal smart contract invocations")
483- else if ((indexOf(aU, j) == unit))
484- then nil
485- else {
486- let aV = C(("autostake_amount_" + j))
487- let aW = invoke(e, "stakeLP", nil, [AttachedPayment(K(j), az)])
488- if ((aW == aW))
489- then [IntegerEntry(("autostake_amount_" + j), (aV + az))]
490- else throw("Strict value is not equal to itself.")
491- }
492385 }
493386
494387
495388
496-@Callable(au)
497-func stakeTokenAll (j) = if ((au.caller != this))
498- then throw("only for internal smart contract invocations")
499- else {
500- let az = L(j)
501- let aG = invoke(this, "stakeToken", [j, az], nil)
502- if ((aG == aG))
389+@Callable(G)
390+func updateTokenPrice (L) = {
391+ let aY = getIntegerValue(N, "%s%s__price__WAVES-USDT")
392+ let bj = if ((L == "WAVES"))
393+ then aY
394+ else if ((L == f))
395+ then O
396+ else {
397+ let by = P(value(indexOf(i, L)), aY)._1
398+ if ((L == g))
399+ then {
400+ let bz = getIntegerValue(N, "%s%s__price__ETH-USDT")
401+ let bA = fraction(by, 10000, bz)
402+ if (if ((bA > (10000 - x)))
403+ then ((10000 + x) > bA)
404+ else false)
405+ then by
406+ else throw("internal ETH price doesn't match with global price")
407+ }
408+ else if ((indexOf(h, L) != unit))
409+ then 1000000
410+ else by
411+ }
412+ let bk = H((L + "_twap5B"))
413+ let bl = H((L + "_lastBlock"))
414+ if ((G.originCaller != c))
415+ then throw("available for backend only")
416+ else if ((2 > (height - bl)))
503417 then nil
504- else throw("Strict value is not equal to itself.")
505- }
418+ else if (if ((bl == 0))
419+ then true
420+ else ((height - bl) > 30))
421+ then [IntegerEntry((L + "_twap5B"), bj), IntegerEntry((L + "_lastBlock"), height), StringEntry((L + "_lastPrices"), toString(bj))]
422+ else {
423+ let bm = split(getStringValue((L + "_lastPrices")), ",")
424+ let bn = toString(bj) :: bm
425+ func bo (aC,aD) = (aC + parseIntValue(aD))
506426
427+ let bp = ({
428+ let aO = bn
429+ let aP = size(aO)
430+ let aQ = 0
431+ func aR (aS,aT) = if ((aT >= aP))
432+ then aS
433+ else bo(aS, aO[aT])
507434
435+ func aU (aS,aT) = if ((aT >= aP))
436+ then aS
437+ else throw("List size exceeds 6")
508438
509-@Callable(au)
510-func unstakeToken (j,az) = {
511- let aU = getStringValue(e, "setup_supportedAssets")
512- if ((au.caller != this))
513- then throw("only for internal smart contract invocations")
514- else if ((indexOf(aU, j) == unit))
515- then nil
516- else {
517- let aV = C(("autostake_amount_" + j))
518- let aW = invoke(e, "unstakeLP", [j, az], nil)
519- if ((aW == aW))
520- then [IntegerEntry(("autostake_amount_" + j), (aV - az))]
521- else throw("Strict value is not equal to itself.")
522- }
439+ aU(aR(aR(aR(aR(aR(aR(aQ, 0), 1), 2), 3), 4), 5), 6)
440+ } / size(bn))
441+ let bB = aJ(L)
442+ if ((bB == bB))
443+ then {
444+ let bC = bB
445+ let bD = bC._1
446+ let bE = bC._2
447+ let bF = if ((bD != 0))
448+ then fraction(bp, 10000, bD)
449+ else throw(("orderbook result zero for " + L))
450+ let bG = if ((bF > (10000 - x)))
451+ then ((10000 + x) > bF)
452+ else false
453+ let bq = fraction(bj, 10000, parseIntValue(bm[(size(bm) - 1)]))
454+ let br = if (((10000 + y) > bq))
455+ then (bq > (10000 - y))
456+ else false
457+ let bs = (((if (bG)
458+ then 1
459+ else 2) + (if (bE)
460+ then 1
461+ else 0)) + (if (!(br))
462+ then 1
463+ else 0))
464+ if (!(bG))
465+ then [IntegerEntry((L + "_riskLevel"), bs)]
466+ else if ((5 >= size(bn)))
467+ then {
468+ let bt = makeString(bn, ",")
469+[IntegerEntry((L + "_twap5B"), bp), IntegerEntry((L + "_lastBlock"), height), StringEntry((L + "_lastPrices"), bt), IntegerEntry((L + "_riskLevel"), bs)]
470+ }
471+ else {
472+ let bt = makeString(removeByIndex(bn, (size(bn) - 1)), ",")
473+[IntegerEntry((L + "_twap5B"), bp), IntegerEntry((L + "_lastBlock"), height), StringEntry((L + "_lastPrices"), bt), IntegerEntry((L + "_riskLevel"), bs)]
474+ }
475+ }
476+ else throw("Strict value is not equal to itself.")
477+ }
523478 }
524479
525480
526481
527-@Callable(au)
528-func addInterest (j,az) = if ((au.caller != this))
529- then throw("only for self invocation")
482+@Callable(G)
483+func updateTokens () = if ((G.originCaller != c))
484+ then throw("available for backend only")
530485 else {
531- let aX = C(("autostake_lastEarned_" + j))
532- let aY = C(("autostake_lastBlock_" + j))
533- let aZ = fraction(az, 80, 100)
534- let ba = if (if ((aY == height))
535- then true
536- else (az == 0))
537- then nil
538- else [IntegerEntry(("autostake_preLastEarned_" + j), aX), IntegerEntry(("autostake_preLastBlock_" + j), aY), IntegerEntry(("autostake_lastEarned_" + j), (aX + aZ)), IntegerEntry(("autostake_lastBlock_" + j), height)]
539- (ba ++ [IntegerEntry((j + "_sRate"), (C((j + "_sRate")) + fraction(o, aZ, C(("total_supplied_" + j)))))])
540- }
486+ let bH = invoke(this, "updateTokenPrice", ["WAVES"], nil)
487+ if ((bH == bH))
488+ then {
489+ let bI = invoke(this, "updateTokenPrice", [f], nil)
490+ if ((bI == bI))
491+ then {
492+ func bJ (aC,aD) = {
493+ let bK = invoke(this, "updateTokenPrice", [aD], nil)
494+ if ((bK == bK))
495+ then nil
496+ else throw("Strict value is not equal to itself.")
497+ }
541498
499+ let bL = {
500+ let aO = i
501+ let aP = size(aO)
502+ let aQ = nil
503+ func aR (aS,aT) = if ((aT >= aP))
504+ then aS
505+ else bJ(aS, aO[aT])
542506
507+ func aU (aS,aT) = if ((aT >= aP))
508+ then aS
509+ else throw("List size exceeds 20")
543510
544-@Callable(au)
545-func addInterestEXTERNAL () = {
546- let az = fraction(au.payments[0].amount, 80, 100)
547- let J = au.payments[0].assetId
548- let j = I(J)
549- let aX = C(("autostake_lastEarned_" + j))
550- let aY = C(("autostake_lastBlock_" + j))
551- let ba = if (if ((aY == height))
552- then true
553- else (az == 0))
554- then nil
555- else [IntegerEntry(("autostake_preLastEarned_" + j), aX), IntegerEntry(("autostake_preLastBlock_" + j), aY), IntegerEntry(("autostake_lastEarned_" + j), (aX + az)), IntegerEntry(("autostake_lastBlock_" + j), height)]
556- (ba ++ [IntegerEntry((j + "_sRate"), (C((j + "_sRate")) + fraction(o, az, C(("total_supplied_" + j)))))])
557- }
558-
559-
560-
561-@Callable(au)
562-func preInit (bb,bc,bd,be) = {
563- func s (t,ae) = (t ++ [IntegerEntry((ae + "_bRate"), o), IntegerEntry((ae + "_sRate"), o)])
564-
565- if ((au.caller != this))
566- then throw("admin only")
567- else {
568- let ah = {
569- let v = split(bb, ",")
570- let w = size(v)
571- let x = nil
572- func y (z,A) = if ((A >= w))
573- then z
574- else s(z, v[A])
575-
576- func B (z,A) = if ((A >= w))
577- then z
578- else throw("List size exceeds 12")
579-
580- B(y(y(y(y(y(y(y(y(y(y(y(y(x, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
581- }
582- ([StringEntry("setup_tokens", bb), StringEntry("setup_ltvs", bc), StringEntry("setup_lts", bd), StringEntry("setup_penalties", be), BooleanEntry("setup_active", true)] ++ ah)
583- }
584- }
585-
586-
587-
588-@Callable(au)
589-func initNewToken (ae,bf,bg,bh) = if ((au.caller != this))
590- then throw("admin only")
591- else [StringEntry("setup_tokens", ((G("setup_tokens") + ",") + ae)), StringEntry("setup_ltvs", ((G("setup_ltvs") + ",") + bf)), StringEntry("setup_lts", ((G("setup_lts") + ",") + bg)), StringEntry("setup_penalties", ((G("setup_penalties") + ",") + bh)), IntegerEntry((ae + "_bRate"), o), IntegerEntry((ae + "_sRate"), o)]
592-
593-
594-
595-@Callable(au)
596-func updateParameter (D,bi) = if (if ((au.caller != this))
597- then (au.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8'))
598- else false)
599- then throw("admin only")
600- else [IntegerEntry(D, parseIntValue(bi))]
601-
602-
603-
604-@Callable(au)
605-func updateString (D,bi) = if (if ((au.caller != this))
606- then (au.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8'))
607- else false)
608- then throw("admin only")
609- else [StringEntry(D, bi)]
610-
611-
612-
613-@Callable(au)
614-func claimToReserveFund (bj) = {
615- let bk = M()
616- let ah = ac(bk[0], "sRate")._2
617- let r = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
618- func s (t,bl) = if ((bl >= size(bk)))
619- then t
620- else {
621- let j = bk[bl]
622- let bm = G(("autostake_amount_" + j))
623- let az = ((((L(j) + C(("autostake_amount_" + j))) + (if ((bm != ""))
624- then parseIntValue(bm)
625- else 0)) + fraction(C(("total_borrowed_" + j)), ah[((bl * 3) + 1)].value, o)) - fraction(C(("total_supplied_" + j)), ah[(bl * 3)].value, o))
626- let aG = if ((G(("setup_autostake_" + j)) != ""))
627- then invoke(this, "unstakeToken", [j, az], nil)
628- else unit
629- if ((aG == aG))
630- then (t ++ [az])
631- else throw("Strict value is not equal to itself.")
632- }
633-
634- let bn = {
635- let v = r
636- let w = size(v)
637- let x = nil
638- func y (z,A) = if ((A >= w))
639- then z
640- else s(z, v[A])
641-
642- func B (z,A) = if ((A >= w))
643- then z
644- else throw("List size exceeds 12")
645-
646- B(y(y(y(y(y(y(y(y(y(y(y(y(x, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
647- }
648- func bo (t,bl) = if ((bl >= size(bk)))
649- then t
650- else {
651- let j = bk[bl]
652- (t ++ [ScriptTransfer(a, max([bn[bl], 0]), K(j))])
653- }
654-
655- if (bj)
656- then throw(q(bn))
657- else $Tuple2({
658- let v = r
659- let w = size(v)
660- let x = nil
661- func bp (z,A) = if ((A >= w))
662- then z
663- else bo(z, v[A])
664-
665- func bq (z,A) = if ((A >= w))
666- then z
667- else throw("List size exceeds 12")
668-
669- bq(bp(bp(bp(bp(bp(bp(bp(bp(bp(bp(bp(bp(x, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
670- }, bn)
671- }
672-
673-
674-
675-@Callable(au)
676-func reSetup (j) = {
677- let br = C("resetup_lastUpdate")
678- if ((p > (height - br)))
679- then throw("can be updated only once per day")
680- else {
681- let bd = split(G("setup_lts"), ",")
682- let bk = M()
683- let S = ag(j)
684- let bs = C((("setup_" + j) + "_tempLT"))
685- let bg = parseIntValue(bk[value(indexOf(bk, j))])
686- if ((S > 90000000))
687- then [IntegerEntry((("setup_" + j) + "_tempLT"), fraction(bs, 9975, 10000))]
688- else if (if ((bg > bs))
689- then (90000000 > S)
690- else false)
691- then [IntegerEntry((("setup_" + j) + "_tempLT"), fraction(bs, 10025, 10000))]
692- else nil
693- }
694- }
695-
696-
697-
698-@Callable(au)
699-func shutdown (bt) = if ((indexOf(f, au.caller.bytes) == unit))
700- then throw("user not in a whitelist")
701- else [BooleanEntry("setup_active", !(bt))]
702-
703-
704-
705-@Callable(au)
706-func liquidate (bj,h,av,bu,bv,bw) = if (!(g(au.caller)))
707- then throw("temporarily available for whitelist only")
708- else if (!(F("setup_active")))
709- then throw("market is stopped")
710- else {
711- let bx = aq(h)
712- if ((bx == bx))
713- then {
714- let by = ac(bu, "sRate")
715- let ax = by._1
716- let bz = by._2
717- let bA = ac(bv, "bRate")
718- let aP = bA._1
719- let bB = bA._2
720- let bC = fraction(av, o, ax)
721- let bD = C(((h + "_supplied_") + bu))
722- let bE = C(((h + "_borrowed_") + bv))
723- let bF = if ((bE > 0))
724- then bE
725- else throw("user has no borrow in this token")
726- if ((bx > 0))
727- then throw("user can't be liquidated")
728- else if ((bC > bD))
729- then throw("position to liquidate is bigger than user's supply")
730- else {
731- let bG = L(bu)
732- if ((bG == bG))
511+ aU(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aR(aQ, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
512+ }
513+ if ((bL == bL))
514+ then {
515+ let bM = invoke(this, "updateLpTokenPrice", [o[0]], nil)
516+ if ((bM == bM))
733517 then {
734- let bH = L(bv)
735- if ((bH == bH))
518+ let bN = invoke(this, "updateLpTokenPrice", [o[1]], nil)
519+ if ((bN == bN))
736520 then {
737- let aG = if ((G(("setup_autostake_" + bu)) != ""))
738- then invoke(this, "unstakeToken", [bu, bC], nil)
739- else unit
740- if ((aG == aG))
521+ let bO = invoke(this, "updateLpTokenPrice", [o[2]], nil)
522+ if ((bO == bO))
741523 then {
742- let bI = invoke(d, "swap", [bw, 0], [AttachedPayment(K(bu), av)])
743- if ((bI == bI))
744- then {
745- let bJ = (bG - L(bu))
746- if ((bJ == bJ))
747- then {
748- let bK = (L(bv) - bH)
749- if ((bK == bK))
750- then {
751- let bL = an(bu)._1
752- let bM = ao(bu)
753- let bN = fraction(bJ, bL, bM)
754- let bO = an(bv)._2
755- let bP = ao(bv)
756- let bQ = fraction(bK, bO, bP)
757- let bh = parseIntValue(split(G("setup_penalties"), ",")[value(indexOf(M(), bv))])
758- let bR = (bQ - fraction(bN, (m - bh), m))
759- let bS = fraction(bJ, o, ax)
760- let bT = fraction(fraction(bK, o, aP), (m - fraction(bR, m, bQ)), m)
761- if ((bJ > av))
762- then throw("more assets exchanged than expected")
763- else if ((0 > bR))
764- then throw("price impact is bigger than liquidation penalty")
765- else [IntegerEntry(((h + "_supplied_") + bu), (bD - bS)), IntegerEntry(((h + "_borrowed_") + bv), (bF - bT)), IntegerEntry(("total_supplied_" + bu), (C(("total_supplied_" + bu)) - bS)), IntegerEntry(("total_borrowed_" + bv), (C(("total_borrowed_" + bv)) - bT))]
766- }
767- else throw("Strict value is not equal to itself.")
768- }
769- else throw("Strict value is not equal to itself.")
770- }
524+ let bP = invoke(this, "updateWxLpTokenPrice", [s[0]], nil)
525+ if ((bP == bP))
526+ then bL
771527 else throw("Strict value is not equal to itself.")
772528 }
773529 else throw("Strict value is not equal to itself.")
774530 }
775531 else throw("Strict value is not equal to itself.")
776532 }
777533 else throw("Strict value is not equal to itself.")
778534 }
779- }
780- else throw("Strict value is not equal to itself.")
781- }
535+ else throw("Strict value is not equal to itself.")
536+ }
537+ else throw("Strict value is not equal to itself.")
538+ }
539+ else throw("Strict value is not equal to itself.")
540+ }
782541
783542
784543
785-@Callable(au)
786-func liquidateV2 (bj,h,bu) = if (!(g(au.caller)))
787- then throw("temporarily available for whitelist only")
788- else if (!(F("setup_active")))
789- then throw("market is stopped")
790- else {
791- let bU = au.payments[0].assetId
792- let bv = I(bU)
793- let bV = au.payments[0].amount
794- let bx = aq(h)
795- if ((bx == bx))
796- then if ((bx > 0))
797- then throw("user can't be liquidated")
798- else {
799- let bW = M()
800- let bX = value(indexOf(bW, bv))
801- let bY = value(indexOf(bW, bu))
802- let bZ = ac(bv, "bRate")
803- let aP = bZ._1
804- let bz = bZ._2
805- let bO = an(bv)._2
806- let bP = ao(bv)
807- let ca = fraction(bV, bO, bP)
808- let bh = parseIntValue(value(split(G("setup_penalties"), ",")[bX]))
809- let bL = an(bu)._1
810- let bM = ao(bu)
811- let cb = fraction(ca, (m + bh), m)
812- let bC = fraction(cb, bM, bL)
813- let cc = fraction(bV, o, aP)
814- let cd = fraction(bC, o, bz[((bY * 3) + 1)].value)
815- let bD = C(((h + "_supplied_") + bu))
816- let bE = C(((h + "_borrowed_") + bv))
817- let bF = if ((bE > 0))
818- then bE
819- else throw("user has no borrow in this token")
820- if ((cd > bD))
821- then throw("position to liquidate is bigger than user's supply")
822- else {
823- let aG = if ((G(("setup_autostake_" + bu)) != ""))
824- then invoke(this, "unstakeToken", [bu, bC], nil)
825- else unit
826- if ((aG == aG))
827- then if (bj)
828- then throw("liquidation will pass")
829- else ([ScriptTransfer(au.caller, bC, K(bu)), IntegerEntry(((h + "_supplied_") + bu), (bD - cd)), IntegerEntry(((h + "_borrowed_") + bv), (bF - cc)), IntegerEntry(("total_supplied_" + bu), (C(("total_supplied_" + bu)) - cd)), IntegerEntry(("total_borrowed_" + bv), (C(("total_borrowed_" + bv)) - cc))] ++ bz)
830- else throw("Strict value is not equal to itself.")
831- }
832- }
833- else throw("Strict value is not equal to itself.")
834- }
835-
836-
837-
838-@Callable(au)
839-func getUserCollateral (bj,h,ce,cf) = {
840- let bk = M()
841- let bc = split(G("setup_ltvs"), ",")
842- let bd = split(G("setup_lts"), ",")
843- let ah = ac(bk[0], "sRate")._2
844- let cg = split(cf, ",")
845- func s (t,u) = if ((u >= size(bk)))
846- then t
847- else {
848- let ch = C(((h + "_supplied_") + bk[u]))
849- let ci = C(((h + "_borrowed_") + bk[u]))
850- let cj = if ((cf == ""))
851- then if (if ((ci != 0))
852- then true
853- else (ch != 0))
854- then true
855- else false
856- else true
857- if (cj)
858- then {
859- let aE = ao(bk[u])
860- let aB = an(bk[u])
861- ((t + fraction(fraction(fraction((ch + (if (if (if ((cf != ""))
862- then (cg[0] == bk[u])
863- else false)
864- then (cg[1] == "supplied")
865- else false)
866- then parseIntValue(cg[2])
867- else 0)), ah[(u * 3)].value, o), parseIntValue(bc[u]), m), aB._1, aE)) - (if (ce)
868- then fraction(fraction(fraction((ci + (if (if (if ((cf != ""))
869- then (cg[0] == bk[u])
870- else false)
871- then (cg[1] == "borrowed")
872- else false)
873- then parseIntValue(cg[2])
874- else 0)), ah[((u * 3) + 1)].value, o), m, parseIntValue(bd[u])), aB._2, aE)
875- else 0))
876- }
877- else t
878- }
879-
880- let ck = {
881- let v = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
882- let w = size(v)
883- let x = 0
884- func y (z,A) = if ((A >= w))
885- then z
886- else s(z, v[A])
887-
888- func B (z,A) = if ((A >= w))
889- then z
890- else throw("List size exceeds 12")
891-
892- B(y(y(y(y(y(y(y(y(y(y(y(y(x, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
544+@Callable(G)
545+func initNewMaster (bQ) = {
546+ let bR = {
547+ let D = addressFromString(bQ)
548+ if ($isInstanceOf(D, "Address"))
549+ then {
550+ let bS = D
551+ true
552+ }
553+ else false
893554 }
894- if (bj)
895- then throw(toString(ck))
896- else $Tuple2(ah, ck)
555+ if (!(bR))
556+ then throw(("incorrect address " + bQ))
557+ else if ((G.caller != this))
558+ then throw("available for self call only")
559+ else [StringEntry("verifier_master", bQ)]
897560 }
898561
899562
900563
901-@Callable(au)
902-func getPrices (bj) = {
903- let bk = M()
904- func s (t,u) = if ((u >= size(bk)))
905- then t
906- else {
907- let aB = aj(bk[u], 3)
908- ((((t + toString(aB._1)) + ",") + toString(aB._2)) + "|")
909- }
910-
911- let ck = {
912- let v = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
913- let w = size(v)
914- let x = ""
915- func y (z,A) = if ((A >= w))
916- then z
917- else s(z, v[A])
918-
919- func B (z,A) = if ((A >= w))
920- then z
921- else throw("List size exceeds 12")
922-
923- B(y(y(y(y(y(y(y(y(y(y(y(y(x, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
564+@Callable(G)
565+func requestNewMaster (bT) = {
566+ let bR = {
567+ let D = addressFromString(bT)
568+ if ($isInstanceOf(D, "Address"))
569+ then {
570+ let bS = D
571+ true
572+ }
573+ else false
924574 }
925- if (bj)
926- then throw(ck)
927- else $Tuple2(nil, ck)
575+ if (!(bR))
576+ then throw(("incorrect address " + bT))
577+ else if ((indexOf(b, G.caller) == unit))
578+ then throw("whitelist only")
579+ else [StringEntry("verifier_newMaster", bT), IntegerEntry("verifier_newMasterEligibleAfter", (height + 10000))]
928580 }
929581
930582
931583
932-@Callable(au)
933-func calculateUtilizationRatio (j,bj) = if (bj)
934- then throw(toString(ag(j)))
935- else $Tuple2(nil, ag(j))
936-
937-
938-
939-@Callable(au)
940-func calculateOutdatedUR (j,bj) = if (bj)
941- then throw(toString(P(j)))
942- else $Tuple2(nil, P(j))
943-
944-
945-
946-@Callable(au)
947-func calculateTokenRates (bj) = {
948- func s (t,j) = {
949- let ah = V(j)
950- $Tuple2(((((t._1 + toString(ah[1].value)) + "|") + toString(ah[0].value)) + ","), (t._2 ++ ah))
951- }
952-
953- let bn = {
954- let v = M()
955- let w = size(v)
956- let x = $Tuple2("", nil)
957- func y (z,A) = if ((A >= w))
958- then z
959- else s(z, v[A])
960-
961- func B (z,A) = if ((A >= w))
962- then z
963- else throw("List size exceeds 12")
964-
965- B(y(y(y(y(y(y(y(y(y(y(y(y(x, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
966- }
967- if (bj)
968- then throw(bn._1)
969- else $Tuple2(bn._2, bn._1)
584+@Callable(G)
585+func activateNewMaster () = {
586+ let bU = getIntegerValue(this, "verifier_newMasterEligibleAfter")
587+ let bT = getStringValue(this, "verifier_newMaster")
588+ if ((indexOf(b, G.caller) == unit))
589+ then throw("whitelist only")
590+ else if ((bU > height))
591+ then throw("new master cannot be activated yet")
592+ else [DeleteEntry("verifier_newMaster"), DeleteEntry("verifier_newMasterEligibleAfter"), StringEntry("verifier_master", bT)]
970593 }
971594
972595
973-
974-@Callable(au)
975-func calculateTokensInterest (bj) = {
976- func s (t,j) = {
977- let U = fraction(R(j), p, m)
978- ((t + toString(U)) + ",")
979- }
980-
981- let bn = {
982- let v = M()
983- let w = size(v)
984- let x = ""
985- func y (z,A) = if ((A >= w))
986- then z
987- else s(z, v[A])
988-
989- func B (z,A) = if ((A >= w))
990- then z
991- else throw("List size exceeds 12")
992-
993- B(y(y(y(y(y(y(y(y(y(y(y(y(x, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
994- }
995- if (bj)
996- then throw(bn)
997- else $Tuple2(nil, bn)
998- }
999-
1000-
1001-
1002-@Callable(au)
1003-func initNewMaster (cl) = {
1004- let cm = {
1005- let k = addressFromString(cl)
1006- if ($isInstanceOf(k, "Address"))
596+@Verifier(bV)
597+func bW () = {
598+ let bX = getString("verifier_master")
599+ let bY = {
600+ let D = bX
601+ if ($isInstanceOf(D, "String"))
1007602 then {
1008- let cn = k
1009- true
1010- }
1011- else false
1012- }
1013- if (!(cm))
1014- then throw(("incorrect address " + cl))
1015- else if ((au.caller != this))
1016- then throw("available for self call only")
1017- else [StringEntry("verifier_master", cl)]
1018- }
1019-
1020-
1021-
1022-@Callable(au)
1023-func requestNewMaster (co) = {
1024- let cm = {
1025- let k = addressFromString(co)
1026- if ($isInstanceOf(k, "Address"))
1027- then {
1028- let cn = k
1029- true
1030- }
1031- else false
1032- }
1033- if (!(cm))
1034- then throw(("incorrect address " + co))
1035- else if ((indexOf(l, au.caller) == unit))
1036- then throw("whitelist only")
1037- else [StringEntry("verifier_newMaster", co), IntegerEntry("verifier_newMasterEligibleAfter", (height + 10000))]
1038- }
1039-
1040-
1041-
1042-@Callable(au)
1043-func activateNewMaster () = {
1044- let cp = getIntegerValue(this, "verifier_newMasterEligibleAfter")
1045- let co = getStringValue(this, "verifier_newMaster")
1046- if ((indexOf(l, au.caller) == unit))
1047- then throw("whitelist only")
1048- else if ((cp > height))
1049- then throw("new master cannot be activated yet")
1050- else [DeleteEntry("verifier_newMaster"), DeleteEntry("verifier_newMasterEligibleAfter"), StringEntry("verifier_master", co)]
1051- }
1052-
1053-
1054-@Verifier(cq)
1055-func cr () = {
1056- let cs = getString("verifier_master")
1057- let ct = {
1058- let k = cs
1059- if ($isInstanceOf(k, "String"))
1060- then {
1061- let at = k
1062- let cu = getInteger(addressFromStringValue(at), ("approvedTx_" + toBase58String(cq.id)))
1063- if ($isInstanceOf(cu, "Int"))
603+ let bZ = D
604+ let ca = getInteger(addressFromStringValue(bZ), ("approvedTx_" + toBase58String(bV.id)))
605+ if ($isInstanceOf(ca, "Int"))
1064606 then {
1065- let cv = cu
1066- cv
607+ let cb = ca
608+ cb
1067609 }
1068610 else 0
1069611 }
1070612 else 1
1071613 }
1072- if (sigVerify(cq.bodyBytes, cq.proofs[0], cq.senderPublicKey))
1073- then (ct > 0)
614+ if (sigVerify(bV.bodyBytes, bV.proofs[0], bV.senderPublicKey))
615+ then (bY > 0)
1074616 else false
1075617 }
1076618

github/deemru/w8io/3ef1775 
137.48 ms