tx · GJKZ9F3aAnjj3dzt71c98cwobkn3otifNnvpgci5NaKY 3N6ALE8YyAYnRk9f38mdWRTvW77rFkg5hN1: -0.03200000 Waves 2024.02.09 14:32 [2968651] smart account 3N6ALE8YyAYnRk9f38mdWRTvW77rFkg5hN1 > SELF 0.00000000 Waves
{ "type": 13, "id": "GJKZ9F3aAnjj3dzt71c98cwobkn3otifNnvpgci5NaKY", "fee": 3200000, "feeAssetId": null, "timestamp": 1707478019233, "version": 2, "chainId": 84, "sender": "3N6ALE8YyAYnRk9f38mdWRTvW77rFkg5hN1", "senderPublicKey": "HMMF9zUpZPBGLAhpc1yDdcJNJychSarGHS79P2mGvq7J", "proofs": [ "5wvXECaKisH4aeMMtctydoWC3LcSXRZ6UMGCANSDcntJEoRh6zC9voGg359T7L4T76MhxWrpZfAb1MXWLKCHN9b9" ], "script": "base64:BgJTCAISBgoECAgICBIHCgUICAgICBIDCgEIEgMKAQESBgoECAEBARIECgIBARIDCgEIEgMKAQgSBAoCCAgSAwoBCBIDCgEIEgASABIDCgEIEgMKAQiDAQAJU0VQQVJBVE9SAgJfXwAFV0FWRVMCBVdBVkVTAAxLRVlfTVVMVElTSUcCCE1VTFRJU0lHAApLRVlfU1RBVFVTAgZTVEFUVVMACEtFWV9JTklUAgRJTklUAApLRVlfUEFVU0VEAgZQQVVTRUQACktFWV9QQVVTRVICBlBBVVNFUgALS0VZX01BTkFHRVICB01BTkFHRVIAC0tFWV9SRUZFUkVSAgdSRUZFUkVSAAxLRVlfRVhFQ1VUT1ICCEVYRUNVVE9SAApLRVlfT1JBQ0xFAgZPUkFDTEUAE0tFWV9DQUxMRVJfQ09OVFJBQ1QCD0NBTExFUl9DT05UUkFDVAAJS0VZX1BSSUNFAgVQUklDRQAPS0VZX1VOSVRTX0FTU0VUAgtVTklUU19BU1NFVAARS0VZX1VTRVJfUE9TSVRJT04CDVVTRVJfUE9TSVRJT04AFEtFWV9VU0VSX1VTRF9CQUxBTkNFAhBVU0VSX1VTRF9CQUxBTkNFACdLRVlfVVNFUl9VTklUU19QRVJfVVNEX0JBTEFOQ0VfSU5URUdSQUwCI1VTRVJfVU5JVFNfUEVSX1VTRF9CQUxBTkNFX0lOVEVHUkFMAClLRVlfVVNFUl9VTklUU19QRVJfUkVGRVJBTF9TSEFSRV9JTlRFR1JBTAIlVVNFUl9VTklUU19QRVJfUkVGRVJBTF9TSEFSRV9JTlRFR1JBTAAWS0VZX1VTRVJfQ0hFQ0tQT0lOVF9BVAISVVNFUl9DSEVDS1BPSU5UX0FUACJLRVlfVVNFUl9VTklUU19CQUxBTkNFX0RJU1RSSUJVVEVEAh5VU0VSX1VOSVRTX0JBTEFOQ0VfRElTVFJJQlVURUQAHUtFWV9VU0VSX1VOSVRTX1NIQVJFU19SRUZFUkFMAhlVU0VSX1VOSVRTX1NIQVJFU19SRUZFUkFMABdLRVlfVVNFUl9TSEFSRVNfUkVGRVJBTAITVVNFUl9TSEFSRVNfUkVGRVJBTAAPS0VZX1NUQVJUX0JMT0NLAgtTVEFSVF9CTE9DSwAQS0VZX0ZJTklTSF9CTE9DSwIMRklOSVNIX0JMT0NLABZLRVlfVE9UQUxfVU5JVFNfRk9SX0xQAhJUT1RBTF9VTklUU19GT1JfTFAAG0tFWV9UT1RBTF9VTklUU19GT1JfUkVGRVJBTAIXVE9UQUxfVU5JVFNfRk9SX1JFRkVSQUwAFUtFWV9UT1RBTF9VU0RfQkFMQU5DRQIRVE9UQUxfVVNEX0JBTEFOQ0UAIktFWV9VTklUU19QRVJfVVNEX0JBTEFOQ0VfSU5URUdSQUwCHlVOSVRTX1BFUl9VU0RfQkFMQU5DRV9JTlRFR1JBTAARS0VZX0NIRUNLUE9JTlRfQVQCDUNIRUNLUE9JTlRfQVQAHUtFWV9VTklUU19CQUxBTkNFX0RJU1RSSUJVVEVEAhlVTklUU19CQUxBTkNFX0RJU1RSSUJVVEVEABFLRVlfVE9LRU5fQkFMQU5DRQINVE9LRU5fQkFMQU5DRQAPS0VZX1VTRVJTX0NPVU5UAgtVU0VSU19DT1VOVAAkS0VZX1VOSVRTX1BFUl9SRUZFUkFMX1NIQVJFX0lOVEVHUkFMAiBVTklUU19QRVJfUkVGRVJBTF9TSEFSRV9JTlRFR1JBTAAYS0VZX1VOSVRTX1NIQVJFU19SRUZFUkFMAhRVTklUU19TSEFSRVNfUkVGRVJBTAAYS0VZX1RPVEFMX1NIQVJFU19SRUZFUkFMAhRUT1RBTF9TSEFSRVNfUkVGRVJBTAATS0VZX1NXQVZFU19DT05UUkFDVAIPU1dBVkVTX0NPTlRSQUNUABBLRVlfU1dBVkVTX0FTU0VUAgVBU1NFVAAMRlVOQ19ERVBPU0lUAgdkZXBvc2l0AA1GVU5DX0dFVF9SQVRFAgdnZXRSYXRlAA1GVU5DX1dJVEhEUkFXAgh3aXRoZHJhdwAHTUFYX0lOVAD//////////38ADlBFUkNFTlRfRkFDVE9SCQC2AgEAgKCUpY0dAAtaRVJPX0JJR0lOVAkAtgIBAAAACk9ORV9CSUdJTlQJALYCAQABABJTV0FWRVNfUkFURV9GQUNUT1IJALYCAQCAoJSljR0BEF92YWxpZGF0ZUFkZHJlc3MCCGFkZHJlc3NfBGVycl8EByRtYXRjaDAJAKYIAQUIYWRkcmVzc18DCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAYJAAIBBQRlcnJfAQxfdmFsaWRhdGVJbnQEBHZhbF8ObG93ZXJCb3VuZGFyeV8OdXBwZXJCb3VuZGFyeV8EZXJyXwMDCQBmAgUObG93ZXJCb3VuZGFyeV8FBHZhbF8GCQBmAgUEdmFsXwUOdXBwZXJCb3VuZGFyeV8JAAIBBQRlcnJfBgEPX3ZhbGlkYXRlQmlnSW50BAR2YWxfDmxvd2VyQm91bmRhcnlfDnVwcGVyQm91bmRhcnlfBGVycl8DAwkAvwICBQ5sb3dlckJvdW5kYXJ5XwUEdmFsXwYJAL8CAgUEdmFsXwUOdXBwZXJCb3VuZGFyeV8JAAIBBQRlcnJfBgEVX3ZhbGlkYXRlUGF5bWVudHNTaXplAwlwYXltZW50c18HdGFyZ2V0XwRlcnJfAwkBAiE9AgkAkAMBBQlwYXltZW50c18FB3RhcmdldF8JAAIBBQRlcnJfBgEVX3ZhbGlkYXRlV2F2ZXNQYXltZW50AghwYXltZW50XwRlcnJfBAckbWF0Y2gwCAUIcGF5bWVudF8HYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFhBQckbWF0Y2gwCQACAQUEZXJyXwMJAAECBQckbWF0Y2gwAgRVbml0BgkAAgECC01hdGNoIGVycm9yARFfdmFsaWRhdGVFcUJpZ0ludAMFdmFsMV8FdmFsMl8EZXJyXwMJAQIhPQIFBXZhbDFfBQV2YWwyXwkAAgEFBGVycl8GAQ5fdmFsaWRhdGVBc3NldAIGYXNzZXRfBGVycl8EByRtYXRjaDAJAOwHAQkA2QQBBQZhc3NldF8DCQABAgUHJG1hdGNoMAIFQXNzZXQEAWEFByRtYXRjaDAGCQACAQUEZXJyXwEJX2xvYWRJbml0AAQHJG1hdGNoMAkAoAgBBQhLRVlfSU5JVAMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFhBQckbWF0Y2gwBQFhBwEJX3NhdmVJbml0AQdpc0luaXRfCQDMCAIJAQxCb29sZWFuRW50cnkCBQhLRVlfSU5JVAUHaXNJbml0XwUDbmlsAQpfbG9hZFBhdXNlAAQHJG1hdGNoMAkAoAgBBQpLRVlfUEFVU0VEAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWEFByRtYXRjaDAFAWEHAQpfc2F2ZVBhdXNlAQlpc1BhdXNlZF8JAMwIAgkBDEJvb2xlYW5FbnRyeQIFCktFWV9QQVVTRUQFCWlzUGF1c2VkXwUDbmlsAQtfbG9hZFBhdXNlcgAEByRtYXRjaDAJAKIIAQUKS0VZX1BBVVNFUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAAQtfc2F2ZVBhdXNlcgEHcGF1c2VyXwkAzAgCCQELU3RyaW5nRW50cnkCBQpLRVlfUEFVU0VSCQClCAEFB3BhdXNlcl8FA25pbAENX2xvYWRNdWx0aXNpZwAEByRtYXRjaDAJAKIIAQUMS0VZX01VTFRJU0lHAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkBB0FkZHJlc3MBAQABDV9zYXZlTXVsdGlzaWcBCW11bHRpc2lnXwkAzAgCCQELU3RyaW5nRW50cnkCBQxLRVlfTVVMVElTSUcJAKUIAQUJbXVsdGlzaWdfBQNuaWwBDV9sb2FkRXhlY3V0b3IABAckbWF0Y2gwCQCiCAEFDEtFWV9FWEVDVVRPUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAAQ1fc2F2ZUV4ZWN1dG9yAQlleGVjdXRvcl8JAMwIAgkBC1N0cmluZ0VudHJ5AgUMS0VZX0VYRUNVVE9SCQClCAEFCWV4ZWN1dG9yXwUDbmlsAQtfbG9hZE9yYWNsZQAEByRtYXRjaDAJAKIIAQUKS0VZX09SQUNMRQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAAQtfc2F2ZU9yYWNsZQEHb3JhY2xlXwkAzAgCCQELU3RyaW5nRW50cnkCBQpLRVlfT1JBQ0xFCQClCAEFB29yYWNsZV8FA25pbAETX2xvYWRDYWxsZXJDb250cmFjdAAEByRtYXRjaDAJAKIIAQUTS0VZX0NBTExFUl9DT05UUkFDVAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAFAWECAAETX3NhdmVDYWxsZXJDb250cmFjdAEHY2FsbGVyXwkAzAgCCQELU3RyaW5nRW50cnkCBRNLRVlfQ0FMTEVSX0NPTlRSQUNUBQdjYWxsZXJfBQNuaWwBEV9sb2FkVXNlclBvc2l0aW9uAgZ0b2tlbl8FdXNlcl8EByRtYXRjaDAJAKIIAQkAuQkCCQDMCAIFEUtFWV9VU0VSX1BPU0lUSU9OCQDMCAIFBnRva2VuXwkAzAgCBQV1c2VyXwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBAZzdHJ1Y3QJAL0JAgUBYQUJU0VQQVJBVE9SCQCUCgIJAKcDAQkAkQMCBQZzdHJ1Y3QAAAkApwMBCQCRAwIFBnN0cnVjdAABCQCUCgIFC1pFUk9fQklHSU5UBQtaRVJPX0JJR0lOVAERX3NhdmVVc2VyUG9zaXRpb24DBnRva2VuXwV1c2VyXwlwb3NpdGlvbl8JAMwIAgkBC1N0cmluZ0VudHJ5AgkAuQkCCQDMCAIFEUtFWV9VU0VSX1BPU0lUSU9OCQDMCAIFBnRva2VuXwkAzAgCBQV1c2VyXwUDbmlsBQlTRVBBUkFUT1IJALsJAgkAzAgCCQCmAwEIBQlwb3NpdGlvbl8CXzEJAMwIAgkApgMBCAUJcG9zaXRpb25fAl8yBQNuaWwFCVNFUEFSQVRPUgUDbmlsARNfbG9hZFVzZXJVU0RCYWxhbmNlAQV1c2VyXwQHJG1hdGNoMAkAoggBCQC5CQIJAMwIAgUUS0VZX1VTRVJfVVNEX0JBTEFOQ0UJAMwIAgUFdXNlcl8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkApwMBBQFhBQtaRVJPX0JJR0lOVAETX3NhdmVVc2VyVVNEQmFsYW5jZQIFdXNlcl8GdmFsdWVfCQDMCAIJAQtTdHJpbmdFbnRyeQIJALkJAgkAzAgCBRRLRVlfVVNFUl9VU0RfQkFMQU5DRQkAzAgCBQV1c2VyXwUDbmlsBQlTRVBBUkFUT1IJAKYDAQUGdmFsdWVfBQNuaWwBFl9sb2FkVXNlclNoYXJlc1JlZmVyYWwBBXVzZXJfBAckbWF0Y2gwCQCiCAEJALkJAgkAzAgCBRdLRVlfVVNFUl9TSEFSRVNfUkVGRVJBTAkAzAgCBQV1c2VyXwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQCnAwEFAWEFC1pFUk9fQklHSU5UARZfc2F2ZVVzZXJTaGFyZXNSZWZlcmFsAgV1c2VyXwZ2YWx1ZV8JAMwIAgkBC1N0cmluZ0VudHJ5AgkAuQkCCQDMCAIFF0tFWV9VU0VSX1NIQVJFU19SRUZFUkFMCQDMCAIFBXVzZXJfBQNuaWwFCVNFUEFSQVRPUgkApgMBBQZ2YWx1ZV8FA25pbAEfX2xvYWRVbml0c1BlclVTREJhbGFuY2VJbnRlZ3JhbAAEByRtYXRjaDAJAKIIAQUiS0VZX1VOSVRTX1BFUl9VU0RfQkFMQU5DRV9JTlRFR1JBTAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJAKcDAQUBYQULWkVST19CSUdJTlQBH19zYXZlVW5pdHNQZXJVU0RCYWxhbmNlSW50ZWdyYWwBBnZhbHVlXwkAzAgCCQELU3RyaW5nRW50cnkCBSJLRVlfVU5JVFNfUEVSX1VTRF9CQUxBTkNFX0lOVEVHUkFMCQCmAwEFBnZhbHVlXwUDbmlsASNfbG9hZFVzZXJVbml0c1BlclVTREJhbGFuY2VJbnRlZ3JhbAEFdXNlcl8EByRtYXRjaDAJAKIIAQkAuQkCCQDMCAIFJ0tFWV9VU0VSX1VOSVRTX1BFUl9VU0RfQkFMQU5DRV9JTlRFR1JBTAkAzAgCBQV1c2VyXwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQCnAwEFAWEFC1pFUk9fQklHSU5UASNfc2F2ZVVzZXJVbml0c1BlclVTREJhbGFuY2VJbnRlZ3JhbAIFdXNlcl8GdmFsdWVfCQDMCAIJAQtTdHJpbmdFbnRyeQIJALkJAgkAzAgCBSdLRVlfVVNFUl9VTklUU19QRVJfVVNEX0JBTEFOQ0VfSU5URUdSQUwJAMwIAgUFdXNlcl8FA25pbAUJU0VQQVJBVE9SCQCmAwEFBnZhbHVlXwUDbmlsARFfbG9hZENoZWNrcG9pbnRBdAAEByRtYXRjaDAJAKIIAQURS0VZX0NIRUNLUE9JTlRfQVQDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQCnAwEFAWEFC1pFUk9fQklHSU5UARFfc2F2ZUNoZWNrcG9pbnRBdAEGdmFsdWVfCQDMCAIJAQtTdHJpbmdFbnRyeQIFEUtFWV9DSEVDS1BPSU5UX0FUCQCmAwEFBnZhbHVlXwUDbmlsARVfbG9hZFVzZXJDaGVja3BvaW50QXQBBXVzZXJfBAckbWF0Y2gwCQCiCAEJALkJAgkAzAgCBRZLRVlfVVNFUl9DSEVDS1BPSU5UX0FUCQDMCAIFBXVzZXJfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJAKcDAQUBYQULWkVST19CSUdJTlQBFV9zYXZlVXNlckNoZWNrcG9pbnRBdAIFdXNlcl8GdmFsdWVfCQDMCAIJAQtTdHJpbmdFbnRyeQIJALkJAgkAzAgCBRZLRVlfVVNFUl9DSEVDS1BPSU5UX0FUCQDMCAIFBXVzZXJfBQNuaWwFCVNFUEFSQVRPUgkApgMBBQZ2YWx1ZV8FA25pbAEPX2xvYWRVbml0c0Fzc2V0AAQHJG1hdGNoMAkAoggBBQ9LRVlfVU5JVFNfQVNTRVQDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQDZBAEFAWEBAAEPX3NhdmVVbml0c0Fzc2V0AQZhc3NldF8JAMwIAgkBC1N0cmluZ0VudHJ5AgUPS0VZX1VOSVRTX0FTU0VUCQDYBAEFBmFzc2V0XwUDbmlsAQ9fbG9hZFN0YXJ0QmxvY2sABAckbWF0Y2gwCQCiCAEFD0tFWV9TVEFSVF9CTE9DSwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJAKcDAQUBYQULWkVST19CSUdJTlQBD19zYXZlU3RhcnRCbG9jawEGdmFsdWVfCQDMCAIJAQtTdHJpbmdFbnRyeQIFD0tFWV9TVEFSVF9CTE9DSwkApgMBBQZ2YWx1ZV8FA25pbAEQX2xvYWRGaW5pc2hCbG9jawAEByRtYXRjaDAJAKIIAQUQS0VZX0ZJTklTSF9CTE9DSwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJAKcDAQUBYQULWkVST19CSUdJTlQBEF9zYXZlRmluaXNoQmxvY2sBBnZhbHVlXwkAzAgCCQELU3RyaW5nRW50cnkCBRBLRVlfRklOSVNIX0JMT0NLCQCmAwEFBnZhbHVlXwUDbmlsARxfbG9hZFVuaXRzQmFsYW5jZURpc3RyaWJ1dGVkAAQHJG1hdGNoMAkAoggBBR1LRVlfVU5JVFNfQkFMQU5DRV9ESVNUUklCVVRFRAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJAKcDAQUBYQULWkVST19CSUdJTlQBHF9zYXZlVW5pdHNCYWxhbmNlRGlzdHJpYnV0ZWQBBnZhbHVlXwkAzAgCCQELU3RyaW5nRW50cnkCBR1LRVlfVU5JVFNfQkFMQU5DRV9ESVNUUklCVVRFRAkApgMBBQZ2YWx1ZV8FA25pbAEgX2xvYWRVc2VyVW5pdHNCYWxhbmNlRGlzdHJpYnV0ZWQBBXVzZXJfBAckbWF0Y2gwCQCiCAEJALkJAgkAzAgCBSJLRVlfVVNFUl9VTklUU19CQUxBTkNFX0RJU1RSSUJVVEVECQDMCAIFBXVzZXJfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJAKcDAQUBYQULWkVST19CSUdJTlQBIF9zYXZlVXNlclVuaXRzQmFsYW5jZURpc3RyaWJ1dGVkAgV1c2VyXwZ2YWx1ZV8JAMwIAgkBC1N0cmluZ0VudHJ5AgkAuQkCCQDMCAIFIktFWV9VU0VSX1VOSVRTX0JBTEFOQ0VfRElTVFJJQlVURUQJAMwIAgUFdXNlcl8FA25pbAUJU0VQQVJBVE9SCQCmAwEFBnZhbHVlXwUDbmlsARRfbG9hZFRvdGFsVVNEQmFsYW5jZQAEByRtYXRjaDAJAKIIAQUVS0VZX1RPVEFMX1VTRF9CQUxBTkNFAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkApwMBBQFhBQtaRVJPX0JJR0lOVAEUX3NhdmVUb3RhbFVTREJhbGFuY2UBBnZhbHVlXwkAzAgCCQELU3RyaW5nRW50cnkCBRVLRVlfVE9UQUxfVVNEX0JBTEFOQ0UJAKYDAQUGdmFsdWVfBQNuaWwBE19sb2FkU1dhdmVzQ29udHJhY3QABAckbWF0Y2gwCQCiCAEFE0tFWV9TV0FWRVNfQ09OVFJBQ1QDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFhCQEHQWRkcmVzcwEBAAETX3NhdmVTV2F2ZXNDb250cmFjdAEJY29udHJhY3RfCQDMCAIJAQtTdHJpbmdFbnRyeQIFE0tFWV9TV0FWRVNfQ09OVFJBQ1QJAKUIAQUJY29udHJhY3RfBQNuaWwBEF9sb2FkU1dhdmVzQXNzZXQBCWNvbnRyYWN0XwQHJG1hdGNoMAkAnQgCBQljb250cmFjdF8FEEtFWV9TV0FWRVNfQVNTRVQDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQDZBAEFAWEJAAIBAhhfbG9hZFNXYXZlc0Fzc2V0OiByZXZlcnQBEV9sb2FkVG9rZW5CYWxhbmNlAQZ0b2tlbl8EByRtYXRjaDAJAKIIAQkAuQkCCQDMCAIFEUtFWV9UT0tFTl9CQUxBTkNFCQDMCAIFBnRva2VuXwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQCnAwEFAWEFC1pFUk9fQklHSU5UARFfc2F2ZVRva2VuQmFsYW5jZQIGdG9rZW5fBnZhbHVlXwkAzAgCCQELU3RyaW5nRW50cnkCCQC5CQIJAMwIAgURS0VZX1RPS0VOX0JBTEFOQ0UJAMwIAgUGdG9rZW5fBQNuaWwFCVNFUEFSQVRPUgkApgMBBQZ2YWx1ZV8FA25pbAEPX2xvYWRVc2Vyc0NvdW50AAQHJG1hdGNoMAkAoggBBQ9LRVlfVVNFUlNfQ09VTlQDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQCnAwEFAWEFC1pFUk9fQklHSU5UAQ9fc2F2ZVVzZXJzQ291bnQBBnZhbHVlXwkAzAgCCQELU3RyaW5nRW50cnkCBQ9LRVlfVVNFUlNfQ09VTlQJAKYDAQUGdmFsdWVfBQNuaWwBIV9sb2FkVW5pdHNQZXJSZWZlcmFsU2hhcmVJbnRlZ3JhbAAEByRtYXRjaDAJAKIIAQUkS0VZX1VOSVRTX1BFUl9SRUZFUkFMX1NIQVJFX0lOVEVHUkFMAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkApwMBBQFhBQtaRVJPX0JJR0lOVAEhX3NhdmVVbml0c1BlclJlZmVyYWxTaGFyZUludGVncmFsAQZ2YWx1ZV8JAMwIAgkBC1N0cmluZ0VudHJ5AgUkS0VZX1VOSVRTX1BFUl9SRUZFUkFMX1NIQVJFX0lOVEVHUkFMCQCmAwEFBnZhbHVlXwUDbmlsARdfbG9hZFVuaXRzU2hhcmVzUmVmZXJhbAAEByRtYXRjaDAJAKIIAQUYS0VZX1VOSVRTX1NIQVJFU19SRUZFUkFMAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkApwMBBQFhBQtaRVJPX0JJR0lOVAEXX3NhdmVVbml0c1NoYXJlc1JlZmVyYWwBBnZhbHVlXwkAzAgCCQELU3RyaW5nRW50cnkCBRhLRVlfVU5JVFNfU0hBUkVTX1JFRkVSQUwJAKYDAQUGdmFsdWVfBQNuaWwBFF9sb2FkVG90YWxVbml0c0ZvckxQAAQHJG1hdGNoMAkAoggBBRZLRVlfVE9UQUxfVU5JVFNfRk9SX0xQAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkApwMBBQFhBQtaRVJPX0JJR0lOVAEUX3NhdmVUb3RhbFVuaXRzRm9yTFABBnZhbHVlXwkAzAgCCQELU3RyaW5nRW50cnkCBRZLRVlfVE9UQUxfVU5JVFNfRk9SX0xQCQCmAwEFBnZhbHVlXwUDbmlsARlfbG9hZFRvdGFsVW5pdHNGb3JSZWZlcmFsAAQHJG1hdGNoMAkAoggBBRtLRVlfVE9UQUxfVU5JVFNfRk9SX1JFRkVSQUwDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQCnAwEFAWEFC1pFUk9fQklHSU5UARlfc2F2ZVRvdGFsVW5pdHNGb3JSZWZlcmFsAQZ2YWx1ZV8JAMwIAgkBC1N0cmluZ0VudHJ5AgUbS0VZX1RPVEFMX1VOSVRTX0ZPUl9SRUZFUkFMCQCmAwEFBnZhbHVlXwUDbmlsARdfbG9hZFRvdGFsU2hhcmVzUmVmZXJhbAAEByRtYXRjaDAJAKIIAQUYS0VZX1RPVEFMX1NIQVJFU19SRUZFUkFMAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkApwMBBQFhBQtaRVJPX0JJR0lOVAEXX3NhdmVUb3RhbFNoYXJlc1JlZmVyYWwBBnZhbHVlXwkAzAgCCQELU3RyaW5nRW50cnkCBRhLRVlfVE9UQUxfU0hBUkVTX1JFRkVSQUwJAKYDAQUGdmFsdWVfBQNuaWwBJV9sb2FkVXNlclVuaXRzUGVyUmVmZXJhbFNoYXJlSW50ZWdyYWwBBXVzZXJfBAckbWF0Y2gwCQCiCAEJALkJAgkAzAgCBSlLRVlfVVNFUl9VTklUU19QRVJfUkVGRVJBTF9TSEFSRV9JTlRFR1JBTAkAzAgCBQV1c2VyXwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQCnAwEFAWEFC1pFUk9fQklHSU5UASVfc2F2ZVVzZXJVbml0c1BlclJlZmVyYWxTaGFyZUludGVncmFsAgV1c2VyXwZ2YWx1ZV8JAMwIAgkBC1N0cmluZ0VudHJ5AgkAuQkCCQDMCAIFKUtFWV9VU0VSX1VOSVRTX1BFUl9SRUZFUkFMX1NIQVJFX0lOVEVHUkFMCQDMCAIFBXVzZXJfBQNuaWwFCVNFUEFSQVRPUgkApgMBBQZ2YWx1ZV8FA25pbAEbX2xvYWRVc2VyVW5pdHNTaGFyZXNSZWZlcmFsAQV1c2VyXwQHJG1hdGNoMAkAoggBCQC5CQIJAMwIAgUdS0VZX1VTRVJfVU5JVFNfU0hBUkVTX1JFRkVSQUwJAMwIAgUFdXNlcl8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkApwMBBQFhBQtaRVJPX0JJR0lOVAEbX3NhdmVVc2VyVW5pdHNTaGFyZXNSZWZlcmFsAgV1c2VyXwZ2YWx1ZV8JAMwIAgkBC1N0cmluZ0VudHJ5AgkAuQkCCQDMCAIFHUtFWV9VU0VSX1VOSVRTX1NIQVJFU19SRUZFUkFMCQDMCAIFBXVzZXJfBQNuaWwFCVNFUEFSQVRPUgkApgMBBQZ2YWx1ZV8FA25pbAEMX2xvYWRNYW5hZ2VyAAQHJG1hdGNoMAkAoggBBQtLRVlfTUFOQUdFUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAAQxfc2F2ZU1hbmFnZXIBCG1hbmFnZXJfCQDMCAIJAQtTdHJpbmdFbnRyeQIFC0tFWV9NQU5BR0VSCQClCAEFCG1hbmFnZXJfBQNuaWwBDF9sb2FkUmVmZXJlcgEJY29kZWhhc2hfBAckbWF0Y2gwCQCiCAEJALkJAgkAzAgCBQtLRVlfUkVGRVJFUgkAzAgCBQljb2RlaGFzaF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAUBYQkAAgECFF9sb2FkUmVmZXJlcjogcmV2ZXJ0AQxfc2F2ZVJlZmVyZXICCWNvZGVoYXNoXwhhZGRyZXNzXwkAzAgCCQELU3RyaW5nRW50cnkCCQC5CQIJAMwIAgULS0VZX1JFRkVSRVIJAMwIAgUJY29kZWhhc2hfBQNuaWwFCVNFUEFSQVRPUgUIYWRkcmVzc18FA25pbAEWX2NoZWNrUmVmZXJlckV4aXN0ZW5jZQEJY29kZWhhc2hfBAckbWF0Y2gwCQCiCAEJALkJAgkAzAgCBQtLRVlfUkVGRVJFUgkAzAgCBQljb2RlaGFzaF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAYHARFfb25seVRoaXNDb250cmFjdAEHY2FsbGVyXwMJAQIhPQIFB2NhbGxlcl8FBHRoaXMJAAIBAhlfb25seVRoaXNDb250cmFjdDogcmV2ZXJ0BgEQX3doZW5NdWx0aXNpZ1NldAADCQAAAgkBDV9sb2FkTXVsdGlzaWcACQEHQWRkcmVzcwEBAAkAAgECGF93aGVuTXVsdGlzaWdTZXQ6IHJldmVydAYBE193aGVuTm90SW5pdGlhbGl6ZWQAAwkBCV9sb2FkSW5pdAAJAAIBAhtfd2hlbk5vdEluaXRpYWxpemVkOiByZXZlcnQGARBfd2hlbkluaXRpYWxpemVkAAMJAQEhAQkBCV9sb2FkSW5pdAAJAAIBAhhfd2hlbkluaXRpYWxpemVkOiByZXZlcnQGAQ5fd2hlbk5vdFBhdXNlZAADCQEKX2xvYWRQYXVzZQAJAAIBAhZfd2hlbk5vdFBhdXNlZDogcmV2ZXJ0BgELX3doZW5QYXVzZWQAAwkBASEBCQEKX2xvYWRQYXVzZQAJAAIBAhNfd2hlblBhdXNlZDogcmV2ZXJ0BgELX29ubHlQYXVzZXIBB2NhbGxlcl8DCQECIT0CBQdjYWxsZXJfCQELX2xvYWRQYXVzZXIACQACAQITX29ubHlQYXVzZXI6IHJldmVydAYBDF9vbmx5TWFuYWdlcgEHY2FsbGVyXwMJAQIhPQIFB2NhbGxlcl8JAQxfbG9hZE1hbmFnZXIACQACAQIUX29ubHlNYW5hZ2VyOiByZXZlcnQGARFfdmFsaWRhdGVFeGVjdXRvcgIEdmFsXwRlcnJfAwkBAiE9AgUEdmFsXwkBDV9sb2FkRXhlY3V0b3IACQACAQUEZXJyXwYBD192YWxpZGF0ZUNhbGxlcgIEdmFsXwRlcnJfAwkBAiE9AgUEdmFsXwkBE19sb2FkQ2FsbGVyQ29udHJhY3QACQACAQUEZXJyXwYBDV9nZXRUb2tlblJhdGUBBnRva2VuXwQHJG1hdGNoMAkAnQgCCQELX2xvYWRPcmFjbGUACQC5CQIJAMwIAgUJS0VZX1BSSUNFCQDMCAIFBnRva2VuXwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQCnAwEFAWEJAAIBCQCsAgICIV9nZXRUb2tlblJhdGU6IG5vIHJhdGUgZm9yIHRva2VuPQUGdG9rZW5fAQtfY2hlY2twb2ludAAEHnByZXZVbml0c1BlclVTREJhbGFuY2VJbnRlZ3JhbAkBH19sb2FkVW5pdHNQZXJVU0RCYWxhbmNlSW50ZWdyYWwABBBwcmV2Q2hlY2twb2ludEF0CQCYAwEJAMwIAgkBD19sb2FkU3RhcnRCbG9jawAJAMwIAgkBEV9sb2FkQ2hlY2twb2ludEF0AAUDbmlsBBtwcmV2VW5pdHNCYWxhbmNlRGlzdHJpYnV0ZWQJARxfbG9hZFVuaXRzQmFsYW5jZURpc3RyaWJ1dGVkAAQgcHJldlVuaXRzUGVyUmVmZXJhbFNoYXJlSW50ZWdyYWwJASFfbG9hZFVuaXRzUGVyUmVmZXJhbFNoYXJlSW50ZWdyYWwABBZwcmV2VW5pdHNTaGFyZXNSZWZlcmFsCQEXX2xvYWRVbml0c1NoYXJlc1JlZmVyYWwABAxjdXJyZW50QmxvY2sJAJkDAQkAzAgCCQC2AgEFBmhlaWdodAkAzAgCCQEQX2xvYWRGaW5pc2hCbG9jawAFA25pbAMJAMACAgUQcHJldkNoZWNrcG9pbnRBdAUMY3VycmVudEJsb2NrCQCVCgMFA25pbAUecHJldlVuaXRzUGVyVVNEQmFsYW5jZUludGVncmFsBSBwcmV2VW5pdHNQZXJSZWZlcmFsU2hhcmVJbnRlZ3JhbAQYdW5pdHNCYWxhbmNlVG9EaXN0cmlidXRlCQC8AgMJALgCAgkBFF9sb2FkVG90YWxVbml0c0ZvckxQAAUbcHJldlVuaXRzQmFsYW5jZURpc3RyaWJ1dGVkCQC4AgIFDGN1cnJlbnRCbG9jawUQcHJldkNoZWNrcG9pbnRBdAkAuAICCQEQX2xvYWRGaW5pc2hCbG9jawAFEHByZXZDaGVja3BvaW50QXQEGnVuaXRzUGVyVVNEQmFsYW5jZUludGVncmFsCQC3AgIJALoCAgkAuQICBQ5QRVJDRU5UX0ZBQ1RPUgUYdW5pdHNCYWxhbmNlVG9EaXN0cmlidXRlCQEUX2xvYWRUb3RhbFVTREJhbGFuY2UABR5wcmV2VW5pdHNQZXJVU0RCYWxhbmNlSW50ZWdyYWwEDSR0MDE3NzQ4MTgzMDEDCQC/AgIJARdfbG9hZFRvdGFsU2hhcmVzUmVmZXJhbAAFC1pFUk9fQklHSU5UBBJ1bml0c1NoYXJlc1JlZmVyYWwJALwCAwkAuAICCQEZX2xvYWRUb3RhbFVuaXRzRm9yUmVmZXJhbAAFFnByZXZVbml0c1NoYXJlc1JlZmVyYWwJALgCAgUMY3VycmVudEJsb2NrBRBwcmV2Q2hlY2twb2ludEF0CQC4AgIJARBfbG9hZEZpbmlzaEJsb2NrAAUQcHJldkNoZWNrcG9pbnRBdAQcdW5pdHNQZXJSZWZlcmFsU2hhcmVJbnRlZ3JhbAkAtwICCQC6AgIJALkCAgUOUEVSQ0VOVF9GQUNUT1IFEnVuaXRzU2hhcmVzUmVmZXJhbAkBF19sb2FkVG90YWxTaGFyZXNSZWZlcmFsAAUgcHJldlVuaXRzUGVyUmVmZXJhbFNoYXJlSW50ZWdyYWwJAJQKAgUSdW5pdHNTaGFyZXNSZWZlcmFsBRx1bml0c1BlclJlZmVyYWxTaGFyZUludGVncmFsCQCUCgIFC1pFUk9fQklHSU5UBQtaRVJPX0JJR0lOVAQSdW5pdHNTaGFyZXNSZWZlcmFsCAUNJHQwMTc3NDgxODMwMQJfMQQcdW5pdHNQZXJSZWZlcmFsU2hhcmVJbnRlZ3JhbAgFDSR0MDE3NzQ4MTgzMDECXzIJAJUKAwkAzggCCQDOCAIJAM4IAgkAzggCCQERX3NhdmVDaGVja3BvaW50QXQBBQxjdXJyZW50QmxvY2sJAR9fc2F2ZVVuaXRzUGVyVVNEQmFsYW5jZUludGVncmFsAQUadW5pdHNQZXJVU0RCYWxhbmNlSW50ZWdyYWwJARxfc2F2ZVVuaXRzQmFsYW5jZURpc3RyaWJ1dGVkAQkAtwICBRh1bml0c0JhbGFuY2VUb0Rpc3RyaWJ1dGUFG3ByZXZVbml0c0JhbGFuY2VEaXN0cmlidXRlZAkBIV9zYXZlVW5pdHNQZXJSZWZlcmFsU2hhcmVJbnRlZ3JhbAEFHHVuaXRzUGVyUmVmZXJhbFNoYXJlSW50ZWdyYWwJARdfc2F2ZVVuaXRzU2hhcmVzUmVmZXJhbAEJALcCAgUSdW5pdHNTaGFyZXNSZWZlcmFsBRZwcmV2VW5pdHNTaGFyZXNSZWZlcmFsBRp1bml0c1BlclVTREJhbGFuY2VJbnRlZ3JhbAUcdW5pdHNQZXJSZWZlcmFsU2hhcmVJbnRlZ3JhbAEPX3VzZXJDaGVja3BvaW50AwV1c2VyXw91c2VyVVNEQmFsYW5jZV8SdXNlclNoYXJlc1JlZmVyYWxfBA0kdDAxODg4NzE4OTk5CQELX2NoZWNrcG9pbnQABBFjaGVja3BvaW50QWN0aW9ucwgFDSR0MDE4ODg3MTg5OTkCXzEEGnVuaXRzUGVyVVNEQmFsYW5jZUludGVncmFsCAUNJHQwMTg4ODcxODk5OQJfMgQcdW5pdHNQZXJSZWZlcmFsU2hhcmVJbnRlZ3JhbAgFDSR0MDE4ODg3MTg5OTkCXzMEInByZXZVc2VyVW5pdHNQZXJVU0RCYWxhbmNlSW50ZWdyYWwJASNfbG9hZFVzZXJVbml0c1BlclVTREJhbGFuY2VJbnRlZ3JhbAEFBXVzZXJfBBRwcmV2VXNlckNoZWNrcG9pbnRBdAkAmAMBCQDMCAIJAQ9fbG9hZFN0YXJ0QmxvY2sACQDMCAIJARVfbG9hZFVzZXJDaGVja3BvaW50QXQBBQV1c2VyXwUDbmlsBB9wcmV2VXNlclVuaXRzQmFsYW5jZURpc3RyaWJ1dGVkCQEgX2xvYWRVc2VyVW5pdHNCYWxhbmNlRGlzdHJpYnV0ZWQBBQV1c2VyXwQkcHJldlVzZXJVbml0c1BlclJlZmVyYWxTaGFyZUludGVncmFsCQElX2xvYWRVc2VyVW5pdHNQZXJSZWZlcmFsU2hhcmVJbnRlZ3JhbAEFBXVzZXJfBBpwcmV2VXNlclVuaXRzU2hhcmVzUmVmZXJhbAkBG19sb2FkVXNlclVuaXRzU2hhcmVzUmVmZXJhbAEFBXVzZXJfBAxjdXJyZW50QmxvY2sJAJkDAQkAzAgCCQC2AgEFBmhlaWdodAkAzAgCCQEQX2xvYWRGaW5pc2hCbG9jawAFA25pbAMJAMACAgUUcHJldlVzZXJDaGVja3BvaW50QXQFDGN1cnJlbnRCbG9jawkAlQoDBRFjaGVja3BvaW50QWN0aW9ucwUfcHJldlVzZXJVbml0c0JhbGFuY2VEaXN0cmlidXRlZAUacHJldlVzZXJVbml0c1NoYXJlc1JlZmVyYWwEG3VzZXJVbml0c0JhbGFuY2VEaXN0cmlidXRlZAkAtwICCQC6AgIJALkCAgUPdXNlclVTREJhbGFuY2VfCQC4AgIFGnVuaXRzUGVyVVNEQmFsYW5jZUludGVncmFsBSJwcmV2VXNlclVuaXRzUGVyVVNEQmFsYW5jZUludGVncmFsBQ5QRVJDRU5UX0ZBQ1RPUgUfcHJldlVzZXJVbml0c0JhbGFuY2VEaXN0cmlidXRlZAQWdXNlclVuaXRzU2hhcmVzUmVmZXJhbAkAtwICCQC6AgIJALkCAgUSdXNlclNoYXJlc1JlZmVyYWxfCQC4AgIFHHVuaXRzUGVyUmVmZXJhbFNoYXJlSW50ZWdyYWwFJHByZXZVc2VyVW5pdHNQZXJSZWZlcmFsU2hhcmVJbnRlZ3JhbAUOUEVSQ0VOVF9GQUNUT1IFGnByZXZVc2VyVW5pdHNTaGFyZXNSZWZlcmFsCQCVCgMJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCBRFjaGVja3BvaW50QWN0aW9ucwkBFV9zYXZlVXNlckNoZWNrcG9pbnRBdAIFBXVzZXJfBQxjdXJyZW50QmxvY2sJASNfc2F2ZVVzZXJVbml0c1BlclVTREJhbGFuY2VJbnRlZ3JhbAIFBXVzZXJfBRp1bml0c1BlclVTREJhbGFuY2VJbnRlZ3JhbAkBIF9zYXZlVXNlclVuaXRzQmFsYW5jZURpc3RyaWJ1dGVkAgUFdXNlcl8FG3VzZXJVbml0c0JhbGFuY2VEaXN0cmlidXRlZAkBJV9zYXZlVXNlclVuaXRzUGVyUmVmZXJhbFNoYXJlSW50ZWdyYWwCBQV1c2VyXwUcdW5pdHNQZXJSZWZlcmFsU2hhcmVJbnRlZ3JhbAkBG19zYXZlVXNlclVuaXRzU2hhcmVzUmVmZXJhbAIFBXVzZXJfBRZ1c2VyVW5pdHNTaGFyZXNSZWZlcmFsBRt1c2VyVW5pdHNCYWxhbmNlRGlzdHJpYnV0ZWQFFnVzZXJVbml0c1NoYXJlc1JlZmVyYWwPAWkBBGluaXQECWV4ZWN1dG9yXwdvcmFjbGVfB3BhdXNlcl8Pc1dhdmVzQ29udHJhY3RfBANlcnIDAwMDAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBE193aGVuTm90SW5pdGlhbGl6ZWQABwkBEF93aGVuTXVsdGlzaWdTZXQABwkBEF92YWxpZGF0ZUFkZHJlc3MCBQlleGVjdXRvcl8CFmluaXQ6IGludmFsaWQgZXhlY3V0b3IHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFB29yYWNsZV8CFGluaXQ6IGludmFsaWQgb3JhY2xlBwkBEF92YWxpZGF0ZUFkZHJlc3MCBQdwYXVzZXJfAhRpbml0OiBpbnZhbGlkIHBhdXNlcgcJARBfdmFsaWRhdGVBZGRyZXNzAgUPc1dhdmVzQ29udHJhY3RfAhxpbml0OiBpbnZhbGlkIHNXYXZlc0NvbnRyYWN0BwMJAAACBQNlcnIFA2VycgkAlAoCCQDOCAIJAM4IAgkAzggCCQDOCAIJAQlfc2F2ZUluaXQBBgkBDV9zYXZlRXhlY3V0b3IBCQERQGV4dHJOYXRpdmUoMTA2MikBBQlleGVjdXRvcl8JAQtfc2F2ZU9yYWNsZQEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFB29yYWNsZV8JAQtfc2F2ZVBhdXNlcgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFB3BhdXNlcl8JARNfc2F2ZVNXYXZlc0NvbnRyYWN0AQkBEUBleHRyTmF0aXZlKDEwNjIpAQUPc1dhdmVzQ29udHJhY3RfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB2RlcG9zaXQFD2NhbGxlckNvbnRyYWN0XwdzZW5kZXJfBnRva2VuXwdhbW91bnRfCXJlZmVycmVyXwQGYW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQUHYW1vdW50XwIaZGVwb3NpdDogYW1vdW50IGlzIG5vdCBJbnQEA2VycgMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJARFfdmFsaWRhdGVFeGVjdXRvcgIIBQFpBmNhbGxlcgIZZGVwb3NpdDogaW52YWxpZCBleGVjdXRvcgcJAQ9fdmFsaWRhdGVDYWxsZXICBQ9jYWxsZXJDb250cmFjdF8CF2RlcG9zaXQ6IGludmFsaWQgY2FsbGVyBwkBDF92YWxpZGF0ZUludAQFBmFtb3VudAABBQdNQVhfSU5UAhdkZXBvc2l0OiBpbnZhbGlkIGFtb3VudAcDCQAAAgUDZXJyBQNlcnIEBHJhdGUJAQ1fZ2V0VG9rZW5SYXRlAQUGdG9rZW5fBA0kdDAyMTkyNjIyMDA4CQERX2xvYWRVc2VyUG9zaXRpb24CBQZ0b2tlbl8FB3NlbmRlcl8EEHVzZXJUb2tlbkJhbGFuY2UIBQ0kdDAyMTkyNjIyMDA4Al8xBBV1c2VyVG9rZW5CYWxhbmNlSW5VU0QIBQ0kdDAyMTkyNjIyMDA4Al8yBA51c2VyVVNEQmFsYW5jZQkBE19sb2FkVXNlclVTREJhbGFuY2UBBQdzZW5kZXJfBBF1c2VyU2hhcmVzUmVmZXJhbAkBFl9sb2FkVXNlclNoYXJlc1JlZmVyYWwBBQdzZW5kZXJfBA0kdDAyMjEyNzIyMjU0CQEPX3VzZXJDaGVja3BvaW50AwUHc2VuZGVyXwUOdXNlclVTREJhbGFuY2UFEXVzZXJTaGFyZXNSZWZlcmFsBBFjaGVja3BvaW50QWN0aW9ucwgFDSR0MDIyMTI3MjIyNTQCXzEEEHVzZXJVbml0c0JhbGFuY2UIBQ0kdDAyMjEyNzIyMjU0Al8yBBZ1c2VyVW5pdHNTaGFyZXNSZWZlcmFsCAUNJHQwMjIxMjcyMjI1NAJfMwQTbmV3VXNlclRva2VuQmFsYW5jZQkAtwICBRB1c2VyVG9rZW5CYWxhbmNlCQC2AgEFBmFtb3VudAQYbmV3VXNlclRva2VuQmFsYW5jZUluVVNECQC9AgQFE25ld1VzZXJUb2tlbkJhbGFuY2UFBHJhdGUFDlBFUkNFTlRfRkFDVE9SBQRET1dOBBFuZXdVc2VyVVNEQmFsYW5jZQkAtwICCQC4AgIFDnVzZXJVU0RCYWxhbmNlBRV1c2VyVG9rZW5CYWxhbmNlSW5VU0QFGG5ld1VzZXJUb2tlbkJhbGFuY2VJblVTRAQTdG90YWxCYWxhbmNlVXBkYXRlZAkAtwICCQC4AgIJARRfbG9hZFRvdGFsVVNEQmFsYW5jZQAFFXVzZXJUb2tlbkJhbGFuY2VJblVTRAUYbmV3VXNlclRva2VuQmFsYW5jZUluVVNEBAp1c2Vyc0NvdW50AwkAAAIFDnVzZXJVU0RCYWxhbmNlBQtaRVJPX0JJR0lOVAkAtwICCQEPX2xvYWRVc2Vyc0NvdW50AAUKT05FX0JJR0lOVAkBD19sb2FkVXNlcnNDb3VudAAEDnJlZmVyZXJBY3Rpb25zAwMJAGYCCQCxAgEFCXJlZmVycmVyXwAACQEWX2NoZWNrUmVmZXJlckV4aXN0ZW5jZQEFCXJlZmVycmVyXwcEDnJlZmVyZXJBZGRyZXNzCQEMX2xvYWRSZWZlcmVyAQUJcmVmZXJyZXJfBBJzaGFyZXNUb0Rpc3RyaWJ1dGUJAL0CBAkAtgIBBQZhbW91bnQFBHJhdGUFDlBFUkNFTlRfRkFDVE9SBQRET1dOBAxzaGFyZXNUb1VzZXIJAL0CBAUSc2hhcmVzVG9EaXN0cmlidXRlCQC2AgEAFAkAtgIBAGQFBERPV04ED3NoYXJlc1RvUmVmZXJlcgkAuAICBRJzaGFyZXNUb0Rpc3RyaWJ1dGUFDHNoYXJlc1RvVXNlcgQUbmV3VXNlclNoYXJlc1JlZmVyYWwJALcCAgURdXNlclNoYXJlc1JlZmVyYWwFDHNoYXJlc1RvVXNlcgQUcmVmZXJlclNoYXJlc1JlZmVyYWwJARZfbG9hZFVzZXJTaGFyZXNSZWZlcmFsAQUOcmVmZXJlckFkZHJlc3MEF25ld1JlZmVyZXJTaGFyZXNSZWZlcmFsCQC3AgIFFHJlZmVyZXJTaGFyZXNSZWZlcmFsBQ9zaGFyZXNUb1JlZmVyZXIEFW5ld1RvdGFsU2hhcmVzUmVmZXJhbAkAtwICCQEXX2xvYWRUb3RhbFNoYXJlc1JlZmVyYWwABRJzaGFyZXNUb0Rpc3RyaWJ1dGUEDSR0MDIzNTg3MjM3NTgJAQ9fdXNlckNoZWNrcG9pbnQDBQ5yZWZlcmVyQWRkcmVzcwkBE19sb2FkVXNlclVTREJhbGFuY2UBBQ5yZWZlcmVyQWRkcmVzcwUUcmVmZXJlclNoYXJlc1JlZmVyYWwEGHJlZmVyZXJDaGVja3BvaW50QWN0aW9ucwgFDSR0MDIzNTg3MjM3NTgCXzEEE3JlZmVyZXJVbml0c0JhbGFuY2UIBQ0kdDAyMzU4NzIzNzU4Al8yBBlyZWZlcmVyVW5pdHNTaGFyZXNSZWZlcmFsCAUNJHQwMjM1ODcyMzc1OAJfMwkAzggCCQDOCAIJAM4IAgUYcmVmZXJlckNoZWNrcG9pbnRBY3Rpb25zCQEWX3NhdmVVc2VyU2hhcmVzUmVmZXJhbAIFB3NlbmRlcl8FFG5ld1VzZXJTaGFyZXNSZWZlcmFsCQEWX3NhdmVVc2VyU2hhcmVzUmVmZXJhbAIFDnJlZmVyZXJBZGRyZXNzBRduZXdSZWZlcmVyU2hhcmVzUmVmZXJhbAkBF19zYXZlVG90YWxTaGFyZXNSZWZlcmFsAQUVbmV3VG90YWxTaGFyZXNSZWZlcmFsBQNuaWwJAJQKAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgURY2hlY2twb2ludEFjdGlvbnMFDnJlZmVyZXJBY3Rpb25zCQEUX3NhdmVUb3RhbFVTREJhbGFuY2UBBRN0b3RhbEJhbGFuY2VVcGRhdGVkCQERX3NhdmVUb2tlbkJhbGFuY2UCBQZ0b2tlbl8JALcCAgkBEV9sb2FkVG9rZW5CYWxhbmNlAQUGdG9rZW5fCQC2AgEFBmFtb3VudAkBE19zYXZlVXNlclVTREJhbGFuY2UCBQdzZW5kZXJfBRFuZXdVc2VyVVNEQmFsYW5jZQkBD19zYXZlVXNlcnNDb3VudAEFCnVzZXJzQ291bnQJARFfc2F2ZVVzZXJQb3NpdGlvbgMFBnRva2VuXwUHc2VuZGVyXwkAlAoCBRNuZXdVc2VyVG9rZW5CYWxhbmNlBRhuZXdVc2VyVG9rZW5CYWxhbmNlSW5VU0QFEHVzZXJVbml0c0JhbGFuY2UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEMZGVwb3NpdFdhdmVzAQlyZWZlcnJlcl8EA2VycgMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJARVfdmFsaWRhdGVQYXltZW50c1NpemUDCAUBaQhwYXltZW50cwABAhhkZXBvc2l0V2F2ZXM6IG5vIHBheW1lbnQHCQEVX3ZhbGlkYXRlV2F2ZXNQYXltZW50AgkAkQMCCAUBaQhwYXltZW50cwAAAhtkZXBvc2l0V2F2ZXM6IGludmFsaWQgYXNzZXQHCQEMX3ZhbGlkYXRlSW50BAkAaQIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AGQAAQUHTUFYX0lOVAIcZGVwb3NpdFdhdmVzOiBpbnZhbGlkIGFtb3VudAcDCQAAAgUDZXJyBQNlcnIEBmFtb3VudAkAaQIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AGQEBnNlbmRlcgkApQgBCAUBaQZjYWxsZXIEBXRva2VuBQVXQVZFUwQEcmF0ZQkBDV9nZXRUb2tlblJhdGUBBQV0b2tlbgQNJHQwMjY2MzMyNjcxMwkBEV9sb2FkVXNlclBvc2l0aW9uAgUFdG9rZW4FBnNlbmRlcgQQdXNlclRva2VuQmFsYW5jZQgFDSR0MDI2NjMzMjY3MTMCXzEEFXVzZXJUb2tlbkJhbGFuY2VJblVTRAgFDSR0MDI2NjMzMjY3MTMCXzIEDnVzZXJVU0RCYWxhbmNlCQETX2xvYWRVc2VyVVNEQmFsYW5jZQEFBnNlbmRlcgQRdXNlclNoYXJlc1JlZmVyYWwJARZfbG9hZFVzZXJTaGFyZXNSZWZlcmFsAQUGc2VuZGVyBA0kdDAyNjgzMDI2OTU2CQEPX3VzZXJDaGVja3BvaW50AwUGc2VuZGVyBQ51c2VyVVNEQmFsYW5jZQURdXNlclNoYXJlc1JlZmVyYWwEEWNoZWNrcG9pbnRBY3Rpb25zCAUNJHQwMjY4MzAyNjk1NgJfMQQQdXNlclVuaXRzQmFsYW5jZQgFDSR0MDI2ODMwMjY5NTYCXzIEFnVzZXJVbml0c1NoYXJlc1JlZmVyYWwIBQ0kdDAyNjgzMDI2OTU2Al8zBBNuZXdVc2VyVG9rZW5CYWxhbmNlCQC3AgIFEHVzZXJUb2tlbkJhbGFuY2UJALYCAQUGYW1vdW50BBhuZXdVc2VyVG9rZW5CYWxhbmNlSW5VU0QJAL0CBAUTbmV3VXNlclRva2VuQmFsYW5jZQUEcmF0ZQUOUEVSQ0VOVF9GQUNUT1IFBERPV04EEW5ld1VzZXJVU0RCYWxhbmNlCQC3AgIJALgCAgUOdXNlclVTREJhbGFuY2UFFXVzZXJUb2tlbkJhbGFuY2VJblVTRAUYbmV3VXNlclRva2VuQmFsYW5jZUluVVNEBBN0b3RhbEJhbGFuY2VVcGRhdGVkCQC3AgIJALgCAgkBFF9sb2FkVG90YWxVU0RCYWxhbmNlAAUVdXNlclRva2VuQmFsYW5jZUluVVNEBRhuZXdVc2VyVG9rZW5CYWxhbmNlSW5VU0QECnVzZXJzQ291bnQDCQAAAgUOdXNlclVTREJhbGFuY2UFC1pFUk9fQklHSU5UCQC3AgIJAQ9fbG9hZFVzZXJzQ291bnQABQpPTkVfQklHSU5UCQEPX2xvYWRVc2Vyc0NvdW50AAQOcmVmZXJlckFjdGlvbnMDAwkAZgIJALECAQUJcmVmZXJyZXJfAAAJARZfY2hlY2tSZWZlcmVyRXhpc3RlbmNlAQUJcmVmZXJyZXJfBwQOcmVmZXJlckFkZHJlc3MJAQxfbG9hZFJlZmVyZXIBBQlyZWZlcnJlcl8EEnNoYXJlc1RvRGlzdHJpYnV0ZQkAvQIECQC2AgEFBmFtb3VudAUEcmF0ZQUOUEVSQ0VOVF9GQUNUT1IFBERPV04EDHNoYXJlc1RvVXNlcgkAvQIEBRJzaGFyZXNUb0Rpc3RyaWJ1dGUJALYCAQAUCQC2AgEAZAUERE9XTgQPc2hhcmVzVG9SZWZlcmVyCQC4AgIFEnNoYXJlc1RvRGlzdHJpYnV0ZQUMc2hhcmVzVG9Vc2VyBBRuZXdVc2VyU2hhcmVzUmVmZXJhbAkAtwICBRF1c2VyU2hhcmVzUmVmZXJhbAUMc2hhcmVzVG9Vc2VyBBRyZWZlcmVyU2hhcmVzUmVmZXJhbAkBFl9sb2FkVXNlclNoYXJlc1JlZmVyYWwBBQ5yZWZlcmVyQWRkcmVzcwQXbmV3UmVmZXJlclNoYXJlc1JlZmVyYWwJALcCAgUUcmVmZXJlclNoYXJlc1JlZmVyYWwFD3NoYXJlc1RvUmVmZXJlcgQVbmV3VG90YWxTaGFyZXNSZWZlcmFsCQC3AgIJARdfbG9hZFRvdGFsU2hhcmVzUmVmZXJhbAAFEnNoYXJlc1RvRGlzdHJpYnV0ZQQNJHQwMjgyODkyODQ2MAkBD191c2VyQ2hlY2twb2ludAMFDnJlZmVyZXJBZGRyZXNzCQETX2xvYWRVc2VyVVNEQmFsYW5jZQEFDnJlZmVyZXJBZGRyZXNzBRRyZWZlcmVyU2hhcmVzUmVmZXJhbAQYcmVmZXJlckNoZWNrcG9pbnRBY3Rpb25zCAUNJHQwMjgyODkyODQ2MAJfMQQTcmVmZXJlclVuaXRzQmFsYW5jZQgFDSR0MDI4Mjg5Mjg0NjACXzIEGXJlZmVyZXJVbml0c1NoYXJlc1JlZmVyYWwIBQ0kdDAyODI4OTI4NDYwAl8zCQDOCAIJAM4IAgkAzggCBRhyZWZlcmVyQ2hlY2twb2ludEFjdGlvbnMJARZfc2F2ZVVzZXJTaGFyZXNSZWZlcmFsAgUGc2VuZGVyBRRuZXdVc2VyU2hhcmVzUmVmZXJhbAkBFl9zYXZlVXNlclNoYXJlc1JlZmVyYWwCBQ5yZWZlcmVyQWRkcmVzcwUXbmV3UmVmZXJlclNoYXJlc1JlZmVyYWwJARdfc2F2ZVRvdGFsU2hhcmVzUmVmZXJhbAEFFW5ld1RvdGFsU2hhcmVzUmVmZXJhbAUDbmlsBAppbnZvY2F0aW9uCQD8BwQJARNfbG9hZFNXYXZlc0NvbnRyYWN0AAUMRlVOQ19ERVBPU0lUBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFBHVuaXQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQNuaWwDCQAAAgUKaW52b2NhdGlvbgUKaW52b2NhdGlvbgkAlAoCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCBRFjaGVja3BvaW50QWN0aW9ucwUOcmVmZXJlckFjdGlvbnMJARRfc2F2ZVRvdGFsVVNEQmFsYW5jZQEFE3RvdGFsQmFsYW5jZVVwZGF0ZWQJARFfc2F2ZVRva2VuQmFsYW5jZQIFBVdBVkVTCQC3AgIJARFfbG9hZFRva2VuQmFsYW5jZQEFBVdBVkVTCQC2AgEFBmFtb3VudAkBE19zYXZlVXNlclVTREJhbGFuY2UCBQZzZW5kZXIFEW5ld1VzZXJVU0RCYWxhbmNlCQEPX3NhdmVVc2Vyc0NvdW50AQUKdXNlcnNDb3VudAkBEV9zYXZlVXNlclBvc2l0aW9uAwUFdG9rZW4FBnNlbmRlcgkAlAoCBRNuZXdVc2VyVG9rZW5CYWxhbmNlBRhuZXdVc2VyVG9rZW5CYWxhbmNlSW5VU0QFEHVzZXJVbml0c0JhbGFuY2UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENd2l0aGRyYXdXYXZlcwEHYW1vdW50XwQDZXJyAwMDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHCQEMX3ZhbGlkYXRlSW50BAkAaQIFB2Ftb3VudF8AZAABBQdNQVhfSU5UAh13aXRoZHJhd1dhdmVzOiBpbnZhbGlkIGFtb3VudAcDCQDAAgIJARBfbG9hZEZpbmlzaEJsb2NrAAkAtgIBBQZoZWlnaHQJAAIBAhp3aXRoZHJhd1dhdmVzOiBub3QgYWxsb3dlZAYHAwkAAAIFA2VycgUDZXJyBA5pbnRlcm5hbEFtb3VudAkAaQIFB2Ftb3VudF8AZAQGc2VuZGVyCQClCAEIBQFpBmNhbGxlcgQFdG9rZW4FBVdBVkVTBARyYXRlCQENX2dldFRva2VuUmF0ZQEFBXRva2VuBA0kdDAyOTcyODI5ODA4CQERX2xvYWRVc2VyUG9zaXRpb24CBQV0b2tlbgUGc2VuZGVyBBB1c2VyVG9rZW5CYWxhbmNlCAUNJHQwMjk3MjgyOTgwOAJfMQQVdXNlclRva2VuQmFsYW5jZUluVVNECAUNJHQwMjk3MjgyOTgwOAJfMgQOdXNlclVTREJhbGFuY2UJARNfbG9hZFVzZXJVU0RCYWxhbmNlAQUGc2VuZGVyBBF1c2VyU2hhcmVzUmVmZXJhbAkBFl9sb2FkVXNlclNoYXJlc1JlZmVyYWwBBQZzZW5kZXIEDSR0MDI5OTI1MzAwNTEJAQ9fdXNlckNoZWNrcG9pbnQDBQZzZW5kZXIFDnVzZXJVU0RCYWxhbmNlBRF1c2VyU2hhcmVzUmVmZXJhbAQRY2hlY2twb2ludEFjdGlvbnMIBQ0kdDAyOTkyNTMwMDUxAl8xBBB1c2VyVW5pdHNCYWxhbmNlCAUNJHQwMjk5MjUzMDA1MQJfMgQWdXNlclVuaXRzU2hhcmVzUmVmZXJhbAgFDSR0MDI5OTI1MzAwNTECXzMEE25ld1VzZXJUb2tlbkJhbGFuY2UJALgCAgUQdXNlclRva2VuQmFsYW5jZQkAtgIBBQ5pbnRlcm5hbEFtb3VudAQEZXJyMQkBDF92YWxpZGF0ZUludAQJAKADAQUTbmV3VXNlclRva2VuQmFsYW5jZQAABQdNQVhfSU5UAih3aXRoZHJhd1dhdmVzOiBpbnN1ZmZpY2llbnQgdG9rZW4gYW1vdW50AwkAAAIFBGVycjEFBGVycjEEGG5ld1VzZXJUb2tlbkJhbGFuY2VJblVTRAkAvQIEBRNuZXdVc2VyVG9rZW5CYWxhbmNlBQRyYXRlBQ5QRVJDRU5UX0ZBQ1RPUgUERE9XTgQRbmV3VXNlclVTREJhbGFuY2UJALcCAgkAuAICBQ51c2VyVVNEQmFsYW5jZQUVdXNlclRva2VuQmFsYW5jZUluVVNEBRhuZXdVc2VyVG9rZW5CYWxhbmNlSW5VU0QEE3RvdGFsQmFsYW5jZVVwZGF0ZWQJALcCAgkAuAICCQEUX2xvYWRUb3RhbFVTREJhbGFuY2UABRV1c2VyVG9rZW5CYWxhbmNlSW5VU0QFGG5ld1VzZXJUb2tlbkJhbGFuY2VJblVTRAQOc1dhdmVzQ29udHJhY3QJARNfbG9hZFNXYXZlc0NvbnRyYWN0AAQLc1dhdmVzQXNzZXQJARBfbG9hZFNXYXZlc0Fzc2V0AQUOc1dhdmVzQ29udHJhY3QECmludm9jYXRpb24JAPwHBAUOc1dhdmVzQ29udHJhY3QFDUZVTkNfR0VUX1JBVEUFA25pbAUDbmlsBApzd2F2ZXNSYXRlBAckbWF0Y2gwBQppbnZvY2F0aW9uAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkApwMBBQFhCQACAQImd2l0aGRyYXdXYXZlczogc1dhdmVzIGdldFJhdGUoKSByZXZlcnQEEHNXYXZlc1RvV2l0aGRyYXcJAKADAQkAvQIECQC2AgEFB2Ftb3VudF8FElNXQVZFU19SQVRFX0ZBQ1RPUgUKc3dhdmVzUmF0ZQUHQ0VJTElORwQLaW52b2NhdGlvbjEJAPwHBAUOc1dhdmVzQ29udHJhY3QFDUZVTkNfV0lUSERSQVcFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgULc1dhdmVzQXNzZXQFEHNXYXZlc1RvV2l0aGRyYXcFA25pbAMJAAACBQtpbnZvY2F0aW9uMQULaW52b2NhdGlvbjEJAJQKAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQdhbW91bnRfBQR1bml0BQNuaWwFEWNoZWNrcG9pbnRBY3Rpb25zCQEUX3NhdmVUb3RhbFVTREJhbGFuY2UBBRN0b3RhbEJhbGFuY2VVcGRhdGVkCQERX3NhdmVUb2tlbkJhbGFuY2UCBQVXQVZFUwkAuAICCQERX2xvYWRUb2tlbkJhbGFuY2UBBQVXQVZFUwkAtgIBBQ5pbnRlcm5hbEFtb3VudAkBE19zYXZlVXNlclVTREJhbGFuY2UCBQZzZW5kZXIFEW5ld1VzZXJVU0RCYWxhbmNlCQERX3NhdmVVc2VyUG9zaXRpb24DBQV0b2tlbgUGc2VuZGVyCQCUCgIFE25ld1VzZXJUb2tlbkJhbGFuY2UFGG5ld1VzZXJUb2tlbkJhbGFuY2VJblVTRAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5zdGFydFJldHJvZHJvcAQLdW5pdHNBc3NldF8MYW1vdW50Rm9yTFBfEWFtb3VudEZvclJlZmVyYWxfCWJsb2Nrc0F0XwQDZXJyAwMDAwMDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQEOX3doZW5Ob3RQYXVzZWQABwkBDl92YWxpZGF0ZUFzc2V0AgULdW5pdHNBc3NldF8CI3N0YXJ0UmV0cm9kcm9wOiBpbnZhbGlkIHVuaXRzIGFzc2V0BwkBDF92YWxpZGF0ZUludAQFDGFtb3VudEZvckxQXwAABQdNQVhfSU5UAiNzdGFydFJldHJvZHJvcDogaW52YWxpZCBhbW91bnRGb3JMUAcJAQxfdmFsaWRhdGVJbnQEBRFhbW91bnRGb3JSZWZlcmFsXwAABQdNQVhfSU5UAihzdGFydFJldHJvZHJvcDogaW52YWxpZCBhbW91bnRGb3JSZWZlcmFsBwkBDF92YWxpZGF0ZUludAQFCWJsb2Nrc0F0XwABBQdNQVhfSU5UAiBzdGFydFJldHJvZHJvcDogaW52YWxpZCBibG9ja3NBdAcJARFfdmFsaWRhdGVFcUJpZ0ludAMJAQ9fbG9hZFN0YXJ0QmxvY2sABQtaRVJPX0JJR0lOVAIfc3RhcnRSZXRyb2Ryb3A6IGFscmVhZHkgc3RhcnRlZAcDCQAAAgUDZXJyBQNlcnIEC3N0YXJ0SGVpZ2h0CQC2AgEFBmhlaWdodAQMZmluaXNoSGVpZ2h0CQC3AgIFC3N0YXJ0SGVpZ2h0CQC2AgEFCWJsb2Nrc0F0XwQEZXJyMQMJAGYCCQBkAgUMYW1vdW50Rm9yTFBfBRFhbW91bnRGb3JSZWZlcmFsXwkA8AcCBQR0aGlzCQDZBAEFC3VuaXRzQXNzZXRfCQACAQIic3RhcnRSZXRyb2Ryb3A6IGluc3VmZmljaWVudCBmdW5kcwYDCQAAAgUEZXJyMQUEZXJyMQkAlAoCCQDOCAIJAM4IAgkAzggCCQDOCAIJAQ9fc2F2ZVVuaXRzQXNzZXQBCQDZBAEFC3VuaXRzQXNzZXRfCQEPX3NhdmVTdGFydEJsb2NrAQULc3RhcnRIZWlnaHQJARBfc2F2ZUZpbmlzaEJsb2NrAQUMZmluaXNoSGVpZ2h0CQEUX3NhdmVUb3RhbFVuaXRzRm9yTFABCQC2AgEFDGFtb3VudEZvckxQXwkBGV9zYXZlVG90YWxVbml0c0ZvclJlZmVyYWwBCQC2AgEFEWFtb3VudEZvclJlZmVyYWxfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBE2luY3JlYXNlVW5pdHNTdXBwbHkCDGFtb3VudEZvckxQXxFhbW91bnRGb3JSZWZlcmFsXwQDZXJyAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBDF92YWxpZGF0ZUludAQFDGFtb3VudEZvckxQXwAABQdNQVhfSU5UAihpbmNyZWFzZVVuaXRzU3VwcGx5OiBpbnZhbGlkIGFtb3VudEZvckxQBwkBDF92YWxpZGF0ZUludAQFEWFtb3VudEZvclJlZmVyYWxfAAAFB01BWF9JTlQCLWluY3JlYXNlVW5pdHNTdXBwbHk6IGludmFsaWQgYW1vdW50Rm9yUmVmZXJhbAcJAQ9fdmFsaWRhdGVCaWdJbnQECQC2AgEFBmhlaWdodAkAtwICCQEPX2xvYWRTdGFydEJsb2NrAAUKT05FX0JJR0lOVAkAuAICCQEQX2xvYWRGaW5pc2hCbG9jawAFCk9ORV9CSUdJTlQCJGluY3JlYXNlVW5pdHNTdXBwbHk6IGRyb3Agbm90IGFjdGl2ZQcDCQAAAgUDZXJyBQNlcnIEDm5ld0Ftb3VudEZvckxQCQC3AgIJARRfbG9hZFRvdGFsVW5pdHNGb3JMUAAJALYCAQUMYW1vdW50Rm9yTFBfBBNuZXdBbW91bnRGb3JSZWZlcmFsCQC3AgIJARlfbG9hZFRvdGFsVW5pdHNGb3JSZWZlcmFsAAkAtgIBBRFhbW91bnRGb3JSZWZlcmFsXwQEZXJyMQMJAL8CAgkAtwICBQ5uZXdBbW91bnRGb3JMUAUTbmV3QW1vdW50Rm9yUmVmZXJhbAkAtgIBCQDwBwIFBHRoaXMJAQ9fbG9hZFVuaXRzQXNzZXQACQACAQInaW5jcmVhc2VVbml0c1N1cHBseTogaW5zdWZmaWNpZW50IGZ1bmRzBgMJAAACBQRlcnIxBQRlcnIxCQCUCgIJAM4IAgkBFF9zYXZlVG90YWxVbml0c0ZvckxQAQUObmV3QW1vdW50Rm9yTFAJARlfc2F2ZVRvdGFsVW5pdHNGb3JSZWZlcmFsAQUTbmV3QW1vdW50Rm9yUmVmZXJhbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpjaGVja3BvaW50AQV1c2VyXwQNJHQwMzM4MjAzMzk1OQkBD191c2VyQ2hlY2twb2ludAMFBXVzZXJfCQETX2xvYWRVc2VyVVNEQmFsYW5jZQEFBXVzZXJfCQEWX2xvYWRVc2VyU2hhcmVzUmVmZXJhbAEFBXVzZXJfBAdhY3Rpb25zCAUNJHQwMzM4MjAzMzk1OQJfMQQQdXNlclVuaXRzQmFsYW5jZQgFDSR0MDMzODIwMzM5NTkCXzIEFnVzZXJVbml0c1NoYXJlc1JlZmVyYWwIBQ0kdDAzMzgyMDMzOTU5Al8zCQCUCgIFB2FjdGlvbnMJAJQKAgUQdXNlclVuaXRzQmFsYW5jZQUWdXNlclVuaXRzU2hhcmVzUmVmZXJhbAFpAQhnZXRVbml0cwEFdXNlcl8EDSR0MDM0MDcyMzQyMTEJAQ9fdXNlckNoZWNrcG9pbnQDBQV1c2VyXwkBE19sb2FkVXNlclVTREJhbGFuY2UBBQV1c2VyXwkBFl9sb2FkVXNlclNoYXJlc1JlZmVyYWwBBQV1c2VyXwQHYWN0aW9ucwgFDSR0MDM0MDcyMzQyMTECXzEEEHVzZXJVbml0c0JhbGFuY2UIBQ0kdDAzNDA3MjM0MjExAl8yBBZ1c2VyVW5pdHNTaGFyZXNSZWZlcmFsCAUNJHQwMzQwNzIzNDIxMQJfMwkAlAoCBQNuaWwJAJQKAgUQdXNlclVuaXRzQmFsYW5jZQUWdXNlclVuaXRzU2hhcmVzUmVmZXJhbAFpAQpzZXRSZWZlcmVyAgljb2RlaGFzaF8IYWRkcmVzc18EA2VycgMJAQxfb25seU1hbmFnZXIBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBDF9zYXZlUmVmZXJlcgIFCWNvZGVoYXNoXwUIYWRkcmVzc18FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKc2V0TWFuYWdlcgEIbWFuYWdlcl8EA2VycgMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJARBfdmFsaWRhdGVBZGRyZXNzAgUIbWFuYWdlcl8CG3NldE1hbmFnZXI6IGludmFsaWQgbWFuYWdlcgcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBDF9zYXZlTWFuYWdlcgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCG1hbmFnZXJfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFHVwZGF0ZUNhbGxlckNvbnRyYWN0AQ9jYWxsZXJDb250cmFjdF8EA2VycgMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwMJAAACBQNlcnIFA2VycgkAlAoCCQETX3NhdmVDYWxsZXJDb250cmFjdAEFD2NhbGxlckNvbnRyYWN0XwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVwYXVzZQAEA2VycgMDCQELX29ubHlQYXVzZXIBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJAQ5fd2hlbk5vdFBhdXNlZAAHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQpfc2F2ZVBhdXNlAQYFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHdW5wYXVzZQAEA2VycgMDCQELX29ubHlQYXVzZXIBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJAQtfd2hlblBhdXNlZAAHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQpfc2F2ZVBhdXNlAQcFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEMdXBkYXRlUGF1c2VyAQdwYXVzZXJfBANlcnIDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFB3BhdXNlcl8CHHVwZGF0ZVBhdXNlcjogaW52YWxpZCBwYXVzZXIHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQtfc2F2ZVBhdXNlcgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFB3BhdXNlcl8FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELc2V0TXVsdGlzaWcBCW11bHRpc2lnXwQDZXJyAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3ZhbGlkYXRlQWRkcmVzcwIFCW11bHRpc2lnXwIdc2V0TXVsdGlzaWc6IGludmFsaWQgbXVsdGlzaWcHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQ1fc2F2ZU11bHRpc2lnAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUJbXVsdGlzaWdfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQHJG1hdGNoMAkAoggBBQxLRVlfTVVMVElTSUcDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAhtdWx0aXNpZwUHJG1hdGNoMAkBC3ZhbHVlT3JFbHNlAgkAmwgCCQERQGV4dHJOYXRpdmUoMTA2MikBBQhtdWx0aXNpZwkAuQkCCQDMCAIFCktFWV9TVEFUVVMJAMwIAgkApQgBBQR0aGlzCQDMCAIJANgEAQgFAnR4AmlkBQNuaWwFCVNFUEFSQVRPUgcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXk6QwYV", "height": 2968651, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: CgH4buDCd78U4f4CW2aVuTYT8RwtVwUhVKDNTGwy3BNy Next: none Diff:
Old | New | Differences | |
---|---|---|---|
647 | 647 | else false) | |
648 | 648 | then _validateCaller(callerContract_, "deposit: invalid caller") | |
649 | 649 | else false) | |
650 | - | then _validateInt(amount, | |
650 | + | then _validateInt(amount, 1, MAX_INT, "deposit: invalid amount") | |
651 | 651 | else false | |
652 | 652 | if ((err == err)) | |
653 | 653 | then { | |
703 | 703 | else false) | |
704 | 704 | then _validateWavesPayment(i.payments[0], "depositWaves: invalid asset") | |
705 | 705 | else false) | |
706 | - | then _validateInt((i.payments[0].amount / 100), | |
706 | + | then _validateInt((i.payments[0].amount / 100), 1, MAX_INT, "depositWaves: invalid amount") | |
707 | 707 | else false | |
708 | 708 | if ((err == err)) | |
709 | 709 | then { | |
761 | 761 | let err = if (if (if (_whenInitialized()) | |
762 | 762 | then _whenNotPaused() | |
763 | 763 | else false) | |
764 | - | then _validateInt((amount_ / 100), | |
764 | + | then _validateInt((amount_ / 100), 1, MAX_INT, "withdrawWaves: invalid amount") | |
765 | 765 | else false) | |
766 | 766 | then if ((_loadFinishBlock() >= toBigInt(height))) | |
767 | 767 | then throw("withdrawWaves: not allowed") |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let SEPARATOR = "__" | |
5 | 5 | ||
6 | 6 | let WAVES = "WAVES" | |
7 | 7 | ||
8 | 8 | let KEY_MULTISIG = "MULTISIG" | |
9 | 9 | ||
10 | 10 | let KEY_STATUS = "STATUS" | |
11 | 11 | ||
12 | 12 | let KEY_INIT = "INIT" | |
13 | 13 | ||
14 | 14 | let KEY_PAUSED = "PAUSED" | |
15 | 15 | ||
16 | 16 | let KEY_PAUSER = "PAUSER" | |
17 | 17 | ||
18 | 18 | let KEY_MANAGER = "MANAGER" | |
19 | 19 | ||
20 | 20 | let KEY_REFERER = "REFERER" | |
21 | 21 | ||
22 | 22 | let KEY_EXECUTOR = "EXECUTOR" | |
23 | 23 | ||
24 | 24 | let KEY_ORACLE = "ORACLE" | |
25 | 25 | ||
26 | 26 | let KEY_CALLER_CONTRACT = "CALLER_CONTRACT" | |
27 | 27 | ||
28 | 28 | let KEY_PRICE = "PRICE" | |
29 | 29 | ||
30 | 30 | let KEY_UNITS_ASSET = "UNITS_ASSET" | |
31 | 31 | ||
32 | 32 | let KEY_USER_POSITION = "USER_POSITION" | |
33 | 33 | ||
34 | 34 | let KEY_USER_USD_BALANCE = "USER_USD_BALANCE" | |
35 | 35 | ||
36 | 36 | let KEY_USER_UNITS_PER_USD_BALANCE_INTEGRAL = "USER_UNITS_PER_USD_BALANCE_INTEGRAL" | |
37 | 37 | ||
38 | 38 | let KEY_USER_UNITS_PER_REFERAL_SHARE_INTEGRAL = "USER_UNITS_PER_REFERAL_SHARE_INTEGRAL" | |
39 | 39 | ||
40 | 40 | let KEY_USER_CHECKPOINT_AT = "USER_CHECKPOINT_AT" | |
41 | 41 | ||
42 | 42 | let KEY_USER_UNITS_BALANCE_DISTRIBUTED = "USER_UNITS_BALANCE_DISTRIBUTED" | |
43 | 43 | ||
44 | 44 | let KEY_USER_UNITS_SHARES_REFERAL = "USER_UNITS_SHARES_REFERAL" | |
45 | 45 | ||
46 | 46 | let KEY_USER_SHARES_REFERAL = "USER_SHARES_REFERAL" | |
47 | 47 | ||
48 | 48 | let KEY_START_BLOCK = "START_BLOCK" | |
49 | 49 | ||
50 | 50 | let KEY_FINISH_BLOCK = "FINISH_BLOCK" | |
51 | 51 | ||
52 | 52 | let KEY_TOTAL_UNITS_FOR_LP = "TOTAL_UNITS_FOR_LP" | |
53 | 53 | ||
54 | 54 | let KEY_TOTAL_UNITS_FOR_REFERAL = "TOTAL_UNITS_FOR_REFERAL" | |
55 | 55 | ||
56 | 56 | let KEY_TOTAL_USD_BALANCE = "TOTAL_USD_BALANCE" | |
57 | 57 | ||
58 | 58 | let KEY_UNITS_PER_USD_BALANCE_INTEGRAL = "UNITS_PER_USD_BALANCE_INTEGRAL" | |
59 | 59 | ||
60 | 60 | let KEY_CHECKPOINT_AT = "CHECKPOINT_AT" | |
61 | 61 | ||
62 | 62 | let KEY_UNITS_BALANCE_DISTRIBUTED = "UNITS_BALANCE_DISTRIBUTED" | |
63 | 63 | ||
64 | 64 | let KEY_TOKEN_BALANCE = "TOKEN_BALANCE" | |
65 | 65 | ||
66 | 66 | let KEY_USERS_COUNT = "USERS_COUNT" | |
67 | 67 | ||
68 | 68 | let KEY_UNITS_PER_REFERAL_SHARE_INTEGRAL = "UNITS_PER_REFERAL_SHARE_INTEGRAL" | |
69 | 69 | ||
70 | 70 | let KEY_UNITS_SHARES_REFERAL = "UNITS_SHARES_REFERAL" | |
71 | 71 | ||
72 | 72 | let KEY_TOTAL_SHARES_REFERAL = "TOTAL_SHARES_REFERAL" | |
73 | 73 | ||
74 | 74 | let KEY_SWAVES_CONTRACT = "SWAVES_CONTRACT" | |
75 | 75 | ||
76 | 76 | let KEY_SWAVES_ASSET = "ASSET" | |
77 | 77 | ||
78 | 78 | let FUNC_DEPOSIT = "deposit" | |
79 | 79 | ||
80 | 80 | let FUNC_GET_RATE = "getRate" | |
81 | 81 | ||
82 | 82 | let FUNC_WITHDRAW = "withdraw" | |
83 | 83 | ||
84 | 84 | let MAX_INT = 9223372036854775807 | |
85 | 85 | ||
86 | 86 | let PERCENT_FACTOR = toBigInt(1000000000000) | |
87 | 87 | ||
88 | 88 | let ZERO_BIGINT = toBigInt(0) | |
89 | 89 | ||
90 | 90 | let ONE_BIGINT = toBigInt(1) | |
91 | 91 | ||
92 | 92 | let SWAVES_RATE_FACTOR = toBigInt(1000000000000) | |
93 | 93 | ||
94 | 94 | func _validateAddress (address_,err_) = match addressFromString(address_) { | |
95 | 95 | case a: Address => | |
96 | 96 | true | |
97 | 97 | case _ => | |
98 | 98 | throw(err_) | |
99 | 99 | } | |
100 | 100 | ||
101 | 101 | ||
102 | 102 | func _validateInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_)) | |
103 | 103 | then true | |
104 | 104 | else (val_ > upperBoundary_)) | |
105 | 105 | then throw(err_) | |
106 | 106 | else true | |
107 | 107 | ||
108 | 108 | ||
109 | 109 | func _validateBigInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_)) | |
110 | 110 | then true | |
111 | 111 | else (val_ > upperBoundary_)) | |
112 | 112 | then throw(err_) | |
113 | 113 | else true | |
114 | 114 | ||
115 | 115 | ||
116 | 116 | func _validatePaymentsSize (payments_,target_,err_) = if ((size(payments_) != target_)) | |
117 | 117 | then throw(err_) | |
118 | 118 | else true | |
119 | 119 | ||
120 | 120 | ||
121 | 121 | func _validateWavesPayment (payment_,err_) = match payment_.assetId { | |
122 | 122 | case a: ByteVector => | |
123 | 123 | throw(err_) | |
124 | 124 | case _: Unit => | |
125 | 125 | true | |
126 | 126 | case _ => | |
127 | 127 | throw("Match error") | |
128 | 128 | } | |
129 | 129 | ||
130 | 130 | ||
131 | 131 | func _validateEqBigInt (val1_,val2_,err_) = if ((val1_ != val2_)) | |
132 | 132 | then throw(err_) | |
133 | 133 | else true | |
134 | 134 | ||
135 | 135 | ||
136 | 136 | func _validateAsset (asset_,err_) = match assetInfo(fromBase58String(asset_)) { | |
137 | 137 | case a: Asset => | |
138 | 138 | true | |
139 | 139 | case _ => | |
140 | 140 | throw(err_) | |
141 | 141 | } | |
142 | 142 | ||
143 | 143 | ||
144 | 144 | func _loadInit () = match getBoolean(KEY_INIT) { | |
145 | 145 | case a: Boolean => | |
146 | 146 | a | |
147 | 147 | case _ => | |
148 | 148 | false | |
149 | 149 | } | |
150 | 150 | ||
151 | 151 | ||
152 | 152 | func _saveInit (isInit_) = [BooleanEntry(KEY_INIT, isInit_)] | |
153 | 153 | ||
154 | 154 | ||
155 | 155 | func _loadPause () = match getBoolean(KEY_PAUSED) { | |
156 | 156 | case a: Boolean => | |
157 | 157 | a | |
158 | 158 | case _ => | |
159 | 159 | false | |
160 | 160 | } | |
161 | 161 | ||
162 | 162 | ||
163 | 163 | func _savePause (isPaused_) = [BooleanEntry(KEY_PAUSED, isPaused_)] | |
164 | 164 | ||
165 | 165 | ||
166 | 166 | func _loadPauser () = match getString(KEY_PAUSER) { | |
167 | 167 | case a: String => | |
168 | 168 | addressFromStringValue(a) | |
169 | 169 | case _ => | |
170 | 170 | Address(base58'') | |
171 | 171 | } | |
172 | 172 | ||
173 | 173 | ||
174 | 174 | func _savePauser (pauser_) = [StringEntry(KEY_PAUSER, toString(pauser_))] | |
175 | 175 | ||
176 | 176 | ||
177 | 177 | func _loadMultisig () = match getString(KEY_MULTISIG) { | |
178 | 178 | case a: String => | |
179 | 179 | addressFromStringValue(a) | |
180 | 180 | case _ => | |
181 | 181 | Address(base58'') | |
182 | 182 | } | |
183 | 183 | ||
184 | 184 | ||
185 | 185 | func _saveMultisig (multisig_) = [StringEntry(KEY_MULTISIG, toString(multisig_))] | |
186 | 186 | ||
187 | 187 | ||
188 | 188 | func _loadExecutor () = match getString(KEY_EXECUTOR) { | |
189 | 189 | case a: String => | |
190 | 190 | addressFromStringValue(a) | |
191 | 191 | case _ => | |
192 | 192 | Address(base58'') | |
193 | 193 | } | |
194 | 194 | ||
195 | 195 | ||
196 | 196 | func _saveExecutor (executor_) = [StringEntry(KEY_EXECUTOR, toString(executor_))] | |
197 | 197 | ||
198 | 198 | ||
199 | 199 | func _loadOracle () = match getString(KEY_ORACLE) { | |
200 | 200 | case a: String => | |
201 | 201 | addressFromStringValue(a) | |
202 | 202 | case _ => | |
203 | 203 | Address(base58'') | |
204 | 204 | } | |
205 | 205 | ||
206 | 206 | ||
207 | 207 | func _saveOracle (oracle_) = [StringEntry(KEY_ORACLE, toString(oracle_))] | |
208 | 208 | ||
209 | 209 | ||
210 | 210 | func _loadCallerContract () = match getString(KEY_CALLER_CONTRACT) { | |
211 | 211 | case a: String => | |
212 | 212 | a | |
213 | 213 | case _ => | |
214 | 214 | "" | |
215 | 215 | } | |
216 | 216 | ||
217 | 217 | ||
218 | 218 | func _saveCallerContract (caller_) = [StringEntry(KEY_CALLER_CONTRACT, caller_)] | |
219 | 219 | ||
220 | 220 | ||
221 | 221 | func _loadUserPosition (token_,user_) = match getString(makeString([KEY_USER_POSITION, token_, user_], SEPARATOR)) { | |
222 | 222 | case a: String => | |
223 | 223 | let struct = split_51C(a, SEPARATOR) | |
224 | 224 | $Tuple2(parseBigIntValue(struct[0]), parseBigIntValue(struct[1])) | |
225 | 225 | case _ => | |
226 | 226 | $Tuple2(ZERO_BIGINT, ZERO_BIGINT) | |
227 | 227 | } | |
228 | 228 | ||
229 | 229 | ||
230 | 230 | func _saveUserPosition (token_,user_,position_) = [StringEntry(makeString([KEY_USER_POSITION, token_, user_], SEPARATOR), makeString_11C([toString(position_._1), toString(position_._2)], SEPARATOR))] | |
231 | 231 | ||
232 | 232 | ||
233 | 233 | func _loadUserUSDBalance (user_) = match getString(makeString([KEY_USER_USD_BALANCE, user_], SEPARATOR)) { | |
234 | 234 | case a: String => | |
235 | 235 | parseBigIntValue(a) | |
236 | 236 | case _ => | |
237 | 237 | ZERO_BIGINT | |
238 | 238 | } | |
239 | 239 | ||
240 | 240 | ||
241 | 241 | func _saveUserUSDBalance (user_,value_) = [StringEntry(makeString([KEY_USER_USD_BALANCE, user_], SEPARATOR), toString(value_))] | |
242 | 242 | ||
243 | 243 | ||
244 | 244 | func _loadUserSharesReferal (user_) = match getString(makeString([KEY_USER_SHARES_REFERAL, user_], SEPARATOR)) { | |
245 | 245 | case a: String => | |
246 | 246 | parseBigIntValue(a) | |
247 | 247 | case _ => | |
248 | 248 | ZERO_BIGINT | |
249 | 249 | } | |
250 | 250 | ||
251 | 251 | ||
252 | 252 | func _saveUserSharesReferal (user_,value_) = [StringEntry(makeString([KEY_USER_SHARES_REFERAL, user_], SEPARATOR), toString(value_))] | |
253 | 253 | ||
254 | 254 | ||
255 | 255 | func _loadUnitsPerUSDBalanceIntegral () = match getString(KEY_UNITS_PER_USD_BALANCE_INTEGRAL) { | |
256 | 256 | case a: String => | |
257 | 257 | parseBigIntValue(a) | |
258 | 258 | case _ => | |
259 | 259 | ZERO_BIGINT | |
260 | 260 | } | |
261 | 261 | ||
262 | 262 | ||
263 | 263 | func _saveUnitsPerUSDBalanceIntegral (value_) = [StringEntry(KEY_UNITS_PER_USD_BALANCE_INTEGRAL, toString(value_))] | |
264 | 264 | ||
265 | 265 | ||
266 | 266 | func _loadUserUnitsPerUSDBalanceIntegral (user_) = match getString(makeString([KEY_USER_UNITS_PER_USD_BALANCE_INTEGRAL, user_], SEPARATOR)) { | |
267 | 267 | case a: String => | |
268 | 268 | parseBigIntValue(a) | |
269 | 269 | case _ => | |
270 | 270 | ZERO_BIGINT | |
271 | 271 | } | |
272 | 272 | ||
273 | 273 | ||
274 | 274 | func _saveUserUnitsPerUSDBalanceIntegral (user_,value_) = [StringEntry(makeString([KEY_USER_UNITS_PER_USD_BALANCE_INTEGRAL, user_], SEPARATOR), toString(value_))] | |
275 | 275 | ||
276 | 276 | ||
277 | 277 | func _loadCheckpointAt () = match getString(KEY_CHECKPOINT_AT) { | |
278 | 278 | case a: String => | |
279 | 279 | parseBigIntValue(a) | |
280 | 280 | case _ => | |
281 | 281 | ZERO_BIGINT | |
282 | 282 | } | |
283 | 283 | ||
284 | 284 | ||
285 | 285 | func _saveCheckpointAt (value_) = [StringEntry(KEY_CHECKPOINT_AT, toString(value_))] | |
286 | 286 | ||
287 | 287 | ||
288 | 288 | func _loadUserCheckpointAt (user_) = match getString(makeString([KEY_USER_CHECKPOINT_AT, user_], SEPARATOR)) { | |
289 | 289 | case a: String => | |
290 | 290 | parseBigIntValue(a) | |
291 | 291 | case _ => | |
292 | 292 | ZERO_BIGINT | |
293 | 293 | } | |
294 | 294 | ||
295 | 295 | ||
296 | 296 | func _saveUserCheckpointAt (user_,value_) = [StringEntry(makeString([KEY_USER_CHECKPOINT_AT, user_], SEPARATOR), toString(value_))] | |
297 | 297 | ||
298 | 298 | ||
299 | 299 | func _loadUnitsAsset () = match getString(KEY_UNITS_ASSET) { | |
300 | 300 | case a: String => | |
301 | 301 | fromBase58String(a) | |
302 | 302 | case _ => | |
303 | 303 | base58'' | |
304 | 304 | } | |
305 | 305 | ||
306 | 306 | ||
307 | 307 | func _saveUnitsAsset (asset_) = [StringEntry(KEY_UNITS_ASSET, toBase58String(asset_))] | |
308 | 308 | ||
309 | 309 | ||
310 | 310 | func _loadStartBlock () = match getString(KEY_START_BLOCK) { | |
311 | 311 | case a: String => | |
312 | 312 | parseBigIntValue(a) | |
313 | 313 | case _ => | |
314 | 314 | ZERO_BIGINT | |
315 | 315 | } | |
316 | 316 | ||
317 | 317 | ||
318 | 318 | func _saveStartBlock (value_) = [StringEntry(KEY_START_BLOCK, toString(value_))] | |
319 | 319 | ||
320 | 320 | ||
321 | 321 | func _loadFinishBlock () = match getString(KEY_FINISH_BLOCK) { | |
322 | 322 | case a: String => | |
323 | 323 | parseBigIntValue(a) | |
324 | 324 | case _ => | |
325 | 325 | ZERO_BIGINT | |
326 | 326 | } | |
327 | 327 | ||
328 | 328 | ||
329 | 329 | func _saveFinishBlock (value_) = [StringEntry(KEY_FINISH_BLOCK, toString(value_))] | |
330 | 330 | ||
331 | 331 | ||
332 | 332 | func _loadUnitsBalanceDistributed () = match getString(KEY_UNITS_BALANCE_DISTRIBUTED) { | |
333 | 333 | case a: String => | |
334 | 334 | parseBigIntValue(a) | |
335 | 335 | case _ => | |
336 | 336 | ZERO_BIGINT | |
337 | 337 | } | |
338 | 338 | ||
339 | 339 | ||
340 | 340 | func _saveUnitsBalanceDistributed (value_) = [StringEntry(KEY_UNITS_BALANCE_DISTRIBUTED, toString(value_))] | |
341 | 341 | ||
342 | 342 | ||
343 | 343 | func _loadUserUnitsBalanceDistributed (user_) = match getString(makeString([KEY_USER_UNITS_BALANCE_DISTRIBUTED, user_], SEPARATOR)) { | |
344 | 344 | case a: String => | |
345 | 345 | parseBigIntValue(a) | |
346 | 346 | case _ => | |
347 | 347 | ZERO_BIGINT | |
348 | 348 | } | |
349 | 349 | ||
350 | 350 | ||
351 | 351 | func _saveUserUnitsBalanceDistributed (user_,value_) = [StringEntry(makeString([KEY_USER_UNITS_BALANCE_DISTRIBUTED, user_], SEPARATOR), toString(value_))] | |
352 | 352 | ||
353 | 353 | ||
354 | 354 | func _loadTotalUSDBalance () = match getString(KEY_TOTAL_USD_BALANCE) { | |
355 | 355 | case a: String => | |
356 | 356 | parseBigIntValue(a) | |
357 | 357 | case _ => | |
358 | 358 | ZERO_BIGINT | |
359 | 359 | } | |
360 | 360 | ||
361 | 361 | ||
362 | 362 | func _saveTotalUSDBalance (value_) = [StringEntry(KEY_TOTAL_USD_BALANCE, toString(value_))] | |
363 | 363 | ||
364 | 364 | ||
365 | 365 | func _loadSWavesContract () = match getString(KEY_SWAVES_CONTRACT) { | |
366 | 366 | case a: String => | |
367 | 367 | addressFromStringValue(a) | |
368 | 368 | case _ => | |
369 | 369 | Address(base58'') | |
370 | 370 | } | |
371 | 371 | ||
372 | 372 | ||
373 | 373 | func _saveSWavesContract (contract_) = [StringEntry(KEY_SWAVES_CONTRACT, toString(contract_))] | |
374 | 374 | ||
375 | 375 | ||
376 | 376 | func _loadSWavesAsset (contract_) = match getString(contract_, KEY_SWAVES_ASSET) { | |
377 | 377 | case a: String => | |
378 | 378 | fromBase58String(a) | |
379 | 379 | case _ => | |
380 | 380 | throw("_loadSWavesAsset: revert") | |
381 | 381 | } | |
382 | 382 | ||
383 | 383 | ||
384 | 384 | func _loadTokenBalance (token_) = match getString(makeString([KEY_TOKEN_BALANCE, token_], SEPARATOR)) { | |
385 | 385 | case a: String => | |
386 | 386 | parseBigIntValue(a) | |
387 | 387 | case _ => | |
388 | 388 | ZERO_BIGINT | |
389 | 389 | } | |
390 | 390 | ||
391 | 391 | ||
392 | 392 | func _saveTokenBalance (token_,value_) = [StringEntry(makeString([KEY_TOKEN_BALANCE, token_], SEPARATOR), toString(value_))] | |
393 | 393 | ||
394 | 394 | ||
395 | 395 | func _loadUsersCount () = match getString(KEY_USERS_COUNT) { | |
396 | 396 | case a: String => | |
397 | 397 | parseBigIntValue(a) | |
398 | 398 | case _ => | |
399 | 399 | ZERO_BIGINT | |
400 | 400 | } | |
401 | 401 | ||
402 | 402 | ||
403 | 403 | func _saveUsersCount (value_) = [StringEntry(KEY_USERS_COUNT, toString(value_))] | |
404 | 404 | ||
405 | 405 | ||
406 | 406 | func _loadUnitsPerReferalShareIntegral () = match getString(KEY_UNITS_PER_REFERAL_SHARE_INTEGRAL) { | |
407 | 407 | case a: String => | |
408 | 408 | parseBigIntValue(a) | |
409 | 409 | case _ => | |
410 | 410 | ZERO_BIGINT | |
411 | 411 | } | |
412 | 412 | ||
413 | 413 | ||
414 | 414 | func _saveUnitsPerReferalShareIntegral (value_) = [StringEntry(KEY_UNITS_PER_REFERAL_SHARE_INTEGRAL, toString(value_))] | |
415 | 415 | ||
416 | 416 | ||
417 | 417 | func _loadUnitsSharesReferal () = match getString(KEY_UNITS_SHARES_REFERAL) { | |
418 | 418 | case a: String => | |
419 | 419 | parseBigIntValue(a) | |
420 | 420 | case _ => | |
421 | 421 | ZERO_BIGINT | |
422 | 422 | } | |
423 | 423 | ||
424 | 424 | ||
425 | 425 | func _saveUnitsSharesReferal (value_) = [StringEntry(KEY_UNITS_SHARES_REFERAL, toString(value_))] | |
426 | 426 | ||
427 | 427 | ||
428 | 428 | func _loadTotalUnitsForLP () = match getString(KEY_TOTAL_UNITS_FOR_LP) { | |
429 | 429 | case a: String => | |
430 | 430 | parseBigIntValue(a) | |
431 | 431 | case _ => | |
432 | 432 | ZERO_BIGINT | |
433 | 433 | } | |
434 | 434 | ||
435 | 435 | ||
436 | 436 | func _saveTotalUnitsForLP (value_) = [StringEntry(KEY_TOTAL_UNITS_FOR_LP, toString(value_))] | |
437 | 437 | ||
438 | 438 | ||
439 | 439 | func _loadTotalUnitsForReferal () = match getString(KEY_TOTAL_UNITS_FOR_REFERAL) { | |
440 | 440 | case a: String => | |
441 | 441 | parseBigIntValue(a) | |
442 | 442 | case _ => | |
443 | 443 | ZERO_BIGINT | |
444 | 444 | } | |
445 | 445 | ||
446 | 446 | ||
447 | 447 | func _saveTotalUnitsForReferal (value_) = [StringEntry(KEY_TOTAL_UNITS_FOR_REFERAL, toString(value_))] | |
448 | 448 | ||
449 | 449 | ||
450 | 450 | func _loadTotalSharesReferal () = match getString(KEY_TOTAL_SHARES_REFERAL) { | |
451 | 451 | case a: String => | |
452 | 452 | parseBigIntValue(a) | |
453 | 453 | case _ => | |
454 | 454 | ZERO_BIGINT | |
455 | 455 | } | |
456 | 456 | ||
457 | 457 | ||
458 | 458 | func _saveTotalSharesReferal (value_) = [StringEntry(KEY_TOTAL_SHARES_REFERAL, toString(value_))] | |
459 | 459 | ||
460 | 460 | ||
461 | 461 | func _loadUserUnitsPerReferalShareIntegral (user_) = match getString(makeString([KEY_USER_UNITS_PER_REFERAL_SHARE_INTEGRAL, user_], SEPARATOR)) { | |
462 | 462 | case a: String => | |
463 | 463 | parseBigIntValue(a) | |
464 | 464 | case _ => | |
465 | 465 | ZERO_BIGINT | |
466 | 466 | } | |
467 | 467 | ||
468 | 468 | ||
469 | 469 | func _saveUserUnitsPerReferalShareIntegral (user_,value_) = [StringEntry(makeString([KEY_USER_UNITS_PER_REFERAL_SHARE_INTEGRAL, user_], SEPARATOR), toString(value_))] | |
470 | 470 | ||
471 | 471 | ||
472 | 472 | func _loadUserUnitsSharesReferal (user_) = match getString(makeString([KEY_USER_UNITS_SHARES_REFERAL, user_], SEPARATOR)) { | |
473 | 473 | case a: String => | |
474 | 474 | parseBigIntValue(a) | |
475 | 475 | case _ => | |
476 | 476 | ZERO_BIGINT | |
477 | 477 | } | |
478 | 478 | ||
479 | 479 | ||
480 | 480 | func _saveUserUnitsSharesReferal (user_,value_) = [StringEntry(makeString([KEY_USER_UNITS_SHARES_REFERAL, user_], SEPARATOR), toString(value_))] | |
481 | 481 | ||
482 | 482 | ||
483 | 483 | func _loadManager () = match getString(KEY_MANAGER) { | |
484 | 484 | case a: String => | |
485 | 485 | addressFromStringValue(a) | |
486 | 486 | case _ => | |
487 | 487 | Address(base58'') | |
488 | 488 | } | |
489 | 489 | ||
490 | 490 | ||
491 | 491 | func _saveManager (manager_) = [StringEntry(KEY_MANAGER, toString(manager_))] | |
492 | 492 | ||
493 | 493 | ||
494 | 494 | func _loadReferer (codehash_) = match getString(makeString([KEY_REFERER, codehash_], SEPARATOR)) { | |
495 | 495 | case a: String => | |
496 | 496 | a | |
497 | 497 | case _ => | |
498 | 498 | throw("_loadReferer: revert") | |
499 | 499 | } | |
500 | 500 | ||
501 | 501 | ||
502 | 502 | func _saveReferer (codehash_,address_) = [StringEntry(makeString([KEY_REFERER, codehash_], SEPARATOR), address_)] | |
503 | 503 | ||
504 | 504 | ||
505 | 505 | func _checkRefererExistence (codehash_) = match getString(makeString([KEY_REFERER, codehash_], SEPARATOR)) { | |
506 | 506 | case a: String => | |
507 | 507 | true | |
508 | 508 | case _ => | |
509 | 509 | false | |
510 | 510 | } | |
511 | 511 | ||
512 | 512 | ||
513 | 513 | func _onlyThisContract (caller_) = if ((caller_ != this)) | |
514 | 514 | then throw("_onlyThisContract: revert") | |
515 | 515 | else true | |
516 | 516 | ||
517 | 517 | ||
518 | 518 | func _whenMultisigSet () = if ((_loadMultisig() == Address(base58''))) | |
519 | 519 | then throw("_whenMultisigSet: revert") | |
520 | 520 | else true | |
521 | 521 | ||
522 | 522 | ||
523 | 523 | func _whenNotInitialized () = if (_loadInit()) | |
524 | 524 | then throw("_whenNotInitialized: revert") | |
525 | 525 | else true | |
526 | 526 | ||
527 | 527 | ||
528 | 528 | func _whenInitialized () = if (!(_loadInit())) | |
529 | 529 | then throw("_whenInitialized: revert") | |
530 | 530 | else true | |
531 | 531 | ||
532 | 532 | ||
533 | 533 | func _whenNotPaused () = if (_loadPause()) | |
534 | 534 | then throw("_whenNotPaused: revert") | |
535 | 535 | else true | |
536 | 536 | ||
537 | 537 | ||
538 | 538 | func _whenPaused () = if (!(_loadPause())) | |
539 | 539 | then throw("_whenPaused: revert") | |
540 | 540 | else true | |
541 | 541 | ||
542 | 542 | ||
543 | 543 | func _onlyPauser (caller_) = if ((caller_ != _loadPauser())) | |
544 | 544 | then throw("_onlyPauser: revert") | |
545 | 545 | else true | |
546 | 546 | ||
547 | 547 | ||
548 | 548 | func _onlyManager (caller_) = if ((caller_ != _loadManager())) | |
549 | 549 | then throw("_onlyManager: revert") | |
550 | 550 | else true | |
551 | 551 | ||
552 | 552 | ||
553 | 553 | func _validateExecutor (val_,err_) = if ((val_ != _loadExecutor())) | |
554 | 554 | then throw(err_) | |
555 | 555 | else true | |
556 | 556 | ||
557 | 557 | ||
558 | 558 | func _validateCaller (val_,err_) = if ((val_ != _loadCallerContract())) | |
559 | 559 | then throw(err_) | |
560 | 560 | else true | |
561 | 561 | ||
562 | 562 | ||
563 | 563 | func _getTokenRate (token_) = match getString(_loadOracle(), makeString([KEY_PRICE, token_], SEPARATOR)) { | |
564 | 564 | case a: String => | |
565 | 565 | parseBigIntValue(a) | |
566 | 566 | case _ => | |
567 | 567 | throw(("_getTokenRate: no rate for token=" + token_)) | |
568 | 568 | } | |
569 | 569 | ||
570 | 570 | ||
571 | 571 | func _checkpoint () = { | |
572 | 572 | let prevUnitsPerUSDBalanceIntegral = _loadUnitsPerUSDBalanceIntegral() | |
573 | 573 | let prevCheckpointAt = max([_loadStartBlock(), _loadCheckpointAt()]) | |
574 | 574 | let prevUnitsBalanceDistributed = _loadUnitsBalanceDistributed() | |
575 | 575 | let prevUnitsPerReferalShareIntegral = _loadUnitsPerReferalShareIntegral() | |
576 | 576 | let prevUnitsSharesReferal = _loadUnitsSharesReferal() | |
577 | 577 | let currentBlock = min([toBigInt(height), _loadFinishBlock()]) | |
578 | 578 | if ((prevCheckpointAt >= currentBlock)) | |
579 | 579 | then $Tuple3(nil, prevUnitsPerUSDBalanceIntegral, prevUnitsPerReferalShareIntegral) | |
580 | 580 | else { | |
581 | 581 | let unitsBalanceToDistribute = fraction((_loadTotalUnitsForLP() - prevUnitsBalanceDistributed), (currentBlock - prevCheckpointAt), (_loadFinishBlock() - prevCheckpointAt)) | |
582 | 582 | let unitsPerUSDBalanceIntegral = (((PERCENT_FACTOR * unitsBalanceToDistribute) / _loadTotalUSDBalance()) + prevUnitsPerUSDBalanceIntegral) | |
583 | 583 | let $t01774818301 = if ((_loadTotalSharesReferal() > ZERO_BIGINT)) | |
584 | 584 | then { | |
585 | 585 | let unitsSharesReferal = fraction((_loadTotalUnitsForReferal() - prevUnitsSharesReferal), (currentBlock - prevCheckpointAt), (_loadFinishBlock() - prevCheckpointAt)) | |
586 | 586 | let unitsPerReferalShareIntegral = (((PERCENT_FACTOR * unitsSharesReferal) / _loadTotalSharesReferal()) + prevUnitsPerReferalShareIntegral) | |
587 | 587 | $Tuple2(unitsSharesReferal, unitsPerReferalShareIntegral) | |
588 | 588 | } | |
589 | 589 | else $Tuple2(ZERO_BIGINT, ZERO_BIGINT) | |
590 | 590 | let unitsSharesReferal = $t01774818301._1 | |
591 | 591 | let unitsPerReferalShareIntegral = $t01774818301._2 | |
592 | 592 | $Tuple3(((((_saveCheckpointAt(currentBlock) ++ _saveUnitsPerUSDBalanceIntegral(unitsPerUSDBalanceIntegral)) ++ _saveUnitsBalanceDistributed((unitsBalanceToDistribute + prevUnitsBalanceDistributed))) ++ _saveUnitsPerReferalShareIntegral(unitsPerReferalShareIntegral)) ++ _saveUnitsSharesReferal((unitsSharesReferal + prevUnitsSharesReferal))), unitsPerUSDBalanceIntegral, unitsPerReferalShareIntegral) | |
593 | 593 | } | |
594 | 594 | } | |
595 | 595 | ||
596 | 596 | ||
597 | 597 | func _userCheckpoint (user_,userUSDBalance_,userSharesReferal_) = { | |
598 | 598 | let $t01888718999 = _checkpoint() | |
599 | 599 | let checkpointActions = $t01888718999._1 | |
600 | 600 | let unitsPerUSDBalanceIntegral = $t01888718999._2 | |
601 | 601 | let unitsPerReferalShareIntegral = $t01888718999._3 | |
602 | 602 | let prevUserUnitsPerUSDBalanceIntegral = _loadUserUnitsPerUSDBalanceIntegral(user_) | |
603 | 603 | let prevUserCheckpointAt = max([_loadStartBlock(), _loadUserCheckpointAt(user_)]) | |
604 | 604 | let prevUserUnitsBalanceDistributed = _loadUserUnitsBalanceDistributed(user_) | |
605 | 605 | let prevUserUnitsPerReferalShareIntegral = _loadUserUnitsPerReferalShareIntegral(user_) | |
606 | 606 | let prevUserUnitsSharesReferal = _loadUserUnitsSharesReferal(user_) | |
607 | 607 | let currentBlock = min([toBigInt(height), _loadFinishBlock()]) | |
608 | 608 | if ((prevUserCheckpointAt >= currentBlock)) | |
609 | 609 | then $Tuple3(checkpointActions, prevUserUnitsBalanceDistributed, prevUserUnitsSharesReferal) | |
610 | 610 | else { | |
611 | 611 | let userUnitsBalanceDistributed = (((userUSDBalance_ * (unitsPerUSDBalanceIntegral - prevUserUnitsPerUSDBalanceIntegral)) / PERCENT_FACTOR) + prevUserUnitsBalanceDistributed) | |
612 | 612 | let userUnitsSharesReferal = (((userSharesReferal_ * (unitsPerReferalShareIntegral - prevUserUnitsPerReferalShareIntegral)) / PERCENT_FACTOR) + prevUserUnitsSharesReferal) | |
613 | 613 | $Tuple3((((((checkpointActions ++ _saveUserCheckpointAt(user_, currentBlock)) ++ _saveUserUnitsPerUSDBalanceIntegral(user_, unitsPerUSDBalanceIntegral)) ++ _saveUserUnitsBalanceDistributed(user_, userUnitsBalanceDistributed)) ++ _saveUserUnitsPerReferalShareIntegral(user_, unitsPerReferalShareIntegral)) ++ _saveUserUnitsSharesReferal(user_, userUnitsSharesReferal)), userUnitsBalanceDistributed, userUnitsSharesReferal) | |
614 | 614 | } | |
615 | 615 | } | |
616 | 616 | ||
617 | 617 | ||
618 | 618 | @Callable(i) | |
619 | 619 | func init (executor_,oracle_,pauser_,sWavesContract_) = { | |
620 | 620 | let err = if (if (if (if (if (if (_onlyThisContract(i.caller)) | |
621 | 621 | then _whenNotInitialized() | |
622 | 622 | else false) | |
623 | 623 | then _whenMultisigSet() | |
624 | 624 | else false) | |
625 | 625 | then _validateAddress(executor_, "init: invalid executor") | |
626 | 626 | else false) | |
627 | 627 | then _validateAddress(oracle_, "init: invalid oracle") | |
628 | 628 | else false) | |
629 | 629 | then _validateAddress(pauser_, "init: invalid pauser") | |
630 | 630 | else false) | |
631 | 631 | then _validateAddress(sWavesContract_, "init: invalid sWavesContract") | |
632 | 632 | else false | |
633 | 633 | if ((err == err)) | |
634 | 634 | then $Tuple2(((((_saveInit(true) ++ _saveExecutor(addressFromStringValue(executor_))) ++ _saveOracle(addressFromStringValue(oracle_))) ++ _savePauser(addressFromStringValue(pauser_))) ++ _saveSWavesContract(addressFromStringValue(sWavesContract_))), unit) | |
635 | 635 | else throw("Strict value is not equal to itself.") | |
636 | 636 | } | |
637 | 637 | ||
638 | 638 | ||
639 | 639 | ||
640 | 640 | @Callable(i) | |
641 | 641 | func deposit (callerContract_,sender_,token_,amount_,referrer_) = { | |
642 | 642 | let amount = valueOrErrorMessage(parseInt(amount_), "deposit: amount is not Int") | |
643 | 643 | let err = if (if (if (if (_whenInitialized()) | |
644 | 644 | then _whenNotPaused() | |
645 | 645 | else false) | |
646 | 646 | then _validateExecutor(i.caller, "deposit: invalid executor") | |
647 | 647 | else false) | |
648 | 648 | then _validateCaller(callerContract_, "deposit: invalid caller") | |
649 | 649 | else false) | |
650 | - | then _validateInt(amount, | |
650 | + | then _validateInt(amount, 1, MAX_INT, "deposit: invalid amount") | |
651 | 651 | else false | |
652 | 652 | if ((err == err)) | |
653 | 653 | then { | |
654 | 654 | let rate = _getTokenRate(token_) | |
655 | 655 | let $t02192622008 = _loadUserPosition(token_, sender_) | |
656 | 656 | let userTokenBalance = $t02192622008._1 | |
657 | 657 | let userTokenBalanceInUSD = $t02192622008._2 | |
658 | 658 | let userUSDBalance = _loadUserUSDBalance(sender_) | |
659 | 659 | let userSharesReferal = _loadUserSharesReferal(sender_) | |
660 | 660 | let $t02212722254 = _userCheckpoint(sender_, userUSDBalance, userSharesReferal) | |
661 | 661 | let checkpointActions = $t02212722254._1 | |
662 | 662 | let userUnitsBalance = $t02212722254._2 | |
663 | 663 | let userUnitsSharesReferal = $t02212722254._3 | |
664 | 664 | let newUserTokenBalance = (userTokenBalance + toBigInt(amount)) | |
665 | 665 | let newUserTokenBalanceInUSD = fraction(newUserTokenBalance, rate, PERCENT_FACTOR, DOWN) | |
666 | 666 | let newUserUSDBalance = ((userUSDBalance - userTokenBalanceInUSD) + newUserTokenBalanceInUSD) | |
667 | 667 | let totalBalanceUpdated = ((_loadTotalUSDBalance() - userTokenBalanceInUSD) + newUserTokenBalanceInUSD) | |
668 | 668 | let usersCount = if ((userUSDBalance == ZERO_BIGINT)) | |
669 | 669 | then (_loadUsersCount() + ONE_BIGINT) | |
670 | 670 | else _loadUsersCount() | |
671 | 671 | let refererActions = if (if ((size(referrer_) > 0)) | |
672 | 672 | then _checkRefererExistence(referrer_) | |
673 | 673 | else false) | |
674 | 674 | then { | |
675 | 675 | let refererAddress = _loadReferer(referrer_) | |
676 | 676 | let sharesToDistribute = fraction(toBigInt(amount), rate, PERCENT_FACTOR, DOWN) | |
677 | 677 | let sharesToUser = fraction(sharesToDistribute, toBigInt(20), toBigInt(100), DOWN) | |
678 | 678 | let sharesToReferer = (sharesToDistribute - sharesToUser) | |
679 | 679 | let newUserSharesReferal = (userSharesReferal + sharesToUser) | |
680 | 680 | let refererSharesReferal = _loadUserSharesReferal(refererAddress) | |
681 | 681 | let newRefererSharesReferal = (refererSharesReferal + sharesToReferer) | |
682 | 682 | let newTotalSharesReferal = (_loadTotalSharesReferal() + sharesToDistribute) | |
683 | 683 | let $t02358723758 = _userCheckpoint(refererAddress, _loadUserUSDBalance(refererAddress), refererSharesReferal) | |
684 | 684 | let refererCheckpointActions = $t02358723758._1 | |
685 | 685 | let refererUnitsBalance = $t02358723758._2 | |
686 | 686 | let refererUnitsSharesReferal = $t02358723758._3 | |
687 | 687 | (((refererCheckpointActions ++ _saveUserSharesReferal(sender_, newUserSharesReferal)) ++ _saveUserSharesReferal(refererAddress, newRefererSharesReferal)) ++ _saveTotalSharesReferal(newTotalSharesReferal)) | |
688 | 688 | } | |
689 | 689 | else nil | |
690 | 690 | $Tuple2(((((((checkpointActions ++ refererActions) ++ _saveTotalUSDBalance(totalBalanceUpdated)) ++ _saveTokenBalance(token_, (_loadTokenBalance(token_) + toBigInt(amount)))) ++ _saveUserUSDBalance(sender_, newUserUSDBalance)) ++ _saveUsersCount(usersCount)) ++ _saveUserPosition(token_, sender_, $Tuple2(newUserTokenBalance, newUserTokenBalanceInUSD))), userUnitsBalance) | |
691 | 691 | } | |
692 | 692 | else throw("Strict value is not equal to itself.") | |
693 | 693 | } | |
694 | 694 | ||
695 | 695 | ||
696 | 696 | ||
697 | 697 | @Callable(i) | |
698 | 698 | func depositWaves (referrer_) = { | |
699 | 699 | let err = if (if (if (if (_whenInitialized()) | |
700 | 700 | then _whenNotPaused() | |
701 | 701 | else false) | |
702 | 702 | then _validatePaymentsSize(i.payments, 1, "depositWaves: no payment") | |
703 | 703 | else false) | |
704 | 704 | then _validateWavesPayment(i.payments[0], "depositWaves: invalid asset") | |
705 | 705 | else false) | |
706 | - | then _validateInt((i.payments[0].amount / 100), | |
706 | + | then _validateInt((i.payments[0].amount / 100), 1, MAX_INT, "depositWaves: invalid amount") | |
707 | 707 | else false | |
708 | 708 | if ((err == err)) | |
709 | 709 | then { | |
710 | 710 | let amount = (i.payments[0].amount / 100) | |
711 | 711 | let sender = toString(i.caller) | |
712 | 712 | let token = WAVES | |
713 | 713 | let rate = _getTokenRate(token) | |
714 | 714 | let $t02663326713 = _loadUserPosition(token, sender) | |
715 | 715 | let userTokenBalance = $t02663326713._1 | |
716 | 716 | let userTokenBalanceInUSD = $t02663326713._2 | |
717 | 717 | let userUSDBalance = _loadUserUSDBalance(sender) | |
718 | 718 | let userSharesReferal = _loadUserSharesReferal(sender) | |
719 | 719 | let $t02683026956 = _userCheckpoint(sender, userUSDBalance, userSharesReferal) | |
720 | 720 | let checkpointActions = $t02683026956._1 | |
721 | 721 | let userUnitsBalance = $t02683026956._2 | |
722 | 722 | let userUnitsSharesReferal = $t02683026956._3 | |
723 | 723 | let newUserTokenBalance = (userTokenBalance + toBigInt(amount)) | |
724 | 724 | let newUserTokenBalanceInUSD = fraction(newUserTokenBalance, rate, PERCENT_FACTOR, DOWN) | |
725 | 725 | let newUserUSDBalance = ((userUSDBalance - userTokenBalanceInUSD) + newUserTokenBalanceInUSD) | |
726 | 726 | let totalBalanceUpdated = ((_loadTotalUSDBalance() - userTokenBalanceInUSD) + newUserTokenBalanceInUSD) | |
727 | 727 | let usersCount = if ((userUSDBalance == ZERO_BIGINT)) | |
728 | 728 | then (_loadUsersCount() + ONE_BIGINT) | |
729 | 729 | else _loadUsersCount() | |
730 | 730 | let refererActions = if (if ((size(referrer_) > 0)) | |
731 | 731 | then _checkRefererExistence(referrer_) | |
732 | 732 | else false) | |
733 | 733 | then { | |
734 | 734 | let refererAddress = _loadReferer(referrer_) | |
735 | 735 | let sharesToDistribute = fraction(toBigInt(amount), rate, PERCENT_FACTOR, DOWN) | |
736 | 736 | let sharesToUser = fraction(sharesToDistribute, toBigInt(20), toBigInt(100), DOWN) | |
737 | 737 | let sharesToReferer = (sharesToDistribute - sharesToUser) | |
738 | 738 | let newUserSharesReferal = (userSharesReferal + sharesToUser) | |
739 | 739 | let refererSharesReferal = _loadUserSharesReferal(refererAddress) | |
740 | 740 | let newRefererSharesReferal = (refererSharesReferal + sharesToReferer) | |
741 | 741 | let newTotalSharesReferal = (_loadTotalSharesReferal() + sharesToDistribute) | |
742 | 742 | let $t02828928460 = _userCheckpoint(refererAddress, _loadUserUSDBalance(refererAddress), refererSharesReferal) | |
743 | 743 | let refererCheckpointActions = $t02828928460._1 | |
744 | 744 | let refererUnitsBalance = $t02828928460._2 | |
745 | 745 | let refererUnitsSharesReferal = $t02828928460._3 | |
746 | 746 | (((refererCheckpointActions ++ _saveUserSharesReferal(sender, newUserSharesReferal)) ++ _saveUserSharesReferal(refererAddress, newRefererSharesReferal)) ++ _saveTotalSharesReferal(newTotalSharesReferal)) | |
747 | 747 | } | |
748 | 748 | else nil | |
749 | 749 | let invocation = invoke(_loadSWavesContract(), FUNC_DEPOSIT, nil, [AttachedPayment(unit, i.payments[0].amount)]) | |
750 | 750 | if ((invocation == invocation)) | |
751 | 751 | then $Tuple2(((((((checkpointActions ++ refererActions) ++ _saveTotalUSDBalance(totalBalanceUpdated)) ++ _saveTokenBalance(WAVES, (_loadTokenBalance(WAVES) + toBigInt(amount)))) ++ _saveUserUSDBalance(sender, newUserUSDBalance)) ++ _saveUsersCount(usersCount)) ++ _saveUserPosition(token, sender, $Tuple2(newUserTokenBalance, newUserTokenBalanceInUSD))), userUnitsBalance) | |
752 | 752 | else throw("Strict value is not equal to itself.") | |
753 | 753 | } | |
754 | 754 | else throw("Strict value is not equal to itself.") | |
755 | 755 | } | |
756 | 756 | ||
757 | 757 | ||
758 | 758 | ||
759 | 759 | @Callable(i) | |
760 | 760 | func withdrawWaves (amount_) = { | |
761 | 761 | let err = if (if (if (_whenInitialized()) | |
762 | 762 | then _whenNotPaused() | |
763 | 763 | else false) | |
764 | - | then _validateInt((amount_ / 100), | |
764 | + | then _validateInt((amount_ / 100), 1, MAX_INT, "withdrawWaves: invalid amount") | |
765 | 765 | else false) | |
766 | 766 | then if ((_loadFinishBlock() >= toBigInt(height))) | |
767 | 767 | then throw("withdrawWaves: not allowed") | |
768 | 768 | else true | |
769 | 769 | else false | |
770 | 770 | if ((err == err)) | |
771 | 771 | then { | |
772 | 772 | let internalAmount = (amount_ / 100) | |
773 | 773 | let sender = toString(i.caller) | |
774 | 774 | let token = WAVES | |
775 | 775 | let rate = _getTokenRate(token) | |
776 | 776 | let $t02972829808 = _loadUserPosition(token, sender) | |
777 | 777 | let userTokenBalance = $t02972829808._1 | |
778 | 778 | let userTokenBalanceInUSD = $t02972829808._2 | |
779 | 779 | let userUSDBalance = _loadUserUSDBalance(sender) | |
780 | 780 | let userSharesReferal = _loadUserSharesReferal(sender) | |
781 | 781 | let $t02992530051 = _userCheckpoint(sender, userUSDBalance, userSharesReferal) | |
782 | 782 | let checkpointActions = $t02992530051._1 | |
783 | 783 | let userUnitsBalance = $t02992530051._2 | |
784 | 784 | let userUnitsSharesReferal = $t02992530051._3 | |
785 | 785 | let newUserTokenBalance = (userTokenBalance - toBigInt(internalAmount)) | |
786 | 786 | let err1 = _validateInt(toInt(newUserTokenBalance), 0, MAX_INT, "withdrawWaves: insufficient token amount") | |
787 | 787 | if ((err1 == err1)) | |
788 | 788 | then { | |
789 | 789 | let newUserTokenBalanceInUSD = fraction(newUserTokenBalance, rate, PERCENT_FACTOR, DOWN) | |
790 | 790 | let newUserUSDBalance = ((userUSDBalance - userTokenBalanceInUSD) + newUserTokenBalanceInUSD) | |
791 | 791 | let totalBalanceUpdated = ((_loadTotalUSDBalance() - userTokenBalanceInUSD) + newUserTokenBalanceInUSD) | |
792 | 792 | let sWavesContract = _loadSWavesContract() | |
793 | 793 | let sWavesAsset = _loadSWavesAsset(sWavesContract) | |
794 | 794 | let invocation = invoke(sWavesContract, FUNC_GET_RATE, nil, nil) | |
795 | 795 | let swavesRate = match invocation { | |
796 | 796 | case a: String => | |
797 | 797 | parseBigIntValue(a) | |
798 | 798 | case _ => | |
799 | 799 | throw("withdrawWaves: sWaves getRate() revert") | |
800 | 800 | } | |
801 | 801 | let sWavesToWithdraw = toInt(fraction(toBigInt(amount_), SWAVES_RATE_FACTOR, swavesRate, CEILING)) | |
802 | 802 | let invocation1 = invoke(sWavesContract, FUNC_WITHDRAW, nil, [AttachedPayment(sWavesAsset, sWavesToWithdraw)]) | |
803 | 803 | if ((invocation1 == invocation1)) | |
804 | 804 | then $Tuple2(((((([ScriptTransfer(i.caller, amount_, unit)] ++ checkpointActions) ++ _saveTotalUSDBalance(totalBalanceUpdated)) ++ _saveTokenBalance(WAVES, (_loadTokenBalance(WAVES) - toBigInt(internalAmount)))) ++ _saveUserUSDBalance(sender, newUserUSDBalance)) ++ _saveUserPosition(token, sender, $Tuple2(newUserTokenBalance, newUserTokenBalanceInUSD))), unit) | |
805 | 805 | else throw("Strict value is not equal to itself.") | |
806 | 806 | } | |
807 | 807 | else throw("Strict value is not equal to itself.") | |
808 | 808 | } | |
809 | 809 | else throw("Strict value is not equal to itself.") | |
810 | 810 | } | |
811 | 811 | ||
812 | 812 | ||
813 | 813 | ||
814 | 814 | @Callable(i) | |
815 | 815 | func startRetrodrop (unitsAsset_,amountForLP_,amountForReferal_,blocksAt_) = { | |
816 | 816 | let err = if (if (if (if (if (if (if (_onlyThisContract(i.caller)) | |
817 | 817 | then _whenInitialized() | |
818 | 818 | else false) | |
819 | 819 | then _whenNotPaused() | |
820 | 820 | else false) | |
821 | 821 | then _validateAsset(unitsAsset_, "startRetrodrop: invalid units asset") | |
822 | 822 | else false) | |
823 | 823 | then _validateInt(amountForLP_, 0, MAX_INT, "startRetrodrop: invalid amountForLP") | |
824 | 824 | else false) | |
825 | 825 | then _validateInt(amountForReferal_, 0, MAX_INT, "startRetrodrop: invalid amountForReferal") | |
826 | 826 | else false) | |
827 | 827 | then _validateInt(blocksAt_, 1, MAX_INT, "startRetrodrop: invalid blocksAt") | |
828 | 828 | else false) | |
829 | 829 | then _validateEqBigInt(_loadStartBlock(), ZERO_BIGINT, "startRetrodrop: already started") | |
830 | 830 | else false | |
831 | 831 | if ((err == err)) | |
832 | 832 | then { | |
833 | 833 | let startHeight = toBigInt(height) | |
834 | 834 | let finishHeight = (startHeight + toBigInt(blocksAt_)) | |
835 | 835 | let err1 = if (((amountForLP_ + amountForReferal_) > assetBalance(this, fromBase58String(unitsAsset_)))) | |
836 | 836 | then throw("startRetrodrop: insufficient funds") | |
837 | 837 | else true | |
838 | 838 | if ((err1 == err1)) | |
839 | 839 | then $Tuple2(((((_saveUnitsAsset(fromBase58String(unitsAsset_)) ++ _saveStartBlock(startHeight)) ++ _saveFinishBlock(finishHeight)) ++ _saveTotalUnitsForLP(toBigInt(amountForLP_))) ++ _saveTotalUnitsForReferal(toBigInt(amountForReferal_))), unit) | |
840 | 840 | else throw("Strict value is not equal to itself.") | |
841 | 841 | } | |
842 | 842 | else throw("Strict value is not equal to itself.") | |
843 | 843 | } | |
844 | 844 | ||
845 | 845 | ||
846 | 846 | ||
847 | 847 | @Callable(i) | |
848 | 848 | func increaseUnitsSupply (amountForLP_,amountForReferal_) = { | |
849 | 849 | let err = if (if (if (if (_whenInitialized()) | |
850 | 850 | then _whenNotPaused() | |
851 | 851 | else false) | |
852 | 852 | then _validateInt(amountForLP_, 0, MAX_INT, "increaseUnitsSupply: invalid amountForLP") | |
853 | 853 | else false) | |
854 | 854 | then _validateInt(amountForReferal_, 0, MAX_INT, "increaseUnitsSupply: invalid amountForReferal") | |
855 | 855 | else false) | |
856 | 856 | then _validateBigInt(toBigInt(height), (_loadStartBlock() + ONE_BIGINT), (_loadFinishBlock() - ONE_BIGINT), "increaseUnitsSupply: drop not active") | |
857 | 857 | else false | |
858 | 858 | if ((err == err)) | |
859 | 859 | then { | |
860 | 860 | let newAmountForLP = (_loadTotalUnitsForLP() + toBigInt(amountForLP_)) | |
861 | 861 | let newAmountForReferal = (_loadTotalUnitsForReferal() + toBigInt(amountForReferal_)) | |
862 | 862 | let err1 = if (((newAmountForLP + newAmountForReferal) > toBigInt(assetBalance(this, _loadUnitsAsset())))) | |
863 | 863 | then throw("increaseUnitsSupply: insufficient funds") | |
864 | 864 | else true | |
865 | 865 | if ((err1 == err1)) | |
866 | 866 | then $Tuple2((_saveTotalUnitsForLP(newAmountForLP) ++ _saveTotalUnitsForReferal(newAmountForReferal)), unit) | |
867 | 867 | else throw("Strict value is not equal to itself.") | |
868 | 868 | } | |
869 | 869 | else throw("Strict value is not equal to itself.") | |
870 | 870 | } | |
871 | 871 | ||
872 | 872 | ||
873 | 873 | ||
874 | 874 | @Callable(i) | |
875 | 875 | func checkpoint (user_) = { | |
876 | 876 | let $t03382033959 = _userCheckpoint(user_, _loadUserUSDBalance(user_), _loadUserSharesReferal(user_)) | |
877 | 877 | let actions = $t03382033959._1 | |
878 | 878 | let userUnitsBalance = $t03382033959._2 | |
879 | 879 | let userUnitsSharesReferal = $t03382033959._3 | |
880 | 880 | $Tuple2(actions, $Tuple2(userUnitsBalance, userUnitsSharesReferal)) | |
881 | 881 | } | |
882 | 882 | ||
883 | 883 | ||
884 | 884 | ||
885 | 885 | @Callable(i) | |
886 | 886 | func getUnits (user_) = { | |
887 | 887 | let $t03407234211 = _userCheckpoint(user_, _loadUserUSDBalance(user_), _loadUserSharesReferal(user_)) | |
888 | 888 | let actions = $t03407234211._1 | |
889 | 889 | let userUnitsBalance = $t03407234211._2 | |
890 | 890 | let userUnitsSharesReferal = $t03407234211._3 | |
891 | 891 | $Tuple2(nil, $Tuple2(userUnitsBalance, userUnitsSharesReferal)) | |
892 | 892 | } | |
893 | 893 | ||
894 | 894 | ||
895 | 895 | ||
896 | 896 | @Callable(i) | |
897 | 897 | func setReferer (codehash_,address_) = { | |
898 | 898 | let err = if (_onlyManager(i.caller)) | |
899 | 899 | then _whenInitialized() | |
900 | 900 | else false | |
901 | 901 | if ((err == err)) | |
902 | 902 | then $Tuple2(_saveReferer(codehash_, address_), unit) | |
903 | 903 | else throw("Strict value is not equal to itself.") | |
904 | 904 | } | |
905 | 905 | ||
906 | 906 | ||
907 | 907 | ||
908 | 908 | @Callable(i) | |
909 | 909 | func setManager (manager_) = { | |
910 | 910 | let err = if (if (_onlyThisContract(i.caller)) | |
911 | 911 | then _whenInitialized() | |
912 | 912 | else false) | |
913 | 913 | then _validateAddress(manager_, "setManager: invalid manager") | |
914 | 914 | else false | |
915 | 915 | if ((err == err)) | |
916 | 916 | then $Tuple2(_saveManager(addressFromStringValue(manager_)), unit) | |
917 | 917 | else throw("Strict value is not equal to itself.") | |
918 | 918 | } | |
919 | 919 | ||
920 | 920 | ||
921 | 921 | ||
922 | 922 | @Callable(i) | |
923 | 923 | func updateCallerContract (callerContract_) = { | |
924 | 924 | let err = if (_onlyThisContract(i.caller)) | |
925 | 925 | then _whenInitialized() | |
926 | 926 | else false | |
927 | 927 | if ((err == err)) | |
928 | 928 | then $Tuple2(_saveCallerContract(callerContract_), unit) | |
929 | 929 | else throw("Strict value is not equal to itself.") | |
930 | 930 | } | |
931 | 931 | ||
932 | 932 | ||
933 | 933 | ||
934 | 934 | @Callable(i) | |
935 | 935 | func pause () = { | |
936 | 936 | let err = if (if (_onlyPauser(i.caller)) | |
937 | 937 | then _whenInitialized() | |
938 | 938 | else false) | |
939 | 939 | then _whenNotPaused() | |
940 | 940 | else false | |
941 | 941 | if ((err == err)) | |
942 | 942 | then $Tuple2(_savePause(true), unit) | |
943 | 943 | else throw("Strict value is not equal to itself.") | |
944 | 944 | } | |
945 | 945 | ||
946 | 946 | ||
947 | 947 | ||
948 | 948 | @Callable(i) | |
949 | 949 | func unpause () = { | |
950 | 950 | let err = if (if (_onlyPauser(i.caller)) | |
951 | 951 | then _whenInitialized() | |
952 | 952 | else false) | |
953 | 953 | then _whenPaused() | |
954 | 954 | else false | |
955 | 955 | if ((err == err)) | |
956 | 956 | then $Tuple2(_savePause(false), unit) | |
957 | 957 | else throw("Strict value is not equal to itself.") | |
958 | 958 | } | |
959 | 959 | ||
960 | 960 | ||
961 | 961 | ||
962 | 962 | @Callable(i) | |
963 | 963 | func updatePauser (pauser_) = { | |
964 | 964 | let err = if (if (_onlyThisContract(i.caller)) | |
965 | 965 | then _whenInitialized() | |
966 | 966 | else false) | |
967 | 967 | then _validateAddress(pauser_, "updatePauser: invalid pauser") | |
968 | 968 | else false | |
969 | 969 | if ((err == err)) | |
970 | 970 | then $Tuple2(_savePauser(addressFromStringValue(pauser_)), unit) | |
971 | 971 | else throw("Strict value is not equal to itself.") | |
972 | 972 | } | |
973 | 973 | ||
974 | 974 | ||
975 | 975 | ||
976 | 976 | @Callable(i) | |
977 | 977 | func setMultisig (multisig_) = { | |
978 | 978 | let err = if (_onlyThisContract(i.caller)) | |
979 | 979 | then _validateAddress(multisig_, "setMultisig: invalid multisig") | |
980 | 980 | else false | |
981 | 981 | if ((err == err)) | |
982 | 982 | then $Tuple2(_saveMultisig(addressFromStringValue(multisig_)), unit) | |
983 | 983 | else throw("Strict value is not equal to itself.") | |
984 | 984 | } | |
985 | 985 | ||
986 | 986 | ||
987 | 987 | @Verifier(tx) | |
988 | 988 | func verify () = match getString(KEY_MULTISIG) { | |
989 | 989 | case multisig: String => | |
990 | 990 | valueOrElse(getBoolean(addressFromStringValue(multisig), makeString([KEY_STATUS, toString(this), toBase58String(tx.id)], SEPARATOR)), false) | |
991 | 991 | case _ => | |
992 | 992 | sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
993 | 993 | } | |
994 | 994 |
github/deemru/w8io/026f985 83.43 ms ◑