tx · 5SLH9A3UrhELYYwyeDBcdUD8NVrdfkigin3eYGMgDf2F

3PCbvPVQfSvVu88ip8Fm5YjwJhjEYk1Txhk:  -0.02000000 Waves

2024.01.26 13:59 [4014166] smart account 3PCbvPVQfSvVu88ip8Fm5YjwJhjEYk1Txhk > SELF 0.00000000 Waves

{ "type": 13, "id": "5SLH9A3UrhELYYwyeDBcdUD8NVrdfkigin3eYGMgDf2F", "fee": 2000000, "feeAssetId": null, "timestamp": 1706266824576, "version": 1, "sender": "3PCbvPVQfSvVu88ip8Fm5YjwJhjEYk1Txhk", "senderPublicKey": "FwXAX9xcWiwbCejtdF8q1Nz8NpJqaVxXKnKK6JoR24pZ", "proofs": [ "3fgLXYN35J8SPpYcu3FSaKbkXyfKhfkKB2qNfp8Xm4YicZCtfhu5Bqr97kUE5SSd7idfRZVamReMCebhwbADFWg9" ], "script": "base64:BgI/CAISCwoJCAgICAgICAEIEgUKAwgIARIECgIIARIAEgQKAgQEEgQKAgQEEgUKAwEBBBIECgIEBBIECgIBARIALQALZmFjdG9yc0Jhc2UA6AcBEHdyaXRlQ29uc3RTdHJpbmcCA2tleQV2YWx1ZQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwUDa2V5CQELU3RyaW5nRW50cnkCBQNrZXkFBXZhbHVlCQACAQkArAICAhVhbHJlYWR5IGluaXRpYWxpemVkOiAFA2tleQENd3JpdGVDb25zdEludAIDa2V5BXZhbHVlAwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzBQNrZXkJAQxJbnRlZ2VyRW50cnkCBQNrZXkFBXZhbHVlCQACAQkArAICAhVhbHJlYWR5IGluaXRpYWxpemVkOiAFA2tleQEId3JpdGVJbnQCA2tleQV2YWx1ZQMJAGYCAAAFBXZhbHVlCQACAQkArAICCQCsAgIJAKwCAgIXd3JpdGluZyBuZWdhdGl2ZSB2YWx1ZSAJAKQDAQUFdmFsdWUCCSBmb3Iga2V5IAUDa2V5CQEMSW50ZWdlckVudHJ5AgUDa2V5BQV2YWx1ZQEIYXNTdHJpbmcBBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAFAXMJAAIBAhx3cm9uZyB0eXBlLCBleHBlY3RlZDogU3RyaW5nAQVhc0ludAEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACA0ludAQDaW50BQckbWF0Y2gwBQNpbnQJAAIBAgRzbToxAQZhc0ludDIBBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAgooSW50LCBJbnQpBAF4BQckbWF0Y2gwBQF4BAF0BQckbWF0Y2gwCQACAQIad3JvbmcgdHlwZSwgZXhwZWN0ZWQ6IEludDIBEWFzVXNlckJhbGFuY2VEYXRhAQV2YWx1ZQQHJG1hdGNoMAUFdmFsdWUDCQABAgUHJG1hdGNoMAIiKEludCwgSW50LCBJbnQsIEludCwgSW50LCBCb29sZWFuKQQBeAUHJG1hdGNoMAUBeAQBdAUHJG1hdGNoMAkAAgECATMBC3VzZXJCYWxhbmNlAgNyc3IEdXNlcgkBEWFzVXNlckJhbGFuY2VEYXRhAQkA/AcEBQNyc3ICC3VzZXJCYWxhbmNlCQDMCAIFBHVzZXIFA25pbAUDbmlsAQd0aHJvd0lmAgljb25kaXRpb24FZXJyb3IDBQljb25kaXRpb24JAAIBBQVlcnJvcgYBCGNoYW5nZUJ5AgNrZXkFdmFsdWUJAQh3cml0ZUludAIFA2tleQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUDa2V5AAAFBXZhbHVlAAtjb25maWdTdG9yZQIGY29uZmlnAA1jb25maWdBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzBQtjb25maWdTdG9yZQAVdmlyZXNWZXN0ZWRVc2RuTHBEYXBwCQERQGV4dHJOYXRpdmUoMTA2MikBAiMzUEpGdThNbVZhMnJTVkdNNDh3ZExtNGpoTHpuRWd1NlhTZQASbWF5YmVPcmFjbGVBZGRyZXNzBAckbWF0Y2gwCQCdCAIFDWNvbmZpZ0FkZHJlc3MCDm9yYWNsZV9hZGRyZXNzAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkApggBBQFzBQR1bml0AAZIRUlHSFQFBmhlaWdodAACdmQJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ1jb25maWdBZGRyZXNzAhF2aXJlc19kaXN0cmlidXRvcgIVYmFkIHZpcmVzIGRpc3RyaWJ1dG9yABBwcm90ZWN0ZWRSZXNlcnZlCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQ1jb25maWdBZGRyZXNzAhFwcm90ZWN0ZWRfcmVzZXJ2ZQAFbWFpbjEJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMCBW1haW4xAAt1c2R0UmVzZXJ2ZQkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwILdXNkdFJlc2VydmUAC3VzZGNSZXNlcnZlCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzAgt1c2RjUmVzZXJ2ZQADYWNjCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzAgNhY2MADnVzZG5WZXN0aW5nQWxsCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzAg51c2RuVmVzdGluZ0FsbAALdXNkblZlc3RpbmcJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMCC3VzZG5WZXN0aW5nAAt1c2RuQXNzZXRJZAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwILdXNkbkFzc2V0SWQACXVzZG5Cb251cwkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwIFYm9udXMBCm1vdmVTdHJlYW0FA3JzcgZhY3Rpb24EZnJvbQZzdHJpbmcDYW10CQD8BwQFAnZkAgRtb3ZlCQDMCAIFA3JzcgkAzAgCBQZhY3Rpb24JAMwIAgUEZnJvbQkAzAgCBQZzdHJpbmcJAMwIAgUDYW10BQNuaWwFA25pbAEJb3BBbGxvd2VkAgJvcAphc3NldElkU3RyBAckbWF0Y2gwCQD8BwQFDWNvbmZpZ0FkZHJlc3MCCW9wQWxsb3dlZAkAzAgCBQphc3NldElkU3RyCQDMCAIFAm9wBQNuaWwFA25pbAMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFiBQckbWF0Y2gwAwUBYgYJAAIBAgtub3QgYWxsb3dlZAkAAgECIW9wQWxsb3dlZDogdW5leHBlY3RlZCByZXN1bHQgdHlwZQEIbWFpbk9ubHkBAWkDCQEIY29udGFpbnMCCQERQGV4dHJOYXRpdmUoMTA1MykCBQ1jb25maWdBZGRyZXNzAgRtYWluCQClCAEIBQFpBmNhbGxlcgYJAAIBAhBvbmx5IG1haW4gY2FuIGRvAQphZHZpc2VVc2VyAQNhY2MECWRhdGFXaGFsZQkBCGFzU3RyaW5nAQkA/AcEBQt1c2RuVmVzdGluZwIHYWR2aXNlVQkAzAgCBQNhY2MFA25pbAUDbmlsAwkAAAIFCWRhdGFXaGFsZQUJZGF0YVdoYWxlBAdkYXRhQWxsCQEIYXNTdHJpbmcBCQD8BwQFDnVzZG5WZXN0aW5nQWxsAgdhZHZpc2VVCQDMCAIFA2FjYwUDbmlsBQNuaWwDCQAAAgUHZGF0YUFsbAUHZGF0YUFsbAkArAICCQCsAgIFCWRhdGFXaGFsZQIDIHwgBQdkYXRhQWxsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAtzdXJmQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQIjM1BHMnZNaEs1Q1Bxc0NEb2R2TEd6UTg0UWtvSFhDSjNvTlAAEHN1cmZTdGFrZUFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQECIzNQQmlvdEZwcWpSTWtrZUZCY2NuUU5VWFVvcHk3S0ZlejVDAAtzdXJmQXNzZXRJZAkA2QQBAixBdDhENk5GRnBoZUNidktWbmpWb2VMTDg0RW84TlpuNm92TWFueGZMYUZXTAAGb3JhY2xlCQEHQWRkcmVzcwEBGgFXw4nuidFTWhQUZTvI/d/0hIb99hEAq5RYAAh4dG5QcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUGb3JhY2xlAhYlcyVzX19wcmljZV9fVVNETi1VU0RUAQdidXlTdXJmAwZjYWxsZXIFd2hhbGUHcmVndWxhcgQHYWRkcmVzcwkApQgBBQZjYWxsZXIEB3JlZ1BhcnQDBQdyZWd1bGFyCQEFYXNJbnQBCQD8BwQFDnVzZG5WZXN0aW5nQWxsAhZ3aXRoZHJhd0FsbFZlc3RlZEZvclRvCQDMCAIFB2FkZHJlc3MJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAAAAwkAAAIFB3JlZ1BhcnQFB3JlZ1BhcnQECXdoYWxlUGFydAMFBXdoYWxlCQACAQIPbm90IGltcGxlbWVudGVkAAADCQAAAgUJd2hhbGVQYXJ0BQl3aGFsZVBhcnQEBXRvdGFsCQBkAgUJd2hhbGVQYXJ0BQdyZWdQYXJ0BANidXkJAPwHBAULc3VyZkFkZHJlc3MCB2J1eVN1cmYJAMwIAgDAhD0JAMwIAgDAhD0JAMwIAgcFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBBQt1c2RuQXNzZXRJZAUFdG90YWwFA25pbAMJAAACBQNidXkFA2J1eQkA8AcCBQR0aGlzBQtzdXJmQXNzZXRJZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgALcmVzZXJ2ZXNTdHIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ1jb25maWdBZGRyZXNzAhBwcmltYXJ5X3Jlc2VydmVzAhZubyByZXNlcnZlcyByZWdpc3RlcmVkAQN2bFIBAXIDCQEIY29udGFpbnMCBQtyZXNlcnZlc1N0cgUBcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFAXICDW1haW46IGJhZCByc3IJAAIBCQCsAgICDHVua25vd24gcnNyOgUBcgEXc3RhcnRWZXN0aW5nRm9ySW50ZXJuYWwDB2FkZHJlc3MDcnNyBmFtb3VudAQBcgkBA3ZsUgEFA3JzcgMJAAACBQFyBQFyBAdyZXNlcnZlCQERQGV4dHJOYXRpdmUoMTA2MikBBQNyc3IEB2Fzc2V0SWQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFB3Jlc2VydmUCB2Fzc2V0SWQEAm13CQD8BwQFC3VzZG5WZXN0aW5nAhJzdGFydFZlc3RpbmdBbGxGb3IJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwDCQAAAgUCbXcFAm13BAZjaGVja3MJAQlvcEFsbG93ZWQCAg5vcGVuQ29sbGF0ZXJhbAUHYXNzZXRJZAMJAAACBQZjaGVja3MFBmNoZWNrcwQCczMJAQVhc0ludAEJAPwHBAUHcmVzZXJ2ZQIYdHJhbnNmZXJBVG9rZW5zQW1vdW50Rm9yCQDMCAIFB2FkZHJlc3MJAMwIAgUDYWNjCQDMCAIFBmFtb3VudAUDbmlsBQNuaWwDCQAAAgUCczMFAnMzBAZ4dG5BbXQEEnJlc2VydmVWZXN0aW5nUmF0ZQkAmggCBQ1jb25maWdBZGRyZXNzCQCsAgIFA3JzcgIRX3RvX3Zlc3RpbmdfdmFsdWUDCQEJaXNEZWZpbmVkAQUScmVzZXJ2ZVZlc3RpbmdSYXRlCQBrAwUCczMJAQV2YWx1ZQEFEnJlc2VydmVWZXN0aW5nUmF0ZQULZmFjdG9yc0Jhc2UEA3VzZAkBBWFzSW50AQkA/AcEBQdyZXNlcnZlAgV0b1VTRAkAzAgCBQJzMwUDbmlsBQNuaWwJAGsDBQN1c2QAwIQ9BQh4dG5QcmljZQQFcmVoYWIEAndkCQD8BwQFEHByb3RlY3RlZFJlc2VydmUCD3dpdGhkcmF3VG9NYWluMgkAzAgCBQNhY2MJAMwIAgULdXNkbkFzc2V0SWQJAMwIAgUGeHRuQW10BQNuaWwFA25pbAMJAAACBQJ3ZAUCd2QEBXJlaGFiCQD8BwQFDnVzZG5WZXN0aW5nQWxsAgphY2NvdW50Rm9yCQDMCAIFB2FkZHJlc3MFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBBQt1c2RuQXNzZXRJZAUGeHRuQW10BQNuaWwDCQAAAgUFcmVoYWIFBXJlaGFiBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXJlaGFiBQVyZWhhYgQLJHQwNTg1MDU5MTIJAQZhc0ludDIBCQD8BwQFBW1haW4xAghoZWFsdGhPZgkAzAgCBQdhZGRyZXNzBQNuaWwFA25pbAQCYnAIBQskdDA1ODUwNTkxMgJfMQQDYnB1CAULJHQwNTg1MDU5MTICXzIDCQBmAgUCYnAJAGgCAGQJAGUCBQJicAUDYnB1CQACAQIqbm90IGVub3VnaCBhZGRyZXNzIGhlYWx0aCBhZnRlciBtb3ZlOiA8IDElCQCUCgIJAMwIAgkBCGNoYW5nZUJ5AgkArAICCQCsAgIFB2FkZHJlc3MCCl9taWdyYXRlZF8FB2Fzc2V0SWQFAnMzBQNuaWwFBnh0bkFtdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAUbWludERhaWx5R2xvYmFsTGltaXQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUNY29uZmlnQWRkcmVzcwkArAICCQClCAEFBHRoaXMCGF9taW50X2RhaWx5X2dsb2JhbF9saW1pdACA0NvD9AIAGW1pbnRUb2RheUdsb2JhbExpbWl0U3RvcmUJAKwCAgkApAMBCQBrAwUGSEVJR0hUAAEJAGgCADwAGAISX21pbnRfZ2xvYmFsX2xpbWl0ABRtaW50VG9kYXlHbG9iYWxMaW1pdAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRltaW50VG9kYXlHbG9iYWxMaW1pdFN0b3JlBRRtaW50RGFpbHlHbG9iYWxMaW1pdAAWaW1wb3J0RGFpbHlHbG9iYWxMaW1pdAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1jb25maWdBZGRyZXNzCQCsAgIJAKUIAQUEdGhpcwIaX2ltcG9ydF9kYWlseV9nbG9iYWxfbGltaXQAgNDbw/QCABtpbXBvcnRUb2RheUdsb2JhbExpbWl0U3RvcmUJAKwCAgkApAMBCQBrAwUGSEVJR0hUAAEJAGgCADwAGAIUX2ltcG9ydF9nbG9iYWxfbGltaXQAFmltcG9ydFRvZGF5R2xvYmFsTGltaXQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUbaW1wb3J0VG9kYXlHbG9iYWxMaW1pdFN0b3JlBRZpbXBvcnREYWlseUdsb2JhbExpbWl0CgFpAQRpbml0CQRjb25mAXQBYwh2ZXN0bkFsbAdhY2NvdW50BG1haW4JdXNkbkFzc2V0BWJvbnVzBXZlc3RuAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQISb25seSBzZWxmIGNhbiBpbml0CQDMCAIJARB3cml0ZUNvbnN0U3RyaW5nAgULY29uZmlnU3RvcmUFBGNvbmYJAMwIAgkBEHdyaXRlQ29uc3RTdHJpbmcCAgt1c2R0UmVzZXJ2ZQUBdAkAzAgCCQEQd3JpdGVDb25zdFN0cmluZwICC3VzZGNSZXNlcnZlBQFjCQDMCAIJARB3cml0ZUNvbnN0U3RyaW5nAgIOdXNkblZlc3RpbmdBbGwFCHZlc3RuQWxsCQDMCAIJARB3cml0ZUNvbnN0U3RyaW5nAgILdXNkblZlc3RpbmcFBXZlc3RuCQDMCAIJARB3cml0ZUNvbnN0U3RyaW5nAgIDYWNjBQdhY2NvdW50CQDMCAIJARB3cml0ZUNvbnN0U3RyaW5nAgIFbWFpbjEFBG1haW4JAMwIAgkBEHdyaXRlQ29uc3RTdHJpbmcCAgt1c2RuQXNzZXRJZAUJdXNkbkFzc2V0CQDMCAIJAQxJbnRlZ2VyRW50cnkCAgVib251cwUFYm9udXMFA25pbAFpAQ9zdGFydFZlc3RpbmdGb3IDB2FkZHJlc3MDcnNyBmFtb3VudAQBbQkBCG1haW5Pbmx5AQUBaQMJAAACBQFtBQFtCQEXc3RhcnRWZXN0aW5nRm9ySW50ZXJuYWwDBQdhZGRyZXNzBQNyc3IFBmFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQxzdGFydFZlc3RpbmcCA3JzcgZhbW91bnQJARdzdGFydFZlc3RpbmdGb3JJbnRlcm5hbAMJAKUIAQgFAWkGY2FsbGVyBQNyc3IFBmFtb3VudAFpAQ1jb252ZXJ0VG9VU0ROAAQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIKAQdtb3ZlUnNyAQNyc3IEB3Jlc2VydmUJARFAZXh0ck5hdGl2ZSgxMDYyKQEFA3JzcgQHYXNzZXRJZAkBEUBleHRyTmF0aXZlKDEwNTMpAgUHcmVzZXJ2ZQIHYXNzZXRJZAQGY2hlY2tzCQEJb3BBbGxvd2VkAgIOb3BlbkNvbGxhdGVyYWwFB2Fzc2V0SWQDCQAAAgUGY2hlY2tzBQZjaGVja3MDAwkBAiE9AgUDcnNyCQClCAEFC3VzZHRSZXNlcnZlCQECIT0CBQNyc3IJAKUIAQULdXNkY1Jlc2VydmUHCQACAQIPaW52YWxpZCByZXNlcnZlBANzaEMJAPwHBAUCdmQCCnN5bmNIZWlnaHQJAMwIAgUDcnNyBQNuaWwFA25pbAMJAAACBQNzaEMFA3NoQwQLJHQwODEzMDgyMTQJAQZhc0ludDIBCQD8BwQFB3Jlc2VydmUCE3N0b3JlZERlcG9zaXRCb3Jyb3cFA25pbAUDbmlsBAx0b3RhbERlcG9zaXQIBQskdDA4MTMwODIxNAJfMQQJdG90YWxEZWJ0CAULJHQwODEzMDgyMTQCXzIEBHV0aWwDCQBmAgUMdG90YWxEZXBvc2l0AAAJAJcDAQkAzAgCBQtmYWN0b3JzQmFzZQkAzAgCCQBrAwUJdG90YWxEZWJ0BQtmYWN0b3JzQmFzZQUMdG90YWxEZXBvc2l0BQNuaWwAAAQNdXRpbFRocmVzaG9sZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1jb25maWdBZGRyZXNzCQCsAgIFB2Fzc2V0SWQCGV9vcGVuX2NvbGxhdGVyYWxfdGhyZXNvbGQA6AcDCQBmAgUNdXRpbFRocmVzaG9sZAUEdXRpbAkAAgECHW5vdCBhbGxvd2VkOiB1dGlsIDwgdGhyZXNob2xkBANkZXAJAQVhc0ludAEJAPwHBAUHcmVzZXJ2ZQIOdXNlckRlcG9zaXRVU0QJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwDCQAAAgUDZGVwBQNkZXAEAnMzCQEFYXNJbnQBCQD8BwQFB3Jlc2VydmUCEnRyYW5zZmVyQVRva2Vuc0ZvcgkAzAgCBQdhZGRyZXNzCQDMCAIFA2FjYwkAzAgCBQNkZXAFA25pbAUDbmlsAwkAAAIFAnMzBQJzMwQEcFJ3MwkBCm1vdmVTdHJlYW0FBQNyc3ICB2RlcG9zaXQFB2FkZHJlc3MFA2FjYwUCczMDCQAAAgUEcFJ3MwUEcFJ3MwUCczMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EAm13CQD8BwQFC3VzZG5WZXN0aW5nAhJzdGFydFZlc3RpbmdBbGxGb3IJAMwIAgkApQgBCAUBaQZjYWxsZXIFA25pbAUDbmlsAwkAAAIFAm13BQJtdwQCbXQJAQVhc0ludAEJAQdtb3ZlUnNyAQkApQgBBQt1c2R0UmVzZXJ2ZQMJAAACBQJtdAUCbXQEAm1jCQEFYXNJbnQBCQEHbW92ZVJzcgEJAKUIAQULdXNkY1Jlc2VydmUDCQAAAgUCbWMFAm1jBAhkZXBUb3RhbAkAZAIFAm10BQJtYwQFcmVoYWIEB3VzZG5BbXQJAGsDBQhkZXBUb3RhbAkAZAIFC2ZhY3RvcnNCYXNlBQl1c2RuQm9udXMFC2ZhY3RvcnNCYXNlBAJ3ZAkA/AcEBRBwcm90ZWN0ZWRSZXNlcnZlAg93aXRoZHJhd1RvTWFpbjIJAMwIAgUDYWNjCQDMCAIFC3VzZG5Bc3NldElkCQDMCAIFB3VzZG5BbXQFA25pbAUDbmlsAwkAAAIFAndkBQJ3ZAQFcmVoYWIJAPwHBAUOdXNkblZlc3RpbmdBbGwCCmFjY291bnRGb3IJAMwIAgUHYWRkcmVzcwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEFC3VzZG5Bc3NldElkBQd1c2RuQW10BQNuaWwDCQAAAgUFcmVoYWIFBXJlaGFiBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXJlaGFiBQVyZWhhYgQLJHQwOTM2ODk0MzAJAQZhc0ludDIBCQD8BwQFBW1haW4xAghoZWFsdGhPZgkAzAgCBQdhZGRyZXNzBQNuaWwFA25pbAQCYnAIBQskdDA5MzY4OTQzMAJfMQQDYnB1CAULJHQwOTM2ODk0MzACXzIDCQBmAgUCYnAJAGgCAGQJAGUCBQJicAUDYnB1CQACAQIqbm90IGVub3VnaCBhZGRyZXNzIGhlYWx0aCBhZnRlciBtb3ZlOiA8IDElCQDMCAIJAQhjaGFuZ2VCeQIJAKwCAgkArAICBQdhZGRyZXNzAgpfbWlncmF0ZWRfCQERQGV4dHJOYXRpdmUoMTA1MykCBQt1c2R0UmVzZXJ2ZQIHYXNzZXRJZAUCbXQJAMwIAgkBCGNoYW5nZUJ5AgkArAICCQCsAgIFB2FkZHJlc3MCCl9taWdyYXRlZF8JARFAZXh0ck5hdGl2ZSgxMDUzKQIFC3VzZGNSZXNlcnZlAgdhc3NldElkBQJtYwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFXdpdGhkcmF3VmVzdGVkQWxsVVNETgIFd2hhbGUHcmVndWxhcgQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEB3JlZ1BhcnQDBQdyZWd1bGFyCQEFYXNJbnQBCQD8BwQFDnVzZG5WZXN0aW5nQWxsAhN3aXRoZHJhd1Zlc3RlZEZvclRvCQDMCAIFB2FkZHJlc3MJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwAAAMJAAACBQdyZWdQYXJ0BQdyZWdQYXJ0BAl3aGFsZVBhcnQDBQV3aGFsZQkBBWFzSW50AQkA/AcEBQt1c2RuVmVzdGluZwITd2l0aGRyYXdWZXN0ZWRGb3JUbwkAzAgCBQdhZGRyZXNzCQDMCAIFB2FkZHJlc3MFA25pbAUDbmlsAAADCQAAAgUJd2hhbGVQYXJ0BQl3aGFsZVBhcnQJAJQKAgUDbmlsCQBkAgUJd2hhbGVQYXJ0BQdyZWdQYXJ0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFXdpdGhkcmF3VmVzdGVkQWxsU1VSRgIFd2hhbGUHcmVndWxhcgQGY2hlY2tzCQEJb3BBbGxvd2VkAgIhbGlxdWlkYW9fYWxsX3dpdGhkcmF3VmVzdGVkQXNTdXJmCQDYBAEFC3N1cmZBc3NldElkAwkAAAIFBmNoZWNrcwUGY2hlY2tzBAtzdXJmQmFsYW5jZQkBB2J1eVN1cmYDCAUBaQZjYWxsZXIFBXdoYWxlBQdyZWd1bGFyAwkAAAIFC3N1cmZCYWxhbmNlBQtzdXJmQmFsYW5jZQkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgULc3VyZkJhbGFuY2UFC3N1cmZBc3NldElkBQNuaWwFC3N1cmZCYWxhbmNlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBE3dpdGhkcmF3VmVzdGVkU1VSRjIDBXdoYWxlB3JlZ3VsYXIFc3Rha2UEB2FkZHJlc3MJAKUIAQgFAWkGY2FsbGVyBAZjaGVja3MJAQlvcEFsbG93ZWQCAiFsaXF1aWRhb19hbGxfd2l0aGRyYXdWZXN0ZWRBc1N1cmYJANgEAQULc3VyZkFzc2V0SWQDCQAAAgUGY2hlY2tzBQZjaGVja3MEB3JlZ1BhcnQDCQBmAgUHcmVndWxhcgAACQEFYXNJbnQBCQD8BwQFDnVzZG5WZXN0aW5nQWxsAhpwYXJ0aWFsV2l0aGRyYXdWZXN0ZWRGb3JUbwkAzAgCBQdhZGRyZXNzCQDMCAIJAKUIAQUEdGhpcwkAzAgCBQdyZWd1bGFyBQNuaWwFA25pbAAAAwkAAAIFB3JlZ1BhcnQFB3JlZ1BhcnQECXdoYWxlUGFydAMJAGYCBQV3aGFsZQAACQEFYXNJbnQBCQD8BwQFC3VzZG5WZXN0aW5nAhpwYXJ0aWFsV2l0aGRyYXdWZXN0ZWRGb3JUbwkAzAgCBQdhZGRyZXNzCQDMCAIJAKUIAQUEdGhpcwkAzAgCBQV3aGFsZQUDbmlsBQNuaWwAAAMJAAACBQl3aGFsZVBhcnQFCXdoYWxlUGFydAQFdG90YWwJAGQCBQl3aGFsZVBhcnQFB3JlZ1BhcnQEA2J1eQkA/AcEBQtzdXJmQWRkcmVzcwIHYnV5U3VyZgkAzAgCAMCEPQkAzAgCAMCEPQkAzAgCBwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEFC3VzZG5Bc3NldElkBQV0b3RhbAUDbmlsAwkAAAIFA2J1eQUDYnV5BAtzdXJmQmFsYW5jZQkA8AcCBQR0aGlzBQtzdXJmQXNzZXRJZAMJAAACBQtzdXJmQmFsYW5jZQULc3VyZkJhbGFuY2UDBQVzdGFrZQQJc3Rha2VTdXJmCQD8BwQFEHN1cmZTdGFrZUFkZHJlc3MCE3N0YWtlQnlPcmlnaW5DYWxsZXIFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgULc3VyZkFzc2V0SWQFC3N1cmZCYWxhbmNlBQNuaWwDCQAAAgUJc3Rha2VTdXJmBQlzdGFrZVN1cmYJAJQKAgUDbmlsBQtzdXJmQmFsYW5jZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgULc3VyZkJhbGFuY2UFC3N1cmZBc3NldElkBQNuaWwFC3N1cmZCYWxhbmNlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBHXdpdGhkcmF3VmVzdGVkQWxsU1VSRkFuZFN0YWtlAgV3aGFsZQdyZWd1bGFyBAZjaGVja3MJAQlvcEFsbG93ZWQCAiFsaXF1aWRhb19hbGxfd2l0aGRyYXdWZXN0ZWRBc1N1cmYJANgEAQULc3VyZkFzc2V0SWQDCQAAAgUGY2hlY2tzBQZjaGVja3MEC3N1cmZCYWxhbmNlCQEHYnV5U3VyZgMIBQFpBmNhbGxlcgUFd2hhbGUFB3JlZ3VsYXIDCQAAAgULc3VyZkJhbGFuY2UFC3N1cmZCYWxhbmNlBAlzdGFrZVN1cmYJAPwHBAUQc3VyZlN0YWtlQWRkcmVzcwITc3Rha2VCeU9yaWdpbkNhbGxlcgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQtzdXJmQXNzZXRJZAULc3VyZkJhbGFuY2UFA25pbAMJAAACBQlzdGFrZVN1cmYFCXN0YWtlU3VyZgkAlAoCBQNuaWwFC3N1cmZCYWxhbmNlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDHdpdGhkcmF3QXNMUAIFd2hhbGUHcmVndWxhcgQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIDCQAAAgUUbWludFRvZGF5R2xvYmFsTGltaXQAAAkAAgEJAKwCAgIZRGFpbHkgZXhwb3J0IGxpbWl0OiAwIG9mIAkApAMBBRRtaW50RGFpbHlHbG9iYWxMaW1pdAQNJHQwMTIwNjQxMjMxOAMJAGYCBQdyZWd1bGFyBRRtaW50VG9kYXlHbG9iYWxMaW1pdAkAlAoCBRRtaW50VG9kYXlHbG9iYWxMaW1pdAAAAwkAZgIJAGQCBQV3aGFsZQUHcmVndWxhcgUUbWludFRvZGF5R2xvYmFsTGltaXQJAJQKAgUHcmVndWxhcgkAZQIFFG1pbnRUb2RheUdsb2JhbExpbWl0BQdyZWd1bGFyCQCUCgIFB3JlZ3VsYXIFBXdoYWxlBApyZWd1bGFyQW10CAUNJHQwMTIwNjQxMjMxOAJfMQQId2hhbGVBbXQIBQ0kdDAxMjA2NDEyMzE4Al8yBAdyZWdQYXJ0AwkAZgIFCnJlZ3VsYXJBbXQAAAkBBWFzSW50AQkA/AcEBQ51c2RuVmVzdGluZ0FsbAIacGFydGlhbFdpdGhkcmF3VmVzdGVkRm9yVG8JAMwIAgUHYWRkcmVzcwkAzAgCCQClCAEFBHRoaXMJAMwIAgUKcmVndWxhckFtdAUDbmlsBQNuaWwAAAMJAAACBQdyZWdQYXJ0BQdyZWdQYXJ0BAl3aGFsZVBhcnQDCQBmAgUId2hhbGVBbXQAAAkBBWFzSW50AQkA/AcEBQt1c2RuVmVzdGluZwIacGFydGlhbFdpdGhkcmF3VmVzdGVkRm9yVG8JAMwIAgUHYWRkcmVzcwkAzAgCCQClCAEFBHRoaXMJAMwIAgUId2hhbGVBbXQFA25pbAUDbmlsAAADCQAAAgUJd2hhbGVQYXJ0BQl3aGFsZVBhcnQEBXRvdGFsCQBkAgUJd2hhbGVQYXJ0BQdyZWdQYXJ0BAR0b0xwCQD8BwQFFXZpcmVzVmVzdGVkVXNkbkxwRGFwcAIGbWludFRvCQDMCAIFB2FkZHJlc3MFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBBQt1c2RuQXNzZXRJZAUFdG90YWwFA25pbAMJAAACBQR0b0xwBQR0b0xwCQCUCgIJAMwIAgkBCGNoYW5nZUJ5AgUZbWludFRvZGF5R2xvYmFsTGltaXRTdG9yZQkBAS0BBQV0b3RhbAUDbmlsBQV0b3RhbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhpbXBvcnRMUAADCQAAAgUWaW1wb3J0VG9kYXlHbG9iYWxMaW1pdAAACQACAQkArAICAhlEYWlseSBpbXBvcnQgbGltaXQ6IDAgb2YgCQCkAwEFFmltcG9ydERhaWx5R2xvYmFsTGltaXQEB2FkZHJlc3MJAKUIAQgFAWkGY2FsbGVyBApwYXltZW50QW10CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQJbHBBc3NldElkCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQEDSR0MDEzMTU0MTM1MTIDCQBmAgUKcGF5bWVudEFtdAUWaW1wb3J0VG9kYXlHbG9iYWxMaW1pdAkAlQoDCQEPQXR0YWNoZWRQYXltZW50AgUJbHBBc3NldElkBRZpbXBvcnRUb2RheUdsb2JhbExpbWl0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIFCnBheW1lbnRBbXQFFmltcG9ydFRvZGF5R2xvYmFsTGltaXQFCWxwQXNzZXRJZAUDbmlsAAAJAJUKAwkAkQMCCAUBaQhwYXltZW50cwAABQNuaWwJAGUCBRZpbXBvcnRUb2RheUdsb2JhbExpbWl0BQpwYXltZW50QW10BAdwYXltZW50CAUNJHQwMTMxNTQxMzUxMgJfMQQGY2hhbmdlCAUNJHQwMTMxNTQxMzUxMgJfMgQIbmV3TGltaXQIBQ0kdDAxMzE1NDEzNTEyAl8zBAd1c2RuQW10CQEFYXNJbnQBCQD8BwQFFXZpcmVzVmVzdGVkVXNkbkxwRGFwcAIGaW1wb3J0BQNuaWwJAMwIAgUHcGF5bWVudAUDbmlsAwkAAAIFB3VzZG5BbXQFB3VzZG5BbXQECmFjY291bnRGb3IJAPwHBAUOdXNkblZlc3RpbmdBbGwCCmFjY291bnRGb3IJAMwIAgUHYWRkcmVzcwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEFC3VzZG5Bc3NldElkBQd1c2RuQW10BQNuaWwDCQAAAgUKYWNjb3VudEZvcgUKYWNjb3VudEZvcgkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRtpbXBvcnRUb2RheUdsb2JhbExpbWl0U3RvcmUFCG5ld0xpbWl0BQZjaGFuZ2UFB3VzZG5BbXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABARCQVNFAOgHBAtxdW9ydW1SYXRpbwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDWNvbmZpZ0FkZHJlc3MCFXByb3Bvc2FsX3F1b3J1bV9yYXRpbwIicHJvcG9zYWxRdW9ydW1SYXRpbyBpcyBub3QgZGVmaW5lZAQLcGFzc2VkUmF0aW8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ1jb25maWdBZGRyZXNzAhVwcm9wb3NhbF9wYXNzZWRfcmF0aW8CJXByb3Bvc2FsVGhyZXNob2xkUmF0aW8gaXMgbm90IGRlZmluZWQEDmdWaXJlc0NvbnRyYWN0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCEmRpdmlkZW5kc19jb250cmFjdAIVbm8gZGl2aWRlbmRzX2NvbnRyYWN0AhppbnZhbGlkIGRpdmlkZW5kc19jb250cmFjdAQOdm90aW5nQ29udHJhY3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwIPdm90aW5nX2NvbnRyYWN0AhJubyB2b3RpbmdfY29udHJhY3QCF2ludmFsaWQgdm90aW5nX2NvbnRyYWN0BAJpZAkA2AQBCAUCdHgCaWQECHZvdGVzWWVzCQELdmFsdWVPckVsc2UCCQCaCAIFDnZvdGluZ0NvbnRyYWN0CQCsAgICDXByb3Bvc2FsX3llc18FAmlkAAAEB3ZvdGVzTm8JAQt2YWx1ZU9yRWxzZQIJAJoIAgUOdm90aW5nQ29udHJhY3QJAKwCAgIMcHJvcG9zYWxfbm9fBQJpZAAABA5wcm9wb3NhbEhlaWdodAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDnZvdGluZ0NvbnRyYWN0CQCsAgICEHByb3Bvc2FsX2hlaWdodF8FAmlkAhdwcm9wb3NhbCBub3QgcmVnaXN0ZXJlZAQKYXBwbHlTdGFydAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ52b3RpbmdDb250cmFjdAkArAICAhRwcm9wb3NhbF9hcHBseXN0YXJ0XwUCaWQAAAQIYXBwbHlFbmQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUOdm90aW5nQ29udHJhY3QJAKwCAgIScHJvcG9zYWxfYXBwbHllbmRfBQJpZAAABAt0b3RhbEdWaXJlcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ52b3RpbmdDb250cmFjdAkArAICAhBwcm9wb3NhbF9ndmlyZXNfBQJpZAAABAdlbmFibGVkCQELdmFsdWVPckVsc2UCCQCbCAIFDWNvbmZpZ0FkZHJlc3MCHW9wX2dvdmVybmFuY2VfYXBwbHlfdHhfcGF1c2VkBwQHdm90ZVllcwUIdm90ZXNZZXMEBnZvdGVObwUHdm90ZXNObwQKdG90YWxWb3RlcwkAZAIFB3ZvdGVZZXMFBnZvdGVObwQJaGFzUXVvcnVtCQBnAgkAaQIJAGgCBQp0b3RhbFZvdGVzBQRCQVNFBQt0b3RhbEdWaXJlcwULcXVvcnVtUmF0aW8ECWhhc1Bhc3NlZAkAZwIJAGkCCQBoAgUHdm90ZVllcwUEQkFTRQUKdG90YWxWb3RlcwULcGFzc2VkUmF0aW8ECHRvb0Vhcmx5CQBnAgUKYXBwbHlTdGFydAUGSEVJR0hUBAd0b29MYXRlCQBnAgUGSEVJR0hUBQhhcHBseUVuZAQJdGltZURlYnVnCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICEXByb3Bvc2FsSGVpZ2h0ID0gCQCkAwEFDnByb3Bvc2FsSGVpZ2h0Ag8sIGFwcGx5U3RhcnQgPSAJAKQDAQUKYXBwbHlTdGFydAINLCBhcHBseUVuZCA9IAkApAMBBQhhcHBseUVuZAILLCBIRUlHSFQgPSAJAKQDAQUGSEVJR0hUBAhieVZvdGluZwMJAQEhAQUHZW5hYmxlZAkAAgECK3R4IGFwcGxpY2F0aW9uIHRocm93IGdvdmVybmFuY2Ugbm90IGVuYWJsZWQDBQh0b29FYXJseQkAAgEJAKwCAgIucHJvcG9zYWwgY2FuJ3QgYmUgZXhlY3V0ZWQgYXMgaXQncyB0b28gZWFybHk6IAUJdGltZURlYnVnAwUHdG9vTGF0ZQkAAgEJAKwCAgIscHJvcG9zYWwgY2FuJ3QgYmUgZXhlY3V0ZWQgYXMgaXQncyB0b28gbGF0ZToFCXRpbWVEZWJ1ZwMJAQEhAQUJaGFzUXVvcnVtCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgILbm8gcXVvcnVtOiACDHRvdGFsVm90ZXM6IAkApAMBBQp0b3RhbFZvdGVzAg8sIHRvdGFsR1ZpcmVzOiAJAKQDAQULdG90YWxHVmlyZXMCDywgcXVvcnVtUmF0aW86IAkApAMBBQtxdW9ydW1SYXRpbwMJAQEhAQUJaGFzUGFzc2VkCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIXbm8gdGhyZXNob2xkIGFjaGlldmVkOiACCXZvdGVZZXM6IAkApAMBBQd2b3RlWWVzAgosIHZvdGVObzogCQCkAwEFBnZvdGVObwIPLCBwYXNzZWRSYXRpbzogCQCkAwEFC3Bhc3NlZFJhdGlvBgMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkGBQhieVZvdGluZ6nTrUo=", "chainId": 87, "height": 4014166, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 66UbN1LgjD8AvTDFcmY5Rp7gCWdgN21pZEw1ior5we7e Next: Dgza1RW2FAv26mhq6tGA7uwpct91thdQQfAeSYvJ5B2D Diff:
OldNewDifferences
224224 }
225225
226226
227+let mintDailyGlobalLimit = valueOrElse(getInteger(configAddress, (toString(this) + "_mint_daily_global_limit")), 100000000000)
228+
229+let mintTodayGlobalLimitStore = (toString(fraction(HEIGHT, 1, (60 * 24))) + "_mint_global_limit")
230+
231+let mintTodayGlobalLimit = valueOrElse(getInteger(mintTodayGlobalLimitStore), mintDailyGlobalLimit)
232+
233+let importDailyGlobalLimit = valueOrElse(getInteger(configAddress, (toString(this) + "_import_daily_global_limit")), 100000000000)
234+
235+let importTodayGlobalLimitStore = (toString(fraction(HEIGHT, 1, (60 * 24))) + "_import_global_limit")
236+
237+let importTodayGlobalLimit = valueOrElse(getInteger(importTodayGlobalLimitStore), importDailyGlobalLimit)
238+
227239 @Callable(i)
228240 func init (conf,t,c,vestnAll,account,main,usdnAsset,bonus,vestn) = if ((i.caller != this))
229241 then throw("only self can init")
262274 let shC = invoke(vd, "syncHeight", [rsr], nil)
263275 if ((shC == shC))
264276 then {
265- let $t074537537 = asInt2(invoke(reserve, "storedDepositBorrow", nil, nil))
266- let totalDeposit = $t074537537._1
267- let totalDebt = $t074537537._2
277+ let $t081308214 = asInt2(invoke(reserve, "storedDepositBorrow", nil, nil))
278+ let totalDeposit = $t081308214._1
279+ let totalDebt = $t081308214._2
268280 let util = if ((totalDeposit > 0))
269281 then min([factorsBase, fraction(totalDebt, factorsBase, totalDeposit)])
270282 else 0
317329 }
318330 if ((rehab == rehab))
319331 then {
320- let $t086918753 = asInt2(invoke(main1, "healthOf", [address], nil))
321- let bp = $t086918753._1
322- let bpu = $t086918753._2
332+ let $t093689430 = asInt2(invoke(main1, "healthOf", [address], nil))
333+ let bp = $t093689430._1
334+ let bpu = $t093689430._2
323335 if ((bp > (100 * (bp - bpu))))
324336 then throw("not enough address health after move: < 1%")
325337 else [changeBy(((address + "_migrated_") + getStringValue(usdtReserve, "assetId")), mt), changeBy(((address + "_migrated_") + getStringValue(usdcReserve, "assetId")), mc)]
436448 @Callable(i)
437449 func withdrawAsLP (whale,regular) = {
438450 let address = toString(i.caller)
439- let regPart = if ((regular > 0))
440- then asInt(invoke(usdnVestingAll, "partialWithdrawVestedForTo", [address, toString(this), regular], nil))
441- else 0
442- if ((regPart == regPart))
443- then {
444- let whalePart = if ((whale > 0))
445- then asInt(invoke(usdnVesting, "partialWithdrawVestedForTo", [address, toString(this), whale], nil))
451+ if ((mintTodayGlobalLimit == 0))
452+ then throw(("Daily export limit: 0 of " + toString(mintDailyGlobalLimit)))
453+ else {
454+ let $t01206412318 = if ((regular > mintTodayGlobalLimit))
455+ then $Tuple2(mintTodayGlobalLimit, 0)
456+ else if (((whale + regular) > mintTodayGlobalLimit))
457+ then $Tuple2(regular, (mintTodayGlobalLimit - regular))
458+ else $Tuple2(regular, whale)
459+ let regularAmt = $t01206412318._1
460+ let whaleAmt = $t01206412318._2
461+ let regPart = if ((regularAmt > 0))
462+ then asInt(invoke(usdnVestingAll, "partialWithdrawVestedForTo", [address, toString(this), regularAmt], nil))
446463 else 0
447- if ((whalePart == whalePart))
464+ if ((regPart == regPart))
448465 then {
449- let total = (whalePart + regPart)
450- let toLp = invoke(viresVestedUsdnLpDapp, "mintTo", [address], [AttachedPayment(fromBase58String(usdnAssetId), total)])
451- if ((toLp == toLp))
452- then $Tuple2(nil, total)
466+ let whalePart = if ((whaleAmt > 0))
467+ then asInt(invoke(usdnVesting, "partialWithdrawVestedForTo", [address, toString(this), whaleAmt], nil))
468+ else 0
469+ if ((whalePart == whalePart))
470+ then {
471+ let total = (whalePart + regPart)
472+ let toLp = invoke(viresVestedUsdnLpDapp, "mintTo", [address], [AttachedPayment(fromBase58String(usdnAssetId), total)])
473+ if ((toLp == toLp))
474+ then $Tuple2([changeBy(mintTodayGlobalLimitStore, -(total))], total)
475+ else throw("Strict value is not equal to itself.")
476+ }
453477 else throw("Strict value is not equal to itself.")
454478 }
455479 else throw("Strict value is not equal to itself.")
456480 }
457- else throw("Strict value is not equal to itself.")
458481 }
459482
460483
461484
462485 @Callable(i)
463-func importLP () = {
464- let address = toString(i.caller)
465- let usdnAmt = asInt(invoke(viresVestedUsdnLpDapp, "import", nil, i.payments))
466- if ((usdnAmt == usdnAmt))
467- then {
468- let accountFor = invoke(usdnVestingAll, "accountFor", [address], [AttachedPayment(fromBase58String(usdnAssetId), usdnAmt)])
469- if ((accountFor == accountFor))
470- then $Tuple2(nil, usdnAmt)
471- else throw("Strict value is not equal to itself.")
472- }
473- else throw("Strict value is not equal to itself.")
474- }
486+func importLP () = if ((importTodayGlobalLimit == 0))
487+ then throw(("Daily import limit: 0 of " + toString(importDailyGlobalLimit)))
488+ else {
489+ let address = toString(i.caller)
490+ let paymentAmt = i.payments[0].amount
491+ let lpAssetId = i.payments[0].assetId
492+ let $t01315413512 = if ((paymentAmt > importTodayGlobalLimit))
493+ then $Tuple3(AttachedPayment(lpAssetId, importTodayGlobalLimit), [ScriptTransfer(i.caller, (paymentAmt - importTodayGlobalLimit), lpAssetId)], 0)
494+ else $Tuple3(i.payments[0], nil, (importTodayGlobalLimit - paymentAmt))
495+ let payment = $t01315413512._1
496+ let change = $t01315413512._2
497+ let newLimit = $t01315413512._3
498+ let usdnAmt = asInt(invoke(viresVestedUsdnLpDapp, "import", nil, [payment]))
499+ if ((usdnAmt == usdnAmt))
500+ then {
501+ let accountFor = invoke(usdnVestingAll, "accountFor", [address], [AttachedPayment(fromBase58String(usdnAssetId), usdnAmt)])
502+ if ((accountFor == accountFor))
503+ then $Tuple2(IntegerEntry(importTodayGlobalLimitStore, newLimit) :: change, usdnAmt)
504+ else throw("Strict value is not equal to itself.")
505+ }
506+ else throw("Strict value is not equal to itself.")
507+ }
475508
476509
477510 @Verifier(tx)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let factorsBase = 1000
55
66 func writeConstString (key,value) = if (!(isDefined(getString(this, key))))
77 then StringEntry(key, value)
88 else throw(("already initialized: " + key))
99
1010
1111 func writeConstInt (key,value) = if (!(isDefined(getInteger(this, key))))
1212 then IntegerEntry(key, value)
1313 else throw(("already initialized: " + key))
1414
1515
1616 func writeInt (key,value) = if ((0 > value))
1717 then throw(((("writing negative value " + toString(value)) + " for key ") + key))
1818 else IntegerEntry(key, value)
1919
2020
2121 func asString (value) = match value {
2222 case s: String =>
2323 s
2424 case _ =>
2525 throw("wrong type, expected: String")
2626 }
2727
2828
2929 func asInt (value) = match value {
3030 case int: Int =>
3131 int
3232 case _ =>
3333 throw("sm:1")
3434 }
3535
3636
3737 func asInt2 (value) = match value {
3838 case x: (Int, Int) =>
3939 x
4040 case t =>
4141 throw("wrong type, expected: Int2")
4242 }
4343
4444
4545 func asUserBalanceData (value) = match value {
4646 case x: (Int, Int, Int, Int, Int, Boolean) =>
4747 x
4848 case t =>
4949 throw("3")
5050 }
5151
5252
5353 func userBalance (rsr,user) = asUserBalanceData(invoke(rsr, "userBalance", [user], nil))
5454
5555
5656 func throwIf (condition,error) = if (condition)
5757 then throw(error)
5858 else true
5959
6060
6161 func changeBy (key,value) = writeInt(key, (valueOrElse(getInteger(this, key), 0) + value))
6262
6363
6464 let configStore = "config"
6565
6666 let configAddress = addressFromStringValue(getStringValue(this, configStore))
6767
6868 let viresVestedUsdnLpDapp = addressFromStringValue("3PJFu8MmVa2rSVGM48wdLm4jhLznEgu6XSe")
6969
7070 let maybeOracleAddress = match getString(configAddress, "oracle_address") {
7171 case s: String =>
7272 addressFromString(s)
7373 case _ =>
7474 unit
7575 }
7676
7777 let HEIGHT = height
7878
7979 let vd = addressFromStringValue(valueOrErrorMessage(getString(configAddress, "vires_distributor"), "bad vires distributor"))
8080
8181 let protectedReserve = addressFromStringValue(getStringValue(configAddress, "protected_reserve"))
8282
8383 let main1 = addressFromStringValue(getStringValue(this, "main1"))
8484
8585 let usdtReserve = addressFromStringValue(getStringValue(this, "usdtReserve"))
8686
8787 let usdcReserve = addressFromStringValue(getStringValue(this, "usdcReserve"))
8888
8989 let acc = getStringValue(this, "acc")
9090
9191 let usdnVestingAll = addressFromStringValue(getStringValue(this, "usdnVestingAll"))
9292
9393 let usdnVesting = addressFromStringValue(getStringValue(this, "usdnVesting"))
9494
9595 let usdnAssetId = getStringValue(this, "usdnAssetId")
9696
9797 let usdnBonus = getIntegerValue(this, "bonus")
9898
9999 func moveStream (rsr,action,from,string,amt) = invoke(vd, "move", [rsr, action, from, string, amt], nil)
100100
101101
102102 func opAllowed (op,assetIdStr) = match invoke(configAddress, "opAllowed", [assetIdStr, op], nil) {
103103 case b: Boolean =>
104104 if (b)
105105 then true
106106 else throw("not allowed")
107107 case _ =>
108108 throw("opAllowed: unexpected result type")
109109 }
110110
111111
112112 func mainOnly (i) = if (contains(getStringValue(configAddress, "main"), toString(i.caller)))
113113 then true
114114 else throw("only main can do")
115115
116116
117117 func adviseUser (acc) = {
118118 let dataWhale = asString(invoke(usdnVesting, "adviseU", [acc], nil))
119119 if ((dataWhale == dataWhale))
120120 then {
121121 let dataAll = asString(invoke(usdnVestingAll, "adviseU", [acc], nil))
122122 if ((dataAll == dataAll))
123123 then ((dataWhale + " | ") + dataAll)
124124 else throw("Strict value is not equal to itself.")
125125 }
126126 else throw("Strict value is not equal to itself.")
127127 }
128128
129129
130130 let surfAddress = addressFromStringValue("3PG2vMhK5CPqsCDodvLGzQ84QkoHXCJ3oNP")
131131
132132 let surfStakeAddress = addressFromStringValue("3PBiotFpqjRMkkeFBccnQNUXUopy7KFez5C")
133133
134134 let surfAssetId = fromBase58String("At8D6NFFpheCbvKVnjVoeLL84Eo8NZn6ovManxfLaFWL")
135135
136136 let oracle = Address(base58'3PKkojKdd6BBzTf1RXbQVfUDraNFXXHKzQF')
137137
138138 let xtnPrice = getIntegerValue(oracle, "%s%s__price__USDN-USDT")
139139
140140 func buySurf (caller,whale,regular) = {
141141 let address = toString(caller)
142142 let regPart = if (regular)
143143 then asInt(invoke(usdnVestingAll, "withdrawAllVestedForTo", [address, toString(this)], nil))
144144 else 0
145145 if ((regPart == regPart))
146146 then {
147147 let whalePart = if (whale)
148148 then throw("not implemented")
149149 else 0
150150 if ((whalePart == whalePart))
151151 then {
152152 let total = (whalePart + regPart)
153153 let buy = invoke(surfAddress, "buySurf", [1000000, 1000000, false], [AttachedPayment(fromBase58String(usdnAssetId), total)])
154154 if ((buy == buy))
155155 then assetBalance(this, surfAssetId)
156156 else throw("Strict value is not equal to itself.")
157157 }
158158 else throw("Strict value is not equal to itself.")
159159 }
160160 else throw("Strict value is not equal to itself.")
161161 }
162162
163163
164164 let reservesStr = valueOrErrorMessage(getString(configAddress, "primary_reserves"), "no reserves registered")
165165
166166 func vlR (r) = if (contains(reservesStr, r))
167167 then valueOrErrorMessage(addressFromString(r), "main: bad rsr")
168168 else throw(("unknown rsr:" + r))
169169
170170
171171 func startVestingForInternal (address,rsr,amount) = {
172172 let r = vlR(rsr)
173173 if ((r == r))
174174 then {
175175 let reserve = addressFromStringValue(rsr)
176176 let assetId = getStringValue(reserve, "assetId")
177177 let mw = invoke(usdnVesting, "startVestingAllFor", [address], nil)
178178 if ((mw == mw))
179179 then {
180180 let checks = opAllowed("openCollateral", assetId)
181181 if ((checks == checks))
182182 then {
183183 let s3 = asInt(invoke(reserve, "transferATokensAmountFor", [address, acc, amount], nil))
184184 if ((s3 == s3))
185185 then {
186186 let xtnAmt = {
187187 let reserveVestingRate = getInteger(configAddress, (rsr + "_to_vesting_value"))
188188 if (isDefined(reserveVestingRate))
189189 then fraction(s3, value(reserveVestingRate), factorsBase)
190190 else {
191191 let usd = asInt(invoke(reserve, "toUSD", [s3], nil))
192192 fraction(usd, 1000000, xtnPrice)
193193 }
194194 }
195195 let rehab = {
196196 let wd = invoke(protectedReserve, "withdrawToMain2", [acc, usdnAssetId, xtnAmt], nil)
197197 if ((wd == wd))
198198 then {
199199 let rehab = invoke(usdnVestingAll, "accountFor", [address], [AttachedPayment(fromBase58String(usdnAssetId), xtnAmt)])
200200 if ((rehab == rehab))
201201 then unit
202202 else throw("Strict value is not equal to itself.")
203203 }
204204 else throw("Strict value is not equal to itself.")
205205 }
206206 if ((rehab == rehab))
207207 then {
208208 let $t058505912 = asInt2(invoke(main1, "healthOf", [address], nil))
209209 let bp = $t058505912._1
210210 let bpu = $t058505912._2
211211 if ((bp > (100 * (bp - bpu))))
212212 then throw("not enough address health after move: < 1%")
213213 else $Tuple2([changeBy(((address + "_migrated_") + assetId), s3)], xtnAmt)
214214 }
215215 else throw("Strict value is not equal to itself.")
216216 }
217217 else throw("Strict value is not equal to itself.")
218218 }
219219 else throw("Strict value is not equal to itself.")
220220 }
221221 else throw("Strict value is not equal to itself.")
222222 }
223223 else throw("Strict value is not equal to itself.")
224224 }
225225
226226
227+let mintDailyGlobalLimit = valueOrElse(getInteger(configAddress, (toString(this) + "_mint_daily_global_limit")), 100000000000)
228+
229+let mintTodayGlobalLimitStore = (toString(fraction(HEIGHT, 1, (60 * 24))) + "_mint_global_limit")
230+
231+let mintTodayGlobalLimit = valueOrElse(getInteger(mintTodayGlobalLimitStore), mintDailyGlobalLimit)
232+
233+let importDailyGlobalLimit = valueOrElse(getInteger(configAddress, (toString(this) + "_import_daily_global_limit")), 100000000000)
234+
235+let importTodayGlobalLimitStore = (toString(fraction(HEIGHT, 1, (60 * 24))) + "_import_global_limit")
236+
237+let importTodayGlobalLimit = valueOrElse(getInteger(importTodayGlobalLimitStore), importDailyGlobalLimit)
238+
227239 @Callable(i)
228240 func init (conf,t,c,vestnAll,account,main,usdnAsset,bonus,vestn) = if ((i.caller != this))
229241 then throw("only self can init")
230242 else [writeConstString(configStore, conf), writeConstString("usdtReserve", t), writeConstString("usdcReserve", c), writeConstString("usdnVestingAll", vestnAll), writeConstString("usdnVesting", vestn), writeConstString("acc", account), writeConstString("main1", main), writeConstString("usdnAssetId", usdnAsset), IntegerEntry("bonus", bonus)]
231243
232244
233245
234246 @Callable(i)
235247 func startVestingFor (address,rsr,amount) = {
236248 let m = mainOnly(i)
237249 if ((m == m))
238250 then startVestingForInternal(address, rsr, amount)
239251 else throw("Strict value is not equal to itself.")
240252 }
241253
242254
243255
244256 @Callable(i)
245257 func startVesting (rsr,amount) = startVestingForInternal(toString(i.caller), rsr, amount)
246258
247259
248260
249261 @Callable(i)
250262 func convertToUSDN () = {
251263 let address = toString(i.caller)
252264 func moveRsr (rsr) = {
253265 let reserve = addressFromStringValue(rsr)
254266 let assetId = getStringValue(reserve, "assetId")
255267 let checks = opAllowed("openCollateral", assetId)
256268 if ((checks == checks))
257269 then if (if ((rsr != toString(usdtReserve)))
258270 then (rsr != toString(usdcReserve))
259271 else false)
260272 then throw("invalid reserve")
261273 else {
262274 let shC = invoke(vd, "syncHeight", [rsr], nil)
263275 if ((shC == shC))
264276 then {
265- let $t074537537 = asInt2(invoke(reserve, "storedDepositBorrow", nil, nil))
266- let totalDeposit = $t074537537._1
267- let totalDebt = $t074537537._2
277+ let $t081308214 = asInt2(invoke(reserve, "storedDepositBorrow", nil, nil))
278+ let totalDeposit = $t081308214._1
279+ let totalDebt = $t081308214._2
268280 let util = if ((totalDeposit > 0))
269281 then min([factorsBase, fraction(totalDebt, factorsBase, totalDeposit)])
270282 else 0
271283 let utilThreshold = valueOrElse(getInteger(configAddress, (assetId + "_open_collateral_thresold")), 1000)
272284 if ((utilThreshold > util))
273285 then throw("not allowed: util < threshold")
274286 else {
275287 let dep = asInt(invoke(reserve, "userDepositUSD", [address], nil))
276288 if ((dep == dep))
277289 then {
278290 let s3 = asInt(invoke(reserve, "transferATokensFor", [address, acc, dep], nil))
279291 if ((s3 == s3))
280292 then {
281293 let pRw3 = moveStream(rsr, "deposit", address, acc, s3)
282294 if ((pRw3 == pRw3))
283295 then s3
284296 else throw("Strict value is not equal to itself.")
285297 }
286298 else throw("Strict value is not equal to itself.")
287299 }
288300 else throw("Strict value is not equal to itself.")
289301 }
290302 }
291303 else throw("Strict value is not equal to itself.")
292304 }
293305 else throw("Strict value is not equal to itself.")
294306 }
295307
296308 let mw = invoke(usdnVesting, "startVestingAllFor", [toString(i.caller)], nil)
297309 if ((mw == mw))
298310 then {
299311 let mt = asInt(moveRsr(toString(usdtReserve)))
300312 if ((mt == mt))
301313 then {
302314 let mc = asInt(moveRsr(toString(usdcReserve)))
303315 if ((mc == mc))
304316 then {
305317 let depTotal = (mt + mc)
306318 let rehab = {
307319 let usdnAmt = fraction(depTotal, (factorsBase + usdnBonus), factorsBase)
308320 let wd = invoke(protectedReserve, "withdrawToMain2", [acc, usdnAssetId, usdnAmt], nil)
309321 if ((wd == wd))
310322 then {
311323 let rehab = invoke(usdnVestingAll, "accountFor", [address], [AttachedPayment(fromBase58String(usdnAssetId), usdnAmt)])
312324 if ((rehab == rehab))
313325 then unit
314326 else throw("Strict value is not equal to itself.")
315327 }
316328 else throw("Strict value is not equal to itself.")
317329 }
318330 if ((rehab == rehab))
319331 then {
320- let $t086918753 = asInt2(invoke(main1, "healthOf", [address], nil))
321- let bp = $t086918753._1
322- let bpu = $t086918753._2
332+ let $t093689430 = asInt2(invoke(main1, "healthOf", [address], nil))
333+ let bp = $t093689430._1
334+ let bpu = $t093689430._2
323335 if ((bp > (100 * (bp - bpu))))
324336 then throw("not enough address health after move: < 1%")
325337 else [changeBy(((address + "_migrated_") + getStringValue(usdtReserve, "assetId")), mt), changeBy(((address + "_migrated_") + getStringValue(usdcReserve, "assetId")), mc)]
326338 }
327339 else throw("Strict value is not equal to itself.")
328340 }
329341 else throw("Strict value is not equal to itself.")
330342 }
331343 else throw("Strict value is not equal to itself.")
332344 }
333345 else throw("Strict value is not equal to itself.")
334346 }
335347
336348
337349
338350 @Callable(i)
339351 func withdrawVestedAllUSDN (whale,regular) = {
340352 let address = toString(i.caller)
341353 let regPart = if (regular)
342354 then asInt(invoke(usdnVestingAll, "withdrawVestedForTo", [address, address], nil))
343355 else 0
344356 if ((regPart == regPart))
345357 then {
346358 let whalePart = if (whale)
347359 then asInt(invoke(usdnVesting, "withdrawVestedForTo", [address, address], nil))
348360 else 0
349361 if ((whalePart == whalePart))
350362 then $Tuple2(nil, (whalePart + regPart))
351363 else throw("Strict value is not equal to itself.")
352364 }
353365 else throw("Strict value is not equal to itself.")
354366 }
355367
356368
357369
358370 @Callable(i)
359371 func withdrawVestedAllSURF (whale,regular) = {
360372 let checks = opAllowed("liquidao_all_withdrawVestedAsSurf", toBase58String(surfAssetId))
361373 if ((checks == checks))
362374 then {
363375 let surfBalance = buySurf(i.caller, whale, regular)
364376 if ((surfBalance == surfBalance))
365377 then $Tuple2([ScriptTransfer(i.caller, surfBalance, surfAssetId)], surfBalance)
366378 else throw("Strict value is not equal to itself.")
367379 }
368380 else throw("Strict value is not equal to itself.")
369381 }
370382
371383
372384
373385 @Callable(i)
374386 func withdrawVestedSURF2 (whale,regular,stake) = {
375387 let address = toString(i.caller)
376388 let checks = opAllowed("liquidao_all_withdrawVestedAsSurf", toBase58String(surfAssetId))
377389 if ((checks == checks))
378390 then {
379391 let regPart = if ((regular > 0))
380392 then asInt(invoke(usdnVestingAll, "partialWithdrawVestedForTo", [address, toString(this), regular], nil))
381393 else 0
382394 if ((regPart == regPart))
383395 then {
384396 let whalePart = if ((whale > 0))
385397 then asInt(invoke(usdnVesting, "partialWithdrawVestedForTo", [address, toString(this), whale], nil))
386398 else 0
387399 if ((whalePart == whalePart))
388400 then {
389401 let total = (whalePart + regPart)
390402 let buy = invoke(surfAddress, "buySurf", [1000000, 1000000, false], [AttachedPayment(fromBase58String(usdnAssetId), total)])
391403 if ((buy == buy))
392404 then {
393405 let surfBalance = assetBalance(this, surfAssetId)
394406 if ((surfBalance == surfBalance))
395407 then if (stake)
396408 then {
397409 let stakeSurf = invoke(surfStakeAddress, "stakeByOriginCaller", nil, [AttachedPayment(surfAssetId, surfBalance)])
398410 if ((stakeSurf == stakeSurf))
399411 then $Tuple2(nil, surfBalance)
400412 else throw("Strict value is not equal to itself.")
401413 }
402414 else $Tuple2([ScriptTransfer(i.caller, surfBalance, surfAssetId)], surfBalance)
403415 else throw("Strict value is not equal to itself.")
404416 }
405417 else throw("Strict value is not equal to itself.")
406418 }
407419 else throw("Strict value is not equal to itself.")
408420 }
409421 else throw("Strict value is not equal to itself.")
410422 }
411423 else throw("Strict value is not equal to itself.")
412424 }
413425
414426
415427
416428 @Callable(i)
417429 func withdrawVestedAllSURFAndStake (whale,regular) = {
418430 let checks = opAllowed("liquidao_all_withdrawVestedAsSurf", toBase58String(surfAssetId))
419431 if ((checks == checks))
420432 then {
421433 let surfBalance = buySurf(i.caller, whale, regular)
422434 if ((surfBalance == surfBalance))
423435 then {
424436 let stakeSurf = invoke(surfStakeAddress, "stakeByOriginCaller", nil, [AttachedPayment(surfAssetId, surfBalance)])
425437 if ((stakeSurf == stakeSurf))
426438 then $Tuple2(nil, surfBalance)
427439 else throw("Strict value is not equal to itself.")
428440 }
429441 else throw("Strict value is not equal to itself.")
430442 }
431443 else throw("Strict value is not equal to itself.")
432444 }
433445
434446
435447
436448 @Callable(i)
437449 func withdrawAsLP (whale,regular) = {
438450 let address = toString(i.caller)
439- let regPart = if ((regular > 0))
440- then asInt(invoke(usdnVestingAll, "partialWithdrawVestedForTo", [address, toString(this), regular], nil))
441- else 0
442- if ((regPart == regPart))
443- then {
444- let whalePart = if ((whale > 0))
445- then asInt(invoke(usdnVesting, "partialWithdrawVestedForTo", [address, toString(this), whale], nil))
451+ if ((mintTodayGlobalLimit == 0))
452+ then throw(("Daily export limit: 0 of " + toString(mintDailyGlobalLimit)))
453+ else {
454+ let $t01206412318 = if ((regular > mintTodayGlobalLimit))
455+ then $Tuple2(mintTodayGlobalLimit, 0)
456+ else if (((whale + regular) > mintTodayGlobalLimit))
457+ then $Tuple2(regular, (mintTodayGlobalLimit - regular))
458+ else $Tuple2(regular, whale)
459+ let regularAmt = $t01206412318._1
460+ let whaleAmt = $t01206412318._2
461+ let regPart = if ((regularAmt > 0))
462+ then asInt(invoke(usdnVestingAll, "partialWithdrawVestedForTo", [address, toString(this), regularAmt], nil))
446463 else 0
447- if ((whalePart == whalePart))
464+ if ((regPart == regPart))
448465 then {
449- let total = (whalePart + regPart)
450- let toLp = invoke(viresVestedUsdnLpDapp, "mintTo", [address], [AttachedPayment(fromBase58String(usdnAssetId), total)])
451- if ((toLp == toLp))
452- then $Tuple2(nil, total)
466+ let whalePart = if ((whaleAmt > 0))
467+ then asInt(invoke(usdnVesting, "partialWithdrawVestedForTo", [address, toString(this), whaleAmt], nil))
468+ else 0
469+ if ((whalePart == whalePart))
470+ then {
471+ let total = (whalePart + regPart)
472+ let toLp = invoke(viresVestedUsdnLpDapp, "mintTo", [address], [AttachedPayment(fromBase58String(usdnAssetId), total)])
473+ if ((toLp == toLp))
474+ then $Tuple2([changeBy(mintTodayGlobalLimitStore, -(total))], total)
475+ else throw("Strict value is not equal to itself.")
476+ }
453477 else throw("Strict value is not equal to itself.")
454478 }
455479 else throw("Strict value is not equal to itself.")
456480 }
457- else throw("Strict value is not equal to itself.")
458481 }
459482
460483
461484
462485 @Callable(i)
463-func importLP () = {
464- let address = toString(i.caller)
465- let usdnAmt = asInt(invoke(viresVestedUsdnLpDapp, "import", nil, i.payments))
466- if ((usdnAmt == usdnAmt))
467- then {
468- let accountFor = invoke(usdnVestingAll, "accountFor", [address], [AttachedPayment(fromBase58String(usdnAssetId), usdnAmt)])
469- if ((accountFor == accountFor))
470- then $Tuple2(nil, usdnAmt)
471- else throw("Strict value is not equal to itself.")
472- }
473- else throw("Strict value is not equal to itself.")
474- }
486+func importLP () = if ((importTodayGlobalLimit == 0))
487+ then throw(("Daily import limit: 0 of " + toString(importDailyGlobalLimit)))
488+ else {
489+ let address = toString(i.caller)
490+ let paymentAmt = i.payments[0].amount
491+ let lpAssetId = i.payments[0].assetId
492+ let $t01315413512 = if ((paymentAmt > importTodayGlobalLimit))
493+ then $Tuple3(AttachedPayment(lpAssetId, importTodayGlobalLimit), [ScriptTransfer(i.caller, (paymentAmt - importTodayGlobalLimit), lpAssetId)], 0)
494+ else $Tuple3(i.payments[0], nil, (importTodayGlobalLimit - paymentAmt))
495+ let payment = $t01315413512._1
496+ let change = $t01315413512._2
497+ let newLimit = $t01315413512._3
498+ let usdnAmt = asInt(invoke(viresVestedUsdnLpDapp, "import", nil, [payment]))
499+ if ((usdnAmt == usdnAmt))
500+ then {
501+ let accountFor = invoke(usdnVestingAll, "accountFor", [address], [AttachedPayment(fromBase58String(usdnAssetId), usdnAmt)])
502+ if ((accountFor == accountFor))
503+ then $Tuple2(IntegerEntry(importTodayGlobalLimitStore, newLimit) :: change, usdnAmt)
504+ else throw("Strict value is not equal to itself.")
505+ }
506+ else throw("Strict value is not equal to itself.")
507+ }
475508
476509
477510 @Verifier(tx)
478511 func verify () = {
479512 let BASE = 1000
480513 let quorumRatio = valueOrErrorMessage(getInteger(configAddress, "proposal_quorum_ratio"), "proposalQuorumRatio is not defined")
481514 let passedRatio = valueOrErrorMessage(getInteger(configAddress, "proposal_passed_ratio"), "proposalThresholdRatio is not defined")
482515 let gViresContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "dividends_contract"), "no dividends_contract")), "invalid dividends_contract")
483516 let votingContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "voting_contract"), "no voting_contract")), "invalid voting_contract")
484517 let id = toBase58String(tx.id)
485518 let votesYes = valueOrElse(getInteger(votingContract, ("proposal_yes_" + id)), 0)
486519 let votesNo = valueOrElse(getInteger(votingContract, ("proposal_no_" + id)), 0)
487520 let proposalHeight = valueOrErrorMessage(getInteger(votingContract, ("proposal_height_" + id)), "proposal not registered")
488521 let applyStart = valueOrElse(getInteger(votingContract, ("proposal_applystart_" + id)), 0)
489522 let applyEnd = valueOrElse(getInteger(votingContract, ("proposal_applyend_" + id)), 0)
490523 let totalGVires = valueOrElse(getInteger(votingContract, ("proposal_gvires_" + id)), 0)
491524 let enabled = valueOrElse(getBoolean(configAddress, "op_governance_apply_tx_paused"), false)
492525 let voteYes = votesYes
493526 let voteNo = votesNo
494527 let totalVotes = (voteYes + voteNo)
495528 let hasQuorum = (((totalVotes * BASE) / totalGVires) >= quorumRatio)
496529 let hasPassed = (((voteYes * BASE) / totalVotes) >= passedRatio)
497530 let tooEarly = (applyStart >= HEIGHT)
498531 let tooLate = (HEIGHT >= applyEnd)
499532 let timeDebug = ((((((("proposalHeight = " + toString(proposalHeight)) + ", applyStart = ") + toString(applyStart)) + ", applyEnd = ") + toString(applyEnd)) + ", HEIGHT = ") + toString(HEIGHT))
500533 let byVoting = if (!(enabled))
501534 then throw("tx application throw governance not enabled")
502535 else if (tooEarly)
503536 then throw(("proposal can't be executed as it's too early: " + timeDebug))
504537 else if (tooLate)
505538 then throw(("proposal can't be executed as it's too late:" + timeDebug))
506539 else if (!(hasQuorum))
507540 then throw((((((("no quorum: " + "totalVotes: ") + toString(totalVotes)) + ", totalGVires: ") + toString(totalGVires)) + ", quorumRatio: ") + toString(quorumRatio)))
508541 else if (!(hasPassed))
509542 then throw((((((("no threshold achieved: " + "voteYes: ") + toString(voteYes)) + ", voteNo: ") + toString(voteNo)) + ", passedRatio: ") + toString(passedRatio)))
510543 else true
511544 if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
512545 then true
513546 else byVoting
514547 }
515548

github/deemru/w8io/6500d08 
63.96 ms