tx · CG6cP2wjJj2LqbJ4j1LGicUVXcb67RDSdd9odKuaniWc

3N33NL4BGxFEEiXKgnENVRDiE3RwkYmaNmS:  -0.02600000 Waves

2023.03.09 18:45 [2482756] smart account 3N33NL4BGxFEEiXKgnENVRDiE3RwkYmaNmS > SELF 0.00000000 Waves

{ "type": 13, "id": "CG6cP2wjJj2LqbJ4j1LGicUVXcb67RDSdd9odKuaniWc", "fee": 2600000, "feeAssetId": null, "timestamp": 1678376750211, "version": 2, "chainId": 84, "sender": "3N33NL4BGxFEEiXKgnENVRDiE3RwkYmaNmS", "senderPublicKey": "FeKA4QnfyZ9Q6eep2FDJEZxFr8cn1tbStnN5SJeEnPaB", "proofs": [ "S9G2fXCvBveqLURYBQjiuSoQPwGqPrLikBNFMAjAUJpas6HnHGtBb6NLpQd6i8dgH47aQWiUQfPfZCDTqZRABb8" ], "script": "base64:BgJBCAISBQoDAQgBEgQKAgEYEgoKCAEBAQgIGAgBEgkKBwEBAQgICAESBAoCAQESBAoCAQESAwoBCBIDCgEBEgMKAQhrAAlTRVBBUkFUT1ICAl9fAA5BUkdTX1NFUEFSQVRPUgIEIyMjIwAIS0VZX0lOSVQCBElOSVQADEtFWV9NVUxUSVNJRwIITVVMVElTSUcACktFWV9TVEFUVVMCBlNUQVRVUwASS0VZX1BST1hZX1NFQ19ERVBPAhZQUk9YWV9TRUNVUklUWV9ERVBPU0lUABxLRVlfUFJPWFlfU0VDX0RFUE9fUEVSX0VWRU5UAiBQUk9YWV9TRUNVUklUWV9ERVBPU0lUX1BFUl9FVkVOVAAPS0VZX1dBVkVTX0VWRU5UAgtXQVZFU19FVkVOVAANS0VZX0VWTV9FVkVOVAIJRVZNX0VWRU5UABRLRVlfV0FWRVNfRVZFTlRfU0laRQIQV0FWRVNfRVZFTlRfU0laRQASS0VZX0VWTV9FVkVOVF9TSVpFAg5FVk1fRVZFTlRfU0laRQAWS0VZX1dBVkVTX0VWRU5UX1NUQVRVUwISV0FWRVNfRVZFTlRfU1RBVFVTABRLRVlfRVZNX0VWRU5UX1NUQVRVUwIQRVZNX0VWRU5UX1NUQVRVUwAZS0VZX1dBVkVTX0VWRU5UX1BVQkxJU0hFRAIVV0FWRVNfRVZFTlRfUFVCTElTSEVEABdLRVlfRVZNX0VWRU5UX1BVQkxJU0hFRAITRVZNX0VWRU5UX1BVQkxJU0hFRAARS0VZX0NVUlJFTlRfRVBPQ0gCDUNVUlJFTlRfRVBPQ0gACEtFWV9TSVpFAgRTSVpFABZLRVlfV0FWRVNfRVZFTlRfQ0FMTEVSAhJXQVZFU19FVkVOVF9DQUxMRVIAFEtFWV9FVk1fRVZFTlRfQ0FMTEVSAhBFVk1fRVZFTlRfQ0FMTEVSABdLRVlfV0lUTkVTU0VTX1BFUl9FUE9DSAITV0lUTkVTU0VTX1BFUl9FUE9DSAAYS0VZX1dBVkVTX0VWRU5UX0VYRUNVVE9SAhRXQVZFU19FVkVOVF9FWEVDVVRPUgAWS0VZX0VWTV9FVkVOVF9FWEVDVVRPUgISRVZNX0VWRU5UX0VYRUNVVE9SABhLRVlfUkVXQVJEX1RPS0VOX0FERFJFU1MCFFJFV0FSRF9UT0tFTl9BRERSRVNTABFLRVlfUkVXQVJEX0FNT1VOVAINUkVXQVJEX0FNT1VOVAAORlVOQ19NSU5UX01BTlkCCG1pbnRNYW55ABdFVkVOVF9TVEFUVVNfUFJPQ0VTU0lORwABABZFVkVOVF9TVEFUVVNfQ09ORklSTUVEAAIAFUVWRU5UX1NUQVRVU19SRUpFQ1RFRAADAAdNQVhfSU5UAP//////////fwEQX3ZhbGlkYXRlQWRkcmVzcwIIYWRkcmVzc18EZXJyXwQHJG1hdGNoMAkApggBBQhhZGRyZXNzXwMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAFhBQckbWF0Y2gwBgkAAgEFBGVycl8BDl92YWxpZGF0ZUFzc2V0Aghhc3NldElkXwRlcnJfBAckbWF0Y2gwCQDsBwEJANkEAQUIYXNzZXRJZF8DCQABAgUHJG1hdGNoMAIFQXNzZXQEAWEFByRtYXRjaDAGCQACAQUEZXJyXwEMX3ZhbGlkYXRlSW50BAR2YWxfDmxvd2VyQm91bmRhcnlfDnVwcGVyQm91bmRhcnlfBGVycl8DAwkAZgIFDmxvd2VyQm91bmRhcnlfBQR2YWxfBgkAZgIFBHZhbF8FDnVwcGVyQm91bmRhcnlfCQACAQUEZXJyXwYBD192YWxpZGF0ZVN0cmluZwIEdmFsXwRlcnJfAwkAZwIAAAkAsQIBBQR2YWxfCQACAQUEZXJyXwYBFV92YWxpZGF0ZVBheW1lbnRzU2l6ZQMJcGF5bWVudHNfB3RhcmdldF8EZXJyXwMJAQIhPQIJAJADAQUJcGF5bWVudHNfBQd0YXJnZXRfCQACAQUEZXJyXwYBFV92YWxpZGF0ZVBheW1lbnRBc3NldAMIcGF5bWVudF8GYXNzZXRfBGVycl8DCQECIT0CCAUIcGF5bWVudF8HYXNzZXRJZAUGYXNzZXRfCQACAQUEZXJyXwYBEV92YWxpZGF0ZUV2ZW50SWR4AwR2YWxfBG1heF8EZXJyXwMDCQBmAgAABQR2YWxfBgkAZwIFBHZhbF8FBG1heF8JAAIBBQRlcnJfBgEUX3ZhbGlkYXRlRXZlbnRTdGF0dXMCBHZhbF8EZXJyXwMDCQBmAgUXRVZFTlRfU1RBVFVTX1BST0NFU1NJTkcFBHZhbF8GCQBmAgUEdmFsXwUVRVZFTlRfU1RBVFVT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dW50XwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABEV9zYXZlUHJveHlTZWNEZXBvAghhY2NvdW50XwR2YWxfCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQC5CQIJAMwIAgUSS0VZX1BST1hZX1NFQ19ERVBPCQDMCAIJAKUIAQUIYWNjb3VudF8FA25pbAUJU0VQQVJBVE9SBQR2YWxfBQNuaWwBGV9sb2FkUHJveHlTZWNEZXBvUGVyRXZlbnQABAckbWF0Y2gwCQCfCAEFHEtFWV9QUk9YWV9TRUNfREVQT19QRVJfRVZFTlQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABGV9zYXZlUHJveHlTZWNEZXBvUGVyRXZlbnQBBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIFHEtFWV9QUk9YWV9TRUNfREVQT19QRVJfRVZFTlQFBHZhbF8FA25pbAETX2xvYWRXYXZlc0V2ZW50U2l6ZQAEByRtYXRjaDAJAJ8IAQUUS0VZX1dBVkVTX0VWRU5UX1NJWkUDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABE19zYXZlV2F2ZXNFdmVudFNpemUBBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIFFEtFWV9XQVZFU19FVkVOVF9TSVpFBQR2YWxfBQNuaWwBEV9sb2FkRVZNRXZlbnRTaXplAAQHJG1hdGNoMAkAnwgBBRJLRVlfRVZNX0VWRU5UX1NJWkUDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABEV9zYXZlRVZNRXZlbnRTaXplAQR2YWxfCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJLRVlfRVZNX0VWRU5UX1NJWkUFBHZhbF8FA25pbAEPX2xvYWRXYXZlc0V2ZW50AQZpbmRleF8EByRtYXRjaDAJAKIIAQkAuQkCCQDMCAIFD0tFWV9XQVZFU19FVkVOVAkAzAgCCQCkAwEFBmluZGV4XwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBAZzdHJ1Y3QJALUJAgUBYQUJU0VQQVJBVE9SCQCfCg0J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RVZFTlRfU1RBVFVTCQDMCAIFCmV2ZW50SGFzaF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAARVfc2F2ZVdhdmVzRXZlbnRTdGF0dXMCCmV2ZW50SGFzaF8Hc3RhdHVzXwkAzAgCCQEMSW50ZWdlckVudHJ5AgkAuQkCCQDMCAIFFktFWV9XQVZFU19FVkVOVF9TVEFUVVMJAMwIAgUKZXZlbnRIYXNoXwUDbmlsBQlTRVBBUkFUT1IFB3N0YXR1c18FA25pbAETX2xvYWRFVk1FdmVudFN0YXR1cwEKZXZlbnRIYXNoXwQHJG1hdGNoMAkAnwgBCQC5CQIJAMwIAgUUS0VZX0VWTV9FVkVOVF9TVEFUVVMJAMwIAgUKZXZlbnRIYXNoXwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABE19zYXZlRVZNRXZlbnRTdGF0dXMCCmV2ZW50SGFzaF8Hc3RhdHVzXwkAzAgCCQEMSW50ZWdlckVudHJ5AgkAuQkCCQDMCAIFFEtFWV9FVk1fRVZFTlRfU1RBVFVTCQDMCAIFCmV2ZW50SGFzaF8FA25pbAUJU0VQQVJBVE9SBQdzdGF0dXNfBQNuaWwBIV9sb2FkUHVibGlzaGVkV2F2ZXNFdmVudEJ5V2l0bmVzcwIKcHVibGljS2V5XwhldmVudElkXwQHJG1hdGNoMAkAnwgBCQC5CQIJAMwIAgUZS0VZX1dBVkVTX0VWRU5UX1BVQkxJU0hFRAkAzAgCBQpwdWJsaWNLZXlfCQDMCAIJAKQDAQUIZXZlbnRJZF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAASFfc2F2ZVB1Ymxpc2hlZFdhdmVzRXZlbnRCeVdpdG5lc3MDCnB1YmxpY0tleV8IZXZlbnRJZF8EdmFsXwkAzAgCCQEMSW50ZWdlckVudHJ5AgkAuQkCCQDMCAIFGUtFWV9XQVZFU19FVkVOVF9QVUJMSVNIRUQJAMwIAgUKcHVibGljS2V5XwkAzAgCCQCkAwEFCGV2ZW50SWRfBQNuaWwFCVNFUEFSQVRPUgUEdmFsXwUDbmlsAR9fbG9hZFB1Ymxpc2hlZEVWTUV2ZW50QnlXaXRuZXNzAgpwdWJsaWNLZXlfCGV2ZW50SWRfBAckbWF0Y2gwCQCfCAEJALkJAgkAzAgCBRdLRVlfRVZNX0VWRU5UX1BVQkxJU0hFRAkAzAgCBQpwdWJsaWNLZXlfCQDMCAIJAKQDAQUIZXZlbnRJZF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAAR9fc2F2ZVB1Ymxpc2hlZEVWTUV2ZW50QnlXaXRuZXNzAwpwdWJsaWNLZXlfCGV2ZW50SWRfBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIJALkJAgkAzAgCBRdLRVlfRVZNX0VWRU5UX1BVQkxJU0hFRAkAzAgCBQpwdWJsaWNLZXlfCQDMCAIJAKQDAQUIZXZlbnRJZF8FA25pbAUJU0VQQVJBVE9SBQR2YWxfBQNuaWwBEV9sb2FkQ3VycmVudEVwb2NoAQ5jYWxsZXJDaGFpbklkXwQHJG1hdGNoMAkAnwgBCQC5CQIJAMwIAgURS0VZX0NVUlJFTlRfRVBPQ0gJAMwIAgkApAMBBQ5jYWxsZXJDaGFpbklkXwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABEV9zYXZlQ3VycmVudEVwb2NoAg5jYWxsZXJDaGFpbklkXwR2YWxfCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQC5CQIJAMwIAgURS0VZX0NVUlJFTlRfRVBPQ0gJAMwIAgkApAMBBQ5jYWxsZXJDaGFpbklkXwUDbmlsBQlTRVBBUkFUT1IFBHZhbF8FA25pbAEcX2xvYWRXYXZlc0V2ZW50Q2FsbGVySWR4U2l6ZQEOY2FsbGVyQ2hhaW5JZF8EByRtYXRjaDAJAJ8IAQkAuQkCCQDMCAIFFktFWV9XQVZFU19FVkVOVF9DQUxMRVIJAMwIAgkApAMBBQ5jYWxsZXJDaGFpbklkXwkAzAgCBQhLRVlfU0laRQUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABHF9zYXZlV2F2ZXNFdmVudENhbGxlcklkeFNpemUCDmNhbGxlckNoYWluSWRfBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIJALkJAgkAzAgCBRZLRVlfV0FWRVNfRVZFTlRfQ0FMTEVSCQDMCAIJAKQDAQUOY2FsbGVyQ2hhaW5JZF8JAMwIAgUIS0VZX1NJWkUFA25pbAUJU0VQQVJBVE9SBQR2YWxfBQNuaWwBGF9sb2FkV2F2ZXNFdmVudENhbGxlcklkeAIOY2FsbGVyQ2hhaW5JZF8EaWR4XwQHJG1hdGNoMAkAnwgBCQC5CQIJAMwIAgUWS0VZX1dBVkVTX0VWRU5UX0NBTExFUgkAzAgCCQCkAwEFDmNhbGxlckNoYWluSWRfCQDMCAIJAKQDAQUEaWR4XwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABGF9zYXZlV2F2ZXNFdmVudENhbGxlcklkeAMOY2FsbGVyQ2hhaW5JZF8EaWR4XwR2YWxfCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQC5CQIJAMwIAgUWS0VZX1dBVkVTX0VWRU5UX0NBTExFUgkAzAgCCQCkAwEFDmNhbGxlckNoYWluSWRfCQDMCAIJAKQDAQUEaWR4XwUDbmlsBQlTRVBBUkFUT1IFBHZhbF8FA25pbAEaX2xvYWRFVk1FdmVudENhbGxlcklkeFNpemUBDmNhbGxlckNoYWluSWRfBAckbWF0Y2gwCQCfCAEJALkJAgkAzAgCBRRLRVlfRVZNX0VWRU5UX0NBTExFUgkAzAgCCQCkAwEFDmNhbGxlckNoYWluSWRfCQDMCAIFCEtFWV9TSVpFBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAEaX3NhdmVFVk1FdmVudENhbGxlcklkeFNpemUCDmNhbGxlckNoYWluSWRfBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIJALkJAgkAzAgCBRRLRVlfRVZNX0VWRU5UX0NBTExFUgkAzAgCCQCkAwEFDmNhbGxlckNoYWluSWRfCQDMCAIFCEtFWV9TSVpFBQNuaWwFCVNFUEFSQVRPUgUEdmFsXwUDbmlsARZfbG9hZEVWTUV2ZW50Q2FsbGVySWR4Ag5jYWxsZXJDaGFpbklkXwRpZHhfBAckbWF0Y2gwCQCfCAEJALkJAgkAzAgCBRRLRVlfRVZNX0VWRU5UX0NBTExFUgkAzAgCCQCkAwEFDmNhbGxlckNoYWluSWRfCQDMCAIJAKQDAQUEaWR4XwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABFl9zYXZlRVZNRXZlbnRDYWxsZXJJZHgDDmNhbGxlckNoYWluSWRfBGlkeF8EdmFsXwkAzAgCCQEMSW50ZWdlckVudHJ5AgkAuQkCCQDMCAIFFEtFWV9FVk1fRVZFTlRfQ0FMTEVSCQDMCAIJAKQDAQUOY2FsbGVyQ2hhaW5JZF8JAMwIAgkApAMBBQRpZHhfBQNuaWwFCVNFUEFSQVRPUgUEdmFsXwUDbmlsAR5fbG9hZFdhdmVzRXZlbnRFeGVjdXRvcklkeFNpemUBEWV4ZWN1dGlvbkNoYWluSWRfBAckbWF0Y2gwCQCfCAEJALkJAgkAzAgCBRhLRVlfV0FWRVNfRVZFTlRfRVhFQ1VUT1IJAMwIAgkApAMBBRFleGVjdXRpb25DaGFpbklkXwkAzAgCBQhLRVlfU0laRQUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABHl9zYXZlV2F2ZXNFdmVudEV4ZWN1dG9ySWR4U2l6ZQIRZXhlY3V0aW9uQ2hhaW5JZF8EdmFsXwkAzAgCCQEMSW50ZWdlckVudHJ5AgkAuQkCCQDMCAIFGEtFWV9XQVZFU19FVkVOVF9FWEVDVVRPUgkAzAgCCQCkAwEFEWV4ZWN1dGlvbkNoYWluSWRfCQDMCAIFCEtFWV9TSVpFBQNuaWwFCVNFUEFSQVRPUgUEdmFsXwUDbmlsARpfbG9hZFdhdmVzRXZlbnRFeGVjdXRvcklkeAIRZXhlY3V0aW9uQ2hhaW5JZF8EaWR4XwQHJG1hdGNoMAkAnwgBCQC5CQIJAMwIAgUYS0VZX1dBVkVTX0VWRU5UX0VYRUNVVE9SCQDMCAIJAKQDAQURZXhlY3V0aW9uQ2hhaW5JZF8JAMwIAgkApAMBBQRpZHhfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAEaX3NhdmVXYXZlc0V2ZW50RXhlY3V0b3JJZHgDEWV4ZWN1dGlvbkNoYWluSWRfBGlkeF8EdmFsXwkAzAgCCQEMSW50ZWdlckVudHJ5AgkAuQkCCQDMCAIFGEtFWV9XQVZFU19FVkVOVF9FWEVDVVRPUgkAzAgCCQCkAwEFEWV4ZWN1dGlvbkNoYWluSWRfCQDMCAIJAKQDAQUEaWR4XwUDbmlsBQlTRVBBUkFUT1IFBHZhbF8FA25pbAEcX2xvYWRFVk1FdmVudEV4ZWN1dG9ySWR4U2l6ZQERZXhlY3V0aW9uQ2hhaW5JZF8EByRtYXRjaDAJAJ8IAQkAuQkCCQDMCAIFFktFWV9FVk1fRVZFTlRfRVhFQ1VUT1IJAMwIAgkApAMBBRFleGVjdXRpb25DaGFpbklkXwkAzAgCBQhLRVlfU0laRQUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABHF9zYXZlRVZNRXZlbnRFeGVjdXRvcklkeFNpemUCEWV4ZWN1dGlvbkNoYWluSWRfBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIJALkJAgkAzAgCBRZLRVlfRVZNX0VWRU5UX0VYRUNVVE9SCQDMCAIJAKQDAQURZXhlY3V0aW9uQ2hhaW5JZF8JAMwIAgUIS0VZX1NJWkUFA25pbAUJU0VQQVJBVE9SBQR2YWxfBQNuaWwBGF9sb2FkRVZNRXZlbnRFeGVjdXRvcklkeAIRZXhlY3V0aW9uQ2hhaW5JZF8EaWR4XwQHJG1hdGNoMAkAnwgBCQC5CQIJAMwIAgUWS0VZX0VWTV9FVkVOVF9FWEVDVVRPUgkAzAgCCQCkAwEFEWV4ZWN1dGlvbkNoYWluSWRfCQDMCAIJAKQDAQUEaWR4XwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABGF9zYXZlRVZNRXZlbnRFeGVjdXRvcklkeAMRZXhlY3V0aW9uQ2hhaW5JZF8EaWR4XwR2YWxfCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQC5CQIJAMwIAgUWS0VZX0VWTV9FVkVOVF9FWEVDVVRPUgkAzAgCCQCkAwEFEWV4ZWN1dGlvbkNoYWluSWRfCQDMCAIJAKQDAQUEaWR4XwUDbmlsBQlTRVBBUkFUT1IFBHZhbF8FA25pbAEOX2xvYWRXaXRuZXNzZXMCDmNhbGxlckNoYWluSWRfBmVwb2NoXwQHJG1hdGNoMAkAoggBCQC5CQIJAMwIAgUXS0VZX1dJVE5FU1NFU19QRVJfRVBPQ0gJAMwIAgkApAMBBQ5jYWxsZXJDaGFpbklkXwkAzAgCCQCkAwEFBmVwb2NoXwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwAwkAZgIJALECAQUBYQAACQC1CQIFAWEFCVNFUEFSQVRPUgUDbmlsBQNuaWwBDl9zYXZlV2l0bmVzc2VzAw5jYWxsZXJDaGFpbklkXwZlcG9jaF8Kd2l0bmVzc2VzXwkAzAgCCQELU3RyaW5nRW50cnkCCQC5CQIJAMwIAgUXS0VZX1dJVE5FU1NFU19QRVJfRVBPQ0gJAMwIAgkApAMBBQ5jYWxsZXJDaGFpbklkXwkAzAgCCQCkAwEFBmVwb2NoXwUDbmlsBQlTRVBBUkFUT1IJALkJAgUKd2l0bmVzc2VzXwUJU0VQQVJBVE9SBQNuaWwBF19sb2FkUmV3YXJkVG9rZW5BZGRyZXNzAAQHJG1hdGNoMAkAoggBBRhLRVlfUkVXQVJEX1RPS0VOX0FERFJFU1MDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFhCQEHQWRkcmVzcwEBAAEXX3NhdmVSZXdhcmRUb2tlbkFkZHJlc3MBBHZhbF8JAMwIAgkBC1N0cmluZ0VudHJ5AgUYS0VZX1JFV0FSRF9UT0tFTl9BRERSRVNTCQClCAEFBHZhbF8FA25pbAERX2xvYWRSZXdhcmRBbW91bnQABAckbWF0Y2gwCQCfCAEFEUtFWV9SRVdBUkRfQU1PVU5UAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAARFfc2F2ZVJld2FyZEFtb3VudAEEdmFsXwkAzAgCCQEMSW50ZWdlckVudHJ5AgURS0VZX1JFV0FSRF9BTU9VTlQFBHZhbF8FA25pbAERX29ubHlUaGlzQ29udHJhY3QBB2NhbGxlcl8DCQECIT0CBQdjYWxsZXJfBQR0aGlzCQACAQIZX29ubHlUaGlzQ29udHJhY3Q6IHJldmVydAYBEF93aGVuTXVsdGlzaWdTZXQAAwkAAAIJAQ1fbG9hZE11bHRpc2lnAAkBB0FkZHJlc3MBAQAJAAIBAhhfd2hlbk11bHRpc2lnU2V0OiByZXZlcnQGARNfd2hlbk5vdEluaXRpYWxpemVkAAMJAQlfbG9hZEluaXQACQACAQIbX3doZW5Ob3RJbml0aWFsaXplZDogcmV2ZXJ0BgEQX3doZW5Jbml0aWFsaXplZAADCQEBIQEJAQlfbG9hZEluaXQACQACAQIYX3doZW5Jbml0aWFsaXplZDogcmV2ZXJ0BgEQX2lzQWN0aXZlV2l0bmVzcwMKcHVibGljS2V5XwtwdWJsaWNLZXlzXwRlcnJfAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgULcHVibGljS2V5c18FCnB1YmxpY0tleV8JAAIBBQRlcnJfBgEXX25vdENvbmZpcm1lZFdhdmVzRXZlbnQCCmV2ZW50SGFzaF8EZXJyXwMJAGYCCQEVX2xvYWRXYXZlc0V2ZW50U3RhdHVzAQUKZXZlbnRIYXNoXwUXRVZFTlRfU1RBVFVTX1BST0NFU1NJTkcJAAIBBQRlcnJfBgEVX25vdENvbmZpcm1lZEVWTUV2ZW50AgpldmVudEhhc2hfBGVycl8DCQBmAgkBE19sb2FkRVZNRXZlbnRTdGF0dXMBBQpldmVudEhhc2hfBRdFVkVOVF9TVEFUVVNfUFJPQ0VTU0lORwkAAgEFBGVycl8GARNfd2F2ZXNFdmVudE5vdEV4aXN0AgpldmVudEhhc2hfBGVycl8DCQECIT0CCQEVX2xvYWRXYXZlc0V2ZW50U3RhdHVzAQUKZXZlbnRIYXNoXwAACQACAQUEZXJyXwYBEV9ldm1FdmVudE5vdEV4aXN0AgpldmVudEhhc2hfBGVycl8DCQECIT0CCQETX2xvYWRFVk1FdmVudFN0YXR1cwEFCmV2ZW50SGFzaF8AAAkAAgEFBGVycl8GASBfbm90UHVibGlzaGVkV2F2ZXNFdmVudEJ5V2l0bmVzcwMKcHVibGljS2V5XwhldmVudElkXwRlcnJfAwkBAiE9AgkBIV9sb2FkUHVibGlzaGVkV2F2ZXNFdmVudEJ5V2l0bmVzcwIFCnB1YmxpY0tleV8FCGV2ZW50SWRfAAAJAAIBBQRlcnJfBgEeX25vdFB1Ymxpc2hlZEVWTUV2ZW50QnlXaXRuZXNzAwpwdWJsaWNLZXlfCGV2ZW50SWRfBGVycl8DCQBmAgkBH19sb2FkUHVibGlzaGVkRVZNRXZlbnRCeVdpdG5lc3MCBQpwdWJsaWNLZXlfBQhldmVudElkXwAACQACAQUEZXJyXwYBEF9pc1F1b3J1bVJlYWNoZWQDDmNvbmZpcm1hdGlvbnNfBnRvdGFsXwx3aXRuZXNzU2l6ZV8DAwkAZgIFDmNvbmZpcm1hdGlvbnNfCQBpAgUMd2l0bmVzc1NpemVfAAIGCQBmAgkAZQIFBnRvdGFsXwUOY29uZmlybWF0aW9uc18JAGkCBQx3aXRuZXNzU2l6ZV8AAgYHAQ9fZ2V0RXZlbnRTdGF0dXMDDmNvbmZpcm1hdGlvbnNfBnRvdGFsXwx3aXRuZXNzU2l6ZV8DCQBmAgUOY29uZmlybWF0aW9uc18JAGkCBQx3aXRuZXNzU2l6ZV8AAgUWRVZFTlRfU1RBVFVTX0NPTkZJUk1FRAMJAGYCCQBlAgUGdG90YWxfBQ5jb25maXJtYXRpb25zXwkAaQIFDHdpdG5lc3NTaXplXwACBRVFVkVOVF9TVEFUVVNfUkVKRUNURUQFF0VWRU5UX1NUQVRVU19QUk9DRVNTSU5HARNfY2FsY1dhdmVzRXZlbnRIYXNoAQZldmVudF8ECmV2ZW50Qnl0ZXMJAMsBAgkAywECCQDLAQIJAMsBAgkAywECCQDLAQIJAMsBAgkAmgMBCAUGZXZlbnRfAl8xCQCaAwEIBQZldmVudF8CXzIJAJoDAQgFBmV2ZW50XwJfMwkAmwMBCAUGZXZlbnRfAl80CQCbAwEIBQZldmVudF8CXzUJAJsDAQkAuQkCCAUGZXZlbnRfAl82BQ5BUkdTX1NFUEFSQVRPUgkAmwMBCAUGZXZlbnRfAl83CQCaAwEIBQZldmVudF8CXzgJANgEAQkAjBUBBQpldmVudEJ5dGVzARFfY2FsY0VWTUV2ZW50SGFzaAEGZXZlbnRfBApldmVudEJ5dGVzCQDLAQIJAMsBAgkAywECCQDLAQIJAMsBAgkAywECCQCaAwEIBQZldmVudF8CXzEJAJoDAQgFBmV2ZW50XwJfMgkAmgMBCAUGZXZlbnRfAl8zCQCbAwEIBQZldmVudF8CXzQJAJsDAQgFBmV2ZW50XwJfNQkAmwMBCAUGZXZlbnRfAl82CQCaAwEIBQZldmVudF8CXzcJANgEAQkAjBUBBQpldmVudEJ5dGVzARJfc2V0V2F2ZXNFdmVudEhhc2gCBmV2ZW50XwVoYXNoXwkAnwoNCAUGZXZlbnRfAl8xCAUGZXZlbnRfAl8yCAUGZXZlbnRfAl8zCAUGZXZlbnRfAl80CAUGZXZlbnRfAl81CAUGZXZlbnRfAl82CAUGZXZlbnRfAl83CAUGZXZlbnRfAl84BQVoYXNoXwgFBmV2ZW50XwNfMTAIBQZldmVudF8DXzExCAUGZXZlbnRfA18xMggFBmV2ZW50XwNfMTMBEF9zZXRFVk1FdmVudEhhc2gCBmV2ZW50XwVoYXNoXwkAngoMCAUGZXZlbnRfAl8xCAUGZXZlbnRfAl8yCAUGZXZlbnRfAl8zCAUGZXZlbnRfAl80CAUGZXZlbnRfAl81CAUGZXZlbnRfAl82CAUGZXZlbnRfAl83BQVoYXNoXwgFBmV2ZW50XwJfOQgFBmV2ZW50XwNfMTAIBQZldmVudF8DXzExCAUGZXZlbnRfA18xMgEbX3NldFdhdmVzRXZlbnRDb25maXJtYXRpb25zAwZldmVudF8OY29uZmlybWF0aW9uc18GdG90YWxfCQCfCg0IBQZldmVudF8CXzEIBQZldmVudF8CXzIIBQZldmVudF8CXzMIBQZldmVudF8CXzQIBQZldmVudF8CXzUIBQZldmVudF8CXzYIBQZldmVudF8CXzcIBQZldmVudF8CXzgIBQZldmVudF8CXzkFDmNvbmZpcm1hdGlvbnNfBQZ0b3RhbF8IBQZldmVudF8DXzEyCAUGZXZlbnRfA18xMwEZX3NldEVWTUV2ZW50Q29uZmlybWF0aW9ucwMGZXZlbnRfDmNvbmZpcm1hdGlvbnNfBnRvdGFsXwkAngoMCAUGZXZlbnRfAl8xCAUGZXZlbnRfAl8yCAUGZXZlbnRfAl8zCAUGZXZlbnRfAl80CAUGZXZlbnRfAl81CAUGZXZlbnRfAl82CAUGZXZlbnRfAl83CAUGZXZlbnRfAl84BQ5jb25maXJtYXRpb25zXwUGdG90YWxfCAUGZXZlbnRfA18xMQgFBmV2ZW50XwNfMTIJAWkBBGluaXQDFXByb3h5U2VjRGVwb1BlckV2ZW50XxNyZXdhcmRUb2tlbkFkZHJlc3NfDXJld2FyZEFtb3VudF8EA2VycgMDAwMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARNfd2hlbk5vdEluaXRpYWxpemVkAAcJARBfd2hlbk11bHRpc2lnU2V0AAcJAQxfdmFsaWRhdGVJbnQEBRVwcm94eVNlY0RlcG9QZXJFdmVudF8AAAUHTUFYX0lOVAIiaW5pdDogaW52YWxpZCBwcm94eVNlY0RlcG9QZXJFdmVudAcJARBfdmFsaWRhdGVBZGRyZXNzAgUTcmV3YXJkVG9rZW5BZGRyZXNzXwIgaW5pdDogaW52YWxpZCByZXdhcmRUb2tlbkFkZHJlc3MHCQEMX3ZhbGlkYXRlSW50BAUNcmV3YXJkQW1vdW50XwAABQdNQVhfSU5UAhppbml0OiBpbnZhbGlkIHJld2FyZEFtb3VudAcDCQAAAgUDZXJyBQNlcnIJAJQKAgkAzggCCQDOCAIJAM4IAgkBCV9zYXZlSW5pdAEGCQEZX3NhdmVQcm94eVNlY0RlcG9QZXJFdmVudAEFFXByb3h5U2VjRGVwb1BlckV2ZW50XwkBF19zYXZlUmV3YXJkVG9rZW5BZGRyZXNzAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUTcmV3YXJkVG9rZW5BZGRyZXNzXwkBEV9zYXZlUmV3YXJkQW1vdW50AQUNcmV3YXJkQW1vdW50XwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARJzZXRBY3RpdmVXaXRuZXNzZXMCDmNhbGxlckNoYWluSWRfCndpdG5lc3Nlc18EA2VycgMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJARNfdmFsaWRhdGVQdWJsaWNLZXlzAgUKd2l0bmVzc2VzXwIlc2V0QWN0aXZlV2l0bmVzc2VzOiBpbnZhbGlkIHdpdG5lc3NlcwcDCQAAAgUDZXJyBQNlcnIEBWVwb2NoCQERX2xvYWRDdXJyZW50RXBvY2gBBQ5jYWxsZXJDaGFpbklkXwkAlAoCCQDOCAIJARFfc2F2ZUN1cnJlbnRFcG9jaAIFDmNhbGxlckNoYWluSWRfCQBkAgUFZXBvY2gAAQkBDl9zYXZlV2l0bmVzc2VzAwUOY2FsbGVyQ2hhaW5JZF8JAGQCBQVlcG9jaAABBQp3aXRuZXNzZXNfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFHN1Ym1pdFdhdmVzQ2FsbEV2ZW50CA5jYWxsZXJDaGFpbklkXxFleGVjdXRpb25DaGFpbklkXwZub25jZV8SZXhlY3V0aW9uQ29udHJhY3RfDWZ1bmN0aW9uTmFtZV8FYXJnc18HdHhIYXNoXwxibG9ja051bWJlcl8EA2VycgMDAwMDAwkBDF92YWxpZGF0ZUludAQFDmNhbGxlckNoYWluSWRfAAAFB01BWF9JTlQCK3N1Ym1pdFdhdmVzQ2FsbEV2ZW50OiBpbnZhbGlkIGNhbGxlckNoYWluSWQJAQxfdmFsaWRhdGVJbnQEBRFleGVjdXRpb25DaGFpbklkXwAABQdNQVhfSU5UAi5zdWJtaXRXYXZlc0NhbGxFdmVudDogaW52YWxpZCBleGVjdXRpb25DaGFpbklkBwkBDF92YWxpZGF0ZUludAQFBm5vbmNlXwAABQdNQVhfSU5UAiNzdWJtaXRXYXZlc0NhbGxFdmVudDogaW52YWxpZCBub25jZQcJAQ9fdmFsaWRhdGVTdHJpbmcCBRJleGVjdXRpb25Db250cmFjdF8CL3N1Ym1pdFdhdmVzQ2FsbEV2ZW50OiBpbnZhbGlkIGV4ZWN1dGlvbkNvbnRyYWN0BwkBD192YWxpZGF0ZVN0cmluZwIFDWZ1bmN0aW9uTmFtZV8CKnN1Ym1pdFdhdmVzQ2FsbEV2ZW50OiBpbnZhbGlkIGZ1bmN0aW9uTmFtZQcJAQ9fdmFsaWRhdGVTdHJpbmcCBQd0eEhhc2hfAiRzdWJtaXRXYXZlc0NhbGxFdmVudDogaW52YWxpZCB0eEhhc2gHCQEMX3ZhbGlkYXRlSW50BAUMYmxvY2tOdW1iZXJfAAAFB01BWF9JTlQCKXN1Ym1pdFdhdmVzQ2FsbEV2ZW50OiBpbnZhbGlkIGJsb2NrTnVtYmVyBwMJAAACBQNlcnIFA2VycgQMcHJveHlTZWNEZXBvCQERX2xvYWRQcm94eVNlY0RlcG8BCAUBaQZjYWxsZXIEFHByb3h5U2VjRGVwb1BlckV2ZW50CQEZX2xvYWRQcm94eVNlY0RlcG9QZXJFdmVudAAEE3Byb3h5U2VjRGVwb1VwZGF0ZWQJAGUCBQxwcm94eVNlY0RlcG8FFHByb3h5U2VjRGVwb1BlckV2ZW50BAVldmVudAkAnwoNBQ5jYWxsZXJDaGFpbklkXwURZXhlY3V0aW9uQ2hhaW5JZF8FBm5vbmNlXwUSZXhlY3V0aW9uQ29udHJhY3RfBQ1mdW5jdGlvbk5hbWVfBQVhcmdzXwUHdHhIYXNoXwUMYmxvY2tOdW1iZXJfAgAAAAAABRRwcm94eVNlY0RlcG9QZXJFdmVudAgFAWkGY2FsbGVyBAlldmVudFNpemUJARNfbG9hZFdhdmVzRXZlbnRTaXplAAQJZXZlbnRIYXNoCQETX2NhbGNXYXZlc0V2ZW50SGFzaAEFBWV2ZW50BAxldmVudFVwZGF0ZWQJARJfc2V0V2F2ZXNFdmVudEhhc2gCBQVldmVudAUJZXZlbnRIYXNoBARlcnIxAwkBE193YXZlc0V2ZW50Tm90RXhpc3QCBQlldmVudEhhc2gCJHN1Ym1pdFdhdmVzQ2FsbEV2ZW50OiBhbHJlYWR5IGV4aXN0cwkBDF92YWxpZGF0ZUludAQFE3Byb3h5U2VjRGVwb1VwZGF0ZWQAAAUHTUFYX0lOVAIpc3VibWl0V2F2ZXNDYWxsRXZlbnQ6IG5vIHNlY3VyaXR5IGRlcG9zaXQHAwkAAAIFBGVycjEFBGVycjEEDWNhbGxlcklkeFNpemUJARxfbG9hZFdhdmVzRXZlbnRDYWxsZXJJZHhTaXplAQUOY2FsbGVyQ2hhaW5JZF8JAJQKAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJARFfc2F2ZVByb3h5U2VjRGVwbwIIBQFpBmNhbGxlcgUTcHJveHlTZWNEZXBvVXBkYXRlZAkBD19zYXZlV2F2ZXNFdmVudAIFCWV2ZW50U2l6ZQUMZXZlbnRVcGRhdGVkCQEVX3NhdmVXYXZlc0V2ZW50U3RhdHVzAgUJZXZlbnRIYXNoBRdFVkVOVF9TVEFUVVNfUFJPQ0VTU0lORwkBE19zYXZlV2F2ZXNFdmVudFNpemUBCQBkAgUJZXZlbnRTaXplAAEJARhfc2F2ZVdhdmVzRXZlbnRDYWxsZXJJZHgDBQ5jYWxsZXJDaGFpbklkXwUNY2FsbGVySWR4U2l6ZQUJZXZlbnRTaXplCQEcX3NhdmVXYXZlc0V2ZW50Q2FsbGVySWR4U2l6ZQIFDmNhbGxlckNoYWluSWRfCQBkAgUNY2FsbGVySWR4U2l6ZQABBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEnN1Ym1pdEVWTUNhbGxFdmVudAcOY2FsbGVyQ2hhaW5JZF8RZXhlY3V0aW9uQ2hhaW5JZF8Gbm9uY2VfEmV4ZWN1dGlvbkNvbnRyYWN0XwljYWxsZGF0YV8HdHhIYXNoXwxibG9ja051bWJlcl8EA2VycgMDAwMDAwkBDF92YWxpZGF0ZUludAQFDmNhbGxlckNoYWluSWRfAAAFB01BWF9JTlQCKXN1Ym1pdEVWTUNhbGxFdmVudDogaW52YWxpZCBjYWxsZXJDaGFpbklkCQEMX3ZhbGlkYXRlSW50BAURZXhlY3V0aW9uQ2hhaW5JZF8AAAUHTUFYX0lOVAIsc3VibWl0RVZNQ2FsbEV2ZW50OiBpbnZhbGlkIGV4ZWN1dGlvbkNoYWluSWQHCQEMX3ZhbGlkYXRlSW50BAUGbm9uY2VfAAAFB01BWF9JTlQCIXN1Ym1pdEVWTUNhbGxFdmVudDogaW52YWxpZCBub25jZQcJAQ9fdmFsaWRhdGVTdHJpbmcCBRJleGVjdXRpb25Db250cmFjdF8CLXN1Ym1pdEVWTUNhbGxFdmVudDogaW52YWxpZCBleGVjdXRpb25Db250cmFjdAcJAQ9fdmFsaWRhdGVTdHJpbmcCBQljYWxsZGF0YV8CJHN1Ym1pdEVWTUNhbGxFdmVudDogaW52YWxpZCBjYWxsZGF0YQcJAQ9fdmFsaWRhdGVTdHJpbmcCBQd0eEhhc2hfAiJzdWJtaXRFVk1DYWxsRXZlbnQ6IGludmFsaWQgdHhIYXNoBwkBDF92YWxpZGF0ZUludAQFDGJsb2NrTnVtYmVyXwAABQdNQVhfSU5UAidzdWJtaXRFVk1DYWxsRXZlbnQ6IGludmFsaWQgYmxvY2tOdW1iZXIHAwkAAAIFA2VycgUDZXJyBAxwcm94eVNlY0RlcG8JARFfbG9hZFByb3h5U2VjRGVwbwEIBQFpBmNhbGxlcgQUcHJveHlTZWNEZXBvUGVyRXZlbnQJARlfbG9hZFByb3h5U2VjRGVwb1BlckV2ZW50AAQTcHJveHlTZWNEZXBvVXBkYXRlZAkAZQIFDHByb3h5U2VjRGVwbwUUcHJveHlTZWNEZXBvUGVyRXZlbnQEBWV2ZW50CQCeCgwFDmNhbGxlckNoYWluSWRfBRFleGVjdXRpb25DaGFpbklkXwUGbm9uY2VfBRJleGVjdXRpb25Db250cmFjdF8FCWNhbGxkYXRhXwUHdHhIYXNoXwUMYmxvY2tOdW1iZXJfAgAAAAAABRRwcm94eVNlY0RlcG9QZXJFdmVudAgFAWkGY2FsbGVyBAlldmVudFNpemUJARFfbG9hZEVWTUV2ZW50U2l6ZQAECWV2ZW50SGFzaAkBEV9jYWxjRVZNRXZlbnRIYXNoAQUFZXZlbnQEDGV2ZW50VXBkYXRlZAkBEF9zZXRFVk1FdmVudEhhc2gCBQVldmVudAUJZXZlbnRIYXNoBARlcnIxAwkBEV9ldm1FdmVudE5vdEV4aXN0AgUJZXZlbnRIYXNoAiJzdWJtaXRFVk1DYWxsRXZlbnQ6IGFscmVhZHkgZXhpc3RzCQEMX3ZhbGlkYXRlSW50BAUTcHJveHlTZWNEZXBvVXBkYXRlZAAABQdNQVhfSU5UAidzdWJtaXRFVk1DYWxsRXZlbnQ6IG5vIHNlY3VyaXR5IGRlcG9zaXQHAwkAAAIFBGVycjEFBGVycjEEDWNhbGxlcklkeFNpemUJARpfbG9hZEVWTUV2ZW50Q2FsbGVySWR4U2l6ZQEFDmNhbGxlckNoYWluSWRfCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQERX3NhdmVQcm94eVNlY0RlcG8CCAUBaQZjYWxsZXIFE3Byb3h5U2VjRGVwb1VwZGF0ZWQJAQ1fc2F2ZUVWTUV2ZW50AgUJZXZlbnRTaXplBQxldmVudFVwZGF0ZWQJARNfc2F2ZUVWTUV2ZW50U3RhdHVzAgUJZXZlbnRIYXNoBRdFVkVOVF9TVEFUVVNfUFJPQ0VTU0lORwkBEV9zYXZlRVZNRXZlbnRTaXplAQkAZAIFCWV2ZW50U2l6ZQABCQEWX3NhdmVFVk1FdmVudENhbGxlcklkeAMFDmNhbGxlckNoYWluSWRfBQ1jYWxsZXJJZHhTaXplBQlldmVudFNpemUJARpfc2F2ZUVWTUV2ZW50Q2FsbGVySWR4U2l6ZQIFDmNhbGxlckNoYWluSWRfCQBkAgUNY2FsbGVySWR4U2l6ZQABBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBF3B1Ymxpc2hXYXZlc0V2ZW50U3RhdHVzAglldmVudElkeF8Hc3RhdHVzXwQJZXZlbnRTaXplCQETX2xvYWRXYXZlc0V2ZW50U2l6ZQAED2NhbGxlclB1YmxpY0tleQkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkEA2VycgMJARFfdmFsaWRhdGVFdmVudElkeAMFCWV2ZW50SWR4XwUJZXZlbnRTaXplAipwdWJsaXNoV2F2ZXNFdmVudFN0YXR1czogaW52YWxpZCBldmVudCBpZHgJARRfdmFsaWRhdGVFdmVudFN0YXR1cwIFB3N0YXR1c18CJ3B1Ymxpc2hXYXZlc0V2ZW50U3RhdHVzOiBpbnZhbGlkIHN0YXR1cwcDCQAAAgUDZXJyBQNlcnIEBWV2ZW50CQEPX2xvYWRXYXZlc0V2ZW50AQUJZXZlbnRJZHhfBA1jYWxsZXJDaGFpbklkCAUFZXZlbnQCXzEEEGV4ZWN1dGlvbkNoYWluSWQIBQVldmVudAJfMgQJZXZlbnRIYXNoCAUFZXZlbnQCXzkEEmV2ZW50Q29uZmlybWF0aW9ucwgFBWV2ZW50A18xMAQKZXZlbnRUb3RhbAgFBWV2ZW50A18xMQQMcHJveHlTZWNEZXBvCAUFZXZlbnQDXzEyBAVwcm94eQgFBWV2ZW50A18xMwQFZXBvY2gJARFfbG9hZEN1cnJlbnRFcG9jaAEFDWNhbGxlckNoYWluSWQED2FjdGl2ZVdpdG5lc3NlcwkBDl9sb2FkV2l0bmVzc2VzAgUNY2FsbGVyQ2hhaW5JZAUFZXBvY2gEBGVycjEDAwkBEF9pc0FjdGl2ZVdpdG5lc3MDCQDYBAEIBQFpD2NhbGxlclB1YmxpY0tleQUPYWN0aXZlV2l0bmVzc2VzAidwdWJsaXNoV2F2ZXNFdmVudFN0YXR1czogaW52YWxpZCBjYWxsZXIJARdfbm90Q29uZmlybWVkV2F2ZXNFdmVudAIFCWV2ZW50SGFzaAIwcHVibGlzaFdhdmVzRXZlbnRTdGF0dXM6IGV2ZW50IGFscmVhZHkgY29uZmlybWVkBwkBIF9ub3RQdWJsaXNoZWRXYXZlc0V2ZW50QnlXaXRuZXNzAwUPY2FsbGVyUHVibGljS2V5BQlldmVudElkeF8CKnB1Ymxpc2hXYXZlc0V2ZW50U3RhdHVzOiBhbHJlYWR5IHB1Ymxpc2hlZAcDCQAAAgUEZXJyMQUEZXJyMQQMZXZlbnRVcGRhdGVkAwkAAAIFB3N0YXR1c18FFkVWRU5UX1NUQVRVU19DT05GSVJNRUQJARtfc2V0V2F2ZXNFdmVudENvbmZpcm1hdGlvbnMDBQVldmVudAkAZAIFEmV2ZW50Q29uZmlybWF0aW9ucwABCQBkAgUKZXZlbnRUb3RhbAABAwkAAAIFB3N0YXR1c18FFUVWRU5UX1NUQVRVU19SRUpFQ1RFRAkBG19zZXRXYXZlc0V2ZW50Q29uZmlybWF0aW9ucwMFBWV2ZW50BRJldmVudENvbmZpcm1hdGlvbnMJAGQCBQpldmVudFRvdGFsAAEJAAIBAilwdWJsaXNoV2F2ZXNFdmVudFN0YXR1czogaW5jb3JyZWN0IHN0YXR1cwQPZXhlY3V0b3JJZHhTaXplCQEeX2xvYWRXYXZlc0V2ZW50RXhlY3V0b3JJZHhTaXplAQUQZXhlY3V0aW9uQ2hhaW5JZAQMZmluYWxpemF0aW9uAwkBEF9pc1F1b3J1bVJlYWNoZWQDCAUMZXZlbnRVcGRhdGVkA18xMAgFDGV2ZW50VXBkYXRlZANfMTEJAJADAQUPYWN0aXZlV2l0bmVzc2VzBAZzdGF0dXMJAQ9fZ2V0RXZlbnRTdGF0dXMDCAUMZXZlbnRVcGRhdGVkA18xMAgFDGV2ZW50VXBkYXRlZANfMTEJAJADAQUPYWN0aXZlV2l0bmVzc2VzBBNwcm94eVNlY0RlcG9VcGRhdGVkAwkAAAIFBnN0YXR1cwUWRVZFTlRfU1RBVFVTX0NPTkZJUk1FRAkBEV9zYXZlUHJveHlTZWNEZXBvAgUFcHJveHkJAGQCCQERX2xvYWRQcm94eVNlY0RlcG8BBQVwcm94eQUMcHJveHlTZWNEZXBvAwkAAAIFBnN0YXR1cwUVRVZFTlRfU1RBVFVTX1JFSkVDVEVECQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQ1fbG9hZE11bHRpc2lnAAUMcHJveHlTZWNEZXBvBQR1bml0BQNuaWwFA25pbAQPcmV3YXJkQWRkcmVzc2VzCQDMCAIJAKUIAQUFcHJveHkJARVfcHVibGljS2V5c1RvQWRkcnNTdHIBBQ9hY3RpdmVXaXRuZXNzZXMEEHdpdG5lc3Nlc1Jld2FyZHMJAPwHBAkBF19sb2FkUmV3YXJkVG9rZW5BZGRyZXNzAAUORlVOQ19NSU5UX01BTlkJAMwIAgkBEV9sb2FkUmV3YXJkQW1vdW50AAkAzAgCBQ9yZXdhcmRBZGRyZXNzZXMFA25pbAUDbmlsAwkAAAIFEHdpdG5lc3Nlc1Jld2FyZHMFEHdpdG5lc3Nlc1Jld2FyZHMJAM4IAgkAzggCCQDOCAIFE3Byb3h5U2VjRGVwb1VwZGF0ZWQJARVfc2F2ZVdhdmVzRXZlbnRTdGF0dXMCBQlldmVudEhhc2gFBnN0YXR1cwkBGl9zYXZlV2F2ZXNFdmVudEV4ZWN1dG9ySWR4AwUQZXhlY3V0aW9uQ2hhaW5JZAUPZXhlY3V0b3JJZHhTaXplBQlldmVudElkeF8JAR5fc2F2ZVdhdmVzRXZlbnRFeGVjdXRvcklkeFNpemUCBRBleGVjdXRpb25DaGFpbklkCQBkAgUPZXhlY3V0b3JJZHhTaXplAAEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAkAlAoCCQDOCAIJAM4IAgkBD19zYXZlV2F2ZXNFdmVudAIFCWV2ZW50SWR4XwUMZXZlbnRVcGRhdGVkCQEhX3NhdmVQdWJsaXNoZWRXYXZlc0V2ZW50QnlXaXRuZXNzAwUPY2FsbGVyUHVibGljS2V5BQlldmVudElkeF8FB3N0YXR1c18FDGZpbmFsaXphdGlvbgUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARVwdWJsaXNoRVZNRXZlbnRTdGF0dXMCCWV2ZW50SWR4XwdzdGF0dXNfBAlldmVudFNpemUJARFfbG9hZEVWTUV2ZW50U2l6ZQAED2NhbGxlclB1YmxpY0tleQkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkEA2VycgMJARFfdmFsaWRhdGVFdmVudElkeAMFCWV2ZW50SWR4XwUJZXZlbnRTaXplAihwdWJsaXNoRVZNRXZlbnRTdGF0dXM6IGludmFsaWQgZXZlbnQgaWR4CQEUX3ZhbGlkYXRlRXZlbnRTdGF0dXMCBQdzdGF0dXNfAiVwdWJsaXNoRVZNRXZlbnRTdGF0dXM6IGludmFsaWQgc3RhdHVzBwMJAAACBQNlcnIFA2VycgQFZXZlbnQJAQ1fbG9hZEVWTUV2ZW50AQUJZXZlbnRJZHhfBA1jYWxsZXJDaGFpbklkCAUFZXZlbnQCXzEEEGV4ZWN1dGlvbkNoYWluSWQIBQVldmVudAJfMgQJZXZlbnRIYXNoCAUFZXZlbnQCXzgEEmV2ZW50Q29uZmlybWF0aW9ucwgFBWV2ZW50Al85BApldmVudFRvdGFsCAUFZXZlbnQDXzEwBAxwcm94eVNlY0RlcG8IBQVldmVudANfMTEEBXByb3h5CAUFZXZlbnQDXzEyBAVlcG9jaAkBEV9sb2FkQ3VycmVudEVwb2NoAQUNY2FsbGVyQ2hhaW5JZAQPYWN0aXZlV2l0bmVzc2VzCQEOX2xvYWRXaXRuZXNzZXMCBQ1jYWxsZXJDaGFpbklkBQVlcG9jaAQEZXJyMQMDCQEQX2lzQWN0aXZlV2l0bmVzcwMJANgEAQgFAWkPY2FsbGVyUHVibGljS2V5BQ9hY3RpdmVXaXRuZXNzZXMCJXB1Ymxpc2hFVk1FdmVudFN0YXR1czogaW52YWxpZCBjYWxsZXIJARVfbm90Q29uZmlybWVkRVZNRXZlbnQCBQlldmVudEhhc2gCLnB1Ymxpc2hFVk1FdmVudFN0YXR1czogZXZlbnQgYWxyZWFkeSBjb25maXJtZWQHCQEeX25vdFB1Ymxpc2hlZEVWTUV2ZW50QnlXaXRuZXNzAwUPY2FsbGVyUHVibGljS2V5BQlldmVudElkeF8CKHB1Ymxpc2hFVk1FdmVudFN0YXR1czogYWxyZWFkeSBwdWJsaXNoZWQHAwkAAAIFBGVycjEFBGVycjEEDGV2ZW50VXBkYXRlZAMJAAACBQdzdGF0dXNfBRZFVkVOVF9TVEFUVVNfQ09ORklSTUVECQEZX3NldEVWTUV2ZW50Q29uZmlybWF0aW9ucwMFBWV2ZW50CQBkAgUSZXZlbnRDb25maXJtYXRpb25zAAEJAGQCBQpldmVudFRvdGFsAAEDCQAAAgUHc3RhdHVzXwUVRVZFTlRfU1RBVFVTX1JFSkVDVEVECQEZX3NldEVWTUV2ZW50Q29uZmlybWF0aW9ucwMFBWV2ZW50BRJldmVudENvbmZpcm1hdGlvbnMJAGQCBQpldmVudFRvdGFsAAEJAAIBAidwdWJsaXNoRVZNRXZlbnRTdGF0dXM6IGluY29ycmVjdCBzdGF0dXMED2V4ZWN1dG9ySWR4U2l6ZQkBHF9sb2FkRVZNRXZlbnRFeGVjdXRvcklkeFNpemUBBRBleGVjdXRpb25DaGFpbklkBAxmaW5hbGl6YXRpb24DCQEQX2lzUXVvcnVtUmVhY2hlZAMIBQxldmVudFVwZGF0ZWQCXzkIBQxldmVudFVwZGF0ZWQDXzEwCQCQAwEFD2FjdGl2ZVdpdG5lc3NlcwQGc3RhdHVzCQEPX2dldEV2ZW50U3RhdHVzAwgFDGV2ZW50VXBkYXRlZAJfOQgFDGV2ZW50VXBkYXRlZANfMTAJAJADAQUPYWN0aXZlV2l0bmVzc2VzBBNwcm94eVNlY0RlcG9VcGRhdGVkAwkAAAIFBnN0YXR1cwUWRVZFTlRfU1RBVFVTX0NPTkZJUk1FRAkBEV9zYXZlUHJveHlTZWNEZXBvAgUFcHJveHkJAGQCCQERX2xvYWRQcm94eVNlY0RlcG8BBQVwcm94eQUMcHJveHlTZWNEZXBvAwkAAAIFBnN0YXR1cwUVRVZFTlRfU1RBVFVTX1JFSkVDVEVECQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQ1fbG9hZE11bHRpc2lnAAUMcHJveHlTZWNEZXBvBQR1bml0BQNuaWwFA25pbAQPcmV3YXJkQWRkcmVzc2VzCQDMCAIJAKUIAQUFcHJveHkJARVfcHVibGljS2V5c1RvQWRkcnNTdHIBBQ9hY3RpdmVXaXRuZXNzZXMEEHdpdG5lc3Nlc1Jld2FyZHMJAPwHBAkBF19sb2FkUmV3YXJkVG9rZW5BZGRyZXNzAAUORlVOQ19NSU5UX01BTlkJAMwIAgkBEV9sb2FkUmV3YXJkQW1vdW50AAkAzAgCBQ9yZXdhcmRBZGRyZXNzZXMFA25pbAUDbmlsAwkAAAIFEHdpdG5lc3Nlc1Jld2FyZHMFEHdpdG5lc3Nlc1Jld2FyZHMJAM4IAgkAzggCCQDOCAIFE3Byb3h5U2VjRGVwb1VwZGF0ZWQJARNfc2F2ZUVWTUV2ZW50U3RhdHVzAgUJZXZlbnRIYXNoBQZzdGF0dXMJARhfc2F2ZUVWTUV2ZW50RXhlY3V0b3JJZHgDBRBleGVjdXRpb25DaGFpbklkBQ9leGVjdXRvcklkeFNpemUFCWV2ZW50SWR4XwkBHF9zYXZlRVZNRXZlbnRFeGVjdXRvcklkeFNpemUCBRBleGVjdXRpb25DaGFpbklkCQBkAgUPZXhlY3V0b3JJZHhTaXplAAEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAkAlAoCCQDOCAIJAM4IAgkBDV9zYXZlRVZNRXZlbnQCBQlldmVudElkeF8FDGV2ZW50VXBkYXRlZAkBH19zYXZlUHVibGlzaGVkRVZNRXZlbnRCeVdpdG5lc3MDBQ9jYWxsZXJQdWJsaWNLZXkFCWV2ZW50SWR4XwUHc3RhdHVzXwUMZmluYWxpemF0aW9uBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBF2FkZFByb3h5U2VjdXJpdHlEZXBvc2l0AQpyZWNpcGllbnRfBAlyZWNpcGllbnQDCQAAAgUKcmVjaXBpZW50XwIACQClCAEIBQFpBmNhbGxlcgUKcmVjaXBpZW50XwQDZXJyAwMJARBfdmFsaWRhdGVBZGRyZXNzAgUJcmVjaXBpZW50AiphZGRQcm94eVNlY3VyaXR5RGVwb3NpdDogaW52YWxpZCByZWNpcGllbnQJARVfdmFsaWRhdGVQYXltZW50c1NpemUDCAUBaQhwYXltZW50cwABAiNhZGRQcm94eVNlY3VyaXR5RGVwb3NpdDogbm8gcGF5bWVudAcJARVfdmFsaWRhdGVQYXltZW50QXNzZXQDCQCRAwIIBQFpCHBheW1lbnRzAAAFBHVuaXQCJmFkZFByb3h5U2VjdXJpdHlEZXBvc2l0OiBpbnZhbGlkIGFzc2V0BwMJAAACBQNlcnIFA2VycgQNcmVjaXBpZW50QWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUJcmVjaXBpZW50BAdiYWxhbmNlCQERX2xvYWRQcm94eVNlY0RlcG8BBQ1yZWNpcGllbnRBZGRyBA51cGRhdGVkQmFsYW5jZQkAZAIFB2JhbGFuY2UICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQCUCgIJARFfc2F2ZVByb3h5U2VjRGVwbwIFDXJlY2lwaWVudEFkZHIFDnVwZGF0ZWRCYWxhbmNlBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBF3N1YlByb3h5U2VjdXJpdHlEZXBvc2l0AQdhbW91bnRfBAdiYWxhbmNlCQERX2xvYWRQcm94eVNlY0RlcG8BCAUBaQZjYWxsZXIDCQBmAgUHYW1vdW50XwUHYmFsYW5jZQkAAgECLXN1YlByb3h5U2VjdXJpdHlEZXBvc2l0OiBpbnN1ZmZpY2llbnQgYmFsYW5jZQkAlAoCCQDOCAIJARFfc2F2ZVByb3h5U2VjRGVwbwIIBQFpBmNhbGxlcgkAZQIFB2JhbGFuY2UFB2Ftb3VudF8JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQdhbW91bnRfBQR1bml0BQNuaWwFBHVuaXQBaQELc2V0TXVsdGlzaWcBCW11bHRpc2lnXwQDZXJyAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3ZhbGlkYXRlQWRkcmVzcwIFCW11bHRpc2lnXwIlc2V0TXVsdGlzaWc6IGludmFsaWQgbXVsdGlzaWcgYWRkcmVzcwcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBDV9zYXZlTXVsdGlzaWcBCQERQGV4dHJOYXRpdmUoMTA2MikBBQltdWx0aXNpZ18FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABAckbWF0Y2gwCQCiCAEFDEtFWV9NVUxUSVNJRwMJAAECBQckbWF0Y2gwAgZTdHJpbmcECG11bHRpc2lnBQckbWF0Y2gwCQELdmFsdWVPckVsc2UCCQCbCAIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCG11bHRpc2lnCQC5CQIJAMwIAgUKS0VZX1NUQVRVUwkAzAgCCQClCAEFBHRoaXMJAMwIAgkA2AQBCAUCdHgCaWQFA25pbAUJU0VQQVJBVE9SBwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tled0x4jo=", "height": 2482756, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: H1mjqckmKyrqNXCaVZFEXpZBtXKQzEem4PxyDvH9b3VV Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let SEPARATOR = "__"
5+
6+let ARGS_SEPARATOR = "####"
7+
8+let KEY_INIT = "INIT"
9+
10+let KEY_MULTISIG = "MULTISIG"
11+
12+let KEY_STATUS = "STATUS"
13+
14+let KEY_PROXY_SEC_DEPO = "PROXY_SECURITY_DEPOSIT"
15+
16+let KEY_PROXY_SEC_DEPO_PER_EVENT = "PROXY_SECURITY_DEPOSIT_PER_EVENT"
17+
18+let KEY_WAVES_EVENT = "WAVES_EVENT"
19+
20+let KEY_EVM_EVENT = "EVM_EVENT"
21+
22+let KEY_WAVES_EVENT_SIZE = "WAVES_EVENT_SIZE"
23+
24+let KEY_EVM_EVENT_SIZE = "EVM_EVENT_SIZE"
25+
26+let KEY_WAVES_EVENT_STATUS = "WAVES_EVENT_STATUS"
27+
28+let KEY_EVM_EVENT_STATUS = "EVM_EVENT_STATUS"
29+
30+let KEY_WAVES_EVENT_PUBLISHED = "WAVES_EVENT_PUBLISHED"
31+
32+let KEY_EVM_EVENT_PUBLISHED = "EVM_EVENT_PUBLISHED"
33+
34+let KEY_CURRENT_EPOCH = "CURRENT_EPOCH"
35+
36+let KEY_SIZE = "SIZE"
37+
38+let KEY_WAVES_EVENT_CALLER = "WAVES_EVENT_CALLER"
39+
40+let KEY_EVM_EVENT_CALLER = "EVM_EVENT_CALLER"
41+
42+let KEY_WITNESSES_PER_EPOCH = "WITNESSES_PER_EPOCH"
43+
44+let KEY_WAVES_EVENT_EXECUTOR = "WAVES_EVENT_EXECUTOR"
45+
46+let KEY_EVM_EVENT_EXECUTOR = "EVM_EVENT_EXECUTOR"
47+
48+let KEY_REWARD_TOKEN_ADDRESS = "REWARD_TOKEN_ADDRESS"
49+
50+let KEY_REWARD_AMOUNT = "REWARD_AMOUNT"
51+
52+let FUNC_MINT_MANY = "mintMany"
53+
54+let EVENT_STATUS_PROCESSING = 1
55+
56+let EVENT_STATUS_CONFIRMED = 2
57+
58+let EVENT_STATUS_REJECTED = 3
59+
60+let MAX_INT = 9223372036854775807
61+
62+func _validateAddress (address_,err_) = match addressFromString(address_) {
63+ case a: Address =>
64+ true
65+ case _ =>
66+ throw(err_)
67+}
68+
69+
70+func _validateAsset (assetId_,err_) = match assetInfo(fromBase58String(assetId_)) {
71+ case a: Asset =>
72+ true
73+ case _ =>
74+ throw(err_)
75+}
76+
77+
78+func _validateInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_))
79+ then true
80+ else (val_ > upperBoundary_))
81+ then throw(err_)
82+ else true
83+
84+
85+func _validateString (val_,err_) = if ((0 >= size(val_)))
86+ then throw(err_)
87+ else true
88+
89+
90+func _validatePaymentsSize (payments_,target_,err_) = if ((size(payments_) != target_))
91+ then throw(err_)
92+ else true
93+
94+
95+func _validatePaymentAsset (payment_,asset_,err_) = if ((payment_.assetId != asset_))
96+ then throw(err_)
97+ else true
98+
99+
100+func _validateEventIdx (val_,max_,err_) = if (if ((0 > val_))
101+ then true
102+ else (val_ >= max_))
103+ then throw(err_)
104+ else true
105+
106+
107+func _validateEventStatus (val_,err_) = if (if ((EVENT_STATUS_PROCESSING > val_))
108+ then true
109+ else (val_ > EVENT_STATUS_REJECTED))
110+ then throw(err_)
111+ else true
112+
113+
114+func _validatePublicKey (publicKey_,err_) = if ((size(fromBase58String(publicKey_)) != 32))
115+ then throw(err_)
116+ else true
117+
118+
119+func _validatePublicKeys (publicKeys_,err_) = {
120+ func foldFunc (acc,elem) = $Tuple2(if (acc._1)
121+ then _validatePublicKey(elem, acc._2)
122+ else false, acc._2)
123+
124+ let result = {
125+ let $l = publicKeys_
126+ let $s = size($l)
127+ let $acc0 = $Tuple2(true, err_)
128+ func $f0_1 ($a,$i) = if (($i >= $s))
129+ then $a
130+ else foldFunc($a, $l[$i])
131+
132+ func $f0_2 ($a,$i) = if (($i >= $s))
133+ then $a
134+ else throw("List size exceeds 10")
135+
136+ $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)
137+ }
138+ result._1
139+ }
140+
141+
142+func _publicKeysToAddrsStr (publicKeys_) = {
143+ func foldfunc (acc_,elem_) = (acc_ :+ toString(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+
160+func _loadInit () = match getBoolean(KEY_INIT) {
161+ case a: Boolean =>
162+ a
163+ case _ =>
164+ false
165+}
166+
167+
168+func _saveInit (isInit_) = [BooleanEntry(KEY_INIT, isInit_)]
169+
170+
171+func _loadMultisig () = match getString(KEY_MULTISIG) {
172+ case a: String =>
173+ addressFromStringValue(a)
174+ case _ =>
175+ Address(base58'')
176+}
177+
178+
179+func _saveMultisig (multisig_) = [StringEntry(KEY_MULTISIG, toString(multisig_))]
180+
181+
182+func _loadProxySecDepo (account_) = match getInteger(makeString([KEY_PROXY_SEC_DEPO, toString(account_)], SEPARATOR)) {
183+ case a: Int =>
184+ a
185+ case _ =>
186+ 0
187+}
188+
189+
190+func _saveProxySecDepo (account_,val_) = [IntegerEntry(makeString([KEY_PROXY_SEC_DEPO, toString(account_)], SEPARATOR), val_)]
191+
192+
193+func _loadProxySecDepoPerEvent () = match getInteger(KEY_PROXY_SEC_DEPO_PER_EVENT) {
194+ case a: Int =>
195+ a
196+ case _ =>
197+ 0
198+}
199+
200+
201+func _saveProxySecDepoPerEvent (val_) = [IntegerEntry(KEY_PROXY_SEC_DEPO_PER_EVENT, val_)]
202+
203+
204+func _loadWavesEventSize () = match getInteger(KEY_WAVES_EVENT_SIZE) {
205+ case a: Int =>
206+ a
207+ case _ =>
208+ 0
209+}
210+
211+
212+func _saveWavesEventSize (val_) = [IntegerEntry(KEY_WAVES_EVENT_SIZE, val_)]
213+
214+
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+
226+func _loadWavesEvent (index_) = match getString(makeString([KEY_WAVES_EVENT, toString(index_)], SEPARATOR)) {
227+ case a: String =>
228+ let struct = split(a, SEPARATOR)
229+ $Tuple13(parseIntValue(struct[0]), parseIntValue(struct[1]), parseIntValue(struct[2]), struct[3], struct[4], split(struct[5], ARGS_SEPARATOR), struct[6], parseIntValue(struct[7]), struct[8], parseIntValue(struct[9]), parseIntValue(struct[10]), parseIntValue(struct[11]), addressFromStringValue(struct[12]))
230+ case _ =>
231+ $Tuple13(0, 0, 0, "", "", nil, "", 0, "", 0, 0, 0, Address(base58''))
232+}
233+
234+
235+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, makeString(event_._6, ARGS_SEPARATOR), event_._7, toString(event_._8), event_._9, toString(event_._10), toString(event_._11), toString(event_._12), toString(event_._13)], 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+ $Tuple12(parseIntValue(struct[0]), parseIntValue(struct[1]), parseIntValue(struct[2]), struct[3], struct[4], struct[5], parseIntValue(struct[6]), struct[7], parseIntValue(struct[8]), parseIntValue(struct[9]), parseIntValue(struct[10]), addressFromStringValue(struct[11]))
242+ case _ =>
243+ $Tuple12(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, toString(event_._7), event_._8, toString(event_._9), toString(event_._10), toString(event_._11), toString(event_._12)], SEPARATOR))]
248+
249+
250+func _loadWavesEventStatus (eventHash_) = match getInteger(makeString([KEY_WAVES_EVENT_STATUS, eventHash_], SEPARATOR)) {
251+ case a: Int =>
252+ a
253+ case _ =>
254+ 0
255+}
256+
257+
258+func _saveWavesEventStatus (eventHash_,status_) = [IntegerEntry(makeString([KEY_WAVES_EVENT_STATUS, eventHash_], SEPARATOR), status_)]
259+
260+
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+
272+func _loadPublishedWavesEventByWitness (publicKey_,eventId_) = match getInteger(makeString([KEY_WAVES_EVENT_PUBLISHED, publicKey_, toString(eventId_)], SEPARATOR)) {
273+ case a: Int =>
274+ a
275+ case _ =>
276+ 0
277+}
278+
279+
280+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_)]
292+
293+
294+func _loadCurrentEpoch (callerChainId_) = match getInteger(makeString([KEY_CURRENT_EPOCH, toString(callerChainId_)], SEPARATOR)) {
295+ case a: Int =>
296+ a
297+ case _ =>
298+ 0
299+}
300+
301+
302+func _saveCurrentEpoch (callerChainId_,val_) = [IntegerEntry(makeString([KEY_CURRENT_EPOCH, toString(callerChainId_)], SEPARATOR), val_)]
303+
304+
305+func _loadWavesEventCallerIdxSize (callerChainId_) = match getInteger(makeString([KEY_WAVES_EVENT_CALLER, toString(callerChainId_), KEY_SIZE], SEPARATOR)) {
306+ case a: Int =>
307+ a
308+ case _ =>
309+ 0
310+}
311+
312+
313+func _saveWavesEventCallerIdxSize (callerChainId_,val_) = [IntegerEntry(makeString([KEY_WAVES_EVENT_CALLER, toString(callerChainId_), KEY_SIZE], SEPARATOR), val_)]
314+
315+
316+func _loadWavesEventCallerIdx (callerChainId_,idx_) = match getInteger(makeString([KEY_WAVES_EVENT_CALLER, toString(callerChainId_), toString(idx_)], SEPARATOR)) {
317+ case a: Int =>
318+ a
319+ case _ =>
320+ 0
321+}
322+
323+
324+func _saveWavesEventCallerIdx (callerChainId_,idx_,val_) = [IntegerEntry(makeString([KEY_WAVES_EVENT_CALLER, toString(callerChainId_), toString(idx_)], SEPARATOR), val_)]
325+
326+
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+
349+func _loadWavesEventExecutorIdxSize (executionChainId_) = match getInteger(makeString([KEY_WAVES_EVENT_EXECUTOR, toString(executionChainId_), KEY_SIZE], SEPARATOR)) {
350+ case a: Int =>
351+ a
352+ case _ =>
353+ 0
354+}
355+
356+
357+func _saveWavesEventExecutorIdxSize (executionChainId_,val_) = [IntegerEntry(makeString([KEY_WAVES_EVENT_EXECUTOR, toString(executionChainId_), KEY_SIZE], SEPARATOR), val_)]
358+
359+
360+func _loadWavesEventExecutorIdx (executionChainId_,idx_) = match getInteger(makeString([KEY_WAVES_EVENT_EXECUTOR, toString(executionChainId_), toString(idx_)], SEPARATOR)) {
361+ case a: Int =>
362+ a
363+ case _ =>
364+ 0
365+}
366+
367+
368+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_)]
391+
392+
393+func _loadWitnesses (callerChainId_,epoch_) = match getString(makeString([KEY_WITNESSES_PER_EPOCH, toString(callerChainId_), toString(epoch_)], SEPARATOR)) {
394+ case a: String =>
395+ if ((size(a) > 0))
396+ then split(a, SEPARATOR)
397+ else nil
398+ case _ =>
399+ nil
400+}
401+
402+
403+func _saveWitnesses (callerChainId_,epoch_,witnesses_) = [StringEntry(makeString([KEY_WITNESSES_PER_EPOCH, toString(callerChainId_), toString(epoch_)], SEPARATOR), makeString(witnesses_, SEPARATOR))]
404+
405+
406+func _loadRewardTokenAddress () = match getString(KEY_REWARD_TOKEN_ADDRESS) {
407+ case a: String =>
408+ addressFromStringValue(a)
409+ case _ =>
410+ Address(base58'')
411+}
412+
413+
414+func _saveRewardTokenAddress (val_) = [StringEntry(KEY_REWARD_TOKEN_ADDRESS, toString(val_))]
415+
416+
417+func _loadRewardAmount () = match getInteger(KEY_REWARD_AMOUNT) {
418+ case a: Int =>
419+ a
420+ case _ =>
421+ 0
422+}
423+
424+
425+func _saveRewardAmount (val_) = [IntegerEntry(KEY_REWARD_AMOUNT, val_)]
426+
427+
428+func _onlyThisContract (caller_) = if ((caller_ != this))
429+ then throw("_onlyThisContract: revert")
430+ else true
431+
432+
433+func _whenMultisigSet () = if ((_loadMultisig() == Address(base58'')))
434+ then throw("_whenMultisigSet: revert")
435+ else true
436+
437+
438+func _whenNotInitialized () = if (_loadInit())
439+ then throw("_whenNotInitialized: revert")
440+ else true
441+
442+
443+func _whenInitialized () = if (!(_loadInit()))
444+ then throw("_whenInitialized: revert")
445+ else true
446+
447+
448+func _isActiveWitness (publicKey_,publicKeys_,err_) = if (!(containsElement(publicKeys_, publicKey_)))
449+ then throw(err_)
450+ else true
451+
452+
453+func _notConfirmedWavesEvent (eventHash_,err_) = if ((_loadWavesEventStatus(eventHash_) > EVENT_STATUS_PROCESSING))
454+ then throw(err_)
455+ else true
456+
457+
458+func _notConfirmedEVMEvent (eventHash_,err_) = if ((_loadEVMEventStatus(eventHash_) > EVENT_STATUS_PROCESSING))
459+ then throw(err_)
460+ else true
461+
462+
463+func _wavesEventNotExist (eventHash_,err_) = if ((_loadWavesEventStatus(eventHash_) != 0))
464+ then throw(err_)
465+ else true
466+
467+
468+func _evmEventNotExist (eventHash_,err_) = if ((_loadEVMEventStatus(eventHash_) != 0))
469+ then throw(err_)
470+ else true
471+
472+
473+func _notPublishedWavesEventByWitness (publicKey_,eventId_,err_) = if ((_loadPublishedWavesEventByWitness(publicKey_, eventId_) != 0))
474+ then throw(err_)
475+ else true
476+
477+
478+func _notPublishedEVMEventByWitness (publicKey_,eventId_,err_) = if ((_loadPublishedEVMEventByWitness(publicKey_, eventId_) > 0))
479+ then throw(err_)
480+ else true
481+
482+
483+func _isQuorumReached (confirmations_,total_,witnessSize_) = if (if ((confirmations_ > (witnessSize_ / 2)))
484+ then true
485+ else ((total_ - confirmations_) > (witnessSize_ / 2)))
486+ then true
487+ else false
488+
489+
490+func _getEventStatus (confirmations_,total_,witnessSize_) = if ((confirmations_ > (witnessSize_ / 2)))
491+ then EVENT_STATUS_CONFIRMED
492+ else if (((total_ - confirmations_) > (witnessSize_ / 2)))
493+ then EVENT_STATUS_REJECTED
494+ else EVENT_STATUS_PROCESSING
495+
496+
497+func _calcWavesEventHash (event_) = {
498+ let eventBytes = (((((((toBytes(event_._1) + toBytes(event_._2)) + toBytes(event_._3)) + toBytes(event_._4)) + toBytes(event_._5)) + toBytes(makeString(event_._6, ARGS_SEPARATOR))) + toBytes(event_._7)) + toBytes(event_._8))
499+ toBase58String(keccak256_16Kb(eventBytes))
500+ }
501+
502+
503+func _calcEVMEventHash (event_) = {
504+ let eventBytes = ((((((toBytes(event_._1) + toBytes(event_._2)) + toBytes(event_._3)) + toBytes(event_._4)) + toBytes(event_._5)) + toBytes(event_._6)) + toBytes(event_._7))
505+ toBase58String(keccak256_16Kb(eventBytes))
506+ }
507+
508+
509+func _setWavesEventHash (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)
510+
511+
512+func _setEVMEventHash (event_,hash_) = $Tuple12(event_._1, event_._2, event_._3, event_._4, event_._5, event_._6, event_._7, hash_, event_._9, event_._10, event_._11, event_._12)
513+
514+
515+func _setWavesEventConfirmations (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)
516+
517+
518+func _setEVMEventConfirmations (event_,confirmations_,total_) = $Tuple12(event_._1, event_._2, event_._3, event_._4, event_._5, event_._6, event_._7, event_._8, confirmations_, total_, event_._11, event_._12)
519+
520+
521+@Callable(i)
522+func init (proxySecDepoPerEvent_,rewardTokenAddress_,rewardAmount_) = {
523+ let err = if (if (if (if (if (_onlyThisContract(i.caller))
524+ then _whenNotInitialized()
525+ else false)
526+ then _whenMultisigSet()
527+ else false)
528+ then _validateInt(proxySecDepoPerEvent_, 0, MAX_INT, "init: invalid proxySecDepoPerEvent")
529+ else false)
530+ then _validateAddress(rewardTokenAddress_, "init: invalid rewardTokenAddress")
531+ else false)
532+ then _validateInt(rewardAmount_, 0, MAX_INT, "init: invalid rewardAmount")
533+ else false
534+ if ((err == err))
535+ then $Tuple2((((_saveInit(true) ++ _saveProxySecDepoPerEvent(proxySecDepoPerEvent_)) ++ _saveRewardTokenAddress(addressFromStringValue(rewardTokenAddress_))) ++ _saveRewardAmount(rewardAmount_)), unit)
536+ else throw("Strict value is not equal to itself.")
537+ }
538+
539+
540+
541+@Callable(i)
542+func setActiveWitnesses (callerChainId_,witnesses_) = {
543+ let err = if (if (_onlyThisContract(i.caller))
544+ then _whenInitialized()
545+ else false)
546+ then _validatePublicKeys(witnesses_, "setActiveWitnesses: invalid witnesses")
547+ else false
548+ if ((err == err))
549+ then {
550+ let epoch = _loadCurrentEpoch(callerChainId_)
551+ $Tuple2((_saveCurrentEpoch(callerChainId_, (epoch + 1)) ++ _saveWitnesses(callerChainId_, (epoch + 1), witnesses_)), unit)
552+ }
553+ else throw("Strict value is not equal to itself.")
554+ }
555+
556+
557+
558+@Callable(i)
559+func submitWavesCallEvent (callerChainId_,executionChainId_,nonce_,executionContract_,functionName_,args_,txHash_,blockNumber_) = {
560+ let err = if (if (if (if (if (if (_validateInt(callerChainId_, 0, MAX_INT, "submitWavesCallEvent: invalid callerChainId"))
561+ then _validateInt(executionChainId_, 0, MAX_INT, "submitWavesCallEvent: invalid executionChainId")
562+ else false)
563+ then _validateInt(nonce_, 0, MAX_INT, "submitWavesCallEvent: invalid nonce")
564+ else false)
565+ then _validateString(executionContract_, "submitWavesCallEvent: invalid executionContract")
566+ else false)
567+ then _validateString(functionName_, "submitWavesCallEvent: invalid functionName")
568+ else false)
569+ then _validateString(txHash_, "submitWavesCallEvent: invalid txHash")
570+ else false)
571+ then _validateInt(blockNumber_, 0, MAX_INT, "submitWavesCallEvent: invalid blockNumber")
572+ else false
573+ if ((err == err))
574+ then {
575+ let proxySecDepo = _loadProxySecDepo(i.caller)
576+ let proxySecDepoPerEvent = _loadProxySecDepoPerEvent()
577+ let proxySecDepoUpdated = (proxySecDepo - proxySecDepoPerEvent)
578+ let event = $Tuple13(callerChainId_, executionChainId_, nonce_, executionContract_, functionName_, args_, txHash_, blockNumber_, "", 0, 0, proxySecDepoPerEvent, i.caller)
579+ let eventSize = _loadWavesEventSize()
580+ let eventHash = _calcWavesEventHash(event)
581+ let eventUpdated = _setWavesEventHash(event, eventHash)
582+ let err1 = if (_wavesEventNotExist(eventHash, "submitWavesCallEvent: already exists"))
583+ then _validateInt(proxySecDepoUpdated, 0, MAX_INT, "submitWavesCallEvent: no security deposit")
584+ else false
585+ if ((err1 == err1))
586+ then {
587+ let callerIdxSize = _loadWavesEventCallerIdxSize(callerChainId_)
588+ $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_,executionContract_,calldata_,txHash_,blockNumber_) = {
599+ let err = 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(executionContract_, "submitEVMCallEvent: invalid executionContract")
605+ else false)
606+ then _validateString(calldata_, "submitEVMCallEvent: invalid calldata")
607+ else false)
608+ then _validateString(txHash_, "submitEVMCallEvent: invalid txHash")
609+ else false)
610+ then _validateInt(blockNumber_, 0, MAX_INT, "submitEVMCallEvent: invalid blockNumber")
611+ else false
612+ if ((err == err))
613+ then {
614+ let proxySecDepo = _loadProxySecDepo(i.caller)
615+ let proxySecDepoPerEvent = _loadProxySecDepoPerEvent()
616+ let proxySecDepoUpdated = (proxySecDepo - proxySecDepoPerEvent)
617+ let event = $Tuple12(callerChainId_, executionChainId_, nonce_, executionContract_, calldata_, txHash_, blockNumber_, "", 0, 0, proxySecDepoPerEvent, i.caller)
618+ let eventSize = _loadEVMEventSize()
619+ let eventHash = _calcEVMEventHash(event)
620+ let eventUpdated = _setEVMEventHash(event, eventHash)
621+ let err1 = if (_evmEventNotExist(eventHash, "submitEVMCallEvent: already exists"))
622+ then _validateInt(proxySecDepoUpdated, 0, MAX_INT, "submitEVMCallEvent: no security deposit")
623+ else false
624+ if ((err1 == err1))
625+ then {
626+ let callerIdxSize = _loadEVMEventCallerIdxSize(callerChainId_)
627+ $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)
628+ }
629+ else throw("Strict value is not equal to itself.")
630+ }
631+ else throw("Strict value is not equal to itself.")
632+ }
633+
634+
635+
636+@Callable(i)
637+func publishWavesEventStatus (eventIdx_,status_) = {
638+ let eventSize = _loadWavesEventSize()
639+ let callerPublicKey = toBase58String(i.callerPublicKey)
640+ let err = if (_validateEventIdx(eventIdx_, eventSize, "publishWavesEventStatus: invalid event idx"))
641+ then _validateEventStatus(status_, "publishWavesEventStatus: invalid status")
642+ else false
643+ if ((err == err))
644+ then {
645+ let event = _loadWavesEvent(eventIdx_)
646+ let callerChainId = event._1
647+ let executionChainId = event._2
648+ let eventHash = event._9
649+ let eventConfirmations = event._10
650+ let eventTotal = event._11
651+ let proxySecDepo = event._12
652+ let proxy = event._13
653+ let epoch = _loadCurrentEpoch(callerChainId)
654+ let activeWitnesses = _loadWitnesses(callerChainId, epoch)
655+ let err1 = if (if (_isActiveWitness(toBase58String(i.callerPublicKey), activeWitnesses, "publishWavesEventStatus: invalid caller"))
656+ then _notConfirmedWavesEvent(eventHash, "publishWavesEventStatus: event already confirmed")
657+ else false)
658+ then _notPublishedWavesEventByWitness(callerPublicKey, eventIdx_, "publishWavesEventStatus: already published")
659+ else false
660+ if ((err1 == err1))
661+ then {
662+ let eventUpdated = if ((status_ == EVENT_STATUS_CONFIRMED))
663+ then _setWavesEventConfirmations(event, (eventConfirmations + 1), (eventTotal + 1))
664+ else if ((status_ == EVENT_STATUS_REJECTED))
665+ then _setWavesEventConfirmations(event, eventConfirmations, (eventTotal + 1))
666+ else throw("publishWavesEventStatus: incorrect status")
667+ let executorIdxSize = _loadWavesEventExecutorIdxSize(executionChainId)
668+ let finalization = if (_isQuorumReached(eventUpdated._10, eventUpdated._11, size(activeWitnesses)))
669+ then {
670+ let status = _getEventStatus(eventUpdated._10, eventUpdated._11, size(activeWitnesses))
671+ let proxySecDepoUpdated = if ((status == EVENT_STATUS_CONFIRMED))
672+ then _saveProxySecDepo(proxy, (_loadProxySecDepo(proxy) + proxySecDepo))
673+ else if ((status == EVENT_STATUS_REJECTED))
674+ then [ScriptTransfer(_loadMultisig(), proxySecDepo, unit)]
675+ else nil
676+ let rewardAddresses = [toString(proxy), _publicKeysToAddrsStr(activeWitnesses)]
677+ let witnessesRewards = invoke(_loadRewardTokenAddress(), FUNC_MINT_MANY, [_loadRewardAmount(), rewardAddresses], nil)
678+ if ((witnessesRewards == witnessesRewards))
679+ then (((proxySecDepoUpdated ++ _saveWavesEventStatus(eventHash, status)) ++ _saveWavesEventExecutorIdx(executionChainId, executorIdxSize, eventIdx_)) ++ _saveWavesEventExecutorIdxSize(executionChainId, (executorIdxSize + 1)))
680+ else throw("Strict value is not equal to itself.")
681+ }
682+ else nil
683+ $Tuple2(((_saveWavesEvent(eventIdx_, eventUpdated) ++ _savePublishedWavesEventByWitness(callerPublicKey, eventIdx_, status_)) ++ finalization), unit)
684+ }
685+ else throw("Strict value is not equal to itself.")
686+ }
687+ else throw("Strict value is not equal to itself.")
688+ }
689+
690+
691+
692+@Callable(i)
693+func publishEVMEventStatus (eventIdx_,status_) = {
694+ let eventSize = _loadEVMEventSize()
695+ let callerPublicKey = toBase58String(i.callerPublicKey)
696+ let err = if (_validateEventIdx(eventIdx_, eventSize, "publishEVMEventStatus: invalid event idx"))
697+ then _validateEventStatus(status_, "publishEVMEventStatus: invalid status")
698+ else false
699+ if ((err == err))
700+ then {
701+ let event = _loadEVMEvent(eventIdx_)
702+ let callerChainId = event._1
703+ let executionChainId = event._2
704+ let eventHash = event._8
705+ let eventConfirmations = event._9
706+ let eventTotal = event._10
707+ let proxySecDepo = event._11
708+ let proxy = event._12
709+ let epoch = _loadCurrentEpoch(callerChainId)
710+ let activeWitnesses = _loadWitnesses(callerChainId, epoch)
711+ let err1 = if (if (_isActiveWitness(toBase58String(i.callerPublicKey), activeWitnesses, "publishEVMEventStatus: invalid caller"))
712+ then _notConfirmedEVMEvent(eventHash, "publishEVMEventStatus: event already confirmed")
713+ else false)
714+ then _notPublishedEVMEventByWitness(callerPublicKey, eventIdx_, "publishEVMEventStatus: already published")
715+ else false
716+ if ((err1 == err1))
717+ then {
718+ let eventUpdated = if ((status_ == EVENT_STATUS_CONFIRMED))
719+ then _setEVMEventConfirmations(event, (eventConfirmations + 1), (eventTotal + 1))
720+ else if ((status_ == EVENT_STATUS_REJECTED))
721+ then _setEVMEventConfirmations(event, eventConfirmations, (eventTotal + 1))
722+ else throw("publishEVMEventStatus: incorrect status")
723+ let executorIdxSize = _loadEVMEventExecutorIdxSize(executionChainId)
724+ let finalization = if (_isQuorumReached(eventUpdated._9, eventUpdated._10, size(activeWitnesses)))
725+ then {
726+ let status = _getEventStatus(eventUpdated._9, eventUpdated._10, size(activeWitnesses))
727+ let proxySecDepoUpdated = if ((status == EVENT_STATUS_CONFIRMED))
728+ then _saveProxySecDepo(proxy, (_loadProxySecDepo(proxy) + proxySecDepo))
729+ else if ((status == EVENT_STATUS_REJECTED))
730+ then [ScriptTransfer(_loadMultisig(), proxySecDepo, unit)]
731+ else nil
732+ let rewardAddresses = [toString(proxy), _publicKeysToAddrsStr(activeWitnesses)]
733+ let witnessesRewards = invoke(_loadRewardTokenAddress(), FUNC_MINT_MANY, [_loadRewardAmount(), rewardAddresses], nil)
734+ if ((witnessesRewards == witnessesRewards))
735+ then (((proxySecDepoUpdated ++ _saveEVMEventStatus(eventHash, status)) ++ _saveEVMEventExecutorIdx(executionChainId, executorIdxSize, eventIdx_)) ++ _saveEVMEventExecutorIdxSize(executionChainId, (executorIdxSize + 1)))
736+ else throw("Strict value is not equal to itself.")
737+ }
738+ else nil
739+ $Tuple2(((_saveEVMEvent(eventIdx_, eventUpdated) ++ _savePublishedEVMEventByWitness(callerPublicKey, eventIdx_, status_)) ++ finalization), unit)
740+ }
741+ else throw("Strict value is not equal to itself.")
742+ }
743+ else throw("Strict value is not equal to itself.")
744+ }
745+
746+
747+
748+@Callable(i)
749+func addProxySecurityDeposit (recipient_) = {
750+ let recipient = if ((recipient_ == ""))
751+ then toString(i.caller)
752+ else recipient_
753+ let err = if (if (_validateAddress(recipient, "addProxySecurityDeposit: invalid recipient"))
754+ then _validatePaymentsSize(i.payments, 1, "addProxySecurityDeposit: no payment")
755+ else false)
756+ then _validatePaymentAsset(i.payments[0], unit, "addProxySecurityDeposit: invalid asset")
757+ else false
758+ if ((err == err))
759+ then {
760+ let recipientAddr = addressFromStringValue(recipient)
761+ let balance = _loadProxySecDepo(recipientAddr)
762+ let updatedBalance = (balance + i.payments[0].amount)
763+ $Tuple2(_saveProxySecDepo(recipientAddr, updatedBalance), unit)
764+ }
765+ else throw("Strict value is not equal to itself.")
766+ }
767+
768+
769+
770+@Callable(i)
771+func subProxySecurityDeposit (amount_) = {
772+ let balance = _loadProxySecDepo(i.caller)
773+ if ((amount_ > balance))
774+ then throw("subProxySecurityDeposit: insufficient balance")
775+ else $Tuple2((_saveProxySecDepo(i.caller, (balance - amount_)) ++ [ScriptTransfer(i.caller, amount_, unit)]), unit)
776+ }
777+
778+
779+
780+@Callable(i)
781+func setMultisig (multisig_) = {
782+ let err = if (_onlyThisContract(i.caller))
783+ then _validateAddress(multisig_, "setMultisig: invalid multisig address")
784+ else false
785+ if ((err == err))
786+ then $Tuple2(_saveMultisig(addressFromStringValue(multisig_)), unit)
787+ else throw("Strict value is not equal to itself.")
788+ }
789+
790+
791+@Verifier(tx)
792+func verify () = match getString(KEY_MULTISIG) {
793+ case multisig: String =>
794+ valueOrElse(getBoolean(addressFromStringValue(multisig), makeString([KEY_STATUS, toString(this), toBase58String(tx.id)], SEPARATOR)), false)
795+ case _ =>
796+ sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
797+}
798+

github/deemru/w8io/3ef1775 
61.89 ms