tx · 5jKFfKGXisRRwPZWTzWMaWd65RF2gEkYvZz5ghmjyy2U

3N6HSS7Toat1RhyEsyqVGgVSRzH19W1FTbP:  -0.01900000 Waves

2023.06.23 14:18 [2635187] smart account 3N6HSS7Toat1RhyEsyqVGgVSRzH19W1FTbP > SELF 0.00000000 Waves

{ "type": 13, "id": "5jKFfKGXisRRwPZWTzWMaWd65RF2gEkYvZz5ghmjyy2U", "fee": 1900000, "feeAssetId": null, "timestamp": 1687519186064, "version": 2, "chainId": 84, "sender": "3N6HSS7Toat1RhyEsyqVGgVSRzH19W1FTbP", "senderPublicKey": "AoKo4segKHU4DeJnxXQYJj2u7J6XJeux6r8KLW52cd2Q", "proofs": [ "5sLMPDU9YDuN2KZZ415bPoxaxWeJNZbAzxz7mPqmTQNk4S1tnB84nE12bKcCnRZVpF18gMX6M5h7e9WrrqoL75Gz" ], "script": "base64:BwIrCAISAwoBAhIHCgUCAQEBARIDCgECEgMKAQISBAoCAgISBAoCAgISAwoBAigAA1NFUAICX18ADUNPTlRSQUNUX05BTUUCD2NhbGN1bGF0b3IucmlkZQAGU0NBTEU4AIDC1y8ABlNDQUxFNgDAhD0AB1BFTkRJTkcCB1BFTkRJTkcACEZJTklTSEVEAghGSU5JU0hFRAAFV0FWRVMCBVdBVkVTAQd3cmFwRXJyAQFzCQCsAgIJAKwCAgUNQ09OVFJBQ1RfTkFNRQICOiAFAXMBCHRocm93RXJyAQFzCQACAQkBB3dyYXBFcnIBBQFzAQ9hc3NldElkVG9TdHJpbmcBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYgUHJG1hdGNoMAkA2AQBBQFiAwkAAQIFByRtYXRjaDACBFVuaXQFBVdBVkVTCQACAQILTWF0Y2ggZXJyb3IBA2FicwEBbgMJAGYCAAAFAW4JAQEtAQUBbgUBbgERa2V5RmFjdG9yeUFkZHJlc3MACQC5CQIJAMwIAgICJXMJAMwIAgIHZmFjdG9yeQUDbmlsBQNTRVABDGtleUxwQXNzZXRJZAAJALkJAgkAzAgCAgIlcwkAzAgCAglscEFzc2V0SWQFA25pbAUDU0VQAQ1rZXlYdG5Bc3NldElkAAkAuQkCCQDMCAICAiVzCQDMCAICCnh0bkFzc2V0SWQFA25pbAUDU0VQARJrZXlUcmVhc3VyeUFkZHJlc3MACQC5CQIJAMwIAgICJXMJAMwIAgIIdHJlYXN1cnkFA25pbAUDU0VQAQtrZXlJbnZlc3RlZAEHYXNzZXRJZAkAuQkCCQDMCAICBCVzJXMJAMwIAgIIaW52ZXN0ZWQJAMwIAgkBD2Fzc2V0SWRUb1N0cmluZwEFB2Fzc2V0SWQFA25pbAUDU0VQAQxrZXlBdmFpbGFibGUBC3VzZXJBZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCAglhdmFpbGFibGUJAMwIAgkApQgBBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABCmtleUNsYWltZWQBC3VzZXJBZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCAgdjbGFpbWVkCQDMCAIJAKUIAQULdXNlckFkZHJlc3MFA25pbAUDU0VQARBrZXlDdXJyZW50UGVyaW9kAAkAuQkCCQDMCAICAiVzCQDMCAICDWN1cnJlbnRQZXJpb2QFA25pbAUDU0VQARFrZXlQcmljZUZvclBlcmlvZAEGcGVyaW9kCQC5CQIJAMwIAgIEJXMlZAkAzAgCAgVwcmljZQkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABDmtleVN0YXJ0SGVpZ2h0AQZwZXJpb2QJALkJAgkAzAgCAgQlcyVkCQDMCAICC3N0YXJ0SGVpZ2h0CQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEPa2V5UGVyaW9kTGVuZ3RoAAIQJXNfX3BlcmlvZExlbmd0aAEYa2V5QmxvY2tQcm9jZXNzaW5nUmV3YXJkAAIZJXNfX2Jsb2NrUHJvY2Vzc2luZ1Jld2FyZAEVa2V5TmV4dEJsb2NrVG9Qcm9jZXNzAAIWJXNfX25leHRCbG9ja1RvUHJvY2VzcwERa2V5QmxvY2tQcm9jZXNzZWQBBmhlaWdodAkAuQkCCQDMCAICBCVzJWQJAMwIAgIOYmxvY2tQcm9jZXNzZWQJAMwIAgkApAMBBQZoZWlnaHQFA25pbAUDU0VQAQ1rZXlXaXRoZHJhd2FsAAIOJXNfX3dpdGhkcmF3YWwBFGtleVdpdGhkcmF3YWxSZXF1ZXN0Agt1c2VyQWRkcmVzcwR0eElkCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICCndpdGhkcmF3YWwJAMwIAgkApQgBBQt1c2VyQWRkcmVzcwkAzAgCCQDYBAEFBHR4SWQFA25pbAUDU0VQARZ2YWx1ZVdpdGhkcmF3YWxSZXF1ZXN0BAZzdGF0dXMNbHBBc3NldEFtb3VudAx0YXJnZXRQZXJpb2QJY2xhaW1UeElkBAxjbGFpbVR4SWRTdHIEByRtYXRjaDAFCWNsYWltVHhJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFiBQckbWF0Y2gwCQDYBAEFAWIDCQABAgUHJG1hdGNoMAIEVW5pdAIEU09PTgkAAgECC01hdGNoIGVycm9yCQC5CQIJAMwIAgIIJXMlZCVkJXMJAMwIAgUGc3RhdHVzCQDMCAIJAKQDAQUNbHBBc3NldEFtb3VudAkAzAgCCQCkAwEFDHRhcmdldFBlcmlvZAkAzAgCBQxjbGFpbVR4SWRTdHIFA25pbAUDU0VQASFwYXJzZVdpdGhkcmF3YWxSZXF1ZXN0VmFsdWVPckZhaWwBAXMEBXBhcnRzCQC1CQIFAXMFA1NFUAMJAAACCQCQAwEFBXBhcnRzAAUEBnN0YXR1cwkAkQMCBQVwYXJ0cwABBA1scEFzc2V0QW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBQVwYXJ0cwACCQEHd3JhcEVycgECFWludmFsaWQgbHBBc3NldEFtb3VudAQMdGFyZ2V0UGVyaW9kCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBQVwYXJ0cwADCQEHd3JhcEVycgECFGludmFsaWQgdGFyZ2V0UGVyaW9kBAljbGFpbVR4SWQJAJEDAgUFcGFydHMABAkAlgoEBQZzdGF0dXMFDWxwQXNzZXRBbW91bnQFDHRhcmdldFBlcmlvZAUJY2xhaW1UeElkCQEIdGhyb3dFcnIBAiBpbnZhbGlkIHdpdGhkcmF3YWwgcmVxdWVzdCB2YWx1ZQAUZmFjdG9yeUFkZHJlc3NPcHRpb24EByRtYXRjaDAJAJ0IAgUEdGhpcwkBEWtleUZhY3RvcnlBZGRyZXNzAAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJAKYIAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IAFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIFFGZhY3RvcnlBZGRyZXNzT3B0aW9uCQEHd3JhcEVycgECF2ludmFsaWQgZmFjdG9yeSBhZGRyZXNzAA9scEFzc2V0SWRPcHRpb24EByRtYXRjaDAFFGZhY3RvcnlBZGRyZXNzT3B0aW9uAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAEByRtYXRjaDEJAJ0IAgUBYQkBDGtleUxwQXNzZXRJZAADCQABAgUHJG1hdGNoMQIGU3RyaW5nBAFzBQckbWF0Y2gxCQDZBAEFAXMDCQABAgUHJG1hdGNoMQIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgAPbHBBc3NldElkT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIFD2xwQXNzZXRJZE9wdGlvbgkBB3dyYXBFcnIBAhFpbnZhbGlkIGxwQXNzZXRJZAAQeHRuQXNzZXRJZE9wdGlvbgQHJG1hdGNoMAUUZmFjdG9yeUFkZHJlc3NPcHRpb24DCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAQHJG1hdGNoMQkAnQgCBQFhCQENa2V5WHRuQXNzZXRJZAADCQABAgUHJG1hdGNoMQIGU3RyaW5nBAFzBQckbWF0Y2gxCQDZBAEFAXMDCQABAgUHJG1hdGNoMQIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgAQeHRuQXNzZXRJZE9yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBRB4dG5Bc3NldElkT3B0aW9uCQEHd3JhcEVycgECEmludmFsaWQgeHRuQXNzZXRJZAAVdHJlYXN1cnlBZGRyZXNzT3B0aW9uBAckbWF0Y2gwBRRmYWN0b3J5QWRkcmVzc09wdGlvbgMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAFhBQckbWF0Y2gwBAckbWF0Y2gxCQCdCAIFAWEJARJrZXlUcmVhc3VyeUFkZHJlc3MAAwkAAQIFByRtYXRjaDECBlN0cmluZwQBcwUHJG1hdGNoMQkApggBBQFzAwkAAQIFByRtYXRjaDECBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IAFXRyZWFzdXJ5QWRkcmVzc09yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBRV0cmVhc3VyeUFkZHJlc3NPcHRpb24JAQd3cmFwRXJyAQIYaW52YWxpZCB0cmVhc3VyeSBhZGRyZXNzAQtvbmx5QWRkcmVzcwIBaQdhZGRyZXNzAwkAAAIIBQFpBmNhbGxlcgUHYWRkcmVzcwYJAQh0aHJvd0VycgECEXBlcm1pc3Npb24gZGVuaWVkAQtvbmx5RmFjdG9yeQEBaQkBC29ubHlBZGRyZXNzAgUBaQUUZmFjdG9yeUFkZHJlc3NPckZhaWwBD3Jld2FyZEZvck9wdGlvbgIHcmV3YXJkcwZ0YXJnZXQEAXMJAJADAQUHcmV3YXJkcwQLJHQwNDA5NjQxMjEJAJEDAgUHcmV3YXJkcwAABAJhMAgFCyR0MDQwOTY0MTIxAl8xBAJyMAgFCyR0MDQwOTY0MTIxAl8yBAskdDA0MTI0NDE0OQkAkQMCBQdyZXdhcmRzAAEEAmExCAULJHQwNDEyNDQxNDkCXzEEAnIxCAULJHQwNDEyNDQxNDkCXzIECyR0MDQxNTI0MTc3CQCRAwIFB3Jld2FyZHMAAgQCYTIIBQskdDA0MTUyNDE3NwJfMQQCcjIIBQskdDA0MTUyNDE3NwJfMgMDCQBmAgUBcwAACQAAAgUCYTAFBnRhcmdldAcFAnIwAwMJAGYCBQFzAAEJAAACBQJhMQUGdGFyZ2V0BwUCcjEDAwkAZgIFAXMAAgkAAAIFAmEyBQZ0YXJnZXQHBQJyMgUEdW5pdAcBaQEHY2xhaW1MUAEQdXNlckFkZHJlc3NCeXRlcwQLY2hlY2tDYWxsZXIJAQtvbmx5RmFjdG9yeQEFAWkDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyBAt1c2VyQWRkcmVzcwkBB0FkZHJlc3MBBRB1c2VyQWRkcmVzc0J5dGVzBAlhdmFpbGFibGUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJAQxrZXlBdmFpbGFibGUBBQt1c2VyQWRkcmVzcwAABAdjbGFpbWVkCQELdmFsdWVPckVsc2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEKa2V5Q2xhaW1lZAEFC3VzZXJBZGRyZXNzAAAEDmZhY3RvcnlBY3Rpb25zAwkAZgIFCWF2YWlsYWJsZQAACQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDXRyYW5zZmVyQXNzZXQJAMwIAgUQdXNlckFkZHJlc3NCeXRlcwkAzAgCBQlhdmFpbGFibGUJAMwIAgUPbHBBc3NldElkT3JGYWlsBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBDGtleUF2YWlsYWJsZQEFC3VzZXJBZGRyZXNzCQDMCAIAAAUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIMaW50ZWdlckVudHJ5CQDMCAIJAQprZXlDbGFpbWVkAQULdXNlckFkZHJlc3MJAMwIAgkAZAIFB2NsYWltZWQFCWF2YWlsYWJsZQUDbmlsBQNuaWwFA25pbAkBCHRocm93RXJyAQIQbm90aGluZyB0byBjbGFpbQkAlAoCBQNuaWwFDmZhY3RvcnlBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGZpbmFsaXplBRB1c2VyQWRkcmVzc0J5dGVzGG5ld1RyZWFzdXJ5Vm9sdW1lSW5XYXZlcwh4dG5QcmljZRBwd3JNYW5hZ2Vyc0JvbnVzIHRyZWFzdXJ5Vm9sdW1lRGlmZkFsbG9jYXRpb25Db2VmBAtjaGVja0NhbGxlcgkBC29ubHlGYWN0b3J5AQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIEE2N1cnJlbnRQZXJpb2RPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBEGtleUN1cnJlbnRQZXJpb2QACQEHd3JhcEVycgECDmludmFsaWQgcGVyaW9kBAxwZXJpb2RMZW5ndGgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBD2tleVBlcmlvZExlbmd0aAAJAQd3cmFwRXJyAQIVaW52YWxpZCBwZXJpb2QgbGVuZ3RoBBJjdXJyZW50U3RhcnRIZWlnaHQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBDmtleVN0YXJ0SGVpZ2h0AQUTY3VycmVudFBlcmlvZE9yRmFpbAkBB3dyYXBFcnIBAhRpbnZhbGlkIHN0YXJ0IGhlaWdodAQSY3VycmVudFByaWNlT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARFrZXlQcmljZUZvclBlcmlvZAEFE2N1cnJlbnRQZXJpb2RPckZhaWwJAQd3cmFwRXJyAQINaW52YWxpZCBwcmljZQQSbmV4dEJsb2NrVG9Qcm9jZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARVrZXlOZXh0QmxvY2tUb1Byb2Nlc3MACQEHd3JhcEVycgECHWludmFsaWQgbmV4dCBibG9jayB0byBwcm9jZXNzBA9wZXJpb2RFbmRIZWlnaHQJAGUCCQBkAgUSY3VycmVudFN0YXJ0SGVpZ2h0BQxwZXJpb2RMZW5ndGgAAQQGY2hlY2tzCQDMCAIDCQAAAggFAWkMb3JpZ2luQ2FsbGVyBRV0cmVhc3VyeUFkZHJlc3NPckZhaWwGCQEIdGhyb3dFcnIBAhFwZXJtaXNzaW9uIGRlbmllZAkAzAgCAwkAZgIFEm5leHRCbG9ja1RvUHJvY2VzcwUPcGVyaW9kRW5kSGVpZ2h0BgkBCHRocm93RXJyAQISdW5wcm9jZXNzZWQgYmxvY2tzCQDMCAIDCQBnAgUYbmV3VHJlYXN1cnlWb2x1bWVJbldhdmVzAAAGCQEIdGhyb3dFcnIBAhtpbnZhbGlkIG5ldyB0cmVhc3VyeSB2b2x1bWUJAMwIAgMJAGcCBQh4dG5QcmljZQAABgkBCHRocm93RXJyAQIRaW52YWxpZCBYVE4gcHJpY2UJAMwIAgMDCQBnAgUQcHdyTWFuYWdlcnNCb251cwAACQBnAgUGU0NBTEU4BRBwd3JNYW5hZ2Vyc0JvbnVzBwYJAQh0aHJvd0VycgECGmludmFsaWQgUFdSIG1hbmFnZXJzIGJvbnVzCQDMCAIDAwkAZwIFIHRyZWFzdXJ5Vm9sdW1lRGlmZkFsbG9jYXRpb25Db2VmCQEBLQEFBlNDQUxFOAkAZwIFBlNDQUxFOAUgdHJlYXN1cnlWb2x1bWVEaWZmQWxsb2NhdGlvbkNvZWYHBgkBCHRocm93RXJyAQIzaW52YWxpZCB0cmVhc3VyeSB2b2x1bWUgZGlmZiBhbGxvY2F0aW9uIGNvZWZmaWNpZW50BQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MEEWludmVzdGVkWHRuQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQELa2V5SW52ZXN0ZWQBBRB4dG5Bc3NldElkT3JGYWlsAAAEE2ludmVzdGVkV2F2ZXNBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJAQtrZXlJbnZlc3RlZAEFBHVuaXQAAAQYaW52ZXN0ZWRYdG5BbW91bnRJbldhdmVzCQBrAwURaW52ZXN0ZWRYdG5BbW91bnQFCHh0blByaWNlBQZTQ0FMRTYEHGN1cnJlbnRUcmVhc3VyeVZvbHVtZUluV2F2ZXMJAGQCBRhpbnZlc3RlZFh0bkFtb3VudEluV2F2ZXMFE2ludmVzdGVkV2F2ZXNBbW91bnQECXByb2ZpdFJhdwkAZQIFGG5ld1RyZWFzdXJ5Vm9sdW1lSW5XYXZlcwUcY3VycmVudFRyZWFzdXJ5Vm9sdW1lSW5XYXZlcwQWcHdyTWFuYWdlcnNCb251c0Ftb3VudAMJAGYCBQlwcm9maXRSYXcAAAkAawMFCXByb2ZpdFJhdwUQcHdyTWFuYWdlcnNCb251cwUGU0NBTEU4AAAEBnByb2ZpdAkAZQIFCXByb2ZpdFJhdwUWcHdyTWFuYWdlcnNCb251c0Ftb3VudAQMZG9uYXRpb25QYXJ0AwkAZgIFHGN1cnJlbnRUcmVhc3VyeVZvbHVtZUluV2F2ZXMAAAkAawMFGGludmVzdGVkWHRuQW1vdW50SW5XYXZlcwUGU0NBTEU4BRxjdXJyZW50VHJlYXN1cnlWb2x1bWVJbldhdmVzAAAEFWRvbmF0aW9uUHJvZml0UGFydFJhdwkAawMFBnByb2ZpdAUMZG9uYXRpb25QYXJ0BQZTQ0FMRTgEF2ludmVzdG1lbnRQcm9maXRQYXJ0UmF3CQBlAgUGcHJvZml0BRVkb25hdGlvblByb2ZpdFBhcnRSYXcEI3RyZWFzdXJ5Vm9sdW1lRGlmZkFsbG9jYXRpb25Db2VmQWJzCQEDYWJzAQUgdHJlYXN1cnlWb2x1bWVEaWZmQWxsb2NhdGlvbkNvZWYEEGFtb3VudFRvRG9uYXRpb24JAGsDBRdpbnZlc3RtZW50UHJvZml0UGFydFJhdwMJAGYCAAAFIHRyZWFzdXJ5Vm9sdW1lRGlmZkFsbG9jYXRpb25Db2VmBSN0cmVhc3VyeVZvbHVtZURpZmZBbGxvY2F0aW9uQ29lZkFicwAABQZTQ0FMRTgEEmFtb3VudFRvSW52ZXN0bWVudAkAawMFFWRvbmF0aW9uUHJvZml0UGFydFJhdwMJAGYCBSB0cmVhc3VyeVZvbHVtZURpZmZBbGxvY2F0aW9uQ29lZgAABSN0cmVhc3VyeVZvbHVtZURpZmZBbGxvY2F0aW9uQ29lZkFicwAABQZTQ0FMRTgEEmRvbmF0aW9uUHJvZml0UGFydAkAZAIJAGUCBRVkb25hdGlvblByb2ZpdFBhcnRSYXcFEmFtb3VudFRvSW52ZXN0bWVudAUQYW1vdW50VG9Eb25hdGlvbgQUaW52ZXN0bWVudFByb2ZpdFBhcnQJAGQCCQBlAgUXaW52ZXN0bWVudFByb2ZpdFBhcnRSYXcFEGFtb3VudFRvRG9uYXRpb24FEmFtb3VudFRvSW52ZXN0bWVudAQWaW52ZXN0ZWRXYXZlc0Ftb3VudE5ldwkAZAIFE2ludmVzdGVkV2F2ZXNBbW91bnQFFGludmVzdG1lbnRQcm9maXRQYXJ0BBRpbnZlc3RlZFh0bkFtb3VudE5ldwkAawMJAGQCBRhpbnZlc3RlZFh0bkFtb3VudEluV2F2ZXMFEmRvbmF0aW9uUHJvZml0UGFydAUGU0NBTEU2BQh4dG5QcmljZQQJbmV3UGVyaW9kCQBkAgUTY3VycmVudFBlcmlvZE9yRmFpbAABBA9scEFzc2V0UXVhbnRpdHkICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUPbHBBc3NldElkT3JGYWlsCQEHd3JhcEVycgECFGludmFsaWQgbHBBc3NldCBpbmZvCHF1YW50aXR5BAhuZXdQcmljZQkAawMFFmludmVzdGVkV2F2ZXNBbW91bnROZXcFBlNDQUxFOAUPbHBBc3NldFF1YW50aXR5BBNscEFzc2V0QW1vdW50VG9CdXJuCQELdmFsdWVPckVsc2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQENa2V5V2l0aGRyYXdhbAAAAAQQcGF5bWVudEFtb3VudE1pbgkAlgMBCQDMCAIAAAkAzAgCCQBrAwUTbHBBc3NldEFtb3VudFRvQnVybgUIbmV3UHJpY2UFBlNDQUxFOAUDbmlsBA1wYXltZW50T3B0aW9uAwkAZgIJAJADAQgFAWkIcGF5bWVudHMAAAkAkQMCCAUBaQhwYXltZW50cwAABQR1bml0BA1wYXltZW50QW1vdW50CAkBBXZhbHVlAQUNcGF5bWVudE9wdGlvbgZhbW91bnQEDnBheW1lbnRBc3NldElkCAkBBXZhbHVlAQUNcGF5bWVudE9wdGlvbgdhc3NldElkBAxjaGVja1BheW1lbnQDAwkAAAIFEHBheW1lbnRBbW91bnRNaW4AAAYDAwkBAiE9AgUNcGF5bWVudE9wdGlvbgUEdW5pdAkAAAIFDnBheW1lbnRBc3NldElkBQR1bml0BwkAZwIFDXBheW1lbnRBbW91bnQFEHBheW1lbnRBbW91bnRNaW4HBgkBCHRocm93RXJyAQkArAICAiZpbnZhbGlkIHBheW1lbnRzLCBwYXltZW50IGFtb3VudCBtaW46IAkApAMBBRBwYXltZW50QW1vdW50TWluAwkAAAIFDGNoZWNrUGF5bWVudAUMY2hlY2tQYXltZW50BAdhY3Rpb25zAwkBAiE9AgUNcGF5bWVudE9wdGlvbgUEdW5pdAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRRmYWN0b3J5QWRkcmVzc09yRmFpbAUNcGF5bWVudEFtb3VudAUOcGF5bWVudEFzc2V0SWQFA25pbAUDbmlsBA5mYWN0b3J5QWN0aW9ucwkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBEGtleUN1cnJlbnRQZXJpb2QACQDMCAIFCW5ld1BlcmlvZAUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIMaW50ZWdlckVudHJ5CQDMCAIJARFrZXlQcmljZUZvclBlcmlvZAEFCW5ld1BlcmlvZAkAzAgCBQhuZXdQcmljZQUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIMaW50ZWdlckVudHJ5CQDMCAIJAQ5rZXlTdGFydEhlaWdodAEFCW5ld1BlcmlvZAkAzAgCCQBkAgUPcGVyaW9kRW5kSGVpZ2h0AAEFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCBGJ1cm4JAMwIAgUTbHBBc3NldEFtb3VudFRvQnVybgUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIMaW50ZWdlckVudHJ5CQDMCAIJAQ1rZXlXaXRoZHJhd2FsAAkAzAgCAAAFA25pbAUDbmlsBQNuaWwJAJQKAgUHYWN0aW9ucwUOZmFjdG9yeUFjdGlvbnMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEGaW52ZXN0ARB1c2VyQWRkcmVzc0J5dGVzBAtjaGVja0NhbGxlcgkBC29ubHlGYWN0b3J5AQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIEC3VzZXJBZGRyZXNzCQEHQWRkcmVzcwEFEHVzZXJBZGRyZXNzQnl0ZXMEE2N1cnJlbnRQZXJpb2RPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBEGtleUN1cnJlbnRQZXJpb2QACQEHd3JhcEVycgECDmludmFsaWQgcGVyaW9kBBJjdXJyZW50UHJpY2VPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBEWtleVByaWNlRm9yUGVyaW9kAQUTY3VycmVudFBlcmlvZE9yRmFpbAkBB3dyYXBFcnIBAg1pbnZhbGlkIHByaWNlBAdwYXltZW50AwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQkAkQMCCAUBaQhwYXltZW50cwAACQEIdGhyb3dFcnIBAhBpbnZhbGlkIHBheW1lbnRzBA0kdDAxMTAzNTExMjEyAwMJAAACCAUHcGF5bWVudAdhc3NldElkBQR1bml0CQBmAggFB3BheW1lbnQGYW1vdW50AAAHCQCUCgIIBQdwYXltZW50BmFtb3VudAgFB3BheW1lbnQHYXNzZXRJZAkBCHRocm93RXJyAQIWaW52YWxpZCBwYXltZW50IGFtb3VudAQNcGF5bWVudEFtb3VudAgFDSR0MDExMDM1MTEyMTICXzEEDnBheW1lbnRBc3NldElkCAUNJHQwMTEwMzUxMTIxMgJfMgQNbHBBc3NldEFtb3VudAMJAGYCBRJjdXJyZW50UHJpY2VPckZhaWwAAAkAawMFDXBheW1lbnRBbW91bnQFBlNDQUxFOAUSY3VycmVudFByaWNlT3JGYWlsAAAECGludmVzdGVkCQELdmFsdWVPckVsc2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQELa2V5SW52ZXN0ZWQBBQR1bml0AAAEB2FjdGlvbnMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUVdHJlYXN1cnlBZGRyZXNzT3JGYWlsBQ1wYXltZW50QW1vdW50BQ5wYXltZW50QXNzZXRJZAUDbmlsBA5mYWN0b3J5QWN0aW9ucwkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBC2tleUludmVzdGVkAQUEdW5pdAkAzAgCCQBkAgUIaW52ZXN0ZWQFDXBheW1lbnRBbW91bnQFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCB3JlaXNzdWUJAMwIAgUNbHBBc3NldEFtb3VudAUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAINdHJhbnNmZXJBc3NldAkAzAgCBRB1c2VyQWRkcmVzc0J5dGVzCQDMCAIFDWxwQXNzZXRBbW91bnQJAMwIAgUPbHBBc3NldElkT3JGYWlsBQNuaWwFA25pbAUDbmlsCQCUCgIFB2FjdGlvbnMFDmZhY3RvcnlBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3ARB1c2VyQWRkcmVzc0J5dGVzBAtjaGVja0NhbGxlcgkBC29ubHlGYWN0b3J5AQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIEC3VzZXJBZGRyZXNzCQEHQWRkcmVzcwEFEHVzZXJBZGRyZXNzQnl0ZXMEE2N1cnJlbnRQZXJpb2RPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBEGtleUN1cnJlbnRQZXJpb2QACQEHd3JhcEVycgECDmludmFsaWQgcGVyaW9kBAdwYXltZW50AwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQkAkQMCCAUBaQhwYXltZW50cwAACQEIdGhyb3dFcnIBCQEHd3JhcEVycgECEGludmFsaWQgcGF5bWVudHMEDnBheW1lbnRBc3NldElkAwkAAAIIBQdwYXltZW50B2Fzc2V0SWQFD2xwQXNzZXRJZE9yRmFpbAUPbHBBc3NldElkT3JGYWlsCQEIdGhyb3dFcnIBAhVpbnZhbGlkIHBheW1lbnQgYXNzZXQEDXBheW1lbnRBbW91bnQDCQBmAggFB3BheW1lbnQGYW1vdW50AAAIBQdwYXltZW50BmFtb3VudAkBCHRocm93RXJyAQIWaW52YWxpZCBwYXltZW50IGFtb3VudAQKd2l0aGRyYXdhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBDWtleVdpdGhkcmF3YWwAAAAEB2FjdGlvbnMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUUZmFjdG9yeUFkZHJlc3NPckZhaWwFDXBheW1lbnRBbW91bnQFDnBheW1lbnRBc3NldElkBQNuaWwEDmZhY3RvcnlBY3Rpb25zCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDGludGVnZXJFbnRyeQkAzAgCCQENa2V5V2l0aGRyYXdhbAAJAMwIAgkAZAIFCndpdGhkcmF3YWwFDXBheW1lbnRBbW91bnQFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCC3N0cmluZ0VudHJ5CQDMCAIJARRrZXlXaXRoZHJhd2FsUmVxdWVzdAIFC3VzZXJBZGRyZXNzCAUBaQ10cmFuc2FjdGlvbklkCQDMCAIJARZ2YWx1ZVdpdGhkcmF3YWxSZXF1ZXN0BAUHUEVORElORwUNcGF5bWVudEFtb3VudAkAZAIFE2N1cnJlbnRQZXJpb2RPckZhaWwAAQUEdW5pdAUDbmlsBQNuaWwFA25pbAMJAAACBQ5mYWN0b3J5QWN0aW9ucwUOZmFjdG9yeUFjdGlvbnMJAJQKAgUHYWN0aW9ucwUOZmFjdG9yeUFjdGlvbnMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOY2FuY2VsV2l0aGRyYXcCEHVzZXJBZGRyZXNzQnl0ZXMEdHhJZAQLY2hlY2tDYWxsZXIJAQtvbmx5RmFjdG9yeQEFAWkDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyBAt1c2VyQWRkcmVzcwkBB0FkZHJlc3MBBRB1c2VyQWRkcmVzc0J5dGVzBBd3aXRoZHJhd2FsUmVxdWVzdE9wdGlvbgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEUa2V5V2l0aGRyYXdhbFJlcXVlc3QCBQt1c2VyQWRkcmVzcwUEdHhJZAkBB3dyYXBFcnIBAhppbnZhbGlkIHdpdGhkcmF3YWwgcmVxdWVzdAQTY3VycmVudFBlcmlvZE9yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEQa2V5Q3VycmVudFBlcmlvZAAJAQd3cmFwRXJyAQIOaW52YWxpZCBwZXJpb2QEDSR0MDEzNjE1MTM3MjgJASFwYXJzZVdpdGhkcmF3YWxSZXF1ZXN0VmFsdWVPckZhaWwBBRd3aXRoZHJhd2FsUmVxdWVzdE9wdGlvbgQGc3RhdHVzCAUNJHQwMTM2MTUxMzcyOAJfMQQNbHBBc3NldEFtb3VudAgFDSR0MDEzNjE1MTM3MjgCXzIEDHRhcmdldFBlcmlvZAgFDSR0MDEzNjE1MTM3MjgCXzMECWNsYWltVHhJZAgFDSR0MDEzNjE1MTM3MjgCXzQEBmNoZWNrcwkAzAgCAwkAAAIFBnN0YXR1cwUHUEVORElORwYJAQh0aHJvd0VycgECIWludmFsaWQgd2l0aGRyYXdhbCByZXF1ZXN0IHN0YXR1cwkAzAgCAwkAZgIFDHRhcmdldFBlcmlvZAUTY3VycmVudFBlcmlvZE9yRmFpbAYJAQh0aHJvd0VycgECIWludmFsaWQgd2l0aGRyYXdhbCByZXF1ZXN0IHBlcmlvZAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBAp3aXRoZHJhd2FsCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJAQ1rZXlXaXRoZHJhd2FsAAkBB3dyYXBFcnIBAh9pbnZhbGlkIHRvdGFsIHdpdGhkcmF3YWwgYW1vdW50BA5mYWN0b3J5QWN0aW9ucwkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBDWtleVdpdGhkcmF3YWwACQDMCAIDCQBnAgUKd2l0aGRyYXdhbAUNbHBBc3NldEFtb3VudAkAZQIFCndpdGhkcmF3YWwFDWxwQXNzZXRBbW91bnQJAQh0aHJvd0VycgECGWludmFsaWQgd2l0aGRyYXdhbCBhbW91bnQFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCC2RlbGV0ZUVudHJ5CQDMCAIJARRrZXlXaXRoZHJhd2FsUmVxdWVzdAIFC3VzZXJBZGRyZXNzBQR0eElkBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAg10cmFuc2ZlckFzc2V0CQDMCAIFEHVzZXJBZGRyZXNzQnl0ZXMJAMwIAgUNbHBBc3NldEFtb3VudAkAzAgCBQ9scEFzc2V0SWRPckZhaWwFA25pbAUDbmlsBQNuaWwDCQAAAgUOZmFjdG9yeUFjdGlvbnMFDmZhY3RvcnlBY3Rpb25zCQCUCgIFA25pbAUOZmFjdG9yeUFjdGlvbnMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKY2xhaW1XYXZlcwIQdXNlckFkZHJlc3NCeXRlcwR0eElkBAtjaGVja0NhbGxlcgkBC29ubHlGYWN0b3J5AQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIEC3VzZXJBZGRyZXNzCQEHQWRkcmVzcwEFEHVzZXJBZGRyZXNzQnl0ZXMEE2N1cnJlbnRQZXJpb2RPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBEGtleUN1cnJlbnRQZXJpb2QACQEHd3JhcEVycgECDmludmFsaWQgcGVyaW9kBBd3aXRoZHJhd2FsUmVxdWVzdE9wdGlvbgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEUa2V5V2l0aGRyYXdhbFJlcXVlc3QCBQt1c2VyQWRkcmVzcwUEdHhJZAkBB3dyYXBFcnIBAhppbnZhbGlkIHdpdGhkcmF3YWwgcmVxdWVzdAQNJHQwMTUwNjAxNTE3MwkBIXBhcnNlV2l0aGRyYXdhbFJlcXVlc3RWYWx1ZU9yRmFpbAEFF3dpdGhkcmF3YWxSZXF1ZXN0T3B0aW9uBAZzdGF0dXMIBQ0kdDAxNTA2MDE1MTczAl8xBA1scEFzc2V0QW1vdW50CAUNJHQwMTUwNjAxNTE3MwJfMgQMdGFyZ2V0UGVyaW9kCAUNJHQwMTUwNjAxNTE3MwJfMwQJY2xhaW1UeElkCAUNJHQwMTUwNjAxNTE3MwJfNAMJAAACBQZzdGF0dXMFCEZJTklTSEVECQEIdGhyb3dFcnIBAiFpbnZhbGlkIHdpdGhkcmF3YWwgcmVxdWVzdCBzdGF0dXMDCQBmAgUMdGFyZ2V0UGVyaW9kBRNjdXJyZW50UGVyaW9kT3JGYWlsCQEIdGhyb3dFcnIBAiFpbnZhbGlkIHdpdGhkcmF3YWwgcmVxdWVzdCBwZXJpb2QEC3ByaWNlT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARFrZXlQcmljZUZvclBlcmlvZAEFDHRhcmdldFBlcmlvZAkBB3dyYXBFcnIBAg1pbnZhbGlkIHByaWNlBAZhbW91bnQDCQBmAgULcHJpY2VPckZhaWwAAAkAawMFDWxwQXNzZXRBbW91bnQFC3ByaWNlT3JGYWlsBQZTQ0FMRTgAAAQOZmFjdG9yeUFjdGlvbnMJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAILc3RyaW5nRW50cnkJAMwIAgkBFGtleVdpdGhkcmF3YWxSZXF1ZXN0AgULdXNlckFkZHJlc3MFBHR4SWQJAMwIAgkBFnZhbHVlV2l0aGRyYXdhbFJlcXVlc3QEBQhGSU5JU0hFRAUNbHBBc3NldEFtb3VudAUMdGFyZ2V0UGVyaW9kCAUBaQ10cmFuc2FjdGlvbklkBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgRidXJuCQDMCAIFDWxwQXNzZXRBbW91bnQFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDXRyYW5zZmVyV2F2ZXMJAMwIAgUQdXNlckFkZHJlc3NCeXRlcwkAzAgCBQZhbW91bnQFA25pbAUDbmlsBQNuaWwJAJQKAgUDbmlsBQ5mYWN0b3J5QWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ1wcm9jZXNzQmxvY2tzARB1c2VyQWRkcmVzc0J5dGVzBAtjaGVja0NhbGxlcgkBC29ubHlGYWN0b3J5AQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIEC3VzZXJBZGRyZXNzCQEHQWRkcmVzcwEFEHVzZXJBZGRyZXNzQnl0ZXMEE2N1cnJlbnRQZXJpb2RPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBEGtleUN1cnJlbnRQZXJpb2QACQEHd3JhcEVycgECDmludmFsaWQgcGVyaW9kBAxwZXJpb2RMZW5ndGgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBD2tleVBlcmlvZExlbmd0aAAJAQd3cmFwRXJyAQIVaW52YWxpZCBwZXJpb2QgbGVuZ3RoBBJjdXJyZW50U3RhcnRIZWlnaHQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBDmtleVN0YXJ0SGVpZ2h0AQUTY3VycmVudFBlcmlvZE9yRmFpbAkBB3dyYXBFcnIBAhRpbnZhbGlkIHN0YXJ0IGhlaWdodAQSY3VycmVudFByaWNlT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARFrZXlQcmljZUZvclBlcmlvZAEFE2N1cnJlbnRQZXJpb2RPckZhaWwJAQd3cmFwRXJyAQINaW52YWxpZCBwcmljZQQSbmV4dEJsb2NrVG9Qcm9jZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARVrZXlOZXh0QmxvY2tUb1Byb2Nlc3MACQEHd3JhcEVycgECHWludmFsaWQgbmV4dCBibG9jayB0byBwcm9jZXNzBA9wZXJpb2RFbmRIZWlnaHQJAGUCCQBkAgUSY3VycmVudFN0YXJ0SGVpZ2h0BQxwZXJpb2RMZW5ndGgAAQQcYmxvY2tzUHJvY2Vzc2luZ0JhdGNoU2l6ZU1heAAoBBlibG9ja3NQcm9jZXNzaW5nQmF0Y2hTaXplAwMDCQBnAgUGaGVpZ2h0BRJuZXh0QmxvY2tUb1Byb2Nlc3MDCQBnAgUSbmV4dEJsb2NrVG9Qcm9jZXNzBRJjdXJyZW50U3RhcnRIZWlnaHQGCQAAAgUTY3VycmVudFBlcmlvZE9yRmFpbAAABwkAZwIFD3BlcmlvZEVuZEhlaWdodAUSbmV4dEJsb2NrVG9Qcm9jZXNzBwkAlwMBCQDMCAIJAGQCCQBlAgUPcGVyaW9kRW5kSGVpZ2h0BRJuZXh0QmxvY2tUb1Byb2Nlc3MAAQkAzAgCBRxibG9ja3NQcm9jZXNzaW5nQmF0Y2hTaXplTWF4BQNuaWwJAQh0aHJvd0VycgEJAQd3cmFwRXJyAQIUaW52YWxpZCB0YXJnZXQgYmxvY2sEFWJsb2NrUHJvY2Vzc2luZ1Jld2FyZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEYa2V5QmxvY2tQcm9jZXNzaW5nUmV3YXJkAAkBB3dyYXBFcnIBAh9pbnZhbGlkIGJsb2NrIHByb2Nlc3NpbmcgcmV3YXJkBCBibG9ja1Byb2Nlc3NpbmdSZXdhcmRCeUdlbmVyYXRvcgkAaQIFFWJsb2NrUHJvY2Vzc2luZ1Jld2FyZAUZYmxvY2tzUHJvY2Vzc2luZ0JhdGNoU2l6ZQQpYmxvY2tQcm9jZXNzaW5nUmV3YXJkQnlHZW5lcmF0b3JSZW1haW5kZXIJAGUCBRVibG9ja1Byb2Nlc3NpbmdSZXdhcmQJAGgCBSBibG9ja1Byb2Nlc3NpbmdSZXdhcmRCeUdlbmVyYXRvcgUZYmxvY2tzUHJvY2Vzc2luZ0JhdGNoU2l6ZQoBA21hcAIDYWNjA2luYwMJAGcCBQNpbmMFGWJsb2Nrc1Byb2Nlc3NpbmdCYXRjaFNpemUFA2FjYwQRdGFyZ2V0QmxvY2tIZWlnaHQJAGQCBRJuZXh0QmxvY2tUb1Byb2Nlc3MFA2luYwQPdGFyZ2V0QmxvY2tJbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAO0HAQURdGFyZ2V0QmxvY2tIZWlnaHQJAQd3cmFwRXJyAQISaW52YWxpZCBibG9jayBpbmZvBBR0cmVhc3VyeVJld2FyZE9yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQEPcmV3YXJkRm9yT3B0aW9uAggFD3RhcmdldEJsb2NrSW5mbwdyZXdhcmRzBRV0cmVhc3VyeUFkZHJlc3NPckZhaWwJAQd3cmFwRXJyAQkArAICAiNpbnZhbGlkIHRyZWFzdXJ5IHJld2FyZCBmb3IgaGVpZ2h0IAkApAMBBRF0YXJnZXRCbG9ja0hlaWdodAQJZ2VuZXJhdG9yCAUPdGFyZ2V0QmxvY2tJbmZvCWdlbmVyYXRvcgQJYXZhaWxhYmxlCQELdmFsdWVPckVsc2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEMa2V5QXZhaWxhYmxlAQUJZ2VuZXJhdG9yAAAEDGNhbGxlclJld2FyZAMJAAACBQNpbmMJAGUCBRlibG9ja3NQcm9jZXNzaW5nQmF0Y2hTaXplAAEJAGQCBSBibG9ja1Byb2Nlc3NpbmdSZXdhcmRCeUdlbmVyYXRvcgUpYmxvY2tQcm9jZXNzaW5nUmV3YXJkQnlHZW5lcmF0b3JSZW1haW5kZXIFIGJsb2NrUHJvY2Vzc2luZ1Jld2FyZEJ5R2VuZXJhdG9yBA1scEFzc2V0QW1vdW50AwkAZgIFEmN1cnJlbnRQcmljZU9yRmFpbAAACQBrAwkAZQIFFHRyZWFzdXJ5UmV3YXJkT3JGYWlsBQxjYWxsZXJSZXdhcmQFBlNDQUxFOAUSY3VycmVudFByaWNlT3JGYWlsAAAEFGZhY3RvcnlBY3Rpb25zU2luZ2xlCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCC3N0cmluZ0VudHJ5CQDMCAIJARFrZXlCbG9ja1Byb2Nlc3NlZAEFEXRhcmdldEJsb2NrSGVpZ2h0CQDMCAIJALkJAgkAzAgCCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQJAMwIAgkApAMBBRNjdXJyZW50UGVyaW9kT3JGYWlsCQDMCAIJAKUIAQUJZ2VuZXJhdG9yCQDMCAIJANgEAQUQdXNlckFkZHJlc3NCeXRlcwkAzAgCCQCkAwEFFHRyZWFzdXJ5UmV3YXJkT3JGYWlsCQDMCAIJAKQDAQUMY2FsbGVyUmV3YXJkCQDMCAIJAKQDAQUNbHBBc3NldEFtb3VudAUDbmlsBQNTRVAFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDGludGVnZXJFbnRyeQkAzAgCCQEMa2V5QXZhaWxhYmxlAQUJZ2VuZXJhdG9yCQDMCAIJAGQCBQlhdmFpbGFibGUFDWxwQXNzZXRBbW91bnQFA25pbAUDbmlsBQNuaWwDCQAAAgUUZmFjdG9yeUFjdGlvbnNTaW5nbGUFFGZhY3RvcnlBY3Rpb25zU2luZ2xlCQBkAgUDYWNjBQ1scEFzc2V0QW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBARsaXN0CQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoJAMwIAgALCQDMCAIADAkAzAgCAA0JAMwIAgAOCQDMCAIADwkAzAgCABAJAMwIAgARCQDMCAIAEgkAzAgCABMJAMwIAgAUCQDMCAIAFQkAzAgCABYJAMwIAgAXCQDMCAIAGAkAzAgCABkJAMwIAgAaCQDMCAIAGwkAzAgCABwJAMwIAgAdCQDMCAIAHgkAzAgCAB8JAMwIAgAgCQDMCAIAIQkAzAgCACIJAMwIAgAjCQDMCAIAJAkAzAgCACUJAMwIAgAmCQDMCAIAJwUDbmlsBBJscEFzc2V0QW1vdW50VG90YWwKAAIkbAUEbGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEDbWFwAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA0MAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoAwkAAAIFEmxwQXNzZXRBbW91bnRUb3RhbAUSbHBBc3NldEFtb3VudFRvdGFsBAdhY3Rpb25zCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDXRyYW5zZmVyV2F2ZXMJAMwIAgUQdXNlckFkZHJlc3NCeXRlcwkAzAgCBRVibG9ja1Byb2Nlc3NpbmdSZXdhcmQFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCB3JlaXNzdWUJAMwIAgUSbHBBc3NldEFtb3VudFRvdGFsBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBFWtleU5leHRCbG9ja1RvUHJvY2VzcwAJAMwIAgkAZAIFEm5leHRCbG9ja1RvUHJvY2VzcwUZYmxvY2tzUHJvY2Vzc2luZ0JhdGNoU2l6ZQUDbmlsBQNuaWwFA25pbAMJAAACBQdhY3Rpb25zBQdhY3Rpb25zCQCUCgIFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXnAMJ6K", "height": 2635187, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2exwXVqToTEqykJyzsPpZ5H9hRhvUQxk17HzDyuyARnJ Next: CK4sYcu67kpWrryazaT54bguTXR2LWzHnenFWnhhvLGn Diff:
OldNewDifferences
289289 let newPrice = fraction(investedWavesAmountNew, SCALE8, lpAssetQuantity)
290290 let lpAssetAmountToBurn = valueOrElse(getInteger(factoryAddressOrFail, keyWithdrawal()), 0)
291291 let paymentAmountMin = max([0, fraction(lpAssetAmountToBurn, newPrice, SCALE8)])
292- let checkPaymentAmount = if (if ((paymentAmountMin == 0))
292+ let paymentOption = if ((size(i.payments) > 0))
293+ then i.payments[0]
294+ else unit
295+ let paymentAmount = value(paymentOption).amount
296+ let paymentAssetId = value(paymentOption).assetId
297+ let checkPayment = if (if ((paymentAmountMin == 0))
293298 then true
294- else if (if ((size(i.payments) == 1))
295- then (i.payments[0].assetId == unit)
299+ else if (if ((paymentOption != unit))
300+ then (paymentAssetId == unit)
296301 else false)
297- then (i.payments[0].amount >= paymentAmountMin)
302+ then (paymentAmount >= paymentAmountMin)
298303 else false)
299304 then true
300305 else throwErr(("invalid payments, payment amount min: " + toString(paymentAmountMin)))
301- if ((checkPaymentAmount == checkPaymentAmount))
306+ if ((checkPayment == checkPayment))
302307 then {
308+ let actions = if ((paymentOption != unit))
309+ then [ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId)]
310+ else nil
303311 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)]
304- $Tuple2(nil, factoryActions)
312+ $Tuple2(actions, factoryActions)
305313 }
306314 else throw("Strict value is not equal to itself.")
307315 }
323331 let payment = if ((size(i.payments) == 1))
324332 then i.payments[0]
325333 else throwErr("invalid payments")
326- let paymentAmount = if (if ((payment.assetId == unit))
334+ let $t01103511212 = if (if ((payment.assetId == unit))
327335 then (payment.amount > 0)
328336 else false)
329- then payment.amount
337+ then $Tuple2(payment.amount, payment.assetId)
330338 else throwErr("invalid payment amount")
339+ let paymentAmount = $t01103511212._1
340+ let paymentAssetId = $t01103511212._2
331341 let lpAssetAmount = if ((currentPriceOrFail > 0))
332342 then fraction(paymentAmount, SCALE8, currentPriceOrFail)
333343 else 0
334344 let invested = valueOrElse(getInteger(factoryAddressOrFail, keyInvested(unit)), 0)
335- let factoryActions = [invoke(factoryAddressOrFail, "integerEntry", [keyInvested(unit), (invested + paymentAmount)], nil), invoke(factoryAddressOrFail, "reissue", [lpAssetAmount], nil), invoke(factoryAddressOrFail, "transferAsset", [userAddressBytes, lpAssetAmount, lpAssetIdOrFail], nil), invoke(factoryAddressOrFail, "transferWaves", [treasuryAddressOrFail.bytes, paymentAmount], [AttachedPayment(unit, paymentAmount)])]
336- $Tuple2(nil, factoryActions)
345+ let actions = [ScriptTransfer(treasuryAddressOrFail, paymentAmount, paymentAssetId)]
346+ let factoryActions = [invoke(factoryAddressOrFail, "integerEntry", [keyInvested(unit), (invested + paymentAmount)], nil), invoke(factoryAddressOrFail, "reissue", [lpAssetAmount], nil), invoke(factoryAddressOrFail, "transferAsset", [userAddressBytes, lpAssetAmount, lpAssetIdOrFail], nil)]
347+ $Tuple2(actions, factoryActions)
337348 }
338349 else throw("Strict value is not equal to itself.")
339350 }
357368 then payment.amount
358369 else throwErr("invalid payment amount")
359370 let withdrawal = valueOrElse(getInteger(factoryAddressOrFail, keyWithdrawal()), 0)
371+ let actions = [ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId)]
360372 let factoryActions = [invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawal(), (withdrawal + paymentAmount)], nil), invoke(factoryAddressOrFail, "stringEntry", [keyWithdrawalRequest(userAddress, i.transactionId), valueWithdrawalRequest(PENDING, paymentAmount, (currentPeriodOrFail + 1), unit)], nil)]
361373 if ((factoryActions == factoryActions))
362- then $Tuple2([ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId)], factoryActions)
374+ then $Tuple2(actions, factoryActions)
363375 else throw("Strict value is not equal to itself.")
364376 }
365377 else throw("Strict value is not equal to itself.")
375387 let userAddress = Address(userAddressBytes)
376388 let withdrawalRequestOption = valueOrErrorMessage(getString(factoryAddressOrFail, keyWithdrawalRequest(userAddress, txId)), wrapErr("invalid withdrawal request"))
377389 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
378- let $t01330013413 = parseWithdrawalRequestValueOrFail(withdrawalRequestOption)
379- let status = $t01330013413._1
380- let lpAssetAmount = $t01330013413._2
381- let targetPeriod = $t01330013413._3
382- let claimTxId = $t01330013413._4
390+ let $t01361513728 = parseWithdrawalRequestValueOrFail(withdrawalRequestOption)
391+ let status = $t01361513728._1
392+ let lpAssetAmount = $t01361513728._2
393+ let targetPeriod = $t01361513728._3
394+ let claimTxId = $t01361513728._4
383395 let checks = [if ((status == PENDING))
384396 then true
385397 else throwErr("invalid withdrawal request status"), if ((targetPeriod > currentPeriodOrFail))
410422 let userAddress = Address(userAddressBytes)
411423 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
412424 let withdrawalRequestOption = valueOrErrorMessage(getString(factoryAddressOrFail, keyWithdrawalRequest(userAddress, txId)), wrapErr("invalid withdrawal request"))
413- let $t01474514858 = parseWithdrawalRequestValueOrFail(withdrawalRequestOption)
414- let status = $t01474514858._1
415- let lpAssetAmount = $t01474514858._2
416- let targetPeriod = $t01474514858._3
417- let claimTxId = $t01474514858._4
425+ let $t01506015173 = parseWithdrawalRequestValueOrFail(withdrawalRequestOption)
426+ let status = $t01506015173._1
427+ let lpAssetAmount = $t01506015173._2
428+ let targetPeriod = $t01506015173._3
429+ let claimTxId = $t01506015173._4
418430 if ((status == FINISHED))
419431 then throwErr("invalid withdrawal request status")
420432 else if ((targetPeriod > currentPeriodOrFail))
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 SCALE6 = 1000000
1111
1212 let PENDING = "PENDING"
1313
1414 let FINISHED = "FINISHED"
1515
1616 let WAVES = "WAVES"
1717
1818 func wrapErr (s) = ((CONTRACT_NAME + ": ") + s)
1919
2020
2121 func throwErr (s) = throw(wrapErr(s))
2222
2323
2424 func assetIdToString (assetId) = match assetId {
2525 case b: ByteVector =>
2626 toBase58String(b)
2727 case _: Unit =>
2828 WAVES
2929 case _ =>
3030 throw("Match error")
3131 }
3232
3333
3434 func abs (n) = if ((0 > n))
3535 then -(n)
3636 else n
3737
3838
3939 func keyFactoryAddress () = makeString(["%s", "factory"], SEP)
4040
4141
4242 func keyLpAssetId () = makeString(["%s", "lpAssetId"], SEP)
4343
4444
4545 func keyXtnAssetId () = makeString(["%s", "xtnAssetId"], SEP)
4646
4747
4848 func keyTreasuryAddress () = makeString(["%s", "treasury"], SEP)
4949
5050
5151 func keyInvested (assetId) = makeString(["%s%s", "invested", assetIdToString(assetId)], SEP)
5252
5353
5454 func keyAvailable (userAddress) = makeString(["%s%s", "available", toString(userAddress)], SEP)
5555
5656
5757 func keyClaimed (userAddress) = makeString(["%s%s", "claimed", toString(userAddress)], SEP)
5858
5959
6060 func keyCurrentPeriod () = makeString(["%s", "currentPeriod"], SEP)
6161
6262
6363 func keyPriceForPeriod (period) = makeString(["%s%d", "price", toString(period)], SEP)
6464
6565
6666 func keyStartHeight (period) = makeString(["%s%d", "startHeight", toString(period)], SEP)
6767
6868
6969 func keyPeriodLength () = "%s__periodLength"
7070
7171
7272 func keyBlockProcessingReward () = "%s__blockProcessingReward"
7373
7474
7575 func keyNextBlockToProcess () = "%s__nextBlockToProcess"
7676
7777
7878 func keyBlockProcessed (height) = makeString(["%s%d", "blockProcessed", toString(height)], SEP)
7979
8080
8181 func keyWithdrawal () = "%s__withdrawal"
8282
8383
8484 func keyWithdrawalRequest (userAddress,txId) = makeString(["%s%s%s", "withdrawal", toString(userAddress), toBase58String(txId)], SEP)
8585
8686
8787 func valueWithdrawalRequest (status,lpAssetAmount,targetPeriod,claimTxId) = {
8888 let claimTxIdStr = match claimTxId {
8989 case b: ByteVector =>
9090 toBase58String(b)
9191 case _: Unit =>
9292 "SOON"
9393 case _ =>
9494 throw("Match error")
9595 }
9696 makeString(["%s%d%d%s", status, toString(lpAssetAmount), toString(targetPeriod), claimTxIdStr], SEP)
9797 }
9898
9999
100100 func parseWithdrawalRequestValueOrFail (s) = {
101101 let parts = split(s, SEP)
102102 if ((size(parts) == 5))
103103 then {
104104 let status = parts[1]
105105 let lpAssetAmount = valueOrErrorMessage(parseInt(parts[2]), wrapErr("invalid lpAssetAmount"))
106106 let targetPeriod = valueOrErrorMessage(parseInt(parts[3]), wrapErr("invalid targetPeriod"))
107107 let claimTxId = parts[4]
108108 $Tuple4(status, lpAssetAmount, targetPeriod, claimTxId)
109109 }
110110 else throwErr("invalid withdrawal request value")
111111 }
112112
113113
114114 let factoryAddressOption = match getString(this, keyFactoryAddress()) {
115115 case s: String =>
116116 addressFromString(s)
117117 case _: Unit =>
118118 unit
119119 case _ =>
120120 throw("Match error")
121121 }
122122
123123 let factoryAddressOrFail = valueOrErrorMessage(factoryAddressOption, wrapErr("invalid factory address"))
124124
125125 let lpAssetIdOption = match factoryAddressOption {
126126 case a: Address =>
127127 match getString(a, keyLpAssetId()) {
128128 case s: String =>
129129 fromBase58String(s)
130130 case _: Unit =>
131131 unit
132132 case _ =>
133133 throw("Match error")
134134 }
135135 case _: Unit =>
136136 unit
137137 case _ =>
138138 throw("Match error")
139139 }
140140
141141 let lpAssetIdOrFail = valueOrErrorMessage(lpAssetIdOption, wrapErr("invalid lpAssetId"))
142142
143143 let xtnAssetIdOption = match factoryAddressOption {
144144 case a: Address =>
145145 match getString(a, keyXtnAssetId()) {
146146 case s: String =>
147147 fromBase58String(s)
148148 case _: Unit =>
149149 unit
150150 case _ =>
151151 throw("Match error")
152152 }
153153 case _: Unit =>
154154 unit
155155 case _ =>
156156 throw("Match error")
157157 }
158158
159159 let xtnAssetIdOrFail = valueOrErrorMessage(xtnAssetIdOption, wrapErr("invalid xtnAssetId"))
160160
161161 let treasuryAddressOption = match factoryAddressOption {
162162 case a: Address =>
163163 match getString(a, keyTreasuryAddress()) {
164164 case s: String =>
165165 addressFromString(s)
166166 case _: Unit =>
167167 unit
168168 case _ =>
169169 throw("Match error")
170170 }
171171 case _: Unit =>
172172 unit
173173 case _ =>
174174 throw("Match error")
175175 }
176176
177177 let treasuryAddressOrFail = valueOrErrorMessage(treasuryAddressOption, wrapErr("invalid treasury address"))
178178
179179 func onlyAddress (i,address) = if ((i.caller == address))
180180 then true
181181 else throwErr("permission denied")
182182
183183
184184 func onlyFactory (i) = onlyAddress(i, factoryAddressOrFail)
185185
186186
187187 func rewardForOption (rewards,target) = {
188188 let s = size(rewards)
189189 let $t040964121 = rewards[0]
190190 let a0 = $t040964121._1
191191 let r0 = $t040964121._2
192192 let $t041244149 = rewards[1]
193193 let a1 = $t041244149._1
194194 let r1 = $t041244149._2
195195 let $t041524177 = rewards[2]
196196 let a2 = $t041524177._1
197197 let r2 = $t041524177._2
198198 if (if ((s > 0))
199199 then (a0 == target)
200200 else false)
201201 then r0
202202 else if (if ((s > 1))
203203 then (a1 == target)
204204 else false)
205205 then r1
206206 else if (if ((s > 2))
207207 then (a2 == target)
208208 else false)
209209 then r2
210210 else unit
211211 }
212212
213213
214214 @Callable(i)
215215 func claimLP (userAddressBytes) = {
216216 let checkCaller = onlyFactory(i)
217217 if ((checkCaller == checkCaller))
218218 then {
219219 let userAddress = Address(userAddressBytes)
220220 let available = valueOrElse(getInteger(factoryAddressOrFail, keyAvailable(userAddress)), 0)
221221 let claimed = valueOrElse(getInteger(factoryAddressOrFail, keyClaimed(userAddress)), 0)
222222 let factoryActions = if ((available > 0))
223223 then [invoke(factoryAddressOrFail, "transferAsset", [userAddressBytes, available, lpAssetIdOrFail], nil), invoke(factoryAddressOrFail, "integerEntry", [keyAvailable(userAddress), 0], nil), invoke(factoryAddressOrFail, "integerEntry", [keyClaimed(userAddress), (claimed + available)], nil)]
224224 else throwErr("nothing to claim")
225225 $Tuple2(nil, factoryActions)
226226 }
227227 else throw("Strict value is not equal to itself.")
228228 }
229229
230230
231231
232232 @Callable(i)
233233 func finalize (userAddressBytes,newTreasuryVolumeInWaves,xtnPrice,pwrManagersBonus,treasuryVolumeDiffAllocationCoef) = {
234234 let checkCaller = onlyFactory(i)
235235 if ((checkCaller == checkCaller))
236236 then {
237237 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
238238 let periodLength = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPeriodLength()), wrapErr("invalid period length"))
239239 let currentStartHeight = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyStartHeight(currentPeriodOrFail)), wrapErr("invalid start height"))
240240 let currentPriceOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPriceForPeriod(currentPeriodOrFail)), wrapErr("invalid price"))
241241 let nextBlockToProcess = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyNextBlockToProcess()), wrapErr("invalid next block to process"))
242242 let periodEndHeight = ((currentStartHeight + periodLength) - 1)
243243 let checks = [if ((i.originCaller == treasuryAddressOrFail))
244244 then true
245245 else throwErr("permission denied"), if ((nextBlockToProcess > periodEndHeight))
246246 then true
247247 else throwErr("unprocessed blocks"), if ((newTreasuryVolumeInWaves >= 0))
248248 then true
249249 else throwErr("invalid new treasury volume"), if ((xtnPrice >= 0))
250250 then true
251251 else throwErr("invalid XTN price"), if (if ((pwrManagersBonus >= 0))
252252 then (SCALE8 >= pwrManagersBonus)
253253 else false)
254254 then true
255255 else throwErr("invalid PWR managers bonus"), if (if ((treasuryVolumeDiffAllocationCoef >= -(SCALE8)))
256256 then (SCALE8 >= treasuryVolumeDiffAllocationCoef)
257257 else false)
258258 then true
259259 else throwErr("invalid treasury volume diff allocation coefficient")]
260260 if ((checks == checks))
261261 then {
262262 let investedXtnAmount = valueOrElse(getInteger(factoryAddressOrFail, keyInvested(xtnAssetIdOrFail)), 0)
263263 let investedWavesAmount = valueOrElse(getInteger(factoryAddressOrFail, keyInvested(unit)), 0)
264264 let investedXtnAmountInWaves = fraction(investedXtnAmount, xtnPrice, SCALE6)
265265 let currentTreasuryVolumeInWaves = (investedXtnAmountInWaves + investedWavesAmount)
266266 let profitRaw = (newTreasuryVolumeInWaves - currentTreasuryVolumeInWaves)
267267 let pwrManagersBonusAmount = if ((profitRaw > 0))
268268 then fraction(profitRaw, pwrManagersBonus, SCALE8)
269269 else 0
270270 let profit = (profitRaw - pwrManagersBonusAmount)
271271 let donationPart = if ((currentTreasuryVolumeInWaves > 0))
272272 then fraction(investedXtnAmountInWaves, SCALE8, currentTreasuryVolumeInWaves)
273273 else 0
274274 let donationProfitPartRaw = fraction(profit, donationPart, SCALE8)
275275 let investmentProfitPartRaw = (profit - donationProfitPartRaw)
276276 let treasuryVolumeDiffAllocationCoefAbs = abs(treasuryVolumeDiffAllocationCoef)
277277 let amountToDonation = fraction(investmentProfitPartRaw, if ((0 > treasuryVolumeDiffAllocationCoef))
278278 then treasuryVolumeDiffAllocationCoefAbs
279279 else 0, SCALE8)
280280 let amountToInvestment = fraction(donationProfitPartRaw, if ((treasuryVolumeDiffAllocationCoef > 0))
281281 then treasuryVolumeDiffAllocationCoefAbs
282282 else 0, SCALE8)
283283 let donationProfitPart = ((donationProfitPartRaw - amountToInvestment) + amountToDonation)
284284 let investmentProfitPart = ((investmentProfitPartRaw - amountToDonation) + amountToInvestment)
285285 let investedWavesAmountNew = (investedWavesAmount + investmentProfitPart)
286286 let investedXtnAmountNew = fraction((investedXtnAmountInWaves + donationProfitPart), SCALE6, xtnPrice)
287287 let newPeriod = (currentPeriodOrFail + 1)
288288 let lpAssetQuantity = valueOrErrorMessage(assetInfo(lpAssetIdOrFail), wrapErr("invalid lpAsset info")).quantity
289289 let newPrice = fraction(investedWavesAmountNew, SCALE8, lpAssetQuantity)
290290 let lpAssetAmountToBurn = valueOrElse(getInteger(factoryAddressOrFail, keyWithdrawal()), 0)
291291 let paymentAmountMin = max([0, fraction(lpAssetAmountToBurn, newPrice, SCALE8)])
292- let checkPaymentAmount = if (if ((paymentAmountMin == 0))
292+ let paymentOption = if ((size(i.payments) > 0))
293+ then i.payments[0]
294+ else unit
295+ let paymentAmount = value(paymentOption).amount
296+ let paymentAssetId = value(paymentOption).assetId
297+ let checkPayment = if (if ((paymentAmountMin == 0))
293298 then true
294- else if (if ((size(i.payments) == 1))
295- then (i.payments[0].assetId == unit)
299+ else if (if ((paymentOption != unit))
300+ then (paymentAssetId == unit)
296301 else false)
297- then (i.payments[0].amount >= paymentAmountMin)
302+ then (paymentAmount >= paymentAmountMin)
298303 else false)
299304 then true
300305 else throwErr(("invalid payments, payment amount min: " + toString(paymentAmountMin)))
301- if ((checkPaymentAmount == checkPaymentAmount))
306+ if ((checkPayment == checkPayment))
302307 then {
308+ let actions = if ((paymentOption != unit))
309+ then [ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId)]
310+ else nil
303311 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)]
304- $Tuple2(nil, factoryActions)
312+ $Tuple2(actions, factoryActions)
305313 }
306314 else throw("Strict value is not equal to itself.")
307315 }
308316 else throw("Strict value is not equal to itself.")
309317 }
310318 else throw("Strict value is not equal to itself.")
311319 }
312320
313321
314322
315323 @Callable(i)
316324 func invest (userAddressBytes) = {
317325 let checkCaller = onlyFactory(i)
318326 if ((checkCaller == checkCaller))
319327 then {
320328 let userAddress = Address(userAddressBytes)
321329 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
322330 let currentPriceOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPriceForPeriod(currentPeriodOrFail)), wrapErr("invalid price"))
323331 let payment = if ((size(i.payments) == 1))
324332 then i.payments[0]
325333 else throwErr("invalid payments")
326- let paymentAmount = if (if ((payment.assetId == unit))
334+ let $t01103511212 = if (if ((payment.assetId == unit))
327335 then (payment.amount > 0)
328336 else false)
329- then payment.amount
337+ then $Tuple2(payment.amount, payment.assetId)
330338 else throwErr("invalid payment amount")
339+ let paymentAmount = $t01103511212._1
340+ let paymentAssetId = $t01103511212._2
331341 let lpAssetAmount = if ((currentPriceOrFail > 0))
332342 then fraction(paymentAmount, SCALE8, currentPriceOrFail)
333343 else 0
334344 let invested = valueOrElse(getInteger(factoryAddressOrFail, keyInvested(unit)), 0)
335- let factoryActions = [invoke(factoryAddressOrFail, "integerEntry", [keyInvested(unit), (invested + paymentAmount)], nil), invoke(factoryAddressOrFail, "reissue", [lpAssetAmount], nil), invoke(factoryAddressOrFail, "transferAsset", [userAddressBytes, lpAssetAmount, lpAssetIdOrFail], nil), invoke(factoryAddressOrFail, "transferWaves", [treasuryAddressOrFail.bytes, paymentAmount], [AttachedPayment(unit, paymentAmount)])]
336- $Tuple2(nil, factoryActions)
345+ let actions = [ScriptTransfer(treasuryAddressOrFail, paymentAmount, paymentAssetId)]
346+ let factoryActions = [invoke(factoryAddressOrFail, "integerEntry", [keyInvested(unit), (invested + paymentAmount)], nil), invoke(factoryAddressOrFail, "reissue", [lpAssetAmount], nil), invoke(factoryAddressOrFail, "transferAsset", [userAddressBytes, lpAssetAmount, lpAssetIdOrFail], nil)]
347+ $Tuple2(actions, factoryActions)
337348 }
338349 else throw("Strict value is not equal to itself.")
339350 }
340351
341352
342353
343354 @Callable(i)
344355 func withdraw (userAddressBytes) = {
345356 let checkCaller = onlyFactory(i)
346357 if ((checkCaller == checkCaller))
347358 then {
348359 let userAddress = Address(userAddressBytes)
349360 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
350361 let payment = if ((size(i.payments) == 1))
351362 then i.payments[0]
352363 else throwErr(wrapErr("invalid payments"))
353364 let paymentAssetId = if ((payment.assetId == lpAssetIdOrFail))
354365 then lpAssetIdOrFail
355366 else throwErr("invalid payment asset")
356367 let paymentAmount = if ((payment.amount > 0))
357368 then payment.amount
358369 else throwErr("invalid payment amount")
359370 let withdrawal = valueOrElse(getInteger(factoryAddressOrFail, keyWithdrawal()), 0)
371+ let actions = [ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId)]
360372 let factoryActions = [invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawal(), (withdrawal + paymentAmount)], nil), invoke(factoryAddressOrFail, "stringEntry", [keyWithdrawalRequest(userAddress, i.transactionId), valueWithdrawalRequest(PENDING, paymentAmount, (currentPeriodOrFail + 1), unit)], nil)]
361373 if ((factoryActions == factoryActions))
362- then $Tuple2([ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId)], factoryActions)
374+ then $Tuple2(actions, factoryActions)
363375 else throw("Strict value is not equal to itself.")
364376 }
365377 else throw("Strict value is not equal to itself.")
366378 }
367379
368380
369381
370382 @Callable(i)
371383 func cancelWithdraw (userAddressBytes,txId) = {
372384 let checkCaller = onlyFactory(i)
373385 if ((checkCaller == checkCaller))
374386 then {
375387 let userAddress = Address(userAddressBytes)
376388 let withdrawalRequestOption = valueOrErrorMessage(getString(factoryAddressOrFail, keyWithdrawalRequest(userAddress, txId)), wrapErr("invalid withdrawal request"))
377389 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
378- let $t01330013413 = parseWithdrawalRequestValueOrFail(withdrawalRequestOption)
379- let status = $t01330013413._1
380- let lpAssetAmount = $t01330013413._2
381- let targetPeriod = $t01330013413._3
382- let claimTxId = $t01330013413._4
390+ let $t01361513728 = parseWithdrawalRequestValueOrFail(withdrawalRequestOption)
391+ let status = $t01361513728._1
392+ let lpAssetAmount = $t01361513728._2
393+ let targetPeriod = $t01361513728._3
394+ let claimTxId = $t01361513728._4
383395 let checks = [if ((status == PENDING))
384396 then true
385397 else throwErr("invalid withdrawal request status"), if ((targetPeriod > currentPeriodOrFail))
386398 then true
387399 else throwErr("invalid withdrawal request period")]
388400 if ((checks == checks))
389401 then {
390402 let withdrawal = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyWithdrawal()), wrapErr("invalid total withdrawal amount"))
391403 let factoryActions = [invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawal(), if ((withdrawal >= lpAssetAmount))
392404 then (withdrawal - lpAssetAmount)
393405 else throwErr("invalid withdrawal amount")], nil), invoke(factoryAddressOrFail, "deleteEntry", [keyWithdrawalRequest(userAddress, txId)], nil), invoke(factoryAddressOrFail, "transferAsset", [userAddressBytes, lpAssetAmount, lpAssetIdOrFail], nil)]
394406 if ((factoryActions == factoryActions))
395407 then $Tuple2(nil, factoryActions)
396408 else throw("Strict value is not equal to itself.")
397409 }
398410 else throw("Strict value is not equal to itself.")
399411 }
400412 else throw("Strict value is not equal to itself.")
401413 }
402414
403415
404416
405417 @Callable(i)
406418 func claimWaves (userAddressBytes,txId) = {
407419 let checkCaller = onlyFactory(i)
408420 if ((checkCaller == checkCaller))
409421 then {
410422 let userAddress = Address(userAddressBytes)
411423 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
412424 let withdrawalRequestOption = valueOrErrorMessage(getString(factoryAddressOrFail, keyWithdrawalRequest(userAddress, txId)), wrapErr("invalid withdrawal request"))
413- let $t01474514858 = parseWithdrawalRequestValueOrFail(withdrawalRequestOption)
414- let status = $t01474514858._1
415- let lpAssetAmount = $t01474514858._2
416- let targetPeriod = $t01474514858._3
417- let claimTxId = $t01474514858._4
425+ let $t01506015173 = parseWithdrawalRequestValueOrFail(withdrawalRequestOption)
426+ let status = $t01506015173._1
427+ let lpAssetAmount = $t01506015173._2
428+ let targetPeriod = $t01506015173._3
429+ let claimTxId = $t01506015173._4
418430 if ((status == FINISHED))
419431 then throwErr("invalid withdrawal request status")
420432 else if ((targetPeriod > currentPeriodOrFail))
421433 then throwErr("invalid withdrawal request period")
422434 else {
423435 let priceOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPriceForPeriod(targetPeriod)), wrapErr("invalid price"))
424436 let amount = if ((priceOrFail > 0))
425437 then fraction(lpAssetAmount, priceOrFail, SCALE8)
426438 else 0
427439 let factoryActions = [invoke(factoryAddressOrFail, "stringEntry", [keyWithdrawalRequest(userAddress, txId), valueWithdrawalRequest(FINISHED, lpAssetAmount, targetPeriod, i.transactionId)], nil), invoke(factoryAddressOrFail, "burn", [lpAssetAmount], nil), invoke(factoryAddressOrFail, "transferWaves", [userAddressBytes, amount], nil)]
428440 $Tuple2(nil, factoryActions)
429441 }
430442 }
431443 else throw("Strict value is not equal to itself.")
432444 }
433445
434446
435447
436448 @Callable(i)
437449 func processBlocks (userAddressBytes) = {
438450 let checkCaller = onlyFactory(i)
439451 if ((checkCaller == checkCaller))
440452 then {
441453 let userAddress = Address(userAddressBytes)
442454 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
443455 let periodLength = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPeriodLength()), wrapErr("invalid period length"))
444456 let currentStartHeight = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyStartHeight(currentPeriodOrFail)), wrapErr("invalid start height"))
445457 let currentPriceOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPriceForPeriod(currentPeriodOrFail)), wrapErr("invalid price"))
446458 let nextBlockToProcess = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyNextBlockToProcess()), wrapErr("invalid next block to process"))
447459 let periodEndHeight = ((currentStartHeight + periodLength) - 1)
448460 let blocksProcessingBatchSizeMax = 40
449461 let blocksProcessingBatchSize = if (if (if ((height >= nextBlockToProcess))
450462 then if ((nextBlockToProcess >= currentStartHeight))
451463 then true
452464 else (currentPeriodOrFail == 0)
453465 else false)
454466 then (periodEndHeight >= nextBlockToProcess)
455467 else false)
456468 then min([((periodEndHeight - nextBlockToProcess) + 1), blocksProcessingBatchSizeMax])
457469 else throwErr(wrapErr("invalid target block"))
458470 let blockProcessingReward = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyBlockProcessingReward()), wrapErr("invalid block processing reward"))
459471 let blockProcessingRewardByGenerator = (blockProcessingReward / blocksProcessingBatchSize)
460472 let blockProcessingRewardByGeneratorRemainder = (blockProcessingReward - (blockProcessingRewardByGenerator * blocksProcessingBatchSize))
461473 func map (acc,inc) = if ((inc >= blocksProcessingBatchSize))
462474 then acc
463475 else {
464476 let targetBlockHeight = (nextBlockToProcess + inc)
465477 let targetBlockInfo = valueOrErrorMessage(blockInfoByHeight(targetBlockHeight), wrapErr("invalid block info"))
466478 let treasuryRewardOrFail = valueOrErrorMessage(rewardForOption(targetBlockInfo.rewards, treasuryAddressOrFail), wrapErr(("invalid treasury reward for height " + toString(targetBlockHeight))))
467479 let generator = targetBlockInfo.generator
468480 let available = valueOrElse(getInteger(factoryAddressOrFail, keyAvailable(generator)), 0)
469481 let callerReward = if ((inc == (blocksProcessingBatchSize - 1)))
470482 then (blockProcessingRewardByGenerator + blockProcessingRewardByGeneratorRemainder)
471483 else blockProcessingRewardByGenerator
472484 let lpAssetAmount = if ((currentPriceOrFail > 0))
473485 then fraction((treasuryRewardOrFail - callerReward), SCALE8, currentPriceOrFail)
474486 else 0
475487 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)]
476488 if ((factoryActionsSingle == factoryActionsSingle))
477489 then (acc + lpAssetAmount)
478490 else throw("Strict value is not equal to itself.")
479491 }
480492
481493 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]
482494 let lpAssetAmountTotal = {
483495 let $l = list
484496 let $s = size($l)
485497 let $acc0 = 0
486498 func $f0_1 ($a,$i) = if (($i >= $s))
487499 then $a
488500 else map($a, $l[$i])
489501
490502 func $f0_2 ($a,$i) = if (($i >= $s))
491503 then $a
492504 else throw("List size exceeds 40")
493505
494506 $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)
495507 }
496508 if ((lpAssetAmountTotal == lpAssetAmountTotal))
497509 then {
498510 let actions = [invoke(factoryAddressOrFail, "transferWaves", [userAddressBytes, blockProcessingReward], nil), invoke(factoryAddressOrFail, "reissue", [lpAssetAmountTotal], nil), invoke(factoryAddressOrFail, "integerEntry", [keyNextBlockToProcess(), (nextBlockToProcess + blocksProcessingBatchSize)], nil)]
499511 if ((actions == actions))
500512 then $Tuple2(nil, unit)
501513 else throw("Strict value is not equal to itself.")
502514 }
503515 else throw("Strict value is not equal to itself.")
504516 }
505517 else throw("Strict value is not equal to itself.")
506518 }
507519
508520
509521 @Verifier(tx)
510522 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
511523

github/deemru/w8io/026f985 
105.60 ms