tx · DPFPUjQknkXcW39XR6YG7J82qbzUbjTKmSA75aVPE61d

3N4QFkEYPsR9D54c1pHRQzqRARjubXcbGuA:  -0.02500000 Waves

2023.07.05 15:47 [2652633] smart account 3N4QFkEYPsR9D54c1pHRQzqRARjubXcbGuA > SELF 0.00000000 Waves

{ "type": 13, "id": "DPFPUjQknkXcW39XR6YG7J82qbzUbjTKmSA75aVPE61d", "fee": 2500000, "feeAssetId": null, "timestamp": 1688561310437, "version": 1, "sender": "3N4QFkEYPsR9D54c1pHRQzqRARjubXcbGuA", "senderPublicKey": "8nr9XxGKmrRg6E6Zss6YPynBYEFbCf39Z2D9WvVuUgzY", "proofs": [ "5CDePu85YaQnY34d32PB9h5Y3Re8VzYmZeP9i3VsT65fNDtHvYbVohsxuMgFwrP9kg48k9fcEDuupRTEj6YFvnz1" ], "script": "base64:BwIqCAISAwoBAhIGCgQCAQEBEgMKAQISAwoBAhIECgICAhIECgICAhIDCgECKgADU0VQAgJfXwANQ09OVFJBQ1RfTkFNRQIPY2FsY3VsYXRvci5yaWRlAAZTQ0FMRTgAgMLXLwAHUEVORElORwIHUEVORElORwAIRklOSVNIRUQCCEZJTklTSEVEAAVXQVZFUwIFV0FWRVMBB3dyYXBFcnIBAXMJAKwCAgkArAICBQ1DT05UUkFDVF9OQU1FAgI6IAUBcwEIdGhyb3dFcnIBAXMJAAIBCQEHd3JhcEVycgEFAXMBD2Fzc2V0SWRUb1N0cmluZwEHYXNzZXRJZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFiBQckbWF0Y2gwCQDYBAEFAWIDCQABAgUHJG1hdGNoMAIEVW5pdAUFV0FWRVMJAAIBAgtNYXRjaCBlcnJvcgEDYWJzAQFuAwkAZgIAAAUBbgkBAS0BBQFuBQFuARFrZXlGYWN0b3J5QWRkcmVzcwAJALkJAgkAzAgCAgIlcwkAzAgCAgdmYWN0b3J5BQNuaWwFA1NFUAETa2V5TWFuYWdlclB1YmxpY0tleQAJALkJAgkAzAgCAgIlcwkAzAgCAhBtYW5hZ2VyUHVibGljS2V5BQNuaWwFA1NFUAEMa2V5THBBc3NldElkAAkAuQkCCQDMCAICAiVzCQDMCAICCWxwQXNzZXRJZAUDbmlsBQNTRVABF2tleVByb3h5VHJlYXN1cnlBZGRyZXNzAAkAuQkCCQDMCAICAiVzCQDMCAICDXByb3h5VHJlYXN1cnkFA25pbAUDU0VQARZrZXlNYWluVHJlYXN1cnlBZGRyZXNzAAkAuQkCCQDMCAICAiVzCQDMCAICDG1haW5UcmVhc3VyeQUDbmlsBQNTRVABC2tleUludmVzdGVkAQdhc3NldElkCQC5CQIJAMwIAgIEJXMlcwkAzAgCAghpbnZlc3RlZAkAzAgCCQEPYXNzZXRJZFRvU3RyaW5nAQUHYXNzZXRJZAUDbmlsBQNTRVABCmtleURvbmF0ZWQBB2Fzc2V0SWQJALkJAgkAzAgCAgQlcyVzCQDMCAICB2RvbmF0ZWQJAMwIAgkBD2Fzc2V0SWRUb1N0cmluZwEFB2Fzc2V0SWQFA25pbAUDU0VQAQxrZXlBdmFpbGFibGUBC3VzZXJBZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCAglhdmFpbGFibGUJAMwIAgkApQgBBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABCmtleUNsYWltZWQBC3VzZXJBZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCAgdjbGFpbWVkCQDMCAIJAKUIAQULdXNlckFkZHJlc3MFA25pbAUDU0VQARBrZXlDdXJyZW50UGVyaW9kAAkAuQkCCQDMCAICAiVzCQDMCAICDWN1cnJlbnRQZXJpb2QFA25pbAUDU0VQARFrZXlQcmljZUZvclBlcmlvZAEGcGVyaW9kCQC5CQIJAMwIAgIEJXMlZAkAzAgCAgVwcmljZQkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABDmtleVN0YXJ0SGVpZ2h0AQZwZXJpb2QJALkJAgkAzAgCAgQlcyVkCQDMCAICC3N0YXJ0SGVpZ2h0CQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEPa2V5UGVyaW9kTGVuZ3RoAAIQJXNfX3BlcmlvZExlbmd0aAEYa2V5QmxvY2tQcm9jZXNzaW5nUmV3YXJkAAIZJXNfX2Jsb2NrUHJvY2Vzc2luZ1Jld2FyZAEVa2V5TmV4dEJsb2NrVG9Qcm9jZXNzAAIWJXNfX25leHRCbG9ja1RvUHJvY2VzcwERa2V5QmxvY2tQcm9jZXNzZWQBBmhlaWdodAkAuQkCCQDMCAICBCVzJWQJAMwIAgIOYmxvY2tQcm9jZXNzZWQJAMwIAgkApAMBBQZoZWlnaHQFA25pbAUDU0VQAQ1rZXlXaXRoZHJhd2FsAAIOJXNfX3dpdGhkcmF3YWwBFGtleVdpdGhkcmF3YWxSZXF1ZXN0Agt1c2VyQWRkcmVzcwR0eElkCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICCndpdGhkcmF3YWwJAMwIAgkApQgBBQt1c2VyQWRkcmVzcwkAzAgCCQDYBAEFBHR4SWQFA25pbAUDU0VQARZ2YWx1ZVdpdGhkcmF3YWxSZXF1ZXN0BAZzdGF0dXMNbHBBc3NldEFtb3VudAx0YXJnZXRQZXJpb2QJY2xhaW1UeElkBAxjbGFpbVR4SWRTdHIEByRtYXRjaDAFCWNsYWltVHhJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFiBQckbWF0Y2gwCQDYBAEFAWIDCQABAgUHJG1hdGNoMAIEVW5pdAIEU09PTgkAAgECC01hdGNoIGVycm9yCQC5CQIJAMwIAgIIJXMlZCVkJXMJAMwIAgUGc3RhdHVzCQDMCAIJAKQDAQUNbHBBc3NldEFtb3VudAkAzAgCCQCkAwEFDHRhcmdldFBlcmlvZAkAzAgCBQxjbGFpbVR4SWRTdHIFA25pbAUDU0VQASFwYXJzZVdpdGhkcmF3YWxSZXF1ZXN0VmFsdWVPckZhaWwBAXMEBXBhcnRzCQC1CQIFAXMFA1NFUAMJAAACCQCQAwEFBXBhcnRzAAUEBnN0YXR1cwkAkQMCBQVwYXJ0cwABBA1scEFzc2V0QW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBQVwYXJ0cwACCQEHd3JhcEVycgECFWludmFsaWQgbHBBc3NldEFtb3VudAQMdGFyZ2V0UGVyaW9kCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBQVwYXJ0cwADCQEHd3JhcEVycgECFGludmFsaWQgdGFyZ2V0UGVyaW9kBAljbGFpbVR4SWQJAJEDAgUFcGFydHMABAkAlgoEBQZzdGF0dXMFDWxwQXNzZXRBbW91bnQFDHRhcmdldFBlcmlvZAUJY2xhaW1UeElkCQEIdGhyb3dFcnIBAiBpbnZhbGlkIHdpdGhkcmF3YWwgcmVxdWVzdCB2YWx1ZQAUZmFjdG9yeUFkZHJlc3NPcHRpb24EByRtYXRjaDAJAJ0IAgUEdGhpcwkBEWtleUZhY3RvcnlBZGRyZXNzAAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJAKYIAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IAFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIFFGZhY3RvcnlBZGRyZXNzT3B0aW9uCQEHd3JhcEVycgECF2ludmFsaWQgZmFjdG9yeSBhZGRyZXNzAA9scEFzc2V0SWRPcHRpb24EByRtYXRjaDAFFGZhY3RvcnlBZGRyZXNzT3B0aW9uAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAEByRtYXRjaDEJAJ0IAgUBYQkBDGtleUxwQXNzZXRJZAADCQABAgUHJG1hdGNoMQIGU3RyaW5nBAFzBQckbWF0Y2gxCQDZBAEFAXMDCQABAgUHJG1hdGNoMQIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgAPbHBBc3NldElkT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIFD2xwQXNzZXRJZE9wdGlvbgkBB3dyYXBFcnIBAhFpbnZhbGlkIGxwQXNzZXRJZAAacHJveHlUcmVhc3VyeUFkZHJlc3NPcHRpb24EByRtYXRjaDAFFGZhY3RvcnlBZGRyZXNzT3B0aW9uAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAEByRtYXRjaDEJAJ0IAgUBYQkBF2tleVByb3h5VHJlYXN1cnlBZGRyZXNzAAMJAAECBQckbWF0Y2gxAgZTdHJpbmcEAXMFByRtYXRjaDEJAKYIAQUBcwMJAAECBQckbWF0Y2gxAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yABpwcm94eVRyZWFzdXJ5QWRkcmVzc09yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBRpwcm94eVRyZWFzdXJ5QWRkcmVzc09wdGlvbgkBB3dyYXBFcnIBAh5pbnZhbGlkIHByb3h5IHRyZWFzdXJ5IGFkZHJlc3MAGW1haW5UcmVhc3VyeUFkZHJlc3NPcHRpb24EByRtYXRjaDAFFGZhY3RvcnlBZGRyZXNzT3B0aW9uAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAEByRtYXRjaDEJAJ0IAgUBYQkBFmtleU1haW5UcmVhc3VyeUFkZHJlc3MAAwkAAQIFByRtYXRjaDECBlN0cmluZwQBcwUHJG1hdGNoMQkApggBBQFzAwkAAQIFByRtYXRjaDECBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IAGW1haW5UcmVhc3VyeUFkZHJlc3NPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUZbWFpblRyZWFzdXJ5QWRkcmVzc09wdGlvbgkBB3dyYXBFcnIBAh1pbnZhbGlkIG1haW4gdHJlYXN1cnkgYWRkcmVzcwEZZ2V0TWFuYWdlclB1YmxpY0tleU9yVW5pdAAEByRtYXRjaDAFFGZhY3RvcnlBZGRyZXNzT3B0aW9uAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAmZhBQckbWF0Y2gwBAckbWF0Y2gxCQCdCAIFAmZhCQETa2V5TWFuYWdlclB1YmxpY0tleQADCQABAgUHJG1hdGNoMQIGU3RyaW5nBANwdWIFByRtYXRjaDEJANkEAQUDcHViBQR1bml0BQR1bml0AQtvbmx5QWRkcmVzcwIBaQdhZGRyZXNzAwkAAAIIBQFpBmNhbGxlcgUHYWRkcmVzcwYJAQh0aHJvd0VycgECEXBlcm1pc3Npb24gZGVuaWVkAQtvbmx5RmFjdG9yeQEBaQkBC29ubHlBZGRyZXNzAgUBaQUUZmFjdG9yeUFkZHJlc3NPckZhaWwBD3Jld2FyZEZvck9wdGlvbgIHcmV3YXJkcwZ0YXJnZXQEAXMJAJADAQUHcmV3YXJkcwQLJHQwNDYyOTQ2NTQJAJEDAgUHcmV3YXJkcwAABAJhMAgFCyR0MDQ2Mjk0NjU0Al8xBAJyMAgFCyR0MDQ2Mjk0NjU0Al8yBAskdDA0NjU3NDY4MgkAkQMCBQdyZXdhcmRzAAEEAmExCAULJHQwNDY1NzQ2ODICXzEEAnIxCAULJHQwNDY1NzQ2ODICXzIECyR0MDQ2ODU0NzEwCQCRAwIFB3Jld2FyZHMAAgQCYTIIBQskdDA0Njg1NDcxMAJfMQQCcjIIBQskdDA0Njg1NDcxMAJfMgMDCQBmAgUBcwAACQAAAgUCYTAFBnRhcmdldAcFAnIwAwMJAGYCBQFzAAEJAAACBQJhMQUGdGFyZ2V0BwUCcjEDAwkAZgIFAXMAAgkAAAIFAmEyBQZ0YXJnZXQHBQJyMgUEdW5pdAcBaQEHY2xhaW1MUAEQdXNlckFkZHJlc3NCeXRlcwQLY2hlY2tDYWxsZXIJAQtvbmx5RmFjdG9yeQEFAWkDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyBAt1c2VyQWRkcmVzcwkBB0FkZHJlc3MBBRB1c2VyQWRkcmVzc0J5dGVzBAlhdmFpbGFibGUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJAQxrZXlBdmFpbGFibGUBBQt1c2VyQWRkcmVzcwAABAdjbGFpbWVkCQELdmFsdWVPckVsc2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEKa2V5Q2xhaW1lZAEFC3VzZXJBZGRyZXNzAAAEDmZhY3RvcnlBY3Rpb25zAwkAZgIFCWF2YWlsYWJsZQAACQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDXRyYW5zZmVyQXNzZXQJAMwIAgUQdXNlckFkZHJlc3NCeXRlcwkAzAgCBQlhdmFpbGFibGUJAMwIAgUPbHBBc3NldElkT3JGYWlsBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBDGtleUF2YWlsYWJsZQEFC3VzZXJBZGRyZXNzCQDMCAIAAAUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIMaW50ZWdlckVudHJ5CQDMCAIJAQprZXlDbGFpbWVkAQULdXNlckFkZHJlc3MJAMwIAgkAZAIFB2NsYWltZWQFCWF2YWlsYWJsZQUDbmlsBQNuaWwFA25pbAkBCHRocm93RXJyAQIQbm90aGluZyB0byBjbGFpbQkAlAoCBQNuaWwFDmZhY3RvcnlBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGZpbmFsaXplBBB1c2VyQWRkcmVzc0J5dGVzGG5ld1RyZWFzdXJ5Vm9sdW1lSW5XYXZlcxdwd3JNYW5hZ2Vyc0JvbnVzSW5XYXZlcyB0cmVhc3VyeVZvbHVtZURpZmZBbGxvY2F0aW9uQ29lZgQLY2hlY2tDYWxsZXIJAQtvbmx5RmFjdG9yeQEFAWkDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyBBNjdXJyZW50UGVyaW9kT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARBrZXlDdXJyZW50UGVyaW9kAAkBB3dyYXBFcnIBAg5pbnZhbGlkIHBlcmlvZAQMcGVyaW9kTGVuZ3RoCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJAQ9rZXlQZXJpb2RMZW5ndGgACQEHd3JhcEVycgECFWludmFsaWQgcGVyaW9kIGxlbmd0aAQSY3VycmVudFN0YXJ0SGVpZ2h0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJAQ5rZXlTdGFydEhlaWdodAEFE2N1cnJlbnRQZXJpb2RPckZhaWwJAQd3cmFwRXJyAQIUaW52YWxpZCBzdGFydCBoZWlnaHQEEmN1cnJlbnRQcmljZU9yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQERa2V5UHJpY2VGb3JQZXJpb2QBBRNjdXJyZW50UGVyaW9kT3JGYWlsCQEHd3JhcEVycgECDWludmFsaWQgcHJpY2UEEm5leHRCbG9ja1RvUHJvY2VzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEVa2V5TmV4dEJsb2NrVG9Qcm9jZXNzAAkBB3dyYXBFcnIBAh1pbnZhbGlkIG5leHQgYmxvY2sgdG8gcHJvY2VzcwQPcGVyaW9kRW5kSGVpZ2h0CQBlAgkAZAIFEmN1cnJlbnRTdGFydEhlaWdodAUMcGVyaW9kTGVuZ3RoAAEEBmNoZWNrcwkAzAgCAwkAAAIIBQFpDG9yaWdpbkNhbGxlcgUZbWFpblRyZWFzdXJ5QWRkcmVzc09yRmFpbAYJAQh0aHJvd0VycgECEXBlcm1pc3Npb24gZGVuaWVkCQDMCAIDCQBmAgUSbmV4dEJsb2NrVG9Qcm9jZXNzBQ9wZXJpb2RFbmRIZWlnaHQGCQEIdGhyb3dFcnIBAhJ1bnByb2Nlc3NlZCBibG9ja3MJAMwIAgMJAGcCBRhuZXdUcmVhc3VyeVZvbHVtZUluV2F2ZXMAAAYJAQh0aHJvd0VycgECG2ludmFsaWQgbmV3IHRyZWFzdXJ5IHZvbHVtZQkAzAgCAwkAZwIFF3B3ck1hbmFnZXJzQm9udXNJbldhdmVzAAAGCQEIdGhyb3dFcnIBAhppbnZhbGlkIFBXUiBtYW5hZ2VycyBib251cwkAzAgCAwMJAGcCBSB0cmVhc3VyeVZvbHVtZURpZmZBbGxvY2F0aW9uQ29lZgkBAS0BBQZTQ0FMRTgJAGcCBQZTQ0FMRTgFIHRyZWFzdXJ5Vm9sdW1lRGlmZkFsbG9jYXRpb25Db2VmBwYJAQh0aHJvd0VycgECM2ludmFsaWQgdHJlYXN1cnkgdm9sdW1lIGRpZmYgYWxsb2NhdGlvbiBjb2VmZmljaWVudAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBBJkb25hdGVkV2F2ZXNBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJAQprZXlEb25hdGVkAQUEdW5pdAAABBNpbnZlc3RlZFdhdmVzQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQELa2V5SW52ZXN0ZWQBBQR1bml0AAAEHGN1cnJlbnRUcmVhc3VyeVZvbHVtZUluV2F2ZXMJAGQCBRJkb25hdGVkV2F2ZXNBbW91bnQFE2ludmVzdGVkV2F2ZXNBbW91bnQECXByb2ZpdFJhdwkAZQIFGG5ld1RyZWFzdXJ5Vm9sdW1lSW5XYXZlcwUcY3VycmVudFRyZWFzdXJ5Vm9sdW1lSW5XYXZlcwQWcHdyTWFuYWdlcnNCb251c0Ftb3VudAMDCQBmAgUJcHJvZml0UmF3AAAJAGcCBQlwcm9maXRSYXcFF3B3ck1hbmFnZXJzQm9udXNJbldhdmVzBwUXcHdyTWFuYWdlcnNCb251c0luV2F2ZXMAAAQGcHJvZml0CQBlAgUJcHJvZml0UmF3BRZwd3JNYW5hZ2Vyc0JvbnVzQW1vdW50BAxkb25hdGlvblBhcnQDCQBmAgUcY3VycmVudFRyZWFzdXJ5Vm9sdW1lSW5XYXZlcwAACQBrAwUSZG9uYXRlZFdhdmVzQW1vdW50BQZTQ0FMRTgFHGN1cnJlbnRUcmVhc3VyeVZvbHVtZUluV2F2ZXMAAAQVZG9uYXRpb25Qcm9maXRQYXJ0UmF3CQBrAwUGcHJvZml0BQxkb25hdGlvblBhcnQFBlNDQUxFOAQXaW52ZXN0bWVudFByb2ZpdFBhcnRSYXcJAGUCBQZwcm9maXQFFWRvbmF0aW9uUHJvZml0UGFydFJhdwQjdHJlYXN1cnlWb2x1bWVEaWZmQWxsb2NhdGlvbkNvZWZBYnMJAQNhYnMBBSB0cmVhc3VyeVZvbHVtZURpZmZBbGxvY2F0aW9uQ29lZgQQYW1vdW50VG9Eb25hdGlvbgkAawMFF2ludmVzdG1lbnRQcm9maXRQYXJ0UmF3AwkAZgIAAAUgdHJlYXN1cnlWb2x1bWVEaWZmQWxsb2NhdGlvbkNvZWYFI3RyZWFzdXJ5Vm9sdW1lRGlmZkFsbG9jYXRpb25Db2VmQWJzAAAFBlNDQUxFOAQSYW1vdW50VG9JbnZlc3RtZW50CQBrAwUVZG9uYXRpb25Qcm9maXRQYXJ0UmF3AwkAZgIFIHRyZWFzdXJ5Vm9sdW1lRGlmZkFsbG9jYXRpb25Db2VmAAAFI3RyZWFzdXJ5Vm9sdW1lRGlmZkFsbG9jYXRpb25Db2VmQWJzAAAFBlNDQUxFOAQSZG9uYXRpb25Qcm9maXRQYXJ0CQBkAgkAZQIFFWRvbmF0aW9uUHJvZml0UGFydFJhdwUSYW1vdW50VG9JbnZlc3RtZW50BRBhbW91bnRUb0RvbmF0aW9uBBRpbnZlc3RtZW50UHJvZml0UGFydAkAZAIJAGUCBRdpbnZlc3RtZW50UHJvZml0UGFydFJhdwUQYW1vdW50VG9Eb25hdGlvbgUSYW1vdW50VG9JbnZlc3RtZW50BBhkb25hdGVkV2F2ZXNBbW91bnROZXdSYXcJAGQCBRJkb25hdGVkV2F2ZXNBbW91bnQFEmRvbmF0aW9uUHJvZml0UGFydAQZaW52ZXN0ZWRXYXZlc0Ftb3VudE5ld1JhdwkAZAIFE2ludmVzdGVkV2F2ZXNBbW91bnQFFGludmVzdG1lbnRQcm9maXRQYXJ0BA9kb25hdGVkUGFydERlYnQJAJcDAQkAzAgCAAAJAMwIAgUYZG9uYXRlZFdhdmVzQW1vdW50TmV3UmF3BQNuaWwEEGludmVzdGVkUGFydERlYnQJAJcDAQkAzAgCAAAJAMwIAgUZaW52ZXN0ZWRXYXZlc0Ftb3VudE5ld1JhdwUDbmlsBBVkb25hdGVkV2F2ZXNBbW91bnROZXcJAGQCCQCWAwEJAMwIAgAACQDMCAIFGGRvbmF0ZWRXYXZlc0Ftb3VudE5ld1JhdwUDbmlsBRBpbnZlc3RlZFBhcnREZWJ0BBZpbnZlc3RlZFdhdmVzQW1vdW50TmV3CQBkAgkAlgMBCQDMCAIAAAkAzAgCBRlpbnZlc3RlZFdhdmVzQW1vdW50TmV3UmF3BQNuaWwFD2RvbmF0ZWRQYXJ0RGVidAQJbmV3UGVyaW9kCQBkAgUTY3VycmVudFBlcmlvZE9yRmFpbAABBA9scEFzc2V0UXVhbnRpdHkICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUPbHBBc3NldElkT3JGYWlsCQEHd3JhcEVycgECFGludmFsaWQgbHBBc3NldCBpbmZvCHF1YW50aXR5BAhuZXdQcmljZQkAawMFFmludmVzdGVkV2F2ZXNBbW91bnROZXcFBlNDQUxFOAUPbHBBc3NldFF1YW50aXR5BBNscEFzc2V0QW1vdW50VG9CdXJuCQELdmFsdWVPckVsc2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQENa2V5V2l0aGRyYXdhbAAAAAQQcGF5bWVudEFtb3VudE1pbgkAlgMBCQDMCAIAAAkAzAgCCQBrAwUTbHBBc3NldEFtb3VudFRvQnVybgUIbmV3UHJpY2UFBlNDQUxFOAUDbmlsBA1wYXltZW50T3B0aW9uAwkAZgIJAJADAQgFAWkIcGF5bWVudHMAAAkAkQMCCAUBaQhwYXltZW50cwAABQR1bml0BA1wYXltZW50QW1vdW50CAkBBXZhbHVlAQUNcGF5bWVudE9wdGlvbgZhbW91bnQEDnBheW1lbnRBc3NldElkCAkBBXZhbHVlAQUNcGF5bWVudE9wdGlvbgdhc3NldElkBAxjaGVja1BheW1lbnQDAwkAAAIFEHBheW1lbnRBbW91bnRNaW4AAAYDAwkBAiE9AgUNcGF5bWVudE9wdGlvbgUEdW5pdAkAAAIFDnBheW1lbnRBc3NldElkBQR1bml0BwkAZwIFDXBheW1lbnRBbW91bnQFEHBheW1lbnRBbW91bnRNaW4HBgkBCHRocm93RXJyAQkArAICAiZpbnZhbGlkIHBheW1lbnRzLCBwYXltZW50IGFtb3VudCBtaW46IAkApAMBBRBwYXltZW50QW1vdW50TWluAwkAAAIFDGNoZWNrUGF5bWVudAUMY2hlY2tQYXltZW50BBNjaGVja0lmUHJpY2VOb3RaZXJvAwkBAiE9AgUIbmV3UHJpY2UAAAYJAQh0aHJvd0VycgECFExQIHByaWNlIGNhbm5vdCBiZSAwAwkAAAIFE2NoZWNrSWZQcmljZU5vdFplcm8FE2NoZWNrSWZQcmljZU5vdFplcm8EB2FjdGlvbnMDCQECIT0CBQ1wYXltZW50T3B0aW9uBQR1bml0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFFGZhY3RvcnlBZGRyZXNzT3JGYWlsBQ1wYXltZW50QW1vdW50BQ5wYXltZW50QXNzZXRJZAUDbmlsBQNuaWwEDmZhY3RvcnlBY3Rpb25zCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDGludGVnZXJFbnRyeQkAzAgCCQEQa2V5Q3VycmVudFBlcmlvZAAJAMwIAgUJbmV3UGVyaW9kBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBEWtleVByaWNlRm9yUGVyaW9kAQUJbmV3UGVyaW9kCQDMCAIFCG5ld1ByaWNlBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBDmtleVN0YXJ0SGVpZ2h0AQUJbmV3UGVyaW9kCQDMCAIJAGQCBQ9wZXJpb2RFbmRIZWlnaHQAAQUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIEYnVybgkAzAgCBRNscEFzc2V0QW1vdW50VG9CdXJuBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBDWtleVdpdGhkcmF3YWwACQDMCAIAAAUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIMaW50ZWdlckVudHJ5CQDMCAIJAQtrZXlJbnZlc3RlZAEFBHVuaXQJAMwIAgUWaW52ZXN0ZWRXYXZlc0Ftb3VudE5ldwUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIMaW50ZWdlckVudHJ5CQDMCAIJAQprZXlEb25hdGVkAQUEdW5pdAkAzAgCBRVkb25hdGVkV2F2ZXNBbW91bnROZXcFA25pbAUDbmlsBQNuaWwJAJQKAgUHYWN0aW9ucwUOZmFjdG9yeUFjdGlvbnMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEGaW52ZXN0ARB1c2VyQWRkcmVzc0J5dGVzBAtjaGVja0NhbGxlcgkBC29ubHlGYWN0b3J5AQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIEC3VzZXJBZGRyZXNzCQEHQWRkcmVzcwEFEHVzZXJBZGRyZXNzQnl0ZXMEE2N1cnJlbnRQZXJpb2RPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBEGtleUN1cnJlbnRQZXJpb2QACQEHd3JhcEVycgECDmludmFsaWQgcGVyaW9kBBJjdXJyZW50UHJpY2VPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBEWtleVByaWNlRm9yUGVyaW9kAQUTY3VycmVudFBlcmlvZE9yRmFpbAkBB3dyYXBFcnIBAg1pbnZhbGlkIHByaWNlBAdwYXltZW50AwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQkAkQMCCAUBaQhwYXltZW50cwAACQEIdGhyb3dFcnIBAhBpbnZhbGlkIHBheW1lbnRzBA0kdDAxMTY3NzExODU0AwMJAAACCAUHcGF5bWVudAdhc3NldElkBQR1bml0CQBmAggFB3BheW1lbnQGYW1vdW50AAAHCQCUCgIIBQdwYXltZW50BmFtb3VudAgFB3BheW1lbnQHYXNzZXRJZAkBCHRocm93RXJyAQIWaW52YWxpZCBwYXltZW50IGFtb3VudAQNcGF5bWVudEFtb3VudAgFDSR0MDExNjc3MTE4NTQCXzEEDnBheW1lbnRBc3NldElkCAUNJHQwMTE2NzcxMTg1NAJfMgQNbHBBc3NldEFtb3VudAMJAGYCBRJjdXJyZW50UHJpY2VPckZhaWwAAAkAawMFDXBheW1lbnRBbW91bnQFBlNDQUxFOAUSY3VycmVudFByaWNlT3JGYWlsAAAECGludmVzdGVkCQELdmFsdWVPckVsc2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQELa2V5SW52ZXN0ZWQBBQR1bml0AAAEB2FjdGlvbnMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUZbWFpblRyZWFzdXJ5QWRkcmVzc09yRmFpbAUNcGF5bWVudEFtb3VudAUOcGF5bWVudEFzc2V0SWQFA25pbAQOZmFjdG9yeUFjdGlvbnMJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIMaW50ZWdlckVudHJ5CQDMCAIJAQtrZXlJbnZlc3RlZAEFBHVuaXQJAMwIAgkAZAIFCGludmVzdGVkBQ1wYXltZW50QW1vdW50BQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgdyZWlzc3VlCQDMCAIFDWxwQXNzZXRBbW91bnQFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDXRyYW5zZmVyQXNzZXQJAMwIAgUQdXNlckFkZHJlc3NCeXRlcwkAzAgCBQ1scEFzc2V0QW1vdW50CQDMCAIFD2xwQXNzZXRJZE9yRmFpbAUDbmlsBQNuaWwFA25pbAkAlAoCBQdhY3Rpb25zBQ5mYWN0b3J5QWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQh3aXRoZHJhdwEQdXNlckFkZHJlc3NCeXRlcwQLY2hlY2tDYWxsZXIJAQtvbmx5RmFjdG9yeQEFAWkDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyBAt1c2VyQWRkcmVzcwkBB0FkZHJlc3MBBRB1c2VyQWRkcmVzc0J5dGVzBBNjdXJyZW50UGVyaW9kT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARBrZXlDdXJyZW50UGVyaW9kAAkBB3dyYXBFcnIBAg5pbnZhbGlkIHBlcmlvZAQHcGF5bWVudAMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEJAJEDAggFAWkIcGF5bWVudHMAAAkBCHRocm93RXJyAQkBB3dyYXBFcnIBAhBpbnZhbGlkIHBheW1lbnRzBA5wYXltZW50QXNzZXRJZAMJAAACCAUHcGF5bWVudAdhc3NldElkBQ9scEFzc2V0SWRPckZhaWwFD2xwQXNzZXRJZE9yRmFpbAkBCHRocm93RXJyAQIVaW52YWxpZCBwYXltZW50IGFzc2V0BA1wYXltZW50QW1vdW50AwkAZgIIBQdwYXltZW50BmFtb3VudAAACAUHcGF5bWVudAZhbW91bnQJAQh0aHJvd0VycgECFmludmFsaWQgcGF5bWVudCBhbW91bnQECndpdGhkcmF3YWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJAQ1rZXlXaXRoZHJhd2FsAAAABAdhY3Rpb25zCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFFGZhY3RvcnlBZGRyZXNzT3JGYWlsBQ1wYXltZW50QW1vdW50BQ5wYXltZW50QXNzZXRJZAUDbmlsBA5mYWN0b3J5QWN0aW9ucwkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBDWtleVdpdGhkcmF3YWwACQDMCAIJAGQCBQp3aXRoZHJhd2FsBQ1wYXltZW50QW1vdW50BQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgtzdHJpbmdFbnRyeQkAzAgCCQEUa2V5V2l0aGRyYXdhbFJlcXVlc3QCBQt1c2VyQWRkcmVzcwgFAWkNdHJhbnNhY3Rpb25JZAkAzAgCCQEWdmFsdWVXaXRoZHJhd2FsUmVxdWVzdAQFB1BFTkRJTkcFDXBheW1lbnRBbW91bnQJAGQCBRNjdXJyZW50UGVyaW9kT3JGYWlsAAEFBHVuaXQFA25pbAUDbmlsBQNuaWwDCQAAAgUOZmFjdG9yeUFjdGlvbnMFDmZhY3RvcnlBY3Rpb25zCQCUCgIFB2FjdGlvbnMFDmZhY3RvcnlBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmNhbmNlbFdpdGhkcmF3AhB1c2VyQWRkcmVzc0J5dGVzBHR4SWQEC2NoZWNrQ2FsbGVyCQELb25seUZhY3RvcnkBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQLdXNlckFkZHJlc3MJAQdBZGRyZXNzAQUQdXNlckFkZHJlc3NCeXRlcwQXd2l0aGRyYXdhbFJlcXVlc3RPcHRpb24JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBFGtleVdpdGhkcmF3YWxSZXF1ZXN0AgULdXNlckFkZHJlc3MFBHR4SWQJAQd3cmFwRXJyAQIaaW52YWxpZCB3aXRoZHJhd2FsIHJlcXVlc3QEE2N1cnJlbnRQZXJpb2RPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBEGtleUN1cnJlbnRQZXJpb2QACQEHd3JhcEVycgECDmludmFsaWQgcGVyaW9kBA0kdDAxNDI2MTE0Mzc0CQEhcGFyc2VXaXRoZHJhd2FsUmVxdWVzdFZhbHVlT3JGYWlsAQUXd2l0aGRyYXdhbFJlcXVlc3RPcHRpb24EBnN0YXR1cwgFDSR0MDE0MjYxMTQzNzQCXzEEDWxwQXNzZXRBbW91bnQIBQ0kdDAxNDI2MTE0Mzc0Al8yBAx0YXJnZXRQZXJpb2QIBQ0kdDAxNDI2MTE0Mzc0Al8zBAljbGFpbVR4SWQIBQ0kdDAxNDI2MTE0Mzc0Al80BAZjaGVja3MJAMwIAgMJAAACBQZzdGF0dXMFB1BFTkRJTkcGCQEIdGhyb3dFcnIBAiFpbnZhbGlkIHdpdGhkcmF3YWwgcmVxdWVzdCBzdGF0dXMJAMwIAgMJAGYCBQx0YXJnZXRQZXJpb2QFE2N1cnJlbnRQZXJpb2RPckZhaWwGCQEIdGhyb3dFcnIBAiFpbnZhbGlkIHdpdGhkcmF3YWwgcmVxdWVzdCBwZXJpb2QFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQKd2l0aGRyYXdhbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQENa2V5V2l0aGRyYXdhbAAJAQd3cmFwRXJyAQIfaW52YWxpZCB0b3RhbCB3aXRoZHJhd2FsIGFtb3VudAQOZmFjdG9yeUFjdGlvbnMJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIMaW50ZWdlckVudHJ5CQDMCAIJAQ1rZXlXaXRoZHJhd2FsAAkAzAgCAwkAZwIFCndpdGhkcmF3YWwFDWxwQXNzZXRBbW91bnQJAGUCBQp3aXRoZHJhd2FsBQ1scEFzc2V0QW1vdW50CQEIdGhyb3dFcnIBAhlpbnZhbGlkIHdpdGhkcmF3YWwgYW1vdW50BQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgtkZWxldGVFbnRyeQkAzAgCCQEUa2V5V2l0aGRyYXdhbFJlcXVlc3QCBQt1c2VyQWRkcmVzcwUEdHhJZAUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAINdHJhbnNmZXJBc3NldAkAzAgCBRB1c2VyQWRkcmVzc0J5dGVzCQDMCAIFDWxwQXNzZXRBbW91bnQJAMwIAgUPbHBBc3NldElkT3JGYWlsBQNuaWwFA25pbAUDbmlsAwkAAAIFDmZhY3RvcnlBY3Rpb25zBQ5mYWN0b3J5QWN0aW9ucwkAlAoCBQNuaWwFDmZhY3RvcnlBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCmNsYWltV2F2ZXMCEHVzZXJBZGRyZXNzQnl0ZXMEdHhJZAQLY2hlY2tDYWxsZXIJAQtvbmx5RmFjdG9yeQEFAWkDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyBAt1c2VyQWRkcmVzcwkBB0FkZHJlc3MBBRB1c2VyQWRkcmVzc0J5dGVzBBNjdXJyZW50UGVyaW9kT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARBrZXlDdXJyZW50UGVyaW9kAAkBB3dyYXBFcnIBAg5pbnZhbGlkIHBlcmlvZAQXd2l0aGRyYXdhbFJlcXVlc3RPcHRpb24JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBFGtleVdpdGhkcmF3YWxSZXF1ZXN0AgULdXNlckFkZHJlc3MFBHR4SWQJAQd3cmFwRXJyAQIaaW52YWxpZCB3aXRoZHJhd2FsIHJlcXVlc3QEDSR0MDE1NzA2MTU4MTkJASFwYXJzZVdpdGhkcmF3YWxSZXF1ZXN0VmFsdWVPckZhaWwBBRd3aXRoZHJhd2FsUmVxdWVzdE9wdGlvbgQGc3RhdHVzCAUNJHQwMTU3MDYxNTgxOQJfMQQNbHBBc3NldEFtb3VudAgFDSR0MDE1NzA2MTU4MTkCXzIEDHRhcmdldFBlcmlvZAgFDSR0MDE1NzA2MTU4MTkCXzMECWNsYWltVHhJZAgFDSR0MDE1NzA2MTU4MTkCXzQDCQAAAgUGc3RhdHVzBQhGSU5JU0hFRAkBCHRocm93RXJyAQIhaW52YWxpZCB3aXRoZHJhd2FsIHJlcXVlc3Qgc3RhdHVzAwkAZgIFDHRhcmdldFBlcmlvZAUTY3VycmVudFBlcmlvZE9yRmFpbAkBCHRocm93RXJyAQIhaW52YWxpZCB3aXRoZHJhd2FsIHJlcXVlc3QgcGVyaW9kBAtwcmljZU9yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQERa2V5UHJpY2VGb3JQZXJpb2QBBQx0YXJnZXRQZXJpb2QJAQd3cmFwRXJyAQINaW52YWxpZCBwcmljZQQGYW1vdW50AwkAZgIFC3ByaWNlT3JGYWlsAAAJAGsDBQ1scEFzc2V0QW1vdW50BQtwcmljZU9yRmFpbAUGU0NBTEU4AAAEDmZhY3RvcnlBY3Rpb25zCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCC3N0cmluZ0VudHJ5CQDMCAIJARRrZXlXaXRoZHJhd2FsUmVxdWVzdAIFC3VzZXJBZGRyZXNzBQR0eElkCQDMCAIJARZ2YWx1ZVdpdGhkcmF3YWxSZXF1ZXN0BAUIRklOSVNIRUQFDWxwQXNzZXRBbW91bnQFDHRhcmdldFBlcmlvZAgFAWkNdHJhbnNhY3Rpb25JZAUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAINdHJhbnNmZXJXYXZlcwkAzAgCBRB1c2VyQWRkcmVzc0J5dGVzCQDMCAIFBmFtb3VudAUDbmlsBQNuaWwFA25pbAkAlAoCBQNuaWwFDmZhY3RvcnlBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDXByb2Nlc3NCbG9ja3MBEHVzZXJBZGRyZXNzQnl0ZXMEC2NoZWNrQ2FsbGVyCQELb25seUZhY3RvcnkBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQLdXNlckFkZHJlc3MJAQdBZGRyZXNzAQUQdXNlckFkZHJlc3NCeXRlcwQTY3VycmVudFBlcmlvZE9yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEQa2V5Q3VycmVudFBlcmlvZAAJAQd3cmFwRXJyAQIOaW52YWxpZCBwZXJpb2QEDHBlcmlvZExlbmd0aAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEPa2V5UGVyaW9kTGVuZ3RoAAkBB3dyYXBFcnIBAhVpbnZhbGlkIHBlcmlvZCBsZW5ndGgEEmN1cnJlbnRTdGFydEhlaWdodAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEOa2V5U3RhcnRIZWlnaHQBBRNjdXJyZW50UGVyaW9kT3JGYWlsCQEHd3JhcEVycgECFGludmFsaWQgc3RhcnQgaGVpZ2h0BBJjdXJyZW50UHJpY2VPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBEWtleVByaWNlRm9yUGVyaW9kAQUTY3VycmVudFBlcmlvZE9yRmFpbAkBB3dyYXBFcnIBAg1pbnZhbGlkIHByaWNlBBJuZXh0QmxvY2tUb1Byb2Nlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBFWtleU5leHRCbG9ja1RvUHJvY2VzcwAJAQd3cmFwRXJyAQIdaW52YWxpZCBuZXh0IGJsb2NrIHRvIHByb2Nlc3MED3BlcmlvZEVuZEhlaWdodAkAZQIJAGQCBRJjdXJyZW50U3RhcnRIZWlnaHQFDHBlcmlvZExlbmd0aAABBBxibG9ja3NQcm9jZXNzaW5nQmF0Y2hTaXplTWF4ACgEGWJsb2Nrc1Byb2Nlc3NpbmdCYXRjaFNpemUDAwMJAGcCBQZoZWlnaHQFEm5leHRCbG9ja1RvUHJvY2VzcwMJAGcCBRJuZXh0QmxvY2tUb1Byb2Nlc3MFEmN1cnJlbnRTdGFydEhlaWdodAYJAAACBRNjdXJyZW50UGVyaW9kT3JGYWlsAAAHCQBnAgUPcGVyaW9kRW5kSGVpZ2h0BRJuZXh0QmxvY2tUb1Byb2Nlc3MHCQCXAwEJAMwIAgkAZAIJAGUCBQ9wZXJpb2RFbmRIZWlnaHQFEm5leHRCbG9ja1RvUHJvY2VzcwABCQDMCAIFHGJsb2Nrc1Byb2Nlc3NpbmdCYXRjaFNpemVNYXgFA25pbAkBCHRocm93RXJyAQkBB3dyYXBFcnIBAhRpbnZhbGlkIHRhcmdldCBibG9jawQVYmxvY2tQcm9jZXNzaW5nUmV3YXJkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARhrZXlCbG9ja1Byb2Nlc3NpbmdSZXdhcmQACQEHd3JhcEVycgECH2ludmFsaWQgYmxvY2sgcHJvY2Vzc2luZyByZXdhcmQEIGJsb2NrUHJvY2Vzc2luZ1Jld2FyZEJ5R2VuZXJhdG9yCQBpAgUVYmxvY2tQcm9jZXNzaW5nUmV3YXJkBRlibG9ja3NQcm9jZXNzaW5nQmF0Y2hTaXplBClibG9ja1Byb2Nlc3NpbmdSZXdhcmRCeUdlbmVyYXRvclJlbWFpbmRlcgkAZQIFFWJsb2NrUHJvY2Vzc2luZ1Jld2FyZAkAaAIFIGJsb2NrUHJvY2Vzc2luZ1Jld2FyZEJ5R2VuZXJhdG9yBRlibG9ja3NQcm9jZXNzaW5nQmF0Y2hTaXplCgEDbWFwAgNhY2MDaW5jAwkAZwIFA2luYwUZYmxvY2tzUHJvY2Vzc2luZ0JhdGNoU2l6ZQUDYWNjBBF0YXJnZXRCbG9ja0hlaWdodAkAZAIFEm5leHRCbG9ja1RvUHJvY2VzcwUDaW5jBA90YXJnZXRCbG9ja0luZm8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7QcBBRF0YXJnZXRCbG9ja0hlaWdodAkBB3dyYXBFcnIBAhJpbnZhbGlkIGJsb2NrIGluZm8EFHRyZWFzdXJ5UmV3YXJkT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAQ9yZXdhcmRGb3JPcHRpb24CCAUPdGFyZ2V0QmxvY2tJbmZvB3Jld2FyZHMFGnByb3h5VHJlYXN1cnlBZGRyZXNzT3JGYWlsCQEHd3JhcEVycgEJAKwCAgIjaW52YWxpZCB0cmVhc3VyeSByZXdhcmQgZm9yIGhlaWdodCAJAKQDAQURdGFyZ2V0QmxvY2tIZWlnaHQECWdlbmVyYXRvcggFD3RhcmdldEJsb2NrSW5mbwlnZW5lcmF0b3IECWF2YWlsYWJsZQkBC3ZhbHVlT3JFbHNlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBDGtleUF2YWlsYWJsZQEFCWdlbmVyYXRvcgAABAxjYWxsZXJSZXdhcmQDCQAAAgUDaW5jCQBlAgUZYmxvY2tzUHJvY2Vzc2luZ0JhdGNoU2l6ZQABCQBkAgUgYmxvY2tQcm9jZXNzaW5nUmV3YXJkQnlHZW5lcmF0b3IFKWJsb2NrUHJvY2Vzc2luZ1Jld2FyZEJ5R2VuZXJhdG9yUmVtYWluZGVyBSBibG9ja1Byb2Nlc3NpbmdSZXdhcmRCeUdlbmVyYXRvcgQNbHBBc3NldEFtb3VudAMJAGYCBRJjdXJyZW50UHJpY2VPckZhaWwAAAkAawMJAGUCBRR0cmVhc3VyeVJld2FyZE9yRmFpbAUMY2FsbGVyUmV3YXJkBQZTQ0FMRTgFEmN1cnJlbnRQcmljZU9yRmFpbAAABBRmYWN0b3J5QWN0aW9uc1NpbmdsZQkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgtzdHJpbmdFbnRyeQkAzAgCCQERa2V5QmxvY2tQcm9jZXNzZWQBBRF0YXJnZXRCbG9ja0hlaWdodAkAzAgCCQC5CQIJAMwIAgkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQDMCAIJAKQDAQUTY3VycmVudFBlcmlvZE9yRmFpbAkAzAgCCQClCAEFCWdlbmVyYXRvcgkAzAgCCQDYBAEFEHVzZXJBZGRyZXNzQnl0ZXMJAMwIAgkApAMBBRR0cmVhc3VyeVJld2FyZE9yRmFpbAkAzAgCCQCkAwEFDGNhbGxlclJld2FyZAkAzAgCCQCkAwEFDWxwQXNzZXRBbW91bnQFA25pbAUDU0VQBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBDGtleUF2YWlsYWJsZQEFCWdlbmVyYXRvcgkAzAgCCQBkAgUJYXZhaWxhYmxlBQ1scEFzc2V0QW1vdW50BQNuaWwFA25pbAUDbmlsAwkAAAIFFGZhY3RvcnlBY3Rpb25zU2luZ2xlBRRmYWN0b3J5QWN0aW9uc1NpbmdsZQQNJHQwMjAwNTUyMDA4OAUDYWNjBApscEFzc2V0QWNjCAUNJHQwMjAwNTUyMDA4OAJfMQQJcmV3YXJkQWNjCAUNJHQwMjAwNTUyMDA4OAJfMgkAlAoCCQBkAgUKbHBBc3NldEFjYwUNbHBBc3NldEFtb3VudAkAZAIFCXJld2FyZEFjYwUUdHJlYXN1cnlSZXdhcmRPckZhaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EBGxpc3QJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsJAMwIAgAMCQDMCAIADQkAzAgCAA4JAMwIAgAPCQDMCAIAEAkAzAgCABEJAMwIAgASCQDMCAIAEwkAzAgCABQJAMwIAgAVCQDMCAIAFgkAzAgCABcJAMwIAgAYCQDMCAIAGQkAzAgCABoJAMwIAgAbCQDMCAIAHAkAzAgCAB0JAMwIAgAeCQDMCAIAHwkAzAgCACAJAMwIAgAhCQDMCAIAIgkAzAgCACMJAMwIAgAkCQDMCAIAJQkAzAgCACYJAMwIAgAnBQNuaWwEDSR0MDIwMzU1MjA0MzEKAAIkbAUEbGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAAAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBA21hcAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNDAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAMJAAACBQ0kdDAyMDM1NTIwNDMxBQ0kdDAyMDM1NTIwNDMxBBFyZXdhcmRBbW91bnRUb3RhbAgFDSR0MDIwMzU1MjA0MzECXzIEEmxwQXNzZXRBbW91bnRUb3RhbAgFDSR0MDIwMzU1MjA0MzECXzEEGnJld2FyZFRvTWFpblRyZWFzdXJ5QW1vdW50CQBlAgURcmV3YXJkQW1vdW50VG90YWwFFWJsb2NrUHJvY2Vzc2luZ1Jld2FyZAQIaW52ZXN0ZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJAQtrZXlJbnZlc3RlZAEFBHVuaXQAAAQHYWN0aW9ucwkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgdyZWlzc3VlCQDMCAIFEmxwQXNzZXRBbW91bnRUb3RhbAUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIMaW50ZWdlckVudHJ5CQDMCAIJARVrZXlOZXh0QmxvY2tUb1Byb2Nlc3MACQDMCAIJAGQCBRJuZXh0QmxvY2tUb1Byb2Nlc3MFGWJsb2Nrc1Byb2Nlc3NpbmdCYXRjaFNpemUFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCGXRyYW5zZmVyRnJvbVByb3h5VHJlYXN1cnkJAMwIAggFGW1haW5UcmVhc3VyeUFkZHJlc3NPckZhaWwFYnl0ZXMJAMwIAgUacmV3YXJkVG9NYWluVHJlYXN1cnlBbW91bnQFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCGXRyYW5zZmVyRnJvbVByb3h5VHJlYXN1cnkJAMwIAgUQdXNlckFkZHJlc3NCeXRlcwkAzAgCBRVibG9ja1Byb2Nlc3NpbmdSZXdhcmQFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDGludGVnZXJFbnRyeQkAzAgCCQELa2V5SW52ZXN0ZWQBBQR1bml0CQDMCAIJAGQCBQhpbnZlc3RlZAUacmV3YXJkVG9NYWluVHJlYXN1cnlBbW91bnQFA25pbAUDbmlsBQNuaWwDCQAAAgUHYWN0aW9ucwUHYWN0aW9ucwkAlAoCBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABAlwdWJsaWNLZXkEByRtYXRjaDAJARlnZXRNYW5hZ2VyUHVibGljS2V5T3JVbml0AAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBANwdWIFByRtYXRjaDAFA3B1YggFAnR4D3NlbmRlclB1YmxpY0tleQkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUJcHVibGljS2V5mq1DaA==", "chainId": 84, "height": 2652633, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: A4MpZkcfD8CUmaNtusZTvkrS9RdWe6CQFGoBxPmQmgdq Next: DZYiVb1nMQ2pJKqCDRp2LPatLbdkTKBQfZLMcZxya4wv Diff:
OldNewDifferences
323323 else throwErr(("invalid payments, payment amount min: " + toString(paymentAmountMin)))
324324 if ((checkPayment == checkPayment))
325325 then {
326- let actions = if ((paymentOption != unit))
327- then [ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId)]
328- else nil
329- let factoryActions = [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), investedWavesAmountNew], nil), invoke(factoryAddressOrFail, "integerEntry", [keyDonated(unit), donatedWavesAmountNew], nil)]
330- $Tuple2(actions, factoryActions)
326+ let checkIfPriceNotZero = if ((newPrice != 0))
327+ then true
328+ else throwErr("LP price cannot be 0")
329+ if ((checkIfPriceNotZero == checkIfPriceNotZero))
330+ then {
331+ let actions = if ((paymentOption != unit))
332+ then [ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId)]
333+ else nil
334+ let factoryActions = [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), investedWavesAmountNew], nil), invoke(factoryAddressOrFail, "integerEntry", [keyDonated(unit), donatedWavesAmountNew], nil)]
335+ $Tuple2(actions, factoryActions)
336+ }
337+ else throw("Strict value is not equal to itself.")
331338 }
332339 else throw("Strict value is not equal to itself.")
333340 }
349356 let payment = if ((size(i.payments) == 1))
350357 then i.payments[0]
351358 else throwErr("invalid payments")
352- let $t01159211769 = if (if ((payment.assetId == unit))
359+ let $t01167711854 = if (if ((payment.assetId == unit))
353360 then (payment.amount > 0)
354361 else false)
355362 then $Tuple2(payment.amount, payment.assetId)
356363 else throwErr("invalid payment amount")
357- let paymentAmount = $t01159211769._1
358- let paymentAssetId = $t01159211769._2
364+ let paymentAmount = $t01167711854._1
365+ let paymentAssetId = $t01167711854._2
359366 let lpAssetAmount = if ((currentPriceOrFail > 0))
360367 then fraction(paymentAmount, SCALE8, currentPriceOrFail)
361368 else 0
405412 let userAddress = Address(userAddressBytes)
406413 let withdrawalRequestOption = valueOrErrorMessage(getString(factoryAddressOrFail, keyWithdrawalRequest(userAddress, txId)), wrapErr("invalid withdrawal request"))
407414 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
408- let $t01417614289 = parseWithdrawalRequestValueOrFail(withdrawalRequestOption)
409- let status = $t01417614289._1
410- let lpAssetAmount = $t01417614289._2
411- let targetPeriod = $t01417614289._3
412- let claimTxId = $t01417614289._4
415+ let $t01426114374 = parseWithdrawalRequestValueOrFail(withdrawalRequestOption)
416+ let status = $t01426114374._1
417+ let lpAssetAmount = $t01426114374._2
418+ let targetPeriod = $t01426114374._3
419+ let claimTxId = $t01426114374._4
413420 let checks = [if ((status == PENDING))
414421 then true
415422 else throwErr("invalid withdrawal request status"), if ((targetPeriod > currentPeriodOrFail))
440447 let userAddress = Address(userAddressBytes)
441448 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
442449 let withdrawalRequestOption = valueOrErrorMessage(getString(factoryAddressOrFail, keyWithdrawalRequest(userAddress, txId)), wrapErr("invalid withdrawal request"))
443- let $t01562115734 = parseWithdrawalRequestValueOrFail(withdrawalRequestOption)
444- let status = $t01562115734._1
445- let lpAssetAmount = $t01562115734._2
446- let targetPeriod = $t01562115734._3
447- let claimTxId = $t01562115734._4
450+ let $t01570615819 = parseWithdrawalRequestValueOrFail(withdrawalRequestOption)
451+ let status = $t01570615819._1
452+ let lpAssetAmount = $t01570615819._2
453+ let targetPeriod = $t01570615819._3
454+ let claimTxId = $t01570615819._4
448455 if ((status == FINISHED))
449456 then throwErr("invalid withdrawal request status")
450457 else if ((targetPeriod > currentPeriodOrFail))
505512 let factoryActionsSingle = [invoke(factoryAddressOrFail, "stringEntry", [keyBlockProcessed(targetBlockHeight), makeString([toBase58String(i.transactionId), toString(currentPeriodOrFail), toString(generator), toBase58String(userAddressBytes), toString(treasuryRewardOrFail), toString(callerReward), toString(lpAssetAmount)], SEP)], nil), invoke(factoryAddressOrFail, "integerEntry", [keyAvailable(generator), (available + lpAssetAmount)], nil)]
506513 if ((factoryActionsSingle == factoryActionsSingle))
507514 then {
508- let $t01997020003 = acc
509- let lpAssetAcc = $t01997020003._1
510- let rewardAcc = $t01997020003._2
515+ let $t02005520088 = acc
516+ let lpAssetAcc = $t02005520088._1
517+ let rewardAcc = $t02005520088._2
511518 $Tuple2((lpAssetAcc + lpAssetAmount), (rewardAcc + treasuryRewardOrFail))
512519 }
513520 else throw("Strict value is not equal to itself.")
514521 }
515522
516523 let list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39]
517- let $t02027020346 = {
524+ let $t02035520431 = {
518525 let $l = list
519526 let $s = size($l)
520527 let $acc0 = $Tuple2(0, 0)
528535
529536 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40)
530537 }
531- if (($t02027020346 == $t02027020346))
538+ if (($t02035520431 == $t02035520431))
532539 then {
533- let rewardAmountTotal = $t02027020346._2
534- let lpAssetAmountTotal = $t02027020346._1
540+ let rewardAmountTotal = $t02035520431._2
541+ let lpAssetAmountTotal = $t02035520431._1
535542 let rewardToMainTreasuryAmount = (rewardAmountTotal - blockProcessingReward)
536543 let invested = valueOrElse(getInteger(factoryAddressOrFail, keyInvested(unit)), 0)
537544 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, "integerEntry", [keyInvested(unit), (invested + rewardToMainTreasuryAmount)], nil)]
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 FINISHED = "FINISHED"
1313
1414 let WAVES = "WAVES"
1515
1616 func wrapErr (s) = ((CONTRACT_NAME + ": ") + s)
1717
1818
1919 func throwErr (s) = throw(wrapErr(s))
2020
2121
2222 func assetIdToString (assetId) = match assetId {
2323 case b: ByteVector =>
2424 toBase58String(b)
2525 case _: Unit =>
2626 WAVES
2727 case _ =>
2828 throw("Match error")
2929 }
3030
3131
3232 func abs (n) = if ((0 > n))
3333 then -(n)
3434 else n
3535
3636
3737 func keyFactoryAddress () = makeString(["%s", "factory"], SEP)
3838
3939
4040 func keyManagerPublicKey () = makeString(["%s", "managerPublicKey"], SEP)
4141
4242
4343 func keyLpAssetId () = makeString(["%s", "lpAssetId"], SEP)
4444
4545
4646 func keyProxyTreasuryAddress () = makeString(["%s", "proxyTreasury"], SEP)
4747
4848
4949 func keyMainTreasuryAddress () = makeString(["%s", "mainTreasury"], SEP)
5050
5151
5252 func keyInvested (assetId) = makeString(["%s%s", "invested", assetIdToString(assetId)], SEP)
5353
5454
5555 func keyDonated (assetId) = makeString(["%s%s", "donated", assetIdToString(assetId)], SEP)
5656
5757
5858 func keyAvailable (userAddress) = makeString(["%s%s", "available", toString(userAddress)], SEP)
5959
6060
6161 func keyClaimed (userAddress) = makeString(["%s%s", "claimed", toString(userAddress)], SEP)
6262
6363
6464 func keyCurrentPeriod () = makeString(["%s", "currentPeriod"], SEP)
6565
6666
6767 func keyPriceForPeriod (period) = makeString(["%s%d", "price", toString(period)], SEP)
6868
6969
7070 func keyStartHeight (period) = makeString(["%s%d", "startHeight", toString(period)], SEP)
7171
7272
7373 func keyPeriodLength () = "%s__periodLength"
7474
7575
7676 func keyBlockProcessingReward () = "%s__blockProcessingReward"
7777
7878
7979 func keyNextBlockToProcess () = "%s__nextBlockToProcess"
8080
8181
8282 func keyBlockProcessed (height) = makeString(["%s%d", "blockProcessed", toString(height)], SEP)
8383
8484
8585 func keyWithdrawal () = "%s__withdrawal"
8686
8787
8888 func keyWithdrawalRequest (userAddress,txId) = makeString(["%s%s%s", "withdrawal", toString(userAddress), toBase58String(txId)], SEP)
8989
9090
9191 func valueWithdrawalRequest (status,lpAssetAmount,targetPeriod,claimTxId) = {
9292 let claimTxIdStr = match claimTxId {
9393 case b: ByteVector =>
9494 toBase58String(b)
9595 case _: Unit =>
9696 "SOON"
9797 case _ =>
9898 throw("Match error")
9999 }
100100 makeString(["%s%d%d%s", status, toString(lpAssetAmount), toString(targetPeriod), claimTxIdStr], SEP)
101101 }
102102
103103
104104 func parseWithdrawalRequestValueOrFail (s) = {
105105 let parts = split(s, SEP)
106106 if ((size(parts) == 5))
107107 then {
108108 let status = parts[1]
109109 let lpAssetAmount = valueOrErrorMessage(parseInt(parts[2]), wrapErr("invalid lpAssetAmount"))
110110 let targetPeriod = valueOrErrorMessage(parseInt(parts[3]), wrapErr("invalid targetPeriod"))
111111 let claimTxId = parts[4]
112112 $Tuple4(status, lpAssetAmount, targetPeriod, claimTxId)
113113 }
114114 else throwErr("invalid withdrawal request value")
115115 }
116116
117117
118118 let factoryAddressOption = match getString(this, keyFactoryAddress()) {
119119 case s: String =>
120120 addressFromString(s)
121121 case _: Unit =>
122122 unit
123123 case _ =>
124124 throw("Match error")
125125 }
126126
127127 let factoryAddressOrFail = valueOrErrorMessage(factoryAddressOption, wrapErr("invalid factory address"))
128128
129129 let lpAssetIdOption = match factoryAddressOption {
130130 case a: Address =>
131131 match getString(a, keyLpAssetId()) {
132132 case s: String =>
133133 fromBase58String(s)
134134 case _: Unit =>
135135 unit
136136 case _ =>
137137 throw("Match error")
138138 }
139139 case _: Unit =>
140140 unit
141141 case _ =>
142142 throw("Match error")
143143 }
144144
145145 let lpAssetIdOrFail = valueOrErrorMessage(lpAssetIdOption, wrapErr("invalid lpAssetId"))
146146
147147 let proxyTreasuryAddressOption = match factoryAddressOption {
148148 case a: Address =>
149149 match getString(a, keyProxyTreasuryAddress()) {
150150 case s: String =>
151151 addressFromString(s)
152152 case _: Unit =>
153153 unit
154154 case _ =>
155155 throw("Match error")
156156 }
157157 case _: Unit =>
158158 unit
159159 case _ =>
160160 throw("Match error")
161161 }
162162
163163 let proxyTreasuryAddressOrFail = valueOrErrorMessage(proxyTreasuryAddressOption, wrapErr("invalid proxy treasury address"))
164164
165165 let mainTreasuryAddressOption = match factoryAddressOption {
166166 case a: Address =>
167167 match getString(a, keyMainTreasuryAddress()) {
168168 case s: String =>
169169 addressFromString(s)
170170 case _: Unit =>
171171 unit
172172 case _ =>
173173 throw("Match error")
174174 }
175175 case _: Unit =>
176176 unit
177177 case _ =>
178178 throw("Match error")
179179 }
180180
181181 let mainTreasuryAddressOrFail = valueOrErrorMessage(mainTreasuryAddressOption, wrapErr("invalid main treasury address"))
182182
183183 func getManagerPublicKeyOrUnit () = match factoryAddressOption {
184184 case fa: Address =>
185185 match getString(fa, keyManagerPublicKey()) {
186186 case pub: String =>
187187 fromBase58String(pub)
188188 case _ =>
189189 unit
190190 }
191191 case _ =>
192192 unit
193193 }
194194
195195
196196 func onlyAddress (i,address) = if ((i.caller == address))
197197 then true
198198 else throwErr("permission denied")
199199
200200
201201 func onlyFactory (i) = onlyAddress(i, factoryAddressOrFail)
202202
203203
204204 func rewardForOption (rewards,target) = {
205205 let s = size(rewards)
206206 let $t046294654 = rewards[0]
207207 let a0 = $t046294654._1
208208 let r0 = $t046294654._2
209209 let $t046574682 = rewards[1]
210210 let a1 = $t046574682._1
211211 let r1 = $t046574682._2
212212 let $t046854710 = rewards[2]
213213 let a2 = $t046854710._1
214214 let r2 = $t046854710._2
215215 if (if ((s > 0))
216216 then (a0 == target)
217217 else false)
218218 then r0
219219 else if (if ((s > 1))
220220 then (a1 == target)
221221 else false)
222222 then r1
223223 else if (if ((s > 2))
224224 then (a2 == target)
225225 else false)
226226 then r2
227227 else unit
228228 }
229229
230230
231231 @Callable(i)
232232 func claimLP (userAddressBytes) = {
233233 let checkCaller = onlyFactory(i)
234234 if ((checkCaller == checkCaller))
235235 then {
236236 let userAddress = Address(userAddressBytes)
237237 let available = valueOrElse(getInteger(factoryAddressOrFail, keyAvailable(userAddress)), 0)
238238 let claimed = valueOrElse(getInteger(factoryAddressOrFail, keyClaimed(userAddress)), 0)
239239 let factoryActions = if ((available > 0))
240240 then [invoke(factoryAddressOrFail, "transferAsset", [userAddressBytes, available, lpAssetIdOrFail], nil), invoke(factoryAddressOrFail, "integerEntry", [keyAvailable(userAddress), 0], nil), invoke(factoryAddressOrFail, "integerEntry", [keyClaimed(userAddress), (claimed + available)], nil)]
241241 else throwErr("nothing to claim")
242242 $Tuple2(nil, factoryActions)
243243 }
244244 else throw("Strict value is not equal to itself.")
245245 }
246246
247247
248248
249249 @Callable(i)
250250 func finalize (userAddressBytes,newTreasuryVolumeInWaves,pwrManagersBonusInWaves,treasuryVolumeDiffAllocationCoef) = {
251251 let checkCaller = onlyFactory(i)
252252 if ((checkCaller == checkCaller))
253253 then {
254254 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
255255 let periodLength = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPeriodLength()), wrapErr("invalid period length"))
256256 let currentStartHeight = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyStartHeight(currentPeriodOrFail)), wrapErr("invalid start height"))
257257 let currentPriceOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPriceForPeriod(currentPeriodOrFail)), wrapErr("invalid price"))
258258 let nextBlockToProcess = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyNextBlockToProcess()), wrapErr("invalid next block to process"))
259259 let periodEndHeight = ((currentStartHeight + periodLength) - 1)
260260 let checks = [if ((i.originCaller == mainTreasuryAddressOrFail))
261261 then true
262262 else throwErr("permission denied"), if ((nextBlockToProcess > periodEndHeight))
263263 then true
264264 else throwErr("unprocessed blocks"), if ((newTreasuryVolumeInWaves >= 0))
265265 then true
266266 else throwErr("invalid new treasury volume"), if ((pwrManagersBonusInWaves >= 0))
267267 then true
268268 else throwErr("invalid PWR managers bonus"), if (if ((treasuryVolumeDiffAllocationCoef >= -(SCALE8)))
269269 then (SCALE8 >= treasuryVolumeDiffAllocationCoef)
270270 else false)
271271 then true
272272 else throwErr("invalid treasury volume diff allocation coefficient")]
273273 if ((checks == checks))
274274 then {
275275 let donatedWavesAmount = valueOrElse(getInteger(factoryAddressOrFail, keyDonated(unit)), 0)
276276 let investedWavesAmount = valueOrElse(getInteger(factoryAddressOrFail, keyInvested(unit)), 0)
277277 let currentTreasuryVolumeInWaves = (donatedWavesAmount + investedWavesAmount)
278278 let profitRaw = (newTreasuryVolumeInWaves - currentTreasuryVolumeInWaves)
279279 let pwrManagersBonusAmount = if (if ((profitRaw > 0))
280280 then (profitRaw >= pwrManagersBonusInWaves)
281281 else false)
282282 then pwrManagersBonusInWaves
283283 else 0
284284 let profit = (profitRaw - pwrManagersBonusAmount)
285285 let donationPart = if ((currentTreasuryVolumeInWaves > 0))
286286 then fraction(donatedWavesAmount, SCALE8, currentTreasuryVolumeInWaves)
287287 else 0
288288 let donationProfitPartRaw = fraction(profit, donationPart, SCALE8)
289289 let investmentProfitPartRaw = (profit - donationProfitPartRaw)
290290 let treasuryVolumeDiffAllocationCoefAbs = abs(treasuryVolumeDiffAllocationCoef)
291291 let amountToDonation = fraction(investmentProfitPartRaw, if ((0 > treasuryVolumeDiffAllocationCoef))
292292 then treasuryVolumeDiffAllocationCoefAbs
293293 else 0, SCALE8)
294294 let amountToInvestment = fraction(donationProfitPartRaw, if ((treasuryVolumeDiffAllocationCoef > 0))
295295 then treasuryVolumeDiffAllocationCoefAbs
296296 else 0, SCALE8)
297297 let donationProfitPart = ((donationProfitPartRaw - amountToInvestment) + amountToDonation)
298298 let investmentProfitPart = ((investmentProfitPartRaw - amountToDonation) + amountToInvestment)
299299 let donatedWavesAmountNewRaw = (donatedWavesAmount + donationProfitPart)
300300 let investedWavesAmountNewRaw = (investedWavesAmount + investmentProfitPart)
301301 let donatedPartDebt = min([0, donatedWavesAmountNewRaw])
302302 let investedPartDebt = min([0, investedWavesAmountNewRaw])
303303 let donatedWavesAmountNew = (max([0, donatedWavesAmountNewRaw]) + investedPartDebt)
304304 let investedWavesAmountNew = (max([0, investedWavesAmountNewRaw]) + donatedPartDebt)
305305 let newPeriod = (currentPeriodOrFail + 1)
306306 let lpAssetQuantity = valueOrErrorMessage(assetInfo(lpAssetIdOrFail), wrapErr("invalid lpAsset info")).quantity
307307 let newPrice = fraction(investedWavesAmountNew, SCALE8, lpAssetQuantity)
308308 let lpAssetAmountToBurn = valueOrElse(getInteger(factoryAddressOrFail, keyWithdrawal()), 0)
309309 let paymentAmountMin = max([0, fraction(lpAssetAmountToBurn, newPrice, SCALE8)])
310310 let paymentOption = if ((size(i.payments) > 0))
311311 then i.payments[0]
312312 else unit
313313 let paymentAmount = value(paymentOption).amount
314314 let paymentAssetId = value(paymentOption).assetId
315315 let checkPayment = if (if ((paymentAmountMin == 0))
316316 then true
317317 else if (if ((paymentOption != unit))
318318 then (paymentAssetId == unit)
319319 else false)
320320 then (paymentAmount >= paymentAmountMin)
321321 else false)
322322 then true
323323 else throwErr(("invalid payments, payment amount min: " + toString(paymentAmountMin)))
324324 if ((checkPayment == checkPayment))
325325 then {
326- let actions = if ((paymentOption != unit))
327- then [ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId)]
328- else nil
329- let factoryActions = [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), investedWavesAmountNew], nil), invoke(factoryAddressOrFail, "integerEntry", [keyDonated(unit), donatedWavesAmountNew], nil)]
330- $Tuple2(actions, factoryActions)
326+ let checkIfPriceNotZero = if ((newPrice != 0))
327+ then true
328+ else throwErr("LP price cannot be 0")
329+ if ((checkIfPriceNotZero == checkIfPriceNotZero))
330+ then {
331+ let actions = if ((paymentOption != unit))
332+ then [ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId)]
333+ else nil
334+ let factoryActions = [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), investedWavesAmountNew], nil), invoke(factoryAddressOrFail, "integerEntry", [keyDonated(unit), donatedWavesAmountNew], nil)]
335+ $Tuple2(actions, factoryActions)
336+ }
337+ else throw("Strict value is not equal to itself.")
331338 }
332339 else throw("Strict value is not equal to itself.")
333340 }
334341 else throw("Strict value is not equal to itself.")
335342 }
336343 else throw("Strict value is not equal to itself.")
337344 }
338345
339346
340347
341348 @Callable(i)
342349 func invest (userAddressBytes) = {
343350 let checkCaller = onlyFactory(i)
344351 if ((checkCaller == checkCaller))
345352 then {
346353 let userAddress = Address(userAddressBytes)
347354 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
348355 let currentPriceOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPriceForPeriod(currentPeriodOrFail)), wrapErr("invalid price"))
349356 let payment = if ((size(i.payments) == 1))
350357 then i.payments[0]
351358 else throwErr("invalid payments")
352- let $t01159211769 = if (if ((payment.assetId == unit))
359+ let $t01167711854 = if (if ((payment.assetId == unit))
353360 then (payment.amount > 0)
354361 else false)
355362 then $Tuple2(payment.amount, payment.assetId)
356363 else throwErr("invalid payment amount")
357- let paymentAmount = $t01159211769._1
358- let paymentAssetId = $t01159211769._2
364+ let paymentAmount = $t01167711854._1
365+ let paymentAssetId = $t01167711854._2
359366 let lpAssetAmount = if ((currentPriceOrFail > 0))
360367 then fraction(paymentAmount, SCALE8, currentPriceOrFail)
361368 else 0
362369 let invested = valueOrElse(getInteger(factoryAddressOrFail, keyInvested(unit)), 0)
363370 let actions = [ScriptTransfer(mainTreasuryAddressOrFail, paymentAmount, paymentAssetId)]
364371 let factoryActions = [invoke(factoryAddressOrFail, "integerEntry", [keyInvested(unit), (invested + paymentAmount)], nil), invoke(factoryAddressOrFail, "reissue", [lpAssetAmount], nil), invoke(factoryAddressOrFail, "transferAsset", [userAddressBytes, lpAssetAmount, lpAssetIdOrFail], nil)]
365372 $Tuple2(actions, factoryActions)
366373 }
367374 else throw("Strict value is not equal to itself.")
368375 }
369376
370377
371378
372379 @Callable(i)
373380 func withdraw (userAddressBytes) = {
374381 let checkCaller = onlyFactory(i)
375382 if ((checkCaller == checkCaller))
376383 then {
377384 let userAddress = Address(userAddressBytes)
378385 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
379386 let payment = if ((size(i.payments) == 1))
380387 then i.payments[0]
381388 else throwErr(wrapErr("invalid payments"))
382389 let paymentAssetId = if ((payment.assetId == lpAssetIdOrFail))
383390 then lpAssetIdOrFail
384391 else throwErr("invalid payment asset")
385392 let paymentAmount = if ((payment.amount > 0))
386393 then payment.amount
387394 else throwErr("invalid payment amount")
388395 let withdrawal = valueOrElse(getInteger(factoryAddressOrFail, keyWithdrawal()), 0)
389396 let actions = [ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId)]
390397 let factoryActions = [invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawal(), (withdrawal + paymentAmount)], nil), invoke(factoryAddressOrFail, "stringEntry", [keyWithdrawalRequest(userAddress, i.transactionId), valueWithdrawalRequest(PENDING, paymentAmount, (currentPeriodOrFail + 1), unit)], nil)]
391398 if ((factoryActions == factoryActions))
392399 then $Tuple2(actions, factoryActions)
393400 else throw("Strict value is not equal to itself.")
394401 }
395402 else throw("Strict value is not equal to itself.")
396403 }
397404
398405
399406
400407 @Callable(i)
401408 func cancelWithdraw (userAddressBytes,txId) = {
402409 let checkCaller = onlyFactory(i)
403410 if ((checkCaller == checkCaller))
404411 then {
405412 let userAddress = Address(userAddressBytes)
406413 let withdrawalRequestOption = valueOrErrorMessage(getString(factoryAddressOrFail, keyWithdrawalRequest(userAddress, txId)), wrapErr("invalid withdrawal request"))
407414 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
408- let $t01417614289 = parseWithdrawalRequestValueOrFail(withdrawalRequestOption)
409- let status = $t01417614289._1
410- let lpAssetAmount = $t01417614289._2
411- let targetPeriod = $t01417614289._3
412- let claimTxId = $t01417614289._4
415+ let $t01426114374 = parseWithdrawalRequestValueOrFail(withdrawalRequestOption)
416+ let status = $t01426114374._1
417+ let lpAssetAmount = $t01426114374._2
418+ let targetPeriod = $t01426114374._3
419+ let claimTxId = $t01426114374._4
413420 let checks = [if ((status == PENDING))
414421 then true
415422 else throwErr("invalid withdrawal request status"), if ((targetPeriod > currentPeriodOrFail))
416423 then true
417424 else throwErr("invalid withdrawal request period")]
418425 if ((checks == checks))
419426 then {
420427 let withdrawal = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyWithdrawal()), wrapErr("invalid total withdrawal amount"))
421428 let factoryActions = [invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawal(), if ((withdrawal >= lpAssetAmount))
422429 then (withdrawal - lpAssetAmount)
423430 else throwErr("invalid withdrawal amount")], nil), invoke(factoryAddressOrFail, "deleteEntry", [keyWithdrawalRequest(userAddress, txId)], nil), invoke(factoryAddressOrFail, "transferAsset", [userAddressBytes, lpAssetAmount, lpAssetIdOrFail], nil)]
424431 if ((factoryActions == factoryActions))
425432 then $Tuple2(nil, factoryActions)
426433 else throw("Strict value is not equal to itself.")
427434 }
428435 else throw("Strict value is not equal to itself.")
429436 }
430437 else throw("Strict value is not equal to itself.")
431438 }
432439
433440
434441
435442 @Callable(i)
436443 func claimWaves (userAddressBytes,txId) = {
437444 let checkCaller = onlyFactory(i)
438445 if ((checkCaller == checkCaller))
439446 then {
440447 let userAddress = Address(userAddressBytes)
441448 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
442449 let withdrawalRequestOption = valueOrErrorMessage(getString(factoryAddressOrFail, keyWithdrawalRequest(userAddress, txId)), wrapErr("invalid withdrawal request"))
443- let $t01562115734 = parseWithdrawalRequestValueOrFail(withdrawalRequestOption)
444- let status = $t01562115734._1
445- let lpAssetAmount = $t01562115734._2
446- let targetPeriod = $t01562115734._3
447- let claimTxId = $t01562115734._4
450+ let $t01570615819 = parseWithdrawalRequestValueOrFail(withdrawalRequestOption)
451+ let status = $t01570615819._1
452+ let lpAssetAmount = $t01570615819._2
453+ let targetPeriod = $t01570615819._3
454+ let claimTxId = $t01570615819._4
448455 if ((status == FINISHED))
449456 then throwErr("invalid withdrawal request status")
450457 else if ((targetPeriod > currentPeriodOrFail))
451458 then throwErr("invalid withdrawal request period")
452459 else {
453460 let priceOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPriceForPeriod(targetPeriod)), wrapErr("invalid price"))
454461 let amount = if ((priceOrFail > 0))
455462 then fraction(lpAssetAmount, priceOrFail, SCALE8)
456463 else 0
457464 let factoryActions = [invoke(factoryAddressOrFail, "stringEntry", [keyWithdrawalRequest(userAddress, txId), valueWithdrawalRequest(FINISHED, lpAssetAmount, targetPeriod, i.transactionId)], nil), invoke(factoryAddressOrFail, "transferWaves", [userAddressBytes, amount], nil)]
458465 $Tuple2(nil, factoryActions)
459466 }
460467 }
461468 else throw("Strict value is not equal to itself.")
462469 }
463470
464471
465472
466473 @Callable(i)
467474 func processBlocks (userAddressBytes) = {
468475 let checkCaller = onlyFactory(i)
469476 if ((checkCaller == checkCaller))
470477 then {
471478 let userAddress = Address(userAddressBytes)
472479 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
473480 let periodLength = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPeriodLength()), wrapErr("invalid period length"))
474481 let currentStartHeight = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyStartHeight(currentPeriodOrFail)), wrapErr("invalid start height"))
475482 let currentPriceOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPriceForPeriod(currentPeriodOrFail)), wrapErr("invalid price"))
476483 let nextBlockToProcess = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyNextBlockToProcess()), wrapErr("invalid next block to process"))
477484 let periodEndHeight = ((currentStartHeight + periodLength) - 1)
478485 let blocksProcessingBatchSizeMax = 40
479486 let blocksProcessingBatchSize = if (if (if ((height >= nextBlockToProcess))
480487 then if ((nextBlockToProcess >= currentStartHeight))
481488 then true
482489 else (currentPeriodOrFail == 0)
483490 else false)
484491 then (periodEndHeight >= nextBlockToProcess)
485492 else false)
486493 then min([((periodEndHeight - nextBlockToProcess) + 1), blocksProcessingBatchSizeMax])
487494 else throwErr(wrapErr("invalid target block"))
488495 let blockProcessingReward = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyBlockProcessingReward()), wrapErr("invalid block processing reward"))
489496 let blockProcessingRewardByGenerator = (blockProcessingReward / blocksProcessingBatchSize)
490497 let blockProcessingRewardByGeneratorRemainder = (blockProcessingReward - (blockProcessingRewardByGenerator * blocksProcessingBatchSize))
491498 func map (acc,inc) = if ((inc >= blocksProcessingBatchSize))
492499 then acc
493500 else {
494501 let targetBlockHeight = (nextBlockToProcess + inc)
495502 let targetBlockInfo = valueOrErrorMessage(blockInfoByHeight(targetBlockHeight), wrapErr("invalid block info"))
496503 let treasuryRewardOrFail = valueOrErrorMessage(rewardForOption(targetBlockInfo.rewards, proxyTreasuryAddressOrFail), wrapErr(("invalid treasury reward for height " + toString(targetBlockHeight))))
497504 let generator = targetBlockInfo.generator
498505 let available = valueOrElse(getInteger(factoryAddressOrFail, keyAvailable(generator)), 0)
499506 let callerReward = if ((inc == (blocksProcessingBatchSize - 1)))
500507 then (blockProcessingRewardByGenerator + blockProcessingRewardByGeneratorRemainder)
501508 else blockProcessingRewardByGenerator
502509 let lpAssetAmount = if ((currentPriceOrFail > 0))
503510 then fraction((treasuryRewardOrFail - callerReward), SCALE8, currentPriceOrFail)
504511 else 0
505512 let factoryActionsSingle = [invoke(factoryAddressOrFail, "stringEntry", [keyBlockProcessed(targetBlockHeight), makeString([toBase58String(i.transactionId), toString(currentPeriodOrFail), toString(generator), toBase58String(userAddressBytes), toString(treasuryRewardOrFail), toString(callerReward), toString(lpAssetAmount)], SEP)], nil), invoke(factoryAddressOrFail, "integerEntry", [keyAvailable(generator), (available + lpAssetAmount)], nil)]
506513 if ((factoryActionsSingle == factoryActionsSingle))
507514 then {
508- let $t01997020003 = acc
509- let lpAssetAcc = $t01997020003._1
510- let rewardAcc = $t01997020003._2
515+ let $t02005520088 = acc
516+ let lpAssetAcc = $t02005520088._1
517+ let rewardAcc = $t02005520088._2
511518 $Tuple2((lpAssetAcc + lpAssetAmount), (rewardAcc + treasuryRewardOrFail))
512519 }
513520 else throw("Strict value is not equal to itself.")
514521 }
515522
516523 let list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39]
517- let $t02027020346 = {
524+ let $t02035520431 = {
518525 let $l = list
519526 let $s = size($l)
520527 let $acc0 = $Tuple2(0, 0)
521528 func $f0_1 ($a,$i) = if (($i >= $s))
522529 then $a
523530 else map($a, $l[$i])
524531
525532 func $f0_2 ($a,$i) = if (($i >= $s))
526533 then $a
527534 else throw("List size exceeds 40")
528535
529536 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40)
530537 }
531- if (($t02027020346 == $t02027020346))
538+ if (($t02035520431 == $t02035520431))
532539 then {
533- let rewardAmountTotal = $t02027020346._2
534- let lpAssetAmountTotal = $t02027020346._1
540+ let rewardAmountTotal = $t02035520431._2
541+ let lpAssetAmountTotal = $t02035520431._1
535542 let rewardToMainTreasuryAmount = (rewardAmountTotal - blockProcessingReward)
536543 let invested = valueOrElse(getInteger(factoryAddressOrFail, keyInvested(unit)), 0)
537544 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, "integerEntry", [keyInvested(unit), (invested + rewardToMainTreasuryAmount)], nil)]
538545 if ((actions == actions))
539546 then $Tuple2(nil, unit)
540547 else throw("Strict value is not equal to itself.")
541548 }
542549 else throw("Strict value is not equal to itself.")
543550 }
544551 else throw("Strict value is not equal to itself.")
545552 }
546553
547554
548555 @Verifier(tx)
549556 func verify () = {
550557 let publicKey = match getManagerPublicKeyOrUnit() {
551558 case pub: ByteVector =>
552559 pub
553560 case _ =>
554561 tx.senderPublicKey
555562 }
556563 sigVerify(tx.bodyBytes, tx.proofs[0], publicKey)
557564 }
558565

github/deemru/w8io/873ac7e 
87.99 ms