tx · 6hx145yUEHMEm5BMMmm6xDhs5LrHy8xysFjUqPgGFcAN 3PAkmJniMgnnAej5pYf2jFYkCbZow5pt9tr: -0.02000000 Waves 2023.10.03 10:57 [3848004] smart account 3PAkmJniMgnnAej5pYf2jFYkCbZow5pt9tr > SELF 0.00000000 Waves
{ "type": 13, "id": "6hx145yUEHMEm5BMMmm6xDhs5LrHy8xysFjUqPgGFcAN", "fee": 2000000, "feeAssetId": null, "timestamp": 1696319869428, "version": 2, "chainId": 87, "sender": "3PAkmJniMgnnAej5pYf2jFYkCbZow5pt9tr", "senderPublicKey": "A5AvSRrbVauQKBhPtuWTLTQdE5ka4nVCSDaVANpFur26", "proofs": [ "5agxHqKLV7nDAXa3q3PA1tdffkQ8v9Fa6vig9iQBq8KA5VHFuVC9H3c1GTR2gCSMcoUhTyzUN1aHJdpSjFipbFPy" ], "script": "base64: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AQdBZGRyZXNzAQUGcG9vbElkAhdnbG9iYWxfcG9vbFRva2VuX2Ftb3VudAAIZXRod2F2ZXMJAGsDBQJkOAULd2F2ZXNpbnBvb2wFCWV0aGlucG9vbAEIX2xvYWRJbnQCBGtleV8IZGVmYXVsdF8EByRtYXRjaDAJAJoIAgUMU1dBVkVTX3N0YWtlBQRrZXlfAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQUIZGVmYXVsdF8BC19sb2FkQmlnSW50AgRrZXlfCGRlZmF1bHRfBAckbWF0Y2gwCQCcCAIFDFNXQVZFU19zdGFrZQUEa2V5XwMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFhBQckbWF0Y2gwCQCeAwEFAWEFCGRlZmF1bHRfAAhsYXN0UmF0ZQkBC19sb2FkQmlnSW50AgIJTEFTVF9SQVRFCQC2AgEAgKCUpY0dAAtjdXJyZW50UmF0ZQkBC19sb2FkQmlnSW50AgIMQ1VSUkVOVF9SQVRFCQC2AgEAAAAKbGFzdEhlaWdodAkBCF9sb2FkSW50AgILTEFTVF9IRUlHSFQAAAAMdGFyZ2V0SGVpZ2h0CQCXAwEJAMwIAgkBCF9sb2FkSW50AgINVEFSR0VUX0hFSUdIVAAACQDMCAIFBmhlaWdodAUDbmlsAA9sYXN0UmF0ZVVwZGF0ZWQJALcCAgUIbGFzdFJhdGUJALkCAgULY3VycmVudFJhdGUJALYCAQkAZQIFDHRhcmdldEhlaWdodAUKbGFzdEhlaWdodAAKYmFzZUFtb3VudAkAoAMBCQC9AgQJALYCAQkA8AcCBQ1XWF9XQVZFU19FQVNUBQZzd2F2ZXMFD2xhc3RSYXRlVXBkYXRlZAkAtgIBAICglKWNHQUFRkxPT1IACXdhdmVzaW5XWAkAZAIICQDvBwEFDVdYX1dBVkVTX0VBU1QHcmVndWxhcgUKYmFzZUFtb3VudAAIZWFzdGluV1gJAPAHAgUNV1hfV0FWRVNfRUFTVAUEZWFzdAAJd2F2ZXNlYXN0CQBrAwkAaAIFAmQ4AGQFCGVhc3RpbldYBQl3YXZlc2luV1gAEHdhdmVzaW53aGlybHBvb2wJARFAZXh0ck5hdGl2ZSgxMDUwKQIJAQdBZGRyZXNzAQUPd2hpcmxwb29sUG9vbElkCQCsAgIJAKwCAgIHZ2xvYmFsXwkA2AQBBQV3YXZlcwIIX2JhbGFuY2UAEHdoaXJsaW53aGlybHBvb2wJARFAZXh0ck5hdGl2ZSgxMDUwKQIJAQdBZGRyZXNzAQUPd2hpcmxwb29sUG9vbElkCQCsAgIJAKwCAgIHZ2xvYmFsXwkA2AQBBQl3aGlybHBvb2wCCF9iYWxhbmNlABFwcm9qZWN0c3Rha2V3aGlybAkBEUBleHRyTmF0aXZlKDEwNTApAgkBB0FkZHJlc3MBBQ93aGlybHBvb2xQb29sSWQJAKwCAgIjM1BBa21KbmlNZ25uQWVqNXBZZjJqRllrQ2Jab3c1cHQ5dHICDF9pbmRleFN0YWtlZAAPdG90YWxzdGFrZXdoaXJsCQERQGV4dHJOYXRpdmUoMTA1MCkCCQEHQWRkcmVzcwEFD3doaXJscG9vbFBvb2xJZAIXZ2xvYmFsX3Bvb2xUb2tlbl9hbW91bnQADXN0RUFTVGlud2F2ZXMJAGgCCQBrAwkAaQIJAG4ECQDwBwIFBHRoaXMFBnN0ZWFzdAkBEUBleHRyTmF0aXZlKDEwNTApAgUKRUFTVF9zdGFrZQIIJXNfX3JhdGUAgKCUpY0dBQhIQUxGRVZFTgBkBQJkOAUJd2F2ZXNlYXN0AGQADUVBU1RpbnN0YWtpbmcJAGkCCQBuBAkA8AcCBQR0aGlzBQZzdGVhc3QJARFAZXh0ck5hdGl2ZSgxMDUwKQIFCkVBU1Rfc3Rha2UCCCVzX19yYXRlAICglKWNHQUISEFMRkVWRU4AZAAKdHZsaW53YXZlcwkAZAIJAGQCCQBkAgkAawMJAGgCBQt3YXZlc2lucG9vbAAKBQxwcm9qZWN0c3Rha2UFCnRvdGFsc3Rha2UJAGsDCQEIUExfdmFsdWUCBQdQTF9NYWluBQNldGgFCGV0aHdhdmVzBQJkOAkAawMJAGgCBRB3YXZlc2lud2hpcmxwb29sAAoFEXByb2plY3RzdGFrZXdoaXJsBQ90b3RhbHN0YWtld2hpcmwFDXN0RUFTVGlud2F2ZXMAD3doaXJscG9vbHN1cHBseQQHJG1hdGNoMAkA7AcBBQl3aGlybHBvb2wDCQABAgUHJG1hdGNoMAIFQXNzZXQEBWFzc2V0BQckbWF0Y2gwCAUFYXNzZXQIcXVhbnRpdHkJAAIBAhBDYW4ndCBmaW5kIGFzc2V0AAVwcmljZQMJAGcCCQBkAgkAawMJAGQCBQp0dmxpbndhdmVzCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAhxzdXJwbHVzIHJlY2VpdmVkIGluIHdhdmVsZXRzBQJkOAUPd2hpcmxwb29sc3VwcGx5BQJkOAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwIhV0hJUkxQT09MIGlzc3VlIHByaWNlIGluIHdhdmVsZXRzCQBkAgkAawMJAGQCBQp0dmxpbndhdmVzCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAhxzdXJwbHVzIHJlY2VpdmVkIGluIHdhdmVsZXRzBQJkOAUPd2hpcmxwb29sc3VwcGx5BQJkOAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwIhV0hJUkxQT09MIGlzc3VlIHByaWNlIGluIHdhdmVsZXRzAQ50cnlHZXRJbnRlZ2VyUAEDa2V5BAckbWF0Y2gwCQCaCAIJAQdBZGRyZXNzAQUPd2hpcmxwb29sUG9vbElkBQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwBQFiAAABDXRyeUdldFN0cmluZ1ABA2tleQQHJG1hdGNoMAkAnQgCCQEHQWRkcmVzcwEFD3doaXJscG9vbFBvb2xJZAUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQBYgUHJG1hdGNoMAUBYgIAAQ1nZXRBc3NldEJ5dGVzAQphc3NldElkU3RyAwkAAAIFCmFzc2V0SWRTdHICBVdBVkVTBQR1bml0CQDZBAEFCmFzc2V0SWRTdHIBDmdldEFzc2V0U3RyaW5nAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWIFByRtYXRjaDAJANgEAQUBYgIFV0FWRVMBE2FkZEFzc2V0Qnl0ZXNUb0xpc3QCBWFjY3VtBGl0ZW0JAM4IAgUFYWNjdW0JAMwIAgkBDWdldEFzc2V0Qnl0ZXMBBQRpdGVtBQNuaWwBFGFkZEFzc2V0V2VpZ2h0VG9MaXN0AgVhY2N1bQRpdGVtCQDOCAIFBWFjY3VtCQDMCAIJAQ50cnlHZXRJbnRlZ2VyUAEJAKwCAgkArAICAgdzdGF0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dXJwbHVzCQBrAwkAZQIFBXByaWNlBQJkOAgFA3BtdAZhbW91bnQFAmQ4BAtJc3N1ZUFtb3VudAMJAGYCCAUDcG10BmFtb3VudAkAawMIBQNwbXQGYW1vdW50BQJkOAUFcHJpY2UJAGsDCAUDcG10BmFtb3VudAUCZDgFBXByaWNlCQACAQIwcGxlYXNlIGNvbnRhY3QgcHJvamVjdCBvd25lcjogaXNzdWUgYW1vdW50IGVycm9yBAxzdXBwbHlhbW91bnQJAGkCCQBlAggFA3BtdAZhbW91bnQFB3N1cnBsdXMAAwQIQW1vdW50SW4IBQNwbXQGYW1vdW50BA5Bc3NldEluQmFsYW5jZQUQd2F2ZXNpbndoaXJscG9vbAQPQXNzZXRPdXRCYWxhbmNlBRB3aGlybGlud2hpcmxwb29sBAtmZWVBbW91bnRJbgkAawMFCEFtb3VudEluAMgBAJBOBA1jbGVhbkFtb3VudEluCQBlAgUIQW1vdW50SW4FC2ZlZUFtb3VudEluBAdJbmRleEluCQEFdmFsdWUBCQDPCAIFCGFzc2V0SWRzBQR1bml0BAhJbmRleE91dAkBBXZhbHVlAQkAzwgCBQhhc3NldElkcwUJd2hpcmxwb29sBAlBbW91bnRPdXQJAG4EBQ9Bc3NldE91dEJhbGFuY2UJAGUCCQBoAgUCZDgFAmQ4CQCgAwEJAHYGCQC9AgQJALYCAQUOQXNzZXRJbkJhbGFuY2UJALYCAQkAaAIFAmQ4BQJkOAkAtgIBCQBkAgUOQXNzZXRJbkJhbGFuY2UFDWNsZWFuQW1vdW50SW4FBkhBTEZVUAAQCQC2AgEJAGsDCQCRAwIFDUFzc2V0c1dlaWdodHMFB0luZGV4SW4AkE4JAJEDAgUNQXNzZXRzV2VpZ2h0cwUISW5kZXhPdXQABAAQBQdDRUlMSU5HCQBoAgUCZDgFAmQ4BQRET1dOBBZXaGlybHBvb2xCYWxhbmNlQmVmb3JlCQDwBwIFBHRoaXMFCXdoaXJscG9vbAMJAAACBRZXaGlybHBvb2xCYWxhbmNlQmVmb3JlBRZXaGlybHBvb2xCYWxhbmNlQmVmb3JlAwkBAiE9AggFA3BtdAdhc3NldElkBQR1bml0CQACAQIXYXR0YWNoIFdBVkVTIHRva2VuIG9ubHkEBHN3YXADCQBmAgUJQW1vdW50T3V0BQtJc3N1ZUFtb3VudAkA/AcECQEHQWRkcmVzcwEFD3doaXJscG9vbFBvb2xJZAIEc3dhcAkAzAgCBQ93aGlybHBvb2xzdHJpbmcJAMwIAgkAZAIFC0lzc3VlQW1vdW50AAEFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUEdW5pdAUIQW1vdW50SW4FA25pbAUEdW5pdAMJAAACBQRzd2FwBQRzd2FwBBNTdXBwbHlXYXZlc01haW5Qb29sAwkAZwIFC0lzc3VlQW1vdW50BQlBbW91bnRPdXQJAPwHBAkBB0FkZHJlc3MBARoBVyCUXEqtz/RIOTuIQLO/2+6MUKCnas/a6AIGc3VwcGx5BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFBHVuaXQFDHN1cHBseWFtb3VudAUDbmlsBQR1bml0AwkAAAIFE1N1cHBseVdhdmVzTWFpblBvb2wFE1N1cHBseVdhdmVzTWFpblBvb2wEGFN1cHBseVdhdmVzV2F2ZXNEZWZpUG9vbAMJAGcCBQtJc3N1ZUFtb3VudAUJQW1vdW50T3V0CQD8BwQJAQdBZGRyZXNzAQEaAVcZCzuPP83F9QBSQ7jrpozIrL8UOTE+JL4CBnN1cHBseQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQR1bml0BQxzdXBwbHlhbW91bnQFA25pbAUEdW5pdAMJAAACBRhTdXBwbHlXYXZlc1dhdmVzRGVmaVBvb2wFGFN1cHBseVdhdmVzV2F2ZXNEZWZpUG9vbAQRU3VwcGx5V2F2ZXNMb3dDYXADCQBnAgULSXNzdWVBbW91bnQFCUFtb3VudE91dAkA/AcECQEHQWRkcmVzcwEBGgFXrmAU0mZwDPA/3HTF0nTmGr6p4FLB6guQAgZzdXBwbHkFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUEdW5pdAUMc3VwcGx5YW1vdW50BQNuaWwFBHVuaXQDCQAAAgURU3VwcGx5V2F2ZXNMb3dDYXAFEVN1cHBseVdhdmVzTG93Q2FwBBVXaGlybHBvb2xCYWxhbmNlQWZ0ZXIJAPAHAgUEdGhpcwUJd2hpcmxwb29sAwkAAAIFFVdoaXJscG9vbEJhbGFuY2VBZnRlcgUVV2hpcmxwb29sQmFsYW5jZUFmdGVyBBFXaGlybHBvb2xGcm9tU3dhcAkAZQIFFldoaXJscG9vbEJhbGFuY2VCZWZvcmUFFVdoaXJscG9vbEJhbGFuY2VBZnRlcgkAzAgCCQEHUmVpc3N1ZQMFCXdoaXJscG9vbAMJAGcCBQtJc3N1ZUFtb3VudAUJQW1vdW50T3V0BQtJc3N1ZUFtb3VudAAABgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIDCQBnAgULSXNzdWVBbW91bnQFCUFtb3VudE91dAULSXNzdWVBbW91bnQFEVdoaXJscG9vbEZyb21Td2FwBQl3aGlybHBvb2wJAMwIAgkBDEludGVnZXJFbnRyeQICIVdISVJMUE9PTCBpc3N1ZSBwcmljZSBpbiB3YXZlbGV0cwUFcHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQICJldISVJMUE9PTCBidXkgbWFya2V0IHByaWNlIGluIHdhdmVsZXRzCQBrAwUCZDgFCEFtb3VudEluBQlBbW91bnRPdXQJAMwIAgkBDEludGVnZXJFbnRyeQICIHRvdGFsIFdBVkVTIHJlY2VpdmVkIGluIHdhdmVsZXRzAwkAZwIFC0lzc3VlQW1vdW50BQlBbW91bnRPdXQJAGQCCAUDcG10BmFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwIgdG90YWwgV0FWRVMgcmVjZWl2ZWQgaW4gd2F2ZWxldHMJAGQCAAAJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCIHRvdGFsIFdBVkVTIHJlY2VpdmVkIGluIHdhdmVsZXRzCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhxzdXJwbHVzIHJlY2VpdmVkIGluIHdhdmVsZXRzAwkAZwIFC0lzc3VlQW1vdW50BQlBbW91bnRPdXQJAGQCBQdzdXJwbHVzCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAhxzdXJwbHVzIHJlY2VpdmVkIGluIHdhdmVsZXRzCQBkAgAACQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAhxzdXJwbHVzIHJlY2VpdmVkIGluIHdhdmVsZXRzCQDMCAIJAQxJbnRlZ2VyRW50cnkCAh53YXZlbGV0cyByZWNlaXZlZCBmb3IgdHJlYXN1cnkDCQBnAgULSXNzdWVBbW91bnQFCUFtb3VudE91dAkAZAIJAGUCBQtJc3N1ZUFtb3VudAUHc3VycGx1cwkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwIed2F2ZWxldHMgcmVjZWl2ZWQgZm9yIHRyZWFzdXJ5CQBkAgAACQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAh53YXZlbGV0cyByZWNlaXZlZCBmb3IgdHJlYXN1cnkFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARJQcmljZVN1cnBsdXNTdXBwbHkACQDMCAIJAQxJbnRlZ2VyRW50cnkCAgpQTCBCVCBNYWluCQEIUExfdmFsdWUCBQdQTF9NYWluBQV3YXZlcwkAzAgCCQEMSW50ZWdlckVudHJ5AgIKUEwgQlQgRGVmaQkBCFBMX3ZhbHVlAgUHUExfRGVmaQUFd2F2ZXMJAMwIAgkBDEludGVnZXJFbnRyeQICCVBMIEJUIExvdwkBCFBMX3ZhbHVlAgUGUExfTG93BQV3YXZlcwkAzAgCCQEMSW50ZWdlckVudHJ5AgIQUEwgYmFzZSB0cmVhc3VyeQkAZAIJAGQCCQEIUExfdmFsdWUCBQdQTF9NYWluBQV3YXZlcwkBCFBMX3ZhbHVlAgUHUExfRGVmaQUFd2F2ZXMJAQhQTF92YWx1ZQIFBlBMX0xvdwUFd2F2ZXMJAMwIAgkBDEludGVnZXJFbnRyeQICMHN1cnBsdXMgdHJlYXN1cnkgQlVSTi1YVE4geCBQZXBlVGVhbSBpbiB3YXZlbGV0cwkAawMJAGgCBQt3YXZlc2lucG9vbAAKBQxwcm9qZWN0c3Rha2UFCnRvdGFsc3Rha2UJAMwIAgkBDEludGVnZXJFbnRyeQICGUVUSCBQdXp6bGUgTGVuZCBtYWluIHBvb2wJAQhQTF92YWx1ZQIFB1BMX01haW4FA2V0aAkAzAgCCQEMSW50ZWdlckVudHJ5AgI2c3VycGx1cyB0cmVhc3VyeSBFVEggUHV6emxlIExlbmQgbWFpbiBwb29sIGluIHdhdmVsZXRzCQBrAwkBCFBMX3ZhbHVlAgUHUExfTWFpbgUDZXRoBQhldGh3YXZlcwUCZDgJAMwIAgkBDEludGVnZXJFbnRyeQICKnN1cnBsdXMgdHJlYXN1cnkgV0hJUkxQT09MIEFNTSBpbiB3YXZlbGV0cwkAawMJAGgCBRB3YXZlc2lud2hpcmxwb29sAAoFEXByb2plY3RzdGFrZXdoaXJsBQ90b3RhbHN0YWtld2hpcmwJAMwIAgkBDEludGVnZXJFbnRyeQICElNUIEVBU1QgaW4gc3Rha2luZwUNRUFTVGluc3Rha2luZwkAzAgCCQEMSW50ZWdlckVudHJ5AgISU1Qgc3RFQVNUIGluIHdhdmVzBQ1zdEVBU1RpbndhdmVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCAihUb3RhbCBzdXJwbHVzIHRyZWFzdXJ5IHZhbHVlIGluIHdhdmVsZXRzBQp0dmxpbndhdmVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCAiFXSElSTFBPT0wgaXNzdWUgcHJpY2UgaW4gd2F2ZWxldHMFBXByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhpXSElSTFBPT0wgbWlkIG1hcmtldCBwcmljZQkAawMFAmQ4CQBoAgUQd2F2ZXNpbndoaXJscG9vbAAJBRB3aGlybGlud2hpcmxwb29sCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhZXSElSTFBPT0wgdG90YWwgc3VwcGx5BQ93aGlybHBvb2xzdXBwbHkJAMwIAgkBDEludGVnZXJFbnRyeQICDlRvdGFsIHRyZWFzdXJ5CQBkAgkAZAIJAGQCCQEIUExfdmFsdWUCBQdQTF9NYWluBQV3YXZlcwkBCFBMX3ZhbHVlAgUHUExfRGVmaQUFd2F2ZXMJAQhQTF92YWx1ZQIFBlBMX0xvdwUFd2F2ZXMFCnR2bGlud2F2ZXMJAMwIAgkBDEludGVnZXJFbnRyeQICDU5BViBXSElSTFBPT0wJAGsDBQJkOAUPd2hpcmxwb29sc3VwcGx5CQBkAgkAZAIJAGQCCQEIUExfdmFsdWUCBQdQTF9NYWluBQV3YXZlcwkBCFBMX3ZhbHVlAgUHUExfRGVmaQUFd2F2ZXMJAQhQTF92YWx1ZQIFBlBMX0xvdwUFd2F2ZXMFCnR2bGlud2F2ZXMJAMwIAgkBDEludGVnZXJFbnRyeQICIHRvdGFsIFdBVkVTIHJlY2VpdmVkIGluIHdhdmVsZXRzCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAiB0b3RhbCBXQVZFUyByZWNlaXZlZCBpbiB3YXZlbGV0cwkAzAgCCQEMSW50ZWdlckVudHJ5AgIcc3VycGx1cyByZWNlaXZlZCBpbiB3YXZlbGV0cwkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwIcc3VycGx1cyByZWNlaXZlZCBpbiB3YXZlbGV0cwkAzAgCCQEMSW50ZWdlckVudHJ5AgIed2F2ZWxldHMgcmVjZWl2ZWQgZm9yIHRyZWFzdXJ5CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAh53YXZlbGV0cyByZWNlaXZlZCBmb3IgdHJlYXN1cnkJAMwIAgkBDEludGVnZXJFbnRyeQICIHRvdGFsIFdBVkVTIHBhaWQgb3V0IGluIHdhdmVsZXRzCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAiB0b3RhbCBXQVZFUyBwYWlkIG91dCBpbiB3YXZlbGV0cwkAzAgCCQEMSW50ZWdlckVudHJ5AgIQUk9JIGJhc2lzIHBvaW50cwkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwIQUk9JIGJhc2lzIHBvaW50cwUDbmlsAWkBE1Bvb2xPbmVUb2tlblN1cnBsdXMAAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIcYWNjZXNzIG9ubHkgYnkgcHJvamVjdCBvd25lcgQNc3VycGx1c2Ftb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwIcc3VycGx1cyByZWNlaXZlZCBpbiB3YXZlbGV0cwQTUG9vbE9uZVRva2VuU3VycGx1cwkA/AcECQEHQWRkcmVzcwEBGgFX/SXDvU5hlEHvul4SY4/FOW9JtYg69eltAiFnZW5lcmF0ZUluZGV4V2l0aE9uZVRva2VuQW5kU3Rha2UJAMwIAgUKcG9vbFN0cmluZwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQR1bml0BQ1zdXJwbHVzYW1vdW50BQNuaWwDCQAAAgUTUG9vbE9uZVRva2VuU3VycGx1cwUTUG9vbE9uZVRva2VuU3VycGx1cwkAzAgCCQEMSW50ZWdlckVudHJ5AgIcc3VycGx1cyByZWNlaXZlZCBpbiB3YXZlbGV0cwkAZQIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCHHN1cnBsdXMgcmVjZWl2ZWQgaW4gd2F2ZWxldHMFDXN1cnBsdXNhbW91bnQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQxCb29zdFBvb2xBUFkAAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIcYWNjZXNzIG9ubHkgYnkgcHJvamVjdCBvd25lcgQSd2F2ZXNCYWxhbmNlQmVmb3JlCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQMJAAACBRJ3YXZlc0JhbGFuY2VCZWZvcmUFEndhdmVzQmFsYW5jZUJlZm9yZQQFY2xhaW0JAPwHBAkBB0FkZHJlc3MBBQZwb29sSWQCEWNsYWltSW5kZXhSZXdhcmRzBQNuaWwFA25pbAMJAAACBQVjbGFpbQUFY2xhaW0EC3N3YXBidXJueHRuCQD8BwQJAQdBZGRyZXNzAQUGcG9vbElkAgRzd2FwCQDMCAICBVdBVkVTCQDMCAIAAAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQlidXJueHRuSWQJAPAHAgUEdGhpcwUJYnVybnh0bklkBQNuaWwDCQAAAgULc3dhcGJ1cm54dG4FC3N3YXBidXJueHRuBAtzd2FwdXNkdGVyYwkA/AcECQEHQWRkcmVzcwEFBnBvb2xJZAIEc3dhcAkAzAgCAgVXQVZFUwkAzAgCAAAFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUHdXNkdGVyYwkA8AcCBQR0aGlzBQd1c2R0ZXJjBQNuaWwDCQAAAgULc3dhcHVzZHRlcmMFC3N3YXB1c2R0ZXJjBAtzd2FwdXNkdGJzYwkA/AcECQEHQWRkcmVzcwEFBnBvb2xJZAIEc3dhcAkAzAgCAgVXQVZFUwkAzAgCAAAFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUHdXNkdGJzYwkA8AcCBQR0aGlzBQd1c2R0YnNjBQNuaWwDCQAAAgULc3dhcHVzZHRic2MFC3N3YXB1c2R0YnNjBAtzd2FwdXNkY2VyYwkA/AcECQEHQWRkcmVzcwEFBnBvb2xJZAIEc3dhcAkAzAgCAgVXQVZFUwkAzAgCAAAFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUHdXNkY2VyYwkA8AcCBQR0aGlzBQd1c2RjZXJjBQNuaWwDCQAAAgULc3dhcHVzZGNlcmMFC3N3YXB1c2RjZXJjBAtzd2FwdXNkY2JzYwkA/AcECQEHQWRkcmVzcwEFBnBvb2xJZAIEc3dhcAkAzAgCAgVXQVZFUwkAzAgCAAAFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUHdXNkY2JzYwkA8AcCBQR0aGlzBQd1c2RjYnNjBQNuaWwDCQAAAgULc3dhcHVzZGNic2MFC3N3YXB1c2RjYnNjBAdzd2FwZXRoCQD8BwQJAQdBZGRyZXNzAQUGcG9vbElkAgRzd2FwCQDMCAICBVdBVkVTCQDMCAIAAAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQNldGgJAPAHAgUEdGhpcwUDZXRoBQNuaWwDCQAAAgUHc3dhcGV0aAUHc3dhcGV0aAQHc3dhcGJuYgkA/AcECQEHQWRkcmVzcwEFBnBvb2xJZAIEc3dhcAkAzAgCAgVXQVZFUwkAzAgCAAAFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUDYm5iCQDwBwIFBHRoaXMFA2JuYgUDbmlsAwkAAAIFB3N3YXBibmIFB3N3YXBibmIECHN3YXB3YnRjCQD8BwQJAQdBZGRyZXNzAQUGcG9vbElkAgRzd2FwCQDMCAICBVdBVkVTCQDMCAIAAAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQR3YnRjCQDwBwIFBHRoaXMFBHdidGMFA25pbAMJAAACBQhzd2Fwd2J0YwUIc3dhcHdidGMECHN3YXBidGNiCQD8BwQJAQdBZGRyZXNzAQUGcG9vbElkAgRzd2FwCQDMCAICBVdBVkVTCQDMCAIAAAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQRidGNiCQDwBwIFBHRoaXMFBGJ0Y2IFA25pbAMJAAACBQhzd2FwYnRjYgUIc3dhcGJ0Y2IEEXdhdmVzQmFsYW5jZUFmdGVyCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQQPd2F2ZXNEaWZmZXJlbmNlCQBlAgURd2F2ZXNCYWxhbmNlQWZ0ZXIFEndhdmVzQmFsYW5jZUJlZm9yZQQQd2F2ZXNBbW91bnRCb29zdAkAawMFD3dhdmVzRGlmZmVyZW5jZQBQAGQEC2Ftb3VudEJvb3N0CQBrAwUPd2F2ZXNEaWZmZXJlbmNlAFAAZAQLYW1vdW50T3duZXIJAGsDBQ93YXZlc0RpZmZlcmVuY2UAFABkBAVib29zdAkA/AcECQEHQWRkcmVzcwEFC3Bvb2xib29zdFNDAgthZGRCb29zdGluZwkAzAgCBQ93aGlybHBvb2xzdHJpbmcJAMwIAgAHBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFBHVuaXQFC2Ftb3VudEJvb3N0BQNuaWwDCQAAAgUFYm9vc3QFBWJvb3N0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQUMcHJvamVjdG93bmVyBQthbW91bnRPd25lcgUEdW5pdAkAzAgCCQEMSW50ZWdlckVudHJ5AgIgdG90YWwgV0FWRVMgcGFpZCBvdXQgaW4gd2F2ZWxldHMJAGQCBRB3YXZlc0Ftb3VudEJvb3N0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAiB0b3RhbCBXQVZFUyBwYWlkIG91dCBpbiB3YXZlbGV0cwkAzAgCCQEMSW50ZWdlckVudHJ5AgIQUk9JIGJhc2lzIHBvaW50cwkAawMJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCIHRvdGFsIFdBVkVTIHBhaWQgb3V0IGluIHdhdmVsZXRzAJBOCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAiB0b3RhbCBXQVZFUyByZWNlaXZlZCBpbiB3YXZlbGV0cwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFEJvb3N0UG9vbEFQWXdFVEhtYWluAAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECHGFjY2VzcyBvbmx5IGJ5IHByb2plY3Qgb3duZXIEE2NhbGN1bGF0ZVRva2VuUmF0ZXMJAPwHBAUHUExfTWFpbgITY2FsY3VsYXRlVG9rZW5SYXRlcwkAzAgCBwUDbmlsBQNuaWwDCQAAAgUTY2FsY3VsYXRlVG9rZW5SYXRlcwUTY2FsY3VsYXRlVG9rZW5SYXRlcwQOd2l0aGRyYXdhbW91bnQJAGUCCQEIUExfdmFsdWUCBQdQTF9NYWluBQNldGgJAQ10cnlHZXRJbnRlZ2VyAQIMRVRIIHN1cHBsaWVkBBJ3YXZlc0JhbGFuY2VCZWZvcmUICQDvBwEFBHRoaXMJYXZhaWxhYmxlAwkAAAIFEndhdmVzQmFsYW5jZUJlZm9yZQUSd2F2ZXNCYWxhbmNlQmVmb3JlBAh3aXRoZHJhdwkA/AcECQEHQWRkcmVzcwEBGgFXIJRcSq3P9Eg5O4hAs7/b7oxQoKdqz9roAgh3aXRoZHJhdwkAzAgCCQDYBAEFA2V0aAkAzAgCBQ53aXRoZHJhd2Ftb3VudAUDbmlsBQNuaWwDCQAAAgUId2l0aGRyYXcFCHdpdGhkcmF3BAdzd2FwZXRoCQD8BwQJAQdBZGRyZXNzAQUGcG9vbElkAgRzd2FwCQDMCAICBVdBVkVTCQDMCAIAAAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQNldGgJAPAHAgUEdGhpcwUDZXRoBQNuaWwDCQAAAgUHc3dhcGV0aAUHc3dhcGV0aAQRd2F2ZXNCYWxhbmNlQWZ0ZXIICQDvBwEFBHRoaXMJYXZhaWxhYmxlBA93YXZlc0RpZmZlcmVuY2UJAGUCBRF3YXZlc0JhbGFuY2VBZnRlcgUSd2F2ZXNCYWxhbmNlQmVmb3JlBAthbW91bnRCb29zdAkAawMFD3dhdmVzRGlmZmVyZW5jZQBQAGQEC2Ftb3VudE93bmVyCQBrAwUPd2F2ZXNEaWZmZXJlbmNlABQAZAQFYm9vc3QJAPwHBAkBB0FkZHJlc3MBBQtwb29sYm9vc3RTQwILYWRkQm9vc3RpbmcJAMwIAgUPd2hpcmxwb29sc3RyaW5nCQDMCAIABwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQR1bml0BQthbW91bnRCb29zdAUDbmlsAwkAAAIFBWJvb3N0BQVib29zdAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEFDHByb2plY3Rvd25lcgULYW1vdW50T3duZXIFBHVuaXQJAMwIAgkBDEludGVnZXJFbnRyeQICIHRvdGFsIFdBVkVTIHBhaWQgb3V0IGluIHdhdmVsZXRzCQBkAgULYW1vdW50Qm9vc3QJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCIHRvdGFsIFdBVkVTIHBhaWQgb3V0IGluIHdhdmVsZXRzCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhBST0kgYmFzaXMgcG9pbnRzCQBrAwkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwIgdG90YWwgV0FWRVMgcGFpZCBvdXQgaW4gd2F2ZWxldHMAkE4JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCIHRvdGFsIFdBVkVTIHJlY2VpdmVkIGluIHdhdmVsZXRzBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEWQm9vc3RQb29sQVBZd1doaXJscG9vbAADCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhxhY2Nlc3Mgb25seSBieSBwcm9qZWN0IG93bmVyBBJ3YXZlc0JhbGFuY2VCZWZvcmUICQDvBwEFBHRoaXMJYXZhaWxhYmxlAwkAAAIFEndhdmVzQmFsYW5jZUJlZm9yZQUSd2F2ZXNCYWxhbmNlQmVmb3JlBAVjbGFpbQkA/AcECQEHQWRkcmVzcwEFD3doaXJscG9vbFBvb2xJZAIRY2xhaW1JbmRleFJld2FyZHMFA25pbAUDbmlsAwkAAAIFBWNsYWltBQVjbGFpbQQNc3dhcHdoaXJscG9vbAkA/AcECQEHQWRkcmVzcwEFD3doaXJscG9vbFBvb2xJZAIEc3dhcAkAzAgCAgVXQVZFUwkAzAgCAAAFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUJd2hpcmxwb29sCQDwBwIFBHRoaXMFCXdoaXJscG9vbAUDbmlsAwkAAAIFDXN3YXB3aGlybHBvb2wFDXN3YXB3aGlybHBvb2wEEXdhdmVzQmFsYW5jZUFmdGVyCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQQPd2F2ZXNEaWZmZXJlbmNlCQBlAgURd2F2ZXNCYWxhbmNlQWZ0ZXIFEndhdmVzQmFsYW5jZUJlZm9yZQQQd2F2ZXNBbW91bnRCb29zdAkAawMFD3dhdmVzRGlmZmVyZW5jZQBQAGQEC2Ftb3VudEJvb3N0CQBrAwUPd2F2ZXNEaWZmZXJlbmNlAFAAZAQLYW1vdW50T3duZXIJAGsDBQ93YXZlc0RpZmZlcmVuY2UAFABkBAVib29zdAkA/AcECQEHQWRkcmVzcwEFC3Bvb2xib29zdFNDAgthZGRCb29zdGluZwkAzAgCBQ93aGlybHBvb2xzdHJpbmcJAMwIAgAHBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFBHVuaXQFC2Ftb3VudEJvb3N0BQNuaWwDCQAAAgUFYm9vc3QFBWJvb3N0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQUMcHJvamVjdG93bmVyBQthbW91bnRPd25lcgUEdW5pdAkAzAgCCQEMSW50ZWdlckVudHJ5AgIgdG90YWwgV0FWRVMgcGFpZCBvdXQgaW4gd2F2ZWxldHMJAGQCBRB3YXZlc0Ftb3VudEJvb3N0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAiB0b3RhbCBXQVZFUyBwYWlkIG91dCBpbiB3YXZlbGV0cwkAzAgCCQEMSW50ZWdlckVudHJ5AgIQUk9JIGJhc2lzIHBvaW50cwkAawMJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCIHRvdGFsIFdBVkVTIHBhaWQgb3V0IGluIHdhdmVsZXRzAJBOCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAiB0b3RhbCBXQVZFUyByZWNlaXZlZCBpbiB3YXZlbGV0cwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDVN1cHBseUVUSG1haW4AAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIcYWNjZXNzIG9ubHkgYnkgcHJvamVjdCBvd25lcgQMc3VwcGx5YW1vdW50CQDwBwIFBHRoaXMFA2V0aAQNU3VwcGx5RVRIbWFpbgMJAGYCBQxzdXBwbHlhbW91bnQAAAkA/AcECQEHQWRkcmVzcwEBGgFXIJRcSq3P9Eg5O4hAs7/b7oxQoKdqz9roAgZzdXBwbHkFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUDZXRoBQxzdXBwbHlhbW91bnQFA25pbAUEdW5pdAMJAAACBQ1TdXBwbHlFVEhtYWluBQ1TdXBwbHlFVEhtYWluCQDMCAIJAQxJbnRlZ2VyRW50cnkCAgxFVEggc3VwcGxpZWQJAGQCBQxzdXBwbHlhbW91bnQJAQ10cnlHZXRJbnRlZ2VyAQIMRVRIIHN1cHBsaWVkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQESd2l0aGRyYXdXQVZFU19NYWluAAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECHGFjY2VzcyBvbmx5IGJ5IHByb2plY3Qgb3duZXIEEndpdGhkcmF3YW1vdW50TWFpbgkAZQIJAQhQTF92YWx1ZQIFB1BMX01haW4FBXdhdmVzCQBpAgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwIed2F2ZWxldHMgcmVjZWl2ZWQgZm9yIHRyZWFzdXJ5AAMECndpdGhkcmF3V00JAPwHBAUHUExfTWFpbgIId2l0aGRyYXcJAMwIAgkA2AQBBQV3YXZlcwkAzAgCBRJ3aXRoZHJhd2Ftb3VudE1haW4FA25pbAUDbmlsAwkAAAIFCndpdGhkcmF3V00FCndpdGhkcmF3V00FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARJ3aXRoZHJhd1dBVkVTX0RlZmkAAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIcYWNjZXNzIG9ubHkgYnkgcHJvamVjdCBvd25lcgQSd2l0aGRyYXdhbW91bnREZWZpCQBlAgkBCFBMX3ZhbHVlAgUHUExfRGVmaQUFd2F2ZXMJAGkCCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAh53YXZlbGV0cyByZWNlaXZlZCBmb3IgdHJlYXN1cnkAAwQKd2l0aGRyYXdXRAkA/AcEBQdQTF9EZWZpAgh3aXRoZHJhdwkAzAgCCQDYBAEFBXdhdmVzCQDMCAIFEndpdGhkcmF3YW1vdW50RGVmaQUDbmlsBQNuaWwDCQAAAgUKd2l0aGRyYXdXRAUKd2l0aGRyYXdXRAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEXdpdGhkcmF3V0FWRVNfTG93AAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECHGFjY2VzcyBvbmx5IGJ5IHByb2plY3Qgb3duZXIEEXdpdGhkcmF3YW1vdW50TG93CQBlAgkBCFBMX3ZhbHVlAgUGUExfTG93BQV3YXZlcwkAaQIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCHndhdmVsZXRzIHJlY2VpdmVkIGZvciB0cmVhc3VyeQADBAp3aXRoZHJhd1dMCQD8BwQFBlBMX0xvdwIId2l0aGRyYXcJAMwIAgkA2AQBBQV3YXZlcwkAzAgCBRF3aXRoZHJhd2Ftb3VudExvdwUDbmlsBQNuaWwDCQAAAgUKd2l0aGRyYXdXTAUKd2l0aGRyYXdXTAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCXN0YWtlRUFTVAADCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhxhY2Nlc3Mgb25seSBieSBwcm9qZWN0IG93bmVyBAxzdXBwbHlhbW91bnQJAPAHAgUEdGhpcwUEZWFzdAQJc3Rha2VFQVNUAwkAZgIFDHN1cHBseWFtb3VudAAACQD8BwQFCkVBU1Rfc3Rha2UCBXN0YWtlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFBGVhc3QFDHN1cHBseWFtb3VudAUDbmlsBQR1bml0AwkAAAIFCXN0YWtlRUFTVAUJc3Rha2VFQVNUCQDMCAIJAQxJbnRlZ2VyRW50cnkCAgtFQVNUIHN0YWtlZAkAZAIFDHN1cHBseWFtb3VudAkBDXRyeUdldEludGVnZXIBAgtFQVNUIHN0YWtlZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEkNoYW5nZUludGVnZXJFbnRyeQIDa2V5B2ludGVnZXIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhxhY2Nlc3Mgb25seSBieSBwcm9qZWN0IG93bmVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQNrZXkFB2ludGVnZXIFA25pbAB4nhhS", "height": 3848004, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4WLgJJ4eYiW2bi1YBtxpsWHzkE3Sa9WtKVBLJhBBGgwR Next: ER5W4a9gnSVA7RUFDbir8qCi15Rz66Z6ZYfcUuDTF8f4 Diff:
Old | New | Differences | |
---|---|---|---|
245 | 245 | } | |
246 | 246 | ||
247 | 247 | @Callable(i) | |
248 | - | func buyWHIRLPOOLwithWAVES () = { | |
249 | - | let pmt = value(i.payments[0]) | |
250 | - | let surplus = fraction((price - d8), pmt.amount, d8) | |
251 | - | let IssueAmount = if ((pmt.amount > fraction(pmt.amount, d8, price))) | |
252 | - | then fraction(pmt.amount, d8, price) | |
253 | - | else throw("please contact project owner: issue amount error") | |
254 | - | let supplyamount = ((pmt.amount - surplus) / 3) | |
255 | - | let AmountIn = pmt.amount | |
256 | - | let AssetInBalance = wavesinwhirlpool | |
257 | - | let AssetOutBalance = whirlinwhirlpool | |
258 | - | let feeAmountIn = fraction(AmountIn, 200, 10000) | |
259 | - | let cleanAmountIn = (AmountIn - feeAmountIn) | |
260 | - | let IndexIn = value(indexOf(assetIds, unit)) | |
261 | - | let IndexOut = value(indexOf(assetIds, whirlpool)) | |
262 | - | let AmountOut = fraction(AssetOutBalance, ((d8 * d8) - toInt(pow(fraction(toBigInt(AssetInBalance), toBigInt((d8 * d8)), toBigInt((AssetInBalance + cleanAmountIn)), HALFUP), 16, toBigInt(fraction(AssetsWeights[IndexIn], 10000, AssetsWeights[IndexOut])), 4, 16, CEILING))), (d8 * d8), DOWN) | |
263 | - | let WhirlpoolBalanceBefore = assetBalance(this, whirlpool) | |
264 | - | if ((WhirlpoolBalanceBefore == WhirlpoolBalanceBefore)) | |
265 | - | then if ((pmt.assetId != unit)) | |
266 | - | then throw("attach WAVES token only") | |
267 | - | else { | |
268 | - | let swap = if ((AmountOut > IssueAmount)) | |
269 | - | then invoke(Address(whirlpoolPoolId), "swap", [whirlpoolstring, (IssueAmount + 1)], [AttachedPayment(unit, AmountIn)]) | |
270 | - | else unit | |
271 | - | if ((swap == swap)) | |
272 | - | then { | |
273 | - | let SupplyWavesMainPool = if ((IssueAmount >= AmountOut)) | |
274 | - | then invoke(Address(base58'3P4uA5etnZi4AmBabKinq2bMiWU8KcnHZdH'), "supply", nil, [AttachedPayment(unit, supplyamount)]) | |
275 | - | else unit | |
276 | - | if ((SupplyWavesMainPool == SupplyWavesMainPool)) | |
277 | - | then { | |
278 | - | let SupplyWavesWavesDefiPool = if ((IssueAmount >= AmountOut)) | |
279 | - | then invoke(Address(base58'3P4DK5VzDwL3vfc5ahUEhtoe5ByZNyacJ3X'), "supply", nil, [AttachedPayment(unit, supplyamount)]) | |
280 | - | else unit | |
281 | - | if ((SupplyWavesWavesDefiPool == SupplyWavesWavesDefiPool)) | |
282 | - | then { | |
283 | - | let SupplyWavesLowCap = if ((IssueAmount >= AmountOut)) | |
284 | - | then invoke(Address(base58'3PHpuQUPVUoR3AYzFeJzeWJfYLsLTmWssVH'), "supply", nil, [AttachedPayment(unit, supplyamount)]) | |
285 | - | else unit | |
286 | - | if ((SupplyWavesLowCap == SupplyWavesLowCap)) | |
287 | - | then { | |
288 | - | let WhirlpoolBalanceAfter = assetBalance(this, whirlpool) | |
289 | - | if ((WhirlpoolBalanceAfter == WhirlpoolBalanceAfter)) | |
290 | - | then { | |
291 | - | let WhirlpoolFromSwap = (WhirlpoolBalanceBefore - WhirlpoolBalanceAfter) | |
248 | + | func buyWHIRLPOOLwithWAVES () = if (if ((i.caller != this)) | |
249 | + | then (i.caller != Address(base58'3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3')) | |
250 | + | else false) | |
251 | + | then throw("smart contract under maintenance") | |
252 | + | else { | |
253 | + | let pmt = value(i.payments[0]) | |
254 | + | let surplus = fraction((price - d8), pmt.amount, d8) | |
255 | + | let IssueAmount = if ((pmt.amount > fraction(pmt.amount, d8, price))) | |
256 | + | then fraction(pmt.amount, d8, price) | |
257 | + | else throw("please contact project owner: issue amount error") | |
258 | + | let supplyamount = ((pmt.amount - surplus) / 3) | |
259 | + | let AmountIn = pmt.amount | |
260 | + | let AssetInBalance = wavesinwhirlpool | |
261 | + | let AssetOutBalance = whirlinwhirlpool | |
262 | + | let feeAmountIn = fraction(AmountIn, 200, 10000) | |
263 | + | let cleanAmountIn = (AmountIn - feeAmountIn) | |
264 | + | let IndexIn = value(indexOf(assetIds, unit)) | |
265 | + | let IndexOut = value(indexOf(assetIds, whirlpool)) | |
266 | + | let AmountOut = fraction(AssetOutBalance, ((d8 * d8) - toInt(pow(fraction(toBigInt(AssetInBalance), toBigInt((d8 * d8)), toBigInt((AssetInBalance + cleanAmountIn)), HALFUP), 16, toBigInt(fraction(AssetsWeights[IndexIn], 10000, AssetsWeights[IndexOut])), 4, 16, CEILING))), (d8 * d8), DOWN) | |
267 | + | let WhirlpoolBalanceBefore = assetBalance(this, whirlpool) | |
268 | + | if ((WhirlpoolBalanceBefore == WhirlpoolBalanceBefore)) | |
269 | + | then if ((pmt.assetId != unit)) | |
270 | + | then throw("attach WAVES token only") | |
271 | + | else { | |
272 | + | let swap = if ((AmountOut > IssueAmount)) | |
273 | + | then invoke(Address(whirlpoolPoolId), "swap", [whirlpoolstring, (IssueAmount + 1)], [AttachedPayment(unit, AmountIn)]) | |
274 | + | else unit | |
275 | + | if ((swap == swap)) | |
276 | + | then { | |
277 | + | let SupplyWavesMainPool = if ((IssueAmount >= AmountOut)) | |
278 | + | then invoke(Address(base58'3P4uA5etnZi4AmBabKinq2bMiWU8KcnHZdH'), "supply", nil, [AttachedPayment(unit, supplyamount)]) | |
279 | + | else unit | |
280 | + | if ((SupplyWavesMainPool == SupplyWavesMainPool)) | |
281 | + | then { | |
282 | + | let SupplyWavesWavesDefiPool = if ((IssueAmount >= AmountOut)) | |
283 | + | then invoke(Address(base58'3P4DK5VzDwL3vfc5ahUEhtoe5ByZNyacJ3X'), "supply", nil, [AttachedPayment(unit, supplyamount)]) | |
284 | + | else unit | |
285 | + | if ((SupplyWavesWavesDefiPool == SupplyWavesWavesDefiPool)) | |
286 | + | then { | |
287 | + | let SupplyWavesLowCap = if ((IssueAmount >= AmountOut)) | |
288 | + | then invoke(Address(base58'3PHpuQUPVUoR3AYzFeJzeWJfYLsLTmWssVH'), "supply", nil, [AttachedPayment(unit, supplyamount)]) | |
289 | + | else unit | |
290 | + | if ((SupplyWavesLowCap == SupplyWavesLowCap)) | |
291 | + | then { | |
292 | + | let WhirlpoolBalanceAfter = assetBalance(this, whirlpool) | |
293 | + | if ((WhirlpoolBalanceAfter == WhirlpoolBalanceAfter)) | |
294 | + | then { | |
295 | + | let WhirlpoolFromSwap = (WhirlpoolBalanceBefore - WhirlpoolBalanceAfter) | |
292 | 296 | [Reissue(whirlpool, if ((IssueAmount >= AmountOut)) | |
293 | - | then IssueAmount | |
294 | - | else 0, true), ScriptTransfer(i.caller, if ((IssueAmount >= AmountOut)) | |
295 | - | then IssueAmount | |
296 | - | else WhirlpoolFromSwap, whirlpool), IntegerEntry("WHIRLPOOL issue price in wavelets", price), IntegerEntry("WHIRLPOOL buy market price in wavelets", fraction(d8, AmountIn, AmountOut)), IntegerEntry("total WAVES received in wavelets", if ((IssueAmount >= AmountOut)) | |
297 | - | then pmt.amount | |
298 | - | else (0 + getIntegerValue(this, "total WAVES received in wavelets"))), IntegerEntry("surplus received in wavelets", if ((IssueAmount >= AmountOut)) | |
299 | - | then surplus | |
300 | - | else (0 + getIntegerValue(this, "surplus received in wavelets"))), IntegerEntry("wavelets received for treasury", if ((IssueAmount >= AmountOut)) | |
301 | - | then ((IssueAmount - surplus) + getIntegerValue(this, "wavelets received for treasury")) | |
302 | - | else (0 + getIntegerValue(this, "wavelets received for treasury")))] | |
303 | - | } | |
304 | - | else throw("Strict value is not equal to itself.") | |
305 | - | } | |
306 | - | else throw("Strict value is not equal to itself.") | |
307 | - | } | |
308 | - | else throw("Strict value is not equal to itself.") | |
309 | - | } | |
310 | - | else throw("Strict value is not equal to itself.") | |
311 | - | } | |
312 | - | else throw("Strict value is not equal to itself.") | |
313 | - | } | |
314 | - | else throw("Strict value is not equal to itself.") | |
315 | - | } | |
297 | + | then IssueAmount | |
298 | + | else 0, true), ScriptTransfer(i.caller, if ((IssueAmount >= AmountOut)) | |
299 | + | then IssueAmount | |
300 | + | else WhirlpoolFromSwap, whirlpool), IntegerEntry("WHIRLPOOL issue price in wavelets", price), IntegerEntry("WHIRLPOOL buy market price in wavelets", fraction(d8, AmountIn, AmountOut)), IntegerEntry("total WAVES received in wavelets", if ((IssueAmount >= AmountOut)) | |
301 | + | then (pmt.amount + getIntegerValue(this, "total WAVES received in wavelets")) | |
302 | + | else (0 + getIntegerValue(this, "total WAVES received in wavelets"))), IntegerEntry("surplus received in wavelets", if ((IssueAmount >= AmountOut)) | |
303 | + | then (surplus + getIntegerValue(this, "surplus received in wavelets")) | |
304 | + | else (0 + getIntegerValue(this, "surplus received in wavelets"))), IntegerEntry("wavelets received for treasury", if ((IssueAmount >= AmountOut)) | |
305 | + | then ((IssueAmount - surplus) + getIntegerValue(this, "wavelets received for treasury")) | |
306 | + | else (0 + getIntegerValue(this, "wavelets received for treasury")))] | |
307 | + | } | |
308 | + | else throw("Strict value is not equal to itself.") | |
309 | + | } | |
310 | + | else throw("Strict value is not equal to itself.") | |
311 | + | } | |
312 | + | else throw("Strict value is not equal to itself.") | |
313 | + | } | |
314 | + | else throw("Strict value is not equal to itself.") | |
315 | + | } | |
316 | + | else throw("Strict value is not equal to itself.") | |
317 | + | } | |
318 | + | else throw("Strict value is not equal to itself.") | |
319 | + | } | |
316 | 320 | ||
317 | 321 | ||
318 | 322 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let d8 = 100000000 | |
5 | 5 | ||
6 | 6 | let d16 = (d8 * d8) | |
7 | 7 | ||
8 | 8 | let poolId = base58'3PQHndCUVrv3wBuQjbvVP9SnGmfbfitGxfx' | |
9 | 9 | ||
10 | 10 | let poolString = toBase58String(poolId) | |
11 | 11 | ||
12 | 12 | let projectowner = base58'3PEtLVxDT8mxAh1SDAn8m7JTGNkdpkaFxBk' | |
13 | 13 | ||
14 | 14 | let whirlpoolPoolId = base58'3P2myTbd5zpEHcYmNpdWTp5gXS5B8tL1RCY' | |
15 | 15 | ||
16 | 16 | let whirlpoolstring = toBase58String(whirlpoolPoolId) | |
17 | 17 | ||
18 | 18 | let poolboostSC = base58'3PAeY7RgwuNUZNscGqahqJxFTFDkh7fbNwJ' | |
19 | 19 | ||
20 | 20 | let project = base58'3PAkmJniMgnnAej5pYf2jFYkCbZow5pt9tr' | |
21 | 21 | ||
22 | 22 | let whirlpool = base58'73tY3E6Gd5AWYmsuq8m8Kek7KnJNAYyS3GoveTbc6jCi' | |
23 | 23 | ||
24 | 24 | let waves = base58'WAVES' | |
25 | 25 | ||
26 | 26 | let usdterc = base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi' | |
27 | 27 | ||
28 | 28 | let usdcerc = base58'HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW' | |
29 | 29 | ||
30 | 30 | let usdtbsc = base58'A81p1LTRyoq2rDR2TNxB2dWYxsiNwCSSi8sXef2SEkwb' | |
31 | 31 | ||
32 | 32 | let usdcbsc = base58'4BKKSp6NoNcrFHyorZogDyctq1fq6w7114Ym1pw6HUtC' | |
33 | 33 | ||
34 | 34 | let burnxtnId = base58'3SjxA2YLdfF9fTRbzLm9xFn27C6MW34W1YsdJ6Axefns' | |
35 | 35 | ||
36 | 36 | let eth = base58'3VuV5WTmDz47Dmdn3QpcYjzbSdipjQE4JMdNe1xZpX13' | |
37 | 37 | ||
38 | 38 | let bnb = base58'66a1br3BrkoaJgP7yEar9hJcSTvJPoH6PYBLqscXcMGo' | |
39 | 39 | ||
40 | 40 | let wbtc = base58'2Fge5HEBRD3XTeg7Xg3FW5yiB9HVJFQtMXiWMQo72Up6' | |
41 | 41 | ||
42 | 42 | let btcb = base58'EW1uGLVo21Wd9i2Rhq8o4VKDTCQTGCGXE8DqayHGrLg8' | |
43 | 43 | ||
44 | 44 | let east = base58'6phK22ztGBW127gUFmdMEHKB3CVd6ZhWox2WtwJkbqTq' | |
45 | 45 | ||
46 | 46 | let steast = base58'GAB8JowY9UANZ4TQy2TzJyhxjPqXX3DUrb2cdMWrrJus' | |
47 | 47 | ||
48 | 48 | let swaves = base58'YiNbofFzC17jEHHCMwrRcpy9MrrjabMMLZxg8g5xmf7' | |
49 | 49 | ||
50 | 50 | func tryGetInteger (key) = match getInteger(this, key) { | |
51 | 51 | case b: Int => | |
52 | 52 | b | |
53 | 53 | case _ => | |
54 | 54 | 0 | |
55 | 55 | } | |
56 | 56 | ||
57 | 57 | ||
58 | 58 | let PL_Main = Address(base58'3P4uA5etnZi4AmBabKinq2bMiWU8KcnHZdH') | |
59 | 59 | ||
60 | 60 | let PL_Defi = Address(base58'3P4DK5VzDwL3vfc5ahUEhtoe5ByZNyacJ3X') | |
61 | 61 | ||
62 | 62 | let PL_Low = Address(base58'3PHpuQUPVUoR3AYzFeJzeWJfYLsLTmWssVH') | |
63 | 63 | ||
64 | 64 | let EAST_stake = Address(base58'3P2hbtheN5apNppqqUK7L7qAwmRFXy91CNa') | |
65 | 65 | ||
66 | 66 | let WX_WAVES_EAST = Address(base58'3PJVwjfi2fF5Jv9AauayU6xLxrYBn8bpGH1') | |
67 | 67 | ||
68 | 68 | let SWAVES_stake = Address(base58'3PDPzZVLhN1EuzGy4xAxjjTVkawKDLEaHiV') | |
69 | 69 | ||
70 | 70 | let address = toString(Address(project)) | |
71 | 71 | ||
72 | 72 | func PL_value (dAppAddress,asset) = fraction(getIntegerValue(dAppAddress, ((address + "_supplied_") + toBase58String(asset))), getIntegerValue(dAppAddress, (toBase58String(asset) + "_sRate")), d16) | |
73 | 73 | ||
74 | 74 | ||
75 | 75 | let ethinpool = getIntegerValue(Address(poolId), (("global_" + toBase58String(eth)) + "_balance")) | |
76 | 76 | ||
77 | 77 | let wavesinpool = getIntegerValue(Address(poolId), (("global_" + toBase58String(waves)) + "_balance")) | |
78 | 78 | ||
79 | 79 | let projectstake = getIntegerValue(Address(poolId), ("3PAkmJniMgnnAej5pYf2jFYkCbZow5pt9tr" + "_indexStaked")) | |
80 | 80 | ||
81 | 81 | let totalstake = getIntegerValue(Address(poolId), "global_poolToken_amount") | |
82 | 82 | ||
83 | 83 | let ethwaves = fraction(d8, wavesinpool, ethinpool) | |
84 | 84 | ||
85 | 85 | func _loadInt (key_,default_) = match getInteger(SWAVES_stake, key_) { | |
86 | 86 | case a: Int => | |
87 | 87 | a | |
88 | 88 | case _ => | |
89 | 89 | default_ | |
90 | 90 | } | |
91 | 91 | ||
92 | 92 | ||
93 | 93 | func _loadBigInt (key_,default_) = match getBinary(SWAVES_stake, key_) { | |
94 | 94 | case a: ByteVector => | |
95 | 95 | toBigInt(a) | |
96 | 96 | case _ => | |
97 | 97 | default_ | |
98 | 98 | } | |
99 | 99 | ||
100 | 100 | ||
101 | 101 | let lastRate = _loadBigInt("LAST_RATE", toBigInt(1000000000000)) | |
102 | 102 | ||
103 | 103 | let currentRate = _loadBigInt("CURRENT_RATE", toBigInt(0)) | |
104 | 104 | ||
105 | 105 | let lastHeight = _loadInt("LAST_HEIGHT", 0) | |
106 | 106 | ||
107 | 107 | let targetHeight = min([_loadInt("TARGET_HEIGHT", 0), height]) | |
108 | 108 | ||
109 | 109 | let lastRateUpdated = (lastRate + (currentRate * toBigInt((targetHeight - lastHeight)))) | |
110 | 110 | ||
111 | 111 | let baseAmount = toInt(fraction(toBigInt(assetBalance(WX_WAVES_EAST, swaves)), lastRateUpdated, toBigInt(1000000000000), FLOOR)) | |
112 | 112 | ||
113 | 113 | let wavesinWX = (wavesBalance(WX_WAVES_EAST).regular + baseAmount) | |
114 | 114 | ||
115 | 115 | let eastinWX = assetBalance(WX_WAVES_EAST, east) | |
116 | 116 | ||
117 | 117 | let waveseast = fraction((d8 * 100), eastinWX, wavesinWX) | |
118 | 118 | ||
119 | 119 | let wavesinwhirlpool = getIntegerValue(Address(whirlpoolPoolId), (("global_" + toBase58String(waves)) + "_balance")) | |
120 | 120 | ||
121 | 121 | let whirlinwhirlpool = getIntegerValue(Address(whirlpoolPoolId), (("global_" + toBase58String(whirlpool)) + "_balance")) | |
122 | 122 | ||
123 | 123 | let projectstakewhirl = getIntegerValue(Address(whirlpoolPoolId), ("3PAkmJniMgnnAej5pYf2jFYkCbZow5pt9tr" + "_indexStaked")) | |
124 | 124 | ||
125 | 125 | let totalstakewhirl = getIntegerValue(Address(whirlpoolPoolId), "global_poolToken_amount") | |
126 | 126 | ||
127 | 127 | let stEASTinwaves = (fraction((fraction(assetBalance(this, steast), getIntegerValue(EAST_stake, "%s__rate"), 1000000000000, HALFEVEN) / 100), d8, waveseast) * 100) | |
128 | 128 | ||
129 | 129 | let EASTinstaking = (fraction(assetBalance(this, steast), getIntegerValue(EAST_stake, "%s__rate"), 1000000000000, HALFEVEN) / 100) | |
130 | 130 | ||
131 | 131 | let tvlinwaves = (((fraction((wavesinpool * 10), projectstake, totalstake) + fraction(PL_value(PL_Main, eth), ethwaves, d8)) + fraction((wavesinwhirlpool * 10), projectstakewhirl, totalstakewhirl)) + stEASTinwaves) | |
132 | 132 | ||
133 | 133 | let whirlpoolsupply = match assetInfo(whirlpool) { | |
134 | 134 | case asset: Asset => | |
135 | 135 | asset.quantity | |
136 | 136 | case _ => | |
137 | 137 | throw("Can't find asset") | |
138 | 138 | } | |
139 | 139 | ||
140 | 140 | let price = if (((fraction((tvlinwaves + getIntegerValue(this, "surplus received in wavelets")), d8, whirlpoolsupply) + d8) >= getIntegerValue(this, "WHIRLPOOL issue price in wavelets"))) | |
141 | 141 | then (fraction((tvlinwaves + getIntegerValue(this, "surplus received in wavelets")), d8, whirlpoolsupply) + d8) | |
142 | 142 | else getIntegerValue(this, "WHIRLPOOL issue price in wavelets") | |
143 | 143 | ||
144 | 144 | func tryGetIntegerP (key) = match getInteger(Address(whirlpoolPoolId), key) { | |
145 | 145 | case b: Int => | |
146 | 146 | b | |
147 | 147 | case _ => | |
148 | 148 | 0 | |
149 | 149 | } | |
150 | 150 | ||
151 | 151 | ||
152 | 152 | func tryGetStringP (key) = match getString(Address(whirlpoolPoolId), key) { | |
153 | 153 | case b: String => | |
154 | 154 | b | |
155 | 155 | case _ => | |
156 | 156 | "" | |
157 | 157 | } | |
158 | 158 | ||
159 | 159 | ||
160 | 160 | func getAssetBytes (assetIdStr) = if ((assetIdStr == "WAVES")) | |
161 | 161 | then unit | |
162 | 162 | else fromBase58String(assetIdStr) | |
163 | 163 | ||
164 | 164 | ||
165 | 165 | func getAssetString (assetId) = match assetId { | |
166 | 166 | case b: ByteVector => | |
167 | 167 | toBase58String(b) | |
168 | 168 | case _ => | |
169 | 169 | "WAVES" | |
170 | 170 | } | |
171 | 171 | ||
172 | 172 | ||
173 | 173 | func addAssetBytesToList (accum,item) = (accum ++ [getAssetBytes(item)]) | |
174 | 174 | ||
175 | 175 | ||
176 | 176 | func addAssetWeightToList (accum,item) = (accum ++ [tryGetIntegerP((("static_" + getAssetString(item)) + "_weight"))]) | |
177 | 177 | ||
178 | 178 | ||
179 | 179 | func addAssetDecimalsToList (accum,item) = (accum ++ [tryGetIntegerP((("static_" + getAssetString(item)) + "_decimals"))]) | |
180 | 180 | ||
181 | 181 | ||
182 | 182 | func addAssetScaleToList (accum,item) = (accum ++ [tryGetIntegerP((("static_" + getAssetString(item)) + "_scale"))]) | |
183 | 183 | ||
184 | 184 | ||
185 | 185 | let T = tryGetIntegerP("static_tokensAmount") | |
186 | 186 | ||
187 | 187 | let assetIds = { | |
188 | 188 | let $l = split(tryGetStringP("static_tokenIds"), ",") | |
189 | 189 | let $s = size($l) | |
190 | 190 | let $acc0 = nil | |
191 | 191 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
192 | 192 | then $a | |
193 | 193 | else addAssetBytesToList($a, $l[$i]) | |
194 | 194 | ||
195 | 195 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
196 | 196 | then $a | |
197 | 197 | else throw("List size exceeds 10") | |
198 | 198 | ||
199 | 199 | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10) | |
200 | 200 | } | |
201 | 201 | ||
202 | 202 | let AssetsWeights = { | |
203 | 203 | let $l = assetIds | |
204 | 204 | let $s = size($l) | |
205 | 205 | let $acc0 = nil | |
206 | 206 | func $f1_1 ($a,$i) = if (($i >= $s)) | |
207 | 207 | then $a | |
208 | 208 | else addAssetWeightToList($a, $l[$i]) | |
209 | 209 | ||
210 | 210 | func $f1_2 ($a,$i) = if (($i >= $s)) | |
211 | 211 | then $a | |
212 | 212 | else throw("List size exceeds 10") | |
213 | 213 | ||
214 | 214 | $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10) | |
215 | 215 | } | |
216 | 216 | ||
217 | 217 | let Decimals = { | |
218 | 218 | let $l = assetIds | |
219 | 219 | let $s = size($l) | |
220 | 220 | let $acc0 = nil | |
221 | 221 | func $f2_1 ($a,$i) = if (($i >= $s)) | |
222 | 222 | then $a | |
223 | 223 | else addAssetDecimalsToList($a, $l[$i]) | |
224 | 224 | ||
225 | 225 | func $f2_2 ($a,$i) = if (($i >= $s)) | |
226 | 226 | then $a | |
227 | 227 | else throw("List size exceeds 10") | |
228 | 228 | ||
229 | 229 | $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10) | |
230 | 230 | } | |
231 | 231 | ||
232 | 232 | let Scales = { | |
233 | 233 | let $l = assetIds | |
234 | 234 | let $s = size($l) | |
235 | 235 | let $acc0 = nil | |
236 | 236 | func $f3_1 ($a,$i) = if (($i >= $s)) | |
237 | 237 | then $a | |
238 | 238 | else addAssetScaleToList($a, $l[$i]) | |
239 | 239 | ||
240 | 240 | func $f3_2 ($a,$i) = if (($i >= $s)) | |
241 | 241 | then $a | |
242 | 242 | else throw("List size exceeds 10") | |
243 | 243 | ||
244 | 244 | $f3_2($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10) | |
245 | 245 | } | |
246 | 246 | ||
247 | 247 | @Callable(i) | |
248 | - | func buyWHIRLPOOLwithWAVES () = { | |
249 | - | let pmt = value(i.payments[0]) | |
250 | - | let surplus = fraction((price - d8), pmt.amount, d8) | |
251 | - | let IssueAmount = if ((pmt.amount > fraction(pmt.amount, d8, price))) | |
252 | - | then fraction(pmt.amount, d8, price) | |
253 | - | else throw("please contact project owner: issue amount error") | |
254 | - | let supplyamount = ((pmt.amount - surplus) / 3) | |
255 | - | let AmountIn = pmt.amount | |
256 | - | let AssetInBalance = wavesinwhirlpool | |
257 | - | let AssetOutBalance = whirlinwhirlpool | |
258 | - | let feeAmountIn = fraction(AmountIn, 200, 10000) | |
259 | - | let cleanAmountIn = (AmountIn - feeAmountIn) | |
260 | - | let IndexIn = value(indexOf(assetIds, unit)) | |
261 | - | let IndexOut = value(indexOf(assetIds, whirlpool)) | |
262 | - | let AmountOut = fraction(AssetOutBalance, ((d8 * d8) - toInt(pow(fraction(toBigInt(AssetInBalance), toBigInt((d8 * d8)), toBigInt((AssetInBalance + cleanAmountIn)), HALFUP), 16, toBigInt(fraction(AssetsWeights[IndexIn], 10000, AssetsWeights[IndexOut])), 4, 16, CEILING))), (d8 * d8), DOWN) | |
263 | - | let WhirlpoolBalanceBefore = assetBalance(this, whirlpool) | |
264 | - | if ((WhirlpoolBalanceBefore == WhirlpoolBalanceBefore)) | |
265 | - | then if ((pmt.assetId != unit)) | |
266 | - | then throw("attach WAVES token only") | |
267 | - | else { | |
268 | - | let swap = if ((AmountOut > IssueAmount)) | |
269 | - | then invoke(Address(whirlpoolPoolId), "swap", [whirlpoolstring, (IssueAmount + 1)], [AttachedPayment(unit, AmountIn)]) | |
270 | - | else unit | |
271 | - | if ((swap == swap)) | |
272 | - | then { | |
273 | - | let SupplyWavesMainPool = if ((IssueAmount >= AmountOut)) | |
274 | - | then invoke(Address(base58'3P4uA5etnZi4AmBabKinq2bMiWU8KcnHZdH'), "supply", nil, [AttachedPayment(unit, supplyamount)]) | |
275 | - | else unit | |
276 | - | if ((SupplyWavesMainPool == SupplyWavesMainPool)) | |
277 | - | then { | |
278 | - | let SupplyWavesWavesDefiPool = if ((IssueAmount >= AmountOut)) | |
279 | - | then invoke(Address(base58'3P4DK5VzDwL3vfc5ahUEhtoe5ByZNyacJ3X'), "supply", nil, [AttachedPayment(unit, supplyamount)]) | |
280 | - | else unit | |
281 | - | if ((SupplyWavesWavesDefiPool == SupplyWavesWavesDefiPool)) | |
282 | - | then { | |
283 | - | let SupplyWavesLowCap = if ((IssueAmount >= AmountOut)) | |
284 | - | then invoke(Address(base58'3PHpuQUPVUoR3AYzFeJzeWJfYLsLTmWssVH'), "supply", nil, [AttachedPayment(unit, supplyamount)]) | |
285 | - | else unit | |
286 | - | if ((SupplyWavesLowCap == SupplyWavesLowCap)) | |
287 | - | then { | |
288 | - | let WhirlpoolBalanceAfter = assetBalance(this, whirlpool) | |
289 | - | if ((WhirlpoolBalanceAfter == WhirlpoolBalanceAfter)) | |
290 | - | then { | |
291 | - | let WhirlpoolFromSwap = (WhirlpoolBalanceBefore - WhirlpoolBalanceAfter) | |
248 | + | func buyWHIRLPOOLwithWAVES () = if (if ((i.caller != this)) | |
249 | + | then (i.caller != Address(base58'3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3')) | |
250 | + | else false) | |
251 | + | then throw("smart contract under maintenance") | |
252 | + | else { | |
253 | + | let pmt = value(i.payments[0]) | |
254 | + | let surplus = fraction((price - d8), pmt.amount, d8) | |
255 | + | let IssueAmount = if ((pmt.amount > fraction(pmt.amount, d8, price))) | |
256 | + | then fraction(pmt.amount, d8, price) | |
257 | + | else throw("please contact project owner: issue amount error") | |
258 | + | let supplyamount = ((pmt.amount - surplus) / 3) | |
259 | + | let AmountIn = pmt.amount | |
260 | + | let AssetInBalance = wavesinwhirlpool | |
261 | + | let AssetOutBalance = whirlinwhirlpool | |
262 | + | let feeAmountIn = fraction(AmountIn, 200, 10000) | |
263 | + | let cleanAmountIn = (AmountIn - feeAmountIn) | |
264 | + | let IndexIn = value(indexOf(assetIds, unit)) | |
265 | + | let IndexOut = value(indexOf(assetIds, whirlpool)) | |
266 | + | let AmountOut = fraction(AssetOutBalance, ((d8 * d8) - toInt(pow(fraction(toBigInt(AssetInBalance), toBigInt((d8 * d8)), toBigInt((AssetInBalance + cleanAmountIn)), HALFUP), 16, toBigInt(fraction(AssetsWeights[IndexIn], 10000, AssetsWeights[IndexOut])), 4, 16, CEILING))), (d8 * d8), DOWN) | |
267 | + | let WhirlpoolBalanceBefore = assetBalance(this, whirlpool) | |
268 | + | if ((WhirlpoolBalanceBefore == WhirlpoolBalanceBefore)) | |
269 | + | then if ((pmt.assetId != unit)) | |
270 | + | then throw("attach WAVES token only") | |
271 | + | else { | |
272 | + | let swap = if ((AmountOut > IssueAmount)) | |
273 | + | then invoke(Address(whirlpoolPoolId), "swap", [whirlpoolstring, (IssueAmount + 1)], [AttachedPayment(unit, AmountIn)]) | |
274 | + | else unit | |
275 | + | if ((swap == swap)) | |
276 | + | then { | |
277 | + | let SupplyWavesMainPool = if ((IssueAmount >= AmountOut)) | |
278 | + | then invoke(Address(base58'3P4uA5etnZi4AmBabKinq2bMiWU8KcnHZdH'), "supply", nil, [AttachedPayment(unit, supplyamount)]) | |
279 | + | else unit | |
280 | + | if ((SupplyWavesMainPool == SupplyWavesMainPool)) | |
281 | + | then { | |
282 | + | let SupplyWavesWavesDefiPool = if ((IssueAmount >= AmountOut)) | |
283 | + | then invoke(Address(base58'3P4DK5VzDwL3vfc5ahUEhtoe5ByZNyacJ3X'), "supply", nil, [AttachedPayment(unit, supplyamount)]) | |
284 | + | else unit | |
285 | + | if ((SupplyWavesWavesDefiPool == SupplyWavesWavesDefiPool)) | |
286 | + | then { | |
287 | + | let SupplyWavesLowCap = if ((IssueAmount >= AmountOut)) | |
288 | + | then invoke(Address(base58'3PHpuQUPVUoR3AYzFeJzeWJfYLsLTmWssVH'), "supply", nil, [AttachedPayment(unit, supplyamount)]) | |
289 | + | else unit | |
290 | + | if ((SupplyWavesLowCap == SupplyWavesLowCap)) | |
291 | + | then { | |
292 | + | let WhirlpoolBalanceAfter = assetBalance(this, whirlpool) | |
293 | + | if ((WhirlpoolBalanceAfter == WhirlpoolBalanceAfter)) | |
294 | + | then { | |
295 | + | let WhirlpoolFromSwap = (WhirlpoolBalanceBefore - WhirlpoolBalanceAfter) | |
292 | 296 | [Reissue(whirlpool, if ((IssueAmount >= AmountOut)) | |
293 | - | then IssueAmount | |
294 | - | else 0, true), ScriptTransfer(i.caller, if ((IssueAmount >= AmountOut)) | |
295 | - | then IssueAmount | |
296 | - | else WhirlpoolFromSwap, whirlpool), IntegerEntry("WHIRLPOOL issue price in wavelets", price), IntegerEntry("WHIRLPOOL buy market price in wavelets", fraction(d8, AmountIn, AmountOut)), IntegerEntry("total WAVES received in wavelets", if ((IssueAmount >= AmountOut)) | |
297 | - | then pmt.amount | |
298 | - | else (0 + getIntegerValue(this, "total WAVES received in wavelets"))), IntegerEntry("surplus received in wavelets", if ((IssueAmount >= AmountOut)) | |
299 | - | then surplus | |
300 | - | else (0 + getIntegerValue(this, "surplus received in wavelets"))), IntegerEntry("wavelets received for treasury", if ((IssueAmount >= AmountOut)) | |
301 | - | then ((IssueAmount - surplus) + getIntegerValue(this, "wavelets received for treasury")) | |
302 | - | else (0 + getIntegerValue(this, "wavelets received for treasury")))] | |
303 | - | } | |
304 | - | else throw("Strict value is not equal to itself.") | |
305 | - | } | |
306 | - | else throw("Strict value is not equal to itself.") | |
307 | - | } | |
308 | - | else throw("Strict value is not equal to itself.") | |
309 | - | } | |
310 | - | else throw("Strict value is not equal to itself.") | |
311 | - | } | |
312 | - | else throw("Strict value is not equal to itself.") | |
313 | - | } | |
314 | - | else throw("Strict value is not equal to itself.") | |
315 | - | } | |
297 | + | then IssueAmount | |
298 | + | else 0, true), ScriptTransfer(i.caller, if ((IssueAmount >= AmountOut)) | |
299 | + | then IssueAmount | |
300 | + | else WhirlpoolFromSwap, whirlpool), IntegerEntry("WHIRLPOOL issue price in wavelets", price), IntegerEntry("WHIRLPOOL buy market price in wavelets", fraction(d8, AmountIn, AmountOut)), IntegerEntry("total WAVES received in wavelets", if ((IssueAmount >= AmountOut)) | |
301 | + | then (pmt.amount + getIntegerValue(this, "total WAVES received in wavelets")) | |
302 | + | else (0 + getIntegerValue(this, "total WAVES received in wavelets"))), IntegerEntry("surplus received in wavelets", if ((IssueAmount >= AmountOut)) | |
303 | + | then (surplus + getIntegerValue(this, "surplus received in wavelets")) | |
304 | + | else (0 + getIntegerValue(this, "surplus received in wavelets"))), IntegerEntry("wavelets received for treasury", if ((IssueAmount >= AmountOut)) | |
305 | + | then ((IssueAmount - surplus) + getIntegerValue(this, "wavelets received for treasury")) | |
306 | + | else (0 + getIntegerValue(this, "wavelets received for treasury")))] | |
307 | + | } | |
308 | + | else throw("Strict value is not equal to itself.") | |
309 | + | } | |
310 | + | else throw("Strict value is not equal to itself.") | |
311 | + | } | |
312 | + | else throw("Strict value is not equal to itself.") | |
313 | + | } | |
314 | + | else throw("Strict value is not equal to itself.") | |
315 | + | } | |
316 | + | else throw("Strict value is not equal to itself.") | |
317 | + | } | |
318 | + | else throw("Strict value is not equal to itself.") | |
319 | + | } | |
316 | 320 | ||
317 | 321 | ||
318 | 322 | ||
319 | 323 | @Callable(i) | |
320 | 324 | 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, whirlpoolsupply, (((PL_value(PL_Main, waves) + PL_value(PL_Defi, waves)) + PL_value(PL_Low, waves)) + tvlinwaves))), IntegerEntry("total WAVES received in wavelets", getIntegerValue(this, "total WAVES received in wavelets")), IntegerEntry("surplus received in wavelets", getIntegerValue(this, "surplus received in wavelets")), IntegerEntry("wavelets received for treasury", getIntegerValue(this, "wavelets received for treasury")), IntegerEntry("total WAVES paid out in wavelets", getIntegerValue(this, "total WAVES paid out in wavelets")), IntegerEntry("ROI basis points", getIntegerValue(this, "ROI basis points"))] | |
321 | 325 | ||
322 | 326 | ||
323 | 327 | ||
324 | 328 | @Callable(i) | |
325 | 329 | func PoolOneTokenSurplus () = if ((i.caller != this)) | |
326 | 330 | then throw("access only by project owner") | |
327 | 331 | else { | |
328 | 332 | let surplusamount = getIntegerValue(this, "surplus received in wavelets") | |
329 | 333 | let PoolOneTokenSurplus = invoke(Address(base58'3PR1Qvi9mHT35SwWEkLSqqE2L8thiPLdVWU'), "generateIndexWithOneTokenAndStake", [poolString], [AttachedPayment(unit, surplusamount)]) | |
330 | 334 | if ((PoolOneTokenSurplus == PoolOneTokenSurplus)) | |
331 | 335 | then [IntegerEntry("surplus received in wavelets", (getIntegerValue(this, "surplus received in wavelets") - surplusamount))] | |
332 | 336 | else throw("Strict value is not equal to itself.") | |
333 | 337 | } | |
334 | 338 | ||
335 | 339 | ||
336 | 340 | ||
337 | 341 | @Callable(i) | |
338 | 342 | func BoostPoolAPY () = if ((i.caller != this)) | |
339 | 343 | then throw("access only by project owner") | |
340 | 344 | else { | |
341 | 345 | let wavesBalanceBefore = wavesBalance(this).available | |
342 | 346 | if ((wavesBalanceBefore == wavesBalanceBefore)) | |
343 | 347 | then { | |
344 | 348 | let claim = invoke(Address(poolId), "claimIndexRewards", nil, nil) | |
345 | 349 | if ((claim == claim)) | |
346 | 350 | then { | |
347 | 351 | let swapburnxtn = invoke(Address(poolId), "swap", ["WAVES", 0], [AttachedPayment(burnxtnId, assetBalance(this, burnxtnId))]) | |
348 | 352 | if ((swapburnxtn == swapburnxtn)) | |
349 | 353 | then { | |
350 | 354 | let swapusdterc = invoke(Address(poolId), "swap", ["WAVES", 0], [AttachedPayment(usdterc, assetBalance(this, usdterc))]) | |
351 | 355 | if ((swapusdterc == swapusdterc)) | |
352 | 356 | then { | |
353 | 357 | let swapusdtbsc = invoke(Address(poolId), "swap", ["WAVES", 0], [AttachedPayment(usdtbsc, assetBalance(this, usdtbsc))]) | |
354 | 358 | if ((swapusdtbsc == swapusdtbsc)) | |
355 | 359 | then { | |
356 | 360 | let swapusdcerc = invoke(Address(poolId), "swap", ["WAVES", 0], [AttachedPayment(usdcerc, assetBalance(this, usdcerc))]) | |
357 | 361 | if ((swapusdcerc == swapusdcerc)) | |
358 | 362 | then { | |
359 | 363 | let swapusdcbsc = invoke(Address(poolId), "swap", ["WAVES", 0], [AttachedPayment(usdcbsc, assetBalance(this, usdcbsc))]) | |
360 | 364 | if ((swapusdcbsc == swapusdcbsc)) | |
361 | 365 | then { | |
362 | 366 | let swapeth = invoke(Address(poolId), "swap", ["WAVES", 0], [AttachedPayment(eth, assetBalance(this, eth))]) | |
363 | 367 | if ((swapeth == swapeth)) | |
364 | 368 | then { | |
365 | 369 | let swapbnb = invoke(Address(poolId), "swap", ["WAVES", 0], [AttachedPayment(bnb, assetBalance(this, bnb))]) | |
366 | 370 | if ((swapbnb == swapbnb)) | |
367 | 371 | then { | |
368 | 372 | let swapwbtc = invoke(Address(poolId), "swap", ["WAVES", 0], [AttachedPayment(wbtc, assetBalance(this, wbtc))]) | |
369 | 373 | if ((swapwbtc == swapwbtc)) | |
370 | 374 | then { | |
371 | 375 | let swapbtcb = invoke(Address(poolId), "swap", ["WAVES", 0], [AttachedPayment(btcb, assetBalance(this, btcb))]) | |
372 | 376 | if ((swapbtcb == swapbtcb)) | |
373 | 377 | then { | |
374 | 378 | let wavesBalanceAfter = wavesBalance(this).available | |
375 | 379 | let wavesDifference = (wavesBalanceAfter - wavesBalanceBefore) | |
376 | 380 | let wavesAmountBoost = fraction(wavesDifference, 80, 100) | |
377 | 381 | let amountBoost = fraction(wavesDifference, 80, 100) | |
378 | 382 | let amountOwner = fraction(wavesDifference, 20, 100) | |
379 | 383 | let boost = invoke(Address(poolboostSC), "addBoosting", [whirlpoolstring, 7], [AttachedPayment(unit, amountBoost)]) | |
380 | 384 | if ((boost == boost)) | |
381 | 385 | then [ScriptTransfer(Address(projectowner), amountOwner, unit), IntegerEntry("total WAVES paid out in wavelets", (wavesAmountBoost + getIntegerValue(this, "total WAVES paid out in wavelets"))), IntegerEntry("ROI basis points", fraction(getIntegerValue(this, "total WAVES paid out in wavelets"), 10000, getIntegerValue(this, "total WAVES received in wavelets")))] | |
382 | 386 | else throw("Strict value is not equal to itself.") | |
383 | 387 | } | |
384 | 388 | else throw("Strict value is not equal to itself.") | |
385 | 389 | } | |
386 | 390 | else throw("Strict value is not equal to itself.") | |
387 | 391 | } | |
388 | 392 | else throw("Strict value is not equal to itself.") | |
389 | 393 | } | |
390 | 394 | else throw("Strict value is not equal to itself.") | |
391 | 395 | } | |
392 | 396 | else throw("Strict value is not equal to itself.") | |
393 | 397 | } | |
394 | 398 | else throw("Strict value is not equal to itself.") | |
395 | 399 | } | |
396 | 400 | else throw("Strict value is not equal to itself.") | |
397 | 401 | } | |
398 | 402 | else throw("Strict value is not equal to itself.") | |
399 | 403 | } | |
400 | 404 | else throw("Strict value is not equal to itself.") | |
401 | 405 | } | |
402 | 406 | else throw("Strict value is not equal to itself.") | |
403 | 407 | } | |
404 | 408 | else throw("Strict value is not equal to itself.") | |
405 | 409 | } | |
406 | 410 | ||
407 | 411 | ||
408 | 412 | ||
409 | 413 | @Callable(i) | |
410 | 414 | func BoostPoolAPYwETHmain () = if ((i.caller != this)) | |
411 | 415 | then throw("access only by project owner") | |
412 | 416 | else { | |
413 | 417 | let calculateTokenRates = invoke(PL_Main, "calculateTokenRates", [false], nil) | |
414 | 418 | if ((calculateTokenRates == calculateTokenRates)) | |
415 | 419 | then { | |
416 | 420 | let withdrawamount = (PL_value(PL_Main, eth) - tryGetInteger("ETH supplied")) | |
417 | 421 | let wavesBalanceBefore = wavesBalance(this).available | |
418 | 422 | if ((wavesBalanceBefore == wavesBalanceBefore)) | |
419 | 423 | then { | |
420 | 424 | let withdraw = invoke(Address(base58'3P4uA5etnZi4AmBabKinq2bMiWU8KcnHZdH'), "withdraw", [toBase58String(eth), withdrawamount], nil) | |
421 | 425 | if ((withdraw == withdraw)) | |
422 | 426 | then { | |
423 | 427 | let swapeth = invoke(Address(poolId), "swap", ["WAVES", 0], [AttachedPayment(eth, assetBalance(this, eth))]) | |
424 | 428 | if ((swapeth == swapeth)) | |
425 | 429 | then { | |
426 | 430 | let wavesBalanceAfter = wavesBalance(this).available | |
427 | 431 | let wavesDifference = (wavesBalanceAfter - wavesBalanceBefore) | |
428 | 432 | let amountBoost = fraction(wavesDifference, 80, 100) | |
429 | 433 | let amountOwner = fraction(wavesDifference, 20, 100) | |
430 | 434 | let boost = invoke(Address(poolboostSC), "addBoosting", [whirlpoolstring, 7], [AttachedPayment(unit, amountBoost)]) | |
431 | 435 | if ((boost == boost)) | |
432 | 436 | then [ScriptTransfer(Address(projectowner), amountOwner, unit), IntegerEntry("total WAVES paid out in wavelets", (amountBoost + getIntegerValue(this, "total WAVES paid out in wavelets"))), IntegerEntry("ROI basis points", fraction(getIntegerValue(this, "total WAVES paid out in wavelets"), 10000, getIntegerValue(this, "total WAVES received in wavelets")))] | |
433 | 437 | else throw("Strict value is not equal to itself.") | |
434 | 438 | } | |
435 | 439 | else throw("Strict value is not equal to itself.") | |
436 | 440 | } | |
437 | 441 | else throw("Strict value is not equal to itself.") | |
438 | 442 | } | |
439 | 443 | else throw("Strict value is not equal to itself.") | |
440 | 444 | } | |
441 | 445 | else throw("Strict value is not equal to itself.") | |
442 | 446 | } | |
443 | 447 | ||
444 | 448 | ||
445 | 449 | ||
446 | 450 | @Callable(i) | |
447 | 451 | func BoostPoolAPYwWhirlpool () = if ((i.caller != this)) | |
448 | 452 | then throw("access only by project owner") | |
449 | 453 | else { | |
450 | 454 | let wavesBalanceBefore = wavesBalance(this).available | |
451 | 455 | if ((wavesBalanceBefore == wavesBalanceBefore)) | |
452 | 456 | then { | |
453 | 457 | let claim = invoke(Address(whirlpoolPoolId), "claimIndexRewards", nil, nil) | |
454 | 458 | if ((claim == claim)) | |
455 | 459 | then { | |
456 | 460 | let swapwhirlpool = invoke(Address(whirlpoolPoolId), "swap", ["WAVES", 0], [AttachedPayment(whirlpool, assetBalance(this, whirlpool))]) | |
457 | 461 | if ((swapwhirlpool == swapwhirlpool)) | |
458 | 462 | then { | |
459 | 463 | let wavesBalanceAfter = wavesBalance(this).available | |
460 | 464 | let wavesDifference = (wavesBalanceAfter - wavesBalanceBefore) | |
461 | 465 | let wavesAmountBoost = fraction(wavesDifference, 80, 100) | |
462 | 466 | let amountBoost = fraction(wavesDifference, 80, 100) | |
463 | 467 | let amountOwner = fraction(wavesDifference, 20, 100) | |
464 | 468 | let boost = invoke(Address(poolboostSC), "addBoosting", [whirlpoolstring, 7], [AttachedPayment(unit, amountBoost)]) | |
465 | 469 | if ((boost == boost)) | |
466 | 470 | then [ScriptTransfer(Address(projectowner), amountOwner, unit), IntegerEntry("total WAVES paid out in wavelets", (wavesAmountBoost + getIntegerValue(this, "total WAVES paid out in wavelets"))), IntegerEntry("ROI basis points", fraction(getIntegerValue(this, "total WAVES paid out in wavelets"), 10000, getIntegerValue(this, "total WAVES received in wavelets")))] | |
467 | 471 | else throw("Strict value is not equal to itself.") | |
468 | 472 | } | |
469 | 473 | else throw("Strict value is not equal to itself.") | |
470 | 474 | } | |
471 | 475 | else throw("Strict value is not equal to itself.") | |
472 | 476 | } | |
473 | 477 | else throw("Strict value is not equal to itself.") | |
474 | 478 | } | |
475 | 479 | ||
476 | 480 | ||
477 | 481 | ||
478 | 482 | @Callable(i) | |
479 | 483 | func SupplyETHmain () = if ((i.caller != this)) | |
480 | 484 | then throw("access only by project owner") | |
481 | 485 | else { | |
482 | 486 | let supplyamount = assetBalance(this, eth) | |
483 | 487 | let SupplyETHmain = if ((supplyamount > 0)) | |
484 | 488 | then invoke(Address(base58'3P4uA5etnZi4AmBabKinq2bMiWU8KcnHZdH'), "supply", nil, [AttachedPayment(eth, supplyamount)]) | |
485 | 489 | else unit | |
486 | 490 | if ((SupplyETHmain == SupplyETHmain)) | |
487 | 491 | then [IntegerEntry("ETH supplied", (supplyamount + tryGetInteger("ETH supplied")))] | |
488 | 492 | else throw("Strict value is not equal to itself.") | |
489 | 493 | } | |
490 | 494 | ||
491 | 495 | ||
492 | 496 | ||
493 | 497 | @Callable(i) | |
494 | 498 | func withdrawWAVES_Main () = if ((i.caller != this)) | |
495 | 499 | then throw("access only by project owner") | |
496 | 500 | else { | |
497 | 501 | let withdrawamountMain = (PL_value(PL_Main, waves) - (getIntegerValue(this, "wavelets received for treasury") / 3)) | |
498 | 502 | let withdrawWM = invoke(PL_Main, "withdraw", [toBase58String(waves), withdrawamountMain], nil) | |
499 | 503 | if ((withdrawWM == withdrawWM)) | |
500 | 504 | then nil | |
501 | 505 | else throw("Strict value is not equal to itself.") | |
502 | 506 | } | |
503 | 507 | ||
504 | 508 | ||
505 | 509 | ||
506 | 510 | @Callable(i) | |
507 | 511 | func withdrawWAVES_Defi () = if ((i.caller != this)) | |
508 | 512 | then throw("access only by project owner") | |
509 | 513 | else { | |
510 | 514 | let withdrawamountDefi = (PL_value(PL_Defi, waves) - (getIntegerValue(this, "wavelets received for treasury") / 3)) | |
511 | 515 | let withdrawWD = invoke(PL_Defi, "withdraw", [toBase58String(waves), withdrawamountDefi], nil) | |
512 | 516 | if ((withdrawWD == withdrawWD)) | |
513 | 517 | then nil | |
514 | 518 | else throw("Strict value is not equal to itself.") | |
515 | 519 | } | |
516 | 520 | ||
517 | 521 | ||
518 | 522 | ||
519 | 523 | @Callable(i) | |
520 | 524 | func withdrawWAVES_Low () = if ((i.caller != this)) | |
521 | 525 | then throw("access only by project owner") | |
522 | 526 | else { | |
523 | 527 | let withdrawamountLow = (PL_value(PL_Low, waves) - (getIntegerValue(this, "wavelets received for treasury") / 3)) | |
524 | 528 | let withdrawWL = invoke(PL_Low, "withdraw", [toBase58String(waves), withdrawamountLow], nil) | |
525 | 529 | if ((withdrawWL == withdrawWL)) | |
526 | 530 | then nil | |
527 | 531 | else throw("Strict value is not equal to itself.") | |
528 | 532 | } | |
529 | 533 | ||
530 | 534 | ||
531 | 535 | ||
532 | 536 | @Callable(i) | |
533 | 537 | func stakeEAST () = if ((i.caller != this)) | |
534 | 538 | then throw("access only by project owner") | |
535 | 539 | else { | |
536 | 540 | let supplyamount = assetBalance(this, east) | |
537 | 541 | let stakeEAST = if ((supplyamount > 0)) | |
538 | 542 | then invoke(EAST_stake, "stake", nil, [AttachedPayment(east, supplyamount)]) | |
539 | 543 | else unit | |
540 | 544 | if ((stakeEAST == stakeEAST)) | |
541 | 545 | then [IntegerEntry("EAST staked", (supplyamount + tryGetInteger("EAST staked")))] | |
542 | 546 | else throw("Strict value is not equal to itself.") | |
543 | 547 | } | |
544 | 548 | ||
545 | 549 | ||
546 | 550 | ||
547 | 551 | @Callable(i) | |
548 | 552 | func ChangeIntegerEntry (key,integer) = if ((i.caller != this)) | |
549 | 553 | then throw("access only by project owner") | |
550 | 554 | else [IntegerEntry(key, integer)] | |
551 | 555 | ||
552 | 556 |
github/deemru/w8io/0e76f2f 85.26 ms ◑