tx · 66UbN1LgjD8AvTDFcmY5Rp7gCWdgN21pZEw1ior5we7e

3PCbvPVQfSvVu88ip8Fm5YjwJhjEYk1Txhk:  -0.01900000 Waves

2023.10.18 22:37 [3870313] smart account 3PCbvPVQfSvVu88ip8Fm5YjwJhjEYk1Txhk > SELF 0.00000000 Waves

{ "type": 13, "id": "66UbN1LgjD8AvTDFcmY5Rp7gCWdgN21pZEw1ior5we7e", "fee": 1900000, "feeAssetId": null, "timestamp": 1697657723588, "version": 1, "sender": "3PCbvPVQfSvVu88ip8Fm5YjwJhjEYk1Txhk", "senderPublicKey": "FwXAX9xcWiwbCejtdF8q1Nz8NpJqaVxXKnKK6JoR24pZ", "proofs": [ "4T59jfhJ1XbXXFCVSvG2rQ5ZinyLmY5Zwuiww6SAwjQautnXfcH355hbJ7aTfj45PvZpSeZpmAHpMaFruz6MVpR2" ], "script": "base64:BgI/CAISCwoJCAgICAgICAEIEgUKAwgIARIECgIIARIAEgQKAgQEEgQKAgQEEgUKAwEBBBIECgIEBBIECgIBARIAJwALZmFjdG9yc0Jhc2UA6AcBEHdyaXRlQ29uc3RTdHJpbmcCA2tleQV2YWx1ZQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwUDa2V5CQELU3RyaW5nRW50cnkCBQNrZXkFBXZhbHVlCQACAQkArAICAhVhbHJlYWR5IGluaXRpYWxpemVkOiAFA2tleQENd3JpdGVDb25zdEludAIDa2V5BXZhbHVlAwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzBQNrZXkJAQxJbnRlZ2VyRW50cnkCBQNrZXkFBXZhbHVlCQACAQkArAICAhVhbHJlYWR5IGluaXRpYWxpemVkOiAFA2tleQEId3JpdGVJbnQCA2tleQV2YWx1ZQMJAGYCAAAFBXZhbHVlCQACAQkArAICCQCsAgIJAKwCAgIXd3JpdGluZyBuZWdhdGl2ZSB2YWx1ZSAJAKQDAQUFdmFsdWUCCSBmb3Iga2V5IAUDa2V5CQEMSW50ZWdlckVudHJ5AgUDa2V5BQV2YWx1ZQEIYXNTdHJpbmcBBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAFAXMJAAIBAhx3cm9uZyB0eXBlLCBleHBlY3RlZDogU3RyaW5nAQVhc0ludAEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACA0ludAQDaW50BQckbWF0Y2gwBQNpbnQJAAIBAgRzbToxAQZhc0ludDIBBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAgooSW50LCBJbnQpBAF4BQckbWF0Y2gwBQF4BAF0BQckbWF0Y2gwCQACAQIad3JvbmcgdHlwZSwgZXhwZWN0ZWQ6IEludDIBEWFzVXNlckJhbGFuY2VEYXRhAQV2YWx1ZQQHJG1hdGNoMAUFdmFsdWUDCQABAgUHJG1hdGNoMAIiKEludCwgSW50LCBJbnQsIEludCwgSW50LCBCb29sZWFuKQQBeAUHJG1hdGNoMAUBeAQBdAUHJG1hdGNoMAkAAgECATMBC3VzZXJCYWxhbmNlAgNyc3IEdXNlcgkBEWFzVXNlckJhbGFuY2VEYXRhAQkA/AcEBQNyc3ICC3VzZXJCYWxhbmNlCQDMCAIFBHVzZXIFA25pbAUDbmlsAQd0aHJvd0lmAgljb25kaXRpb24FZXJyb3IDBQljb25kaXRpb24JAAIBBQVlcnJvcgYBCGNoYW5nZUJ5AgNrZXkFdmFsdWUJAQh3cml0ZUludAIFA2tleQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUDa2V5AAAFBXZhbHVlAAtjb25maWdTdG9yZQIGY29uZmlnAA1jb25maWdBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzBQtjb25maWdTdG9yZQAVdmlyZXNWZXN0ZWRVc2RuTHBEYXBwCQERQGV4dHJOYXRpdmUoMTA2MikBAiMzUEpGdThNbVZhMnJTVkdNNDh3ZExtNGpoTHpuRWd1NlhTZQASbWF5YmVPcmFjbGVBZGRyZXNzBAckbWF0Y2gwCQCdCAIFDWNvbmZpZ0FkZHJlc3MCDm9yYWNsZV9hZGRyZXNzAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkApggBBQFzBQR1bml0AAZIRUlHSFQFBmhlaWdodAACdmQJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ1jb25maWdBZGRyZXNzAhF2aXJlc19kaXN0cmlidXRvcgIVYmFkIHZpcmVzIGRpc3RyaWJ1dG9yABBwcm90ZWN0ZWRSZXNlcnZlCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQ1jb25maWdBZGRyZXNzAhFwcm90ZWN0ZWRfcmVzZXJ2ZQAFbWFpbjEJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMCBW1haW4xAAt1c2R0UmVzZXJ2ZQkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwILdXNkdFJlc2VydmUAC3VzZGNSZXNlcnZlCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzAgt1c2RjUmVzZXJ2ZQADYWNjCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzAgNhY2MADnVzZG5WZXN0aW5nQWxsCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzAg51c2RuVmVzdGluZ0FsbAALdXNkblZlc3RpbmcJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMCC3VzZG5WZXN0aW5nAAt1c2RuQXNzZXRJZAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwILdXNkbkFzc2V0SWQACXVzZG5Cb251cwkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwIFYm9udXMBCm1vdmVTdHJlYW0FA3JzcgZhY3Rpb24EZnJvbQZzdHJpbmcDYW10CQD8BwQFAnZkAgRtb3ZlCQDMCAIFA3JzcgkAzAgCBQZhY3Rpb24JAMwIAgUEZnJvbQkAzAgCBQZzdHJpbmcJAMwIAgUDYW10BQNuaWwFA25pbAEJb3BBbGxvd2VkAgJvcAphc3NldElkU3RyBAckbWF0Y2gwCQD8BwQFDWNvbmZpZ0FkZHJlc3MCCW9wQWxsb3dlZAkAzAgCBQphc3NldElkU3RyCQDMCAIFAm9wBQNuaWwFA25pbAMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFiBQckbWF0Y2gwAwUBYgYJAAIBAgtub3QgYWxsb3dlZAkAAgECIW9wQWxsb3dlZDogdW5leHBlY3RlZCByZXN1bHQgdHlwZQEIbWFpbk9ubHkBAWkDCQEIY29udGFpbnMCCQERQGV4dHJOYXRpdmUoMTA1MykCBQ1jb25maWdBZGRyZXNzAgRtYWluCQClCAEIBQFpBmNhbGxlcgYJAAIBAhBvbmx5IG1haW4gY2FuIGRvAQphZHZpc2VVc2VyAQNhY2MECWRhdGFXaGFsZQkBCGFzU3RyaW5nAQkA/AcEBQt1c2RuVmVzdGluZwIHYWR2aXNlVQkAzAgCBQNhY2MFA25pbAUDbmlsAwkAAAIFCWRhdGFXaGFsZQUJZGF0YVdoYWxlBAdkYXRhQWxsCQEIYXNTdHJpbmcBCQD8BwQFDnVzZG5WZXN0aW5nQWxsAgdhZHZpc2VVCQDMCAIFA2FjYwUDbmlsBQNuaWwDCQAAAgUHZGF0YUFsbAUHZGF0YUFsbAkArAICCQCsAgIFCWRhdGFXaGFsZQIDIHwgBQdkYXRhQWxsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAtzdXJmQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQIjM1BHMnZNaEs1Q1Bxc0NEb2R2TEd6UTg0UWtvSFhDSjNvTlAAEHN1cmZTdGFrZUFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQECIzNQQmlvdEZwcWpSTWtrZUZCY2NuUU5VWFVvcHk3S0ZlejVDAAtzdXJmQXNzZXRJZAkA2QQBAixBdDhENk5GRnBoZUNidktWbmpWb2VMTDg0RW84TlpuNm92TWFueGZMYUZXTAAGb3JhY2xlCQEHQWRkcmVzcwEBGgFXw4nuidFTWhQUZTvI/d/0hIb99hEAq5RYAAh4dG5QcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUGb3JhY2xlAhYlcyVzX19wcmljZV9fVVNETi1VU0RUAQdidXlTdXJmAwZjYWxsZXIFd2hhbGUHcmVndWxhcgQHYWRkcmVzcwkApQgBBQZjYWxsZXIEB3JlZ1BhcnQDBQdyZWd1bGFyCQEFYXNJbnQBCQD8BwQFDnVzZG5WZXN0aW5nQWxsAhZ3aXRoZHJhd0FsbFZlc3RlZEZvclRvCQDMCAIFB2FkZHJlc3MJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAAAAwkAAAIFB3JlZ1BhcnQFB3JlZ1BhcnQECXdoYWxlUGFydAMFBXdoYWxlCQACAQIPbm90IGltcGxlbWVudGVkAAADCQAAAgUJd2hhbGVQYXJ0BQl3aGFsZVBhcnQEBXRvdGFsCQBkAgUJd2hhbGVQYXJ0BQdyZWdQYXJ0BANidXkJAPwHBAULc3VyZkFkZHJlc3MCB2J1eVN1cmYJAMwIAgDAhD0JAMwIAgDAhD0JAMwIAgcFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBBQt1c2RuQXNzZXRJZAUFdG90YWwFA25pbAMJAAACBQNidXkFA2J1eQkA8AcCBQR0aGlzBQtzdXJmQXNzZXRJZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgALcmVzZXJ2ZXNTdHIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ1jb25maWdBZGRyZXNzAhBwcmltYXJ5X3Jlc2VydmVzAhZubyByZXNlcnZlcyByZWdpc3RlcmVkAQN2bFIBAXIDCQEIY29udGFpbnMCBQtyZXNlcnZlc1N0cgUBcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFAXICDW1haW46IGJhZCByc3IJAAIBCQCsAgICDHVua25vd24gcnNyOgUBcgEXc3RhcnRWZXN0aW5nRm9ySW50ZXJuYWwDB2FkZHJlc3MDcnNyBmFtb3VudAQBcgkBA3ZsUgEFA3JzcgMJAAACBQFyBQFyBAdyZXNlcnZlCQERQGV4dHJOYXRpdmUoMTA2MikBBQNyc3IEB2Fzc2V0SWQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFB3Jlc2VydmUCB2Fzc2V0SWQEAm13CQD8BwQFC3VzZG5WZXN0aW5nAhJzdGFydFZlc3RpbmdBbGxGb3IJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwDCQAAAgUCbXcFAm13BAZjaGVja3MJAQlvcEFsbG93ZWQCAg5vcGVuQ29sbGF0ZXJhbAUHYXNzZXRJZAMJAAACBQZjaGVja3MFBmNoZWNrcwQCczMJAQVhc0ludAEJAPwHBAUHcmVzZXJ2ZQIYdHJhbnNmZXJBVG9rZW5zQW1vdW50Rm9yCQDMCAIFB2FkZHJlc3MJAMwIAgUDYWNjCQDMCAIFBmFtb3VudAUDbmlsBQNuaWwDCQAAAgUCczMFAnMzBAZ4dG5BbXQEEnJlc2VydmVWZXN0aW5nUmF0ZQkAmggCBQ1jb25maWdBZGRyZXNzCQCsAgIFA3JzcgIRX3RvX3Zlc3RpbmdfdmFsdWUDCQEJaXNEZWZpbmVkAQUScmVzZXJ2ZVZlc3RpbmdSYXRlCQBrAwUCczMJAQV2YWx1ZQEFEnJlc2VydmVWZXN0aW5nUmF0ZQULZmFjdG9yc0Jhc2UEA3VzZAkBBWFzSW50AQkA/AcEBQdyZXNlcnZlAgV0b1VTRAkAzAgCBQJzMwUDbmlsBQNuaWwJAGsDBQN1c2QAwIQ9BQh4dG5QcmljZQQFcmVoYWIEAndkCQD8BwQFEHByb3RlY3RlZFJlc2VydmUCD3dpdGhkcmF3VG9NYWluMgkAzAgCBQNhY2MJAMwIAgULdXNkbkFzc2V0SWQJAMwIAgUGeHRuQW10BQNuaWwFA25pbAMJAAACBQJ3ZAUCd2QEBXJlaGFiCQD8BwQFDnVzZG5WZXN0aW5nQWxsAgphY2NvdW50Rm9yCQDMCAIFB2FkZHJlc3MFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBBQt1c2RuQXNzZXRJZAUGeHRuQW10BQNuaWwDCQAAAgUFcmVoYWIFBXJlaGFiBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXJlaGFiBQVyZWhhYgQLJHQwNTg1MDU5MTIJAQZhc0ludDIBCQD8BwQFBW1haW4xAghoZWFsdGhPZgkAzAgCBQdhZGRyZXNzBQNuaWwFA25pbAQCYnAIBQskdDA1ODUwNTkxMgJfMQQDYnB1CAULJHQwNTg1MDU5MTICXzIDCQBmAgUCYnAJAGgCAGQJAGUCBQJicAUDYnB1CQACAQIqbm90IGVub3VnaCBhZGRyZXNzIGhlYWx0aCBhZnRlciBtb3ZlOiA8IDElCQCUCgIJAMwIAgkBCGNoYW5nZUJ5AgkArAICCQCsAgIFB2FkZHJlc3MCCl9taWdyYXRlZF8FB2Fzc2V0SWQFAnMzBQNuaWwFBnh0bkFtdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgoBaQEEaW5pdAkEY29uZgF0AWMIdmVzdG5BbGwHYWNjb3VudARtYWluCXVzZG5Bc3NldAVib251cwV2ZXN0bgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEm9ubHkgc2VsZiBjYW4gaW5pdAkAzAgCCQEQd3JpdGVDb25zdFN0cmluZwIFC2NvbmZpZ1N0b3JlBQRjb25mCQDMCAIJARB3cml0ZUNvbnN0U3RyaW5nAgILdXNkdFJlc2VydmUFAXQJAMwIAgkBEHdyaXRlQ29uc3RTdHJpbmcCAgt1c2RjUmVzZXJ2ZQUBYwkAzAgCCQEQd3JpdGVDb25zdFN0cmluZwICDnVzZG5WZXN0aW5nQWxsBQh2ZXN0bkFsbAkAzAgCCQEQd3JpdGVDb25zdFN0cmluZwICC3VzZG5WZXN0aW5nBQV2ZXN0bgkAzAgCCQEQd3JpdGVDb25zdFN0cmluZwICA2FjYwUHYWNjb3VudAkAzAgCCQEQd3JpdGVDb25zdFN0cmluZwICBW1haW4xBQRtYWluCQDMCAIJARB3cml0ZUNvbnN0U3RyaW5nAgILdXNkbkFzc2V0SWQFCXVzZG5Bc3NldAkAzAgCCQEMSW50ZWdlckVudHJ5AgIFYm9udXMFBWJvbnVzBQNuaWwBaQEPc3RhcnRWZXN0aW5nRm9yAwdhZGRyZXNzA3JzcgZhbW91bnQEAW0JAQhtYWluT25seQEFAWkDCQAAAgUBbQUBbQkBF3N0YXJ0VmVzdGluZ0ZvckludGVybmFsAwUHYWRkcmVzcwUDcnNyBQZhbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEMc3RhcnRWZXN0aW5nAgNyc3IGYW1vdW50CQEXc3RhcnRWZXN0aW5nRm9ySW50ZXJuYWwDCQClCAEIBQFpBmNhbGxlcgUDcnNyBQZhbW91bnQBaQENY29udmVydFRvVVNETgAEB2FkZHJlc3MJAKUIAQgFAWkGY2FsbGVyCgEHbW92ZVJzcgEDcnNyBAdyZXNlcnZlCQERQGV4dHJOYXRpdmUoMTA2MikBBQNyc3IEB2Fzc2V0SWQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFB3Jlc2VydmUCB2Fzc2V0SWQEBmNoZWNrcwkBCW9wQWxsb3dlZAICDm9wZW5Db2xsYXRlcmFsBQdhc3NldElkAwkAAAIFBmNoZWNrcwUGY2hlY2tzAwMJAQIhPQIFA3JzcgkApQgBBQt1c2R0UmVzZXJ2ZQkBAiE9AgUDcnNyCQClCAEFC3VzZGNSZXNlcnZlBwkAAgECD2ludmFsaWQgcmVzZXJ2ZQQDc2hDCQD8BwQFAnZkAgpzeW5jSGVpZ2h0CQDMCAIFA3JzcgUDbmlsBQNuaWwDCQAAAgUDc2hDBQNzaEMECyR0MDc0NTM3NTM3CQEGYXNJbnQyAQkA/AcEBQdyZXNlcnZlAhNzdG9yZWREZXBvc2l0Qm9ycm93BQNuaWwFA25pbAQMdG90YWxEZXBvc2l0CAULJHQwNzQ1Mzc1MzcCXzEECXRvdGFsRGVidAgFCyR0MDc0NTM3NTM3Al8yBAR1dGlsAwkAZgIFDHRvdGFsRGVwb3NpdAAACQCXAwEJAMwIAgULZmFjdG9yc0Jhc2UJAMwIAgkAawMFCXRvdGFsRGVidAULZmFjdG9yc0Jhc2UFDHRvdGFsRGVwb3NpdAUDbmlsAAAEDXV0aWxUaHJlc2hvbGQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUNY29uZmlnQWRkcmVzcwkArAICBQdhc3NldElkAhlfb3Blbl9jb2xsYXRlcmFsX3RocmVzb2xkAOgHAwkAZgIFDXV0aWxUaHJlc2hvbGQFBHV0aWwJAAIBAh1ub3QgYWxsb3dlZDogdXRpbCA8IHRocmVzaG9sZAQDZGVwCQEFYXNJbnQBCQD8BwQFB3Jlc2VydmUCDnVzZXJEZXBvc2l0VVNECQDMCAIFB2FkZHJlc3MFA25pbAUDbmlsAwkAAAIFA2RlcAUDZGVwBAJzMwkBBWFzSW50AQkA/AcEBQdyZXNlcnZlAhJ0cmFuc2ZlckFUb2tlbnNGb3IJAMwIAgUHYWRkcmVzcwkAzAgCBQNhY2MJAMwIAgUDZGVwBQNuaWwFA25pbAMJAAACBQJzMwUCczMEBHBSdzMJAQptb3ZlU3RyZWFtBQUDcnNyAgdkZXBvc2l0BQdhZGRyZXNzBQNhY2MFAnMzAwkAAAIFBHBSdzMFBHBSdzMFAnMzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAJtdwkA/AcEBQt1c2RuVmVzdGluZwISc3RhcnRWZXN0aW5nQWxsRm9yCQDMCAIJAKUIAQgFAWkGY2FsbGVyBQNuaWwFA25pbAMJAAACBQJtdwUCbXcEAm10CQEFYXNJbnQBCQEHbW92ZVJzcgEJAKUIAQULdXNkdFJlc2VydmUDCQAAAgUCbXQFAm10BAJtYwkBBWFzSW50AQkBB21vdmVSc3IBCQClCAEFC3VzZGNSZXNlcnZlAwkAAAIFAm1jBQJtYwQIZGVwVG90YWwJAGQCBQJtdAUCbWMEBXJlaGFiBAd1c2RuQW10CQBrAwUIZGVwVG90YWwJAGQCBQtmYWN0b3JzQmFzZQUJdXNkbkJvbnVzBQtmYWN0b3JzQmFzZQQCd2QJAPwHBAUQcHJvdGVjdGVkUmVzZXJ2ZQIPd2l0aGRyYXdUb01haW4yCQDMCAIFA2FjYwkAzAgCBQt1c2RuQXNzZXRJZAkAzAgCBQd1c2RuQW10BQNuaWwFA25pbAMJAAACBQJ3ZAUCd2QEBXJlaGFiCQD8BwQFDnVzZG5WZXN0aW5nQWxsAgphY2NvdW50Rm9yCQDMCAIFB2FkZHJlc3MFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBBQt1c2RuQXNzZXRJZAUHdXNkbkFtdAUDbmlsAwkAAAIFBXJlaGFiBQVyZWhhYgUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQVyZWhhYgUFcmVoYWIECyR0MDg2OTE4NzUzCQEGYXNJbnQyAQkA/AcEBQVtYWluMQIIaGVhbHRoT2YJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwEAmJwCAULJHQwODY5MTg3NTMCXzEEA2JwdQgFCyR0MDg2OTE4NzUzAl8yAwkAZgIFAmJwCQBoAgBkCQBlAgUCYnAFA2JwdQkAAgECKm5vdCBlbm91Z2ggYWRkcmVzcyBoZWFsdGggYWZ0ZXIgbW92ZTogPCAxJQkAzAgCCQEIY2hhbmdlQnkCCQCsAgIJAKwCAgUHYWRkcmVzcwIKX21pZ3JhdGVkXwkBEUBleHRyTmF0aXZlKDEwNTMpAgULdXNkdFJlc2VydmUCB2Fzc2V0SWQFAm10CQDMCAIJAQhjaGFuZ2VCeQIJAKwCAgkArAICBQdhZGRyZXNzAgpfbWlncmF0ZWRfCQERQGV4dHJOYXRpdmUoMTA1MykCBQt1c2RjUmVzZXJ2ZQIHYXNzZXRJZAUCbWMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARV3aXRoZHJhd1Zlc3RlZEFsbFVTRE4CBXdoYWxlB3JlZ3VsYXIEB2FkZHJlc3MJAKUIAQgFAWkGY2FsbGVyBAdyZWdQYXJ0AwUHcmVndWxhcgkBBWFzSW50AQkA/AcEBQ51c2RuVmVzdGluZ0FsbAITd2l0aGRyYXdWZXN0ZWRGb3JUbwkAzAgCBQdhZGRyZXNzCQDMCAIFB2FkZHJlc3MFA25pbAUDbmlsAAADCQAAAgUHcmVnUGFydAUHcmVnUGFydAQJd2hhbGVQYXJ0AwUFd2hhbGUJAQVhc0ludAEJAPwHBAULdXNkblZlc3RpbmcCE3dpdGhkcmF3VmVzdGVkRm9yVG8JAMwIAgUHYWRkcmVzcwkAzAgCBQdhZGRyZXNzBQNuaWwFA25pbAAAAwkAAAIFCXdoYWxlUGFydAUJd2hhbGVQYXJ0CQCUCgIFA25pbAkAZAIFCXdoYWxlUGFydAUHcmVnUGFydAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARV3aXRoZHJhd1Zlc3RlZEFsbFNVUkYCBXdoYWxlB3JlZ3VsYXIEBmNoZWNrcwkBCW9wQWxsb3dlZAICIWxpcXVpZGFvX2FsbF93aXRoZHJhd1Zlc3RlZEFzU3VyZgkA2AQBBQtzdXJmQXNzZXRJZAMJAAACBQZjaGVja3MFBmNoZWNrcwQLc3VyZkJhbGFuY2UJAQdidXlTdXJmAwgFAWkGY2FsbGVyBQV3aGFsZQUHcmVndWxhcgMJAAACBQtzdXJmQmFsYW5jZQULc3VyZkJhbGFuY2UJAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC3N1cmZCYWxhbmNlBQtzdXJmQXNzZXRJZAUDbmlsBQtzdXJmQmFsYW5jZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARN3aXRoZHJhd1Zlc3RlZFNVUkYyAwV3aGFsZQdyZWd1bGFyBXN0YWtlBAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgQGY2hlY2tzCQEJb3BBbGxvd2VkAgIhbGlxdWlkYW9fYWxsX3dpdGhkcmF3VmVzdGVkQXNTdXJmCQDYBAEFC3N1cmZBc3NldElkAwkAAAIFBmNoZWNrcwUGY2hlY2tzBAdyZWdQYXJ0AwkAZgIFB3JlZ3VsYXIAAAkBBWFzSW50AQkA/AcEBQ51c2RuVmVzdGluZ0FsbAIacGFydGlhbFdpdGhkcmF3VmVzdGVkRm9yVG8JAMwIAgUHYWRkcmVzcwkAzAgCCQClCAEFBHRoaXMJAMwIAgUHcmVndWxhcgUDbmlsBQNuaWwAAAMJAAACBQdyZWdQYXJ0BQdyZWdQYXJ0BAl3aGFsZVBhcnQDCQBmAgUFd2hhbGUAAAkBBWFzSW50AQkA/AcEBQt1c2RuVmVzdGluZwIacGFydGlhbFdpdGhkcmF3VmVzdGVkRm9yVG8JAMwIAgUHYWRkcmVzcwkAzAgCCQClCAEFBHRoaXMJAMwIAgUFd2hhbGUFA25pbAUDbmlsAAADCQAAAgUJd2hhbGVQYXJ0BQl3aGFsZVBhcnQEBXRvdGFsCQBkAgUJd2hhbGVQYXJ0BQdyZWdQYXJ0BANidXkJAPwHBAULc3VyZkFkZHJlc3MCB2J1eVN1cmYJAMwIAgDAhD0JAMwIAgDAhD0JAMwIAgcFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBBQt1c2RuQXNzZXRJZAUFdG90YWwFA25pbAMJAAACBQNidXkFA2J1eQQLc3VyZkJhbGFuY2UJAPAHAgUEdGhpcwULc3VyZkFzc2V0SWQDCQAAAgULc3VyZkJhbGFuY2UFC3N1cmZCYWxhbmNlAwUFc3Rha2UECXN0YWtlU3VyZgkA/AcEBRBzdXJmU3Rha2VBZGRyZXNzAhNzdGFrZUJ5T3JpZ2luQ2FsbGVyBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFC3N1cmZBc3NldElkBQtzdXJmQmFsYW5jZQUDbmlsAwkAAAIFCXN0YWtlU3VyZgUJc3Rha2VTdXJmCQCUCgIFA25pbAULc3VyZkJhbGFuY2UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC3N1cmZCYWxhbmNlBQtzdXJmQXNzZXRJZAUDbmlsBQtzdXJmQmFsYW5jZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAR13aXRoZHJhd1Zlc3RlZEFsbFNVUkZBbmRTdGFrZQIFd2hhbGUHcmVndWxhcgQGY2hlY2tzCQEJb3BBbGxvd2VkAgIhbGlxdWlkYW9fYWxsX3dpdGhkcmF3VmVzdGVkQXNTdXJmCQDYBAEFC3N1cmZBc3NldElkAwkAAAIFBmNoZWNrcwUGY2hlY2tzBAtzdXJmQmFsYW5jZQkBB2J1eVN1cmYDCAUBaQZjYWxsZXIFBXdoYWxlBQdyZWd1bGFyAwkAAAIFC3N1cmZCYWxhbmNlBQtzdXJmQmFsYW5jZQQJc3Rha2VTdXJmCQD8BwQFEHN1cmZTdGFrZUFkZHJlc3MCE3N0YWtlQnlPcmlnaW5DYWxsZXIFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgULc3VyZkFzc2V0SWQFC3N1cmZCYWxhbmNlBQNuaWwDCQAAAgUJc3Rha2VTdXJmBQlzdGFrZVN1cmYJAJQKAgUDbmlsBQtzdXJmQmFsYW5jZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQx3aXRoZHJhd0FzTFACBXdoYWxlB3JlZ3VsYXIEB2FkZHJlc3MJAKUIAQgFAWkGY2FsbGVyBAdyZWdQYXJ0AwkAZgIFB3JlZ3VsYXIAAAkBBWFzSW50AQkA/AcEBQ51c2RuVmVzdGluZ0FsbAIacGFydGlhbFdpdGhkcmF3VmVzdGVkRm9yVG8JAMwIAgUHYWRkcmVzcwkAzAgCCQClCAEFBHRoaXMJAMwIAgUHcmVndWxhcgUDbmlsBQNuaWwAAAMJAAACBQdyZWdQYXJ0BQdyZWdQYXJ0BAl3aGFsZVBhcnQDCQBmAgUFd2hhbGUAAAkBBWFzSW50AQkA/AcEBQt1c2RuVmVzdGluZwIacGFydGlhbFdpdGhkcmF3VmVzdGVkRm9yVG8JAMwIAgUHYWRkcmVzcwkAzAgCCQClCAEFBHRoaXMJAMwIAgUFd2hhbGUFA25pbAUDbmlsAAADCQAAAgUJd2hhbGVQYXJ0BQl3aGFsZVBhcnQEBXRvdGFsCQBkAgUJd2hhbGVQYXJ0BQdyZWdQYXJ0BAR0b0xwCQD8BwQFFXZpcmVzVmVzdGVkVXNkbkxwRGFwcAIGbWludFRvCQDMCAIFB2FkZHJlc3MFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBBQt1c2RuQXNzZXRJZAUFdG90YWwFA25pbAMJAAACBQR0b0xwBQR0b0xwCQCUCgIFA25pbAUFdG90YWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIaW1wb3J0TFAABAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgQHdXNkbkFtdAkBBWFzSW50AQkA/AcEBRV2aXJlc1Zlc3RlZFVzZG5McERhcHACBmltcG9ydAUDbmlsCAUBaQhwYXltZW50cwMJAAACBQd1c2RuQW10BQd1c2RuQW10BAphY2NvdW50Rm9yCQD8BwQFDnVzZG5WZXN0aW5nQWxsAgphY2NvdW50Rm9yCQDMCAIFB2FkZHJlc3MFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBBQt1c2RuQXNzZXRJZAUHdXNkbkFtdAUDbmlsAwkAAAIFCmFjY291bnRGb3IFCmFjY291bnRGb3IJAJQKAgUDbmlsBQd1c2RuQW10CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQEQkFTRQDoBwQLcXVvcnVtUmF0aW8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ1jb25maWdBZGRyZXNzAhVwcm9wb3NhbF9xdW9ydW1fcmF0aW8CInByb3Bvc2FsUXVvcnVtUmF0aW8gaXMgbm90IGRlZmluZWQEC3Bhc3NlZFJhdGlvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNY29uZmlnQWRkcmVzcwIVcHJvcG9zYWxfcGFzc2VkX3JhdGlvAiVwcm9wb3NhbFRocmVzaG9sZFJhdGlvIGlzIG5vdCBkZWZpbmVkBA5nVmlyZXNDb250cmFjdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ1jb25maWdBZGRyZXNzAhJkaXZpZGVuZHNfY29udHJhY3QCFW5vIGRpdmlkZW5kc19jb250cmFjdAIaaW52YWxpZCBkaXZpZGVuZHNfY29udHJhY3QEDnZvdGluZ0NvbnRyYWN0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCD3ZvdGluZ19jb250cmFjdAISbm8gdm90aW5nX2NvbnRyYWN0AhdpbnZhbGlkIHZvdGluZ19jb250cmFjdAQCaWQJANgEAQgFAnR4AmlkBAh2b3Rlc1llcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ52b3RpbmdDb250cmFjdAkArAICAg1wcm9wb3NhbF95ZXNfBQJpZAAABAd2b3Rlc05vCQELdmFsdWVPckVsc2UCCQCaCAIFDnZvdGluZ0NvbnRyYWN0CQCsAgICDHByb3Bvc2FsX25vXwUCaWQAAAQOcHJvcG9zYWxIZWlnaHQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ52b3RpbmdDb250cmFjdAkArAICAhBwcm9wb3NhbF9oZWlnaHRfBQJpZAIXcHJvcG9zYWwgbm90IHJlZ2lzdGVyZWQECmFwcGx5U3RhcnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUOdm90aW5nQ29udHJhY3QJAKwCAgIUcHJvcG9zYWxfYXBwbHlzdGFydF8FAmlkAAAECGFwcGx5RW5kCQELdmFsdWVPckVsc2UCCQCaCAIFDnZvdGluZ0NvbnRyYWN0CQCsAgICEnByb3Bvc2FsX2FwcGx5ZW5kXwUCaWQAAAQLdG90YWxHVmlyZXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUOdm90aW5nQ29udHJhY3QJAKwCAgIQcHJvcG9zYWxfZ3ZpcmVzXwUCaWQAAAQHZW5hYmxlZAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQ1jb25maWdBZGRyZXNzAh1vcF9nb3Zlcm5hbmNlX2FwcGx5X3R4X3BhdXNlZAcEB3ZvdGVZZXMFCHZvdGVzWWVzBAZ2b3RlTm8FB3ZvdGVzTm8ECnRvdGFsVm90ZXMJAGQCBQd2b3RlWWVzBQZ2b3RlTm8ECWhhc1F1b3J1bQkAZwIJAGkCCQBoAgUKdG90YWxWb3RlcwUEQkFTRQULdG90YWxHVmlyZXMFC3F1b3J1bVJhdGlvBAloYXNQYXNzZWQJAGcCCQBpAgkAaAIFB3ZvdGVZZXMFBEJBU0UFCnRvdGFsVm90ZXMFC3Bhc3NlZFJhdGlvBAh0b29FYXJseQkAZwIFCmFwcGx5U3RhcnQFBkhFSUdIVAQHdG9vTGF0ZQkAZwIFBkhFSUdIVAUIYXBwbHlFbmQECXRpbWVEZWJ1ZwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhFwcm9wb3NhbEhlaWdodCA9IAkApAMBBQ5wcm9wb3NhbEhlaWdodAIPLCBhcHBseVN0YXJ0ID0gCQCkAwEFCmFwcGx5U3RhcnQCDSwgYXBwbHlFbmQgPSAJAKQDAQUIYXBwbHlFbmQCCywgSEVJR0hUID0gCQCkAwEFBkhFSUdIVAQIYnlWb3RpbmcDCQEBIQEFB2VuYWJsZWQJAAIBAit0eCBhcHBsaWNhdGlvbiB0aHJvdyBnb3Zlcm5hbmNlIG5vdCBlbmFibGVkAwUIdG9vRWFybHkJAAIBCQCsAgICLnByb3Bvc2FsIGNhbid0IGJlIGV4ZWN1dGVkIGFzIGl0J3MgdG9vIGVhcmx5OiAFCXRpbWVEZWJ1ZwMFB3Rvb0xhdGUJAAIBCQCsAgICLHByb3Bvc2FsIGNhbid0IGJlIGV4ZWN1dGVkIGFzIGl0J3MgdG9vIGxhdGU6BQl0aW1lRGVidWcDCQEBIQEFCWhhc1F1b3J1bQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICC25vIHF1b3J1bTogAgx0b3RhbFZvdGVzOiAJAKQDAQUKdG90YWxWb3RlcwIPLCB0b3RhbEdWaXJlczogCQCkAwEFC3RvdGFsR1ZpcmVzAg8sIHF1b3J1bVJhdGlvOiAJAKQDAQULcXVvcnVtUmF0aW8DCQEBIQEFCWhhc1Bhc3NlZAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICF25vIHRocmVzaG9sZCBhY2hpZXZlZDogAgl2b3RlWWVzOiAJAKQDAQUHdm90ZVllcwIKLCB2b3RlTm86IAkApAMBBQZ2b3RlTm8CDywgcGFzc2VkUmF0aW86IAkApAMBBQtwYXNzZWRSYXRpbwYDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5BgUIYnlWb3RpbmdLhx+x", "chainId": 87, "height": 3870313, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GpZhgqnBnXpZfY24dPqep3RfhoQGkzMVHzUyD3jAaJLz Next: 5SLH9A3UrhELYYwyeDBcdUD8NVrdfkigin3eYGMgDf2F Diff:
OldNewDifferences
161161 }
162162
163163
164-@Callable(i)
165-func init (conf,t,c,vestnAll,account,main,usdnAsset,bonus,vestn) = if ((i.caller != this))
166- then throw("only self can init")
167- 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)]
164+let reservesStr = valueOrErrorMessage(getString(configAddress, "primary_reserves"), "no reserves registered")
165+
166+func vlR (r) = if (contains(reservesStr, r))
167+ then valueOrErrorMessage(addressFromString(r), "main: bad rsr")
168+ else throw(("unknown rsr:" + r))
168169
169170
170-
171-@Callable(i)
172-func startVestingFor (address,rsr,amount) = {
173- let m = mainOnly(i)
174- if ((m == m))
171+func startVestingForInternal (address,rsr,amount) = {
172+ let r = vlR(rsr)
173+ if ((r == r))
175174 then {
176175 let reserve = addressFromStringValue(rsr)
177176 let assetId = getStringValue(reserve, "assetId")
206205 }
207206 if ((rehab == rehab))
208207 then {
209- let $t061956257 = asInt2(invoke(main1, "healthOf", [address], nil))
210- let bp = $t061956257._1
211- let bpu = $t061956257._2
208+ let $t058505912 = asInt2(invoke(main1, "healthOf", [address], nil))
209+ let bp = $t058505912._1
210+ let bpu = $t058505912._2
212211 if ((bp > (100 * (bp - bpu))))
213212 then throw("not enough address health after move: < 1%")
214213 else $Tuple2([changeBy(((address + "_migrated_") + assetId), s3)], xtnAmt)
223222 }
224223 else throw("Strict value is not equal to itself.")
225224 }
225+
226+
227+@Callable(i)
228+func init (conf,t,c,vestnAll,account,main,usdnAsset,bonus,vestn) = if ((i.caller != this))
229+ then throw("only self can init")
230+ 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)]
231+
232+
233+
234+@Callable(i)
235+func startVestingFor (address,rsr,amount) = {
236+ let m = mainOnly(i)
237+ if ((m == m))
238+ then startVestingForInternal(address, rsr, amount)
239+ else throw("Strict value is not equal to itself.")
240+ }
241+
242+
243+
244+@Callable(i)
245+func startVesting (rsr,amount) = startVestingForInternal(toString(i.caller), rsr, amount)
226246
227247
228248
242262 let shC = invoke(vd, "syncHeight", [rsr], nil)
243263 if ((shC == shC))
244264 then {
245- let $t068856969 = asInt2(invoke(reserve, "storedDepositBorrow", nil, nil))
246- let totalDeposit = $t068856969._1
247- let totalDebt = $t068856969._2
265+ let $t074537537 = asInt2(invoke(reserve, "storedDepositBorrow", nil, nil))
266+ let totalDeposit = $t074537537._1
267+ let totalDebt = $t074537537._2
248268 let util = if ((totalDeposit > 0))
249269 then min([factorsBase, fraction(totalDebt, factorsBase, totalDeposit)])
250270 else 0
297317 }
298318 if ((rehab == rehab))
299319 then {
300- let $t081238185 = asInt2(invoke(main1, "healthOf", [address], nil))
301- let bp = $t081238185._1
302- let bpu = $t081238185._2
320+ let $t086918753 = asInt2(invoke(main1, "healthOf", [address], nil))
321+ let bp = $t086918753._1
322+ let bpu = $t086918753._2
303323 if ((bp > (100 * (bp - bpu))))
304324 then throw("not enough address health after move: < 1%")
305325 else [changeBy(((address + "_migrated_") + getStringValue(usdtReserve, "assetId")), mt), changeBy(((address + "_migrated_") + getStringValue(usdcReserve, "assetId")), mc)]
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
164-@Callable(i)
165-func init (conf,t,c,vestnAll,account,main,usdnAsset,bonus,vestn) = if ((i.caller != this))
166- then throw("only self can init")
167- 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)]
164+let reservesStr = valueOrErrorMessage(getString(configAddress, "primary_reserves"), "no reserves registered")
165+
166+func vlR (r) = if (contains(reservesStr, r))
167+ then valueOrErrorMessage(addressFromString(r), "main: bad rsr")
168+ else throw(("unknown rsr:" + r))
168169
169170
170-
171-@Callable(i)
172-func startVestingFor (address,rsr,amount) = {
173- let m = mainOnly(i)
174- if ((m == m))
171+func startVestingForInternal (address,rsr,amount) = {
172+ let r = vlR(rsr)
173+ if ((r == r))
175174 then {
176175 let reserve = addressFromStringValue(rsr)
177176 let assetId = getStringValue(reserve, "assetId")
178177 let mw = invoke(usdnVesting, "startVestingAllFor", [address], nil)
179178 if ((mw == mw))
180179 then {
181180 let checks = opAllowed("openCollateral", assetId)
182181 if ((checks == checks))
183182 then {
184183 let s3 = asInt(invoke(reserve, "transferATokensAmountFor", [address, acc, amount], nil))
185184 if ((s3 == s3))
186185 then {
187186 let xtnAmt = {
188187 let reserveVestingRate = getInteger(configAddress, (rsr + "_to_vesting_value"))
189188 if (isDefined(reserveVestingRate))
190189 then fraction(s3, value(reserveVestingRate), factorsBase)
191190 else {
192191 let usd = asInt(invoke(reserve, "toUSD", [s3], nil))
193192 fraction(usd, 1000000, xtnPrice)
194193 }
195194 }
196195 let rehab = {
197196 let wd = invoke(protectedReserve, "withdrawToMain2", [acc, usdnAssetId, xtnAmt], nil)
198197 if ((wd == wd))
199198 then {
200199 let rehab = invoke(usdnVestingAll, "accountFor", [address], [AttachedPayment(fromBase58String(usdnAssetId), xtnAmt)])
201200 if ((rehab == rehab))
202201 then unit
203202 else throw("Strict value is not equal to itself.")
204203 }
205204 else throw("Strict value is not equal to itself.")
206205 }
207206 if ((rehab == rehab))
208207 then {
209- let $t061956257 = asInt2(invoke(main1, "healthOf", [address], nil))
210- let bp = $t061956257._1
211- let bpu = $t061956257._2
208+ let $t058505912 = asInt2(invoke(main1, "healthOf", [address], nil))
209+ let bp = $t058505912._1
210+ let bpu = $t058505912._2
212211 if ((bp > (100 * (bp - bpu))))
213212 then throw("not enough address health after move: < 1%")
214213 else $Tuple2([changeBy(((address + "_migrated_") + assetId), s3)], xtnAmt)
215214 }
216215 else throw("Strict value is not equal to itself.")
217216 }
218217 else throw("Strict value is not equal to itself.")
219218 }
220219 else throw("Strict value is not equal to itself.")
221220 }
222221 else throw("Strict value is not equal to itself.")
223222 }
224223 else throw("Strict value is not equal to itself.")
225224 }
225+
226+
227+@Callable(i)
228+func init (conf,t,c,vestnAll,account,main,usdnAsset,bonus,vestn) = if ((i.caller != this))
229+ then throw("only self can init")
230+ 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)]
231+
232+
233+
234+@Callable(i)
235+func startVestingFor (address,rsr,amount) = {
236+ let m = mainOnly(i)
237+ if ((m == m))
238+ then startVestingForInternal(address, rsr, amount)
239+ else throw("Strict value is not equal to itself.")
240+ }
241+
242+
243+
244+@Callable(i)
245+func startVesting (rsr,amount) = startVestingForInternal(toString(i.caller), rsr, amount)
226246
227247
228248
229249 @Callable(i)
230250 func convertToUSDN () = {
231251 let address = toString(i.caller)
232252 func moveRsr (rsr) = {
233253 let reserve = addressFromStringValue(rsr)
234254 let assetId = getStringValue(reserve, "assetId")
235255 let checks = opAllowed("openCollateral", assetId)
236256 if ((checks == checks))
237257 then if (if ((rsr != toString(usdtReserve)))
238258 then (rsr != toString(usdcReserve))
239259 else false)
240260 then throw("invalid reserve")
241261 else {
242262 let shC = invoke(vd, "syncHeight", [rsr], nil)
243263 if ((shC == shC))
244264 then {
245- let $t068856969 = asInt2(invoke(reserve, "storedDepositBorrow", nil, nil))
246- let totalDeposit = $t068856969._1
247- let totalDebt = $t068856969._2
265+ let $t074537537 = asInt2(invoke(reserve, "storedDepositBorrow", nil, nil))
266+ let totalDeposit = $t074537537._1
267+ let totalDebt = $t074537537._2
248268 let util = if ((totalDeposit > 0))
249269 then min([factorsBase, fraction(totalDebt, factorsBase, totalDeposit)])
250270 else 0
251271 let utilThreshold = valueOrElse(getInteger(configAddress, (assetId + "_open_collateral_thresold")), 1000)
252272 if ((utilThreshold > util))
253273 then throw("not allowed: util < threshold")
254274 else {
255275 let dep = asInt(invoke(reserve, "userDepositUSD", [address], nil))
256276 if ((dep == dep))
257277 then {
258278 let s3 = asInt(invoke(reserve, "transferATokensFor", [address, acc, dep], nil))
259279 if ((s3 == s3))
260280 then {
261281 let pRw3 = moveStream(rsr, "deposit", address, acc, s3)
262282 if ((pRw3 == pRw3))
263283 then s3
264284 else throw("Strict value is not equal to itself.")
265285 }
266286 else throw("Strict value is not equal to itself.")
267287 }
268288 else throw("Strict value is not equal to itself.")
269289 }
270290 }
271291 else throw("Strict value is not equal to itself.")
272292 }
273293 else throw("Strict value is not equal to itself.")
274294 }
275295
276296 let mw = invoke(usdnVesting, "startVestingAllFor", [toString(i.caller)], nil)
277297 if ((mw == mw))
278298 then {
279299 let mt = asInt(moveRsr(toString(usdtReserve)))
280300 if ((mt == mt))
281301 then {
282302 let mc = asInt(moveRsr(toString(usdcReserve)))
283303 if ((mc == mc))
284304 then {
285305 let depTotal = (mt + mc)
286306 let rehab = {
287307 let usdnAmt = fraction(depTotal, (factorsBase + usdnBonus), factorsBase)
288308 let wd = invoke(protectedReserve, "withdrawToMain2", [acc, usdnAssetId, usdnAmt], nil)
289309 if ((wd == wd))
290310 then {
291311 let rehab = invoke(usdnVestingAll, "accountFor", [address], [AttachedPayment(fromBase58String(usdnAssetId), usdnAmt)])
292312 if ((rehab == rehab))
293313 then unit
294314 else throw("Strict value is not equal to itself.")
295315 }
296316 else throw("Strict value is not equal to itself.")
297317 }
298318 if ((rehab == rehab))
299319 then {
300- let $t081238185 = asInt2(invoke(main1, "healthOf", [address], nil))
301- let bp = $t081238185._1
302- let bpu = $t081238185._2
320+ let $t086918753 = asInt2(invoke(main1, "healthOf", [address], nil))
321+ let bp = $t086918753._1
322+ let bpu = $t086918753._2
303323 if ((bp > (100 * (bp - bpu))))
304324 then throw("not enough address health after move: < 1%")
305325 else [changeBy(((address + "_migrated_") + getStringValue(usdtReserve, "assetId")), mt), changeBy(((address + "_migrated_") + getStringValue(usdcReserve, "assetId")), mc)]
306326 }
307327 else throw("Strict value is not equal to itself.")
308328 }
309329 else throw("Strict value is not equal to itself.")
310330 }
311331 else throw("Strict value is not equal to itself.")
312332 }
313333 else throw("Strict value is not equal to itself.")
314334 }
315335
316336
317337
318338 @Callable(i)
319339 func withdrawVestedAllUSDN (whale,regular) = {
320340 let address = toString(i.caller)
321341 let regPart = if (regular)
322342 then asInt(invoke(usdnVestingAll, "withdrawVestedForTo", [address, address], nil))
323343 else 0
324344 if ((regPart == regPart))
325345 then {
326346 let whalePart = if (whale)
327347 then asInt(invoke(usdnVesting, "withdrawVestedForTo", [address, address], nil))
328348 else 0
329349 if ((whalePart == whalePart))
330350 then $Tuple2(nil, (whalePart + regPart))
331351 else throw("Strict value is not equal to itself.")
332352 }
333353 else throw("Strict value is not equal to itself.")
334354 }
335355
336356
337357
338358 @Callable(i)
339359 func withdrawVestedAllSURF (whale,regular) = {
340360 let checks = opAllowed("liquidao_all_withdrawVestedAsSurf", toBase58String(surfAssetId))
341361 if ((checks == checks))
342362 then {
343363 let surfBalance = buySurf(i.caller, whale, regular)
344364 if ((surfBalance == surfBalance))
345365 then $Tuple2([ScriptTransfer(i.caller, surfBalance, surfAssetId)], surfBalance)
346366 else throw("Strict value is not equal to itself.")
347367 }
348368 else throw("Strict value is not equal to itself.")
349369 }
350370
351371
352372
353373 @Callable(i)
354374 func withdrawVestedSURF2 (whale,regular,stake) = {
355375 let address = toString(i.caller)
356376 let checks = opAllowed("liquidao_all_withdrawVestedAsSurf", toBase58String(surfAssetId))
357377 if ((checks == checks))
358378 then {
359379 let regPart = if ((regular > 0))
360380 then asInt(invoke(usdnVestingAll, "partialWithdrawVestedForTo", [address, toString(this), regular], nil))
361381 else 0
362382 if ((regPart == regPart))
363383 then {
364384 let whalePart = if ((whale > 0))
365385 then asInt(invoke(usdnVesting, "partialWithdrawVestedForTo", [address, toString(this), whale], nil))
366386 else 0
367387 if ((whalePart == whalePart))
368388 then {
369389 let total = (whalePart + regPart)
370390 let buy = invoke(surfAddress, "buySurf", [1000000, 1000000, false], [AttachedPayment(fromBase58String(usdnAssetId), total)])
371391 if ((buy == buy))
372392 then {
373393 let surfBalance = assetBalance(this, surfAssetId)
374394 if ((surfBalance == surfBalance))
375395 then if (stake)
376396 then {
377397 let stakeSurf = invoke(surfStakeAddress, "stakeByOriginCaller", nil, [AttachedPayment(surfAssetId, surfBalance)])
378398 if ((stakeSurf == stakeSurf))
379399 then $Tuple2(nil, surfBalance)
380400 else throw("Strict value is not equal to itself.")
381401 }
382402 else $Tuple2([ScriptTransfer(i.caller, surfBalance, surfAssetId)], surfBalance)
383403 else throw("Strict value is not equal to itself.")
384404 }
385405 else throw("Strict value is not equal to itself.")
386406 }
387407 else throw("Strict value is not equal to itself.")
388408 }
389409 else throw("Strict value is not equal to itself.")
390410 }
391411 else throw("Strict value is not equal to itself.")
392412 }
393413
394414
395415
396416 @Callable(i)
397417 func withdrawVestedAllSURFAndStake (whale,regular) = {
398418 let checks = opAllowed("liquidao_all_withdrawVestedAsSurf", toBase58String(surfAssetId))
399419 if ((checks == checks))
400420 then {
401421 let surfBalance = buySurf(i.caller, whale, regular)
402422 if ((surfBalance == surfBalance))
403423 then {
404424 let stakeSurf = invoke(surfStakeAddress, "stakeByOriginCaller", nil, [AttachedPayment(surfAssetId, surfBalance)])
405425 if ((stakeSurf == stakeSurf))
406426 then $Tuple2(nil, surfBalance)
407427 else throw("Strict value is not equal to itself.")
408428 }
409429 else throw("Strict value is not equal to itself.")
410430 }
411431 else throw("Strict value is not equal to itself.")
412432 }
413433
414434
415435
416436 @Callable(i)
417437 func withdrawAsLP (whale,regular) = {
418438 let address = toString(i.caller)
419439 let regPart = if ((regular > 0))
420440 then asInt(invoke(usdnVestingAll, "partialWithdrawVestedForTo", [address, toString(this), regular], nil))
421441 else 0
422442 if ((regPart == regPart))
423443 then {
424444 let whalePart = if ((whale > 0))
425445 then asInt(invoke(usdnVesting, "partialWithdrawVestedForTo", [address, toString(this), whale], nil))
426446 else 0
427447 if ((whalePart == whalePart))
428448 then {
429449 let total = (whalePart + regPart)
430450 let toLp = invoke(viresVestedUsdnLpDapp, "mintTo", [address], [AttachedPayment(fromBase58String(usdnAssetId), total)])
431451 if ((toLp == toLp))
432452 then $Tuple2(nil, total)
433453 else throw("Strict value is not equal to itself.")
434454 }
435455 else throw("Strict value is not equal to itself.")
436456 }
437457 else throw("Strict value is not equal to itself.")
438458 }
439459
440460
441461
442462 @Callable(i)
443463 func importLP () = {
444464 let address = toString(i.caller)
445465 let usdnAmt = asInt(invoke(viresVestedUsdnLpDapp, "import", nil, i.payments))
446466 if ((usdnAmt == usdnAmt))
447467 then {
448468 let accountFor = invoke(usdnVestingAll, "accountFor", [address], [AttachedPayment(fromBase58String(usdnAssetId), usdnAmt)])
449469 if ((accountFor == accountFor))
450470 then $Tuple2(nil, usdnAmt)
451471 else throw("Strict value is not equal to itself.")
452472 }
453473 else throw("Strict value is not equal to itself.")
454474 }
455475
456476
457477 @Verifier(tx)
458478 func verify () = {
459479 let BASE = 1000
460480 let quorumRatio = valueOrErrorMessage(getInteger(configAddress, "proposal_quorum_ratio"), "proposalQuorumRatio is not defined")
461481 let passedRatio = valueOrErrorMessage(getInteger(configAddress, "proposal_passed_ratio"), "proposalThresholdRatio is not defined")
462482 let gViresContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "dividends_contract"), "no dividends_contract")), "invalid dividends_contract")
463483 let votingContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "voting_contract"), "no voting_contract")), "invalid voting_contract")
464484 let id = toBase58String(tx.id)
465485 let votesYes = valueOrElse(getInteger(votingContract, ("proposal_yes_" + id)), 0)
466486 let votesNo = valueOrElse(getInteger(votingContract, ("proposal_no_" + id)), 0)
467487 let proposalHeight = valueOrErrorMessage(getInteger(votingContract, ("proposal_height_" + id)), "proposal not registered")
468488 let applyStart = valueOrElse(getInteger(votingContract, ("proposal_applystart_" + id)), 0)
469489 let applyEnd = valueOrElse(getInteger(votingContract, ("proposal_applyend_" + id)), 0)
470490 let totalGVires = valueOrElse(getInteger(votingContract, ("proposal_gvires_" + id)), 0)
471491 let enabled = valueOrElse(getBoolean(configAddress, "op_governance_apply_tx_paused"), false)
472492 let voteYes = votesYes
473493 let voteNo = votesNo
474494 let totalVotes = (voteYes + voteNo)
475495 let hasQuorum = (((totalVotes * BASE) / totalGVires) >= quorumRatio)
476496 let hasPassed = (((voteYes * BASE) / totalVotes) >= passedRatio)
477497 let tooEarly = (applyStart >= HEIGHT)
478498 let tooLate = (HEIGHT >= applyEnd)
479499 let timeDebug = ((((((("proposalHeight = " + toString(proposalHeight)) + ", applyStart = ") + toString(applyStart)) + ", applyEnd = ") + toString(applyEnd)) + ", HEIGHT = ") + toString(HEIGHT))
480500 let byVoting = if (!(enabled))
481501 then throw("tx application throw governance not enabled")
482502 else if (tooEarly)
483503 then throw(("proposal can't be executed as it's too early: " + timeDebug))
484504 else if (tooLate)
485505 then throw(("proposal can't be executed as it's too late:" + timeDebug))
486506 else if (!(hasQuorum))
487507 then throw((((((("no quorum: " + "totalVotes: ") + toString(totalVotes)) + ", totalGVires: ") + toString(totalGVires)) + ", quorumRatio: ") + toString(quorumRatio)))
488508 else if (!(hasPassed))
489509 then throw((((((("no threshold achieved: " + "voteYes: ") + toString(voteYes)) + ", voteNo: ") + toString(voteNo)) + ", passedRatio: ") + toString(passedRatio)))
490510 else true
491511 if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
492512 then true
493513 else byVoting
494514 }
495515

github/deemru/w8io/6500d08 
63.99 ms