tx · 85K62F5p4QHAyHKztJ6XmU3ToJ6rKyDmaPzmveE9LzV6

3N8et6WznLg1aBK8WVHSY1oWHtoyEiDx3SV:  -0.02100000 Waves

2024.01.19 17:30 [2938569] smart account 3N8et6WznLg1aBK8WVHSY1oWHtoyEiDx3SV > SELF 0.00000000 Waves

{ "type": 13, "id": "85K62F5p4QHAyHKztJ6XmU3ToJ6rKyDmaPzmveE9LzV6", "fee": 2100000, "feeAssetId": null, "timestamp": 1705674623800, "version": 2, "chainId": 84, "sender": "3N8et6WznLg1aBK8WVHSY1oWHtoyEiDx3SV", "senderPublicKey": "AynEswuW3gNkK56xYF19SRbhwxHMeTgDL8R8CgCCzL4y", "proofs": [ "3SvhituRu1y14DiTWW9D3RL2ergDLtA5QZzwXcbYbLNdFPZH6wujSbNPY4LpDhxp2w4b6m6WLA2nbabEBuWF6Kb1" ], "script": "base64:BgJiCAISBgoECAgICBIJCgcICAgICAgIEgUKAwEIARIGCgQBCAgBEgQKAgEIEgMKAQgSBAoCAQQSAwoBCBIFCgMBCAESCwoJAQgIAQEBAQEEEgQKAggIEgASABIDCgEIEgMKAQhKAAlTRVBBUkFUT1ICAl9fAAhLRVlfSU5JVAIESU5JVAAMS0VZX01VTFRJU0lHAghNVUxUSVNJRwAKS0VZX1NUQVRVUwIGU1RBVFVTAApLRVlfUEFVU0VEAgZQQVVTRUQACktFWV9QQVVTRVICBlBBVVNFUgAMS0VZX0VYRUNVVE9SAghFWEVDVVRPUgAQS0VZX1JPT1RfQURBUFRFUgIMUk9PVF9BREFQVEVSABNLRVlfQ0FMTEVSX0NPTlRSQUNUAg9DQUxMRVJfQ09OVFJBQ1QACUtFWV9DSEFJTgIFQ0hBSU4AC0tFWV9CSU5ESU5HAgdCSU5ESU5HAAdLRVlfRkVFAgNGRUUAEUtFWV9GRUVfUkVDSVBJRU5UAg1GRUVfUkVDSVBJRU5UABhLRVlfUkVGRVJSRVJfRkVFX1BFUkNFTlQCFFJFRkVSUkVSX0ZFRV9QRVJDRU5UAB1LRVlfQ1JPU1NDSEFJTl9QT09MX0NPTlRSQUNUUwIZQ1JPU1NDSEFJTl9QT09MX0NPTlRSQUNUUwAZS0VZX0JSSURHRV9BU1NFVF9DT05UUkFDVAIVQlJJREdFX0FTU0VUX0NPTlRSQUNUAAlGVU5DX01JTlQCBG1pbnQADEZVTkNfREVQT1NJVAIHZGVwb3NpdAATRlVOQ19SRUxFQVNFX1RPS0VOUwINcmVsZWFzZVRva2VucwARRlVOQ19HRVRfQVNTRVRfSUQCCmdldEFzc2V0SWQAEUZVTkNfR0VUX0RFQ0lNQUxTAgtnZXREZWNpbWFscwAFV0FWRVMCBVdBVkVTAA5XQVZFU19ERUNJTUFMUwAIAAhERUNJTUFMUwAGAA5QRVJDRU5UX0ZBQ1RPUgDAhD0AEE1BWF9SRUZFUlJFUl9GRUUAwJoMAAdNQVhfSU5UAP//////////fwEQX3ZhbGlkYXRlQWRkcmVzcwIIYWRkcmVzc18EZXJyXwQHJG1hdGNoMAkApggBBQhhZGRyZXNzXwMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAFhBQckbWF0Y2gwBgkAAgEFBGVycl8BDl92YWxpZGF0ZUFzc2V0Aghhc3NldElkXwRlcnJfBAckbWF0Y2gwCQDsBwEJANkEAQUIYXNzZXRJZF8DCQABAgUHJG1hdGNoMAIFQXNzZXQEAWEFByRtYXRjaDAGCQACAQUEZXJyXwEMX3ZhbGlkYXRlSW50BAR2YWxfDmxvd2VyQm91bmRhcnlfDnVwcGVyQm91bmRhcnlfBGVycl8DAwkAZgIFDmxvd2VyQm91bmRhcnlfBQR2YWxfBgkAZgIFBHZhbF8FDnVwcGVyQm91bmRhcnlfCQACAQUEZXJyXwYBDV92YWxpZGF0ZUJvb2wDBHZhbF8HdGFyZ2V0XwRlcnJfAwkBAiE9AgUEdmFsXwUHdGFyZ2V0XwkAAgEFBGVycl8GARVfdmFsaWRhdGVQYXltZW50c1NpemUDCXBheW1lbnRzXwd0YXJnZXRfBGVycl8DCQECIT0CCQCQAwEFCXBheW1lbnRzXwUHdGFyZ2V0XwkAAgEFBGVycl8GARFfdmFsaWRhdGVSZWZlcnJlcgIJcmVmZXJyZXJfBGVycl8DCQECIT0CBQlyZWZlcnJlcl8CAAkBEF92YWxpZGF0ZUFkZHJlc3MCBQlyZWZlcnJlcl8FBGVycl8GARJfbm9ybWFsaXplRGVjaW1hbHMDB2Ftb3VudF8Pc291cmNlRGVjaW1hbHNfD3RhcmdldERlY2ltYWxzXwMJAGcCBQ9zb3VyY2VEZWNpbWFsc18FD3RhcmdldERlY2ltYWxzXwkAaQIFB2Ftb3VudF8JAGwGAAoAAAkAZQIFD3NvdXJjZURlY2ltYWxzXwUPdGFyZ2V0RGVjaW1hbHNfAAAAAAUERE9XTgkAaAIFB2Ftb3VudF8JAGwGAAoAAAkAZQIFD3RhcmdldERlY2ltYWxzXwUPc291cmNlRGVjaW1hbHNfAAAAAAUERE9XTgEJX2xvYWRJbml0AAQHJG1hdGNoMAkAoAgBBQhLRVlfSU5JVAMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFhBQckbWF0Y2gwBQFhBwEJX3NhdmVJbml0AQdpc0luaXRfCQDMCAIJAQxCb29sZWFuRW50cnkCBQhLRVlfSU5JVAUHaXNJbml0XwUDbmlsAQpfbG9hZFBhdXNlAAQHJG1hdGNoMAkAoAgBBQpLRVlfUEFVU0VEAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWEFByRtYXRjaDAFAWEHAQpfc2F2ZVBhdXNlAQlpc1BhdXNlZF8JAMwIAgkBDEJvb2xlYW5FbnRyeQIFCktFWV9QQVVTRUQFCWlzUGF1c2VkXwUDbmlsAQtfbG9hZFBhdXNlcgAEByRtYXRjaDAJAKIIAQUKS0VZX1BBVVNFUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAAQtfc2F2ZVBhdXNlcgEHcGF1c2VyXwkAzAgCCQELU3RyaW5nRW50cnkCBQpLRVlfUEFVU0VSCQClCAEFB3BhdXNlcl8FA25pbAENX2xvYWRNdWx0aXNpZwAEByRtYXRjaDAJAKIIAQUMS0VZX01VTFRJU0lHAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkBB0FkZHJlc3MBAQABDV9zYXZlTXVsdGlzaWcBCW11bHRpc2lnXwkAzAgCCQELU3RyaW5nRW50cnkCBQxLRVlfTVVMVElTSUcJAKUIAQUJbXVsdGlzaWdfBQNuaWwBDV9sb2FkRXhlY3V0b3IABAckbWF0Y2gwCQCiCAEFDEtFWV9FWEVDVVRPUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAAQ1fc2F2ZUV4ZWN1dG9yAQlleGVjdXRvcl8JAMwIAgkBC1N0cmluZ0VudHJ5AgUMS0VZX0VYRUNVVE9SCQClCAEFCWV4ZWN1dG9yXwUDbmlsARNfbG9hZENhbGxlckNvbnRyYWN0AAQHJG1hdGNoMAkAoggBBRNLRVlfQ0FMTEVSX0NPTlRSQUNUAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAUBYQIAARNfc2F2ZUNhbGxlckNvbnRyYWN0AQdjYWxsZXJfCQDMCAIJAQtTdHJpbmdFbnRyeQIFE0tFWV9DQUxMRVJfQ09OVFJBQ1QFB2NhbGxlcl8FA25pbAEKX2xvYWRDaGFpbgEIY2hhaW5JZF8EByRtYXRjaDAJAKAIAQkAuQkCCQDMCAIFCUtFWV9DSEFJTgkAzAgCCQCkAwEFCGNoYWluSWRfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFhBQckbWF0Y2gwBQFhBwEKX3NhdmVDaGFpbgIIY2hhaW5JZF8EdmFsXwkAzAgCCQEMQm9vbGVhbkVudHJ5AgkAuQkCCQDMCAIFCUtFWV9DSEFJTgkAzAgCCQCkAwEFCGNoYWluSWRfBQNuaWwFCVNFUEFSQVRPUgUEdmFsXwUDbmlsAQxfbG9hZEJpbmRpbmcCEWV4ZWN1dGlvbkNoYWluSWRfCGFzc2V0SWRfBAckbWF0Y2gwCQCiCAEJALkJAgkAzAgCBQtLRVlfQklORElORwkAzAgCCQCkAwEFEWV4ZWN1dGlvbkNoYWluSWRfCQDMCAIJANgEAQUIYXNzZXRJZF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAQGc3RydWN0CQC1CQIFAWEFCVNFUEFSQVRPUgkAmgoICQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFBnN0cnVjdAAACQCRAwIFBnN0cnVjdAABCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QAAwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAAECQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAUJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QABgMJAAACCQCRAwIFBnN0cnVjdAAHAgExBgcJAJoKCAkBB0FkZHJlc3MBAQACAAAAAAAAAAAAAAAHAQxfc2F2ZUJpbmRpbmcDEWV4ZWN1dGlvbkNoYWluSWRfCGFzc2V0SWRfCGJpbmRpbmdfCQDMCAIJAQtTdHJpbmdFbnRyeQIJALkJAgkAzAgCBQtLRVlfQklORElORwkAzAgCCQCkAwEFEWV4ZWN1dGlvbkNoYWluSWRfCQDMCAIJANgEAQUIYXNzZXRJZF8FA25pbAUJU0VQQVJBVE9SCQC5CQIJAMwIAgkApQgBCAUIYmluZGluZ18CXzEJAMwIAggFCGJpbmRpbmdfAl8yCQDMCAIJAKQDAQgFCGJpbmRpbmdfAl8zCQDMCAIJAKQDAQgFCGJpbmRpbmdfAl80CQDMCAIJAKQDAQgFCGJpbmRpbmdfAl81CQDMCAIJAKQDAQgFCGJpbmRpbmdfAl82CQDMCAIJAKQDAQgFCGJpbmRpbmdfAl83CQDMCAIDCAUIYmluZGluZ18CXzgCATECATAFA25pbAUJU0VQQVJBVE9SBQNuaWwBCF9sb2FkRmVlAQhhc3NldElkXwQHJG1hdGNoMAkAnwgBCQC5CQIJAMwIAgUHS0VZX0ZFRQkAzAgCCQDYBAEFCGFzc2V0SWRfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAEIX3NhdmVGZWUCCGFzc2V0SWRfBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIJALkJAgkAzAgCBQdLRVlfRkVFCQDMCAIJANgEAQUIYXNzZXRJZF8FA25pbAUJU0VQQVJBVE9SBQR2YWxfBQNuaWwBEF9sb2FkUm9vdEFkYXB0ZXIABAckbWF0Y2gwCQCiCAEFEEtFWV9ST09UX0FEQVBURVIDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFhCQEHQWRkcmVzcwEBAAEQX3NhdmVSb290QWRhcHRlcgEIYWRhcHRlcl8JAMwIAgkBC1N0cmluZ0VudHJ5AgUQS0VZX1JPT1RfQURBUFRFUgkApQgBBQhhZGFwdGVyXwUDbmlsARFfbG9hZEZlZVJlY2lwaWVudAAEByRtYXRjaDAJAKIIAQURS0VZX0ZFRV9SRUNJUElFTlQDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFhCQEHQWRkcmVzcwEBAAERX3NhdmVGZWVSZWNpcGllbnQBBHZhbF8JAMwIAgkBC1N0cmluZ0VudHJ5AgURS0VZX0ZFRV9SRUNJUElFTlQJAKUIAQUEdmFsXwUDbmlsARdfbG9hZFJlZmVycmVyRmVlUGVyY2VudAIRZXhlY3V0aW9uQ2hhaW5JZF8JcmVmZXJyZXJfBAckbWF0Y2gwCQCfCAEJALkJAgkAzAgCBRhLRVlfUkVGRVJSRVJfRkVFX1BFUkNFTlQJAMwIAgkApAMBBRFleGVjdXRpb25DaGFpbklkXwkAzAgCCQClCAEFCXJlZmVycmVyXwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABF19zYXZlUmVmZXJyZXJGZWVQZXJjZW50AxFleGVjdXRpb25DaGFpbklkXwlyZWZlcnJlcl8EdmFsXwkAzAgCCQEMSW50ZWdlckVudHJ5AgkAuQkCCQDMCAIFGEtFWV9SRUZFUlJFUl9GRUVfUEVSQ0VOVAkAzAgCCQCkAwEFEWV4ZWN1dGlvbkNoYWluSWRfCQDMCAIJAKUIAQUJcmVmZXJyZXJfBQNuaWwFCVNFUEFSQVRPUgUEdmFsXwUDbmlsARxfbG9hZENyb3NzY2hhaW5Qb29sQ29udHJhY3RzAAQHJG1hdGNoMAkAoggBBR1LRVlfQ1JPU1NDSEFJTl9QT09MX0NPTlRSQUNUUwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDADCQBmAgkAsQIBBQFhAAAJAL0JAgUBYQUJU0VQQVJBVE9SBQNuaWwFA25pbAEcX3NhdmVDcm9zc2NoYWluUG9vbENvbnRyYWN0cwEKY29udHJhY3RzXwkAzAgCCQELU3RyaW5nRW50cnkCBR1LRVlfQ1JPU1NDSEFJTl9QT09MX0NPTlRSQUNUUwkAuwkCBQpjb250cmFjdHNfBQlTRVBBUkFUT1IFA25pbAEYX2xvYWRCcmlkZ2VBc3NldENvbnRyYWN0ARdjcm9zc2NoYWluUG9vbENvbnRyYWN0XwQHJG1hdGNoMAkAoggBCQC5CQIJAMwIAgUZS0VZX0JSSURHRV9BU1NFVF9DT05UUkFDVAkAzAgCCQClCAEFF2Nyb3NzY2hhaW5Qb29sQ29udHJhY3RfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAARhfc2F2ZUJyaWRnZUFzc2V0Q29udHJhY3QCF2Nyb3NzY2hhaW5Qb29sQ29udHJhY3RfFGJyaWRnZUFzc2V0Q29udHJhY3RfCQDMCAIJAQtTdHJpbmdFbnRyeQIJALkJAgkAzAgCBRlLRVlfQlJJREdFX0FTU0VUX0NPTlRSQUNUCQDMCAIJAKUIAQUXY3Jvc3NjaGFpblBvb2xDb250cmFjdF8FA25pbAUJU0VQQVJBVE9SCQClCAEFFGJyaWRnZUFzc2V0Q29udHJhY3RfBQNuaWwBEV9vbmx5VGhpc0NvbnRyYWN0AQdjYWxsZXJfAwkBAiE9AgUHY2FsbGVyXwUEdGhpcwkAAgECGV9vbmx5VGhpc0NvbnRyYWN0OiByZXZlcnQGARBfd2hlbk11bHRpc2lnU2V0AAMJAAACCQENX2xvYWRNdWx0aXNpZwAJAQdBZGRyZXNzAQEACQACAQIYX3doZW5NdWx0aXNpZ1NldDogcmV2ZXJ0BgETX3doZW5Ob3RJbml0aWFsaXplZAADCQEJX2xvYWRJbml0AAkAAgECG193aGVuTm90SW5pdGlhbGl6ZWQ6IHJldmVydAYBEF93aGVuSW5pdGlhbGl6ZWQAAwkBASEBCQEJX2xvYWRJbml0AAkAAgECGF93aGVuSW5pdGlhbGl6ZWQ6IHJldmVydAYBDl93aGVuTm90UGF1c2VkAAMJAQpfbG9hZFBhdXNlAAkAAgECFl93aGVuTm90UGF1c2VkOiByZXZlcnQGAQtfd2hlblBhdXNlZAADCQEBIQEJAQpfbG9hZFBhdXNlAAkAAgECE193aGVuUGF1c2VkOiByZXZlcnQGAQtfb25seVBhdXNlcgEHY2FsbGVyXwMJAQIhPQIFB2NhbGxlcl8JAQtfbG9hZFBhdXNlcgAJAAIBAhNfb25seVBhdXNlcjogcmV2ZXJ0BgEGX2FzSW50AQR2YWxfBAckbWF0Y2gwBQR2YWxfAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQkAAgECDl9hc0ludDogcmV2ZXJ0AQhfYXNCeXRlcwEEdmFsXwQHJG1hdGNoMAUEdmFsXwMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFhBQckbWF0Y2gwBQFhCQACAQIQX2FzQnl0ZXM6IHJldmVydAERX3ZhbGlkYXRlRXhlY3V0b3ICBHZhbF8EZXJyXwMJAQIhPQIFBHZhbF8JAQ1fbG9hZEV4ZWN1dG9yAAkAAgEFBGVycl8GAQ9fdmFsaWRhdGVDYWxsZXICBHZhbF8EZXJyXwMJAQIhPQIFBHZhbF8JARNfbG9hZENhbGxlckNvbnRyYWN0AAkAAgEFBGVycl8GAQ5fdmFsaWRhdGVDaGFpbgIRZXhlY3V0aW9uQ2hhaW5JZF8EZXJyXwMJAQEhAQkBCl9sb2FkQ2hhaW4BBRFleGVjdXRpb25DaGFpbklkXwkAAgEFBGVycl8GDwFpAQRpbml0BAlleGVjdXRvcl8IYWRhcHRlcl8HcGF1c2VyXw1mZWVSZWNpcGllbnRfBANlcnIDAwMDAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBE193aGVuTm90SW5pdGlhbGl6ZWQABwkBEF93aGVuTXVsdGlzaWdTZXQABwkBEF92YWxpZGF0ZUFkZHJlc3MCBQlleGVjdXRvcl8CFmluaXQ6IGludmFsaWQgZXhlY3V0b3IHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFCGFkYXB0ZXJfAhVpbml0OiBpbnZhbGlkIGFkYXB0ZXIHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFB3BhdXNlcl8CFGluaXQ6IGludmFsaWQgcGF1c2VyBwkBEF92YWxpZGF0ZUFkZHJlc3MCBQ1mZWVSZWNpcGllbnRfAhppbml0OiBpbnZhbGlkIGZlZVJlY2lwaWVudAcDCQAAAgUDZXJyBQNlcnIJAJQKAgkAzggCCQDOCAIJAM4IAgkAzggCCQEJX3NhdmVJbml0AQYJAQ1fc2F2ZUV4ZWN1dG9yAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUJZXhlY3V0b3JfCQEQX3NhdmVSb290QWRhcHRlcgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCGFkYXB0ZXJfCQELX3NhdmVQYXVzZXIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQdwYXVzZXJfCQERX3NhdmVGZWVSZWNpcGllbnQBCQERQGV4dHJOYXRpdmUoMTA2MikBBQ1mZWVSZWNpcGllbnRfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCm1pbnRUb2tlbnMHD2NhbGxlckNvbnRyYWN0Xw5hc3NldENvbnRyYWN0XwdhbW91bnRfCnJlY2lwaWVudF8OZ2FzbGVzc1Jld2FyZF8JcmVmZXJyZXJfDHJlZmVycmVyRmVlXwQGYW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQUHYW1vdW50XwIXbWludDogYW1vdW50IGlzIG5vdCBJbnQEDWdhc2xlc3NSZXdhcmQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBBQ5nYXNsZXNzUmV3YXJkXwIebWludDogZ2FzbGVzc1Jld2FyZCBpcyBub3QgSW50BAtyZWZlcnJlckZlZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEFDHJlZmVycmVyRmVlXwIcbWludDogcmVmZXJyZXJGZWUgaXMgbm90IEludAQDZXJyAwMDAwMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJARBfdmFsaWRhdGVBZGRyZXNzAgUOYXNzZXRDb250cmFjdF8CHG1pbnQ6IGludmFsaWQgYXNzZXQgY29udHJhY3QHCQERX3ZhbGlkYXRlRXhlY3V0b3ICCAUBaQZjYWxsZXICFm1pbnQ6IGludmFsaWQgZXhlY3V0b3IHCQEPX3ZhbGlkYXRlQ2FsbGVyAgUPY2FsbGVyQ29udHJhY3RfAhRtaW50OiBpbnZhbGlkIGNhbGxlcgcJARBfdmFsaWRhdGVBZGRyZXNzAgUKcmVjaXBpZW50XwIfbWludDogaW52YWxpZCByZWNpcGllbnQgYWRkcmVzcwcJAQxfdmFsaWRhdGVJbnQEBQZhbW91bnQAAAUHTUFYX0lOVAIUbWludDogaW52YWxpZCBhbW91bnQHCQEMX3ZhbGlkYXRlSW50BAUNZ2FzbGVzc1Jld2FyZAAABQdNQVhfSU5UAhttaW50OiBpbnZhbGlkIGdhc2xlc3NSZXdhcmQHCQEMX3ZhbGlkYXRlSW50BAULcmVmZXJyZXJGZWUAAAUHTUFYX0lOVAIabWludDogaW52YWxpZCByZWZlcnJlciBmZWUHAwkAAAIFA2VycgUDZXJyBA0kdDAxMTc5NzEyMDg2AwkBD2NvbnRhaW5zRWxlbWVudAIJARxfbG9hZENyb3NzY2hhaW5Qb29sQ29udHJhY3RzAAUOYXNzZXRDb250cmFjdF8JAJQKAgYJARhfbG9hZEJyaWRnZUFzc2V0Q29udHJhY3QBCQERQGV4dHJOYXRpdmUoMTA2MikBBQ5hc3NldENvbnRyYWN0XwkAlAoCBwkBEUBleHRyTmF0aXZlKDEwNjIpAQUOYXNzZXRDb250cmFjdF8EFWlzQ3Jvc3NjaGFpblBvb2xBc3NldAgFDSR0MDExNzk3MTIwODYCXzEEE2JyaWRnZUFzc2V0Q29udHJhY3QIBQ0kdDAxMTc5NzEyMDg2Al8yBAdhc3NldElkCQEIX2FzQnl0ZXMBCQD8BwQFE2JyaWRnZUFzc2V0Q29udHJhY3QFEUZVTkNfR0VUX0FTU0VUX0lEBQNuaWwFA25pbAMJAAACBQdhc3NldElkBQdhc3NldElkBAhkZWNpbWFscwkBBl9hc0ludAEJAPwHBAUTYnJpZGdlQXNzZXRDb250cmFjdAURRlVOQ19HRVRfREVDSU1BTFMFA25pbAUDbmlsAwkAAAIFCGRlY2ltYWxzBQhkZWNpbWFscwQQbm9ybWFsaXplZEFtb3VudAkBEl9ub3JtYWxpemVEZWNpbWFscwMFBmFtb3VudAUIREVDSU1BTFMFCGRlY2ltYWxzBBFub3JtYWxpemVkR2FzbGVzcwkBEl9ub3JtYWxpemVEZWNpbWFscwMFDWdhc2xlc3NSZXdhcmQFCERFQ0lNQUxTBQhkZWNpbWFscwQNJHQwMTI0MjMxMjg2MAQHJG1hdGNoMAkApggBBQlyZWZlcnJlcl8DCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQOcmVmZXJlckFkZHJlc3MFByRtYXRjaDAEFW5vcm1hbGl6ZWRSZWZlcnJlckZlZQkBEl9ub3JtYWxpemVEZWNpbWFscwMFC3JlZmVycmVyRmVlBQhERUNJTUFMUwUIZGVjaW1hbHMJAJQKAgUVbm9ybWFsaXplZFJlZmVycmVyRmVlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFDnJlZmVyZXJBZGRyZXNzBRVub3JtYWxpemVkUmVmZXJyZXJGZWUFB2Fzc2V0SWQFA25pbAkAlAoCAAAFA25pbAQVbm9ybWFsaXplZFJlZmVycmVyRmVlCAUNJHQwMTI0MjMxMjg2MAJfMQQPcmVmZXJyZXJBY3Rpb25zCAUNJHQwMTI0MjMxMjg2MAJfMgQObWludEludm9jYXRpb24JAPwHBAUTYnJpZGdlQXNzZXRDb250cmFjdAUJRlVOQ19NSU5UCQDMCAIJAGQCBRBub3JtYWxpemVkQW1vdW50BRVub3JtYWxpemVkUmVmZXJyZXJGZWUJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAACBQ5taW50SW52b2NhdGlvbgUObWludEludm9jYXRpb24EDSR0MDEyOTk5MTMzMzcDAwkAZgIFEW5vcm1hbGl6ZWRHYXNsZXNzAAAJAQIhPQIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCnJlY2lwaWVudF8IBQFpDG9yaWdpbkNhbGxlcgcJAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQxvcmlnaW5DYWxsZXIFEW5vcm1hbGl6ZWRHYXNsZXNzBQdhc3NldElkBQNuaWwFEW5vcm1hbGl6ZWRHYXNsZXNzCQCUCgIFA25pbAAABA5nYXNsZXNzQWN0aW9ucwgFDSR0MDEyOTk5MTMzMzcCXzEEFW5vcm1hbGl6ZWRHYXNsZXNzVXNlZAgFDSR0MDEyOTk5MTMzMzcCXzIEB2FjdGlvbnMDBRVpc0Nyb3NzY2hhaW5Qb29sQXNzZXQEC3Bvb2xBc3NldElkCQEIX2FzQnl0ZXMBCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDmFzc2V0Q29udHJhY3RfBRFGVU5DX0dFVF9BU1NFVF9JRAUDbmlsBQNuaWwDCQAAAgULcG9vbEFzc2V0SWQFC3Bvb2xBc3NldElkBA1iYWxhbmNlQmVmb3JlCQDwBwIFBHRoaXMFC3Bvb2xBc3NldElkAwkAAAIFDWJhbGFuY2VCZWZvcmUFDWJhbGFuY2VCZWZvcmUEEWRlcG9zaXRJbnZvY2F0aW9uCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDmFzc2V0Q29udHJhY3RfBQxGVU5DX0RFUE9TSVQJAMwIAgAABQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFB2Fzc2V0SWQJAGUCBRBub3JtYWxpemVkQW1vdW50BRVub3JtYWxpemVkR2FzbGVzc1VzZWQFA25pbAMJAAACBRFkZXBvc2l0SW52b2NhdGlvbgURZGVwb3NpdEludm9jYXRpb24EDGJhbGFuY2VBZnRlcgkA8AcCBQR0aGlzBQtwb29sQXNzZXRJZAMJAAACBQxiYWxhbmNlQWZ0ZXIFDGJhbGFuY2VBZnRlcgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQpyZWNpcGllbnRfCQBlAgUMYmFsYW5jZUFmdGVyBQ1iYWxhbmNlQmVmb3JlBQtwb29sQXNzZXRJZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCnJlY2lwaWVudF8JAGUCBRBub3JtYWxpemVkQW1vdW50BRVub3JtYWxpemVkR2FzbGVzc1VzZWQFB2Fzc2V0SWQFA25pbAkAlAoCCQDOCAIJAM4IAgUHYWN0aW9ucwUOZ2FzbGVzc0FjdGlvbnMFD3JlZmVycmVyQWN0aW9ucwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpidXJuVG9rZW5zAxFleGVjdXRpb25DaGFpbklkXwpyZWNpcGllbnRfDmdhc2xlc3NSZXdhcmRfBANlcnIDAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBDl92YWxpZGF0ZUNoYWluAgURZXhlY3V0aW9uQ2hhaW5JZF8CI2J1cm5Ub2tlbnM6IGludmFsaWQgZXhlY3V0aW9uIGNoYWluBwkBFV92YWxpZGF0ZVBheW1lbnRzU2l6ZQMIBQFpCHBheW1lbnRzAAECFmJ1cm5Ub2tlbnM6IG5vIHBheW1lbnQHCQEMX3ZhbGlkYXRlSW50BAUOZ2FzbGVzc1Jld2FyZF8AAAUHTUFYX0lOVAIhYnVyblRva2VuczogaW52YWxpZCBnYXNsZXNzUmV3YXJkBwkBDF92YWxpZGF0ZUludAQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAAFB01BWF9JTlQCImJ1cm5Ub2tlbnM6IGludmFsaWQgcGF5bWVudCBhbW91bnQHAwkAAAIFA2VycgUDZXJyBAZhbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BAdhc3NldElkBAckbWF0Y2gwCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYQUHJG1hdGNoMAUBYQkAAgECGWJ1cm5Ub2tlbnM6IGludmFsaWQgYXNzZXQEB2JpbmRpbmcJAQxfbG9hZEJpbmRpbmcCBRFleGVjdXRpb25DaGFpbklkXwUHYXNzZXRJZAQNYXNzZXRDb250cmFjdAgFB2JpbmRpbmcCXzEEDmV4ZWN1dGlvbkFzc2V0CAUHYmluZGluZwJfMgQJbWluQW1vdW50CAUHYmluZGluZwJfMwQGbWluRmVlCAUHYmluZGluZwJfNAQMdGhyZXNob2xkRmVlCAUHYmluZGluZwJfNQQQYmVmb3JlUGVyY2VudEZlZQgFB2JpbmRpbmcCXzYED2FmdGVyUGVyY2VudEZlZQgFB2JpbmRpbmcCXzcEB2VuYWJsZWQIBQdiaW5kaW5nAl84BARlcnIxAwMJARBfdmFsaWRhdGVBZGRyZXNzAgkApQgBBQ1hc3NldENvbnRyYWN0AhtidXJuVG9rZW5zOiBubyBzdWNoIGJpbmRpbmcJAQxfdmFsaWRhdGVJbnQEBQZhbW91bnQFCW1pbkFtb3VudAUHTUFYX0lOVAIZYnVyblRva2VuczogbGVzcyB0aGFuIG1pbgcJAQ1fdmFsaWRhdGVCb29sAwUHZW5hYmxlZAYCHWJ1cm5Ub2tlbnM6IHRva2VuIGlzIGRpc2FibGVkBwMJAAACBQRlcnIxBQRlcnIxBA1hc3NldERlY2ltYWxzCQEGX2FzSW50AQkA/AcEBQ1hc3NldENvbnRyYWN0BRFGVU5DX0dFVF9ERUNJTUFMUwUDbmlsBQNuaWwDCQAAAgUNYXNzZXREZWNpbWFscwUNYXNzZXREZWNpbWFscwQHcGVyY2VudAMJAGYCBQZhbW91bnQFDHRocmVzaG9sZEZlZQUPYWZ0ZXJQZXJjZW50RmVlBRBiZWZvcmVQZXJjZW50RmVlBANmZWUJAGQCBQZtaW5GZWUJAGsDBQZhbW91bnQFB3BlcmNlbnQFDlBFUkNFTlRfRkFDVE9SBARlcnIyCQEMX3ZhbGlkYXRlSW50BAUGYW1vdW50CQBkAgUDZmVlAAEFB01BWF9JTlQCIGJ1cm5Ub2tlbnM6IGZlZSBtb3JlIHRoYW4gYW1vdW50AwkAAAIFBGVycjIFBGVycjIEDGFtb3VudFRvU2VuZAkAZQIFBmFtb3VudAUDZmVlBARlcnIzCQEMX3ZhbGlkYXRlSW50BAUMYW1vdW50VG9TZW5kCQBkAgUOZ2FzbGVzc1Jld2FyZF8AAQUHTUFYX0lOVAIjYnVyblRva2VuczogcmV3YXJkIG1vcmUgdGhhbiBhbW91bnQDCQAAAgUEZXJyMwUEZXJyMwQJdXBkYXRlRmVlCQBkAgkBCF9sb2FkRmVlAQUHYXNzZXRJZAUDZmVlBBBub3JtYWxpemVkQW1vdW50CQESX25vcm1hbGl6ZURlY2ltYWxzAwUMYW1vdW50VG9TZW5kBQ1hc3NldERlY2ltYWxzBQhERUNJTUFMUwQRbm9ybWFsaXplZEdhc2xlc3MJARJfbm9ybWFsaXplRGVjaW1hbHMDBQ5nYXNsZXNzUmV3YXJkXwUNYXNzZXREZWNpbWFscwUIREVDSU1BTFMECmludm9jYXRpb24JAPwHBAkBEF9sb2FkUm9vdEFkYXB0ZXIABRNGVU5DX1JFTEVBU0VfVE9LRU5TCQDMCAIFEWV4ZWN1dGlvbkNoYWluSWRfCQDMCAIFDmV4ZWN1dGlvbkFzc2V0CQDMCAIFEG5vcm1hbGl6ZWRBbW91bnQJAMwIAgUKcmVjaXBpZW50XwkAzAgCBRFub3JtYWxpemVkR2FzbGVzcwUDbmlsBQNuaWwDCQAAAgUKaW52b2NhdGlvbgUKaW52b2NhdGlvbgkAlAoCCQDOCAIJAQhfc2F2ZUZlZQIFB2Fzc2V0SWQFCXVwZGF0ZUZlZQkAzAgCCQEEQnVybgIFB2Fzc2V0SWQFDGFtb3VudFRvU2VuZAUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDGJ1cm5Ub2tlbnNWMgQRZXhlY3V0aW9uQ2hhaW5JZF8KcmVjaXBpZW50XwlyZWZlcnJlcl8OZ2FzbGVzc1Jld2FyZF8EA2VycgMDAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBDl92YWxpZGF0ZUNoYWluAgURZXhlY3V0aW9uQ2hhaW5JZF8CJWJ1cm5Ub2tlbnNWMjogaW52YWxpZCBleGVjdXRpb24gY2hhaW4HCQEVX3ZhbGlkYXRlUGF5bWVudHNTaXplAwgFAWkIcGF5bWVudHMAAQIYYnVyblRva2Vuc1YyOiBubyBwYXltZW50BwkBDF92YWxpZGF0ZUludAQFDmdhc2xlc3NSZXdhcmRfAAAFB01BWF9JTlQCI2J1cm5Ub2tlbnNWMjogaW52YWxpZCBnYXNsZXNzUmV3YXJkBwkBDF92YWxpZGF0ZUludAQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAAFB01BWF9JTlQCJGJ1cm5Ub2tlbnNWMjogaW52YWxpZCBwYXltZW50IGFtb3VudAcJARFfdmFsaWRhdGVSZWZlcnJlcgIFCXJlZmVycmVyXwIeYnVyblRva2Vuc1YyOiBpbnZhbGlkIHJlZmVycmVyBwMJAAACBQNlcnIFA2VycgQGYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQHYXNzZXRJZAQHJG1hdGNoMAgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWEFByRtYXRjaDAFAWEJAAIBAhtidXJuVG9rZW5zVjI6IGludmFsaWQgYXNzZXQEB2JpbmRpbmcJAQxfbG9hZEJpbmRpbmcCBRFleGVjdXRpb25DaGFpbklkXwUHYXNzZXRJZAQNYXNzZXRDb250cmFjdAgFB2JpbmRpbmcCXzEEDmV4ZWN1dGlvbkFzc2V0CAUHYmluZGluZwJfMgQJbWluQW1vdW50CAUHYmluZGluZwJfMwQGbWluRmVlCAUHYmluZGluZwJfNAQMdGhyZXNob2xkRmVlCAUHYmluZGluZwJfNQQQYmVmb3JlUGVyY2VudEZlZQgFB2JpbmRpbmcCXzYED2FmdGVyUGVyY2VudEZlZQgFB2JpbmRpbmcCXzcEB2VuYWJsZWQIBQdiaW5kaW5nAl84BARlcnIxAwMJARBfdmFsaWRhdGVBZGRyZXNzAgkApQgBBQ1hc3NldENvbnRyYWN0Ah1idXJuVG9rZW5zVjI6IG5vIHN1Y2ggYmluZGluZwkBDF92YWxpZGF0ZUludAQFBmFtb3VudAUJbWluQW1vdW50BQdNQVhfSU5UAhtidXJuVG9rZW5zVjI6IGxlc3MgdGhhbiBtaW4HCQENX3ZhbGlkYXRlQm9vbAMFB2VuYWJsZWQGAh9idXJuVG9rZW5zVjI6IHRva2VuIGlzIGRpc2FibGVkBwMJAAACBQRlcnIxBQRlcnIxBA1hc3NldERlY2ltYWxzCQEGX2FzSW50AQkA/AcEBQ1hc3NldENvbnRyYWN0BRFGVU5DX0dFVF9ERUNJTUFMUwUDbmlsBQNuaWwDCQAAAgUNYXNzZXREZWNpbWFscwUNYXNzZXREZWNpbWFscwQHcGVyY2VudAMJAGYCBQZhbW91bnQFDHRocmVzaG9sZEZlZQUPYWZ0ZXJQZXJjZW50RmVlBRBiZWZvcmVQZXJjZW50RmVlBANmZWUJAGQCBQZtaW5GZWUJAGsDBQZhbW91bnQFB3BlcmNlbnQFDlBFUkNFTlRfRkFDVE9SBARlcnIyCQEMX3ZhbGlkYXRlSW50BAUGYW1vdW50CQBkAgUDZmVlAAEFB01BWF9JTlQCImJ1cm5Ub2tlbnNWMjogZmVlIG1vcmUgdGhhbiBhbW91bnQDCQAAAgUEZXJyMgUEZXJyMgQNJHQwMTgxNjcxODU3MgMJAQIhPQIFCXJlZmVycmVyXwIABAhyZWZlcnJlcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUJcmVmZXJyZXJfBBFyZWZlcnJlckZlZUFtb3VudAkAawMJARdfbG9hZFJlZmVycmVyRmVlUGVyY2VudAIFEWV4ZWN1dGlvbkNoYWluSWRfBQhyZWZlcnJlcgUDZmVlBQ5QRVJDRU5UX0ZBQ1RPUgkAlAoCBRFyZWZlcnJlckZlZUFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhyZWZlcnJlcgURcmVmZXJyZXJGZWVBbW91bnQFB2Fzc2V0SWQFA25pbAkAlAoCAAAFA25pbAQLcmVmZXJyZXJGZWUIBQ0kdDAxODE2NzE4NTcyAl8xBA9yZWZlcnJlckFjdGlvbnMIBQ0kdDAxODE2NzE4NTcyAl8yBAxhbW91bnRUb1NlbmQJAGUCBQZhbW91bnQFA2ZlZQQEZXJyMwkBDF92YWxpZGF0ZUludAQFDGFtb3VudFRvU2VuZAkAZAIFDmdhc2xlc3NSZXdhcmRfAAEFB01BWF9JTlQCJWJ1cm5Ub2tlbnNWMjogcmV3YXJkIG1vcmUgdGhhbiBhbW91bnQDCQAAAgUEZXJyMwUEZXJyMwQJdXBkYXRlRmVlCQBlAgkAZAIJAQhfbG9hZEZlZQEFB2Fzc2V0SWQFA2ZlZQULcmVmZXJyZXJGZWUEEG5vcm1hbGl6ZWRBbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMDBQxhbW91bnRUb1NlbmQFDWFzc2V0RGVjaW1hbHMFCERFQ0lNQUxTBBFub3JtYWxpemVkR2FzbGVzcwkBEl9ub3JtYWxpemVEZWNpbWFscwMFDmdhc2xlc3NSZXdhcmRfBQ1hc3NldERlY2ltYWxzBQhERUNJTUFMUwQKaW52b2NhdGlvbgkA/AcECQEQX2xvYWRSb290QWRhcHRlcgAFE0ZVTkNfUkVMRUFTRV9UT0tFTlMJAMwIAgURZXhlY3V0aW9uQ2hhaW5JZF8JAMwIAgUOZXhlY3V0aW9uQXNzZXQJAMwIAgUQbm9ybWFsaXplZEFtb3VudAkAzAgCBQpyZWNpcGllbnRfCQDMCAIFEW5vcm1hbGl6ZWRHYXNsZXNzBQNuaWwFA25pbAMJAAACBQppbnZvY2F0aW9uBQppbnZvY2F0aW9uCQCUCgIJAM4IAgkAzggCCQEIX3NhdmVGZWUCBQdhc3NldElkBQl1cGRhdGVGZWUFD3JlZmVycmVyQWN0aW9ucwkAzAgCCQEEQnVybgIFB2Fzc2V0SWQFDGFtb3VudFRvU2VuZAUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3RyYW5zZmVyRmVlAhFleGVjdXRpb25DaGFpbklkXwhhc3NldElkXwQDZXJyAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJAQ5fdmFsaWRhdGVBc3NldAIFCGFzc2V0SWRfAhp0cmFuc2ZlckZlZTogaW52YWxpZCBhc3NldAcDCQAAAgUDZXJyBQNlcnIEB2Fzc2V0SWQJANkEAQUIYXNzZXRJZF8EB2JpbmRpbmcJAQxfbG9hZEJpbmRpbmcCBRFleGVjdXRpb25DaGFpbklkXwUHYXNzZXRJZAQNYXNzZXRDb250cmFjdAgFB2JpbmRpbmcCXzEEB2VuYWJsZWQIBQdiaW5kaW5nAl84BARlcnIxAwkBEF92YWxpZGF0ZUFkZHJlc3MCCQClCAEFDWFzc2V0Q29udHJhY3QCHHRyYW5zZmVyRmVlOiBubyBzdWNoIGJpbmRpbmcJAQ1fdmFsaWRhdGVCb29sAwUHZW5hYmxlZAYCHnRyYW5zZmVyRmVlOiB0b2tlbiBpcyBkaXNhYmxlZAcDCQAAAgUEZXJyMQUEZXJyMQkAlAoCCQDOCAIJAQhfc2F2ZUZlZQIFB2Fzc2V0SWQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERX2xvYWRGZWVSZWNpcGllbnQACQEIX2xvYWRGZWUBBQdhc3NldElkBQdhc3NldElkBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEUdXBkYXRlQ2FsbGVyQ29udHJhY3QBD2NhbGxlckNvbnRyYWN0XwQDZXJyAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHAwkAAAIFA2VycgUDZXJyCQCUCgIJARNfc2F2ZUNhbGxlckNvbnRyYWN0AQUPY2FsbGVyQ29udHJhY3RfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFHVwZGF0ZUV4ZWN1dGlvbkNoYWluAhFleGVjdXRpb25DaGFpbklkXwhlbmFibGVkXwQDZXJyAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBDF92YWxpZGF0ZUludAQFEWV4ZWN1dGlvbkNoYWluSWRfAAAFB01BWF9JTlQCLnVwZGF0ZUV4ZWN1dGlvbkNoYWluOiBpbnZhbGlkIGV4ZWN1dGlvbkNoYWluSWQHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQpfc2F2ZUNoYWluAgURZXhlY3V0aW9uQ2hhaW5JZF8FCGVuYWJsZWRfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEnVwZGF0ZUZlZVJlY2lwaWVudAENZmVlUmVjaXBpZW50XwQDZXJyAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBEF92YWxpZGF0ZUFkZHJlc3MCBQ1mZWVSZWNpcGllbnRfAih1cGRhdGVGZWVSZWNpcGllbnQ6IGludmFsaWQgZmVlUmVjaXBpZW50BwMJAAACBQNlcnIFA2VycgkAlAoCCQERX3NhdmVGZWVSZWNpcGllbnQBCQERQGV4dHJOYXRpdmUoMTA2MikBBQ1mZWVSZWNpcGllbnRfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDnVwZGF0ZVJlZmVycmVyAxFleGVjdXRpb25DaGFpbklkXwlyZWZlcnJlcl8EZmVlXwQDZXJyAwMDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQEOX3ZhbGlkYXRlQ2hhaW4CBRFleGVjdXRpb25DaGFpbklkXwIndXBkYXRlUmVmZXJyZXI6IGludmFsaWQgZXhlY3V0aW9uIGNoYWluBwkBEF92YWxpZGF0ZUFkZHJlc3MCBQlyZWZlcnJlcl8CIHVwZGF0ZVJlZmVycmVyOiBpbnZhbGlkIHJlZmVycmVyBwkBDF92YWxpZGF0ZUludAQFBGZlZV8AAAUQTUFYX1JFRkVSUkVSX0ZFRQIbdXBkYXRlUmVmZXJyZXI6IGludmFsaWQgZmVlBwMJAAACBQNlcnIFA2VycgkAlAoCCQEXX3NhdmVSZWZlcnJlckZlZVBlcmNlbnQDBRFleGVjdXRpb25DaGFpbklkXwkBEUBleHRyTmF0aXZlKDEwNjIpAQUJcmVmZXJyZXJfBQRmZWVfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEXVwZGF0ZUJpbmRpbmdJbmZvCRFleGVjdXRpb25DaGFpbklkXw5hc3NldENvbnRyYWN0Xw9leGVjdXRpb25Bc3NldF8KbWluQW1vdW50XwdtaW5GZWVfDXRocmVzaG9sZEZlZV8RYmVmb3JlUGVyY2VudEZlZV8QYWZ0ZXJQZXJjZW50RmVlXwhlbmFibGVkXwQDZXJyAwMDAwMDAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBEF92YWxpZGF0ZUFkZHJlc3MCBQ5hc3NldENvbnRyYWN0XwIpdXBkYXRlQmluZGluZ0luZm86IGludmFsaWQgYXNzZXQgY29udHJhY3QHCQEMX3ZhbGlkYXRlSW50BAURZXhlY3V0aW9uQ2hhaW5JZF8AAAUHTUFYX0lOVAIrdXBkYXRlQmluZGluZ0luZm86IGludmFsaWQgZXhlY3V0aW9uQ2hhaW5JZAcJAQxfdmFsaWRhdGVJbnQEBQptaW5BbW91bnRfAAAFB01BWF9JTlQCJHVwZGF0ZUJpbmRpbmdJbmZvOiBpbnZhbGlkIG1pbkFtb3VudAcJAQxfdmFsaWRhdGVJbnQEBQdtaW5GZWVfAAAFB01BWF9JTlQCIXVwZGF0ZUJpbmRpbmdJbmZvOiBpbnZhbGlkIG1pbkZlZQcJAQxfdmFsaWRhdGVJbnQEBQ10aHJlc2hvbGRGZWVfAAAFB01BWF9JTlQCJ3VwZGF0ZUJpbmRpbmdJbmZvOiBpbnZhbGlkIHRocmVzaG9sZEZlZQcJAQxfdmFsaWRhdGVJbnQEBRFiZWZvcmVQZXJjZW50RmVlXwAABQdNQVhfSU5UAit1cGRhdGVCaW5kaW5nSW5mbzogaW52YWxpZCBiZWZvcmVQZXJjZW50RmVlBwkBDF92YWxpZGF0ZUludAQFEGFmdGVyUGVyY2VudEZlZV8AAAUHTUFYX0lOVAIqdXBkYXRlQmluZGluZ0luZm86IGludmFsaWQgYWZ0ZXJQZXJjZW50RmVlBwMJAAACBQNlcnIFA2VycgQHYXNzZXRJZAkBCF9hc0J5dGVzAQkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQ5hc3NldENvbnRyYWN0XwURRlVOQ19HRVRfQVNTRVRfSUQFA25pbAUDbmlsAwkAAAIFB2Fzc2V0SWQFB2Fzc2V0SWQEB2JpbmRpbmcJAJoKCAkBEUBleHRyTmF0aXZlKDEwNjIpAQUOYXNzZXRDb250cmFjdF8FD2V4ZWN1dGlvbkFzc2V0XwUKbWluQW1vdW50XwUHbWluRmVlXwUNdGhyZXNob2xkRmVlXwURYmVmb3JlUGVyY2VudEZlZV8FEGFmdGVyUGVyY2VudEZlZV8FCGVuYWJsZWRfCQCUCgIJAQxfc2F2ZUJpbmRpbmcDBRFleGVjdXRpb25DaGFpbklkXwUHYXNzZXRJZAUHYmluZGluZwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARlhZGRDcm9zc2NoYWluUG9vbENvbnRyYWN0Ahdjcm9zc2NoYWluUG9vbENvbnRyYWN0XxRicmlkZ2VBc3NldENvbnRyYWN0XwQDZXJyAwMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJARBfdmFsaWRhdGVBZGRyZXNzAgUXY3Jvc3NjaGFpblBvb2xDb250cmFjdF8COWFkZENyb3NzY2hhaW5Qb29sQ29udHJhY3Q6IGludmFsaWQgY3Jvc3NjaGFpblBvb2xDb250cmFjdAcJARBfdmFsaWRhdGVBZGRyZXNzAgUUYnJpZGdlQXNzZXRDb250cmFjdF8CNmFkZENyb3NzY2hhaW5Qb29sQ29udHJhY3Q6IGludmFsaWQgYnJpZGdlQXNzZXRDb250cmFjdAcDCQAAAgUDZXJyBQNlcnIJAJQKAgkAzggCCQEcX3NhdmVDcm9zc2NoYWluUG9vbENvbnRyYWN0cwEJAM0IAgkBHF9sb2FkQ3Jvc3NjaGFpblBvb2xDb250cmFjdHMABRdjcm9zc2NoYWluUG9vbENvbnRyYWN0XwkBGF9zYXZlQnJpZGdlQXNzZXRDb250cmFjdAIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFF2Nyb3NzY2hhaW5Qb29sQ29udHJhY3RfCQERQGV4dHJOYXRpdmUoMTA2MikBBRRicmlkZ2VBc3NldENvbnRyYWN0XwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVwYXVzZQAEA2VycgMDCQELX29ubHlQYXVzZXIBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJAQ5fd2hlbk5vdFBhdXNlZAAHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQpfc2F2ZVBhdXNlAQYFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHdW5wYXVzZQAEA2VycgMDCQELX29ubHlQYXVzZXIBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJAQtfd2hlblBhdXNlZAAHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQpfc2F2ZVBhdXNlAQcFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEMdXBkYXRlUGF1c2VyAQdwYXVzZXJfBANlcnIDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFB3BhdXNlcl8CHHVwZGF0ZVBhdXNlcjogaW52YWxpZCBwYXVzZXIHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQtfc2F2ZVBhdXNlcgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFB3BhdXNlcl8FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELc2V0TXVsdGlzaWcBCW11bHRpc2lnXwQDZXJyAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3ZhbGlkYXRlQWRkcmVzcwIFCW11bHRpc2lnXwIdc2V0TXVsdGlzaWc6IGludmFsaWQgbXVsdGlzaWcHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQ1fc2F2ZU11bHRpc2lnAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUJbXVsdGlzaWdfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQHJG1hdGNoMAkAoggBBQxLRVlfTVVMVElTSUcDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAhtdWx0aXNpZwUHJG1hdGNoMAkBC3ZhbHVlT3JFbHNlAgkAmwgCCQERQGV4dHJOYXRpdmUoMTA2MikBBQhtdWx0aXNpZwkAuQkCCQDMCAIFCktFWV9TVEFUVVMJAMwIAgkApQgBBQR0aGlzCQDMCAIJANgEAQgFAnR4AmlkBQNuaWwFCVNFUEFSQVRPUgcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXmn7lSx", "height": 2938569, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FyTTWwVBCs9ed6APtEgh8XBFKgzFGx1CZcSBh4ZzmWgr Next: 5wB2ihLa3i2UF9VsFNirT5d1RRdC8DzAsNVQWc886JVi Diff:
OldNewDifferences
2929
3030 let KEY_REFERRER_FEE_PERCENT = "REFERRER_FEE_PERCENT"
3131
32+let KEY_CROSSCHAIN_POOL_CONTRACTS = "CROSSCHAIN_POOL_CONTRACTS"
33+
34+let KEY_BRIDGE_ASSET_CONTRACT = "BRIDGE_ASSET_CONTRACT"
35+
36+let FUNC_MINT = "mint"
37+
38+let FUNC_DEPOSIT = "deposit"
39+
3240 let FUNC_RELEASE_TOKENS = "releaseTokens"
41+
42+let FUNC_GET_ASSET_ID = "getAssetId"
43+
44+let FUNC_GET_DECIMALS = "getDecimals"
3345
3446 let WAVES = "WAVES"
3547
223235 func _saveReferrerFeePercent (executionChainId_,referrer_,val_) = [IntegerEntry(makeString([KEY_REFERRER_FEE_PERCENT, toString(executionChainId_), toString(referrer_)], SEPARATOR), val_)]
224236
225237
238+func _loadCrosschainPoolContracts () = match getString(KEY_CROSSCHAIN_POOL_CONTRACTS) {
239+ case a: String =>
240+ if ((size(a) > 0))
241+ then split_51C(a, SEPARATOR)
242+ else nil
243+ case _ =>
244+ nil
245+}
246+
247+
248+func _saveCrosschainPoolContracts (contracts_) = [StringEntry(KEY_CROSSCHAIN_POOL_CONTRACTS, makeString_11C(contracts_, SEPARATOR))]
249+
250+
251+func _loadBridgeAssetContract (crosschainPoolContract_) = match getString(makeString([KEY_BRIDGE_ASSET_CONTRACT, toString(crosschainPoolContract_)], SEPARATOR)) {
252+ case a: String =>
253+ addressFromStringValue(a)
254+ case _ =>
255+ Address(base58'')
256+}
257+
258+
259+func _saveBridgeAssetContract (crosschainPoolContract_,bridgeAssetContract_) = [StringEntry(makeString([KEY_BRIDGE_ASSET_CONTRACT, toString(crosschainPoolContract_)], SEPARATOR), toString(bridgeAssetContract_))]
260+
261+
226262 func _onlyThisContract (caller_) = if ((caller_ != this))
227263 then throw("_onlyThisContract: revert")
228264 else true
335371 else false
336372 if ((err == err))
337373 then {
338- let assetId = _asBytes(invoke(addressFromStringValue(assetContract_), "getAssetId", nil, nil))
374+ let $t01179712086 = if (containsElement(_loadCrosschainPoolContracts(), assetContract_))
375+ then $Tuple2(true, _loadBridgeAssetContract(addressFromStringValue(assetContract_)))
376+ else $Tuple2(false, addressFromStringValue(assetContract_))
377+ let isCrosschainPoolAsset = $t01179712086._1
378+ let bridgeAssetContract = $t01179712086._2
379+ let assetId = _asBytes(invoke(bridgeAssetContract, FUNC_GET_ASSET_ID, nil, nil))
339380 if ((assetId == assetId))
340381 then {
341- let assetDecimals = _asInt(invoke(addressFromStringValue(assetContract_), "getDecimals", nil, nil))
342- if ((assetDecimals == assetDecimals))
382+ let decimals = _asInt(invoke(bridgeAssetContract, FUNC_GET_DECIMALS, nil, nil))
383+ if ((decimals == decimals))
343384 then {
344- let normalizedAmount = _normalizeDecimals(amount, DECIMALS, assetDecimals)
345- let normalizedGasless = _normalizeDecimals(gaslessReward, DECIMALS, assetDecimals)
346- let referrer = match addressFromString(referrer_) {
385+ let normalizedAmount = _normalizeDecimals(amount, DECIMALS, decimals)
386+ let normalizedGasless = _normalizeDecimals(gaslessReward, DECIMALS, decimals)
387+ let $t01242312860 = match addressFromString(referrer_) {
347388 case refererAddress: Address =>
348- let normalizedReferrerFee = _normalizeDecimals(referrerFee, DECIMALS, assetDecimals)
389+ let normalizedReferrerFee = _normalizeDecimals(referrerFee, DECIMALS, decimals)
349390 $Tuple2(normalizedReferrerFee, [ScriptTransfer(refererAddress, normalizedReferrerFee, assetId)])
350391 case _ =>
351392 $Tuple2(0, nil)
352393 }
353- let normalizedReferrerFee = referrer._1
354- let referrerActions = referrer._2
355- let invocation = invoke(addressFromStringValue(assetContract_), "mint", [(normalizedAmount + normalizedReferrerFee), toString(this)], nil)
356- if ((invocation == invocation))
394+ let normalizedReferrerFee = $t01242312860._1
395+ let referrerActions = $t01242312860._2
396+ let mintInvocation = invoke(bridgeAssetContract, FUNC_MINT, [(normalizedAmount + normalizedReferrerFee), toString(this)], nil)
397+ if ((mintInvocation == mintInvocation))
357398 then {
358- let actions = if (if ((normalizedGasless > 0))
399+ let $t01299913337 = if (if ((normalizedGasless > 0))
359400 then (addressFromStringValue(recipient_) != i.originCaller)
360401 else false)
361- then [ScriptTransfer(addressFromStringValue(recipient_), (normalizedAmount - normalizedGasless), assetId), ScriptTransfer(i.originCaller, normalizedGasless, assetId)]
362- else [ScriptTransfer(addressFromStringValue(recipient_), normalizedAmount, assetId)]
363- $Tuple2((actions ++ referrerActions), unit)
402+ then $Tuple2([ScriptTransfer(i.originCaller, normalizedGasless, assetId)], normalizedGasless)
403+ else $Tuple2(nil, 0)
404+ let gaslessActions = $t01299913337._1
405+ let normalizedGaslessUsed = $t01299913337._2
406+ let actions = if (isCrosschainPoolAsset)
407+ then {
408+ let poolAssetId = _asBytes(invoke(addressFromStringValue(assetContract_), FUNC_GET_ASSET_ID, nil, nil))
409+ if ((poolAssetId == poolAssetId))
410+ then {
411+ let balanceBefore = assetBalance(this, poolAssetId)
412+ if ((balanceBefore == balanceBefore))
413+ then {
414+ let depositInvocation = invoke(addressFromStringValue(assetContract_), FUNC_DEPOSIT, [0], [AttachedPayment(assetId, (normalizedAmount - normalizedGaslessUsed))])
415+ if ((depositInvocation == depositInvocation))
416+ then {
417+ let balanceAfter = assetBalance(this, poolAssetId)
418+ if ((balanceAfter == balanceAfter))
419+ then [ScriptTransfer(addressFromStringValue(recipient_), (balanceAfter - balanceBefore), poolAssetId)]
420+ else throw("Strict value is not equal to itself.")
421+ }
422+ else throw("Strict value is not equal to itself.")
423+ }
424+ else throw("Strict value is not equal to itself.")
425+ }
426+ else throw("Strict value is not equal to itself.")
427+ }
428+ else [ScriptTransfer(addressFromStringValue(recipient_), (normalizedAmount - normalizedGaslessUsed), assetId)]
429+ $Tuple2(((actions ++ gaslessActions) ++ referrerActions), unit)
364430 }
365431 else throw("Strict value is not equal to itself.")
366432 }
411477 else false
412478 if ((err1 == err1))
413479 then {
414- let assetDecimals = _asInt(invoke(assetContract, "getDecimals", nil, nil))
480+ let assetDecimals = _asInt(invoke(assetContract, FUNC_GET_DECIMALS, nil, nil))
415481 if ((assetDecimals == assetDecimals))
416482 then {
417483 let percent = if ((amount > thresholdFee))
486552 else false
487553 if ((err1 == err1))
488554 then {
489- let assetDecimals = _asInt(invoke(assetContract, "getDecimals", nil, nil))
555+ let assetDecimals = _asInt(invoke(assetContract, FUNC_GET_DECIMALS, nil, nil))
490556 if ((assetDecimals == assetDecimals))
491557 then {
492558 let percent = if ((amount > thresholdFee))
496562 let err2 = _validateInt(amount, (fee + 1), MAX_INT, "burnTokensV2: fee more than amount")
497563 if ((err2 == err2))
498564 then {
499- let $t01620116606 = if ((referrer_ != ""))
565+ let $t01816718572 = if ((referrer_ != ""))
500566 then {
501567 let referrer = addressFromStringValue(referrer_)
502568 let referrerFeeAmount = fraction(_loadReferrerFeePercent(executionChainId_, referrer), fee, PERCENT_FACTOR)
503569 $Tuple2(referrerFeeAmount, [ScriptTransfer(referrer, referrerFeeAmount, assetId)])
504570 }
505571 else $Tuple2(0, nil)
506- let referrerFee = $t01620116606._1
507- let referrerActions = $t01620116606._2
572+ let referrerFee = $t01816718572._1
573+ let referrerActions = $t01816718572._2
508574 let amountToSend = (amount - fee)
509575 let err3 = _validateInt(amountToSend, (gaslessReward_ + 1), MAX_INT, "burnTokensV2: reward more than amount")
510576 if ((err3 == err3))
634700 else false
635701 if ((err == err))
636702 then {
637- let assetId = _asBytes(invoke(addressFromStringValue(assetContract_), "getAssetId", nil, nil))
703+ let assetId = _asBytes(invoke(addressFromStringValue(assetContract_), FUNC_GET_ASSET_ID, nil, nil))
638704 if ((assetId == assetId))
639705 then {
640706 let binding = $Tuple8(addressFromStringValue(assetContract_), executionAsset_, minAmount_, minFee_, thresholdFee_, beforePercentFee_, afterPercentFee_, enabled_)
642708 }
643709 else throw("Strict value is not equal to itself.")
644710 }
711+ else throw("Strict value is not equal to itself.")
712+ }
713+
714+
715+
716+@Callable(i)
717+func addCrosschainPoolContract (crosschainPoolContract_,bridgeAssetContract_) = {
718+ let err = if (if (if (_onlyThisContract(i.caller))
719+ then _whenInitialized()
720+ else false)
721+ then _validateAddress(crosschainPoolContract_, "addCrosschainPoolContract: invalid crosschainPoolContract")
722+ else false)
723+ then _validateAddress(bridgeAssetContract_, "addCrosschainPoolContract: invalid bridgeAssetContract")
724+ else false
725+ if ((err == err))
726+ then $Tuple2((_saveCrosschainPoolContracts((_loadCrosschainPoolContracts() :+ crosschainPoolContract_)) ++ _saveBridgeAssetContract(addressFromStringValue(crosschainPoolContract_), addressFromStringValue(bridgeAssetContract_))), unit)
645727 else throw("Strict value is not equal to itself.")
646728 }
647729
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
32+let KEY_CROSSCHAIN_POOL_CONTRACTS = "CROSSCHAIN_POOL_CONTRACTS"
33+
34+let KEY_BRIDGE_ASSET_CONTRACT = "BRIDGE_ASSET_CONTRACT"
35+
36+let FUNC_MINT = "mint"
37+
38+let FUNC_DEPOSIT = "deposit"
39+
3240 let FUNC_RELEASE_TOKENS = "releaseTokens"
41+
42+let FUNC_GET_ASSET_ID = "getAssetId"
43+
44+let FUNC_GET_DECIMALS = "getDecimals"
3345
3446 let WAVES = "WAVES"
3547
3648 let WAVES_DECIMALS = 8
3749
3850 let DECIMALS = 6
3951
4052 let PERCENT_FACTOR = 1000000
4153
4254 let MAX_REFERRER_FEE = 200000
4355
4456 let MAX_INT = 9223372036854775807
4557
4658 func _validateAddress (address_,err_) = match addressFromString(address_) {
4759 case a: Address =>
4860 true
4961 case _ =>
5062 throw(err_)
5163 }
5264
5365
5466 func _validateAsset (assetId_,err_) = match assetInfo(fromBase58String(assetId_)) {
5567 case a: Asset =>
5668 true
5769 case _ =>
5870 throw(err_)
5971 }
6072
6173
6274 func _validateInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_))
6375 then true
6476 else (val_ > upperBoundary_))
6577 then throw(err_)
6678 else true
6779
6880
6981 func _validateBool (val_,target_,err_) = if ((val_ != target_))
7082 then throw(err_)
7183 else true
7284
7385
7486 func _validatePaymentsSize (payments_,target_,err_) = if ((size(payments_) != target_))
7587 then throw(err_)
7688 else true
7789
7890
7991 func _validateReferrer (referrer_,err_) = if ((referrer_ != ""))
8092 then _validateAddress(referrer_, err_)
8193 else true
8294
8395
8496 func _normalizeDecimals (amount_,sourceDecimals_,targetDecimals_) = if ((sourceDecimals_ >= targetDecimals_))
8597 then (amount_ / pow(10, 0, (sourceDecimals_ - targetDecimals_), 0, 0, DOWN))
8698 else (amount_ * pow(10, 0, (targetDecimals_ - sourceDecimals_), 0, 0, DOWN))
8799
88100
89101 func _loadInit () = match getBoolean(KEY_INIT) {
90102 case a: Boolean =>
91103 a
92104 case _ =>
93105 false
94106 }
95107
96108
97109 func _saveInit (isInit_) = [BooleanEntry(KEY_INIT, isInit_)]
98110
99111
100112 func _loadPause () = match getBoolean(KEY_PAUSED) {
101113 case a: Boolean =>
102114 a
103115 case _ =>
104116 false
105117 }
106118
107119
108120 func _savePause (isPaused_) = [BooleanEntry(KEY_PAUSED, isPaused_)]
109121
110122
111123 func _loadPauser () = match getString(KEY_PAUSER) {
112124 case a: String =>
113125 addressFromStringValue(a)
114126 case _ =>
115127 Address(base58'')
116128 }
117129
118130
119131 func _savePauser (pauser_) = [StringEntry(KEY_PAUSER, toString(pauser_))]
120132
121133
122134 func _loadMultisig () = match getString(KEY_MULTISIG) {
123135 case a: String =>
124136 addressFromStringValue(a)
125137 case _ =>
126138 Address(base58'')
127139 }
128140
129141
130142 func _saveMultisig (multisig_) = [StringEntry(KEY_MULTISIG, toString(multisig_))]
131143
132144
133145 func _loadExecutor () = match getString(KEY_EXECUTOR) {
134146 case a: String =>
135147 addressFromStringValue(a)
136148 case _ =>
137149 Address(base58'')
138150 }
139151
140152
141153 func _saveExecutor (executor_) = [StringEntry(KEY_EXECUTOR, toString(executor_))]
142154
143155
144156 func _loadCallerContract () = match getString(KEY_CALLER_CONTRACT) {
145157 case a: String =>
146158 a
147159 case _ =>
148160 ""
149161 }
150162
151163
152164 func _saveCallerContract (caller_) = [StringEntry(KEY_CALLER_CONTRACT, caller_)]
153165
154166
155167 func _loadChain (chainId_) = match getBoolean(makeString([KEY_CHAIN, toString(chainId_)], SEPARATOR)) {
156168 case a: Boolean =>
157169 a
158170 case _ =>
159171 false
160172 }
161173
162174
163175 func _saveChain (chainId_,val_) = [BooleanEntry(makeString([KEY_CHAIN, toString(chainId_)], SEPARATOR), val_)]
164176
165177
166178 func _loadBinding (executionChainId_,assetId_) = match getString(makeString([KEY_BINDING, toString(executionChainId_), toBase58String(assetId_)], SEPARATOR)) {
167179 case a: String =>
168180 let struct = split(a, SEPARATOR)
169181 $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"))
170182 then true
171183 else false)
172184 case _ =>
173185 $Tuple8(Address(base58''), "", 0, 0, 0, 0, 0, false)
174186 }
175187
176188
177189 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)
178190 then "1"
179191 else "0"], SEPARATOR))]
180192
181193
182194 func _loadFee (assetId_) = match getInteger(makeString([KEY_FEE, toBase58String(assetId_)], SEPARATOR)) {
183195 case a: Int =>
184196 a
185197 case _ =>
186198 0
187199 }
188200
189201
190202 func _saveFee (assetId_,val_) = [IntegerEntry(makeString([KEY_FEE, toBase58String(assetId_)], SEPARATOR), val_)]
191203
192204
193205 func _loadRootAdapter () = match getString(KEY_ROOT_ADAPTER) {
194206 case a: String =>
195207 addressFromStringValue(a)
196208 case _ =>
197209 Address(base58'')
198210 }
199211
200212
201213 func _saveRootAdapter (adapter_) = [StringEntry(KEY_ROOT_ADAPTER, toString(adapter_))]
202214
203215
204216 func _loadFeeRecipient () = match getString(KEY_FEE_RECIPIENT) {
205217 case a: String =>
206218 addressFromStringValue(a)
207219 case _ =>
208220 Address(base58'')
209221 }
210222
211223
212224 func _saveFeeRecipient (val_) = [StringEntry(KEY_FEE_RECIPIENT, toString(val_))]
213225
214226
215227 func _loadReferrerFeePercent (executionChainId_,referrer_) = match getInteger(makeString([KEY_REFERRER_FEE_PERCENT, toString(executionChainId_), toString(referrer_)], SEPARATOR)) {
216228 case a: Int =>
217229 a
218230 case _ =>
219231 0
220232 }
221233
222234
223235 func _saveReferrerFeePercent (executionChainId_,referrer_,val_) = [IntegerEntry(makeString([KEY_REFERRER_FEE_PERCENT, toString(executionChainId_), toString(referrer_)], SEPARATOR), val_)]
224236
225237
238+func _loadCrosschainPoolContracts () = match getString(KEY_CROSSCHAIN_POOL_CONTRACTS) {
239+ case a: String =>
240+ if ((size(a) > 0))
241+ then split_51C(a, SEPARATOR)
242+ else nil
243+ case _ =>
244+ nil
245+}
246+
247+
248+func _saveCrosschainPoolContracts (contracts_) = [StringEntry(KEY_CROSSCHAIN_POOL_CONTRACTS, makeString_11C(contracts_, SEPARATOR))]
249+
250+
251+func _loadBridgeAssetContract (crosschainPoolContract_) = match getString(makeString([KEY_BRIDGE_ASSET_CONTRACT, toString(crosschainPoolContract_)], SEPARATOR)) {
252+ case a: String =>
253+ addressFromStringValue(a)
254+ case _ =>
255+ Address(base58'')
256+}
257+
258+
259+func _saveBridgeAssetContract (crosschainPoolContract_,bridgeAssetContract_) = [StringEntry(makeString([KEY_BRIDGE_ASSET_CONTRACT, toString(crosschainPoolContract_)], SEPARATOR), toString(bridgeAssetContract_))]
260+
261+
226262 func _onlyThisContract (caller_) = if ((caller_ != this))
227263 then throw("_onlyThisContract: revert")
228264 else true
229265
230266
231267 func _whenMultisigSet () = if ((_loadMultisig() == Address(base58'')))
232268 then throw("_whenMultisigSet: revert")
233269 else true
234270
235271
236272 func _whenNotInitialized () = if (_loadInit())
237273 then throw("_whenNotInitialized: revert")
238274 else true
239275
240276
241277 func _whenInitialized () = if (!(_loadInit()))
242278 then throw("_whenInitialized: revert")
243279 else true
244280
245281
246282 func _whenNotPaused () = if (_loadPause())
247283 then throw("_whenNotPaused: revert")
248284 else true
249285
250286
251287 func _whenPaused () = if (!(_loadPause()))
252288 then throw("_whenPaused: revert")
253289 else true
254290
255291
256292 func _onlyPauser (caller_) = if ((caller_ != _loadPauser()))
257293 then throw("_onlyPauser: revert")
258294 else true
259295
260296
261297 func _asInt (val_) = match val_ {
262298 case a: Int =>
263299 a
264300 case _ =>
265301 throw("_asInt: revert")
266302 }
267303
268304
269305 func _asBytes (val_) = match val_ {
270306 case a: ByteVector =>
271307 a
272308 case _ =>
273309 throw("_asBytes: revert")
274310 }
275311
276312
277313 func _validateExecutor (val_,err_) = if ((val_ != _loadExecutor()))
278314 then throw(err_)
279315 else true
280316
281317
282318 func _validateCaller (val_,err_) = if ((val_ != _loadCallerContract()))
283319 then throw(err_)
284320 else true
285321
286322
287323 func _validateChain (executionChainId_,err_) = if (!(_loadChain(executionChainId_)))
288324 then throw(err_)
289325 else true
290326
291327
292328 @Callable(i)
293329 func init (executor_,adapter_,pauser_,feeRecipient_) = {
294330 let err = if (if (if (if (if (if (_onlyThisContract(i.caller))
295331 then _whenNotInitialized()
296332 else false)
297333 then _whenMultisigSet()
298334 else false)
299335 then _validateAddress(executor_, "init: invalid executor")
300336 else false)
301337 then _validateAddress(adapter_, "init: invalid adapter")
302338 else false)
303339 then _validateAddress(pauser_, "init: invalid pauser")
304340 else false)
305341 then _validateAddress(feeRecipient_, "init: invalid feeRecipient")
306342 else false
307343 if ((err == err))
308344 then $Tuple2(((((_saveInit(true) ++ _saveExecutor(addressFromStringValue(executor_))) ++ _saveRootAdapter(addressFromStringValue(adapter_))) ++ _savePauser(addressFromStringValue(pauser_))) ++ _saveFeeRecipient(addressFromStringValue(feeRecipient_))), unit)
309345 else throw("Strict value is not equal to itself.")
310346 }
311347
312348
313349
314350 @Callable(i)
315351 func mintTokens (callerContract_,assetContract_,amount_,recipient_,gaslessReward_,referrer_,referrerFee_) = {
316352 let amount = valueOrErrorMessage(parseInt(amount_), "mint: amount is not Int")
317353 let gaslessReward = valueOrErrorMessage(parseInt(gaslessReward_), "mint: gaslessReward is not Int")
318354 let referrerFee = valueOrErrorMessage(parseInt(referrerFee_), "mint: referrerFee is not Int")
319355 let err = if (if (if (if (if (if (if (if (_whenInitialized())
320356 then _whenNotPaused()
321357 else false)
322358 then _validateAddress(assetContract_, "mint: invalid asset contract")
323359 else false)
324360 then _validateExecutor(i.caller, "mint: invalid executor")
325361 else false)
326362 then _validateCaller(callerContract_, "mint: invalid caller")
327363 else false)
328364 then _validateAddress(recipient_, "mint: invalid recipient address")
329365 else false)
330366 then _validateInt(amount, 0, MAX_INT, "mint: invalid amount")
331367 else false)
332368 then _validateInt(gaslessReward, 0, MAX_INT, "mint: invalid gaslessReward")
333369 else false)
334370 then _validateInt(referrerFee, 0, MAX_INT, "mint: invalid referrer fee")
335371 else false
336372 if ((err == err))
337373 then {
338- let assetId = _asBytes(invoke(addressFromStringValue(assetContract_), "getAssetId", nil, nil))
374+ let $t01179712086 = if (containsElement(_loadCrosschainPoolContracts(), assetContract_))
375+ then $Tuple2(true, _loadBridgeAssetContract(addressFromStringValue(assetContract_)))
376+ else $Tuple2(false, addressFromStringValue(assetContract_))
377+ let isCrosschainPoolAsset = $t01179712086._1
378+ let bridgeAssetContract = $t01179712086._2
379+ let assetId = _asBytes(invoke(bridgeAssetContract, FUNC_GET_ASSET_ID, nil, nil))
339380 if ((assetId == assetId))
340381 then {
341- let assetDecimals = _asInt(invoke(addressFromStringValue(assetContract_), "getDecimals", nil, nil))
342- if ((assetDecimals == assetDecimals))
382+ let decimals = _asInt(invoke(bridgeAssetContract, FUNC_GET_DECIMALS, nil, nil))
383+ if ((decimals == decimals))
343384 then {
344- let normalizedAmount = _normalizeDecimals(amount, DECIMALS, assetDecimals)
345- let normalizedGasless = _normalizeDecimals(gaslessReward, DECIMALS, assetDecimals)
346- let referrer = match addressFromString(referrer_) {
385+ let normalizedAmount = _normalizeDecimals(amount, DECIMALS, decimals)
386+ let normalizedGasless = _normalizeDecimals(gaslessReward, DECIMALS, decimals)
387+ let $t01242312860 = match addressFromString(referrer_) {
347388 case refererAddress: Address =>
348- let normalizedReferrerFee = _normalizeDecimals(referrerFee, DECIMALS, assetDecimals)
389+ let normalizedReferrerFee = _normalizeDecimals(referrerFee, DECIMALS, decimals)
349390 $Tuple2(normalizedReferrerFee, [ScriptTransfer(refererAddress, normalizedReferrerFee, assetId)])
350391 case _ =>
351392 $Tuple2(0, nil)
352393 }
353- let normalizedReferrerFee = referrer._1
354- let referrerActions = referrer._2
355- let invocation = invoke(addressFromStringValue(assetContract_), "mint", [(normalizedAmount + normalizedReferrerFee), toString(this)], nil)
356- if ((invocation == invocation))
394+ let normalizedReferrerFee = $t01242312860._1
395+ let referrerActions = $t01242312860._2
396+ let mintInvocation = invoke(bridgeAssetContract, FUNC_MINT, [(normalizedAmount + normalizedReferrerFee), toString(this)], nil)
397+ if ((mintInvocation == mintInvocation))
357398 then {
358- let actions = if (if ((normalizedGasless > 0))
399+ let $t01299913337 = if (if ((normalizedGasless > 0))
359400 then (addressFromStringValue(recipient_) != i.originCaller)
360401 else false)
361- then [ScriptTransfer(addressFromStringValue(recipient_), (normalizedAmount - normalizedGasless), assetId), ScriptTransfer(i.originCaller, normalizedGasless, assetId)]
362- else [ScriptTransfer(addressFromStringValue(recipient_), normalizedAmount, assetId)]
363- $Tuple2((actions ++ referrerActions), unit)
402+ then $Tuple2([ScriptTransfer(i.originCaller, normalizedGasless, assetId)], normalizedGasless)
403+ else $Tuple2(nil, 0)
404+ let gaslessActions = $t01299913337._1
405+ let normalizedGaslessUsed = $t01299913337._2
406+ let actions = if (isCrosschainPoolAsset)
407+ then {
408+ let poolAssetId = _asBytes(invoke(addressFromStringValue(assetContract_), FUNC_GET_ASSET_ID, nil, nil))
409+ if ((poolAssetId == poolAssetId))
410+ then {
411+ let balanceBefore = assetBalance(this, poolAssetId)
412+ if ((balanceBefore == balanceBefore))
413+ then {
414+ let depositInvocation = invoke(addressFromStringValue(assetContract_), FUNC_DEPOSIT, [0], [AttachedPayment(assetId, (normalizedAmount - normalizedGaslessUsed))])
415+ if ((depositInvocation == depositInvocation))
416+ then {
417+ let balanceAfter = assetBalance(this, poolAssetId)
418+ if ((balanceAfter == balanceAfter))
419+ then [ScriptTransfer(addressFromStringValue(recipient_), (balanceAfter - balanceBefore), poolAssetId)]
420+ else throw("Strict value is not equal to itself.")
421+ }
422+ else throw("Strict value is not equal to itself.")
423+ }
424+ else throw("Strict value is not equal to itself.")
425+ }
426+ else throw("Strict value is not equal to itself.")
427+ }
428+ else [ScriptTransfer(addressFromStringValue(recipient_), (normalizedAmount - normalizedGaslessUsed), assetId)]
429+ $Tuple2(((actions ++ gaslessActions) ++ referrerActions), unit)
364430 }
365431 else throw("Strict value is not equal to itself.")
366432 }
367433 else throw("Strict value is not equal to itself.")
368434 }
369435 else throw("Strict value is not equal to itself.")
370436 }
371437 else throw("Strict value is not equal to itself.")
372438 }
373439
374440
375441
376442 @Callable(i)
377443 func burnTokens (executionChainId_,recipient_,gaslessReward_) = {
378444 let err = if (if (if (if (if (_whenInitialized())
379445 then _whenNotPaused()
380446 else false)
381447 then _validateChain(executionChainId_, "burnTokens: invalid execution chain")
382448 else false)
383449 then _validatePaymentsSize(i.payments, 1, "burnTokens: no payment")
384450 else false)
385451 then _validateInt(gaslessReward_, 0, MAX_INT, "burnTokens: invalid gaslessReward")
386452 else false)
387453 then _validateInt(i.payments[0].amount, 0, MAX_INT, "burnTokens: invalid payment amount")
388454 else false
389455 if ((err == err))
390456 then {
391457 let amount = i.payments[0].amount
392458 let assetId = match i.payments[0].assetId {
393459 case a: ByteVector =>
394460 a
395461 case _ =>
396462 throw("burnTokens: invalid asset")
397463 }
398464 let binding = _loadBinding(executionChainId_, assetId)
399465 let assetContract = binding._1
400466 let executionAsset = binding._2
401467 let minAmount = binding._3
402468 let minFee = binding._4
403469 let thresholdFee = binding._5
404470 let beforePercentFee = binding._6
405471 let afterPercentFee = binding._7
406472 let enabled = binding._8
407473 let err1 = if (if (_validateAddress(toString(assetContract), "burnTokens: no such binding"))
408474 then _validateInt(amount, minAmount, MAX_INT, "burnTokens: less than min")
409475 else false)
410476 then _validateBool(enabled, true, "burnTokens: token is disabled")
411477 else false
412478 if ((err1 == err1))
413479 then {
414- let assetDecimals = _asInt(invoke(assetContract, "getDecimals", nil, nil))
480+ let assetDecimals = _asInt(invoke(assetContract, FUNC_GET_DECIMALS, nil, nil))
415481 if ((assetDecimals == assetDecimals))
416482 then {
417483 let percent = if ((amount > thresholdFee))
418484 then afterPercentFee
419485 else beforePercentFee
420486 let fee = (minFee + fraction(amount, percent, PERCENT_FACTOR))
421487 let err2 = _validateInt(amount, (fee + 1), MAX_INT, "burnTokens: fee more than amount")
422488 if ((err2 == err2))
423489 then {
424490 let amountToSend = (amount - fee)
425491 let err3 = _validateInt(amountToSend, (gaslessReward_ + 1), MAX_INT, "burnTokens: reward more than amount")
426492 if ((err3 == err3))
427493 then {
428494 let updateFee = (_loadFee(assetId) + fee)
429495 let normalizedAmount = _normalizeDecimals(amountToSend, assetDecimals, DECIMALS)
430496 let normalizedGasless = _normalizeDecimals(gaslessReward_, assetDecimals, DECIMALS)
431497 let invocation = invoke(_loadRootAdapter(), FUNC_RELEASE_TOKENS, [executionChainId_, executionAsset, normalizedAmount, recipient_, normalizedGasless], nil)
432498 if ((invocation == invocation))
433499 then $Tuple2((_saveFee(assetId, updateFee) ++ [Burn(assetId, amountToSend)]), unit)
434500 else throw("Strict value is not equal to itself.")
435501 }
436502 else throw("Strict value is not equal to itself.")
437503 }
438504 else throw("Strict value is not equal to itself.")
439505 }
440506 else throw("Strict value is not equal to itself.")
441507 }
442508 else throw("Strict value is not equal to itself.")
443509 }
444510 else throw("Strict value is not equal to itself.")
445511 }
446512
447513
448514
449515 @Callable(i)
450516 func burnTokensV2 (executionChainId_,recipient_,referrer_,gaslessReward_) = {
451517 let err = if (if (if (if (if (if (_whenInitialized())
452518 then _whenNotPaused()
453519 else false)
454520 then _validateChain(executionChainId_, "burnTokensV2: invalid execution chain")
455521 else false)
456522 then _validatePaymentsSize(i.payments, 1, "burnTokensV2: no payment")
457523 else false)
458524 then _validateInt(gaslessReward_, 0, MAX_INT, "burnTokensV2: invalid gaslessReward")
459525 else false)
460526 then _validateInt(i.payments[0].amount, 0, MAX_INT, "burnTokensV2: invalid payment amount")
461527 else false)
462528 then _validateReferrer(referrer_, "burnTokensV2: invalid referrer")
463529 else false
464530 if ((err == err))
465531 then {
466532 let amount = i.payments[0].amount
467533 let assetId = match i.payments[0].assetId {
468534 case a: ByteVector =>
469535 a
470536 case _ =>
471537 throw("burnTokensV2: invalid asset")
472538 }
473539 let binding = _loadBinding(executionChainId_, assetId)
474540 let assetContract = binding._1
475541 let executionAsset = binding._2
476542 let minAmount = binding._3
477543 let minFee = binding._4
478544 let thresholdFee = binding._5
479545 let beforePercentFee = binding._6
480546 let afterPercentFee = binding._7
481547 let enabled = binding._8
482548 let err1 = if (if (_validateAddress(toString(assetContract), "burnTokensV2: no such binding"))
483549 then _validateInt(amount, minAmount, MAX_INT, "burnTokensV2: less than min")
484550 else false)
485551 then _validateBool(enabled, true, "burnTokensV2: token is disabled")
486552 else false
487553 if ((err1 == err1))
488554 then {
489- let assetDecimals = _asInt(invoke(assetContract, "getDecimals", nil, nil))
555+ let assetDecimals = _asInt(invoke(assetContract, FUNC_GET_DECIMALS, nil, nil))
490556 if ((assetDecimals == assetDecimals))
491557 then {
492558 let percent = if ((amount > thresholdFee))
493559 then afterPercentFee
494560 else beforePercentFee
495561 let fee = (minFee + fraction(amount, percent, PERCENT_FACTOR))
496562 let err2 = _validateInt(amount, (fee + 1), MAX_INT, "burnTokensV2: fee more than amount")
497563 if ((err2 == err2))
498564 then {
499- let $t01620116606 = if ((referrer_ != ""))
565+ let $t01816718572 = if ((referrer_ != ""))
500566 then {
501567 let referrer = addressFromStringValue(referrer_)
502568 let referrerFeeAmount = fraction(_loadReferrerFeePercent(executionChainId_, referrer), fee, PERCENT_FACTOR)
503569 $Tuple2(referrerFeeAmount, [ScriptTransfer(referrer, referrerFeeAmount, assetId)])
504570 }
505571 else $Tuple2(0, nil)
506- let referrerFee = $t01620116606._1
507- let referrerActions = $t01620116606._2
572+ let referrerFee = $t01816718572._1
573+ let referrerActions = $t01816718572._2
508574 let amountToSend = (amount - fee)
509575 let err3 = _validateInt(amountToSend, (gaslessReward_ + 1), MAX_INT, "burnTokensV2: reward more than amount")
510576 if ((err3 == err3))
511577 then {
512578 let updateFee = ((_loadFee(assetId) + fee) - referrerFee)
513579 let normalizedAmount = _normalizeDecimals(amountToSend, assetDecimals, DECIMALS)
514580 let normalizedGasless = _normalizeDecimals(gaslessReward_, assetDecimals, DECIMALS)
515581 let invocation = invoke(_loadRootAdapter(), FUNC_RELEASE_TOKENS, [executionChainId_, executionAsset, normalizedAmount, recipient_, normalizedGasless], nil)
516582 if ((invocation == invocation))
517583 then $Tuple2(((_saveFee(assetId, updateFee) ++ referrerActions) ++ [Burn(assetId, amountToSend)]), unit)
518584 else throw("Strict value is not equal to itself.")
519585 }
520586 else throw("Strict value is not equal to itself.")
521587 }
522588 else throw("Strict value is not equal to itself.")
523589 }
524590 else throw("Strict value is not equal to itself.")
525591 }
526592 else throw("Strict value is not equal to itself.")
527593 }
528594 else throw("Strict value is not equal to itself.")
529595 }
530596
531597
532598
533599 @Callable(i)
534600 func transferFee (executionChainId_,assetId_) = {
535601 let err = if (if (_whenInitialized())
536602 then _whenNotPaused()
537603 else false)
538604 then _validateAsset(assetId_, "transferFee: invalid asset")
539605 else false
540606 if ((err == err))
541607 then {
542608 let assetId = fromBase58String(assetId_)
543609 let binding = _loadBinding(executionChainId_, assetId)
544610 let assetContract = binding._1
545611 let enabled = binding._8
546612 let err1 = if (_validateAddress(toString(assetContract), "transferFee: no such binding"))
547613 then _validateBool(enabled, true, "transferFee: token is disabled")
548614 else false
549615 if ((err1 == err1))
550616 then $Tuple2((_saveFee(assetId, 0) ++ [ScriptTransfer(_loadFeeRecipient(), _loadFee(assetId), assetId)]), unit)
551617 else throw("Strict value is not equal to itself.")
552618 }
553619 else throw("Strict value is not equal to itself.")
554620 }
555621
556622
557623
558624 @Callable(i)
559625 func updateCallerContract (callerContract_) = {
560626 let err = if (_onlyThisContract(i.caller))
561627 then _whenInitialized()
562628 else false
563629 if ((err == err))
564630 then $Tuple2(_saveCallerContract(callerContract_), unit)
565631 else throw("Strict value is not equal to itself.")
566632 }
567633
568634
569635
570636 @Callable(i)
571637 func updateExecutionChain (executionChainId_,enabled_) = {
572638 let err = if (if (_onlyThisContract(i.caller))
573639 then _whenInitialized()
574640 else false)
575641 then _validateInt(executionChainId_, 0, MAX_INT, "updateExecutionChain: invalid executionChainId")
576642 else false
577643 if ((err == err))
578644 then $Tuple2(_saveChain(executionChainId_, enabled_), unit)
579645 else throw("Strict value is not equal to itself.")
580646 }
581647
582648
583649
584650 @Callable(i)
585651 func updateFeeRecipient (feeRecipient_) = {
586652 let err = if (if (_onlyThisContract(i.caller))
587653 then _whenInitialized()
588654 else false)
589655 then _validateAddress(feeRecipient_, "updateFeeRecipient: invalid feeRecipient")
590656 else false
591657 if ((err == err))
592658 then $Tuple2(_saveFeeRecipient(addressFromStringValue(feeRecipient_)), unit)
593659 else throw("Strict value is not equal to itself.")
594660 }
595661
596662
597663
598664 @Callable(i)
599665 func updateReferrer (executionChainId_,referrer_,fee_) = {
600666 let err = if (if (if (if (_onlyThisContract(i.caller))
601667 then _whenInitialized()
602668 else false)
603669 then _validateChain(executionChainId_, "updateReferrer: invalid execution chain")
604670 else false)
605671 then _validateAddress(referrer_, "updateReferrer: invalid referrer")
606672 else false)
607673 then _validateInt(fee_, 0, MAX_REFERRER_FEE, "updateReferrer: invalid fee")
608674 else false
609675 if ((err == err))
610676 then $Tuple2(_saveReferrerFeePercent(executionChainId_, addressFromStringValue(referrer_), fee_), unit)
611677 else throw("Strict value is not equal to itself.")
612678 }
613679
614680
615681
616682 @Callable(i)
617683 func updateBindingInfo (executionChainId_,assetContract_,executionAsset_,minAmount_,minFee_,thresholdFee_,beforePercentFee_,afterPercentFee_,enabled_) = {
618684 let err = if (if (if (if (if (if (if (if (_onlyThisContract(i.caller))
619685 then _whenInitialized()
620686 else false)
621687 then _validateAddress(assetContract_, "updateBindingInfo: invalid asset contract")
622688 else false)
623689 then _validateInt(executionChainId_, 0, MAX_INT, "updateBindingInfo: invalid executionChainId")
624690 else false)
625691 then _validateInt(minAmount_, 0, MAX_INT, "updateBindingInfo: invalid minAmount")
626692 else false)
627693 then _validateInt(minFee_, 0, MAX_INT, "updateBindingInfo: invalid minFee")
628694 else false)
629695 then _validateInt(thresholdFee_, 0, MAX_INT, "updateBindingInfo: invalid thresholdFee")
630696 else false)
631697 then _validateInt(beforePercentFee_, 0, MAX_INT, "updateBindingInfo: invalid beforePercentFee")
632698 else false)
633699 then _validateInt(afterPercentFee_, 0, MAX_INT, "updateBindingInfo: invalid afterPercentFee")
634700 else false
635701 if ((err == err))
636702 then {
637- let assetId = _asBytes(invoke(addressFromStringValue(assetContract_), "getAssetId", nil, nil))
703+ let assetId = _asBytes(invoke(addressFromStringValue(assetContract_), FUNC_GET_ASSET_ID, nil, nil))
638704 if ((assetId == assetId))
639705 then {
640706 let binding = $Tuple8(addressFromStringValue(assetContract_), executionAsset_, minAmount_, minFee_, thresholdFee_, beforePercentFee_, afterPercentFee_, enabled_)
641707 $Tuple2(_saveBinding(executionChainId_, assetId, binding), unit)
642708 }
643709 else throw("Strict value is not equal to itself.")
644710 }
711+ else throw("Strict value is not equal to itself.")
712+ }
713+
714+
715+
716+@Callable(i)
717+func addCrosschainPoolContract (crosschainPoolContract_,bridgeAssetContract_) = {
718+ let err = if (if (if (_onlyThisContract(i.caller))
719+ then _whenInitialized()
720+ else false)
721+ then _validateAddress(crosschainPoolContract_, "addCrosschainPoolContract: invalid crosschainPoolContract")
722+ else false)
723+ then _validateAddress(bridgeAssetContract_, "addCrosschainPoolContract: invalid bridgeAssetContract")
724+ else false
725+ if ((err == err))
726+ then $Tuple2((_saveCrosschainPoolContracts((_loadCrosschainPoolContracts() :+ crosschainPoolContract_)) ++ _saveBridgeAssetContract(addressFromStringValue(crosschainPoolContract_), addressFromStringValue(bridgeAssetContract_))), unit)
645727 else throw("Strict value is not equal to itself.")
646728 }
647729
648730
649731
650732 @Callable(i)
651733 func pause () = {
652734 let err = if (if (_onlyPauser(i.caller))
653735 then _whenInitialized()
654736 else false)
655737 then _whenNotPaused()
656738 else false
657739 if ((err == err))
658740 then $Tuple2(_savePause(true), unit)
659741 else throw("Strict value is not equal to itself.")
660742 }
661743
662744
663745
664746 @Callable(i)
665747 func unpause () = {
666748 let err = if (if (_onlyPauser(i.caller))
667749 then _whenInitialized()
668750 else false)
669751 then _whenPaused()
670752 else false
671753 if ((err == err))
672754 then $Tuple2(_savePause(false), unit)
673755 else throw("Strict value is not equal to itself.")
674756 }
675757
676758
677759
678760 @Callable(i)
679761 func updatePauser (pauser_) = {
680762 let err = if (if (_onlyThisContract(i.caller))
681763 then _whenInitialized()
682764 else false)
683765 then _validateAddress(pauser_, "updatePauser: invalid pauser")
684766 else false
685767 if ((err == err))
686768 then $Tuple2(_savePauser(addressFromStringValue(pauser_)), unit)
687769 else throw("Strict value is not equal to itself.")
688770 }
689771
690772
691773
692774 @Callable(i)
693775 func setMultisig (multisig_) = {
694776 let err = if (_onlyThisContract(i.caller))
695777 then _validateAddress(multisig_, "setMultisig: invalid multisig")
696778 else false
697779 if ((err == err))
698780 then $Tuple2(_saveMultisig(addressFromStringValue(multisig_)), unit)
699781 else throw("Strict value is not equal to itself.")
700782 }
701783
702784
703785 @Verifier(tx)
704786 func verify () = match getString(KEY_MULTISIG) {
705787 case multisig: String =>
706788 valueOrElse(getBoolean(addressFromStringValue(multisig), makeString([KEY_STATUS, toString(this), toBase58String(tx.id)], SEPARATOR)), false)
707789 case _ =>
708790 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
709791 }
710792

github/deemru/w8io/026f985 
70.90 ms