tx · 4DPEh5hT3peWGWNUxEd5UXzB2daWLY3Q6ge9tPzvPS2J

3PCbvPVQfSvVu88ip8Fm5YjwJhjEYk1Txhk:  -0.01800000 Waves

2023.10.18 19:22 [3870115] smart account 3PCbvPVQfSvVu88ip8Fm5YjwJhjEYk1Txhk > SELF 0.00000000 Waves

{ "type": 13, "id": "4DPEh5hT3peWGWNUxEd5UXzB2daWLY3Q6ge9tPzvPS2J", "fee": 1800000, "feeAssetId": null, "timestamp": 1697646162474, "version": 1, "sender": "3PCbvPVQfSvVu88ip8Fm5YjwJhjEYk1Txhk", "senderPublicKey": "FwXAX9xcWiwbCejtdF8q1Nz8NpJqaVxXKnKK6JoR24pZ", "proofs": [ "KAJyafFD7eDBiJ77KzEQ1TywZg6Vek3UxQ3Sxks5JfNjshB88SWww7ohHBcBX8BWF2ueRrCUZp1yFWEFfeYhNdW" ], "script": "base64:BgI5CAISCwoJCAgICAgICAEIEgUKAwgIARIAEgQKAgQEEgQKAgQEEgUKAwEBBBIECgIEBBIECgIBARIAJAALZmFjdG9yc0Jhc2UA6AcBEHdyaXRlQ29uc3RTdHJpbmcCA2tleQV2YWx1ZQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwUDa2V5CQELU3RyaW5nRW50cnkCBQNrZXkFBXZhbHVlCQACAQkArAICAhVhbHJlYWR5IGluaXRpYWxpemVkOiAFA2tleQENd3JpdGVDb25zdEludAIDa2V5BXZhbHVlAwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzBQNrZXkJAQxJbnRlZ2VyRW50cnkCBQNrZXkFBXZhbHVlCQACAQkArAICAhVhbHJlYWR5IGluaXRpYWxpemVkOiAFA2tleQEId3JpdGVJbnQCA2tleQV2YWx1ZQMJAGYCAAAFBXZhbHVlCQACAQkArAICCQCsAgIJAKwCAgIXd3JpdGluZyBuZWdhdGl2ZSB2YWx1ZSAJAKQDAQUFdmFsdWUCCSBmb3Iga2V5IAUDa2V5CQEMSW50ZWdlckVudHJ5AgUDa2V5BQV2YWx1ZQEIYXNTdHJpbmcBBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAFAXMJAAIBAhx3cm9uZyB0eXBlLCBleHBlY3RlZDogU3RyaW5nAQVhc0ludAEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACA0ludAQDaW50BQckbWF0Y2gwBQNpbnQJAAIBAgRzbToxAQZhc0ludDIBBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAgooSW50LCBJbnQpBAF4BQckbWF0Y2gwBQF4BAF0BQckbWF0Y2gwCQACAQIad3JvbmcgdHlwZSwgZXhwZWN0ZWQ6IEludDIBEWFzVXNlckJhbGFuY2VEYXRhAQV2YWx1ZQQHJG1hdGNoMAUFdmFsdWUDCQABAgUHJG1hdGNoMAIiKEludCwgSW50LCBJbnQsIEludCwgSW50LCBCb29sZWFuKQQBeAUHJG1hdGNoMAUBeAQBdAUHJG1hdGNoMAkAAgECATMBC3VzZXJCYWxhbmNlAgNyc3IEdXNlcgkBEWFzVXNlckJhbGFuY2VEYXRhAQkA/AcEBQNyc3ICC3VzZXJCYWxhbmNlCQDMCAIFBHVzZXIFA25pbAUDbmlsAQd0aHJvd0lmAgljb25kaXRpb24FZXJyb3IDBQljb25kaXRpb24JAAIBBQVlcnJvcgYBCGNoYW5nZUJ5AgNrZXkFdmFsdWUJAQh3cml0ZUludAIFA2tleQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUDa2V5AAAFBXZhbHVlAAtjb25maWdTdG9yZQIGY29uZmlnAA1jb25maWdBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzBQtjb25maWdTdG9yZQAVdmlyZXNWZXN0ZWRVc2RuTHBEYXBwCQERQGV4dHJOYXRpdmUoMTA2MikBAiMzUEpGdThNbVZhMnJTVkdNNDh3ZExtNGpoTHpuRWd1NlhTZQASbWF5YmVPcmFjbGVBZGRyZXNzBAckbWF0Y2gwCQCdCAIFDWNvbmZpZ0FkZHJlc3MCDm9yYWNsZV9hZGRyZXNzAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkApggBBQFzBQR1bml0AAZIRUlHSFQFBmhlaWdodAACdmQJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ1jb25maWdBZGRyZXNzAhF2aXJlc19kaXN0cmlidXRvcgIVYmFkIHZpcmVzIGRpc3RyaWJ1dG9yABBwcm90ZWN0ZWRSZXNlcnZlCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQ1jb25maWdBZGRyZXNzAhFwcm90ZWN0ZWRfcmVzZXJ2ZQAFbWFpbjEJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMCBW1haW4xAAt1c2R0UmVzZXJ2ZQkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwILdXNkdFJlc2VydmUAC3VzZGNSZXNlcnZlCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzAgt1c2RjUmVzZXJ2ZQADYWNjCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzAgNhY2MADnVzZG5WZXN0aW5nQWxsCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzAg51c2RuVmVzdGluZ0FsbAALdXNkblZlc3RpbmcJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMCC3VzZG5WZXN0aW5nAAt1c2RuQXNzZXRJZAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwILdXNkbkFzc2V0SWQACXVzZG5Cb251cwkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwIFYm9udXMBCm1vdmVTdHJlYW0FA3JzcgZhY3Rpb24EZnJvbQZzdHJpbmcDYW10CQD8BwQFAnZkAgRtb3ZlCQDMCAIFA3JzcgkAzAgCBQZhY3Rpb24JAMwIAgUEZnJvbQkAzAgCBQZzdHJpbmcJAMwIAgUDYW10BQNuaWwFA25pbAEJb3BBbGxvd2VkAgJvcAphc3NldElkU3RyBAckbWF0Y2gwCQD8BwQFDWNvbmZpZ0FkZHJlc3MCCW9wQWxsb3dlZAkAzAgCBQphc3NldElkU3RyCQDMCAIFAm9wBQNuaWwFA25pbAMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFiBQckbWF0Y2gwAwUBYgYJAAIBAgtub3QgYWxsb3dlZAkAAgECIW9wQWxsb3dlZDogdW5leHBlY3RlZCByZXN1bHQgdHlwZQEIbWFpbk9ubHkBAWkDCQEIY29udGFpbnMCCQERQGV4dHJOYXRpdmUoMTA1MykCBQ1jb25maWdBZGRyZXNzAgRtYWluCQClCAEIBQFpBmNhbGxlcgYJAAIBAhBvbmx5IG1haW4gY2FuIGRvAQphZHZpc2VVc2VyAQNhY2MECWRhdGFXaGFsZQkBCGFzU3RyaW5nAQkA/AcEBQt1c2RuVmVzdGluZwIHYWR2aXNlVQkAzAgCBQNhY2MFA25pbAUDbmlsAwkAAAIFCWRhdGFXaGFsZQUJZGF0YVdoYWxlBAdkYXRhQWxsCQEIYXNTdHJpbmcBCQD8BwQFDnVzZG5WZXN0aW5nQWxsAgdhZHZpc2VVCQDMCAIFA2FjYwUDbmlsBQNuaWwDCQAAAgUHZGF0YUFsbAUHZGF0YUFsbAkArAICCQCsAgIFCWRhdGFXaGFsZQIDIHwgBQdkYXRhQWxsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAtzdXJmQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQIjM1BHMnZNaEs1Q1Bxc0NEb2R2TEd6UTg0UWtvSFhDSjNvTlAAEHN1cmZTdGFrZUFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQECIzNQQmlvdEZwcWpSTWtrZUZCY2NuUU5VWFVvcHk3S0ZlejVDAAtzdXJmQXNzZXRJZAkA2QQBAixBdDhENk5GRnBoZUNidktWbmpWb2VMTDg0RW84TlpuNm92TWFueGZMYUZXTAAGb3JhY2xlCQEHQWRkcmVzcwEBGgFXw4nuidFTWhQUZTvI/d/0hIb99hEAq5RYAAh4dG5QcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUGb3JhY2xlAhYlcyVzX19wcmljZV9fVVNETi1VU0RUAQdidXlTdXJmAwZjYWxsZXIFd2hhbGUHcmVndWxhcgQHYWRkcmVzcwkApQgBBQZjYWxsZXIEB3JlZ1BhcnQDBQdyZWd1bGFyCQEFYXNJbnQBCQD8BwQFDnVzZG5WZXN0aW5nQWxsAhZ3aXRoZHJhd0FsbFZlc3RlZEZvclRvCQDMCAIFB2FkZHJlc3MJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAAAAwkAAAIFB3JlZ1BhcnQFB3JlZ1BhcnQECXdoYWxlUGFydAMFBXdoYWxlCQACAQIPbm90IGltcGxlbWVudGVkAAADCQAAAgUJd2hhbGVQYXJ0BQl3aGFsZVBhcnQEBXRvdGFsCQBkAgUJd2hhbGVQYXJ0BQdyZWdQYXJ0BANidXkJAPwHBAULc3VyZkFkZHJlc3MCB2J1eVN1cmYJAMwIAgDAhD0JAMwIAgDAhD0JAMwIAgcFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBBQt1c2RuQXNzZXRJZAUFdG90YWwFA25pbAMJAAACBQNidXkFA2J1eQkA8AcCBQR0aGlzBQtzdXJmQXNzZXRJZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBaQEEaW5pdAkEY29uZgF0AWMIdmVzdG5BbGwHYWNjb3VudARtYWluCXVzZG5Bc3NldAVib251cwV2ZXN0bgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEm9ubHkgc2VsZiBjYW4gaW5pdAkAzAgCCQEQd3JpdGVDb25zdFN0cmluZwIFC2NvbmZpZ1N0b3JlBQRjb25mCQDMCAIJARB3cml0ZUNvbnN0U3RyaW5nAgILdXNkdFJlc2VydmUFAXQJAMwIAgkBEHdyaXRlQ29uc3RTdHJpbmcCAgt1c2RjUmVzZXJ2ZQUBYwkAzAgCCQEQd3JpdGVDb25zdFN0cmluZwICDnVzZG5WZXN0aW5nQWxsBQh2ZXN0bkFsbAkAzAgCCQEQd3JpdGVDb25zdFN0cmluZwICC3VzZG5WZXN0aW5nBQV2ZXN0bgkAzAgCCQEQd3JpdGVDb25zdFN0cmluZwICA2FjYwUHYWNjb3VudAkAzAgCCQEQd3JpdGVDb25zdFN0cmluZwICBW1haW4xBQRtYWluCQDMCAIJARB3cml0ZUNvbnN0U3RyaW5nAgILdXNkbkFzc2V0SWQFCXVzZG5Bc3NldAkAzAgCCQEMSW50ZWdlckVudHJ5AgIFYm9udXMFBWJvbnVzBQNuaWwBaQEPc3RhcnRWZXN0aW5nRm9yAwdhZGRyZXNzA3JzcgZhbW91bnQEAW0JAQhtYWluT25seQEFAWkDCQAAAgUBbQUBbQQHcmVzZXJ2ZQkBEUBleHRyTmF0aXZlKDEwNjIpAQUDcnNyBAdhc3NldElkCQERQGV4dHJOYXRpdmUoMTA1MykCBQdyZXNlcnZlAgdhc3NldElkBAJtdwkA/AcEBQt1c2RuVmVzdGluZwISc3RhcnRWZXN0aW5nQWxsRm9yCQDMCAIFB2FkZHJlc3MFA25pbAUDbmlsAwkAAAIFAm13BQJtdwQGY2hlY2tzCQEJb3BBbGxvd2VkAgIOb3BlbkNvbGxhdGVyYWwFB2Fzc2V0SWQDCQAAAgUGY2hlY2tzBQZjaGVja3MEAnMzCQEFYXNJbnQBCQD8BwQFB3Jlc2VydmUCGHRyYW5zZmVyQVRva2Vuc0Ftb3VudEZvcgkAzAgCBQdhZGRyZXNzCQDMCAIFA2FjYwkAzAgCBQZhbW91bnQFA25pbAUDbmlsAwkAAAIFAnMzBQJzMwQGeHRuQW10BBJyZXNlcnZlVmVzdGluZ1JhdGUJAJoIAgUNY29uZmlnQWRkcmVzcwkArAICBQNyc3ICEV90b192ZXN0aW5nX3ZhbHVlAwkBCWlzRGVmaW5lZAEFEnJlc2VydmVWZXN0aW5nUmF0ZQkAawMFAnMzCQEFdmFsdWUBBRJyZXNlcnZlVmVzdGluZ1JhdGUFC2ZhY3RvcnNCYXNlBAN1c2QJAQVhc0ludAEJAPwHBAUHcmVzZXJ2ZQIFdG9VU0QJAMwIAgUCczMFA25pbAUDbmlsCQBrAwUDdXNkAMCEPQUIeHRuUHJpY2UEBXJlaGFiBAJ3ZAkA/AcEBRBwcm90ZWN0ZWRSZXNlcnZlAg93aXRoZHJhd1RvTWFpbjIJAMwIAgUDYWNjCQDMCAIFC3VzZG5Bc3NldElkCQDMCAIFBnh0bkFtdAUDbmlsBQNuaWwDCQAAAgUCd2QFAndkBAVyZWhhYgkA/AcEBQ51c2RuVmVzdGluZ0FsbAIKYWNjb3VudEZvcgkAzAgCBQdhZGRyZXNzBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQULdXNkbkFzc2V0SWQFBnh0bkFtdAUDbmlsAwkAAAIFBXJlaGFiBQVyZWhhYgUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQVyZWhhYgUFcmVoYWIECyR0MDYxOTU2MjU3CQEGYXNJbnQyAQkA/AcEBQVtYWluMQIIaGVhbHRoT2YJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwEAmJwCAULJHQwNjE5NTYyNTcCXzEEA2JwdQgFCyR0MDYxOTU2MjU3Al8yAwkAZgIFAmJwCQBoAgBkCQBlAgUCYnAFA2JwdQkAAgECKm5vdCBlbm91Z2ggYWRkcmVzcyBoZWFsdGggYWZ0ZXIgbW92ZTogPCAxJQkAzAgCCQEIY2hhbmdlQnkCCQCsAgIJAKwCAgUHYWRkcmVzcwIKX21pZ3JhdGVkXwUHYXNzZXRJZAUCczMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ1jb252ZXJ0VG9VU0ROAAQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIKAQdtb3ZlUnNyAQNyc3IEB3Jlc2VydmUJARFAZXh0ck5hdGl2ZSgxMDYyKQEFA3JzcgQHYXNzZXRJZAkBEUBleHRyTmF0aXZlKDEwNTMpAgUHcmVzZXJ2ZQIHYXNzZXRJZAQGY2hlY2tzCQEJb3BBbGxvd2VkAgIOb3BlbkNvbGxhdGVyYWwFB2Fzc2V0SWQDCQAAAgUGY2hlY2tzBQZjaGVja3MDAwkBAiE9AgUDcnNyCQClCAEFC3VzZHRSZXNlcnZlCQECIT0CBQNyc3IJAKUIAQULdXNkY1Jlc2VydmUHCQACAQIPaW52YWxpZCByZXNlcnZlBANzaEMJAPwHBAUCdmQCCnN5bmNIZWlnaHQJAMwIAgUDcnNyBQNuaWwFA25pbAMJAAACBQNzaEMFA3NoQwQLJHQwNjg2NDY5NDgJAQZhc0ludDIBCQD8BwQFB3Jlc2VydmUCE3N0b3JlZERlcG9zaXRCb3Jyb3cFA25pbAUDbmlsBAx0b3RhbERlcG9zaXQIBQskdDA2ODY0Njk0OAJfMQQJdG90YWxEZWJ0CAULJHQwNjg2NDY5NDgCXzIEBHV0aWwDCQBmAgUMdG90YWxEZXBvc2l0AAAJAJcDAQkAzAgCBQtmYWN0b3JzQmFzZQkAzAgCCQBrAwUJdG90YWxEZWJ0BQtmYWN0b3JzQmFzZQUMdG90YWxEZXBvc2l0BQNuaWwAAAQNdXRpbFRocmVzaG9sZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1jb25maWdBZGRyZXNzCQCsAgIFB2Fzc2V0SWQCGV9vcGVuX2NvbGxhdGVyYWxfdGhyZXNvbGQA6AcDCQBmAgUNdXRpbFRocmVzaG9sZAUEdXRpbAkAAgECHW5vdCBhbGxvd2VkOiB1dGlsIDwgdGhyZXNob2xkBANkZXAJAQVhc0ludAEJAPwHBAUHcmVzZXJ2ZQIOdXNlckRlcG9zaXRVU0QJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwDCQAAAgUDZGVwBQNkZXAEAnMzCQEFYXNJbnQBCQD8BwQFB3Jlc2VydmUCEnRyYW5zZmVyQVRva2Vuc0ZvcgkAzAgCBQdhZGRyZXNzCQDMCAIFA2FjYwkAzAgCBQNkZXAFA25pbAUDbmlsAwkAAAIFAnMzBQJzMwQEcFJ3MwkBCm1vdmVTdHJlYW0FBQNyc3ICB2RlcG9zaXQFB2FkZHJlc3MFA2FjYwUCczMDCQAAAgUEcFJ3MwUEcFJ3MwUCczMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EAm13CQD8BwQFC3VzZG5WZXN0aW5nAhJzdGFydFZlc3RpbmdBbGxGb3IJAMwIAgkApQgBCAUBaQZjYWxsZXIFA25pbAUDbmlsAwkAAAIFAm13BQJtdwQCbXQJAQVhc0ludAEJAQdtb3ZlUnNyAQkApQgBBQt1c2R0UmVzZXJ2ZQMJAAACBQJtdAUCbXQEAm1jCQEFYXNJbnQBCQEHbW92ZVJzcgEJAKUIAQULdXNkY1Jlc2VydmUDCQAAAgUCbWMFAm1jBAhkZXBUb3RhbAkAZAIFAm10BQJtYwQFcmVoYWIEB3VzZG5BbXQJAGsDBQhkZXBUb3RhbAkAZAIFC2ZhY3RvcnNCYXNlBQl1c2RuQm9udXMFC2ZhY3RvcnNCYXNlBAJ3ZAkA/AcEBRBwcm90ZWN0ZWRSZXNlcnZlAg93aXRoZHJhd1RvTWFpbjIJAMwIAgUDYWNjCQDMCAIFC3VzZG5Bc3NldElkCQDMCAIFB3VzZG5BbXQFA25pbAUDbmlsAwkAAAIFAndkBQJ3ZAQFcmVoYWIJAPwHBAUOdXNkblZlc3RpbmdBbGwCCmFjY291bnRGb3IJAMwIAgUHYWRkcmVzcwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEFC3VzZG5Bc3NldElkBQd1c2RuQW10BQNuaWwDCQAAAgUFcmVoYWIFBXJlaGFiBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXJlaGFiBQVyZWhhYgQLJHQwODEwMjgxNjQJAQZhc0ludDIBCQD8BwQFBW1haW4xAghoZWFsdGhPZgkAzAgCBQdhZGRyZXNzBQNuaWwFA25pbAQCYnAIBQskdDA4MTAyODE2NAJfMQQDYnB1CAULJHQwODEwMjgxNjQCXzIDCQBmAgUCYnAJAGgCAGQJAGUCBQJicAUDYnB1CQACAQIqbm90IGVub3VnaCBhZGRyZXNzIGhlYWx0aCBhZnRlciBtb3ZlOiA8IDElCQDMCAIJAQhjaGFuZ2VCeQIJAKwCAgkArAICBQdhZGRyZXNzAgpfbWlncmF0ZWRfCQERQGV4dHJOYXRpdmUoMTA1MykCBQt1c2R0UmVzZXJ2ZQIHYXNzZXRJZAUCbXQJAMwIAgkBCGNoYW5nZUJ5AgkArAICCQCsAgIFB2FkZHJlc3MCCl9taWdyYXRlZF8JARFAZXh0ck5hdGl2ZSgxMDUzKQIFC3VzZGNSZXNlcnZlAgdhc3NldElkBQJtYwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFXdpdGhkcmF3VmVzdGVkQWxsVVNETgIFd2hhbGUHcmVndWxhcgQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEB3JlZ1BhcnQDBQdyZWd1bGFyCQEFYXNJbnQBCQD8BwQFDnVzZG5WZXN0aW5nQWxsAhN3aXRoZHJhd1Zlc3RlZEZvclRvCQDMCAIFB2FkZHJlc3MJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwAAAMJAAACBQdyZWdQYXJ0BQdyZWdQYXJ0BAl3aGFsZVBhcnQDBQV3aGFsZQkBBWFzSW50AQkA/AcEBQt1c2RuVmVzdGluZwITd2l0aGRyYXdWZXN0ZWRGb3JUbwkAzAgCBQdhZGRyZXNzCQDMCAIFB2FkZHJlc3MFA25pbAUDbmlsAAADCQAAAgUJd2hhbGVQYXJ0BQl3aGFsZVBhcnQJAJQKAgUDbmlsCQBkAgUJd2hhbGVQYXJ0BQdyZWdQYXJ0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFXdpdGhkcmF3VmVzdGVkQWxsU1VSRgIFd2hhbGUHcmVndWxhcgQGY2hlY2tzCQEJb3BBbGxvd2VkAgIhbGlxdWlkYW9fYWxsX3dpdGhkcmF3VmVzdGVkQXNTdXJmCQDYBAEFC3N1cmZBc3NldElkAwkAAAIFBmNoZWNrcwUGY2hlY2tzBAtzdXJmQmFsYW5jZQkBB2J1eVN1cmYDCAUBaQZjYWxsZXIFBXdoYWxlBQdyZWd1bGFyAwkAAAIFC3N1cmZCYWxhbmNlBQtzdXJmQmFsYW5jZQkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgULc3VyZkJhbGFuY2UFC3N1cmZBc3NldElkBQNuaWwFC3N1cmZCYWxhbmNlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBE3dpdGhkcmF3VmVzdGVkU1VSRjIDBXdoYWxlB3JlZ3VsYXIFc3Rha2UEB2FkZHJlc3MJAKUIAQgFAWkGY2FsbGVyBAZjaGVja3MJAQlvcEFsbG93ZWQCAiFsaXF1aWRhb19hbGxfd2l0aGRyYXdWZXN0ZWRBc1N1cmYJANgEAQULc3VyZkFzc2V0SWQDCQAAAgUGY2hlY2tzBQZjaGVja3MEB3JlZ1BhcnQDCQBmAgUHcmVndWxhcgAACQEFYXNJbnQBCQD8BwQFDnVzZG5WZXN0aW5nQWxsAhpwYXJ0aWFsV2l0aGRyYXdWZXN0ZWRGb3JUbwkAzAgCBQdhZGRyZXNzCQDMCAIJAKUIAQUEdGhpcwkAzAgCBQdyZWd1bGFyBQNuaWwFA25pbAAAAwkAAAIFB3JlZ1BhcnQFB3JlZ1BhcnQECXdoYWxlUGFydAMJAGYCBQV3aGFsZQAACQEFYXNJbnQBCQD8BwQFC3VzZG5WZXN0aW5nAhpwYXJ0aWFsV2l0aGRyYXdWZXN0ZWRGb3JUbwkAzAgCBQdhZGRyZXNzCQDMCAIJAKUIAQUEdGhpcwkAzAgCBQV3aGFsZQUDbmlsBQNuaWwAAAMJAAACBQl3aGFsZVBhcnQFCXdoYWxlUGFydAQFdG90YWwJAGQCBQl3aGFsZVBhcnQFB3JlZ1BhcnQEA2J1eQkA/AcEBQtzdXJmQWRkcmVzcwIHYnV5U3VyZgkAzAgCAMCEPQkAzAgCAMCEPQkAzAgCBwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEFC3VzZG5Bc3NldElkBQV0b3RhbAUDbmlsAwkAAAIFA2J1eQUDYnV5BAtzdXJmQmFsYW5jZQkA8AcCBQR0aGlzBQtzdXJmQXNzZXRJZAMJAAACBQtzdXJmQmFsYW5jZQULc3VyZkJhbGFuY2UDBQVzdGFrZQQJc3Rha2VTdXJmCQD8BwQFEHN1cmZTdGFrZUFkZHJlc3MCE3N0YWtlQnlPcmlnaW5DYWxsZXIFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgULc3VyZkFzc2V0SWQFC3N1cmZCYWxhbmNlBQNuaWwDCQAAAgUJc3Rha2VTdXJmBQlzdGFrZVN1cmYJAJQKAgUDbmlsBQtzdXJmQmFsYW5jZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgULc3VyZkJhbGFuY2UFC3N1cmZBc3NldElkBQNuaWwFC3N1cmZCYWxhbmNlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBHXdpdGhkcmF3VmVzdGVkQWxsU1VSRkFuZFN0YWtlAgV3aGFsZQdyZWd1bGFyBAZjaGVja3MJAQlvcEFsbG93ZWQCAiFsaXF1aWRhb19hbGxfd2l0aGRyYXdWZXN0ZWRBc1N1cmYJANgEAQULc3VyZkFzc2V0SWQDCQAAAgUGY2hlY2tzBQZjaGVja3MEC3N1cmZCYWxhbmNlCQEHYnV5U3VyZgMIBQFpBmNhbGxlcgUFd2hhbGUFB3JlZ3VsYXIDCQAAAgULc3VyZkJhbGFuY2UFC3N1cmZCYWxhbmNlBAlzdGFrZVN1cmYJAPwHBAUQc3VyZlN0YWtlQWRkcmVzcwITc3Rha2VCeU9yaWdpbkNhbGxlcgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQtzdXJmQXNzZXRJZAULc3VyZkJhbGFuY2UFA25pbAMJAAACBQlzdGFrZVN1cmYFCXN0YWtlU3VyZgkAlAoCBQNuaWwFC3N1cmZCYWxhbmNlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDHdpdGhkcmF3QXNMUAIFd2hhbGUHcmVndWxhcgQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEB3JlZ1BhcnQDCQBmAgUHcmVndWxhcgAACQEFYXNJbnQBCQD8BwQFDnVzZG5WZXN0aW5nQWxsAhpwYXJ0aWFsV2l0aGRyYXdWZXN0ZWRGb3JUbwkAzAgCBQdhZGRyZXNzCQDMCAIJAKUIAQUEdGhpcwkAzAgCBQdyZWd1bGFyBQNuaWwFA25pbAAAAwkAAAIFB3JlZ1BhcnQFB3JlZ1BhcnQECXdoYWxlUGFydAMJAGYCBQV3aGFsZQAACQEFYXNJbnQBCQD8BwQFC3VzZG5WZXN0aW5nAhpwYXJ0aWFsV2l0aGRyYXdWZXN0ZWRGb3JUbwkAzAgCBQdhZGRyZXNzCQDMCAIJAKUIAQUEdGhpcwkAzAgCBQV3aGFsZQUDbmlsBQNuaWwAAAMJAAACBQl3aGFsZVBhcnQFCXdoYWxlUGFydAQFdG90YWwJAGQCBQl3aGFsZVBhcnQFB3JlZ1BhcnQEBHRvTHAJAPwHBAUVdmlyZXNWZXN0ZWRVc2RuTHBEYXBwAgZtaW50VG8JAMwIAgUHYWRkcmVzcwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEFC3VzZG5Bc3NldElkBQV0b3RhbAUDbmlsAwkAAAIFBHRvTHAFBHRvTHAJAJQKAgUDbmlsBQV0b3RhbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhpbXBvcnRMUAAEB2FkZHJlc3MJAKUIAQgFAWkGY2FsbGVyBAd1c2RuQW10CQEFYXNJbnQBCQD8BwQFFXZpcmVzVmVzdGVkVXNkbkxwRGFwcAIGaW1wb3J0BQNuaWwIBQFpCHBheW1lbnRzAwkAAAIFB3VzZG5BbXQFB3VzZG5BbXQECmFjY291bnRGb3IJAPwHBAUOdXNkblZlc3RpbmdBbGwCCmFjY291bnRGb3IJAMwIAgUHYWRkcmVzcwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEFC3VzZG5Bc3NldElkBQd1c2RuQW10BQNuaWwDCQAAAgUKYWNjb3VudEZvcgUKYWNjb3VudEZvcgkAlAoCBQNuaWwFB3VzZG5BbXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABARCQVNFAOgHBAtxdW9ydW1SYXRpbwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDWNvbmZpZ0FkZHJlc3MCFXByb3Bvc2FsX3F1b3J1bV9yYXRpbwIicHJvcG9zYWxRdW9ydW1SYXRpbyBpcyBub3QgZGVmaW5lZAQLcGFzc2VkUmF0aW8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ1jb25maWdBZGRyZXNzAhVwcm9wb3NhbF9wYXNzZWRfcmF0aW8CJXByb3Bvc2FsVGhyZXNob2xkUmF0aW8gaXMgbm90IGRlZmluZWQEDmdWaXJlc0NvbnRyYWN0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCEmRpdmlkZW5kc19jb250cmFjdAIVbm8gZGl2aWRlbmRzX2NvbnRyYWN0AhppbnZhbGlkIGRpdmlkZW5kc19jb250cmFjdAQOdm90aW5nQ29udHJhY3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwIPdm90aW5nX2NvbnRyYWN0AhJubyB2b3RpbmdfY29udHJhY3QCF2ludmFsaWQgdm90aW5nX2NvbnRyYWN0BAJpZAkA2AQBCAUCdHgCaWQECHZvdGVzWWVzCQELdmFsdWVPckVsc2UCCQCaCAIFDnZvdGluZ0NvbnRyYWN0CQCsAgICDXByb3Bvc2FsX3llc18FAmlkAAAEB3ZvdGVzTm8JAQt2YWx1ZU9yRWxzZQIJAJoIAgUOdm90aW5nQ29udHJhY3QJAKwCAgIMcHJvcG9zYWxfbm9fBQJpZAAABA5wcm9wb3NhbEhlaWdodAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDnZvdGluZ0NvbnRyYWN0CQCsAgICEHByb3Bvc2FsX2hlaWdodF8FAmlkAhdwcm9wb3NhbCBub3QgcmVnaXN0ZXJlZAQKYXBwbHlTdGFydAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ52b3RpbmdDb250cmFjdAkArAICAhRwcm9wb3NhbF9hcHBseXN0YXJ0XwUCaWQAAAQIYXBwbHlFbmQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUOdm90aW5nQ29udHJhY3QJAKwCAgIScHJvcG9zYWxfYXBwbHllbmRfBQJpZAAABAt0b3RhbEdWaXJlcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ52b3RpbmdDb250cmFjdAkArAICAhBwcm9wb3NhbF9ndmlyZXNfBQJpZAAABAdlbmFibGVkCQELdmFsdWVPckVsc2UCCQCbCAIFDWNvbmZpZ0FkZHJlc3MCHW9wX2dvdmVybmFuY2VfYXBwbHlfdHhfcGF1c2VkBwQHdm90ZVllcwUIdm90ZXNZZXMEBnZvdGVObwUHdm90ZXNObwQKdG90YWxWb3RlcwkAZAIFB3ZvdGVZZXMFBnZvdGVObwQJaGFzUXVvcnVtCQBnAgkAaQIJAGgCBQp0b3RhbFZvdGVzBQRCQVNFBQt0b3RhbEdWaXJlcwULcXVvcnVtUmF0aW8ECWhhc1Bhc3NlZAkAZwIJAGkCCQBoAgUHdm90ZVllcwUEQkFTRQUKdG90YWxWb3RlcwULcGFzc2VkUmF0aW8ECHRvb0Vhcmx5CQBnAgUKYXBwbHlTdGFydAUGSEVJR0hUBAd0b29MYXRlCQBnAgUGSEVJR0hUBQhhcHBseUVuZAQJdGltZURlYnVnCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICEXByb3Bvc2FsSGVpZ2h0ID0gCQCkAwEFDnByb3Bvc2FsSGVpZ2h0Ag8sIGFwcGx5U3RhcnQgPSAJAKQDAQUKYXBwbHlTdGFydAINLCBhcHBseUVuZCA9IAkApAMBBQhhcHBseUVuZAILLCBIRUlHSFQgPSAJAKQDAQUGSEVJR0hUBAhieVZvdGluZwMJAQEhAQUHZW5hYmxlZAkAAgECK3R4IGFwcGxpY2F0aW9uIHRocm93IGdvdmVybmFuY2Ugbm90IGVuYWJsZWQDBQh0b29FYXJseQkAAgEJAKwCAgIucHJvcG9zYWwgY2FuJ3QgYmUgZXhlY3V0ZWQgYXMgaXQncyB0b28gZWFybHk6IAUJdGltZURlYnVnAwUHdG9vTGF0ZQkAAgEJAKwCAgIscHJvcG9zYWwgY2FuJ3QgYmUgZXhlY3V0ZWQgYXMgaXQncyB0b28gbGF0ZToFCXRpbWVEZWJ1ZwMJAQEhAQUJaGFzUXVvcnVtCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgILbm8gcXVvcnVtOiACDHRvdGFsVm90ZXM6IAkApAMBBQp0b3RhbFZvdGVzAg8sIHRvdGFsR1ZpcmVzOiAJAKQDAQULdG90YWxHVmlyZXMCDywgcXVvcnVtUmF0aW86IAkApAMBBQtxdW9ydW1SYXRpbwMJAQEhAQUJaGFzUGFzc2VkCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIXbm8gdGhyZXNob2xkIGFjaGlldmVkOiACCXZvdGVZZXM6IAkApAMBBQd2b3RlWWVzAgosIHZvdGVObzogCQCkAwEFBnZvdGVObwIPLCBwYXNzZWRSYXRpbzogCQCkAwEFC3Bhc3NlZFJhdGlvBgMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkGBQhieVZvdGluZ9mCSnU=", "chainId": 87, "height": 3870115, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4bVVeqWJeJp2Ki1nJPcMurvpDiHMLUgcmabayyP3wcAc Next: GpZhgqnBnXpZfY24dPqep3RfhoQGkzMVHzUyD3jAaJLz Diff:
OldNewDifferences
133133
134134 let surfAssetId = fromBase58String("At8D6NFFpheCbvKVnjVoeLL84Eo8NZn6ovManxfLaFWL")
135135
136+let oracle = Address(base58'3PKkojKdd6BBzTf1RXbQVfUDraNFXXHKzQF')
137+
138+let xtnPrice = getIntegerValue(oracle, "%s%s__price__USDN-USDT")
139+
136140 func buySurf (caller,whale,regular) = {
137141 let address = toString(caller)
138142 let regPart = if (regular)
177181 let checks = opAllowed("openCollateral", assetId)
178182 if ((checks == checks))
179183 then {
180- let s3 = asInt(invoke(reserve, "transferATokensFor", [address, acc, amount], nil))
184+ let s3 = asInt(invoke(reserve, "transferATokensAmountFor", [address, acc, amount], nil))
181185 if ((s3 == s3))
182186 then {
183- let reserveValue = valueOrErrorMessage(getInteger(configAddress, (rsr + "_to_vesting_value")), "no [reserve]_to_vesting_value")
184- let usdnAmt = fraction(s3, reserveValue, factorsBase)
187+ let xtnAmt = {
188+ let reserveVestingRate = getInteger(configAddress, (rsr + "_to_vesting_value"))
189+ if (isDefined(reserveVestingRate))
190+ then fraction(s3, value(reserveVestingRate), factorsBase)
191+ else {
192+ let usd = asInt(invoke(reserve, "toUSD", [s3], nil))
193+ fraction(usd, 1000000, xtnPrice)
194+ }
195+ }
185196 let rehab = {
186- let wd = invoke(protectedReserve, "withdrawToMain2", [acc, usdnAssetId, usdnAmt], nil)
197+ let wd = invoke(protectedReserve, "withdrawToMain2", [acc, usdnAssetId, xtnAmt], nil)
187198 if ((wd == wd))
188199 then {
189- let rehab = invoke(usdnVestingAll, "accountFor", [address], [AttachedPayment(fromBase58String(usdnAssetId), usdnAmt)])
200+ let rehab = invoke(usdnVestingAll, "accountFor", [address], [AttachedPayment(fromBase58String(usdnAssetId), xtnAmt)])
190201 if ((rehab == rehab))
191202 then unit
192203 else throw("Strict value is not equal to itself.")
195206 }
196207 if ((rehab == rehab))
197208 then {
198- let $t059125974 = asInt2(invoke(main1, "healthOf", [address], nil))
199- let bp = $t059125974._1
200- let bpu = $t059125974._2
209+ let $t061956257 = asInt2(invoke(main1, "healthOf", [address], nil))
210+ let bp = $t061956257._1
211+ let bpu = $t061956257._2
201212 if ((bp > (100 * (bp - bpu))))
202213 then throw("not enough address health after move: < 1%")
203214 else [changeBy(((address + "_migrated_") + assetId), s3)]
231242 let shC = invoke(vd, "syncHeight", [rsr], nil)
232243 if ((shC == shC))
233244 then {
234- let $t065816665 = asInt2(invoke(reserve, "storedDepositBorrow", nil, nil))
235- let totalDeposit = $t065816665._1
236- let totalDebt = $t065816665._2
245+ let $t068646948 = asInt2(invoke(reserve, "storedDepositBorrow", nil, nil))
246+ let totalDeposit = $t068646948._1
247+ let totalDebt = $t068646948._2
237248 let util = if ((totalDeposit > 0))
238249 then min([factorsBase, fraction(totalDebt, factorsBase, totalDeposit)])
239250 else 0
286297 }
287298 if ((rehab == rehab))
288299 then {
289- let $t078197881 = asInt2(invoke(main1, "healthOf", [address], nil))
290- let bp = $t078197881._1
291- let bpu = $t078197881._2
300+ let $t081028164 = asInt2(invoke(main1, "healthOf", [address], nil))
301+ let bp = $t081028164._1
302+ let bpu = $t081028164._2
292303 if ((bp > (100 * (bp - bpu))))
293304 then throw("not enough address health after move: < 1%")
294305 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
136+let oracle = Address(base58'3PKkojKdd6BBzTf1RXbQVfUDraNFXXHKzQF')
137+
138+let xtnPrice = getIntegerValue(oracle, "%s%s__price__USDN-USDT")
139+
136140 func buySurf (caller,whale,regular) = {
137141 let address = toString(caller)
138142 let regPart = if (regular)
139143 then asInt(invoke(usdnVestingAll, "withdrawAllVestedForTo", [address, toString(this)], nil))
140144 else 0
141145 if ((regPart == regPart))
142146 then {
143147 let whalePart = if (whale)
144148 then throw("not implemented")
145149 else 0
146150 if ((whalePart == whalePart))
147151 then {
148152 let total = (whalePart + regPart)
149153 let buy = invoke(surfAddress, "buySurf", [1000000, 1000000, false], [AttachedPayment(fromBase58String(usdnAssetId), total)])
150154 if ((buy == buy))
151155 then assetBalance(this, surfAssetId)
152156 else throw("Strict value is not equal to itself.")
153157 }
154158 else throw("Strict value is not equal to itself.")
155159 }
156160 else throw("Strict value is not equal to itself.")
157161 }
158162
159163
160164 @Callable(i)
161165 func init (conf,t,c,vestnAll,account,main,usdnAsset,bonus,vestn) = if ((i.caller != this))
162166 then throw("only self can init")
163167 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)]
164168
165169
166170
167171 @Callable(i)
168172 func startVestingFor (address,rsr,amount) = {
169173 let m = mainOnly(i)
170174 if ((m == m))
171175 then {
172176 let reserve = addressFromStringValue(rsr)
173177 let assetId = getStringValue(reserve, "assetId")
174178 let mw = invoke(usdnVesting, "startVestingAllFor", [address], nil)
175179 if ((mw == mw))
176180 then {
177181 let checks = opAllowed("openCollateral", assetId)
178182 if ((checks == checks))
179183 then {
180- let s3 = asInt(invoke(reserve, "transferATokensFor", [address, acc, amount], nil))
184+ let s3 = asInt(invoke(reserve, "transferATokensAmountFor", [address, acc, amount], nil))
181185 if ((s3 == s3))
182186 then {
183- let reserveValue = valueOrErrorMessage(getInteger(configAddress, (rsr + "_to_vesting_value")), "no [reserve]_to_vesting_value")
184- let usdnAmt = fraction(s3, reserveValue, factorsBase)
187+ let xtnAmt = {
188+ let reserveVestingRate = getInteger(configAddress, (rsr + "_to_vesting_value"))
189+ if (isDefined(reserveVestingRate))
190+ then fraction(s3, value(reserveVestingRate), factorsBase)
191+ else {
192+ let usd = asInt(invoke(reserve, "toUSD", [s3], nil))
193+ fraction(usd, 1000000, xtnPrice)
194+ }
195+ }
185196 let rehab = {
186- let wd = invoke(protectedReserve, "withdrawToMain2", [acc, usdnAssetId, usdnAmt], nil)
197+ let wd = invoke(protectedReserve, "withdrawToMain2", [acc, usdnAssetId, xtnAmt], nil)
187198 if ((wd == wd))
188199 then {
189- let rehab = invoke(usdnVestingAll, "accountFor", [address], [AttachedPayment(fromBase58String(usdnAssetId), usdnAmt)])
200+ let rehab = invoke(usdnVestingAll, "accountFor", [address], [AttachedPayment(fromBase58String(usdnAssetId), xtnAmt)])
190201 if ((rehab == rehab))
191202 then unit
192203 else throw("Strict value is not equal to itself.")
193204 }
194205 else throw("Strict value is not equal to itself.")
195206 }
196207 if ((rehab == rehab))
197208 then {
198- let $t059125974 = asInt2(invoke(main1, "healthOf", [address], nil))
199- let bp = $t059125974._1
200- let bpu = $t059125974._2
209+ let $t061956257 = asInt2(invoke(main1, "healthOf", [address], nil))
210+ let bp = $t061956257._1
211+ let bpu = $t061956257._2
201212 if ((bp > (100 * (bp - bpu))))
202213 then throw("not enough address health after move: < 1%")
203214 else [changeBy(((address + "_migrated_") + assetId), s3)]
204215 }
205216 else throw("Strict value is not equal to itself.")
206217 }
207218 else throw("Strict value is not equal to itself.")
208219 }
209220 else throw("Strict value is not equal to itself.")
210221 }
211222 else throw("Strict value is not equal to itself.")
212223 }
213224 else throw("Strict value is not equal to itself.")
214225 }
215226
216227
217228
218229 @Callable(i)
219230 func convertToUSDN () = {
220231 let address = toString(i.caller)
221232 func moveRsr (rsr) = {
222233 let reserve = addressFromStringValue(rsr)
223234 let assetId = getStringValue(reserve, "assetId")
224235 let checks = opAllowed("openCollateral", assetId)
225236 if ((checks == checks))
226237 then if (if ((rsr != toString(usdtReserve)))
227238 then (rsr != toString(usdcReserve))
228239 else false)
229240 then throw("invalid reserve")
230241 else {
231242 let shC = invoke(vd, "syncHeight", [rsr], nil)
232243 if ((shC == shC))
233244 then {
234- let $t065816665 = asInt2(invoke(reserve, "storedDepositBorrow", nil, nil))
235- let totalDeposit = $t065816665._1
236- let totalDebt = $t065816665._2
245+ let $t068646948 = asInt2(invoke(reserve, "storedDepositBorrow", nil, nil))
246+ let totalDeposit = $t068646948._1
247+ let totalDebt = $t068646948._2
237248 let util = if ((totalDeposit > 0))
238249 then min([factorsBase, fraction(totalDebt, factorsBase, totalDeposit)])
239250 else 0
240251 let utilThreshold = valueOrElse(getInteger(configAddress, (assetId + "_open_collateral_thresold")), 1000)
241252 if ((utilThreshold > util))
242253 then throw("not allowed: util < threshold")
243254 else {
244255 let dep = asInt(invoke(reserve, "userDepositUSD", [address], nil))
245256 if ((dep == dep))
246257 then {
247258 let s3 = asInt(invoke(reserve, "transferATokensFor", [address, acc, dep], nil))
248259 if ((s3 == s3))
249260 then {
250261 let pRw3 = moveStream(rsr, "deposit", address, acc, s3)
251262 if ((pRw3 == pRw3))
252263 then s3
253264 else throw("Strict value is not equal to itself.")
254265 }
255266 else throw("Strict value is not equal to itself.")
256267 }
257268 else throw("Strict value is not equal to itself.")
258269 }
259270 }
260271 else throw("Strict value is not equal to itself.")
261272 }
262273 else throw("Strict value is not equal to itself.")
263274 }
264275
265276 let mw = invoke(usdnVesting, "startVestingAllFor", [toString(i.caller)], nil)
266277 if ((mw == mw))
267278 then {
268279 let mt = asInt(moveRsr(toString(usdtReserve)))
269280 if ((mt == mt))
270281 then {
271282 let mc = asInt(moveRsr(toString(usdcReserve)))
272283 if ((mc == mc))
273284 then {
274285 let depTotal = (mt + mc)
275286 let rehab = {
276287 let usdnAmt = fraction(depTotal, (factorsBase + usdnBonus), factorsBase)
277288 let wd = invoke(protectedReserve, "withdrawToMain2", [acc, usdnAssetId, usdnAmt], nil)
278289 if ((wd == wd))
279290 then {
280291 let rehab = invoke(usdnVestingAll, "accountFor", [address], [AttachedPayment(fromBase58String(usdnAssetId), usdnAmt)])
281292 if ((rehab == rehab))
282293 then unit
283294 else throw("Strict value is not equal to itself.")
284295 }
285296 else throw("Strict value is not equal to itself.")
286297 }
287298 if ((rehab == rehab))
288299 then {
289- let $t078197881 = asInt2(invoke(main1, "healthOf", [address], nil))
290- let bp = $t078197881._1
291- let bpu = $t078197881._2
300+ let $t081028164 = asInt2(invoke(main1, "healthOf", [address], nil))
301+ let bp = $t081028164._1
302+ let bpu = $t081028164._2
292303 if ((bp > (100 * (bp - bpu))))
293304 then throw("not enough address health after move: < 1%")
294305 else [changeBy(((address + "_migrated_") + getStringValue(usdtReserve, "assetId")), mt), changeBy(((address + "_migrated_") + getStringValue(usdcReserve, "assetId")), mc)]
295306 }
296307 else throw("Strict value is not equal to itself.")
297308 }
298309 else throw("Strict value is not equal to itself.")
299310 }
300311 else throw("Strict value is not equal to itself.")
301312 }
302313 else throw("Strict value is not equal to itself.")
303314 }
304315
305316
306317
307318 @Callable(i)
308319 func withdrawVestedAllUSDN (whale,regular) = {
309320 let address = toString(i.caller)
310321 let regPart = if (regular)
311322 then asInt(invoke(usdnVestingAll, "withdrawVestedForTo", [address, address], nil))
312323 else 0
313324 if ((regPart == regPart))
314325 then {
315326 let whalePart = if (whale)
316327 then asInt(invoke(usdnVesting, "withdrawVestedForTo", [address, address], nil))
317328 else 0
318329 if ((whalePart == whalePart))
319330 then $Tuple2(nil, (whalePart + regPart))
320331 else throw("Strict value is not equal to itself.")
321332 }
322333 else throw("Strict value is not equal to itself.")
323334 }
324335
325336
326337
327338 @Callable(i)
328339 func withdrawVestedAllSURF (whale,regular) = {
329340 let checks = opAllowed("liquidao_all_withdrawVestedAsSurf", toBase58String(surfAssetId))
330341 if ((checks == checks))
331342 then {
332343 let surfBalance = buySurf(i.caller, whale, regular)
333344 if ((surfBalance == surfBalance))
334345 then $Tuple2([ScriptTransfer(i.caller, surfBalance, surfAssetId)], surfBalance)
335346 else throw("Strict value is not equal to itself.")
336347 }
337348 else throw("Strict value is not equal to itself.")
338349 }
339350
340351
341352
342353 @Callable(i)
343354 func withdrawVestedSURF2 (whale,regular,stake) = {
344355 let address = toString(i.caller)
345356 let checks = opAllowed("liquidao_all_withdrawVestedAsSurf", toBase58String(surfAssetId))
346357 if ((checks == checks))
347358 then {
348359 let regPart = if ((regular > 0))
349360 then asInt(invoke(usdnVestingAll, "partialWithdrawVestedForTo", [address, toString(this), regular], nil))
350361 else 0
351362 if ((regPart == regPart))
352363 then {
353364 let whalePart = if ((whale > 0))
354365 then asInt(invoke(usdnVesting, "partialWithdrawVestedForTo", [address, toString(this), whale], nil))
355366 else 0
356367 if ((whalePart == whalePart))
357368 then {
358369 let total = (whalePart + regPart)
359370 let buy = invoke(surfAddress, "buySurf", [1000000, 1000000, false], [AttachedPayment(fromBase58String(usdnAssetId), total)])
360371 if ((buy == buy))
361372 then {
362373 let surfBalance = assetBalance(this, surfAssetId)
363374 if ((surfBalance == surfBalance))
364375 then if (stake)
365376 then {
366377 let stakeSurf = invoke(surfStakeAddress, "stakeByOriginCaller", nil, [AttachedPayment(surfAssetId, surfBalance)])
367378 if ((stakeSurf == stakeSurf))
368379 then $Tuple2(nil, surfBalance)
369380 else throw("Strict value is not equal to itself.")
370381 }
371382 else $Tuple2([ScriptTransfer(i.caller, surfBalance, surfAssetId)], surfBalance)
372383 else throw("Strict value is not equal to itself.")
373384 }
374385 else throw("Strict value is not equal to itself.")
375386 }
376387 else throw("Strict value is not equal to itself.")
377388 }
378389 else throw("Strict value is not equal to itself.")
379390 }
380391 else throw("Strict value is not equal to itself.")
381392 }
382393
383394
384395
385396 @Callable(i)
386397 func withdrawVestedAllSURFAndStake (whale,regular) = {
387398 let checks = opAllowed("liquidao_all_withdrawVestedAsSurf", toBase58String(surfAssetId))
388399 if ((checks == checks))
389400 then {
390401 let surfBalance = buySurf(i.caller, whale, regular)
391402 if ((surfBalance == surfBalance))
392403 then {
393404 let stakeSurf = invoke(surfStakeAddress, "stakeByOriginCaller", nil, [AttachedPayment(surfAssetId, surfBalance)])
394405 if ((stakeSurf == stakeSurf))
395406 then $Tuple2(nil, surfBalance)
396407 else throw("Strict value is not equal to itself.")
397408 }
398409 else throw("Strict value is not equal to itself.")
399410 }
400411 else throw("Strict value is not equal to itself.")
401412 }
402413
403414
404415
405416 @Callable(i)
406417 func withdrawAsLP (whale,regular) = {
407418 let address = toString(i.caller)
408419 let regPart = if ((regular > 0))
409420 then asInt(invoke(usdnVestingAll, "partialWithdrawVestedForTo", [address, toString(this), regular], nil))
410421 else 0
411422 if ((regPart == regPart))
412423 then {
413424 let whalePart = if ((whale > 0))
414425 then asInt(invoke(usdnVesting, "partialWithdrawVestedForTo", [address, toString(this), whale], nil))
415426 else 0
416427 if ((whalePart == whalePart))
417428 then {
418429 let total = (whalePart + regPart)
419430 let toLp = invoke(viresVestedUsdnLpDapp, "mintTo", [address], [AttachedPayment(fromBase58String(usdnAssetId), total)])
420431 if ((toLp == toLp))
421432 then $Tuple2(nil, total)
422433 else throw("Strict value is not equal to itself.")
423434 }
424435 else throw("Strict value is not equal to itself.")
425436 }
426437 else throw("Strict value is not equal to itself.")
427438 }
428439
429440
430441
431442 @Callable(i)
432443 func importLP () = {
433444 let address = toString(i.caller)
434445 let usdnAmt = asInt(invoke(viresVestedUsdnLpDapp, "import", nil, i.payments))
435446 if ((usdnAmt == usdnAmt))
436447 then {
437448 let accountFor = invoke(usdnVestingAll, "accountFor", [address], [AttachedPayment(fromBase58String(usdnAssetId), usdnAmt)])
438449 if ((accountFor == accountFor))
439450 then $Tuple2(nil, usdnAmt)
440451 else throw("Strict value is not equal to itself.")
441452 }
442453 else throw("Strict value is not equal to itself.")
443454 }
444455
445456
446457 @Verifier(tx)
447458 func verify () = {
448459 let BASE = 1000
449460 let quorumRatio = valueOrErrorMessage(getInteger(configAddress, "proposal_quorum_ratio"), "proposalQuorumRatio is not defined")
450461 let passedRatio = valueOrErrorMessage(getInteger(configAddress, "proposal_passed_ratio"), "proposalThresholdRatio is not defined")
451462 let gViresContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "dividends_contract"), "no dividends_contract")), "invalid dividends_contract")
452463 let votingContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "voting_contract"), "no voting_contract")), "invalid voting_contract")
453464 let id = toBase58String(tx.id)
454465 let votesYes = valueOrElse(getInteger(votingContract, ("proposal_yes_" + id)), 0)
455466 let votesNo = valueOrElse(getInteger(votingContract, ("proposal_no_" + id)), 0)
456467 let proposalHeight = valueOrErrorMessage(getInteger(votingContract, ("proposal_height_" + id)), "proposal not registered")
457468 let applyStart = valueOrElse(getInteger(votingContract, ("proposal_applystart_" + id)), 0)
458469 let applyEnd = valueOrElse(getInteger(votingContract, ("proposal_applyend_" + id)), 0)
459470 let totalGVires = valueOrElse(getInteger(votingContract, ("proposal_gvires_" + id)), 0)
460471 let enabled = valueOrElse(getBoolean(configAddress, "op_governance_apply_tx_paused"), false)
461472 let voteYes = votesYes
462473 let voteNo = votesNo
463474 let totalVotes = (voteYes + voteNo)
464475 let hasQuorum = (((totalVotes * BASE) / totalGVires) >= quorumRatio)
465476 let hasPassed = (((voteYes * BASE) / totalVotes) >= passedRatio)
466477 let tooEarly = (applyStart >= HEIGHT)
467478 let tooLate = (HEIGHT >= applyEnd)
468479 let timeDebug = ((((((("proposalHeight = " + toString(proposalHeight)) + ", applyStart = ") + toString(applyStart)) + ", applyEnd = ") + toString(applyEnd)) + ", HEIGHT = ") + toString(HEIGHT))
469480 let byVoting = if (!(enabled))
470481 then throw("tx application throw governance not enabled")
471482 else if (tooEarly)
472483 then throw(("proposal can't be executed as it's too early: " + timeDebug))
473484 else if (tooLate)
474485 then throw(("proposal can't be executed as it's too late:" + timeDebug))
475486 else if (!(hasQuorum))
476487 then throw((((((("no quorum: " + "totalVotes: ") + toString(totalVotes)) + ", totalGVires: ") + toString(totalGVires)) + ", quorumRatio: ") + toString(quorumRatio)))
477488 else if (!(hasPassed))
478489 then throw((((((("no threshold achieved: " + "voteYes: ") + toString(voteYes)) + ", voteNo: ") + toString(voteNo)) + ", passedRatio: ") + toString(passedRatio)))
479490 else true
480491 if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
481492 then true
482493 else byVoting
483494 }
484495

github/deemru/w8io/6500d08 
62.15 ms