tx · 5sBtdFLYPfixMZ2Y4UB5CSPpDvH5hypwro9AtRBeCbbp

3N1BEXuoepNEwqkbeZYKviaLQfvBQV3ibYE:  -0.02100000 Waves

2023.05.29 13:16 [2599134] smart account 3N1BEXuoepNEwqkbeZYKviaLQfvBQV3ibYE > SELF 0.00000000 Waves

{ "type": 13, "id": "5sBtdFLYPfixMZ2Y4UB5CSPpDvH5hypwro9AtRBeCbbp", "fee": 2100000, "feeAssetId": null, "timestamp": 1685355447434, "version": 2, "chainId": 84, "sender": "3N1BEXuoepNEwqkbeZYKviaLQfvBQV3ibYE", "senderPublicKey": "6t3vrhP1jCmG7CeKBmL8hUibtdP3cMXGC2XtPYEPPC5w", "proofs": [ "4G5wodX5a7EYe29xxHuneq2j1gGiABAjNpai3646guZHiBeyrgeL8YGkUZXmn29ZNGXkR7ZF37ZHtTiraPBnFw1i" ], "script": "base64:BgIqCAISBQoDCAEIEgMKAQgSBAoCCAQSAwoBCBIDCgEIEgQKAggBEgQKAggBNQAJc2VwYXJhdG9yAgJfXwAFTVVMVDgAgMLXLwEHd3JhcEVycgEDbXNnCQC5CQIJAMwIAgIYdm90aW5nX3ZlcmlmaWVkX3YyLnJpZGU6CQDMCAIFA21zZwUDbmlsAgEgAQh0aHJvd0VycgEDbXNnCQACAQkBB3dyYXBFcnIBBQNtc2cBBWFzSW50AQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAgNJbnQEBnZhbEludAUHJG1hdGNoMAUGdmFsSW50CQACAQIbRmFpbGVkIHRvIGNhc3QgaW50byBJbnRlZ2VyARBnZXRJbnRlZ2VyT3JaZXJvAgdhZGRyZXNzA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQdhZGRyZXNzBQNrZXkAAAEQZ2V0SW50ZWdlck9yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQdhZGRyZXNzBQNrZXkJAQd3cmFwRXJyAQkArAICBQNrZXkCDyBpcyBub3QgZGVmaW5lZAEQZ2V0U3RyaW5nT3JFbXB0eQIHYWRkcmVzcwNrZXkJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUHYWRkcmVzcwUDa2V5AgABD2dldFN0cmluZ09yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQdhZGRyZXNzBQNrZXkJAQd3cmFwRXJyAQkArAICBQNrZXkCDyBpcyBub3QgZGVmaW5lZAATa2V5Qm9vc3RpbmdDb250cmFjdAkAuQkCCQDMCAICAiVzCQDMCAICEGJvb3N0aW5nQ29udHJhY3QFA25pbAUJc2VwYXJhdG9yABNrZXlFbWlzc2lvbkNvbnRyYWN0CQC5CQIJAMwIAgICJXMJAMwIAgIQZW1pc3Npb25Db250cmFjdAUDbmlsBQlzZXBhcmF0b3IAFmtleUFzc2V0c1N0b3JlQ29udHJhY3QJALkJAgkAzAgCAgIlcwkAzAgCAhNhc3NldHNTdG9yZUNvbnRyYWN0BQNuaWwFCXNlcGFyYXRvcgAQYm9vc3RpbmdDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTgpAQUTa2V5Qm9vc3RpbmdDb250cmFjdAAQZW1pc3Npb25Db250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTgpAQUTa2V5RW1pc3Npb25Db250cmFjdAATYXNzZXRzU3RvcmVDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTgpAQUWa2V5QXNzZXRzU3RvcmVDb250cmFjdAARa2V5RW1pc3Npb25Db25maWcJALkJAgkAzAgCAgIlcwkAzAgCAgZjb25maWcFA25pbAUJc2VwYXJhdG9yAAx3eEFzc2V0SWRTdHIJAJEDAgkAtQkCCQEPZ2V0U3RyaW5nT3JGYWlsAgUQZW1pc3Npb25Db250cmFjdAURa2V5RW1pc3Npb25Db25maWcFCXNlcGFyYXRvcgABAAl3eEFzc2V0SWQJANkEAQUMd3hBc3NldElkU3RyABVrZXlWb3RpbmdUaHJlc2hvbGRBZGQJALkJAgkAzAgCAgQlcyVzCQDMCAICD3ZvdGluZ1RocmVzaG9sZAkAzAgCAgNhZGQFA25pbAUJc2VwYXJhdG9yABhrZXlWb3RpbmdUaHJlc2hvbGRSZW1vdmUJALkJAgkAzAgCAgQlcyVzCQDMCAICD3ZvdGluZ1RocmVzaG9sZAkAzAgCAgZyZW1vdmUFA25pbAUJc2VwYXJhdG9yARJrZXlQZXJpb2RMZW5ndGhBZGQCB2Fzc2V0SWQFaW5kZXgJALkJAgkAzAgCAgYlcyVzJWQJAMwIAgIPcGVyaW9kTGVuZ3RoQWRkCQDMCAIFB2Fzc2V0SWQJAMwIAgkApAMBBQVpbmRleAUDbmlsBQlzZXBhcmF0b3IAFWtleVBlcmlvZExlbmd0aFJlbW92ZQkAuQkCCQDMCAICAiVzCQDMCAICEnBlcmlvZExlbmd0aFJlbW92ZQUDbmlsBQlzZXBhcmF0b3IBG2tleUN1cnJlbnRWb3RpbmdIZWlnaHRTdGFydAIHYXNzZXRJZAVpbmRleAkAuQkCCQDMCAICBiVzJXMlZAkAzAgCAhhjdXJyZW50Vm90aW5nSGVpZ2h0U3RhcnQJAMwIAgUHYXNzZXRJZAkAzAgCCQCkAwEFBWluZGV4BQNuaWwFCXNlcGFyYXRvcgELa2V5VmVyaWZpZWQBB2Fzc2V0SWQJALkJAgkAzAgCAgQlcyVzCQDMCAICCHZlcmlmaWVkCQDMCAIFB2Fzc2V0SWQFA25pbAUJc2VwYXJhdG9yARlrZXlWZXJpZmljYXRpb25JblByb2dyZXNzAQdhc3NldElkCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICDHZlcmlmaWNhdGlvbgkAzAgCAgppblByb2dyZXNzCQDMCAIFB2Fzc2V0SWQFA25pbAUJc2VwYXJhdG9yARtrZXlEZXZlcmlmaWNhdGlvbkluUHJvZ3Jlc3MBB2Fzc2V0SWQJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIOZGV2ZXJpZmljYXRpb24JAMwIAgIKaW5Qcm9ncmVzcwkAzAgCBQdhc3NldElkBQNuaWwFCXNlcGFyYXRvcgASa2V5TWF4UGVyaW9kTGVuZ3RoCQC5CQIJAMwIAgICJXMJAMwIAgIPbWF4UGVyaW9kTGVuZ3RoBQNuaWwFCXNlcGFyYXRvcgASa2V5TWluUGVyaW9kTGVuZ3RoCQC5CQIJAMwIAgICJXMJAMwIAgIPbWluUGVyaW9kTGVuZ3RoBQNuaWwFCXNlcGFyYXRvcgEWa2V5Vm90aW5nUmV3YXJkQXNzZXRJZAIHYXNzZXRJZAVpbmRleAkAuQkCCQDMCAICBiVzJXMlZAkAzAgCAhN2b3RpbmdSZXdhcmRBc3NldElkCQDMCAIFB2Fzc2V0SWQJAMwIAgkApAMBBQVpbmRleAUDbmlsBQlzZXBhcmF0b3IBFGtleVRvdGFsVm90aW5nUmV3YXJkAgdhc3NldElkBWluZGV4CQC5CQIJAMwIAgIGJXMlcyVkCQDMCAICDHZvdGluZ1Jld2FyZAkAzAgCBQdhc3NldElkCQDMCAIJAKQDAQUFaW5kZXgFA25pbAUJc2VwYXJhdG9yABtrZXlGaW5hbGl6ZUNhbGxSZXdhcmRBbW91bnQJALkJAgkAzAgCAgIlcwkAzAgCAhhmaW5hbGl6ZUNhbGxSZXdhcmRBbW91bnQFA25pbAUJc2VwYXJhdG9yABprZXlNaW5TdWdnZXN0UmVtb3ZlQmFsYW5jZQkAuQkCCQDMCAICAiVzCQDMCAICF21pblN1Z2dlc3RSZW1vdmVCYWxhbmNlBQNuaWwFCXNlcGFyYXRvcgEPa2V5Q3VycmVudEluZGV4AQdhc3NldElkCQC5CQIJAMwIAgIEJXMlcwkAzAgCAgxjdXJyZW50SW5kZXgJAMwIAgUHYXNzZXRJZAUDbmlsBQlzZXBhcmF0b3IBB2tleVZvdGUDB2Fzc2V0SWQFaW5kZXgGY2FsbGVyCQC5CQIJAMwIAgIIJXMlcyVkJXMJAMwIAgIEdm90ZQkAzAgCBQdhc3NldElkCQDMCAIJAKQDAQUFaW5kZXgJAMwIAgkApQgBBQZjYWxsZXIFA25pbAUJc2VwYXJhdG9yAQl2b3RlVmFsdWUCB2luRmF2b3IJZ3d4QW1vdW50CQC5CQIJAMwIAgIEJXMlZAkAzAgCCQClAwEFB2luRmF2b3IJAMwIAgkApAMBBQlnd3hBbW91bnQFA25pbAUJc2VwYXJhdG9yAQ9rZXlWb3RpbmdSZXN1bHQCB2Fzc2V0SWQFaW5kZXgJALkJAgkAzAgCAgYlcyVzJWQJAMwIAgIMdm90aW5nUmVzdWx0CQDMCAIFB2Fzc2V0SWQJAMwIAgkApAMBBQVpbmRleAUDbmlsBQlzZXBhcmF0b3IBC3ZvdGluZ1ZhbHVlAglmb3JBbW91bnQNYWdhaW5zdEFtb3VudAkAuQkCCQDMCAICBCVkJWQJAMwIAgkApAMBBQlmb3JBbW91bnQJAMwIAgkApAMBBQ1hZ2FpbnN0QW1vdW50BQNuaWwFCXNlcGFyYXRvcgASZGVmYXVsdFZvdGluZ1ZhbHVlCQC5CQIJAMwIAgIEJWQlZAkAzAgCAgEwCQDMCAICATAFA25pbAUJc2VwYXJhdG9yARBrZXlTdWdnZXN0SXNzdWVyAgdhc3NldElkBWluZGV4CQC5CQIJAMwIAgIGJXMlcyVkCQDMCAICDXN1Z2dlc3RJc3N1ZXIJAMwIAgUHYXNzZXRJZAkAzAgCCQCkAwEFBWluZGV4BQNuaWwFCXNlcGFyYXRvcgEPa2V5Q2xhaW1IaXN0b3J5Awt1c2VyQWRkcmVzcwdhc3NldElkBWluZGV4CQC5CQIJAMwIAgIIJXMlcyVzJWQJAMwIAgIHaGlzdG9yeQkAzAgCCQClCAEFC3VzZXJBZGRyZXNzCQDMCAIFB2Fzc2V0SWQJAMwIAgkApAMBBQVpbmRleAUDbmlsBQlzZXBhcmF0b3IBEWNsYWltSGlzdG9yeVZhbHVlAQlnd3hBbW91bnQJALkJAgkAzAgCAgQlZCVzCQDMCAIJAKQDAQUJZ3d4QW1vdW50BQNuaWwFCXNlcGFyYXRvcgESa2V5Vm90aW5nRW5kSGVpZ2h0Agdhc3NldElkBWluZGV4CQC5CQIJAMwIAgIGJXMlcyVkCQDMCAICD3ZvdGluZ0VuZEhlaWdodAkAzAgCBQdhc3NldElkCQDMCAIJAKQDAQUFaW5kZXgFA25pbAUJc2VwYXJhdG9yAA5rZXlGZWVQZXJCbG9jawkAuQkCCQDMCAICAiVzCQDMCAICC2ZlZVBlckJsb2NrBQNuaWwFCXNlcGFyYXRvcgALZmVlUGVyQmxvY2sJARBnZXRJbnRlZ2VyT3JGYWlsAgUEdGhpcwUOa2V5RmVlUGVyQmxvY2sAJmtleU1pbld4TWluRm9yU3VnZ2VzdEFkZEFtb3VudFJlcXVpcmVkCQC5CQIJAMwIAgICJXMJAMwIAgIgd3hNaW5Gb3JTdWdnZXN0QWRkQW1vdW50UmVxdWlyZWQFA25pbAUJc2VwYXJhdG9yACNrZXlXeEZvclN1Z2dlc3RSZW1vdmVBbW91bnRSZXF1aXJlZAkAuQkCCQDMCAICAiVzCQDMCAICIHd4Rm9yU3VnZ2VzdFJlbW92ZUFtb3VudFJlcXVpcmVkBQNuaWwFCXNlcGFyYXRvcgEYZ2V0VXNlckd3eEFtb3VudEF0SGVpZ2h0Agt1c2VyQWRkcmVzcwx0YXJnZXRIZWlnaHQECWd3eEFtb3VudAkA/AcEBRBib29zdGluZ0NvbnRyYWN0AiBnZXRVc2VyR3d4QW1vdW50QXRIZWlnaHRSRUFET05MWQkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCBQx0YXJnZXRIZWlnaHQFA25pbAUDbmlsCQEFYXNJbnQBBQlnd3hBbW91bnQBFmtleU1hbmFnZXJWYXVsdEFkZHJlc3MAAhclc19fbWFuYWdlclZhdWx0QWRkcmVzcwETa2V5TWFuYWdlclB1YmxpY0tleQACFCVzX19tYW5hZ2VyUHVibGljS2V5ARxnZXRNYW5hZ2VyVmF1bHRBZGRyZXNzT3JUaGlzAAQHJG1hdGNoMAkAoggBCQEWa2V5TWFuYWdlclZhdWx0QWRkcmVzcwADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFzBQR0aGlzARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAQTbWFuYWdlclZhdWx0QWRkcmVzcwkBHGdldE1hbmFnZXJWYXVsdEFkZHJlc3NPclRoaXMABAckbWF0Y2gwCQCdCAIFE21hbmFnZXJWYXVsdEFkZHJlc3MJARNrZXlNYW5hZ2VyUHVibGljS2V5AAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJANkEAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBEXZvdGluZ0V4aXN0Q2hlY2tzAgdhc3NldElkDGN1cnJlbnRJbmRleAQWdmVyaWZpY2F0aW9uSW5Qcm9ncmVzcwkBC3ZhbHVlT3JFbHNlAgkAoAgBCQEZa2V5VmVyaWZpY2F0aW9uSW5Qcm9ncmVzcwEFB2Fzc2V0SWQHBBhkZXZlcmlmaWNhdGlvbkluUHJvZ3Jlc3MJAQt2YWx1ZU9yRWxzZQIJAKAIAQkBG2tleURldmVyaWZpY2F0aW9uSW5Qcm9ncmVzcwEFB2Fzc2V0SWQHBA1zdWdnZXN0SXNzdWVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBEGtleVN1Z2dlc3RJc3N1ZXICBQdhc3NldElkBQxjdXJyZW50SW5kZXgJAQd3cmFwRXJyAQIXdm90aW5nIGlzc3VlciBub3QgZm91bmQEGGN1cnJlbnRWb3RpbmdIZWlnaHRTdGFydAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEJARtrZXlDdXJyZW50Vm90aW5nSGVpZ2h0U3RhcnQCBQdhc3NldElkBQxjdXJyZW50SW5kZXgJAQd3cmFwRXJyAQIddm90aW5nIHN0YXJ0IGhlaWdodCBub3QgZm91bmQEEnZvdGluZ1BlcmlvZExlbmdodAMFFnZlcmlmaWNhdGlvbkluUHJvZ3Jlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBCQESa2V5UGVyaW9kTGVuZ3RoQWRkAgUHYXNzZXRJZAUMY3VycmVudEluZGV4CQEHd3JhcEVycgECHnZvdGluZyBwZXJpb2QgbGVuZ3RoIG5vdCBmb3VuZAkBBXZhbHVlAQkAnwgBBRVrZXlQZXJpb2RMZW5ndGhSZW1vdmUEBmNoZWNrcwkAzAgCAwMFFnZlcmlmaWNhdGlvbkluUHJvZ3Jlc3MGBRhkZXZlcmlmaWNhdGlvbkluUHJvZ3Jlc3MGCQEIdGhyb3dFcnIBAhVubyB2b3RpbmcgaW4gcHJvZ3Jlc3MJAMwIAgMJAGYCCQBkAgUYY3VycmVudFZvdGluZ0hlaWdodFN0YXJ0BRJ2b3RpbmdQZXJpb2RMZW5naHQFBmhlaWdodAYJAQh0aHJvd0VycgECDnZvdGluZyBleHBpcmVkBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MJAJcKBQUWdmVyaWZpY2F0aW9uSW5Qcm9ncmVzcwUYZGV2ZXJpZmljYXRpb25JblByb2dyZXNzBRhjdXJyZW50Vm90aW5nSGVpZ2h0U3RhcnQFEnZvdGluZ1BlcmlvZExlbmdodAUNc3VnZ2VzdElzc3VlcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEPY2FsY3VsYXRlUmV3YXJkAwV2b3Rlcgdhc3NldElkBWluZGV4BAd2b3RlS2V5CQEHa2V5Vm90ZQMFB2Fzc2V0SWQFBWluZGV4BQV2b3RlcgQIbGFzdFZvdGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBBQd2b3RlS2V5CQEHd3JhcEVycgECEnlvdSBoYXZlIG5vdCB2b3RlZAQNbGFzdFZvdGVQYXJ0cwkAtQkCBQhsYXN0Vm90ZQUJc2VwYXJhdG9yBAdpbkZhdm9yCQCRAwIFDWxhc3RWb3RlUGFydHMAAQQMcmV3YXJkQW1vdW50AwkAAAIFB2luRmF2b3ICBHRydWUECWd3eEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDWxhc3RWb3RlUGFydHMAAgQPbGFzdFZvdGluZ1ZhbHVlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBD2tleVZvdGluZ1Jlc3VsdAIFB2Fzc2V0SWQFBWluZGV4CQEHd3JhcEVycgECFXZvdGluZyBkb2VzIG5vdCBleGlzdAQUbGFzdFZvdGluZ1ZhbHVlUGFydHMJALUJAgUPbGFzdFZvdGluZ1ZhbHVlBQlzZXBhcmF0b3IEDXRvdGFsVm90ZXNGb3IJAQ1wYXJzZUludFZhbHVlAQkAkQMCBRRsYXN0Vm90aW5nVmFsdWVQYXJ0cwABBBVwYXJ0T2ZUaGVUb3RhbFZvdGVzWDgJAGsDBQlnd3hBbW91bnQFBU1VTFQ4BQ10b3RhbFZvdGVzRm9yBBF0b3RhbFZvdGluZ1Jld2FyZAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEUa2V5VG90YWxWb3RpbmdSZXdhcmQCBQdhc3NldElkBQVpbmRleAAABAxyZXdhcmRBbW91bnQJAG4EBRVwYXJ0T2ZUaGVUb3RhbFZvdGVzWDgFEXRvdGFsVm90aW5nUmV3YXJkBQVNVUxUOAUFRkxPT1IFDHJld2FyZEFtb3VudAAABQxyZXdhcmRBbW91bnQHAWkBCnN1Z2dlc3RBZGQDB2Fzc2V0SWQMcGVyaW9kTGVuZ3RoCmFzc2V0SW1hZ2UEBGluZm8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBCQDZBAEFB2Fzc2V0SWQCEEludmFsaWQgYXNzZXQgSUQDCQAAAgUEaW5mbwUEaW5mbwQPY3VycmVudEluZGV4S2V5CQEPa2V5Q3VycmVudEluZGV4AQUHYXNzZXRJZAQMY3VycmVudEluZGV4CQCfCAEFD2N1cnJlbnRJbmRleEtleQQIbmV3SW5kZXgDCQEJaXNEZWZpbmVkAQUMY3VycmVudEluZGV4CQBkAgkBBXZhbHVlAQUMY3VycmVudEluZGV4AAEAAAQJd3hQYXltZW50CQCRAwIIBQFpCHBheW1lbnRzAAAEEHd4UGF5bWVudEFzc2V0SWQJAQV2YWx1ZQEIBQl3eFBheW1lbnQHYXNzZXRJZAQPd3hQYXltZW50QW1vdW50CQEFdmFsdWUBCAUJd3hQYXltZW50BmFtb3VudAQTdm90aW5nUmV3YXJkQWN0aW9ucwMJAGYCCQCQAwEIBQFpCHBheW1lbnRzAAEEE3ZvdGluZ1Jld2FyZFBheW1lbnQJAJEDAggFAWkIcGF5bWVudHMAAQQadm90aW5nUmV3YXJkUGF5bWVudEFzc2V0SWQJANgEAQkBBXZhbHVlAQgFE3ZvdGluZ1Jld2FyZFBheW1lbnQHYXNzZXRJZAQZdm90aW5nUmV3YXJkUGF5bWVudEFtb3VudAkBBXZhbHVlAQgFE3ZvdGluZ1Jld2FyZFBheW1lbnQGYW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJARZrZXlWb3RpbmdSZXdhcmRBc3NldElkAgUHYXNzZXRJZAUIbmV3SW5kZXgFGnZvdGluZ1Jld2FyZFBheW1lbnRBc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5VG90YWxWb3RpbmdSZXdhcmQCBQdhc3NldElkBQhuZXdJbmRleAUZdm90aW5nUmV3YXJkUGF5bWVudEFtb3VudAUDbmlsBQNuaWwED21pblBlcmlvZExlbmd0aAkBEUBleHRyTmF0aXZlKDEwNTUpAQUSa2V5TWluUGVyaW9kTGVuZ3RoBA9tYXhQZXJpb2RMZW5ndGgJARFAZXh0ck5hdGl2ZSgxMDU1KQEFEmtleU1heFBlcmlvZExlbmd0aAQGY2hlY2tzCQDMCAIDAwkAZwIFDHBlcmlvZExlbmd0aAUPbWluUGVyaW9kTGVuZ3RoCQBnAgUPbWF4UGVyaW9kTGVuZ3RoBQxwZXJpb2RMZW5ndGgHBgkBCHRocm93RXJyAQIUaW52YWxpZCBwZXJpb2RMZW5ndGgJAMwIAgMJAAACCQCgCAEJAQtrZXlWZXJpZmllZAEFB2Fzc2V0SWQFBHVuaXQGCQEIdGhyb3dFcnIBAhBhbHJlYWR5IHZlcmlmaWVkCQDMCAIDCQAAAgkAoAgBCQEZa2V5VmVyaWZpY2F0aW9uSW5Qcm9ncmVzcwEFB2Fzc2V0SWQFBHVuaXQGCQEIdGhyb3dFcnIBAhNhbHJlYWR5IGluIHByb2dyZXNzCQDMCAIDCQBmAgUPd3hQYXltZW50QW1vdW50CQBoAgUMcGVyaW9kTGVuZ3RoBQtmZWVQZXJCbG9jawYJAQh0aHJvd0VycgECHm5vdCBlbm91Z2ggd3ggZm9yIGdpdmVuIHBlcmlvZAkAzAgCAwkAZwIFD3d4UGF5bWVudEFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTUpAQUma2V5TWluV3hNaW5Gb3JTdWdnZXN0QWRkQW1vdW50UmVxdWlyZWQGCQEIdGhyb3dFcnIBAiFwYXltZW50IGxlc3MgdGhlbiBtaW4gZm9yIHN1Z2dlc3QFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQcYXNzZXRzU3RvcmVDcmVhdGVPclVwZGF0ZUludgkA/AcEBRNhc3NldHNTdG9yZUNvbnRyYWN0Ag5jcmVhdGVPclVwZGF0ZQkAzAgCBQdhc3NldElkCQDMCAIFCmFzc2V0SW1hZ2UJAMwIAgcFA25pbAUDbmlsAwkAAAIFHGFzc2V0c1N0b3JlQ3JlYXRlT3JVcGRhdGVJbnYFHGFzc2V0c1N0b3JlQ3JlYXRlT3JVcGRhdGVJbnYED3ZvdGluZ0VuZEhlaWdodAkAZAIFBmhlaWdodAUMcGVyaW9kTGVuZ3RoBBhmaW5hbGl6ZUNhbGxSZXdhcmRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUba2V5RmluYWxpemVDYWxsUmV3YXJkQW1vdW50AAAEDGJ1cm5XeEFtb3VudAkAZQIFD3d4UGF5bWVudEFtb3VudAUYZmluYWxpemVDYWxsUmV3YXJkQW1vdW50CQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFD2N1cnJlbnRJbmRleEtleQUIbmV3SW5kZXgJAMwIAgkBDEJvb2xlYW5FbnRyeQIJARlrZXlWZXJpZmljYXRpb25JblByb2dyZXNzAQUHYXNzZXRJZAYJAMwIAgkBDEludGVnZXJFbnRyeQIJARtrZXlDdXJyZW50Vm90aW5nSGVpZ2h0U3RhcnQCBQdhc3NldElkBQhuZXdJbmRleAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESa2V5UGVyaW9kTGVuZ3RoQWRkAgUHYXNzZXRJZAUIbmV3SW5kZXgFDHBlcmlvZExlbmd0aAkAzAgCCQELU3RyaW5nRW50cnkCCQEQa2V5U3VnZ2VzdElzc3VlcgIFB2Fzc2V0SWQFCG5ld0luZGV4CQClCAEIBQFpBmNhbGxlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmtleVZvdGluZ0VuZEhlaWdodAIFB2Fzc2V0SWQFCG5ld0luZGV4BQ92b3RpbmdFbmRIZWlnaHQJAMwIAgkBBEJ1cm4CBRB3eFBheW1lbnRBc3NldElkBQxidXJuV3hBbW91bnQFA25pbAUTdm90aW5nUmV3YXJkQWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ1zdWdnZXN0UmVtb3ZlAQdhc3NldElkBA5nd3hBbW91bnRBdE5vdwkBGGdldFVzZXJHd3hBbW91bnRBdEhlaWdodAIJAKUIAQgFAWkGY2FsbGVyBQZoZWlnaHQEF21pblN1Z2dlc3RSZW1vdmVCYWxhbmNlCQERQGV4dHJOYXRpdmUoMTA1NSkBBRprZXlNaW5TdWdnZXN0UmVtb3ZlQmFsYW5jZQQJd3hQYXltZW50CQCRAwIIBQFpCHBheW1lbnRzAAAEEHd4UGF5bWVudEFzc2V0SWQJAQV2YWx1ZQEIBQl3eFBheW1lbnQHYXNzZXRJZAQPd3hQYXltZW50QW1vdW50CQEFdmFsdWUBCAUJd3hQYXltZW50BmFtb3VudAQKaXNWZXJpZmllZAkBC3ZhbHVlT3JFbHNlAgkAoAgBCQELa2V5VmVyaWZpZWQBBQdhc3NldElkBwQGY2hlY2tzCQDMCAIDBQppc1ZlcmlmaWVkBgkBCHRocm93RXJyAQkAuQkCCQDMCAIFB2Fzc2V0SWQJAMwIAgIMbm90IHZlcmlmaWVkBQNuaWwCASAJAMwIAgMJAGcCBQ5nd3hBbW91bnRBdE5vdwUXbWluU3VnZ2VzdFJlbW92ZUJhbGFuY2UGCQEIdGhyb3dFcnIBAhBub3QgZW5vdWdoIGdXWGVzCQDMCAIDCQBnAgUPd3hQYXltZW50QW1vdW50CQERQGV4dHJOYXRpdmUoMTA1NSkBBSNrZXlXeEZvclN1Z2dlc3RSZW1vdmVBbW91bnRSZXF1aXJlZAYJAQh0aHJvd0VycgECIXBheW1lbnQgbGVzcyB0aGVuIG1pbiBmb3Igc3VnZ2VzdAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBA9jdXJyZW50SW5kZXhLZXkJAQ9rZXlDdXJyZW50SW5kZXgBBQdhc3NldElkBAxjdXJyZW50SW5kZXgJAJ8IAQUPY3VycmVudEluZGV4S2V5BAhuZXdJbmRleAMJAQlpc0RlZmluZWQBBQxjdXJyZW50SW5kZXgJAGQCCQEFdmFsdWUBBQxjdXJyZW50SW5kZXgAAQAABAxwZXJpb2RMZW5ndGgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBRVrZXlQZXJpb2RMZW5ndGhSZW1vdmUJAQd3cmFwRXJyAQIacGVyaW9kTGVuZ3RoUmVtb3ZlIG5vdCBzZXQED3ZvdGluZ0VuZEhlaWdodAkAZAIFBmhlaWdodAUMcGVyaW9kTGVuZ3RoCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9jdXJyZW50SW5kZXhLZXkFCG5ld0luZGV4CQDMCAIJAQxCb29sZWFuRW50cnkCCQEba2V5RGV2ZXJpZmljYXRpb25JblByb2dyZXNzAQUHYXNzZXRJZAYJAMwIAgkBDEludGVnZXJFbnRyeQIJARtrZXlDdXJyZW50Vm90aW5nSGVpZ2h0U3RhcnQCBQdhc3NldElkBQhuZXdJbmRleAUGaGVpZ2h0CQDMCAIJAQtTdHJpbmdFbnRyeQIJARBrZXlTdWdnZXN0SXNzdWVyAgUHYXNzZXRJZAUIbmV3SW5kZXgJAKUIAQgFAWkGY2FsbGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESa2V5Vm90aW5nRW5kSGVpZ2h0AgUHYXNzZXRJZAUIbmV3SW5kZXgFD3ZvdGluZ0VuZEhlaWdodAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBHZvdGUCB2Fzc2V0SWQHaW5GYXZvcgQPY3VycmVudEluZGV4S2V5CQEPa2V5Q3VycmVudEluZGV4AQUHYXNzZXRJZAQMY3VycmVudEluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQUPY3VycmVudEluZGV4S2V5CQEHd3JhcEVycgECFXZvdGluZyBkb2VzIG5vdCBleGlzdAQKdm90aW5nSW5mbwkBEXZvdGluZ0V4aXN0Q2hlY2tzAgUHYXNzZXRJZAUMY3VycmVudEluZGV4AwkAAAIFCnZvdGluZ0luZm8FCnZvdGluZ0luZm8EGGN1cnJlbnRWb3RpbmdIZWlnaHRTdGFydAgFCnZvdGluZ0luZm8CXzMEEnZvdGluZ1BlcmlvZExlbmdodAgFCnZvdGluZ0luZm8CXzQEDmd3eEFtb3VudEF0RW5kCQEYZ2V0VXNlckd3eEFtb3VudEF0SGVpZ2h0AgkApQgBCAUBaQZjYWxsZXIJAGQCBRhjdXJyZW50Vm90aW5nSGVpZ2h0U3RhcnQFEnZvdGluZ1BlcmlvZExlbmdodAQHdm90ZUtleQkBB2tleVZvdGUDBQdhc3NldElkBQxjdXJyZW50SW5kZXgIBQFpBmNhbGxlcgQPdm90aW5nUmVzdWx0S2V5CQEPa2V5Vm90aW5nUmVzdWx0AgUHYXNzZXRJZAUMY3VycmVudEluZGV4BAZjaGVja3MJAMwIAgMJAAACCQCiCAEFB3ZvdGVLZXkFBHVuaXQGCQEIdGhyb3dFcnIBAhZZb3UgaGF2ZSBhbHJlYWR5IHZvdGVkCQDMCAIDCQBmAgUOZ3d4QW1vdW50QXRFbmQAAAYJAAIBAihZb3UnbGwgbm90IGhhdmUgZ1dYIGF0IHRoZSBlbmQgb2Ygdm90aW5nBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MED2xhc3RWb3RpbmdWYWx1ZQkBC3ZhbHVlT3JFbHNlAgkAoggBBQ92b3RpbmdSZXN1bHRLZXkFEmRlZmF1bHRWb3RpbmdWYWx1ZQQUbGFzdFZvdGluZ1ZhbHVlUGFydHMJALUJAgUPbGFzdFZvdGluZ1ZhbHVlBQlzZXBhcmF0b3IEDm5ld1ZvdGluZ1ZhbHVlAwUHaW5GYXZvcgkBC3ZvdGluZ1ZhbHVlAgkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBRRsYXN0Vm90aW5nVmFsdWVQYXJ0cwABBQ5nd3hBbW91bnRBdEVuZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFFGxhc3RWb3RpbmdWYWx1ZVBhcnRzAAIJAQt2b3RpbmdWYWx1ZQIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBRRsYXN0Vm90aW5nVmFsdWVQYXJ0cwABCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFFGxhc3RWb3RpbmdWYWx1ZVBhcnRzAAIFDmd3eEFtb3VudEF0RW5kCQDMCAIJAQtTdHJpbmdFbnRyeQIFB3ZvdGVLZXkJAQl2b3RlVmFsdWUCBQdpbkZhdm9yBQ5nd3hBbW91bnRBdEVuZAkAzAgCCQELU3RyaW5nRW50cnkCBQ92b3RpbmdSZXN1bHRLZXkFDm5ld1ZvdGluZ1ZhbHVlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKY2FuY2VsVm90ZQEHYXNzZXRJZAQPY3VycmVudEluZGV4S2V5CQEPa2V5Q3VycmVudEluZGV4AQUHYXNzZXRJZAQMY3VycmVudEluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQUPY3VycmVudEluZGV4S2V5CQEHd3JhcEVycgECFXZvdGluZyBkb2VzIG5vdCBleGlzdAQHdm90ZUtleQkBB2tleVZvdGUDBQdhc3NldElkBQxjdXJyZW50SW5kZXgIBQFpBmNhbGxlcgQPdm90aW5nUmVzdWx0S2V5CQEPa2V5Vm90aW5nUmVzdWx0AgUHYXNzZXRJZAUMY3VycmVudEluZGV4BAhsYXN0Vm90ZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEFB3ZvdGVLZXkJAQd3cmFwRXJyAQISeW91IGhhdmUgbm90IHZvdGVkBA1sYXN0Vm90ZVBhcnRzCQC1CQIFCGxhc3RWb3RlBQlzZXBhcmF0b3IEB2luRmF2b3IJAJEDAgUNbGFzdFZvdGVQYXJ0cwABBAlnd3hBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ1sYXN0Vm90ZVBhcnRzAAIECnZvdGluZ0luZm8JARF2b3RpbmdFeGlzdENoZWNrcwIFB2Fzc2V0SWQFDGN1cnJlbnRJbmRleAMJAAACBQp2b3RpbmdJbmZvBQp2b3RpbmdJbmZvBAZjaGVja3MJAMwIAgMDCQAAAgUHaW5GYXZvcgIEdHJ1ZQYJAAACBQdpbkZhdm9yAgVmYWxzZQYJAQh0aHJvd0VycgECDGludmFsaWQgdm90ZQUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBA9sYXN0Vm90aW5nVmFsdWUJAQt2YWx1ZU9yRWxzZQIJAKIIAQUPdm90aW5nUmVzdWx0S2V5BRJkZWZhdWx0Vm90aW5nVmFsdWUEFGxhc3RWb3RpbmdWYWx1ZVBhcnRzCQC1CQIFD2xhc3RWb3RpbmdWYWx1ZQUJc2VwYXJhdG9yBBRuZXdWb3RpbmdSZXN1bHRWYWx1ZQMJAAACBQdpbkZhdm9yAgR0cnVlCQELdm90aW5nVmFsdWUCCQBlAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFFGxhc3RWb3RpbmdWYWx1ZVBhcnRzAAEFCWd3eEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFFGxhc3RWb3RpbmdWYWx1ZVBhcnRzAAIJAQt2b3RpbmdWYWx1ZQIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBRRsYXN0Vm90aW5nVmFsdWVQYXJ0cwABCQBlAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFFGxhc3RWb3RpbmdWYWx1ZVBhcnRzAAIFCWd3eEFtb3VudAkAzAgCCQELRGVsZXRlRW50cnkBBQd2b3RlS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIFD3ZvdGluZ1Jlc3VsdEtleQUUbmV3Vm90aW5nUmVzdWx0VmFsdWUFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhmaW5hbGl6ZQEHYXNzZXRJZAQWdmVyaWZpY2F0aW9uSW5Qcm9ncmVzcwkBC3ZhbHVlT3JFbHNlAgkAoAgBCQEZa2V5VmVyaWZpY2F0aW9uSW5Qcm9ncmVzcwEFB2Fzc2V0SWQHBBhkZXZlcmlmaWNhdGlvbkluUHJvZ3Jlc3MJAQt2YWx1ZU9yRWxzZQIJAKAIAQkBG2tleURldmVyaWZpY2F0aW9uSW5Qcm9ncmVzcwEFB2Fzc2V0SWQHBA9jdXJyZW50SW5kZXhLZXkJAQ9rZXlDdXJyZW50SW5kZXgBBQdhc3NldElkBAxjdXJyZW50SW5kZXgJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUPY3VycmVudEluZGV4S2V5AAAEEnZvdGluZ1RocmVzaG9sZEFkZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFFWtleVZvdGluZ1RocmVzaG9sZEFkZAkBB3dyYXBFcnIBAhp2b3RpbmdUaHJlc2hvbGRBZGQgbm90IHNldAQVdm90aW5nVGhyZXNob2xkUmVtb3ZlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQUYa2V5Vm90aW5nVGhyZXNob2xkUmVtb3ZlCQEHd3JhcEVycgECHXZvdGluZ1RocmVzaG9sZFJlbW92ZSBub3Qgc2V0BA0kdDAxNDc4MzE1MjIyAwUWdmVyaWZpY2F0aW9uSW5Qcm9ncmVzcwkAlQoDCQDMCAIJAQtEZWxldGVFbnRyeQEJARlrZXlWZXJpZmljYXRpb25JblByb2dyZXNzAQUHYXNzZXRJZAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBC2tleVZlcmlmaWVkAQUHYXNzZXRJZAYFA25pbAYFEnZvdGluZ1RocmVzaG9sZEFkZAkAlQoDCQDMCAIJAQtEZWxldGVFbnRyeQEJARtrZXlEZXZlcmlmaWNhdGlvbkluUHJvZ3Jlc3MBBQdhc3NldElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQtrZXlWZXJpZmllZAEFB2Fzc2V0SWQFA25pbAYFFXZvdGluZ1RocmVzaG9sZFJlbW92ZQQVZmluYWxpemVWb3RpbmdBY3Rpb25zCAUNJHQwMTQ3ODMxNTIyMgJfMQQIdmVyaWZpZWQIBQ0kdDAxNDc4MzE1MjIyAl8yBAl0aHJlc2hvbGQIBQ0kdDAxNDc4MzE1MjIyAl8zBA9sYXN0Vm90aW5nVmFsdWUJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBD2tleVZvdGluZ1Jlc3VsdAIFB2Fzc2V0SWQFDGN1cnJlbnRJbmRleAUSZGVmYXVsdFZvdGluZ1ZhbHVlBBRsYXN0Vm90aW5nVmFsdWVQYXJ0cwkAtQkCBQ9sYXN0Vm90aW5nVmFsdWUFCXNlcGFyYXRvcgQIdm90ZXNGb3IJAQ1wYXJzZUludFZhbHVlAQkAkQMCBRRsYXN0Vm90aW5nVmFsdWVQYXJ0cwABBAx2b3Rlc0FnYWluc3QJAQ1wYXJzZUludFZhbHVlAQkAkQMCBRRsYXN0Vm90aW5nVmFsdWVQYXJ0cwACBAp2b3Rlc1RvdGFsCQBkAgUIdm90ZXNGb3IFDHZvdGVzQWdhaW5zdAQPdm90aW5nRW5kSGVpZ2h0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQkBEmtleVZvdGluZ0VuZEhlaWdodAIFB2Fzc2V0SWQFDGN1cnJlbnRJbmRleAkBB3dyYXBFcnIBAht2b3RpbmcgZW5kIGhlaWdodCBub3QgZm91bmQEBmNoZWNrcwkAzAgCAwMFFnZlcmlmaWNhdGlvbkluUHJvZ3Jlc3MGBRhkZXZlcmlmaWNhdGlvbkluUHJvZ3Jlc3MGCQEIdGhyb3dFcnIBAhNub3RoaW5nIHRvIGZpbmFsaXplCQDMCAIDCQBnAgUGaGVpZ2h0BQ92b3RpbmdFbmRIZWlnaHQGCQEIdGhyb3dFcnIBAhN2b3Rpbmcgbm90IGZpbmlzaGVkCQDMCAIDCQBnAgUKdm90ZXNUb3RhbAUJdGhyZXNob2xkBgkBCHRocm93RXJyAQIQbm90IGVub3VnaCB2b3RlcwUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBBhmaW5hbGl6ZUNhbGxSZXdhcmRBY3Rpb24DCQBmAgUMdm90ZXNBZ2FpbnN0BQh2b3Rlc0ZvcgQRc2V0VmVyaWZpZWRJbnZva2UJAPwHBAUTYXNzZXRzU3RvcmVDb250cmFjdAILc2V0VmVyaWZpZWQJAMwIAgUHYXNzZXRJZAkAzAgCBQh2ZXJpZmllZAUDbmlsBQNuaWwDCQAAAgURc2V0VmVyaWZpZWRJbnZva2UFEXNldFZlcmlmaWVkSW52b2tlBBhmaW5hbGl6ZUNhbGxSZXdhcmRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUba2V5RmluYWxpemVDYWxsUmV3YXJkQW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRhmaW5hbGl6ZUNhbGxSZXdhcmRBbW91bnQFCXd4QXNzZXRJZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwJAM4IAgUVZmluYWxpemVWb3RpbmdBY3Rpb25zBRhmaW5hbGl6ZUNhbGxSZXdhcmRBY3Rpb24JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENY2xhaW1SRUFET05MWQIHYXNzZXRJZAVpbmRleAQNY2FsbGVyQWRkcmVzcwgFAWkGY2FsbGVyBBZ2b3RpbmdSZXdhcmRBc3NldElkU3RyCQCiCAEJARZrZXlWb3RpbmdSZXdhcmRBc3NldElkAgUHYXNzZXRJZAUFaW5kZXgEDHJld2FyZEFtb3VudAMJAQlpc0RlZmluZWQBBRZ2b3RpbmdSZXdhcmRBc3NldElkU3RyCQEPY2FsY3VsYXRlUmV3YXJkAwUNY2FsbGVyQWRkcmVzcwUHYXNzZXRJZAUFaW5kZXgAAAkAlAoCBQNuaWwFDHJld2FyZEFtb3VudAFpAQVjbGFpbQIHYXNzZXRJZAVpbmRleAQNY2FsbGVyQWRkcmVzcwgFAWkGY2FsbGVyBA9jbGFpbUhpc3RvcnlLZXkJAQ9rZXlDbGFpbUhpc3RvcnkDBQ1jYWxsZXJBZGRyZXNzBQdhc3NldElkBQVpbmRleAQMY2xhaW1IaXN0b3J5CQCiCAEFD2NsYWltSGlzdG9yeUtleQQGY2hlY2tzCQDMCAIDCQAAAgUMY2xhaW1IaXN0b3J5BQR1bml0BgkBCHRocm93RXJyAQIPYWxyZWFkeSBjbGFpbWVkBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MEDHJld2FyZEFtb3VudAMJAGYCCQEPY2FsY3VsYXRlUmV3YXJkAwUNY2FsbGVyQWRkcmVzcwUHYXNzZXRJZAUFaW5kZXgAAAkBD2NhbGN1bGF0ZVJld2FyZAMFDWNhbGxlckFkZHJlc3MFB2Fzc2V0SWQFBWluZGV4CQEIdGhyb3dFcnIBAhBub3RoaW5nIHRvIGNsYWltBBZ2b3RpbmdSZXdhcmRBc3NldElkU3RyCQCiCAEJARZrZXlWb3RpbmdSZXdhcmRBc3NldElkAgUHYXNzZXRJZAUFaW5kZXgEDHJld2FyZEFjdGlvbgMJAQlpc0RlZmluZWQBBRZ2b3RpbmdSZXdhcmRBc3NldElkU3RyBBN2b3RpbmdSZXdhcmRBc3NldElkCQDZBAEJAQV2YWx1ZQEFFnZvdGluZ1Jld2FyZEFzc2V0SWRTdHIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUNY2FsbGVyQWRkcmVzcwUMcmV3YXJkQW1vdW50BRN2b3RpbmdSZXdhcmRBc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIFD2NsYWltSGlzdG9yeUtleQkBEWNsYWltSGlzdG9yeVZhbHVlAQUMcmV3YXJkQW1vdW50BQNuaWwJAQh0aHJvd0VycgECEG5vdGhpbmcgdG8gY2xhaW0FDHJld2FyZEFjdGlvbgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAED3RhcmdldFB1YmxpY0tleQQHJG1hdGNoMAkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAnBrBQckbWF0Y2gwBQJwawMJAAECBQckbWF0Y2gwAgRVbml0CAUCdHgPc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFD3RhcmdldFB1YmxpY0tleRDlpNs=", "height": 2599134, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Bc95Do6JTLtq5bwhfkTyPGVPfHCKgJefqJ1gTkckU3wr Next: Hcb2NQsvWn5HWzuRASG7VaqGpEKtAvtJvqyAgA3w8yjy Diff:
OldNewDifferences
124124 func getUserGwxAmountAtHeight (userAddress,targetHeight) = {
125125 let gwxAmount = invoke(boostingContract, "getUserGwxAmountAtHeightREADONLY", [userAddress, targetHeight], nil)
126126 asInt(gwxAmount)
127+ }
128+
129+
130+func keyManagerVaultAddress () = "%s__managerVaultAddress"
131+
132+
133+func keyManagerPublicKey () = "%s__managerPublicKey"
134+
135+
136+func getManagerVaultAddressOrThis () = match getString(keyManagerVaultAddress()) {
137+ case s: String =>
138+ addressFromStringValue(s)
139+ case _ =>
140+ this
141+}
142+
143+
144+func managerPublicKeyOrUnit () = {
145+ let managerVaultAddress = getManagerVaultAddressOrThis()
146+ match getString(managerVaultAddress, keyManagerPublicKey()) {
147+ case s: String =>
148+ fromBase58String(s)
149+ case _: Unit =>
150+ unit
151+ case _ =>
152+ throw("Match error")
153+ }
127154 }
128155
129156
330357 let currentIndex = valueOrElse(getInteger(currentIndexKey), 0)
331358 let votingThresholdAdd = valueOrErrorMessage(getInteger(keyVotingThresholdAdd), wrapErr("votingThresholdAdd not set"))
332359 let votingThresholdRemove = valueOrErrorMessage(getInteger(keyVotingThresholdRemove), wrapErr("votingThresholdRemove not set"))
333- let $t01424414683 = if (verificationInProgress)
360+ let $t01478315222 = if (verificationInProgress)
334361 then $Tuple3([DeleteEntry(keyVerificationInProgress(assetId)), BooleanEntry(keyVerified(assetId), true)], true, votingThresholdAdd)
335362 else $Tuple3([DeleteEntry(keyDeverificationInProgress(assetId)), DeleteEntry(keyVerified(assetId))], true, votingThresholdRemove)
336- let finalizeVotingActions = $t01424414683._1
337- let verified = $t01424414683._2
338- let threshold = $t01424414683._3
363+ let finalizeVotingActions = $t01478315222._1
364+ let verified = $t01478315222._2
365+ let threshold = $t01478315222._3
339366 let lastVotingValue = valueOrElse(getString(keyVotingResult(assetId, currentIndex)), defaultVotingValue)
340367 let lastVotingValueParts = split(lastVotingValue, separator)
341368 let votesFor = parseIntValue(lastVotingValueParts[1])
409436 }
410437
411438
439+@Verifier(tx)
440+func verify () = {
441+ let targetPublicKey = match managerPublicKeyOrUnit() {
442+ case pk: ByteVector =>
443+ pk
444+ case _: Unit =>
445+ tx.senderPublicKey
446+ case _ =>
447+ throw("Match error")
448+ }
449+ sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
450+ }
451+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "__"
55
66 let MULT8 = 100000000
77
88 func wrapErr (msg) = makeString(["voting_verified_v2.ride:", msg], " ")
99
1010
1111 func throwErr (msg) = throw(wrapErr(msg))
1212
1313
1414 func asInt (val) = match val {
1515 case valInt: Int =>
1616 valInt
1717 case _ =>
1818 throw("Failed to cast into Integer")
1919 }
2020
2121
2222 func getIntegerOrZero (address,key) = valueOrElse(getInteger(address, key), 0)
2323
2424
2525 func getIntegerOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), wrapErr((key + " is not defined")))
2626
2727
2828 func getStringOrEmpty (address,key) = valueOrElse(getString(address, key), "")
2929
3030
3131 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), wrapErr((key + " is not defined")))
3232
3333
3434 let keyBoostingContract = makeString(["%s", "boostingContract"], separator)
3535
3636 let keyEmissionContract = makeString(["%s", "emissionContract"], separator)
3737
3838 let keyAssetsStoreContract = makeString(["%s", "assetsStoreContract"], separator)
3939
4040 let boostingContract = addressFromStringValue(getStringValue(keyBoostingContract))
4141
4242 let emissionContract = addressFromStringValue(getStringValue(keyEmissionContract))
4343
4444 let assetsStoreContract = addressFromStringValue(getStringValue(keyAssetsStoreContract))
4545
4646 let keyEmissionConfig = makeString(["%s", "config"], separator)
4747
4848 let wxAssetIdStr = split(getStringOrFail(emissionContract, keyEmissionConfig), separator)[1]
4949
5050 let wxAssetId = fromBase58String(wxAssetIdStr)
5151
5252 let keyVotingThresholdAdd = makeString(["%s%s", "votingThreshold", "add"], separator)
5353
5454 let keyVotingThresholdRemove = makeString(["%s%s", "votingThreshold", "remove"], separator)
5555
5656 func keyPeriodLengthAdd (assetId,index) = makeString(["%s%s%d", "periodLengthAdd", assetId, toString(index)], separator)
5757
5858
5959 let keyPeriodLengthRemove = makeString(["%s", "periodLengthRemove"], separator)
6060
6161 func keyCurrentVotingHeightStart (assetId,index) = makeString(["%s%s%d", "currentVotingHeightStart", assetId, toString(index)], separator)
6262
6363
6464 func keyVerified (assetId) = makeString(["%s%s", "verified", assetId], separator)
6565
6666
6767 func keyVerificationInProgress (assetId) = makeString(["%s%s%s", "verification", "inProgress", assetId], separator)
6868
6969
7070 func keyDeverificationInProgress (assetId) = makeString(["%s%s%s", "deverification", "inProgress", assetId], separator)
7171
7272
7373 let keyMaxPeriodLength = makeString(["%s", "maxPeriodLength"], separator)
7474
7575 let keyMinPeriodLength = makeString(["%s", "minPeriodLength"], separator)
7676
7777 func keyVotingRewardAssetId (assetId,index) = makeString(["%s%s%d", "votingRewardAssetId", assetId, toString(index)], separator)
7878
7979
8080 func keyTotalVotingReward (assetId,index) = makeString(["%s%s%d", "votingReward", assetId, toString(index)], separator)
8181
8282
8383 let keyFinalizeCallRewardAmount = makeString(["%s", "finalizeCallRewardAmount"], separator)
8484
8585 let keyMinSuggestRemoveBalance = makeString(["%s", "minSuggestRemoveBalance"], separator)
8686
8787 func keyCurrentIndex (assetId) = makeString(["%s%s", "currentIndex", assetId], separator)
8888
8989
9090 func keyVote (assetId,index,caller) = makeString(["%s%s%d%s", "vote", assetId, toString(index), toString(caller)], separator)
9191
9292
9393 func voteValue (inFavor,gwxAmount) = makeString(["%s%d", toString(inFavor), toString(gwxAmount)], separator)
9494
9595
9696 func keyVotingResult (assetId,index) = makeString(["%s%s%d", "votingResult", assetId, toString(index)], separator)
9797
9898
9999 func votingValue (forAmount,againstAmount) = makeString(["%d%d", toString(forAmount), toString(againstAmount)], separator)
100100
101101
102102 let defaultVotingValue = makeString(["%d%d", "0", "0"], separator)
103103
104104 func keySuggestIssuer (assetId,index) = makeString(["%s%s%d", "suggestIssuer", assetId, toString(index)], separator)
105105
106106
107107 func keyClaimHistory (userAddress,assetId,index) = makeString(["%s%s%s%d", "history", toString(userAddress), assetId, toString(index)], separator)
108108
109109
110110 func claimHistoryValue (gwxAmount) = makeString(["%d%s", toString(gwxAmount)], separator)
111111
112112
113113 func keyVotingEndHeight (assetId,index) = makeString(["%s%s%d", "votingEndHeight", assetId, toString(index)], separator)
114114
115115
116116 let keyFeePerBlock = makeString(["%s", "feePerBlock"], separator)
117117
118118 let feePerBlock = getIntegerOrFail(this, keyFeePerBlock)
119119
120120 let keyMinWxMinForSuggestAddAmountRequired = makeString(["%s", "wxMinForSuggestAddAmountRequired"], separator)
121121
122122 let keyWxForSuggestRemoveAmountRequired = makeString(["%s", "wxForSuggestRemoveAmountRequired"], separator)
123123
124124 func getUserGwxAmountAtHeight (userAddress,targetHeight) = {
125125 let gwxAmount = invoke(boostingContract, "getUserGwxAmountAtHeightREADONLY", [userAddress, targetHeight], nil)
126126 asInt(gwxAmount)
127+ }
128+
129+
130+func keyManagerVaultAddress () = "%s__managerVaultAddress"
131+
132+
133+func keyManagerPublicKey () = "%s__managerPublicKey"
134+
135+
136+func getManagerVaultAddressOrThis () = match getString(keyManagerVaultAddress()) {
137+ case s: String =>
138+ addressFromStringValue(s)
139+ case _ =>
140+ this
141+}
142+
143+
144+func managerPublicKeyOrUnit () = {
145+ let managerVaultAddress = getManagerVaultAddressOrThis()
146+ match getString(managerVaultAddress, keyManagerPublicKey()) {
147+ case s: String =>
148+ fromBase58String(s)
149+ case _: Unit =>
150+ unit
151+ case _ =>
152+ throw("Match error")
153+ }
127154 }
128155
129156
130157 func votingExistChecks (assetId,currentIndex) = {
131158 let verificationInProgress = valueOrElse(getBoolean(keyVerificationInProgress(assetId)), false)
132159 let deverificationInProgress = valueOrElse(getBoolean(keyDeverificationInProgress(assetId)), false)
133160 let suggestIssuer = valueOrErrorMessage(getString(keySuggestIssuer(assetId, currentIndex)), wrapErr("voting issuer not found"))
134161 let currentVotingHeightStart = valueOrErrorMessage(getInteger(keyCurrentVotingHeightStart(assetId, currentIndex)), wrapErr("voting start height not found"))
135162 let votingPeriodLenght = if (verificationInProgress)
136163 then valueOrErrorMessage(getInteger(keyPeriodLengthAdd(assetId, currentIndex)), wrapErr("voting period length not found"))
137164 else value(getInteger(keyPeriodLengthRemove))
138165 let checks = [if (if (verificationInProgress)
139166 then true
140167 else deverificationInProgress)
141168 then true
142169 else throwErr("no voting in progress"), if (((currentVotingHeightStart + votingPeriodLenght) > height))
143170 then true
144171 else throwErr("voting expired")]
145172 if ((checks == checks))
146173 then $Tuple5(verificationInProgress, deverificationInProgress, currentVotingHeightStart, votingPeriodLenght, suggestIssuer)
147174 else throw("Strict value is not equal to itself.")
148175 }
149176
150177
151178 func calculateReward (voter,assetId,index) = {
152179 let voteKey = keyVote(assetId, index, voter)
153180 let lastVote = valueOrErrorMessage(getString(voteKey), wrapErr("you have not voted"))
154181 let lastVoteParts = split(lastVote, separator)
155182 let inFavor = lastVoteParts[1]
156183 let rewardAmount = if ((inFavor == "true"))
157184 then {
158185 let gwxAmount = parseIntValue(lastVoteParts[2])
159186 let lastVotingValue = valueOrErrorMessage(getString(keyVotingResult(assetId, index)), wrapErr("voting does not exist"))
160187 let lastVotingValueParts = split(lastVotingValue, separator)
161188 let totalVotesFor = parseIntValue(lastVotingValueParts[1])
162189 let partOfTheTotalVotesX8 = fraction(gwxAmount, MULT8, totalVotesFor)
163190 let totalVotingReward = valueOrElse(getInteger(keyTotalVotingReward(assetId, index)), 0)
164191 let rewardAmount = fraction(partOfTheTotalVotesX8, totalVotingReward, MULT8, FLOOR)
165192 rewardAmount
166193 }
167194 else 0
168195 rewardAmount
169196 }
170197
171198
172199 @Callable(i)
173200 func suggestAdd (assetId,periodLength,assetImage) = {
174201 let info = valueOrErrorMessage(assetInfo(fromBase58String(assetId)), "Invalid asset ID")
175202 if ((info == info))
176203 then {
177204 let currentIndexKey = keyCurrentIndex(assetId)
178205 let currentIndex = getInteger(currentIndexKey)
179206 let newIndex = if (isDefined(currentIndex))
180207 then (value(currentIndex) + 1)
181208 else 0
182209 let wxPayment = i.payments[0]
183210 let wxPaymentAssetId = value(wxPayment.assetId)
184211 let wxPaymentAmount = value(wxPayment.amount)
185212 let votingRewardActions = if ((size(i.payments) > 1))
186213 then {
187214 let votingRewardPayment = i.payments[1]
188215 let votingRewardPaymentAssetId = toBase58String(value(votingRewardPayment.assetId))
189216 let votingRewardPaymentAmount = value(votingRewardPayment.amount)
190217 [StringEntry(keyVotingRewardAssetId(assetId, newIndex), votingRewardPaymentAssetId), IntegerEntry(keyTotalVotingReward(assetId, newIndex), votingRewardPaymentAmount)]
191218 }
192219 else nil
193220 let minPeriodLength = getIntegerValue(keyMinPeriodLength)
194221 let maxPeriodLength = getIntegerValue(keyMaxPeriodLength)
195222 let checks = [if (if ((periodLength >= minPeriodLength))
196223 then (maxPeriodLength >= periodLength)
197224 else false)
198225 then true
199226 else throwErr("invalid periodLength"), if ((getBoolean(keyVerified(assetId)) == unit))
200227 then true
201228 else throwErr("already verified"), if ((getBoolean(keyVerificationInProgress(assetId)) == unit))
202229 then true
203230 else throwErr("already in progress"), if ((wxPaymentAmount > (periodLength * feePerBlock)))
204231 then true
205232 else throwErr("not enough wx for given period"), if ((wxPaymentAmount >= getIntegerValue(keyMinWxMinForSuggestAddAmountRequired)))
206233 then true
207234 else throwErr("payment less then min for suggest")]
208235 if ((checks == checks))
209236 then {
210237 let assetsStoreCreateOrUpdateInv = invoke(assetsStoreContract, "createOrUpdate", [assetId, assetImage, false], nil)
211238 if ((assetsStoreCreateOrUpdateInv == assetsStoreCreateOrUpdateInv))
212239 then {
213240 let votingEndHeight = (height + periodLength)
214241 let finalizeCallRewardAmount = valueOrElse(getInteger(keyFinalizeCallRewardAmount), 0)
215242 let burnWxAmount = (wxPaymentAmount - finalizeCallRewardAmount)
216243 ([IntegerEntry(currentIndexKey, newIndex), BooleanEntry(keyVerificationInProgress(assetId), true), IntegerEntry(keyCurrentVotingHeightStart(assetId, newIndex), height), IntegerEntry(keyPeriodLengthAdd(assetId, newIndex), periodLength), StringEntry(keySuggestIssuer(assetId, newIndex), toString(i.caller)), IntegerEntry(keyVotingEndHeight(assetId, newIndex), votingEndHeight), Burn(wxPaymentAssetId, burnWxAmount)] ++ votingRewardActions)
217244 }
218245 else throw("Strict value is not equal to itself.")
219246 }
220247 else throw("Strict value is not equal to itself.")
221248 }
222249 else throw("Strict value is not equal to itself.")
223250 }
224251
225252
226253
227254 @Callable(i)
228255 func suggestRemove (assetId) = {
229256 let gwxAmountAtNow = getUserGwxAmountAtHeight(toString(i.caller), height)
230257 let minSuggestRemoveBalance = getIntegerValue(keyMinSuggestRemoveBalance)
231258 let wxPayment = i.payments[0]
232259 let wxPaymentAssetId = value(wxPayment.assetId)
233260 let wxPaymentAmount = value(wxPayment.amount)
234261 let isVerified = valueOrElse(getBoolean(keyVerified(assetId)), false)
235262 let checks = [if (isVerified)
236263 then true
237264 else throwErr(makeString([assetId, "not verified"], " ")), if ((gwxAmountAtNow >= minSuggestRemoveBalance))
238265 then true
239266 else throwErr("not enough gWXes"), if ((wxPaymentAmount >= getIntegerValue(keyWxForSuggestRemoveAmountRequired)))
240267 then true
241268 else throwErr("payment less then min for suggest")]
242269 if ((checks == checks))
243270 then {
244271 let currentIndexKey = keyCurrentIndex(assetId)
245272 let currentIndex = getInteger(currentIndexKey)
246273 let newIndex = if (isDefined(currentIndex))
247274 then (value(currentIndex) + 1)
248275 else 0
249276 let periodLength = valueOrErrorMessage(getInteger(keyPeriodLengthRemove), wrapErr("periodLengthRemove not set"))
250277 let votingEndHeight = (height + periodLength)
251278 [IntegerEntry(currentIndexKey, newIndex), BooleanEntry(keyDeverificationInProgress(assetId), true), IntegerEntry(keyCurrentVotingHeightStart(assetId, newIndex), height), StringEntry(keySuggestIssuer(assetId, newIndex), toString(i.caller)), IntegerEntry(keyVotingEndHeight(assetId, newIndex), votingEndHeight)]
252279 }
253280 else throw("Strict value is not equal to itself.")
254281 }
255282
256283
257284
258285 @Callable(i)
259286 func vote (assetId,inFavor) = {
260287 let currentIndexKey = keyCurrentIndex(assetId)
261288 let currentIndex = valueOrErrorMessage(getInteger(currentIndexKey), wrapErr("voting does not exist"))
262289 let votingInfo = votingExistChecks(assetId, currentIndex)
263290 if ((votingInfo == votingInfo))
264291 then {
265292 let currentVotingHeightStart = votingInfo._3
266293 let votingPeriodLenght = votingInfo._4
267294 let gwxAmountAtEnd = getUserGwxAmountAtHeight(toString(i.caller), (currentVotingHeightStart + votingPeriodLenght))
268295 let voteKey = keyVote(assetId, currentIndex, i.caller)
269296 let votingResultKey = keyVotingResult(assetId, currentIndex)
270297 let checks = [if ((getString(voteKey) == unit))
271298 then true
272299 else throwErr("You have already voted"), if ((gwxAmountAtEnd > 0))
273300 then true
274301 else throw("You'll not have gWX at the end of voting")]
275302 if ((checks == checks))
276303 then {
277304 let lastVotingValue = valueOrElse(getString(votingResultKey), defaultVotingValue)
278305 let lastVotingValueParts = split(lastVotingValue, separator)
279306 let newVotingValue = if (inFavor)
280307 then votingValue((parseIntValue(lastVotingValueParts[1]) + gwxAmountAtEnd), parseIntValue(lastVotingValueParts[2]))
281308 else votingValue(parseIntValue(lastVotingValueParts[1]), (parseIntValue(lastVotingValueParts[2]) + gwxAmountAtEnd))
282309 [StringEntry(voteKey, voteValue(inFavor, gwxAmountAtEnd)), StringEntry(votingResultKey, newVotingValue)]
283310 }
284311 else throw("Strict value is not equal to itself.")
285312 }
286313 else throw("Strict value is not equal to itself.")
287314 }
288315
289316
290317
291318 @Callable(i)
292319 func cancelVote (assetId) = {
293320 let currentIndexKey = keyCurrentIndex(assetId)
294321 let currentIndex = valueOrErrorMessage(getInteger(currentIndexKey), wrapErr("voting does not exist"))
295322 let voteKey = keyVote(assetId, currentIndex, i.caller)
296323 let votingResultKey = keyVotingResult(assetId, currentIndex)
297324 let lastVote = valueOrErrorMessage(getString(voteKey), wrapErr("you have not voted"))
298325 let lastVoteParts = split(lastVote, separator)
299326 let inFavor = lastVoteParts[1]
300327 let gwxAmount = parseIntValue(lastVoteParts[2])
301328 let votingInfo = votingExistChecks(assetId, currentIndex)
302329 if ((votingInfo == votingInfo))
303330 then {
304331 let checks = [if (if ((inFavor == "true"))
305332 then true
306333 else (inFavor == "false"))
307334 then true
308335 else throwErr("invalid vote")]
309336 if ((checks == checks))
310337 then {
311338 let lastVotingValue = valueOrElse(getString(votingResultKey), defaultVotingValue)
312339 let lastVotingValueParts = split(lastVotingValue, separator)
313340 let newVotingResultValue = if ((inFavor == "true"))
314341 then votingValue((parseIntValue(lastVotingValueParts[1]) - gwxAmount), parseIntValue(lastVotingValueParts[2]))
315342 else votingValue(parseIntValue(lastVotingValueParts[1]), (parseIntValue(lastVotingValueParts[2]) - gwxAmount))
316343 [DeleteEntry(voteKey), StringEntry(votingResultKey, newVotingResultValue)]
317344 }
318345 else throw("Strict value is not equal to itself.")
319346 }
320347 else throw("Strict value is not equal to itself.")
321348 }
322349
323350
324351
325352 @Callable(i)
326353 func finalize (assetId) = {
327354 let verificationInProgress = valueOrElse(getBoolean(keyVerificationInProgress(assetId)), false)
328355 let deverificationInProgress = valueOrElse(getBoolean(keyDeverificationInProgress(assetId)), false)
329356 let currentIndexKey = keyCurrentIndex(assetId)
330357 let currentIndex = valueOrElse(getInteger(currentIndexKey), 0)
331358 let votingThresholdAdd = valueOrErrorMessage(getInteger(keyVotingThresholdAdd), wrapErr("votingThresholdAdd not set"))
332359 let votingThresholdRemove = valueOrErrorMessage(getInteger(keyVotingThresholdRemove), wrapErr("votingThresholdRemove not set"))
333- let $t01424414683 = if (verificationInProgress)
360+ let $t01478315222 = if (verificationInProgress)
334361 then $Tuple3([DeleteEntry(keyVerificationInProgress(assetId)), BooleanEntry(keyVerified(assetId), true)], true, votingThresholdAdd)
335362 else $Tuple3([DeleteEntry(keyDeverificationInProgress(assetId)), DeleteEntry(keyVerified(assetId))], true, votingThresholdRemove)
336- let finalizeVotingActions = $t01424414683._1
337- let verified = $t01424414683._2
338- let threshold = $t01424414683._3
363+ let finalizeVotingActions = $t01478315222._1
364+ let verified = $t01478315222._2
365+ let threshold = $t01478315222._3
339366 let lastVotingValue = valueOrElse(getString(keyVotingResult(assetId, currentIndex)), defaultVotingValue)
340367 let lastVotingValueParts = split(lastVotingValue, separator)
341368 let votesFor = parseIntValue(lastVotingValueParts[1])
342369 let votesAgainst = parseIntValue(lastVotingValueParts[2])
343370 let votesTotal = (votesFor + votesAgainst)
344371 let votingEndHeight = valueOrErrorMessage(getInteger(keyVotingEndHeight(assetId, currentIndex)), wrapErr("voting end height not found"))
345372 let checks = [if (if (verificationInProgress)
346373 then true
347374 else deverificationInProgress)
348375 then true
349376 else throwErr("nothing to finalize"), if ((height >= votingEndHeight))
350377 then true
351378 else throwErr("voting not finished"), if ((votesTotal >= threshold))
352379 then true
353380 else throwErr("not enough votes")]
354381 if ((checks == checks))
355382 then {
356383 let finalizeCallRewardAction = if ((votesAgainst > votesFor))
357384 then {
358385 let setVerifiedInvoke = invoke(assetsStoreContract, "setVerified", [assetId, verified], nil)
359386 if ((setVerifiedInvoke == setVerifiedInvoke))
360387 then {
361388 let finalizeCallRewardAmount = valueOrElse(getInteger(keyFinalizeCallRewardAmount), 0)
362389 [ScriptTransfer(i.caller, finalizeCallRewardAmount, wxAssetId)]
363390 }
364391 else throw("Strict value is not equal to itself.")
365392 }
366393 else nil
367394 (finalizeVotingActions ++ finalizeCallRewardAction)
368395 }
369396 else throw("Strict value is not equal to itself.")
370397 }
371398
372399
373400
374401 @Callable(i)
375402 func claimREADONLY (assetId,index) = {
376403 let callerAddress = i.caller
377404 let votingRewardAssetIdStr = getString(keyVotingRewardAssetId(assetId, index))
378405 let rewardAmount = if (isDefined(votingRewardAssetIdStr))
379406 then calculateReward(callerAddress, assetId, index)
380407 else 0
381408 $Tuple2(nil, rewardAmount)
382409 }
383410
384411
385412
386413 @Callable(i)
387414 func claim (assetId,index) = {
388415 let callerAddress = i.caller
389416 let claimHistoryKey = keyClaimHistory(callerAddress, assetId, index)
390417 let claimHistory = getString(claimHistoryKey)
391418 let checks = [if ((claimHistory == unit))
392419 then true
393420 else throwErr("already claimed")]
394421 if ((checks == checks))
395422 then {
396423 let rewardAmount = if ((calculateReward(callerAddress, assetId, index) > 0))
397424 then calculateReward(callerAddress, assetId, index)
398425 else throwErr("nothing to claim")
399426 let votingRewardAssetIdStr = getString(keyVotingRewardAssetId(assetId, index))
400427 let rewardAction = if (isDefined(votingRewardAssetIdStr))
401428 then {
402429 let votingRewardAssetId = fromBase58String(value(votingRewardAssetIdStr))
403430 [ScriptTransfer(callerAddress, rewardAmount, votingRewardAssetId), StringEntry(claimHistoryKey, claimHistoryValue(rewardAmount))]
404431 }
405432 else throwErr("nothing to claim")
406433 rewardAction
407434 }
408435 else throw("Strict value is not equal to itself.")
409436 }
410437
411438
439+@Verifier(tx)
440+func verify () = {
441+ let targetPublicKey = match managerPublicKeyOrUnit() {
442+ case pk: ByteVector =>
443+ pk
444+ case _: Unit =>
445+ tx.senderPublicKey
446+ case _ =>
447+ throw("Match error")
448+ }
449+ sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
450+ }
451+

github/deemru/w8io/873ac7e 
74.61 ms