tx · CwXCnZktP1z872FPSLhvN2YNM3eQnf9W7KkW8UFtY67r 3PGCkrHBxFMi7tz1xqnxgBpeNvn5E4M4g8S: -0.02400000 Waves 2022.08.26 13:52 [3266819] smart account 3PGCkrHBxFMi7tz1xqnxgBpeNvn5E4M4g8S > SELF 0.00000000 Waves
{ "type": 13, "id": "CwXCnZktP1z872FPSLhvN2YNM3eQnf9W7KkW8UFtY67r", "fee": 2400000, "feeAssetId": null, "timestamp": 1661511102574, "version": 1, "sender": "3PGCkrHBxFMi7tz1xqnxgBpeNvn5E4M4g8S", "senderPublicKey": "CRRN9T4LWdYfw63q5x9XxR8P93XshdCac31Z65PbE6zv", "proofs": [ "5gFuXgYYbjY3fNCekiGgd9TF1yxmEVzfBW1XDqv3cURihUHSn8AbBHJHAAi86ZETS9WktjTbM4UfDcijRPuYznwV" ], "script": "base64:BgKqAQgCEgASABIDCgEIEgQKAggIEgASAwoBCBIAEgASAwoBARIAEgcKBQgICAgBEgASAwoBCBIDCgEIEgMKAQgSAwoBCBIDCgEBEgMKAQgSBAoCCAQSBAoCCAESBAoCCAESAwoBCBIDCgEIEgMKAQgSBAoCCAESBAoCCAESBQoDCAEIEgMKAQgSBQoDCAgBEgUKAwgIARIDCgEIEgASAwoBCBIECgIIARIDCgEBXgEEZ2V0SQEDa2V5CQCaCAIFBHRoaXMFA2tleQEEZ2V0UwEDa2V5CQCdCAIFBHRoaXMFA2tleQEFZ2V0U1YBA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFA2tleQkArAICCQCsAgIJAKwCAgIYbm8gc3RyaW5nIHZhbHVlIGZvciBrZXkgBQNrZXkCDCBhdCBhZGRyZXNzIAkApQgBBQR0aGlzAQd0aHJvd0lmAgljb25kaXRpb24FZXJyb3IDBQljb25kaXRpb24JAAIBBQVlcnJvcgYBCHdyaXRlSW50AgNrZXkFdmFsdWUDCQBmAgAABQV2YWx1ZQkAAgEJAKwCAgkArAICCQCsAgICF3dyaXRpbmcgbmVnYXRpdmUgdmFsdWUgCQCkAwEFBXZhbHVlAgkgZm9yIGtleSAFA2tleQkBDEludGVnZXJFbnRyeQIFA2tleQUFdmFsdWUBCWVuc3VyZUdFMAEFdmFsdWUDCQBmAgAABQV2YWx1ZQkAAgECFndyaXRpbmcgbmVnYXRpdmUgdmFsdWUFBXZhbHVlAQVhc0ludAEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACA0ludAQDaW50BQckbWF0Y2gwBQNpbnQJAAIBAgNyOjEBCGNoYW5nZUJ5AgNrZXkFdmFsdWUJAQh3cml0ZUludAIFA2tleQkAZAIJAQt2YWx1ZU9yRWxzZQIJAQRnZXRJAQUDa2V5AAAFBXZhbHVlAQt3cml0ZVN0cmluZwIDa2V5BXZhbHVlCQELU3RyaW5nRW50cnkCBQNrZXkFBXZhbHVlAQxmcmFjdGlvbkNlaWwDBXZhbHVlCW51bWVyYXRvcgtkZW5vbWluYXRvcgQEY2FuZAkAawMFBXZhbHVlBQludW1lcmF0b3IFC2Rlbm9taW5hdG9yBAFEALPmk6gLBAVleGFjdAkAAAIJAGoCCQBoAgkAagIFBGNhbmQFAUQJAGoCBQtkZW5vbWluYXRvcgUBRAUBRAkAagIJAGgCCQBqAgUFdmFsdWUFAUQJAGoCBQludW1lcmF0b3IFAUQFAUQDBQVleGFjdAUEY2FuZAkAZAIFBGNhbmQAAQANQmxvY2tzUGVyWWVhcgCgiiAABVJCYXNlAICAhP6m3uERAAtmYWN0b3JzQmFzZQDoBwAMYXNzZXRJZFN0b3JlAgdhc3NldElkAAphc3NldElkU3RyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAQRnZXRTAQUMYXNzZXRJZFN0b3JlAgpubyBhc3NldElkAAdhc3NldElkAwkAAAIFCmFzc2V0SWRTdHICBVdBVkVTBQR1bml0CQDZBAEFCmFzc2V0SWRTdHIAEnJlc2VydmVGYWN0b3JTdG9yZQkArAICBQphc3NldElkU3RyAg5fUmVzZXJ2ZUZhY3RvcgAVY29sbGF0ZXJhbEZhY3RvclN0b3JlCQCsAgIFCmFzc2V0SWRTdHICEV9Db2xsYXRlcmFsRmFjdG9yABlsaXF1aWRhdGlvblRocmVzaG9sZFN0b3JlCQCsAgIFCmFzc2V0SWRTdHICFV9MaXF1aWRhdGlvblRocmVzaG9sZAASb3ZlcmxhcENoYXJnZVN0b3JlAhZhY2NvdW50X2hlYWx0aF9vdmVybGFwABdsaXF1aWRhdGlvblBlbmFsdHlTdG9yZQkArAICBQphc3NldElkU3RyAhNfTGlxdWlkYXRpb25QZW5hbHR5ABJjb25maWdBZGRyZXNzU3RvcmUCDWNvbmZpZ0FkZHJlc3MADWFUb2tlbklkU3RvcmUCCGFUb2tlbklkAA9hVG9rZW5OYW1lU3RvcmUCCmFUb2tlbk5hbWUAFmFUb2tlbkNpcmN1bGF0aW9uU3RvcmUCEWFUb2tlbkNpcmN1bGF0aW9uABNhVG9rZW5EZWNpbWFsc1N0b3JlAg5hVG9rZW5EZWNpbWFscwAScmVzZXJ2ZUdsb2JhbFN0b3JlAhFyZXNlcnZlR2xvYmFsRGF0YQANcmVzZXJ2ZUdsb2JhbAkBC3ZhbHVlT3JFbHNlAgkAoggBBRJyZXNlcnZlR2xvYmFsU3RvcmUCBHx8fHwAEXJlc2VydmVHbG9iYWxEYXRhCQC1CQIFDXJlc2VydmVHbG9iYWwCAXwAEGxhc3RVcGRhdGVIZWlnaHQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkBC3ZhbHVlT3JFbHNlAgkAtgkBCQCRAwIFEXJlc2VydmVHbG9iYWxEYXRhAAAJAQRnZXRJAQIQbGFzdFVwZGF0ZUhlaWdodAITbm8gbGFzdFVwZGF0ZUhlaWdodAASc3RvcmVkVG90YWxEZXBvc2l0CQELdmFsdWVPckVsc2UCCQC2CQEJAJEDAgURcmVzZXJ2ZUdsb2JhbERhdGEAAQkBC3ZhbHVlT3JFbHNlAgkBBGdldEkBAgx0b3RhbERlcG9zaXQAAAAPc3RvcmVkVG90YWxEZWJ0CQELdmFsdWVPckVsc2UCCQC2CQEJAJEDAgURcmVzZXJ2ZUdsb2JhbERhdGEAAgkBC3ZhbHVlT3JFbHNlAgkBBGdldEkBAgt0b3RhbEJvcnJvdwAAABJzdG9yZWRUb3RhbFJlc2VydmUJAQt2YWx1ZU9yRWxzZQIJALYJAQkAkQMCBRFyZXNlcnZlR2xvYmFsRGF0YQADCQELdmFsdWVPckVsc2UCCQEEZ2V0SQECDHRvdGFsUmVzZXJ2ZQAAAAtzdG9yZWRJbmRleAkBC3ZhbHVlT3JFbHNlAgkAtgkBCQCRAwIFEXJlc2VydmVHbG9iYWxEYXRhAAQJAQt2YWx1ZU9yRWxzZQIJAQRnZXRJAQILc3RvcmVkSW5kZXgFBVJCYXNlARJhVG9rZW5CYWxhbmNlU3RvcmUBC3VzZXJBZGRyZXNzCQCsAgIFC3VzZXJBZGRyZXNzAg5fYVRva2VuQmFsYW5jZQEJZGVidFN0b3JlAQt1c2VyQWRkcmVzcwkArAICBQt1c2VyQWRkcmVzcwIFX2RlYnQBDmRlYnRJbmRleFN0b3JlAQt1c2VyQWRkcmVzcwkArAICBQt1c2VyQWRkcmVzcwIGX2luZGV4ARR1c2VBc0NvbGxhdGVyYWxTdG9yZQELdXNlckFkZHJlc3MJAKwCAgULdXNlckFkZHJlc3MCEF91c2VBc0NvbGxhdGVyYWwBCmdldEJhbGFuY2UCDmFkZHJlc3NPckFsaWFzB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCYnYFByRtYXRjaDAJAPAHAgUOYWRkcmVzc09yQWxpYXMFAmJ2AwkAAQIFByRtYXRjaDACBFVuaXQEAXUFByRtYXRjaDAICQDvBwEFDmFkZHJlc3NPckFsaWFzCWF2YWlsYWJsZQkAAgECC01hdGNoIGVycm9yAA1hc3NldERlY2ltYWxzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAQRnZXRJAQUTYVRva2VuRGVjaW1hbHNTdG9yZQIQbm8gYXNzZXREZWNpbWFscwANY29uZmlnQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBRJjb25maWdBZGRyZXNzU3RvcmUCGXJlc2VydmU6IG5vIGNvbmZpZ0FkZHJlc3MCFmludmFsaWQgY29uZmlnIGFkZHJlc3MBCW9wQWxsb3dlZAECb3AEByRtYXRjaDAJAPwHBAUNY29uZmlnQWRkcmVzcwIJb3BBbGxvd2VkCQDMCAIFCmFzc2V0SWRTdHIJAMwIAgUCb3AFA25pbAUDbmlsAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWIFByRtYXRjaDADBQFiBgkAAgECC25vdCBhbGxvd2VkCQACAQIhb3BBbGxvd2VkOiB1bmV4cGVjdGVkIHJlc3VsdCB0eXBlAAxtYWluQ29udHJhY3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIJALUJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCBG1haW4CEW5vIG1haW4gaW4gY29uZmlnAgF8AAACFGludmFsaWQgbWFpbiBhZGRyZXNzAQhtYWluT25seQEBaQMJAQhjb250YWlucwIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFDWNvbmZpZ0FkZHJlc3MCBG1haW4JAKUIAQgFAWkGY2FsbGVyBgkAAgECEG9ubHkgbWFpbiBjYW4gZG8BDGRpdkFkbWluT25seQEBaQQJZGl2QWRtaW5zCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwIJZGl2QWRtaW5zAg1ubyBkaXYgYWRtaW5zAwkBASEBCQEIY29udGFpbnMCBQlkaXZBZG1pbnMJAKUIAQgFAWkGY2FsbGVyCQACAQIVb25seSBkaXYgYWRtaW4gY2FuIGRvBgEQaXNBc3NldElkT3JXYXZlcwEFdmFsdWUDAwkBAiE9AgUFdmFsdWUCBVdBVkVTCQAAAgkA2QQBBQV2YWx1ZQkA2QQBAgAHCQACAQIPaW52YWxpZCBhc3NldElkBgAObm90SW5pdGlhbGl6ZWQJAQd0aHJvd0lmAgkBCWlzRGVmaW5lZAEJAQRnZXRTAQUMYXNzZXRJZFN0b3JlAhNhbHJlYWR5IGluaXRpYWxpemVkABJtYXliZU9yYWNsZUFkZHJlc3MEByRtYXRjaDAJAJ0IAgUNY29uZmlnQWRkcmVzcwIOb3JhY2xlX2FkZHJlc3MDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQCmCAEFAXMFBHVuaXQAC29yYWNsZVByaWNlBAckbWF0Y2gwCQD8BwQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUSbWF5YmVPcmFjbGVBZGRyZXNzAglubyBvcmFjbGUCBXByaWNlCQDMCAIFCmFzc2V0SWRTdHIFA25pbAUDbmlsAwkAAQIFByRtYXRjaDACA0ludAQBaQUHJG1hdGNoMAUBaQkAAgECD2JhZCBvcmFjbGUgZGF0YQAGSEVJR0hUBQZoZWlnaHQACGFUb2tlbklkCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkBBGdldFMBBQ1hVG9rZW5JZFN0b3JlAgtubyBhVG9rZW5JZAARYVRva2VuQ2lyY3VsYXRpb24JAQt2YWx1ZU9yRWxzZQIJAQRnZXRJAQUWYVRva2VuQ2lyY3VsYXRpb25TdG9yZQAAAA1yZXNlcnZlRmFjdG9yCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNY29uZmlnQWRkcmVzcwUScmVzZXJ2ZUZhY3RvclN0b3JlAhBubyByZXNlcnZlRmFjdG9yABBjb2xsYXRlcmFsRmFjdG9yCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNY29uZmlnQWRkcmVzcwUVY29sbGF0ZXJhbEZhY3RvclN0b3JlAhNubyBjb2xsYXRlcmFsRmFjdG9yABRsaXF1aWRhdGlvblRocmVzaG9sZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDWNvbmZpZ0FkZHJlc3MFGWxpcXVpZGF0aW9uVGhyZXNob2xkU3RvcmUCF25vIGxpcXVpZGF0aW9uVGhyZXNob2xkABRhY2NvdW50SGVhbHRoT3ZlcmxhcAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDWNvbmZpZ0FkZHJlc3MFEm92ZXJsYXBDaGFyZ2VTdG9yZQIQbm8gb3ZlcmxhcENoYXJnZQASbGlxdWlkYXRpb25QZW5hbHR5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNY29uZmlnQWRkcmVzcwUXbGlxdWlkYXRpb25QZW5hbHR5U3RvcmUCFW5vIGxpcXVpZGF0aW9uUGVuYWx0eQALdXRpbGl6YXRpb24DCQBmAgUSc3RvcmVkVG90YWxEZXBvc2l0AAAJAJcDAQkAzAgCBQtmYWN0b3JzQmFzZQkAzAgCCQBrAwUPc3RvcmVkVG90YWxEZWJ0BQtmYWN0b3JzQmFzZQUSc3RvcmVkVG90YWxEZXBvc2l0BQNuaWwAAAADYXByBAFhCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ1jb25maWdBZGRyZXNzCQCsAgIFCmFzc2V0SWRTdHICB19BUG9pbnQEAWIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFDWNvbmZpZ0FkZHJlc3MJAKwCAgUKYXNzZXRJZFN0cgIHX0JQb2ludAQBYwkBEUBleHRyTmF0aXZlKDEwNTApAgUNY29uZmlnQWRkcmVzcwkArAICBQphc3NldElkU3RyAgdfQ1BvaW50BAFkCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ1jb25maWdBZGRyZXNzCQCsAgIFCmFzc2V0SWRTdHICB19EUG9pbnQEBmxpbmVBQwkAZAIJAGsDCQBlAgUBYQUBYwULdXRpbGl6YXRpb24JAQEtAQUBYgUBYQQGbGluZUNECQBkAgkAawMJAGUCBQFjBQFkCQBlAgULdXRpbGl6YXRpb24FAWIJAGUCBQFiBQtmYWN0b3JzQmFzZQUBYwMJAAACBQt1dGlsaXphdGlvbgAABQFhAwkAAAIFC3V0aWxpemF0aW9uBQFiBQFjAwMJAGYCBQFiBQt1dGlsaXphdGlvbgYJAAACBQFiBQtmYWN0b3JzQmFzZQUGbGluZUFDBQZsaW5lQ0QAA2FweQMJAAACBRJzdG9yZWRUb3RhbERlcG9zaXQAAAAACQBrAwkAawMFD3N0b3JlZFRvdGFsRGVidAUDYXByBRJzdG9yZWRUb3RhbERlcG9zaXQJAGUCBQtmYWN0b3JzQmFzZQUNcmVzZXJ2ZUZhY3RvcgULZmFjdG9yc0Jhc2UADGN1cnJlbnRJbmRleAMJAAACBQZIRUlHSFQFEGxhc3RVcGRhdGVIZWlnaHQFC3N0b3JlZEluZGV4BANicHIJAQxmcmFjdGlvbkNlaWwDBQNhcHIFBVJCYXNlCQBoAgUNQmxvY2tzUGVyWWVhcgULZmFjdG9yc0Jhc2UJAQxmcmFjdGlvbkNlaWwDBQtzdG9yZWRJbmRleAkAZAIFBVJCYXNlCQBoAgUDYnByCQBlAgUGSEVJR0hUBRBsYXN0VXBkYXRlSGVpZ2h0BQVSQmFzZQAOc3Rha2luZ0VuYWJsZWQJAQt2YWx1ZU9yRWxzZQIJAJsIAgUNY29uZmlnQWRkcmVzcwkArAICAhBzdGFraW5nX2VuYWJsZWRfBQphc3NldElkU3RyBwANYWN0dWFsQmFsYW5jZQQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBANhaWQFByRtYXRjaDAJAPAHAgUEdGhpcwUDYWlkCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQEObGlxdWlkaXR5Q2hlY2sDBmFtb3VudANtYXgDZXJyAwkAZgIFBmFtb3VudAUDbWF4CQACAQkArAICAhZub3QgZW5vdWdoIGxpcXVpZGl0eTogBQNlcnIGAQ5zdG9yZWRVc2VyRGVidAELdXNlckFkZHJlc3MJAQt2YWx1ZU9yRWxzZQIJAQRnZXRJAQkBCWRlYnRTdG9yZQEFC3VzZXJBZGRyZXNzAAABD2N1cnJlbnRVc2VyRGVidAELdXNlckFkZHJlc3MEAXYJAQ5zdG9yZWRVc2VyRGVidAEFC3VzZXJBZGRyZXNzAwkAAAIFAXYAAAAABA9zdG9yZWRVc2VySW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkBBGdldEkBCQEOZGVidEluZGV4U3RvcmUBBQt1c2VyQWRkcmVzcwIgaGFzIGRlYnQgYnV0IGRvZXMgbm90IGhhdmUgaW5kZXgJAGsDBQF2BQxjdXJyZW50SW5kZXgFD3N0b3JlZFVzZXJJbmRleAAQY3VycmVudFRvdGFsRGVidAkAawMFD3N0b3JlZFRvdGFsRGVidAUMY3VycmVudEluZGV4BQtzdG9yZWRJbmRleAAJYWRkZWREZWJ0CQBlAgUQY3VycmVudFRvdGFsRGVidAUPc3RvcmVkVG90YWxEZWJ0AAxhZGRlZERlcG9zaXQJAGsDBQlhZGRlZERlYnQJAGUCBQtmYWN0b3JzQmFzZQUNcmVzZXJ2ZUZhY3RvcgULZmFjdG9yc0Jhc2UAE2N1cnJlbnRUb3RhbERlcG9zaXQJAGQCBRJzdG9yZWRUb3RhbERlcG9zaXQFDGFkZGVkRGVwb3NpdAATY3VycmVudFRvdGFsUmVzZXJ2ZQkAZQIJAGQCBRJzdG9yZWRUb3RhbFJlc2VydmUFCWFkZGVkRGVidAUMYWRkZWREZXBvc2l0AA5zdGFraW5nQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ1jb25maWdBZGRyZXNzCQCsAgICD3N0YWtpbmdfY29uZmlnXwUKYXNzZXRJZFN0cgkArAICAhdubyBzdGFraW5nIGFkZHJlc3MgZm9yIAUKYXNzZXRJZFN0cgkArAICAhhiYWQgc3Rha2luZyBhZGRyZXNzIGZvciAFCmFzc2V0SWRTdHIAEmNsYWltYWJsZURpdmlkZW5kcwkAlwMBCQDMCAIFE2N1cnJlbnRUb3RhbFJlc2VydmUJAMwIAgMFDnN0YWtpbmdFbmFibGVkCQEFYXNJbnQBCQD8BwQFDnN0YWtpbmdBZGRyZXNzAgRpbmZvBQNuaWwFA25pbAUNYWN0dWFsQmFsYW5jZQUDbmlsAQ1wYXltZW50QW1vdW50AgFpB2Fzc2V0SWQEAXAICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AwkAZwIAAAUBcAkAAgEJAKwCAgIpUGF5bWVudCBpcyBsZXNzIHRoYW4gbWluIGFsbG93ZWQgYW1vdW50OiAJAKQDAQUBcAMJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUHYXNzZXRJZAkAAgEJAKwCAgIeIGJhZCBhc3NldCBhdHRhY2hlZDogcmVxdWlyZWQgBQphc3NldElkU3RyBQFwAQpzeW5jVG90YWxzBBFhZGRpdGlvbmFsRGVwb3NpdA5hZGRpdGlvbmFsRGVidBFhZGRpdGlvbmFsUmVzZXJ2ZQ1rZWVwQXRCYWxhbmNlBA1zdGFraW5nQWN0aW9uAwkAAAIFDWFjdHVhbEJhbGFuY2UFDWtlZXBBdEJhbGFuY2UFBHVuaXQDCQEBIQEFDnN0YWtpbmdFbmFibGVkBQR1bml0AwkAZgIFDWFjdHVhbEJhbGFuY2UFDWtlZXBBdEJhbGFuY2UJAPwHBAUOc3Rha2luZ0FkZHJlc3MCA3B1dAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQdhc3NldElkCQBlAgUNYWN0dWFsQmFsYW5jZQUNa2VlcEF0QmFsYW5jZQUDbmlsCQD8BwQFDnN0YWtpbmdBZGRyZXNzAgNnZXQJAMwIAgkAZQIFDWtlZXBBdEJhbGFuY2UFDWFjdHVhbEJhbGFuY2UFA25pbAUDbmlsAwkAAAIFDXN0YWtpbmdBY3Rpb24FDXN0YWtpbmdBY3Rpb24EB2RlcG9zaXQJAQllbnN1cmVHRTABCQBkAgUTY3VycmVudFRvdGFsRGVwb3NpdAURYWRkaXRpb25hbERlcG9zaXQEBGRlYnQJAQllbnN1cmVHRTABCQBkAgUQY3VycmVudFRvdGFsRGVidAUOYWRkaXRpb25hbERlYnQEB3Jlc2VydmUJAQllbnN1cmVHRTABCQBkAgUTY3VycmVudFRvdGFsUmVzZXJ2ZQURYWRkaXRpb25hbFJlc2VydmUJAMwIAgkBC3dyaXRlU3RyaW5nAgUScmVzZXJ2ZUdsb2JhbFN0b3JlCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApAMBBQZIRUlHSFQCAXwJAKQDAQUHZGVwb3NpdAIBfAkApAMBBQRkZWJ0AgF8CQCkAwEFB3Jlc2VydmUCAXwJAKQDAQUMY3VycmVudEluZGV4BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BBXBvdzEwAQFuAwkAAAIFAW4ABgDAhD0DCQAAAgUBbgAIAIDC1y8JAAIBCQCsAgICDmJhZCBkZWNpbWFsczogCQCkAwEFAW4BCmFzc2V0VG9Vc2QBBmFtb3VudAkAawMFBmFtb3VudAULb3JhY2xlUHJpY2UJAQVwb3cxMAEFDWFzc2V0RGVjaW1hbHMBCnVzZFRvQXNzZXQBBmFtb3VudAkAawMFBmFtb3VudAkBBXBvdzEwAQUNYXNzZXREZWNpbWFscwULb3JhY2xlUHJpY2UBDWFUb2tlblRvQXNzZXQBDGFUb2tlbkFtb3VudAMJAAACBQxhVG9rZW5BbW91bnQAAAAAAwkAZgIFEWFUb2tlbkNpcmN1bGF0aW9uAAAJAGsDBQxhVG9rZW5BbW91bnQFE2N1cnJlbnRUb3RhbERlcG9zaXQFEWFUb2tlbkNpcmN1bGF0aW9uBQxhVG9rZW5BbW91bnQBDWFzc2V0VG9BVG9rZW4BC2Fzc2V0QW1vdW50AwkAAAIFC2Fzc2V0QW1vdW50AAAAAAMJAGYCBRFhVG9rZW5DaXJjdWxhdGlvbgAACQBrAwULYXNzZXRBbW91bnQFEWFUb2tlbkNpcmN1bGF0aW9uBRNjdXJyZW50VG90YWxEZXBvc2l0BQthc3NldEFtb3VudAERYXNzZXRUb0FUb2tlbkNlaWwBC2Fzc2V0QW1vdW50AwkAAAIFC2Fzc2V0QW1vdW50AAAAAAMJAGYCBRFhVG9rZW5DaXJjdWxhdGlvbgAACQEMZnJhY3Rpb25DZWlsAwULYXNzZXRBbW91bnQFEWFUb2tlbkNpcmN1bGF0aW9uBRNjdXJyZW50VG90YWxEZXBvc2l0BQthc3NldEFtb3VudAENYVRva2VuQmFsYW5jZQEHYWRkcmVzcwkBC3ZhbHVlT3JFbHNlAgkBBGdldEkBCQESYVRva2VuQmFsYW5jZVN0b3JlAQUHYWRkcmVzcwAAAQllbmFibGVDb2wBBHVzZXIJAQxCb29sZWFuRW50cnkCCQEUdXNlQXNDb2xsYXRlcmFsU3RvcmUBBQR1c2VyBgERZW5hYmxlQ29sSWZOZWVkZWQBBHVzZXIDCQBmAgkBD2N1cnJlbnRVc2VyRGVidAEFBHVzZXIAAAkAzAgCCQEJZW5hYmxlQ29sAQUEdXNlcgUDbmlsBQNuaWwBDGNvbGxhcHNlVXNlcgIHYWRkcmVzcwZhbW91bnQEBGRlYnQJAQ9jdXJyZW50VXNlckRlYnQBBQdhZGRyZXNzBAdkZXBvc2l0CQENYVRva2VuVG9Bc3NldAEJAQ1hVG9rZW5CYWxhbmNlAQUHYWRkcmVzcwQLbWF4UG9zc2libGUJAJcDAQkAzAgCBQRkZWJ0CQDMCAIFB2RlcG9zaXQFA25pbAQDYW10AwkAZgIA////////////AQUGYW1vdW50CQACAQIXaW52YWxpZCBjb2xsYXBzZSBhbW91bnQDAwkAAAIFC21heFBvc3NpYmxlAAAGCQAAAgUGYW1vdW50AAAJAAIBAhNub3RoaW5nIHRvIGNvbGxhcHNlAwMJAAACBQZhbW91bnQA////////////AQYJAGYCBQZhbW91bnQFC21heFBvc3NpYmxlBQttYXhQb3NzaWJsZQUGYW1vdW50BA5yZW1vdmVkQXRva2VucwkBEWFzc2V0VG9BVG9rZW5DZWlsAQUDYW10CQCUCgIJAM4IAgkBCnN5bmNUb3RhbHMECQEBLQEFA2FtdAkBAS0BBQNhbXQAAAAACQDMCAIJAQhjaGFuZ2VCeQIJARJhVG9rZW5CYWxhbmNlU3RvcmUBBQdhZGRyZXNzCQEBLQEFDnJlbW92ZWRBdG9rZW5zCQDMCAIJAQhjaGFuZ2VCeQIFFmFUb2tlbkNpcmN1bGF0aW9uU3RvcmUJAQEtAQUOcmVtb3ZlZEF0b2tlbnMJAMwIAgkBCHdyaXRlSW50AgkBCWRlYnRTdG9yZQEFB2FkZHJlc3MJAGUCBQRkZWJ0BQNhbXQJAMwIAgkBCHdyaXRlSW50AgkBDmRlYnRJbmRleFN0b3JlAQUHYWRkcmVzcwUMY3VycmVudEluZGV4BQNuaWwFA2FtdAEJcmVwYXlVc2VyAgt1c2VyQWRkcmVzcwZhbW91bnQEBmNoZWNrcwkBCW9wQWxsb3dlZAECBXJlcGF5AwkAAAIFBmNoZWNrcwUGY2hlY2tzBAtjdXJyZW50RGVidAkBD2N1cnJlbnRVc2VyRGVidAEFC3VzZXJBZGRyZXNzAwkAAAIFC2N1cnJlbnREZWJ0BQtjdXJyZW50RGVidAQNJHQwMTE3ODMxMjA4NgMJAGYCBQZhbW91bnQFC2N1cnJlbnREZWJ0CQCWCgQAAAkBAS0BBQtjdXJyZW50RGVidAkAZQIFBmFtb3VudAULY3VycmVudERlYnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQULdXNlckFkZHJlc3MJAGUCBQZhbW91bnQFC2N1cnJlbnREZWJ0BQdhc3NldElkBQNuaWwJAJYKBAkAZQIFC2N1cnJlbnREZWJ0BQZhbW91bnQJAQEtAQUGYW1vdW50AAAFA25pbAQHbmV3RGVidAgFDSR0MDExNzgzMTIwODYCXzEED3RvdGFsRGVidFVwZGF0ZQgFDSR0MDExNzgzMTIwODYCXzIEBnBheW91dAgFDSR0MDExNzgzMTIwODYCXzMEB2FjdGlvbnMIBQ0kdDAxMTc4MzEyMDg2Al80BAZyZXBhaWQJAGUCBQZhbW91bnQFBnBheW91dAkAlAoCCQDOCAIJAM4IAgkBCnN5bmNUb3RhbHMEAAAFD3RvdGFsRGVidFVwZGF0ZQAABQZwYXlvdXQFB2FjdGlvbnMJAMwIAgkBCHdyaXRlSW50AgkBCWRlYnRTdG9yZQEFC3VzZXJBZGRyZXNzBQduZXdEZWJ0CQDMCAIJAQh3cml0ZUludAIJAQ5kZWJ0SW5kZXhTdG9yZQEFC3VzZXJBZGRyZXNzBQxjdXJyZW50SW5kZXgFA25pbAUGcmVwYWlkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQlnZXRDb25maWcABAFhCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ1jb25maWdBZGRyZXNzCQCsAgIFCmFzc2V0SWRTdHICB19BUG9pbnQEAWIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFDWNvbmZpZ0FkZHJlc3MJAKwCAgUKYXNzZXRJZFN0cgIHX0JQb2ludAQBYwkBEUBleHRyTmF0aXZlKDEwNTApAgUNY29uZmlnQWRkcmVzcwkArAICBQphc3NldElkU3RyAgdfQ1BvaW50BAFkCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ1jb25maWdBZGRyZXNzCQCsAgIFCmFzc2V0SWRTdHICB19EUG9pbnQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBkFCQ0Q6IAkApAMBBQFhAgE7CQCkAwEFAWICATsJAKQDAQUBYwIBOwkApAMBBQFkAhEsIHJlc2VydmVGYWN0b3I6IAkApAMBBQ1yZXNlcnZlRmFjdG9yAhQsIGNvbGxhdGVyYWxGYWN0b3I6IAkApAMBBRBjb2xsYXRlcmFsRmFjdG9yAhgsIGxpcXVpZGF0aW9uVGhyZXNob2xkOiAJAKQDAQUUbGlxdWlkYXRpb25UaHJlc2hvbGQCFiwgbGlxdWlkYXRpb25QZW5hbHR5OiAJAKQDAQUSbGlxdWlkYXRpb25QZW5hbHR5AQhnZXRTdGF0ZQAJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICFWN1cnJlbnRUb3RhbERlcG9zaXQ6IAkApAMBBRNjdXJyZW50VG90YWxEZXBvc2l0AhYsIHN0b3JlZFRvdGFsRGVwb3NpdDogCQCkAwEFEnN0b3JlZFRvdGFsRGVwb3NpdAIULCBjdXJyZW50VG90YWxEZWJ0OiAJAKQDAQUQY3VycmVudFRvdGFsRGVidAITLCBzdG9yZWRUb3RhbERlYnQ6IAkApAMBBQ9zdG9yZWRUb3RhbERlYnQCFywgY3VycmVudFRvdGFsUmVzZXJ2ZTogCQCkAwEFE2N1cnJlbnRUb3RhbFJlc2VydmUCFiwgc3RvcmVkVG90YWxSZXNlcnZlOiAJAKQDAQUSc3RvcmVkVG90YWxSZXNlcnZlAg8sIGN1cnJlbnRJbmRleDoJAKQDAQUMY3VycmVudEluZGV4Ag8sIHN0b3JlZEluZGV4OiAJAKQDAQULc3RvcmVkSW5kZXgCFCwgbGFzdFVwZGF0ZUhlaWdodDogCQCkAwEFEGxhc3RVcGRhdGVIZWlnaHQCDywgdXRpbGl6YXRpb246IAkApAMBBQt1dGlsaXphdGlvbgIVLCBhVG9rZW5DaXJjdWxhdGlvbjogCQCkAwEFEWFUb2tlbkNpcmN1bGF0aW9uAg8sIGFUb2tlblByaWNlOiAJAKQDAQkBDWFUb2tlblRvQXNzZXQBCQBsBgAKAAAFDWFzc2V0RGVjaW1hbHMAAAAABQVGTE9PUgIHLCBBUFI6IAkApAMBBQNhcHICBywgQVBZOiAJAKQDAQUDYXB5AQxnZXRVc2VyU3RhdGUBBHVzZXIECGFCYWxhbmNlCQENYVRva2VuQmFsYW5jZQEFBHVzZXIEDmFCYWxhbmNlV2FsbGV0CQEKZ2V0QmFsYW5jZQIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHVzZXIFCGFUb2tlbklkCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgINY3VycmVudERlYnQ6IAkApAMBCQEPY3VycmVudFVzZXJEZWJ0AQUEdXNlcgIOLCBzdG9yZWREZWJ0OiAJAKQDAQkBC3ZhbHVlT3JFbHNlAgkBBGdldEkBCQEJZGVidFN0b3JlAQUEdXNlcgAAAhIsIGN1cnJlbnREZXBvc2l0OiAJAKQDAQkBDWFUb2tlblRvQXNzZXQBBQhhQmFsYW5jZQIZLCBhVG9rZW5Db250cmFjdEJhbGFuY2U6IAkApAMBBQhhQmFsYW5jZQIXLCBhVG9rZW5XYWxsZXRCYWxhbmNlOiAJAKQDAQUOYUJhbGFuY2VXYWxsZXQCDywgd2FsbGV0U3Rha2U6IAkApAMBCQENYVRva2VuVG9Bc3NldAEFDmFCYWxhbmNlV2FsbGV0AhYsIGFzc2V0V2FsbGV0QmFsYW5jZTogCQCkAwEJAQpnZXRCYWxhbmNlAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEdXNlcgUHYXNzZXRJZAITLCB1c2VBc0NvbGxhdGVyYWw6IAkApQMBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJARR1c2VBc0NvbGxhdGVyYWxTdG9yZQEFBHVzZXIGAg8sIHN0b3JlZEluZGV4OiAJAKQDAQkBC3ZhbHVlT3JFbHNlAgkBBGdldEkBCQEOZGVidEluZGV4U3RvcmUBBQR1c2VyAAABC2RlYnVnVG90YWxzAAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICFHN0b3JlZFRvdGFsRGVwb3NpdDogCQCkAwEFEnN0b3JlZFRvdGFsRGVwb3NpdAITLCBzdG9yZWRUb3RhbERlYnQ6IAkApAMBBQ9zdG9yZWRUb3RhbERlYnQCFiwgc3RvcmVkVG90YWxSZXNlcnZlOiAJAKQDAQUSc3RvcmVkVG90YWxSZXNlcnZlAg8sIHN0b3JlZEluZGV4OiAJAKQDAQULc3RvcmVkSW5kZXgCFCwgbGFzdFVwZGF0ZUhlaWdodDogCQCkAwEFEGxhc3RVcGRhdGVIZWlnaHQCFywgY3VycmVudFRvdGFsRGVwb3NpdDogCQCkAwEFE2N1cnJlbnRUb3RhbERlcG9zaXQCFCwgY3VycmVudFRvdGFsRGVidDogCQCkAwEFEGN1cnJlbnRUb3RhbERlYnQCFywgY3VycmVudFRvdGFsUmVzZXJ2ZTogCQCkAwEFE2N1cnJlbnRUb3RhbFJlc2VydmUCECwgY3VycmVudEluZGV4OiAJAKQDAQUMY3VycmVudEluZGV4AhEsIGN1cnJlbnRIZWlnaHQ6IAkApAMBBQZIRUlHSFQCFSwgYVRva2VuQ2lyY3VsYXRpb246IAkApAMBBRFhVG9rZW5DaXJjdWxhdGlvbgIPLCBhVG9rZW5QcmljZTogCQCkAwEJAQ1hVG9rZW5Ub0Fzc2V0AQkAbAYACgAABQ1hc3NldERlY2ltYWxzAAAAAAUFRkxPT1IBCnVzZXJUb3RhbHMBBHVzZXIEB2F0b2tlbnMJAQ1hVG9rZW5CYWxhbmNlAQUEdXNlcgQFYXNzZXQJAQ1hVG9rZW5Ub0Fzc2V0AQUHYXRva2VucwQEZGVidAkBD2N1cnJlbnRVc2VyRGVidAEFBHVzZXIDCQAAAgUGSEVJR0hUBRBsYXN0VXBkYXRlSGVpZ2h0CQCWCgQFEnN0b3JlZFRvdGFsRGVwb3NpdAUPc3RvcmVkVG90YWxEZWJ0BQVhc3NldAUEZGVidAkAlgoEBRNjdXJyZW50VG90YWxEZXBvc2l0BRBjdXJyZW50VG90YWxEZWJ0BQVhc3NldAUEZGVidAEQd2l0aGRyYXdJbnRlcm5hbAQBaQR1c2VyBmFtb3VudAZ0b01haW4EC21heFdpdGhkcmF3CQBlAgkAZAIFEnN0b3JlZFRvdGFsRGVwb3NpdAUSc3RvcmVkVG90YWxSZXNlcnZlBQ9zdG9yZWRUb3RhbERlYnQEBmNoZWNrcwMDAwkBCG1haW5Pbmx5AQUBaQkBDmxpcXVpZGl0eUNoZWNrAwUGYW1vdW50BQttYXhXaXRoZHJhdwkArAICAhJmdW5kcyBpbiB1c2U6IG1heD0JAKQDAQULbWF4V2l0aGRyYXcHCQEHdGhyb3dJZgIJAGYCAP///////////wEFBmFtb3VudAIOaW52YWxpZCBhbW91bnQHCQEJb3BBbGxvd2VkAQIId2l0aGRyYXcHAwkAAAIFBmNoZWNrcwUGY2hlY2tzBA0kdDAxNTk2ODE2MTU5AwkAAAIFBmFtb3VudAD///////////8BBAdhdG9rZW5zCQENYVRva2VuQmFsYW5jZQEFBHVzZXIJAJQKAgUHYXRva2VucwkBDWFUb2tlblRvQXNzZXQBBQdhdG9rZW5zCQCUCgIJARFhc3NldFRvQVRva2VuQ2VpbAEFBmFtb3VudAUGYW1vdW50BA5yZW1vdmVkQXRva2VucwgFDSR0MDE1OTY4MTYxNTkCXzEEDndpdGhkcmF3QW1vdW50CAUNJHQwMTU5NjgxNjE1OQJfMgkAlAoCCQDOCAIJAQpzeW5jVG90YWxzBAkBAS0BBQ53aXRoZHJhd0Ftb3VudAAAAAAFDndpdGhkcmF3QW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMDBQZ0b01haW4FDG1haW5Db250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQUEdXNlcgUOd2l0aGRyYXdBbW91bnQFB2Fzc2V0SWQJAMwIAgkBCGNoYW5nZUJ5AgkBEmFUb2tlbkJhbGFuY2VTdG9yZQEFBHVzZXIJAQEtAQUOcmVtb3ZlZEF0b2tlbnMJAMwIAgkBCGNoYW5nZUJ5AgUWYVRva2VuQ2lyY3VsYXRpb25TdG9yZQkBAS0BBQ5yZW1vdmVkQXRva2VucwUDbmlsBQ53aXRoZHJhd0Ftb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgERcmVwbGVuaXNoSW50ZXJuYWwDAm9wBHVzZXIBaQQGY2hlY2tzAwkBCG1haW5Pbmx5AQUBaQkBCW9wQWxsb3dlZAEFAm9wBwMJAAACBQZjaGVja3MFBmNoZWNrcwQMYVRva2VuQW1vdW50CQENcGF5bWVudEFtb3VudAIFAWkFCGFUb2tlbklkCQCUCgIJAM4IAgkAzggCCQEKc3luY1RvdGFscwQAAAAAAAAAAAkAzAgCCQEIY2hhbmdlQnkCCQESYVRva2VuQmFsYW5jZVN0b3JlAQUEdXNlcgUMYVRva2VuQW1vdW50CQDMCAIJAQRCdXJuAgUIYVRva2VuSWQFDGFUb2tlbkFtb3VudAUDbmlsCQERZW5hYmxlQ29sSWZOZWVkZWQBBQR1c2VyCQENYVRva2VuVG9Bc3NldAEFDGFUb2tlbkFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEMbWludEludGVybmFsBQFpB2FkZHJlc3MMYW1vdW50VG9NaW50AnRvBmFjdGlvbgQRdXNlckFUb2tlbkJhbGFuY2UJAQ1hVG9rZW5CYWxhbmNlAQUHYWRkcmVzcwQGYW1vdW50AwkAAAIFDGFtb3VudFRvTWludAD///////////8BBRF1c2VyQVRva2VuQmFsYW5jZQUMYW1vdW50VG9NaW50BAZjaGVja3MDAwMJAQhtYWluT25seQEFAWkJAQlvcEFsbG93ZWQBBQZhY3Rpb24HCQEHdGhyb3dJZgIJAGYCAP///////////wEFDGFtb3VudFRvTWludAIUaW52YWxpZCBhbW91bnRUb01pbnQHCQEHdGhyb3dJZgIJAGYCBQZhbW91bnQFEXVzZXJBVG9rZW5CYWxhbmNlCQCsAgICKVRyeWluZyB0byBtaW50IG1vcmUgdGhhbiBhdmFpbGFibGUsIG1heDogCQCkAwEFEXVzZXJBVG9rZW5CYWxhbmNlBwMJAAACBQZjaGVja3MFBmNoZWNrcwkAlAoCCQDOCAIJAQpzeW5jVG90YWxzBAAAAAAAAAAACQDMCAIJAQhjaGFuZ2VCeQIJARJhVG9rZW5CYWxhbmNlU3RvcmUBBQdhZGRyZXNzCQEBLQEFBmFtb3VudAkAzAgCCQEHUmVpc3N1ZQMFCGFUb2tlbklkBQZhbW91bnQGCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAnRvBQZhbW91bnQFCGFUb2tlbklkBQNuaWwJAQ1hVG9rZW5Ub0Fzc2V0AQUGYW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuIwFpARJnZXRSZXNlcnZlRGl2c0luZm8ACQCUCgIFA25pbAkAlQoDBRJjbGFpbWFibGVEaXZpZGVuZHMFCmFzc2V0SWRTdHIJAGUCBRNjdXJyZW50VG90YWxSZXNlcnZlBRJjbGFpbWFibGVEaXZpZGVuZHMBaQETc3RvcmVkRGVwb3NpdEJvcnJvdwAJAJQKAgUDbmlsCQCUCgIFEnN0b3JlZFRvdGFsRGVwb3NpdAUPc3RvcmVkVG90YWxEZWJ0AWkBEGdldEN1cnJlbnRUb3RhbHMBBHVzZXIJAJQKAgUDbmlsCQEKdXNlclRvdGFscwEFBHVzZXIBaQERZ2V0Q3VycmVudFRvdGFsczICBXVzZXIxBXVzZXIyBA0kdDAxNzg0MDE3ODc3CQEKdXNlclRvdGFscwEFBXVzZXIxBAJkMQgFDSR0MDE3ODQwMTc4NzcCXzEEAmQyCAUNJHQwMTc4NDAxNzg3NwJfMgQCZDMIBQ0kdDAxNzg0MDE3ODc3Al8zBAJkNAgFDSR0MDE3ODQwMTc4NzcCXzQEDSR0MDE3ODgyMTc5MTkJAQp1c2VyVG90YWxzAQUFdXNlcjIEAmUxCAUNJHQwMTc4ODIxNzkxOQJfMQQCZTIIBQ0kdDAxNzg4MjE3OTE5Al8yBAJlMwgFDSR0MDE3ODgyMTc5MTkCXzMEAmU0CAUNJHQwMTc4ODIxNzkxOQJfNAkAlAoCBQNuaWwJAJgKBgUCZDEFAmQyBQJkMwUCZDQFAmUzBQJlNAFpAQZhZHZpc2UACQCUCgIFA25pbAkArAICCQCsAgIJAKwCAgkArAICCQCsAgICEHJlc2VydmVBZGRyZXNzOiAJAKUIAQUEdGhpcwICLCAJAQlnZXRDb25maWcAAgIsIAkBCGdldFN0YXRlAAFpAQphZHZpc2VVc2VyAQR1c2VyBA5jdXJyZW50RGVidFVzZAkBCmFzc2V0VG9Vc2QBBRBjdXJyZW50VG90YWxEZWJ0BBFjdXJyZW50RGVwb3NpdFVzZAkBCmFzc2V0VG9Vc2QBBRNjdXJyZW50VG90YWxEZXBvc2l0BAxhc0NvbGxhdGVyYWwJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkBFHVzZUFzQ29sbGF0ZXJhbFN0b3JlAQUEdXNlcgYEE2VmZmVjdGl2ZURlcG9zaXRVc2QDBQxhc0NvbGxhdGVyYWwFEWN1cnJlbnREZXBvc2l0VXNkAAAECm92ZXJsYXBVc2QJAJcDAQkAzAgCBQ5jdXJyZW50RGVidFVzZAkAzAgCBRNlZmZlY3RpdmVEZXBvc2l0VXNkBQNuaWwEDW92ZXJsYXBDaGFyZ2UJAQxmcmFjdGlvbkNlaWwDBQpvdmVybGFwVXNkBRRhY2NvdW50SGVhbHRoT3ZlcmxhcAULZmFjdG9yc0Jhc2UEAmJwAwkAZgIFDmN1cnJlbnREZWJ0VXNkBRNlZmZlY3RpdmVEZXBvc2l0VXNkAAAJAGsDCQBlAgUTZWZmZWN0aXZlRGVwb3NpdFVzZAUOY3VycmVudERlYnRVc2QFEGNvbGxhdGVyYWxGYWN0b3IFC2ZhY3RvcnNCYXNlBANicHUDCQBmAgUOY3VycmVudERlYnRVc2QFE2VmZmVjdGl2ZURlcG9zaXRVc2QJAGQCCQBrAwkAZQIFDmN1cnJlbnREZWJ0VXNkBRNlZmZlY3RpdmVEZXBvc2l0VXNkBQtmYWN0b3JzQmFzZQUUbGlxdWlkYXRpb25UaHJlc2hvbGQFDW92ZXJsYXBDaGFyZ2UFDW92ZXJsYXBDaGFyZ2UECGVucmljaGVkCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhByZXNlcnZlQWRkcmVzczogCQClCAEFBHRoaXMCEiwgY3VycmVudERlYnRVc2Q6IAkApAMBBQ5jdXJyZW50RGVidFVzZAIVLCBjdXJyZW50RGVwb3NpdFVzZDogCQCkAwEFEWN1cnJlbnREZXBvc2l0VXNkAgYsIGJwOiAJAKQDAQUCYnACBywgYnB1OiAJAKQDAQUDYnB1CQCUCgIFA25pbAkArAICCQCsAgIFCGVucmljaGVkAgIsIAkBDGdldFVzZXJTdGF0ZQEFBHVzZXIBaQELYWRkSW50ZXJlc3QAAwkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQdhc3NldElkCQACAQInY2FuJ3QgYWRkIGludGVyZXN0IHdpdGggdW5yZWxhdGVkIHRva2VuCQEKc3luY1RvdGFscwQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAAAAAAAAWkBDGFkZFRvUmVzZXJ2ZQADCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFB2Fzc2V0SWQJAAIBAidjYW4ndCBhZGQgaW50ZXJlc3Qgd2l0aCB1bnJlbGF0ZWQgdG9rZW4JAQpzeW5jVG90YWxzBAAAAAAICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAABaQETd2l0aGRyYXdGcm9tUmVzZXJ2ZQEDYW10BAZjaGVja3MJAQxkaXZBZG1pbk9ubHkBBQFpAwkAAAIFBmNoZWNrcwUGY2hlY2tzBARkaWZmAwkAAAIFA2FtdAD///////////8BBRJjbGFpbWFibGVEaXZpZGVuZHMFA2FtdAkAlAoCCQDOCAIJAQpzeW5jVG90YWxzBAAAAAAJAQEtAQUEZGlmZgUEZGlmZgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFBGRpZmYFB2Fzc2V0SWQFA25pbAUEZGlmZgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtmb3JjZVVwZGF0ZQAEBWFkbWluCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwIFYWRtaW4CGnJlc2VydmU6bm8gYWRtaW4gaW4gY29uZmlnAwkBAiE9AgkApQgBCAUBaQZjYWxsZXIFBWFkbWluCQACAQIRb25seSBhZG1pbiBjYW4gZG8JAQpzeW5jVG90YWxzBAAAAAAAAAAAAWkBCmluaXRpYWxpemUFCmNmZ0FkZHJlc3MOYXNzZXRJZE9yV2F2ZXMKYVRva2VuTmFtZRFhVG9rZW5EZXNjcmlwdGlvbg5hVG9rZW5EZWNpbWFscwQGY2hlY2tzAwUObm90SW5pdGlhbGl6ZWQJARBpc0Fzc2V0SWRPcldhdmVzAQUOYXNzZXRJZE9yV2F2ZXMHAwkAAAIFBmNoZWNrcwUGY2hlY2tzBAZhVG9rZW4JAMIIBQUKYVRva2VuTmFtZQURYVRva2VuRGVzY3JpcHRpb24AAAUOYVRva2VuRGVjaW1hbHMGCQDMCAIFBmFUb2tlbgkAzAgCCQEId3JpdGVJbnQCBRNhVG9rZW5EZWNpbWFsc1N0b3JlBQ5hVG9rZW5EZWNpbWFscwkAzAgCCQELd3JpdGVTdHJpbmcCBQ9hVG9rZW5OYW1lU3RvcmUFCmFUb2tlbk5hbWUJAMwIAgkBC3dyaXRlU3RyaW5nAgUMYXNzZXRJZFN0b3JlBQ5hc3NldElkT3JXYXZlcwkAzAgCCQELd3JpdGVTdHJpbmcCBRJjb25maWdBZGRyZXNzU3RvcmUFCmNmZ0FkZHJlc3MJAMwIAgkBC3dyaXRlU3RyaW5nAgUNYVRva2VuSWRTdG9yZQkA2AQBCQC4CAEFBmFUb2tlbgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC2luaXRpYWxpemUyAAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECFm9ubHkgc2VsZiBjYW4gY29udGludWUJAMwIAgkBC1N0cmluZ0VudHJ5AgUScmVzZXJ2ZUdsb2JhbFN0b3JlCQCsAgIJAKQDAQUGSEVJR0hUAgR8fHx8BQNuaWwBaQEOdXNlckRlcG9zaXRVU0QBB2FkZHJlc3MJAJQKAgUDbmlsCQEKYXNzZXRUb1VzZAEJAQ1hVG9rZW5Ub0Fzc2V0AQkBDWFUb2tlbkJhbGFuY2UBBQdhZGRyZXNzAWkBC3VzZXJEZWJ0VVNEAQdhZGRyZXNzCQCUCgIFA25pbAkBCmFzc2V0VG9Vc2QBCQEPY3VycmVudFVzZXJEZWJ0AQUHYWRkcmVzcwFpAQt1c2VyQmFsYW5jZQEHYWRkcmVzcwQHYXRva2VucwkBDWFUb2tlbkJhbGFuY2UBBQdhZGRyZXNzBAVhc3NldAkBDWFUb2tlblRvQXNzZXQBBQdhdG9rZW5zBARkZWJ0CQEPY3VycmVudFVzZXJEZWJ0AQUHYWRkcmVzcwkAlAoCBQNuaWwJAJgKBgUHYXRva2VucwUFYXNzZXQJAQphc3NldFRvVXNkAQUFYXNzZXQFBGRlYnQJAQphc3NldFRvVXNkAQUEZGVidAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQEUdXNlQXNDb2xsYXRlcmFsU3RvcmUBBQdhZGRyZXNzBgFpAQh1c2VyRGVidAEHYWRkcmVzcwQEZGVidAkBD2N1cnJlbnRVc2VyRGVidAEFB2FkZHJlc3MEB2RlYnRVc2QJAQphc3NldFRvVXNkAQUEZGVidAkAlAoCBQNuaWwJAJQKAgUEZGVidAUHZGVidFVzZAFpAQ1hc3NldFVzZFZhbHVlAQthc3NldEFtb3VudAkAlAoCBQNuaWwJAQphc3NldFRvVXNkAQULYXNzZXRBbW91bnQBaQEIcmVwYXlGb3IBC3VzZXJBZGRyZXNzBAZjaGVja3MJAQhtYWluT25seQEFAWkDCQAAAgUGY2hlY2tzBQZjaGVja3MJAQlyZXBheVVzZXICBQt1c2VyQWRkcmVzcwkBDXBheW1lbnRBbW91bnQCBQFpBQdhc3NldElkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCmRlcG9zaXRGb3ICCWRlcG9zaXRvcg91c2VBc0NvbGxhdGVyYWwEBmNoZWNrcwMJAQhtYWluT25seQEFAWkJAQlvcEFsbG93ZWQBAgdkZXBvc2l0BwMJAAACBQZjaGVja3MFBmNoZWNrcwMDCQBmAgkBD2N1cnJlbnRVc2VyRGVidAEFCWRlcG9zaXRvcgAACQEBIQEFD3VzZUFzQ29sbGF0ZXJhbAcJAAIBAjhjYW4ndCBkaXNhYmxlIHVzZSBhcyBjb2xsYXRlcmFsIGZvciBhc3NldCB3aXRoIG9wZW4gZGVidAQGYW1vdW50CQENcGF5bWVudEFtb3VudAIFAWkFB2Fzc2V0SWQEDGFUb2tlbkFtb3VudAkBDWFzc2V0VG9BVG9rZW4BBQZhbW91bnQJAM4IAgkBCnN5bmNUb3RhbHMEBQZhbW91bnQAAAAAAAAJAMwIAgkBCGNoYW5nZUJ5AgUWYVRva2VuQ2lyY3VsYXRpb25TdG9yZQUMYVRva2VuQW1vdW50CQDMCAIJAQhjaGFuZ2VCeQIJARJhVG9rZW5CYWxhbmNlU3RvcmUBBQlkZXBvc2l0b3IFDGFUb2tlbkFtb3VudAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBFHVzZUFzQ29sbGF0ZXJhbFN0b3JlAQUJZGVwb3NpdG9yBQ91c2VBc0NvbGxhdGVyYWwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQt3aXRoZHJhd0ZvcgIHYWRkcmVzcwZhbW91bnQJARB3aXRoZHJhd0ludGVybmFsBAUBaQUHYWRkcmVzcwUGYW1vdW50BwFpAQ53aXRoZHJhd1RvTWFpbgIEdXNlcgZhbW91bnQDCQECIT0CBQZhbW91bnQA////////////AQkAAgECJnJlc2VydmU6IHdpdGhkcmF3VG9NYWluIGFtb3VudCAtMSBvbmx5CQEQd2l0aGRyYXdJbnRlcm5hbAQFAWkFBHVzZXIFBmFtb3VudAYBaQEWcmVwbGVuaXNoV2l0aEF0b2tlbkZvcgEEdXNlcgkBEXJlcGxlbmlzaEludGVybmFsAwIRcmVwbGVuaXNoX2F0b2tlbnMFBHVzZXIFAWkBaQEecmVwbGVuaXNGb3JVbmxvY2tXaXRoQXRva2VuRm9yAQR1c2VyCQERcmVwbGVuaXNoSW50ZXJuYWwDAhhyZXBsZW5pc2hfYXRva2Vuc191bmxvY2sFBHVzZXIFAWkBaQEecmVwbGVuaXNoRm9yUmVwYXlXaXRoQXRva2VuRm9yAQR1c2VyCQERcmVwbGVuaXNoSW50ZXJuYWwDAg1yZXBheV9hdG9rZW5zBQR1c2VyBQFpAWkBCWJvcnJvd0ZvcgIHYWRkcmVzcw5hbW91bnRUb0JvcnJvdwQGY2hlY2tzAwMJAQhtYWluT25seQEFAWkJAQ5saXF1aWRpdHlDaGVjawMFDmFtb3VudFRvQm9ycm93CQBlAgUSc3RvcmVkVG90YWxEZXBvc2l0BQ9zdG9yZWRUb3RhbERlYnQCGXRvbyBtdWNoIGJvcnJvdyByZXF1ZXN0ZWQHCQEJb3BBbGxvd2VkAQIGYm9ycm93BwMJAAACBQZjaGVja3MFBmNoZWNrcwQLY3VycmVudERlYnQJAQ9jdXJyZW50VXNlckRlYnQBBQdhZGRyZXNzBAduZXdEZWJ0CQBkAgULY3VycmVudERlYnQFDmFtb3VudFRvQm9ycm93CQDOCAIJAQpzeW5jVG90YWxzBAAABQ5hbW91bnRUb0JvcnJvdwAABQ5hbW91bnRUb0JvcnJvdwkAzAgCCQEId3JpdGVJbnQCCQEJZGVidFN0b3JlAQUHYWRkcmVzcwUHbmV3RGVidAkAzAgCCQEJZW5hYmxlQ29sAQUHYWRkcmVzcwkAzAgCCQEId3JpdGVJbnQCCQEOZGVidEluZGV4U3RvcmUBBQdhZGRyZXNzBQxjdXJyZW50SW5kZXgJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUHYWRkcmVzcwUOYW1vdW50VG9Cb3Jyb3cFB2Fzc2V0SWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ1taW50QXRva2VuRm9yAgdhZGRyZXNzDGFtb3VudFRvTWludAkBDG1pbnRJbnRlcm5hbAUFAWkFB2FkZHJlc3MFDGFtb3VudFRvTWludAUHYWRkcmVzcwIMbWludF9hdG9rZW5zAWkBD21pbnRBdG9rZW5Gb3JUbwMEZnJvbQxhbW91bnRUb01pbnQCdG8JAQxtaW50SW50ZXJuYWwFBQFpBQRmcm9tBQxhbW91bnRUb01pbnQFAnRvAhFsb2NrX21pbnRfYXRva2VucwFpARByZWRlZW1BdG9rZW5zRm9yAQR1c2VyBAZjaGVja3MDCQEIbWFpbk9ubHkBBQFpCQEJb3BBbGxvd2VkAQIOcmVkZWVtX2F0b2tlbnMHAwkAAAIFBmNoZWNrcwUGY2hlY2tzBAxhVG9rZW5BbW91bnQJAQ1wYXltZW50QW1vdW50AgUBaQUIYVRva2VuSWQECW91dEFtb3VudAkBDWFUb2tlblRvQXNzZXQBBQxhVG9rZW5BbW91bnQJAJQKAgkAzggCCQEKc3luY1RvdGFscwQJAQEtAQUJb3V0QW1vdW50AAAAAAUJb3V0QW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHVzZXIFCW91dEFtb3VudAUHYXNzZXRJZAkAzAgCCQEIY2hhbmdlQnkCBRZhVG9rZW5DaXJjdWxhdGlvblN0b3JlCQEBLQEFDGFUb2tlbkFtb3VudAkAzAgCCQEEQnVybgIFCGFUb2tlbklkBQxhVG9rZW5BbW91bnQFA25pbAUJb3V0QW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEnRyYW5zZmVyQVRva2Vuc0ZvcgMEZnJvbQJ0bwh2YWx1ZVVzZAQGY2hlY2tzAwkBCG1haW5Pbmx5AQUBaQkBCW9wQWxsb3dlZAECDXRyYW5zZmVyX2RlYnQHAwkAAAIFBmNoZWNrcwUGY2hlY2tzBAZhc3NldHMJAQp1c2RUb0Fzc2V0AQUIdmFsdWVVc2QEB2F0b2tlbnMJAQ1hc3NldFRvQVRva2VuAQUGYXNzZXRzBAthVG9rZW5zRnJvbQkBDWFUb2tlbkJhbGFuY2UBBQRmcm9tAwkAZgIFB2F0b2tlbnMFC2FUb2tlbnNGcm9tCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhl0cmFuc2ZlckF0b2tlbnNGb3IgZXJyb3I6AhQgdHJhbnNmZXIudmFsdWVVc2Q6IAkApAMBBQh2YWx1ZVVzZAISIHRyYW5zZmVyLmFzc2V0czogCQCkAwEFBmFzc2V0cwITIHRyYW5zZmVyLmF0b2tlbnM6IAkApAMBBQdhdG9rZW5zAg8gZnJvbS5hdG9rZW5zOiAJAKQDAQULYVRva2Vuc0Zyb20CBCBhdCAJAKUIAQUEdGhpcwkAlAoCCQDOCAIJAM4IAgkBCnN5bmNUb3RhbHMEAAAAAAAAAAAJAMwIAgkBCGNoYW5nZUJ5AgkBEmFUb2tlbkJhbGFuY2VTdG9yZQEFBGZyb20JAQEtAQUHYXRva2VucwkAzAgCCQEIY2hhbmdlQnkCCQESYVRva2VuQmFsYW5jZVN0b3JlAQUCdG8FB2F0b2tlbnMFA25pbAkBEWVuYWJsZUNvbElmTmVlZGVkAQUCdG8JAQ1hVG9rZW5Ub0Fzc2V0AQUHYXRva2VucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ90cmFuc2ZlckRlYnRGb3IDBGZyb20CdG8GYW1vdW50BAZjaGVja3MDCQEIbWFpbk9ubHkBBQFpCQEJb3BBbGxvd2VkAQINdHJhbnNmZXJfZGVidAcDCQAAAgUGY2hlY2tzBQZjaGVja3MJAJQKAgkAzggCCQEKc3luY1RvdGFscwQAAAAAAAAAAAkAzAgCCQEId3JpdGVJbnQCCQEJZGVidFN0b3JlAQUEZnJvbQkAZQIJAQ9jdXJyZW50VXNlckRlYnQBBQRmcm9tBQZhbW91bnQJAMwIAgkBCHdyaXRlSW50AgkBCWRlYnRTdG9yZQEFAnRvCQBkAgkBD2N1cnJlbnRVc2VyRGVidAEFAnRvBQZhbW91bnQJAMwIAgkBCHdyaXRlSW50AgkBDmRlYnRJbmRleFN0b3JlAQUEZnJvbQUMY3VycmVudEluZGV4CQDMCAIJAQh3cml0ZUludAIJAQ5kZWJ0SW5kZXhTdG9yZQEFAnRvBQxjdXJyZW50SW5kZXgJAMwIAgkBCWVuYWJsZUNvbAEFAnRvBQNuaWwFBmFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARlkaXNhYmxlVXNlQXNDb2xsYXRlcmFsRm9yAQdhZGRyZXNzBAZjaGVja3MDCQEIbWFpbk9ubHkBBQFpCQEJb3BBbGxvd2VkAQIKdXNlX2FzX2NvbAcDCQAAAgUGY2hlY2tzBQZjaGVja3MDCQBmAgkBD2N1cnJlbnRVc2VyRGVidAEFB2FkZHJlc3MAAAkAAgECMWNhbid0IGRpc2FibGUgY29sbGF0ZXJhbCBmb3IgYXNzZXQgd2l0aCBvcGVuIGRlYnQJAM4IAgkBCnN5bmNUb3RhbHMEAAAAAAAAAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIJARR1c2VBc0NvbGxhdGVyYWxTdG9yZQEFB2FkZHJlc3MHBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEVZW5hYmxlVXNlQXNDb2xsYXRlcmFsAAQGY2hlY2tzCQEJb3BBbGxvd2VkAQIKdXNlX2FzX2NvbAMJAAACBQZjaGVja3MFBmNoZWNrcwkAzggCCQEKc3luY1RvdGFscwQAAAAAAAAAAAkAzAgCCQEJZW5hYmxlQ29sAQkApQgBCAUBaQZjYWxsZXIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtjb2xsYXBzZUZvcgEEdXNlcgQGY2hlY2tzAwkBCG1haW5Pbmx5AQUBaQkBCW9wQWxsb3dlZAECDmZvcmNlX2NvbGxhcHNlBwMJAAACBQZjaGVja3MFBmNoZWNrcwkBDGNvbGxhcHNlVXNlcgIFBHVzZXIA////////////AQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARFjb2xsYXBzZUZvckFtb3VudAIEdXNlcgZhbW91bnQEBmNoZWNrcwMJAQhtYWluT25seQEFAWkJAQlvcEFsbG93ZWQBAghjb2xsYXBzZQcDCQAAAgUGY2hlY2tzBQZjaGVja3MJAQxjb2xsYXBzZVVzZXICBQR1c2VyBQZhbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHbHBWYWx1ZQEMYVRva2VuQW1vdW50CQCUCgIFA25pbAkBDWFUb2tlblRvQXNzZXQBBQxhVG9rZW5BbW91bnQAJrp8hg==", "chainId": 87, "height": 3266819, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FweaDLJ5BJoaRrU3UmHndBmK2gU6KcXBP4w9XJ5iqKxg Next: 3oDLAUbtsprgUDnexLwFqwGDtPctfbzJLLP1jLznHudG Diff:
Old | New | Differences | |
---|---|---|---|
20 | 20 | else IntegerEntry(b, i) | |
21 | 21 | ||
22 | 22 | ||
23 | - | func j (i) = { | |
24 | - | let k = i | |
25 | - | if ($isInstanceOf(k, "Int")) | |
23 | + | func j (i) = if ((0 > i)) | |
24 | + | then throw("writing negative value") | |
25 | + | else i | |
26 | + | ||
27 | + | ||
28 | + | func k (i) = { | |
29 | + | let l = i | |
30 | + | if ($isInstanceOf(l, "Int")) | |
26 | 31 | then { | |
27 | - | let | |
28 | - | | |
32 | + | let m = l | |
33 | + | m | |
29 | 34 | } | |
30 | 35 | else throw("r:1") | |
31 | 36 | } | |
32 | 37 | ||
33 | 38 | ||
34 | - | func | |
39 | + | func n (b,i) = h(b, (valueOrElse(a(b), 0) + i)) | |
35 | 40 | ||
36 | 41 | ||
37 | - | func | |
42 | + | func o (b,i) = StringEntry(b, i) | |
38 | 43 | ||
39 | 44 | ||
40 | - | func | |
41 | - | let | |
42 | - | let | |
43 | - | let | |
44 | - | if ( | |
45 | - | then | |
46 | - | else ( | |
45 | + | func p (i,q,r) = { | |
46 | + | let s = fraction(i, q, r) | |
47 | + | let t = 3037000499 | |
48 | + | let u = ((((s % t) * (r % t)) % t) == (((i % t) * (q % t)) % t)) | |
49 | + | if (u) | |
50 | + | then s | |
51 | + | else (s + 1) | |
47 | 52 | } | |
48 | 53 | ||
49 | 54 | ||
50 | - | let | |
55 | + | let v = 525600 | |
51 | 56 | ||
52 | - | let | |
57 | + | let w = 10000000000000000 | |
53 | 58 | ||
54 | - | let | |
59 | + | let x = 1000 | |
55 | 60 | ||
56 | - | let | |
61 | + | let y = "assetId" | |
57 | 62 | ||
58 | - | let | |
63 | + | let z = valueOrErrorMessage(c(y), "no assetId") | |
59 | 64 | ||
60 | - | let | |
65 | + | let A = if ((z == "WAVES")) | |
61 | 66 | then unit | |
62 | - | else fromBase58String( | |
67 | + | else fromBase58String(z) | |
63 | 68 | ||
64 | - | let | |
69 | + | let B = (z + "_ReserveFactor") | |
65 | 70 | ||
66 | - | let | |
71 | + | let C = (z + "_CollateralFactor") | |
67 | 72 | ||
68 | - | let | |
73 | + | let D = (z + "_LiquidationThreshold") | |
69 | 74 | ||
70 | - | let | |
75 | + | let E = "account_health_overlap" | |
71 | 76 | ||
72 | - | let | |
77 | + | let F = (z + "_LiquidationPenalty") | |
73 | 78 | ||
74 | - | let | |
79 | + | let G = "configAddress" | |
75 | 80 | ||
76 | - | let | |
81 | + | let H = "aTokenId" | |
77 | 82 | ||
78 | - | let | |
83 | + | let I = "aTokenName" | |
79 | 84 | ||
80 | - | let | |
85 | + | let J = "aTokenCirculation" | |
81 | 86 | ||
82 | - | let | |
87 | + | let K = "aTokenDecimals" | |
83 | 88 | ||
84 | - | let | |
89 | + | let L = "reserveGlobalData" | |
85 | 90 | ||
86 | - | let | |
91 | + | let M = valueOrElse(getString(L), "||||") | |
87 | 92 | ||
88 | - | let | |
93 | + | let N = split(M, "|") | |
89 | 94 | ||
90 | - | let | |
95 | + | let O = valueOrErrorMessage(valueOrElse(parseInt(N[0]), a("lastUpdateHeight")), "no lastUpdateHeight") | |
91 | 96 | ||
92 | - | let | |
97 | + | let P = valueOrElse(parseInt(N[1]), valueOrElse(a("totalDeposit"), 0)) | |
93 | 98 | ||
94 | - | func P (Q) = (Q + "_aTokenBalance") | |
99 | + | let Q = valueOrElse(parseInt(N[2]), valueOrElse(a("totalBorrow"), 0)) | |
100 | + | ||
101 | + | let R = valueOrElse(parseInt(N[3]), valueOrElse(a("totalReserve"), 0)) | |
102 | + | ||
103 | + | let S = valueOrElse(parseInt(N[4]), valueOrElse(a("storedIndex"), w)) | |
104 | + | ||
105 | + | func T (U) = (U + "_aTokenBalance") | |
95 | 106 | ||
96 | 107 | ||
97 | - | func | |
108 | + | func V (U) = (U + "_debt") | |
98 | 109 | ||
99 | 110 | ||
100 | - | func | |
111 | + | func W (U) = (U + "_index") | |
101 | 112 | ||
102 | 113 | ||
103 | - | func | |
114 | + | func X (U) = (U + "_useAsCollateral") | |
104 | 115 | ||
105 | 116 | ||
106 | - | func | |
107 | - | let | |
108 | - | if ($isInstanceOf( | |
117 | + | func Y (Z,A) = { | |
118 | + | let l = A | |
119 | + | if ($isInstanceOf(l, "ByteVector")) | |
109 | 120 | then { | |
110 | - | let | |
111 | - | assetBalance( | |
121 | + | let aa = l | |
122 | + | assetBalance(Z, aa) | |
112 | 123 | } | |
113 | - | else if ($isInstanceOf( | |
124 | + | else if ($isInstanceOf(l, "Unit")) | |
114 | 125 | then { | |
115 | - | let | |
116 | - | wavesBalance( | |
126 | + | let ab = l | |
127 | + | wavesBalance(Z).available | |
117 | 128 | } | |
118 | 129 | else throw("Match error") | |
119 | 130 | } | |
120 | 131 | ||
121 | 132 | ||
122 | - | let | |
133 | + | let ac = valueOrErrorMessage(a(K), "no assetDecimals") | |
123 | 134 | ||
124 | - | let | |
135 | + | let ad = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, G), "reserve: no configAddress")), "invalid config address") | |
125 | 136 | ||
126 | - | func | |
127 | - | let | |
128 | - | if ($isInstanceOf( | |
137 | + | func ae (af) = { | |
138 | + | let l = invoke(ad, "opAllowed", [z, af], nil) | |
139 | + | if ($isInstanceOf(l, "Boolean")) | |
129 | 140 | then { | |
130 | - | let | |
131 | - | if ( | |
141 | + | let ag = l | |
142 | + | if (ag) | |
132 | 143 | then true | |
133 | 144 | else throw("not allowed") | |
134 | 145 | } | |
136 | 147 | } | |
137 | 148 | ||
138 | 149 | ||
139 | - | let | |
150 | + | let ah = valueOrErrorMessage(addressFromString(split(valueOrErrorMessage(getString(ad, "main"), "no main in config"), "|")[0]), "invalid main address") | |
140 | 151 | ||
141 | - | func | |
152 | + | func ai (aj) = if (contains(getStringValue(ad, "main"), toString(aj.caller))) | |
142 | 153 | then true | |
143 | 154 | else throw("only main can do") | |
144 | 155 | ||
145 | 156 | ||
146 | - | func | |
147 | - | let | |
148 | - | if (!(contains( | |
157 | + | func ak (aj) = { | |
158 | + | let al = valueOrErrorMessage(getString(ad, "divAdmins"), "no div admins") | |
159 | + | if (!(contains(al, toString(aj.caller)))) | |
149 | 160 | then throw("only div admin can do") | |
150 | 161 | else true | |
151 | 162 | } | |
152 | 163 | ||
153 | 164 | ||
154 | - | func | |
165 | + | func am (i) = if (if ((i != "WAVES")) | |
155 | 166 | then (fromBase58String(i) == fromBase58String("")) | |
156 | 167 | else false) | |
157 | 168 | then throw("invalid assetId") | |
158 | 169 | else true | |
159 | 170 | ||
160 | 171 | ||
161 | - | let | |
172 | + | let an = e(isDefined(c(y)), "already initialized") | |
162 | 173 | ||
163 | - | let | |
164 | - | let | |
165 | - | if ($isInstanceOf( | |
174 | + | let ao = { | |
175 | + | let l = getString(ad, "oracle_address") | |
176 | + | if ($isInstanceOf(l, "String")) | |
166 | 177 | then { | |
167 | - | let | |
168 | - | addressFromString( | |
178 | + | let ap = l | |
179 | + | addressFromString(ap) | |
169 | 180 | } | |
170 | 181 | else unit | |
171 | 182 | } | |
172 | 183 | ||
173 | - | let | |
174 | - | let | |
175 | - | if ($isInstanceOf( | |
184 | + | let aq = { | |
185 | + | let l = invoke(valueOrErrorMessage(ao, "no oracle"), "price", [z], nil) | |
186 | + | if ($isInstanceOf(l, "Int")) | |
176 | 187 | then { | |
177 | - | let | |
178 | - | | |
188 | + | let aj = l | |
189 | + | aj | |
179 | 190 | } | |
180 | 191 | else throw("bad oracle data") | |
181 | 192 | } | |
182 | 193 | ||
183 | - | let | |
194 | + | let ar = height | |
184 | 195 | ||
185 | - | let | |
196 | + | let as = fromBase58String(valueOrErrorMessage(c(H), "no aTokenId")) | |
186 | 197 | ||
187 | - | let | |
198 | + | let at = valueOrElse(a(J), 0) | |
188 | 199 | ||
189 | - | let | |
200 | + | let au = valueOrErrorMessage(getInteger(ad, B), "no reserveFactor") | |
190 | 201 | ||
191 | - | let | |
202 | + | let av = valueOrErrorMessage(getInteger(ad, C), "no collateralFactor") | |
192 | 203 | ||
193 | - | let | |
204 | + | let aw = valueOrErrorMessage(getInteger(ad, D), "no liquidationThreshold") | |
194 | 205 | ||
195 | - | let | |
206 | + | let ax = valueOrErrorMessage(getInteger(ad, E), "no overlapCharge") | |
196 | 207 | ||
197 | - | let | |
208 | + | let ay = valueOrErrorMessage(getInteger(ad, F), "no liquidationPenalty") | |
198 | 209 | ||
199 | - | let av = valueOrErrorMessage(getInteger(Z, E), "no liquidationPenalty") | |
200 | - | ||
201 | - | let aw = valueOrElse(a(L), 0) | |
202 | - | ||
203 | - | let ax = valueOrElse(a(M), 0) | |
204 | - | ||
205 | - | let ay = valueOrElse(a(K), 0) | |
206 | - | ||
207 | - | let az = valueOrElse(a(N), v) | |
208 | - | ||
209 | - | let aA = if ((aw > 0)) | |
210 | - | then min([w, fraction(ay, w, aw)]) | |
210 | + | let az = if ((P > 0)) | |
211 | + | then min([x, fraction(Q, x, P)]) | |
211 | 212 | else 0 | |
212 | 213 | ||
213 | - | let | |
214 | - | let | |
215 | - | let | |
216 | - | let | |
217 | - | let | |
218 | - | let | |
219 | - | let | |
220 | - | if (( | |
221 | - | then | |
222 | - | else if (( | |
223 | - | then | |
224 | - | else if (if (( | |
214 | + | let aA = { | |
215 | + | let aB = getIntegerValue(ad, (z + "_APoint")) | |
216 | + | let ag = getIntegerValue(ad, (z + "_BPoint")) | |
217 | + | let aC = getIntegerValue(ad, (z + "_CPoint")) | |
218 | + | let aD = getIntegerValue(ad, (z + "_DPoint")) | |
219 | + | let aE = (fraction((aB - aC), az, -(ag)) + aB) | |
220 | + | let aF = (fraction((aC - aD), (az - ag), (ag - x)) + aC) | |
221 | + | if ((az == 0)) | |
222 | + | then aB | |
223 | + | else if ((az == ag)) | |
224 | + | then aC | |
225 | + | else if (if ((ag > az)) | |
225 | 226 | then true | |
226 | - | else ( | |
227 | - | then | |
228 | - | else | |
227 | + | else (ag == x)) | |
228 | + | then aE | |
229 | + | else aF | |
229 | 230 | } | |
230 | 231 | ||
231 | - | let | |
232 | + | let aG = if ((P == 0)) | |
232 | 233 | then 0 | |
233 | - | else fraction(fraction( | |
234 | + | else fraction(fraction(Q, aA, P), (x - au), x) | |
234 | 235 | ||
235 | - | let | |
236 | - | then | |
236 | + | let aH = if ((ar == O)) | |
237 | + | then S | |
237 | 238 | else { | |
238 | - | let | |
239 | - | | |
239 | + | let aI = p(aA, w, (v * x)) | |
240 | + | p(S, (w + (aI * (ar - O))), w) | |
240 | 241 | } | |
241 | 242 | ||
242 | - | let | |
243 | + | let aJ = valueOrElse(getBoolean(ad, ("staking_enabled_" + z)), false) | |
243 | 244 | ||
244 | - | let | |
245 | - | let | |
246 | - | if ($isInstanceOf( | |
245 | + | let aK = { | |
246 | + | let l = A | |
247 | + | if ($isInstanceOf(l, "ByteVector")) | |
247 | 248 | then { | |
248 | - | let | |
249 | - | assetBalance(this, | |
249 | + | let aL = l | |
250 | + | assetBalance(this, aL) | |
250 | 251 | } | |
251 | 252 | else wavesBalance(this).available | |
252 | 253 | } | |
253 | 254 | ||
254 | - | func | |
255 | - | then throw(("not enough liquidity: " + | |
255 | + | func aM (aN,aO,aP) = if ((aN > aO)) | |
256 | + | then throw(("not enough liquidity: " + aP)) | |
256 | 257 | else true | |
257 | 258 | ||
258 | 259 | ||
259 | - | func | |
260 | + | func aQ (U) = valueOrElse(a(V(U)), 0) | |
260 | 261 | ||
261 | 262 | ||
262 | - | func | |
263 | - | let | |
264 | - | if (( | |
263 | + | func aR (U) = { | |
264 | + | let aS = aQ(U) | |
265 | + | if ((aS == 0)) | |
265 | 266 | then 0 | |
266 | 267 | else { | |
267 | - | let | |
268 | - | fraction( | |
268 | + | let aT = valueOrErrorMessage(a(W(U)), "has debt but does not have index") | |
269 | + | fraction(aS, aH, aT) | |
269 | 270 | } | |
270 | 271 | } | |
271 | 272 | ||
272 | 273 | ||
273 | - | let | |
274 | + | let aU = fraction(Q, aH, S) | |
274 | 275 | ||
275 | - | let | |
276 | + | let aV = (aU - Q) | |
276 | 277 | ||
277 | - | let | |
278 | + | let aW = fraction(aV, (x - au), x) | |
278 | 279 | ||
279 | - | let | |
280 | + | let aX = (P + aW) | |
280 | 281 | ||
281 | - | let | |
282 | + | let aY = ((R + aV) - aW) | |
282 | 283 | ||
283 | - | let | |
284 | + | let aZ = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(ad, ("staking_config_" + z)), ("no staking address for " + z))), ("bad staking address for " + z)) | |
284 | 285 | ||
285 | - | let | |
286 | - | then | |
287 | - | else | |
286 | + | let ba = min([aY, if (aJ) | |
287 | + | then k(invoke(aZ, "info", nil, nil)) | |
288 | + | else aK]) | |
288 | 289 | ||
289 | - | func | |
290 | - | let | |
291 | - | if ((0 >= | |
292 | - | then throw(("Payment is less than min allowed amount: " + toString( | |
293 | - | else if (( | |
294 | - | then throw((" bad asset attached: required " + | |
295 | - | else | |
290 | + | func bb (aj,A) = { | |
291 | + | let bc = aj.payments[0].amount | |
292 | + | if ((0 >= bc)) | |
293 | + | then throw(("Payment is less than min allowed amount: " + toString(bc))) | |
294 | + | else if ((aj.payments[0].assetId != A)) | |
295 | + | then throw((" bad asset attached: required " + z)) | |
296 | + | else bc | |
296 | 297 | } | |
297 | 298 | ||
298 | 299 | ||
299 | - | func | |
300 | - | let | |
300 | + | func bd (be,bf,bg,bh) = { | |
301 | + | let bi = if ((aK == bh)) | |
301 | 302 | then unit | |
302 | - | else if (!( | |
303 | + | else if (!(aJ)) | |
303 | 304 | then unit | |
304 | - | else if ((aL > bi)) | |
305 | - | then invoke(ba, "put", nil, [AttachedPayment(z, (aL - bi))]) | |
306 | - | else invoke(ba, "get", [(bi - aL)], nil) | |
307 | - | if ((bj == bj)) | |
308 | - | then [h(N, aI), h(J, an), h(L, (aY + bf)), h(K, (aV + bg)), h(M, (aZ + bh))] | |
305 | + | else if ((aK > bh)) | |
306 | + | then invoke(aZ, "put", nil, [AttachedPayment(A, (aK - bh))]) | |
307 | + | else invoke(aZ, "get", [(bh - aK)], nil) | |
308 | + | if ((bi == bi)) | |
309 | + | then { | |
310 | + | let bj = j((aX + be)) | |
311 | + | let bk = j((aU + bf)) | |
312 | + | let bl = j((aY + bg)) | |
313 | + | [o(L, ((((((((toString(ar) + "|") + toString(bj)) + "|") + toString(bk)) + "|") + toString(bl)) + "|") + toString(aH)))] | |
314 | + | } | |
309 | 315 | else throw("Strict value is not equal to itself.") | |
310 | 316 | } | |
311 | 317 | ||
312 | 318 | ||
313 | - | func | |
319 | + | func bm (bn) = if ((bn == 6)) | |
314 | 320 | then 1000000 | |
315 | - | else if (( | |
321 | + | else if ((bn == 8)) | |
316 | 322 | then 100000000 | |
317 | - | else throw(("bad decimals: " + toString( | |
323 | + | else throw(("bad decimals: " + toString(bn))) | |
318 | 324 | ||
319 | 325 | ||
320 | - | func | |
326 | + | func bo (aN) = fraction(aN, aq, bm(ac)) | |
321 | 327 | ||
322 | 328 | ||
323 | - | func bn (aO) = fraction(aO, bk(Y), am) | |
324 | - | ||
325 | - | ||
326 | - | func bo (bp) = if ((bp == 0)) | |
327 | - | then 0 | |
328 | - | else if ((aq > 0)) | |
329 | - | then fraction(bp, aY, aq) | |
330 | - | else bp | |
329 | + | func bp (aN) = fraction(aN, bm(ac), aq) | |
331 | 330 | ||
332 | 331 | ||
333 | 332 | func bq (br) = if ((br == 0)) | |
334 | 333 | then 0 | |
335 | - | else if (( | |
336 | - | then fraction(br, | |
334 | + | else if ((at > 0)) | |
335 | + | then fraction(br, aX, at) | |
337 | 336 | else br | |
338 | 337 | ||
339 | 338 | ||
340 | - | func bs ( | |
339 | + | func bs (bt) = if ((bt == 0)) | |
341 | 340 | then 0 | |
342 | - | else if (( | |
343 | - | then | |
344 | - | else | |
341 | + | else if ((at > 0)) | |
342 | + | then fraction(bt, at, aX) | |
343 | + | else bt | |
345 | 344 | ||
346 | 345 | ||
347 | - | func bt (bu) = valueOrElse(a(P(bu)), 0) | |
346 | + | func bu (bt) = if ((bt == 0)) | |
347 | + | then 0 | |
348 | + | else if ((at > 0)) | |
349 | + | then p(bt, at, aX) | |
350 | + | else bt | |
348 | 351 | ||
349 | 352 | ||
350 | - | func bv (bw) = | |
353 | + | func bv (bw) = valueOrElse(a(T(bw)), 0) | |
351 | 354 | ||
352 | 355 | ||
353 | - | func bx (bw) = if ((aS(bw) > 0)) | |
354 | - | then [bv(bw)] | |
356 | + | func bx (by) = BooleanEntry(X(by), true) | |
357 | + | ||
358 | + | ||
359 | + | func bz (by) = if ((aR(by) > 0)) | |
360 | + | then [bx(by)] | |
355 | 361 | else nil | |
356 | 362 | ||
357 | 363 | ||
358 | - | func | |
359 | - | let | |
360 | - | let | |
361 | - | let bB = min([ | |
362 | - | let bC = if ((-1 > | |
364 | + | func bA (bw,aN) = { | |
365 | + | let bk = aR(bw) | |
366 | + | let bj = bq(bv(bw)) | |
367 | + | let bB = min([bk, bj]) | |
368 | + | let bC = if ((-1 > aN)) | |
363 | 369 | then throw("invalid collapse amount") | |
364 | 370 | else if (if ((bB == 0)) | |
365 | 371 | then true | |
366 | - | else ( | |
372 | + | else (aN == 0)) | |
367 | 373 | then throw("nothing to collapse") | |
368 | - | else if (if (( | |
374 | + | else if (if ((aN == -1)) | |
369 | 375 | then true | |
370 | - | else ( | |
376 | + | else (aN > bB)) | |
371 | 377 | then bB | |
372 | - | else | |
373 | - | let bD = | |
374 | - | $Tuple2(( | |
378 | + | else aN | |
379 | + | let bD = bu(bC) | |
380 | + | $Tuple2((bd(-(bC), -(bC), 0, 0) ++ [n(T(bw), -(bD)), n(J, -(bD)), h(V(bw), (bk - bC)), h(W(bw), aH)]), bC) | |
375 | 381 | } | |
376 | 382 | ||
377 | 383 | ||
378 | - | func bE ( | |
379 | - | let bF = | |
384 | + | func bE (U,aN) = { | |
385 | + | let bF = ae("repay") | |
380 | 386 | if ((bF == bF)) | |
381 | 387 | then { | |
382 | - | let bG = | |
388 | + | let bG = aR(U) | |
383 | 389 | if ((bG == bG)) | |
384 | 390 | then { | |
385 | - | let bH = if (( | |
386 | - | then $Tuple4(0, -(bG), ( | |
387 | - | else $Tuple4((bG - | |
391 | + | let bH = if ((aN > bG)) | |
392 | + | then $Tuple4(0, -(bG), (aN - bG), [ScriptTransfer(addressFromStringValue(U), (aN - bG), A)]) | |
393 | + | else $Tuple4((bG - aN), -(aN), 0, nil) | |
388 | 394 | let bI = bH._1 | |
389 | 395 | let bJ = bH._2 | |
390 | 396 | let bK = bH._3 | |
391 | 397 | let bL = bH._4 | |
392 | - | let bM = ( | |
393 | - | $Tuple2((( | |
398 | + | let bM = (aN - bK) | |
399 | + | $Tuple2(((bd(0, bJ, 0, bK) ++ bL) ++ [h(V(U), bI), h(W(U), aH)]), bM) | |
394 | 400 | } | |
395 | 401 | else throw("Strict value is not equal to itself.") | |
396 | 402 | } | |
399 | 405 | ||
400 | 406 | ||
401 | 407 | func bN () = { | |
402 | - | let | |
403 | - | let | |
404 | - | let | |
405 | - | let | |
406 | - | ((((((((((((((("ABCD: " + toString( | |
408 | + | let aB = getIntegerValue(ad, (z + "_APoint")) | |
409 | + | let ag = getIntegerValue(ad, (z + "_BPoint")) | |
410 | + | let aC = getIntegerValue(ad, (z + "_CPoint")) | |
411 | + | let aD = getIntegerValue(ad, (z + "_DPoint")) | |
412 | + | ((((((((((((((("ABCD: " + toString(aB)) + ";") + toString(ag)) + ";") + toString(aC)) + ";") + toString(aD)) + ", reserveFactor: ") + toString(au)) + ", collateralFactor: ") + toString(av)) + ", liquidationThreshold: ") + toString(aw)) + ", liquidationPenalty: ") + toString(ay)) | |
407 | 413 | } | |
408 | 414 | ||
409 | 415 | ||
410 | - | func bO () = ((((((((((((((((((((((((((("currentTotalDeposit: " + toString( | |
416 | + | func bO () = ((((((((((((((((((((((((((("currentTotalDeposit: " + toString(aX)) + ", storedTotalDeposit: ") + toString(P)) + ", currentTotalDebt: ") + toString(aU)) + ", storedTotalDebt: ") + toString(Q)) + ", currentTotalReserve: ") + toString(aY)) + ", storedTotalReserve: ") + toString(R)) + ", currentIndex:") + toString(aH)) + ", storedIndex: ") + toString(S)) + ", lastUpdateHeight: ") + toString(O)) + ", utilization: ") + toString(az)) + ", aTokenCirculation: ") + toString(at)) + ", aTokenPrice: ") + toString(bq(pow(10, 0, ac, 0, 0, FLOOR)))) + ", APR: ") + toString(aA)) + ", APY: ") + toString(aG)) | |
411 | 417 | ||
412 | 418 | ||
413 | - | func bP ( | |
414 | - | let bQ = | |
415 | - | let bR = | |
416 | - | ((((((((((((((((("currentDebt: " + toString( | |
419 | + | func bP (by) = { | |
420 | + | let bQ = bv(by) | |
421 | + | let bR = Y(addressFromStringValue(by), as) | |
422 | + | ((((((((((((((((("currentDebt: " + toString(aR(by))) + ", storedDebt: ") + toString(valueOrElse(a(V(by)), 0))) + ", currentDeposit: ") + toString(bq(bQ))) + ", aTokenContractBalance: ") + toString(bQ)) + ", aTokenWalletBalance: ") + toString(bR)) + ", walletStake: ") + toString(bq(bR))) + ", assetWalletBalance: ") + toString(Y(addressFromStringValue(by), A))) + ", useAsCollateral: ") + toString(valueOrElse(getBoolean(this, X(by)), true))) + ", storedIndex: ") + toString(valueOrElse(a(W(by)), 0))) | |
417 | 423 | } | |
418 | 424 | ||
419 | 425 | ||
420 | - | func bS () = ((((((((((((((((((((((("storedTotalDeposit: " + toString( | |
426 | + | func bS () = ((((((((((((((((((((((("storedTotalDeposit: " + toString(P)) + ", storedTotalDebt: ") + toString(Q)) + ", storedTotalReserve: ") + toString(R)) + ", storedIndex: ") + toString(S)) + ", lastUpdateHeight: ") + toString(O)) + ", currentTotalDeposit: ") + toString(aX)) + ", currentTotalDebt: ") + toString(aU)) + ", currentTotalReserve: ") + toString(aY)) + ", currentIndex: ") + toString(aH)) + ", currentHeight: ") + toString(ar)) + ", aTokenCirculation: ") + toString(at)) + ", aTokenPrice: ") + toString(bq(pow(10, 0, ac, 0, 0, FLOOR)))) | |
421 | 427 | ||
422 | 428 | ||
423 | - | func bT ( | |
424 | - | let bU = | |
425 | - | let bV = | |
426 | - | let | |
427 | - | if (( | |
428 | - | then $Tuple4( | |
429 | - | else $Tuple4( | |
429 | + | func bT (by) = { | |
430 | + | let bU = bv(by) | |
431 | + | let bV = bq(bU) | |
432 | + | let bk = aR(by) | |
433 | + | if ((ar == O)) | |
434 | + | then $Tuple4(P, Q, bV, bk) | |
435 | + | else $Tuple4(aX, aU, bV, bk) | |
430 | 436 | } | |
431 | 437 | ||
432 | 438 | ||
433 | - | func bW ( | |
434 | - | let bY = (( | |
435 | - | let bF = if (if (if ( | |
436 | - | then aN | |
439 | + | func bW (aj,by,aN,bX) = { | |
440 | + | let bY = ((P + R) - Q) | |
441 | + | let bF = if (if (if (ai(aj)) | |
442 | + | then aM(aN, bY, ("funds in use: max=" + toString(bY))) | |
437 | 443 | else false) | |
438 | - | then e((-1 > | |
444 | + | then e((-1 > aN), "invalid amount") | |
439 | 445 | else false) | |
440 | - | then | |
446 | + | then ae("withdraw") | |
441 | 447 | else false | |
442 | 448 | if ((bF == bF)) | |
443 | 449 | then { | |
444 | - | let bZ = if (( | |
450 | + | let bZ = if ((aN == -1)) | |
445 | 451 | then { | |
446 | - | let bU = | |
447 | - | $Tuple2(bU, | |
452 | + | let bU = bv(by) | |
453 | + | $Tuple2(bU, bq(bU)) | |
448 | 454 | } | |
449 | - | else $Tuple2( | |
455 | + | else $Tuple2(bu(aN), aN) | |
450 | 456 | let bD = bZ._1 | |
451 | 457 | let ca = bZ._2 | |
452 | - | $Tuple2(( | |
453 | - | then | |
454 | - | else addressFromStringValue( | |
458 | + | $Tuple2((bd(-(ca), 0, 0, ca) ++ [ScriptTransfer(if (bX) | |
459 | + | then ah | |
460 | + | else addressFromStringValue(by), ca, A), n(T(by), -(bD)), n(J, -(bD))]), ca) | |
455 | 461 | } | |
456 | 462 | else throw("Strict value is not equal to itself.") | |
457 | 463 | } | |
458 | 464 | ||
459 | 465 | ||
460 | - | func cb ( | |
461 | - | let bF = if ( | |
462 | - | then | |
466 | + | func cb (af,by,aj) = { | |
467 | + | let bF = if (ai(aj)) | |
468 | + | then ae(af) | |
463 | 469 | else false | |
464 | 470 | if ((bF == bF)) | |
465 | 471 | then { | |
466 | - | let | |
467 | - | $Tuple2((( | |
472 | + | let br = bb(aj, as) | |
473 | + | $Tuple2(((bd(0, 0, 0, 0) ++ [n(T(by), br), Burn(as, br)]) ++ bz(by)), bq(br)) | |
468 | 474 | } | |
469 | 475 | else throw("Strict value is not equal to itself.") | |
470 | 476 | } | |
471 | 477 | ||
472 | 478 | ||
473 | - | func cc ( | |
474 | - | let cg = | |
475 | - | let | |
479 | + | func cc (aj,bw,cd,ce,cf) = { | |
480 | + | let cg = bv(bw) | |
481 | + | let aN = if ((cd == -1)) | |
476 | 482 | then cg | |
477 | 483 | else cd | |
478 | - | let bF = if (if (if ( | |
479 | - | then | |
484 | + | let bF = if (if (if (ai(aj)) | |
485 | + | then ae(cf) | |
480 | 486 | else false) | |
481 | 487 | then e((-1 > cd), "invalid amountToMint") | |
482 | 488 | else false) | |
483 | - | then e(( | |
489 | + | then e((aN > cg), ("Trying to mint more than available, max: " + toString(cg))) | |
484 | 490 | else false | |
485 | 491 | if ((bF == bF)) | |
486 | - | then $Tuple2(( | |
492 | + | then $Tuple2((bd(0, 0, 0, 0) ++ [n(T(bw), -(aN)), Reissue(as, aN, true), ScriptTransfer(addressFromStringValue(ce), aN, as)]), bq(aN)) | |
487 | 493 | else throw("Strict value is not equal to itself.") | |
488 | 494 | } | |
489 | 495 | ||
490 | 496 | ||
491 | - | @Callable( | |
492 | - | func getReserveDivsInfo () = $Tuple2(nil, $Tuple3( | |
497 | + | @Callable(aj) | |
498 | + | func getReserveDivsInfo () = $Tuple2(nil, $Tuple3(ba, z, (aY - ba))) | |
493 | 499 | ||
494 | 500 | ||
495 | 501 | ||
496 | - | @Callable( | |
497 | - | func | |
502 | + | @Callable(aj) | |
503 | + | func storedDepositBorrow () = $Tuple2(nil, $Tuple2(P, Q)) | |
498 | 504 | ||
499 | 505 | ||
500 | 506 | ||
501 | - | @Callable(af) | |
507 | + | @Callable(aj) | |
508 | + | func getCurrentTotals (by) = $Tuple2(nil, bT(by)) | |
509 | + | ||
510 | + | ||
511 | + | ||
512 | + | @Callable(aj) | |
502 | 513 | func getCurrentTotals2 (ch,ci) = { | |
503 | 514 | let cj = bT(ch) | |
504 | 515 | let ck = cj._1 | |
515 | 526 | ||
516 | 527 | ||
517 | 528 | ||
518 | - | @Callable( | |
529 | + | @Callable(aj) | |
519 | 530 | func advise () = $Tuple2(nil, ((((("reserveAddress: " + toString(this)) + ", ") + bN()) + ", ") + bO())) | |
520 | 531 | ||
521 | 532 | ||
522 | 533 | ||
523 | - | @Callable( | |
524 | - | func adviseUser ( | |
525 | - | let ct = | |
526 | - | let cu = | |
527 | - | let cv = valueOrElse(getBoolean(this, | |
534 | + | @Callable(aj) | |
535 | + | func adviseUser (by) = { | |
536 | + | let ct = bo(aU) | |
537 | + | let cu = bo(aX) | |
538 | + | let cv = valueOrElse(getBoolean(this, X(by)), true) | |
528 | 539 | let cw = if (cv) | |
529 | 540 | then cu | |
530 | 541 | else 0 | |
531 | 542 | let cx = min([ct, cw]) | |
532 | - | let cy = | |
543 | + | let cy = p(cx, ax, x) | |
533 | 544 | let cz = if ((ct > cw)) | |
534 | 545 | then 0 | |
535 | - | else fraction((cw - ct), | |
546 | + | else fraction((cw - ct), av, x) | |
536 | 547 | let cA = if ((ct > cw)) | |
537 | - | then (fraction((ct - cw), | |
548 | + | then (fraction((ct - cw), x, aw) + cy) | |
538 | 549 | else cy | |
539 | 550 | let cB = ((((((((("reserveAddress: " + toString(this)) + ", currentDebtUsd: ") + toString(ct)) + ", currentDepositUsd: ") + toString(cu)) + ", bp: ") + toString(cz)) + ", bpu: ") + toString(cA)) | |
540 | - | $Tuple2(nil, ((cB + ", ") + bP( | |
551 | + | $Tuple2(nil, ((cB + ", ") + bP(by))) | |
541 | 552 | } | |
542 | 553 | ||
543 | 554 | ||
544 | 555 | ||
545 | - | @Callable( | |
546 | - | func addInterest () = if (( | |
556 | + | @Callable(aj) | |
557 | + | func addInterest () = if ((aj.payments[0].assetId != A)) | |
547 | 558 | then throw("can't add interest with unrelated token") | |
548 | - | else | |
559 | + | else bd(aj.payments[0].amount, 0, 0, 0) | |
549 | 560 | ||
550 | 561 | ||
551 | 562 | ||
552 | - | @Callable( | |
553 | - | func addToReserve () = if (( | |
563 | + | @Callable(aj) | |
564 | + | func addToReserve () = if ((aj.payments[0].assetId != A)) | |
554 | 565 | then throw("can't add interest with unrelated token") | |
555 | - | else | |
566 | + | else bd(0, 0, aj.payments[0].amount, 0) | |
556 | 567 | ||
557 | 568 | ||
558 | 569 | ||
559 | - | @Callable( | |
570 | + | @Callable(aj) | |
560 | 571 | func withdrawFromReserve (bC) = { | |
561 | - | let bF = | |
572 | + | let bF = ak(aj) | |
562 | 573 | if ((bF == bF)) | |
563 | 574 | then { | |
564 | 575 | let cC = if ((bC == -1)) | |
565 | - | then | |
576 | + | then ba | |
566 | 577 | else bC | |
567 | - | $Tuple2(( | |
578 | + | $Tuple2((bd(0, 0, -(cC), cC) ++ [ScriptTransfer(aj.caller, cC, A)]), cC) | |
568 | 579 | } | |
569 | 580 | else throw("Strict value is not equal to itself.") | |
570 | 581 | } | |
571 | 582 | ||
572 | 583 | ||
573 | 584 | ||
574 | - | @Callable( | |
585 | + | @Callable(aj) | |
575 | 586 | func forceUpdate () = { | |
576 | - | let cD = valueOrErrorMessage(getString( | |
577 | - | if ((toString( | |
587 | + | let cD = valueOrErrorMessage(getString(ad, "admin"), "reserve:no admin in config") | |
588 | + | if ((toString(aj.caller) != cD)) | |
578 | 589 | then throw("only admin can do") | |
579 | - | else | |
590 | + | else bd(0, 0, 0, 0) | |
580 | 591 | } | |
581 | 592 | ||
582 | 593 | ||
583 | 594 | ||
584 | - | @Callable( | |
595 | + | @Callable(aj) | |
585 | 596 | func initialize (cE,cF,cG,cH,cI) = { | |
586 | - | let bF = if ( | |
587 | - | then | |
597 | + | let bF = if (an) | |
598 | + | then am(cF) | |
588 | 599 | else false | |
589 | 600 | if ((bF == bF)) | |
590 | 601 | then { | |
591 | 602 | let cJ = Issue(cG, cH, 0, cI, true) | |
592 | - | [cJ, h( | |
603 | + | [cJ, h(K, cI), o(I, cG), o(y, cF), o(G, cE), o(H, toBase58String(calculateAssetId(cJ)))] | |
593 | 604 | } | |
594 | 605 | else throw("Strict value is not equal to itself.") | |
595 | 606 | } | |
596 | 607 | ||
597 | 608 | ||
598 | 609 | ||
599 | - | @Callable( | |
600 | - | func initialize2 () = if (( | |
610 | + | @Callable(aj) | |
611 | + | func initialize2 () = if ((aj.caller != this)) | |
601 | 612 | then throw("only self can continue") | |
602 | - | else [ | |
613 | + | else [StringEntry(L, (toString(ar) + "||||"))] | |
603 | 614 | ||
604 | 615 | ||
605 | 616 | ||
606 | - | @Callable( | |
607 | - | func userDepositUSD ( | |
617 | + | @Callable(aj) | |
618 | + | func userDepositUSD (bw) = $Tuple2(nil, bo(bq(bv(bw)))) | |
608 | 619 | ||
609 | 620 | ||
610 | 621 | ||
611 | - | @Callable( | |
612 | - | func userDebtUSD ( | |
622 | + | @Callable(aj) | |
623 | + | func userDebtUSD (bw) = $Tuple2(nil, bo(aR(bw))) | |
613 | 624 | ||
614 | 625 | ||
615 | 626 | ||
616 | - | @Callable( | |
617 | - | func userBalance ( | |
618 | - | let bU = | |
619 | - | let bV = | |
620 | - | let | |
621 | - | $Tuple2(nil, $Tuple6(bU, bV, | |
627 | + | @Callable(aj) | |
628 | + | func userBalance (bw) = { | |
629 | + | let bU = bv(bw) | |
630 | + | let bV = bq(bU) | |
631 | + | let bk = aR(bw) | |
632 | + | $Tuple2(nil, $Tuple6(bU, bV, bo(bV), bk, bo(bk), valueOrElse(getBoolean(this, X(bw)), true))) | |
622 | 633 | } | |
623 | 634 | ||
624 | 635 | ||
625 | 636 | ||
626 | - | @Callable( | |
627 | - | func userDebt ( | |
628 | - | let | |
629 | - | let cK = | |
630 | - | $Tuple2(nil, $Tuple2( | |
637 | + | @Callable(aj) | |
638 | + | func userDebt (bw) = { | |
639 | + | let bk = aR(bw) | |
640 | + | let cK = bo(bk) | |
641 | + | $Tuple2(nil, $Tuple2(bk, cK)) | |
631 | 642 | } | |
632 | 643 | ||
633 | 644 | ||
634 | 645 | ||
635 | - | @Callable( | |
636 | - | func assetUsdValue ( | |
646 | + | @Callable(aj) | |
647 | + | func assetUsdValue (bt) = $Tuple2(nil, bo(bt)) | |
637 | 648 | ||
638 | 649 | ||
639 | 650 | ||
640 | - | @Callable( | |
641 | - | func repayFor ( | |
642 | - | let bF = | |
651 | + | @Callable(aj) | |
652 | + | func repayFor (U) = { | |
653 | + | let bF = ai(aj) | |
643 | 654 | if ((bF == bF)) | |
644 | - | then bE( | |
655 | + | then bE(U, bb(aj, A)) | |
645 | 656 | else throw("Strict value is not equal to itself.") | |
646 | 657 | } | |
647 | 658 | ||
648 | 659 | ||
649 | 660 | ||
650 | - | @Callable( | |
661 | + | @Callable(aj) | |
651 | 662 | func depositFor (cL,cM) = { | |
652 | - | let bF = if ( | |
653 | - | then | |
663 | + | let bF = if (ai(aj)) | |
664 | + | then ae("deposit") | |
654 | 665 | else false | |
655 | 666 | if ((bF == bF)) | |
656 | - | then if (if (( | |
667 | + | then if (if ((aR(cL) > 0)) | |
657 | 668 | then !(cM) | |
658 | 669 | else false) | |
659 | 670 | then throw("can't disable use as collateral for asset with open debt") | |
660 | 671 | else { | |
661 | - | let | |
662 | - | let | |
663 | - | ( | |
672 | + | let aN = bb(aj, A) | |
673 | + | let br = bs(aN) | |
674 | + | (bd(aN, 0, 0, 0) ++ [n(J, br), n(T(cL), br), BooleanEntry(X(cL), cM)]) | |
664 | 675 | } | |
665 | 676 | else throw("Strict value is not equal to itself.") | |
666 | 677 | } | |
667 | 678 | ||
668 | 679 | ||
669 | 680 | ||
670 | - | @Callable( | |
671 | - | func withdrawFor ( | |
681 | + | @Callable(aj) | |
682 | + | func withdrawFor (bw,aN) = bW(aj, bw, aN, false) | |
672 | 683 | ||
673 | 684 | ||
674 | 685 | ||
675 | - | @Callable( | |
676 | - | func withdrawToMain ( | |
686 | + | @Callable(aj) | |
687 | + | func withdrawToMain (by,aN) = if ((aN != -1)) | |
677 | 688 | then throw("reserve: withdrawToMain amount -1 only") | |
678 | - | else bW( | |
689 | + | else bW(aj, by, aN, true) | |
679 | 690 | ||
680 | 691 | ||
681 | 692 | ||
682 | - | @Callable( | |
683 | - | func replenishWithAtokenFor ( | |
693 | + | @Callable(aj) | |
694 | + | func replenishWithAtokenFor (by) = cb("replenish_atokens", by, aj) | |
684 | 695 | ||
685 | 696 | ||
686 | 697 | ||
687 | - | @Callable( | |
688 | - | func | |
698 | + | @Callable(aj) | |
699 | + | func replenisForUnlockWithAtokenFor (by) = cb("replenish_atokens_unlock", by, aj) | |
689 | 700 | ||
690 | 701 | ||
691 | 702 | ||
692 | - | @Callable(af) | |
693 | - | func borrowFor (bu,cN) = { | |
694 | - | let bF = if (if (ae(af)) | |
695 | - | then aN(cN, (aw - ay), "too much borrow requested") | |
703 | + | @Callable(aj) | |
704 | + | func replenishForRepayWithAtokenFor (by) = cb("repay_atokens", by, aj) | |
705 | + | ||
706 | + | ||
707 | + | ||
708 | + | @Callable(aj) | |
709 | + | func borrowFor (bw,cN) = { | |
710 | + | let bF = if (if (ai(aj)) | |
711 | + | then aM(cN, (P - Q), "too much borrow requested") | |
696 | 712 | else false) | |
697 | - | then | |
713 | + | then ae("borrow") | |
698 | 714 | else false | |
699 | 715 | if ((bF == bF)) | |
700 | 716 | then { | |
701 | - | let bG = | |
717 | + | let bG = aR(bw) | |
702 | 718 | let bI = (bG + cN) | |
703 | - | ( | |
719 | + | (bd(0, cN, 0, cN) ++ [h(V(bw), bI), bx(bw), h(W(bw), aH), ScriptTransfer(addressFromStringValue(bw), cN, A)]) | |
704 | 720 | } | |
705 | 721 | else throw("Strict value is not equal to itself.") | |
706 | 722 | } | |
707 | 723 | ||
708 | 724 | ||
709 | 725 | ||
710 | - | @Callable( | |
711 | - | func mintAtokenFor ( | |
726 | + | @Callable(aj) | |
727 | + | func mintAtokenFor (bw,cd) = cc(aj, bw, cd, bw, "mint_atokens") | |
712 | 728 | ||
713 | 729 | ||
714 | 730 | ||
715 | - | @Callable( | |
716 | - | func mintAtokenForTo (cO,cd,ce) = cc( | |
731 | + | @Callable(aj) | |
732 | + | func mintAtokenForTo (cO,cd,ce) = cc(aj, cO, cd, ce, "lock_mint_atokens") | |
717 | 733 | ||
718 | 734 | ||
719 | 735 | ||
720 | - | @Callable( | |
721 | - | func redeemAtokensFor ( | |
722 | - | let bF = if ( | |
723 | - | then | |
736 | + | @Callable(aj) | |
737 | + | func redeemAtokensFor (by) = { | |
738 | + | let bF = if (ai(aj)) | |
739 | + | then ae("redeem_atokens") | |
724 | 740 | else false | |
725 | 741 | if ((bF == bF)) | |
726 | 742 | then { | |
727 | - | let | |
728 | - | let cP = | |
729 | - | $Tuple2(( | |
743 | + | let br = bb(aj, as) | |
744 | + | let cP = bq(br) | |
745 | + | $Tuple2((bd(-(cP), 0, 0, cP) ++ [ScriptTransfer(addressFromStringValue(by), cP, A), n(J, -(br)), Burn(as, br)]), cP) | |
730 | 746 | } | |
731 | 747 | else throw("Strict value is not equal to itself.") | |
732 | 748 | } | |
733 | 749 | ||
734 | 750 | ||
735 | 751 | ||
736 | - | @Callable( | |
752 | + | @Callable(aj) | |
737 | 753 | func transferATokensFor (cO,ce,cQ) = { | |
738 | - | let bF = if ( | |
739 | - | then | |
754 | + | let bF = if (ai(aj)) | |
755 | + | then ae("transfer_debt") | |
740 | 756 | else false | |
741 | 757 | if ((bF == bF)) | |
742 | 758 | then { | |
743 | - | let cR = | |
744 | - | let bU = | |
745 | - | let cS = | |
759 | + | let cR = bp(cQ) | |
760 | + | let bU = bs(cR) | |
761 | + | let cS = bv(cO) | |
746 | 762 | if ((bU > cS)) | |
747 | 763 | then throw((((((((((("transferAtokensFor error:" + " transfer.valueUsd: ") + toString(cQ)) + " transfer.assets: ") + toString(cR)) + " transfer.atokens: ") + toString(bU)) + " from.atokens: ") + toString(cS)) + " at ") + toString(this))) | |
748 | - | else $Tuple2((( | |
764 | + | else $Tuple2(((bd(0, 0, 0, 0) ++ [n(T(cO), -(bU)), n(T(ce), bU)]) ++ bz(ce)), bq(bU)) | |
749 | 765 | } | |
750 | 766 | else throw("Strict value is not equal to itself.") | |
751 | 767 | } | |
752 | 768 | ||
753 | 769 | ||
754 | 770 | ||
755 | - | @Callable( | |
756 | - | func transferDebtFor (cO,ce, | |
757 | - | let bF = if ( | |
758 | - | then | |
771 | + | @Callable(aj) | |
772 | + | func transferDebtFor (cO,ce,aN) = { | |
773 | + | let bF = if (ai(aj)) | |
774 | + | then ae("transfer_debt") | |
759 | 775 | else false | |
760 | 776 | if ((bF == bF)) | |
761 | - | then $Tuple2(( | |
777 | + | then $Tuple2((bd(0, 0, 0, 0) ++ [h(V(cO), (aR(cO) - aN)), h(V(ce), (aR(ce) + aN)), h(W(cO), aH), h(W(ce), aH), bx(ce)]), aN) | |
762 | 778 | else throw("Strict value is not equal to itself.") | |
763 | 779 | } | |
764 | 780 | ||
765 | 781 | ||
766 | 782 | ||
767 | - | @Callable( | |
768 | - | func disableUseAsCollateralFor ( | |
769 | - | let bF = if ( | |
770 | - | then | |
783 | + | @Callable(aj) | |
784 | + | func disableUseAsCollateralFor (bw) = { | |
785 | + | let bF = if (ai(aj)) | |
786 | + | then ae("use_as_col") | |
771 | 787 | else false | |
772 | 788 | if ((bF == bF)) | |
773 | - | then if (( | |
789 | + | then if ((aR(bw) > 0)) | |
774 | 790 | then throw("can't disable collateral for asset with open debt") | |
775 | - | else ( | |
791 | + | else (bd(0, 0, 0, 0) ++ [BooleanEntry(X(bw), false)]) | |
776 | 792 | else throw("Strict value is not equal to itself.") | |
777 | 793 | } | |
778 | 794 | ||
779 | 795 | ||
780 | 796 | ||
781 | - | @Callable( | |
797 | + | @Callable(aj) | |
782 | 798 | func enableUseAsCollateral () = { | |
783 | - | let bF = | |
799 | + | let bF = ae("use_as_col") | |
784 | 800 | if ((bF == bF)) | |
785 | - | then ( | |
801 | + | then (bd(0, 0, 0, 0) ++ [bx(toString(aj.caller))]) | |
786 | 802 | else throw("Strict value is not equal to itself.") | |
787 | 803 | } | |
788 | 804 | ||
789 | 805 | ||
790 | 806 | ||
791 | - | @Callable( | |
792 | - | func collapseFor ( | |
793 | - | let bF = if ( | |
794 | - | then | |
807 | + | @Callable(aj) | |
808 | + | func collapseFor (by) = { | |
809 | + | let bF = if (ai(aj)) | |
810 | + | then ae("force_collapse") | |
795 | 811 | else false | |
796 | 812 | if ((bF == bF)) | |
797 | - | then by | |
813 | + | then bA(by, -1) | |
798 | 814 | else throw("Strict value is not equal to itself.") | |
799 | 815 | } | |
800 | 816 | ||
801 | 817 | ||
802 | 818 | ||
803 | - | @Callable( | |
804 | - | func collapseForAmount ( | |
805 | - | let bF = if ( | |
806 | - | then | |
819 | + | @Callable(aj) | |
820 | + | func collapseForAmount (by,aN) = { | |
821 | + | let bF = if (ai(aj)) | |
822 | + | then ae("collapse") | |
807 | 823 | else false | |
808 | 824 | if ((bF == bF)) | |
809 | - | then by | |
825 | + | then bA(by, aN) | |
810 | 826 | else throw("Strict value is not equal to itself.") | |
811 | 827 | } | |
812 | 828 | ||
813 | 829 | ||
814 | 830 | ||
815 | - | @Callable( | |
816 | - | func lpValue ( | |
831 | + | @Callable(aj) | |
832 | + | func lpValue (br) = $Tuple2(nil, bq(br)) | |
817 | 833 | ||
818 | 834 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | func a (b) = getInteger(this, b) | |
5 | 5 | ||
6 | 6 | ||
7 | 7 | func c (b) = getString(this, b) | |
8 | 8 | ||
9 | 9 | ||
10 | 10 | func d (b) = valueOrErrorMessage(getString(this, b), ((("no string value for key " + b) + " at address ") + toString(this))) | |
11 | 11 | ||
12 | 12 | ||
13 | 13 | func e (f,g) = if (f) | |
14 | 14 | then throw(g) | |
15 | 15 | else true | |
16 | 16 | ||
17 | 17 | ||
18 | 18 | func h (b,i) = if ((0 > i)) | |
19 | 19 | then throw(((("writing negative value " + toString(i)) + " for key ") + b)) | |
20 | 20 | else IntegerEntry(b, i) | |
21 | 21 | ||
22 | 22 | ||
23 | - | func j (i) = { | |
24 | - | let k = i | |
25 | - | if ($isInstanceOf(k, "Int")) | |
23 | + | func j (i) = if ((0 > i)) | |
24 | + | then throw("writing negative value") | |
25 | + | else i | |
26 | + | ||
27 | + | ||
28 | + | func k (i) = { | |
29 | + | let l = i | |
30 | + | if ($isInstanceOf(l, "Int")) | |
26 | 31 | then { | |
27 | - | let | |
28 | - | | |
32 | + | let m = l | |
33 | + | m | |
29 | 34 | } | |
30 | 35 | else throw("r:1") | |
31 | 36 | } | |
32 | 37 | ||
33 | 38 | ||
34 | - | func | |
39 | + | func n (b,i) = h(b, (valueOrElse(a(b), 0) + i)) | |
35 | 40 | ||
36 | 41 | ||
37 | - | func | |
42 | + | func o (b,i) = StringEntry(b, i) | |
38 | 43 | ||
39 | 44 | ||
40 | - | func | |
41 | - | let | |
42 | - | let | |
43 | - | let | |
44 | - | if ( | |
45 | - | then | |
46 | - | else ( | |
45 | + | func p (i,q,r) = { | |
46 | + | let s = fraction(i, q, r) | |
47 | + | let t = 3037000499 | |
48 | + | let u = ((((s % t) * (r % t)) % t) == (((i % t) * (q % t)) % t)) | |
49 | + | if (u) | |
50 | + | then s | |
51 | + | else (s + 1) | |
47 | 52 | } | |
48 | 53 | ||
49 | 54 | ||
50 | - | let | |
55 | + | let v = 525600 | |
51 | 56 | ||
52 | - | let | |
57 | + | let w = 10000000000000000 | |
53 | 58 | ||
54 | - | let | |
59 | + | let x = 1000 | |
55 | 60 | ||
56 | - | let | |
61 | + | let y = "assetId" | |
57 | 62 | ||
58 | - | let | |
63 | + | let z = valueOrErrorMessage(c(y), "no assetId") | |
59 | 64 | ||
60 | - | let | |
65 | + | let A = if ((z == "WAVES")) | |
61 | 66 | then unit | |
62 | - | else fromBase58String( | |
67 | + | else fromBase58String(z) | |
63 | 68 | ||
64 | - | let | |
69 | + | let B = (z + "_ReserveFactor") | |
65 | 70 | ||
66 | - | let | |
71 | + | let C = (z + "_CollateralFactor") | |
67 | 72 | ||
68 | - | let | |
73 | + | let D = (z + "_LiquidationThreshold") | |
69 | 74 | ||
70 | - | let | |
75 | + | let E = "account_health_overlap" | |
71 | 76 | ||
72 | - | let | |
77 | + | let F = (z + "_LiquidationPenalty") | |
73 | 78 | ||
74 | - | let | |
79 | + | let G = "configAddress" | |
75 | 80 | ||
76 | - | let | |
81 | + | let H = "aTokenId" | |
77 | 82 | ||
78 | - | let | |
83 | + | let I = "aTokenName" | |
79 | 84 | ||
80 | - | let | |
85 | + | let J = "aTokenCirculation" | |
81 | 86 | ||
82 | - | let | |
87 | + | let K = "aTokenDecimals" | |
83 | 88 | ||
84 | - | let | |
89 | + | let L = "reserveGlobalData" | |
85 | 90 | ||
86 | - | let | |
91 | + | let M = valueOrElse(getString(L), "||||") | |
87 | 92 | ||
88 | - | let | |
93 | + | let N = split(M, "|") | |
89 | 94 | ||
90 | - | let | |
95 | + | let O = valueOrErrorMessage(valueOrElse(parseInt(N[0]), a("lastUpdateHeight")), "no lastUpdateHeight") | |
91 | 96 | ||
92 | - | let | |
97 | + | let P = valueOrElse(parseInt(N[1]), valueOrElse(a("totalDeposit"), 0)) | |
93 | 98 | ||
94 | - | func P (Q) = (Q + "_aTokenBalance") | |
99 | + | let Q = valueOrElse(parseInt(N[2]), valueOrElse(a("totalBorrow"), 0)) | |
100 | + | ||
101 | + | let R = valueOrElse(parseInt(N[3]), valueOrElse(a("totalReserve"), 0)) | |
102 | + | ||
103 | + | let S = valueOrElse(parseInt(N[4]), valueOrElse(a("storedIndex"), w)) | |
104 | + | ||
105 | + | func T (U) = (U + "_aTokenBalance") | |
95 | 106 | ||
96 | 107 | ||
97 | - | func | |
108 | + | func V (U) = (U + "_debt") | |
98 | 109 | ||
99 | 110 | ||
100 | - | func | |
111 | + | func W (U) = (U + "_index") | |
101 | 112 | ||
102 | 113 | ||
103 | - | func | |
114 | + | func X (U) = (U + "_useAsCollateral") | |
104 | 115 | ||
105 | 116 | ||
106 | - | func | |
107 | - | let | |
108 | - | if ($isInstanceOf( | |
117 | + | func Y (Z,A) = { | |
118 | + | let l = A | |
119 | + | if ($isInstanceOf(l, "ByteVector")) | |
109 | 120 | then { | |
110 | - | let | |
111 | - | assetBalance( | |
121 | + | let aa = l | |
122 | + | assetBalance(Z, aa) | |
112 | 123 | } | |
113 | - | else if ($isInstanceOf( | |
124 | + | else if ($isInstanceOf(l, "Unit")) | |
114 | 125 | then { | |
115 | - | let | |
116 | - | wavesBalance( | |
126 | + | let ab = l | |
127 | + | wavesBalance(Z).available | |
117 | 128 | } | |
118 | 129 | else throw("Match error") | |
119 | 130 | } | |
120 | 131 | ||
121 | 132 | ||
122 | - | let | |
133 | + | let ac = valueOrErrorMessage(a(K), "no assetDecimals") | |
123 | 134 | ||
124 | - | let | |
135 | + | let ad = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, G), "reserve: no configAddress")), "invalid config address") | |
125 | 136 | ||
126 | - | func | |
127 | - | let | |
128 | - | if ($isInstanceOf( | |
137 | + | func ae (af) = { | |
138 | + | let l = invoke(ad, "opAllowed", [z, af], nil) | |
139 | + | if ($isInstanceOf(l, "Boolean")) | |
129 | 140 | then { | |
130 | - | let | |
131 | - | if ( | |
141 | + | let ag = l | |
142 | + | if (ag) | |
132 | 143 | then true | |
133 | 144 | else throw("not allowed") | |
134 | 145 | } | |
135 | 146 | else throw("opAllowed: unexpected result type") | |
136 | 147 | } | |
137 | 148 | ||
138 | 149 | ||
139 | - | let | |
150 | + | let ah = valueOrErrorMessage(addressFromString(split(valueOrErrorMessage(getString(ad, "main"), "no main in config"), "|")[0]), "invalid main address") | |
140 | 151 | ||
141 | - | func | |
152 | + | func ai (aj) = if (contains(getStringValue(ad, "main"), toString(aj.caller))) | |
142 | 153 | then true | |
143 | 154 | else throw("only main can do") | |
144 | 155 | ||
145 | 156 | ||
146 | - | func | |
147 | - | let | |
148 | - | if (!(contains( | |
157 | + | func ak (aj) = { | |
158 | + | let al = valueOrErrorMessage(getString(ad, "divAdmins"), "no div admins") | |
159 | + | if (!(contains(al, toString(aj.caller)))) | |
149 | 160 | then throw("only div admin can do") | |
150 | 161 | else true | |
151 | 162 | } | |
152 | 163 | ||
153 | 164 | ||
154 | - | func | |
165 | + | func am (i) = if (if ((i != "WAVES")) | |
155 | 166 | then (fromBase58String(i) == fromBase58String("")) | |
156 | 167 | else false) | |
157 | 168 | then throw("invalid assetId") | |
158 | 169 | else true | |
159 | 170 | ||
160 | 171 | ||
161 | - | let | |
172 | + | let an = e(isDefined(c(y)), "already initialized") | |
162 | 173 | ||
163 | - | let | |
164 | - | let | |
165 | - | if ($isInstanceOf( | |
174 | + | let ao = { | |
175 | + | let l = getString(ad, "oracle_address") | |
176 | + | if ($isInstanceOf(l, "String")) | |
166 | 177 | then { | |
167 | - | let | |
168 | - | addressFromString( | |
178 | + | let ap = l | |
179 | + | addressFromString(ap) | |
169 | 180 | } | |
170 | 181 | else unit | |
171 | 182 | } | |
172 | 183 | ||
173 | - | let | |
174 | - | let | |
175 | - | if ($isInstanceOf( | |
184 | + | let aq = { | |
185 | + | let l = invoke(valueOrErrorMessage(ao, "no oracle"), "price", [z], nil) | |
186 | + | if ($isInstanceOf(l, "Int")) | |
176 | 187 | then { | |
177 | - | let | |
178 | - | | |
188 | + | let aj = l | |
189 | + | aj | |
179 | 190 | } | |
180 | 191 | else throw("bad oracle data") | |
181 | 192 | } | |
182 | 193 | ||
183 | - | let | |
194 | + | let ar = height | |
184 | 195 | ||
185 | - | let | |
196 | + | let as = fromBase58String(valueOrErrorMessage(c(H), "no aTokenId")) | |
186 | 197 | ||
187 | - | let | |
198 | + | let at = valueOrElse(a(J), 0) | |
188 | 199 | ||
189 | - | let | |
200 | + | let au = valueOrErrorMessage(getInteger(ad, B), "no reserveFactor") | |
190 | 201 | ||
191 | - | let | |
202 | + | let av = valueOrErrorMessage(getInteger(ad, C), "no collateralFactor") | |
192 | 203 | ||
193 | - | let | |
204 | + | let aw = valueOrErrorMessage(getInteger(ad, D), "no liquidationThreshold") | |
194 | 205 | ||
195 | - | let | |
206 | + | let ax = valueOrErrorMessage(getInteger(ad, E), "no overlapCharge") | |
196 | 207 | ||
197 | - | let | |
208 | + | let ay = valueOrErrorMessage(getInteger(ad, F), "no liquidationPenalty") | |
198 | 209 | ||
199 | - | let av = valueOrErrorMessage(getInteger(Z, E), "no liquidationPenalty") | |
200 | - | ||
201 | - | let aw = valueOrElse(a(L), 0) | |
202 | - | ||
203 | - | let ax = valueOrElse(a(M), 0) | |
204 | - | ||
205 | - | let ay = valueOrElse(a(K), 0) | |
206 | - | ||
207 | - | let az = valueOrElse(a(N), v) | |
208 | - | ||
209 | - | let aA = if ((aw > 0)) | |
210 | - | then min([w, fraction(ay, w, aw)]) | |
210 | + | let az = if ((P > 0)) | |
211 | + | then min([x, fraction(Q, x, P)]) | |
211 | 212 | else 0 | |
212 | 213 | ||
213 | - | let | |
214 | - | let | |
215 | - | let | |
216 | - | let | |
217 | - | let | |
218 | - | let | |
219 | - | let | |
220 | - | if (( | |
221 | - | then | |
222 | - | else if (( | |
223 | - | then | |
224 | - | else if (if (( | |
214 | + | let aA = { | |
215 | + | let aB = getIntegerValue(ad, (z + "_APoint")) | |
216 | + | let ag = getIntegerValue(ad, (z + "_BPoint")) | |
217 | + | let aC = getIntegerValue(ad, (z + "_CPoint")) | |
218 | + | let aD = getIntegerValue(ad, (z + "_DPoint")) | |
219 | + | let aE = (fraction((aB - aC), az, -(ag)) + aB) | |
220 | + | let aF = (fraction((aC - aD), (az - ag), (ag - x)) + aC) | |
221 | + | if ((az == 0)) | |
222 | + | then aB | |
223 | + | else if ((az == ag)) | |
224 | + | then aC | |
225 | + | else if (if ((ag > az)) | |
225 | 226 | then true | |
226 | - | else ( | |
227 | - | then | |
228 | - | else | |
227 | + | else (ag == x)) | |
228 | + | then aE | |
229 | + | else aF | |
229 | 230 | } | |
230 | 231 | ||
231 | - | let | |
232 | + | let aG = if ((P == 0)) | |
232 | 233 | then 0 | |
233 | - | else fraction(fraction( | |
234 | + | else fraction(fraction(Q, aA, P), (x - au), x) | |
234 | 235 | ||
235 | - | let | |
236 | - | then | |
236 | + | let aH = if ((ar == O)) | |
237 | + | then S | |
237 | 238 | else { | |
238 | - | let | |
239 | - | | |
239 | + | let aI = p(aA, w, (v * x)) | |
240 | + | p(S, (w + (aI * (ar - O))), w) | |
240 | 241 | } | |
241 | 242 | ||
242 | - | let | |
243 | + | let aJ = valueOrElse(getBoolean(ad, ("staking_enabled_" + z)), false) | |
243 | 244 | ||
244 | - | let | |
245 | - | let | |
246 | - | if ($isInstanceOf( | |
245 | + | let aK = { | |
246 | + | let l = A | |
247 | + | if ($isInstanceOf(l, "ByteVector")) | |
247 | 248 | then { | |
248 | - | let | |
249 | - | assetBalance(this, | |
249 | + | let aL = l | |
250 | + | assetBalance(this, aL) | |
250 | 251 | } | |
251 | 252 | else wavesBalance(this).available | |
252 | 253 | } | |
253 | 254 | ||
254 | - | func | |
255 | - | then throw(("not enough liquidity: " + | |
255 | + | func aM (aN,aO,aP) = if ((aN > aO)) | |
256 | + | then throw(("not enough liquidity: " + aP)) | |
256 | 257 | else true | |
257 | 258 | ||
258 | 259 | ||
259 | - | func | |
260 | + | func aQ (U) = valueOrElse(a(V(U)), 0) | |
260 | 261 | ||
261 | 262 | ||
262 | - | func | |
263 | - | let | |
264 | - | if (( | |
263 | + | func aR (U) = { | |
264 | + | let aS = aQ(U) | |
265 | + | if ((aS == 0)) | |
265 | 266 | then 0 | |
266 | 267 | else { | |
267 | - | let | |
268 | - | fraction( | |
268 | + | let aT = valueOrErrorMessage(a(W(U)), "has debt but does not have index") | |
269 | + | fraction(aS, aH, aT) | |
269 | 270 | } | |
270 | 271 | } | |
271 | 272 | ||
272 | 273 | ||
273 | - | let | |
274 | + | let aU = fraction(Q, aH, S) | |
274 | 275 | ||
275 | - | let | |
276 | + | let aV = (aU - Q) | |
276 | 277 | ||
277 | - | let | |
278 | + | let aW = fraction(aV, (x - au), x) | |
278 | 279 | ||
279 | - | let | |
280 | + | let aX = (P + aW) | |
280 | 281 | ||
281 | - | let | |
282 | + | let aY = ((R + aV) - aW) | |
282 | 283 | ||
283 | - | let | |
284 | + | let aZ = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(ad, ("staking_config_" + z)), ("no staking address for " + z))), ("bad staking address for " + z)) | |
284 | 285 | ||
285 | - | let | |
286 | - | then | |
287 | - | else | |
286 | + | let ba = min([aY, if (aJ) | |
287 | + | then k(invoke(aZ, "info", nil, nil)) | |
288 | + | else aK]) | |
288 | 289 | ||
289 | - | func | |
290 | - | let | |
291 | - | if ((0 >= | |
292 | - | then throw(("Payment is less than min allowed amount: " + toString( | |
293 | - | else if (( | |
294 | - | then throw((" bad asset attached: required " + | |
295 | - | else | |
290 | + | func bb (aj,A) = { | |
291 | + | let bc = aj.payments[0].amount | |
292 | + | if ((0 >= bc)) | |
293 | + | then throw(("Payment is less than min allowed amount: " + toString(bc))) | |
294 | + | else if ((aj.payments[0].assetId != A)) | |
295 | + | then throw((" bad asset attached: required " + z)) | |
296 | + | else bc | |
296 | 297 | } | |
297 | 298 | ||
298 | 299 | ||
299 | - | func | |
300 | - | let | |
300 | + | func bd (be,bf,bg,bh) = { | |
301 | + | let bi = if ((aK == bh)) | |
301 | 302 | then unit | |
302 | - | else if (!( | |
303 | + | else if (!(aJ)) | |
303 | 304 | then unit | |
304 | - | else if ((aL > bi)) | |
305 | - | then invoke(ba, "put", nil, [AttachedPayment(z, (aL - bi))]) | |
306 | - | else invoke(ba, "get", [(bi - aL)], nil) | |
307 | - | if ((bj == bj)) | |
308 | - | then [h(N, aI), h(J, an), h(L, (aY + bf)), h(K, (aV + bg)), h(M, (aZ + bh))] | |
305 | + | else if ((aK > bh)) | |
306 | + | then invoke(aZ, "put", nil, [AttachedPayment(A, (aK - bh))]) | |
307 | + | else invoke(aZ, "get", [(bh - aK)], nil) | |
308 | + | if ((bi == bi)) | |
309 | + | then { | |
310 | + | let bj = j((aX + be)) | |
311 | + | let bk = j((aU + bf)) | |
312 | + | let bl = j((aY + bg)) | |
313 | + | [o(L, ((((((((toString(ar) + "|") + toString(bj)) + "|") + toString(bk)) + "|") + toString(bl)) + "|") + toString(aH)))] | |
314 | + | } | |
309 | 315 | else throw("Strict value is not equal to itself.") | |
310 | 316 | } | |
311 | 317 | ||
312 | 318 | ||
313 | - | func | |
319 | + | func bm (bn) = if ((bn == 6)) | |
314 | 320 | then 1000000 | |
315 | - | else if (( | |
321 | + | else if ((bn == 8)) | |
316 | 322 | then 100000000 | |
317 | - | else throw(("bad decimals: " + toString( | |
323 | + | else throw(("bad decimals: " + toString(bn))) | |
318 | 324 | ||
319 | 325 | ||
320 | - | func | |
326 | + | func bo (aN) = fraction(aN, aq, bm(ac)) | |
321 | 327 | ||
322 | 328 | ||
323 | - | func bn (aO) = fraction(aO, bk(Y), am) | |
324 | - | ||
325 | - | ||
326 | - | func bo (bp) = if ((bp == 0)) | |
327 | - | then 0 | |
328 | - | else if ((aq > 0)) | |
329 | - | then fraction(bp, aY, aq) | |
330 | - | else bp | |
329 | + | func bp (aN) = fraction(aN, bm(ac), aq) | |
331 | 330 | ||
332 | 331 | ||
333 | 332 | func bq (br) = if ((br == 0)) | |
334 | 333 | then 0 | |
335 | - | else if (( | |
336 | - | then fraction(br, | |
334 | + | else if ((at > 0)) | |
335 | + | then fraction(br, aX, at) | |
337 | 336 | else br | |
338 | 337 | ||
339 | 338 | ||
340 | - | func bs ( | |
339 | + | func bs (bt) = if ((bt == 0)) | |
341 | 340 | then 0 | |
342 | - | else if (( | |
343 | - | then | |
344 | - | else | |
341 | + | else if ((at > 0)) | |
342 | + | then fraction(bt, at, aX) | |
343 | + | else bt | |
345 | 344 | ||
346 | 345 | ||
347 | - | func bt (bu) = valueOrElse(a(P(bu)), 0) | |
346 | + | func bu (bt) = if ((bt == 0)) | |
347 | + | then 0 | |
348 | + | else if ((at > 0)) | |
349 | + | then p(bt, at, aX) | |
350 | + | else bt | |
348 | 351 | ||
349 | 352 | ||
350 | - | func bv (bw) = | |
353 | + | func bv (bw) = valueOrElse(a(T(bw)), 0) | |
351 | 354 | ||
352 | 355 | ||
353 | - | func bx (bw) = if ((aS(bw) > 0)) | |
354 | - | then [bv(bw)] | |
356 | + | func bx (by) = BooleanEntry(X(by), true) | |
357 | + | ||
358 | + | ||
359 | + | func bz (by) = if ((aR(by) > 0)) | |
360 | + | then [bx(by)] | |
355 | 361 | else nil | |
356 | 362 | ||
357 | 363 | ||
358 | - | func | |
359 | - | let | |
360 | - | let | |
361 | - | let bB = min([ | |
362 | - | let bC = if ((-1 > | |
364 | + | func bA (bw,aN) = { | |
365 | + | let bk = aR(bw) | |
366 | + | let bj = bq(bv(bw)) | |
367 | + | let bB = min([bk, bj]) | |
368 | + | let bC = if ((-1 > aN)) | |
363 | 369 | then throw("invalid collapse amount") | |
364 | 370 | else if (if ((bB == 0)) | |
365 | 371 | then true | |
366 | - | else ( | |
372 | + | else (aN == 0)) | |
367 | 373 | then throw("nothing to collapse") | |
368 | - | else if (if (( | |
374 | + | else if (if ((aN == -1)) | |
369 | 375 | then true | |
370 | - | else ( | |
376 | + | else (aN > bB)) | |
371 | 377 | then bB | |
372 | - | else | |
373 | - | let bD = | |
374 | - | $Tuple2(( | |
378 | + | else aN | |
379 | + | let bD = bu(bC) | |
380 | + | $Tuple2((bd(-(bC), -(bC), 0, 0) ++ [n(T(bw), -(bD)), n(J, -(bD)), h(V(bw), (bk - bC)), h(W(bw), aH)]), bC) | |
375 | 381 | } | |
376 | 382 | ||
377 | 383 | ||
378 | - | func bE ( | |
379 | - | let bF = | |
384 | + | func bE (U,aN) = { | |
385 | + | let bF = ae("repay") | |
380 | 386 | if ((bF == bF)) | |
381 | 387 | then { | |
382 | - | let bG = | |
388 | + | let bG = aR(U) | |
383 | 389 | if ((bG == bG)) | |
384 | 390 | then { | |
385 | - | let bH = if (( | |
386 | - | then $Tuple4(0, -(bG), ( | |
387 | - | else $Tuple4((bG - | |
391 | + | let bH = if ((aN > bG)) | |
392 | + | then $Tuple4(0, -(bG), (aN - bG), [ScriptTransfer(addressFromStringValue(U), (aN - bG), A)]) | |
393 | + | else $Tuple4((bG - aN), -(aN), 0, nil) | |
388 | 394 | let bI = bH._1 | |
389 | 395 | let bJ = bH._2 | |
390 | 396 | let bK = bH._3 | |
391 | 397 | let bL = bH._4 | |
392 | - | let bM = ( | |
393 | - | $Tuple2((( | |
398 | + | let bM = (aN - bK) | |
399 | + | $Tuple2(((bd(0, bJ, 0, bK) ++ bL) ++ [h(V(U), bI), h(W(U), aH)]), bM) | |
394 | 400 | } | |
395 | 401 | else throw("Strict value is not equal to itself.") | |
396 | 402 | } | |
397 | 403 | else throw("Strict value is not equal to itself.") | |
398 | 404 | } | |
399 | 405 | ||
400 | 406 | ||
401 | 407 | func bN () = { | |
402 | - | let | |
403 | - | let | |
404 | - | let | |
405 | - | let | |
406 | - | ((((((((((((((("ABCD: " + toString( | |
408 | + | let aB = getIntegerValue(ad, (z + "_APoint")) | |
409 | + | let ag = getIntegerValue(ad, (z + "_BPoint")) | |
410 | + | let aC = getIntegerValue(ad, (z + "_CPoint")) | |
411 | + | let aD = getIntegerValue(ad, (z + "_DPoint")) | |
412 | + | ((((((((((((((("ABCD: " + toString(aB)) + ";") + toString(ag)) + ";") + toString(aC)) + ";") + toString(aD)) + ", reserveFactor: ") + toString(au)) + ", collateralFactor: ") + toString(av)) + ", liquidationThreshold: ") + toString(aw)) + ", liquidationPenalty: ") + toString(ay)) | |
407 | 413 | } | |
408 | 414 | ||
409 | 415 | ||
410 | - | func bO () = ((((((((((((((((((((((((((("currentTotalDeposit: " + toString( | |
416 | + | func bO () = ((((((((((((((((((((((((((("currentTotalDeposit: " + toString(aX)) + ", storedTotalDeposit: ") + toString(P)) + ", currentTotalDebt: ") + toString(aU)) + ", storedTotalDebt: ") + toString(Q)) + ", currentTotalReserve: ") + toString(aY)) + ", storedTotalReserve: ") + toString(R)) + ", currentIndex:") + toString(aH)) + ", storedIndex: ") + toString(S)) + ", lastUpdateHeight: ") + toString(O)) + ", utilization: ") + toString(az)) + ", aTokenCirculation: ") + toString(at)) + ", aTokenPrice: ") + toString(bq(pow(10, 0, ac, 0, 0, FLOOR)))) + ", APR: ") + toString(aA)) + ", APY: ") + toString(aG)) | |
411 | 417 | ||
412 | 418 | ||
413 | - | func bP ( | |
414 | - | let bQ = | |
415 | - | let bR = | |
416 | - | ((((((((((((((((("currentDebt: " + toString( | |
419 | + | func bP (by) = { | |
420 | + | let bQ = bv(by) | |
421 | + | let bR = Y(addressFromStringValue(by), as) | |
422 | + | ((((((((((((((((("currentDebt: " + toString(aR(by))) + ", storedDebt: ") + toString(valueOrElse(a(V(by)), 0))) + ", currentDeposit: ") + toString(bq(bQ))) + ", aTokenContractBalance: ") + toString(bQ)) + ", aTokenWalletBalance: ") + toString(bR)) + ", walletStake: ") + toString(bq(bR))) + ", assetWalletBalance: ") + toString(Y(addressFromStringValue(by), A))) + ", useAsCollateral: ") + toString(valueOrElse(getBoolean(this, X(by)), true))) + ", storedIndex: ") + toString(valueOrElse(a(W(by)), 0))) | |
417 | 423 | } | |
418 | 424 | ||
419 | 425 | ||
420 | - | func bS () = ((((((((((((((((((((((("storedTotalDeposit: " + toString( | |
426 | + | func bS () = ((((((((((((((((((((((("storedTotalDeposit: " + toString(P)) + ", storedTotalDebt: ") + toString(Q)) + ", storedTotalReserve: ") + toString(R)) + ", storedIndex: ") + toString(S)) + ", lastUpdateHeight: ") + toString(O)) + ", currentTotalDeposit: ") + toString(aX)) + ", currentTotalDebt: ") + toString(aU)) + ", currentTotalReserve: ") + toString(aY)) + ", currentIndex: ") + toString(aH)) + ", currentHeight: ") + toString(ar)) + ", aTokenCirculation: ") + toString(at)) + ", aTokenPrice: ") + toString(bq(pow(10, 0, ac, 0, 0, FLOOR)))) | |
421 | 427 | ||
422 | 428 | ||
423 | - | func bT ( | |
424 | - | let bU = | |
425 | - | let bV = | |
426 | - | let | |
427 | - | if (( | |
428 | - | then $Tuple4( | |
429 | - | else $Tuple4( | |
429 | + | func bT (by) = { | |
430 | + | let bU = bv(by) | |
431 | + | let bV = bq(bU) | |
432 | + | let bk = aR(by) | |
433 | + | if ((ar == O)) | |
434 | + | then $Tuple4(P, Q, bV, bk) | |
435 | + | else $Tuple4(aX, aU, bV, bk) | |
430 | 436 | } | |
431 | 437 | ||
432 | 438 | ||
433 | - | func bW ( | |
434 | - | let bY = (( | |
435 | - | let bF = if (if (if ( | |
436 | - | then aN | |
439 | + | func bW (aj,by,aN,bX) = { | |
440 | + | let bY = ((P + R) - Q) | |
441 | + | let bF = if (if (if (ai(aj)) | |
442 | + | then aM(aN, bY, ("funds in use: max=" + toString(bY))) | |
437 | 443 | else false) | |
438 | - | then e((-1 > | |
444 | + | then e((-1 > aN), "invalid amount") | |
439 | 445 | else false) | |
440 | - | then | |
446 | + | then ae("withdraw") | |
441 | 447 | else false | |
442 | 448 | if ((bF == bF)) | |
443 | 449 | then { | |
444 | - | let bZ = if (( | |
450 | + | let bZ = if ((aN == -1)) | |
445 | 451 | then { | |
446 | - | let bU = | |
447 | - | $Tuple2(bU, | |
452 | + | let bU = bv(by) | |
453 | + | $Tuple2(bU, bq(bU)) | |
448 | 454 | } | |
449 | - | else $Tuple2( | |
455 | + | else $Tuple2(bu(aN), aN) | |
450 | 456 | let bD = bZ._1 | |
451 | 457 | let ca = bZ._2 | |
452 | - | $Tuple2(( | |
453 | - | then | |
454 | - | else addressFromStringValue( | |
458 | + | $Tuple2((bd(-(ca), 0, 0, ca) ++ [ScriptTransfer(if (bX) | |
459 | + | then ah | |
460 | + | else addressFromStringValue(by), ca, A), n(T(by), -(bD)), n(J, -(bD))]), ca) | |
455 | 461 | } | |
456 | 462 | else throw("Strict value is not equal to itself.") | |
457 | 463 | } | |
458 | 464 | ||
459 | 465 | ||
460 | - | func cb ( | |
461 | - | let bF = if ( | |
462 | - | then | |
466 | + | func cb (af,by,aj) = { | |
467 | + | let bF = if (ai(aj)) | |
468 | + | then ae(af) | |
463 | 469 | else false | |
464 | 470 | if ((bF == bF)) | |
465 | 471 | then { | |
466 | - | let | |
467 | - | $Tuple2((( | |
472 | + | let br = bb(aj, as) | |
473 | + | $Tuple2(((bd(0, 0, 0, 0) ++ [n(T(by), br), Burn(as, br)]) ++ bz(by)), bq(br)) | |
468 | 474 | } | |
469 | 475 | else throw("Strict value is not equal to itself.") | |
470 | 476 | } | |
471 | 477 | ||
472 | 478 | ||
473 | - | func cc ( | |
474 | - | let cg = | |
475 | - | let | |
479 | + | func cc (aj,bw,cd,ce,cf) = { | |
480 | + | let cg = bv(bw) | |
481 | + | let aN = if ((cd == -1)) | |
476 | 482 | then cg | |
477 | 483 | else cd | |
478 | - | let bF = if (if (if ( | |
479 | - | then | |
484 | + | let bF = if (if (if (ai(aj)) | |
485 | + | then ae(cf) | |
480 | 486 | else false) | |
481 | 487 | then e((-1 > cd), "invalid amountToMint") | |
482 | 488 | else false) | |
483 | - | then e(( | |
489 | + | then e((aN > cg), ("Trying to mint more than available, max: " + toString(cg))) | |
484 | 490 | else false | |
485 | 491 | if ((bF == bF)) | |
486 | - | then $Tuple2(( | |
492 | + | then $Tuple2((bd(0, 0, 0, 0) ++ [n(T(bw), -(aN)), Reissue(as, aN, true), ScriptTransfer(addressFromStringValue(ce), aN, as)]), bq(aN)) | |
487 | 493 | else throw("Strict value is not equal to itself.") | |
488 | 494 | } | |
489 | 495 | ||
490 | 496 | ||
491 | - | @Callable( | |
492 | - | func getReserveDivsInfo () = $Tuple2(nil, $Tuple3( | |
497 | + | @Callable(aj) | |
498 | + | func getReserveDivsInfo () = $Tuple2(nil, $Tuple3(ba, z, (aY - ba))) | |
493 | 499 | ||
494 | 500 | ||
495 | 501 | ||
496 | - | @Callable( | |
497 | - | func | |
502 | + | @Callable(aj) | |
503 | + | func storedDepositBorrow () = $Tuple2(nil, $Tuple2(P, Q)) | |
498 | 504 | ||
499 | 505 | ||
500 | 506 | ||
501 | - | @Callable(af) | |
507 | + | @Callable(aj) | |
508 | + | func getCurrentTotals (by) = $Tuple2(nil, bT(by)) | |
509 | + | ||
510 | + | ||
511 | + | ||
512 | + | @Callable(aj) | |
502 | 513 | func getCurrentTotals2 (ch,ci) = { | |
503 | 514 | let cj = bT(ch) | |
504 | 515 | let ck = cj._1 | |
505 | 516 | let cl = cj._2 | |
506 | 517 | let cm = cj._3 | |
507 | 518 | let cn = cj._4 | |
508 | 519 | let co = bT(ci) | |
509 | 520 | let cp = co._1 | |
510 | 521 | let cq = co._2 | |
511 | 522 | let cr = co._3 | |
512 | 523 | let cs = co._4 | |
513 | 524 | $Tuple2(nil, $Tuple6(ck, cl, cm, cn, cr, cs)) | |
514 | 525 | } | |
515 | 526 | ||
516 | 527 | ||
517 | 528 | ||
518 | - | @Callable( | |
529 | + | @Callable(aj) | |
519 | 530 | func advise () = $Tuple2(nil, ((((("reserveAddress: " + toString(this)) + ", ") + bN()) + ", ") + bO())) | |
520 | 531 | ||
521 | 532 | ||
522 | 533 | ||
523 | - | @Callable( | |
524 | - | func adviseUser ( | |
525 | - | let ct = | |
526 | - | let cu = | |
527 | - | let cv = valueOrElse(getBoolean(this, | |
534 | + | @Callable(aj) | |
535 | + | func adviseUser (by) = { | |
536 | + | let ct = bo(aU) | |
537 | + | let cu = bo(aX) | |
538 | + | let cv = valueOrElse(getBoolean(this, X(by)), true) | |
528 | 539 | let cw = if (cv) | |
529 | 540 | then cu | |
530 | 541 | else 0 | |
531 | 542 | let cx = min([ct, cw]) | |
532 | - | let cy = | |
543 | + | let cy = p(cx, ax, x) | |
533 | 544 | let cz = if ((ct > cw)) | |
534 | 545 | then 0 | |
535 | - | else fraction((cw - ct), | |
546 | + | else fraction((cw - ct), av, x) | |
536 | 547 | let cA = if ((ct > cw)) | |
537 | - | then (fraction((ct - cw), | |
548 | + | then (fraction((ct - cw), x, aw) + cy) | |
538 | 549 | else cy | |
539 | 550 | let cB = ((((((((("reserveAddress: " + toString(this)) + ", currentDebtUsd: ") + toString(ct)) + ", currentDepositUsd: ") + toString(cu)) + ", bp: ") + toString(cz)) + ", bpu: ") + toString(cA)) | |
540 | - | $Tuple2(nil, ((cB + ", ") + bP( | |
551 | + | $Tuple2(nil, ((cB + ", ") + bP(by))) | |
541 | 552 | } | |
542 | 553 | ||
543 | 554 | ||
544 | 555 | ||
545 | - | @Callable( | |
546 | - | func addInterest () = if (( | |
556 | + | @Callable(aj) | |
557 | + | func addInterest () = if ((aj.payments[0].assetId != A)) | |
547 | 558 | then throw("can't add interest with unrelated token") | |
548 | - | else | |
559 | + | else bd(aj.payments[0].amount, 0, 0, 0) | |
549 | 560 | ||
550 | 561 | ||
551 | 562 | ||
552 | - | @Callable( | |
553 | - | func addToReserve () = if (( | |
563 | + | @Callable(aj) | |
564 | + | func addToReserve () = if ((aj.payments[0].assetId != A)) | |
554 | 565 | then throw("can't add interest with unrelated token") | |
555 | - | else | |
566 | + | else bd(0, 0, aj.payments[0].amount, 0) | |
556 | 567 | ||
557 | 568 | ||
558 | 569 | ||
559 | - | @Callable( | |
570 | + | @Callable(aj) | |
560 | 571 | func withdrawFromReserve (bC) = { | |
561 | - | let bF = | |
572 | + | let bF = ak(aj) | |
562 | 573 | if ((bF == bF)) | |
563 | 574 | then { | |
564 | 575 | let cC = if ((bC == -1)) | |
565 | - | then | |
576 | + | then ba | |
566 | 577 | else bC | |
567 | - | $Tuple2(( | |
578 | + | $Tuple2((bd(0, 0, -(cC), cC) ++ [ScriptTransfer(aj.caller, cC, A)]), cC) | |
568 | 579 | } | |
569 | 580 | else throw("Strict value is not equal to itself.") | |
570 | 581 | } | |
571 | 582 | ||
572 | 583 | ||
573 | 584 | ||
574 | - | @Callable( | |
585 | + | @Callable(aj) | |
575 | 586 | func forceUpdate () = { | |
576 | - | let cD = valueOrErrorMessage(getString( | |
577 | - | if ((toString( | |
587 | + | let cD = valueOrErrorMessage(getString(ad, "admin"), "reserve:no admin in config") | |
588 | + | if ((toString(aj.caller) != cD)) | |
578 | 589 | then throw("only admin can do") | |
579 | - | else | |
590 | + | else bd(0, 0, 0, 0) | |
580 | 591 | } | |
581 | 592 | ||
582 | 593 | ||
583 | 594 | ||
584 | - | @Callable( | |
595 | + | @Callable(aj) | |
585 | 596 | func initialize (cE,cF,cG,cH,cI) = { | |
586 | - | let bF = if ( | |
587 | - | then | |
597 | + | let bF = if (an) | |
598 | + | then am(cF) | |
588 | 599 | else false | |
589 | 600 | if ((bF == bF)) | |
590 | 601 | then { | |
591 | 602 | let cJ = Issue(cG, cH, 0, cI, true) | |
592 | - | [cJ, h( | |
603 | + | [cJ, h(K, cI), o(I, cG), o(y, cF), o(G, cE), o(H, toBase58String(calculateAssetId(cJ)))] | |
593 | 604 | } | |
594 | 605 | else throw("Strict value is not equal to itself.") | |
595 | 606 | } | |
596 | 607 | ||
597 | 608 | ||
598 | 609 | ||
599 | - | @Callable( | |
600 | - | func initialize2 () = if (( | |
610 | + | @Callable(aj) | |
611 | + | func initialize2 () = if ((aj.caller != this)) | |
601 | 612 | then throw("only self can continue") | |
602 | - | else [ | |
613 | + | else [StringEntry(L, (toString(ar) + "||||"))] | |
603 | 614 | ||
604 | 615 | ||
605 | 616 | ||
606 | - | @Callable( | |
607 | - | func userDepositUSD ( | |
617 | + | @Callable(aj) | |
618 | + | func userDepositUSD (bw) = $Tuple2(nil, bo(bq(bv(bw)))) | |
608 | 619 | ||
609 | 620 | ||
610 | 621 | ||
611 | - | @Callable( | |
612 | - | func userDebtUSD ( | |
622 | + | @Callable(aj) | |
623 | + | func userDebtUSD (bw) = $Tuple2(nil, bo(aR(bw))) | |
613 | 624 | ||
614 | 625 | ||
615 | 626 | ||
616 | - | @Callable( | |
617 | - | func userBalance ( | |
618 | - | let bU = | |
619 | - | let bV = | |
620 | - | let | |
621 | - | $Tuple2(nil, $Tuple6(bU, bV, | |
627 | + | @Callable(aj) | |
628 | + | func userBalance (bw) = { | |
629 | + | let bU = bv(bw) | |
630 | + | let bV = bq(bU) | |
631 | + | let bk = aR(bw) | |
632 | + | $Tuple2(nil, $Tuple6(bU, bV, bo(bV), bk, bo(bk), valueOrElse(getBoolean(this, X(bw)), true))) | |
622 | 633 | } | |
623 | 634 | ||
624 | 635 | ||
625 | 636 | ||
626 | - | @Callable( | |
627 | - | func userDebt ( | |
628 | - | let | |
629 | - | let cK = | |
630 | - | $Tuple2(nil, $Tuple2( | |
637 | + | @Callable(aj) | |
638 | + | func userDebt (bw) = { | |
639 | + | let bk = aR(bw) | |
640 | + | let cK = bo(bk) | |
641 | + | $Tuple2(nil, $Tuple2(bk, cK)) | |
631 | 642 | } | |
632 | 643 | ||
633 | 644 | ||
634 | 645 | ||
635 | - | @Callable( | |
636 | - | func assetUsdValue ( | |
646 | + | @Callable(aj) | |
647 | + | func assetUsdValue (bt) = $Tuple2(nil, bo(bt)) | |
637 | 648 | ||
638 | 649 | ||
639 | 650 | ||
640 | - | @Callable( | |
641 | - | func repayFor ( | |
642 | - | let bF = | |
651 | + | @Callable(aj) | |
652 | + | func repayFor (U) = { | |
653 | + | let bF = ai(aj) | |
643 | 654 | if ((bF == bF)) | |
644 | - | then bE( | |
655 | + | then bE(U, bb(aj, A)) | |
645 | 656 | else throw("Strict value is not equal to itself.") | |
646 | 657 | } | |
647 | 658 | ||
648 | 659 | ||
649 | 660 | ||
650 | - | @Callable( | |
661 | + | @Callable(aj) | |
651 | 662 | func depositFor (cL,cM) = { | |
652 | - | let bF = if ( | |
653 | - | then | |
663 | + | let bF = if (ai(aj)) | |
664 | + | then ae("deposit") | |
654 | 665 | else false | |
655 | 666 | if ((bF == bF)) | |
656 | - | then if (if (( | |
667 | + | then if (if ((aR(cL) > 0)) | |
657 | 668 | then !(cM) | |
658 | 669 | else false) | |
659 | 670 | then throw("can't disable use as collateral for asset with open debt") | |
660 | 671 | else { | |
661 | - | let | |
662 | - | let | |
663 | - | ( | |
672 | + | let aN = bb(aj, A) | |
673 | + | let br = bs(aN) | |
674 | + | (bd(aN, 0, 0, 0) ++ [n(J, br), n(T(cL), br), BooleanEntry(X(cL), cM)]) | |
664 | 675 | } | |
665 | 676 | else throw("Strict value is not equal to itself.") | |
666 | 677 | } | |
667 | 678 | ||
668 | 679 | ||
669 | 680 | ||
670 | - | @Callable( | |
671 | - | func withdrawFor ( | |
681 | + | @Callable(aj) | |
682 | + | func withdrawFor (bw,aN) = bW(aj, bw, aN, false) | |
672 | 683 | ||
673 | 684 | ||
674 | 685 | ||
675 | - | @Callable( | |
676 | - | func withdrawToMain ( | |
686 | + | @Callable(aj) | |
687 | + | func withdrawToMain (by,aN) = if ((aN != -1)) | |
677 | 688 | then throw("reserve: withdrawToMain amount -1 only") | |
678 | - | else bW( | |
689 | + | else bW(aj, by, aN, true) | |
679 | 690 | ||
680 | 691 | ||
681 | 692 | ||
682 | - | @Callable( | |
683 | - | func replenishWithAtokenFor ( | |
693 | + | @Callable(aj) | |
694 | + | func replenishWithAtokenFor (by) = cb("replenish_atokens", by, aj) | |
684 | 695 | ||
685 | 696 | ||
686 | 697 | ||
687 | - | @Callable( | |
688 | - | func | |
698 | + | @Callable(aj) | |
699 | + | func replenisForUnlockWithAtokenFor (by) = cb("replenish_atokens_unlock", by, aj) | |
689 | 700 | ||
690 | 701 | ||
691 | 702 | ||
692 | - | @Callable(af) | |
693 | - | func borrowFor (bu,cN) = { | |
694 | - | let bF = if (if (ae(af)) | |
695 | - | then aN(cN, (aw - ay), "too much borrow requested") | |
703 | + | @Callable(aj) | |
704 | + | func replenishForRepayWithAtokenFor (by) = cb("repay_atokens", by, aj) | |
705 | + | ||
706 | + | ||
707 | + | ||
708 | + | @Callable(aj) | |
709 | + | func borrowFor (bw,cN) = { | |
710 | + | let bF = if (if (ai(aj)) | |
711 | + | then aM(cN, (P - Q), "too much borrow requested") | |
696 | 712 | else false) | |
697 | - | then | |
713 | + | then ae("borrow") | |
698 | 714 | else false | |
699 | 715 | if ((bF == bF)) | |
700 | 716 | then { | |
701 | - | let bG = | |
717 | + | let bG = aR(bw) | |
702 | 718 | let bI = (bG + cN) | |
703 | - | ( | |
719 | + | (bd(0, cN, 0, cN) ++ [h(V(bw), bI), bx(bw), h(W(bw), aH), ScriptTransfer(addressFromStringValue(bw), cN, A)]) | |
704 | 720 | } | |
705 | 721 | else throw("Strict value is not equal to itself.") | |
706 | 722 | } | |
707 | 723 | ||
708 | 724 | ||
709 | 725 | ||
710 | - | @Callable( | |
711 | - | func mintAtokenFor ( | |
726 | + | @Callable(aj) | |
727 | + | func mintAtokenFor (bw,cd) = cc(aj, bw, cd, bw, "mint_atokens") | |
712 | 728 | ||
713 | 729 | ||
714 | 730 | ||
715 | - | @Callable( | |
716 | - | func mintAtokenForTo (cO,cd,ce) = cc( | |
731 | + | @Callable(aj) | |
732 | + | func mintAtokenForTo (cO,cd,ce) = cc(aj, cO, cd, ce, "lock_mint_atokens") | |
717 | 733 | ||
718 | 734 | ||
719 | 735 | ||
720 | - | @Callable( | |
721 | - | func redeemAtokensFor ( | |
722 | - | let bF = if ( | |
723 | - | then | |
736 | + | @Callable(aj) | |
737 | + | func redeemAtokensFor (by) = { | |
738 | + | let bF = if (ai(aj)) | |
739 | + | then ae("redeem_atokens") | |
724 | 740 | else false | |
725 | 741 | if ((bF == bF)) | |
726 | 742 | then { | |
727 | - | let | |
728 | - | let cP = | |
729 | - | $Tuple2(( | |
743 | + | let br = bb(aj, as) | |
744 | + | let cP = bq(br) | |
745 | + | $Tuple2((bd(-(cP), 0, 0, cP) ++ [ScriptTransfer(addressFromStringValue(by), cP, A), n(J, -(br)), Burn(as, br)]), cP) | |
730 | 746 | } | |
731 | 747 | else throw("Strict value is not equal to itself.") | |
732 | 748 | } | |
733 | 749 | ||
734 | 750 | ||
735 | 751 | ||
736 | - | @Callable( | |
752 | + | @Callable(aj) | |
737 | 753 | func transferATokensFor (cO,ce,cQ) = { | |
738 | - | let bF = if ( | |
739 | - | then | |
754 | + | let bF = if (ai(aj)) | |
755 | + | then ae("transfer_debt") | |
740 | 756 | else false | |
741 | 757 | if ((bF == bF)) | |
742 | 758 | then { | |
743 | - | let cR = | |
744 | - | let bU = | |
745 | - | let cS = | |
759 | + | let cR = bp(cQ) | |
760 | + | let bU = bs(cR) | |
761 | + | let cS = bv(cO) | |
746 | 762 | if ((bU > cS)) | |
747 | 763 | then throw((((((((((("transferAtokensFor error:" + " transfer.valueUsd: ") + toString(cQ)) + " transfer.assets: ") + toString(cR)) + " transfer.atokens: ") + toString(bU)) + " from.atokens: ") + toString(cS)) + " at ") + toString(this))) | |
748 | - | else $Tuple2((( | |
764 | + | else $Tuple2(((bd(0, 0, 0, 0) ++ [n(T(cO), -(bU)), n(T(ce), bU)]) ++ bz(ce)), bq(bU)) | |
749 | 765 | } | |
750 | 766 | else throw("Strict value is not equal to itself.") | |
751 | 767 | } | |
752 | 768 | ||
753 | 769 | ||
754 | 770 | ||
755 | - | @Callable( | |
756 | - | func transferDebtFor (cO,ce, | |
757 | - | let bF = if ( | |
758 | - | then | |
771 | + | @Callable(aj) | |
772 | + | func transferDebtFor (cO,ce,aN) = { | |
773 | + | let bF = if (ai(aj)) | |
774 | + | then ae("transfer_debt") | |
759 | 775 | else false | |
760 | 776 | if ((bF == bF)) | |
761 | - | then $Tuple2(( | |
777 | + | then $Tuple2((bd(0, 0, 0, 0) ++ [h(V(cO), (aR(cO) - aN)), h(V(ce), (aR(ce) + aN)), h(W(cO), aH), h(W(ce), aH), bx(ce)]), aN) | |
762 | 778 | else throw("Strict value is not equal to itself.") | |
763 | 779 | } | |
764 | 780 | ||
765 | 781 | ||
766 | 782 | ||
767 | - | @Callable( | |
768 | - | func disableUseAsCollateralFor ( | |
769 | - | let bF = if ( | |
770 | - | then | |
783 | + | @Callable(aj) | |
784 | + | func disableUseAsCollateralFor (bw) = { | |
785 | + | let bF = if (ai(aj)) | |
786 | + | then ae("use_as_col") | |
771 | 787 | else false | |
772 | 788 | if ((bF == bF)) | |
773 | - | then if (( | |
789 | + | then if ((aR(bw) > 0)) | |
774 | 790 | then throw("can't disable collateral for asset with open debt") | |
775 | - | else ( | |
791 | + | else (bd(0, 0, 0, 0) ++ [BooleanEntry(X(bw), false)]) | |
776 | 792 | else throw("Strict value is not equal to itself.") | |
777 | 793 | } | |
778 | 794 | ||
779 | 795 | ||
780 | 796 | ||
781 | - | @Callable( | |
797 | + | @Callable(aj) | |
782 | 798 | func enableUseAsCollateral () = { | |
783 | - | let bF = | |
799 | + | let bF = ae("use_as_col") | |
784 | 800 | if ((bF == bF)) | |
785 | - | then ( | |
801 | + | then (bd(0, 0, 0, 0) ++ [bx(toString(aj.caller))]) | |
786 | 802 | else throw("Strict value is not equal to itself.") | |
787 | 803 | } | |
788 | 804 | ||
789 | 805 | ||
790 | 806 | ||
791 | - | @Callable( | |
792 | - | func collapseFor ( | |
793 | - | let bF = if ( | |
794 | - | then | |
807 | + | @Callable(aj) | |
808 | + | func collapseFor (by) = { | |
809 | + | let bF = if (ai(aj)) | |
810 | + | then ae("force_collapse") | |
795 | 811 | else false | |
796 | 812 | if ((bF == bF)) | |
797 | - | then by | |
813 | + | then bA(by, -1) | |
798 | 814 | else throw("Strict value is not equal to itself.") | |
799 | 815 | } | |
800 | 816 | ||
801 | 817 | ||
802 | 818 | ||
803 | - | @Callable( | |
804 | - | func collapseForAmount ( | |
805 | - | let bF = if ( | |
806 | - | then | |
819 | + | @Callable(aj) | |
820 | + | func collapseForAmount (by,aN) = { | |
821 | + | let bF = if (ai(aj)) | |
822 | + | then ae("collapse") | |
807 | 823 | else false | |
808 | 824 | if ((bF == bF)) | |
809 | - | then by | |
825 | + | then bA(by, aN) | |
810 | 826 | else throw("Strict value is not equal to itself.") | |
811 | 827 | } | |
812 | 828 | ||
813 | 829 | ||
814 | 830 | ||
815 | - | @Callable( | |
816 | - | func lpValue ( | |
831 | + | @Callable(aj) | |
832 | + | func lpValue (br) = $Tuple2(nil, bq(br)) | |
817 | 833 | ||
818 | 834 |
github/deemru/w8io/6500d08 279.38 ms ◑