tx · HabcFfDoT4S38HU5ePE6Z8UT7bXgACUcxfjXtnx2pGUC

3Mr7Qu4DoK2AG3aFJkavD1QfLeYZ9JQkf2z:  -0.01800000 Waves

2023.07.04 16:56 [2651246] smart account 3Mr7Qu4DoK2AG3aFJkavD1QfLeYZ9JQkf2z > SELF 0.00000000 Waves

{ "type": 13, "id": "HabcFfDoT4S38HU5ePE6Z8UT7bXgACUcxfjXtnx2pGUC", "fee": 1800000, "feeAssetId": null, "timestamp": 1688478956720, "version": 2, "chainId": 84, "sender": "3Mr7Qu4DoK2AG3aFJkavD1QfLeYZ9JQkf2z", "senderPublicKey": "EAKRfs8swGWZJwXuunVL2epKZGzqzd5kZPfksHXQvESb", "proofs": [ "w6pNySf3BeUaEPnMiUqMMYDbm6XL3siTNJYfuHh4h1PXeRsQ2tuhv7BXEwdrgut2HgCm1DDiXv4Xcc5d4Sg6uxm" ], "script": "base64:BgJcCAISBgoECAgICBIJCgcICAgICAgIEgUKAwEIARIGCgQBCAgBEgQKAgEIEgMKAQgSBAoCAQQSAwoBCBIFCgMBCAESCwoJAQgIAQEBAQEEEgASABIDCgEIEgMKAQhAAAlTRVBBUkFUT1ICAl9fAAhLRVlfSU5JVAIESU5JVAAMS0VZX01VTFRJU0lHAghNVUxUSVNJRwAKS0VZX1NUQVRVUwIGU1RBVFVTAApLRVlfUEFVU0VEAgZQQVVTRUQACktFWV9QQVVTRVICBlBBVVNFUgAMS0VZX0VYRUNVVE9SAghFWEVDVVRPUgAQS0VZX1JPT1RfQURBUFRFUgIMUk9PVF9BREFQVEVSABNLRVlfQ0FMTEVSX0NPTlRSQUNUAg9DQUxMRVJfQ09OVFJBQ1QACUtFWV9DSEFJTgIFQ0hBSU4AC0tFWV9CSU5ESU5HAgdCSU5ESU5HAAdLRVlfRkVFAgNGRUUAEUtFWV9GRUVfUkVDSVBJRU5UAg1GRUVfUkVDSVBJRU5UABhLRVlfUkVGRVJSRVJfRkVFX1BFUkNFTlQCFFJFRkVSUkVSX0ZFRV9QRVJDRU5UABNGVU5DX1JFTEVBU0VfVE9LRU5TAg1yZWxlYXNlVG9rZW5zAAVXQVZFUwIFV0FWRVMADldBVkVTX0RFQ0lNQUxTAAgACERFQ0lNQUxTAAYADlBFUkNFTlRfRkFDVE9SAMCEPQAQTUFYX1JFRkVSUkVSX0ZFRQDAmgwAB01BWF9JTlQA//////////9/ARBfdmFsaWRhdGVBZGRyZXNzAghhZGRyZXNzXwRlcnJfBAckbWF0Y2gwCQCmCAEFCGFkZHJlc3NfAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAGCQACAQUEZXJyXwEOX3ZhbGlkYXRlQXNzZXQCCGFzc2V0SWRfBGVycl8EByRtYXRjaDAJAOwHAQkA2QQBBQhhc3NldElkXwMJAAECBQckbWF0Y2gwAgVBc3NldAQBYQUHJG1hdGNoMAYJAAIBBQRlcnJfAQxfdmFsaWRhdGVJbnQEBHZhbF8ObG93ZXJCb3VuZGFyeV8OdXBwZXJCb3VuZGFyeV8EZXJyXwMDCQBmAgUObG93ZXJCb3VuZGFyeV8FBHZhbF8GCQBmAgUEdmFsXwUOdXBwZXJCb3VuZGFyeV8JAAIBBQRlcnJfBgENX3ZhbGlkYXRlQm9vbAMEdmFsXwd0YXJnZXRfBGVycl8DCQECIT0CBQR2YWxfBQd0YXJnZXRfCQACAQUEZXJyXwYBFV92YWxpZGF0ZVBheW1lbnRzU2l6ZQMJcGF5bWVudHNfB3RhcmdldF8EZXJyXwMJAQIhPQIJAJADAQUJcGF5bWVudHNfBQd0YXJnZXRfCQACAQUEZXJyXwYBEV92YWxpZGF0ZVJlZmVycmVyAglyZWZlcnJlcl8EZXJyXwMJAQIhPQIFCXJlZmVycmVyXwIACQEQX3ZhbGlkYXRlQWRkcmVzcwIFCXJlZmVycmVyXwUEZXJyXwYBEl9ub3JtYWxpemVEZWNpbWFscwMHYW1vdW50Xw9zb3VyY2VEZWNpbWFsc18PdGFyZ2V0RGVjaW1hbHNfAwkAZwIFD3NvdXJjZURlY2ltYWxzXwUPdGFyZ2V0RGVjaW1hbHNfCQBpAgUHYW1vdW50XwkAbAYACgAACQBlAgUPc291cmNlRGVjaW1hbHNfBQ90YXJnZXREZWNpbWFsc18AAAAABQRET1dOCQBoAgUHYW1vdW50XwkAbAYACgAACQBlAgUPdGFyZ2V0RGVjaW1hbHNfBQ9zb3VyY2VEZWNpbWFsc18AAAAABQRET1dOAQlfbG9hZEluaXQABAckbWF0Y2gwCQCgCAEFCEtFWV9JTklUAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWEFByRtYXRjaDAFAWEHAQlfc2F2ZUluaXQBB2lzSW5pdF8JAMwIAgkBDEJvb2xlYW5FbnRyeQIFCEtFWV9JTklUBQdpc0luaXRfBQNuaWwBCl9sb2FkUGF1c2UABAckbWF0Y2gwCQCgCAEFCktFWV9QQVVTRUQDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBYQUHJG1hdGNoMAUBYQcBCl9zYXZlUGF1c2UBCWlzUGF1c2VkXwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUKS0VZX1BBVVNFRAUJaXNQYXVzZWRfBQNuaWwBC19sb2FkUGF1c2VyAAQHJG1hdGNoMAkAoggBBQpLRVlfUEFVU0VSAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkBB0FkZHJlc3MBAQABC19zYXZlUGF1c2VyAQdwYXVzZXJfCQDMCAIJAQtTdHJpbmdFbnRyeQIFCktFWV9QQVVTRVIJAKUIAQUHcGF1c2VyXwUDbmlsAQ1fbG9hZE11bHRpc2lnAAQHJG1hdGNoMAkAoggBBQxLRVlfTVVMVElTSUcDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFhCQEHQWRkcmVzcwEBAAENX3NhdmVNdWx0aXNpZwEJbXVsdGlzaWdfCQDMCAIJAQtTdHJpbmdFbnRyeQIFDEtFWV9NVUxUSVNJRwkApQgBBQltdWx0aXNpZ18FA25pbAENX2xvYWRFeGVjdXRvcgAEByRtYXRjaDAJAKIIAQUMS0VZX0VYRUNVVE9SAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkBB0FkZHJlc3MBAQABDV9zYXZlRXhlY3V0b3IBCWV4ZWN1dG9yXwkAzAgCCQELU3RyaW5nRW50cnkCBQxLRVlfRVhFQ1VUT1IJAKUIAQUJZXhlY3V0b3JfBQNuaWwBE19sb2FkQ2FsbGVyQ29udHJhY3QABAckbWF0Y2gwCQCiCAEFE0tFWV9DQUxMRVJfQ09OVFJBQ1QDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBQFhAgABE19zYXZlQ2FsbGVyQ29udHJhY3QBB2NhbGxlcl8JAMwIAgkBC1N0cmluZ0VudHJ5AgUTS0VZX0NBTExFUl9DT05UUkFDVAUHY2FsbGVyXwUDbmlsAQpfbG9hZENoYWluAQhjaGFpbklkXwQHJG1hdGNoMAkAoAgBCQC5CQIJAMwIAgUJS0VZX0NIQUlOCQDMCAIJAKQDAQUIY2hhaW5JZF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWEFByRtYXRjaDAFAWEHAQpfc2F2ZUNoYWluAghjaGFpbklkXwR2YWxfCQDMCAIJAQxCb29sZWFuRW50cnkCCQC5CQIJAMwIAgUJS0VZX0NIQUlOCQDMCAIJAKQDAQUIY2hhaW5JZF8FA25pbAUJU0VQQVJBVE9SBQR2YWxfBQNuaWwBDF9sb2FkQmluZGluZwIRZXhlY3V0aW9uQ2hhaW5JZF8IYXNzZXRJZF8EByRtYXRjaDAJAKIIAQkAuQkCCQDMCAIFC0tFWV9CSU5ESU5HCQDMCAIJAKQDAQURZXhlY3V0aW9uQ2hhaW5JZF8JAMwIAgkA2AQBBQhhc3NldElkXwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBAZzdHJ1Y3QJALUJAgUBYQUJU0VQQVJBVE9SCQCaCggJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUGc3RydWN0AAAJAJEDAgUGc3RydWN0AAEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QAAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAADCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QABQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAAGAwkAAAIJAJEDAgUGc3RydWN0AAcCATEGBwkAmgoICQEHQWRkcmVzcwEBAAIAAAAAAAAAAAAAAAcBDF9zYXZlQmluZGluZwMRZXhlY3V0aW9uQ2hhaW5JZF8IYXNzZXRJZF8IYmluZGluZ18JAMwIAgkBC1N0cmluZ0VudHJ5AgkAuQkCCQDMCAIFC0tFWV9CSU5ESU5HCQDMCAIJAKQDAQURZXhlY3V0aW9uQ2hhaW5JZF8JAMwIAgkA2AQBBQhhc3NldElkXwUDbmlsBQlTRVBBUkFUT1IJALkJAgkAzAgCCQClCAEIBQhiaW5kaW5nXwJfMQkAzAgCCAUIYmluZGluZ18CXzIJAMwIAgkApAMBCAUIYmluZGluZ18CXzMJAMwIAgkApAMBCAUIYmluZGluZ18CXzQJAMwIAgkApAMBCAUIYmluZGluZ18CXzUJAMwIAgkApAMBCAUIYmluZGluZ18CXzYJAMwIAgkApAMBCAUIYmluZGluZ18CXzcJAMwIAgMIBQhiaW5kaW5nXwJfOAIBMQIBMAUDbmlsBQlTRVBBUkFUT1IFA25pbAEIX2xvYWRGZWUBCGFzc2V0SWRfBAckbWF0Y2gwCQCfCAEJALkJAgkAzAgCBQdLRVlfRkVFCQDMCAIJANgEAQUIYXNzZXRJZF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAAQhfc2F2ZUZlZQIIYXNzZXRJZF8EdmFsXwkAzAgCCQEMSW50ZWdlckVudHJ5AgkAuQkCCQDMCAIFB0tFWV9GRUUJAMwIAgkA2AQBBQhhc3NldElkXwUDbmlsBQlTRVBBUkFUT1IFBHZhbF8FA25pbAEQX2xvYWRSb290QWRhcHRlcgAEByRtYXRjaDAJAKIIAQUQS0VZX1JPT1RfQURBUFRFUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAARBfc2F2ZVJvb3RBZGFwdGVyAQhhZGFwdGVyXwkAzAgCCQELU3RyaW5nRW50cnkCBRBLRVlfUk9PVF9BREFQVEVSCQClCAEFCGFkYXB0ZXJfBQNuaWwBEV9sb2FkRmVlUmVjaXBpZW50AAQHJG1hdGNoMAkAoggBBRFLRVlfRkVFX1JFQ0lQSUVOVAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAARFfc2F2ZUZlZVJlY2lwaWVudAEEdmFsXwkAzAgCCQELU3RyaW5nRW50cnkCBRFLRVlfRkVFX1JFQ0lQSUVOVAkApQgBBQR2YWxfBQNuaWwBF19sb2FkUmVmZXJyZXJGZWVQZXJjZW50AhFleGVjdXRpb25DaGFpbklkXwlyZWZlcnJlcl8EByRtYXRjaDAJAJ8IAQkAuQkCCQDMCAIFGEtFWV9SRUZFUlJFUl9GRUVfUEVSQ0VOVAkAzAgCCQCkAwEFEWV4ZWN1dGlvbkNoYWluSWRfCQDMCAIJAKUIAQUJcmVmZXJyZXJfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAEXX3NhdmVSZWZlcnJlckZlZVBlcmNlbnQDEWV4ZWN1dGlvbkNoYWluSWRfCXJlZmVycmVyXwR2YWxfCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQC5CQIJAMwIAgUYS0VZX1JFRkVSUkVSX0ZFRV9QRVJDRU5UCQDMCAIJAKQDAQURZXhlY3V0aW9uQ2hhaW5JZF8JAMwIAgkApQgBBQlyZWZlcnJlcl8FA25pbAUJU0VQQVJBVE9SBQR2YWxfBQNuaWwBEV9vbmx5VGhpc0NvbnRyYWN0AQdjYWxsZXJfAwkBAiE9AgUHY2FsbGVyXwUEdGhpcwkAAgECGV9vbmx5VGhpc0NvbnRyYWN0OiByZXZlcnQGARBfd2hlbk11bHRpc2lnU2V0AAMJAAACCQENX2xvYWRNdWx0aXNpZwAJAQdBZGRyZXNzAQEACQACAQIYX3doZW5NdWx0aXNpZ1NldDogcmV2ZXJ0BgETX3doZW5Ob3RJbml0aWFsaXplZAADCQEJX2xvYWRJbml0AAkAAgECG193aGVuTm90SW5pdGlhbGl6ZWQ6IHJldmVydAYBEF93aGVuSW5pdGlhbGl6ZWQAAwkBASEBCQEJX2xvYWRJbml0AAkAAgECGF93aGVuSW5pdGlhbGl6ZWQ6IHJldmVydAYBDl93aGVuTm90UGF1c2VkAAMJAQpfbG9hZFBhdXNlAAkAAgECFl93aGVuTm90UGF1c2VkOiByZXZlcnQGAQtfd2hlblBhdXNlZAADCQEBIQEJAQpfbG9hZFBhdXNlAAkAAgECE193aGVuUGF1c2VkOiByZXZlcnQGAQtfb25seVBhdXNlcgEHY2FsbGVyXwMJAQIhPQIFB2NhbGxlcl8JAQtfbG9hZFBhdXNlcgAJAAIBAhNfb25seVBhdXNlcjogcmV2ZXJ0BgEGX2FzSW50AQR2YWxfBAckbWF0Y2gwBQR2YWxfAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQkAAgECDl9hc0ludDogcmV2ZXJ0AQhfYXNCeXRlcwEEdmFsXwQHJG1hdGNoMAUEdmFsXwMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFhBQckbWF0Y2gwBQFhCQACAQIQX2FzQnl0ZXM6IHJldmVydAERX3ZhbGlkYXRlRXhlY3V0b3ICBHZhbF8EZXJyXwMJAQIhPQIFBHZhbF8JAQ1fbG9hZEV4ZWN1dG9yAAkAAgEFBGVycl8GAQ9fdmFsaWRhdGVDYWxsZXICBHZhbF8EZXJyXwMJAQIhPQIFBHZhbF8JARNfbG9hZENhbGxlckNvbnRyYWN0AAkAAgEFBGVycl8GAQ5fdmFsaWRhdGVDaGFpbgIRZXhlY3V0aW9uQ2hhaW5JZF8EZXJyXwMJAQEhAQkBCl9sb2FkQ2hhaW4BBRFleGVjdXRpb25DaGFpbklkXwkAAgEFBGVycl8GDgFpAQRpbml0BAlleGVjdXRvcl8IYWRhcHRlcl8HcGF1c2VyXw1mZWVSZWNpcGllbnRfBANlcnIDAwMDAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBE193aGVuTm90SW5pdGlhbGl6ZWQABwkBEF93aGVuTXVsdGlzaWdTZXQABwkBEF92YWxpZGF0ZUFkZHJlc3MCBQlleGVjdXRvcl8CFmluaXQ6IGludmFsaWQgZXhlY3V0b3IHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFCGFkYXB0ZXJfAhVpbml0OiBpbnZhbGlkIGFkYXB0ZXIHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFB3BhdXNlcl8CFGluaXQ6IGludmFsaWQgcGF1c2VyBwkBEF92YWxpZGF0ZUFkZHJlc3MCBQ1mZWVSZWNpcGllbnRfAhppbml0OiBpbnZhbGlkIGZlZVJlY2lwaWVudAcDCQAAAgUDZXJyBQNlcnIJAJQKAgkAzggCCQDOCAIJAM4IAgkAzggCCQEJX3NhdmVJbml0AQYJAQ1fc2F2ZUV4ZWN1dG9yAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUJZXhlY3V0b3JfCQEQX3NhdmVSb290QWRhcHRlcgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCGFkYXB0ZXJfCQELX3NhdmVQYXVzZXIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQdwYXVzZXJfCQERX3NhdmVGZWVSZWNpcGllbnQBCQERQGV4dHJOYXRpdmUoMTA2MikBBQ1mZWVSZWNpcGllbnRfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCm1pbnRUb2tlbnMHD2NhbGxlckNvbnRyYWN0Xw5hc3NldENvbnRyYWN0XwdhbW91bnRfCnJlY2lwaWVudF8OZ2FzbGVzc1Jld2FyZF8JcmVmZXJyZXJfDHJlZmVycmVyRmVlXwQGYW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQUHYW1vdW50XwIXbWludDogYW1vdW50IGlzIG5vdCBJbnQEDWdhc2xlc3NSZXdhcmQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBBQ5nYXNsZXNzUmV3YXJkXwIebWludDogZ2FzbGVzc1Jld2FyZCBpcyBub3QgSW50BAtyZWZlcnJlckZlZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEFDHJlZmVycmVyRmVlXwIcbWludDogcmVmZXJyZXJGZWUgaXMgbm90IEludAQDZXJyAwMDAwMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJARBfdmFsaWRhdGVBZGRyZXNzAgUOYXNzZXRDb250cmFjdF8CHG1pbnQ6IGludmFsaWQgYXNzZXQgY29udHJhY3QHCQERX3ZhbGlkYXRlRXhlY3V0b3ICCAUBaQZjYWxsZXICFm1pbnQ6IGludmFsaWQgZXhlY3V0b3IHCQEPX3ZhbGlkYXRlQ2FsbGVyAgUPY2FsbGVyQ29udHJhY3RfAhRtaW50OiBpbnZhbGlkIGNhbGxlcgcJARBfdmFsaWRhdGVBZGRyZXNzAgUKcmVjaXBpZW50XwIfbWludDogaW52YWxpZCByZWNpcGllbnQgYWRkcmVzcwcJAQxfdmFsaWRhdGVJbnQEBQZhbW91bnQAAAUHTUFYX0lOVAIUbWludDogaW52YWxpZCBhbW91bnQHCQEMX3ZhbGlkYXRlSW50BAUNZ2FzbGVzc1Jld2FyZAAABQdNQVhfSU5UAhttaW50OiBpbnZhbGlkIGdhc2xlc3NSZXdhcmQHCQEMX3ZhbGlkYXRlSW50BAULcmVmZXJyZXJGZWUAAAUHTUFYX0lOVAIabWludDogaW52YWxpZCByZWZlcnJlciBmZWUHAwkAAAIFA2VycgUDZXJyBAdhc3NldElkCQEIX2FzQnl0ZXMBCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDmFzc2V0Q29udHJhY3RfAgpnZXRBc3NldElkBQNuaWwFA25pbAMJAAACBQdhc3NldElkBQdhc3NldElkBA1hc3NldERlY2ltYWxzCQEGX2FzSW50AQkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQ5hc3NldENvbnRyYWN0XwILZ2V0RGVjaW1hbHMFA25pbAUDbmlsAwkAAAIFDWFzc2V0RGVjaW1hbHMFDWFzc2V0RGVjaW1hbHMEEG5vcm1hbGl6ZWRBbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMDBQZhbW91bnQFCERFQ0lNQUxTBQ1hc3NldERlY2ltYWxzBBFub3JtYWxpemVkR2FzbGVzcwkBEl9ub3JtYWxpemVEZWNpbWFscwMFDWdhc2xlc3NSZXdhcmQFCERFQ0lNQUxTBQ1hc3NldERlY2ltYWxzBAhyZWZlcnJlcgQHJG1hdGNoMAkApggBBQlyZWZlcnJlcl8DCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQOcmVmZXJlckFkZHJlc3MFByRtYXRjaDAEFW5vcm1hbGl6ZWRSZWZlcnJlckZlZQkBEl9ub3JtYWxpemVEZWNpbWFscwMFC3JlZmVycmVyRmVlBQhERUNJTUFMUwUNYXNzZXREZWNpbWFscwkAlAoCBRVub3JtYWxpemVkUmVmZXJyZXJGZWUJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUOcmVmZXJlckFkZHJlc3MFFW5vcm1hbGl6ZWRSZWZlcnJlckZlZQUHYXNzZXRJZAUDbmlsCQCUCgIAAAUDbmlsBBVub3JtYWxpemVkUmVmZXJyZXJGZWUIBQhyZWZlcnJlcgJfMQQPcmVmZXJyZXJBY3Rpb25zCAUIcmVmZXJyZXICXzIECmludm9jYXRpb24JAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUOYXNzZXRDb250cmFjdF8CBG1pbnQJAMwIAgkAZAIFEG5vcm1hbGl6ZWRBbW91bnQFFW5vcm1hbGl6ZWRSZWZlcnJlckZlZQkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAAIFCmludm9jYXRpb24FCmludm9jYXRpb24EB2FjdGlvbnMDAwkAZgIFEW5vcm1hbGl6ZWRHYXNsZXNzAAAJAQIhPQIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCnJlY2lwaWVudF8IBQFpDG9yaWdpbkNhbGxlcgcJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUKcmVjaXBpZW50XwkAZQIFEG5vcm1hbGl6ZWRBbW91bnQFEW5vcm1hbGl6ZWRHYXNsZXNzBQdhc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpDG9yaWdpbkNhbGxlcgURbm9ybWFsaXplZEdhc2xlc3MFB2Fzc2V0SWQFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQpyZWNpcGllbnRfBRBub3JtYWxpemVkQW1vdW50BQdhc3NldElkBQNuaWwJAJQKAgkAzggCBQdhY3Rpb25zBQ9yZWZlcnJlckFjdGlvbnMFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKYnVyblRva2VucwMRZXhlY3V0aW9uQ2hhaW5JZF8KcmVjaXBpZW50Xw5nYXNsZXNzUmV3YXJkXwQDZXJyAwMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJAQ5fdmFsaWRhdGVDaGFpbgIFEWV4ZWN1dGlvbkNoYWluSWRfAiNidXJuVG9rZW5zOiBpbnZhbGlkIGV4ZWN1dGlvbiBjaGFpbgcJARVfdmFsaWRhdGVQYXltZW50c1NpemUDCAUBaQhwYXltZW50cwABAhZidXJuVG9rZW5zOiBubyBwYXltZW50BwkBDF92YWxpZGF0ZUludAQFDmdhc2xlc3NSZXdhcmRfAAAFB01BWF9JTlQCIWJ1cm5Ub2tlbnM6IGludmFsaWQgZ2FzbGVzc1Jld2FyZAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAAABQdNQVhfSU5UAiJidXJuVG9rZW5zOiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwMJAAACBQNlcnIFA2VycgQGYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQHYXNzZXRJZAQHJG1hdGNoMAgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWEFByRtYXRjaDAFAWEJAAIBAhlidXJuVG9rZW5zOiBpbnZhbGlkIGFzc2V0BAdiaW5kaW5nCQEMX2xvYWRCaW5kaW5nAgURZXhlY3V0aW9uQ2hhaW5JZF8FB2Fzc2V0SWQEDWFzc2V0Q29udHJhY3QIBQdiaW5kaW5nAl8xBA5leGVjdXRpb25Bc3NldAgFB2JpbmRpbmcCXzIECW1pbkFtb3VudAgFB2JpbmRpbmcCXzMEBm1pbkZlZQgFB2JpbmRpbmcCXzQEDHRocmVzaG9sZEZlZQgFB2JpbmRpbmcCXzUEEGJlZm9yZVBlcmNlbnRGZWUIBQdiaW5kaW5nAl82BA9hZnRlclBlcmNlbnRGZWUIBQdiaW5kaW5nAl83BAdlbmFibGVkCAUHYmluZGluZwJfOAQEZXJyMQMDCQEQX3ZhbGlkYXRlQWRkcmVzcwIJAKUIAQUNYXNzZXRDb250cmFjdAIbYnVyblRva2Vuczogbm8gc3VjaCBiaW5kaW5nCQEMX3ZhbGlkYXRlSW50BAUGYW1vdW50BQltaW5BbW91bnQFB01BWF9JTlQCGWJ1cm5Ub2tlbnM6IGxlc3MgdGhhbiBtaW4HCQENX3ZhbGlkYXRlQm9vbAMFB2VuYWJsZWQGAh1idXJuVG9rZW5zOiB0b2tlbiBpcyBkaXNhYmxlZAcDCQAAAgUEZXJyMQUEZXJyMQQNYXNzZXREZWNpbWFscwkBBl9hc0ludAEJAPwHBAUNYXNzZXRDb250cmFjdAILZ2V0RGVjaW1hbHMFA25pbAUDbmlsAwkAAAIFDWFzc2V0RGVjaW1hbHMFDWFzc2V0RGVjaW1hbHMEB3BlcmNlbnQDCQBmAgUGYW1vdW50BQx0aHJlc2hvbGRGZWUFD2FmdGVyUGVyY2VudEZlZQUQYmVmb3JlUGVyY2VudEZlZQQDZmVlCQBkAgUGbWluRmVlCQBrAwUGYW1vdW50BQdwZXJjZW50BQ5QRVJDRU5UX0ZBQ1RPUgQEZXJyMgkBDF92YWxpZGF0ZUludAQFBmFtb3VudAkAZAIFA2ZlZQABBQdNQVhfSU5UAiBidXJuVG9rZW5zOiBmZWUgbW9yZSB0aGFuIGFtb3VudAMJAAACBQRlcnIyBQRlcnIyBAxhbW91bnRUb1NlbmQJAGUCBQZhbW91bnQFA2ZlZQQEZXJyMwkBDF92YWxpZGF0ZUludAQFDGFtb3VudFRvU2VuZAkAZAIFDmdhc2xlc3NSZXdhcmRfAAEFB01BWF9JTlQCI2J1cm5Ub2tlbnM6IHJld2FyZCBtb3JlIHRoYW4gYW1vdW50AwkAAAIFBGVycjMFBGVycjMECXVwZGF0ZUZlZQkAZAIJAQhfbG9hZEZlZQEFB2Fzc2V0SWQFA2ZlZQQQbm9ybWFsaXplZEFtb3VudAkBEl9ub3JtYWxpemVEZWNpbWFscwMFDGFtb3VudFRvU2VuZAUNYXNzZXREZWNpbWFscwUIREVDSU1BTFMEEW5vcm1hbGl6ZWRHYXNsZXNzCQESX25vcm1hbGl6ZURlY2ltYWxzAwUOZ2FzbGVzc1Jld2FyZF8FDWFzc2V0RGVjaW1hbHMFCERFQ0lNQUxTBAppbnZvY2F0aW9uCQD8BwQJARBfbG9hZFJvb3RBZGFwdGVyAAUTRlVOQ19SRUxFQVNFX1RPS0VOUwkAzAgCBRFleGVjdXRpb25DaGFpbklkXwkAzAgCBQ5leGVjdXRpb25Bc3NldAkAzAgCBRBub3JtYWxpemVkQW1vdW50CQDMCAIFCnJlY2lwaWVudF8JAMwIAgURbm9ybWFsaXplZEdhc2xlc3MFA25pbAUDbmlsAwkAAAIFCmludm9jYXRpb24FCmludm9jYXRpb24JAJQKAgkAzggCCQEIX3NhdmVGZWUCBQdhc3NldElkBQl1cGRhdGVGZWUJAMwIAgkBBEJ1cm4CBQdhc3NldElkBQxhbW91bnRUb1NlbmQFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQxidXJuVG9rZW5zVjIEEWV4ZWN1dGlvbkNoYWluSWRfCnJlY2lwaWVudF8JcmVmZXJyZXJfDmdhc2xlc3NSZXdhcmRfBANlcnIDAwMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJAQ5fdmFsaWRhdGVDaGFpbgIFEWV4ZWN1dGlvbkNoYWluSWRfAiVidXJuVG9rZW5zVjI6IGludmFsaWQgZXhlY3V0aW9uIGNoYWluBwkBFV92YWxpZGF0ZVBheW1lbnRzU2l6ZQMIBQFpCHBheW1lbnRzAAECGGJ1cm5Ub2tlbnNWMjogbm8gcGF5bWVudAcJAQxfdmFsaWRhdGVJbnQEBQ5nYXNsZXNzUmV3YXJkXwAABQdNQVhfSU5UAiNidXJuVG9rZW5zVjI6IGludmFsaWQgZ2FzbGVzc1Jld2FyZAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAAABQdNQVhfSU5UAiRidXJuVG9rZW5zVjI6IGludmFsaWQgcGF5bWVudCBhbW91bnQHCQERX3ZhbGlkYXRlUmVmZXJyZXICBQlyZWZlcnJlcl8CHmJ1cm5Ub2tlbnNWMjogaW52YWxpZCByZWZlcnJlcgcDCQAAAgUDZXJyBQNlcnIEBmFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQEB2Fzc2V0SWQEByRtYXRjaDAICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFhBQckbWF0Y2gwBQFhCQACAQIbYnVyblRva2Vuc1YyOiBpbnZhbGlkIGFzc2V0BAdiaW5kaW5nCQEMX2xvYWRCaW5kaW5nAgURZXhlY3V0aW9uQ2hhaW5JZF8FB2Fzc2V0SWQEDWFzc2V0Q29udHJhY3QIBQdiaW5kaW5nAl8xBA5leGVjdXRpb25Bc3NldAgFB2JpbmRpbmcCXzIECW1pbkFtb3VudAgFB2JpbmRpbmcCXzMEBm1pbkZlZQgFB2JpbmRpbmcCXzQEDHRocmVzaG9sZEZlZQgFB2JpbmRpbmcCXzUEEGJlZm9yZVBlcmNlbnRGZWUIBQdiaW5kaW5nAl82BA9hZnRlclBlcmNlbnRGZWUIBQdiaW5kaW5nAl83BAdlbmFibGVkCAUHYmluZGluZwJfOAQEZXJyMQMDCQEQX3ZhbGlkYXRlQWRkcmVzcwIJAKUIAQUNYXNzZXRDb250cmFjdAIdYnVyblRva2Vuc1YyOiBubyBzdWNoIGJpbmRpbmcJAQxfdmFsaWRhdGVJbnQEBQZhbW91bnQFCW1pbkFtb3VudAUHTUFYX0lOVAIbYnVyblRva2Vuc1YyOiBsZXNzIHRoYW4gbWluBwkBDV92YWxpZGF0ZUJvb2wDBQdlbmFibGVkBgIfYnVyblRva2Vuc1YyOiB0b2tlbiBpcyBkaXNhYmxlZAcDCQAAAgUEZXJyMQUEZXJyMQQNYXNzZXREZWNpbWFscwkBBl9hc0ludAEJAPwHBAUNYXNzZXRDb250cmFjdAILZ2V0RGVjaW1hbHMFA25pbAUDbmlsAwkAAAIFDWFzc2V0RGVjaW1hbHMFDWFzc2V0RGVjaW1hbHMEB3BlcmNlbnQDCQBmAgUGYW1vdW50BQx0aHJlc2hvbGRGZWUFD2FmdGVyUGVyY2VudEZlZQUQYmVmb3JlUGVyY2VudEZlZQQDZmVlCQBkAgUGbWluRmVlCQBrAwUGYW1vdW50BQdwZXJjZW50BQ5QRVJDRU5UX0ZBQ1RPUgQEZXJyMgkBDF92YWxpZGF0ZUludAQFBmFtb3VudAkAZAIFA2ZlZQABBQdNQVhfSU5UAiJidXJuVG9rZW5zVjI6IGZlZSBtb3JlIHRoYW4gYW1vdW50AwkAAAIFBGVycjIFBGVycjIEDSR0MDE2MjAxMTY2MDYDCQECIT0CBQlyZWZlcnJlcl8CAAQIcmVmZXJyZXIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCXJlZmVycmVyXwQRcmVmZXJyZXJGZWVBbW91bnQJAGsDCQEXX2xvYWRSZWZlcnJlckZlZVBlcmNlbnQCBRFleGVjdXRpb25DaGFpbklkXwUIcmVmZXJyZXIFA2ZlZQUOUEVSQ0VOVF9GQUNUT1IJAJQKAgURcmVmZXJyZXJGZWVBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIcmVmZXJyZXIFEXJlZmVycmVyRmVlQW1vdW50BQdhc3NldElkBQNuaWwJAJQKAgAABQNuaWwEC3JlZmVycmVyRmVlCAUNJHQwMTYyMDExNjYwNgJfMQQPcmVmZXJyZXJBY3Rpb25zCAUNJHQwMTYyMDExNjYwNgJfMgQMYW1vdW50VG9TZW5kCQBlAgUGYW1vdW50BQNmZWUEBGVycjMJAQxfdmFsaWRhdGVJbnQEBQxhbW91bnRUb1NlbmQJAGQCBQ5nYXNsZXNzUmV3YXJkXwABBQdNQVhfSU5UAiVidXJuVG9rZW5zVjI6IHJld2FyZCBtb3JlIHRoYW4gYW1vdW50AwkAAAIFBGVycjMFBGVycjMECXVwZGF0ZUZlZQkAZQIJAGQCCQEIX2xvYWRGZWUBBQdhc3NldElkBQNmZWUFC3JlZmVycmVyRmVlBBBub3JtYWxpemVkQW1vdW50CQESX25vcm1hbGl6ZURlY2ltYWxzAwUMYW1vdW50VG9TZW5kBQ1hc3NldERlY2ltYWxzBQhERUNJTUFMUwQRbm9ybWFsaXplZEdhc2xlc3MJARJfbm9ybWFsaXplRGVjaW1hbHMDBQ5nYXNsZXNzUmV3YXJkXwUNYXNzZXREZWNpbWFscwUIREVDSU1BTFMECmludm9jYXRpb24JAPwHBAkBEF9sb2FkUm9vdEFkYXB0ZXIABRNGVU5DX1JFTEVBU0VfVE9LRU5TCQDMCAIFEWV4ZWN1dGlvbkNoYWluSWRfCQDMCAIFDmV4ZWN1dGlvbkFzc2V0CQDMCAIFEG5vcm1hbGl6ZWRBbW91bnQJAMwIAgUKcmVjaXBpZW50XwkAzAgCBRFub3JtYWxpemVkR2FzbGVzcwUDbmlsBQNuaWwDCQAAAgUKaW52b2NhdGlvbgUKaW52b2NhdGlvbgkAlAoCCQDOCAIJAM4IAgkBCF9zYXZlRmVlAgUHYXNzZXRJZAUJdXBkYXRlRmVlBQ9yZWZlcnJlckFjdGlvbnMJAMwIAgkBBEJ1cm4CBQdhc3NldElkBQxhbW91bnRUb1NlbmQFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQt0cmFuc2ZlckZlZQIRZXhlY3V0aW9uQ2hhaW5JZF8IYXNzZXRJZF8EA2VycgMDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHCQEOX3ZhbGlkYXRlQXNzZXQCBQhhc3NldElkXwIadHJhbnNmZXJGZWU6IGludmFsaWQgYXNzZXQHAwkAAAIFA2VycgUDZXJyBAdhc3NldElkCQDZBAEFCGFzc2V0SWRfBAdiaW5kaW5nCQEMX2xvYWRCaW5kaW5nAgURZXhlY3V0aW9uQ2hhaW5JZF8FB2Fzc2V0SWQEDWFzc2V0Q29udHJhY3QIBQdiaW5kaW5nAl8xBAdlbmFibGVkCAUHYmluZGluZwJfOAQEZXJyMQMJARBfdmFsaWRhdGVBZGRyZXNzAgkApQgBBQ1hc3NldENvbnRyYWN0Ahx0cmFuc2ZlckZlZTogbm8gc3VjaCBiaW5kaW5nCQENX3ZhbGlkYXRlQm9vbAMFB2VuYWJsZWQGAh50cmFuc2ZlckZlZTogdG9rZW4gaXMgZGlzYWJsZWQHAwkAAAIFBGVycjEFBGVycjEJAJQKAgkAzggCCQEIX3NhdmVGZWUCBQdhc3NldElkAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEV9sb2FkRmVlUmVjaXBpZW50AAkBCF9sb2FkRmVlAQUHYXNzZXRJZAUHYXNzZXRJZAUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFHVwZGF0ZUNhbGxlckNvbnRyYWN0AQ9jYWxsZXJDb250cmFjdF8EA2VycgMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwMJAAACBQNlcnIFA2VycgkAlAoCCQETX3NhdmVDYWxsZXJDb250cmFjdAEFD2NhbGxlckNvbnRyYWN0XwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARR1cGRhdGVFeGVjdXRpb25DaGFpbgIRZXhlY3V0aW9uQ2hhaW5JZF8IZW5hYmxlZF8EA2VycgMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJAQxfdmFsaWRhdGVJbnQEBRFleGVjdXRpb25DaGFpbklkXwAABQdNQVhfSU5UAi51cGRhdGVFeGVjdXRpb25DaGFpbjogaW52YWxpZCBleGVjdXRpb25DaGFpbklkBwMJAAACBQNlcnIFA2VycgkAlAoCCQEKX3NhdmVDaGFpbgIFEWV4ZWN1dGlvbkNoYWluSWRfBQhlbmFibGVkXwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARJ1cGRhdGVGZWVSZWNpcGllbnQBDWZlZVJlY2lwaWVudF8EA2VycgMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJARBfdmFsaWRhdGVBZGRyZXNzAgUNZmVlUmVjaXBpZW50XwIodXBkYXRlRmVlUmVjaXBpZW50OiBpbnZhbGlkIGZlZVJlY2lwaWVudAcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBEV9zYXZlRmVlUmVjaXBpZW50AQkBEUBleHRyTmF0aXZlKDEwNjIpAQUNZmVlUmVjaXBpZW50XwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ51cGRhdGVSZWZlcnJlcgMRZXhlY3V0aW9uQ2hhaW5JZF8JcmVmZXJyZXJfBGZlZV8EA2VycgMDAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBDl92YWxpZGF0ZUNoYWluAgURZXhlY3V0aW9uQ2hhaW5JZF8CJ3VwZGF0ZVJlZmVycmVyOiBpbnZhbGlkIGV4ZWN1dGlvbiBjaGFpbgcJARBfdmFsaWRhdGVBZGRyZXNzAgUJcmVmZXJyZXJfAiB1cGRhdGVSZWZlcnJlcjogaW52YWxpZCByZWZlcnJlcgcJAQxfdmFsaWRhdGVJbnQEBQRmZWVfAAAFEE1BWF9SRUZFUlJFUl9GRUUCG3VwZGF0ZVJlZmVycmVyOiBpbnZhbGlkIGZlZQcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBF19zYXZlUmVmZXJyZXJGZWVQZXJjZW50AwURZXhlY3V0aW9uQ2hhaW5JZF8JARFAZXh0ck5hdGl2ZSgxMDYyKQEFCXJlZmVycmVyXwUEZmVlXwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARF1cGRhdGVCaW5kaW5nSW5mbwkRZXhlY3V0aW9uQ2hhaW5JZF8OYXNzZXRDb250cmFjdF8PZXhlY3V0aW9uQXNzZXRfCm1pbkFtb3VudF8HbWluRmVlXw10aHJlc2hvbGRGZWVfEWJlZm9yZVBlcmNlbnRGZWVfEGFmdGVyUGVyY2VudEZlZV8IZW5hYmxlZF8EA2VycgMDAwMDAwMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJARBfdmFsaWRhdGVBZGRyZXNzAgUOYXNzZXRDb250cmFjdF8CKXVwZGF0ZUJpbmRpbmdJbmZvOiBpbnZhbGlkIGFzc2V0IGNvbnRyYWN0BwkBDF92YWxpZGF0ZUludAQFEWV4ZWN1dGlvbkNoYWluSWRfAAAFB01BWF9JTlQCK3VwZGF0ZUJpbmRpbmdJbmZvOiBpbnZhbGlkIGV4ZWN1dGlvbkNoYWluSWQHCQEMX3ZhbGlkYXRlSW50BAUKbWluQW1vdW50XwAABQdNQVhfSU5UAiR1cGRhdGVCaW5kaW5nSW5mbzogaW52YWxpZCBtaW5BbW91bnQHCQEMX3ZhbGlkYXRlSW50BAUHbWluRmVlXwAABQdNQVhfSU5UAiF1cGRhdGVCaW5kaW5nSW5mbzogaW52YWxpZCBtaW5GZWUHCQEMX3ZhbGlkYXRlSW50BAUNdGhyZXNob2xkRmVlXwAABQdNQVhfSU5UAid1cGRhdGVCaW5kaW5nSW5mbzogaW52YWxpZCB0aHJlc2hvbGRGZWUHCQEMX3ZhbGlkYXRlSW50BAURYmVmb3JlUGVyY2VudEZlZV8AAAUHTUFYX0lOVAIrdXBkYXRlQmluZGluZ0luZm86IGludmFsaWQgYmVmb3JlUGVyY2VudEZlZQcJAQxfdmFsaWRhdGVJbnQEBRBhZnRlclBlcmNlbnRGZWVfAAAFB01BWF9JTlQCKnVwZGF0ZUJpbmRpbmdJbmZvOiBpbnZhbGlkIGFmdGVyUGVyY2VudEZlZQcDCQAAAgUDZXJyBQNlcnIEB2Fzc2V0SWQJAQhfYXNCeXRlcwEJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUOYXNzZXRDb250cmFjdF8CCmdldEFzc2V0SWQFA25pbAUDbmlsAwkAAAIFB2Fzc2V0SWQFB2Fzc2V0SWQEB2JpbmRpbmcJAJoKCAkBEUBleHRyTmF0aXZlKDEwNjIpAQUOYXNzZXRDb250cmFjdF8FD2V4ZWN1dGlvbkFzc2V0XwUKbWluQW1vdW50XwUHbWluRmVlXwUNdGhyZXNob2xkRmVlXwURYmVmb3JlUGVyY2VudEZlZV8FEGFmdGVyUGVyY2VudEZlZV8FCGVuYWJsZWRfCQCUCgIJAQxfc2F2ZUJpbmRpbmcDBRFleGVjdXRpb25DaGFpbklkXwUHYXNzZXRJZAUHYmluZGluZwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVwYXVzZQAEA2VycgMDCQELX29ubHlQYXVzZXIBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJAQ5fd2hlbk5vdFBhdXNlZAAHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQpfc2F2ZVBhdXNlAQYFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHdW5wYXVzZQAEA2VycgMDCQELX29ubHlQYXVzZXIBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJAQtfd2hlblBhdXNlZAAHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQpfc2F2ZVBhdXNlAQcFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEMdXBkYXRlUGF1c2VyAQdwYXVzZXJfBANlcnIDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFB3BhdXNlcl8CHHVwZGF0ZVBhdXNlcjogaW52YWxpZCBwYXVzZXIHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQtfc2F2ZVBhdXNlcgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFB3BhdXNlcl8FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELc2V0TXVsdGlzaWcBCW11bHRpc2lnXwQDZXJyAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3ZhbGlkYXRlQWRkcmVzcwIFCW11bHRpc2lnXwIdc2V0TXVsdGlzaWc6IGludmFsaWQgbXVsdGlzaWcHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQ1fc2F2ZU11bHRpc2lnAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUJbXVsdGlzaWdfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQHJG1hdGNoMAkAoggBBQxLRVlfTVVMVElTSUcDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAhtdWx0aXNpZwUHJG1hdGNoMAkBC3ZhbHVlT3JFbHNlAgkAmwgCCQERQGV4dHJOYXRpdmUoMTA2MikBBQhtdWx0aXNpZwkAuQkCCQDMCAIFCktFWV9TVEFUVVMJAMwIAgkApQgBBQR0aGlzCQDMCAIJANgEAQgFAnR4AmlkBQNuaWwFCVNFUEFSQVRPUgcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXlCupyZ", "height": 2651246, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BvojsPSCZWGTtGoA2HbyPQ4zu7easss71LRS2FGEpCuR Next: 2rgekmRj7Au8tziYKm5hr74fGp8emVaqpHr8Gmpckpzu Diff:
OldNewDifferences
7373
7474 func _validatePaymentsSize (payments_,target_,err_) = if ((size(payments_) != target_))
7575 then throw(err_)
76+ else true
77+
78+
79+func _validateReferrer (referrer_,err_) = if ((referrer_ != ""))
80+ then _validateAddress(referrer_, err_)
7681 else true
7782
7883
373378 let err = if (if (if (if (if (_whenInitialized())
374379 then _whenNotPaused()
375380 else false)
376- then _validateChain(executionChainId_, "burn: invalid execution chain")
381+ then _validateChain(executionChainId_, "burnTokens: invalid execution chain")
377382 else false)
378- then _validatePaymentsSize(i.payments, 1, "burn: no payment")
383+ then _validatePaymentsSize(i.payments, 1, "burnTokens: no payment")
379384 else false)
380- then _validateInt(gaslessReward_, 0, MAX_INT, "burn: invalid gaslessReward")
385+ then _validateInt(gaslessReward_, 0, MAX_INT, "burnTokens: invalid gaslessReward")
381386 else false)
382- then _validateInt(i.payments[0].amount, 0, MAX_INT, "burn: invalid payment amount")
387+ then _validateInt(i.payments[0].amount, 0, MAX_INT, "burnTokens: invalid payment amount")
383388 else false
384389 if ((err == err))
385390 then {
388393 case a: ByteVector =>
389394 a
390395 case _ =>
391- throw("burn: invalid asset")
396+ throw("burnTokens: invalid asset")
392397 }
393398 let binding = _loadBinding(executionChainId_, assetId)
394399 let assetContract = binding._1
399404 let beforePercentFee = binding._6
400405 let afterPercentFee = binding._7
401406 let enabled = binding._8
402- let err1 = if (if (_validateAddress(toString(assetContract), "burn: no such binding"))
403- then _validateInt(amount, minAmount, MAX_INT, "burn: less than min")
407+ let err1 = if (if (_validateAddress(toString(assetContract), "burnTokens: no such binding"))
408+ then _validateInt(amount, minAmount, MAX_INT, "burnTokens: less than min")
404409 else false)
405- then _validateBool(enabled, true, "burn: token is disabled")
410+ then _validateBool(enabled, true, "burnTokens: token is disabled")
406411 else false
407412 if ((err1 == err1))
408413 then {
413418 then afterPercentFee
414419 else beforePercentFee
415420 let fee = (minFee + fraction(amount, percent, PERCENT_FACTOR))
416- let err2 = _validateInt(amount, (fee + 1), MAX_INT, "burn: fee more than amount")
421+ let err2 = _validateInt(amount, (fee + 1), MAX_INT, "burnTokens: fee more than amount")
417422 if ((err2 == err2))
418423 then {
419424 let amountToSend = (amount - fee)
420- let err3 = _validateInt(amountToSend, (gaslessReward_ + 1), MAX_INT, "burn: reward more than amount")
425+ let err3 = _validateInt(amountToSend, (gaslessReward_ + 1), MAX_INT, "burnTokens: reward more than amount")
421426 if ((err3 == err3))
422427 then {
423428 let updateFee = (_loadFee(assetId) + fee)
426431 let invocation = invoke(_loadRootAdapter(), FUNC_RELEASE_TOKENS, [executionChainId_, executionAsset, normalizedAmount, recipient_, normalizedGasless], nil)
427432 if ((invocation == invocation))
428433 then $Tuple2((_saveFee(assetId, updateFee) ++ [Burn(assetId, amountToSend)]), unit)
434+ else throw("Strict value is not equal to itself.")
435+ }
436+ else throw("Strict value is not equal to itself.")
437+ }
438+ else throw("Strict value is not equal to itself.")
439+ }
440+ else throw("Strict value is not equal to itself.")
441+ }
442+ else throw("Strict value is not equal to itself.")
443+ }
444+ else throw("Strict value is not equal to itself.")
445+ }
446+
447+
448+
449+@Callable(i)
450+func burnTokensV2 (executionChainId_,recipient_,referrer_,gaslessReward_) = {
451+ let err = if (if (if (if (if (if (_whenInitialized())
452+ then _whenNotPaused()
453+ else false)
454+ then _validateChain(executionChainId_, "burnTokensV2: invalid execution chain")
455+ else false)
456+ then _validatePaymentsSize(i.payments, 1, "burnTokensV2: no payment")
457+ else false)
458+ then _validateInt(gaslessReward_, 0, MAX_INT, "burnTokensV2: invalid gaslessReward")
459+ else false)
460+ then _validateInt(i.payments[0].amount, 0, MAX_INT, "burnTokensV2: invalid payment amount")
461+ else false)
462+ then _validateReferrer(referrer_, "burnTokensV2: invalid referrer")
463+ else false
464+ if ((err == err))
465+ then {
466+ let amount = i.payments[0].amount
467+ let assetId = match i.payments[0].assetId {
468+ case a: ByteVector =>
469+ a
470+ case _ =>
471+ throw("burnTokensV2: invalid asset")
472+ }
473+ let binding = _loadBinding(executionChainId_, assetId)
474+ let assetContract = binding._1
475+ let executionAsset = binding._2
476+ let minAmount = binding._3
477+ let minFee = binding._4
478+ let thresholdFee = binding._5
479+ let beforePercentFee = binding._6
480+ let afterPercentFee = binding._7
481+ let enabled = binding._8
482+ let err1 = if (if (_validateAddress(toString(assetContract), "burnTokensV2: no such binding"))
483+ then _validateInt(amount, minAmount, MAX_INT, "burnTokensV2: less than min")
484+ else false)
485+ then _validateBool(enabled, true, "burnTokensV2: token is disabled")
486+ else false
487+ if ((err1 == err1))
488+ then {
489+ let assetDecimals = _asInt(invoke(assetContract, "getDecimals", nil, nil))
490+ if ((assetDecimals == assetDecimals))
491+ then {
492+ let percent = if ((amount > thresholdFee))
493+ then afterPercentFee
494+ else beforePercentFee
495+ let fee = (minFee + fraction(amount, percent, PERCENT_FACTOR))
496+ let err2 = _validateInt(amount, (fee + 1), MAX_INT, "burnTokensV2: fee more than amount")
497+ if ((err2 == err2))
498+ then {
499+ let $t01620116606 = if ((referrer_ != ""))
500+ then {
501+ let referrer = addressFromStringValue(referrer_)
502+ let referrerFeeAmount = fraction(_loadReferrerFeePercent(executionChainId_, referrer), fee, PERCENT_FACTOR)
503+ $Tuple2(referrerFeeAmount, [ScriptTransfer(referrer, referrerFeeAmount, assetId)])
504+ }
505+ else $Tuple2(0, nil)
506+ let referrerFee = $t01620116606._1
507+ let referrerActions = $t01620116606._2
508+ let amountToSend = (amount - fee)
509+ let err3 = _validateInt(amountToSend, (gaslessReward_ + 1), MAX_INT, "burnTokensV2: reward more than amount")
510+ if ((err3 == err3))
511+ then {
512+ let updateFee = ((_loadFee(assetId) + fee) - referrerFee)
513+ let normalizedAmount = _normalizeDecimals(amountToSend, assetDecimals, DECIMALS)
514+ let normalizedGasless = _normalizeDecimals(gaslessReward_, assetDecimals, DECIMALS)
515+ let invocation = invoke(_loadRootAdapter(), FUNC_RELEASE_TOKENS, [executionChainId_, executionAsset, normalizedAmount, recipient_, normalizedGasless], nil)
516+ if ((invocation == invocation))
517+ then $Tuple2(((_saveFee(assetId, updateFee) ++ referrerActions) ++ [Burn(assetId, amountToSend)]), unit)
429518 else throw("Strict value is not equal to itself.")
430519 }
431520 else throw("Strict value is not equal to itself.")
591680 let err = if (if (_onlyThisContract(i.caller))
592681 then _whenInitialized()
593682 else false)
594- then _validateAddress(pauser_, "init: invalid pauser")
683+ then _validateAddress(pauser_, "updatePauser: invalid pauser")
595684 else false
596685 if ((err == err))
597686 then $Tuple2(_savePauser(addressFromStringValue(pauser_)), unit)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEPARATOR = "__"
55
66 let KEY_INIT = "INIT"
77
88 let KEY_MULTISIG = "MULTISIG"
99
1010 let KEY_STATUS = "STATUS"
1111
1212 let KEY_PAUSED = "PAUSED"
1313
1414 let KEY_PAUSER = "PAUSER"
1515
1616 let KEY_EXECUTOR = "EXECUTOR"
1717
1818 let KEY_ROOT_ADAPTER = "ROOT_ADAPTER"
1919
2020 let KEY_CALLER_CONTRACT = "CALLER_CONTRACT"
2121
2222 let KEY_CHAIN = "CHAIN"
2323
2424 let KEY_BINDING = "BINDING"
2525
2626 let KEY_FEE = "FEE"
2727
2828 let KEY_FEE_RECIPIENT = "FEE_RECIPIENT"
2929
3030 let KEY_REFERRER_FEE_PERCENT = "REFERRER_FEE_PERCENT"
3131
3232 let FUNC_RELEASE_TOKENS = "releaseTokens"
3333
3434 let WAVES = "WAVES"
3535
3636 let WAVES_DECIMALS = 8
3737
3838 let DECIMALS = 6
3939
4040 let PERCENT_FACTOR = 1000000
4141
4242 let MAX_REFERRER_FEE = 200000
4343
4444 let MAX_INT = 9223372036854775807
4545
4646 func _validateAddress (address_,err_) = match addressFromString(address_) {
4747 case a: Address =>
4848 true
4949 case _ =>
5050 throw(err_)
5151 }
5252
5353
5454 func _validateAsset (assetId_,err_) = match assetInfo(fromBase58String(assetId_)) {
5555 case a: Asset =>
5656 true
5757 case _ =>
5858 throw(err_)
5959 }
6060
6161
6262 func _validateInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_))
6363 then true
6464 else (val_ > upperBoundary_))
6565 then throw(err_)
6666 else true
6767
6868
6969 func _validateBool (val_,target_,err_) = if ((val_ != target_))
7070 then throw(err_)
7171 else true
7272
7373
7474 func _validatePaymentsSize (payments_,target_,err_) = if ((size(payments_) != target_))
7575 then throw(err_)
76+ else true
77+
78+
79+func _validateReferrer (referrer_,err_) = if ((referrer_ != ""))
80+ then _validateAddress(referrer_, err_)
7681 else true
7782
7883
7984 func _normalizeDecimals (amount_,sourceDecimals_,targetDecimals_) = if ((sourceDecimals_ >= targetDecimals_))
8085 then (amount_ / pow(10, 0, (sourceDecimals_ - targetDecimals_), 0, 0, DOWN))
8186 else (amount_ * pow(10, 0, (targetDecimals_ - sourceDecimals_), 0, 0, DOWN))
8287
8388
8489 func _loadInit () = match getBoolean(KEY_INIT) {
8590 case a: Boolean =>
8691 a
8792 case _ =>
8893 false
8994 }
9095
9196
9297 func _saveInit (isInit_) = [BooleanEntry(KEY_INIT, isInit_)]
9398
9499
95100 func _loadPause () = match getBoolean(KEY_PAUSED) {
96101 case a: Boolean =>
97102 a
98103 case _ =>
99104 false
100105 }
101106
102107
103108 func _savePause (isPaused_) = [BooleanEntry(KEY_PAUSED, isPaused_)]
104109
105110
106111 func _loadPauser () = match getString(KEY_PAUSER) {
107112 case a: String =>
108113 addressFromStringValue(a)
109114 case _ =>
110115 Address(base58'')
111116 }
112117
113118
114119 func _savePauser (pauser_) = [StringEntry(KEY_PAUSER, toString(pauser_))]
115120
116121
117122 func _loadMultisig () = match getString(KEY_MULTISIG) {
118123 case a: String =>
119124 addressFromStringValue(a)
120125 case _ =>
121126 Address(base58'')
122127 }
123128
124129
125130 func _saveMultisig (multisig_) = [StringEntry(KEY_MULTISIG, toString(multisig_))]
126131
127132
128133 func _loadExecutor () = match getString(KEY_EXECUTOR) {
129134 case a: String =>
130135 addressFromStringValue(a)
131136 case _ =>
132137 Address(base58'')
133138 }
134139
135140
136141 func _saveExecutor (executor_) = [StringEntry(KEY_EXECUTOR, toString(executor_))]
137142
138143
139144 func _loadCallerContract () = match getString(KEY_CALLER_CONTRACT) {
140145 case a: String =>
141146 a
142147 case _ =>
143148 ""
144149 }
145150
146151
147152 func _saveCallerContract (caller_) = [StringEntry(KEY_CALLER_CONTRACT, caller_)]
148153
149154
150155 func _loadChain (chainId_) = match getBoolean(makeString([KEY_CHAIN, toString(chainId_)], SEPARATOR)) {
151156 case a: Boolean =>
152157 a
153158 case _ =>
154159 false
155160 }
156161
157162
158163 func _saveChain (chainId_,val_) = [BooleanEntry(makeString([KEY_CHAIN, toString(chainId_)], SEPARATOR), val_)]
159164
160165
161166 func _loadBinding (executionChainId_,assetId_) = match getString(makeString([KEY_BINDING, toString(executionChainId_), toBase58String(assetId_)], SEPARATOR)) {
162167 case a: String =>
163168 let struct = split(a, SEPARATOR)
164169 $Tuple8(addressFromStringValue(struct[0]), struct[1], parseIntValue(struct[2]), parseIntValue(struct[3]), parseIntValue(struct[4]), parseIntValue(struct[5]), parseIntValue(struct[6]), if ((struct[7] == "1"))
165170 then true
166171 else false)
167172 case _ =>
168173 $Tuple8(Address(base58''), "", 0, 0, 0, 0, 0, false)
169174 }
170175
171176
172177 func _saveBinding (executionChainId_,assetId_,binding_) = [StringEntry(makeString([KEY_BINDING, toString(executionChainId_), toBase58String(assetId_)], SEPARATOR), makeString([toString(binding_._1), binding_._2, toString(binding_._3), toString(binding_._4), toString(binding_._5), toString(binding_._6), toString(binding_._7), if (binding_._8)
173178 then "1"
174179 else "0"], SEPARATOR))]
175180
176181
177182 func _loadFee (assetId_) = match getInteger(makeString([KEY_FEE, toBase58String(assetId_)], SEPARATOR)) {
178183 case a: Int =>
179184 a
180185 case _ =>
181186 0
182187 }
183188
184189
185190 func _saveFee (assetId_,val_) = [IntegerEntry(makeString([KEY_FEE, toBase58String(assetId_)], SEPARATOR), val_)]
186191
187192
188193 func _loadRootAdapter () = match getString(KEY_ROOT_ADAPTER) {
189194 case a: String =>
190195 addressFromStringValue(a)
191196 case _ =>
192197 Address(base58'')
193198 }
194199
195200
196201 func _saveRootAdapter (adapter_) = [StringEntry(KEY_ROOT_ADAPTER, toString(adapter_))]
197202
198203
199204 func _loadFeeRecipient () = match getString(KEY_FEE_RECIPIENT) {
200205 case a: String =>
201206 addressFromStringValue(a)
202207 case _ =>
203208 Address(base58'')
204209 }
205210
206211
207212 func _saveFeeRecipient (val_) = [StringEntry(KEY_FEE_RECIPIENT, toString(val_))]
208213
209214
210215 func _loadReferrerFeePercent (executionChainId_,referrer_) = match getInteger(makeString([KEY_REFERRER_FEE_PERCENT, toString(executionChainId_), toString(referrer_)], SEPARATOR)) {
211216 case a: Int =>
212217 a
213218 case _ =>
214219 0
215220 }
216221
217222
218223 func _saveReferrerFeePercent (executionChainId_,referrer_,val_) = [IntegerEntry(makeString([KEY_REFERRER_FEE_PERCENT, toString(executionChainId_), toString(referrer_)], SEPARATOR), val_)]
219224
220225
221226 func _onlyThisContract (caller_) = if ((caller_ != this))
222227 then throw("_onlyThisContract: revert")
223228 else true
224229
225230
226231 func _whenMultisigSet () = if ((_loadMultisig() == Address(base58'')))
227232 then throw("_whenMultisigSet: revert")
228233 else true
229234
230235
231236 func _whenNotInitialized () = if (_loadInit())
232237 then throw("_whenNotInitialized: revert")
233238 else true
234239
235240
236241 func _whenInitialized () = if (!(_loadInit()))
237242 then throw("_whenInitialized: revert")
238243 else true
239244
240245
241246 func _whenNotPaused () = if (_loadPause())
242247 then throw("_whenNotPaused: revert")
243248 else true
244249
245250
246251 func _whenPaused () = if (!(_loadPause()))
247252 then throw("_whenPaused: revert")
248253 else true
249254
250255
251256 func _onlyPauser (caller_) = if ((caller_ != _loadPauser()))
252257 then throw("_onlyPauser: revert")
253258 else true
254259
255260
256261 func _asInt (val_) = match val_ {
257262 case a: Int =>
258263 a
259264 case _ =>
260265 throw("_asInt: revert")
261266 }
262267
263268
264269 func _asBytes (val_) = match val_ {
265270 case a: ByteVector =>
266271 a
267272 case _ =>
268273 throw("_asBytes: revert")
269274 }
270275
271276
272277 func _validateExecutor (val_,err_) = if ((val_ != _loadExecutor()))
273278 then throw(err_)
274279 else true
275280
276281
277282 func _validateCaller (val_,err_) = if ((val_ != _loadCallerContract()))
278283 then throw(err_)
279284 else true
280285
281286
282287 func _validateChain (executionChainId_,err_) = if (!(_loadChain(executionChainId_)))
283288 then throw(err_)
284289 else true
285290
286291
287292 @Callable(i)
288293 func init (executor_,adapter_,pauser_,feeRecipient_) = {
289294 let err = if (if (if (if (if (if (_onlyThisContract(i.caller))
290295 then _whenNotInitialized()
291296 else false)
292297 then _whenMultisigSet()
293298 else false)
294299 then _validateAddress(executor_, "init: invalid executor")
295300 else false)
296301 then _validateAddress(adapter_, "init: invalid adapter")
297302 else false)
298303 then _validateAddress(pauser_, "init: invalid pauser")
299304 else false)
300305 then _validateAddress(feeRecipient_, "init: invalid feeRecipient")
301306 else false
302307 if ((err == err))
303308 then $Tuple2(((((_saveInit(true) ++ _saveExecutor(addressFromStringValue(executor_))) ++ _saveRootAdapter(addressFromStringValue(adapter_))) ++ _savePauser(addressFromStringValue(pauser_))) ++ _saveFeeRecipient(addressFromStringValue(feeRecipient_))), unit)
304309 else throw("Strict value is not equal to itself.")
305310 }
306311
307312
308313
309314 @Callable(i)
310315 func mintTokens (callerContract_,assetContract_,amount_,recipient_,gaslessReward_,referrer_,referrerFee_) = {
311316 let amount = valueOrErrorMessage(parseInt(amount_), "mint: amount is not Int")
312317 let gaslessReward = valueOrErrorMessage(parseInt(gaslessReward_), "mint: gaslessReward is not Int")
313318 let referrerFee = valueOrErrorMessage(parseInt(referrerFee_), "mint: referrerFee is not Int")
314319 let err = if (if (if (if (if (if (if (if (_whenInitialized())
315320 then _whenNotPaused()
316321 else false)
317322 then _validateAddress(assetContract_, "mint: invalid asset contract")
318323 else false)
319324 then _validateExecutor(i.caller, "mint: invalid executor")
320325 else false)
321326 then _validateCaller(callerContract_, "mint: invalid caller")
322327 else false)
323328 then _validateAddress(recipient_, "mint: invalid recipient address")
324329 else false)
325330 then _validateInt(amount, 0, MAX_INT, "mint: invalid amount")
326331 else false)
327332 then _validateInt(gaslessReward, 0, MAX_INT, "mint: invalid gaslessReward")
328333 else false)
329334 then _validateInt(referrerFee, 0, MAX_INT, "mint: invalid referrer fee")
330335 else false
331336 if ((err == err))
332337 then {
333338 let assetId = _asBytes(invoke(addressFromStringValue(assetContract_), "getAssetId", nil, nil))
334339 if ((assetId == assetId))
335340 then {
336341 let assetDecimals = _asInt(invoke(addressFromStringValue(assetContract_), "getDecimals", nil, nil))
337342 if ((assetDecimals == assetDecimals))
338343 then {
339344 let normalizedAmount = _normalizeDecimals(amount, DECIMALS, assetDecimals)
340345 let normalizedGasless = _normalizeDecimals(gaslessReward, DECIMALS, assetDecimals)
341346 let referrer = match addressFromString(referrer_) {
342347 case refererAddress: Address =>
343348 let normalizedReferrerFee = _normalizeDecimals(referrerFee, DECIMALS, assetDecimals)
344349 $Tuple2(normalizedReferrerFee, [ScriptTransfer(refererAddress, normalizedReferrerFee, assetId)])
345350 case _ =>
346351 $Tuple2(0, nil)
347352 }
348353 let normalizedReferrerFee = referrer._1
349354 let referrerActions = referrer._2
350355 let invocation = invoke(addressFromStringValue(assetContract_), "mint", [(normalizedAmount + normalizedReferrerFee), toString(this)], nil)
351356 if ((invocation == invocation))
352357 then {
353358 let actions = if (if ((normalizedGasless > 0))
354359 then (addressFromStringValue(recipient_) != i.originCaller)
355360 else false)
356361 then [ScriptTransfer(addressFromStringValue(recipient_), (normalizedAmount - normalizedGasless), assetId), ScriptTransfer(i.originCaller, normalizedGasless, assetId)]
357362 else [ScriptTransfer(addressFromStringValue(recipient_), normalizedAmount, assetId)]
358363 $Tuple2((actions ++ referrerActions), unit)
359364 }
360365 else throw("Strict value is not equal to itself.")
361366 }
362367 else throw("Strict value is not equal to itself.")
363368 }
364369 else throw("Strict value is not equal to itself.")
365370 }
366371 else throw("Strict value is not equal to itself.")
367372 }
368373
369374
370375
371376 @Callable(i)
372377 func burnTokens (executionChainId_,recipient_,gaslessReward_) = {
373378 let err = if (if (if (if (if (_whenInitialized())
374379 then _whenNotPaused()
375380 else false)
376- then _validateChain(executionChainId_, "burn: invalid execution chain")
381+ then _validateChain(executionChainId_, "burnTokens: invalid execution chain")
377382 else false)
378- then _validatePaymentsSize(i.payments, 1, "burn: no payment")
383+ then _validatePaymentsSize(i.payments, 1, "burnTokens: no payment")
379384 else false)
380- then _validateInt(gaslessReward_, 0, MAX_INT, "burn: invalid gaslessReward")
385+ then _validateInt(gaslessReward_, 0, MAX_INT, "burnTokens: invalid gaslessReward")
381386 else false)
382- then _validateInt(i.payments[0].amount, 0, MAX_INT, "burn: invalid payment amount")
387+ then _validateInt(i.payments[0].amount, 0, MAX_INT, "burnTokens: invalid payment amount")
383388 else false
384389 if ((err == err))
385390 then {
386391 let amount = i.payments[0].amount
387392 let assetId = match i.payments[0].assetId {
388393 case a: ByteVector =>
389394 a
390395 case _ =>
391- throw("burn: invalid asset")
396+ throw("burnTokens: invalid asset")
392397 }
393398 let binding = _loadBinding(executionChainId_, assetId)
394399 let assetContract = binding._1
395400 let executionAsset = binding._2
396401 let minAmount = binding._3
397402 let minFee = binding._4
398403 let thresholdFee = binding._5
399404 let beforePercentFee = binding._6
400405 let afterPercentFee = binding._7
401406 let enabled = binding._8
402- let err1 = if (if (_validateAddress(toString(assetContract), "burn: no such binding"))
403- then _validateInt(amount, minAmount, MAX_INT, "burn: less than min")
407+ let err1 = if (if (_validateAddress(toString(assetContract), "burnTokens: no such binding"))
408+ then _validateInt(amount, minAmount, MAX_INT, "burnTokens: less than min")
404409 else false)
405- then _validateBool(enabled, true, "burn: token is disabled")
410+ then _validateBool(enabled, true, "burnTokens: token is disabled")
406411 else false
407412 if ((err1 == err1))
408413 then {
409414 let assetDecimals = _asInt(invoke(assetContract, "getDecimals", nil, nil))
410415 if ((assetDecimals == assetDecimals))
411416 then {
412417 let percent = if ((amount > thresholdFee))
413418 then afterPercentFee
414419 else beforePercentFee
415420 let fee = (minFee + fraction(amount, percent, PERCENT_FACTOR))
416- let err2 = _validateInt(amount, (fee + 1), MAX_INT, "burn: fee more than amount")
421+ let err2 = _validateInt(amount, (fee + 1), MAX_INT, "burnTokens: fee more than amount")
417422 if ((err2 == err2))
418423 then {
419424 let amountToSend = (amount - fee)
420- let err3 = _validateInt(amountToSend, (gaslessReward_ + 1), MAX_INT, "burn: reward more than amount")
425+ let err3 = _validateInt(amountToSend, (gaslessReward_ + 1), MAX_INT, "burnTokens: reward more than amount")
421426 if ((err3 == err3))
422427 then {
423428 let updateFee = (_loadFee(assetId) + fee)
424429 let normalizedAmount = _normalizeDecimals(amountToSend, assetDecimals, DECIMALS)
425430 let normalizedGasless = _normalizeDecimals(gaslessReward_, assetDecimals, DECIMALS)
426431 let invocation = invoke(_loadRootAdapter(), FUNC_RELEASE_TOKENS, [executionChainId_, executionAsset, normalizedAmount, recipient_, normalizedGasless], nil)
427432 if ((invocation == invocation))
428433 then $Tuple2((_saveFee(assetId, updateFee) ++ [Burn(assetId, amountToSend)]), unit)
434+ else throw("Strict value is not equal to itself.")
435+ }
436+ else throw("Strict value is not equal to itself.")
437+ }
438+ else throw("Strict value is not equal to itself.")
439+ }
440+ else throw("Strict value is not equal to itself.")
441+ }
442+ else throw("Strict value is not equal to itself.")
443+ }
444+ else throw("Strict value is not equal to itself.")
445+ }
446+
447+
448+
449+@Callable(i)
450+func burnTokensV2 (executionChainId_,recipient_,referrer_,gaslessReward_) = {
451+ let err = if (if (if (if (if (if (_whenInitialized())
452+ then _whenNotPaused()
453+ else false)
454+ then _validateChain(executionChainId_, "burnTokensV2: invalid execution chain")
455+ else false)
456+ then _validatePaymentsSize(i.payments, 1, "burnTokensV2: no payment")
457+ else false)
458+ then _validateInt(gaslessReward_, 0, MAX_INT, "burnTokensV2: invalid gaslessReward")
459+ else false)
460+ then _validateInt(i.payments[0].amount, 0, MAX_INT, "burnTokensV2: invalid payment amount")
461+ else false)
462+ then _validateReferrer(referrer_, "burnTokensV2: invalid referrer")
463+ else false
464+ if ((err == err))
465+ then {
466+ let amount = i.payments[0].amount
467+ let assetId = match i.payments[0].assetId {
468+ case a: ByteVector =>
469+ a
470+ case _ =>
471+ throw("burnTokensV2: invalid asset")
472+ }
473+ let binding = _loadBinding(executionChainId_, assetId)
474+ let assetContract = binding._1
475+ let executionAsset = binding._2
476+ let minAmount = binding._3
477+ let minFee = binding._4
478+ let thresholdFee = binding._5
479+ let beforePercentFee = binding._6
480+ let afterPercentFee = binding._7
481+ let enabled = binding._8
482+ let err1 = if (if (_validateAddress(toString(assetContract), "burnTokensV2: no such binding"))
483+ then _validateInt(amount, minAmount, MAX_INT, "burnTokensV2: less than min")
484+ else false)
485+ then _validateBool(enabled, true, "burnTokensV2: token is disabled")
486+ else false
487+ if ((err1 == err1))
488+ then {
489+ let assetDecimals = _asInt(invoke(assetContract, "getDecimals", nil, nil))
490+ if ((assetDecimals == assetDecimals))
491+ then {
492+ let percent = if ((amount > thresholdFee))
493+ then afterPercentFee
494+ else beforePercentFee
495+ let fee = (minFee + fraction(amount, percent, PERCENT_FACTOR))
496+ let err2 = _validateInt(amount, (fee + 1), MAX_INT, "burnTokensV2: fee more than amount")
497+ if ((err2 == err2))
498+ then {
499+ let $t01620116606 = if ((referrer_ != ""))
500+ then {
501+ let referrer = addressFromStringValue(referrer_)
502+ let referrerFeeAmount = fraction(_loadReferrerFeePercent(executionChainId_, referrer), fee, PERCENT_FACTOR)
503+ $Tuple2(referrerFeeAmount, [ScriptTransfer(referrer, referrerFeeAmount, assetId)])
504+ }
505+ else $Tuple2(0, nil)
506+ let referrerFee = $t01620116606._1
507+ let referrerActions = $t01620116606._2
508+ let amountToSend = (amount - fee)
509+ let err3 = _validateInt(amountToSend, (gaslessReward_ + 1), MAX_INT, "burnTokensV2: reward more than amount")
510+ if ((err3 == err3))
511+ then {
512+ let updateFee = ((_loadFee(assetId) + fee) - referrerFee)
513+ let normalizedAmount = _normalizeDecimals(amountToSend, assetDecimals, DECIMALS)
514+ let normalizedGasless = _normalizeDecimals(gaslessReward_, assetDecimals, DECIMALS)
515+ let invocation = invoke(_loadRootAdapter(), FUNC_RELEASE_TOKENS, [executionChainId_, executionAsset, normalizedAmount, recipient_, normalizedGasless], nil)
516+ if ((invocation == invocation))
517+ then $Tuple2(((_saveFee(assetId, updateFee) ++ referrerActions) ++ [Burn(assetId, amountToSend)]), unit)
429518 else throw("Strict value is not equal to itself.")
430519 }
431520 else throw("Strict value is not equal to itself.")
432521 }
433522 else throw("Strict value is not equal to itself.")
434523 }
435524 else throw("Strict value is not equal to itself.")
436525 }
437526 else throw("Strict value is not equal to itself.")
438527 }
439528 else throw("Strict value is not equal to itself.")
440529 }
441530
442531
443532
444533 @Callable(i)
445534 func transferFee (executionChainId_,assetId_) = {
446535 let err = if (if (_whenInitialized())
447536 then _whenNotPaused()
448537 else false)
449538 then _validateAsset(assetId_, "transferFee: invalid asset")
450539 else false
451540 if ((err == err))
452541 then {
453542 let assetId = fromBase58String(assetId_)
454543 let binding = _loadBinding(executionChainId_, assetId)
455544 let assetContract = binding._1
456545 let enabled = binding._8
457546 let err1 = if (_validateAddress(toString(assetContract), "transferFee: no such binding"))
458547 then _validateBool(enabled, true, "transferFee: token is disabled")
459548 else false
460549 if ((err1 == err1))
461550 then $Tuple2((_saveFee(assetId, 0) ++ [ScriptTransfer(_loadFeeRecipient(), _loadFee(assetId), assetId)]), unit)
462551 else throw("Strict value is not equal to itself.")
463552 }
464553 else throw("Strict value is not equal to itself.")
465554 }
466555
467556
468557
469558 @Callable(i)
470559 func updateCallerContract (callerContract_) = {
471560 let err = if (_onlyThisContract(i.caller))
472561 then _whenInitialized()
473562 else false
474563 if ((err == err))
475564 then $Tuple2(_saveCallerContract(callerContract_), unit)
476565 else throw("Strict value is not equal to itself.")
477566 }
478567
479568
480569
481570 @Callable(i)
482571 func updateExecutionChain (executionChainId_,enabled_) = {
483572 let err = if (if (_onlyThisContract(i.caller))
484573 then _whenInitialized()
485574 else false)
486575 then _validateInt(executionChainId_, 0, MAX_INT, "updateExecutionChain: invalid executionChainId")
487576 else false
488577 if ((err == err))
489578 then $Tuple2(_saveChain(executionChainId_, enabled_), unit)
490579 else throw("Strict value is not equal to itself.")
491580 }
492581
493582
494583
495584 @Callable(i)
496585 func updateFeeRecipient (feeRecipient_) = {
497586 let err = if (if (_onlyThisContract(i.caller))
498587 then _whenInitialized()
499588 else false)
500589 then _validateAddress(feeRecipient_, "updateFeeRecipient: invalid feeRecipient")
501590 else false
502591 if ((err == err))
503592 then $Tuple2(_saveFeeRecipient(addressFromStringValue(feeRecipient_)), unit)
504593 else throw("Strict value is not equal to itself.")
505594 }
506595
507596
508597
509598 @Callable(i)
510599 func updateReferrer (executionChainId_,referrer_,fee_) = {
511600 let err = if (if (if (if (_onlyThisContract(i.caller))
512601 then _whenInitialized()
513602 else false)
514603 then _validateChain(executionChainId_, "updateReferrer: invalid execution chain")
515604 else false)
516605 then _validateAddress(referrer_, "updateReferrer: invalid referrer")
517606 else false)
518607 then _validateInt(fee_, 0, MAX_REFERRER_FEE, "updateReferrer: invalid fee")
519608 else false
520609 if ((err == err))
521610 then $Tuple2(_saveReferrerFeePercent(executionChainId_, addressFromStringValue(referrer_), fee_), unit)
522611 else throw("Strict value is not equal to itself.")
523612 }
524613
525614
526615
527616 @Callable(i)
528617 func updateBindingInfo (executionChainId_,assetContract_,executionAsset_,minAmount_,minFee_,thresholdFee_,beforePercentFee_,afterPercentFee_,enabled_) = {
529618 let err = if (if (if (if (if (if (if (if (_onlyThisContract(i.caller))
530619 then _whenInitialized()
531620 else false)
532621 then _validateAddress(assetContract_, "updateBindingInfo: invalid asset contract")
533622 else false)
534623 then _validateInt(executionChainId_, 0, MAX_INT, "updateBindingInfo: invalid executionChainId")
535624 else false)
536625 then _validateInt(minAmount_, 0, MAX_INT, "updateBindingInfo: invalid minAmount")
537626 else false)
538627 then _validateInt(minFee_, 0, MAX_INT, "updateBindingInfo: invalid minFee")
539628 else false)
540629 then _validateInt(thresholdFee_, 0, MAX_INT, "updateBindingInfo: invalid thresholdFee")
541630 else false)
542631 then _validateInt(beforePercentFee_, 0, MAX_INT, "updateBindingInfo: invalid beforePercentFee")
543632 else false)
544633 then _validateInt(afterPercentFee_, 0, MAX_INT, "updateBindingInfo: invalid afterPercentFee")
545634 else false
546635 if ((err == err))
547636 then {
548637 let assetId = _asBytes(invoke(addressFromStringValue(assetContract_), "getAssetId", nil, nil))
549638 if ((assetId == assetId))
550639 then {
551640 let binding = $Tuple8(addressFromStringValue(assetContract_), executionAsset_, minAmount_, minFee_, thresholdFee_, beforePercentFee_, afterPercentFee_, enabled_)
552641 $Tuple2(_saveBinding(executionChainId_, assetId, binding), unit)
553642 }
554643 else throw("Strict value is not equal to itself.")
555644 }
556645 else throw("Strict value is not equal to itself.")
557646 }
558647
559648
560649
561650 @Callable(i)
562651 func pause () = {
563652 let err = if (if (_onlyPauser(i.caller))
564653 then _whenInitialized()
565654 else false)
566655 then _whenNotPaused()
567656 else false
568657 if ((err == err))
569658 then $Tuple2(_savePause(true), unit)
570659 else throw("Strict value is not equal to itself.")
571660 }
572661
573662
574663
575664 @Callable(i)
576665 func unpause () = {
577666 let err = if (if (_onlyPauser(i.caller))
578667 then _whenInitialized()
579668 else false)
580669 then _whenPaused()
581670 else false
582671 if ((err == err))
583672 then $Tuple2(_savePause(false), unit)
584673 else throw("Strict value is not equal to itself.")
585674 }
586675
587676
588677
589678 @Callable(i)
590679 func updatePauser (pauser_) = {
591680 let err = if (if (_onlyThisContract(i.caller))
592681 then _whenInitialized()
593682 else false)
594- then _validateAddress(pauser_, "init: invalid pauser")
683+ then _validateAddress(pauser_, "updatePauser: invalid pauser")
595684 else false
596685 if ((err == err))
597686 then $Tuple2(_savePauser(addressFromStringValue(pauser_)), unit)
598687 else throw("Strict value is not equal to itself.")
599688 }
600689
601690
602691
603692 @Callable(i)
604693 func setMultisig (multisig_) = {
605694 let err = if (_onlyThisContract(i.caller))
606695 then _validateAddress(multisig_, "setMultisig: invalid multisig")
607696 else false
608697 if ((err == err))
609698 then $Tuple2(_saveMultisig(addressFromStringValue(multisig_)), unit)
610699 else throw("Strict value is not equal to itself.")
611700 }
612701
613702
614703 @Verifier(tx)
615704 func verify () = match getString(KEY_MULTISIG) {
616705 case multisig: String =>
617706 valueOrElse(getBoolean(addressFromStringValue(multisig), makeString([KEY_STATUS, toString(this), toBase58String(tx.id)], SEPARATOR)), false)
618707 case _ =>
619708 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
620709 }
621710

github/deemru/w8io/169f3d6 
204.27 ms