tx · CutHDDT3ZWqnnsLpCRLmXhXX1GbbmRJseeNLkgQeUveE

3Mx4GxjrawhKHBgMKH9C5Hmbj8ePZDrs8ed:  -0.01800000 Waves

2023.07.03 11:13 [2649471] smart account 3Mx4GxjrawhKHBgMKH9C5Hmbj8ePZDrs8ed > SELF 0.00000000 Waves

{ "type": 13, "id": "CutHDDT3ZWqnnsLpCRLmXhXX1GbbmRJseeNLkgQeUveE", "fee": 1800000, "feeAssetId": null, "timestamp": 1688372046437, "version": 2, "chainId": 84, "sender": "3Mx4GxjrawhKHBgMKH9C5Hmbj8ePZDrs8ed", "senderPublicKey": "9DpEgmia9fGpxtGGDeSMtER4g9qB7WQPPYTKTHzqSFuX", "proofs": [ "5TC29DLugpY9mjtXPFQEnobKmXvx2MPoWVW3JTJHr93631rbkSXYcWcVTFohMZjjzHhetU8djzqzFvkgvGcLt3wy" ], "script": "base64:BgJdCAISBgoECAgICBIJCgcICAgICAgIEgYKBAEICAESBgoEAQgIARIECgIBCBIDCgEIEgQKAgEEEgMKAQgSBQoDAQgBEgsKCQEICAEBAQEBBBIAEgASAwoBCBIDCgEIQAAJU0VQQVJBVE9SAgJfXwAIS0VZX0lOSVQCBElOSVQADEtFWV9NVUxUSVNJRwIITVVMVElTSUcACktFWV9TVEFUVVMCBlNUQVRVUwAKS0VZX1BBVVNFRAIGUEFVU0VEAApLRVlfUEFVU0VSAgZQQVVTRVIADEtFWV9FWEVDVVRPUgIIRVhFQ1VUT1IAEEtFWV9ST09UX0FEQVBURVICDFJPT1RfQURBUFRFUgATS0VZX0NBTExFUl9DT05UUkFDVAIPQ0FMTEVSX0NPTlRSQUNUAAlLRVlfQ0hBSU4CBUNIQUlOAAtLRVlfQklORElORwIHQklORElORwAHS0VZX0ZFRQIDRkVFABFLRVlfRkVFX1JFQ0lQSUVOVAINRkVFX1JFQ0lQSUVOVAAYS0VZX1JFRkVSUkVSX0ZFRV9QRVJDRU5UAhRSRUZFUlJFUl9GRUVfUEVSQ0VOVAATRlVOQ19SRUxFQVNFX1RPS0VOUwINcmVsZWFzZVRva2VucwAFV0FWRVMCBVdBVkVTAA5XQVZFU19ERUNJTUFMUwAIAAhERUNJTUFMUwAGAA5QRVJDRU5UX0ZBQ1RPUgDAhD0AEE1BWF9SRUZFUlJFUl9GRUUAwJoMAAdNQVhfSU5UAP//////////fwEQX3ZhbGlkYXRlQWRkcmVzcwIIYWRkcmVzc18EZXJyXwQHJG1hdGNoMAkApggBBQhhZGRyZXNzXwMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAFhBQckbWF0Y2gwBgkAAgEFBGVycl8BDl92YWxpZGF0ZUFzc2V0Aghhc3NldElkXwRlcnJfBAckbWF0Y2gwCQDsBwEJANkEAQUIYXNzZXRJZF8DCQABAgUHJG1hdGNoMAIFQXNzZXQEAWEFByRtYXRjaDAGCQACAQUEZXJyXwEMX3ZhbGlkYXRlSW50BAR2YWxfDmxvd2VyQm91bmRhcnlfDnVwcGVyQm91bmRhcnlfBGVycl8DAwkAZgIFDmxvd2VyQm91bmRhcnlfBQR2YWxfBgkAZgIFBHZhbF8FDnVwcGVyQm91bmRhcnlfCQACAQUEZXJyXwYBDV92YWxpZGF0ZUJvb2wDBHZhbF8HdGFyZ2V0XwRlcnJfAwkBAiE9AgUEdmFsXwUHdGFyZ2V0XwkAAgEFBGVycl8GARVfdmFsaWRhdGVQYXltZW50c1NpemUDCXBheW1lbnRzXwd0YXJnZXRfBGVycl8DCQECIT0CCQCQAwEFCXBheW1lbnRzXwUHdGFyZ2V0XwkAAgEFBGVycl8GARFfdmFsaWRhdGVSZWZlcnJlcgIJcmVmZXJyZXJfBGVycl8DCQECIT0CBQlyZWZlcnJlcl8CAAkBEF92YWxpZGF0ZUFkZHJlc3MCBQlyZWZlcnJlcl8FBGVycl8GARJfbm9ybWFsaXplRGVjaW1hbHMDB2Ftb3VudF8Pc291cmNlRGVjaW1hbHNfD3RhcmdldERlY2ltYWxzXwMJAGcCBQ9zb3VyY2VEZWNpbWFsc18FD3RhcmdldERlY2ltYWxzXwkAaQIFB2Ftb3VudF8JAGwGAAoAAAkAZQIFD3NvdXJjZURlY2ltYWxzXwUPdGFyZ2V0RGVjaW1hbHNfAAAAAAUERE9XTgkAaAIFB2Ftb3VudF8JAGwGAAoAAAkAZQIFD3RhcmdldERlY2ltYWxzXwUPc291cmNlRGVjaW1hbHNfAAAAAAUERE9XTgEJX2xvYWRJbml0AAQHJG1hdGNoMAkAoAgBBQhLRVlfSU5JVAMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFhBQckbWF0Y2gwBQFhBwEJX3NhdmVJbml0AQdpc0luaXRfCQDMCAIJAQxCb29sZWFuRW50cnkCBQhLRVlfSU5JVAUHaXNJbml0XwUDbmlsAQpfbG9hZFBhdXNlAAQHJG1hdGNoMAkAoAgBBQpLRVlfUEFVU0VEAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWEFByRtYXRjaDAFAWEHAQpfc2F2ZVBhdXNlAQlpc1BhdXNlZF8JAMwIAgkBDEJvb2xlYW5FbnRyeQIFCktFWV9QQVVTRUQFCWlzUGF1c2VkXwUDbmlsAQtfbG9hZFBhdXNlcgAEByRtYXRjaDAJAKIIAQUKS0VZX1BBVVNFUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAAQtfc2F2ZVBhdXNlcgEHcGF1c2VyXwkAzAgCCQELU3RyaW5nRW50cnkCBQpLRVlfUEFVU0VSCQClCAEFB3BhdXNlcl8FA25pbAENX2xvYWRNdWx0aXNpZwAEByRtYXRjaDAJAKIIAQUMS0VZX01VTFRJU0lHAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkBB0FkZHJlc3MBAQABDV9zYXZlTXVsdGlzaWcBCW11bHRpc2lnXwkAzAgCCQELU3RyaW5nRW50cnkCBQxLRVlfTVVMVElTSUcJAKUIAQUJbXVsdGlzaWdfBQNuaWwBDV9sb2FkRXhlY3V0b3IABAckbWF0Y2gwCQCiCAEFDEtFWV9FWEVDVVRPUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAAQ1fc2F2ZUV4ZWN1dG9yAQlleGVjdXRvcl8JAMwIAgkBC1N0cmluZ0VudHJ5AgUMS0VZX0VYRUNVVE9SCQClCAEFCWV4ZWN1dG9yXwUDbmlsARNfbG9hZENhbGxlckNvbnRyYWN0AAQHJG1hdGNoMAkAoggBBRNLRVlfQ0FMTEVSX0NPTlRSQUNUAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAUBYQIAARNfc2F2ZUNhbGxlckNvbnRyYWN0AQdjYWxsZXJfCQDMCAIJAQtTdHJpbmdFbnRyeQIFE0tFWV9DQUxMRVJfQ09OVFJBQ1QFB2NhbGxlcl8FA25pbAEKX2xvYWRDaGFpbgEIY2hhaW5JZF8EByRtYXRjaDAJAKAIAQkAuQkCCQDMCAIFCUtFWV9DSEFJTgkAzAgCCQCkAwEFCGNoYWluSWRfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFhBQckbWF0Y2gwBQFhBwEKX3NhdmVDaGFpbgIIY2hhaW5JZF8EdmFsXwkAzAgCCQEMQm9vbGVhbkVudHJ5AgkAuQkCCQDMCAIFCUtFWV9DSEFJTgkAzAgCCQCkAwEFCGNoYWluSWRfBQNuaWwFCVNFUEFSQVRPUgUEdmFsXwUDbmlsAQxfbG9hZEJpbmRpbmcCEWV4ZWN1dGlvbkNoYWluSWRfCGFzc2V0SWRfBAckbWF0Y2gwCQCiCAEJALkJAgkAzAgCBQtLRVlfQklORElORwkAzAgCCQCkAwEFEWV4ZWN1dGlvbkNoYWluSWRfCQDMCAIJANgEAQUIYXNzZXRJZF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAQGc3RydWN0CQC1CQIFAWEFCVNFUEFSQVRPUgkAmgoICQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFBnN0cnVjdAAACQCRAwIFBnN0cnVjdAABCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QAAwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAAECQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAUJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QABgMJAAACCQCRAwIFBnN0cnVjdAAHAgExBgcJAJoKCAkBB0FkZHJlc3MBAQACAAAAAAAAAAAAAAAHAQxfc2F2ZUJpbmRpbmcDEWV4ZWN1dGlvbkNoYWluSWRfCGFzc2V0SWRfCGJpbmRpbmdfCQDMCAIJAQtTdHJpbmdFbnRyeQIJALkJAgkAzAgCBQtLRVlfQklORElORwkAzAgCCQCkAwEFEWV4ZWN1dGlvbkNoYWluSWRfCQDMCAIJANgEAQUIYXNzZXRJZF8FA25pbAUJU0VQQVJBVE9SCQC5CQIJAMwIAgkApQgBCAUIYmluZGluZ18CXzEJAMwIAggFCGJpbmRpbmdfAl8yCQDMCAIJAKQDAQgFCGJpbmRpbmdfAl8zCQDMCAIJAKQDAQgFCGJpbmRpbmdfAl80CQDMCAIJAKQDAQgFCGJpbmRpbmdfAl81CQDMCAIJAKQDAQgFCGJpbmRpbmdfAl82CQDMCAIJAKQDAQgFCGJpbmRpbmdfAl83CQDMCAIDCAUIYmluZGluZ18CXzgCATECATAFA25pbAUJU0VQQVJBVE9SBQNuaWwBCF9sb2FkRmVlAQhhc3NldElkXwQHJG1hdGNoMAkAnwgBCQC5CQIJAMwIAgUHS0VZX0ZFRQkAzAgCCQDYBAEFCGFzc2V0SWRfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAEIX3NhdmVGZWUCCGFzc2V0SWRfBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIJALkJAgkAzAgCBQdLRVlfRkVFCQDMCAIJANgEAQUIYXNzZXRJZF8FA25pbAUJU0VQQVJBVE9SBQR2YWxfBQNuaWwBEF9sb2FkUm9vdEFkYXB0ZXIABAckbWF0Y2gwCQCiCAEFEEtFWV9ST09UX0FEQVBURVIDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFhCQEHQWRkcmVzcwEBAAEQX3NhdmVSb290QWRhcHRlcgEIYWRhcHRlcl8JAMwIAgkBC1N0cmluZ0VudHJ5AgUQS0VZX1JPT1RfQURBUFRFUgkApQgBBQhhZGFwdGVyXwUDbmlsARFfbG9hZEZlZVJlY2lwaWVudAAEByRtYXRjaDAJAKIIAQURS0VZX0ZFRV9SRUNJUElFTlQDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFhCQEHQWRkcmVzcwEBAAERX3NhdmVGZWVSZWNpcGllbnQBBHZhbF8JAMwIAgkBC1N0cmluZ0VudHJ5AgURS0VZX0ZFRV9SRUNJUElFTlQJAKUIAQUEdmFsXwUDbmlsARdfbG9hZFJlZmVycmVyRmVlUGVyY2VudAIRZXhlY3V0aW9uQ2hhaW5JZF8JcmVmZXJyZXJfBAckbWF0Y2gwCQCfCAEJALkJAgkAzAgCBRhLRVlfUkVGRVJSRVJfRkVFX1BFUkNFTlQJAMwIAgkApAMBBRFleGVjdXRpb25DaGFpbklkXwkAzAgCCQClCAEFCXJlZmVycmVyXwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABF19zYXZlUmVmZXJyZXJGZWVQZXJjZW50AxFleGVjdXRpb25DaGFpbklkXwlyZWZlcnJlcl8EdmFsXwkAzAgCCQEMSW50ZWdlckVudHJ5AgkAuQkCCQDMCAIFGEtFWV9SRUZFUlJFUl9GRUVfUEVSQ0VOVAkAzAgCCQCkAwEFEWV4ZWN1dGlvbkNoYWluSWRfCQDMCAIJAKUIAQUJcmVmZXJyZXJfBQNuaWwFCVNFUEFSQVRPUgUEdmFsXwUDbmlsARFfb25seVRoaXNDb250cmFjdAEHY2FsbGVyXwMJAQIhPQIFB2NhbGxlcl8FBHRoaXMJAAIBAhlfb25seVRoaXNDb250cmFjdDogcmV2ZXJ0BgEQX3doZW5NdWx0aXNpZ1NldAADCQAAAgkBDV9sb2FkTXVsdGlzaWcACQEHQWRkcmVzcwEBAAkAAgECGF93aGVuTXVsdGlzaWdTZXQ6IHJldmVydAYBE193aGVuTm90SW5pdGlhbGl6ZWQAAwkBCV9sb2FkSW5pdAAJAAIBAhtfd2hlbk5vdEluaXRpYWxpemVkOiByZXZlcnQGARBfd2hlbkluaXRpYWxpemVkAAMJAQEhAQkBCV9sb2FkSW5pdAAJAAIBAhhfd2hlbkluaXRpYWxpemVkOiByZXZlcnQGAQ5fd2hlbk5vdFBhdXNlZAADCQEKX2xvYWRQYXVzZQAJAAIBAhZfd2hlbk5vdFBhdXNlZDogcmV2ZXJ0BgELX3doZW5QYXVzZWQAAwkBASEBCQEKX2xvYWRQYXVzZQAJAAIBAhNfd2hlblBhdXNlZDogcmV2ZXJ0BgELX29ubHlQYXVzZXIBB2NhbGxlcl8DCQECIT0CBQdjYWxsZXJfCQELX2xvYWRQYXVzZXIACQACAQITX29ubHlQYXVzZXI6IHJldmVydAYBBl9hc0ludAEEdmFsXwQHJG1hdGNoMAUEdmFsXwMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEJAAIBAg5fYXNJbnQ6IHJldmVydAEIX2FzQnl0ZXMBBHZhbF8EByRtYXRjaDAFBHZhbF8DCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYQUHJG1hdGNoMAUBYQkAAgECEF9hc0J5dGVzOiByZXZlcnQBEV92YWxpZGF0ZUV4ZWN1dG9yAgR2YWxfBGVycl8DCQECIT0CBQR2YWxfCQENX2xvYWRFeGVjdXRvcgAJAAIBBQRlcnJfBgEPX3ZhbGlkYXRlQ2FsbGVyAgR2YWxfBGVycl8DCQECIT0CBQR2YWxfCQETX2xvYWRDYWxsZXJDb250cmFjdAAJAAIBBQRlcnJfBgEOX3ZhbGlkYXRlQ2hhaW4CEWV4ZWN1dGlvbkNoYWluSWRfBGVycl8DCQEBIQEJAQpfbG9hZENoYWluAQURZXhlY3V0aW9uQ2hhaW5JZF8JAAIBBQRlcnJfBg4BaQEEaW5pdAQJZXhlY3V0b3JfCGFkYXB0ZXJfB3BhdXNlcl8NZmVlUmVjaXBpZW50XwQDZXJyAwMDAwMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARNfd2hlbk5vdEluaXRpYWxpemVkAAcJARBfd2hlbk11bHRpc2lnU2V0AAcJARBfdmFsaWRhdGVBZGRyZXNzAgUJZXhlY3V0b3JfAhZpbml0OiBpbnZhbGlkIGV4ZWN1dG9yBwkBEF92YWxpZGF0ZUFkZHJlc3MCBQhhZGFwdGVyXwIVaW5pdDogaW52YWxpZCBhZGFwdGVyBwkBEF92YWxpZGF0ZUFkZHJlc3MCBQdwYXVzZXJfAhRpbml0OiBpbnZhbGlkIHBhdXNlcgcJARBfdmFsaWRhdGVBZGRyZXNzAgUNZmVlUmVjaXBpZW50XwIaaW5pdDogaW52YWxpZCBmZWVSZWNpcGllbnQHAwkAAAIFA2VycgUDZXJyCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkBCV9zYXZlSW5pdAEGCQENX3NhdmVFeGVjdXRvcgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCWV4ZWN1dG9yXwkBEF9zYXZlUm9vdEFkYXB0ZXIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQhhZGFwdGVyXwkBC19zYXZlUGF1c2VyAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUHcGF1c2VyXwkBEV9zYXZlRmVlUmVjaXBpZW50AQkBEUBleHRyTmF0aXZlKDEwNjIpAQUNZmVlUmVjaXBpZW50XwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQptaW50VG9rZW5zBw9jYWxsZXJDb250cmFjdF8OYXNzZXRDb250cmFjdF8HYW1vdW50XwpyZWNpcGllbnRfDmdhc2xlc3NSZXdhcmRfCXJlZmVycmVyXwxyZWZlcnJlckZlZV8EBmFtb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEFB2Ftb3VudF8CF21pbnQ6IGFtb3VudCBpcyBub3QgSW50BA1nYXNsZXNzUmV3YXJkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQUOZ2FzbGVzc1Jld2FyZF8CHm1pbnQ6IGdhc2xlc3NSZXdhcmQgaXMgbm90IEludAQLcmVmZXJyZXJGZWUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBBQxyZWZlcnJlckZlZV8CHG1pbnQ6IHJlZmVycmVyRmVlIGlzIG5vdCBJbnQEA2VycgMDAwMDAwMDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFDmFzc2V0Q29udHJhY3RfAhxtaW50OiBpbnZhbGlkIGFzc2V0IGNvbnRyYWN0BwkBEV92YWxpZGF0ZUV4ZWN1dG9yAggFAWkGY2FsbGVyAhZtaW50OiBpbnZhbGlkIGV4ZWN1dG9yBwkBD192YWxpZGF0ZUNhbGxlcgIFD2NhbGxlckNvbnRyYWN0XwIUbWludDogaW52YWxpZCBjYWxsZXIHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFCnJlY2lwaWVudF8CH21pbnQ6IGludmFsaWQgcmVjaXBpZW50IGFkZHJlc3MHCQEMX3ZhbGlkYXRlSW50BAUGYW1vdW50AAAFB01BWF9JTlQCFG1pbnQ6IGludmFsaWQgYW1vdW50BwkBDF92YWxpZGF0ZUludAQFDWdhc2xlc3NSZXdhcmQAAAUHTUFYX0lOVAIbbWludDogaW52YWxpZCBnYXNsZXNzUmV3YXJkBwkBDF92YWxpZGF0ZUludAQFC3JlZmVycmVyRmVlAAAFB01BWF9JTlQCGm1pbnQ6IGludmFsaWQgcmVmZXJyZXIgZmVlBwMJAAACBQNlcnIFA2VycgQHYXNzZXRJZAkBCF9hc0J5dGVzAQkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQ5hc3NldENvbnRyYWN0XwIKZ2V0QXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUHYXNzZXRJZAUHYXNzZXRJZAQNYXNzZXREZWNpbWFscwkBBl9hc0ludAEJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUOYXNzZXRDb250cmFjdF8CC2dldERlY2ltYWxzBQNuaWwFA25pbAMJAAACBQ1hc3NldERlY2ltYWxzBQ1hc3NldERlY2ltYWxzBBBub3JtYWxpemVkQW1vdW50CQESX25vcm1hbGl6ZURlY2ltYWxzAwUGYW1vdW50BQhERUNJTUFMUwUNYXNzZXREZWNpbWFscwQRbm9ybWFsaXplZEdhc2xlc3MJARJfbm9ybWFsaXplRGVjaW1hbHMDBQ1nYXNsZXNzUmV3YXJkBQhERUNJTUFMUwUNYXNzZXREZWNpbWFscwQIcmVmZXJyZXIEByRtYXRjaDAJAKYIAQUJcmVmZXJyZXJfAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEDnJlZmVyZXJBZGRyZXNzBQckbWF0Y2gwBBVub3JtYWxpemVkUmVmZXJyZXJGZWUJARJfbm9ybWFsaXplRGVjaW1hbHMDBQtyZWZlcnJlckZlZQUIREVDSU1BTFMFDWFzc2V0RGVjaW1hbHMJAJQKAgUVbm9ybWFsaXplZFJlZmVycmVyRmVlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFDnJlZmVyZXJBZGRyZXNzBRVub3JtYWxpemVkUmVmZXJyZXJGZWUFB2Fzc2V0SWQFA25pbAkAlAoCAAAFA25pbAQVbm9ybWFsaXplZFJlZmVycmVyRmVlCAUIcmVmZXJyZXICXzEED3JlZmVycmVyQWN0aW9ucwgFCHJlZmVycmVyAl8yBAppbnZvY2F0aW9uCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDmFzc2V0Q29udHJhY3RfAgRtaW50CQDMCAIJAGQCBRBub3JtYWxpemVkQW1vdW50BRVub3JtYWxpemVkUmVmZXJyZXJGZWUJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAACBQppbnZvY2F0aW9uBQppbnZvY2F0aW9uBAdhY3Rpb25zAwMJAGYCBRFub3JtYWxpemVkR2FzbGVzcwAACQECIT0CCQERQGV4dHJOYXRpdmUoMTA2MikBBQpyZWNpcGllbnRfCAUBaQxvcmlnaW5DYWxsZXIHCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCnJlY2lwaWVudF8JAGUCBRBub3JtYWxpemVkQW1vdW50BRFub3JtYWxpemVkR2FzbGVzcwUHYXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQxvcmlnaW5DYWxsZXIFEW5vcm1hbGl6ZWRHYXNsZXNzBQdhc3NldElkBQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUKcmVjaXBpZW50XwUQbm9ybWFsaXplZEFtb3VudAUHYXNzZXRJZAUDbmlsCQCUCgIJAM4IAgUHYWN0aW9ucwUPcmVmZXJyZXJBY3Rpb25zBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCmJ1cm5Ub2tlbnMEEWV4ZWN1dGlvbkNoYWluSWRfCnJlY2lwaWVudF8JcmVmZXJyZXJfDmdhc2xlc3NSZXdhcmRfBANlcnIDAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBDl92YWxpZGF0ZUNoYWluAgURZXhlY3V0aW9uQ2hhaW5JZF8CI2J1cm5Ub2tlbnM6IGludmFsaWQgZXhlY3V0aW9uIGNoYWluBwkBFV92YWxpZGF0ZVBheW1lbnRzU2l6ZQMIBQFpCHBheW1lbnRzAAECFmJ1cm5Ub2tlbnM6IG5vIHBheW1lbnQHCQEMX3ZhbGlkYXRlSW50BAUOZ2FzbGVzc1Jld2FyZF8AAAUHTUFYX0lOVAIhYnVyblRva2VuczogaW52YWxpZCBnYXNsZXNzUmV3YXJkBwkBDF92YWxpZGF0ZUludAQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAAFB01BWF9JTlQCImJ1cm5Ub2tlbnM6IGludmFsaWQgcGF5bWVudCBhbW91bnQHAwkAAAIFA2VycgUDZXJyBAZhbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BAdhc3NldElkBAckbWF0Y2gwCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYQUHJG1hdGNoMAUBYQkAAgECGWJ1cm5Ub2tlbnM6IGludmFsaWQgYXNzZXQEB2JpbmRpbmcJAQxfbG9hZEJpbmRpbmcCBRFleGVjdXRpb25DaGFpbklkXwUHYXNzZXRJZAQNYXNzZXRDb250cmFjdAgFB2JpbmRpbmcCXzEEDmV4ZWN1dGlvbkFzc2V0CAUHYmluZGluZwJfMgQJbWluQW1vdW50CAUHYmluZGluZwJfMwQGbWluRmVlCAUHYmluZGluZwJfNAQMdGhyZXNob2xkRmVlCAUHYmluZGluZwJfNQQQYmVmb3JlUGVyY2VudEZlZQgFB2JpbmRpbmcCXzYED2FmdGVyUGVyY2VudEZlZQgFB2JpbmRpbmcCXzcEB2VuYWJsZWQIBQdiaW5kaW5nAl84BARlcnIxAwMJARBfdmFsaWRhdGVBZGRyZXNzAgkApQgBBQ1hc3NldENvbnRyYWN0AhtidXJuVG9rZW5zOiBubyBzdWNoIGJpbmRpbmcJAQxfdmFsaWRhdGVJbnQEBQZhbW91bnQFCW1pbkFtb3VudAUHTUFYX0lOVAIZYnVyblRva2VuczogbGVzcyB0aGFuIG1pbgcJAQ1fdmFsaWRhdGVCb29sAwUHZW5hYmxlZAYCHWJ1cm5Ub2tlbnM6IHRva2VuIGlzIGRpc2FibGVkBwMJAAACBQRlcnIxBQRlcnIxBA1hc3NldERlY2ltYWxzCQEGX2FzSW50AQkA/AcEBQ1hc3NldENvbnRyYWN0AgtnZXREZWNpbWFscwUDbmlsBQNuaWwDCQAAAgUNYXNzZXREZWNpbWFscwUNYXNzZXREZWNpbWFscwQHcGVyY2VudAMJAGYCBQZhbW91bnQFDHRocmVzaG9sZEZlZQUPYWZ0ZXJQZXJjZW50RmVlBRBiZWZvcmVQZXJjZW50RmVlBANmZWUJAGQCBQZtaW5GZWUJAGsDBQZhbW91bnQFB3BlcmNlbnQFDlBFUkNFTlRfRkFDVE9SBARlcnIyCQEMX3ZhbGlkYXRlSW50BAUGYW1vdW50CQBkAgUDZmVlAAEFB01BWF9JTlQCIGJ1cm5Ub2tlbnM6IGZlZSBtb3JlIHRoYW4gYW1vdW50AwkAAAIFBGVycjIFBGVycjIEDGFtb3VudFRvU2VuZAkAZQIFBmFtb3VudAUDZmVlBARlcnIzCQEMX3ZhbGlkYXRlSW50BAUMYW1vdW50VG9TZW5kCQBkAgUOZ2FzbGVzc1Jld2FyZF8AAQUHTUFYX0lOVAIjYnVyblRva2VuczogcmV3YXJkIG1vcmUgdGhhbiBhbW91bnQDCQAAAgUEZXJyMwUEZXJyMwQJdXBkYXRlRmVlCQBkAgkBCF9sb2FkRmVlAQUHYXNzZXRJZAUDZmVlBBBub3JtYWxpemVkQW1vdW50CQESX25vcm1hbGl6ZURlY2ltYWxzAwUMYW1vdW50VG9TZW5kBQ1hc3NldERlY2ltYWxzBQhERUNJTUFMUwQRbm9ybWFsaXplZEdhc2xlc3MJARJfbm9ybWFsaXplRGVjaW1hbHMDBQ5nYXNsZXNzUmV3YXJkXwUNYXNzZXREZWNpbWFscwUIREVDSU1BTFMECmludm9jYXRpb24JAPwHBAkBEF9sb2FkUm9vdEFkYXB0ZXIABRNGVU5DX1JFTEVBU0VfVE9LRU5TCQDMCAIFEWV4ZWN1dGlvbkNoYWluSWRfCQDMCAIFDmV4ZWN1dGlvbkFzc2V0CQDMCAIFEG5vcm1hbGl6ZWRBbW91bnQJAMwIAgUKcmVjaXBpZW50XwkAzAgCBRFub3JtYWxpemVkR2FzbGVzcwUDbmlsBQNuaWwDCQAAAgUKaW52b2NhdGlvbgUKaW52b2NhdGlvbgkAlAoCCQDOCAIJAQhfc2F2ZUZlZQIFB2Fzc2V0SWQFCXVwZGF0ZUZlZQkAzAgCCQEEQnVybgIFB2Fzc2V0SWQFDGFtb3VudFRvU2VuZAUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDGJ1cm5Ub2tlbnNWMgQRZXhlY3V0aW9uQ2hhaW5JZF8KcmVjaXBpZW50XwlyZWZlcnJlcl8OZ2FzbGVzc1Jld2FyZF8EA2VycgMDAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBDl92YWxpZGF0ZUNoYWluAgURZXhlY3V0aW9uQ2hhaW5JZF8CJWJ1cm5Ub2tlbnNWMjogaW52YWxpZCBleGVjdXRpb24gY2hhaW4HCQEVX3ZhbGlkYXRlUGF5bWVudHNTaXplAwgFAWkIcGF5bWVudHMAAQIYYnVyblRva2Vuc1YyOiBubyBwYXltZW50BwkBDF92YWxpZGF0ZUludAQFDmdhc2xlc3NSZXdhcmRfAAAFB01BWF9JTlQCI2J1cm5Ub2tlbnNWMjogaW52YWxpZCBnYXNsZXNzUmV3YXJkBwkBDF92YWxpZGF0ZUludAQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAAFB01BWF9JTlQCJGJ1cm5Ub2tlbnNWMjogaW52YWxpZCBwYXltZW50IGFtb3VudAcJARFfdmFsaWRhdGVSZWZlcnJlcgIFCXJlZmVycmVyXwIeYnVyblRva2Vuc1YyOiBpbnZhbGlkIHJlZmVycmVyBwMJAAACBQNlcnIFA2VycgQGYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQHYXNzZXRJZAQHJG1hdGNoMAgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWEFByRtYXRjaDAFAWEJAAIBAhtidXJuVG9rZW5zVjI6IGludmFsaWQgYXNzZXQEB2JpbmRpbmcJAQxfbG9hZEJpbmRpbmcCBRFleGVjdXRpb25DaGFpbklkXwUHYXNzZXRJZAQNYXNzZXRDb250cmFjdAgFB2JpbmRpbmcCXzEEDmV4ZWN1dGlvbkFzc2V0CAUHYmluZGluZwJfMgQJbWluQW1vdW50CAUHYmluZGluZwJfMwQGbWluRmVlCAUHYmluZGluZwJfNAQMdGhyZXNob2xkRmVlCAUHYmluZGluZwJfNQQQYmVmb3JlUGVyY2VudEZlZQgFB2JpbmRpbmcCXzYED2FmdGVyUGVyY2VudEZlZQgFB2JpbmRpbmcCXzcEB2VuYWJsZWQIBQdiaW5kaW5nAl84BARlcnIxAwMJARBfdmFsaWRhdGVBZGRyZXNzAgkApQgBBQ1hc3NldENvbnRyYWN0Ah1idXJuVG9rZW5zVjI6IG5vIHN1Y2ggYmluZGluZwkBDF92YWxpZGF0ZUludAQFBmFtb3VudAUJbWluQW1vdW50BQdNQVhfSU5UAhtidXJuVG9rZW5zVjI6IGxlc3MgdGhhbiBtaW4HCQENX3ZhbGlkYXRlQm9vbAMFB2VuYWJsZWQGAh9idXJuVG9rZW5zVjI6IHRva2VuIGlzIGRpc2FibGVkBwMJAAACBQRlcnIxBQRlcnIxBA1hc3NldERlY2ltYWxzCQEGX2FzSW50AQkA/AcEBQ1hc3NldENvbnRyYWN0AgtnZXREZWNpbWFscwUDbmlsBQNuaWwDCQAAAgUNYXNzZXREZWNpbWFscwUNYXNzZXREZWNpbWFscwQHcGVyY2VudAMJAGYCBQZhbW91bnQFDHRocmVzaG9sZEZlZQUPYWZ0ZXJQZXJjZW50RmVlBRBiZWZvcmVQZXJjZW50RmVlBANmZWUJAGQCBQZtaW5GZWUJAGsDBQZhbW91bnQFB3BlcmNlbnQFDlBFUkNFTlRfRkFDVE9SBARlcnIyCQEMX3ZhbGlkYXRlSW50BAUGYW1vdW50CQBkAgUDZmVlAAEFB01BWF9JTlQCImJ1cm5Ub2tlbnNWMjogZmVlIG1vcmUgdGhhbiBhbW91bnQDCQAAAgUEZXJyMgUEZXJyMgQNJHQwMTYyMjQxNjYyOQMJAQIhPQIFCXJlZmVycmVyXwIABAhyZWZlcnJlcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUJcmVmZXJyZXJfBBFyZWZlcnJlckZlZUFtb3VudAkAawMJARdfbG9hZFJlZmVycmVyRmVlUGVyY2VudAIFEWV4ZWN1dGlvbkNoYWluSWRfBQhyZWZlcnJlcgUDZmVlBQ5QRVJDRU5UX0ZBQ1RPUgkAlAoCBRFyZWZlcnJlckZlZUFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhyZWZlcnJlcgURcmVmZXJyZXJGZWVBbW91bnQFB2Fzc2V0SWQFA25pbAkAlAoCAAAFA25pbAQLcmVmZXJyZXJGZWUIBQ0kdDAxNjIyNDE2NjI5Al8xBA9yZWZlcnJlckFjdGlvbnMIBQ0kdDAxNjIyNDE2NjI5Al8yBAxhbW91bnRUb1NlbmQJAGUCBQZhbW91bnQFA2ZlZQQEZXJyMwkBDF92YWxpZGF0ZUludAQFDGFtb3VudFRvU2VuZAkAZAIFDmdhc2xlc3NSZXdhcmRfAAEFB01BWF9JTlQCJWJ1cm5Ub2tlbnNWMjogcmV3YXJkIG1vcmUgdGhhbiBhbW91bnQDCQAAAgUEZXJyMwUEZXJyMwQJdXBkYXRlRmVlCQBlAgkAZAIJAQhfbG9hZEZlZQEFB2Fzc2V0SWQFA2ZlZQULcmVmZXJyZXJGZWUEEG5vcm1hbGl6ZWRBbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMDBQxhbW91bnRUb1NlbmQFDWFzc2V0RGVjaW1hbHMFCERFQ0lNQUxTBBFub3JtYWxpemVkR2FzbGVzcwkBEl9ub3JtYWxpemVEZWNpbWFscwMFDmdhc2xlc3NSZXdhcmRfBQ1hc3NldERlY2ltYWxzBQhERUNJTUFMUwQKaW52b2NhdGlvbgkA/AcECQEQX2xvYWRSb290QWRhcHRlcgAFE0ZVTkNfUkVMRUFTRV9UT0tFTlMJAMwIAgURZXhlY3V0aW9uQ2hhaW5JZF8JAMwIAgUOZXhlY3V0aW9uQXNzZXQJAMwIAgUQbm9ybWFsaXplZEFtb3VudAkAzAgCBQpyZWNpcGllbnRfCQDMCAIFEW5vcm1hbGl6ZWRHYXNsZXNzBQNuaWwFA25pbAMJAAACBQppbnZvY2F0aW9uBQppbnZvY2F0aW9uCQCUCgIJAM4IAgkAzggCCQEIX3NhdmVGZWUCBQdhc3NldElkBQl1cGRhdGVGZWUFD3JlZmVycmVyQWN0aW9ucwkAzAgCCQEEQnVybgIFB2Fzc2V0SWQFDGFtb3VudFRvU2VuZAUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3RyYW5zZmVyRmVlAhFleGVjdXRpb25DaGFpbklkXwhhc3NldElkXwQDZXJyAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJAQ5fdmFsaWRhdGVBc3NldAIFCGFzc2V0SWRfAhp0cmFuc2ZlckZlZTogaW52YWxpZCBhc3NldAcDCQAAAgUDZXJyBQNlcnIEB2Fzc2V0SWQJANkEAQUIYXNzZXRJZF8EB2JpbmRpbmcJAQxfbG9hZEJpbmRpbmcCBRFleGVjdXRpb25DaGFpbklkXwUHYXNzZXRJZAQNYXNzZXRDb250cmFjdAgFB2JpbmRpbmcCXzEEB2VuYWJsZWQIBQdiaW5kaW5nAl84BARlcnIxAwkBEF92YWxpZGF0ZUFkZHJlc3MCCQClCAEFDWFzc2V0Q29udHJhY3QCHHRyYW5zZmVyRmVlOiBubyBzdWNoIGJpbmRpbmcJAQ1fdmFsaWRhdGVCb29sAwUHZW5hYmxlZAYCHnRyYW5zZmVyRmVlOiB0b2tlbiBpcyBkaXNhYmxlZAcDCQAAAgUEZXJyMQUEZXJyMQkAlAoCCQDOCAIJAQhfc2F2ZUZlZQIFB2Fzc2V0SWQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERX2xvYWRGZWVSZWNpcGllbnQACQEIX2xvYWRGZWUBBQdhc3NldElkBQdhc3NldElkBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEUdXBkYXRlQ2FsbGVyQ29udHJhY3QBD2NhbGxlckNvbnRyYWN0XwQDZXJyAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHAwkAAAIFA2VycgUDZXJyCQCUCgIJARNfc2F2ZUNhbGxlckNvbnRyYWN0AQUPY2FsbGVyQ29udHJhY3RfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFHVwZGF0ZUV4ZWN1dGlvbkNoYWluAhFleGVjdXRpb25DaGFpbklkXwhlbmFibGVkXwQDZXJyAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBDF92YWxpZGF0ZUludAQFEWV4ZWN1dGlvbkNoYWluSWRfAAAFB01BWF9JTlQCLnVwZGF0ZUV4ZWN1dGlvbkNoYWluOiBpbnZhbGlkIGV4ZWN1dGlvbkNoYWluSWQHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQpfc2F2ZUNoYWluAgURZXhlY3V0aW9uQ2hhaW5JZF8FCGVuYWJsZWRfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEnVwZGF0ZUZlZVJlY2lwaWVudAENZmVlUmVjaXBpZW50XwQDZXJyAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBEF92YWxpZGF0ZUFkZHJlc3MCBQ1mZWVSZWNpcGllbnRfAih1cGRhdGVGZWVSZWNpcGllbnQ6IGludmFsaWQgZmVlUmVjaXBpZW50BwMJAAACBQNlcnIFA2VycgkAlAoCCQERX3NhdmVGZWVSZWNpcGllbnQBCQERQGV4dHJOYXRpdmUoMTA2MikBBQ1mZWVSZWNpcGllbnRfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDnVwZGF0ZVJlZmVycmVyAxFleGVjdXRpb25DaGFpbklkXwlyZWZlcnJlcl8EZmVlXwQDZXJyAwMDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQEOX3ZhbGlkYXRlQ2hhaW4CBRFleGVjdXRpb25DaGFpbklkXwIndXBkYXRlUmVmZXJyZXI6IGludmFsaWQgZXhlY3V0aW9uIGNoYWluBwkBEF92YWxpZGF0ZUFkZHJlc3MCBQlyZWZlcnJlcl8CIHVwZGF0ZVJlZmVycmVyOiBpbnZhbGlkIHJlZmVycmVyBwkBDF92YWxpZGF0ZUludAQFBGZlZV8AAAUQTUFYX1JFRkVSUkVSX0ZFRQIbdXBkYXRlUmVmZXJyZXI6IGludmFsaWQgZmVlBwMJAAACBQNlcnIFA2VycgkAlAoCCQEXX3NhdmVSZWZlcnJlckZlZVBlcmNlbnQDBRFleGVjdXRpb25DaGFpbklkXwkBEUBleHRyTmF0aXZlKDEwNjIpAQUJcmVmZXJyZXJfBQRmZWVfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEXVwZGF0ZUJpbmRpbmdJbmZvCRFleGVjdXRpb25DaGFpbklkXw5hc3NldENvbnRyYWN0Xw9leGVjdXRpb25Bc3NldF8KbWluQW1vdW50XwdtaW5GZWVfDXRocmVzaG9sZEZlZV8RYmVmb3JlUGVyY2VudEZlZV8QYWZ0ZXJQZXJjZW50RmVlXwhlbmFibGVkXwQDZXJyAwMDAwMDAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBEF92YWxpZGF0ZUFkZHJlc3MCBQ5hc3NldENvbnRyYWN0XwIpdXBkYXRlQmluZGluZ0luZm86IGludmFsaWQgYXNzZXQgY29udHJhY3QHCQEMX3ZhbGlkYXRlSW50BAURZXhlY3V0aW9uQ2hhaW5JZF8AAAUHTUFYX0lOVAIrdXBkYXRlQmluZGluZ0luZm86IGludmFsaWQgZXhlY3V0aW9uQ2hhaW5JZAcJAQxfdmFsaWRhdGVJbnQEBQptaW5BbW91bnRfAAAFB01BWF9JTlQCJHVwZGF0ZUJpbmRpbmdJbmZvOiBpbnZhbGlkIG1pbkFtb3VudAcJAQxfdmFsaWRhdGVJbnQEBQdtaW5GZWVfAAAFB01BWF9JTlQCIXVwZGF0ZUJpbmRpbmdJbmZvOiBpbnZhbGlkIG1pbkZlZQcJAQxfdmFsaWRhdGVJbnQEBQ10aHJlc2hvbGRGZWVfAAAFB01BWF9JTlQCJ3VwZGF0ZUJpbmRpbmdJbmZvOiBpbnZhbGlkIHRocmVzaG9sZEZlZQcJAQxfdmFsaWRhdGVJbnQEBRFiZWZvcmVQZXJjZW50RmVlXwAABQdNQVhfSU5UAit1cGRhdGVCaW5kaW5nSW5mbzogaW52YWxpZCBiZWZvcmVQZXJjZW50RmVlBwkBDF92YWxpZGF0ZUludAQFEGFmdGVyUGVyY2VudEZlZV8AAAUHTUFYX0lOVAIqdXBkYXRlQmluZGluZ0luZm86IGludmFsaWQgYWZ0ZXJQZXJjZW50RmVlBwMJAAACBQNlcnIFA2VycgQHYXNzZXRJZAkBCF9hc0J5dGVzAQkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQ5hc3NldENvbnRyYWN0XwIKZ2V0QXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUHYXNzZXRJZAUHYXNzZXRJZAQHYmluZGluZwkAmgoICQERQGV4dHJOYXRpdmUoMTA2MikBBQ5hc3NldENvbnRyYWN0XwUPZXhlY3V0aW9uQXNzZXRfBQptaW5BbW91bnRfBQdtaW5GZWVfBQ10aHJlc2hvbGRGZWVfBRFiZWZvcmVQZXJjZW50RmVlXwUQYWZ0ZXJQZXJjZW50RmVlXwUIZW5hYmxlZF8JAJQKAgkBDF9zYXZlQmluZGluZwMFEWV4ZWN1dGlvbkNoYWluSWRfBQdhc3NldElkBQdiaW5kaW5nBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBXBhdXNlAAQDZXJyAwMJAQtfb25seVBhdXNlcgEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBDl93aGVuTm90UGF1c2VkAAcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBCl9zYXZlUGF1c2UBBgUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQd1bnBhdXNlAAQDZXJyAwMJAQtfb25seVBhdXNlcgEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBC193aGVuUGF1c2VkAAcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBCl9zYXZlUGF1c2UBBwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQx1cGRhdGVQYXVzZXIBB3BhdXNlcl8EA2VycgMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJARBfdmFsaWRhdGVBZGRyZXNzAgUHcGF1c2VyXwIcdXBkYXRlUGF1c2VyOiBpbnZhbGlkIHBhdXNlcgcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBC19zYXZlUGF1c2VyAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUHcGF1c2VyXwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtzZXRNdWx0aXNpZwEJbXVsdGlzaWdfBANlcnIDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfdmFsaWRhdGVBZGRyZXNzAgUJbXVsdGlzaWdfAh1zZXRNdWx0aXNpZzogaW52YWxpZCBtdWx0aXNpZwcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBDV9zYXZlTXVsdGlzaWcBCQERQGV4dHJOYXRpdmUoMTA2MikBBQltdWx0aXNpZ18FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABAckbWF0Y2gwCQCiCAEFDEtFWV9NVUxUSVNJRwMJAAECBQckbWF0Y2gwAgZTdHJpbmcECG11bHRpc2lnBQckbWF0Y2gwCQELdmFsdWVPckVsc2UCCQCbCAIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCG11bHRpc2lnCQC5CQIJAMwIAgUKS0VZX1NUQVRVUwkAzAgCCQClCAEFBHRoaXMJAMwIAgkA2AQBCAUCdHgCaWQFA25pbAUJU0VQQVJBVE9SBwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleYXDisg=", "height": 2649471, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 5Z1JkyR2dz4cb2Dj5tp9UrMtWcPMpuen9D5L3xvJzgxu Next: 2WKUirVcMpQUDDokDWowue7hGuXqGuH2riBivzimqcN5 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
369374
370375
371376 @Callable(i)
372-func burnTokens (executionChainId_,recipient_,gaslessReward_) = {
377+func burnTokens (executionChainId_,recipient_,referrer_,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 {
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 $t01622416629 = 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 = $t01622416629._1
507+ let referrerActions = $t01622416629._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)
372-func burnTokens (executionChainId_,recipient_,gaslessReward_) = {
377+func burnTokens (executionChainId_,recipient_,referrer_,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 $t01622416629 = 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 = $t01622416629._1
507+ let referrerActions = $t01622416629._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/873ac7e 
75.92 ms