tx · 98g6ysyspvsqMzmxGfteVXitHh5kAscTYcTWWL6mhG6q

3MrtFvvc7QBGaNXke4B8T7brYidircMU8pM:  -0.01400000 Waves

2023.02.22 21:47 [2461242] smart account 3MrtFvvc7QBGaNXke4B8T7brYidircMU8pM > SELF 0.00000000 Waves

{ "type": 13, "id": "98g6ysyspvsqMzmxGfteVXitHh5kAscTYcTWWL6mhG6q", "fee": 1400000, "feeAssetId": null, "timestamp": 1677091544212, "version": 2, "chainId": 84, "sender": "3MrtFvvc7QBGaNXke4B8T7brYidircMU8pM", "senderPublicKey": "A3DknTXNtQRgyx5yLE3L1YUXipPTqbF3qQrCvp8ZbFPq", "proofs": [ "3YN3rDx317uNRyHTHTBJhBRe93Qabj8B2hXQzCyHs5xyV9bgHeRTUn7dBkXT6WK1zmzUuJVtUGwJ4zGxXgTQwhTg" ], "script": "base64:BgJDCAISBAoCCAgSCQoHCAgBCAEIARIHCgUBCAEIARIDCgEIEgMKAQgSBAoCAQQSAwoBCBILCgkBCAgBAQEBAQQSAwoBCDwACVNFUEFSQVRPUgICX18ACEtFWV9JTklUAgRJTklUAAxLRVlfTVVMVElTSUcCCE1VTFRJU0lHAApLRVlfU1RBVFVTAgZTVEFUVVMACktFWV9QQVVTRUQCBlBBVVNFRAAKS0VZX1BBVVNFUgIGUEFVU0VSAAxLRVlfRVhFQ1VUT1ICCEVYRUNVVE9SABBLRVlfUk9PVF9BREFQVEVSAgxST09UX0FEQVBURVIAE0tFWV9DQUxMRVJfQ09OVFJBQ1QCD0NBTExFUl9DT05UUkFDVAAJS0VZX0NIQUlOAgVDSEFJTgALS0VZX0JJTkRJTkcCB0JJTkRJTkcAB0tFWV9GRUUCA0ZFRQARS0VZX0ZFRV9SRUNJUElFTlQCDUZFRV9SRUNJUElFTlQAE0ZVTkNfUkVMRUFTRV9UT0tFTlMCDXJlbGVhc2VUb2tlbnMABVdBVkVTAgVXQVZFUwAOV0FWRVNfREVDSU1BTFMACAAIREVDSU1BTFMABgAOUEVSQ0VOVF9GQUNUT1IAwIQ9AAdNQVhfSU5UAP//////////fwEQX3ZhbGlkYXRlQWRkcmVzcwIIYWRkcmVzc18EZXJyXwQHJG1hdGNoMAkApggBBQhhZGRyZXNzXwMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAFhBQckbWF0Y2gwBgkAAgEFBGVycl8BDl92YWxpZGF0ZUFzc2V0Aghhc3NldElkXwRlcnJfBAckbWF0Y2gwCQDsBwEJANkEAQUIYXNzZXRJZF8DCQABAgUHJG1hdGNoMAIFQXNzZXQEAWEFByRtYXRjaDAGCQACAQUEZXJyXwEMX3ZhbGlkYXRlSW50BAR2YWxfDmxvd2VyQm91bmRhcnlfDnVwcGVyQm91bmRhcnlfBGVycl8DAwkAZgIFDmxvd2VyQm91bmRhcnlfBQR2YWxfBgkAZgIFBHZhbF8FDnVwcGVyQm91bmRhcnlfCQACAQUEZXJyXwYBDV92YWxpZGF0ZUJvb2wDBHZhbF8HdGFyZ2V0XwRlcnJfAwkBAiE9AgUEdmFsXwUHdGFyZ2V0XwkAAgEFBGVycl8GARVfdmFsaWRhdGVQYXltZW50c1NpemUDCXBheW1lbnRzXwd0YXJnZXRfBGVycl8DCQECIT0CCQCQAwEFCXBheW1lbnRzXwUHdGFyZ2V0XwkAAgEFBGVycl8GARVfdmFsaWRhdGVQYXltZW50QXNzZXQDCHBheW1lbnRfBmFzc2V0XwRlcnJfAwkBAiE9AggFCHBheW1lbnRfB2Fzc2V0SWQFBmFzc2V0XwkAAgEFBGVycl8GARJfbm9ybWFsaXplRGVjaW1hbHMDB2Ftb3VudF8Pc291cmNlRGVjaW1hbHNfD3RhcmdldERlY2ltYWxzXwMJAGcCBQ9zb3VyY2VEZWNpbWFsc18FD3RhcmdldERlY2ltYWxzXwkAaQIFB2Ftb3VudF8JAGwGAAoAAAkAZQIFD3NvdXJjZURlY2ltYWxzXwUPdGFyZ2V0RGVjaW1hbHNfAAAAAAUERE9XTgkAaAIFB2Ftb3VudF8JAGwGAAoAAAkAZQIFD3RhcmdldERlY2ltYWxzXwUPc291cmNlRGVjaW1hbHNfAAAAAAUERE9XTgEJX2xvYWRJbml0AAQHJG1hdGNoMAkAoAgBBQhLRVlfSU5JVAMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFhBQckbWF0Y2gwBQFhBwEJX3NhdmVJbml0AQdpc0luaXRfCQDMCAIJAQxCb29sZWFuRW50cnkCBQhLRVlfSU5JVAUHaXNJbml0XwUDbmlsAQpfbG9hZFBhdXNlAAQHJG1hdGNoMAkAoAgBBQpLRVlfUEFVU0VEAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWEFByRtYXRjaDAFAWEHAQpfc2F2ZVBhdXNlAQlpc1BhdXNlZF8JAMwIAgkBDEJvb2xlYW5FbnRyeQIFCktFWV9QQVVTRUQFCWlzUGF1c2VkXwUDbmlsAQtfbG9hZFBhdXNlcgAEByRtYXRjaDAJAKIIAQUKS0VZX1BBVVNFUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAAQtfc2F2ZVBhdXNlcgEHcGF1c2VyXwkAzAgCCQELU3RyaW5nRW50cnkCBQpLRVlfUEFVU0VSCQClCAEFB3BhdXNlcl8FA25pbAENX2xvYWRNdWx0aXNpZwAEByRtYXRjaDAJAKIIAQUMS0VZX01VTFRJU0lHAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkBB0FkZHJlc3MBAQABDV9zYXZlTXVsdGlzaWcBCW11bHRpc2lnXwkAzAgCCQELU3RyaW5nRW50cnkCBQxLRVlfTVVMVElTSUcJAKUIAQUJbXVsdGlzaWdfBQNuaWwBDV9sb2FkRXhlY3V0b3IABAckbWF0Y2gwCQCiCAEFDEtFWV9FWEVDVVRPUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAAQ1fc2F2ZUV4ZWN1dG9yAQlleGVjdXRvcl8JAMwIAgkBC1N0cmluZ0VudHJ5AgUMS0VZX0VYRUNVVE9SCQClCAEFCWV4ZWN1dG9yXwUDbmlsARNfbG9hZENhbGxlckNvbnRyYWN0AAQHJG1hdGNoMAkAoggBBRNLRVlfQ0FMTEVSX0NPTlRSQUNUAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAUBYQIAARNfc2F2ZUNhbGxlckNvbnRyYWN0AQdjYWxsZXJfCQDMCAIJAQtTdHJpbmdFbnRyeQIFE0tFWV9DQUxMRVJfQ09OVFJBQ1QFB2NhbGxlcl8FA25pbAEKX2xvYWRDaGFpbgEIY2hhaW5JZF8EByRtYXRjaDAJAKAIAQkAuQkCCQDMCAIFCUtFWV9DSEFJTgkAzAgCCQCkAwEFCGNoYWluSWRfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFhBQckbWF0Y2gwBQFhBwEKX3NhdmVDaGFpbgIIY2hhaW5JZF8EdmFsXwkAzAgCCQEMQm9vbGVhbkVudHJ5AgkAuQkCCQDMCAIFCUtFWV9DSEFJTgkAzAgCCQCkAwEFCGNoYWluSWRfBQNuaWwFCVNFUEFSQVRPUgUEdmFsXwUDbmlsAQxfbG9hZEJpbmRpbmcCEWV4ZWN1dGlvbkNoYWluSWRfCGFzc2V0SWRfBAckbWF0Y2gwCQCiCAEJALkJAgkAzAgCBQtLRVlfQklORElORwkAzAgCCQCkAwEFEWV4ZWN1dGlvbkNoYWluSWRfCQDMCAIJANgEAQUIYXNzZXRJZF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAQGc3RydWN0CQC1CQIFAWEFCVNFUEFSQVRPUgkAmQoHCQCRAwIFBnN0cnVjdAAACQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QAAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAADCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QABQMJAAACCQCRAwIFBnN0cnVjdAAGAgExBgcJAJkKBwIAAAAAAAAAAAAAAAcBDF9zYXZlQmluZGluZwMRZXhlY3V0aW9uQ2hhaW5JZF8IYXNzZXRJZF8IYmluZGluZ18JAMwIAgkBC1N0cmluZ0VudHJ5AgkAuQkCCQDMCAIFC0tFWV9CSU5ESU5HCQDMCAIJAKQDAQURZXhlY3V0aW9uQ2hhaW5JZF8JAMwIAgkA2AQBBQhhc3NldElkXwUDbmlsBQlTRVBBUkFUT1IJALkJAgkAzAgCCAUIYmluZGluZ18CXzEJAMwIAgkApAMBCAUIYmluZGluZ18CXzIJAMwIAgkApAMBCAUIYmluZGluZ18CXzMJAMwIAgkApAMBCAUIYmluZGluZ18CXzQJAMwIAgkApAMBCAUIYmluZGluZ18CXzUJAMwIAgkApAMBCAUIYmluZGluZ18CXzYJAMwIAgMIBQhiaW5kaW5nXwJfNwIBMQIBMAUDbmlsBQlTRVBBUkFUT1IFA25pbAEIX2xvYWRGZWUBCGFzc2V0SWRfBAckbWF0Y2gwCQCfCAEJALkJAgkAzAgCBQdLRVlfRkVFCQDMCAIJANgEAQUIYXNzZXRJZF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAAQhfc2F2ZUZlZQIIYXNzZXRJZF8EdmFsXwkAzAgCCQEMSW50ZWdlckVudHJ5AgkAuQkCCQDMCAIFB0tFWV9GRUUJAMwIAgkA2AQBBQhhc3NldElkXwUDbmlsBQlTRVBBUkFUT1IFBHZhbF8FA25pbAEQX2xvYWRSb290QWRhcHRlcgAEByRtYXRjaDAJAKIIAQUQS0VZX1JPT1RfQURBUFRFUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAARBfc2F2ZVJvb3RBZGFwdGVyAQhhZGFwdGVyXwkAzAgCCQELU3RyaW5nRW50cnkCBRBLRVlfUk9PVF9BREFQVEVSCQClCAEFCGFkYXB0ZXJfBQNuaWwBEV9sb2FkRmVlUmVjaXBpZW50AAQHJG1hdGNoMAkAoggBBRFLRVlfRkVFX1JFQ0lQSUVOVAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAARFfc2F2ZUZlZVJlY2lwaWVudAEEdmFsXwkAzAgCCQELU3RyaW5nRW50cnkCBRFLRVlfRkVFX1JFQ0lQSUVOVAkApQgBBQR2YWxfBQNuaWwBEV9vbmx5VGhpc0NvbnRyYWN0AQdjYWxsZXJfAwkBAiE9AgUHY2FsbGVyXwUEdGhpcwkAAgECGV9vbmx5VGhpc0NvbnRyYWN0OiByZXZlcnQGARBfd2hlbk11bHRpc2lnU2V0AAMJAAACCQENX2xvYWRNdWx0aXNpZwAJAQdBZGRyZXNzAQEACQACAQIYX3doZW5NdWx0aXNpZ1NldDogcmV2ZXJ0BgETX3doZW5Ob3RJbml0aWFsaXplZAADCQEJX2xvYWRJbml0AAkAAgECG193aGVuTm90SW5pdGlhbGl6ZWQ6IHJldmVydAYBEF93aGVuSW5pdGlhbGl6ZWQAAwkBASEBCQEJX2xvYWRJbml0AAkAAgECGF93aGVuSW5pdGlhbGl6ZWQ6IHJldmVydAYBDl93aGVuTm90UGF1c2VkAAMJAQpfbG9hZFBhdXNlAAkAAgECFl93aGVuTm90UGF1c2VkOiByZXZlcnQGAQtfd2hlblBhdXNlZAADCQEBIQEJAQpfbG9hZFBhdXNlAAkAAgECE193aGVuUGF1c2VkOiByZXZlcnQGAQtfb25seVBhdXNlcgEHY2FsbGVyXwMJAQIhPQIFB2NhbGxlcl8JAQtfbG9hZFBhdXNlcgAJAAIBAhNfb25seVBhdXNlcjogcmV2ZXJ0BgEGX2FzSW50AQR2YWxfBAckbWF0Y2gwBQR2YWxfAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQkAAgECDl9hc0ludDogcmV2ZXJ0AQhfYXNCeXRlcwEEdmFsXwQHJG1hdGNoMAUEdmFsXwMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFhBQckbWF0Y2gwBQFhCQACAQIQX2FzQnl0ZXM6IHJldmVydAERX3ZhbGlkYXRlRXhlY3V0b3ICBHZhbF8EZXJyXwMJAQIhPQIFBHZhbF8JAQ1fbG9hZEV4ZWN1dG9yAAkAAgEFBGVycl8GAQ9fdmFsaWRhdGVDYWxsZXICBHZhbF8EZXJyXwMJAQIhPQIFBHZhbF8JARNfbG9hZENhbGxlckNvbnRyYWN0AAkAAgEFBGVycl8GAQ5fdmFsaWRhdGVDaGFpbgIRZXhlY3V0aW9uQ2hhaW5JZF8EZXJyXwMJAQEhAQkBCl9sb2FkQ2hhaW4BBRFleGVjdXRpb25DaGFpbklkXwkAAgEFBGVycl8GCQFpAQRpbml0AglleGVjdXRvcl8IYWRhcHRlcl8EA2VycgMDAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBE193aGVuTm90SW5pdGlhbGl6ZWQABwkBEF93aGVuTXVsdGlzaWdTZXQABwkBEF92YWxpZGF0ZUFkZHJlc3MCBQlleGVjdXRvcl8CFmluaXQ6IGludmFsaWQgZXhlY3V0b3IHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFCGFkYXB0ZXJfAhVpbml0OiBpbnZhbGlkIGFkYXB0ZXIHAwkAAAIFA2VycgUDZXJyCQCUCgIJAM4IAgkAzggCCQEJX3NhdmVJbml0AQYJAQ1fc2F2ZUV4ZWN1dG9yAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUJZXhlY3V0b3JfCQEQX3NhdmVSb290QWRhcHRlcgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCGFkYXB0ZXJfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCm1pbnRUb2tlbnMHD2NhbGxlckNvbnRyYWN0Xw5hc3NldENvbnRyYWN0XwdhbW91bnRfCnJlY2lwaWVudF8OZ2FzbGVzc1Jld2FyZF8JcmVmZXJyZXJfDHJlZmVycmVyRmVlXwQDZXJyAwMDAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBEF92YWxpZGF0ZUFkZHJlc3MCBQ5hc3NldENvbnRyYWN0XwIcbWludDogaW52YWxpZCBhc3NldCBjb250cmFjdAcJARFfdmFsaWRhdGVFeGVjdXRvcgIIBQFpBmNhbGxlcgIWbWludDogaW52YWxpZCBleGVjdXRvcgcJAQ9fdmFsaWRhdGVDYWxsZXICBQ9jYWxsZXJDb250cmFjdF8CFG1pbnQ6IGludmFsaWQgY2FsbGVyBwkBEF92YWxpZGF0ZUFkZHJlc3MCBQpyZWNpcGllbnRfAh9taW50OiBpbnZhbGlkIHJlY2lwaWVudCBhZGRyZXNzBwkBDF92YWxpZGF0ZUludAQFB2Ftb3VudF8AAAUHTUFYX0lOVAIUbWludDogaW52YWxpZCBhbW91bnQHCQEMX3ZhbGlkYXRlSW50BAUOZ2FzbGVzc1Jld2FyZF8AAAUHTUFYX0lOVAIbbWludDogaW52YWxpZCBnYXNsZXNzUmV3YXJkBwMJAAACBQNlcnIFA2VycgQHYXNzZXRJZAkBCF9hc0J5dGVzAQkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQ5hc3NldENvbnRyYWN0XwIKZ2V0QXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUHYXNzZXRJZAUHYXNzZXRJZAQNYXNzZXREZWNpbWFscwkBBl9hc0ludAEJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUOYXNzZXRDb250cmFjdF8CC2dldERlY2ltYWxzBQNuaWwFA25pbAMJAAACBQ1hc3NldERlY2ltYWxzBQ1hc3NldERlY2ltYWxzBBBub3JtYWxpemVkQW1vdW50CQESX25vcm1hbGl6ZURlY2ltYWxzAwUHYW1vdW50XwUIREVDSU1BTFMFDWFzc2V0RGVjaW1hbHMEEW5vcm1hbGl6ZWRHYXNsZXNzCQESX25vcm1hbGl6ZURlY2ltYWxzAwUOZ2FzbGVzc1Jld2FyZF8FCERFQ0lNQUxTBQ1hc3NldERlY2ltYWxzBAhyZWZlcnJlcgMJAGYCCQCxAgEFCXJlZmVycmVyXwAABARlcnIxAwkBEF92YWxpZGF0ZUFkZHJlc3MCBQlyZWZlcnJlcl8CHm1pbnQ6IGludmFsaWQgcmVmZXJyZXIgYWRkcmVzcwkBDF92YWxpZGF0ZUludAQFDHJlZmVycmVyRmVlXwAABQdNQVhfSU5UAhptaW50OiBpbnZhbGlkIHJlZmVycmVyIGZlZQcDCQAAAgUEZXJyMQUEZXJyMQQVbm9ybWFsaXplZFJlZmVycmVyRmVlCQESX25vcm1hbGl6ZURlY2ltYWxzAwUMcmVmZXJyZXJGZWVfBQhERUNJTUFMUwUNYXNzZXREZWNpbWFscwkAlAoCBRVub3JtYWxpemVkUmVmZXJyZXJGZWUJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUJcmVmZXJyZXJfBRVub3JtYWxpemVkUmVmZXJyZXJGZWUFB2Fzc2V0SWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAlAoCAAAFA25pbAQLcmVmZXJyZXJGZWUIBQhyZWZlcnJlcgJfMQQPcmVmZXJyZXJBY3Rpb25zCAUIcmVmZXJyZXICXzIECmludm9jYXRpb24JAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUOYXNzZXRDb250cmFjdF8CBG1pbnQJAMwIAgkAZAIFEG5vcm1hbGl6ZWRBbW91bnQFC3JlZmVycmVyRmVlCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQAAAgUKaW52b2NhdGlvbgUKaW52b2NhdGlvbgQHYWN0aW9ucwMDCQBmAgURbm9ybWFsaXplZEdhc2xlc3MAAAkBAiE9AgkBEUBleHRyTmF0aXZlKDEwNjIpAQUKcmVjaXBpZW50XwgFAWkMb3JpZ2luQ2FsbGVyBwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQpyZWNpcGllbnRfCQBlAgUQbm9ybWFsaXplZEFtb3VudAURbm9ybWFsaXplZEdhc2xlc3MFB2Fzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkMb3JpZ2luQ2FsbGVyBRFub3JtYWxpemVkR2FzbGVzcwUHYXNzZXRJZAUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCnJlY2lwaWVudF8FEG5vcm1hbGl6ZWRBbW91bnQFB2Fzc2V0SWQFA25pbAkAlAoCCQDOCAIFB2FjdGlvbnMFD3JlZmVycmVyQWN0aW9ucwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpidXJuVG9rZW5zBRFleGVjdXRpb25DaGFpbklkXw5hc3NldENvbnRyYWN0XwdhbW91bnRfCnJlY2lwaWVudF8OZ2FzbGVzc1Jld2FyZF8EA2VycgMDAwMDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFDmFzc2V0Q29udHJhY3RfAhxidXJuOiBpbnZhbGlkIGFzc2V0IGNvbnRyYWN0BwkBDl92YWxpZGF0ZUNoYWluAgURZXhlY3V0aW9uQ2hhaW5JZF8CHWJ1cm46IGludmFsaWQgZXhlY3V0aW9uIGNoYWluBwkBFV92YWxpZGF0ZVBheW1lbnRzU2l6ZQMIBQFpCHBheW1lbnRzAAECEGJ1cm46IG5vIHBheW1lbnQHCQEMX3ZhbGlkYXRlSW50BAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFB2Ftb3VudF8FB01BWF9JTlQCHGJ1cm46IGludmFsaWQgcGF5bWVudCBhbW91bnQHAwkAAAIFA2VycgUDZXJyBAdhc3NldElkCQEIX2FzQnl0ZXMBCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDmFzc2V0Q29udHJhY3RfAgpnZXRBc3NldElkBQNuaWwFA25pbAMJAAACBQdhc3NldElkBQdhc3NldElkBA1hc3NldERlY2ltYWxzCQEGX2FzSW50AQkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQ5hc3NldENvbnRyYWN0XwILZ2V0RGVjaW1hbHMFA25pbAUDbmlsAwkAAAIFDWFzc2V0RGVjaW1hbHMFDWFzc2V0RGVjaW1hbHMEB2JpbmRpbmcJAQxfbG9hZEJpbmRpbmcCBRFleGVjdXRpb25DaGFpbklkXwUHYXNzZXRJZAQOZXhlY3V0aW9uQXNzZXQIBQdiaW5kaW5nAl8xBAltaW5BbW91bnQIBQdiaW5kaW5nAl8yBAZtaW5GZWUIBQdiaW5kaW5nAl8zBAx0aHJlc2hvbGRGZWUIBQdiaW5kaW5nAl80BBBiZWZvcmVQZXJjZW50RmVlCAUHYmluZGluZwJfNQQPYWZ0ZXJQZXJjZW50RmVlCAUHYmluZGluZwJfNgQHZW5hYmxlZAgFB2JpbmRpbmcCXzcEBGVycjEDAwkBFV92YWxpZGF0ZVBheW1lbnRBc3NldAMJAJEDAggFAWkIcGF5bWVudHMAAAUHYXNzZXRJZAIbYnVybjogaW52YWxpZCBwYXltZW50IGFzc2V0CQEMX3ZhbGlkYXRlSW50BAUHYW1vdW50XwUJbWluQW1vdW50BQdNQVhfSU5UAhNidXJuOiBsZXNzIHRoYW4gbWluBwkBDV92YWxpZGF0ZUJvb2wDBQdlbmFibGVkBgIXYnVybjogdG9rZW4gaXMgZGlzYWJsZWQHAwkAAAIFBGVycjEFBGVycjEEB3BlcmNlbnQDCQBmAgUHYW1vdW50XwUMdGhyZXNob2xkRmVlBQ9hZnRlclBlcmNlbnRGZWUFEGJlZm9yZVBlcmNlbnRGZWUEA2ZlZQkAZAIFBm1pbkZlZQkAaQIJAGgCBQdhbW91bnRfBQdwZXJjZW50BQ5QRVJDRU5UX0ZBQ1RPUgQEZXJyMgkBDF92YWxpZGF0ZUludAQFB2Ftb3VudF8JAGQCBQNmZWUAAQUHTUFYX0lOVAIaYnVybjogZmVlIG1vcmUgdGhhbiBhbW91bnQDCQAAAgUEZXJyMgUEZXJyMgQMYW1vdW50VG9TZW5kCQBlAgUHYW1vdW50XwUDZmVlBARlcnIzCQEMX3ZhbGlkYXRlSW50BAUMYW1vdW50VG9TZW5kCQBkAgUOZ2FzbGVzc1Jld2FyZF8AAQUHTUFYX0lOVAIdYnVybjogcmV3YXJkIG1vcmUgdGhhbiBhbW91bnQDCQAAAgUEZXJyMwUEZXJyMwQJdXBkYXRlRmVlCQBkAgkBCF9sb2FkRmVlAQUHYXNzZXRJZAUDZmVlBBBub3JtYWxpemVkQW1vdW50CQESX25vcm1hbGl6ZURlY2ltYWxzAwUMYW1vdW50VG9TZW5kBQ1hc3NldERlY2ltYWxzBQhERUNJTUFMUwQRbm9ybWFsaXplZEdhc2xlc3MJARJfbm9ybWFsaXplRGVjaW1hbHMDBQ5nYXNsZXNzUmV3YXJkXwUNYXNzZXREZWNpbWFscwUIREVDSU1BTFMECmludm9jYXRpb24JAPwHBAkBEF9sb2FkUm9vdEFkYXB0ZXIABRNGVU5DX1JFTEVBU0VfVE9LRU5TCQDMCAIFEWV4ZWN1dGlvbkNoYWluSWRfCQDMCAIFDmV4ZWN1dGlvbkFzc2V0CQDMCAIFEG5vcm1hbGl6ZWRBbW91bnQJAMwIAgUKcmVjaXBpZW50XwkAzAgCBRFub3JtYWxpemVkR2FzbGVzcwUDbmlsBQNuaWwDCQAAAgUKaW52b2NhdGlvbgUKaW52b2NhdGlvbgkAlAoCCQDOCAIJAQhfc2F2ZUZlZQIFB2Fzc2V0SWQFCXVwZGF0ZUZlZQkAzAgCCQEEQnVybgIFB2Fzc2V0SWQFDGFtb3VudFRvU2VuZAUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3RyYW5zZmVyRmVlAQ5hc3NldENvbnRyYWN0XwQDZXJyAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJARBfdmFsaWRhdGVBZGRyZXNzAgUOYXNzZXRDb250cmFjdF8CH2J1cm5GZWU6IGludmFsaWQgYXNzZXQgY29udHJhY3QHAwkAAAIFA2VycgUDZXJyBAdhc3NldElkCQEIX2FzQnl0ZXMBCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDmFzc2V0Q29udHJhY3RfAgpnZXRBc3NldElkBQNuaWwFA25pbAMJAAACBQdhc3NldElkBQdhc3NldElkCQCUCgIJAM4IAgkBCF9zYXZlRmVlAgUHYXNzZXRJZAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFfbG9hZEZlZVJlY2lwaWVudAAJAQhfbG9hZEZlZQEFB2Fzc2V0SWQFB2Fzc2V0SWQFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARR1cGRhdGVDYWxsZXJDb250cmFjdAEPY2FsbGVyQ29udHJhY3RfBANlcnIDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBE19zYXZlQ2FsbGVyQ29udHJhY3QBBQ9jYWxsZXJDb250cmFjdF8FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEUdXBkYXRlRXhlY3V0aW9uQ2hhaW4CEWV4ZWN1dGlvbkNoYWluSWRfCGVuYWJsZWRfBANlcnIDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQEMX3ZhbGlkYXRlSW50BAURZXhlY3V0aW9uQ2hhaW5JZF8AAAUHTUFYX0lOVAIudXBkYXRlRXhlY3V0aW9uQ2hhaW46IGludmFsaWQgZXhlY3V0aW9uQ2hhaW5JZAcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBCl9zYXZlQ2hhaW4CBRFleGVjdXRpb25DaGFpbklkXwUIZW5hYmxlZF8FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQESdXBkYXRlRmVlUmVjaXBpZW50AQ1mZWVSZWNpcGllbnRfBANlcnIDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFDWZlZVJlY2lwaWVudF8CKHVwZGF0ZUZlZVJlY2lwaWVudDogaW52YWxpZCBmZWVSZWNpcGllbnQHAwkAAAIFA2VycgUDZXJyCQCUCgIJARFfc2F2ZUZlZVJlY2lwaWVudAEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDWZlZVJlY2lwaWVudF8FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERdXBkYXRlQmluZGluZ0luZm8JEWV4ZWN1dGlvbkNoYWluSWRfDmFzc2V0Q29udHJhY3RfD2V4ZWN1dGlvbkFzc2V0XwptaW5BbW91bnRfB21pbkZlZV8NdGhyZXNob2xkRmVlXxFiZWZvcmVQZXJjZW50RmVlXxBhZnRlclBlcmNlbnRGZWVfCGVuYWJsZWRfBANlcnIDAwMDAwMDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFDmFzc2V0Q29udHJhY3RfAil1cGRhdGVCaW5kaW5nSW5mbzogaW52YWxpZCBhc3NldCBjb250cmFjdAcJAQxfdmFsaWRhdGVJbnQEBRFleGVjdXRpb25DaGFpbklkXwAABQdNQVhfSU5UAit1cGRhdGVCaW5kaW5nSW5mbzogaW52YWxpZCBleGVjdXRpb25DaGFpbklkBwkBDF92YWxpZGF0ZUludAQFCm1pbkFtb3VudF8AAAUHTUFYX0lOVAIkdXBkYXRlQmluZGluZ0luZm86IGludmFsaWQgbWluQW1vdW50BwkBDF92YWxpZGF0ZUludAQFB21pbkZlZV8AAAUHTUFYX0lOVAIhdXBkYXRlQmluZGluZ0luZm86IGludmFsaWQgbWluRmVlBwkBDF92YWxpZGF0ZUludAQFDXRocmVzaG9sZEZlZV8AAAUHTUFYX0lOVAIndXBkYXRlQmluZGluZ0luZm86IGludmFsaWQgdGhyZXNob2xkRmVlBwkBDF92YWxpZGF0ZUludAQFEWJlZm9yZVBlcmNlbnRGZWVfAAAFB01BWF9JTlQCK3VwZGF0ZUJpbmRpbmdJbmZvOiBpbnZhbGlkIGJlZm9yZVBlcmNlbnRGZWUHCQEMX3ZhbGlkYXRlSW50BAUQYWZ0ZXJQZXJjZW50RmVlXwAABQdNQVhfSU5UAip1cGRhdGVCaW5kaW5nSW5mbzogaW52YWxpZCBhZnRlclBlcmNlbnRGZWUHAwkAAAIFA2VycgUDZXJyBAdhc3NldElkCQEIX2FzQnl0ZXMBCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDmFzc2V0Q29udHJhY3RfAgpnZXRBc3NldElkBQNuaWwFA25pbAMJAAACBQdhc3NldElkBQdhc3NldElkBAdiaW5kaW5nCQCZCgcFD2V4ZWN1dGlvbkFzc2V0XwUKbWluQW1vdW50XwUHbWluRmVlXwUNdGhyZXNob2xkRmVlXwURYmVmb3JlUGVyY2VudEZlZV8FEGFmdGVyUGVyY2VudEZlZV8FCGVuYWJsZWRfCQCUCgIJAQxfc2F2ZUJpbmRpbmcDBRFleGVjdXRpb25DaGFpbklkXwUHYXNzZXRJZAUHYmluZGluZwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtzZXRNdWx0aXNpZwEJbXVsdGlzaWdfBANlcnIDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfdmFsaWRhdGVBZGRyZXNzAgUJbXVsdGlzaWdfAh1zZXRNdWx0aXNpZzogaW52YWxpZCBtdWx0aXNpZwcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBDV9zYXZlTXVsdGlzaWcBCQERQGV4dHJOYXRpdmUoMTA2MikBBQltdWx0aXNpZ18FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABAckbWF0Y2gwCQCiCAEFDEtFWV9NVUxUSVNJRwMJAAECBQckbWF0Y2gwAgZTdHJpbmcECG11bHRpc2lnBQckbWF0Y2gwCQELdmFsdWVPckVsc2UCCQCbCAIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCG11bHRpc2lnCQC5CQIJAMwIAgUKS0VZX1NUQVRVUwkAzAgCCQClCAEFBHRoaXMJAMwIAgkA2AQBCAUCdHgCaWQFA25pbAUJU0VQQVJBVE9SBwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQeokZY=", "height": 2461242, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8Cc7s47hmEqPnxKgmbAAdKHLX9P46WXccqyYmJ5qKme9 Next: FsdhTvBcNQP2rmCVB1YZBh73ndKK1yJ3aB5YUg3L9ZLR Diff:
OldNewDifferences
2525
2626 let KEY_FEE = "FEE"
2727
28-let KEY_FEE_CHAIN_ID = "FEE_CHAIN_ID"
29-
3028 let KEY_FEE_RECIPIENT = "FEE_RECIPIENT"
3129
32-let FUNC_TAKE_TOKENS = "takeTokens"
30+let FUNC_RELEASE_TOKENS = "releaseTokens"
3331
3432 let WAVES = "WAVES"
3533
164162 func _loadBinding (executionChainId_,assetId_) = match getString(makeString([KEY_BINDING, toString(executionChainId_), toBase58String(assetId_)], SEPARATOR)) {
165163 case a: String =>
166164 let struct = split(a, SEPARATOR)
167- $Tuple6(parseIntValue(struct[0]), parseIntValue(struct[1]), parseIntValue(struct[2]), parseIntValue(struct[3]), parseIntValue(struct[4]), if ((struct[5] == "1"))
165+ $Tuple7(struct[0], parseIntValue(struct[1]), parseIntValue(struct[2]), parseIntValue(struct[3]), parseIntValue(struct[4]), parseIntValue(struct[5]), if ((struct[6] == "1"))
168166 then true
169167 else false)
170168 case _ =>
171- $Tuple6(0, 0, 0, 0, 0, false)
169+ $Tuple7("", 0, 0, 0, 0, 0, false)
172170 }
173171
174172
175-func _saveBinding (executionChainId_,assetId_,binding_) = [StringEntry(makeString([KEY_BINDING, toString(executionChainId_), toBase58String(assetId_)], SEPARATOR), makeString([toString(binding_._1), toString(binding_._2), toString(binding_._3), toString(binding_._4), toString(binding_._5), if (binding_._6)
173+func _saveBinding (executionChainId_,assetId_,binding_) = [StringEntry(makeString([KEY_BINDING, toString(executionChainId_), toBase58String(assetId_)], SEPARATOR), makeString([binding_._1, toString(binding_._2), toString(binding_._3), toString(binding_._4), toString(binding_._5), toString(binding_._6), if (binding_._7)
176174 then "1"
177175 else "0"], SEPARATOR))]
178176
199197 func _saveRootAdapter (adapter_) = [StringEntry(KEY_ROOT_ADAPTER, toString(adapter_))]
200198
201199
202-func _loadFeeChainId () = match getInteger(KEY_FEE_CHAIN_ID) {
203- case a: Int =>
204- a
200+func _loadFeeRecipient () = match getString(KEY_FEE_RECIPIENT) {
201+ case a: String =>
202+ addressFromStringValue(a)
205203 case _ =>
206- 0
204+ Address(base58'')
207205 }
208206
209207
210-func _saveFeeChainId (val_) = [IntegerEntry(KEY_FEE_CHAIN_ID, val_)]
211-
212-
213-func _loadFeeRecipient () = match getString(KEY_FEE_RECIPIENT) {
214- case a: String =>
215- a
216- case _ =>
217- ""
218-}
219-
220-
221-func _saveFeeRecipient (val_) = [StringEntry(KEY_FEE_RECIPIENT, val_)]
208+func _saveFeeRecipient (val_) = [StringEntry(KEY_FEE_RECIPIENT, toString(val_))]
222209
223210
224211 func _onlyThisContract (caller_) = if ((caller_ != this))
306293
307294
308295 @Callable(i)
309-func mintTokens (assetContract_,amount_,recipient_,gaslessReward_,referrer_,referrerFee_,callerContract_) = {
296+func mintTokens (callerContract_,assetContract_,amount_,recipient_,gaslessReward_,referrer_,referrerFee_) = {
310297 let err = if (if (if (if (if (if (if (_whenInitialized())
311298 then _whenNotPaused()
312299 else false)
369356
370357
371358 @Callable(i)
372-func burnTokens (assetContract_,amount_,executionChainId_,recipient_,gaslessReward_,referrer_) = {
359+func burnTokens (executionChainId_,assetContract_,amount_,recipient_,gaslessReward_) = {
373360 let err = if (if (if (if (if (_whenInitialized())
374361 then _whenNotPaused()
375362 else false)
390377 if ((assetDecimals == assetDecimals))
391378 then {
392379 let binding = _loadBinding(executionChainId_, assetId)
393- let minAmount = binding._1
394- let minFee = binding._2
395- let thresholdFee = binding._3
396- let beforePercentFee = binding._4
397- let afterPercentFee = binding._5
398- let enabled = binding._6
380+ let executionAsset = binding._1
381+ let minAmount = binding._2
382+ let minFee = binding._3
383+ let thresholdFee = binding._4
384+ let beforePercentFee = binding._5
385+ let afterPercentFee = binding._6
386+ let enabled = binding._7
399387 let err1 = if (if (_validatePaymentAsset(i.payments[0], assetId, "burn: invalid payment asset"))
400388 then _validateInt(amount_, minAmount, MAX_INT, "burn: less than min")
401389 else false)
417405 let updateFee = (_loadFee(assetId) + fee)
418406 let normalizedAmount = _normalizeDecimals(amountToSend, assetDecimals, DECIMALS)
419407 let normalizedGasless = _normalizeDecimals(gaslessReward_, assetDecimals, DECIMALS)
420- let invocation = invoke(_loadRootAdapter(), FUNC_TAKE_TOKENS, [executionChainId_, assetContract_, normalizedAmount, recipient_, normalizedGasless, referrer_], nil)
408+ let invocation = invoke(_loadRootAdapter(), FUNC_RELEASE_TOKENS, [executionChainId_, executionAsset, normalizedAmount, recipient_, normalizedGasless], nil)
421409 if ((invocation == invocation))
422- then $Tuple2((_saveFee(assetId, updateFee) ++ [Burn(assetId, amount_)]), unit)
410+ then $Tuple2((_saveFee(assetId, updateFee) ++ [Burn(assetId, amountToSend)]), unit)
423411 else throw("Strict value is not equal to itself.")
424412 }
425413 else throw("Strict value is not equal to itself.")
430418 }
431419 else throw("Strict value is not equal to itself.")
432420 }
421+ else throw("Strict value is not equal to itself.")
422+ }
423+ else throw("Strict value is not equal to itself.")
424+ }
425+
426+
427+
428+@Callable(i)
429+func transferFee (assetContract_) = {
430+ let err = if (if (_whenInitialized())
431+ then _whenNotPaused()
432+ else false)
433+ then _validateAddress(assetContract_, "burnFee: invalid asset contract")
434+ else false
435+ if ((err == err))
436+ then {
437+ let assetId = _asBytes(invoke(addressFromStringValue(assetContract_), "getAssetId", nil, nil))
438+ if ((assetId == assetId))
439+ then $Tuple2((_saveFee(assetId, 0) ++ [ScriptTransfer(_loadFeeRecipient(), _loadFee(assetId), assetId)]), unit)
433440 else throw("Strict value is not equal to itself.")
434441 }
435442 else throw("Strict value is not equal to itself.")
464471
465472
466473 @Callable(i)
467-func updateFeeChain (feeChainId_) = {
474+func updateFeeRecipient (feeRecipient_) = {
468475 let err = if (if (_onlyThisContract(i.caller))
469476 then _whenInitialized()
470477 else false)
471- then _validateInt(feeChainId_, 0, MAX_INT, "updateFeeChain: invalid feeChainId")
478+ then _validateAddress(feeRecipient_, "updateFeeRecipient: invalid feeRecipient")
472479 else false
473480 if ((err == err))
474- then $Tuple2(_saveFeeChainId(feeChainId_), unit)
481+ then $Tuple2(_saveFeeRecipient(addressFromStringValue(feeRecipient_)), unit)
475482 else throw("Strict value is not equal to itself.")
476483 }
477484
478485
479486
480487 @Callable(i)
481-func updateFeeRecipient (feeRecipient_) = {
482- let err = if (_onlyThisContract(i.caller))
483- then _whenInitialized()
484- else false
485- if ((err == err))
486- then $Tuple2(_saveFeeRecipient(feeRecipient_), unit)
487- else throw("Strict value is not equal to itself.")
488- }
489-
490-
491-
492-@Callable(i)
493-func updateBindingInfo (assetContract_,executionChainId_,minAmount_,minFee_,thresholdFee_,beforePercentFee_,afterPercentFee_,enabled_) = {
488+func updateBindingInfo (executionChainId_,assetContract_,executionAsset_,minAmount_,minFee_,thresholdFee_,beforePercentFee_,afterPercentFee_,enabled_) = {
494489 let err = if (if (if (if (if (if (if (if (_onlyThisContract(i.caller))
495490 then _whenInitialized()
496491 else false)
513508 let assetId = _asBytes(invoke(addressFromStringValue(assetContract_), "getAssetId", nil, nil))
514509 if ((assetId == assetId))
515510 then {
516- let binding = $Tuple6(minAmount_, minFee_, thresholdFee_, beforePercentFee_, afterPercentFee_, enabled_)
511+ let binding = $Tuple7(executionAsset_, minAmount_, minFee_, thresholdFee_, beforePercentFee_, afterPercentFee_, enabled_)
517512 $Tuple2(_saveBinding(executionChainId_, assetId, binding), unit)
518513 }
519514 else throw("Strict value is not equal to itself.")
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
28-let KEY_FEE_CHAIN_ID = "FEE_CHAIN_ID"
29-
3028 let KEY_FEE_RECIPIENT = "FEE_RECIPIENT"
3129
32-let FUNC_TAKE_TOKENS = "takeTokens"
30+let FUNC_RELEASE_TOKENS = "releaseTokens"
3331
3432 let WAVES = "WAVES"
3533
3634 let WAVES_DECIMALS = 8
3735
3836 let DECIMALS = 6
3937
4038 let PERCENT_FACTOR = 1000000
4139
4240 let MAX_INT = 9223372036854775807
4341
4442 func _validateAddress (address_,err_) = match addressFromString(address_) {
4543 case a: Address =>
4644 true
4745 case _ =>
4846 throw(err_)
4947 }
5048
5149
5250 func _validateAsset (assetId_,err_) = match assetInfo(fromBase58String(assetId_)) {
5351 case a: Asset =>
5452 true
5553 case _ =>
5654 throw(err_)
5755 }
5856
5957
6058 func _validateInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_))
6159 then true
6260 else (val_ > upperBoundary_))
6361 then throw(err_)
6462 else true
6563
6664
6765 func _validateBool (val_,target_,err_) = if ((val_ != target_))
6866 then throw(err_)
6967 else true
7068
7169
7270 func _validatePaymentsSize (payments_,target_,err_) = if ((size(payments_) != target_))
7371 then throw(err_)
7472 else true
7573
7674
7775 func _validatePaymentAsset (payment_,asset_,err_) = if ((payment_.assetId != asset_))
7876 then throw(err_)
7977 else true
8078
8179
8280 func _normalizeDecimals (amount_,sourceDecimals_,targetDecimals_) = if ((sourceDecimals_ >= targetDecimals_))
8381 then (amount_ / pow(10, 0, (sourceDecimals_ - targetDecimals_), 0, 0, DOWN))
8482 else (amount_ * pow(10, 0, (targetDecimals_ - sourceDecimals_), 0, 0, DOWN))
8583
8684
8785 func _loadInit () = match getBoolean(KEY_INIT) {
8886 case a: Boolean =>
8987 a
9088 case _ =>
9189 false
9290 }
9391
9492
9593 func _saveInit (isInit_) = [BooleanEntry(KEY_INIT, isInit_)]
9694
9795
9896 func _loadPause () = match getBoolean(KEY_PAUSED) {
9997 case a: Boolean =>
10098 a
10199 case _ =>
102100 false
103101 }
104102
105103
106104 func _savePause (isPaused_) = [BooleanEntry(KEY_PAUSED, isPaused_)]
107105
108106
109107 func _loadPauser () = match getString(KEY_PAUSER) {
110108 case a: String =>
111109 addressFromStringValue(a)
112110 case _ =>
113111 Address(base58'')
114112 }
115113
116114
117115 func _savePauser (pauser_) = [StringEntry(KEY_PAUSER, toString(pauser_))]
118116
119117
120118 func _loadMultisig () = match getString(KEY_MULTISIG) {
121119 case a: String =>
122120 addressFromStringValue(a)
123121 case _ =>
124122 Address(base58'')
125123 }
126124
127125
128126 func _saveMultisig (multisig_) = [StringEntry(KEY_MULTISIG, toString(multisig_))]
129127
130128
131129 func _loadExecutor () = match getString(KEY_EXECUTOR) {
132130 case a: String =>
133131 addressFromStringValue(a)
134132 case _ =>
135133 Address(base58'')
136134 }
137135
138136
139137 func _saveExecutor (executor_) = [StringEntry(KEY_EXECUTOR, toString(executor_))]
140138
141139
142140 func _loadCallerContract () = match getString(KEY_CALLER_CONTRACT) {
143141 case a: String =>
144142 a
145143 case _ =>
146144 ""
147145 }
148146
149147
150148 func _saveCallerContract (caller_) = [StringEntry(KEY_CALLER_CONTRACT, caller_)]
151149
152150
153151 func _loadChain (chainId_) = match getBoolean(makeString([KEY_CHAIN, toString(chainId_)], SEPARATOR)) {
154152 case a: Boolean =>
155153 a
156154 case _ =>
157155 false
158156 }
159157
160158
161159 func _saveChain (chainId_,val_) = [BooleanEntry(makeString([KEY_CHAIN, toString(chainId_)], SEPARATOR), val_)]
162160
163161
164162 func _loadBinding (executionChainId_,assetId_) = match getString(makeString([KEY_BINDING, toString(executionChainId_), toBase58String(assetId_)], SEPARATOR)) {
165163 case a: String =>
166164 let struct = split(a, SEPARATOR)
167- $Tuple6(parseIntValue(struct[0]), parseIntValue(struct[1]), parseIntValue(struct[2]), parseIntValue(struct[3]), parseIntValue(struct[4]), if ((struct[5] == "1"))
165+ $Tuple7(struct[0], parseIntValue(struct[1]), parseIntValue(struct[2]), parseIntValue(struct[3]), parseIntValue(struct[4]), parseIntValue(struct[5]), if ((struct[6] == "1"))
168166 then true
169167 else false)
170168 case _ =>
171- $Tuple6(0, 0, 0, 0, 0, false)
169+ $Tuple7("", 0, 0, 0, 0, 0, false)
172170 }
173171
174172
175-func _saveBinding (executionChainId_,assetId_,binding_) = [StringEntry(makeString([KEY_BINDING, toString(executionChainId_), toBase58String(assetId_)], SEPARATOR), makeString([toString(binding_._1), toString(binding_._2), toString(binding_._3), toString(binding_._4), toString(binding_._5), if (binding_._6)
173+func _saveBinding (executionChainId_,assetId_,binding_) = [StringEntry(makeString([KEY_BINDING, toString(executionChainId_), toBase58String(assetId_)], SEPARATOR), makeString([binding_._1, toString(binding_._2), toString(binding_._3), toString(binding_._4), toString(binding_._5), toString(binding_._6), if (binding_._7)
176174 then "1"
177175 else "0"], SEPARATOR))]
178176
179177
180178 func _loadFee (assetId_) = match getInteger(makeString([KEY_FEE, toBase58String(assetId_)], SEPARATOR)) {
181179 case a: Int =>
182180 a
183181 case _ =>
184182 0
185183 }
186184
187185
188186 func _saveFee (assetId_,val_) = [IntegerEntry(makeString([KEY_FEE, toBase58String(assetId_)], SEPARATOR), val_)]
189187
190188
191189 func _loadRootAdapter () = match getString(KEY_ROOT_ADAPTER) {
192190 case a: String =>
193191 addressFromStringValue(a)
194192 case _ =>
195193 Address(base58'')
196194 }
197195
198196
199197 func _saveRootAdapter (adapter_) = [StringEntry(KEY_ROOT_ADAPTER, toString(adapter_))]
200198
201199
202-func _loadFeeChainId () = match getInteger(KEY_FEE_CHAIN_ID) {
203- case a: Int =>
204- a
200+func _loadFeeRecipient () = match getString(KEY_FEE_RECIPIENT) {
201+ case a: String =>
202+ addressFromStringValue(a)
205203 case _ =>
206- 0
204+ Address(base58'')
207205 }
208206
209207
210-func _saveFeeChainId (val_) = [IntegerEntry(KEY_FEE_CHAIN_ID, val_)]
211-
212-
213-func _loadFeeRecipient () = match getString(KEY_FEE_RECIPIENT) {
214- case a: String =>
215- a
216- case _ =>
217- ""
218-}
219-
220-
221-func _saveFeeRecipient (val_) = [StringEntry(KEY_FEE_RECIPIENT, val_)]
208+func _saveFeeRecipient (val_) = [StringEntry(KEY_FEE_RECIPIENT, toString(val_))]
222209
223210
224211 func _onlyThisContract (caller_) = if ((caller_ != this))
225212 then throw("_onlyThisContract: revert")
226213 else true
227214
228215
229216 func _whenMultisigSet () = if ((_loadMultisig() == Address(base58'')))
230217 then throw("_whenMultisigSet: revert")
231218 else true
232219
233220
234221 func _whenNotInitialized () = if (_loadInit())
235222 then throw("_whenNotInitialized: revert")
236223 else true
237224
238225
239226 func _whenInitialized () = if (!(_loadInit()))
240227 then throw("_whenInitialized: revert")
241228 else true
242229
243230
244231 func _whenNotPaused () = if (_loadPause())
245232 then throw("_whenNotPaused: revert")
246233 else true
247234
248235
249236 func _whenPaused () = if (!(_loadPause()))
250237 then throw("_whenPaused: revert")
251238 else true
252239
253240
254241 func _onlyPauser (caller_) = if ((caller_ != _loadPauser()))
255242 then throw("_onlyPauser: revert")
256243 else true
257244
258245
259246 func _asInt (val_) = match val_ {
260247 case a: Int =>
261248 a
262249 case _ =>
263250 throw("_asInt: revert")
264251 }
265252
266253
267254 func _asBytes (val_) = match val_ {
268255 case a: ByteVector =>
269256 a
270257 case _ =>
271258 throw("_asBytes: revert")
272259 }
273260
274261
275262 func _validateExecutor (val_,err_) = if ((val_ != _loadExecutor()))
276263 then throw(err_)
277264 else true
278265
279266
280267 func _validateCaller (val_,err_) = if ((val_ != _loadCallerContract()))
281268 then throw(err_)
282269 else true
283270
284271
285272 func _validateChain (executionChainId_,err_) = if (!(_loadChain(executionChainId_)))
286273 then throw(err_)
287274 else true
288275
289276
290277 @Callable(i)
291278 func init (executor_,adapter_) = {
292279 let err = if (if (if (if (_onlyThisContract(i.caller))
293280 then _whenNotInitialized()
294281 else false)
295282 then _whenMultisigSet()
296283 else false)
297284 then _validateAddress(executor_, "init: invalid executor")
298285 else false)
299286 then _validateAddress(adapter_, "init: invalid adapter")
300287 else false
301288 if ((err == err))
302289 then $Tuple2(((_saveInit(true) ++ _saveExecutor(addressFromStringValue(executor_))) ++ _saveRootAdapter(addressFromStringValue(adapter_))), unit)
303290 else throw("Strict value is not equal to itself.")
304291 }
305292
306293
307294
308295 @Callable(i)
309-func mintTokens (assetContract_,amount_,recipient_,gaslessReward_,referrer_,referrerFee_,callerContract_) = {
296+func mintTokens (callerContract_,assetContract_,amount_,recipient_,gaslessReward_,referrer_,referrerFee_) = {
310297 let err = if (if (if (if (if (if (if (_whenInitialized())
311298 then _whenNotPaused()
312299 else false)
313300 then _validateAddress(assetContract_, "mint: invalid asset contract")
314301 else false)
315302 then _validateExecutor(i.caller, "mint: invalid executor")
316303 else false)
317304 then _validateCaller(callerContract_, "mint: invalid caller")
318305 else false)
319306 then _validateAddress(recipient_, "mint: invalid recipient address")
320307 else false)
321308 then _validateInt(amount_, 0, MAX_INT, "mint: invalid amount")
322309 else false)
323310 then _validateInt(gaslessReward_, 0, MAX_INT, "mint: invalid gaslessReward")
324311 else false
325312 if ((err == err))
326313 then {
327314 let assetId = _asBytes(invoke(addressFromStringValue(assetContract_), "getAssetId", nil, nil))
328315 if ((assetId == assetId))
329316 then {
330317 let assetDecimals = _asInt(invoke(addressFromStringValue(assetContract_), "getDecimals", nil, nil))
331318 if ((assetDecimals == assetDecimals))
332319 then {
333320 let normalizedAmount = _normalizeDecimals(amount_, DECIMALS, assetDecimals)
334321 let normalizedGasless = _normalizeDecimals(gaslessReward_, DECIMALS, assetDecimals)
335322 let referrer = if ((size(referrer_) > 0))
336323 then {
337324 let err1 = if (_validateAddress(referrer_, "mint: invalid referrer address"))
338325 then _validateInt(referrerFee_, 0, MAX_INT, "mint: invalid referrer fee")
339326 else false
340327 if ((err1 == err1))
341328 then {
342329 let normalizedReferrerFee = _normalizeDecimals(referrerFee_, DECIMALS, assetDecimals)
343330 $Tuple2(normalizedReferrerFee, [ScriptTransfer(addressFromStringValue(referrer_), normalizedReferrerFee, assetId)])
344331 }
345332 else throw("Strict value is not equal to itself.")
346333 }
347334 else $Tuple2(0, nil)
348335 let referrerFee = referrer._1
349336 let referrerActions = referrer._2
350337 let invocation = invoke(addressFromStringValue(assetContract_), "mint", [(normalizedAmount + referrerFee), toString(this)], nil)
351338 if ((invocation == invocation))
352339 then {
353340 let actions = if (if ((normalizedGasless > 0))
354341 then (addressFromStringValue(recipient_) != i.originCaller)
355342 else false)
356343 then [ScriptTransfer(addressFromStringValue(recipient_), (normalizedAmount - normalizedGasless), assetId), ScriptTransfer(i.originCaller, normalizedGasless, assetId)]
357344 else [ScriptTransfer(addressFromStringValue(recipient_), normalizedAmount, assetId)]
358345 $Tuple2((actions ++ referrerActions), unit)
359346 }
360347 else throw("Strict value is not equal to itself.")
361348 }
362349 else throw("Strict value is not equal to itself.")
363350 }
364351 else throw("Strict value is not equal to itself.")
365352 }
366353 else throw("Strict value is not equal to itself.")
367354 }
368355
369356
370357
371358 @Callable(i)
372-func burnTokens (assetContract_,amount_,executionChainId_,recipient_,gaslessReward_,referrer_) = {
359+func burnTokens (executionChainId_,assetContract_,amount_,recipient_,gaslessReward_) = {
373360 let err = if (if (if (if (if (_whenInitialized())
374361 then _whenNotPaused()
375362 else false)
376363 then _validateAddress(assetContract_, "burn: invalid asset contract")
377364 else false)
378365 then _validateChain(executionChainId_, "burn: invalid execution chain")
379366 else false)
380367 then _validatePaymentsSize(i.payments, 1, "burn: no payment")
381368 else false)
382369 then _validateInt(i.payments[0].amount, amount_, MAX_INT, "burn: invalid payment amount")
383370 else false
384371 if ((err == err))
385372 then {
386373 let assetId = _asBytes(invoke(addressFromStringValue(assetContract_), "getAssetId", nil, nil))
387374 if ((assetId == assetId))
388375 then {
389376 let assetDecimals = _asInt(invoke(addressFromStringValue(assetContract_), "getDecimals", nil, nil))
390377 if ((assetDecimals == assetDecimals))
391378 then {
392379 let binding = _loadBinding(executionChainId_, assetId)
393- let minAmount = binding._1
394- let minFee = binding._2
395- let thresholdFee = binding._3
396- let beforePercentFee = binding._4
397- let afterPercentFee = binding._5
398- let enabled = binding._6
380+ let executionAsset = binding._1
381+ let minAmount = binding._2
382+ let minFee = binding._3
383+ let thresholdFee = binding._4
384+ let beforePercentFee = binding._5
385+ let afterPercentFee = binding._6
386+ let enabled = binding._7
399387 let err1 = if (if (_validatePaymentAsset(i.payments[0], assetId, "burn: invalid payment asset"))
400388 then _validateInt(amount_, minAmount, MAX_INT, "burn: less than min")
401389 else false)
402390 then _validateBool(enabled, true, "burn: token is disabled")
403391 else false
404392 if ((err1 == err1))
405393 then {
406394 let percent = if ((amount_ > thresholdFee))
407395 then afterPercentFee
408396 else beforePercentFee
409397 let fee = (minFee + ((amount_ * percent) / PERCENT_FACTOR))
410398 let err2 = _validateInt(amount_, (fee + 1), MAX_INT, "burn: fee more than amount")
411399 if ((err2 == err2))
412400 then {
413401 let amountToSend = (amount_ - fee)
414402 let err3 = _validateInt(amountToSend, (gaslessReward_ + 1), MAX_INT, "burn: reward more than amount")
415403 if ((err3 == err3))
416404 then {
417405 let updateFee = (_loadFee(assetId) + fee)
418406 let normalizedAmount = _normalizeDecimals(amountToSend, assetDecimals, DECIMALS)
419407 let normalizedGasless = _normalizeDecimals(gaslessReward_, assetDecimals, DECIMALS)
420- let invocation = invoke(_loadRootAdapter(), FUNC_TAKE_TOKENS, [executionChainId_, assetContract_, normalizedAmount, recipient_, normalizedGasless, referrer_], nil)
408+ let invocation = invoke(_loadRootAdapter(), FUNC_RELEASE_TOKENS, [executionChainId_, executionAsset, normalizedAmount, recipient_, normalizedGasless], nil)
421409 if ((invocation == invocation))
422- then $Tuple2((_saveFee(assetId, updateFee) ++ [Burn(assetId, amount_)]), unit)
410+ then $Tuple2((_saveFee(assetId, updateFee) ++ [Burn(assetId, amountToSend)]), unit)
423411 else throw("Strict value is not equal to itself.")
424412 }
425413 else throw("Strict value is not equal to itself.")
426414 }
427415 else throw("Strict value is not equal to itself.")
428416 }
429417 else throw("Strict value is not equal to itself.")
430418 }
431419 else throw("Strict value is not equal to itself.")
432420 }
421+ else throw("Strict value is not equal to itself.")
422+ }
423+ else throw("Strict value is not equal to itself.")
424+ }
425+
426+
427+
428+@Callable(i)
429+func transferFee (assetContract_) = {
430+ let err = if (if (_whenInitialized())
431+ then _whenNotPaused()
432+ else false)
433+ then _validateAddress(assetContract_, "burnFee: invalid asset contract")
434+ else false
435+ if ((err == err))
436+ then {
437+ let assetId = _asBytes(invoke(addressFromStringValue(assetContract_), "getAssetId", nil, nil))
438+ if ((assetId == assetId))
439+ then $Tuple2((_saveFee(assetId, 0) ++ [ScriptTransfer(_loadFeeRecipient(), _loadFee(assetId), assetId)]), unit)
433440 else throw("Strict value is not equal to itself.")
434441 }
435442 else throw("Strict value is not equal to itself.")
436443 }
437444
438445
439446
440447 @Callable(i)
441448 func updateCallerContract (callerContract_) = {
442449 let err = if (_onlyThisContract(i.caller))
443450 then _whenInitialized()
444451 else false
445452 if ((err == err))
446453 then $Tuple2(_saveCallerContract(callerContract_), unit)
447454 else throw("Strict value is not equal to itself.")
448455 }
449456
450457
451458
452459 @Callable(i)
453460 func updateExecutionChain (executionChainId_,enabled_) = {
454461 let err = if (if (_onlyThisContract(i.caller))
455462 then _whenInitialized()
456463 else false)
457464 then _validateInt(executionChainId_, 0, MAX_INT, "updateExecutionChain: invalid executionChainId")
458465 else false
459466 if ((err == err))
460467 then $Tuple2(_saveChain(executionChainId_, enabled_), unit)
461468 else throw("Strict value is not equal to itself.")
462469 }
463470
464471
465472
466473 @Callable(i)
467-func updateFeeChain (feeChainId_) = {
474+func updateFeeRecipient (feeRecipient_) = {
468475 let err = if (if (_onlyThisContract(i.caller))
469476 then _whenInitialized()
470477 else false)
471- then _validateInt(feeChainId_, 0, MAX_INT, "updateFeeChain: invalid feeChainId")
478+ then _validateAddress(feeRecipient_, "updateFeeRecipient: invalid feeRecipient")
472479 else false
473480 if ((err == err))
474- then $Tuple2(_saveFeeChainId(feeChainId_), unit)
481+ then $Tuple2(_saveFeeRecipient(addressFromStringValue(feeRecipient_)), unit)
475482 else throw("Strict value is not equal to itself.")
476483 }
477484
478485
479486
480487 @Callable(i)
481-func updateFeeRecipient (feeRecipient_) = {
482- let err = if (_onlyThisContract(i.caller))
483- then _whenInitialized()
484- else false
485- if ((err == err))
486- then $Tuple2(_saveFeeRecipient(feeRecipient_), unit)
487- else throw("Strict value is not equal to itself.")
488- }
489-
490-
491-
492-@Callable(i)
493-func updateBindingInfo (assetContract_,executionChainId_,minAmount_,minFee_,thresholdFee_,beforePercentFee_,afterPercentFee_,enabled_) = {
488+func updateBindingInfo (executionChainId_,assetContract_,executionAsset_,minAmount_,minFee_,thresholdFee_,beforePercentFee_,afterPercentFee_,enabled_) = {
494489 let err = if (if (if (if (if (if (if (if (_onlyThisContract(i.caller))
495490 then _whenInitialized()
496491 else false)
497492 then _validateAddress(assetContract_, "updateBindingInfo: invalid asset contract")
498493 else false)
499494 then _validateInt(executionChainId_, 0, MAX_INT, "updateBindingInfo: invalid executionChainId")
500495 else false)
501496 then _validateInt(minAmount_, 0, MAX_INT, "updateBindingInfo: invalid minAmount")
502497 else false)
503498 then _validateInt(minFee_, 0, MAX_INT, "updateBindingInfo: invalid minFee")
504499 else false)
505500 then _validateInt(thresholdFee_, 0, MAX_INT, "updateBindingInfo: invalid thresholdFee")
506501 else false)
507502 then _validateInt(beforePercentFee_, 0, MAX_INT, "updateBindingInfo: invalid beforePercentFee")
508503 else false)
509504 then _validateInt(afterPercentFee_, 0, MAX_INT, "updateBindingInfo: invalid afterPercentFee")
510505 else false
511506 if ((err == err))
512507 then {
513508 let assetId = _asBytes(invoke(addressFromStringValue(assetContract_), "getAssetId", nil, nil))
514509 if ((assetId == assetId))
515510 then {
516- let binding = $Tuple6(minAmount_, minFee_, thresholdFee_, beforePercentFee_, afterPercentFee_, enabled_)
511+ let binding = $Tuple7(executionAsset_, minAmount_, minFee_, thresholdFee_, beforePercentFee_, afterPercentFee_, enabled_)
517512 $Tuple2(_saveBinding(executionChainId_, assetId, binding), unit)
518513 }
519514 else throw("Strict value is not equal to itself.")
520515 }
521516 else throw("Strict value is not equal to itself.")
522517 }
523518
524519
525520
526521 @Callable(i)
527522 func setMultisig (multisig_) = {
528523 let err = if (_onlyThisContract(i.caller))
529524 then _validateAddress(multisig_, "setMultisig: invalid multisig")
530525 else false
531526 if ((err == err))
532527 then $Tuple2(_saveMultisig(addressFromStringValue(multisig_)), unit)
533528 else throw("Strict value is not equal to itself.")
534529 }
535530
536531
537532 @Verifier(tx)
538533 func verify () = match getString(KEY_MULTISIG) {
539534 case multisig: String =>
540535 valueOrElse(getBoolean(addressFromStringValue(multisig), makeString([KEY_STATUS, toString(this), toBase58String(tx.id)], SEPARATOR)), false)
541536 case _ =>
542537 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
543538 }
544539

github/deemru/w8io/873ac7e 
72.84 ms