tx · Hf1htHZhyQMVZnEpM9F7mnXCuFNo3gr4Z95eUu2x5L8q

3N8WkAsvzUV5aWceBr7S9UtUF1Z3nj1ZR4b:  -0.02600000 Waves

2023.03.01 00:09 [2470080] smart account 3N8WkAsvzUV5aWceBr7S9UtUF1Z3nj1ZR4b > SELF 0.00000000 Waves

{ "type": 13, "id": "Hf1htHZhyQMVZnEpM9F7mnXCuFNo3gr4Z95eUu2x5L8q", "fee": 2600000, "feeAssetId": null, "timestamp": 1677618272565, "version": 2, "chainId": 84, "sender": "3N8WkAsvzUV5aWceBr7S9UtUF1Z3nj1ZR4b", "senderPublicKey": "4XvSU29GmHq4m7SRGhMgdQ8M9KHgtysEM2kzEVYKW9e6", "proofs": [ "5nykenEthFT8EBXauBkDa7xezuCBBf7NUgYUAXYqGqJKiG4TmGHhGgdSsoYtwH7RrqxJitJRM3yCfNwMibsdzXZo" ], "script": "base64:BgJDCAISBQoDAQgBEgQKAgEYEgsKCQEBAQgICBgIARIKCggBAQEICAgIARIECgIBARIECgIBARIDCgEIEgMKAQESAwoBCGsACVNFUEFSQVRPUgICX18ADkFSR1NfU0VQQVJBVE9SAgQjIyMjAAhLRVlfSU5JVAIESU5JVAAMS0VZX01VTFRJU0lHAghNVUxUSVNJRwAKS0VZX1NUQVRVUwIGU1RBVFVTABJLRVlfUFJPWFlfU0VDX0RFUE8CFlBST1hZX1NFQ1VSSVRZX0RFUE9TSVQAHEtFWV9QUk9YWV9TRUNfREVQT19QRVJfRVZFTlQCIFBST1hZX1NFQ1VSSVRZX0RFUE9TSVRfUEVSX0VWRU5UAA9LRVlfV0FWRVNfRVZFTlQCC1dBVkVTX0VWRU5UAA1LRVlfRVZNX0VWRU5UAglFVk1fRVZFTlQAFEtFWV9XQVZFU19FVkVOVF9TSVpFAhBXQVZFU19FVkVOVF9TSVpFABJLRVlfRVZNX0VWRU5UX1NJWkUCDkVWTV9FVkVOVF9TSVpFABZLRVlfV0FWRVNfRVZFTlRfU1RBVFVTAhJXQVZFU19FVkVOVF9TVEFUVVMAFEtFWV9FVk1fRVZFTlRfU1RBVFVTAhBFVk1fRVZFTlRfU1RBVFVTABlLRVlfV0FWRVNfRVZFTlRfUFVCTElTSEVEAhVXQVZFU19FVkVOVF9QVUJMSVNIRUQAF0tFWV9FVk1fRVZFTlRfUFVCTElTSEVEAhNFVk1fRVZFTlRfUFVCTElTSEVEABFLRVlfQ1VSUkVOVF9FUE9DSAINQ1VSUkVOVF9FUE9DSAAIS0VZX1NJWkUCBFNJWkUAFktFWV9XQVZFU19FVkVOVF9DQUxMRVICEldBVkVTX0VWRU5UX0NBTExFUgAUS0VZX0VWTV9FVkVOVF9DQUxMRVICEEVWTV9FVkVOVF9DQUxMRVIAF0tFWV9XSVRORVNTRVNfUEVSX0VQT0NIAhNXSVRORVNTRVNfUEVSX0VQT0NIABhLRVlfV0FWRVNfRVZFTlRfRVhFQ1VUT1ICFFdBVkVTX0VWRU5UX0VYRUNVVE9SABZLRVlfRVZNX0VWRU5UX0VYRUNVVE9SAhJFVk1fRVZFTlRfRVhFQ1VUT1IAGEtFWV9SRVdBUkRfVE9LRU5fQUREUkVTUwIUUkVXQVJEX1RPS0VOX0FERFJFU1MAEUtFWV9SRVdBUkRfQU1PVU5UAg1SRVdBUkRfQU1PVU5UAA5GVU5DX01JTlRfTUFOWQIIbWludE1hbnkAF0VWRU5UX1NUQVRVU19QUk9DRVNTSU5HAAEAFkVWRU5UX1NUQVRVU19DT05GSVJNRUQAAgAVRVZFTlRfU1RBVFVTX1JFSkVDVEVEAAMAB01BWF9JTlQA//////////9/ARBfdmFsaWRhdGVBZGRyZXNzAghhZGRyZXNzXwRlcnJfBAckbWF0Y2gwCQCmCAEFCGFkZHJlc3NfAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAGCQACAQUEZXJyXwEOX3ZhbGlkYXRlQXNzZXQCCGFzc2V0SWRfBGVycl8EByRtYXRjaDAJAOwHAQkA2QQBBQhhc3NldElkXwMJAAECBQckbWF0Y2gwAgVBc3NldAQBYQUHJG1hdGNoMAYJAAIBBQRlcnJfAQxfdmFsaWRhdGVJbnQEBHZhbF8ObG93ZXJCb3VuZGFyeV8OdXBwZXJCb3VuZGFyeV8EZXJyXwMDCQBmAgUObG93ZXJCb3VuZGFyeV8FBHZhbF8GCQBmAgUEdmFsXwUOdXBwZXJCb3VuZGFyeV8JAAIBBQRlcnJfBgEPX3ZhbGlkYXRlU3RyaW5nAgR2YWxfBGVycl8DCQBnAgAACQCxAgEFBHZhbF8JAAIBBQRlcnJfBgEVX3ZhbGlkYXRlUGF5bWVudHNTaXplAwlwYXltZW50c18HdGFyZ2V0XwRlcnJfAwkBAiE9AgkAkAMBBQlwYXltZW50c18FB3RhcmdldF8JAAIBBQRlcnJfBgEVX3ZhbGlkYXRlUGF5bWVudEFzc2V0AwhwYXltZW50XwZhc3NldF8EZXJyXwMJAQIhPQIIBQhwYXltZW50Xwdhc3NldElkBQZhc3NldF8JAAIBBQRlcnJfBgERX3ZhbGlkYXRlRXZlbnRJZHgDBHZhbF8EbWF4XwRlcnJfAwMJAGYCAAAFBHZhbF8GCQBnAgUEdmFsXwUEbWF4XwkAAgEFBGVycl8GARRfdmFsaWRhdGVFdmVudFN0YXR1cwIEdmFsXwRlcnJfAwMJAGYCBRdFVkVOVF9TVEFUVVNfUFJPQ0VTU0lORwUEdmFsXwYJAGYCBQR2YWxfBRVFVkVOVF9TVEFUVVNfUkVKRUNURUQJAAIBBQRlcnJfBgESX3ZhbGlkYXRlUHVibGljS2V5AgpwdWJsaWNLZXlfBGVycl8DCQECIT0CCQDIAQEJANkEAQUKcHVibGljS2V5XwAgCQACAQUEZXJyXwYBE192YWxpZGF0ZVB1YmxpY0tleXMCC3B1YmxpY0tleXNfBGVycl8KAQhmb2xkRnVuYwIDYWNjBGVsZW0JAJQKAgMIBQNhY2MCXzEJARJfdmFsaWRhdGVQdWJsaWNLZXkCBQRlbGVtCAUDYWNjAl8yBwgFA2FjYwJfMgQGcmVzdWx0CgACJGwFC3B1YmxpY0tleXNfCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBgUEZXJyXwoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoIBQZyZXN1bHQCXzEBFV9wdWJsaWNLZXlzVG9BZGRyc1N0cgELcHVibGljS2V5c18KAQhmb2xkZnVuYwIEYWNjXwVlbGVtXwkAzQgCBQRhY2NfCQCnCAEJANkEAQUFZWxlbV8KAAIkbAULcHVibGljS2V5c18KAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRmdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA1MQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwEJX2xvYWRJbml0AAQHJG1hdGNoMAkAoAgBBQhLRVlfSU5JVAMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFhBQckbWF0Y2gwBQFhBwEJX3NhdmVJbml0AQdpc0luaXRfCQDMCAIJAQxCb29sZWFuRW50cnkCBQhLRVlfSU5JVAUHaXNJbml0XwUDbmlsAQ1fbG9hZE11bHRpc2lnAAQHJG1hdGNoMAkAoggBBQxLRVlfTVVMVElTSUcDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFhCQEHQWRkcmVzcwEBAAENX3NhdmVNdWx0aXNpZwEJbXVsdGlzaWdfCQDMCAIJAQtTdHJpbmdFbnRyeQIFDEtFWV9NVUxUSVNJRwkApQgBBQltdWx0aXNpZ18FA25pbAERX2xvYWRQcm94eVNlY0RlcG8BCGFjY291bnRfBAckbWF0Y2gwCQCfCAEJALkJAgkAzAgCBRJLRVlfUFJPWFlfU0VDX0RFUE8JAMwIAgkApQgBBQhhY2NvdW50XwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABEV9zYXZlUHJveHlTZWNEZXBvAghhY2NvdW50XwR2YWxfCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQC5CQIJAMwIAgUSS0VZX1BST1hZX1NFQ19ERVBPCQDMCAIJAKUIAQUIYWNjb3VudF8FA25pbAUJU0VQQVJBVE9SBQR2YWxfBQNuaWwBGV9sb2FkUHJveHlTZWNEZXBvUGVyRXZlbnQABAckbWF0Y2gwCQCfCAEFHEtFWV9QUk9YWV9TRUNfREVQT19QRVJfRVZFTlQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABGV9zYXZlUHJveHlTZWNEZXBvUGVyRXZlbnQBBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIFHEtFWV9QUk9YWV9TRUNfREVQT19QRVJfRVZFTlQFBHZhbF8FA25pbAETX2xvYWRXYXZlc0V2ZW50U2l6ZQAEByRtYXRjaDAJAJ8IAQUUS0VZX1dBVkVTX0VWRU5UX1NJWkUDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABE19zYXZlV2F2ZXNFdmVudFNpemUBBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIFFEtFWV9XQVZFU19FVkVOVF9TSVpFBQR2YWxfBQNuaWwBEV9sb2FkRVZNRXZlbnRTaXplAAQHJG1hdGNoMAkAnwgBBRJLRVlfRVZNX0VWRU5UX1NJWkUDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABEV9zYXZlRVZNRXZlbnRTaXplAQR2YWxfCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJLRVlfRVZNX0VWRU5UX1NJWkUFBHZhbF8FA25pbAEPX2xvYWRXYXZlc0V2ZW50AQZpbmRleF8EByRtYXRjaDAJAKIIAQkAuQkCCQDMCAIFD0tFWV9XQVZFU19FVkVOVAkAzAgCCQCkAwEFBmluZGV4XwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBAZzdHJ1Y3QJALUJAgUBYQUJU0VQQVJBVE9SCQCgCg4JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QAAAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAABCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAIJAJEDAgUGc3RydWN0AAMJAJEDAgUGc3RydWN0AAQJAJEDAgUGc3RydWN0AAUJALUJAgkAkQMCBQZzdHJ1Y3QABgUOQVJHU19TRVBBUkFUT1IJAJEDAgUGc3RydWN0AAcJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QACAkAkQMCBQZzdHJ1Y3QACQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAAKCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAsJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QADAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQZzdHJ1Y3QADQkAoAoOAAAAAAAAAgACAAIABQNuaWwCAAAAAgAAAAAAAAAJAQdBZGRyZXNzAQEAAQ9fc2F2ZVdhdmVzRXZlbnQCBmluZGV4XwZldmVudF8JAMwIAgkBC1N0cmluZ0VudHJ5AgkAuQkCCQDMCAIFD0tFWV9XQVZFU19FVkVOVAkAzAgCCQCkAwEFBmluZGV4XwUDbmlsBQlTRVBBUkFUT1IJALkJAgkAzAgCCQCkAwEIBQZldmVudF8CXzEJAMwIAgkApAMBCAUGZXZlbnRfAl8yCQDMCAIJAKQDAQgFBmV2ZW50XwJfMwkAzAgCCAUGZXZlbnRfAl80CQDMCAIIBQZldmVudF8CXzUJAMwIAggFBmV2ZW50XwJfNgkAzAgCCQC5CQIIBQZldmVudF8CXzcFDkFSR1NfU0VQQVJBVE9SCQDMCAIIBQZldmVudF8CXzgJAMwIAgkApAMBCAUGZXZlbnRfAl85CQDMCAIIBQZldmVudF8DXzEwCQDMCAIJAKQDAQgFBmV2ZW50XwNfMTEJAMwIAgkApAMBCAUGZXZlbnRfA18xMgkAzAgCCQCkAwEIBQZldmVudF8DXzEzCQDMCAIJAKUIAQgFBmV2ZW50XwNfMTQFA25pbAUJU0VQQVJBVE9SBQNuaWwBDV9sb2FkRVZNRXZlbnQBBmluZGV4XwQHJG1hdGNoMAkAoggBCQC5CQIJAMwIAgUNS0VZX0VWTV9FVkVOVAkAzAgCCQCkAwEFBmluZGV4XwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBAZzdHJ1Y3QJALUJAgUBYQUJU0VQQVJBVE9SCQCfCg0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QAAAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAABCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAIJAJEDAgUGc3RydWN0AAMJAJEDAgUGc3RydWN0AAQJAJEDAgUGc3RydWN0AAUJAJEDAgUGc3RydWN0AAYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QABwkAkQMCBQZzdHJ1Y3QACAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAAJCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAoJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QACwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQZzdHJ1Y3QADAkAnwoNAAAAAAAAAgACAAIAAgAAAAIAAAAAAAAACQEHQWRkcmVzcwEBAAENX3NhdmVFVk1FdmVudAIGaW5kZXhfBmV2ZW50XwkAzAgCCQELU3RyaW5nRW50cnkCCQC5CQIJAMwIAgUNS0VZX0VWTV9FVkVOVAkAzAgCCQCkAwEFBmluZGV4XwUDbmlsBQlTRVBBUkFUT1IJALkJAgkAzAgCCQCkAwEIBQZldmVudF8CXzEJAMwIAgkApAMBCAUGZXZlbnRfAl8yCQDMCAIJAKQDAQgFBmV2ZW50XwJfMwkAzAgCCAUGZXZlbnRfAl80CQDMCAIIBQZldmVudF8CXzUJAMwIAggFBmV2ZW50XwJfNgkAzAgCCAUGZXZlbnRfAl83CQDMCAIJAKQDAQgFBmV2ZW50XwJfOAkAzAgCCAUGZXZlbnRfAl85CQDMCAIJAKQDAQgFBmV2ZW50XwNfMTAJAMwIAgkApAMBCAUGZXZlbnRfA18xMQkAzAgCCQCkAwEIBQZldmVudF8DXzEyCQDMCAIJAKUIAQgFBmV2ZW50XwNfMTMFA25pbAUJU0VQQVJBVE9SBQNuaWwBFV9sb2FkV2F2ZXNFdmVudFN0YXR1cwEKZXZlbnRIYXNoXwQHJG1hdGNoMAkAnwgBCQC5CQIJAMwIAgUWS0VZX1dBVkVTX0VWRU5UX1NUQVRVUwkAzAgCBQpldmVudEhhc2hfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAEVX3NhdmVXYXZlc0V2ZW50U3RhdHVzAgpldmVudEhhc2hfB3N0YXR1c18JAMwIAgkBDEludGVnZXJFbnRyeQIJALkJAgkAzAgCBRZLRVlfV0FWRVNfRVZFTlRfU1RBVFVTCQDMCAIFCmV2ZW50SGFzaF8FA25pbAUJU0VQQVJBVE9SBQdzdGF0dXNfBQNuaWwBE19sb2FkRVZNRXZlbnRTdGF0dXMBCmV2ZW50SGFzaF8EByRtYXRjaDAJAJ8IAQkAuQkCCQDMCAIFFEtFWV9FVk1fRVZFTlRfU1RBVFVTCQDMCAIFCmV2ZW50SGFzaF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAARNfc2F2ZUVWTUV2ZW50U3RhdHVzAgpldmVudEhhc2hfB3N0YXR1c18JAMwIAgkBDEludGVnZXJFbnRyeQIJALkJAgkAzAgCBRRLRVlfRVZNX0VWRU5UX1NUQVRVUwkAzAgCBQpldmVudEhhc2hfBQNuaWwFCVNFUEFSQVRPUgUHc3RhdHVzXwUDbmlsASFfbG9hZFB1Ymxpc2hlZFdhdmVzRXZlbnRCeVdpdG5lc3MCCnB1YmxpY0tleV8IZXZlbnRJZF8EByRtYXRjaDAJAJ8IAQkAuQkCCQDMCAIFGUtFWV9XQVZFU19FVkVOVF9QVUJMSVNIRUQJAMwIAgUKcHVibGljS2V5XwkAzAgCCQCkAwEFCGV2ZW50SWRfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAEhX3NhdmVQdWJsaXNoZWRXYXZlc0V2ZW50QnlXaXRuZXNzAwpwdWJsaWNLZXlfCGV2ZW50SWRfBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIJALkJAgkAzAgCBRlLRVlfV0FWRVNfRVZFTlRfUFVCTElTSEVECQDMCAIFCnB1YmxpY0tleV8JAMwIAgkApAMBBQhldmVudElkXwUDbmlsBQlTRVBBUkFUT1IFBHZhbF8FA25pbAEfX2xvYWRQdWJsaXNoZWRFVk1FdmVudEJ5V2l0bmVzcwIKcHVibGljS2V5XwhldmVudElkXwQHJG1hdGNoMAkAnwgBCQC5CQIJAMwIAgUXS0VZX0VWTV9FVkVOVF9QVUJMSVNIRUQJAMwIAgUKcHVibGljS2V5XwkAzAgCCQCkAwEFCGV2ZW50SWRfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAEfX3NhdmVQdWJsaXNoZWRFVk1FdmVudEJ5V2l0bmVzcwMKcHVibGljS2V5XwhldmVudElkXwR2YWxfCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQC5CQIJAMwIAgUXS0VZX0VWTV9FVkVOVF9QVUJMSVNIRUQJAMwIAgUKcHVibGljS2V5XwkAzAgCCQCkAwEFCGV2ZW50SWRfBQNuaWwFCVNFUEFSQVRPUgUEdmFsXwUDbmlsARFfbG9hZEN1cnJlbnRFcG9jaAEOY2FsbGVyQ2hhaW5JZF8EByRtYXRjaDAJAJ8IAQkAuQkCCQDMCAIFEUtFWV9DVVJSRU5UX0VQT0NICQDMCAIJAKQDAQUOY2FsbGVyQ2hhaW5JZF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAARFfc2F2ZUN1cnJlbnRFcG9jaAIOY2FsbGVyQ2hhaW5JZF8EdmFsXwkAzAgCCQEMSW50ZWdlckVudHJ5AgkAuQkCCQDMCAIFEUtFWV9DVVJSRU5UX0VQT0NICQDMCAIJAKQDAQUOY2FsbGVyQ2hhaW5JZF8FA25pbAUJU0VQQVJBVE9SBQR2YWxfBQNuaWwBHF9sb2FkV2F2ZXNFdmVudENhbGxlcklkeFNpemUBDmNhbGxlckNoYWluSWRfBAckbWF0Y2gwCQCfCAEJALkJAgkAzAgCBRZLRVlfV0FWRVNfRVZFTlRfQ0FMTEVSCQDMCAIJAKQDAQUOY2FsbGVyQ2hhaW5JZF8JAMwIAgUIS0VZX1NJWkUFA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAARxfc2F2ZVdhdmVzRXZlbnRDYWxsZXJJZHhTaXplAg5jYWxsZXJDaGFpbklkXwR2YWxfCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQC5CQIJAMwIAgUWS0VZX1dBVkVTX0VWRU5UX0NBTExFUgkAzAgCCQCkAwEFDmNhbGxlckNoYWluSWRfCQDMCAIFCEtFWV9TSVpFBQNuaWwFCVNFUEFSQVRPUgUEdmFsXwUDbmlsARhfbG9hZFdhdmVzRXZlbnRDYWxsZXJJZHgCDmNhbGxlckNoYWluSWRfBGlkeF8EByRtYXRjaDAJAJ8IAQkAuQkCCQDMCAIFFktFWV9XQVZFU19FVkVOVF9DQUxMRVIJAMwIAgkApAMBBQ5jYWxsZXJDaGFpbklkXwkAzAgCCQCkAwEFBGlkeF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAARhfc2F2ZVdhdmVzRXZlbnRDYWxsZXJJZHgDDmNhbGxlckNoYWluSWRfBGlkeF8EdmFsXwkAzAgCCQEMSW50ZWdlckVudHJ5AgkAuQkCCQDMCAIFFktFWV9XQVZFU19FVkVOVF9DQUxMRVIJAMwIAgkApAMBBQ5jYWxsZXJDaGFpbklkXwkAzAgCCQCkAwEFBGlkeF8FA25pbAUJU0VQQVJBVE9SBQR2YWxfBQNuaWwBGl9sb2FkRVZNRXZlbnRDYWxsZXJJZHhTaXplAQ5jYWxsZXJDaGFpbklkXwQHJG1hdGNoMAkAnwgBCQC5CQIJAMwIAgUUS0VZX0VWTV9FVkVOVF9DQUxMRVIJAMwIAgkApAMBBQ5jYWxsZXJDaGFpbklkXwkAzAgCBQhLRVlfU0laRQUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABGl9zYXZlRVZNRXZlbnRDYWxsZXJJZHhTaXplAg5jYWxsZXJDaGFpbklkXwR2YWxfCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQC5CQIJAMwIAgUUS0VZX0VWTV9FVkVOVF9DQUxMRVIJAMwIAgkApAMBBQ5jYWxsZXJDaGFpbklkXwkAzAgCBQhLRVlfU0laRQUDbmlsBQlTRVBBUkFUT1IFBHZhbF8FA25pbAEWX2xvYWRFVk1FdmVudENhbGxlcklkeAIOY2FsbGVyQ2hhaW5JZF8EaWR4XwQHJG1hdGNoMAkAnwgBCQC5CQIJAMwIAgUUS0VZX0VWTV9FVkVOVF9DQUxMRVIJAMwIAgkApAMBBQ5jYWxsZXJDaGFpbklkXwkAzAgCCQCkAwEFBGlkeF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAARZfc2F2ZUVWTUV2ZW50Q2FsbGVySWR4Aw5jYWxsZXJDaGFpbklkXwRpZHhfBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIJALkJAgkAzAgCBRRLRVlfRVZNX0VWRU5UX0NBTExFUgkAzAgCCQCkAwEFDmNhbGxlckNoYWluSWRfCQDMCAIJAKQDAQUEaWR4XwUDbmlsBQlTRVBBUkFUT1IFBHZhbF8FA25pbAEeX2xvYWRXYXZlc0V2ZW50RXhlY3V0b3JJZHhTaXplARFleGVjdXRpb25DaGFpbklkXwQHJG1hdGNoMAkAnwgBCQC5CQIJAMwIAgUYS0VZX1dBVkVTX0VWRU5UX0VYRUNVVE9SCQDMCAIJAKQDAQURZXhlY3V0aW9uQ2hhaW5JZF8JAMwIAgUIS0VZX1NJWkUFA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAAR5fc2F2ZVdhdmVzRXZlbnRFeGVjdXRvcklkeFNpemUCEWV4ZWN1dGlvbkNoYWluSWRfBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIJALkJAgkAzAgCBRhLRVlfV0FWRVNfRVZFTlRfRVhFQ1VUT1IJAMwIAgkApAMBBRFleGVjdXRpb25DaGFpbklkXwkAzAgCBQhLRVlfU0laRQUDbmlsBQlTRVBBUkFUT1IFBHZhbF8FA25pbAEaX2xvYWRXYXZlc0V2ZW50RXhlY3V0b3JJZHgCEWV4ZWN1dGlvbkNoYWluSWRfBGlkeF8EByRtYXRjaDAJAJ8IAQkAuQkCCQDMCAIFGEtFWV9XQVZFU19FVkVOVF9FWEVDVVRPUgkAzAgCCQCkAwEFEWV4ZWN1dGlvbkNoYWluSWRfCQDMCAIJAKQDAQUEaWR4XwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABGl9zYXZlV2F2ZXNFdmVudEV4ZWN1dG9ySWR4AxFleGVjdXRpb25DaGFpbklkXwRpZHhfBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIJALkJAgkAzAgCBRhLRVlfV0FWRVNfRVZFTlRfRVhFQ1VUT1IJAMwIAgkApAMBBRFleGVjdXRpb25DaGFpbklkXwkAzAgCCQCkAwEFBGlkeF8FA25pbAUJU0VQQVJBVE9SBQR2YWxfBQNuaWwBHF9sb2FkRVZNRXZlbnRFeGVjdXRvcklkeFNpemUBEWV4ZWN1dGlvbkNoYWluSWRfBAckbWF0Y2gwCQCfCAEJALkJAgkAzAgCBRZLRVlfRVZNX0VWRU5UX0VYRUNVVE9SCQDMCAIJAKQDAQURZXhlY3V0aW9uQ2hhaW5JZF8JAMwIAgUIS0VZX1NJWkUFA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAARxfc2F2ZUVWTUV2ZW50RXhlY3V0b3JJZHhTaXplAhFleGVjdXRpb25DaGFpbklkXwR2YWxfCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQC5CQIJAMwIAgUWS0VZX0VWTV9FVkVOVF9FWEVDVVRPUgkAzAgCCQCkAwEFEWV4ZWN1dGlvbkNoYWluSWRfCQDMCAIFCEtFWV9TSVpFBQNuaWwFCVNFUEFSQVRPUgUEdmFsXwUDbmlsARhfbG9hZEVWTUV2ZW50RXhlY3V0b3JJZHgCEWV4ZWN1dGlvbkNoYWluSWRfBGlkeF8EByRtYXRjaDAJAJ8IAQkAuQkCCQDMCAIFFktFWV9FVk1fRVZFTlRfRVhFQ1VUT1IJAMwIAgkApAMBBRFleGVjdXRpb25DaGFpbklkXwkAzAgCCQCkAwEFBGlkeF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAARhfc2F2ZUVWTUV2ZW50RXhlY3V0b3JJZHgDEWV4ZWN1dGlvbkNoYWluSWRfBGlkeF8EdmFsXwkAzAgCCQEMSW50ZWdlckVudHJ5AgkAuQkCCQDMCAIFFktFWV9FVk1fRVZFTlRfRVhFQ1VUT1IJAMwIAgkApAMBBRFleGVjdXRpb25DaGFpbklkXwkAzAgCCQCkAwEFBGlkeF8FA25pbAUJU0VQQVJBVE9SBQR2YWxfBQNuaWwBDl9sb2FkV2l0bmVzc2VzAg5jYWxsZXJDaGFpbklkXwZlcG9jaF8EByRtYXRjaDAJAKIIAQkAuQkCCQDMCAIFF0tFWV9XSVRORVNTRVNfUEVSX0VQT0NICQDMCAIJAKQDAQUOY2FsbGVyQ2hhaW5JZF8JAMwIAgkApAMBBQZlcG9jaF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkAtQkCBQFhBQlTRVBBUkFUT1IFA25pbAEOX3NhdmVXaXRuZXNzZXMDDmNhbGxlckNoYWluSWRfBmVwb2NoXwp3aXRuZXNzZXNfCQDMCAIJAQtTdHJpbmdFbnRyeQIJALkJAgkAzAgCBRdLRVlfV0lUTkVTU0VTX1BFUl9FUE9DSAkAzAgCCQCkAwEFDmNhbGxlckNoYWluSWRfCQDMCAIJAKQDAQUGZXBvY2hfBQNuaWwFCVNFUEFSQVRPUgkAuQkCBQp3aXRuZXNzZXNfBQlTRVBBUkFUT1IFA25pbAEXX2xvYWRSZXdhcmRUb2tlbkFkZHJlc3MABAckbWF0Y2gwCQCiCAEFGEtFWV9SRVdBUkRfVE9LRU5fQUREUkVTUwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAARdfc2F2ZVJld2FyZFRva2VuQWRkcmVzcwEEdmFsXwkAzAgCCQELU3RyaW5nRW50cnkCBRhLRVlfUkVXQVJEX1RPS0VOX0FERFJFU1MJAKUIAQUEdmFsXwUDbmlsARFfbG9hZFJld2FyZEFtb3VudAAEByRtYXRjaDAJAJ8IAQURS0VZX1JFV0FSRF9BTU9VTlQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABEV9zYXZlUmV3YXJkQW1vdW50AQR2YWxfCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFLRVlfUkVXQVJEX0FNT1VOVAUEdmFsXwUDbmlsARFfb25seVRoaXNDb250cmFjdAEHY2FsbGVyXwMJAQIhPQIFB2NhbGxlcl8FBHRoaXMJAAIBAhlfb25seVRoaXNDb250cmFjdDogcmV2ZXJ0BgEQX3doZW5NdWx0aXNpZ1NldAADCQAAAgkBDV9sb2FkTXVsdGlzaWcACQEHQWRkcmVzcwEBAAkAAgECGF93aGVuTXVsdGlzaWdTZXQ6IHJldmVydAYBE193aGVuTm90SW5pdGlhbGl6ZWQAAwkBCV9sb2FkSW5pdAAJAAIBAhtfd2hlbk5vdEluaXRpYWxpemVkOiByZXZlcnQGARBfd2hlbkluaXRpYWxpemVkAAMJAQEhAQkBCV9sb2FkSW5pdAAJAAIBAhhfd2hlbkluaXRpYWxpemVkOiByZXZlcnQGARBfaXNBY3RpdmVXaXRuZXNzAwpwdWJsaWNLZXlfC3B1YmxpY0tleXNfBGVycl8DCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCBQtwdWJsaWNLZXlzXwUKcHVibGljS2V5XwkAAgEFBGVycl8GARdfbm90Q29uZmlybWVkV2F2ZXNFdmVudAIKZXZlbnRIYXNoXwRlcnJfAwkAZgIJARVfbG9hZFdhdmVzRXZlbnRTdGF0dXMBBQpldmVudEhhc2hfBRdFVkVOVF9TVEFUVVNfUFJPQ0VTU0lORwkAAgEFBGVycl8GARVfbm90Q29uZmlybWVkRVZNRXZlbnQCCmV2ZW50SGFzaF8EZXJyXwMJAAACCQETX2xvYWRFVk1FdmVudFN0YXR1cwEFCmV2ZW50SGFzaF8FFkVWRU5UX1NUQVRVU19DT05GSVJNRUQHBgETX3dhdmVzRXZlbnROb3RFeGlzdAIKZXZlbnRIYXNoXwRlcnJfAwkBAiE9AgkBFV9sb2FkV2F2ZXNFdmVudFN0YXR1cwEFCmV2ZW50SGFzaF8AAAkAAgEFBGVycl8GARFfZXZtRXZlbnROb3RFeGlzdAIKZXZlbnRIYXNoXwRlcnJfAwkBAiE9AgkBE19sb2FkRVZNRXZlbnRTdGF0dXMBBQpldmVudEhhc2hfAAAJAAIBBQRlcnJfBgEgX25vdFB1Ymxpc2hlZFdhdmVzRXZlbnRCeVdpdG5lc3MDCnB1YmxpY0tleV8IZXZlbnRJZF8EZXJyXwMJAQIhPQIJASFfbG9hZFB1Ymxpc2hlZFdhdmVzRXZlbnRCeVdpdG5lc3MCBQpwdWJsaWNLZXlfBQhldmVudElkXwAACQACAQUEZXJyXwYBHl9ub3RQdWJsaXNoZWRFVk1FdmVudEJ5V2l0bmVzcwMKcHVibGljS2V5XwhldmVudElkXwRlcnJfAwkAZgIJAR9fbG9hZFB1Ymxpc2hlZEVWTUV2ZW50QnlXaXRuZXNzAgUKcHVibGljS2V5XwUIZXZlbnRJZF8AAAkAAgEFBGVycl8GARBfaXNRdW9ydW1SZWFjaGVkAw5jb25maXJtYXRpb25zXwZ0b3RhbF8Md2l0bmVzc1NpemVfAwMJAGYCBQ5jb25maXJtYXRpb25zXwkAaQIFDHdpdG5lc3NTaXplXwACBgkAZgIJAGUCBQZ0b3RhbF8FDmNvbmZpcm1hdGlvbnNfCQBpAgUMd2l0bmVzc1NpemVfAAIGBwEPX2dldEV2ZW50U3RhdHVzAw5jb25maXJtYXRpb25zXwZ0b3RhbF8Md2l0bmVzc1NpemVfAwkAZgIFDmNvbmZpcm1hdGlvbnNfCQBpAgUMd2l0bmVzc1NpemVfAAIFFkVWRU5UX1NUQVRVU19DT05GSVJNRUQDCQBmAgkAZQIFBnRvdGFsXwUOY29uZmlybWF0aW9uc18JAGkCBQx3aXRuZXNzU2l6ZV8AAgUVRVZFTlRfU1RBVFVTX1JFSkVDVEVEBRdFVkVOVF9TVEFUVVNfUFJPQ0VTU0lORwETX2NhbGNXYXZlc0V2ZW50SGFzaAEGZXZlbnRfBApldmVudEJ5dGVzCQDLAQIJAMsBAgkAywECCQDLAQIJAMsBAgkAywECCQDLAQIJAMsBAgkAmgMBCAUGZXZlbnRfAl8xCQCaAwEIBQZldmVudF8CXzIJAJoDAQgFBmV2ZW50XwJfMwkAmwMBCAUGZXZlbnRfAl80CQCbAwEIBQZldmVudF8CXzUJAJsDAQgFBmV2ZW50XwJfNgkAmwMBCQC5CQIIBQZldmVudF8CXzcFDkFSR1NfU0VQQVJBVE9SCQCbAwEIBQZldmVudF8CXzgJAJoDAQgFBmV2ZW50XwJfOQkA2AQBCQCMFQEFCmV2ZW50Qnl0ZXMBEV9jYWxjRVZNRXZlbnRIYXNoAQZldmVudF8ECmV2ZW50Qnl0ZXMJAMsBAgkAywECCQDLAQIJAMsBAgkAywECCQDLAQIJAMsBAgkAmgMBCAUGZXZlbnRfAl8xCQCaAwEIBQZldmVudF8CXzIJAJoDAQgFBmV2ZW50XwJfMwkAmwMBCAUGZXZlbnRfAl80CQCbAwEIBQZldmVudF8CXzUJAJsDAQgFBmV2ZW50XwJfNgkAmwMBCAUGZXZlbnRfAl83CQCaAwEIBQZldmVudF8CXzgJANgEAQkAjBUBBQpldmVudEJ5dGVzARJfc2V0V2F2ZXNFdmVudEhhc2gCBmV2ZW50XwVoYXNoXwkAoAoOCAUGZXZlbnRfAl8xCAUGZXZlbnRfAl8yCAUGZXZlbnRfAl8zCAUGZXZlbnRfAl80CAUGZXZlbnRfAl81CAUGZXZlbnRfAl82CAUGZXZlbnRfAl83CAUGZXZlbnRfAl84CAUGZXZlbnRfAl85BQVoYXNoXwgFBmV2ZW50XwNfMTEIBQZldmVudF8DXzEyCAUGZXZlbnRfA18xMwgFBmV2ZW50XwNfMTQBEF9zZXRFVk1FdmVudEhhc2gCBmV2ZW50XwVoYXNoXwkAnwoNCAUGZXZlbnRfAl8xCAUGZXZlbnRfAl8yCAUGZXZlbnRfAl8zCAUGZXZlbnRfAl80CAUGZXZlbnRfAl81CAUGZXZlbnRfAl82CAUGZXZlbnRfAl83CAUGZXZlbnRfAl84BQVoYXNoXwgFBmV2ZW50XwNfMTAIBQZldmVudF8DXzExCAUGZXZlbnRfA18xMggFBmV2ZW50XwNfMTMBG19zZXRXYXZlc0V2ZW50Q29uZmlybWF0aW9ucwMGZXZlbnRfDmNvbmZpcm1hdGlvbnNfBnRvdGFsXwkAoAoOCAUGZXZlbnRfAl8xCAUGZXZlbnRfAl8yCAUGZXZlbnRfAl8zCAUGZXZlbnRfAl80CAUGZXZlbnRfAl81CAUGZXZlbnRfAl82CAUGZXZlbnRfAl83CAUGZXZlbnRfAl84CAUGZXZlbnRfAl85CAUGZXZlbnRfA18xMAUOY29uZmlybWF0aW9uc18FBnRvdGFsXwgFBmV2ZW50XwNfMTMIBQZldmVudF8DXzE0ARlfc2V0RVZNRXZlbnRDb25maXJtYXRpb25zAwZldmVudF8OY29uZmlybWF0aW9uc18GdG90YWxfCQCfCg0IBQZldmVudF8CXzEIBQZldmVudF8CXzIIBQZldmVudF8CXzMIBQZldmVudF8CXzQIBQZldmVudF8CXzUIBQZldmVudF8CXzYIBQZldmVudF8CXzcIBQZldmVudF8CXzgIBQZldmVudF8CXzkFDmNvbmZpcm1hdGlvbnNfBQZ0b3RhbF8IBQZldmVudF8DXzEyCAUGZXZlbnRfA18xMwkBaQEEaW5pdAMVcHJveHlTZWNEZXBvUGVyRXZlbnRfE3Jld2FyZFRva2VuQWRkcmVzc18NcmV3YXJkQW1vdW50XwQDZXJyAwMDAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBE193aGVuTm90SW5pdGlhbGl6ZWQABwkBEF93aGVuTXVsdGlzaWdTZXQABwkBDF92YWxpZGF0ZUludAQFFXByb3h5U2VjRGVwb1BlckV2ZW50XwAABQdNQVhfSU5UAiJpbml0OiBpbnZhbGlkIHByb3h5U2VjRGVwb1BlckV2ZW50BwkBEF92YWxpZGF0ZUFkZHJlc3MCBRNyZXdhcmRUb2tlbkFkZHJlc3NfAiBpbml0OiBpbnZhbGlkIHJld2FyZFRva2VuQWRkcmVzcwcJAQxfdmFsaWRhdGVJbnQEBQ1yZXdhcmRBbW91bnRfAAAFB01BWF9JTlQCGmluaXQ6IGludmFsaWQgcmV3YXJkQW1vdW50BwMJAAACBQNlcnIFA2VycgkAlAoCCQDOCAIJAM4IAgkAzggCCQEJX3NhdmVJbml0AQYJARlfc2F2ZVByb3h5U2VjRGVwb1BlckV2ZW50AQUVcHJveHlTZWNEZXBvUGVyRXZlbnRfCQEXX3NhdmVSZXdhcmRUb2tlbkFkZHJlc3MBCQERQGV4dHJOYXRpdmUoMTA2MikBBRNyZXdhcmRUb2tlbkFkZHJlc3NfCQERX3NhdmVSZXdhcmRBbW91bnQBBQ1yZXdhcmRBbW91bnRfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEnNldEFjdGl2ZVdpdG5lc3NlcwIOY2FsbGVyQ2hhaW5JZF8Kd2l0bmVzc2VzXwQDZXJyAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBE192YWxpZGF0ZVB1YmxpY0tleXMCBQp3aXRuZXNzZXNfAiVzZXRBY3RpdmVXaXRuZXNzZXM6IGludmFsaWQgd2l0bmVzc2VzBwMJAAACBQNlcnIFA2VycgQFZXBvY2gJARFfbG9hZEN1cnJlbnRFcG9jaAEFDmNhbGxlckNoYWluSWRfCQCUCgIJAM4IAgkBEV9zYXZlQ3VycmVudEVwb2NoAgUOY2FsbGVyQ2hhaW5JZF8JAGQCBQVlcG9jaAABCQEOX3NhdmVXaXRuZXNzZXMDBQ5jYWxsZXJDaGFpbklkXwkAZAIFBWVwb2NoAAEFCndpdG5lc3Nlc18FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEUc3VibWl0V2F2ZXNDYWxsRXZlbnQJDmNhbGxlckNoYWluSWRfEWV4ZWN1dGlvbkNoYWluSWRfBm5vbmNlXwdjYWxsZXJfEmV4ZWN1dGlvbkNvbnRyYWN0Xw1mdW5jdGlvbk5hbWVfBWFyZ3NfB3R4SGFzaF8MYmxvY2tOdW1iZXJfBANlcnIDAwMDAwMDCQEMX3ZhbGlkYXRlSW50BAUOY2FsbGVyQ2hhaW5JZF8AAAUHTUFYX0lOVAIrc3VibWl0V2F2ZXNDYWxsRXZlbnQ6IGludmFsaWQgY2FsbGVyQ2hhaW5JZAkBDF92YWxpZGF0ZUludAQFEWV4ZWN1dGlvbkNoYWluSWRfAAAFB01BWF9JTlQCLnN1Ym1pdFdhdmVzQ2FsbEV2ZW50OiBpbnZhbGlkIGV4ZWN1dGlvbkNoYWluSWQHCQEMX3ZhbGlkYXRlSW50BAUGbm9uY2VfAAAFB01BWF9JTlQCI3N1Ym1pdFdhdmVzQ2FsbEV2ZW50OiBpbnZhbGlkIG5vbmNlBwkBD192YWxpZGF0ZVN0cmluZwIFB2NhbGxlcl8CJHN1Ym1pdFdhdmVzQ2FsbEV2ZW50OiBpbnZhbGlkIGNhbGxlcgcJAQ9fdmFsaWRhdGVTdHJpbmcCBRJleGVjdXRpb25Db250cmFjdF8CL3N1Ym1pdFdhdmVzQ2FsbEV2ZW50OiBpbnZhbGlkIGV4ZWN1dGlvbkNvbnRyYWN0BwkBD192YWxpZGF0ZVN0cmluZwIFDWZ1bmN0aW9uTmFtZV8CKnN1Ym1pdFdhdmVzQ2FsbEV2ZW50OiBpbnZhbGlkIGZ1bmN0aW9uTmFtZQcJAQ9fdmFsaWRhdGVTdHJpbmcCBQd0eEhhc2hfAiRzdWJtaXRXYXZlc0NhbGxFdmVudDogaW52YWxpZCB0eEhhc2gHCQEMX3ZhbGlkYXRlSW50BAUMYmxvY2tOdW1iZXJfAAAFB01BWF9JTlQCKXN1Ym1pdFdhdmVzQ2FsbEV2ZW50OiBpbnZhbGlkIGJsb2NrTnVtYmVyBwMJAAACBQNlcnIFA2VycgQMcHJveHlTZWNEZXBvCQERX2xvYWRQcm94eVNlY0RlcG8BCAUBaQZjYWxsZXIEFHByb3h5U2VjRGVwb1BlckV2ZW50CQEZX2xvYWRQcm94eVNlY0RlcG9QZXJFdmVudAAEE3Byb3h5U2VjRGVwb1VwZGF0ZWQJAGUCBQxwcm94eVNlY0RlcG8FFHByb3h5U2VjRGVwb1BlckV2ZW50BAVldmVudAkAoAoOBQ5jYWxsZXJDaGFpbklkXwURZXhlY3V0aW9uQ2hhaW5JZF8FBm5vbmNlXwUHY2FsbGVyXwUSZXhlY3V0aW9uQ29udHJhY3RfBQ1mdW5jdGlvbk5hbWVfBQVhcmdzXwUHdHhIYXNoXwUMYmxvY2tOdW1iZXJfAgAAAAAABRRwcm94eVNlY0RlcG9QZXJFdmVudAgFAWkGY2FsbGVyBAlldmVudFNpemUJARNfbG9hZFdhdmVzRXZlbnRTaXplAAQJZXZlbnRIYXNoCQETX2NhbGNXYXZlc0V2ZW50SGFzaAEFBWV2ZW50BAxldmVudFVwZGF0ZWQJARJfc2V0V2F2ZXNFdmVudEhhc2gCBQVldmVudAUJZXZlbnRIYXNoBARlcnIxAwkBE193YXZlc0V2ZW50Tm90RXhpc3QCBQlldmVudEhhc2gCJHN1Ym1pdFdhdmVzQ2FsbEV2ZW50OiBhbHJlYWR5IGV4aXN0cwkBDF92YWxpZGF0ZUludAQFE3Byb3h5U2VjRGVwb1VwZGF0ZWQAAAUHTUFYX0lOVAIpc3VibWl0V2F2ZXNDYWxsRXZlbnQ6IG5vIHNlY3VyaXR5IGRlcG9zaXQHAwkAAAIFBGVycjEFBGVycjEEDWNhbGxlcklkeFNpemUJARxfbG9hZFdhdmVzRXZlbnRDYWxsZXJJZHhTaXplAQUOY2FsbGVyQ2hhaW5JZF8JAJQKAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJARFfc2F2ZVByb3h5U2VjRGVwbwIIBQFpBmNhbGxlcgUTcHJveHlTZWNEZXBvVXBkYXRlZAkBD19zYXZlV2F2ZXNFdmVudAIFCWV2ZW50U2l6ZQUMZXZlbnRVcGRhdGVkCQEVX3NhdmVXYXZlc0V2ZW50U3RhdHVzAgUJZXZlbnRIYXNoBRdFVkVOVF9TVEFUVVNfUFJPQ0VTU0lORwkBE19zYXZlV2F2ZXNFdmVudFNpemUBCQBkAgUJZXZlbnRTaXplAAEJARhfc2F2ZVdhdmVzRXZlbnRDYWxsZXJJZHgDBQ5jYWxsZXJDaGFpbklkXwUNY2FsbGVySWR4U2l6ZQUJZXZlbnRTaXplCQEcX3NhdmVXYXZlc0V2ZW50Q2FsbGVySWR4U2l6ZQIFDmNhbGxlckNoYWluSWRfCQBkAgUNY2FsbGVySWR4U2l6ZQABBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEnN1Ym1pdEVWTUNhbGxFdmVudAgOY2FsbGVyQ2hhaW5JZF8RZXhlY3V0aW9uQ2hhaW5JZF8Gbm9uY2VfB2NhbGxlcl8SZXhlY3V0aW9uQ29udHJhY3RfCWNhbGxkYXRhXwd0eEhhc2hfDGJsb2NrTnVtYmVyXwQDZXJyAwMDAwMDAwkBDF92YWxpZGF0ZUludAQFDmNhbGxlckNoYWluSWRfAAAFB01BWF9JTlQCKXN1Ym1pdEVWTUNhbGxFdmVudDogaW52YWxpZCBjYWxsZXJDaGFpbklkCQEMX3ZhbGlkYXRlSW50BAURZXhlY3V0aW9uQ2hhaW5JZF8AAAUHTUFYX0lOVAIsc3VibWl0RVZNQ2FsbEV2ZW50OiBpbnZhbGlkIGV4ZWN1dGlvbkNoYWluSWQHCQEMX3ZhbGlkYXRlSW50BAUGbm9uY2VfAAAFB01BWF9JTlQCIXN1Ym1pdEVWTUNhbGxFdmVudDogaW52YWxpZCBub25jZQcJAQ9fdmFsaWRhdGVTdHJpbmcCBQdjYWxsZXJfAiJzdWJtaXRFVk1DYWxsRXZlbnQ6IGludmFsaWQgY2FsbGVyBwkBD192YWxpZGF0ZVN0cmluZwIFEmV4ZWN1dGlvbkNvbnRyYWN0XwItc3VibWl0RVZNQ2FsbEV2ZW50OiBpbnZhbGlkIGV4ZWN1dGlvbkNvbnRyYWN0BwkBD192YWxpZGF0ZVN0cmluZwIFCWNhbGxkYXRhXwIoc3VibWl0RVZNQ2FsbEV2ZW50OiBpbnZhbGlkIGZ1bmN0aW9uTmFtZQcJAQ9fdmFsaWRhdGVTdHJpbmcCBQd0eEhhc2hfAiJzdWJtaXRFVk1DYWxsRXZlbnQ6IGludmFsaWQgdHhIYXNoBwkBDF92YWxpZGF0ZUludAQFDGJsb2NrTnVtYmVyXwAABQdNQVhfSU5UAidzdWJtaXRFVk1DYWxsRXZlbnQ6IGludmFsaWQgYmxvY2tOdW1iZXIHAwkAAAIFA2VycgUDZXJyBAxwcm94eVNlY0RlcG8JARFfbG9hZFByb3h5U2VjRGVwbwEIBQFpBmNhbGxlcgQUcHJveHlTZWNEZXBvUGVyRXZlbnQJARlfbG9hZFByb3h5U2VjRGVwb1BlckV2ZW50AAQTcHJveHlTZWNEZXBvVXBkYXRlZAkAZQIFDHByb3h5U2VjRGVwbwUUcHJveHlTZWNEZXBvUGVyRXZlbnQEBWV2ZW50CQCfCg0FDmNhbGxlckNoYWluSWRfBRFleGVjdXRpb25DaGFpbklkXwUGbm9uY2VfBQdjYWxsZXJfBRJleGVjdXRpb25Db250cmFjdF8FCWNhbGxkYXRhXwUHdHhIYXNoXwUMYmxvY2tOdW1iZXJfAgAAAAAABRRwcm94eVNlY0RlcG9QZXJFdmVudAgFAWkGY2FsbGVyBAlldmVudFNpemUJARFfbG9hZEVWTUV2ZW50U2l6ZQAECWV2ZW50SGFzaAkBEV9jYWxjRVZNRXZlbnRIYXNoAQUFZXZlbnQEDGV2ZW50VXBkYXRlZAkBEF9zZXRFVk1FdmVudEhhc2gCBQVldmVudAUJZXZlbnRIYXNoBARlcnIxAwkBEV9ldm1FdmVudE5vdEV4aXN0AgUJZXZlbnRIYXNoAiJzdWJtaXRFVk1DYWxsRXZlbnQ6IGFscmVhZHkgZXhpc3RzCQEMX3ZhbGlkYXRlSW50BAUTcHJveHlTZWNEZXBvVXBkYXRlZAAABQdNQVhfSU5UAidzdWJtaXRFVk1DYWxsRXZlbnQ6IG5vIHNlY3VyaXR5IGRlcG9zaXQHAwkAAAIFBGVycjEFBGVycjEEDWNhbGxlcklkeFNpemUJARpfbG9hZEVWTUV2ZW50Q2FsbGVySWR4U2l6ZQEFDmNhbGxlckNoYWluSWRfCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQERX3NhdmVQcm94eVNlY0RlcG8CCAUBaQZjYWxsZXIFE3Byb3h5U2VjRGVwb1VwZGF0ZWQJAQ1fc2F2ZUVWTUV2ZW50AgUJZXZlbnRTaXplBQxldmVudFVwZGF0ZWQJARNfc2F2ZUVWTUV2ZW50U3RhdHVzAgUJZXZlbnRIYXNoBRdFVkVOVF9TVEFUVVNfUFJPQ0VTU0lORwkBEV9zYXZlRVZNRXZlbnRTaXplAQkAZAIFCWV2ZW50U2l6ZQABCQEWX3NhdmVFVk1FdmVudENhbGxlcklkeAMFDmNhbGxlckNoYWluSWRfBQ1jYWxsZXJJZHhTaXplBQlldmVudFNpemUJARpfc2F2ZUVWTUV2ZW50Q2FsbGVySWR4U2l6ZQIFDmNhbGxlckNoYWluSWRfCQBkAgUNY2FsbGVySWR4U2l6ZQABBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBF3B1Ymxpc2hXYXZlc0V2ZW50U3RhdHVzAglldmVudElkeF8Hc3RhdHVzXwQJZXZlbnRTaXplCQETX2xvYWRXYXZlc0V2ZW50U2l6ZQAED2NhbGxlclB1YmxpY0tleQkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkEA2VycgMJARFfdmFsaWRhdGVFdmVudElkeAMFCWV2ZW50SWR4XwUJZXZlbnRTaXplAipwdWJsaXNoV2F2ZXNFdmVudFN0YXR1czogaW52YWxpZCBldmVudCBpZHgJARRfdmFsaWRhdGVFdmVudFN0YXR1cwIFB3N0YXR1c18CJ3B1Ymxpc2hXYXZlc0V2ZW50U3RhdHVzOiBpbnZhbGlkIHN0YXR1cwcDCQAAAgUDZXJyBQNlcnIEBWV2ZW50CQEPX2xvYWRXYXZlc0V2ZW50AQUJZXZlbnRJZHhfBA1jYWxsZXJDaGFpbklkCAUFZXZlbnQCXzEEEGV4ZWN1dGlvbkNoYWluSWQIBQVldmVudAJfMgQJZXZlbnRIYXNoCAUFZXZlbnQDXzEwBBJldmVudENvbmZpcm1hdGlvbnMIBQVldmVudANfMTEECmV2ZW50VG90YWwIBQVldmVudANfMTIEDHByb3h5U2VjRGVwbwgFBWV2ZW50A18xMwQFcHJveHkIBQVldmVudANfMTQEBWVwb2NoCQERX2xvYWRDdXJyZW50RXBvY2gBBQ1jYWxsZXJDaGFpbklkBA9hY3RpdmVXaXRuZXNzZXMJAQ5fbG9hZFdpdG5lc3NlcwIFDWNhbGxlckNoYWluSWQFBWVwb2NoBARlcnIxAwMJARBfaXNBY3RpdmVXaXRuZXNzAwkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkFD2FjdGl2ZVdpdG5lc3NlcwIncHVibGlzaFdhdmVzRXZlbnRTdGF0dXM6IGludmFsaWQgY2FsbGVyCQEXX25vdENvbmZpcm1lZFdhdmVzRXZlbnQCBQlldmVudEhhc2gCMHB1Ymxpc2hXYXZlc0V2ZW50U3RhdHVzOiBldmVudCBhbHJlYWR5IGNvbmZpcm1lZAcJASBfbm90UHVibGlzaGVkV2F2ZXNFdmVudEJ5V2l0bmVzcwMFD2NhbGxlclB1YmxpY0tleQUJZXZlbnRJZHhfAipwdWJsaXNoV2F2ZXNFdmVudFN0YXR1czogYWxyZWFkeSBwdWJsaXNoZWQHAwkAAAIFBGVycjEFBGVycjEEDGV2ZW50VXBkYXRlZAMJAAACBQdzdGF0dXNfBRZFVkVOVF9TVEFUVVNfQ09ORklSTUVECQEbX3NldFdhdmVzRXZlbnRDb25maXJtYXRpb25zAwUFZXZlbnQJAGQCBRJldmVudENvbmZpcm1hdGlvbnMAAQkAZAIFCmV2ZW50VG90YWwAAQMJAAACBQdzdGF0dXNfBRVFVkVOVF9TVEFUVVNfUkVKRUNURUQJARtfc2V0V2F2ZXNFdmVudENvbmZpcm1hdGlvbnMDBQVldmVudAUSZXZlbnRDb25maXJtYXRpb25zCQBkAgUKZXZlbnRUb3RhbAABCQACAQIpcHVibGlzaFdhdmVzRXZlbnRTdGF0dXM6IGluY29ycmVjdCBzdGF0dXMED2V4ZWN1dG9ySWR4U2l6ZQkBHl9sb2FkV2F2ZXNFdmVudEV4ZWN1dG9ySWR4U2l6ZQEFEGV4ZWN1dGlvbkNoYWluSWQEDGZpbmFsaXphdGlvbgMJARBfaXNRdW9ydW1SZWFjaGVkAwgFDGV2ZW50VXBkYXRlZANfMTEIBQxldmVudFVwZGF0ZWQDXzEyCQCQAwEFD2FjdGl2ZVdpdG5lc3NlcwQGc3RhdHVzCQEPX2dldEV2ZW50U3RhdHVzAwgFDGV2ZW50VXBkYXRlZANfMTEIBQxldmVudFVwZGF0ZWQDXzEyCQCQAwEFD2FjdGl2ZVdpdG5lc3NlcwQTcHJveHlTZWNEZXBvVXBkYXRlZAMJAAACBQZzdGF0dXMFFkVWRU5UX1NUQVRVU19DT05GSVJNRUQJARFfc2F2ZVByb3h5U2VjRGVwbwIFBXByb3h5CQBkAgkBEV9sb2FkUHJveHlTZWNEZXBvAQUFcHJveHkFDHByb3h5U2VjRGVwbwMJAAACBQZzdGF0dXMFFUVWRU5UX1NUQVRVU19SRUpFQ1RFRAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQENX2xvYWRNdWx0aXNpZwAFDHByb3h5U2VjRGVwbwUEdW5pdAUDbmlsBQNuaWwED3Jld2FyZEFkZHJlc3NlcwkAzAgCCQClCAEFBXByb3h5CQEVX3B1YmxpY0tleXNUb0FkZHJzU3RyAQUPYWN0aXZlV2l0bmVzc2VzBBB3aXRuZXNzZXNSZXdhcmRzCQD8BwQJARdfbG9hZFJld2FyZFRva2VuQWRkcmVzcwAFDkZVTkNfTUlOVF9NQU5ZCQDMCAIJARFfbG9hZFJld2FyZEFtb3VudAAJAMwIAgUPcmV3YXJkQWRkcmVzc2VzBQNuaWwFA25pbAMJAAACBRB3aXRuZXNzZXNSZXdhcmRzBRB3aXRuZXNzZXNSZXdhcmRzCQDOCAIJAM4IAgkAzggCBRNwcm94eVNlY0RlcG9VcGRhdGVkCQEVX3NhdmVXYXZlc0V2ZW50U3RhdHVzAgUJZXZlbnRIYXNoBQZzdGF0dXMJARpfc2F2ZVdhdmVzRXZlbnRFeGVjdXRvcklkeAMFEGV4ZWN1dGlvbkNoYWluSWQFD2V4ZWN1dG9ySWR4U2l6ZQUJZXZlbnRJZHhfCQEeX3NhdmVXYXZlc0V2ZW50RXhlY3V0b3JJZHhTaXplAgUQZXhlY3V0aW9uQ2hhaW5JZAkAZAIFD2V4ZWN1dG9ySWR4U2l6ZQABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwJAJQKAgkAzggCCQDOCAIJAQ9fc2F2ZVdhdmVzRXZlbnQCBQlldmVudElkeF8FDGV2ZW50VXBkYXRlZAkBIV9zYXZlUHVibGlzaGVkV2F2ZXNFdmVudEJ5V2l0bmVzcwMFD2NhbGxlclB1YmxpY0tleQUJZXZlbnRJZHhfBQdzdGF0dXNfBQxmaW5hbGl6YXRpb24FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEVcHVibGlzaEVWTUV2ZW50U3RhdHVzAglldmVudElkeF8Hc3RhdHVzXwQJZXZlbnRTaXplCQERX2xvYWRFVk1FdmVudFNpemUABA9jYWxsZXJQdWJsaWNLZXkJANgEAQgFAWkPY2FsbGVyUHVibGljS2V5BANlcnIDCQERX3ZhbGlkYXRlRXZlbnRJZHgDBQlldmVudElkeF8FCWV2ZW50U2l6ZQIocHVibGlzaEVWTUV2ZW50U3RhdHVzOiBpbnZhbGlkIGV2ZW50IGlkeAkBFF92YWxpZGF0ZUV2ZW50U3RhdHVzAgUHc3RhdHVzXwIlcHVibGlzaEVWTUV2ZW50U3RhdHVzOiBpbnZhbGlkIHN0YXR1cwcDCQAAAgUDZXJyBQNlcnIEBWV2ZW50CQENX2xvYWRFVk1FdmVudAEFCWV2ZW50SWR4XwQNY2FsbGVyQ2hhaW5JZAgFBWV2ZW50Al8xBBBleGVjdXRpb25DaGFpbklkCAUFZXZlbnQCXzIECWV2ZW50SGFzaAgFBWV2ZW50Al85BBJldmVudENvbmZpcm1hdGlvbnMIBQVldmVudANfMTAECmV2ZW50VG90YWwIBQVldmVudANfMTEEDHByb3h5U2VjRGVwbwgFBWV2ZW50A18xMgQFcHJveHkIBQVldmVudANfMTMEBWVwb2NoCQERX2xvYWRDdXJyZW50RXBvY2gBBQ1jYWxsZXJDaGFpbklkBA9hY3RpdmVXaXRuZXNzZXMJAQ5fbG9hZFdpdG5lc3NlcwIFDWNhbGxlckNoYWluSWQFBWVwb2NoBARlcnIxAwMJARBfaXNBY3RpdmVXaXRuZXNzAwkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkFD2FjdGl2ZVdpdG5lc3NlcwIlcHVibGlzaEVWTUV2ZW50U3RhdHVzOiBpbnZhbGlkIGNhbGxlcgkBFV9ub3RDb25maXJtZWRFVk1FdmVudAIFCWV2ZW50SGFzaAIucHVibGlzaEVWTUV2ZW50U3RhdHVzOiBldmVudCBhbHJlYWR5IGNvbmZpcm1lZAcJAR5fbm90UHVibGlzaGVkRVZNRXZlbnRCeVdpdG5lc3MDBQ9jYWxsZXJQdWJsaWNLZXkFCWV2ZW50SWR4XwIocHVibGlzaEVWTUV2ZW50U3RhdHVzOiBhbHJlYWR5IHB1Ymxpc2hlZAcDCQAAAgUEZXJyMQUEZXJyMQQMZXZlbnRVcGRhdGVkAwkAAAIFB3N0YXR1c18FFkVWRU5UX1NUQVRVU19DT05GSVJNRUQJARlfc2V0RVZNRXZlbnRDb25maXJtYXRpb25zAwUFZXZlbnQJAGQCBRJldmVudENvbmZpcm1hdGlvbnMAAQkAZAIFCmV2ZW50VG90YWwAAQMJAAACBQdzdGF0dXNfBRVFVkVOVF9TVEFUVVNfUkVKRUNURUQJARlfc2V0RVZNRXZlbnRDb25maXJtYXRpb25zAwUFZXZlbnQFEmV2ZW50Q29uZmlybWF0aW9ucwkAZAIFCmV2ZW50VG90YWwAAQkAAgECJ3B1Ymxpc2hFVk1FdmVudFN0YXR1czogaW5jb3JyZWN0IHN0YXR1cwQPZXhlY3V0b3JJZHhTaXplCQEcX2xvYWRFVk1FdmVudEV4ZWN1dG9ySWR4U2l6ZQEFEGV4ZWN1dGlvbkNoYWluSWQEDGZpbmFsaXphdGlvbgMJARBfaXNRdW9ydW1SZWFjaGVkAwgFDGV2ZW50VXBkYXRlZANfMTEIBQxldmVudFVwZGF0ZWQDXzEyCQCQAwEFD2FjdGl2ZVdpdG5lc3NlcwQGc3RhdHVzCQEPX2dldEV2ZW50U3RhdHVzAwgFDGV2ZW50VXBkYXRlZANfMTEIBQxldmVudFVwZGF0ZWQDXzEyCQCQAwEFD2FjdGl2ZVdpdG5lc3NlcwQTcHJveHlTZWNEZXBvVXBkYXRlZAMJAAACBQZzdGF0dXMFFkVWRU5UX1NUQVRVU19DT05GSVJNRUQJARFfc2F2ZVByb3h5U2VjRGVwbwIFBXByb3h5CQBkAgkBEV9sb2FkUHJveHlTZWNEZXBvAQUFcHJveHkFDHByb3h5U2VjRGVwbwMJAAACBQZzdGF0dXMFFUVWRU5UX1NUQVRVU19SRUpFQ1RFRAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQENX2xvYWRNdWx0aXNpZwAFDHByb3h5U2VjRGVwbwUEdW5pdAUDbmlsBQNuaWwED3Jld2FyZEFkZHJlc3NlcwkAzAgCCQClCAEFBXByb3h5CQEVX3B1YmxpY0tleXNUb0FkZHJzU3RyAQUPYWN0aXZlV2l0bmVzc2VzBBB3aXRuZXNzZXNSZXdhcmRzCQD8BwQJARdfbG9hZFJld2FyZFRva2VuQWRkcmVzcwAFDkZVTkNfTUlOVF9NQU5ZCQDMCAIJARFfbG9hZFJld2FyZEFtb3VudAAJAMwIAgUPcmV3YXJkQWRkcmVzc2VzBQNuaWwFA25pbAMJAAACBRB3aXRuZXNzZXNSZXdhcmRzBRB3aXRuZXNzZXNSZXdhcmRzCQDOCAIJAM4IAgkAzggCBRNwcm94eVNlY0RlcG9VcGRhdGVkCQETX3NhdmVFVk1FdmVudFN0YXR1cwIFCWV2ZW50SGFzaAUGc3RhdHVzCQEYX3NhdmVFVk1FdmVudEV4ZWN1dG9ySWR4AwUQZXhlY3V0aW9uQ2hhaW5JZAUPZXhlY3V0b3JJZHhTaXplBQlldmVudElkeF8JARxfc2F2ZUVWTUV2ZW50RXhlY3V0b3JJZHhTaXplAgUQZXhlY3V0aW9uQ2hhaW5JZAkAZAIFD2V4ZWN1dG9ySWR4U2l6ZQABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwJAJQKAgkAzggCCQDOCAIJAQ1fc2F2ZUVWTUV2ZW50AgUJZXZlbnRJZHhfBQxldmVudFVwZGF0ZWQJAR9fc2F2ZVB1Ymxpc2hlZEVWTUV2ZW50QnlXaXRuZXNzAwUPY2FsbGVyUHVibGljS2V5BQlldmVudElkeF8FB3N0YXR1c18FDGZpbmFsaXphdGlvbgUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARdhZGRQcm94eVNlY3VyaXR5RGVwb3NpdAEKcmVjaXBpZW50XwQJcmVjaXBpZW50AwkAAAIFCnJlY2lwaWVudF8CAAkApQgBCAUBaQZjYWxsZXIFCnJlY2lwaWVudF8EA2VycgMDCQEQX3ZhbGlkYXRlQWRkcmVzcwIFCXJlY2lwaWVudAIqYWRkUHJveHlTZWN1cml0eURlcG9zaXQ6IGludmFsaWQgcmVjaXBpZW50CQEVX3ZhbGlkYXRlUGF5bWVudHNTaXplAwgFAWkIcGF5bWVudHMAAQIjYWRkUHJveHlTZWN1cml0eURlcG9zaXQ6IG5vIHBheW1lbnQHCQEVX3ZhbGlkYXRlUGF5bWVudEFzc2V0AwkAkQMCCAUBaQhwYXltZW50cwAABQR1bml0AiZhZGRQcm94eVNlY3VyaXR5RGVwb3NpdDogaW52YWxpZCBhc3NldAcDCQAAAgUDZXJyBQNlcnIEDXJlY2lwaWVudEFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCXJlY2lwaWVudAQHYmFsYW5jZQkBEV9sb2FkUHJveHlTZWNEZXBvAQUNcmVjaXBpZW50QWRkcgQOdXBkYXRlZEJhbGFuY2UJAGQCBQdiYWxhbmNlCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAlAoCCQERX3NhdmVQcm94eVNlY0RlcG8CBQ1yZWNpcGllbnRBZGRyBQ51cGRhdGVkQmFsYW5jZQUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARdzdWJQcm94eVNlY3VyaXR5RGVwb3NpdAEHYW1vdW50XwQHYmFsYW5jZQkBEV9sb2FkUHJveHlTZWNEZXBvAQgFAWkGY2FsbGVyAwkAZgIFB2Ftb3VudF8FB2JhbGFuY2UJAAIBAi1zdWJQcm94eVNlY3VyaXR5RGVwb3NpdDogaW5zdWZmaWNpZW50IGJhbGFuY2UJAJQKAgkAzggCCQERX3NhdmVQcm94eVNlY0RlcG8CCAUBaQZjYWxsZXIJAGUCBQdiYWxhbmNlBQdhbW91bnRfCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUHYW1vdW50XwUEdW5pdAUDbmlsBQR1bml0AWkBC3NldE11bHRpc2lnAQltdWx0aXNpZ18EA2VycgMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF92YWxpZGF0ZUFkZHJlc3MCBQltdWx0aXNpZ18CJXNldE11bHRpc2lnOiBpbnZhbGlkIG11bHRpc2lnIGFkZHJlc3MHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQ1fc2F2ZU11bHRpc2lnAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUJbXVsdGlzaWdfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQHJG1hdGNoMAkAoggBBQxLRVlfTVVMVElTSUcDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAhtdWx0aXNpZwUHJG1hdGNoMAkBC3ZhbHVlT3JFbHNlAgkAmwgCCQERQGV4dHJOYXRpdmUoMTA2MikBBQhtdWx0aXNpZwkAuQkCCQDMCAIFCktFWV9TVEFUVVMJAMwIAgkApQgBBQR0aGlzCQDMCAIJANgEAQgFAnR4AmlkBQNuaWwFCVNFUEFSQVRPUgcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXnAaDQL", "height": 2470080, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BERyFwUsfoEka5mb7pfsByfvZuHVfZJnjUcjAhzeYitB Next: none Diff:
OldNewDifferences
1717
1818 let KEY_WAVES_EVENT = "WAVES_EVENT"
1919
20+let KEY_EVM_EVENT = "EVM_EVENT"
21+
2022 let KEY_WAVES_EVENT_SIZE = "WAVES_EVENT_SIZE"
23+
24+let KEY_EVM_EVENT_SIZE = "EVM_EVENT_SIZE"
2125
2226 let KEY_WAVES_EVENT_STATUS = "WAVES_EVENT_STATUS"
2327
28+let KEY_EVM_EVENT_STATUS = "EVM_EVENT_STATUS"
29+
2430 let KEY_WAVES_EVENT_PUBLISHED = "WAVES_EVENT_PUBLISHED"
31+
32+let KEY_EVM_EVENT_PUBLISHED = "EVM_EVENT_PUBLISHED"
2533
2634 let KEY_CURRENT_EPOCH = "CURRENT_EPOCH"
2735
2937
3038 let KEY_WAVES_EVENT_CALLER = "WAVES_EVENT_CALLER"
3139
40+let KEY_EVM_EVENT_CALLER = "EVM_EVENT_CALLER"
41+
3242 let KEY_WITNESSES_PER_EPOCH = "WITNESSES_PER_EPOCH"
3343
3444 let KEY_WAVES_EVENT_EXECUTOR = "WAVES_EVENT_EXECUTOR"
45+
46+let KEY_EVM_EVENT_EXECUTOR = "EVM_EVENT_EXECUTOR"
3547
3648 let KEY_REWARD_TOKEN_ADDRESS = "REWARD_TOKEN_ADDRESS"
3749
127139 }
128140
129141
142+func _publicKeysToAddrsStr (publicKeys_) = {
143+ func foldfunc (acc_,elem_) = (acc_ :+ addressFromPublicKey(fromBase58String(elem_)))
144+
145+ let $l = publicKeys_
146+ let $s = size($l)
147+ let $acc0 = nil
148+ func $f0_1 ($a,$i) = if (($i >= $s))
149+ then $a
150+ else foldfunc($a, $l[$i])
151+
152+ func $f0_2 ($a,$i) = if (($i >= $s))
153+ then $a
154+ else throw("List size exceeds 51")
155+
156+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51)
157+ }
158+
159+
130160 func _loadInit () = match getBoolean(KEY_INIT) {
131161 case a: Boolean =>
132162 a
182212 func _saveWavesEventSize (val_) = [IntegerEntry(KEY_WAVES_EVENT_SIZE, val_)]
183213
184214
215+func _loadEVMEventSize () = match getInteger(KEY_EVM_EVENT_SIZE) {
216+ case a: Int =>
217+ a
218+ case _ =>
219+ 0
220+}
221+
222+
223+func _saveEVMEventSize (val_) = [IntegerEntry(KEY_EVM_EVENT_SIZE, val_)]
224+
225+
185226 func _loadWavesEvent (index_) = match getString(makeString([KEY_WAVES_EVENT, toString(index_)], SEPARATOR)) {
186227 case a: String =>
187228 let struct = split(a, SEPARATOR)
192233
193234
194235 func _saveWavesEvent (index_,event_) = [StringEntry(makeString([KEY_WAVES_EVENT, toString(index_)], SEPARATOR), makeString([toString(event_._1), toString(event_._2), toString(event_._3), event_._4, event_._5, event_._6, makeString(event_._7, ARGS_SEPARATOR), event_._8, toString(event_._9), event_._10, toString(event_._11), toString(event_._12), toString(event_._13), toString(event_._14)], SEPARATOR))]
236+
237+
238+func _loadEVMEvent (index_) = match getString(makeString([KEY_EVM_EVENT, toString(index_)], SEPARATOR)) {
239+ case a: String =>
240+ let struct = split(a, SEPARATOR)
241+ $Tuple13(parseIntValue(struct[0]), parseIntValue(struct[1]), parseIntValue(struct[2]), struct[3], struct[4], struct[5], struct[6], parseIntValue(struct[7]), struct[8], parseIntValue(struct[9]), parseIntValue(struct[10]), parseIntValue(struct[11]), addressFromStringValue(struct[12]))
242+ case _ =>
243+ $Tuple13(0, 0, 0, "", "", "", "", 0, "", 0, 0, 0, Address(base58''))
244+}
245+
246+
247+func _saveEVMEvent (index_,event_) = [StringEntry(makeString([KEY_EVM_EVENT, toString(index_)], SEPARATOR), makeString([toString(event_._1), toString(event_._2), toString(event_._3), event_._4, event_._5, event_._6, event_._7, toString(event_._8), event_._9, toString(event_._10), toString(event_._11), toString(event_._12), toString(event_._13)], SEPARATOR))]
195248
196249
197250 func _loadWavesEventStatus (eventHash_) = match getInteger(makeString([KEY_WAVES_EVENT_STATUS, eventHash_], SEPARATOR)) {
205258 func _saveWavesEventStatus (eventHash_,status_) = [IntegerEntry(makeString([KEY_WAVES_EVENT_STATUS, eventHash_], SEPARATOR), status_)]
206259
207260
261+func _loadEVMEventStatus (eventHash_) = match getInteger(makeString([KEY_EVM_EVENT_STATUS, eventHash_], SEPARATOR)) {
262+ case a: Int =>
263+ a
264+ case _ =>
265+ 0
266+}
267+
268+
269+func _saveEVMEventStatus (eventHash_,status_) = [IntegerEntry(makeString([KEY_EVM_EVENT_STATUS, eventHash_], SEPARATOR), status_)]
270+
271+
208272 func _loadPublishedWavesEventByWitness (publicKey_,eventId_) = match getInteger(makeString([KEY_WAVES_EVENT_PUBLISHED, publicKey_, toString(eventId_)], SEPARATOR)) {
209273 case a: Int =>
210274 a
214278
215279
216280 func _savePublishedWavesEventByWitness (publicKey_,eventId_,val_) = [IntegerEntry(makeString([KEY_WAVES_EVENT_PUBLISHED, publicKey_, toString(eventId_)], SEPARATOR), val_)]
281+
282+
283+func _loadPublishedEVMEventByWitness (publicKey_,eventId_) = match getInteger(makeString([KEY_EVM_EVENT_PUBLISHED, publicKey_, toString(eventId_)], SEPARATOR)) {
284+ case a: Int =>
285+ a
286+ case _ =>
287+ 0
288+}
289+
290+
291+func _savePublishedEVMEventByWitness (publicKey_,eventId_,val_) = [IntegerEntry(makeString([KEY_EVM_EVENT_PUBLISHED, publicKey_, toString(eventId_)], SEPARATOR), val_)]
217292
218293
219294 func _loadCurrentEpoch (callerChainId_) = match getInteger(makeString([KEY_CURRENT_EPOCH, toString(callerChainId_)], SEPARATOR)) {
249324 func _saveWavesEventCallerIdx (callerChainId_,idx_,val_) = [IntegerEntry(makeString([KEY_WAVES_EVENT_CALLER, toString(callerChainId_), toString(idx_)], SEPARATOR), val_)]
250325
251326
327+func _loadEVMEventCallerIdxSize (callerChainId_) = match getInteger(makeString([KEY_EVM_EVENT_CALLER, toString(callerChainId_), KEY_SIZE], SEPARATOR)) {
328+ case a: Int =>
329+ a
330+ case _ =>
331+ 0
332+}
333+
334+
335+func _saveEVMEventCallerIdxSize (callerChainId_,val_) = [IntegerEntry(makeString([KEY_EVM_EVENT_CALLER, toString(callerChainId_), KEY_SIZE], SEPARATOR), val_)]
336+
337+
338+func _loadEVMEventCallerIdx (callerChainId_,idx_) = match getInteger(makeString([KEY_EVM_EVENT_CALLER, toString(callerChainId_), toString(idx_)], SEPARATOR)) {
339+ case a: Int =>
340+ a
341+ case _ =>
342+ 0
343+}
344+
345+
346+func _saveEVMEventCallerIdx (callerChainId_,idx_,val_) = [IntegerEntry(makeString([KEY_EVM_EVENT_CALLER, toString(callerChainId_), toString(idx_)], SEPARATOR), val_)]
347+
348+
252349 func _loadWavesEventExecutorIdxSize (executionChainId_) = match getInteger(makeString([KEY_WAVES_EVENT_EXECUTOR, toString(executionChainId_), KEY_SIZE], SEPARATOR)) {
253350 case a: Int =>
254351 a
269366
270367
271368 func _saveWavesEventExecutorIdx (executionChainId_,idx_,val_) = [IntegerEntry(makeString([KEY_WAVES_EVENT_EXECUTOR, toString(executionChainId_), toString(idx_)], SEPARATOR), val_)]
369+
370+
371+func _loadEVMEventExecutorIdxSize (executionChainId_) = match getInteger(makeString([KEY_EVM_EVENT_EXECUTOR, toString(executionChainId_), KEY_SIZE], SEPARATOR)) {
372+ case a: Int =>
373+ a
374+ case _ =>
375+ 0
376+}
377+
378+
379+func _saveEVMEventExecutorIdxSize (executionChainId_,val_) = [IntegerEntry(makeString([KEY_EVM_EVENT_EXECUTOR, toString(executionChainId_), KEY_SIZE], SEPARATOR), val_)]
380+
381+
382+func _loadEVMEventExecutorIdx (executionChainId_,idx_) = match getInteger(makeString([KEY_EVM_EVENT_EXECUTOR, toString(executionChainId_), toString(idx_)], SEPARATOR)) {
383+ case a: Int =>
384+ a
385+ case _ =>
386+ 0
387+}
388+
389+
390+func _saveEVMEventExecutorIdx (executionChainId_,idx_,val_) = [IntegerEntry(makeString([KEY_EVM_EVENT_EXECUTOR, toString(executionChainId_), toString(idx_)], SEPARATOR), val_)]
272391
273392
274393 func _loadWitnesses (callerChainId_,epoch_) = match getString(makeString([KEY_WITNESSES_PER_EPOCH, toString(callerChainId_), toString(epoch_)], SEPARATOR)) {
334453 else true
335454
336455
456+func _notConfirmedEVMEvent (eventHash_,err_) = if ((_loadEVMEventStatus(eventHash_) == EVENT_STATUS_CONFIRMED))
457+ then false
458+ else true
459+
460+
337461 func _wavesEventNotExist (eventHash_,err_) = if ((_loadWavesEventStatus(eventHash_) != 0))
338462 then throw(err_)
339463 else true
340464
341465
466+func _evmEventNotExist (eventHash_,err_) = if ((_loadEVMEventStatus(eventHash_) != 0))
467+ then throw(err_)
468+ else true
469+
470+
342471 func _notPublishedWavesEventByWitness (publicKey_,eventId_,err_) = if ((_loadPublishedWavesEventByWitness(publicKey_, eventId_) != 0))
472+ then throw(err_)
473+ else true
474+
475+
476+func _notPublishedEVMEventByWitness (publicKey_,eventId_,err_) = if ((_loadPublishedEVMEventByWitness(publicKey_, eventId_) > 0))
343477 then throw(err_)
344478 else true
345479
358492 else EVENT_STATUS_PROCESSING
359493
360494
361-func _calcEventHash (event_) = {
495+func _calcWavesEventHash (event_) = {
362496 let eventBytes = ((((((((toBytes(event_._1) + toBytes(event_._2)) + toBytes(event_._3)) + toBytes(event_._4)) + toBytes(event_._5)) + toBytes(event_._6)) + toBytes(makeString(event_._7, ARGS_SEPARATOR))) + toBytes(event_._8)) + toBytes(event_._9))
363497 toBase58String(keccak256_16Kb(eventBytes))
364498 }
365499
366500
367-func _setEventHash (event_,hash_) = $Tuple14(event_._1, event_._2, event_._3, event_._4, event_._5, event_._6, event_._7, event_._8, event_._9, hash_, event_._11, event_._12, event_._13, event_._14)
501+func _calcEVMEventHash (event_) = {
502+ let eventBytes = (((((((toBytes(event_._1) + toBytes(event_._2)) + toBytes(event_._3)) + toBytes(event_._4)) + toBytes(event_._5)) + toBytes(event_._6)) + toBytes(event_._7)) + toBytes(event_._8))
503+ toBase58String(keccak256_16Kb(eventBytes))
504+ }
368505
369506
370-func _setEventConfirmations (event_,confirmations_,total_) = $Tuple14(event_._1, event_._2, event_._3, event_._4, event_._5, event_._6, event_._7, event_._8, event_._9, event_._10, confirmations_, total_, event_._13, event_._14)
507+func _setWavesEventHash (event_,hash_) = $Tuple14(event_._1, event_._2, event_._3, event_._4, event_._5, event_._6, event_._7, event_._8, event_._9, hash_, event_._11, event_._12, event_._13, event_._14)
371508
372509
373-func _publicKeysToAddrsStr (publicKeys_) = {
374- func foldfunc (acc_,elem_) = (acc_ :+ toString(addressFromPublicKey(fromBase58String(elem_))))
510+func _setEVMEventHash (event_,hash_) = $Tuple13(event_._1, event_._2, event_._3, event_._4, event_._5, event_._6, event_._7, event_._8, hash_, event_._10, event_._11, event_._12, event_._13)
375511
376- let $l = publicKeys_
377- let $s = size($l)
378- let $acc0 = nil
379- func $f0_1 ($a,$i) = if (($i >= $s))
380- then $a
381- else foldfunc($a, $l[$i])
382512
383- func $f0_2 ($a,$i) = if (($i >= $s))
384- then $a
385- else throw("List size exceeds 51")
513+func _setWavesEventConfirmations (event_,confirmations_,total_) = $Tuple14(event_._1, event_._2, event_._3, event_._4, event_._5, event_._6, event_._7, event_._8, event_._9, event_._10, confirmations_, total_, event_._13, event_._14)
386514
387- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51)
388- }
515+
516+func _setEVMEventConfirmations (event_,confirmations_,total_) = $Tuple13(event_._1, event_._2, event_._3, event_._4, event_._5, event_._6, event_._7, event_._8, event_._9, confirmations_, total_, event_._12, event_._13)
389517
390518
391519 @Callable(i)
449577 let proxySecDepoUpdated = (proxySecDepo - proxySecDepoPerEvent)
450578 let event = $Tuple14(callerChainId_, executionChainId_, nonce_, caller_, executionContract_, functionName_, args_, txHash_, blockNumber_, "", 0, 0, proxySecDepoPerEvent, i.caller)
451579 let eventSize = _loadWavesEventSize()
452- let eventHash = _calcEventHash(event)
453- let eventUpdated = _setEventHash(event, eventHash)
580+ let eventHash = _calcWavesEventHash(event)
581+ let eventUpdated = _setWavesEventHash(event, eventHash)
454582 let err1 = if (_wavesEventNotExist(eventHash, "submitWavesCallEvent: already exists"))
455583 then _validateInt(proxySecDepoUpdated, 0, MAX_INT, "submitWavesCallEvent: no security deposit")
456584 else false
458586 then {
459587 let callerIdxSize = _loadWavesEventCallerIdxSize(callerChainId_)
460588 $Tuple2((((((_saveProxySecDepo(i.caller, proxySecDepoUpdated) ++ _saveWavesEvent(eventSize, eventUpdated)) ++ _saveWavesEventStatus(eventHash, EVENT_STATUS_PROCESSING)) ++ _saveWavesEventSize((eventSize + 1))) ++ _saveWavesEventCallerIdx(callerChainId_, callerIdxSize, eventSize)) ++ _saveWavesEventCallerIdxSize(callerChainId_, (callerIdxSize + 1))), unit)
589+ }
590+ else throw("Strict value is not equal to itself.")
591+ }
592+ else throw("Strict value is not equal to itself.")
593+ }
594+
595+
596+
597+@Callable(i)
598+func submitEVMCallEvent (callerChainId_,executionChainId_,nonce_,caller_,executionContract_,calldata_,txHash_,blockNumber_) = {
599+ let err = if (if (if (if (if (if (if (_validateInt(callerChainId_, 0, MAX_INT, "submitEVMCallEvent: invalid callerChainId"))
600+ then _validateInt(executionChainId_, 0, MAX_INT, "submitEVMCallEvent: invalid executionChainId")
601+ else false)
602+ then _validateInt(nonce_, 0, MAX_INT, "submitEVMCallEvent: invalid nonce")
603+ else false)
604+ then _validateString(caller_, "submitEVMCallEvent: invalid caller")
605+ else false)
606+ then _validateString(executionContract_, "submitEVMCallEvent: invalid executionContract")
607+ else false)
608+ then _validateString(calldata_, "submitEVMCallEvent: invalid functionName")
609+ else false)
610+ then _validateString(txHash_, "submitEVMCallEvent: invalid txHash")
611+ else false)
612+ then _validateInt(blockNumber_, 0, MAX_INT, "submitEVMCallEvent: invalid blockNumber")
613+ else false
614+ if ((err == err))
615+ then {
616+ let proxySecDepo = _loadProxySecDepo(i.caller)
617+ let proxySecDepoPerEvent = _loadProxySecDepoPerEvent()
618+ let proxySecDepoUpdated = (proxySecDepo - proxySecDepoPerEvent)
619+ let event = $Tuple13(callerChainId_, executionChainId_, nonce_, caller_, executionContract_, calldata_, txHash_, blockNumber_, "", 0, 0, proxySecDepoPerEvent, i.caller)
620+ let eventSize = _loadEVMEventSize()
621+ let eventHash = _calcEVMEventHash(event)
622+ let eventUpdated = _setEVMEventHash(event, eventHash)
623+ let err1 = if (_evmEventNotExist(eventHash, "submitEVMCallEvent: already exists"))
624+ then _validateInt(proxySecDepoUpdated, 0, MAX_INT, "submitEVMCallEvent: no security deposit")
625+ else false
626+ if ((err1 == err1))
627+ then {
628+ let callerIdxSize = _loadEVMEventCallerIdxSize(callerChainId_)
629+ $Tuple2((((((_saveProxySecDepo(i.caller, proxySecDepoUpdated) ++ _saveEVMEvent(eventSize, eventUpdated)) ++ _saveEVMEventStatus(eventHash, EVENT_STATUS_PROCESSING)) ++ _saveEVMEventSize((eventSize + 1))) ++ _saveEVMEventCallerIdx(callerChainId_, callerIdxSize, eventSize)) ++ _saveEVMEventCallerIdxSize(callerChainId_, (callerIdxSize + 1))), unit)
461630 }
462631 else throw("Strict value is not equal to itself.")
463632 }
493662 if ((err1 == err1))
494663 then {
495664 let eventUpdated = if ((status_ == EVENT_STATUS_CONFIRMED))
496- then _setEventConfirmations(event, (eventConfirmations + 1), (eventTotal + 1))
665+ then _setWavesEventConfirmations(event, (eventConfirmations + 1), (eventTotal + 1))
497666 else if ((status_ == EVENT_STATUS_REJECTED))
498- then _setEventConfirmations(event, eventConfirmations, (eventTotal + 1))
667+ then _setWavesEventConfirmations(event, eventConfirmations, (eventTotal + 1))
499668 else throw("publishWavesEventStatus: incorrect status")
500669 let executorIdxSize = _loadWavesEventExecutorIdxSize(executionChainId)
501670 let finalization = if (_isQuorumReached(eventUpdated._11, eventUpdated._12, size(activeWitnesses)))
514683 }
515684 else nil
516685 $Tuple2(((_saveWavesEvent(eventIdx_, eventUpdated) ++ _savePublishedWavesEventByWitness(callerPublicKey, eventIdx_, status_)) ++ finalization), unit)
686+ }
687+ else throw("Strict value is not equal to itself.")
688+ }
689+ else throw("Strict value is not equal to itself.")
690+ }
691+
692+
693+
694+@Callable(i)
695+func publishEVMEventStatus (eventIdx_,status_) = {
696+ let eventSize = _loadEVMEventSize()
697+ let callerPublicKey = toBase58String(i.callerPublicKey)
698+ let err = if (_validateEventIdx(eventIdx_, eventSize, "publishEVMEventStatus: invalid event idx"))
699+ then _validateEventStatus(status_, "publishEVMEventStatus: invalid status")
700+ else false
701+ if ((err == err))
702+ then {
703+ let event = _loadEVMEvent(eventIdx_)
704+ let callerChainId = event._1
705+ let executionChainId = event._2
706+ let eventHash = event._9
707+ let eventConfirmations = event._10
708+ let eventTotal = event._11
709+ let proxySecDepo = event._12
710+ let proxy = event._13
711+ let epoch = _loadCurrentEpoch(callerChainId)
712+ let activeWitnesses = _loadWitnesses(callerChainId, epoch)
713+ let err1 = if (if (_isActiveWitness(toBase58String(i.callerPublicKey), activeWitnesses, "publishEVMEventStatus: invalid caller"))
714+ then _notConfirmedEVMEvent(eventHash, "publishEVMEventStatus: event already confirmed")
715+ else false)
716+ then _notPublishedEVMEventByWitness(callerPublicKey, eventIdx_, "publishEVMEventStatus: already published")
717+ else false
718+ if ((err1 == err1))
719+ then {
720+ let eventUpdated = if ((status_ == EVENT_STATUS_CONFIRMED))
721+ then _setEVMEventConfirmations(event, (eventConfirmations + 1), (eventTotal + 1))
722+ else if ((status_ == EVENT_STATUS_REJECTED))
723+ then _setEVMEventConfirmations(event, eventConfirmations, (eventTotal + 1))
724+ else throw("publishEVMEventStatus: incorrect status")
725+ let executorIdxSize = _loadEVMEventExecutorIdxSize(executionChainId)
726+ let finalization = if (_isQuorumReached(eventUpdated._11, eventUpdated._12, size(activeWitnesses)))
727+ then {
728+ let status = _getEventStatus(eventUpdated._11, eventUpdated._12, size(activeWitnesses))
729+ let proxySecDepoUpdated = if ((status == EVENT_STATUS_CONFIRMED))
730+ then _saveProxySecDepo(proxy, (_loadProxySecDepo(proxy) + proxySecDepo))
731+ else if ((status == EVENT_STATUS_REJECTED))
732+ then [ScriptTransfer(_loadMultisig(), proxySecDepo, unit)]
733+ else nil
734+ let rewardAddresses = [toString(proxy), _publicKeysToAddrsStr(activeWitnesses)]
735+ let witnessesRewards = invoke(_loadRewardTokenAddress(), FUNC_MINT_MANY, [_loadRewardAmount(), rewardAddresses], nil)
736+ if ((witnessesRewards == witnessesRewards))
737+ then (((proxySecDepoUpdated ++ _saveEVMEventStatus(eventHash, status)) ++ _saveEVMEventExecutorIdx(executionChainId, executorIdxSize, eventIdx_)) ++ _saveEVMEventExecutorIdxSize(executionChainId, (executorIdxSize + 1)))
738+ else throw("Strict value is not equal to itself.")
739+ }
740+ else nil
741+ $Tuple2(((_saveEVMEvent(eventIdx_, eventUpdated) ++ _savePublishedEVMEventByWitness(callerPublicKey, eventIdx_, status_)) ++ finalization), unit)
517742 }
518743 else throw("Strict value is not equal to itself.")
519744 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEPARATOR = "__"
55
66 let ARGS_SEPARATOR = "####"
77
88 let KEY_INIT = "INIT"
99
1010 let KEY_MULTISIG = "MULTISIG"
1111
1212 let KEY_STATUS = "STATUS"
1313
1414 let KEY_PROXY_SEC_DEPO = "PROXY_SECURITY_DEPOSIT"
1515
1616 let KEY_PROXY_SEC_DEPO_PER_EVENT = "PROXY_SECURITY_DEPOSIT_PER_EVENT"
1717
1818 let KEY_WAVES_EVENT = "WAVES_EVENT"
1919
20+let KEY_EVM_EVENT = "EVM_EVENT"
21+
2022 let KEY_WAVES_EVENT_SIZE = "WAVES_EVENT_SIZE"
23+
24+let KEY_EVM_EVENT_SIZE = "EVM_EVENT_SIZE"
2125
2226 let KEY_WAVES_EVENT_STATUS = "WAVES_EVENT_STATUS"
2327
28+let KEY_EVM_EVENT_STATUS = "EVM_EVENT_STATUS"
29+
2430 let KEY_WAVES_EVENT_PUBLISHED = "WAVES_EVENT_PUBLISHED"
31+
32+let KEY_EVM_EVENT_PUBLISHED = "EVM_EVENT_PUBLISHED"
2533
2634 let KEY_CURRENT_EPOCH = "CURRENT_EPOCH"
2735
2836 let KEY_SIZE = "SIZE"
2937
3038 let KEY_WAVES_EVENT_CALLER = "WAVES_EVENT_CALLER"
3139
40+let KEY_EVM_EVENT_CALLER = "EVM_EVENT_CALLER"
41+
3242 let KEY_WITNESSES_PER_EPOCH = "WITNESSES_PER_EPOCH"
3343
3444 let KEY_WAVES_EVENT_EXECUTOR = "WAVES_EVENT_EXECUTOR"
45+
46+let KEY_EVM_EVENT_EXECUTOR = "EVM_EVENT_EXECUTOR"
3547
3648 let KEY_REWARD_TOKEN_ADDRESS = "REWARD_TOKEN_ADDRESS"
3749
3850 let KEY_REWARD_AMOUNT = "REWARD_AMOUNT"
3951
4052 let FUNC_MINT_MANY = "mintMany"
4153
4254 let EVENT_STATUS_PROCESSING = 1
4355
4456 let EVENT_STATUS_CONFIRMED = 2
4557
4658 let EVENT_STATUS_REJECTED = 3
4759
4860 let MAX_INT = 9223372036854775807
4961
5062 func _validateAddress (address_,err_) = match addressFromString(address_) {
5163 case a: Address =>
5264 true
5365 case _ =>
5466 throw(err_)
5567 }
5668
5769
5870 func _validateAsset (assetId_,err_) = match assetInfo(fromBase58String(assetId_)) {
5971 case a: Asset =>
6072 true
6173 case _ =>
6274 throw(err_)
6375 }
6476
6577
6678 func _validateInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_))
6779 then true
6880 else (val_ > upperBoundary_))
6981 then throw(err_)
7082 else true
7183
7284
7385 func _validateString (val_,err_) = if ((0 >= size(val_)))
7486 then throw(err_)
7587 else true
7688
7789
7890 func _validatePaymentsSize (payments_,target_,err_) = if ((size(payments_) != target_))
7991 then throw(err_)
8092 else true
8193
8294
8395 func _validatePaymentAsset (payment_,asset_,err_) = if ((payment_.assetId != asset_))
8496 then throw(err_)
8597 else true
8698
8799
88100 func _validateEventIdx (val_,max_,err_) = if (if ((0 > val_))
89101 then true
90102 else (val_ >= max_))
91103 then throw(err_)
92104 else true
93105
94106
95107 func _validateEventStatus (val_,err_) = if (if ((EVENT_STATUS_PROCESSING > val_))
96108 then true
97109 else (val_ > EVENT_STATUS_REJECTED))
98110 then throw(err_)
99111 else true
100112
101113
102114 func _validatePublicKey (publicKey_,err_) = if ((size(fromBase58String(publicKey_)) != 32))
103115 then throw(err_)
104116 else true
105117
106118
107119 func _validatePublicKeys (publicKeys_,err_) = {
108120 func foldFunc (acc,elem) = $Tuple2(if (acc._1)
109121 then _validatePublicKey(elem, acc._2)
110122 else false, acc._2)
111123
112124 let result = {
113125 let $l = publicKeys_
114126 let $s = size($l)
115127 let $acc0 = $Tuple2(true, err_)
116128 func $f0_1 ($a,$i) = if (($i >= $s))
117129 then $a
118130 else foldFunc($a, $l[$i])
119131
120132 func $f0_2 ($a,$i) = if (($i >= $s))
121133 then $a
122134 else throw("List size exceeds 10")
123135
124136 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
125137 }
126138 result._1
127139 }
128140
129141
142+func _publicKeysToAddrsStr (publicKeys_) = {
143+ func foldfunc (acc_,elem_) = (acc_ :+ addressFromPublicKey(fromBase58String(elem_)))
144+
145+ let $l = publicKeys_
146+ let $s = size($l)
147+ let $acc0 = nil
148+ func $f0_1 ($a,$i) = if (($i >= $s))
149+ then $a
150+ else foldfunc($a, $l[$i])
151+
152+ func $f0_2 ($a,$i) = if (($i >= $s))
153+ then $a
154+ else throw("List size exceeds 51")
155+
156+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51)
157+ }
158+
159+
130160 func _loadInit () = match getBoolean(KEY_INIT) {
131161 case a: Boolean =>
132162 a
133163 case _ =>
134164 false
135165 }
136166
137167
138168 func _saveInit (isInit_) = [BooleanEntry(KEY_INIT, isInit_)]
139169
140170
141171 func _loadMultisig () = match getString(KEY_MULTISIG) {
142172 case a: String =>
143173 addressFromStringValue(a)
144174 case _ =>
145175 Address(base58'')
146176 }
147177
148178
149179 func _saveMultisig (multisig_) = [StringEntry(KEY_MULTISIG, toString(multisig_))]
150180
151181
152182 func _loadProxySecDepo (account_) = match getInteger(makeString([KEY_PROXY_SEC_DEPO, toString(account_)], SEPARATOR)) {
153183 case a: Int =>
154184 a
155185 case _ =>
156186 0
157187 }
158188
159189
160190 func _saveProxySecDepo (account_,val_) = [IntegerEntry(makeString([KEY_PROXY_SEC_DEPO, toString(account_)], SEPARATOR), val_)]
161191
162192
163193 func _loadProxySecDepoPerEvent () = match getInteger(KEY_PROXY_SEC_DEPO_PER_EVENT) {
164194 case a: Int =>
165195 a
166196 case _ =>
167197 0
168198 }
169199
170200
171201 func _saveProxySecDepoPerEvent (val_) = [IntegerEntry(KEY_PROXY_SEC_DEPO_PER_EVENT, val_)]
172202
173203
174204 func _loadWavesEventSize () = match getInteger(KEY_WAVES_EVENT_SIZE) {
175205 case a: Int =>
176206 a
177207 case _ =>
178208 0
179209 }
180210
181211
182212 func _saveWavesEventSize (val_) = [IntegerEntry(KEY_WAVES_EVENT_SIZE, val_)]
183213
184214
215+func _loadEVMEventSize () = match getInteger(KEY_EVM_EVENT_SIZE) {
216+ case a: Int =>
217+ a
218+ case _ =>
219+ 0
220+}
221+
222+
223+func _saveEVMEventSize (val_) = [IntegerEntry(KEY_EVM_EVENT_SIZE, val_)]
224+
225+
185226 func _loadWavesEvent (index_) = match getString(makeString([KEY_WAVES_EVENT, toString(index_)], SEPARATOR)) {
186227 case a: String =>
187228 let struct = split(a, SEPARATOR)
188229 $Tuple14(parseIntValue(struct[0]), parseIntValue(struct[1]), parseIntValue(struct[2]), struct[3], struct[4], struct[5], split(struct[6], ARGS_SEPARATOR), struct[7], parseIntValue(struct[8]), struct[9], parseIntValue(struct[10]), parseIntValue(struct[11]), parseIntValue(struct[12]), addressFromStringValue(struct[13]))
189230 case _ =>
190231 $Tuple14(0, 0, 0, "", "", "", nil, "", 0, "", 0, 0, 0, Address(base58''))
191232 }
192233
193234
194235 func _saveWavesEvent (index_,event_) = [StringEntry(makeString([KEY_WAVES_EVENT, toString(index_)], SEPARATOR), makeString([toString(event_._1), toString(event_._2), toString(event_._3), event_._4, event_._5, event_._6, makeString(event_._7, ARGS_SEPARATOR), event_._8, toString(event_._9), event_._10, toString(event_._11), toString(event_._12), toString(event_._13), toString(event_._14)], SEPARATOR))]
236+
237+
238+func _loadEVMEvent (index_) = match getString(makeString([KEY_EVM_EVENT, toString(index_)], SEPARATOR)) {
239+ case a: String =>
240+ let struct = split(a, SEPARATOR)
241+ $Tuple13(parseIntValue(struct[0]), parseIntValue(struct[1]), parseIntValue(struct[2]), struct[3], struct[4], struct[5], struct[6], parseIntValue(struct[7]), struct[8], parseIntValue(struct[9]), parseIntValue(struct[10]), parseIntValue(struct[11]), addressFromStringValue(struct[12]))
242+ case _ =>
243+ $Tuple13(0, 0, 0, "", "", "", "", 0, "", 0, 0, 0, Address(base58''))
244+}
245+
246+
247+func _saveEVMEvent (index_,event_) = [StringEntry(makeString([KEY_EVM_EVENT, toString(index_)], SEPARATOR), makeString([toString(event_._1), toString(event_._2), toString(event_._3), event_._4, event_._5, event_._6, event_._7, toString(event_._8), event_._9, toString(event_._10), toString(event_._11), toString(event_._12), toString(event_._13)], SEPARATOR))]
195248
196249
197250 func _loadWavesEventStatus (eventHash_) = match getInteger(makeString([KEY_WAVES_EVENT_STATUS, eventHash_], SEPARATOR)) {
198251 case a: Int =>
199252 a
200253 case _ =>
201254 0
202255 }
203256
204257
205258 func _saveWavesEventStatus (eventHash_,status_) = [IntegerEntry(makeString([KEY_WAVES_EVENT_STATUS, eventHash_], SEPARATOR), status_)]
206259
207260
261+func _loadEVMEventStatus (eventHash_) = match getInteger(makeString([KEY_EVM_EVENT_STATUS, eventHash_], SEPARATOR)) {
262+ case a: Int =>
263+ a
264+ case _ =>
265+ 0
266+}
267+
268+
269+func _saveEVMEventStatus (eventHash_,status_) = [IntegerEntry(makeString([KEY_EVM_EVENT_STATUS, eventHash_], SEPARATOR), status_)]
270+
271+
208272 func _loadPublishedWavesEventByWitness (publicKey_,eventId_) = match getInteger(makeString([KEY_WAVES_EVENT_PUBLISHED, publicKey_, toString(eventId_)], SEPARATOR)) {
209273 case a: Int =>
210274 a
211275 case _ =>
212276 0
213277 }
214278
215279
216280 func _savePublishedWavesEventByWitness (publicKey_,eventId_,val_) = [IntegerEntry(makeString([KEY_WAVES_EVENT_PUBLISHED, publicKey_, toString(eventId_)], SEPARATOR), val_)]
281+
282+
283+func _loadPublishedEVMEventByWitness (publicKey_,eventId_) = match getInteger(makeString([KEY_EVM_EVENT_PUBLISHED, publicKey_, toString(eventId_)], SEPARATOR)) {
284+ case a: Int =>
285+ a
286+ case _ =>
287+ 0
288+}
289+
290+
291+func _savePublishedEVMEventByWitness (publicKey_,eventId_,val_) = [IntegerEntry(makeString([KEY_EVM_EVENT_PUBLISHED, publicKey_, toString(eventId_)], SEPARATOR), val_)]
217292
218293
219294 func _loadCurrentEpoch (callerChainId_) = match getInteger(makeString([KEY_CURRENT_EPOCH, toString(callerChainId_)], SEPARATOR)) {
220295 case a: Int =>
221296 a
222297 case _ =>
223298 0
224299 }
225300
226301
227302 func _saveCurrentEpoch (callerChainId_,val_) = [IntegerEntry(makeString([KEY_CURRENT_EPOCH, toString(callerChainId_)], SEPARATOR), val_)]
228303
229304
230305 func _loadWavesEventCallerIdxSize (callerChainId_) = match getInteger(makeString([KEY_WAVES_EVENT_CALLER, toString(callerChainId_), KEY_SIZE], SEPARATOR)) {
231306 case a: Int =>
232307 a
233308 case _ =>
234309 0
235310 }
236311
237312
238313 func _saveWavesEventCallerIdxSize (callerChainId_,val_) = [IntegerEntry(makeString([KEY_WAVES_EVENT_CALLER, toString(callerChainId_), KEY_SIZE], SEPARATOR), val_)]
239314
240315
241316 func _loadWavesEventCallerIdx (callerChainId_,idx_) = match getInteger(makeString([KEY_WAVES_EVENT_CALLER, toString(callerChainId_), toString(idx_)], SEPARATOR)) {
242317 case a: Int =>
243318 a
244319 case _ =>
245320 0
246321 }
247322
248323
249324 func _saveWavesEventCallerIdx (callerChainId_,idx_,val_) = [IntegerEntry(makeString([KEY_WAVES_EVENT_CALLER, toString(callerChainId_), toString(idx_)], SEPARATOR), val_)]
250325
251326
327+func _loadEVMEventCallerIdxSize (callerChainId_) = match getInteger(makeString([KEY_EVM_EVENT_CALLER, toString(callerChainId_), KEY_SIZE], SEPARATOR)) {
328+ case a: Int =>
329+ a
330+ case _ =>
331+ 0
332+}
333+
334+
335+func _saveEVMEventCallerIdxSize (callerChainId_,val_) = [IntegerEntry(makeString([KEY_EVM_EVENT_CALLER, toString(callerChainId_), KEY_SIZE], SEPARATOR), val_)]
336+
337+
338+func _loadEVMEventCallerIdx (callerChainId_,idx_) = match getInteger(makeString([KEY_EVM_EVENT_CALLER, toString(callerChainId_), toString(idx_)], SEPARATOR)) {
339+ case a: Int =>
340+ a
341+ case _ =>
342+ 0
343+}
344+
345+
346+func _saveEVMEventCallerIdx (callerChainId_,idx_,val_) = [IntegerEntry(makeString([KEY_EVM_EVENT_CALLER, toString(callerChainId_), toString(idx_)], SEPARATOR), val_)]
347+
348+
252349 func _loadWavesEventExecutorIdxSize (executionChainId_) = match getInteger(makeString([KEY_WAVES_EVENT_EXECUTOR, toString(executionChainId_), KEY_SIZE], SEPARATOR)) {
253350 case a: Int =>
254351 a
255352 case _ =>
256353 0
257354 }
258355
259356
260357 func _saveWavesEventExecutorIdxSize (executionChainId_,val_) = [IntegerEntry(makeString([KEY_WAVES_EVENT_EXECUTOR, toString(executionChainId_), KEY_SIZE], SEPARATOR), val_)]
261358
262359
263360 func _loadWavesEventExecutorIdx (executionChainId_,idx_) = match getInteger(makeString([KEY_WAVES_EVENT_EXECUTOR, toString(executionChainId_), toString(idx_)], SEPARATOR)) {
264361 case a: Int =>
265362 a
266363 case _ =>
267364 0
268365 }
269366
270367
271368 func _saveWavesEventExecutorIdx (executionChainId_,idx_,val_) = [IntegerEntry(makeString([KEY_WAVES_EVENT_EXECUTOR, toString(executionChainId_), toString(idx_)], SEPARATOR), val_)]
369+
370+
371+func _loadEVMEventExecutorIdxSize (executionChainId_) = match getInteger(makeString([KEY_EVM_EVENT_EXECUTOR, toString(executionChainId_), KEY_SIZE], SEPARATOR)) {
372+ case a: Int =>
373+ a
374+ case _ =>
375+ 0
376+}
377+
378+
379+func _saveEVMEventExecutorIdxSize (executionChainId_,val_) = [IntegerEntry(makeString([KEY_EVM_EVENT_EXECUTOR, toString(executionChainId_), KEY_SIZE], SEPARATOR), val_)]
380+
381+
382+func _loadEVMEventExecutorIdx (executionChainId_,idx_) = match getInteger(makeString([KEY_EVM_EVENT_EXECUTOR, toString(executionChainId_), toString(idx_)], SEPARATOR)) {
383+ case a: Int =>
384+ a
385+ case _ =>
386+ 0
387+}
388+
389+
390+func _saveEVMEventExecutorIdx (executionChainId_,idx_,val_) = [IntegerEntry(makeString([KEY_EVM_EVENT_EXECUTOR, toString(executionChainId_), toString(idx_)], SEPARATOR), val_)]
272391
273392
274393 func _loadWitnesses (callerChainId_,epoch_) = match getString(makeString([KEY_WITNESSES_PER_EPOCH, toString(callerChainId_), toString(epoch_)], SEPARATOR)) {
275394 case a: String =>
276395 split(a, SEPARATOR)
277396 case _ =>
278397 nil
279398 }
280399
281400
282401 func _saveWitnesses (callerChainId_,epoch_,witnesses_) = [StringEntry(makeString([KEY_WITNESSES_PER_EPOCH, toString(callerChainId_), toString(epoch_)], SEPARATOR), makeString(witnesses_, SEPARATOR))]
283402
284403
285404 func _loadRewardTokenAddress () = match getString(KEY_REWARD_TOKEN_ADDRESS) {
286405 case a: String =>
287406 addressFromStringValue(a)
288407 case _ =>
289408 Address(base58'')
290409 }
291410
292411
293412 func _saveRewardTokenAddress (val_) = [StringEntry(KEY_REWARD_TOKEN_ADDRESS, toString(val_))]
294413
295414
296415 func _loadRewardAmount () = match getInteger(KEY_REWARD_AMOUNT) {
297416 case a: Int =>
298417 a
299418 case _ =>
300419 0
301420 }
302421
303422
304423 func _saveRewardAmount (val_) = [IntegerEntry(KEY_REWARD_AMOUNT, val_)]
305424
306425
307426 func _onlyThisContract (caller_) = if ((caller_ != this))
308427 then throw("_onlyThisContract: revert")
309428 else true
310429
311430
312431 func _whenMultisigSet () = if ((_loadMultisig() == Address(base58'')))
313432 then throw("_whenMultisigSet: revert")
314433 else true
315434
316435
317436 func _whenNotInitialized () = if (_loadInit())
318437 then throw("_whenNotInitialized: revert")
319438 else true
320439
321440
322441 func _whenInitialized () = if (!(_loadInit()))
323442 then throw("_whenInitialized: revert")
324443 else true
325444
326445
327446 func _isActiveWitness (publicKey_,publicKeys_,err_) = if (!(containsElement(publicKeys_, publicKey_)))
328447 then throw(err_)
329448 else true
330449
331450
332451 func _notConfirmedWavesEvent (eventHash_,err_) = if ((_loadWavesEventStatus(eventHash_) > EVENT_STATUS_PROCESSING))
333452 then throw(err_)
334453 else true
335454
336455
456+func _notConfirmedEVMEvent (eventHash_,err_) = if ((_loadEVMEventStatus(eventHash_) == EVENT_STATUS_CONFIRMED))
457+ then false
458+ else true
459+
460+
337461 func _wavesEventNotExist (eventHash_,err_) = if ((_loadWavesEventStatus(eventHash_) != 0))
338462 then throw(err_)
339463 else true
340464
341465
466+func _evmEventNotExist (eventHash_,err_) = if ((_loadEVMEventStatus(eventHash_) != 0))
467+ then throw(err_)
468+ else true
469+
470+
342471 func _notPublishedWavesEventByWitness (publicKey_,eventId_,err_) = if ((_loadPublishedWavesEventByWitness(publicKey_, eventId_) != 0))
472+ then throw(err_)
473+ else true
474+
475+
476+func _notPublishedEVMEventByWitness (publicKey_,eventId_,err_) = if ((_loadPublishedEVMEventByWitness(publicKey_, eventId_) > 0))
343477 then throw(err_)
344478 else true
345479
346480
347481 func _isQuorumReached (confirmations_,total_,witnessSize_) = if (if ((confirmations_ > (witnessSize_ / 2)))
348482 then true
349483 else ((total_ - confirmations_) > (witnessSize_ / 2)))
350484 then true
351485 else false
352486
353487
354488 func _getEventStatus (confirmations_,total_,witnessSize_) = if ((confirmations_ > (witnessSize_ / 2)))
355489 then EVENT_STATUS_CONFIRMED
356490 else if (((total_ - confirmations_) > (witnessSize_ / 2)))
357491 then EVENT_STATUS_REJECTED
358492 else EVENT_STATUS_PROCESSING
359493
360494
361-func _calcEventHash (event_) = {
495+func _calcWavesEventHash (event_) = {
362496 let eventBytes = ((((((((toBytes(event_._1) + toBytes(event_._2)) + toBytes(event_._3)) + toBytes(event_._4)) + toBytes(event_._5)) + toBytes(event_._6)) + toBytes(makeString(event_._7, ARGS_SEPARATOR))) + toBytes(event_._8)) + toBytes(event_._9))
363497 toBase58String(keccak256_16Kb(eventBytes))
364498 }
365499
366500
367-func _setEventHash (event_,hash_) = $Tuple14(event_._1, event_._2, event_._3, event_._4, event_._5, event_._6, event_._7, event_._8, event_._9, hash_, event_._11, event_._12, event_._13, event_._14)
501+func _calcEVMEventHash (event_) = {
502+ let eventBytes = (((((((toBytes(event_._1) + toBytes(event_._2)) + toBytes(event_._3)) + toBytes(event_._4)) + toBytes(event_._5)) + toBytes(event_._6)) + toBytes(event_._7)) + toBytes(event_._8))
503+ toBase58String(keccak256_16Kb(eventBytes))
504+ }
368505
369506
370-func _setEventConfirmations (event_,confirmations_,total_) = $Tuple14(event_._1, event_._2, event_._3, event_._4, event_._5, event_._6, event_._7, event_._8, event_._9, event_._10, confirmations_, total_, event_._13, event_._14)
507+func _setWavesEventHash (event_,hash_) = $Tuple14(event_._1, event_._2, event_._3, event_._4, event_._5, event_._6, event_._7, event_._8, event_._9, hash_, event_._11, event_._12, event_._13, event_._14)
371508
372509
373-func _publicKeysToAddrsStr (publicKeys_) = {
374- func foldfunc (acc_,elem_) = (acc_ :+ toString(addressFromPublicKey(fromBase58String(elem_))))
510+func _setEVMEventHash (event_,hash_) = $Tuple13(event_._1, event_._2, event_._3, event_._4, event_._5, event_._6, event_._7, event_._8, hash_, event_._10, event_._11, event_._12, event_._13)
375511
376- let $l = publicKeys_
377- let $s = size($l)
378- let $acc0 = nil
379- func $f0_1 ($a,$i) = if (($i >= $s))
380- then $a
381- else foldfunc($a, $l[$i])
382512
383- func $f0_2 ($a,$i) = if (($i >= $s))
384- then $a
385- else throw("List size exceeds 51")
513+func _setWavesEventConfirmations (event_,confirmations_,total_) = $Tuple14(event_._1, event_._2, event_._3, event_._4, event_._5, event_._6, event_._7, event_._8, event_._9, event_._10, confirmations_, total_, event_._13, event_._14)
386514
387- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51)
388- }
515+
516+func _setEVMEventConfirmations (event_,confirmations_,total_) = $Tuple13(event_._1, event_._2, event_._3, event_._4, event_._5, event_._6, event_._7, event_._8, event_._9, confirmations_, total_, event_._12, event_._13)
389517
390518
391519 @Callable(i)
392520 func init (proxySecDepoPerEvent_,rewardTokenAddress_,rewardAmount_) = {
393521 let err = if (if (if (if (if (_onlyThisContract(i.caller))
394522 then _whenNotInitialized()
395523 else false)
396524 then _whenMultisigSet()
397525 else false)
398526 then _validateInt(proxySecDepoPerEvent_, 0, MAX_INT, "init: invalid proxySecDepoPerEvent")
399527 else false)
400528 then _validateAddress(rewardTokenAddress_, "init: invalid rewardTokenAddress")
401529 else false)
402530 then _validateInt(rewardAmount_, 0, MAX_INT, "init: invalid rewardAmount")
403531 else false
404532 if ((err == err))
405533 then $Tuple2((((_saveInit(true) ++ _saveProxySecDepoPerEvent(proxySecDepoPerEvent_)) ++ _saveRewardTokenAddress(addressFromStringValue(rewardTokenAddress_))) ++ _saveRewardAmount(rewardAmount_)), unit)
406534 else throw("Strict value is not equal to itself.")
407535 }
408536
409537
410538
411539 @Callable(i)
412540 func setActiveWitnesses (callerChainId_,witnesses_) = {
413541 let err = if (if (_onlyThisContract(i.caller))
414542 then _whenInitialized()
415543 else false)
416544 then _validatePublicKeys(witnesses_, "setActiveWitnesses: invalid witnesses")
417545 else false
418546 if ((err == err))
419547 then {
420548 let epoch = _loadCurrentEpoch(callerChainId_)
421549 $Tuple2((_saveCurrentEpoch(callerChainId_, (epoch + 1)) ++ _saveWitnesses(callerChainId_, (epoch + 1), witnesses_)), unit)
422550 }
423551 else throw("Strict value is not equal to itself.")
424552 }
425553
426554
427555
428556 @Callable(i)
429557 func submitWavesCallEvent (callerChainId_,executionChainId_,nonce_,caller_,executionContract_,functionName_,args_,txHash_,blockNumber_) = {
430558 let err = if (if (if (if (if (if (if (_validateInt(callerChainId_, 0, MAX_INT, "submitWavesCallEvent: invalid callerChainId"))
431559 then _validateInt(executionChainId_, 0, MAX_INT, "submitWavesCallEvent: invalid executionChainId")
432560 else false)
433561 then _validateInt(nonce_, 0, MAX_INT, "submitWavesCallEvent: invalid nonce")
434562 else false)
435563 then _validateString(caller_, "submitWavesCallEvent: invalid caller")
436564 else false)
437565 then _validateString(executionContract_, "submitWavesCallEvent: invalid executionContract")
438566 else false)
439567 then _validateString(functionName_, "submitWavesCallEvent: invalid functionName")
440568 else false)
441569 then _validateString(txHash_, "submitWavesCallEvent: invalid txHash")
442570 else false)
443571 then _validateInt(blockNumber_, 0, MAX_INT, "submitWavesCallEvent: invalid blockNumber")
444572 else false
445573 if ((err == err))
446574 then {
447575 let proxySecDepo = _loadProxySecDepo(i.caller)
448576 let proxySecDepoPerEvent = _loadProxySecDepoPerEvent()
449577 let proxySecDepoUpdated = (proxySecDepo - proxySecDepoPerEvent)
450578 let event = $Tuple14(callerChainId_, executionChainId_, nonce_, caller_, executionContract_, functionName_, args_, txHash_, blockNumber_, "", 0, 0, proxySecDepoPerEvent, i.caller)
451579 let eventSize = _loadWavesEventSize()
452- let eventHash = _calcEventHash(event)
453- let eventUpdated = _setEventHash(event, eventHash)
580+ let eventHash = _calcWavesEventHash(event)
581+ let eventUpdated = _setWavesEventHash(event, eventHash)
454582 let err1 = if (_wavesEventNotExist(eventHash, "submitWavesCallEvent: already exists"))
455583 then _validateInt(proxySecDepoUpdated, 0, MAX_INT, "submitWavesCallEvent: no security deposit")
456584 else false
457585 if ((err1 == err1))
458586 then {
459587 let callerIdxSize = _loadWavesEventCallerIdxSize(callerChainId_)
460588 $Tuple2((((((_saveProxySecDepo(i.caller, proxySecDepoUpdated) ++ _saveWavesEvent(eventSize, eventUpdated)) ++ _saveWavesEventStatus(eventHash, EVENT_STATUS_PROCESSING)) ++ _saveWavesEventSize((eventSize + 1))) ++ _saveWavesEventCallerIdx(callerChainId_, callerIdxSize, eventSize)) ++ _saveWavesEventCallerIdxSize(callerChainId_, (callerIdxSize + 1))), unit)
589+ }
590+ else throw("Strict value is not equal to itself.")
591+ }
592+ else throw("Strict value is not equal to itself.")
593+ }
594+
595+
596+
597+@Callable(i)
598+func submitEVMCallEvent (callerChainId_,executionChainId_,nonce_,caller_,executionContract_,calldata_,txHash_,blockNumber_) = {
599+ let err = if (if (if (if (if (if (if (_validateInt(callerChainId_, 0, MAX_INT, "submitEVMCallEvent: invalid callerChainId"))
600+ then _validateInt(executionChainId_, 0, MAX_INT, "submitEVMCallEvent: invalid executionChainId")
601+ else false)
602+ then _validateInt(nonce_, 0, MAX_INT, "submitEVMCallEvent: invalid nonce")
603+ else false)
604+ then _validateString(caller_, "submitEVMCallEvent: invalid caller")
605+ else false)
606+ then _validateString(executionContract_, "submitEVMCallEvent: invalid executionContract")
607+ else false)
608+ then _validateString(calldata_, "submitEVMCallEvent: invalid functionName")
609+ else false)
610+ then _validateString(txHash_, "submitEVMCallEvent: invalid txHash")
611+ else false)
612+ then _validateInt(blockNumber_, 0, MAX_INT, "submitEVMCallEvent: invalid blockNumber")
613+ else false
614+ if ((err == err))
615+ then {
616+ let proxySecDepo = _loadProxySecDepo(i.caller)
617+ let proxySecDepoPerEvent = _loadProxySecDepoPerEvent()
618+ let proxySecDepoUpdated = (proxySecDepo - proxySecDepoPerEvent)
619+ let event = $Tuple13(callerChainId_, executionChainId_, nonce_, caller_, executionContract_, calldata_, txHash_, blockNumber_, "", 0, 0, proxySecDepoPerEvent, i.caller)
620+ let eventSize = _loadEVMEventSize()
621+ let eventHash = _calcEVMEventHash(event)
622+ let eventUpdated = _setEVMEventHash(event, eventHash)
623+ let err1 = if (_evmEventNotExist(eventHash, "submitEVMCallEvent: already exists"))
624+ then _validateInt(proxySecDepoUpdated, 0, MAX_INT, "submitEVMCallEvent: no security deposit")
625+ else false
626+ if ((err1 == err1))
627+ then {
628+ let callerIdxSize = _loadEVMEventCallerIdxSize(callerChainId_)
629+ $Tuple2((((((_saveProxySecDepo(i.caller, proxySecDepoUpdated) ++ _saveEVMEvent(eventSize, eventUpdated)) ++ _saveEVMEventStatus(eventHash, EVENT_STATUS_PROCESSING)) ++ _saveEVMEventSize((eventSize + 1))) ++ _saveEVMEventCallerIdx(callerChainId_, callerIdxSize, eventSize)) ++ _saveEVMEventCallerIdxSize(callerChainId_, (callerIdxSize + 1))), unit)
461630 }
462631 else throw("Strict value is not equal to itself.")
463632 }
464633 else throw("Strict value is not equal to itself.")
465634 }
466635
467636
468637
469638 @Callable(i)
470639 func publishWavesEventStatus (eventIdx_,status_) = {
471640 let eventSize = _loadWavesEventSize()
472641 let callerPublicKey = toBase58String(i.callerPublicKey)
473642 let err = if (_validateEventIdx(eventIdx_, eventSize, "publishWavesEventStatus: invalid event idx"))
474643 then _validateEventStatus(status_, "publishWavesEventStatus: invalid status")
475644 else false
476645 if ((err == err))
477646 then {
478647 let event = _loadWavesEvent(eventIdx_)
479648 let callerChainId = event._1
480649 let executionChainId = event._2
481650 let eventHash = event._10
482651 let eventConfirmations = event._11
483652 let eventTotal = event._12
484653 let proxySecDepo = event._13
485654 let proxy = event._14
486655 let epoch = _loadCurrentEpoch(callerChainId)
487656 let activeWitnesses = _loadWitnesses(callerChainId, epoch)
488657 let err1 = if (if (_isActiveWitness(toBase58String(i.callerPublicKey), activeWitnesses, "publishWavesEventStatus: invalid caller"))
489658 then _notConfirmedWavesEvent(eventHash, "publishWavesEventStatus: event already confirmed")
490659 else false)
491660 then _notPublishedWavesEventByWitness(callerPublicKey, eventIdx_, "publishWavesEventStatus: already published")
492661 else false
493662 if ((err1 == err1))
494663 then {
495664 let eventUpdated = if ((status_ == EVENT_STATUS_CONFIRMED))
496- then _setEventConfirmations(event, (eventConfirmations + 1), (eventTotal + 1))
665+ then _setWavesEventConfirmations(event, (eventConfirmations + 1), (eventTotal + 1))
497666 else if ((status_ == EVENT_STATUS_REJECTED))
498- then _setEventConfirmations(event, eventConfirmations, (eventTotal + 1))
667+ then _setWavesEventConfirmations(event, eventConfirmations, (eventTotal + 1))
499668 else throw("publishWavesEventStatus: incorrect status")
500669 let executorIdxSize = _loadWavesEventExecutorIdxSize(executionChainId)
501670 let finalization = if (_isQuorumReached(eventUpdated._11, eventUpdated._12, size(activeWitnesses)))
502671 then {
503672 let status = _getEventStatus(eventUpdated._11, eventUpdated._12, size(activeWitnesses))
504673 let proxySecDepoUpdated = if ((status == EVENT_STATUS_CONFIRMED))
505674 then _saveProxySecDepo(proxy, (_loadProxySecDepo(proxy) + proxySecDepo))
506675 else if ((status == EVENT_STATUS_REJECTED))
507676 then [ScriptTransfer(_loadMultisig(), proxySecDepo, unit)]
508677 else nil
509678 let rewardAddresses = [toString(proxy), _publicKeysToAddrsStr(activeWitnesses)]
510679 let witnessesRewards = invoke(_loadRewardTokenAddress(), FUNC_MINT_MANY, [_loadRewardAmount(), rewardAddresses], nil)
511680 if ((witnessesRewards == witnessesRewards))
512681 then (((proxySecDepoUpdated ++ _saveWavesEventStatus(eventHash, status)) ++ _saveWavesEventExecutorIdx(executionChainId, executorIdxSize, eventIdx_)) ++ _saveWavesEventExecutorIdxSize(executionChainId, (executorIdxSize + 1)))
513682 else throw("Strict value is not equal to itself.")
514683 }
515684 else nil
516685 $Tuple2(((_saveWavesEvent(eventIdx_, eventUpdated) ++ _savePublishedWavesEventByWitness(callerPublicKey, eventIdx_, status_)) ++ finalization), unit)
686+ }
687+ else throw("Strict value is not equal to itself.")
688+ }
689+ else throw("Strict value is not equal to itself.")
690+ }
691+
692+
693+
694+@Callable(i)
695+func publishEVMEventStatus (eventIdx_,status_) = {
696+ let eventSize = _loadEVMEventSize()
697+ let callerPublicKey = toBase58String(i.callerPublicKey)
698+ let err = if (_validateEventIdx(eventIdx_, eventSize, "publishEVMEventStatus: invalid event idx"))
699+ then _validateEventStatus(status_, "publishEVMEventStatus: invalid status")
700+ else false
701+ if ((err == err))
702+ then {
703+ let event = _loadEVMEvent(eventIdx_)
704+ let callerChainId = event._1
705+ let executionChainId = event._2
706+ let eventHash = event._9
707+ let eventConfirmations = event._10
708+ let eventTotal = event._11
709+ let proxySecDepo = event._12
710+ let proxy = event._13
711+ let epoch = _loadCurrentEpoch(callerChainId)
712+ let activeWitnesses = _loadWitnesses(callerChainId, epoch)
713+ let err1 = if (if (_isActiveWitness(toBase58String(i.callerPublicKey), activeWitnesses, "publishEVMEventStatus: invalid caller"))
714+ then _notConfirmedEVMEvent(eventHash, "publishEVMEventStatus: event already confirmed")
715+ else false)
716+ then _notPublishedEVMEventByWitness(callerPublicKey, eventIdx_, "publishEVMEventStatus: already published")
717+ else false
718+ if ((err1 == err1))
719+ then {
720+ let eventUpdated = if ((status_ == EVENT_STATUS_CONFIRMED))
721+ then _setEVMEventConfirmations(event, (eventConfirmations + 1), (eventTotal + 1))
722+ else if ((status_ == EVENT_STATUS_REJECTED))
723+ then _setEVMEventConfirmations(event, eventConfirmations, (eventTotal + 1))
724+ else throw("publishEVMEventStatus: incorrect status")
725+ let executorIdxSize = _loadEVMEventExecutorIdxSize(executionChainId)
726+ let finalization = if (_isQuorumReached(eventUpdated._11, eventUpdated._12, size(activeWitnesses)))
727+ then {
728+ let status = _getEventStatus(eventUpdated._11, eventUpdated._12, size(activeWitnesses))
729+ let proxySecDepoUpdated = if ((status == EVENT_STATUS_CONFIRMED))
730+ then _saveProxySecDepo(proxy, (_loadProxySecDepo(proxy) + proxySecDepo))
731+ else if ((status == EVENT_STATUS_REJECTED))
732+ then [ScriptTransfer(_loadMultisig(), proxySecDepo, unit)]
733+ else nil
734+ let rewardAddresses = [toString(proxy), _publicKeysToAddrsStr(activeWitnesses)]
735+ let witnessesRewards = invoke(_loadRewardTokenAddress(), FUNC_MINT_MANY, [_loadRewardAmount(), rewardAddresses], nil)
736+ if ((witnessesRewards == witnessesRewards))
737+ then (((proxySecDepoUpdated ++ _saveEVMEventStatus(eventHash, status)) ++ _saveEVMEventExecutorIdx(executionChainId, executorIdxSize, eventIdx_)) ++ _saveEVMEventExecutorIdxSize(executionChainId, (executorIdxSize + 1)))
738+ else throw("Strict value is not equal to itself.")
739+ }
740+ else nil
741+ $Tuple2(((_saveEVMEvent(eventIdx_, eventUpdated) ++ _savePublishedEVMEventByWitness(callerPublicKey, eventIdx_, status_)) ++ finalization), unit)
517742 }
518743 else throw("Strict value is not equal to itself.")
519744 }
520745 else throw("Strict value is not equal to itself.")
521746 }
522747
523748
524749
525750 @Callable(i)
526751 func addProxySecurityDeposit (recipient_) = {
527752 let recipient = if ((recipient_ == ""))
528753 then toString(i.caller)
529754 else recipient_
530755 let err = if (if (_validateAddress(recipient, "addProxySecurityDeposit: invalid recipient"))
531756 then _validatePaymentsSize(i.payments, 1, "addProxySecurityDeposit: no payment")
532757 else false)
533758 then _validatePaymentAsset(i.payments[0], unit, "addProxySecurityDeposit: invalid asset")
534759 else false
535760 if ((err == err))
536761 then {
537762 let recipientAddr = addressFromStringValue(recipient)
538763 let balance = _loadProxySecDepo(recipientAddr)
539764 let updatedBalance = (balance + i.payments[0].amount)
540765 $Tuple2(_saveProxySecDepo(recipientAddr, updatedBalance), unit)
541766 }
542767 else throw("Strict value is not equal to itself.")
543768 }
544769
545770
546771
547772 @Callable(i)
548773 func subProxySecurityDeposit (amount_) = {
549774 let balance = _loadProxySecDepo(i.caller)
550775 if ((amount_ > balance))
551776 then throw("subProxySecurityDeposit: insufficient balance")
552777 else $Tuple2((_saveProxySecDepo(i.caller, (balance - amount_)) ++ [ScriptTransfer(i.caller, amount_, unit)]), unit)
553778 }
554779
555780
556781
557782 @Callable(i)
558783 func setMultisig (multisig_) = {
559784 let err = if (_onlyThisContract(i.caller))
560785 then _validateAddress(multisig_, "setMultisig: invalid multisig address")
561786 else false
562787 if ((err == err))
563788 then $Tuple2(_saveMultisig(addressFromStringValue(multisig_)), unit)
564789 else throw("Strict value is not equal to itself.")
565790 }
566791
567792
568793 @Verifier(tx)
569794 func verify () = match getString(KEY_MULTISIG) {
570795 case multisig: String =>
571796 valueOrElse(getBoolean(addressFromStringValue(multisig), makeString([KEY_STATUS, toString(this), toBase58String(tx.id)], SEPARATOR)), false)
572797 case _ =>
573798 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
574799 }
575800

github/deemru/w8io/169f3d6 
82.10 ms