tx · UjJCzcnHprUqHuKsr9t26qme7EGxkVFTk6RhRg3UjwU

3N6HSS7Toat1RhyEsyqVGgVSRzH19W1FTbP:  -0.03400000 Waves

2023.08.23 09:43 [2722925] smart account 3N6HSS7Toat1RhyEsyqVGgVSRzH19W1FTbP > SELF 0.00000000 Waves

{ "type": 13, "id": "UjJCzcnHprUqHuKsr9t26qme7EGxkVFTk6RhRg3UjwU", "fee": 3400000, "feeAssetId": null, "timestamp": 1692773059004, "version": 1, "sender": "3N6HSS7Toat1RhyEsyqVGgVSRzH19W1FTbP", "senderPublicKey": "AoKo4segKHU4DeJnxXQYJj2u7J6XJeux6r8KLW52cd2Q", "proofs": [ "4BaZxHn9tJHbF84X6r6JYEbd19yGM2shQDCzKHTqMQJxRJNaSTwAnA9TBKtNi4hgGQn3Vb3cPSDA3iYkzKyGAC8L" ], "script": "base64:BwJHCAISABIDCgECEgcKBQIBAQEBEgYKBAEBAQESAwoBAhIDCgECEgQKAgICEgQKAgIIEgQKAgIYEgQKAgIIEgQKAgIYEgMKAQJAAANTRVACAl9fAA1DT05UUkFDVF9OQU1FAg9jYWxjdWxhdG9yLnJpZGUABlNDQUxFOACAwtcvAAdQRU5ESU5HAgdQRU5ESU5HAAVXQVZFUwIFV0FWRVMAHGJsb2Nrc1Byb2Nlc3NpbmdCYXRjaFNpemVNYXgACgEHd3JhcEVycgEBcwkArAICCQCsAgIFDUNPTlRSQUNUX05BTUUCAjogBQFzAQh0aHJvd0VycgEBcwkAAgEJAQd3cmFwRXJyAQUBcwEPYXNzZXRJZFRvU3RyaW5nAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWIFByRtYXRjaDAJANgEAQUBYgMJAAECBQckbWF0Y2gwAgRVbml0BQVXQVZFUwkAAgECC01hdGNoIGVycm9yAQ9zdHJpbmdUb0Fzc2V0SWQBAXMDCQAAAgUBcwUFV0FWRVMFBHVuaXQJANkEAQUBcwEDYWJzAQFuAwkAZgIAAAUBbgkBAS0BBQFuBQFuARFrZXlGYWN0b3J5QWRkcmVzcwAJALkJAgkAzAgCAgIlcwkAzAgCAgdmYWN0b3J5BQNuaWwFA1NFUAETa2V5TWFuYWdlclB1YmxpY0tleQAJALkJAgkAzAgCAgIlcwkAzAgCAhBtYW5hZ2VyUHVibGljS2V5BQNuaWwFA1NFUAEMa2V5THBBc3NldElkAAkAuQkCCQDMCAICAiVzCQDMCAICCWxwQXNzZXRJZAUDbmlsBQNTRVABF2tleVByb3h5VHJlYXN1cnlBZGRyZXNzAAkAuQkCCQDMCAICAiVzCQDMCAICDXByb3h5VHJlYXN1cnkFA25pbAUDU0VQARZrZXlNYWluVHJlYXN1cnlBZGRyZXNzAAkAuQkCCQDMCAICAiVzCQDMCAICDG1haW5UcmVhc3VyeQUDbmlsBQNTRVABGmtleUJ1c2luZXNzVHJlYXN1cnlBZGRyZXNzAAkAuQkCCQDMCAICAiVzCQDMCAICEGJ1c2luZXNzVHJlYXN1cnkFA25pbAUDU0VQARdrZXlCdXNpbmVzc1RyZWFzdXJ5UGFydAAJALkJAgkAzAgCAgIlcwkAzAgCAhRidXNpbmVzc1RyZWFzdXJ5UGFydAUDbmlsBQNTRVABF2tleVBvd2VyQ29udHJhY3RBZGRyZXNzAAkAuQkCCQDMCAICAiVzCQDMCAICDXBvd2VyQ29udHJhY3QFA25pbAUDU0VQARJrZXlQb3dlclNoYXJlUmF0aW8ACQC5CQIJAMwIAgICJXMJAMwIAgIPcG93ZXJTaGFyZVJhdGlvBQNuaWwFA1NFUAEPa2V5UG93ZXJBc3NldElkAAkAuQkCCQDMCAICAiVzCQDMCAICDHBvd2VyQXNzZXRJZAUDbmlsBQNTRVABC2tleUludmVzdGVkAQdhc3NldElkCQC5CQIJAMwIAgIEJXMlcwkAzAgCAghpbnZlc3RlZAkAzAgCCQEPYXNzZXRJZFRvU3RyaW5nAQUHYXNzZXRJZAUDbmlsBQNTRVABCmtleURvbmF0ZWQBB2Fzc2V0SWQJALkJAgkAzAgCAgQlcyVzCQDMCAICB2RvbmF0ZWQJAMwIAgkBD2Fzc2V0SWRUb1N0cmluZwEFB2Fzc2V0SWQFA25pbAUDU0VQAQxrZXlBdmFpbGFibGUBC3VzZXJBZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCAglhdmFpbGFibGUJAMwIAgkApQgBBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABCmtleUNsYWltZWQBC3VzZXJBZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCAgdjbGFpbWVkCQDMCAIJAKUIAQULdXNlckFkZHJlc3MFA25pbAUDU0VQARBrZXlDdXJyZW50UGVyaW9kAAkAuQkCCQDMCAICAiVzCQDMCAICDWN1cnJlbnRQZXJpb2QFA25pbAUDU0VQARFrZXlQcmljZUZvclBlcmlvZAEGcGVyaW9kCQC5CQIJAMwIAgIEJXMlZAkAzAgCAgVwcmljZQkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABDmtleVN0YXJ0SGVpZ2h0AQZwZXJpb2QJALkJAgkAzAgCAgQlcyVkCQDMCAICC3N0YXJ0SGVpZ2h0CQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEUa2V5UG93ZXJNYW5hZ2VyQm9udXMBBnBlcmlvZAkAuQkCCQDMCAICBCVzJWQJAMwIAgIRcG93ZXJNYW5hZ2VyQm9udXMJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQARNrZXlDbGFpbVdhdmVzQW1vdW50AQZwZXJpb2QJALkJAgkAzAgCAgQlcyVkCQDMCAICEGNsYWltV2F2ZXNBbW91bnQJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQAQ9rZXlQZXJpb2RMZW5ndGgAAhAlc19fcGVyaW9kTGVuZ3RoARVrZXlJbnZlc3RQZXJpb2RMZW5ndGgAAhYlc19faW52ZXN0UGVyaW9kTGVuZ3RoARhrZXlCbG9ja1Byb2Nlc3NpbmdSZXdhcmQAAhklc19fYmxvY2tQcm9jZXNzaW5nUmV3YXJkARVrZXlOZXh0QmxvY2tUb1Byb2Nlc3MAAhYlc19fbmV4dEJsb2NrVG9Qcm9jZXNzARFrZXlCbG9ja1Byb2Nlc3NlZAEGaGVpZ2h0CQC5CQIJAMwIAgIEJXMlZAkAzAgCAg5ibG9ja1Byb2Nlc3NlZAkAzAgCCQCkAwEFBmhlaWdodAUDbmlsBQNTRVABDWtleVdpdGhkcmF3YWwAAg4lc19fd2l0aGRyYXdhbAEUa2V5V2l0aGRyYXdhbFJlcXVlc3QCC3VzZXJBZGRyZXNzBHR4SWQJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIKd2l0aGRyYXdhbAkAzAgCCQClCAEFC3VzZXJBZGRyZXNzCQDMCAIJANgEAQUEdHhJZAUDbmlsBQNTRVABFnZhbHVlV2l0aGRyYXdhbFJlcXVlc3QEBnN0YXR1cw1scEFzc2V0QW1vdW50DHRhcmdldFBlcmlvZAljbGFpbVR4SWQEDGNsYWltVHhJZFN0cgQHJG1hdGNoMAUJY2xhaW1UeElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWIFByRtYXRjaDAJANgEAQUBYgMJAAECBQckbWF0Y2gwAgRVbml0AgRTT09OCQACAQILTWF0Y2ggZXJyb3IJALkJAgkAzAgCAgglcyVkJWQlcwkAzAgCBQZzdGF0dXMJAMwIAgkApAMBBQ1scEFzc2V0QW1vdW50CQDMCAIJAKQDAQUMdGFyZ2V0UGVyaW9kCQDMCAIFDGNsYWltVHhJZFN0cgUDbmlsBQNTRVABFGtleVdpdGhkcmF3YWxIaXN0b3J5Agt1c2VyQWRkcmVzcwR0eElkCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICEXdpdGhkcmF3YWxIaXN0b3J5CQDMCAIJAKUIAQULdXNlckFkZHJlc3MJAMwIAgkA2AQBBQR0eElkBQNuaWwFA1NFUAEba2V5UGVyaW9kV2l0aGRyYXdhbEFzc2V0SWRzAQZwZXJpb2QJALkJAgkAzAgCAgQlcyVkCQDMCAICDHBlcmlvZFJld2FyZAkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABGmtleVBlcmlvZFdpdGhkcmF3YWxBbW91bnRzAQZwZXJpb2QJALkJAgkAzAgCAgQlcyVkCQDMCAICEnBlcmlvZFJld2FyZEFtb3VudAkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABIXBhcnNlV2l0aGRyYXdhbFJlcXVlc3RWYWx1ZU9yRmFpbAEBcwQFcGFydHMJALUJAgUBcwUDU0VQAwkAAAIJAJADAQUFcGFydHMABQQGc3RhdHVzCQCRAwIFBXBhcnRzAAEEDWxwQXNzZXRBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBCQCRAwIFBXBhcnRzAAIJAQd3cmFwRXJyAQIVaW52YWxpZCBscEFzc2V0QW1vdW50BAx0YXJnZXRQZXJpb2QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBCQCRAwIFBXBhcnRzAAMJAQd3cmFwRXJyAQIUaW52YWxpZCB0YXJnZXRQZXJpb2QECWNsYWltVHhJZAkAkQMCBQVwYXJ0cwAECQCWCgQFBnN0YXR1cwUNbHBBc3NldEFtb3VudAUMdGFyZ2V0UGVyaW9kBQljbGFpbVR4SWQJAQh0aHJvd0VycgECIGludmFsaWQgd2l0aGRyYXdhbCByZXF1ZXN0IHZhbHVlABRmYWN0b3J5QWRkcmVzc09wdGlvbgQHJG1hdGNoMAkAnQgCBQR0aGlzCQERa2V5RmFjdG9yeUFkZHJlc3MAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkApggBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgAUZmFjdG9yeUFkZHJlc3NPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUUZmFjdG9yeUFkZHJlc3NPcHRpb24JAQd3cmFwRXJyAQIXaW52YWxpZCBmYWN0b3J5IGFkZHJlc3MAD2xwQXNzZXRJZE9wdGlvbgQHJG1hdGNoMAUUZmFjdG9yeUFkZHJlc3NPcHRpb24DCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAQHJG1hdGNoMQkAnQgCBQFhCQEMa2V5THBBc3NldElkAAMJAAECBQckbWF0Y2gxAgZTdHJpbmcEAXMFByRtYXRjaDEJANkEAQUBcwMJAAECBQckbWF0Y2gxAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAA9scEFzc2V0SWRPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUPbHBBc3NldElkT3B0aW9uCQEHd3JhcEVycgECEWludmFsaWQgbHBBc3NldElkABpwcm94eVRyZWFzdXJ5QWRkcmVzc09wdGlvbgQHJG1hdGNoMAUUZmFjdG9yeUFkZHJlc3NPcHRpb24DCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAQHJG1hdGNoMQkAnQgCBQFhCQEXa2V5UHJveHlUcmVhc3VyeUFkZHJlc3MAAwkAAQIFByRtYXRjaDECBlN0cmluZwQBcwUHJG1hdGNoMQkApggBBQFzAwkAAQIFByRtYXRjaDECBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IAGnByb3h5VHJlYXN1cnlBZGRyZXNzT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIFGnByb3h5VHJlYXN1cnlBZGRyZXNzT3B0aW9uCQEHd3JhcEVycgECHmludmFsaWQgcHJveHkgdHJlYXN1cnkgYWRkcmVzcwAZbWFpblRyZWFzdXJ5QWRkcmVzc09wdGlvbgQHJG1hdGNoMAUUZmFjdG9yeUFkZHJlc3NPcHRpb24DCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAQHJG1hdGNoMQkAnQgCBQFhCQEWa2V5TWFpblRyZWFzdXJ5QWRkcmVzcwADCQABAgUHJG1hdGNoMQIGU3RyaW5nBAFzBQckbWF0Y2gxCQCmCAEFAXMDCQABAgUHJG1hdGNoMQIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgAdYnVzaW5lc3NUcmVhc3VyeUFkZHJlc3NPcHRpb24EByRtYXRjaDAFFGZhY3RvcnlBZGRyZXNzT3B0aW9uAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAEByRtYXRjaDEJAJ0IAgUBYQkBGmtleUJ1c2luZXNzVHJlYXN1cnlBZGRyZXNzAAMJAAECBQckbWF0Y2gxAgZTdHJpbmcEAXMFByRtYXRjaDEJAKYIAQUBcwMJAAECBQckbWF0Y2gxAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yABltYWluVHJlYXN1cnlBZGRyZXNzT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIFGW1haW5UcmVhc3VyeUFkZHJlc3NPcHRpb24JAQd3cmFwRXJyAQIdaW52YWxpZCBtYWluIHRyZWFzdXJ5IGFkZHJlc3MAHWJ1c2luZXNzVHJlYXN1cnlBZGRyZXNzT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIFHWJ1c2luZXNzVHJlYXN1cnlBZGRyZXNzT3B0aW9uCQEHd3JhcEVycgECIWludmFsaWQgYnVzaW5lc3MgdHJlYXN1cnkgYWRkcmVzcwAacG93ZXJDb250cmFjdEFkZHJlc3NPcHRpb24EByRtYXRjaDAFFGZhY3RvcnlBZGRyZXNzT3B0aW9uAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAEByRtYXRjaDEJAJ0IAgUBYQkBF2tleVBvd2VyQ29udHJhY3RBZGRyZXNzAAMJAAECBQckbWF0Y2gxAgZTdHJpbmcEAXMFByRtYXRjaDEJAKYIAQUBcwMJAAECBQckbWF0Y2gxAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yABpwb3dlckNvbnRyYWN0QWRkcmVzc09yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBRpwb3dlckNvbnRyYWN0QWRkcmVzc09wdGlvbgkBB3dyYXBFcnIBAh5pbnZhbGlkIHBvd2VyIGNvbnRyYWN0IGFkZHJlc3MAGHBvd2VyQXNzZXRJZFN0cmluZ09yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEPa2V5UG93ZXJBc3NldElkAAkBB3dyYXBFcnIBAhhwb3dlciBhc3NldCBpZCBub3QgZm91bmQBGWdldE1hbmFnZXJQdWJsaWNLZXlPclVuaXQABAckbWF0Y2gwBRRmYWN0b3J5QWRkcmVzc09wdGlvbgMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAJmYQUHJG1hdGNoMAQHJG1hdGNoMQkAnQgCBQJmYQkBE2tleU1hbmFnZXJQdWJsaWNLZXkAAwkAAQIFByRtYXRjaDECBlN0cmluZwQDcHViBQckbWF0Y2gxCQDZBAEFA3B1YgUEdW5pdAUEdW5pdAELb25seUFkZHJlc3MCAWkHYWRkcmVzcwMJAAACCAUBaQZjYWxsZXIFB2FkZHJlc3MGCQEIdGhyb3dFcnIBAhFwZXJtaXNzaW9uIGRlbmllZAELb25seUZhY3RvcnkBAWkJAQtvbmx5QWRkcmVzcwIFAWkFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAQ9yZXdhcmRGb3JPcHRpb24CB3Jld2FyZHMGdGFyZ2V0BAFzCQCQAwEFB3Jld2FyZHMECyR0MDY2Njk2Njk0CQCRAwIFB3Jld2FyZHMAAAQCYTAIBQskdDA2NjY5NjY5NAJfMQQCcjAIBQskdDA2NjY5NjY5NAJfMgQLJHQwNjY5NzY3MjIJAJEDAgUHcmV3YXJkcwABBAJhMQgFCyR0MDY2OTc2NzIyAl8xBAJyMQgFCyR0MDY2OTc2NzIyAl8yBAskdDA2NzI1Njc1MAkAkQMCBQdyZXdhcmRzAAIEAmEyCAULJHQwNjcyNTY3NTACXzEEAnIyCAULJHQwNjcyNTY3NTACXzIDAwkAZgIFAXMAAAkAAAIFAmEwBQZ0YXJnZXQHBQJyMAMDCQBmAgUBcwABCQAAAgUCYTEFBnRhcmdldAcFAnIxAwMJAGYCBQFzAAIJAAACBQJhMgUGdGFyZ2V0BwUCcjIFBHVuaXQBDmNhbGN1bGF0ZVByaWNlAQ1scFBhcnRJbldhdmVzBBNscEFzc2V0QW1vdW50VG9CdXJuCQELdmFsdWVPckVsc2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQENa2V5V2l0aGRyYXdhbAAAAAQPbHBBc3NldFF1YW50aXR5CAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFD2xwQXNzZXRJZE9yRmFpbAkBB3dyYXBFcnIBAhRpbnZhbGlkIGxwQXNzZXQgaW5mbwhxdWFudGl0eQQIbmV3UHJpY2UJAGsDBQ1scFBhcnRJbldhdmVzBQZTQ0FMRTgJAGUCBQ9scEFzc2V0UXVhbnRpdHkFE2xwQXNzZXRBbW91bnRUb0J1cm4EE2NoZWNrSWZQcmljZU5vdFplcm8DCQECIT0CBQhuZXdQcmljZQAABgkBCHRocm93RXJyAQIUTFAgcHJpY2UgY2Fubm90IGJlIDADCQAAAgUTY2hlY2tJZlByaWNlTm90WmVybwUTY2hlY2tJZlByaWNlTm90WmVybwQUbHBBc3NldEZpbmFsUXVhbnRpdHkJAGUCBQ9scEFzc2V0UXVhbnRpdHkFE2xwQXNzZXRBbW91bnRUb0J1cm4JAJUKAwUIbmV3UHJpY2UFE2xwQXNzZXRBbW91bnRUb0J1cm4FFGxwQXNzZXRGaW5hbFF1YW50aXR5CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARdjbGFpbUNvbGxhdGVyYWxJTlRFUk5BTAIQdXNlckFkZHJlc3NCeXRlcwR0eElkBAt1c2VyQWRkcmVzcwkBB0FkZHJlc3MBBRB1c2VyQWRkcmVzc0J5dGVzBBNjdXJyZW50UGVyaW9kT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARBrZXlDdXJyZW50UGVyaW9kAAkBB3dyYXBFcnIBAg5pbnZhbGlkIHBlcmlvZAQXd2l0aGRyYXdhbFJlcXVlc3RPcHRpb24JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBFGtleVdpdGhkcmF3YWxSZXF1ZXN0AgULdXNlckFkZHJlc3MFBHR4SWQJAQd3cmFwRXJyAQIaaW52YWxpZCB3aXRoZHJhd2FsIHJlcXVlc3QECyR0MDc5MTc4MDMwCQEhcGFyc2VXaXRoZHJhd2FsUmVxdWVzdFZhbHVlT3JGYWlsAQUXd2l0aGRyYXdhbFJlcXVlc3RPcHRpb24EBnN0YXR1cwgFCyR0MDc5MTc4MDMwAl8xBA1scEFzc2V0QW1vdW50CAULJHQwNzkxNzgwMzACXzIEDHRhcmdldFBlcmlvZAgFCyR0MDc5MTc4MDMwAl8zBAljbGFpbVR4SWQIBQskdDA3OTE3ODAzMAJfNAMJAGYCBQx0YXJnZXRQZXJpb2QFE2N1cnJlbnRQZXJpb2RPckZhaWwJAQh0aHJvd0VycgECIWludmFsaWQgd2l0aGRyYXdhbCByZXF1ZXN0IHBlcmlvZAQLcHJpY2VPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBEWtleVByaWNlRm9yUGVyaW9kAQUMdGFyZ2V0UGVyaW9kCQEHd3JhcEVycgECDWludmFsaWQgcHJpY2UEC3dhdmVzQW1vdW50AwkAZgIFC3ByaWNlT3JGYWlsAAAJAGsDBQ1scEFzc2V0QW1vdW50BQtwcmljZU9yRmFpbAUGU0NBTEU4AAAEDGFzc2V0c1N0cmluZwkBEUBleHRyTmF0aXZlKDEwNTMpAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARtrZXlQZXJpb2RXaXRoZHJhd2FsQXNzZXRJZHMBBRNjdXJyZW50UGVyaW9kT3JGYWlsBA1hbW91bnRzU3RyaW5nCQERQGV4dHJOYXRpdmUoMTA1MykCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBGmtleVBlcmlvZFdpdGhkcmF3YWxBbW91bnRzAQUTY3VycmVudFBlcmlvZE9yRmFpbAkAmAoGBQt1c2VyQWRkcmVzcwUNbHBBc3NldEFtb3VudAUMdGFyZ2V0UGVyaW9kBQt3YXZlc0Ftb3VudAUMYXNzZXRzU3RyaW5nBQ1hbW91bnRzU3RyaW5nASVjbGFpbUNvbGxhdGVyYWxSRUFET05MWVN0cmluZ1Jlc3BvbnNlAhB1c2VyQWRkcmVzc0J5dGVzBHR4SWQECyR0MDg4MTc4OTgzCQEXY2xhaW1Db2xsYXRlcmFsSU5URVJOQUwCBRB1c2VyQWRkcmVzc0J5dGVzBQR0eElkBAt1c2VyQWRkcmVzcwgFCyR0MDg4MTc4OTgzAl8xBA1scEFzc2V0QW1vdW50CAULJHQwODgxNzg5ODMCXzIEDHRhcmdldFBlcmlvZAgFCyR0MDg4MTc4OTgzAl8zBAt3YXZlc0Ftb3VudAgFCyR0MDg4MTc4OTgzAl80BAxhc3NldHNTdHJpbmcIBQskdDA4ODE3ODk4MwJfNQQNYW1vdW50c1N0cmluZwgFCyR0MDg4MTc4OTgzAl82BAZhc3NldHMJALkJAgkA0QgCCQC9CQIFDGFzc2V0c1N0cmluZwUDU0VQAAACAToEB2Ftb3VudHMJALkJAgkA0QgCCQC9CQIFDWFtb3VudHNTdHJpbmcFA1NFUAAAAgE6CQC5CQIJAMwIAgIGJWQlcyVzCQDMCAIJAKQDAQULd2F2ZXNBbW91bnQJAMwIAgUGYXNzZXRzCQDMCAIFB2Ftb3VudHMFA25pbAUDU0VQAQ5nZXRSZXdhcmRTcGxpdAEVZ2VuZXJhdG9yUmV3YXJkQW1vdW50BA9wb3dlclNoYXJlUmF0aW8JAJYDAQkAzAgCAAAJAMwIAgkAlwMBCQDMCAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARJrZXlQb3dlclNoYXJlUmF0aW8AAAAJAMwIAgUGU0NBTEU4BQNuaWwFA25pbAQRYnVzaW5lc3NQYXJ0UmF0aW8JAJYDAQkAzAgCAAAJAMwIAgkAlwMBCQDMCAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARdrZXlCdXNpbmVzc1RyZWFzdXJ5UGFydAAAAAkAzAgCBQZTQ0FMRTgFA25pbAUDbmlsBBFhbW91bnRUb1Bvd2VyUGFydAkAawMFFWdlbmVyYXRvclJld2FyZEFtb3VudAUPcG93ZXJTaGFyZVJhdGlvBQZTQ0FMRTgEGmJ1c2luZXNzVHJlYXN1cnlBbW91bnRQYXJ0CQBrAwUVZ2VuZXJhdG9yUmV3YXJkQW1vdW50BRFidXNpbmVzc1BhcnRSYXRpbwUGU0NBTEU4BA9yZXdhcmRSZW1haW5kZXIJAGUCCQBlAgUVZ2VuZXJhdG9yUmV3YXJkQW1vdW50BRFhbW91bnRUb1Bvd2VyUGFydAUaYnVzaW5lc3NUcmVhc3VyeUFtb3VudFBhcnQDCQBmAgUPcmV3YXJkUmVtYWluZGVyAAAJAJUKAwURYW1vdW50VG9Qb3dlclBhcnQFGmJ1c2luZXNzVHJlYXN1cnlBbW91bnRQYXJ0BQ9yZXdhcmRSZW1haW5kZXIJAQh0aHJvd0VycgECKmFtb3VudCB0byBtYWluIHRyZWFzdXJ5IGNhbm5vdCBiZSBuZWdhdGl2ZQEYY2FsY1Jld2FyZFNwbGl0Rm9yQW1vdW50AQZhbW91bnQEDSR0MDEwMDgyMTAxNzUJAQ5nZXRSZXdhcmRTcGxpdAEFBmFtb3VudAQRYW1vdW50VG9Qb3dlclBhcnQIBQ0kdDAxMDA4MjEwMTc1Al8xBBpidXNpbmVzc1RyZWFzdXJ5QW1vdW50UGFydAgFDSR0MDEwMDgyMTAxNzUCXzIED3Jld2FyZFJlbWFpbmRlcggFDSR0MDEwMDgyMTAxNzUCXzMEFWJsb2NrUHJvY2Vzc2luZ1Jld2FyZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEYa2V5QmxvY2tQcm9jZXNzaW5nUmV3YXJkAAkBB3dyYXBFcnIBAh9pbnZhbGlkIGJsb2NrIHByb2Nlc3NpbmcgcmV3YXJkBCBibG9ja1Byb2Nlc3NpbmdSZXdhcmRCeUdlbmVyYXRvcgkAaQIFFWJsb2NrUHJvY2Vzc2luZ1Jld2FyZAUcYmxvY2tzUHJvY2Vzc2luZ0JhdGNoU2l6ZU1heAQKdG9McEFtb3VudAkAZQIFD3Jld2FyZFJlbWFpbmRlcgUVYmxvY2tQcm9jZXNzaW5nUmV3YXJkCQCXCgUFEWFtb3VudFRvUG93ZXJQYXJ0BRpidXNpbmVzc1RyZWFzdXJ5QW1vdW50UGFydAUVYmxvY2tQcm9jZXNzaW5nUmV3YXJkBQp0b0xwQW1vdW50BQZhbW91bnQMAWkBE3Jld2FyZFNwbGl0UkVBRE9OTFkABBF0YXJnZXRCbG9ja0hlaWdodAkAZQIFBmhlaWdodAABBA90YXJnZXRCbG9ja0luZm8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7QcBBRF0YXJnZXRCbG9ja0hlaWdodAkBB3dyYXBFcnIBAhJpbnZhbGlkIGJsb2NrIGluZm8EFHRyZWFzdXJ5UmV3YXJkT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAQ9yZXdhcmRGb3JPcHRpb24CCAUPdGFyZ2V0QmxvY2tJbmZvB3Jld2FyZHMFGnByb3h5VHJlYXN1cnlBZGRyZXNzT3JGYWlsCQEHd3JhcEVycgEJAKwCAgIjaW52YWxpZCB0cmVhc3VyeSByZXdhcmQgZm9yIGhlaWdodCAJAKQDAQURdGFyZ2V0QmxvY2tIZWlnaHQJAJQKAgUDbmlsCQEYY2FsY1Jld2FyZFNwbGl0Rm9yQW1vdW50AQUUdHJlYXN1cnlSZXdhcmRPckZhaWwBaQEHY2xhaW1MUAEQdXNlckFkZHJlc3NCeXRlcwQLY2hlY2tDYWxsZXIJAQtvbmx5RmFjdG9yeQEFAWkDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyBAt1c2VyQWRkcmVzcwkBB0FkZHJlc3MBBRB1c2VyQWRkcmVzc0J5dGVzBAlhdmFpbGFibGUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJAQxrZXlBdmFpbGFibGUBBQt1c2VyQWRkcmVzcwAABAdjbGFpbWVkCQELdmFsdWVPckVsc2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEKa2V5Q2xhaW1lZAEFC3VzZXJBZGRyZXNzAAAEDmZhY3RvcnlBY3Rpb25zAwkAZgIFCWF2YWlsYWJsZQAACQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDXRyYW5zZmVyQXNzZXQJAMwIAgUQdXNlckFkZHJlc3NCeXRlcwkAzAgCBQlhdmFpbGFibGUJAMwIAgUPbHBBc3NldElkT3JGYWlsBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBDGtleUF2YWlsYWJsZQEFC3VzZXJBZGRyZXNzCQDMCAIAAAUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIMaW50ZWdlckVudHJ5CQDMCAIJAQprZXlDbGFpbWVkAQULdXNlckFkZHJlc3MJAMwIAgkAZAIFB2NsYWltZWQFCWF2YWlsYWJsZQUDbmlsBQNuaWwFA25pbAkBCHRocm93RXJyAQIQbm90aGluZyB0byBjbGFpbQkAlAoCBQNuaWwFDmZhY3RvcnlBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGZpbmFsaXplBRB1c2VyQWRkcmVzc0J5dGVzE2RvbmF0aW9uUGFydEluV2F2ZXMNbHBQYXJ0SW5XYXZlcxBjbGFpbVBhcnRJbldhdmVzFXBvd2VyU3Rha2VQYXJ0SW5XYXZlcwQLY2hlY2tDYWxsZXIJAQtvbmx5RmFjdG9yeQEFAWkDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyBBNjdXJyZW50UGVyaW9kT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARBrZXlDdXJyZW50UGVyaW9kAAkBB3dyYXBFcnIBAg5pbnZhbGlkIHBlcmlvZAQMcGVyaW9kTGVuZ3RoCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJAQ9rZXlQZXJpb2RMZW5ndGgACQEHd3JhcEVycgECFWludmFsaWQgcGVyaW9kIGxlbmd0aAQSY3VycmVudFN0YXJ0SGVpZ2h0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJAQ5rZXlTdGFydEhlaWdodAEFE2N1cnJlbnRQZXJpb2RPckZhaWwJAQd3cmFwRXJyAQIUaW52YWxpZCBzdGFydCBoZWlnaHQEEmN1cnJlbnRQcmljZU9yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQERa2V5UHJpY2VGb3JQZXJpb2QBBRNjdXJyZW50UGVyaW9kT3JGYWlsCQEHd3JhcEVycgECDWludmFsaWQgcHJpY2UEEm5leHRCbG9ja1RvUHJvY2VzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEVa2V5TmV4dEJsb2NrVG9Qcm9jZXNzAAkBB3dyYXBFcnIBAh1pbnZhbGlkIG5leHQgYmxvY2sgdG8gcHJvY2VzcwQPcGVyaW9kRW5kSGVpZ2h0CQBlAgkAZAIFEmN1cnJlbnRTdGFydEhlaWdodAUMcGVyaW9kTGVuZ3RoAAEEBmNoZWNrcwkAzAgCAwkAAAIIBQFpDG9yaWdpbkNhbGxlcgUZbWFpblRyZWFzdXJ5QWRkcmVzc09yRmFpbAYJAQh0aHJvd0VycgECEXBlcm1pc3Npb24gZGVuaWVkCQDMCAIDCQBmAgUSbmV4dEJsb2NrVG9Qcm9jZXNzBQ9wZXJpb2RFbmRIZWlnaHQGCQEIdGhyb3dFcnIBAhJ1bnByb2Nlc3NlZCBibG9ja3MJAMwIAgMJAGcCBRNkb25hdGlvblBhcnRJbldhdmVzAAAGCQEIdGhyb3dFcnIBAhVpbnZhbGlkIGRvbmF0aW9uIHBhcnQJAMwIAgMJAGcCBQ1scFBhcnRJbldhdmVzAAAGCQEIdGhyb3dFcnIBAg9pbnZhbGlkIGxwIHBhcnQJAMwIAgMJAGcCBRBjbGFpbVBhcnRJbldhdmVzAAAGCQEIdGhyb3dFcnIBAhJpbnZhbGlkIGNsYWltIHBhcnQJAMwIAgMJAGcCBRVwb3dlclN0YWtlUGFydEluV2F2ZXMAAAYJAQh0aHJvd0VycgECFmludmFsaWQgUFdSIHN0YWtlIHBhcnQFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQNJHQwMTM1MTMxMzYxOAkBDmNhbGN1bGF0ZVByaWNlAQUNbHBQYXJ0SW5XYXZlcwQIbmV3UHJpY2UIBQ0kdDAxMzUxMzEzNjE4Al8xBBNscEFzc2V0QW1vdW50VG9CdXJuCAUNJHQwMTM1MTMxMzYxOAJfMgQUbHBBc3NldEZpbmFsUXVhbnRpdHkIBQ0kdDAxMzUxMzEzNjE4Al8zBAluZXdQZXJpb2QJAGQCBRNjdXJyZW50UGVyaW9kT3JGYWlsAAEKAQxhZGROZXdBY3Rpb24CB2FjdGlvbnMHcGF5bWVudAQNJHQwMTM3NjYxMzgyOAUHYWN0aW9ucwQPc2NyaXB0VHJhbnNmZXJzCAUNJHQwMTM3NjYxMzgyOAJfMQQOYXNzZXRJZHNTdHJpbmcIBQ0kdDAxMzc2NjEzODI4Al8yBA1hbW91bnRzU3RyaW5nCAUNJHQwMTM3NjYxMzgyOAJfMwQNcGF5bWVudEFtb3VudAgFB3BheW1lbnQGYW1vdW50BA5wYXltZW50QXNzZXRJZAgFB3BheW1lbnQHYXNzZXRJZAQRbmV3QXNzZXRJZHNTdHJpbmcJAKwCAgICJXMJALkJAgkAzAgCBQ5hc3NldElkc1N0cmluZwkAzAgCCQEPYXNzZXRJZFRvU3RyaW5nAQUOcGF5bWVudEFzc2V0SWQFA25pbAUDU0VQBBBuZXdBbW91bnRzU3RyaW5nCQCsAgICAiVkCQC5CQIJAMwIAgUNYW1vdW50c1N0cmluZwkAzAgCCQCkAwEFDXBheW1lbnRBbW91bnQFA25pbAUDU0VQBBFuZXdTY3JpcHRUcmFuc2ZlcgkBDlNjcmlwdFRyYW5zZmVyAwUUZmFjdG9yeUFkZHJlc3NPckZhaWwFDXBheW1lbnRBbW91bnQFDnBheW1lbnRBc3NldElkCQCVCgMJAM0IAgUPc2NyaXB0VHJhbnNmZXJzBRFuZXdTY3JpcHRUcmFuc2ZlcgURbmV3QXNzZXRJZHNTdHJpbmcFEG5ld0Ftb3VudHNTdHJpbmcEDSR0MDE0Mjg4MTQzNzkKAAIkbAgFAWkIcGF5bWVudHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMFA25pbAIAAgAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDGFkZE5ld0FjdGlvbgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQPc2NyaXB0VHJhbnNmZXJzCAUNJHQwMTQyODgxNDM3OQJfMQQIQXNzZXRJZHMIBQ0kdDAxNDI4ODE0Mzc5Al8yBAdBbW91bnRzCAUNJHQwMTQyODgxNDM3OQJfMwQOZmFjdG9yeUFjdGlvbnMJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIMaW50ZWdlckVudHJ5CQDMCAIJARRrZXlQb3dlck1hbmFnZXJCb251cwEFE2N1cnJlbnRQZXJpb2RPckZhaWwJAMwIAgUVcG93ZXJTdGFrZVBhcnRJbldhdmVzBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBE2tleUNsYWltV2F2ZXNBbW91bnQBBRNjdXJyZW50UGVyaW9kT3JGYWlsCQDMCAIFEGNsYWltUGFydEluV2F2ZXMFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDGludGVnZXJFbnRyeQkAzAgCCQEQa2V5Q3VycmVudFBlcmlvZAAJAMwIAgUJbmV3UGVyaW9kBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBEWtleVByaWNlRm9yUGVyaW9kAQUJbmV3UGVyaW9kCQDMCAIFCG5ld1ByaWNlBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBDmtleVN0YXJ0SGVpZ2h0AQUJbmV3UGVyaW9kCQDMCAIJAGQCBQ9wZXJpb2RFbmRIZWlnaHQAAQUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIEYnVybgkAzAgCBRNscEFzc2V0QW1vdW50VG9CdXJuBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBDWtleVdpdGhkcmF3YWwACQDMCAIAAAUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIMaW50ZWdlckVudHJ5CQDMCAIJAQtrZXlJbnZlc3RlZAEFBHVuaXQJAMwIAgUNbHBQYXJ0SW5XYXZlcwUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIMaW50ZWdlckVudHJ5CQDMCAIJAQprZXlEb25hdGVkAQUEdW5pdAkAzAgCBRNkb25hdGlvblBhcnRJbldhdmVzBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgtzdHJpbmdFbnRyeQkAzAgCCQEba2V5UGVyaW9kV2l0aGRyYXdhbEFzc2V0SWRzAQUJbmV3UGVyaW9kCQDMCAIFCEFzc2V0SWRzBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgtzdHJpbmdFbnRyeQkAzAgCCQEaa2V5UGVyaW9kV2l0aGRyYXdhbEFtb3VudHMBBQluZXdQZXJpb2QJAMwIAgUHQW1vdW50cwUDbmlsBQNuaWwFA25pbAkAlAoCBQ9zY3JpcHRUcmFuc2ZlcnMFDmZhY3RvcnlBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEGZpbmFsaXplUkVBRE9OTFkEE2RvbmF0aW9uUGFydEluV2F2ZXMNbHBQYXJ0SW5XYXZlcxBjbGFpbVBhcnRJbldhdmVzFXBvd2VyU3Rha2VQYXJ0SW5XYXZlcwQTY3VycmVudFBlcmlvZE9yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEQa2V5Q3VycmVudFBlcmlvZAAJAQd3cmFwRXJyAQIOaW52YWxpZCBwZXJpb2QEDHBlcmlvZExlbmd0aAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEPa2V5UGVyaW9kTGVuZ3RoAAkBB3dyYXBFcnIBAhVpbnZhbGlkIHBlcmlvZCBsZW5ndGgEEmN1cnJlbnRTdGFydEhlaWdodAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEOa2V5U3RhcnRIZWlnaHQBBRNjdXJyZW50UGVyaW9kT3JGYWlsCQEHd3JhcEVycgECFGludmFsaWQgc3RhcnQgaGVpZ2h0BBJjdXJyZW50UHJpY2VPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBEWtleVByaWNlRm9yUGVyaW9kAQUTY3VycmVudFBlcmlvZE9yRmFpbAkBB3dyYXBFcnIBAg1pbnZhbGlkIHByaWNlBBJuZXh0QmxvY2tUb1Byb2Nlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBFWtleU5leHRCbG9ja1RvUHJvY2VzcwAJAQd3cmFwRXJyAQIdaW52YWxpZCBuZXh0IGJsb2NrIHRvIHByb2Nlc3MED3BlcmlvZEVuZEhlaWdodAkAZQIJAGQCBRJjdXJyZW50U3RhcnRIZWlnaHQFDHBlcmlvZExlbmd0aAABBAZjaGVja3MJAMwIAgMJAGYCBRJuZXh0QmxvY2tUb1Byb2Nlc3MFD3BlcmlvZEVuZEhlaWdodAYJAQh0aHJvd0VycgECEnVucHJvY2Vzc2VkIGJsb2NrcwkAzAgCAwkAZwIFE2RvbmF0aW9uUGFydEluV2F2ZXMAAAYJAQh0aHJvd0VycgECFWludmFsaWQgZG9uYXRpb24gcGFydAkAzAgCAwkAZwIFDWxwUGFydEluV2F2ZXMAAAYJAQh0aHJvd0VycgECD2ludmFsaWQgbHAgcGFydAkAzAgCAwkAZwIFEGNsYWltUGFydEluV2F2ZXMAAAYJAQh0aHJvd0VycgECEmludmFsaWQgY2xhaW0gcGFydAkAzAgCAwkAZwIFFXBvd2VyU3Rha2VQYXJ0SW5XYXZlcwAABgkBCHRocm93RXJyAQIWaW52YWxpZCBQV1Igc3Rha2UgcGFydAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBA0kdDAxNzI1ODE3MzYzCQEOY2FsY3VsYXRlUHJpY2UBBQ1scFBhcnRJbldhdmVzBAhuZXdQcmljZQgFDSR0MDE3MjU4MTczNjMCXzEEE2xwQXNzZXRBbW91bnRUb0J1cm4IBQ0kdDAxNzI1ODE3MzYzAl8yBBRscEFzc2V0RmluYWxRdWFudGl0eQgFDSR0MDE3MjU4MTczNjMCXzMJAJQKAgUDbmlsCQCYCgYFEGNsYWltUGFydEluV2F2ZXMFDWxwUGFydEluV2F2ZXMFE2RvbmF0aW9uUGFydEluV2F2ZXMFCG5ld1ByaWNlBRNscEFzc2V0QW1vdW50VG9CdXJuBRRscEFzc2V0RmluYWxRdWFudGl0eQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQZpbnZlc3QBEHVzZXJBZGRyZXNzQnl0ZXMEC2NoZWNrQ2FsbGVyCQELb25seUZhY3RvcnkBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQLdXNlckFkZHJlc3MJAQdBZGRyZXNzAQUQdXNlckFkZHJlc3NCeXRlcwQTY3VycmVudFBlcmlvZE9yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEQa2V5Q3VycmVudFBlcmlvZAAJAQd3cmFwRXJyAQIOaW52YWxpZCBwZXJpb2QEEmN1cnJlbnRTdGFydEhlaWdodAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEOa2V5U3RhcnRIZWlnaHQBBRNjdXJyZW50UGVyaW9kT3JGYWlsCQEHd3JhcEVycgECFGludmFsaWQgc3RhcnQgaGVpZ2h0BBJpbnZlc3RQZXJpb2RMZW5ndGgJARFAZXh0ck5hdGl2ZSgxMDUwKQIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEVa2V5SW52ZXN0UGVyaW9kTGVuZ3RoAAQLaGVpZ2h0Q2hlY2sDCQBmAgkAZAIFEmN1cnJlbnRTdGFydEhlaWdodAUSaW52ZXN0UGVyaW9kTGVuZ3RoBQZoZWlnaHQGCQEIdGhyb3dFcnIBAiF0b28gbGF0ZSB0byBpbnZlc3QgaW4gdGhpcyBwZXJpb2QDCQAAAgULaGVpZ2h0Q2hlY2sFC2hlaWdodENoZWNrBBJjdXJyZW50UHJpY2VPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBEWtleVByaWNlRm9yUGVyaW9kAQUTY3VycmVudFBlcmlvZE9yRmFpbAkBB3dyYXBFcnIBAg1pbnZhbGlkIHByaWNlBAdwYXltZW50AwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQkAkQMCCAUBaQhwYXltZW50cwAACQEIdGhyb3dFcnIBAhBpbnZhbGlkIHBheW1lbnRzBA0kdDAxODQ3MjE4NjQ5AwMJAAACCAUHcGF5bWVudAdhc3NldElkBQR1bml0CQBmAggFB3BheW1lbnQGYW1vdW50AAAHCQCUCgIIBQdwYXltZW50BmFtb3VudAgFB3BheW1lbnQHYXNzZXRJZAkBCHRocm93RXJyAQIWaW52YWxpZCBwYXltZW50IGFtb3VudAQNcGF5bWVudEFtb3VudAgFDSR0MDE4NDcyMTg2NDkCXzEEDnBheW1lbnRBc3NldElkCAUNJHQwMTg0NzIxODY0OQJfMgQMdHJlYXN1cnlQYXJ0CQELdmFsdWVPckVsc2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEXa2V5QnVzaW5lc3NUcmVhc3VyeVBhcnQAAAAEG3BheW1lbnRzV2l0aG91dFRyZWFzdXJ5UGFydAkAawMFDXBheW1lbnRBbW91bnQJAGUCBQZTQ0FMRTgFDHRyZWFzdXJ5UGFydAUGU0NBTEU4BA1scEFzc2V0QW1vdW50AwkAZgIFEmN1cnJlbnRQcmljZU9yRmFpbAAACQBrAwUbcGF5bWVudHNXaXRob3V0VHJlYXN1cnlQYXJ0BQZTQ0FMRTgFEmN1cnJlbnRQcmljZU9yRmFpbAAABAhpbnZlc3RlZAkBC3ZhbHVlT3JFbHNlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBC2tleUludmVzdGVkAQUEdW5pdAAABAdhY3Rpb25zCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFGW1haW5UcmVhc3VyeUFkZHJlc3NPckZhaWwFG3BheW1lbnRzV2l0aG91dFRyZWFzdXJ5UGFydAUOcGF5bWVudEFzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUdYnVzaW5lc3NUcmVhc3VyeUFkZHJlc3NPckZhaWwFDHRyZWFzdXJ5UGFydAUOcGF5bWVudEFzc2V0SWQFA25pbAQOZmFjdG9yeUFjdGlvbnMJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIMaW50ZWdlckVudHJ5CQDMCAIJAQtrZXlJbnZlc3RlZAEFBHVuaXQJAMwIAgkAZAIFCGludmVzdGVkBRtwYXltZW50c1dpdGhvdXRUcmVhc3VyeVBhcnQFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCB3JlaXNzdWUJAMwIAgUNbHBBc3NldEFtb3VudAUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAINdHJhbnNmZXJBc3NldAkAzAgCBRB1c2VyQWRkcmVzc0J5dGVzCQDMCAIFDWxwQXNzZXRBbW91bnQJAMwIAgUPbHBBc3NldElkT3JGYWlsBQNuaWwFA25pbAUDbmlsCQCUCgIFB2FjdGlvbnMFDmZhY3RvcnlBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3ARB1c2VyQWRkcmVzc0J5dGVzBAtjaGVja0NhbGxlcgkBC29ubHlGYWN0b3J5AQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIEC3VzZXJBZGRyZXNzCQEHQWRkcmVzcwEFEHVzZXJBZGRyZXNzQnl0ZXMEE2N1cnJlbnRQZXJpb2RPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBEGtleUN1cnJlbnRQZXJpb2QACQEHd3JhcEVycgECDmludmFsaWQgcGVyaW9kBAxwZXJpb2RMZW5ndGgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBD2tleVBlcmlvZExlbmd0aAAJAQd3cmFwRXJyAQIVaW52YWxpZCBwZXJpb2QgbGVuZ3RoBBJjdXJyZW50U3RhcnRIZWlnaHQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBDmtleVN0YXJ0SGVpZ2h0AQUTY3VycmVudFBlcmlvZE9yRmFpbAkBB3dyYXBFcnIBAhRpbnZhbGlkIHN0YXJ0IGhlaWdodAQLaGVpZ2h0Q2hlY2sDCQBmAgkAZAIFEmN1cnJlbnRTdGFydEhlaWdodAUMcGVyaW9kTGVuZ3RoBQZoZWlnaHQGCQEIdGhyb3dFcnIBAiN0b28gbGF0ZSB0byB3aXRoZHJhdyBpbiB0aGlzIHBlcmlvZAMJAAACBQtoZWlnaHRDaGVjawULaGVpZ2h0Q2hlY2sEB3BheW1lbnQDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABCQCRAwIIBQFpCHBheW1lbnRzAAAJAQh0aHJvd0VycgEJAQd3cmFwRXJyAQIQaW52YWxpZCBwYXltZW50cwQOcGF5bWVudEFzc2V0SWQDCQAAAggFB3BheW1lbnQHYXNzZXRJZAUPbHBBc3NldElkT3JGYWlsBQ9scEFzc2V0SWRPckZhaWwJAQh0aHJvd0VycgECFWludmFsaWQgcGF5bWVudCBhc3NldAQNcGF5bWVudEFtb3VudAMJAGYCCAUHcGF5bWVudAZhbW91bnQAAAgFB3BheW1lbnQGYW1vdW50CQEIdGhyb3dFcnIBAhZpbnZhbGlkIHBheW1lbnQgYW1vdW50BAp3aXRoZHJhd2FsCQELdmFsdWVPckVsc2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQENa2V5V2l0aGRyYXdhbAAAAAQHYWN0aW9ucwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRRmYWN0b3J5QWRkcmVzc09yRmFpbAUNcGF5bWVudEFtb3VudAUOcGF5bWVudEFzc2V0SWQFA25pbAQOZmFjdG9yeUFjdGlvbnMJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIMaW50ZWdlckVudHJ5CQDMCAIJAQ1rZXlXaXRoZHJhd2FsAAkAzAgCCQBkAgUKd2l0aGRyYXdhbAUNcGF5bWVudEFtb3VudAUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAILc3RyaW5nRW50cnkJAMwIAgkBFGtleVdpdGhkcmF3YWxSZXF1ZXN0AgULdXNlckFkZHJlc3MIBQFpDXRyYW5zYWN0aW9uSWQJAMwIAgkBFnZhbHVlV2l0aGRyYXdhbFJlcXVlc3QEBQdQRU5ESU5HBQ1wYXltZW50QW1vdW50CQBkAgUTY3VycmVudFBlcmlvZE9yRmFpbAABBQR1bml0BQNuaWwFA25pbAUDbmlsAwkAAAIFDmZhY3RvcnlBY3Rpb25zBQ5mYWN0b3J5QWN0aW9ucwkAlAoCBQdhY3Rpb25zBQ5mYWN0b3J5QWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5jYW5jZWxXaXRoZHJhdwIQdXNlckFkZHJlc3NCeXRlcwR0eElkBAtjaGVja0NhbGxlcgkBC29ubHlGYWN0b3J5AQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIJAQh0aHJvd0VycgECHGNhbmNlbFdpdGhkcmF3IGlzIGRlcHJlY2F0ZWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEPY2xhaW1Db2xsYXRlcmFsAhB1c2VyQWRkcmVzc0J5dGVzBHR4SWQEC2NoZWNrQ2FsbGVyCQELb25seUZhY3RvcnkBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQNJHQwMjE2MTYyMTgwMQkBF2NsYWltQ29sbGF0ZXJhbElOVEVSTkFMAgUQdXNlckFkZHJlc3NCeXRlcwkA2QQBBQR0eElkBAt1c2VyQWRkcmVzcwgFDSR0MDIxNjE2MjE4MDECXzEEDWxwQXNzZXRBbW91bnQIBQ0kdDAyMTYxNjIxODAxAl8yBAx0YXJnZXRQZXJpb2QIBQ0kdDAyMTYxNjIxODAxAl8zBAt3YXZlc0Ftb3VudAgFDSR0MDIxNjE2MjE4MDECXzQEDGFzc2V0c1N0cmluZwgFDSR0MDIxNjE2MjE4MDECXzUEDWFtb3VudHNTdHJpbmcIBQ0kdDAyMTYxNjIxODAxAl82BAphc3NldHNMaXN0CQDRCAIJAL0JAgUMYXNzZXRzU3RyaW5nBQNTRVAAAAQLYW1vdW50c0xpc3QJANEIAgkAvQkCBQ1hbW91bnRzU3RyaW5nBQNTRVAAAAQOZmFjdG9yeUFjdGlvbnMJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAILZGVsZXRlRW50cnkJAMwIAgkBFGtleVdpdGhkcmF3YWxSZXF1ZXN0AgULdXNlckFkZHJlc3MJANkEAQUEdHhJZAUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIMaW50ZWdlckVudHJ5CQDMCAIJARRrZXlXaXRoZHJhd2FsSGlzdG9yeQIFC3VzZXJBZGRyZXNzCQDZBAEFBHR4SWQJAMwIAgUNbHBBc3NldEFtb3VudAUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIOdHJhbnNmZXJBc3NldHMJAMwIAgUQdXNlckFkZHJlc3NCeXRlcwkAzAgCBQphc3NldHNMaXN0CQDMCAIFC2Ftb3VudHNMaXN0BQNuaWwFA25pbAUDbmlsCQCUCgIFA25pbAUOZmFjdG9yeUFjdGlvbnMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQETY2xhaW1Db2xsYXRlcmFsQnVsawIQdXNlckFkZHJlc3NCeXRlcwV0eElkcwQLY2hlY2tDYWxsZXIJAQtvbmx5RmFjdG9yeQEFAWkDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyCgEMYWRkTmV3QWN0aW9uAgVzdGF0ZQR0eElkBA0kdDAyMjU1OTIyNzU4CQEXY2xhaW1Db2xsYXRlcmFsSU5URVJOQUwCBRB1c2VyQWRkcmVzc0J5dGVzCQDZBAEFBHR4SWQEC3VzZXJBZGRyZXNzCAUNJHQwMjI1NTkyMjc1OAJfMQQNbHBBc3NldEFtb3VudAgFDSR0MDIyNTU5MjI3NTgCXzIEDHRhcmdldFBlcmlvZAgFDSR0MDIyNTU5MjI3NTgCXzMEC3dhdmVzQW1vdW50CAUNJHQwMjI1NTkyMjc1OAJfNAQMYXNzZXRzU3RyaW5nCAUNJHQwMjI1NTkyMjc1OAJfNQQNYW1vdW50c1N0cmluZwgFDSR0MDIyNTU5MjI3NTgCXzYECmFzc2V0c0xpc3QJANEIAgkAvQkCBQxhc3NldHNTdHJpbmcFA1NFUAAABAthbW91bnRzTGlzdAkA0QgCCQC9CQIFDWFtb3VudHNTdHJpbmcFA1NFUAAABApuZXdBY3Rpb25zCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCC2RlbGV0ZUVudHJ5CQDMCAIJARRrZXlXaXRoZHJhd2FsUmVxdWVzdAIFC3VzZXJBZGRyZXNzCQDZBAEFBHR4SWQFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDGludGVnZXJFbnRyeQkAzAgCCQEUa2V5V2l0aGRyYXdhbEhpc3RvcnkCBQt1c2VyQWRkcmVzcwkA2QQBBQR0eElkCQDMCAIFDWxwQXNzZXRBbW91bnQFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDnRyYW5zZmVyQXNzZXRzCQDMCAIFEHVzZXJBZGRyZXNzQnl0ZXMJAMwIAgUKYXNzZXRzTGlzdAkAzAgCBQthbW91bnRzTGlzdAUDbmlsBQNuaWwFA25pbAkAzggCBQVzdGF0ZQUKbmV3QWN0aW9ucwQRYWxsRmFjdG9yeUFjdGlvbnMKAAIkbAUFdHhJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDGFkZE5ld0FjdGlvbgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgkAlAoCBQNuaWwFEWFsbEZhY3RvcnlBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBF2NsYWltQ29sbGF0ZXJhbFJFQURPTkxZAhB1c2VyQWRkcmVzc0J5dGVzBHR4SWQECHJlc3BvbnNlCQElY2xhaW1Db2xsYXRlcmFsUkVBRE9OTFlTdHJpbmdSZXNwb25zZQIFEHVzZXJBZGRyZXNzQnl0ZXMJANkEAQUEdHhJZAkAlAoCBQNuaWwFCHJlc3BvbnNlAWkBG2NsYWltQ29sbGF0ZXJhbEJ1bGtSRUFET05MWQIQdXNlckFkZHJlc3NCeXRlcwV0eElkcwoBC3Byb2Nlc3NUeElkAgVzdGF0ZQR0eElkBAhyZXNwb25zZQkBJWNsYWltQ29sbGF0ZXJhbFJFQURPTkxZU3RyaW5nUmVzcG9uc2UCBRB1c2VyQWRkcmVzc0J5dGVzCQDZBAEFBHR4SWQJAM0IAgUFc3RhdGUFCHJlc3BvbnNlBAxhbGxSZXNwb25zZXMKAAIkbAUFdHhJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBC3Byb2Nlc3NUeElkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKCQCUCgIFA25pbAUMYWxsUmVzcG9uc2VzAWkBDXByb2Nlc3NCbG9ja3MBEHVzZXJBZGRyZXNzQnl0ZXMEC2NoZWNrQ2FsbGVyCQELb25seUZhY3RvcnkBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQLdXNlckFkZHJlc3MJAQdBZGRyZXNzAQUQdXNlckFkZHJlc3NCeXRlcwQTY3VycmVudFBlcmlvZE9yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEQa2V5Q3VycmVudFBlcmlvZAAJAQd3cmFwRXJyAQIOaW52YWxpZCBwZXJpb2QEDHBlcmlvZExlbmd0aAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEPa2V5UGVyaW9kTGVuZ3RoAAkBB3dyYXBFcnIBAhVpbnZhbGlkIHBlcmlvZCBsZW5ndGgEEmN1cnJlbnRTdGFydEhlaWdodAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEOa2V5U3RhcnRIZWlnaHQBBRNjdXJyZW50UGVyaW9kT3JGYWlsCQEHd3JhcEVycgECFGludmFsaWQgc3RhcnQgaGVpZ2h0BBJjdXJyZW50UHJpY2VPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBEWtleVByaWNlRm9yUGVyaW9kAQUTY3VycmVudFBlcmlvZE9yRmFpbAkBB3dyYXBFcnIBAg1pbnZhbGlkIHByaWNlBBJuZXh0QmxvY2tUb1Byb2Nlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBFWtleU5leHRCbG9ja1RvUHJvY2VzcwAJAQd3cmFwRXJyAQIdaW52YWxpZCBuZXh0IGJsb2NrIHRvIHByb2Nlc3MED3BlcmlvZEVuZEhlaWdodAkAZQIJAGQCBRJjdXJyZW50U3RhcnRIZWlnaHQFDHBlcmlvZExlbmd0aAABBBlibG9ja3NQcm9jZXNzaW5nQmF0Y2hTaXplAwMDCQBnAgUGaGVpZ2h0BRJuZXh0QmxvY2tUb1Byb2Nlc3MDCQBnAgUSbmV4dEJsb2NrVG9Qcm9jZXNzBRJjdXJyZW50U3RhcnRIZWlnaHQGCQAAAgUTY3VycmVudFBlcmlvZE9yRmFpbAAABwkAZwIFD3BlcmlvZEVuZEhlaWdodAUSbmV4dEJsb2NrVG9Qcm9jZXNzBwkAlwMBCQDMCAIJAGQCCQBlAgUPcGVyaW9kRW5kSGVpZ2h0BRJuZXh0QmxvY2tUb1Byb2Nlc3MAAQkAzAgCBRxibG9ja3NQcm9jZXNzaW5nQmF0Y2hTaXplTWF4BQNuaWwJAQh0aHJvd0VycgEJAQd3cmFwRXJyAQIUaW52YWxpZCB0YXJnZXQgYmxvY2sEFWJsb2NrUHJvY2Vzc2luZ1Jld2FyZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEYa2V5QmxvY2tQcm9jZXNzaW5nUmV3YXJkAAkBB3dyYXBFcnIBAh9pbnZhbGlkIGJsb2NrIHByb2Nlc3NpbmcgcmV3YXJkBCBibG9ja1Byb2Nlc3NpbmdSZXdhcmRCeUdlbmVyYXRvcgkAaQIFFWJsb2NrUHJvY2Vzc2luZ1Jld2FyZAUZYmxvY2tzUHJvY2Vzc2luZ0JhdGNoU2l6ZQQpYmxvY2tQcm9jZXNzaW5nUmV3YXJkQnlHZW5lcmF0b3JSZW1haW5kZXIJAGUCBRVibG9ja1Byb2Nlc3NpbmdSZXdhcmQJAGgCBSBibG9ja1Byb2Nlc3NpbmdSZXdhcmRCeUdlbmVyYXRvcgUZYmxvY2tzUHJvY2Vzc2luZ0JhdGNoU2l6ZQoBA21hcAIDYWNjA2luYwMJAGcCBQNpbmMFGWJsb2Nrc1Byb2Nlc3NpbmdCYXRjaFNpemUFA2FjYwQRdGFyZ2V0QmxvY2tIZWlnaHQJAGQCBRJuZXh0QmxvY2tUb1Byb2Nlc3MFA2luYwQPdGFyZ2V0QmxvY2tJbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAO0HAQURdGFyZ2V0QmxvY2tIZWlnaHQJAQd3cmFwRXJyAQISaW52YWxpZCBibG9jayBpbmZvBBR0cmVhc3VyeVJld2FyZE9yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQEPcmV3YXJkRm9yT3B0aW9uAggFD3RhcmdldEJsb2NrSW5mbwdyZXdhcmRzBRpwcm94eVRyZWFzdXJ5QWRkcmVzc09yRmFpbAkBB3dyYXBFcnIBCQCsAgICI2ludmFsaWQgdHJlYXN1cnkgcmV3YXJkIGZvciBoZWlnaHQgCQCkAwEFEXRhcmdldEJsb2NrSGVpZ2h0BAlnZW5lcmF0b3IIBQ90YXJnZXRCbG9ja0luZm8JZ2VuZXJhdG9yBAlhdmFpbGFibGUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJAQxrZXlBdmFpbGFibGUBBQlnZW5lcmF0b3IAAAQMY2FsbGVyUmV3YXJkAwkAAAIFA2luYwkAZQIFGWJsb2Nrc1Byb2Nlc3NpbmdCYXRjaFNpemUAAQkAZAIFIGJsb2NrUHJvY2Vzc2luZ1Jld2FyZEJ5R2VuZXJhdG9yBSlibG9ja1Byb2Nlc3NpbmdSZXdhcmRCeUdlbmVyYXRvclJlbWFpbmRlcgUgYmxvY2tQcm9jZXNzaW5nUmV3YXJkQnlHZW5lcmF0b3IEDSR0MDI2NjU4MjY3NjYJAQ5nZXRSZXdhcmRTcGxpdAEFFHRyZWFzdXJ5UmV3YXJkT3JGYWlsBBJzaGFyZUFtb3VudFRvUG93ZXIIBQ0kdDAyNjY1ODI2NzY2Al8xBBpidXNpbmVzc1RyZWFzdXJ5QW1vdW50UGFydAgFDSR0MDI2NjU4MjY3NjYCXzIED3Jld2FyZFJlbWFpbmRlcggFDSR0MDI2NjU4MjY3NjYCXzMEDWxwQXNzZXRBbW91bnQDCQBmAgUSY3VycmVudFByaWNlT3JGYWlsAAAJAGsDCQBlAgUPcmV3YXJkUmVtYWluZGVyBQxjYWxsZXJSZXdhcmQFBlNDQUxFOAUSY3VycmVudFByaWNlT3JGYWlsAAAEFGZhY3RvcnlBY3Rpb25zU2luZ2xlCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCC3N0cmluZ0VudHJ5CQDMCAIJARFrZXlCbG9ja1Byb2Nlc3NlZAEFEXRhcmdldEJsb2NrSGVpZ2h0CQDMCAIJALkJAgkAzAgCCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQJAMwIAgkApAMBBRNjdXJyZW50UGVyaW9kT3JGYWlsCQDMCAIJAKUIAQUJZ2VuZXJhdG9yCQDMCAIJANgEAQUQdXNlckFkZHJlc3NCeXRlcwkAzAgCCQCkAwEFFHRyZWFzdXJ5UmV3YXJkT3JGYWlsCQDMCAIJAKQDAQUMY2FsbGVyUmV3YXJkCQDMCAIJAKQDAQUNbHBBc3NldEFtb3VudAkAzAgCCQCkAwEFEnNoYXJlQW1vdW50VG9Qb3dlcgUDbmlsBQNTRVAFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDGludGVnZXJFbnRyeQkAzAgCCQEMa2V5QXZhaWxhYmxlAQUJZ2VuZXJhdG9yCQDMCAIJAGQCBQlhdmFpbGFibGUFDWxwQXNzZXRBbW91bnQFA25pbAUDbmlsBQNuaWwDCQAAAgUUZmFjdG9yeUFjdGlvbnNTaW5nbGUFFGZhY3RvcnlBY3Rpb25zU2luZ2xlBA0kdDAyNzYxNDI3Njg5BQNhY2MECmxwQXNzZXRBY2MIBQ0kdDAyNzYxNDI3Njg5Al8xBAlyZXdhcmRBY2MIBQ0kdDAyNzYxNDI3Njg5Al8yBBNidXNpbmVzc1RyZWFzdXJ5QWNjCAUNJHQwMjc2MTQyNzY4OQJfMwQTcG93ZXJTaGFyZURhdGFUdXBsZQgFDSR0MDI3NjE0Mjc2ODkCXzQEDSR0MDI3Njk2Mjc3NjIFE3Bvd2VyU2hhcmVEYXRhVHVwbGUEDXBvd2VyU2hhcmVBY2MIBQ0kdDAyNzY5NjI3NzYyAl8xBBdnZW5lcmF0b3JQb3dlclNoYXJlTGlzdAgFDSR0MDI3Njk2Mjc3NjICXzIEGm5ld0dlbmVyYXRvclBvd2VyU2hhcmVMaXN0CQDNCAIFF2dlbmVyYXRvclBvd2VyU2hhcmVMaXN0CQCUCgIJAKUIAQUJZ2VuZXJhdG9yBRJzaGFyZUFtb3VudFRvUG93ZXIJAJYKBAkAZAIFCmxwQXNzZXRBY2MFDWxwQXNzZXRBbW91bnQJAGQCBQlyZXdhcmRBY2MFFHRyZWFzdXJ5UmV3YXJkT3JGYWlsCQBkAgUTYnVzaW5lc3NUcmVhc3VyeUFjYwUaYnVzaW5lc3NUcmVhc3VyeUFtb3VudFBhcnQJAJQKAgkAZAIFDXBvd2VyU2hhcmVBY2MFEnNoYXJlQW1vdW50VG9Qb3dlcgUabmV3R2VuZXJhdG9yUG93ZXJTaGFyZUxpc3QJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EBGxpc3QJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsJAMwIAgAMCQDMCAIADQkAzAgCAA4JAMwIAgAPCQDMCAIAEAkAzAgCABEJAMwIAgASCQDMCAIAEwUDbmlsBA0kdDAyODIxMDI4MzcyCgACJGwFBGxpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQAAAAAAAAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBA21hcAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUAwkAAAIFDSR0MDI4MjEwMjgzNzIFDSR0MDI4MjEwMjgzNzIEE3Bvd2VyU2hhcmVEYXRhVHVwbGUIBQ0kdDAyODIxMDI4MzcyAl80BB5yZXdhcmRUb0J1c2luZXNzVHJlYXN1cnlBbW91bnQIBQ0kdDAyODIxMDI4MzcyAl8zBBFyZXdhcmRBbW91bnRUb3RhbAgFDSR0MDI4MjEwMjgzNzICXzIEEmxwQXNzZXRBbW91bnRUb3RhbAgFDSR0MDI4MjEwMjgzNzICXzEEDSR0MDI4Mzc2Mjg0NDUFE3Bvd2VyU2hhcmVEYXRhVHVwbGUEEmFtb3VudFRvUG93ZXJUb3RhbAgFDSR0MDI4Mzc2Mjg0NDUCXzEEFXBvd2VyU2hhcmVBbW91bnRzTGlzdAgFDSR0MDI4Mzc2Mjg0NDUCXzIEGnJld2FyZFRvTWFpblRyZWFzdXJ5QW1vdW50CQBlAgkAZQIJAGUCBRFyZXdhcmRBbW91bnRUb3RhbAUecmV3YXJkVG9CdXNpbmVzc1RyZWFzdXJ5QW1vdW50BRVibG9ja1Byb2Nlc3NpbmdSZXdhcmQFEmFtb3VudFRvUG93ZXJUb3RhbAQIaW52ZXN0ZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJAQtrZXlJbnZlc3RlZAEFBHVuaXQAAAQRcG93ZXJTaGFyZUFjdGlvbnMDCQBmAgUSYW1vdW50VG9Qb3dlclRvdGFsAAAEDnRyYW5zZmVyQWN0aW9uCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCGXRyYW5zZmVyRnJvbVByb3h5VHJlYXN1cnkJAMwIAggFFGZhY3RvcnlBZGRyZXNzT3JGYWlsBWJ5dGVzCQDMCAIFEmFtb3VudFRvUG93ZXJUb3RhbAUDbmlsBQNuaWwFA25pbAMJAAACBQ50cmFuc2ZlckFjdGlvbgUOdHJhbnNmZXJBY3Rpb24EEHRvdGFsUG93ZXJBbW91bnQJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCBHN3YXAJAMwIAgUYcG93ZXJBc3NldElkU3RyaW5nT3JGYWlsCQDMCAIFBVdBVkVTCQDMCAIFEmFtb3VudFRvUG93ZXJUb3RhbAUDbmlsBQNuaWwDCQAAAgUQdG90YWxQb3dlckFtb3VudAUQdG90YWxQb3dlckFtb3VudAQTdG90YWxQb3dlckFtb3VudEludAQHJG1hdGNoMAUQdG90YWxQb3dlckFtb3VudAMJAAECBQckbWF0Y2gwAgNJbnQEB3BBbW91bnQFByRtYXRjaDAFB3BBbW91bnQAAAoBEHN0YWtlUG93ZXJJbnZva2UCA2FjYwRuZXh0BA0kdDAyOTMxOTI5MzU0BQRuZXh0BAlnZW5lcmF0b3IIBQ0kdDAyOTMxOTI5MzU0Al8xBAtzaGFyZUFtb3VudAgFDSR0MDI5MzE5MjkzNTQCXzIDCQBmAgUSYW1vdW50VG9Qb3dlclRvdGFsAAAEC3Bvd2VyQW1vdW50CQBrAwULc2hhcmVBbW91bnQFE3RvdGFsUG93ZXJBbW91bnRJbnQFEmFtb3VudFRvUG93ZXJUb3RhbAQDaW52CQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgpwb3dlclN0YWtlCQDMCAIJANkEAQUJZ2VuZXJhdG9yCQDMCAIJANkEAQUYcG93ZXJBc3NldElkU3RyaW5nT3JGYWlsCQDMCAIFC3Bvd2VyQW1vdW50BQNuaWwFA25pbAMJAAACBQNpbnYFA2ludgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwEEnBvd2VyU3Rha2VzQWN0aW9ucwoAAiRsBRVwb3dlclNoYXJlQW1vdW50c0xpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjFfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEHN0YWtlUG93ZXJJbnZva2UCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjFfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAMJAAACBRJwb3dlclN0YWtlc0FjdGlvbnMFEnBvd2VyU3Rha2VzQWN0aW9ucwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwDCQAAAgURcG93ZXJTaGFyZUFjdGlvbnMFEXBvd2VyU2hhcmVBY3Rpb25zBAdhY3Rpb25zCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCB3JlaXNzdWUJAMwIAgUSbHBBc3NldEFtb3VudFRvdGFsBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBFWtleU5leHRCbG9ja1RvUHJvY2VzcwAJAMwIAgkAZAIFEm5leHRCbG9ja1RvUHJvY2VzcwUZYmxvY2tzUHJvY2Vzc2luZ0JhdGNoU2l6ZQUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIZdHJhbnNmZXJGcm9tUHJveHlUcmVhc3VyeQkAzAgCCAUZbWFpblRyZWFzdXJ5QWRkcmVzc09yRmFpbAVieXRlcwkAzAgCBRpyZXdhcmRUb01haW5UcmVhc3VyeUFtb3VudAUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIZdHJhbnNmZXJGcm9tUHJveHlUcmVhc3VyeQkAzAgCBRB1c2VyQWRkcmVzc0J5dGVzCQDMCAIFFWJsb2NrUHJvY2Vzc2luZ1Jld2FyZAUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIZdHJhbnNmZXJGcm9tUHJveHlUcmVhc3VyeQkAzAgCCAUdYnVzaW5lc3NUcmVhc3VyeUFkZHJlc3NPckZhaWwFYnl0ZXMJAMwIAgUecmV3YXJkVG9CdXNpbmVzc1RyZWFzdXJ5QW1vdW50BQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBC2tleUludmVzdGVkAQUEdW5pdAkAzAgCCQBkAgUIaW52ZXN0ZWQFGnJld2FyZFRvTWFpblRyZWFzdXJ5QW1vdW50BQNuaWwFA25pbAUDbmlsAwkAAAIFB2FjdGlvbnMFB2FjdGlvbnMJAJQKAgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQJcHVibGljS2V5BAckbWF0Y2gwCQEZZ2V0TWFuYWdlclB1YmxpY0tleU9yVW5pdAADCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQDcHViBQckbWF0Y2gwBQNwdWIIBQJ0eA9zZW5kZXJQdWJsaWNLZXkJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFCXB1YmxpY0tleW96YJ0=", "chainId": 84, "height": 2722925, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: CphUDDL8wy6DDW4P13GA5Up16NHqiMwP9TkSLAjEchGk Next: 3g5NWKChUxZLhL17CbHBmZMnV1BRvXJFmTcYPsH2vsiT Diff:
OldNewDifferences
1010 let PENDING = "PENDING"
1111
1212 let WAVES = "WAVES"
13+
14+let blocksProcessingBatchSizeMax = 10
1315
1416 func wrapErr (s) = ((CONTRACT_NAME + ": ") + s)
1517
277279
278280 func rewardForOption (rewards,target) = {
279281 let s = size(rewards)
280- let $t066316656 = rewards[0]
281- let a0 = $t066316656._1
282- let r0 = $t066316656._2
283- let $t066596684 = rewards[1]
284- let a1 = $t066596684._1
285- let r1 = $t066596684._2
286- let $t066876712 = rewards[2]
287- let a2 = $t066876712._1
288- let r2 = $t066876712._2
282+ let $t066696694 = rewards[0]
283+ let a0 = $t066696694._1
284+ let r0 = $t066696694._2
285+ let $t066976722 = rewards[1]
286+ let a1 = $t066976722._1
287+ let r1 = $t066976722._2
288+ let $t067256750 = rewards[2]
289+ let a2 = $t067256750._1
290+ let r2 = $t067256750._2
289291 if (if ((s > 0))
290292 then (a0 == target)
291293 else false)
322324 let userAddress = Address(userAddressBytes)
323325 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
324326 let withdrawalRequestOption = valueOrErrorMessage(getString(factoryAddressOrFail, keyWithdrawalRequest(userAddress, txId)), wrapErr("invalid withdrawal request"))
325- let $t078797992 = parseWithdrawalRequestValueOrFail(withdrawalRequestOption)
326- let status = $t078797992._1
327- let lpAssetAmount = $t078797992._2
328- let targetPeriod = $t078797992._3
329- let claimTxId = $t078797992._4
327+ let $t079178030 = parseWithdrawalRequestValueOrFail(withdrawalRequestOption)
328+ let status = $t079178030._1
329+ let lpAssetAmount = $t079178030._2
330+ let targetPeriod = $t079178030._3
331+ let claimTxId = $t079178030._4
330332 if ((targetPeriod > currentPeriodOrFail))
331333 then throwErr("invalid withdrawal request period")
332334 else {
342344
343345
344346 func claimCollateralREADONLYStringResponse (userAddressBytes,txId) = {
345- let $t087798945 = claimCollateralINTERNAL(userAddressBytes, txId)
346- let userAddress = $t087798945._1
347- let lpAssetAmount = $t087798945._2
348- let targetPeriod = $t087798945._3
349- let wavesAmount = $t087798945._4
350- let assetsString = $t087798945._5
351- let amountsString = $t087798945._6
347+ let $t088178983 = claimCollateralINTERNAL(userAddressBytes, txId)
348+ let userAddress = $t088178983._1
349+ let lpAssetAmount = $t088178983._2
350+ let targetPeriod = $t088178983._3
351+ let wavesAmount = $t088178983._4
352+ let assetsString = $t088178983._5
353+ let amountsString = $t088178983._6
352354 let assets = makeString(removeByIndex(split_51C(assetsString, SEP), 0), ":")
353355 let amounts = makeString(removeByIndex(split_51C(amountsString, SEP), 0), ":")
354356 makeString(["%d%s%s", toString(wavesAmount), assets, amounts], SEP)
368370
369371
370372 func calcRewardSplitForAmount (amount) = {
371- let blocksProcessingBatchSizeMax = 20
372- let $t01008410177 = getRewardSplit(amount)
373- let amountToPowerPart = $t01008410177._1
374- let businessTreasuryAmountPart = $t01008410177._2
375- let rewardRemainder = $t01008410177._3
373+ let $t01008210175 = getRewardSplit(amount)
374+ let amountToPowerPart = $t01008210175._1
375+ let businessTreasuryAmountPart = $t01008210175._2
376+ let rewardRemainder = $t01008210175._3
376377 let blockProcessingReward = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyBlockProcessingReward()), wrapErr("invalid block processing reward"))
377378 let blockProcessingRewardByGenerator = (blockProcessingReward / blocksProcessingBatchSizeMax)
378379 let toLpAmount = (rewardRemainder - blockProcessingReward)
434435 else throwErr("invalid PWR stake part")]
435436 if ((checks == checks))
436437 then {
437- let $t01351513620 = calculatePrice(lpPartInWaves)
438- let newPrice = $t01351513620._1
439- let lpAssetAmountToBurn = $t01351513620._2
440- let lpAssetFinalQuantity = $t01351513620._3
438+ let $t01351313618 = calculatePrice(lpPartInWaves)
439+ let newPrice = $t01351313618._1
440+ let lpAssetAmountToBurn = $t01351313618._2
441+ let lpAssetFinalQuantity = $t01351313618._3
441442 let newPeriod = (currentPeriodOrFail + 1)
442443 func addNewAction (actions,payment) = {
443- let $t01376813830 = actions
444- let scriptTransfers = $t01376813830._1
445- let assetIdsString = $t01376813830._2
446- let amountsString = $t01376813830._3
444+ let $t01376613828 = actions
445+ let scriptTransfers = $t01376613828._1
446+ let assetIdsString = $t01376613828._2
447+ let amountsString = $t01376613828._3
447448 let paymentAmount = payment.amount
448449 let paymentAssetId = payment.assetId
449450 let newAssetIdsString = ("%s" + makeString([assetIdsString, assetIdToString(paymentAssetId)], SEP))
452453 $Tuple3((scriptTransfers :+ newScriptTransfer), newAssetIdsString, newAmountsString)
453454 }
454455
455- let $t01429014381 = {
456+ let $t01428814379 = {
456457 let $l = i.payments
457458 let $s = size($l)
458459 let $acc0 = $Tuple3(nil, "", "")
466467
467468 $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)
468469 }
469- let scriptTransfers = $t01429014381._1
470- let AssetIds = $t01429014381._2
471- let Amounts = $t01429014381._3
470+ let scriptTransfers = $t01428814379._1
471+ let AssetIds = $t01428814379._2
472+ let Amounts = $t01428814379._3
472473 let factoryActions = [invoke(factoryAddressOrFail, "integerEntry", [keyPowerManagerBonus(currentPeriodOrFail), powerStakePartInWaves], nil), invoke(factoryAddressOrFail, "integerEntry", [keyClaimWavesAmount(currentPeriodOrFail), claimPartInWaves], nil), invoke(factoryAddressOrFail, "integerEntry", [keyCurrentPeriod(), newPeriod], nil), invoke(factoryAddressOrFail, "integerEntry", [keyPriceForPeriod(newPeriod), newPrice], nil), invoke(factoryAddressOrFail, "integerEntry", [keyStartHeight(newPeriod), (periodEndHeight + 1)], nil), invoke(factoryAddressOrFail, "burn", [lpAssetAmountToBurn], nil), invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawal(), 0], nil), invoke(factoryAddressOrFail, "integerEntry", [keyInvested(unit), lpPartInWaves], nil), invoke(factoryAddressOrFail, "integerEntry", [keyDonated(unit), donationPartInWaves], nil), invoke(factoryAddressOrFail, "stringEntry", [keyPeriodWithdrawalAssetIds(newPeriod), AssetIds], nil), invoke(factoryAddressOrFail, "stringEntry", [keyPeriodWithdrawalAmounts(newPeriod), Amounts], nil)]
473474 $Tuple2(scriptTransfers, factoryActions)
474475 }
500501 else throwErr("invalid PWR stake part")]
501502 if ((checks == checks))
502503 then {
503- let $t01726017365 = calculatePrice(lpPartInWaves)
504- let newPrice = $t01726017365._1
505- let lpAssetAmountToBurn = $t01726017365._2
506- let lpAssetFinalQuantity = $t01726017365._3
504+ let $t01725817363 = calculatePrice(lpPartInWaves)
505+ let newPrice = $t01725817363._1
506+ let lpAssetAmountToBurn = $t01725817363._2
507+ let lpAssetFinalQuantity = $t01725817363._3
507508 $Tuple2(nil, $Tuple6(claimPartInWaves, lpPartInWaves, donationPartInWaves, newPrice, lpAssetAmountToBurn, lpAssetFinalQuantity))
508509 }
509510 else throw("Strict value is not equal to itself.")
529530 let payment = if ((size(i.payments) == 1))
530531 then i.payments[0]
531532 else throwErr("invalid payments")
532- let $t01847418651 = if (if ((payment.assetId == unit))
533+ let $t01847218649 = if (if ((payment.assetId == unit))
533534 then (payment.amount > 0)
534535 else false)
535536 then $Tuple2(payment.amount, payment.assetId)
536537 else throwErr("invalid payment amount")
537- let paymentAmount = $t01847418651._1
538- let paymentAssetId = $t01847418651._2
538+ let paymentAmount = $t01847218649._1
539+ let paymentAssetId = $t01847218649._2
539540 let treasuryPart = valueOrElse(getInteger(factoryAddressOrFail, keyBusinessTreasuryPart()), 0)
540541 let paymentsWithoutTreasuryPart = fraction(paymentAmount, (SCALE8 - treasuryPart), SCALE8)
541542 let lpAssetAmount = if ((currentPriceOrFail > 0))
560561 then {
561562 let userAddress = Address(userAddressBytes)
562563 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
563- let payment = if ((size(i.payments) == 1))
564- then i.payments[0]
565- else throwErr(wrapErr("invalid payments"))
566- let paymentAssetId = if ((payment.assetId == lpAssetIdOrFail))
567- then lpAssetIdOrFail
568- else throwErr("invalid payment asset")
569- let paymentAmount = if ((payment.amount > 0))
570- then payment.amount
571- else throwErr("invalid payment amount")
572- let withdrawal = valueOrElse(getInteger(factoryAddressOrFail, keyWithdrawal()), 0)
573- let actions = [ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId)]
574- let factoryActions = [invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawal(), (withdrawal + paymentAmount)], nil), invoke(factoryAddressOrFail, "stringEntry", [keyWithdrawalRequest(userAddress, i.transactionId), valueWithdrawalRequest(PENDING, paymentAmount, (currentPeriodOrFail + 1), unit)], nil)]
575- if ((factoryActions == factoryActions))
576- then $Tuple2(actions, factoryActions)
564+ let periodLength = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPeriodLength()), wrapErr("invalid period length"))
565+ let currentStartHeight = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyStartHeight(currentPeriodOrFail)), wrapErr("invalid start height"))
566+ let heightCheck = if (((currentStartHeight + periodLength) > height))
567+ then true
568+ else throwErr("too late to withdraw in this period")
569+ if ((heightCheck == heightCheck))
570+ then {
571+ let payment = if ((size(i.payments) == 1))
572+ then i.payments[0]
573+ else throwErr(wrapErr("invalid payments"))
574+ let paymentAssetId = if ((payment.assetId == lpAssetIdOrFail))
575+ then lpAssetIdOrFail
576+ else throwErr("invalid payment asset")
577+ let paymentAmount = if ((payment.amount > 0))
578+ then payment.amount
579+ else throwErr("invalid payment amount")
580+ let withdrawal = valueOrElse(getInteger(factoryAddressOrFail, keyWithdrawal()), 0)
581+ let actions = [ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId)]
582+ let factoryActions = [invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawal(), (withdrawal + paymentAmount)], nil), invoke(factoryAddressOrFail, "stringEntry", [keyWithdrawalRequest(userAddress, i.transactionId), valueWithdrawalRequest(PENDING, paymentAmount, (currentPeriodOrFail + 1), unit)], nil)]
583+ if ((factoryActions == factoryActions))
584+ then $Tuple2(actions, factoryActions)
585+ else throw("Strict value is not equal to itself.")
586+ }
577587 else throw("Strict value is not equal to itself.")
578588 }
579589 else throw("Strict value is not equal to itself.")
585595 func cancelWithdraw (userAddressBytes,txId) = {
586596 let checkCaller = onlyFactory(i)
587597 if ((checkCaller == checkCaller))
588- then {
589- let userAddress = Address(userAddressBytes)
590- let withdrawalRequestOption = valueOrErrorMessage(getString(factoryAddressOrFail, keyWithdrawalRequest(userAddress, txId)), wrapErr("invalid withdrawal request"))
591- let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
592- let $t02138521498 = parseWithdrawalRequestValueOrFail(withdrawalRequestOption)
593- let status = $t02138521498._1
594- let lpAssetAmount = $t02138521498._2
595- let targetPeriod = $t02138521498._3
596- let claimTxId = $t02138521498._4
597- let checks = [if ((status == PENDING))
598- then true
599- else throwErr("invalid withdrawal request status"), if ((targetPeriod > currentPeriodOrFail))
600- then true
601- else throwErr("invalid withdrawal request period")]
602- if ((checks == checks))
603- then {
604- let withdrawal = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyWithdrawal()), wrapErr("invalid total withdrawal amount"))
605- let factoryActions = [invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawal(), if ((withdrawal >= lpAssetAmount))
606- then (withdrawal - lpAssetAmount)
607- else throwErr("invalid withdrawal amount")], nil), invoke(factoryAddressOrFail, "deleteEntry", [keyWithdrawalRequest(userAddress, txId)], nil), invoke(factoryAddressOrFail, "transferAsset", [userAddressBytes, lpAssetAmount, lpAssetIdOrFail], nil)]
608- if ((factoryActions == factoryActions))
609- then $Tuple2(nil, factoryActions)
610- else throw("Strict value is not equal to itself.")
611- }
612- else throw("Strict value is not equal to itself.")
613- }
598+ then throwErr("cancelWithdraw is deprecated")
614599 else throw("Strict value is not equal to itself.")
615600 }
616601
621606 let checkCaller = onlyFactory(i)
622607 if ((checkCaller == checkCaller))
623608 then {
624- let $t02248422669 = claimCollateralINTERNAL(userAddressBytes, fromBase58String(txId))
625- let userAddress = $t02248422669._1
626- let lpAssetAmount = $t02248422669._2
627- let targetPeriod = $t02248422669._3
628- let wavesAmount = $t02248422669._4
629- let assetsString = $t02248422669._5
630- let amountsString = $t02248422669._6
609+ let $t02161621801 = claimCollateralINTERNAL(userAddressBytes, fromBase58String(txId))
610+ let userAddress = $t02161621801._1
611+ let lpAssetAmount = $t02161621801._2
612+ let targetPeriod = $t02161621801._3
613+ let wavesAmount = $t02161621801._4
614+ let assetsString = $t02161621801._5
615+ let amountsString = $t02161621801._6
631616 let assetsList = removeByIndex(split_51C(assetsString, SEP), 0)
632617 let amountsList = removeByIndex(split_51C(amountsString, SEP), 0)
633618 let factoryActions = [invoke(factoryAddressOrFail, "deleteEntry", [keyWithdrawalRequest(userAddress, fromBase58String(txId))], nil), invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawalHistory(userAddress, fromBase58String(txId)), lpAssetAmount], nil), invoke(factoryAddressOrFail, "transferAssets", [userAddressBytes, assetsList, amountsList], nil)]
644629 if ((checkCaller == checkCaller))
645630 then {
646631 func addNewAction (state,txId) = {
647- let $t02342723626 = claimCollateralINTERNAL(userAddressBytes, fromBase58String(txId))
648- let userAddress = $t02342723626._1
649- let lpAssetAmount = $t02342723626._2
650- let targetPeriod = $t02342723626._3
651- let wavesAmount = $t02342723626._4
652- let assetsString = $t02342723626._5
653- let amountsString = $t02342723626._6
632+ let $t02255922758 = claimCollateralINTERNAL(userAddressBytes, fromBase58String(txId))
633+ let userAddress = $t02255922758._1
634+ let lpAssetAmount = $t02255922758._2
635+ let targetPeriod = $t02255922758._3
636+ let wavesAmount = $t02255922758._4
637+ let assetsString = $t02255922758._5
638+ let amountsString = $t02255922758._6
654639 let assetsList = removeByIndex(split_51C(assetsString, SEP), 0)
655640 let amountsList = removeByIndex(split_51C(amountsString, SEP), 0)
656641 let newActions = [invoke(factoryAddressOrFail, "deleteEntry", [keyWithdrawalRequest(userAddress, fromBase58String(txId))], nil), invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawalHistory(userAddress, fromBase58String(txId)), lpAssetAmount], nil), invoke(factoryAddressOrFail, "transferAssets", [userAddressBytes, assetsList, amountsList], nil)]
724709 let currentPriceOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPriceForPeriod(currentPeriodOrFail)), wrapErr("invalid price"))
725710 let nextBlockToProcess = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyNextBlockToProcess()), wrapErr("invalid next block to process"))
726711 let periodEndHeight = ((currentStartHeight + periodLength) - 1)
727- let blocksProcessingBatchSizeMax = 20
728712 let blocksProcessingBatchSize = if (if (if ((height >= nextBlockToProcess))
729713 then if ((nextBlockToProcess >= currentStartHeight))
730714 then true
748732 let callerReward = if ((inc == (blocksProcessingBatchSize - 1)))
749733 then (blockProcessingRewardByGenerator + blockProcessingRewardByGeneratorRemainder)
750734 else blockProcessingRewardByGenerator
751- let $t02756627674 = getRewardSplit(treasuryRewardOrFail)
752- let shareAmountToPower = $t02756627674._1
753- let businessTreasuryAmountPart = $t02756627674._2
754- let rewardRemainder = $t02756627674._3
735+ let $t02665826766 = getRewardSplit(treasuryRewardOrFail)
736+ let shareAmountToPower = $t02665826766._1
737+ let businessTreasuryAmountPart = $t02665826766._2
738+ let rewardRemainder = $t02665826766._3
755739 let lpAssetAmount = if ((currentPriceOrFail > 0))
756740 then fraction((rewardRemainder - callerReward), SCALE8, currentPriceOrFail)
757741 else 0
758742 let factoryActionsSingle = [invoke(factoryAddressOrFail, "stringEntry", [keyBlockProcessed(targetBlockHeight), makeString([toBase58String(i.transactionId), toString(currentPeriodOrFail), toString(generator), toBase58String(userAddressBytes), toString(treasuryRewardOrFail), toString(callerReward), toString(lpAssetAmount), toString(shareAmountToPower)], SEP)], nil), invoke(factoryAddressOrFail, "integerEntry", [keyAvailable(generator), (available + lpAssetAmount)], nil)]
759743 if ((factoryActionsSingle == factoryActionsSingle))
760744 then {
761- let $t02852228597 = acc
762- let lpAssetAcc = $t02852228597._1
763- let rewardAcc = $t02852228597._2
764- let businessTreasuryAcc = $t02852228597._3
765- let powerShareDataTuple = $t02852228597._4
766- let $t02860428670 = powerShareDataTuple
767- let powerShareAcc = $t02860428670._1
768- let generatorPowerShareList = $t02860428670._2
745+ let $t02761427689 = acc
746+ let lpAssetAcc = $t02761427689._1
747+ let rewardAcc = $t02761427689._2
748+ let businessTreasuryAcc = $t02761427689._3
749+ let powerShareDataTuple = $t02761427689._4
750+ let $t02769627762 = powerShareDataTuple
751+ let powerShareAcc = $t02769627762._1
752+ let generatorPowerShareList = $t02769627762._2
769753 let newGeneratorPowerShareList = (generatorPowerShareList :+ $Tuple2(toString(generator), shareAmountToPower))
770754 $Tuple4((lpAssetAcc + lpAssetAmount), (rewardAcc + treasuryRewardOrFail), (businessTreasuryAcc + businessTreasuryAmountPart), $Tuple2((powerShareAcc + shareAmountToPower), newGeneratorPowerShareList))
771755 }
773757 }
774758
775759 let list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
776- let $t02911829280 = {
760+ let $t02821028372 = {
777761 let $l = list
778762 let $s = size($l)
779763 let $acc0 = $Tuple4(0, 0, 0, $Tuple2(0, nil))
787771
788772 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
789773 }
790- if (($t02911829280 == $t02911829280))
774+ if (($t02821028372 == $t02821028372))
791775 then {
792- let powerShareDataTuple = $t02911829280._4
793- let rewardToBusinessTreasuryAmount = $t02911829280._3
794- let rewardAmountTotal = $t02911829280._2
795- let lpAssetAmountTotal = $t02911829280._1
796- let $t02928429353 = powerShareDataTuple
797- let amountToPowerTotal = $t02928429353._1
798- let powerShareAmountsList = $t02928429353._2
776+ let powerShareDataTuple = $t02821028372._4
777+ let rewardToBusinessTreasuryAmount = $t02821028372._3
778+ let rewardAmountTotal = $t02821028372._2
779+ let lpAssetAmountTotal = $t02821028372._1
780+ let $t02837628445 = powerShareDataTuple
781+ let amountToPowerTotal = $t02837628445._1
782+ let powerShareAmountsList = $t02837628445._2
799783 let rewardToMainTreasuryAmount = (((rewardAmountTotal - rewardToBusinessTreasuryAmount) - blockProcessingReward) - amountToPowerTotal)
800784 let invested = valueOrElse(getInteger(factoryAddressOrFail, keyInvested(unit)), 0)
801785 let powerShareActions = if ((amountToPowerTotal > 0))
813797 0
814798 }
815799 func stakePowerInvoke (acc,next) = {
816- let $t03022730262 = next
817- let generator = $t03022730262._1
818- let shareAmount = $t03022730262._2
800+ let $t02931929354 = next
801+ let generator = $t02931929354._1
802+ let shareAmount = $t02931929354._2
819803 if ((amountToPowerTotal > 0))
820804 then {
821805 let powerAmount = fraction(shareAmount, totalPowerAmountInt, amountToPowerTotal)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 7 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let CONTRACT_NAME = "calculator.ride"
77
88 let SCALE8 = 100000000
99
1010 let PENDING = "PENDING"
1111
1212 let WAVES = "WAVES"
13+
14+let blocksProcessingBatchSizeMax = 10
1315
1416 func wrapErr (s) = ((CONTRACT_NAME + ": ") + s)
1517
1618
1719 func throwErr (s) = throw(wrapErr(s))
1820
1921
2022 func assetIdToString (assetId) = match assetId {
2123 case b: ByteVector =>
2224 toBase58String(b)
2325 case _: Unit =>
2426 WAVES
2527 case _ =>
2628 throw("Match error")
2729 }
2830
2931
3032 func stringToAssetId (s) = if ((s == WAVES))
3133 then unit
3234 else fromBase58String(s)
3335
3436
3537 func abs (n) = if ((0 > n))
3638 then -(n)
3739 else n
3840
3941
4042 func keyFactoryAddress () = makeString(["%s", "factory"], SEP)
4143
4244
4345 func keyManagerPublicKey () = makeString(["%s", "managerPublicKey"], SEP)
4446
4547
4648 func keyLpAssetId () = makeString(["%s", "lpAssetId"], SEP)
4749
4850
4951 func keyProxyTreasuryAddress () = makeString(["%s", "proxyTreasury"], SEP)
5052
5153
5254 func keyMainTreasuryAddress () = makeString(["%s", "mainTreasury"], SEP)
5355
5456
5557 func keyBusinessTreasuryAddress () = makeString(["%s", "businessTreasury"], SEP)
5658
5759
5860 func keyBusinessTreasuryPart () = makeString(["%s", "businessTreasuryPart"], SEP)
5961
6062
6163 func keyPowerContractAddress () = makeString(["%s", "powerContract"], SEP)
6264
6365
6466 func keyPowerShareRatio () = makeString(["%s", "powerShareRatio"], SEP)
6567
6668
6769 func keyPowerAssetId () = makeString(["%s", "powerAssetId"], SEP)
6870
6971
7072 func keyInvested (assetId) = makeString(["%s%s", "invested", assetIdToString(assetId)], SEP)
7173
7274
7375 func keyDonated (assetId) = makeString(["%s%s", "donated", assetIdToString(assetId)], SEP)
7476
7577
7678 func keyAvailable (userAddress) = makeString(["%s%s", "available", toString(userAddress)], SEP)
7779
7880
7981 func keyClaimed (userAddress) = makeString(["%s%s", "claimed", toString(userAddress)], SEP)
8082
8183
8284 func keyCurrentPeriod () = makeString(["%s", "currentPeriod"], SEP)
8385
8486
8587 func keyPriceForPeriod (period) = makeString(["%s%d", "price", toString(period)], SEP)
8688
8789
8890 func keyStartHeight (period) = makeString(["%s%d", "startHeight", toString(period)], SEP)
8991
9092
9193 func keyPowerManagerBonus (period) = makeString(["%s%d", "powerManagerBonus", toString(period)], SEP)
9294
9395
9496 func keyClaimWavesAmount (period) = makeString(["%s%d", "claimWavesAmount", toString(period)], SEP)
9597
9698
9799 func keyPeriodLength () = "%s__periodLength"
98100
99101
100102 func keyInvestPeriodLength () = "%s__investPeriodLength"
101103
102104
103105 func keyBlockProcessingReward () = "%s__blockProcessingReward"
104106
105107
106108 func keyNextBlockToProcess () = "%s__nextBlockToProcess"
107109
108110
109111 func keyBlockProcessed (height) = makeString(["%s%d", "blockProcessed", toString(height)], SEP)
110112
111113
112114 func keyWithdrawal () = "%s__withdrawal"
113115
114116
115117 func keyWithdrawalRequest (userAddress,txId) = makeString(["%s%s%s", "withdrawal", toString(userAddress), toBase58String(txId)], SEP)
116118
117119
118120 func valueWithdrawalRequest (status,lpAssetAmount,targetPeriod,claimTxId) = {
119121 let claimTxIdStr = match claimTxId {
120122 case b: ByteVector =>
121123 toBase58String(b)
122124 case _: Unit =>
123125 "SOON"
124126 case _ =>
125127 throw("Match error")
126128 }
127129 makeString(["%s%d%d%s", status, toString(lpAssetAmount), toString(targetPeriod), claimTxIdStr], SEP)
128130 }
129131
130132
131133 func keyWithdrawalHistory (userAddress,txId) = makeString(["%s%s%s", "withdrawalHistory", toString(userAddress), toBase58String(txId)], SEP)
132134
133135
134136 func keyPeriodWithdrawalAssetIds (period) = makeString(["%s%d", "periodReward", toString(period)], SEP)
135137
136138
137139 func keyPeriodWithdrawalAmounts (period) = makeString(["%s%d", "periodRewardAmount", toString(period)], SEP)
138140
139141
140142 func parseWithdrawalRequestValueOrFail (s) = {
141143 let parts = split(s, SEP)
142144 if ((size(parts) == 5))
143145 then {
144146 let status = parts[1]
145147 let lpAssetAmount = valueOrErrorMessage(parseInt(parts[2]), wrapErr("invalid lpAssetAmount"))
146148 let targetPeriod = valueOrErrorMessage(parseInt(parts[3]), wrapErr("invalid targetPeriod"))
147149 let claimTxId = parts[4]
148150 $Tuple4(status, lpAssetAmount, targetPeriod, claimTxId)
149151 }
150152 else throwErr("invalid withdrawal request value")
151153 }
152154
153155
154156 let factoryAddressOption = match getString(this, keyFactoryAddress()) {
155157 case s: String =>
156158 addressFromString(s)
157159 case _: Unit =>
158160 unit
159161 case _ =>
160162 throw("Match error")
161163 }
162164
163165 let factoryAddressOrFail = valueOrErrorMessage(factoryAddressOption, wrapErr("invalid factory address"))
164166
165167 let lpAssetIdOption = match factoryAddressOption {
166168 case a: Address =>
167169 match getString(a, keyLpAssetId()) {
168170 case s: String =>
169171 fromBase58String(s)
170172 case _: Unit =>
171173 unit
172174 case _ =>
173175 throw("Match error")
174176 }
175177 case _: Unit =>
176178 unit
177179 case _ =>
178180 throw("Match error")
179181 }
180182
181183 let lpAssetIdOrFail = valueOrErrorMessage(lpAssetIdOption, wrapErr("invalid lpAssetId"))
182184
183185 let proxyTreasuryAddressOption = match factoryAddressOption {
184186 case a: Address =>
185187 match getString(a, keyProxyTreasuryAddress()) {
186188 case s: String =>
187189 addressFromString(s)
188190 case _: Unit =>
189191 unit
190192 case _ =>
191193 throw("Match error")
192194 }
193195 case _: Unit =>
194196 unit
195197 case _ =>
196198 throw("Match error")
197199 }
198200
199201 let proxyTreasuryAddressOrFail = valueOrErrorMessage(proxyTreasuryAddressOption, wrapErr("invalid proxy treasury address"))
200202
201203 let mainTreasuryAddressOption = match factoryAddressOption {
202204 case a: Address =>
203205 match getString(a, keyMainTreasuryAddress()) {
204206 case s: String =>
205207 addressFromString(s)
206208 case _: Unit =>
207209 unit
208210 case _ =>
209211 throw("Match error")
210212 }
211213 case _: Unit =>
212214 unit
213215 case _ =>
214216 throw("Match error")
215217 }
216218
217219 let businessTreasuryAddressOption = match factoryAddressOption {
218220 case a: Address =>
219221 match getString(a, keyBusinessTreasuryAddress()) {
220222 case s: String =>
221223 addressFromString(s)
222224 case _: Unit =>
223225 unit
224226 case _ =>
225227 throw("Match error")
226228 }
227229 case _: Unit =>
228230 unit
229231 case _ =>
230232 throw("Match error")
231233 }
232234
233235 let mainTreasuryAddressOrFail = valueOrErrorMessage(mainTreasuryAddressOption, wrapErr("invalid main treasury address"))
234236
235237 let businessTreasuryAddressOrFail = valueOrErrorMessage(businessTreasuryAddressOption, wrapErr("invalid business treasury address"))
236238
237239 let powerContractAddressOption = match factoryAddressOption {
238240 case a: Address =>
239241 match getString(a, keyPowerContractAddress()) {
240242 case s: String =>
241243 addressFromString(s)
242244 case _: Unit =>
243245 unit
244246 case _ =>
245247 throw("Match error")
246248 }
247249 case _: Unit =>
248250 unit
249251 case _ =>
250252 throw("Match error")
251253 }
252254
253255 let powerContractAddressOrFail = valueOrErrorMessage(powerContractAddressOption, wrapErr("invalid power contract address"))
254256
255257 let powerAssetIdStringOrFail = valueOrErrorMessage(getString(factoryAddressOrFail, keyPowerAssetId()), wrapErr("power asset id not found"))
256258
257259 func getManagerPublicKeyOrUnit () = match factoryAddressOption {
258260 case fa: Address =>
259261 match getString(fa, keyManagerPublicKey()) {
260262 case pub: String =>
261263 fromBase58String(pub)
262264 case _ =>
263265 unit
264266 }
265267 case _ =>
266268 unit
267269 }
268270
269271
270272 func onlyAddress (i,address) = if ((i.caller == address))
271273 then true
272274 else throwErr("permission denied")
273275
274276
275277 func onlyFactory (i) = onlyAddress(i, factoryAddressOrFail)
276278
277279
278280 func rewardForOption (rewards,target) = {
279281 let s = size(rewards)
280- let $t066316656 = rewards[0]
281- let a0 = $t066316656._1
282- let r0 = $t066316656._2
283- let $t066596684 = rewards[1]
284- let a1 = $t066596684._1
285- let r1 = $t066596684._2
286- let $t066876712 = rewards[2]
287- let a2 = $t066876712._1
288- let r2 = $t066876712._2
282+ let $t066696694 = rewards[0]
283+ let a0 = $t066696694._1
284+ let r0 = $t066696694._2
285+ let $t066976722 = rewards[1]
286+ let a1 = $t066976722._1
287+ let r1 = $t066976722._2
288+ let $t067256750 = rewards[2]
289+ let a2 = $t067256750._1
290+ let r2 = $t067256750._2
289291 if (if ((s > 0))
290292 then (a0 == target)
291293 else false)
292294 then r0
293295 else if (if ((s > 1))
294296 then (a1 == target)
295297 else false)
296298 then r1
297299 else if (if ((s > 2))
298300 then (a2 == target)
299301 else false)
300302 then r2
301303 else unit
302304 }
303305
304306
305307 func calculatePrice (lpPartInWaves) = {
306308 let lpAssetAmountToBurn = valueOrElse(getInteger(factoryAddressOrFail, keyWithdrawal()), 0)
307309 let lpAssetQuantity = valueOrErrorMessage(assetInfo(lpAssetIdOrFail), wrapErr("invalid lpAsset info")).quantity
308310 let newPrice = fraction(lpPartInWaves, SCALE8, (lpAssetQuantity - lpAssetAmountToBurn))
309311 let checkIfPriceNotZero = if ((newPrice != 0))
310312 then true
311313 else throwErr("LP price cannot be 0")
312314 if ((checkIfPriceNotZero == checkIfPriceNotZero))
313315 then {
314316 let lpAssetFinalQuantity = (lpAssetQuantity - lpAssetAmountToBurn)
315317 $Tuple3(newPrice, lpAssetAmountToBurn, lpAssetFinalQuantity)
316318 }
317319 else throw("Strict value is not equal to itself.")
318320 }
319321
320322
321323 func claimCollateralINTERNAL (userAddressBytes,txId) = {
322324 let userAddress = Address(userAddressBytes)
323325 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
324326 let withdrawalRequestOption = valueOrErrorMessage(getString(factoryAddressOrFail, keyWithdrawalRequest(userAddress, txId)), wrapErr("invalid withdrawal request"))
325- let $t078797992 = parseWithdrawalRequestValueOrFail(withdrawalRequestOption)
326- let status = $t078797992._1
327- let lpAssetAmount = $t078797992._2
328- let targetPeriod = $t078797992._3
329- let claimTxId = $t078797992._4
327+ let $t079178030 = parseWithdrawalRequestValueOrFail(withdrawalRequestOption)
328+ let status = $t079178030._1
329+ let lpAssetAmount = $t079178030._2
330+ let targetPeriod = $t079178030._3
331+ let claimTxId = $t079178030._4
330332 if ((targetPeriod > currentPeriodOrFail))
331333 then throwErr("invalid withdrawal request period")
332334 else {
333335 let priceOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPriceForPeriod(targetPeriod)), wrapErr("invalid price"))
334336 let wavesAmount = if ((priceOrFail > 0))
335337 then fraction(lpAssetAmount, priceOrFail, SCALE8)
336338 else 0
337339 let assetsString = getStringValue(factoryAddressOrFail, keyPeriodWithdrawalAssetIds(currentPeriodOrFail))
338340 let amountsString = getStringValue(factoryAddressOrFail, keyPeriodWithdrawalAmounts(currentPeriodOrFail))
339341 $Tuple6(userAddress, lpAssetAmount, targetPeriod, wavesAmount, assetsString, amountsString)
340342 }
341343 }
342344
343345
344346 func claimCollateralREADONLYStringResponse (userAddressBytes,txId) = {
345- let $t087798945 = claimCollateralINTERNAL(userAddressBytes, txId)
346- let userAddress = $t087798945._1
347- let lpAssetAmount = $t087798945._2
348- let targetPeriod = $t087798945._3
349- let wavesAmount = $t087798945._4
350- let assetsString = $t087798945._5
351- let amountsString = $t087798945._6
347+ let $t088178983 = claimCollateralINTERNAL(userAddressBytes, txId)
348+ let userAddress = $t088178983._1
349+ let lpAssetAmount = $t088178983._2
350+ let targetPeriod = $t088178983._3
351+ let wavesAmount = $t088178983._4
352+ let assetsString = $t088178983._5
353+ let amountsString = $t088178983._6
352354 let assets = makeString(removeByIndex(split_51C(assetsString, SEP), 0), ":")
353355 let amounts = makeString(removeByIndex(split_51C(amountsString, SEP), 0), ":")
354356 makeString(["%d%s%s", toString(wavesAmount), assets, amounts], SEP)
355357 }
356358
357359
358360 func getRewardSplit (generatorRewardAmount) = {
359361 let powerShareRatio = max([0, min([valueOrElse(getInteger(factoryAddressOrFail, keyPowerShareRatio()), 0), SCALE8])])
360362 let businessPartRatio = max([0, min([valueOrElse(getInteger(factoryAddressOrFail, keyBusinessTreasuryPart()), 0), SCALE8])])
361363 let amountToPowerPart = fraction(generatorRewardAmount, powerShareRatio, SCALE8)
362364 let businessTreasuryAmountPart = fraction(generatorRewardAmount, businessPartRatio, SCALE8)
363365 let rewardRemainder = ((generatorRewardAmount - amountToPowerPart) - businessTreasuryAmountPart)
364366 if ((rewardRemainder > 0))
365367 then $Tuple3(amountToPowerPart, businessTreasuryAmountPart, rewardRemainder)
366368 else throwErr("amount to main treasury cannot be negative")
367369 }
368370
369371
370372 func calcRewardSplitForAmount (amount) = {
371- let blocksProcessingBatchSizeMax = 20
372- let $t01008410177 = getRewardSplit(amount)
373- let amountToPowerPart = $t01008410177._1
374- let businessTreasuryAmountPart = $t01008410177._2
375- let rewardRemainder = $t01008410177._3
373+ let $t01008210175 = getRewardSplit(amount)
374+ let amountToPowerPart = $t01008210175._1
375+ let businessTreasuryAmountPart = $t01008210175._2
376+ let rewardRemainder = $t01008210175._3
376377 let blockProcessingReward = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyBlockProcessingReward()), wrapErr("invalid block processing reward"))
377378 let blockProcessingRewardByGenerator = (blockProcessingReward / blocksProcessingBatchSizeMax)
378379 let toLpAmount = (rewardRemainder - blockProcessingReward)
379380 $Tuple5(amountToPowerPart, businessTreasuryAmountPart, blockProcessingReward, toLpAmount, amount)
380381 }
381382
382383
383384 @Callable(i)
384385 func rewardSplitREADONLY () = {
385386 let targetBlockHeight = (height - 1)
386387 let targetBlockInfo = valueOrErrorMessage(blockInfoByHeight(targetBlockHeight), wrapErr("invalid block info"))
387388 let treasuryRewardOrFail = valueOrErrorMessage(rewardForOption(targetBlockInfo.rewards, proxyTreasuryAddressOrFail), wrapErr(("invalid treasury reward for height " + toString(targetBlockHeight))))
388389 $Tuple2(nil, calcRewardSplitForAmount(treasuryRewardOrFail))
389390 }
390391
391392
392393
393394 @Callable(i)
394395 func claimLP (userAddressBytes) = {
395396 let checkCaller = onlyFactory(i)
396397 if ((checkCaller == checkCaller))
397398 then {
398399 let userAddress = Address(userAddressBytes)
399400 let available = valueOrElse(getInteger(factoryAddressOrFail, keyAvailable(userAddress)), 0)
400401 let claimed = valueOrElse(getInteger(factoryAddressOrFail, keyClaimed(userAddress)), 0)
401402 let factoryActions = if ((available > 0))
402403 then [invoke(factoryAddressOrFail, "transferAsset", [userAddressBytes, available, lpAssetIdOrFail], nil), invoke(factoryAddressOrFail, "integerEntry", [keyAvailable(userAddress), 0], nil), invoke(factoryAddressOrFail, "integerEntry", [keyClaimed(userAddress), (claimed + available)], nil)]
403404 else throwErr("nothing to claim")
404405 $Tuple2(nil, factoryActions)
405406 }
406407 else throw("Strict value is not equal to itself.")
407408 }
408409
409410
410411
411412 @Callable(i)
412413 func finalize (userAddressBytes,donationPartInWaves,lpPartInWaves,claimPartInWaves,powerStakePartInWaves) = {
413414 let checkCaller = onlyFactory(i)
414415 if ((checkCaller == checkCaller))
415416 then {
416417 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
417418 let periodLength = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPeriodLength()), wrapErr("invalid period length"))
418419 let currentStartHeight = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyStartHeight(currentPeriodOrFail)), wrapErr("invalid start height"))
419420 let currentPriceOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPriceForPeriod(currentPeriodOrFail)), wrapErr("invalid price"))
420421 let nextBlockToProcess = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyNextBlockToProcess()), wrapErr("invalid next block to process"))
421422 let periodEndHeight = ((currentStartHeight + periodLength) - 1)
422423 let checks = [if ((i.originCaller == mainTreasuryAddressOrFail))
423424 then true
424425 else throwErr("permission denied"), if ((nextBlockToProcess > periodEndHeight))
425426 then true
426427 else throwErr("unprocessed blocks"), if ((donationPartInWaves >= 0))
427428 then true
428429 else throwErr("invalid donation part"), if ((lpPartInWaves >= 0))
429430 then true
430431 else throwErr("invalid lp part"), if ((claimPartInWaves >= 0))
431432 then true
432433 else throwErr("invalid claim part"), if ((powerStakePartInWaves >= 0))
433434 then true
434435 else throwErr("invalid PWR stake part")]
435436 if ((checks == checks))
436437 then {
437- let $t01351513620 = calculatePrice(lpPartInWaves)
438- let newPrice = $t01351513620._1
439- let lpAssetAmountToBurn = $t01351513620._2
440- let lpAssetFinalQuantity = $t01351513620._3
438+ let $t01351313618 = calculatePrice(lpPartInWaves)
439+ let newPrice = $t01351313618._1
440+ let lpAssetAmountToBurn = $t01351313618._2
441+ let lpAssetFinalQuantity = $t01351313618._3
441442 let newPeriod = (currentPeriodOrFail + 1)
442443 func addNewAction (actions,payment) = {
443- let $t01376813830 = actions
444- let scriptTransfers = $t01376813830._1
445- let assetIdsString = $t01376813830._2
446- let amountsString = $t01376813830._3
444+ let $t01376613828 = actions
445+ let scriptTransfers = $t01376613828._1
446+ let assetIdsString = $t01376613828._2
447+ let amountsString = $t01376613828._3
447448 let paymentAmount = payment.amount
448449 let paymentAssetId = payment.assetId
449450 let newAssetIdsString = ("%s" + makeString([assetIdsString, assetIdToString(paymentAssetId)], SEP))
450451 let newAmountsString = ("%d" + makeString([amountsString, toString(paymentAmount)], SEP))
451452 let newScriptTransfer = ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId)
452453 $Tuple3((scriptTransfers :+ newScriptTransfer), newAssetIdsString, newAmountsString)
453454 }
454455
455- let $t01429014381 = {
456+ let $t01428814379 = {
456457 let $l = i.payments
457458 let $s = size($l)
458459 let $acc0 = $Tuple3(nil, "", "")
459460 func $f0_1 ($a,$i) = if (($i >= $s))
460461 then $a
461462 else addNewAction($a, $l[$i])
462463
463464 func $f0_2 ($a,$i) = if (($i >= $s))
464465 then $a
465466 else throw("List size exceeds 10")
466467
467468 $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)
468469 }
469- let scriptTransfers = $t01429014381._1
470- let AssetIds = $t01429014381._2
471- let Amounts = $t01429014381._3
470+ let scriptTransfers = $t01428814379._1
471+ let AssetIds = $t01428814379._2
472+ let Amounts = $t01428814379._3
472473 let factoryActions = [invoke(factoryAddressOrFail, "integerEntry", [keyPowerManagerBonus(currentPeriodOrFail), powerStakePartInWaves], nil), invoke(factoryAddressOrFail, "integerEntry", [keyClaimWavesAmount(currentPeriodOrFail), claimPartInWaves], nil), invoke(factoryAddressOrFail, "integerEntry", [keyCurrentPeriod(), newPeriod], nil), invoke(factoryAddressOrFail, "integerEntry", [keyPriceForPeriod(newPeriod), newPrice], nil), invoke(factoryAddressOrFail, "integerEntry", [keyStartHeight(newPeriod), (periodEndHeight + 1)], nil), invoke(factoryAddressOrFail, "burn", [lpAssetAmountToBurn], nil), invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawal(), 0], nil), invoke(factoryAddressOrFail, "integerEntry", [keyInvested(unit), lpPartInWaves], nil), invoke(factoryAddressOrFail, "integerEntry", [keyDonated(unit), donationPartInWaves], nil), invoke(factoryAddressOrFail, "stringEntry", [keyPeriodWithdrawalAssetIds(newPeriod), AssetIds], nil), invoke(factoryAddressOrFail, "stringEntry", [keyPeriodWithdrawalAmounts(newPeriod), Amounts], nil)]
473474 $Tuple2(scriptTransfers, factoryActions)
474475 }
475476 else throw("Strict value is not equal to itself.")
476477 }
477478 else throw("Strict value is not equal to itself.")
478479 }
479480
480481
481482
482483 @Callable(i)
483484 func finalizeREADONLY (donationPartInWaves,lpPartInWaves,claimPartInWaves,powerStakePartInWaves) = {
484485 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
485486 let periodLength = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPeriodLength()), wrapErr("invalid period length"))
486487 let currentStartHeight = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyStartHeight(currentPeriodOrFail)), wrapErr("invalid start height"))
487488 let currentPriceOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPriceForPeriod(currentPeriodOrFail)), wrapErr("invalid price"))
488489 let nextBlockToProcess = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyNextBlockToProcess()), wrapErr("invalid next block to process"))
489490 let periodEndHeight = ((currentStartHeight + periodLength) - 1)
490491 let checks = [if ((nextBlockToProcess > periodEndHeight))
491492 then true
492493 else throwErr("unprocessed blocks"), if ((donationPartInWaves >= 0))
493494 then true
494495 else throwErr("invalid donation part"), if ((lpPartInWaves >= 0))
495496 then true
496497 else throwErr("invalid lp part"), if ((claimPartInWaves >= 0))
497498 then true
498499 else throwErr("invalid claim part"), if ((powerStakePartInWaves >= 0))
499500 then true
500501 else throwErr("invalid PWR stake part")]
501502 if ((checks == checks))
502503 then {
503- let $t01726017365 = calculatePrice(lpPartInWaves)
504- let newPrice = $t01726017365._1
505- let lpAssetAmountToBurn = $t01726017365._2
506- let lpAssetFinalQuantity = $t01726017365._3
504+ let $t01725817363 = calculatePrice(lpPartInWaves)
505+ let newPrice = $t01725817363._1
506+ let lpAssetAmountToBurn = $t01725817363._2
507+ let lpAssetFinalQuantity = $t01725817363._3
507508 $Tuple2(nil, $Tuple6(claimPartInWaves, lpPartInWaves, donationPartInWaves, newPrice, lpAssetAmountToBurn, lpAssetFinalQuantity))
508509 }
509510 else throw("Strict value is not equal to itself.")
510511 }
511512
512513
513514
514515 @Callable(i)
515516 func invest (userAddressBytes) = {
516517 let checkCaller = onlyFactory(i)
517518 if ((checkCaller == checkCaller))
518519 then {
519520 let userAddress = Address(userAddressBytes)
520521 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
521522 let currentStartHeight = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyStartHeight(currentPeriodOrFail)), wrapErr("invalid start height"))
522523 let investPeriodLength = getIntegerValue(factoryAddressOrFail, keyInvestPeriodLength())
523524 let heightCheck = if (((currentStartHeight + investPeriodLength) > height))
524525 then true
525526 else throwErr("too late to invest in this period")
526527 if ((heightCheck == heightCheck))
527528 then {
528529 let currentPriceOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPriceForPeriod(currentPeriodOrFail)), wrapErr("invalid price"))
529530 let payment = if ((size(i.payments) == 1))
530531 then i.payments[0]
531532 else throwErr("invalid payments")
532- let $t01847418651 = if (if ((payment.assetId == unit))
533+ let $t01847218649 = if (if ((payment.assetId == unit))
533534 then (payment.amount > 0)
534535 else false)
535536 then $Tuple2(payment.amount, payment.assetId)
536537 else throwErr("invalid payment amount")
537- let paymentAmount = $t01847418651._1
538- let paymentAssetId = $t01847418651._2
538+ let paymentAmount = $t01847218649._1
539+ let paymentAssetId = $t01847218649._2
539540 let treasuryPart = valueOrElse(getInteger(factoryAddressOrFail, keyBusinessTreasuryPart()), 0)
540541 let paymentsWithoutTreasuryPart = fraction(paymentAmount, (SCALE8 - treasuryPart), SCALE8)
541542 let lpAssetAmount = if ((currentPriceOrFail > 0))
542543 then fraction(paymentsWithoutTreasuryPart, SCALE8, currentPriceOrFail)
543544 else 0
544545 let invested = valueOrElse(getInteger(factoryAddressOrFail, keyInvested(unit)), 0)
545546 let actions = [ScriptTransfer(mainTreasuryAddressOrFail, paymentsWithoutTreasuryPart, paymentAssetId), ScriptTransfer(businessTreasuryAddressOrFail, treasuryPart, paymentAssetId)]
546547 let factoryActions = [invoke(factoryAddressOrFail, "integerEntry", [keyInvested(unit), (invested + paymentsWithoutTreasuryPart)], nil), invoke(factoryAddressOrFail, "reissue", [lpAssetAmount], nil), invoke(factoryAddressOrFail, "transferAsset", [userAddressBytes, lpAssetAmount, lpAssetIdOrFail], nil)]
547548 $Tuple2(actions, factoryActions)
548549 }
549550 else throw("Strict value is not equal to itself.")
550551 }
551552 else throw("Strict value is not equal to itself.")
552553 }
553554
554555
555556
556557 @Callable(i)
557558 func withdraw (userAddressBytes) = {
558559 let checkCaller = onlyFactory(i)
559560 if ((checkCaller == checkCaller))
560561 then {
561562 let userAddress = Address(userAddressBytes)
562563 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
563- let payment = if ((size(i.payments) == 1))
564- then i.payments[0]
565- else throwErr(wrapErr("invalid payments"))
566- let paymentAssetId = if ((payment.assetId == lpAssetIdOrFail))
567- then lpAssetIdOrFail
568- else throwErr("invalid payment asset")
569- let paymentAmount = if ((payment.amount > 0))
570- then payment.amount
571- else throwErr("invalid payment amount")
572- let withdrawal = valueOrElse(getInteger(factoryAddressOrFail, keyWithdrawal()), 0)
573- let actions = [ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId)]
574- let factoryActions = [invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawal(), (withdrawal + paymentAmount)], nil), invoke(factoryAddressOrFail, "stringEntry", [keyWithdrawalRequest(userAddress, i.transactionId), valueWithdrawalRequest(PENDING, paymentAmount, (currentPeriodOrFail + 1), unit)], nil)]
575- if ((factoryActions == factoryActions))
576- then $Tuple2(actions, factoryActions)
564+ let periodLength = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPeriodLength()), wrapErr("invalid period length"))
565+ let currentStartHeight = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyStartHeight(currentPeriodOrFail)), wrapErr("invalid start height"))
566+ let heightCheck = if (((currentStartHeight + periodLength) > height))
567+ then true
568+ else throwErr("too late to withdraw in this period")
569+ if ((heightCheck == heightCheck))
570+ then {
571+ let payment = if ((size(i.payments) == 1))
572+ then i.payments[0]
573+ else throwErr(wrapErr("invalid payments"))
574+ let paymentAssetId = if ((payment.assetId == lpAssetIdOrFail))
575+ then lpAssetIdOrFail
576+ else throwErr("invalid payment asset")
577+ let paymentAmount = if ((payment.amount > 0))
578+ then payment.amount
579+ else throwErr("invalid payment amount")
580+ let withdrawal = valueOrElse(getInteger(factoryAddressOrFail, keyWithdrawal()), 0)
581+ let actions = [ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId)]
582+ let factoryActions = [invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawal(), (withdrawal + paymentAmount)], nil), invoke(factoryAddressOrFail, "stringEntry", [keyWithdrawalRequest(userAddress, i.transactionId), valueWithdrawalRequest(PENDING, paymentAmount, (currentPeriodOrFail + 1), unit)], nil)]
583+ if ((factoryActions == factoryActions))
584+ then $Tuple2(actions, factoryActions)
585+ else throw("Strict value is not equal to itself.")
586+ }
577587 else throw("Strict value is not equal to itself.")
578588 }
579589 else throw("Strict value is not equal to itself.")
580590 }
581591
582592
583593
584594 @Callable(i)
585595 func cancelWithdraw (userAddressBytes,txId) = {
586596 let checkCaller = onlyFactory(i)
587597 if ((checkCaller == checkCaller))
588- then {
589- let userAddress = Address(userAddressBytes)
590- let withdrawalRequestOption = valueOrErrorMessage(getString(factoryAddressOrFail, keyWithdrawalRequest(userAddress, txId)), wrapErr("invalid withdrawal request"))
591- let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
592- let $t02138521498 = parseWithdrawalRequestValueOrFail(withdrawalRequestOption)
593- let status = $t02138521498._1
594- let lpAssetAmount = $t02138521498._2
595- let targetPeriod = $t02138521498._3
596- let claimTxId = $t02138521498._4
597- let checks = [if ((status == PENDING))
598- then true
599- else throwErr("invalid withdrawal request status"), if ((targetPeriod > currentPeriodOrFail))
600- then true
601- else throwErr("invalid withdrawal request period")]
602- if ((checks == checks))
603- then {
604- let withdrawal = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyWithdrawal()), wrapErr("invalid total withdrawal amount"))
605- let factoryActions = [invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawal(), if ((withdrawal >= lpAssetAmount))
606- then (withdrawal - lpAssetAmount)
607- else throwErr("invalid withdrawal amount")], nil), invoke(factoryAddressOrFail, "deleteEntry", [keyWithdrawalRequest(userAddress, txId)], nil), invoke(factoryAddressOrFail, "transferAsset", [userAddressBytes, lpAssetAmount, lpAssetIdOrFail], nil)]
608- if ((factoryActions == factoryActions))
609- then $Tuple2(nil, factoryActions)
610- else throw("Strict value is not equal to itself.")
611- }
612- else throw("Strict value is not equal to itself.")
613- }
598+ then throwErr("cancelWithdraw is deprecated")
614599 else throw("Strict value is not equal to itself.")
615600 }
616601
617602
618603
619604 @Callable(i)
620605 func claimCollateral (userAddressBytes,txId) = {
621606 let checkCaller = onlyFactory(i)
622607 if ((checkCaller == checkCaller))
623608 then {
624- let $t02248422669 = claimCollateralINTERNAL(userAddressBytes, fromBase58String(txId))
625- let userAddress = $t02248422669._1
626- let lpAssetAmount = $t02248422669._2
627- let targetPeriod = $t02248422669._3
628- let wavesAmount = $t02248422669._4
629- let assetsString = $t02248422669._5
630- let amountsString = $t02248422669._6
609+ let $t02161621801 = claimCollateralINTERNAL(userAddressBytes, fromBase58String(txId))
610+ let userAddress = $t02161621801._1
611+ let lpAssetAmount = $t02161621801._2
612+ let targetPeriod = $t02161621801._3
613+ let wavesAmount = $t02161621801._4
614+ let assetsString = $t02161621801._5
615+ let amountsString = $t02161621801._6
631616 let assetsList = removeByIndex(split_51C(assetsString, SEP), 0)
632617 let amountsList = removeByIndex(split_51C(amountsString, SEP), 0)
633618 let factoryActions = [invoke(factoryAddressOrFail, "deleteEntry", [keyWithdrawalRequest(userAddress, fromBase58String(txId))], nil), invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawalHistory(userAddress, fromBase58String(txId)), lpAssetAmount], nil), invoke(factoryAddressOrFail, "transferAssets", [userAddressBytes, assetsList, amountsList], nil)]
634619 $Tuple2(nil, factoryActions)
635620 }
636621 else throw("Strict value is not equal to itself.")
637622 }
638623
639624
640625
641626 @Callable(i)
642627 func claimCollateralBulk (userAddressBytes,txIds) = {
643628 let checkCaller = onlyFactory(i)
644629 if ((checkCaller == checkCaller))
645630 then {
646631 func addNewAction (state,txId) = {
647- let $t02342723626 = claimCollateralINTERNAL(userAddressBytes, fromBase58String(txId))
648- let userAddress = $t02342723626._1
649- let lpAssetAmount = $t02342723626._2
650- let targetPeriod = $t02342723626._3
651- let wavesAmount = $t02342723626._4
652- let assetsString = $t02342723626._5
653- let amountsString = $t02342723626._6
632+ let $t02255922758 = claimCollateralINTERNAL(userAddressBytes, fromBase58String(txId))
633+ let userAddress = $t02255922758._1
634+ let lpAssetAmount = $t02255922758._2
635+ let targetPeriod = $t02255922758._3
636+ let wavesAmount = $t02255922758._4
637+ let assetsString = $t02255922758._5
638+ let amountsString = $t02255922758._6
654639 let assetsList = removeByIndex(split_51C(assetsString, SEP), 0)
655640 let amountsList = removeByIndex(split_51C(amountsString, SEP), 0)
656641 let newActions = [invoke(factoryAddressOrFail, "deleteEntry", [keyWithdrawalRequest(userAddress, fromBase58String(txId))], nil), invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawalHistory(userAddress, fromBase58String(txId)), lpAssetAmount], nil), invoke(factoryAddressOrFail, "transferAssets", [userAddressBytes, assetsList, amountsList], nil)]
657642 (state ++ newActions)
658643 }
659644
660645 let allFactoryActions = {
661646 let $l = txIds
662647 let $s = size($l)
663648 let $acc0 = nil
664649 func $f0_1 ($a,$i) = if (($i >= $s))
665650 then $a
666651 else addNewAction($a, $l[$i])
667652
668653 func $f0_2 ($a,$i) = if (($i >= $s))
669654 then $a
670655 else throw("List size exceeds 10")
671656
672657 $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)
673658 }
674659 $Tuple2(nil, allFactoryActions)
675660 }
676661 else throw("Strict value is not equal to itself.")
677662 }
678663
679664
680665
681666 @Callable(i)
682667 func claimCollateralREADONLY (userAddressBytes,txId) = {
683668 let response = claimCollateralREADONLYStringResponse(userAddressBytes, fromBase58String(txId))
684669 $Tuple2(nil, response)
685670 }
686671
687672
688673
689674 @Callable(i)
690675 func claimCollateralBulkREADONLY (userAddressBytes,txIds) = {
691676 func processTxId (state,txId) = {
692677 let response = claimCollateralREADONLYStringResponse(userAddressBytes, fromBase58String(txId))
693678 (state :+ response)
694679 }
695680
696681 let allResponses = {
697682 let $l = txIds
698683 let $s = size($l)
699684 let $acc0 = nil
700685 func $f0_1 ($a,$i) = if (($i >= $s))
701686 then $a
702687 else processTxId($a, $l[$i])
703688
704689 func $f0_2 ($a,$i) = if (($i >= $s))
705690 then $a
706691 else throw("List size exceeds 10")
707692
708693 $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)
709694 }
710695 $Tuple2(nil, allResponses)
711696 }
712697
713698
714699
715700 @Callable(i)
716701 func processBlocks (userAddressBytes) = {
717702 let checkCaller = onlyFactory(i)
718703 if ((checkCaller == checkCaller))
719704 then {
720705 let userAddress = Address(userAddressBytes)
721706 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
722707 let periodLength = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPeriodLength()), wrapErr("invalid period length"))
723708 let currentStartHeight = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyStartHeight(currentPeriodOrFail)), wrapErr("invalid start height"))
724709 let currentPriceOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPriceForPeriod(currentPeriodOrFail)), wrapErr("invalid price"))
725710 let nextBlockToProcess = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyNextBlockToProcess()), wrapErr("invalid next block to process"))
726711 let periodEndHeight = ((currentStartHeight + periodLength) - 1)
727- let blocksProcessingBatchSizeMax = 20
728712 let blocksProcessingBatchSize = if (if (if ((height >= nextBlockToProcess))
729713 then if ((nextBlockToProcess >= currentStartHeight))
730714 then true
731715 else (currentPeriodOrFail == 0)
732716 else false)
733717 then (periodEndHeight >= nextBlockToProcess)
734718 else false)
735719 then min([((periodEndHeight - nextBlockToProcess) + 1), blocksProcessingBatchSizeMax])
736720 else throwErr(wrapErr("invalid target block"))
737721 let blockProcessingReward = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyBlockProcessingReward()), wrapErr("invalid block processing reward"))
738722 let blockProcessingRewardByGenerator = (blockProcessingReward / blocksProcessingBatchSize)
739723 let blockProcessingRewardByGeneratorRemainder = (blockProcessingReward - (blockProcessingRewardByGenerator * blocksProcessingBatchSize))
740724 func map (acc,inc) = if ((inc >= blocksProcessingBatchSize))
741725 then acc
742726 else {
743727 let targetBlockHeight = (nextBlockToProcess + inc)
744728 let targetBlockInfo = valueOrErrorMessage(blockInfoByHeight(targetBlockHeight), wrapErr("invalid block info"))
745729 let treasuryRewardOrFail = valueOrErrorMessage(rewardForOption(targetBlockInfo.rewards, proxyTreasuryAddressOrFail), wrapErr(("invalid treasury reward for height " + toString(targetBlockHeight))))
746730 let generator = targetBlockInfo.generator
747731 let available = valueOrElse(getInteger(factoryAddressOrFail, keyAvailable(generator)), 0)
748732 let callerReward = if ((inc == (blocksProcessingBatchSize - 1)))
749733 then (blockProcessingRewardByGenerator + blockProcessingRewardByGeneratorRemainder)
750734 else blockProcessingRewardByGenerator
751- let $t02756627674 = getRewardSplit(treasuryRewardOrFail)
752- let shareAmountToPower = $t02756627674._1
753- let businessTreasuryAmountPart = $t02756627674._2
754- let rewardRemainder = $t02756627674._3
735+ let $t02665826766 = getRewardSplit(treasuryRewardOrFail)
736+ let shareAmountToPower = $t02665826766._1
737+ let businessTreasuryAmountPart = $t02665826766._2
738+ let rewardRemainder = $t02665826766._3
755739 let lpAssetAmount = if ((currentPriceOrFail > 0))
756740 then fraction((rewardRemainder - callerReward), SCALE8, currentPriceOrFail)
757741 else 0
758742 let factoryActionsSingle = [invoke(factoryAddressOrFail, "stringEntry", [keyBlockProcessed(targetBlockHeight), makeString([toBase58String(i.transactionId), toString(currentPeriodOrFail), toString(generator), toBase58String(userAddressBytes), toString(treasuryRewardOrFail), toString(callerReward), toString(lpAssetAmount), toString(shareAmountToPower)], SEP)], nil), invoke(factoryAddressOrFail, "integerEntry", [keyAvailable(generator), (available + lpAssetAmount)], nil)]
759743 if ((factoryActionsSingle == factoryActionsSingle))
760744 then {
761- let $t02852228597 = acc
762- let lpAssetAcc = $t02852228597._1
763- let rewardAcc = $t02852228597._2
764- let businessTreasuryAcc = $t02852228597._3
765- let powerShareDataTuple = $t02852228597._4
766- let $t02860428670 = powerShareDataTuple
767- let powerShareAcc = $t02860428670._1
768- let generatorPowerShareList = $t02860428670._2
745+ let $t02761427689 = acc
746+ let lpAssetAcc = $t02761427689._1
747+ let rewardAcc = $t02761427689._2
748+ let businessTreasuryAcc = $t02761427689._3
749+ let powerShareDataTuple = $t02761427689._4
750+ let $t02769627762 = powerShareDataTuple
751+ let powerShareAcc = $t02769627762._1
752+ let generatorPowerShareList = $t02769627762._2
769753 let newGeneratorPowerShareList = (generatorPowerShareList :+ $Tuple2(toString(generator), shareAmountToPower))
770754 $Tuple4((lpAssetAcc + lpAssetAmount), (rewardAcc + treasuryRewardOrFail), (businessTreasuryAcc + businessTreasuryAmountPart), $Tuple2((powerShareAcc + shareAmountToPower), newGeneratorPowerShareList))
771755 }
772756 else throw("Strict value is not equal to itself.")
773757 }
774758
775759 let list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
776- let $t02911829280 = {
760+ let $t02821028372 = {
777761 let $l = list
778762 let $s = size($l)
779763 let $acc0 = $Tuple4(0, 0, 0, $Tuple2(0, nil))
780764 func $f0_1 ($a,$i) = if (($i >= $s))
781765 then $a
782766 else map($a, $l[$i])
783767
784768 func $f0_2 ($a,$i) = if (($i >= $s))
785769 then $a
786770 else throw("List size exceeds 20")
787771
788772 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
789773 }
790- if (($t02911829280 == $t02911829280))
774+ if (($t02821028372 == $t02821028372))
791775 then {
792- let powerShareDataTuple = $t02911829280._4
793- let rewardToBusinessTreasuryAmount = $t02911829280._3
794- let rewardAmountTotal = $t02911829280._2
795- let lpAssetAmountTotal = $t02911829280._1
796- let $t02928429353 = powerShareDataTuple
797- let amountToPowerTotal = $t02928429353._1
798- let powerShareAmountsList = $t02928429353._2
776+ let powerShareDataTuple = $t02821028372._4
777+ let rewardToBusinessTreasuryAmount = $t02821028372._3
778+ let rewardAmountTotal = $t02821028372._2
779+ let lpAssetAmountTotal = $t02821028372._1
780+ let $t02837628445 = powerShareDataTuple
781+ let amountToPowerTotal = $t02837628445._1
782+ let powerShareAmountsList = $t02837628445._2
799783 let rewardToMainTreasuryAmount = (((rewardAmountTotal - rewardToBusinessTreasuryAmount) - blockProcessingReward) - amountToPowerTotal)
800784 let invested = valueOrElse(getInteger(factoryAddressOrFail, keyInvested(unit)), 0)
801785 let powerShareActions = if ((amountToPowerTotal > 0))
802786 then {
803787 let transferAction = [invoke(factoryAddressOrFail, "transferFromProxyTreasury", [factoryAddressOrFail.bytes, amountToPowerTotal], nil)]
804788 if ((transferAction == transferAction))
805789 then {
806790 let totalPowerAmount = invoke(factoryAddressOrFail, "swap", [powerAssetIdStringOrFail, WAVES, amountToPowerTotal], nil)
807791 if ((totalPowerAmount == totalPowerAmount))
808792 then {
809793 let totalPowerAmountInt = match totalPowerAmount {
810794 case pAmount: Int =>
811795 pAmount
812796 case _ =>
813797 0
814798 }
815799 func stakePowerInvoke (acc,next) = {
816- let $t03022730262 = next
817- let generator = $t03022730262._1
818- let shareAmount = $t03022730262._2
800+ let $t02931929354 = next
801+ let generator = $t02931929354._1
802+ let shareAmount = $t02931929354._2
819803 if ((amountToPowerTotal > 0))
820804 then {
821805 let powerAmount = fraction(shareAmount, totalPowerAmountInt, amountToPowerTotal)
822806 let inv = invoke(factoryAddressOrFail, "powerStake", [fromBase58String(generator), fromBase58String(powerAssetIdStringOrFail), powerAmount], nil)
823807 if ((inv == inv))
824808 then nil
825809 else throw("Strict value is not equal to itself.")
826810 }
827811 else nil
828812 }
829813
830814 let powerStakesActions = {
831815 let $l = powerShareAmountsList
832816 let $s = size($l)
833817 let $acc0 = 0
834818 func $f1_1 ($a,$i) = if (($i >= $s))
835819 then $a
836820 else stakePowerInvoke($a, $l[$i])
837821
838822 func $f1_2 ($a,$i) = if (($i >= $s))
839823 then $a
840824 else throw("List size exceeds 20")
841825
842826 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
843827 }
844828 if ((powerStakesActions == powerStakesActions))
845829 then nil
846830 else throw("Strict value is not equal to itself.")
847831 }
848832 else throw("Strict value is not equal to itself.")
849833 }
850834 else throw("Strict value is not equal to itself.")
851835 }
852836 else nil
853837 if ((powerShareActions == powerShareActions))
854838 then {
855839 let actions = [invoke(factoryAddressOrFail, "reissue", [lpAssetAmountTotal], nil), invoke(factoryAddressOrFail, "integerEntry", [keyNextBlockToProcess(), (nextBlockToProcess + blocksProcessingBatchSize)], nil), invoke(factoryAddressOrFail, "transferFromProxyTreasury", [mainTreasuryAddressOrFail.bytes, rewardToMainTreasuryAmount], nil), invoke(factoryAddressOrFail, "transferFromProxyTreasury", [userAddressBytes, blockProcessingReward], nil), invoke(factoryAddressOrFail, "transferFromProxyTreasury", [businessTreasuryAddressOrFail.bytes, rewardToBusinessTreasuryAmount], nil), invoke(factoryAddressOrFail, "integerEntry", [keyInvested(unit), (invested + rewardToMainTreasuryAmount)], nil)]
856840 if ((actions == actions))
857841 then $Tuple2(nil, unit)
858842 else throw("Strict value is not equal to itself.")
859843 }
860844 else throw("Strict value is not equal to itself.")
861845 }
862846 else throw("Strict value is not equal to itself.")
863847 }
864848 else throw("Strict value is not equal to itself.")
865849 }
866850
867851
868852 @Verifier(tx)
869853 func verify () = {
870854 let publicKey = match getManagerPublicKeyOrUnit() {
871855 case pub: ByteVector =>
872856 pub
873857 case _ =>
874858 tx.senderPublicKey
875859 }
876860 sigVerify(tx.bodyBytes, tx.proofs[0], publicKey)
877861 }
878862

github/deemru/w8io/169f3d6 
111.83 ms