tx · FLMFT8HhkkskmVWkva4CfpGyrwrdwaiw77TudejEZL22 3PBbLJcBjLWUZZrFFUk5s53TdTUneHXDc7e: -0.01700000 Waves 2023.10.07 09:27 [3853677] smart account 3PBbLJcBjLWUZZrFFUk5s53TdTUneHXDc7e > SELF 0.00000000 Waves
{ "type": 13, "id": "FLMFT8HhkkskmVWkva4CfpGyrwrdwaiw77TudejEZL22", "fee": 1700000, "feeAssetId": null, "timestamp": 1696660089449, "version": 2, "chainId": 87, "sender": "3PBbLJcBjLWUZZrFFUk5s53TdTUneHXDc7e", "senderPublicKey": "qv5sHFvV7GyNRm1A2r8BR9oX2nhkc1yNa1QfWLkaja8", "proofs": [ "4o4aknR7Hd3KChzGNxrQXJevhtiFZrtxpyptpkFS6KMM58zmmTLebpMAsLhz9M8EoLnZ6StvT57eTJdZU8csoNjS" ], "script": "base64:BgIjCAISABIAEgASAwoBARIAEgASABIAEgASABIAEgASBAoCCAE7AQ10cnlHZXRJbnRlZ2VyAgdhZGRyZXNzA2tleQQHJG1hdGNoMAkAmggCBQdhZGRyZXNzBQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwBQFiAAAAAmQ4AIDC1y8AA2QxNgkAaAIFAmQ4BQJkOAAQYnVybnh0blBQVHBvb2xJZAEaAVf1RmgngA1o304mdXq0odMoMeAJv/V5eTcADHByb2plY3RPd25lcgEaAVeOHeZRyjgjzsORw8RWi9WD02+IVv823QsAD3doaXJscG9vbFBvb2xJZAEaAVcJSFSomLX/zEpG2xL9S8mTGUY3Q5iH180ACXdoaXJscG9vbAEgWeON3MK1I7pKFNzE0K8UCeZk5gS+JQYLJk7lUG2XWccAD3doaXJscG9vbFN0cmluZwkA2AQBASBZ443cwrUjukoU3MTQrxQJ5mTmBL4lBgsmTuVQbZdZxwAEdGVzdAEgCc6A2qSEYQEDFtHChxRdJUyYFe25w8sijpje/5CtqUcABXdhdmVzAQQTq9kzAAd1c2R0ZXJjASCE2nqyCAM/TtG7yo7ui5O8yYLdC136B5ao1CP5qA//uQAHdXNkY2VyYwEg8b90j2kCa66vzjuwb/Nd8MVKoTFsVrfc+ipKoeuRGkkAB3VzZHRic2MBIIeFKhRdvRvgacOk2tYbd0/cBQSbrAXfQbCvgMBJMOmiAAd1c2RjYnNjASAvN5TEMA7UHoYvTQ14Xf3kXkI8Q97mJBxq1GB3huvltQAHYnVybnh0bgEgJE91eWp+Mzm4+wz/hKlxXF7KLd4zoMRdafnqRBHsTFQAA2V0aAEgJR76/9ghyXCe+8C03j63q4aeBTtm79wH/FHj9agzKHIAA2JuYgEgS7ep4jwDLeZJ/TwoM/wRUkbi6v6x+mu9cBafRBfVHhwABHdidGMBIBKeo3EHNGSP6mN2enCiK9cwBs75vPQVGctmd0xybol/AARidGNiASDIlsraYoy6SPYFNHcPBbtsEP/v2GRaY5157d4CGOemoQAEZWFzdAEgVoJP4wutz64pn/F3h50Vd/r+QUj98n3dRjyfnx8R03QABnN0ZWFzdAEg4Tj7DL+1BlqSS0fgEtOD/O7RI9SQqBlxFRrcq0CylDYABnN3YXZlcwEgCB/I9xYw7VHCKRvsrBqP/JBxHFk4LeshgbA3QfBF0UoAC3Bvb2xib29zdFNDARoBV1+hRBbaqQHNFrLXSm/kpWLQp/1rM4gJMQAHUExfTWFpbgkBB0FkZHJlc3MBARoBVyCUXEqtz/RIOTuIQLO/2+6MUKCnas/a6AAHUExfRGVmaQkBB0FkZHJlc3MBARoBVxkLO48/zcX1AFJDuOumjMisvxQ5MT4kvgAGUExfTG93CQEHQWRkcmVzcwEBGgFXrmAU0mZwDPA/3HTF0nTmGr6p4FLB6guQAApFQVNUX3N0YWtlCQEHQWRkcmVzcwEBGgFXCHSp2cN38YJ996KDSPPrm7NP/Ig86xdvAA1XWF9XQVZFU19FQVNUCQEHQWRkcmVzcwEBGgFXtcI/53C/UBxRdbkKYmb09j7c3NWdpOjUAAxTV0FWRVNfc3Rha2UJAQdBZGRyZXNzAQEaAVd9yXuTFHn/51HxsUrHb/lqHYCVR89YI34ACWV0aEluUG9vbAkBDXRyeUdldEludGVnZXICCQEHQWRkcmVzcwEFEGJ1cm54dG5QUFRwb29sSWQJAKwCAgkArAICAgdnbG9iYWxfCQDYBAEFA2V0aAIIX2JhbGFuY2UAC3dhdmVzSW5Qb29sCQENdHJ5R2V0SW50ZWdlcgIJAQdBZGRyZXNzAQUQYnVybnh0blBQVHBvb2xJZAkArAICCQCsAgICB2dsb2JhbF8JANgEAQUFd2F2ZXMCCF9iYWxhbmNlAAhldGhXYXZlcwkAawMFAmQ4BQt3YXZlc0luUG9vbAUJZXRoSW5Qb29sAAxwcm9qZWN0U3Rha2UJAQ10cnlHZXRJbnRlZ2VyAgkBB0FkZHJlc3MBBRBidXJueHRuUFBUcG9vbElkCQCsAgIJAKUIAQUEdGhpcwIMX2luZGV4U3Rha2VkAAp0b3RhbFN0YWtlCQENdHJ5R2V0SW50ZWdlcgIJAQdBZGRyZXNzAQUQYnVybnh0blBQVHBvb2xJZAIXZ2xvYmFsX3Bvb2xUb2tlbl9hbW91bnQBCFBMX3ZhbHVlAgtkQXBwQWRkcmVzcwVhc3NldAkAawMJAQ10cnlHZXRJbnRlZ2VyAgULZEFwcEFkZHJlc3MJAKwCAgkArAICCQClCAEFBHRoaXMCCl9zdXBwbGllZF8JANgEAQUFYXNzZXQJAQ10cnlHZXRJbnRlZ2VyAgULZEFwcEFkZHJlc3MJAKwCAgkA2AQBBQVhc3NldAIGX3NSYXRlBQNkMTYBCF9sb2FkSW50AgRrZXlfCGRlZmF1bHRfBAckbWF0Y2gwCQCaCAIFDFNXQVZFU19zdGFrZQUEa2V5XwMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEFCGRlZmF1bHRfAQtfbG9hZEJpZ0ludAIEa2V5XwhkZWZhdWx0XwQHJG1hdGNoMAkAnAgCBQxTV0FWRVNfc3Rha2UFBGtleV8DCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYQUHJG1hdGNoMAkAngMBBQFhBQhkZWZhdWx0XwAIbGFzdFJhdGUJAQtfbG9hZEJpZ0ludAICCUxBU1RfUkFURQkAtgIBAICglKWNHQALY3VycmVudFJhdGUJAQtfbG9hZEJpZ0ludAICDENVUlJFTlRfUkFURQkAtgIBAAAACmxhc3RIZWlnaHQJAQhfbG9hZEludAICC0xBU1RfSEVJR0hUAAAADHRhcmdldEhlaWdodAkAlwMBCQDMCAIJAQhfbG9hZEludAICDVRBUkdFVF9IRUlHSFQAAAkAzAgCBQZoZWlnaHQFA25pbAAPbGFzdFJhdGVVcGRhdGVkCQC3AgIFCGxhc3RSYXRlCQC5AgIFC2N1cnJlbnRSYXRlCQC2AgEJAGUCBQx0YXJnZXRIZWlnaHQFCmxhc3RIZWlnaHQACmJhc2VBbW91bnQJAKADAQkAvQIECQC2AgEJAPAHAgUNV1hfV0FWRVNfRUFTVAUGc3dhdmVzBQ9sYXN0UmF0ZVVwZGF0ZWQJALYCAQCAoJSljR0FBUZMT09SAAl3YXZlc0luV1gJAGQCCAkA7wcBBQ1XWF9XQVZFU19FQVNUB3JlZ3VsYXIFCmJhc2VBbW91bnQACGVhc3RJbldYCQDwBwIFDVdYX1dBVkVTX0VBU1QFBGVhc3QACXdhdmVzRWFzdAkAawMJAGgCBQJkOABkBQhlYXN0SW5XWAUJd2F2ZXNJbldYABB3YXZlc0luV2hpcmxwb29sCQENdHJ5R2V0SW50ZWdlcgIJAQdBZGRyZXNzAQUPd2hpcmxwb29sUG9vbElkCQCsAgIJAKwCAgIHZ2xvYmFsXwkA2AQBBQV3YXZlcwIIX2JhbGFuY2UAEHdoaXJsSW5XaGlybHBvb2wJAQ10cnlHZXRJbnRlZ2VyAgkBB0FkZHJlc3MBBQ93aGlybHBvb2xQb29sSWQJAKwCAgkArAICAgdnbG9iYWxfBQ93aGlybHBvb2xTdHJpbmcCCF9iYWxhbmNlABFwcm9qZWN0U3Rha2VXaGlybAkBDXRyeUdldEludGVnZXICCQEHQWRkcmVzcwEFD3doaXJscG9vbFBvb2xJZAkArAICCQClCAEFBHRoaXMCDF9pbmRleFN0YWtlZAAPdG90YWxTdGFrZVdoaXJsCQENdHJ5R2V0SW50ZWdlcgIJAQdBZGRyZXNzAQUPd2hpcmxwb29sUG9vbElkAhdnbG9iYWxfcG9vbFRva2VuX2Ftb3VudAANc3RFYXN0SW5XYXZlcwkAaAIJAGsDCQBpAgkAbgQJAPAHAgUEdGhpcwUGc3RlYXN0CQENdHJ5R2V0SW50ZWdlcgIFCkVBU1Rfc3Rha2UCCCVzX19yYXRlAICglKWNHQUISEFMRkVWRU4AZAUCZDgFCXdhdmVzRWFzdABkAA1lYXN0SW5TdGFraW5nCQBpAgkAbgQJAPAHAgUEdGhpcwUGc3RlYXN0CQENdHJ5R2V0SW50ZWdlcgIFCkVBU1Rfc3Rha2UCCCVzX19yYXRlAICglKWNHQUISEFMRkVWRU4AZAAKdHZsSW5XYXZlcwkAZAIJAGQCCQBkAgkAawMJAGgCBQt3YXZlc0luUG9vbAAKBQxwcm9qZWN0U3Rha2UFCnRvdGFsU3Rha2UJAGsDCQEIUExfdmFsdWUCBQdQTF9NYWluBQNldGgFCGV0aFdhdmVzBQJkOAkAawMJAGgCBRB3YXZlc0luV2hpcmxwb29sAAoFEXByb2plY3RTdGFrZVdoaXJsBQ90b3RhbFN0YWtlV2hpcmwFDXN0RWFzdEluV2F2ZXMAD3doaXJscG9vbFN1cHBseQQHJG1hdGNoMAkA7AcBBQR0ZXN0AwkAAQIFByRtYXRjaDACBUFzc2V0BAVhc3NldAUHJG1hdGNoMAgFBWFzc2V0CHF1YW50aXR5CQACAQIQQ2FuJ3QgZmluZCBhc3NldAAFcHJpY2UDCQBnAgkAZAIJAGsDCQBkAgUKdHZsSW5XYXZlcwkBDXRyeUdldEludGVnZXICBQR0aGlzAhxzdXJwbHVzIHJlY2VpdmVkIGluIHdhdmVsZXRzBQJkOAUPd2hpcmxwb29sU3VwcGx5BQJkOAkBDXRyeUdldEludGVnZXICBQR0aGlzAiFXSElSTFBPT0wgaXNzdWUgcHJpY2UgaW4gd2F2ZWxldHMJAGQCCQBrAwkAZAIFCnR2bEluV2F2ZXMJAQ10cnlHZXRJbnRlZ2VyAgUEdGhpcwIcc3VycGx1cyByZWNlaXZlZCBpbiB3YXZlbGV0cwUCZDgFD3doaXJscG9vbFN1cHBseQUCZDgJAQ10cnlHZXRJbnRlZ2VyAgUEdGhpcwIhV0hJUkxQT09MIGlzc3VlIHByaWNlIGluIHdhdmVsZXRzARN3aXRoZHJhd0Ftb3VudFdhdmVzAQtkYXBwQWRkcmVzcwkAZQIJAQhQTF92YWx1ZQIFC2RhcHBBZGRyZXNzBQV3YXZlcwkAaQIJAQ10cnlHZXRJbnRlZ2VyAgUEdGhpcwIed2F2ZWxldHMgcmVjZWl2ZWQgZm9yIHRyZWFzdXJ5AAMBCHN1cHBseVBMAwtkYXBwQWRkcmVzcwdhc3NldElkDHN1cHBseUFtb3VudAkA/AcEBQtkYXBwQWRkcmVzcwIGc3VwcGx5BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFB2Fzc2V0SWQFDHN1cHBseUFtb3VudAUDbmlsAQp3aXRoZHJhd1BMAwtkYXBwQWRkcmVzcwdhc3NldElkDndpdGhkcmF3QW1vdW50CQD8BwQFC2RhcHBBZGRyZXNzAgh3aXRoZHJhdwkAzAgCCQDYBAEFB2Fzc2V0SWQJAMwIAgUOd2l0aGRyYXdBbW91bnQFA25pbAUDbmlsAQtzd2FwVG9XYXZlcwIGcG9vbElkB2Fzc2V0SWQJAPwHBAkBB0FkZHJlc3MBBQZwb29sSWQCBHN3YXAJAMwIAgIFV0FWRVMJAMwIAgAABQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFB2Fzc2V0SWQJAPAHAgUEdGhpcwUHYXNzZXRJZAUDbmlsDQFpARVidXlXSElSTFBPT0x3aXRoV0FWRVMAAwMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkBAiE9AggFAWkGY2FsbGVyCQEHQWRkcmVzcwEBGgFX6WYhKtIG4NwWiusIWpfUn51io3/3wlpMBwkAAgECIHNtYXJ0IGNvbnRyYWN0IHVuZGVyIG1haW50ZW5hbmNlBBZXaGlybHBvb2xCYWxhbmNlQmVmb3JlCQDwBwIFBHRoaXMFCXdoaXJscG9vbAMJAAACBRZXaGlybHBvb2xCYWxhbmNlQmVmb3JlBRZXaGlybHBvb2xCYWxhbmNlQmVmb3JlBANwbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQHc3VycGx1cwkAawMJAGUCBQVwcmljZQUCZDgIBQNwbXQGYW1vdW50BQJkOAQLSXNzdWVBbW91bnQDCQBnAggFA3BtdAZhbW91bnQJAGsDCAUDcG10BmFtb3VudAUCZDgFBXByaWNlCQBrAwgFA3BtdAZhbW91bnQFAmQ4BQVwcmljZQkAAgECMHBsZWFzZSBjb250YWN0IHByb2plY3Qgb3duZXI6IGlzc3VlIGFtb3VudCBlcnJvcgQMc3VwcGx5QW1vdW50CQBpAgkAZQIIBQNwbXQGYW1vdW50BQdzdXJwbHVzAAMEDWNsZWFuQW1vdW50SW4JAGUCCAUDcG10BmFtb3VudAkAawMIBQNwbXQGYW1vdW50AMgBAJBOBAlBbW91bnRPdXQJAG4EBRB3aGlybEluV2hpcmxwb29sCQBlAgkAaAIFAmQ4BQJkOAkAoAMBCQB2BgkAvQIECQC2AgEJAGgCANgEBQJkOAkAtgIBCQBoAgUCZDgFAmQ4CQC2AgEJAGQCCQBoAgDYBAUCZDgFDWNsZWFuQW1vdW50SW4FBkhBTEZVUAAQCQC2AgEJAGsDAKCNBgCQTgCg9zYABAAQBQdDRUlMSU5HCQBoAgUCZDgFAmQ4BQRET1dOAwkBAiE9AggFA3BtdAdhc3NldElkBQR1bml0CQACAQIXYXR0YWNoIFdBVkVTIHRva2VuIG9ubHkEA2J1eQMJAGYCBQlBbW91bnRPdXQFC0lzc3VlQW1vdW50CQD8BwQJAQdBZGRyZXNzAQUPd2hpcmxwb29sUG9vbElkAgRzd2FwCQDMCAIFD3doaXJscG9vbFN0cmluZwkAzAgCCQBkAgULSXNzdWVBbW91bnQAAQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQR1bml0CAUDcG10BmFtb3VudAUDbmlsBQR1bml0AwkAAAIFA2J1eQUDYnV5BARtYWluAwkAZwIFC0lzc3VlQW1vdW50BQlBbW91bnRPdXQJAQhzdXBwbHlQTAMFB1BMX01haW4FBHVuaXQFDHN1cHBseUFtb3VudAUEdW5pdAMJAAACBQRtYWluBQRtYWluBARkZWZpAwkAZwIFC0lzc3VlQW1vdW50BQlBbW91bnRPdXQJAQhzdXBwbHlQTAMFB1BMX0RlZmkFBHVuaXQFDHN1cHBseUFtb3VudAUEdW5pdAMJAAACBQRkZWZpBQRkZWZpBANsb3cDCQBnAgULSXNzdWVBbW91bnQFCUFtb3VudE91dAkBCHN1cHBseVBMAwUGUExfTG93BQR1bml0BQxzdXBwbHlBbW91bnQFBHVuaXQDCQAAAgUDbG93BQNsb3cEFVdoaXJscG9vbEJhbGFuY2VBZnRlcgkA8AcCBQR0aGlzBQl3aGlybHBvb2wEEVdoaXJscG9vbEZyb21Td2FwCQBlAgUVV2hpcmxwb29sQmFsYW5jZUFmdGVyBRZXaGlybHBvb2xCYWxhbmNlQmVmb3JlCQDMCAIJAQdSZWlzc3VlAwUEdGVzdAMJAGcCBQtJc3N1ZUFtb3VudAUJQW1vdW50T3V0BQtJc3N1ZUFtb3VudAAABgkAzAgCAwkAZgIFCUFtb3VudE91dAULSXNzdWVBbW91bnQJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgURV2hpcmxwb29sRnJvbVN3YXAFCXdoaXJscG9vbAkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQtJc3N1ZUFtb3VudAUEdGVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgIhV0hJUkxQT09MIGlzc3VlIHByaWNlIGluIHdhdmVsZXRzBQVwcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgIgdG90YWwgV0FWRVMgcmVjZWl2ZWQgaW4gd2F2ZWxldHMDCQBnAgULSXNzdWVBbW91bnQFCUFtb3VudE91dAkAZAIIBQNwbXQGYW1vdW50CQENdHJ5R2V0SW50ZWdlcgIFBHRoaXMCIHRvdGFsIFdBVkVTIHJlY2VpdmVkIGluIHdhdmVsZXRzCQBkAgAACQENdHJ5R2V0SW50ZWdlcgIFBHRoaXMCIHRvdGFsIFdBVkVTIHJlY2VpdmVkIGluIHdhdmVsZXRzCQDMCAIJAQxJbnRlZ2VyRW50cnkCAh53YXZlbGV0cyByZWNlaXZlZCBmb3IgdHJlYXN1cnkDCQBnAgULSXNzdWVBbW91bnQFCUFtb3VudE91dAkAZAIJAGUCCAUDcG10BmFtb3VudAUHc3VycGx1cwkBDXRyeUdldEludGVnZXICBQR0aGlzAh53YXZlbGV0cyByZWNlaXZlZCBmb3IgdHJlYXN1cnkAAAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEnByaWNlU3VycGx1c1N1cHBseQAJAMwIAgkBDEludGVnZXJFbnRyeQICClBMIEJUIE1haW4JAQhQTF92YWx1ZQIFB1BMX01haW4FBXdhdmVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCAgpQTCBCVCBEZWZpCQEIUExfdmFsdWUCBQdQTF9EZWZpBQV3YXZlcwkAzAgCCQEMSW50ZWdlckVudHJ5AgIJUEwgQlQgTG93CQEIUExfdmFsdWUCBQZQTF9Mb3cFBXdhdmVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhBQTCBiYXNlIHRyZWFzdXJ5CQBkAgkAZAIJAQhQTF92YWx1ZQIFB1BMX01haW4FBXdhdmVzCQEIUExfdmFsdWUCBQdQTF9EZWZpBQV3YXZlcwkBCFBMX3ZhbHVlAgUGUExfTG93BQV3YXZlcwkAzAgCCQEMSW50ZWdlckVudHJ5AgIwc3VycGx1cyB0cmVhc3VyeSBCVVJOLVhUTiB4IFBlcGVUZWFtIGluIHdhdmVsZXRzCQBrAwkAaAIFC3dhdmVzSW5Qb29sAAoFDHByb2plY3RTdGFrZQUKdG90YWxTdGFrZQkAzAgCCQEMSW50ZWdlckVudHJ5AgIZRVRIIFB1enpsZSBMZW5kIG1haW4gcG9vbAkBCFBMX3ZhbHVlAgUHUExfTWFpbgUDZXRoCQDMCAIJAQxJbnRlZ2VyRW50cnkCAjZzdXJwbHVzIHRyZWFzdXJ5IEVUSCBQdXp6bGUgTGVuZCBtYWluIHBvb2wgaW4gd2F2ZWxldHMJAGsDCQEIUExfdmFsdWUCBQdQTF9NYWluBQNldGgFCGV0aFdhdmVzBQJkOAkAzAgCCQEMSW50ZWdlckVudHJ5AgIqc3VycGx1cyB0cmVhc3VyeSBXSElSTFBPT0wgQU1NIGluIHdhdmVsZXRzCQBrAwkAaAIFEHdhdmVzSW5XaGlybHBvb2wACgURcHJvamVjdFN0YWtlV2hpcmwFD3RvdGFsU3Rha2VXaGlybAkAzAgCCQEMSW50ZWdlckVudHJ5AgISU1QgRUFTVCBpbiBzdGFraW5nBQ1lYXN0SW5TdGFraW5nCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhJTVCBzdEVBU1QgaW4gd2F2ZXMFDXN0RWFzdEluV2F2ZXMJAMwIAgkBDEludGVnZXJFbnRyeQICKFRvdGFsIHN1cnBsdXMgdHJlYXN1cnkgdmFsdWUgaW4gd2F2ZWxldHMFCnR2bEluV2F2ZXMJAMwIAgkBDEludGVnZXJFbnRyeQICIVdISVJMUE9PTCBpc3N1ZSBwcmljZSBpbiB3YXZlbGV0cwUFcHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQICGldISVJMUE9PTCBtaWQgbWFya2V0IHByaWNlCQBrAwUCZDgJAGgCBRB3YXZlc0luV2hpcmxwb29sAAkFEHdoaXJsSW5XaGlybHBvb2wJAMwIAgkBDEludGVnZXJFbnRyeQICFldISVJMUE9PTCB0b3RhbCBzdXBwbHkFD3doaXJscG9vbFN1cHBseQkAzAgCCQEMSW50ZWdlckVudHJ5AgIOVG90YWwgdHJlYXN1cnkJAGQCCQBkAgkAZAIJAQhQTF92YWx1ZQIFB1BMX01haW4FBXdhdmVzCQEIUExfdmFsdWUCBQdQTF9EZWZpBQV3YXZlcwkBCFBMX3ZhbHVlAgUGUExfTG93BQV3YXZlcwUKdHZsSW5XYXZlcwkAzAgCCQEMSW50ZWdlckVudHJ5AgINTkFWIFdISVJMUE9PTAkAawMFAmQ4CQBkAgkAZAIJAGQCCQEIUExfdmFsdWUCBQdQTF9NYWluBQV3YXZlcwkBCFBMX3ZhbHVlAgUHUExfRGVmaQUFd2F2ZXMJAQhQTF92YWx1ZQIFBlBMX0xvdwUFd2F2ZXMFCnR2bEluV2F2ZXMFD3doaXJscG9vbFN1cHBseQkAzAgCCQEMSW50ZWdlckVudHJ5AgIgdG90YWwgV0FWRVMgcmVjZWl2ZWQgaW4gd2F2ZWxldHMJAQ10cnlHZXRJbnRlZ2VyAgUEdGhpcwIgdG90YWwgV0FWRVMgcmVjZWl2ZWQgaW4gd2F2ZWxldHMJAMwIAgkBDEludGVnZXJFbnRyeQICHHN1cnBsdXMgcmVjZWl2ZWQgaW4gd2F2ZWxldHMJAQ10cnlHZXRJbnRlZ2VyAgUEdGhpcwIcc3VycGx1cyByZWNlaXZlZCBpbiB3YXZlbGV0cwkAzAgCCQEMSW50ZWdlckVudHJ5AgIed2F2ZWxldHMgcmVjZWl2ZWQgZm9yIHRyZWFzdXJ5CQENdHJ5R2V0SW50ZWdlcgIFBHRoaXMCHndhdmVsZXRzIHJlY2VpdmVkIGZvciB0cmVhc3VyeQkAzAgCCQEMSW50ZWdlckVudHJ5AgIgdG90YWwgV0FWRVMgcGFpZCBvdXQgaW4gd2F2ZWxldHMJAQ10cnlHZXRJbnRlZ2VyAgUEdGhpcwIgdG90YWwgV0FWRVMgcGFpZCBvdXQgaW4gd2F2ZWxldHMJAMwIAgkBDEludGVnZXJFbnRyeQICEFJPSSBiYXNpcyBwb2ludHMJAQ10cnlHZXRJbnRlZ2VyAgUEdGhpcwIQUk9JIGJhc2lzIHBvaW50cwUDbmlsAWkBE3Bvb2xPbmVUb2tlblN1cnBsdXMAAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIcYWNjZXNzIG9ubHkgYnkgcHJvamVjdCBvd25lcgQNc3VycGx1c0Ftb3VudAkBDXRyeUdldEludGVnZXICBQR0aGlzAhxzdXJwbHVzIHJlY2VpdmVkIGluIHdhdmVsZXRzBBNQb29sT25lVG9rZW5TdXJwbHVzCQD8BwQJAQdBZGRyZXNzAQEaAVf9JcO9TmGUQe+6XhJjj8U5b0m1iDr16W0CIWdlbmVyYXRlSW5kZXhXaXRoT25lVG9rZW5BbmRTdGFrZQkAzAgCCQDYBAEFEGJ1cm54dG5QUFRwb29sSWQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUEdW5pdAUNc3VycGx1c0Ftb3VudAUDbmlsAwkAAAIFE1Bvb2xPbmVUb2tlblN1cnBsdXMFE1Bvb2xPbmVUb2tlblN1cnBsdXMJAMwIAgkBDEludGVnZXJFbnRyeQICHHN1cnBsdXMgcmVjZWl2ZWQgaW4gd2F2ZWxldHMJAGUCCQENdHJ5R2V0SW50ZWdlcgIFBHRoaXMCHHN1cnBsdXMgcmVjZWl2ZWQgaW4gd2F2ZWxldHMFDXN1cnBsdXNBbW91bnQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQxib29zdFBvb2xBUFkBEndhdmVzQmFsYW5jZUJlZm9yZQMJAGYCCQBkAgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwIVQWN0aXZhdGVkIGJsb2NraGVpZ2h0CQBoAgAIAKALBQZoZWlnaHQJAAIBCQCsAgICFldhaXQgdGlsbCBibG9ja2hlaWdodDoJAKQDAQkAZAIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCFUFjdGl2YXRlZCBibG9ja2hlaWdodAkAaAIACACgCwQPd2F2ZXNEaWZmZXJlbmNlCQBlAggJAO8HAQUEdGhpcwlhdmFpbGFibGUFEndhdmVzQmFsYW5jZUJlZm9yZQMJAAACBQ93YXZlc0RpZmZlcmVuY2UFD3dhdmVzRGlmZmVyZW5jZQQQd2F2ZXNBbW91bnRCb29zdAkAawMFD3dhdmVzRGlmZmVyZW5jZQBQAGQDCQAAAgUQd2F2ZXNBbW91bnRCb29zdAUQd2F2ZXNBbW91bnRCb29zdAQLYW1vdW50Qm9vc3QJAGsDBQ93YXZlc0RpZmZlcmVuY2UAUABkAwkAAAIFC2Ftb3VudEJvb3N0BQthbW91bnRCb29zdAQLYW1vdW50T3duZXIJAGsDBQ93YXZlc0RpZmZlcmVuY2UAFABkAwkAAAIFC2Ftb3VudE93bmVyBQthbW91bnRPd25lcgQFYm9vc3QJAPwHBAkBB0FkZHJlc3MBBQtwb29sYm9vc3RTQwILYWRkQm9vc3RpbmcJAMwIAgkA2AQBBQ93aGlybHBvb2xQb29sSWQJAMwIAgAHBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFBHVuaXQFC2Ftb3VudEJvb3N0BQNuaWwDCQAAAgUFYm9vc3QFBWJvb3N0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQUMcHJvamVjdE93bmVyBQthbW91bnRPd25lcgUEdW5pdAkAzAgCCQEMSW50ZWdlckVudHJ5AgIgdG90YWwgV0FWRVMgcGFpZCBvdXQgaW4gd2F2ZWxldHMJAGQCBRB3YXZlc0Ftb3VudEJvb3N0CQENdHJ5R2V0SW50ZWdlcgIFBHRoaXMCIHRvdGFsIFdBVkVTIHBhaWQgb3V0IGluIHdhdmVsZXRzCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhBST0kgYmFzaXMgcG9pbnRzCQBrAwkBDXRyeUdldEludGVnZXICBQR0aGlzAiB0b3RhbCBXQVZFUyBwYWlkIG91dCBpbiB3YXZlbGV0cwCQTgkBDXRyeUdldEludGVnZXICBQR0aGlzAiB0b3RhbCBXQVZFUyByZWNlaXZlZCBpbiB3YXZlbGV0cwkAzAgCCQEMSW50ZWdlckVudHJ5AgMJAAACCAUBaQZjYWxsZXIFBHRoaXMCFUFjdGl2YXRlZCBibG9ja2hlaWdodAIgQWN0aXZhdGVkIGJ5IGFueWJvZHkgYmxvY2toZWlnaHQFBmhlaWdodAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFmJvb3N0UG9vbEFQWWJ1cm54dG5QUFQAAwkAZgIJAGQCCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAhVBY3RpdmF0ZWQgYmxvY2toZWlnaHQJAGgCAAgAoAsFBmhlaWdodAkAAgEJAKwCAgIWV2FpdCB0aWxsIGJsb2NraGVpZ2h0OgkApAMBCQBkAgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwIVQWN0aXZhdGVkIGJsb2NraGVpZ2h0CQBoAgAIAKALBBJ3YXZlc0JhbGFuY2VCZWZvcmUICQDvBwEFBHRoaXMJYXZhaWxhYmxlAwkAAAIFEndhdmVzQmFsYW5jZUJlZm9yZQUSd2F2ZXNCYWxhbmNlQmVmb3JlBAVjbGFpbQkA/AcECQEHQWRkcmVzcwEFEGJ1cm54dG5QUFRwb29sSWQCEWNsYWltSW5kZXhSZXdhcmRzBQNuaWwFA25pbAMJAAACBQVjbGFpbQUFY2xhaW0EC3N3YXBidXJueHRuCQELc3dhcFRvV2F2ZXMCBRBidXJueHRuUFBUcG9vbElkBQdidXJueHRuAwkAAAIFC3N3YXBidXJueHRuBQtzd2FwYnVybnh0bgQLc3dhcHVzZHRlcmMJAQtzd2FwVG9XYXZlcwIFEGJ1cm54dG5QUFRwb29sSWQFB3VzZHRlcmMDCQAAAgULc3dhcHVzZHRlcmMFC3N3YXB1c2R0ZXJjBAtzd2FwdXNkdGJzYwkBC3N3YXBUb1dhdmVzAgUQYnVybnh0blBQVHBvb2xJZAUHdXNkdGJzYwMJAAACBQtzd2FwdXNkdGJzYwULc3dhcHVzZHRic2MEC3N3YXB1c2RjZXJjCQELc3dhcFRvV2F2ZXMCBRBidXJueHRuUFBUcG9vbElkBQd1c2RjZXJjAwkAAAIFC3N3YXB1c2RjZXJjBQtzd2FwdXNkY2VyYwQLc3dhcHVzZGNic2MJAQtzd2FwVG9XYXZlcwIFEGJ1cm54dG5QUFRwb29sSWQFB3VzZGNic2MDCQAAAgULc3dhcHVzZGNic2MFC3N3YXB1c2RjYnNjBAdzd2FwZXRoCQELc3dhcFRvV2F2ZXMCBRBidXJueHRuUFBUcG9vbElkBQNldGgDCQAAAgUHc3dhcGV0aAUHc3dhcGV0aAQHc3dhcGJuYgkBC3N3YXBUb1dhdmVzAgUQYnVybnh0blBQVHBvb2xJZAUDYm5iAwkAAAIFB3N3YXBibmIFB3N3YXBibmIECHN3YXB3YnRjCQELc3dhcFRvV2F2ZXMCBRBidXJueHRuUFBUcG9vbElkBQR3YnRjAwkAAAIFCHN3YXB3YnRjBQhzd2Fwd2J0YwQIc3dhcGJ0Y2IJAQtzd2FwVG9XYXZlcwIFEGJ1cm54dG5QUFRwb29sSWQFBGJ0Y2IDCQAAAgUIc3dhcGJ0Y2IFCHN3YXBidGNiBAVib29zdAkA/AcEBQR0aGlzAgxib29zdFBvb2xBUFkJAMwIAgUSd2F2ZXNCYWxhbmNlQmVmb3JlBQNuaWwFA25pbAMJAAACBQVib29zdAUFYm9vc3QFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARRib29zdFBvb2xBUFl3RVRIbWFpbgADCQBmAgkAZAIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCFUFjdGl2YXRlZCBibG9ja2hlaWdodAkAaAIACACgCwUGaGVpZ2h0CQACAQkArAICAhZXYWl0IHRpbGwgYmxvY2toZWlnaHQ6CQCkAwEJAGQCCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAhVBY3RpdmF0ZWQgYmxvY2toZWlnaHQJAGgCAAgAoAsEEndhdmVzQmFsYW5jZUJlZm9yZQgJAO8HAQUEdGhpcwlhdmFpbGFibGUDCQAAAgUSd2F2ZXNCYWxhbmNlQmVmb3JlBRJ3YXZlc0JhbGFuY2VCZWZvcmUEE2NhbGN1bGF0ZVRva2VuUmF0ZXMJAPwHBAUHUExfTWFpbgITY2FsY3VsYXRlVG9rZW5SYXRlcwkAzAgCBwUDbmlsBQNuaWwDCQAAAgUTY2FsY3VsYXRlVG9rZW5SYXRlcwUTY2FsY3VsYXRlVG9rZW5SYXRlcwQOd2l0aGRyYXdBbW91bnQJAGUCCQEIUExfdmFsdWUCBQdQTF9NYWluBQNldGgJAQ10cnlHZXRJbnRlZ2VyAgUEdGhpcwIMRVRIIHN1cHBsaWVkBAh3aXRoZHJhdwkBCndpdGhkcmF3UEwDBQdQTF9NYWluBQNldGgFDndpdGhkcmF3QW1vdW50AwkAAAIFCHdpdGhkcmF3BQh3aXRoZHJhdwQHc3dhcGV0aAkBC3N3YXBUb1dhdmVzAgUQYnVybnh0blBQVHBvb2xJZAUDZXRoAwkAAAIFB3N3YXBldGgFB3N3YXBldGgEBWJvb3N0CQD8BwQFBHRoaXMCDGJvb3N0UG9vbEFQWQkAzAgCBRJ3YXZlc0JhbGFuY2VCZWZvcmUFA25pbAUDbmlsAwkAAAIFBWJvb3N0BQVib29zdAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFmJvb3N0UG9vbEFQWXdXaGlybHBvb2wAAwkAZgIJAGQCCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAhVBY3RpdmF0ZWQgYmxvY2toZWlnaHQJAGgCAAgAoAsFBmhlaWdodAkAAgEJAKwCAgIWV2FpdCB0aWxsIGJsb2NraGVpZ2h0OgkApAMBCQBkAgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwIVQWN0aXZhdGVkIGJsb2NraGVpZ2h0CQBoAgAIAKALBBJ3YXZlc0JhbGFuY2VCZWZvcmUICQDvBwEFBHRoaXMJYXZhaWxhYmxlAwkAAAIFEndhdmVzQmFsYW5jZUJlZm9yZQUSd2F2ZXNCYWxhbmNlQmVmb3JlBAVjbGFpbQkA/AcECQEHQWRkcmVzcwEFD3doaXJscG9vbFBvb2xJZAIRY2xhaW1JbmRleFJld2FyZHMFA25pbAUDbmlsAwkAAAIFBWNsYWltBQVjbGFpbQQNc3dhcHdoaXJscG9vbAkBC3N3YXBUb1dhdmVzAgUPd2hpcmxwb29sUG9vbElkBQl3aGlybHBvb2wDCQAAAgUNc3dhcHdoaXJscG9vbAUNc3dhcHdoaXJscG9vbAQFYm9vc3QJAPwHBAUEdGhpcwIMYm9vc3RQb29sQVBZCQDMCAIFEndhdmVzQmFsYW5jZUJlZm9yZQUDbmlsBQNuaWwDCQAAAgUFYm9vc3QFBWJvb3N0BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENc3VwcGx5RVRIbWFpbgADCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhxhY2Nlc3Mgb25seSBieSBwcm9qZWN0IG93bmVyBAxzdXBwbHlBbW91bnQJAPAHAgUEdGhpcwUDZXRoAwkAAAIFDHN1cHBseUFtb3VudAUMc3VwcGx5QW1vdW50BARtYWluCQEIc3VwcGx5UEwDBQdQTF9NYWluBQNldGgFDHN1cHBseUFtb3VudAMJAAACBQRtYWluBQRtYWluCQDMCAIJAQxJbnRlZ2VyRW50cnkCAgxFVEggc3VwcGxpZWQJAGQCBQxzdXBwbHlBbW91bnQJAQ10cnlHZXRJbnRlZ2VyAgUEdGhpcwIMRVRIIHN1cHBsaWVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhlFVEggUHV6emxlIExlbmQgbWFpbiBwb29sCQEIUExfdmFsdWUCBQdQTF9NYWluBQNldGgJAMwIAgkBDEludGVnZXJFbnRyeQICNnN1cnBsdXMgdHJlYXN1cnkgRVRIIFB1enpsZSBMZW5kIG1haW4gcG9vbCBpbiB3YXZlbGV0cwkAawMJAQhQTF92YWx1ZQIFB1BMX01haW4FA2V0aAUIZXRoV2F2ZXMFAmQ4BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQESd2l0aGRyYXdXQVZFU19NYWluAAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECHGFjY2VzcyBvbmx5IGJ5IHByb2plY3Qgb3duZXIEDndpdGhkcmF3QW1vdW50CQETd2l0aGRyYXdBbW91bnRXYXZlcwEFB1BMX01haW4DCQAAAgUOd2l0aGRyYXdBbW91bnQFDndpdGhkcmF3QW1vdW50BAh3aXRoZHJhdwkBCndpdGhkcmF3UEwDBQdQTF9NYWluBQV3YXZlcwkBE3dpdGhkcmF3QW1vdW50V2F2ZXMBBQdQTF9NYWluAwkAAAIFCHdpdGhkcmF3BQh3aXRoZHJhdwkAzAgCCQEMSW50ZWdlckVudHJ5AgIKUEwgQlQgTWFpbgkBCFBMX3ZhbHVlAgUHUExfTWFpbgUFd2F2ZXMJAMwIAgkBDEludGVnZXJFbnRyeQICFXdpdGhkcmF3IEFtb3VudCBXYXZlcwUOd2l0aGRyYXdBbW91bnQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARJ3aXRoZHJhd1dBVkVTX0RlZmkAAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIcYWNjZXNzIG9ubHkgYnkgcHJvamVjdCBvd25lcgQOd2l0aGRyYXdBbW91bnQJARN3aXRoZHJhd0Ftb3VudFdhdmVzAQUHUExfRGVmaQMJAAACBQ53aXRoZHJhd0Ftb3VudAUOd2l0aGRyYXdBbW91bnQECHdpdGhkcmF3CQEKd2l0aGRyYXdQTAMFB1BMX0RlZmkFBXdhdmVzCQETd2l0aGRyYXdBbW91bnRXYXZlcwEFB1BMX0RlZmkDCQAAAgUId2l0aGRyYXcFCHdpdGhkcmF3CQDMCAIJAQxJbnRlZ2VyRW50cnkCAgpQTCBCVCBEZWZpCQEIUExfdmFsdWUCBQdQTF9EZWZpBQV3YXZlcwkAzAgCCQEMSW50ZWdlckVudHJ5AgIVd2l0aGRyYXcgQW1vdW50IFdhdmVzBQ53aXRoZHJhd0Ftb3VudAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEXdpdGhkcmF3V0FWRVNfTG93AAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECHGFjY2VzcyBvbmx5IGJ5IHByb2plY3Qgb3duZXIEDndpdGhkcmF3QW1vdW50CQETd2l0aGRyYXdBbW91bnRXYXZlcwEFBlBMX0xvdwMJAAACBQ53aXRoZHJhd0Ftb3VudAUOd2l0aGRyYXdBbW91bnQECHdpdGhkcmF3CQEKd2l0aGRyYXdQTAMFBlBMX0xvdwUFd2F2ZXMJARN3aXRoZHJhd0Ftb3VudFdhdmVzAQUGUExfTG93AwkAAAIFCHdpdGhkcmF3BQh3aXRoZHJhdwkAzAgCCQEMSW50ZWdlckVudHJ5AgIJUEwgQlQgTG93CQEIUExfdmFsdWUCBQZQTF9Mb3cFBXdhdmVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhV3aXRoZHJhdyBBbW91bnQgV2F2ZXMFDndpdGhkcmF3QW1vdW50BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEJc3Rha2VFQVNUAAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECHGFjY2VzcyBvbmx5IGJ5IHByb2plY3Qgb3duZXIECXN0YWtlRUFTVAkA/AcEBQpFQVNUX3N0YWtlAgVzdGFrZQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQRlYXN0CQDwBwIFBHRoaXMFBGVhc3QFA25pbAMJAAACBQlzdGFrZUVBU1QFCXN0YWtlRUFTVAkAzAgCCQEMSW50ZWdlckVudHJ5AgILRUFTVCBzdGFrZWQJAGQCCQDwBwIFBHRoaXMFBGVhc3QJAQ10cnlHZXRJbnRlZ2VyAgUEdGhpcwILRUFTVCBzdGFrZWQJAMwIAgkBDEludGVnZXJFbnRyeQICElNUIEVBU1QgaW4gc3Rha2luZwUNZWFzdEluU3Rha2luZwkAzAgCCQEMSW50ZWdlckVudHJ5AgISU1Qgc3RFQVNUIGluIHdhdmVzBQ1zdEVhc3RJbldhdmVzBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQESY2hhbmdlSW50ZWdlckVudHJ5AglrZXlTdHJpbmcHaW50ZWdlcgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECHGFjY2VzcyBvbmx5IGJ5IHByb2plY3Qgb3duZXIJAMwIAgkBDEludGVnZXJFbnRyeQIFCWtleVN0cmluZwUHaW50ZWdlcgUDbmlsALDajyI=", "height": 3853677, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4G9pj6Rqk9HB9DUcs1Ypsb47GHaBXWxCgyHtP3eZGt3X Next: A3CdCoWDtfBaByHz9TovouJ1a7M8eRrS4B8KUyD4m41F Diff:
Old | New | Differences | |
---|---|---|---|
165 | 165 | else throw("please contact project owner: issue amount error") | |
166 | 166 | let supplyAmount = ((pmt.amount - surplus) / 3) | |
167 | 167 | let cleanAmountIn = (pmt.amount - fraction(pmt.amount, 200, 10000)) | |
168 | - | let AmountOut = fraction(whirlInWhirlpool, ((d8 * d8) - toInt(pow(fraction(toBigInt((600 * d8)), toBigInt((d8 * d8)), toBigInt(((600 * d8) + cleanAmountIn)), HALFUP), 16, toBigInt(fraction( | |
168 | + | let AmountOut = fraction(whirlInWhirlpool, ((d8 * d8) - toInt(pow(fraction(toBigInt((600 * d8)), toBigInt((d8 * d8)), toBigInt(((600 * d8) + cleanAmountIn)), HALFUP), 16, toBigInt(fraction(100000, 10000, 900000)), 4, 16, CEILING))), (d8 * d8), DOWN) | |
169 | 169 | if ((pmt.assetId != unit)) | |
170 | 170 | then throw("attach WAVES token only") | |
171 | 171 | else { |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | func tryGetInteger (address,key) = match getInteger(address, key) { | |
5 | 5 | case b: Int => | |
6 | 6 | b | |
7 | 7 | case _ => | |
8 | 8 | 0 | |
9 | 9 | } | |
10 | 10 | ||
11 | 11 | ||
12 | 12 | let d8 = 100000000 | |
13 | 13 | ||
14 | 14 | let d16 = (d8 * d8) | |
15 | 15 | ||
16 | 16 | let burnxtnPPTpoolId = base58'3PQHndCUVrv3wBuQjbvVP9SnGmfbfitGxfx' | |
17 | 17 | ||
18 | 18 | let projectOwner = base58'3PEtLVxDT8mxAh1SDAn8m7JTGNkdpkaFxBk' | |
19 | 19 | ||
20 | 20 | let whirlpoolPoolId = base58'3P2myTbd5zpEHcYmNpdWTp5gXS5B8tL1RCY' | |
21 | 21 | ||
22 | 22 | let whirlpool = base58'73tY3E6Gd5AWYmsuq8m8Kek7KnJNAYyS3GoveTbc6jCi' | |
23 | 23 | ||
24 | 24 | let whirlpoolString = toBase58String(base58'73tY3E6Gd5AWYmsuq8m8Kek7KnJNAYyS3GoveTbc6jCi') | |
25 | 25 | ||
26 | 26 | let test = base58'fHJWWsh2hZAc4Atv8VRhKy3jNbHLeMwQMsLpdaBY51Y' | |
27 | 27 | ||
28 | 28 | let waves = base58'WAVES' | |
29 | 29 | ||
30 | 30 | let usdterc = base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi' | |
31 | 31 | ||
32 | 32 | let usdcerc = base58'HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW' | |
33 | 33 | ||
34 | 34 | let usdtbsc = base58'A81p1LTRyoq2rDR2TNxB2dWYxsiNwCSSi8sXef2SEkwb' | |
35 | 35 | ||
36 | 36 | let usdcbsc = base58'4BKKSp6NoNcrFHyorZogDyctq1fq6w7114Ym1pw6HUtC' | |
37 | 37 | ||
38 | 38 | let burnxtn = base58'3SjxA2YLdfF9fTRbzLm9xFn27C6MW34W1YsdJ6Axefns' | |
39 | 39 | ||
40 | 40 | let eth = base58'3VuV5WTmDz47Dmdn3QpcYjzbSdipjQE4JMdNe1xZpX13' | |
41 | 41 | ||
42 | 42 | let bnb = base58'66a1br3BrkoaJgP7yEar9hJcSTvJPoH6PYBLqscXcMGo' | |
43 | 43 | ||
44 | 44 | let wbtc = base58'2Fge5HEBRD3XTeg7Xg3FW5yiB9HVJFQtMXiWMQo72Up6' | |
45 | 45 | ||
46 | 46 | let btcb = base58'EW1uGLVo21Wd9i2Rhq8o4VKDTCQTGCGXE8DqayHGrLg8' | |
47 | 47 | ||
48 | 48 | let east = base58'6phK22ztGBW127gUFmdMEHKB3CVd6ZhWox2WtwJkbqTq' | |
49 | 49 | ||
50 | 50 | let steast = base58'GAB8JowY9UANZ4TQy2TzJyhxjPqXX3DUrb2cdMWrrJus' | |
51 | 51 | ||
52 | 52 | let swaves = base58'YiNbofFzC17jEHHCMwrRcpy9MrrjabMMLZxg8g5xmf7' | |
53 | 53 | ||
54 | 54 | let poolboostSC = base58'3PAeY7RgwuNUZNscGqahqJxFTFDkh7fbNwJ' | |
55 | 55 | ||
56 | 56 | let PL_Main = Address(base58'3P4uA5etnZi4AmBabKinq2bMiWU8KcnHZdH') | |
57 | 57 | ||
58 | 58 | let PL_Defi = Address(base58'3P4DK5VzDwL3vfc5ahUEhtoe5ByZNyacJ3X') | |
59 | 59 | ||
60 | 60 | let PL_Low = Address(base58'3PHpuQUPVUoR3AYzFeJzeWJfYLsLTmWssVH') | |
61 | 61 | ||
62 | 62 | let EAST_stake = Address(base58'3P2hbtheN5apNppqqUK7L7qAwmRFXy91CNa') | |
63 | 63 | ||
64 | 64 | let WX_WAVES_EAST = Address(base58'3PJVwjfi2fF5Jv9AauayU6xLxrYBn8bpGH1') | |
65 | 65 | ||
66 | 66 | let SWAVES_stake = Address(base58'3PDPzZVLhN1EuzGy4xAxjjTVkawKDLEaHiV') | |
67 | 67 | ||
68 | 68 | let ethInPool = tryGetInteger(Address(burnxtnPPTpoolId), (("global_" + toBase58String(eth)) + "_balance")) | |
69 | 69 | ||
70 | 70 | let wavesInPool = tryGetInteger(Address(burnxtnPPTpoolId), (("global_" + toBase58String(waves)) + "_balance")) | |
71 | 71 | ||
72 | 72 | let ethWaves = fraction(d8, wavesInPool, ethInPool) | |
73 | 73 | ||
74 | 74 | let projectStake = tryGetInteger(Address(burnxtnPPTpoolId), (toString(this) + "_indexStaked")) | |
75 | 75 | ||
76 | 76 | let totalStake = tryGetInteger(Address(burnxtnPPTpoolId), "global_poolToken_amount") | |
77 | 77 | ||
78 | 78 | func PL_value (dAppAddress,asset) = fraction(tryGetInteger(dAppAddress, ((toString(this) + "_supplied_") + toBase58String(asset))), tryGetInteger(dAppAddress, (toBase58String(asset) + "_sRate")), d16) | |
79 | 79 | ||
80 | 80 | ||
81 | 81 | func _loadInt (key_,default_) = match getInteger(SWAVES_stake, key_) { | |
82 | 82 | case a: Int => | |
83 | 83 | a | |
84 | 84 | case _ => | |
85 | 85 | default_ | |
86 | 86 | } | |
87 | 87 | ||
88 | 88 | ||
89 | 89 | func _loadBigInt (key_,default_) = match getBinary(SWAVES_stake, key_) { | |
90 | 90 | case a: ByteVector => | |
91 | 91 | toBigInt(a) | |
92 | 92 | case _ => | |
93 | 93 | default_ | |
94 | 94 | } | |
95 | 95 | ||
96 | 96 | ||
97 | 97 | let lastRate = _loadBigInt("LAST_RATE", toBigInt(1000000000000)) | |
98 | 98 | ||
99 | 99 | let currentRate = _loadBigInt("CURRENT_RATE", toBigInt(0)) | |
100 | 100 | ||
101 | 101 | let lastHeight = _loadInt("LAST_HEIGHT", 0) | |
102 | 102 | ||
103 | 103 | let targetHeight = min([_loadInt("TARGET_HEIGHT", 0), height]) | |
104 | 104 | ||
105 | 105 | let lastRateUpdated = (lastRate + (currentRate * toBigInt((targetHeight - lastHeight)))) | |
106 | 106 | ||
107 | 107 | let baseAmount = toInt(fraction(toBigInt(assetBalance(WX_WAVES_EAST, swaves)), lastRateUpdated, toBigInt(1000000000000), FLOOR)) | |
108 | 108 | ||
109 | 109 | let wavesInWX = (wavesBalance(WX_WAVES_EAST).regular + baseAmount) | |
110 | 110 | ||
111 | 111 | let eastInWX = assetBalance(WX_WAVES_EAST, east) | |
112 | 112 | ||
113 | 113 | let wavesEast = fraction((d8 * 100), eastInWX, wavesInWX) | |
114 | 114 | ||
115 | 115 | let wavesInWhirlpool = tryGetInteger(Address(whirlpoolPoolId), (("global_" + toBase58String(waves)) + "_balance")) | |
116 | 116 | ||
117 | 117 | let whirlInWhirlpool = tryGetInteger(Address(whirlpoolPoolId), (("global_" + whirlpoolString) + "_balance")) | |
118 | 118 | ||
119 | 119 | let projectStakeWhirl = tryGetInteger(Address(whirlpoolPoolId), (toString(this) + "_indexStaked")) | |
120 | 120 | ||
121 | 121 | let totalStakeWhirl = tryGetInteger(Address(whirlpoolPoolId), "global_poolToken_amount") | |
122 | 122 | ||
123 | 123 | let stEastInWaves = (fraction((fraction(assetBalance(this, steast), tryGetInteger(EAST_stake, "%s__rate"), 1000000000000, HALFEVEN) / 100), d8, wavesEast) * 100) | |
124 | 124 | ||
125 | 125 | let eastInStaking = (fraction(assetBalance(this, steast), tryGetInteger(EAST_stake, "%s__rate"), 1000000000000, HALFEVEN) / 100) | |
126 | 126 | ||
127 | 127 | let tvlInWaves = (((fraction((wavesInPool * 10), projectStake, totalStake) + fraction(PL_value(PL_Main, eth), ethWaves, d8)) + fraction((wavesInWhirlpool * 10), projectStakeWhirl, totalStakeWhirl)) + stEastInWaves) | |
128 | 128 | ||
129 | 129 | let whirlpoolSupply = match assetInfo(test) { | |
130 | 130 | case asset: Asset => | |
131 | 131 | asset.quantity | |
132 | 132 | case _ => | |
133 | 133 | throw("Can't find asset") | |
134 | 134 | } | |
135 | 135 | ||
136 | 136 | let price = if (((fraction((tvlInWaves + tryGetInteger(this, "surplus received in wavelets")), d8, whirlpoolSupply) + d8) >= tryGetInteger(this, "WHIRLPOOL issue price in wavelets"))) | |
137 | 137 | then (fraction((tvlInWaves + tryGetInteger(this, "surplus received in wavelets")), d8, whirlpoolSupply) + d8) | |
138 | 138 | else tryGetInteger(this, "WHIRLPOOL issue price in wavelets") | |
139 | 139 | ||
140 | 140 | func withdrawAmountWaves (dappAddress) = (PL_value(dappAddress, waves) - (tryGetInteger(this, "wavelets received for treasury") / 3)) | |
141 | 141 | ||
142 | 142 | ||
143 | 143 | func supplyPL (dappAddress,assetId,supplyAmount) = invoke(dappAddress, "supply", nil, [AttachedPayment(assetId, supplyAmount)]) | |
144 | 144 | ||
145 | 145 | ||
146 | 146 | func withdrawPL (dappAddress,assetId,withdrawAmount) = invoke(dappAddress, "withdraw", [toBase58String(assetId), withdrawAmount], nil) | |
147 | 147 | ||
148 | 148 | ||
149 | 149 | func swapToWaves (poolId,assetId) = invoke(Address(poolId), "swap", ["WAVES", 0], [AttachedPayment(assetId, assetBalance(this, assetId))]) | |
150 | 150 | ||
151 | 151 | ||
152 | 152 | @Callable(i) | |
153 | 153 | func buyWHIRLPOOLwithWAVES () = if (if ((i.caller != this)) | |
154 | 154 | then (i.caller != Address(base58'3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3')) | |
155 | 155 | else false) | |
156 | 156 | then throw("smart contract under maintenance") | |
157 | 157 | else { | |
158 | 158 | let WhirlpoolBalanceBefore = assetBalance(this, whirlpool) | |
159 | 159 | if ((WhirlpoolBalanceBefore == WhirlpoolBalanceBefore)) | |
160 | 160 | then { | |
161 | 161 | let pmt = value(i.payments[0]) | |
162 | 162 | let surplus = fraction((price - d8), pmt.amount, d8) | |
163 | 163 | let IssueAmount = if ((pmt.amount >= fraction(pmt.amount, d8, price))) | |
164 | 164 | then fraction(pmt.amount, d8, price) | |
165 | 165 | else throw("please contact project owner: issue amount error") | |
166 | 166 | let supplyAmount = ((pmt.amount - surplus) / 3) | |
167 | 167 | let cleanAmountIn = (pmt.amount - fraction(pmt.amount, 200, 10000)) | |
168 | - | let AmountOut = fraction(whirlInWhirlpool, ((d8 * d8) - toInt(pow(fraction(toBigInt((600 * d8)), toBigInt((d8 * d8)), toBigInt(((600 * d8) + cleanAmountIn)), HALFUP), 16, toBigInt(fraction( | |
168 | + | let AmountOut = fraction(whirlInWhirlpool, ((d8 * d8) - toInt(pow(fraction(toBigInt((600 * d8)), toBigInt((d8 * d8)), toBigInt(((600 * d8) + cleanAmountIn)), HALFUP), 16, toBigInt(fraction(100000, 10000, 900000)), 4, 16, CEILING))), (d8 * d8), DOWN) | |
169 | 169 | if ((pmt.assetId != unit)) | |
170 | 170 | then throw("attach WAVES token only") | |
171 | 171 | else { | |
172 | 172 | let buy = if ((AmountOut > IssueAmount)) | |
173 | 173 | then invoke(Address(whirlpoolPoolId), "swap", [whirlpoolString, (IssueAmount + 1)], [AttachedPayment(unit, pmt.amount)]) | |
174 | 174 | else unit | |
175 | 175 | if ((buy == buy)) | |
176 | 176 | then { | |
177 | 177 | let main = if ((IssueAmount >= AmountOut)) | |
178 | 178 | then supplyPL(PL_Main, unit, supplyAmount) | |
179 | 179 | else unit | |
180 | 180 | if ((main == main)) | |
181 | 181 | then { | |
182 | 182 | let defi = if ((IssueAmount >= AmountOut)) | |
183 | 183 | then supplyPL(PL_Defi, unit, supplyAmount) | |
184 | 184 | else unit | |
185 | 185 | if ((defi == defi)) | |
186 | 186 | then { | |
187 | 187 | let low = if ((IssueAmount >= AmountOut)) | |
188 | 188 | then supplyPL(PL_Low, unit, supplyAmount) | |
189 | 189 | else unit | |
190 | 190 | if ((low == low)) | |
191 | 191 | then { | |
192 | 192 | let WhirlpoolBalanceAfter = assetBalance(this, whirlpool) | |
193 | 193 | let WhirlpoolFromSwap = (WhirlpoolBalanceAfter - WhirlpoolBalanceBefore) | |
194 | 194 | [Reissue(test, if ((IssueAmount >= AmountOut)) | |
195 | 195 | then IssueAmount | |
196 | 196 | else 0, true), if ((AmountOut > IssueAmount)) | |
197 | 197 | then ScriptTransfer(i.caller, WhirlpoolFromSwap, whirlpool) | |
198 | 198 | else ScriptTransfer(i.caller, IssueAmount, test), IntegerEntry("WHIRLPOOL issue price in wavelets", price), IntegerEntry("total WAVES received in wavelets", if ((IssueAmount >= AmountOut)) | |
199 | 199 | then (pmt.amount + tryGetInteger(this, "total WAVES received in wavelets")) | |
200 | 200 | else (0 + tryGetInteger(this, "total WAVES received in wavelets"))), IntegerEntry("wavelets received for treasury", if ((IssueAmount >= AmountOut)) | |
201 | 201 | then ((pmt.amount - surplus) + tryGetInteger(this, "wavelets received for treasury")) | |
202 | 202 | else 0)] | |
203 | 203 | } | |
204 | 204 | else throw("Strict value is not equal to itself.") | |
205 | 205 | } | |
206 | 206 | else throw("Strict value is not equal to itself.") | |
207 | 207 | } | |
208 | 208 | else throw("Strict value is not equal to itself.") | |
209 | 209 | } | |
210 | 210 | else throw("Strict value is not equal to itself.") | |
211 | 211 | } | |
212 | 212 | } | |
213 | 213 | else throw("Strict value is not equal to itself.") | |
214 | 214 | } | |
215 | 215 | ||
216 | 216 | ||
217 | 217 | ||
218 | 218 | @Callable(i) | |
219 | 219 | func priceSurplusSupply () = [IntegerEntry("PL BT Main", PL_value(PL_Main, waves)), IntegerEntry("PL BT Defi", PL_value(PL_Defi, waves)), IntegerEntry("PL BT Low", PL_value(PL_Low, waves)), IntegerEntry("PL base treasury", ((PL_value(PL_Main, waves) + PL_value(PL_Defi, waves)) + PL_value(PL_Low, waves))), IntegerEntry("surplus treasury BURN-XTN x PepeTeam in wavelets", fraction((wavesInPool * 10), projectStake, totalStake)), IntegerEntry("ETH Puzzle Lend main pool", PL_value(PL_Main, eth)), IntegerEntry("surplus treasury ETH Puzzle Lend main pool in wavelets", fraction(PL_value(PL_Main, eth), ethWaves, d8)), IntegerEntry("surplus treasury WHIRLPOOL AMM in wavelets", fraction((wavesInWhirlpool * 10), projectStakeWhirl, totalStakeWhirl)), IntegerEntry("ST EAST in staking", eastInStaking), IntegerEntry("ST stEAST in waves", stEastInWaves), IntegerEntry("Total surplus treasury value in wavelets", tvlInWaves), IntegerEntry("WHIRLPOOL issue price in wavelets", price), IntegerEntry("WHIRLPOOL mid market price", fraction(d8, (wavesInWhirlpool * 9), whirlInWhirlpool)), IntegerEntry("WHIRLPOOL total supply", whirlpoolSupply), IntegerEntry("Total treasury", (((PL_value(PL_Main, waves) + PL_value(PL_Defi, waves)) + PL_value(PL_Low, waves)) + tvlInWaves)), IntegerEntry("NAV WHIRLPOOL", fraction(d8, (((PL_value(PL_Main, waves) + PL_value(PL_Defi, waves)) + PL_value(PL_Low, waves)) + tvlInWaves), whirlpoolSupply)), IntegerEntry("total WAVES received in wavelets", tryGetInteger(this, "total WAVES received in wavelets")), IntegerEntry("surplus received in wavelets", tryGetInteger(this, "surplus received in wavelets")), IntegerEntry("wavelets received for treasury", tryGetInteger(this, "wavelets received for treasury")), IntegerEntry("total WAVES paid out in wavelets", tryGetInteger(this, "total WAVES paid out in wavelets")), IntegerEntry("ROI basis points", tryGetInteger(this, "ROI basis points"))] | |
220 | 220 | ||
221 | 221 | ||
222 | 222 | ||
223 | 223 | @Callable(i) | |
224 | 224 | func poolOneTokenSurplus () = if ((i.caller != this)) | |
225 | 225 | then throw("access only by project owner") | |
226 | 226 | else { | |
227 | 227 | let surplusAmount = tryGetInteger(this, "surplus received in wavelets") | |
228 | 228 | let PoolOneTokenSurplus = invoke(Address(base58'3PR1Qvi9mHT35SwWEkLSqqE2L8thiPLdVWU'), "generateIndexWithOneTokenAndStake", [toBase58String(burnxtnPPTpoolId)], [AttachedPayment(unit, surplusAmount)]) | |
229 | 229 | if ((PoolOneTokenSurplus == PoolOneTokenSurplus)) | |
230 | 230 | then [IntegerEntry("surplus received in wavelets", (tryGetInteger(this, "surplus received in wavelets") - surplusAmount))] | |
231 | 231 | else throw("Strict value is not equal to itself.") | |
232 | 232 | } | |
233 | 233 | ||
234 | 234 | ||
235 | 235 | ||
236 | 236 | @Callable(i) | |
237 | 237 | func boostPoolAPY (wavesBalanceBefore) = if (((getIntegerValue(this, "Activated blockheight") + (8 * 1440)) > height)) | |
238 | 238 | then throw(("Wait till blockheight:" + toString((getIntegerValue(this, "Activated blockheight") + (8 * 1440))))) | |
239 | 239 | else { | |
240 | 240 | let wavesDifference = (wavesBalance(this).available - wavesBalanceBefore) | |
241 | 241 | if ((wavesDifference == wavesDifference)) | |
242 | 242 | then { | |
243 | 243 | let wavesAmountBoost = fraction(wavesDifference, 80, 100) | |
244 | 244 | if ((wavesAmountBoost == wavesAmountBoost)) | |
245 | 245 | then { | |
246 | 246 | let amountBoost = fraction(wavesDifference, 80, 100) | |
247 | 247 | if ((amountBoost == amountBoost)) | |
248 | 248 | then { | |
249 | 249 | let amountOwner = fraction(wavesDifference, 20, 100) | |
250 | 250 | if ((amountOwner == amountOwner)) | |
251 | 251 | then { | |
252 | 252 | let boost = invoke(Address(poolboostSC), "addBoosting", [toBase58String(whirlpoolPoolId), 7], [AttachedPayment(unit, amountBoost)]) | |
253 | 253 | if ((boost == boost)) | |
254 | 254 | then [ScriptTransfer(Address(projectOwner), amountOwner, unit), IntegerEntry("total WAVES paid out in wavelets", (wavesAmountBoost + tryGetInteger(this, "total WAVES paid out in wavelets"))), IntegerEntry("ROI basis points", fraction(tryGetInteger(this, "total WAVES paid out in wavelets"), 10000, tryGetInteger(this, "total WAVES received in wavelets"))), IntegerEntry(if ((i.caller == this)) | |
255 | 255 | then "Activated blockheight" | |
256 | 256 | else "Activated by anybody blockheight", height)] | |
257 | 257 | else throw("Strict value is not equal to itself.") | |
258 | 258 | } | |
259 | 259 | else throw("Strict value is not equal to itself.") | |
260 | 260 | } | |
261 | 261 | else throw("Strict value is not equal to itself.") | |
262 | 262 | } | |
263 | 263 | else throw("Strict value is not equal to itself.") | |
264 | 264 | } | |
265 | 265 | else throw("Strict value is not equal to itself.") | |
266 | 266 | } | |
267 | 267 | ||
268 | 268 | ||
269 | 269 | ||
270 | 270 | @Callable(i) | |
271 | 271 | func boostPoolAPYburnxtnPPT () = if (((getIntegerValue(this, "Activated blockheight") + (8 * 1440)) > height)) | |
272 | 272 | then throw(("Wait till blockheight:" + toString((getIntegerValue(this, "Activated blockheight") + (8 * 1440))))) | |
273 | 273 | else { | |
274 | 274 | let wavesBalanceBefore = wavesBalance(this).available | |
275 | 275 | if ((wavesBalanceBefore == wavesBalanceBefore)) | |
276 | 276 | then { | |
277 | 277 | let claim = invoke(Address(burnxtnPPTpoolId), "claimIndexRewards", nil, nil) | |
278 | 278 | if ((claim == claim)) | |
279 | 279 | then { | |
280 | 280 | let swapburnxtn = swapToWaves(burnxtnPPTpoolId, burnxtn) | |
281 | 281 | if ((swapburnxtn == swapburnxtn)) | |
282 | 282 | then { | |
283 | 283 | let swapusdterc = swapToWaves(burnxtnPPTpoolId, usdterc) | |
284 | 284 | if ((swapusdterc == swapusdterc)) | |
285 | 285 | then { | |
286 | 286 | let swapusdtbsc = swapToWaves(burnxtnPPTpoolId, usdtbsc) | |
287 | 287 | if ((swapusdtbsc == swapusdtbsc)) | |
288 | 288 | then { | |
289 | 289 | let swapusdcerc = swapToWaves(burnxtnPPTpoolId, usdcerc) | |
290 | 290 | if ((swapusdcerc == swapusdcerc)) | |
291 | 291 | then { | |
292 | 292 | let swapusdcbsc = swapToWaves(burnxtnPPTpoolId, usdcbsc) | |
293 | 293 | if ((swapusdcbsc == swapusdcbsc)) | |
294 | 294 | then { | |
295 | 295 | let swapeth = swapToWaves(burnxtnPPTpoolId, eth) | |
296 | 296 | if ((swapeth == swapeth)) | |
297 | 297 | then { | |
298 | 298 | let swapbnb = swapToWaves(burnxtnPPTpoolId, bnb) | |
299 | 299 | if ((swapbnb == swapbnb)) | |
300 | 300 | then { | |
301 | 301 | let swapwbtc = swapToWaves(burnxtnPPTpoolId, wbtc) | |
302 | 302 | if ((swapwbtc == swapwbtc)) | |
303 | 303 | then { | |
304 | 304 | let swapbtcb = swapToWaves(burnxtnPPTpoolId, btcb) | |
305 | 305 | if ((swapbtcb == swapbtcb)) | |
306 | 306 | then { | |
307 | 307 | let boost = invoke(this, "boostPoolAPY", [wavesBalanceBefore], nil) | |
308 | 308 | if ((boost == boost)) | |
309 | 309 | then nil | |
310 | 310 | else throw("Strict value is not equal to itself.") | |
311 | 311 | } | |
312 | 312 | else throw("Strict value is not equal to itself.") | |
313 | 313 | } | |
314 | 314 | else throw("Strict value is not equal to itself.") | |
315 | 315 | } | |
316 | 316 | else throw("Strict value is not equal to itself.") | |
317 | 317 | } | |
318 | 318 | else throw("Strict value is not equal to itself.") | |
319 | 319 | } | |
320 | 320 | else throw("Strict value is not equal to itself.") | |
321 | 321 | } | |
322 | 322 | else throw("Strict value is not equal to itself.") | |
323 | 323 | } | |
324 | 324 | else throw("Strict value is not equal to itself.") | |
325 | 325 | } | |
326 | 326 | else throw("Strict value is not equal to itself.") | |
327 | 327 | } | |
328 | 328 | else throw("Strict value is not equal to itself.") | |
329 | 329 | } | |
330 | 330 | else throw("Strict value is not equal to itself.") | |
331 | 331 | } | |
332 | 332 | else throw("Strict value is not equal to itself.") | |
333 | 333 | } | |
334 | 334 | ||
335 | 335 | ||
336 | 336 | ||
337 | 337 | @Callable(i) | |
338 | 338 | func boostPoolAPYwETHmain () = if (((getIntegerValue(this, "Activated blockheight") + (8 * 1440)) > height)) | |
339 | 339 | then throw(("Wait till blockheight:" + toString((getIntegerValue(this, "Activated blockheight") + (8 * 1440))))) | |
340 | 340 | else { | |
341 | 341 | let wavesBalanceBefore = wavesBalance(this).available | |
342 | 342 | if ((wavesBalanceBefore == wavesBalanceBefore)) | |
343 | 343 | then { | |
344 | 344 | let calculateTokenRates = invoke(PL_Main, "calculateTokenRates", [false], nil) | |
345 | 345 | if ((calculateTokenRates == calculateTokenRates)) | |
346 | 346 | then { | |
347 | 347 | let withdrawAmount = (PL_value(PL_Main, eth) - tryGetInteger(this, "ETH supplied")) | |
348 | 348 | let withdraw = withdrawPL(PL_Main, eth, withdrawAmount) | |
349 | 349 | if ((withdraw == withdraw)) | |
350 | 350 | then { | |
351 | 351 | let swapeth = swapToWaves(burnxtnPPTpoolId, eth) | |
352 | 352 | if ((swapeth == swapeth)) | |
353 | 353 | then { | |
354 | 354 | let boost = invoke(this, "boostPoolAPY", [wavesBalanceBefore], nil) | |
355 | 355 | if ((boost == boost)) | |
356 | 356 | then nil | |
357 | 357 | else throw("Strict value is not equal to itself.") | |
358 | 358 | } | |
359 | 359 | else throw("Strict value is not equal to itself.") | |
360 | 360 | } | |
361 | 361 | else throw("Strict value is not equal to itself.") | |
362 | 362 | } | |
363 | 363 | else throw("Strict value is not equal to itself.") | |
364 | 364 | } | |
365 | 365 | else throw("Strict value is not equal to itself.") | |
366 | 366 | } | |
367 | 367 | ||
368 | 368 | ||
369 | 369 | ||
370 | 370 | @Callable(i) | |
371 | 371 | func boostPoolAPYwWhirlpool () = if (((getIntegerValue(this, "Activated blockheight") + (8 * 1440)) > height)) | |
372 | 372 | then throw(("Wait till blockheight:" + toString((getIntegerValue(this, "Activated blockheight") + (8 * 1440))))) | |
373 | 373 | else { | |
374 | 374 | let wavesBalanceBefore = wavesBalance(this).available | |
375 | 375 | if ((wavesBalanceBefore == wavesBalanceBefore)) | |
376 | 376 | then { | |
377 | 377 | let claim = invoke(Address(whirlpoolPoolId), "claimIndexRewards", nil, nil) | |
378 | 378 | if ((claim == claim)) | |
379 | 379 | then { | |
380 | 380 | let swapwhirlpool = swapToWaves(whirlpoolPoolId, whirlpool) | |
381 | 381 | if ((swapwhirlpool == swapwhirlpool)) | |
382 | 382 | then { | |
383 | 383 | let boost = invoke(this, "boostPoolAPY", [wavesBalanceBefore], nil) | |
384 | 384 | if ((boost == boost)) | |
385 | 385 | then nil | |
386 | 386 | else throw("Strict value is not equal to itself.") | |
387 | 387 | } | |
388 | 388 | else throw("Strict value is not equal to itself.") | |
389 | 389 | } | |
390 | 390 | else throw("Strict value is not equal to itself.") | |
391 | 391 | } | |
392 | 392 | else throw("Strict value is not equal to itself.") | |
393 | 393 | } | |
394 | 394 | ||
395 | 395 | ||
396 | 396 | ||
397 | 397 | @Callable(i) | |
398 | 398 | func supplyETHmain () = if ((i.caller != this)) | |
399 | 399 | then throw("access only by project owner") | |
400 | 400 | else { | |
401 | 401 | let supplyAmount = assetBalance(this, eth) | |
402 | 402 | if ((supplyAmount == supplyAmount)) | |
403 | 403 | then { | |
404 | 404 | let main = supplyPL(PL_Main, eth, supplyAmount) | |
405 | 405 | if ((main == main)) | |
406 | 406 | then [IntegerEntry("ETH supplied", (supplyAmount + tryGetInteger(this, "ETH supplied"))), IntegerEntry("ETH Puzzle Lend main pool", PL_value(PL_Main, eth)), IntegerEntry("surplus treasury ETH Puzzle Lend main pool in wavelets", fraction(PL_value(PL_Main, eth), ethWaves, d8))] | |
407 | 407 | else throw("Strict value is not equal to itself.") | |
408 | 408 | } | |
409 | 409 | else throw("Strict value is not equal to itself.") | |
410 | 410 | } | |
411 | 411 | ||
412 | 412 | ||
413 | 413 | ||
414 | 414 | @Callable(i) | |
415 | 415 | func withdrawWAVES_Main () = if ((i.caller != this)) | |
416 | 416 | then throw("access only by project owner") | |
417 | 417 | else { | |
418 | 418 | let withdrawAmount = withdrawAmountWaves(PL_Main) | |
419 | 419 | if ((withdrawAmount == withdrawAmount)) | |
420 | 420 | then { | |
421 | 421 | let withdraw = withdrawPL(PL_Main, waves, withdrawAmountWaves(PL_Main)) | |
422 | 422 | if ((withdraw == withdraw)) | |
423 | 423 | then [IntegerEntry("PL BT Main", PL_value(PL_Main, waves)), IntegerEntry("withdraw Amount Waves", withdrawAmount)] | |
424 | 424 | else throw("Strict value is not equal to itself.") | |
425 | 425 | } | |
426 | 426 | else throw("Strict value is not equal to itself.") | |
427 | 427 | } | |
428 | 428 | ||
429 | 429 | ||
430 | 430 | ||
431 | 431 | @Callable(i) | |
432 | 432 | func withdrawWAVES_Defi () = if ((i.caller != this)) | |
433 | 433 | then throw("access only by project owner") | |
434 | 434 | else { | |
435 | 435 | let withdrawAmount = withdrawAmountWaves(PL_Defi) | |
436 | 436 | if ((withdrawAmount == withdrawAmount)) | |
437 | 437 | then { | |
438 | 438 | let withdraw = withdrawPL(PL_Defi, waves, withdrawAmountWaves(PL_Defi)) | |
439 | 439 | if ((withdraw == withdraw)) | |
440 | 440 | then [IntegerEntry("PL BT Defi", PL_value(PL_Defi, waves)), IntegerEntry("withdraw Amount Waves", withdrawAmount)] | |
441 | 441 | else throw("Strict value is not equal to itself.") | |
442 | 442 | } | |
443 | 443 | else throw("Strict value is not equal to itself.") | |
444 | 444 | } | |
445 | 445 | ||
446 | 446 | ||
447 | 447 | ||
448 | 448 | @Callable(i) | |
449 | 449 | func withdrawWAVES_Low () = if ((i.caller != this)) | |
450 | 450 | then throw("access only by project owner") | |
451 | 451 | else { | |
452 | 452 | let withdrawAmount = withdrawAmountWaves(PL_Low) | |
453 | 453 | if ((withdrawAmount == withdrawAmount)) | |
454 | 454 | then { | |
455 | 455 | let withdraw = withdrawPL(PL_Low, waves, withdrawAmountWaves(PL_Low)) | |
456 | 456 | if ((withdraw == withdraw)) | |
457 | 457 | then [IntegerEntry("PL BT Low", PL_value(PL_Low, waves)), IntegerEntry("withdraw Amount Waves", withdrawAmount)] | |
458 | 458 | else throw("Strict value is not equal to itself.") | |
459 | 459 | } | |
460 | 460 | else throw("Strict value is not equal to itself.") | |
461 | 461 | } | |
462 | 462 | ||
463 | 463 | ||
464 | 464 | ||
465 | 465 | @Callable(i) | |
466 | 466 | func stakeEAST () = if ((i.caller != this)) | |
467 | 467 | then throw("access only by project owner") | |
468 | 468 | else { | |
469 | 469 | let stakeEAST = invoke(EAST_stake, "stake", nil, [AttachedPayment(east, assetBalance(this, east))]) | |
470 | 470 | if ((stakeEAST == stakeEAST)) | |
471 | 471 | then [IntegerEntry("EAST staked", (assetBalance(this, east) + tryGetInteger(this, "EAST staked"))), IntegerEntry("ST EAST in staking", eastInStaking), IntegerEntry("ST stEAST in waves", stEastInWaves)] | |
472 | 472 | else throw("Strict value is not equal to itself.") | |
473 | 473 | } | |
474 | 474 | ||
475 | 475 | ||
476 | 476 | ||
477 | 477 | @Callable(i) | |
478 | 478 | func changeIntegerEntry (keyString,integer) = if ((i.caller != this)) | |
479 | 479 | then throw("access only by project owner") | |
480 | 480 | else [IntegerEntry(keyString, integer)] | |
481 | 481 | ||
482 | 482 |
github/deemru/w8io/3ef1775 131.48 ms ◑