tx · 29EfZYE2XLzH6itDPVDrBrvSt5utVx3P4PtaB4M4SUCJ

3PHvU5KXYJUAReeActQpS56TCdF8gupEjdR:  -0.02600000 Waves

2023.06.09 11:30 [3680469] smart account 3PHvU5KXYJUAReeActQpS56TCdF8gupEjdR > SELF 0.00000000 Waves

{ "type": 13, "id": "29EfZYE2XLzH6itDPVDrBrvSt5utVx3P4PtaB4M4SUCJ", "fee": 2600000, "feeAssetId": null, "timestamp": 1686299398527, "version": 1, "sender": "3PHvU5KXYJUAReeActQpS56TCdF8gupEjdR", "senderPublicKey": "EGGmHBK3xqTV6B19vtf2EhLscX4pB3tBXFKRDH5wdTcz", "proofs": [ "3URhiBkx1sdoDo9tzaKH8bSMxMZvsSsGwHLA9RatY7GWHPryhk9Md6JJMyHz1rtYyUAH9HiS7QHJpeB6Vk9BXGdw" ], "script": "base64:BgIvCAISABIAEgASBAoCCAgSABIECgIIARIDCgEIEgUKAwgIBBIECgIIBBIAEgMKAQhGAQVhc0ludAEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACA0ludAQDaW50BQckbWF0Y2gwBQNpbnQJAAIBAhl3cm9uZyB0eXBlLCBleHBlY3RlZDogSW50AQthc0ludFN0ckludAEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACEihJbnQsIFN0cmluZywgSW50KQQJaW50U3RySW50BQckbWF0Y2gwBQlpbnRTdHJJbnQDCQABAgUHJG1hdGNoMAINKEludCwgU3RyaW5nKQQGaW50U3RyBQckbWF0Y2gwCQCVCgMIBQZpbnRTdHICXzEIBQZpbnRTdHICXzIAAAkAAgECI3dyb25nIHR5cGUsIGV4cGVjdGVkOiAoSW50LCBTdHJpbmcpAQtmYWN0b3JDaGVjawEGZmFjdG9yAwMDCQECIT0CBQZmYWN0b3IAAQkBAiE9AgUGZmFjdG9yAAIHCQECIT0CBQZmYWN0b3IABAcJAAIBAgpiYWQgZmFjdG9yBQZmYWN0b3IAEXZpcmVzQXNzZXRJZFN0b3JlAgx2aXJlc0Fzc2V0SWQAEmluaXRpYWxIZWlnaHRTdG9yZQINaW5pdGlhbEhlaWdodAANaW5pdGlhbEhlaWdodAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUSaW5pdGlhbEhlaWdodFN0b3JlAAtjb25maWdTdG9yZQIGY29uZmlnAA1jb25maWdBZGRyZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFC2NvbmZpZ1N0b3JlAh9leHAtZGl2aWRlbmRzOiBubyBjb25maWdBZGRyZXNzAhZpbnZhbGlkIGNvbmZpZyBhZGRyZXNzABJtYXliZU9yYWNsZUFkZHJlc3MEByRtYXRjaDAJAJ0IAgUNY29uZmlnQWRkcmVzcwIOb3JhY2xlX2FkZHJlc3MDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQCmCAEFAXMFBHVuaXQABkhFSUdIVAUGaGVpZ2h0AAp2aXJlc0lkU3RyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwURdmlyZXNBc3NldElkU3RvcmUCF3ZpcmVzIGFzc2V0SWQgbm90IGZvdW5kAAx2aXJlc0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA2QQBBQp2aXJlc0lkU3RyAhVpbnZhbGlkIHZpcmVzIGFzc2V0SWQBB2Fzc2V0SWQBAXMEC2Fzc2V0SWRQYXJ0CQCRAwIJALUJAgUBcwIBXwAAAwkAAAIFC2Fzc2V0SWRQYXJ0AgVXQVZFUwUEdW5pdAkA2QQBBQthc3NldElkUGFydAEKYXNzZXRJZFN0cgEDYWlkBAckbWF0Y2gwBQNhaWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCYnYFByRtYXRjaDAJANgEAQUCYnYDCQABAgUHJG1hdGNoMAIEVW5pdAQBdQUHJG1hdGNoMAIFV0FWRVMJAAIBAgtNYXRjaCBlcnJvcgEHdGhyb3dJZgIJY29uZGl0aW9uBWVycm9yAwUJY29uZGl0aW9uCQACAQUFZXJyb3IGAQh3cml0ZUludAIDa2V5BXZhbHVlAwkAZgIAAAUFdmFsdWUJAAIBCQCsAgIJAKwCAgkArAICAhd3cml0aW5nIG5lZ2F0aXZlIHZhbHVlIAkApAMBBQV2YWx1ZQIJIGZvciBrZXkgBQNrZXkJAQxJbnRlZ2VyRW50cnkCBQNrZXkFBXZhbHVlAQt3cml0ZVN0ckludAIDa2V5BXZhbHVlAwkAZgIAAAUFdmFsdWUJAAIBCQCsAgIJAKwCAgkArAICAhd3cml0aW5nIG5lZ2F0aXZlIHZhbHVlIAkApAMBBQV2YWx1ZQIJIGZvciBrZXkgBQNrZXkJAQtTdHJpbmdFbnRyeQIFA2tleQkApAMBBQV2YWx1ZQELd3JpdGVTdHJpbmcCA2tleQV2YWx1ZQkBC1N0cmluZ0VudHJ5AgUDa2V5BQV2YWx1ZQEQd3JpdGVDb25zdFN0cmluZwIDa2V5BXZhbHVlAwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzBQNrZXkJAQtTdHJpbmdFbnRyeQIFA2tleQUFdmFsdWUJAAIBCQCsAgICFWFscmVhZHkgaW5pdGlhbGl6ZWQ6IAUDa2V5AQhjaGFuZ2VCeQIDa2V5BXZhbHVlCQEId3JpdGVJbnQCBQNrZXkJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAABQV2YWx1ZQELY2hhbmdlQnlTdHICA2tleQV2YWx1ZQkBC3dyaXRlU3RySW50AgUDa2V5CQBkAgkBDXBhcnNlSW50VmFsdWUBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFA2tleQIBMAUFdmFsdWUBDHZpcmVzUGF5bWVudAEBaQMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAAAAAMJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUMdmlyZXNBc3NldElkCQACAQIJbm90IHZpcmVzCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAEJb3BBbGxvd2VkAQJvcAQHJG1hdGNoMAkA/AcEBQ1jb25maWdBZGRyZXNzAglvcEFsbG93ZWQJAMwIAgUKdmlyZXNJZFN0cgkAzAgCBQJvcAUDbmlsBQNuaWwDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBYgUHJG1hdGNoMAMFAWIGCQACAQILbm90IGFsbG93ZWQJAAIBAiFvcEFsbG93ZWQ6IHVuZXhwZWN0ZWQgcmVzdWx0IHR5cGUAC3ZpcmVzU3Rha2VyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCDHZpcmVzX3N0YWtlcgIZbm8gdmlyZXNfc3Rha2VyIGluIGNvbmZpZwIcaW52YWxpZCB2aXJlc19zdGFrZXIgYWRkcmVzcwAEbWFpbgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgkAtQkCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwIEbWFpbgIHbm8gbWFpbgIBfAAAAgxpbnZhbGlkIG1haW4BCG1haW5Pbmx5AQFpAwkBCGNvbnRhaW5zAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUNY29uZmlnQWRkcmVzcwIEbWFpbgkApQgBCAUBaQZjYWxsZXIGCQACAQIQb25seSBtYWluIGNhbiBkbwASZGl2aWRlbmRhYmxlVG9rZW5zCQELdmFsdWVPckVsc2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCEmRpdmlkZW5kYWJsZVRva2VucwIAABVkaXZpZGVuZGFibGVUb2tlbnNBcnIDCQAAAgUSZGl2aWRlbmRhYmxlVG9rZW5zAgAFA25pbAkAvAkCBRJkaXZpZGVuZGFibGVUb2tlbnMCAXwAF2RpdmlkZW5kYWJsZVJlc2VydmVzU3RyCQELdmFsdWVPckVsc2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCFGRpdmlkZW5kYWJsZVJlc2VydmVzAgAAFGRpdmlkZW5kYWJsZVJlc2VydmVzBAckbWF0Y2gwBRdkaXZpZGVuZGFibGVSZXNlcnZlc1N0cgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEA3N0cgUHJG1hdGNoMAMJAAACBQNzdHICAAUDbmlsCQC8CQIFA3N0cgIBfAUDbmlsAAhoYWxmTGlmZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDWNvbmZpZ0FkZHJlc3MCFHZpcmVzX2xvY2tfaGFsZl9saWZlAhFoYWxmIGxpZmUgbm90IHNldAAGbGFtYmRhCQBpAgDo0uqbggIFCGhhbGZMaWZlAApMQU1CREFCQVNFAAgAAUUA14nPgQEABUVCQVNFAAgBB2Zvcm11bGECAXgCeTAJAGsDBQJ5MAkAbAYFAUUFBUVCQVNFCQBrAwUGbGFtYmRhBQF4AOgHBQpMQU1CREFCQVNFAAgFBkhBTEZVUACAwtcvARV1c2VyRGl2aWRlbmRzQWRqU3RvcmUCBHVzZXIDYWlkCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQNhaWQCBF9hZGoBGXVzZXJEaXZpZGVuZHNDbGFpbWVkU3RvcmUCBHVzZXIDYWlkCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQNhaWQCCF9jbGFpbWVkARZ1c2VyVmlydHVhbFRva2Vuc1N0b3JlAQR1c2VyCQCsAgIFBHVzZXICCF92aXJ0dWFsARh1c2VyRGVwb3NpdGVkVG9rZW5zU3RvcmUBBHVzZXIJAKwCAgUEdXNlcgIGX3ZpcmVzARh1c2VyV2l0aGRyYXduVG9rZW5zU3RvcmUBBHVzZXIJAKwCAgUEdXNlcgIQX3ZpcmVzX3dpdGhkcmF3bgEUdXNlckVudHJ5SGVpZ2h0U3RvcmUBBHVzZXIJAKwCAgUEdXNlcgIHX2hlaWdodAEPdXNlckZhY3RvclN0b3JlAQR1c2VyCQCsAgIFBHVzZXICB19mYWN0b3IBEHVzZXJEaXZpZGVuZHNBZGoCBHVzZXIDYWlkCQELdmFsdWVPckVsc2UCCQCfCAEJARV1c2VyRGl2aWRlbmRzQWRqU3RvcmUCBQR1c2VyBQNhaWQAAAEUdXNlckRpdmlkZW5kc0NsYWltZWQCBHVzZXIDYWlkCQELdmFsdWVPckVsc2UCCQCfCAEJARl1c2VyRGl2aWRlbmRzQ2xhaW1lZFN0b3JlAgUEdXNlcgUDYWlkAAABEXVzZXJWaXJ0dWFsVG9rZW5zAQR1c2VyCQENcGFyc2VJbnRWYWx1ZQEJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBFnVzZXJWaXJ0dWFsVG9rZW5zU3RvcmUBBQR1c2VyAgEwARN1c2VyRGVwb3NpdGVkVG9rZW5zAQR1c2VyCQELdmFsdWVPckVsc2UCCQCfCAEJARh1c2VyRGVwb3NpdGVkVG9rZW5zU3RvcmUBBQR1c2VyAAABE3VzZXJXaXRoZHJhd25Ub2tlbnMBBHVzZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBGHVzZXJXaXRoZHJhd25Ub2tlbnNTdG9yZQEFBHVzZXIAAAEPdXNlckVudHJ5SGVpZ2h0AQR1c2VyCQELdmFsdWVPckVsc2UCCQCfCAEJARR1c2VyRW50cnlIZWlnaHRTdG9yZQEFBHVzZXIAAAEKdXNlckZhY3RvcgEEdXNlcgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEPdXNlckZhY3RvclN0b3JlAQUEdXNlcgABAQp1c2VyR1ZpcmVzAQR1c2VyCQEHZm9ybXVsYQIJAQEtAQkAZQIFBkhFSUdIVAUNaW5pdGlhbEhlaWdodAkBEXVzZXJWaXJ0dWFsVG9rZW5zAQUEdXNlcgEadG90YWxWaXJ0dWFsRGl2aWRlbmRzU3RvcmUBA2FpZAkArAICBQNhaWQCFl90b3RhbFZpcnR1YWxEaXZpZGVuZHMBF3RvdGFsUmVhbERpdmlkZW5kc1N0b3JlAQNhaWQJAKwCAgUDYWlkAhNfdG90YWxSZWFsRGl2aWRlbmRzARJyZWNvdmVyeUFsbG9jU3RvcmUBA2FpZAkArAICBQNhaWQCFF9yZWNvdmVyeUFsbG9jYXRpb25zAR50b3RhbFJlYWxEaXZpZGVuZHNDbGFpbWVkU3RvcmUBA2FpZAkArAICBQNhaWQCGl90b3RhbFJlYWxEaXZpZGVuZHNDbGFpbWVkABd0b3RhbFZpcnR1YWxUb2tlbnNTdG9yZQISdG90YWxWaXJ0dWFsVG9rZW5zABl0b3RhbERlcG9zaXRlZFRva2Vuc1N0b3JlAhR0b3RhbERlcG9zaXRlZFRva2VucwEbdG90YWxEZXBvc2l0ZWRCeUZhY3RvclN0b3JlAQZmYWN0b3IJAKwCAgIUdG90YWxEZXBvc2l0ZWRUb2tlbnMJAKQDAQkBC2ZhY3RvckNoZWNrAQUGZmFjdG9yARZ0b3RhbERlcG9zaXRlZEJ5RmFjdG9yAQZmYWN0b3IJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBG3RvdGFsRGVwb3NpdGVkQnlGYWN0b3JTdG9yZQEFBmZhY3RvcgAAARV0b3RhbFZpcnR1YWxEaXZpZGVuZHMBA2FpZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEadG90YWxWaXJ0dWFsRGl2aWRlbmRzU3RvcmUBBQNhaWQAAAESdG90YWxSZWFsRGl2aWRlbmRzAQNhaWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBF3RvdGFsUmVhbERpdmlkZW5kc1N0b3JlAQUDYWlkAAAAEnRvdGFsVmlydHVhbFRva2VucwkBDXBhcnNlSW50VmFsdWUBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFF3RvdGFsVmlydHVhbFRva2Vuc1N0b3JlAgEwABR0b3RhbERlcG9zaXRlZFRva2VucwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRl0b3RhbERlcG9zaXRlZFRva2Vuc1N0b3JlAAABDHVzZXJPZmZDbGlmZgEEdXNlcgQLZW50cnlIZWlnaHQJAQ91c2VyRW50cnlIZWlnaHQBBQR1c2VyBAZmYWN0b3IJAQp1c2VyRmFjdG9yAQUEdXNlcgMJAAACBQZmYWN0b3IAAQkAZgIFBkhFSUdIVAkAZAIFC2VudHJ5SGVpZ2h0CQBoAgAEBQhoYWxmTGlmZQMJAAACBQZmYWN0b3IAAgkAZgIFBkhFSUdIVAkAZAIFC2VudHJ5SGVpZ2h0CQBoAgAFBQhoYWxmTGlmZQMJAAACBQZmYWN0b3IABAkAZgIFBkhFSUdIVAkAZAIFC2VudHJ5SGVpZ2h0CQBoAgAGBQhoYWxmTGlmZQkAAgEJAKwCAgILYmFkIGZhY3RvcjoJAKQDAQUGZmFjdG9yAQ11c2VyVmlyZXNEYXRhAQR1c2VyBAlkZXBvc2l0ZWQJARN1c2VyRGVwb3NpdGVkVG9rZW5zAQUEdXNlcgQCZ1YJAQp1c2VyR1ZpcmVzAQUEdXNlcgQOc3VwcG9zZWRMb2NrZWQJAJcDAQkAzAgCBQlkZXBvc2l0ZWQJAMwIAgUCZ1YFA25pbAQGbG9ja2VkAwkBDHVzZXJPZmZDbGlmZgEFBHVzZXIAAAUOc3VwcG9zZWRMb2NrZWQECHVubG9ja2VkCQBlAgUJZGVwb3NpdGVkBQZsb2NrZWQECXdpdGhkcmF3bgkBE3VzZXJXaXRoZHJhd25Ub2tlbnMBBQR1c2VyBAx3aXRoZHJhd2FibGUJAGUCBQh1bmxvY2tlZAUJd2l0aGRyYXduBAppblByb3RvY29sCQBkAgUGbG9ja2VkBQx3aXRoZHJhd2FibGUJAJgKBgUJZGVwb3NpdGVkBQZsb2NrZWQFDHdpdGhkcmF3YWJsZQUJd2l0aGRyYXduBQppblByb3RvY29sBQJnVgEOdXNlclByb2ZpdERhdGEBBHVzZXIEC3RvdGFsVG9rZW5zCQCQAwEFFWRpdmlkZW5kYWJsZVRva2Vuc0FycgQZdG90YWxEaXZpZGVuZGFibGVSZXNlcnZlcwkAkAMBBRRkaXZpZGVuZGFibGVSZXNlcnZlcwMJAQIhPQIFC3RvdGFsVG9rZW5zBRl0b3RhbERpdmlkZW5kYWJsZVJlc2VydmVzCQACAQkArAICCQCsAgIJAKwCAgIoaW5jb25zaXN0ZW50IGNvbmZpZ3VyYXRpb246IHRvdGFsVG9rZW5zPQkApAMBBQt0b3RhbFRva2VucwIeLCB0b3RhbERpdmlkZW5kYWJsZVJlc2VydmVzID0gCQCkAwEFGXRvdGFsRGl2aWRlbmRhYmxlUmVzZXJ2ZXMEDXZpcnR1YWxUb2tlbnMJARF1c2VyVmlydHVhbFRva2VucwEFBHVzZXIECXRva2VuRGF0YQoBBGZvbGQCBnRvdGFscwVpbmRleAMJAGcCBQVpbmRleAULdG90YWxUb2tlbnMFBnRvdGFscwQDYWlkCQCRAwIFFWRpdmlkZW5kYWJsZVRva2Vuc0FycgUFaW5kZXgECyR0MDg1OTQ4ODgzBAFyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBRRkaXZpZGVuZGFibGVSZXNlcnZlcwUFaW5kZXgCI2JhZCByZXNlcnZlIGluIGRpdmlkZW5kYWJsZVJlc2VydmVzCQELYXNJbnRTdHJJbnQBCQD8BwQFAXICEmdldFJlc2VydmVEaXZzSW5mbwUDbmlsBQNuaWwEC3Jlc2VydmVEaXZzCAULJHQwODU5NDg4ODMCXzEEDnJlc2VydmVBc3NldElkCAULJHQwODU5NDg4ODMCXzIEDG5vbkNsYWltYWJsZQgFCyR0MDg1OTQ4ODgzAl8zAwkBAiE9AgUOcmVzZXJ2ZUFzc2V0SWQFA2FpZAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIraW5jb25zaXN0ZW50IGNvbmZpZ3VyYXRpb246IHJlc2VydmVBc3NldElkPQUOcmVzZXJ2ZUFzc2V0SWQCBiwgYWlkPQUDYWlkAhUsIGRpdmlkZW5kYWJsZVRva2VuczoFEmRpdmlkZW5kYWJsZVRva2VucwIXLCBkaXZpZGVuZGFibGVSZXNlcnZlczoFF2RpdmlkZW5kYWJsZVJlc2VydmVzU3RyBA91c2VyVmlydHVhbERpdnMDCQAAAgUSdG90YWxWaXJ0dWFsVG9rZW5zAAAAAAkAawMJAGQCCQEVdG90YWxWaXJ0dWFsRGl2aWRlbmRzAQUDYWlkBQtyZXNlcnZlRGl2cwUNdmlydHVhbFRva2VucwUSdG90YWxWaXJ0dWFsVG9rZW5zBANhZGoJARB1c2VyRGl2aWRlbmRzQWRqAgUEdXNlcgUDYWlkBAh1c2VyRGl2cwkAZQIFD3VzZXJWaXJ0dWFsRGl2cwUDYWRqBBRub25DbGFpbWFibGVVc2VyRGl2cwMJAAACBRJ0b3RhbFZpcnR1YWxUb2tlbnMAAAAACQBrAwUMbm9uQ2xhaW1hYmxlBQ12aXJ0dWFsVG9rZW5zBRJ0b3RhbFZpcnR1YWxUb2tlbnMEC3VzZXJDbGFpbWVkCQEUdXNlckRpdmlkZW5kc0NsYWltZWQCBQR1c2VyBQNhaWQECWNsYWltYWJsZQkAlgMBCQDMCAIAAAkAzAgCCQBlAgUIdXNlckRpdnMFC3VzZXJDbGFpbWVkBQNuaWwDCQBmAgAABQljbGFpbWFibGUJAAIBCQCsAgICD2NsYWltYWJsZSA8IDA6IAkApAMBBQljbGFpbWFibGUJAM4IAgUGdG90YWxzCQDMCAIJAJYKBAUDYWlkBQt1c2VyQ2xhaW1lZAUJY2xhaW1hYmxlBRRub25DbGFpbWFibGVVc2VyRGl2cwUDbmlsCgACJGwJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsJAMwIAgAMCQDMCAIADQkAzAgCAA4JAMwIAgAPCQDMCAIAEAkAzAgCABEJAMwIAgASCQDMCAIAEwUDbmlsCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQJAJQKAgUNdmlydHVhbFRva2VucwUJdG9rZW5EYXRhARljbGFpbUZyb21SZXNlcnZlc0ludGVybmFsAAQMYXNzZXRJZFN0b3JlAgdhc3NldElkBBRyZWNvdmVyeUFkZHJlc3NTaGFyZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1jb25maWdBZGRyZXNzAhZyZWNvdmVyeV9hZGRyZXNzX3NoYXJlAAAEE3JlY292ZXJ5UmVzZXJ2ZXNTdHIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwIRcmVjb3ZlcnlfcmVzZXJ2ZXMCAAQPcmVjb3ZlcnlBZGRyZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCEHJlY292ZXJ5X2FkZHJlc3MCFmZvbmQgYWRkcmVzcyBub3QgZm91bmQCF2ZvbmQgYWRkcmVzcyBpcyBpbnZhbGlkCgEEZm9sZAIGb3V0cHV0B3Jlc2VydmUEDnJlc2VydmVBZGRyZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUHcmVzZXJ2ZQIaYWRkZXI6IGJhZCByZXNlcnZlIGFkZHJlc3MEDWFzc2V0SWRTdHJpbmcJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ5yZXNlcnZlQWRkcmVzcwUMYXNzZXRJZFN0b3JlAhVubyBhc3NldElkIGluIHJlc2VydmUEB2FjdGlvbnMDCQEBIQEJAQhjb250YWlucwIFEmRpdmlkZW5kYWJsZVRva2VucwUNYXNzZXRJZFN0cmluZwkAAgECXmluY29uc2lzdGVudCBjb25maWd1cmF0aW9uOiBkaXZpZGVuZGFibGVSZXNlcnZlJ3MgYXNzZXQgaWQgaXMgbm90IHN0b3JlZCBpbiBkaXZpZGVuZGFibGVUb2tlbnMEBmFtb3VudAkBBWFzSW50AQkA/AcEBQ5yZXNlcnZlQWRkcmVzcwITd2l0aGRyYXdGcm9tUmVzZXJ2ZQkAzAgCAP///////////wEFA25pbAUDbmlsAwkAAAIFBmFtb3VudAUGYW1vdW50AwkAZgIAAAUGYW1vdW50CQACAQIKYmFkIGFtb3VudAMJAAACBQZhbW91bnQAAAUDbmlsAwMJAAACBRRyZWNvdmVyeUFkZHJlc3NTaGFyZQAABgkBASEBCQEIY29udGFpbnMCBRNyZWNvdmVyeVJlc2VydmVzU3RyBQdyZXNlcnZlCQDMCAIJAQhjaGFuZ2VCeQIJARp0b3RhbFZpcnR1YWxEaXZpZGVuZHNTdG9yZQEFDWFzc2V0SWRTdHJpbmcFBmFtb3VudAkAzAgCCQEIY2hhbmdlQnkCCQEXdG90YWxSZWFsRGl2aWRlbmRzU3RvcmUBBQ1hc3NldElkU3RyaW5nBQZhbW91bnQFA25pbAQOcmVjb3ZlcnlBbW91bnQJAGsDBQZhbW91bnQFFHJlY292ZXJ5QWRkcmVzc1NoYXJlAGQED2RpdmlkZW50c0Ftb3VudAkAZQIFBmFtb3VudAUOcmVjb3ZlcnlBbW91bnQJAMwIAgkBCGNoYW5nZUJ5AgkBGnRvdGFsVmlydHVhbERpdmlkZW5kc1N0b3JlAQUNYXNzZXRJZFN0cmluZwUPZGl2aWRlbnRzQW1vdW50CQDMCAIJAQhjaGFuZ2VCeQIJARd0b3RhbFJlYWxEaXZpZGVuZHNTdG9yZQEFDWFzc2V0SWRTdHJpbmcFD2RpdmlkZW50c0Ftb3VudAkAzAgCCQEIY2hhbmdlQnkCCQEScmVjb3ZlcnlBbGxvY1N0b3JlAQUNYXNzZXRJZFN0cmluZwUOcmVjb3ZlcnlBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUPcmVjb3ZlcnlBZGRyZXNzBQ5yZWNvdmVyeUFtb3VudAkBB2Fzc2V0SWQBBQ1hc3NldElkU3RyaW5nBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAM4IAgUGb3V0cHV0BQdhY3Rpb25zCgACJGwFFGRpdmlkZW5kYWJsZVJlc2VydmVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQBCmFkdmlzZVVzZXIBBHVzZXIEDSR0MDEyMTg4MTIyNzgJAQ11c2VyVmlyZXNEYXRhAQUEdXNlcgQJZGVwb3NpdGVkCAUNJHQwMTIxODgxMjI3OAJfMQQGbG9ja2VkCAUNJHQwMTIxODgxMjI3OAJfMgQMd2l0aGRyYXdhYmxlCAUNJHQwMTIxODgxMjI3OAJfMwQJd2l0aGRyYXduCAUNJHQwMTIxODgxMjI3OAJfNAQKaW5Qcm90b2NvbAgFDSR0MDEyMTg4MTIyNzgCXzUEBmdWaXJlcwgFDSR0MDEyMTg4MTIyNzgCXzYEDSR0MDEyMjgzMTIzMzYJAQ51c2VyUHJvZml0RGF0YQEFBHVzZXIEDXZpcnR1YWxUb2tlbnMIBQ0kdDAxMjI4MzEyMzM2Al8xBAl0b2tlbkRhdGEIBQ0kdDAxMjI4MzEyMzM2Al8yBAVwb3dlcgMJAAACBQppblByb3RvY29sAAAAAAkAawMAkE4FBmdWaXJlcwUKaW5Qcm90b2NvbAQEYmFzZQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg4gIGRlcG9zaXRlZCA9IAkApAMBBQlkZXBvc2l0ZWQCEiwgdmlydHVhbFRva2VucyA9IAkApAMBBQ12aXJ0dWFsVG9rZW5zAgssIGxvY2tlZCA9IAkApAMBBQZsb2NrZWQCESwgd2l0aGRyYXdhYmxlID0gCQCkAwEFDHdpdGhkcmF3YWJsZQIOLCB3aXRoZHJhd24gPSAJAKQDAQUJd2l0aGRyYXduAg8sIGluUHJvdG9jb2wgPSAJAKQDAQUKaW5Qcm90b2NvbAIQLCBlbnRyeUhlaWdodCA9IAkApAMBCQEPdXNlckVudHJ5SGVpZ2h0AQUEdXNlcgILLCBmYWN0b3IgPSAJAKQDAQkBCnVzZXJGYWN0b3IBBQR1c2VyAgssIGdWaXJlcyA9IAkApAMBBQZnVmlyZXMCCiwgcG93ZXIgPSAJAKQDAQUFcG93ZXIECnRva2Vuc0RhdGEKAQNmbGQCBnRvdGFscwRpdGVtBA0kdDAxMzAxMDEzMDM3BQRpdGVtBANhaWQIBQ0kdDAxMzAxMDEzMDM3Al8xBANjZWQIBQ0kdDAxMzAxMDEzMDM3Al8yBAJhdggFDSR0MDEzMDEwMTMwMzcCXzMEAm5jCAUNJHQwMTMwMTAxMzAzNwJfNAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQZ0b3RhbHMCBCwgWyACCmFzc2V0SWQgPSAFA2FpZAIMLCBjbGFpbWVkID0gCQCkAwEFA2NlZAIOLCBjbGFpbWFibGUgPSAJAKQDAQUCYXYCESwgbm9uQ2xhaW1hYmxlID0gCQCkAwEFAm5jAgFdCgACJGwFCXRva2VuRGF0YQoAAiRzCQCQAwEFAiRsCgAFJGFjYzACAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEDZmxkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQJAKwCAgUEYmFzZQUKdG9rZW5zRGF0YQEGYWR2aXNlAAQLdG90YWxHdmlyZXMJAQdmb3JtdWxhAgkBAS0BCQBlAgUGSEVJR0hUBQ1pbml0aWFsSGVpZ2h0BRJ0b3RhbFZpcnR1YWxUb2tlbnMEBGJhc2UJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhkgIHRvdGFsRGVwb3NpdGVkVG9rZW5zID0gCQCkAwEFFHRvdGFsRGVwb3NpdGVkVG9rZW5zAhosIHRvdGFsRGVwb3NpdGVkVG9rZW5zMSA9IAkApAMBCQEWdG90YWxEZXBvc2l0ZWRCeUZhY3RvcgEAAQIaLCB0b3RhbERlcG9zaXRlZFRva2VuczIgPSAJAKQDAQkBFnRvdGFsRGVwb3NpdGVkQnlGYWN0b3IBAAICGiwgdG90YWxEZXBvc2l0ZWRUb2tlbnM0ID0gCQCkAwEJARZ0b3RhbERlcG9zaXRlZEJ5RmFjdG9yAQAEAhcsIHRvdGFsVmlydHVhbFRva2VucyA9IAkApAMBBRJ0b3RhbFZpcnR1YWxUb2tlbnMCECwgdG90YWxHdmlyZXMgPSAJAKQDAQULdG90YWxHdmlyZXMKAQRmb2xkAgV0b3RhbANhaWQJAKwCAgkArAICCQCsAgIJAKwCAgUFdG90YWwCAiwgBQNhaWQCAyA9IAkApAMBCQESdG90YWxSZWFsRGl2aWRlbmRzAQUDYWlkCgACJGwFFWRpdmlkZW5kYWJsZVRva2Vuc0FycgoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFBGJhc2UKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAEKdXBkYXRlVXNlcgMEdXNlcgZ0b2tlbnMBZgQGY2hlY2tzCQEJb3BBbGxvd2VkAQIKbG9ja192aXJlcwMJAAACBQZjaGVja3MFBmNoZWNrcwMDCQECIT0CBQFmAAEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUNY29uZmlnQWRkcmVzcwILYWxsb3dfYm9vc3QHBwkAAgECFGJvb3N0aW5nIG5vdCBlbmFibGVkBAZmYWN0b3IJAQtmYWN0b3JDaGVjawEFAWYDCQAAAgUGZmFjdG9yBQZmYWN0b3IEDWN1cnJlbnRGYWN0b3IJAQp1c2VyRmFjdG9yAQUEdXNlcgMJAGYCBQ1jdXJyZW50RmFjdG9yBQZmYWN0b3IJAAIBAhhjYW4ndCBkb3duZ3JhZGUgYm9vc3RpbmcEDSR0MDE0NDA3MTQ0OTMJAQ11c2VyVmlyZXNEYXRhAQUEdXNlcgQJZGVwb3NpdGVkCAUNJHQwMTQ0MDcxNDQ5MwJfMQQGbG9ja2VkCAUNJHQwMTQ0MDcxNDQ5MwJfMgQMd2l0aGRyYXdhYmxlCAUNJHQwMTQ0MDcxNDQ5MwJfMwQJd2l0aGRyYXduCAUNJHQwMTQ0MDcxNDQ5MwJfNAQKaW5Qcm90b2NvbAgFDSR0MDE0NDA3MTQ0OTMCXzUEAmdWCAUNJHQwMTQ0MDcxNDQ5MwJfNgQQb2xkVmlydHVhbFRva2VucwkBEXVzZXJWaXJ0dWFsVG9rZW5zAQUEdXNlcgQQbmV3VmlydHVhbFRva2VucwkBB2Zvcm11bGECCQBlAgUGSEVJR0hUBQ1pbml0aWFsSGVpZ2h0CQBoAgUGZmFjdG9yCQBkAgUGdG9rZW5zBQppblByb3RvY29sBARkaWZmCQBlAgUQbmV3VmlydHVhbFRva2VucwUQb2xkVmlydHVhbFRva2VucwQEYmFzZQkAzAgCCQEIY2hhbmdlQnkCBRl0b3RhbERlcG9zaXRlZFRva2Vuc1N0b3JlBQZ0b2tlbnMJAMwIAgkBC2NoYW5nZUJ5U3RyAgUXdG90YWxWaXJ0dWFsVG9rZW5zU3RvcmUFBGRpZmYJAMwIAgkBC2NoYW5nZUJ5U3RyAgkBFnVzZXJWaXJ0dWFsVG9rZW5zU3RvcmUBBQR1c2VyBQRkaWZmCQDMCAIJAQhjaGFuZ2VCeQIJARh1c2VyRGVwb3NpdGVkVG9rZW5zU3RvcmUBBQR1c2VyBQZ0b2tlbnMJAMwIAgkBDEludGVnZXJFbnRyeQIJARR1c2VyRW50cnlIZWlnaHRTdG9yZQEFBHVzZXIFBkhFSUdIVAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBD3VzZXJGYWN0b3JTdG9yZQEFBHVzZXIFBmZhY3RvcgUDbmlsBAl0b2tlbkRhdGEKAQRmb2xkAgV0b3RhbANhaWQEA2FkagMJAAACBRJ0b3RhbFZpcnR1YWxUb2tlbnMAAAAACQBrAwUEZGlmZgkBFXRvdGFsVmlydHVhbERpdmlkZW5kcwEFA2FpZAUSdG90YWxWaXJ0dWFsVG9rZW5zCQDOCAIFBXRvdGFsCQDMCAIJAQhjaGFuZ2VCeQIJARp0b3RhbFZpcnR1YWxEaXZpZGVuZHNTdG9yZQEFA2FpZAUDYWRqCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEVdXNlckRpdmlkZW5kc0FkalN0b3JlAgUEdXNlcgUDYWlkCQBkAgkBEHVzZXJEaXZpZGVuZHNBZGoCBQR1c2VyBQNhaWQFA2FkagUDbmlsCgACJGwFFWRpdmlkZW5kYWJsZVRva2Vuc0FycgoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEZm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUBAptb25pdG9yaW5nAwkBAiE9AgUGZmFjdG9yBQ1jdXJyZW50RmFjdG9yCQDMCAIJAQhjaGFuZ2VCeQIJARt0b3RhbERlcG9zaXRlZEJ5RmFjdG9yU3RvcmUBBQ1jdXJyZW50RmFjdG9yCQEBLQEFCmluUHJvdG9jb2wJAMwIAgkBCGNoYW5nZUJ5AgkBG3RvdGFsRGVwb3NpdGVkQnlGYWN0b3JTdG9yZQEFBmZhY3RvcgkAZAIFBnRva2VucwUKaW5Qcm90b2NvbAUDbmlsCQDMCAIJAQhjaGFuZ2VCeQIJARt0b3RhbERlcG9zaXRlZEJ5RmFjdG9yU3RvcmUBBQZmYWN0b3IFBnRva2VucwUDbmlsCQDOCAIJAM4IAgUEYmFzZQUJdG9rZW5EYXRhBQptb25pdG9yaW5nCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCwFpAQt0b3RhbEd2aXJlcwAJAJQKAgUDbmlsCQEHZm9ybXVsYQIJAQEtAQkAZQIFBkhFSUdIVAUNaW5pdGlhbEhlaWdodAUSdG90YWxWaXJ0dWFsVG9rZW5zAWkBE3NoYXJlUHJvZml0TWFudWFsbHkABAZjaGVja3MJAQlvcEFsbG93ZWQBAhhzaGFyZV9kaXZpZGVuZHNfbWFudWFsbHkDCQAAAgUGY2hlY2tzBQZjaGVja3MEDnBheW1lbnRBc3NldElkCQEKYXNzZXRJZFN0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAMJAQEhAQkBCGNvbnRhaW5zAgUSZGl2aWRlbmRhYmxlVG9rZW5zBQ5wYXltZW50QXNzZXRJZAkAAgECEGJhZCBwcm9maXQgdG9rZW4EA2FtdAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAMwIAgkBCGNoYW5nZUJ5AgkBGnRvdGFsVmlydHVhbERpdmlkZW5kc1N0b3JlAQUOcGF5bWVudEFzc2V0SWQFA2FtdAkAzAgCCQEIY2hhbmdlQnkCCQEXdG90YWxSZWFsRGl2aWRlbmRzU3RvcmUBBQ5wYXltZW50QXNzZXRJZAUDYW10BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEXc2hhcmVQcm9maXRGcm9tUmVzZXJ2ZXMACQEZY2xhaW1Gcm9tUmVzZXJ2ZXNJbnRlcm5hbAABaQEEaW5pdAINY29uZmlnQWRkcmVzcwV2aXJlcwkAzAgCCQEQd3JpdGVDb25zdFN0cmluZwIFC2NvbmZpZ1N0b3JlBQ1jb25maWdBZGRyZXNzCQDMCAIJARB3cml0ZUNvbnN0U3RyaW5nAgURdmlyZXNBc3NldElkU3RvcmUFBXZpcmVzBQNuaWwBaQEFaW5pdDIAAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIWb25seSBzZWxmIGNhbiBjb250aW51ZQkAzAgCCQEId3JpdGVJbnQCBRJpbml0aWFsSGVpZ2h0U3RvcmUFBkhFSUdIVAUDbmlsAWkBB2xvY2tGb3ICBHVzZXIGZmFjdG9yBAZjaGVja3MJAQd0aHJvd0lmAgMJAQIhPQIJAKUIAQgFAWkGY2FsbGVyBQR1c2VyCQECIT0CCAUBaQZjYWxsZXIFBG1haW4HAiJvbmx5IG1haW4gYW5kIHVzZXIgZGlyZWN0bHkgY2FuIGRvAwkAAAIFBmNoZWNrcwUGY2hlY2tzCQEKdXBkYXRlVXNlcgMFBHVzZXIJAQx2aXJlc1BheW1lbnQBBQFpBQZmYWN0b3IJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQETd2l0aGRyYXdVbmxvY2tlZEZvcgEEdXNlcgQGY2hlY2tzAwkBB3Rocm93SWYCAwkBAiE9AgkApQgBCAUBaQZjYWxsZXIFBHVzZXIJAQIhPQIIBQFpBmNhbGxlcgUEbWFpbgcCIm9ubHkgbWFpbiBhbmQgdXNlciBkaXJlY3RseSBjYW4gZG8JAQlvcEFsbG93ZWQBAhd3aXRoZHJhd191bmxvY2tlZF92aXJlcwcDCQAAAgUGY2hlY2tzBQZjaGVja3MEBGFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHVzZXIEDSR0MDE3NzIwMTc3OTgJAQ11c2VyVmlyZXNEYXRhAQUEdXNlcgQJZGVwb3NpdGVkCAUNJHQwMTc3MjAxNzc5OAJfMQQGbG9ja2VkCAUNJHQwMTc3MjAxNzc5OAJfMgQMd2l0aGRyYXdhYmxlCAUNJHQwMTc3MjAxNzc5OAJfMwQJd2l0aGRyYXduCAUNJHQwMTc3MjAxNzc5OAJfNAQGZ1ZpcmVzCAUNJHQwMTc3MjAxNzc5OAJfNQMJAGcCAAAFDHdpdGhkcmF3YWJsZQUDbmlsBAp1c2VyVXBkYXRlAwkBDHVzZXJPZmZDbGlmZgEFBHVzZXIEDSR0MDE3OTA3MTc5NjEJAQ51c2VyUHJvZml0RGF0YQEFBHVzZXIEDXZpcnR1YWxUb2tlbnMIBQ0kdDAxNzkwNzE3OTYxAl8xBAp0b2tlbnNEYXRhCAUNJHQwMTc5MDcxNzk2MQJfMgQEYmFzZQkAzAgCCQELRGVsZXRlRW50cnkBCQEPdXNlckZhY3RvclN0b3JlAQUEdXNlcgkAzAgCCQELRGVsZXRlRW50cnkBCQEUdXNlckVudHJ5SGVpZ2h0U3RvcmUBBQR1c2VyCQDMCAIJAQtEZWxldGVFbnRyeQEJARh1c2VyV2l0aGRyYXduVG9rZW5zU3RvcmUBBQR1c2VyCQDMCAIJAQtEZWxldGVFbnRyeQEJARh1c2VyRGVwb3NpdGVkVG9rZW5zU3RvcmUBBQR1c2VyCQDMCAIJAQtEZWxldGVFbnRyeQEJARZ1c2VyVmlydHVhbFRva2Vuc1N0b3JlAQUEdXNlcgkAzAgCCQELY2hhbmdlQnlTdHICBRd0b3RhbFZpcnR1YWxUb2tlbnNTdG9yZQkBAS0BBQx3aXRoZHJhd2FibGUFA25pbAQJdG9rZW5EYXRhCgEEZm9sZAIFdG90YWwEaXRlbQQNJHQwMTg1MDgxODUzNwUEaXRlbQQDYWlkCAUNJHQwMTg1MDgxODUzNwJfMQQDY2VkCAUNJHQwMTg1MDgxODUzNwJfMgQCYXYIBQ0kdDAxODUwODE4NTM3Al8zBAJuYwgFDSR0MDE4NTA4MTg1MzcCXzQJAM4IAgUFdG90YWwJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBGXVzZXJEaXZpZGVuZHNDbGFpbWVkU3RvcmUCBQR1c2VyBQNhaWQJAMwIAgkBDEludGVnZXJFbnRyeQIJARV1c2VyRGl2aWRlbmRzQWRqU3RvcmUCBQR1c2VyBQNhaWQJAQEtAQUCYXYJAMwIAgkBDEludGVnZXJFbnRyeQIJARp0b3RhbFZpcnR1YWxEaXZpZGVuZHNTdG9yZQEFA2FpZAkAawMJARV0b3RhbFZpcnR1YWxEaXZpZGVuZHMBBQNhaWQJAGUCBRJ0b3RhbFZpcnR1YWxUb2tlbnMFDHdpdGhkcmF3YWJsZQUSdG90YWxWaXJ0dWFsVG9rZW5zBQNuaWwKAAIkbAUKdG9rZW5zRGF0YQoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEZm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUCQDOCAIFBGJhc2UFCXRva2VuRGF0YQkAzAgCCQEIY2hhbmdlQnkCCQEYdXNlcldpdGhkcmF3blRva2Vuc1N0b3JlAQUEdXNlcgUMd2l0aGRyYXdhYmxlBQNuaWwJAM4IAgUKdXNlclVwZGF0ZQkAzAgCCQEIY2hhbmdlQnkCCQEbdG90YWxEZXBvc2l0ZWRCeUZhY3RvclN0b3JlAQkBCnVzZXJGYWN0b3IBBQR1c2VyCQEBLQEFDHdpdGhkcmF3YWJsZQkAzAgCCQEIY2hhbmdlQnkCBRl0b3RhbERlcG9zaXRlZFRva2Vuc1N0b3JlCQEBLQEFDHdpdGhkcmF3YWJsZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQRhZGRyBQx3aXRoZHJhd2FibGUFDHZpcmVzQXNzZXRJZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC2NsYWltUHJvZml0AwRmcm9tAnRvBnJlbG9jawQNdmFsaWREZWxlZ2F0ZQMJAAACBQRmcm9tBQJ0bwYEByRtYXRjaDAJAJ0IAgUEdGhpcwkArAICAhFkZWxlZ2F0aW9uX2NsYWltXwUEZnJvbQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAEBGRhdGEJALUJAgUBcwIBfAMJAQIhPQIFAnRvCQCRAwIFBGRhdGEAAAkAAgEJAKwCAgIZbm8gZGVsZWdhdGlvbiByaWdodHMgZm9yIAUCdG8DAwUGcmVsb2NrCQECIT0CCQCRAwIFBGRhdGEAAQIBMQcJAAIBAithdHRlbXB0aW5nIHRvIHJlbG9jayB3aGlsZSBpdCdzIG5vdCBhbGxvd2VkBgkAAgEJAKwCAgIeZGVsZWdhdGlvbiBub3QgY29uZmlndXJlZCBmb3IgBQRmcm9tBAZjaGVja3MDAwkBCG1haW5Pbmx5AQUBaQkBCW9wQWxsb3dlZAECD2NsYWltX2RpdmlkZW5kcwcFDXZhbGlkRGVsZWdhdGUHAwkAAAIFBmNoZWNrcwUGY2hlY2tzBAZ0b0FkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAnRvBA0kdDAyMDA3MzIwMTI2CQEOdXNlclByb2ZpdERhdGEBBQRmcm9tBA12aXJ0dWFsVG9rZW5zCAUNJHQwMjAwNzMyMDEyNgJfMQQKdG9rZW5zRGF0YQgFDSR0MDIwMDczMjAxMjYCXzIECXJlbG9ja2luZwMFBnJlbG9jawkBCnVwZGF0ZVVzZXIDBQRmcm9tAAAJAQp1c2VyRmFjdG9yAQUEZnJvbQUDbmlsBAl0b2tlbkRhdGEKAQRmb2xkAgV0b3RhbARpdGVtBA0kdDAyMDMzODIwMzY3BQRpdGVtBANhaWQIBQ0kdDAyMDMzODIwMzY3Al8xBANjZWQIBQ0kdDAyMDMzODIwMzY3Al8yBAJhdggFDSR0MDIwMzM4MjAzNjcCXzMEAm5jCAUNJHQwMjAzMzgyMDM2NwJfNAkAzggCBQV0b3RhbAkAzAgCCQEIY2hhbmdlQnkCCQEZdXNlckRpdmlkZW5kc0NsYWltZWRTdG9yZQIFBGZyb20FA2FpZAUCYXYJAMwIAgkBCGNoYW5nZUJ5AgkBHnRvdGFsUmVhbERpdmlkZW5kc0NsYWltZWRTdG9yZQEFA2FpZAUCYXYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGdG9BZGRyBQJhdgkBB2Fzc2V0SWQBBQNhaWQFA25pbAoAAiRsBQp0b2tlbnNEYXRhCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQJAM4IAgUJcmVsb2NraW5nBQl0b2tlbkRhdGEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQESc2V0Q2xhaW1EZWxlZ2F0aW9uAgdhZGRyZXNzBnJlbG9jawQGY2hlY2tzCQEJb3BBbGxvd2VkAQIUc2V0X2RlbGVnYXRpb25fY2xhaW0DCQAAAgUGY2hlY2tzBQZjaGVja3MDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFB2FkZHJlc3MJAAIBAgtiYWQgYWRkcmVzcwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgICEWRlbGVnYXRpb25fY2xhaW1fCQClCAEIBQFpBmNhbGxlcgkArAICCQCsAgIFB2FkZHJlc3MCAXwDBQZyZWxvY2sCATECATAFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARVyZW1vdmVDbGFpbURlbGVnYXRpb24ABAZjaGVja3MJAQlvcEFsbG93ZWQBAhRzZXRfZGVsZWdhdGlvbl9jbGFpbQMJAAACBQZjaGVja3MFBmNoZWNrcwkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgICEWRlbGVnYXRpb25fY2xhaW1fCQClCAEIBQFpBmNhbGxlcgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCXVzZXJQb3dlcgEEdXNlcgkAlAoCBQNuaWwJAQp1c2VyR1ZpcmVzAQUEdXNlcgECdHgBBnZlcmlmeQAEBEJBU0UA6AcEC3F1b3J1bVJhdGlvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNY29uZmlnQWRkcmVzcwIVcHJvcG9zYWxfcXVvcnVtX3JhdGlvAiJwcm9wb3NhbFF1b3J1bVJhdGlvIGlzIG5vdCBkZWZpbmVkBAtwYXNzZWRSYXRpbwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDWNvbmZpZ0FkZHJlc3MCFXByb3Bvc2FsX3Bhc3NlZF9yYXRpbwIlcHJvcG9zYWxUaHJlc2hvbGRSYXRpbyBpcyBub3QgZGVmaW5lZAQOZ1ZpcmVzQ29udHJhY3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwISZGl2aWRlbmRzX2NvbnRyYWN0AhVubyBkaXZpZGVuZHNfY29udHJhY3QCGmludmFsaWQgZGl2aWRlbmRzX2NvbnRyYWN0BA52b3RpbmdDb250cmFjdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ1jb25maWdBZGRyZXNzAg92b3RpbmdfY29udHJhY3QCEm5vIHZvdGluZ19jb250cmFjdAIXaW52YWxpZCB2b3RpbmdfY29udHJhY3QEAmlkCQDYBAEIBQJ0eAJpZAQIdm90ZXNZZXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUOdm90aW5nQ29udHJhY3QJAKwCAgINcHJvcG9zYWxfeWVzXwUCaWQAAAQHdm90ZXNObwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ52b3RpbmdDb250cmFjdAkArAICAgxwcm9wb3NhbF9ub18FAmlkAAAEDnByb3Bvc2FsSGVpZ2h0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUOdm90aW5nQ29udHJhY3QJAKwCAgIQcHJvcG9zYWxfaGVpZ2h0XwUCaWQCF3Byb3Bvc2FsIG5vdCByZWdpc3RlcmVkBAphcHBseVN0YXJ0CQELdmFsdWVPckVsc2UCCQCaCAIFDnZvdGluZ0NvbnRyYWN0CQCsAgICFHByb3Bvc2FsX2FwcGx5c3RhcnRfBQJpZAAABAhhcHBseUVuZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ52b3RpbmdDb250cmFjdAkArAICAhJwcm9wb3NhbF9hcHBseWVuZF8FAmlkAAAEC3RvdGFsR1ZpcmVzCQELdmFsdWVPckVsc2UCCQCaCAIFDnZvdGluZ0NvbnRyYWN0CQCsAgICEHByb3Bvc2FsX2d2aXJlc18FAmlkAAAEB2VuYWJsZWQJAQt2YWx1ZU9yRWxzZQIJAJsIAgUNY29uZmlnQWRkcmVzcwIdb3BfZ292ZXJuYW5jZV9hcHBseV90eF9wYXVzZWQHBAd2b3RlWWVzBQh2b3Rlc1llcwQGdm90ZU5vBQd2b3Rlc05vBAp0b3RhbFZvdGVzCQBkAgUHdm90ZVllcwUGdm90ZU5vBAloYXNRdW9ydW0JAGcCCQBpAgkAaAIFCnRvdGFsVm90ZXMFBEJBU0UFC3RvdGFsR1ZpcmVzBQtxdW9ydW1SYXRpbwQJaGFzUGFzc2VkCQBnAgkAaQIJAGgCBQd2b3RlWWVzBQRCQVNFBQp0b3RhbFZvdGVzBQtwYXNzZWRSYXRpbwQIdG9vRWFybHkJAGcCBQphcHBseVN0YXJ0BQZIRUlHSFQEB3Rvb0xhdGUJAGcCBQZIRUlHSFQFCGFwcGx5RW5kBAl0aW1lRGVidWcJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIRcHJvcG9zYWxIZWlnaHQgPSAJAKQDAQUOcHJvcG9zYWxIZWlnaHQCDywgYXBwbHlTdGFydCA9IAkApAMBBQphcHBseVN0YXJ0Ag0sIGFwcGx5RW5kID0gCQCkAwEFCGFwcGx5RW5kAgssIEhFSUdIVCA9IAkApAMBBQZIRUlHSFQECGJ5Vm90aW5nAwkBASEBBQdlbmFibGVkCQACAQIrdHggYXBwbGljYXRpb24gdGhyb3cgZ292ZXJuYW5jZSBub3QgZW5hYmxlZAMFCHRvb0Vhcmx5CQACAQkArAICAi5wcm9wb3NhbCBjYW4ndCBiZSBleGVjdXRlZCBhcyBpdCdzIHRvbyBlYXJseTogBQl0aW1lRGVidWcDBQd0b29MYXRlCQACAQkArAICAixwcm9wb3NhbCBjYW4ndCBiZSBleGVjdXRlZCBhcyBpdCdzIHRvbyBsYXRlOgUJdGltZURlYnVnAwkBASEBBQloYXNRdW9ydW0JAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgtubyBxdW9ydW06IAIMdG90YWxWb3RlczogCQCkAwEFCnRvdGFsVm90ZXMCDywgdG90YWxHVmlyZXM6IAkApAMBBQt0b3RhbEdWaXJlcwIPLCBxdW9ydW1SYXRpbzogCQCkAwEFC3F1b3J1bVJhdGlvAwkBASEBBQloYXNQYXNzZWQJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhdubyB0aHJlc2hvbGQgYWNoaWV2ZWQ6IAIJdm90ZVllczogCQCkAwEFB3ZvdGVZZXMCCiwgdm90ZU5vOiAJAKQDAQUGdm90ZU5vAg8sIHBhc3NlZFJhdGlvOiAJAKQDAQULcGFzc2VkUmF0aW8GAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQYFCGJ5Vm90aW5nXTrhJg==", "chainId": 87, "height": 3680469, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4qURb1iKUNxw1LMUduUixttWjZbSTGL9QKcoWHahqXTb Next: none Diff:
OldNewDifferences
5151
5252 let viresAssetId = valueOrErrorMessage(fromBase58String(viresIdStr), "invalid vires assetId")
5353
54-func assetId (s) = if ((s == "WAVES"))
55- then unit
56- else fromBase58String(split(s, "_")[0])
54+func assetId (s) = {
55+ let assetIdPart = split(s, "_")[0]
56+ if ((assetIdPart == "WAVES"))
57+ then unit
58+ else fromBase58String(assetIdPart)
59+ }
5760
5861
5962 func assetIdStr (aid) = match aid {
268271 then totals
269272 else {
270273 let aid = dividendableTokensArr[index]
271- let $t085418830 = {
274+ let $t085948883 = {
272275 let r = valueOrErrorMessage(addressFromString(dividendableReserves[index]), "bad reserve in dividendableReserves")
273276 asIntStrInt(invoke(r, "getReserveDivsInfo", nil, nil))
274277 }
275- let reserveDivs = $t085418830._1
276- let reserveAssetId = $t085418830._2
277- let nonClaimable = $t085418830._3
278+ let reserveDivs = $t085948883._1
279+ let reserveAssetId = $t085948883._2
280+ let nonClaimable = $t085948883._3
278281 if ((reserveAssetId != aid))
279282 then throw(((((((("inconsistent configuration: reserveAssetId=" + reserveAssetId) + ", aid=") + aid) + ", dividendableTokens:") + dividendableTokens) + ", dividendableReserves:") + dividendableReservesStr))
280283 else {
336339 else {
337340 let recoveryAmount = fraction(amount, recoveryAddressShare, 100)
338341 let dividentsAmount = (amount - recoveryAmount)
339-[changeBy(totalVirtualDividendsStore(assetIdString), dividentsAmount), changeBy(totalRealDividendsStore(assetIdString), dividentsAmount), ScriptTransfer(recoveryAddress, recoveryAmount, assetId(assetIdString))]
342+[changeBy(totalVirtualDividendsStore(assetIdString), dividentsAmount), changeBy(totalRealDividendsStore(assetIdString), dividentsAmount), changeBy(recoveryAllocStore(assetIdString), recoveryAmount), ScriptTransfer(recoveryAddress, recoveryAmount, assetId(assetIdString))]
340343 }
341344 else throw("Strict value is not equal to itself.")
342345 }
359362
360363
361364 func adviseUser (user) = {
362- let $t01213612226 = userViresData(user)
363- let deposited = $t01213612226._1
364- let locked = $t01213612226._2
365- let withdrawable = $t01213612226._3
366- let withdrawn = $t01213612226._4
367- let inProtocol = $t01213612226._5
368- let gVires = $t01213612226._6
369- let $t01223112284 = userProfitData(user)
370- let virtualTokens = $t01223112284._1
371- let tokenData = $t01223112284._2
365+ let $t01218812278 = userViresData(user)
366+ let deposited = $t01218812278._1
367+ let locked = $t01218812278._2
368+ let withdrawable = $t01218812278._3
369+ let withdrawn = $t01218812278._4
370+ let inProtocol = $t01218812278._5
371+ let gVires = $t01218812278._6
372+ let $t01228312336 = userProfitData(user)
373+ let virtualTokens = $t01228312336._1
374+ let tokenData = $t01228312336._2
372375 let power = if ((inProtocol == 0))
373376 then 0
374377 else fraction(10000, gVires, inProtocol)
375378 let base = (((((((((((((((((((" deposited = " + toString(deposited)) + ", virtualTokens = ") + toString(virtualTokens)) + ", locked = ") + toString(locked)) + ", withdrawable = ") + toString(withdrawable)) + ", withdrawn = ") + toString(withdrawn)) + ", inProtocol = ") + toString(inProtocol)) + ", entryHeight = ") + toString(userEntryHeight(user))) + ", factor = ") + toString(userFactor(user))) + ", gVires = ") + toString(gVires)) + ", power = ") + toString(power))
376379 let tokensData = {
377380 func fld (totals,item) = {
378- let $t01295812985 = item
379- let aid = $t01295812985._1
380- let ced = $t01295812985._2
381- let av = $t01295812985._3
382- let nc = $t01295812985._4
381+ let $t01301013037 = item
382+ let aid = $t01301013037._1
383+ let ced = $t01301013037._2
384+ let av = $t01301013037._3
385+ let nc = $t01301013037._4
383386 ((((((((((totals + ", [ ") + "assetId = ") + aid) + ", claimed = ") + toString(ced)) + ", claimable = ") + toString(av)) + ", nonClaimable = ") + toString(nc)) + "]")
384387 }
385388
435438 if ((currentFactor > factor))
436439 then throw("can't downgrade boosting")
437440 else {
438- let $t01435514441 = userViresData(user)
439- let deposited = $t01435514441._1
440- let locked = $t01435514441._2
441- let withdrawable = $t01435514441._3
442- let withdrawn = $t01435514441._4
443- let inProtocol = $t01435514441._5
444- let gV = $t01435514441._6
441+ let $t01440714493 = userViresData(user)
442+ let deposited = $t01440714493._1
443+ let locked = $t01440714493._2
444+ let withdrawable = $t01440714493._3
445+ let withdrawn = $t01440714493._4
446+ let inProtocol = $t01440714493._5
447+ let gV = $t01440714493._6
445448 let oldVirtualTokens = userVirtualTokens(user)
446449 let newVirtualTokens = formula((HEIGHT - initialHeight), (factor * (tokens + inProtocol)))
447450 let diff = (newVirtualTokens - oldVirtualTokens)
541544 if ((checks == checks))
542545 then {
543546 let addr = addressFromStringValue(user)
544- let $t01766817746 = userViresData(user)
545- let deposited = $t01766817746._1
546- let locked = $t01766817746._2
547- let withdrawable = $t01766817746._3
548- let withdrawn = $t01766817746._4
549- let gVires = $t01766817746._5
547+ let $t01772017798 = userViresData(user)
548+ let deposited = $t01772017798._1
549+ let locked = $t01772017798._2
550+ let withdrawable = $t01772017798._3
551+ let withdrawn = $t01772017798._4
552+ let gVires = $t01772017798._5
550553 if ((0 >= withdrawable))
551554 then nil
552555 else {
553556 let userUpdate = if (userOffCliff(user))
554557 then {
555- let $t01785517909 = userProfitData(user)
556- let virtualTokens = $t01785517909._1
557- let tokensData = $t01785517909._2
558+ let $t01790717961 = userProfitData(user)
559+ let virtualTokens = $t01790717961._1
560+ let tokensData = $t01790717961._2
558561 let base = [DeleteEntry(userFactorStore(user)), DeleteEntry(userEntryHeightStore(user)), DeleteEntry(userWithdrawnTokensStore(user)), DeleteEntry(userDepositedTokensStore(user)), DeleteEntry(userVirtualTokensStore(user)), changeByStr(totalVirtualTokensStore, -(withdrawable))]
559562 let tokenData = {
560563 func fold (total,item) = {
561- let $t01845618485 = item
562- let aid = $t01845618485._1
563- let ced = $t01845618485._2
564- let av = $t01845618485._3
565- let nc = $t01845618485._4
564+ let $t01850818537 = item
565+ let aid = $t01850818537._1
566+ let ced = $t01850818537._2
567+ let av = $t01850818537._3
568+ let nc = $t01850818537._4
566569 (total ++ [DeleteEntry(userDividendsClaimedStore(user, aid)), IntegerEntry(userDividendsAdjStore(user, aid), -(av)), IntegerEntry(totalVirtualDividendsStore(aid), fraction(totalVirtualDividends(aid), (totalVirtualTokens - withdrawable), totalVirtualTokens))])
567570 }
568571
615618 if ((checks == checks))
616619 then {
617620 let toAddr = addressFromStringValue(to)
618- let $t02002120074 = userProfitData(from)
619- let virtualTokens = $t02002120074._1
620- let tokensData = $t02002120074._2
621+ let $t02007320126 = userProfitData(from)
622+ let virtualTokens = $t02007320126._1
623+ let tokensData = $t02007320126._2
621624 let relocking = if (relock)
622625 then updateUser(from, 0, userFactor(from))
623626 else nil
624627 let tokenData = {
625628 func fold (total,item) = {
626- let $t02028620315 = item
627- let aid = $t02028620315._1
628- let ced = $t02028620315._2
629- let av = $t02028620315._3
630- let nc = $t02028620315._4
629+ let $t02033820367 = item
630+ let aid = $t02033820367._1
631+ let ced = $t02033820367._2
632+ let av = $t02033820367._3
633+ let nc = $t02033820367._4
631634 (total ++ [changeBy(userDividendsClaimedStore(from, aid), av), changeBy(totalRealDividendsClaimedStore(aid), av), ScriptTransfer(toAddr, av, assetId(aid))])
632635 }
633636
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func asInt (value) = match value {
55 case int: Int =>
66 int
77 case _ =>
88 throw("wrong type, expected: Int")
99 }
1010
1111
1212 func asIntStrInt (value) = match value {
1313 case intStrInt: (Int, String, Int) =>
1414 intStrInt
1515 case intStr: (Int, String) =>
1616 $Tuple3(intStr._1, intStr._2, 0)
1717 case _ =>
1818 throw("wrong type, expected: (Int, String)")
1919 }
2020
2121
2222 func factorCheck (factor) = if (if (if ((factor != 1))
2323 then (factor != 2)
2424 else false)
2525 then (factor != 4)
2626 else false)
2727 then throw("bad factor")
2828 else factor
2929
3030
3131 let viresAssetIdStore = "viresAssetId"
3232
3333 let initialHeightStore = "initialHeight"
3434
3535 let initialHeight = getIntegerValue(this, initialHeightStore)
3636
3737 let configStore = "config"
3838
3939 let configAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, configStore), "exp-dividends: no configAddress")), "invalid config address")
4040
4141 let maybeOracleAddress = match getString(configAddress, "oracle_address") {
4242 case s: String =>
4343 addressFromString(s)
4444 case _ =>
4545 unit
4646 }
4747
4848 let HEIGHT = height
4949
5050 let viresIdStr = valueOrErrorMessage(getString(this, viresAssetIdStore), "vires assetId not found")
5151
5252 let viresAssetId = valueOrErrorMessage(fromBase58String(viresIdStr), "invalid vires assetId")
5353
54-func assetId (s) = if ((s == "WAVES"))
55- then unit
56- else fromBase58String(split(s, "_")[0])
54+func assetId (s) = {
55+ let assetIdPart = split(s, "_")[0]
56+ if ((assetIdPart == "WAVES"))
57+ then unit
58+ else fromBase58String(assetIdPart)
59+ }
5760
5861
5962 func assetIdStr (aid) = match aid {
6063 case bv: ByteVector =>
6164 toBase58String(bv)
6265 case u: Unit =>
6366 "WAVES"
6467 case _ =>
6568 throw("Match error")
6669 }
6770
6871
6972 func throwIf (condition,error) = if (condition)
7073 then throw(error)
7174 else true
7275
7376
7477 func writeInt (key,value) = if ((0 > value))
7578 then throw(((("writing negative value " + toString(value)) + " for key ") + key))
7679 else IntegerEntry(key, value)
7780
7881
7982 func writeStrInt (key,value) = if ((0 > value))
8083 then throw(((("writing negative value " + toString(value)) + " for key ") + key))
8184 else StringEntry(key, toString(value))
8285
8386
8487 func writeString (key,value) = StringEntry(key, value)
8588
8689
8790 func writeConstString (key,value) = if (!(isDefined(getString(this, key))))
8891 then StringEntry(key, value)
8992 else throw(("already initialized: " + key))
9093
9194
9295 func changeBy (key,value) = writeInt(key, (valueOrElse(getInteger(this, key), 0) + value))
9396
9497
9598 func changeByStr (key,value) = writeStrInt(key, (parseIntValue(valueOrElse(getString(this, key), "0")) + value))
9699
97100
98101 func viresPayment (i) = if ((size(i.payments) == 0))
99102 then 0
100103 else if ((i.payments[0].assetId != viresAssetId))
101104 then throw("not vires")
102105 else i.payments[0].amount
103106
104107
105108 func opAllowed (op) = match invoke(configAddress, "opAllowed", [viresIdStr, op], nil) {
106109 case b: Boolean =>
107110 if (b)
108111 then true
109112 else throw("not allowed")
110113 case _ =>
111114 throw("opAllowed: unexpected result type")
112115 }
113116
114117
115118 let viresStaker = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "vires_staker"), "no vires_staker in config")), "invalid vires_staker address")
116119
117120 let main = valueOrErrorMessage(addressFromString(split(valueOrErrorMessage(getString(configAddress, "main"), "no main"), "|")[0]), "invalid main")
118121
119122 func mainOnly (i) = if (contains(getStringValue(configAddress, "main"), toString(i.caller)))
120123 then true
121124 else throw("only main can do")
122125
123126
124127 let dividendableTokens = valueOrElse(getString(configAddress, "dividendableTokens"), "")
125128
126129 let dividendableTokensArr = if ((dividendableTokens == ""))
127130 then nil
128131 else split_4C(dividendableTokens, "|")
129132
130133 let dividendableReservesStr = valueOrElse(getString(configAddress, "dividendableReserves"), "")
131134
132135 let dividendableReserves = match dividendableReservesStr {
133136 case str: String =>
134137 if ((str == ""))
135138 then nil
136139 else split_4C(str, "|")
137140 case _ =>
138141 nil
139142 }
140143
141144 let halfLife = valueOrErrorMessage(getInteger(configAddress, "vires_lock_half_life"), "half life not set")
142145
143146 let lambda = (69314718056 / halfLife)
144147
145148 let LAMBDABASE = 8
146149
147150 let E = 271828183
148151
149152 let EBASE = 8
150153
151154 func formula (x,y0) = fraction(y0, pow(E, EBASE, fraction(lambda, x, 1000), LAMBDABASE, 8, HALFUP), 100000000)
152155
153156
154157 func userDividendsAdjStore (user,aid) = (((user + "_") + aid) + "_adj")
155158
156159
157160 func userDividendsClaimedStore (user,aid) = (((user + "_") + aid) + "_claimed")
158161
159162
160163 func userVirtualTokensStore (user) = (user + "_virtual")
161164
162165
163166 func userDepositedTokensStore (user) = (user + "_vires")
164167
165168
166169 func userWithdrawnTokensStore (user) = (user + "_vires_withdrawn")
167170
168171
169172 func userEntryHeightStore (user) = (user + "_height")
170173
171174
172175 func userFactorStore (user) = (user + "_factor")
173176
174177
175178 func userDividendsAdj (user,aid) = valueOrElse(getInteger(userDividendsAdjStore(user, aid)), 0)
176179
177180
178181 func userDividendsClaimed (user,aid) = valueOrElse(getInteger(userDividendsClaimedStore(user, aid)), 0)
179182
180183
181184 func userVirtualTokens (user) = parseIntValue(valueOrElse(getString(userVirtualTokensStore(user)), "0"))
182185
183186
184187 func userDepositedTokens (user) = valueOrElse(getInteger(userDepositedTokensStore(user)), 0)
185188
186189
187190 func userWithdrawnTokens (user) = valueOrElse(getInteger(userWithdrawnTokensStore(user)), 0)
188191
189192
190193 func userEntryHeight (user) = valueOrElse(getInteger(userEntryHeightStore(user)), 0)
191194
192195
193196 func userFactor (user) = valueOrElse(getInteger(userFactorStore(user)), 1)
194197
195198
196199 func userGVires (user) = formula(-((HEIGHT - initialHeight)), userVirtualTokens(user))
197200
198201
199202 func totalVirtualDividendsStore (aid) = (aid + "_totalVirtualDividends")
200203
201204
202205 func totalRealDividendsStore (aid) = (aid + "_totalRealDividends")
203206
204207
205208 func recoveryAllocStore (aid) = (aid + "_recoveryAllocations")
206209
207210
208211 func totalRealDividendsClaimedStore (aid) = (aid + "_totalRealDividendsClaimed")
209212
210213
211214 let totalVirtualTokensStore = "totalVirtualTokens"
212215
213216 let totalDepositedTokensStore = "totalDepositedTokens"
214217
215218 func totalDepositedByFactorStore (factor) = ("totalDepositedTokens" + toString(factorCheck(factor)))
216219
217220
218221 func totalDepositedByFactor (factor) = valueOrElse(getInteger(totalDepositedByFactorStore(factor)), 0)
219222
220223
221224 func totalVirtualDividends (aid) = valueOrElse(getInteger(this, totalVirtualDividendsStore(aid)), 0)
222225
223226
224227 func totalRealDividends (aid) = valueOrElse(getInteger(this, totalRealDividendsStore(aid)), 0)
225228
226229
227230 let totalVirtualTokens = parseIntValue(valueOrElse(getString(this, totalVirtualTokensStore), "0"))
228231
229232 let totalDepositedTokens = valueOrElse(getInteger(this, totalDepositedTokensStore), 0)
230233
231234 func userOffCliff (user) = {
232235 let entryHeight = userEntryHeight(user)
233236 let factor = userFactor(user)
234237 if ((factor == 1))
235238 then (HEIGHT > (entryHeight + (4 * halfLife)))
236239 else if ((factor == 2))
237240 then (HEIGHT > (entryHeight + (5 * halfLife)))
238241 else if ((factor == 4))
239242 then (HEIGHT > (entryHeight + (6 * halfLife)))
240243 else throw(("bad factor:" + toString(factor)))
241244 }
242245
243246
244247 func userViresData (user) = {
245248 let deposited = userDepositedTokens(user)
246249 let gV = userGVires(user)
247250 let supposedLocked = min([deposited, gV])
248251 let locked = if (userOffCliff(user))
249252 then 0
250253 else supposedLocked
251254 let unlocked = (deposited - locked)
252255 let withdrawn = userWithdrawnTokens(user)
253256 let withdrawable = (unlocked - withdrawn)
254257 let inProtocol = (locked + withdrawable)
255258 $Tuple6(deposited, locked, withdrawable, withdrawn, inProtocol, gV)
256259 }
257260
258261
259262 func userProfitData (user) = {
260263 let totalTokens = size(dividendableTokensArr)
261264 let totalDividendableReserves = size(dividendableReserves)
262265 if ((totalTokens != totalDividendableReserves))
263266 then throw(((("inconsistent configuration: totalTokens=" + toString(totalTokens)) + ", totalDividendableReserves = ") + toString(totalDividendableReserves)))
264267 else {
265268 let virtualTokens = userVirtualTokens(user)
266269 let tokenData = {
267270 func fold (totals,index) = if ((index >= totalTokens))
268271 then totals
269272 else {
270273 let aid = dividendableTokensArr[index]
271- let $t085418830 = {
274+ let $t085948883 = {
272275 let r = valueOrErrorMessage(addressFromString(dividendableReserves[index]), "bad reserve in dividendableReserves")
273276 asIntStrInt(invoke(r, "getReserveDivsInfo", nil, nil))
274277 }
275- let reserveDivs = $t085418830._1
276- let reserveAssetId = $t085418830._2
277- let nonClaimable = $t085418830._3
278+ let reserveDivs = $t085948883._1
279+ let reserveAssetId = $t085948883._2
280+ let nonClaimable = $t085948883._3
278281 if ((reserveAssetId != aid))
279282 then throw(((((((("inconsistent configuration: reserveAssetId=" + reserveAssetId) + ", aid=") + aid) + ", dividendableTokens:") + dividendableTokens) + ", dividendableReserves:") + dividendableReservesStr))
280283 else {
281284 let userVirtualDivs = if ((totalVirtualTokens == 0))
282285 then 0
283286 else fraction((totalVirtualDividends(aid) + reserveDivs), virtualTokens, totalVirtualTokens)
284287 let adj = userDividendsAdj(user, aid)
285288 let userDivs = (userVirtualDivs - adj)
286289 let nonClaimableUserDivs = if ((totalVirtualTokens == 0))
287290 then 0
288291 else fraction(nonClaimable, virtualTokens, totalVirtualTokens)
289292 let userClaimed = userDividendsClaimed(user, aid)
290293 let claimable = max([0, (userDivs - userClaimed)])
291294 if ((0 > claimable))
292295 then throw(("claimable < 0: " + toString(claimable)))
293296 else (totals ++ [$Tuple4(aid, userClaimed, claimable, nonClaimableUserDivs)])
294297 }
295298 }
296299
297300 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
298301 let $s = size($l)
299302 let $acc0 = nil
300303 func $f0_1 ($a,$i) = if (($i >= $s))
301304 then $a
302305 else fold($a, $l[$i])
303306
304307 func $f0_2 ($a,$i) = if (($i >= $s))
305308 then $a
306309 else throw("List size exceeds 20")
307310
308311 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
309312 }
310313 $Tuple2(virtualTokens, tokenData)
311314 }
312315 }
313316
314317
315318 func claimFromReservesInternal () = {
316319 let assetIdStore = "assetId"
317320 let recoveryAddressShare = valueOrElse(getInteger(configAddress, "recovery_address_share"), 0)
318321 let recoveryReservesStr = valueOrElse(getString(configAddress, "recovery_reserves"), "")
319322 let recoveryAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "recovery_address"), "fond address not found")), "fond address is invalid")
320323 func fold (output,reserve) = {
321324 let reserveAddress = valueOrErrorMessage(addressFromString(reserve), "adder: bad reserve address")
322325 let assetIdString = valueOrErrorMessage(getString(reserveAddress, assetIdStore), "no assetId in reserve")
323326 let actions = if (!(contains(dividendableTokens, assetIdString)))
324327 then throw("inconsistent configuration: dividendableReserve's asset id is not stored in dividendableTokens")
325328 else {
326329 let amount = asInt(invoke(reserveAddress, "withdrawFromReserve", [-1], nil))
327330 if ((amount == amount))
328331 then if ((0 > amount))
329332 then throw("bad amount")
330333 else if ((amount == 0))
331334 then nil
332335 else if (if ((recoveryAddressShare == 0))
333336 then true
334337 else !(contains(recoveryReservesStr, reserve)))
335338 then [changeBy(totalVirtualDividendsStore(assetIdString), amount), changeBy(totalRealDividendsStore(assetIdString), amount)]
336339 else {
337340 let recoveryAmount = fraction(amount, recoveryAddressShare, 100)
338341 let dividentsAmount = (amount - recoveryAmount)
339-[changeBy(totalVirtualDividendsStore(assetIdString), dividentsAmount), changeBy(totalRealDividendsStore(assetIdString), dividentsAmount), ScriptTransfer(recoveryAddress, recoveryAmount, assetId(assetIdString))]
342+[changeBy(totalVirtualDividendsStore(assetIdString), dividentsAmount), changeBy(totalRealDividendsStore(assetIdString), dividentsAmount), changeBy(recoveryAllocStore(assetIdString), recoveryAmount), ScriptTransfer(recoveryAddress, recoveryAmount, assetId(assetIdString))]
340343 }
341344 else throw("Strict value is not equal to itself.")
342345 }
343346 (output ++ actions)
344347 }
345348
346349 let $l = dividendableReserves
347350 let $s = size($l)
348351 let $acc0 = nil
349352 func $f0_1 ($a,$i) = if (($i >= $s))
350353 then $a
351354 else fold($a, $l[$i])
352355
353356 func $f0_2 ($a,$i) = if (($i >= $s))
354357 then $a
355358 else throw("List size exceeds 20")
356359
357360 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
358361 }
359362
360363
361364 func adviseUser (user) = {
362- let $t01213612226 = userViresData(user)
363- let deposited = $t01213612226._1
364- let locked = $t01213612226._2
365- let withdrawable = $t01213612226._3
366- let withdrawn = $t01213612226._4
367- let inProtocol = $t01213612226._5
368- let gVires = $t01213612226._6
369- let $t01223112284 = userProfitData(user)
370- let virtualTokens = $t01223112284._1
371- let tokenData = $t01223112284._2
365+ let $t01218812278 = userViresData(user)
366+ let deposited = $t01218812278._1
367+ let locked = $t01218812278._2
368+ let withdrawable = $t01218812278._3
369+ let withdrawn = $t01218812278._4
370+ let inProtocol = $t01218812278._5
371+ let gVires = $t01218812278._6
372+ let $t01228312336 = userProfitData(user)
373+ let virtualTokens = $t01228312336._1
374+ let tokenData = $t01228312336._2
372375 let power = if ((inProtocol == 0))
373376 then 0
374377 else fraction(10000, gVires, inProtocol)
375378 let base = (((((((((((((((((((" deposited = " + toString(deposited)) + ", virtualTokens = ") + toString(virtualTokens)) + ", locked = ") + toString(locked)) + ", withdrawable = ") + toString(withdrawable)) + ", withdrawn = ") + toString(withdrawn)) + ", inProtocol = ") + toString(inProtocol)) + ", entryHeight = ") + toString(userEntryHeight(user))) + ", factor = ") + toString(userFactor(user))) + ", gVires = ") + toString(gVires)) + ", power = ") + toString(power))
376379 let tokensData = {
377380 func fld (totals,item) = {
378- let $t01295812985 = item
379- let aid = $t01295812985._1
380- let ced = $t01295812985._2
381- let av = $t01295812985._3
382- let nc = $t01295812985._4
381+ let $t01301013037 = item
382+ let aid = $t01301013037._1
383+ let ced = $t01301013037._2
384+ let av = $t01301013037._3
385+ let nc = $t01301013037._4
383386 ((((((((((totals + ", [ ") + "assetId = ") + aid) + ", claimed = ") + toString(ced)) + ", claimable = ") + toString(av)) + ", nonClaimable = ") + toString(nc)) + "]")
384387 }
385388
386389 let $l = tokenData
387390 let $s = size($l)
388391 let $acc0 = ""
389392 func $f0_1 ($a,$i) = if (($i >= $s))
390393 then $a
391394 else fld($a, $l[$i])
392395
393396 func $f0_2 ($a,$i) = if (($i >= $s))
394397 then $a
395398 else throw("List size exceeds 20")
396399
397400 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
398401 }
399402 (base + tokensData)
400403 }
401404
402405
403406 func advise () = {
404407 let totalGvires = formula(-((HEIGHT - initialHeight)), totalVirtualTokens)
405408 let base = (((((((((((" totalDepositedTokens = " + toString(totalDepositedTokens)) + ", totalDepositedTokens1 = ") + toString(totalDepositedByFactor(1))) + ", totalDepositedTokens2 = ") + toString(totalDepositedByFactor(2))) + ", totalDepositedTokens4 = ") + toString(totalDepositedByFactor(4))) + ", totalVirtualTokens = ") + toString(totalVirtualTokens)) + ", totalGvires = ") + toString(totalGvires))
406409 func fold (total,aid) = ((((total + ", ") + aid) + " = ") + toString(totalRealDividends(aid)))
407410
408411 let $l = dividendableTokensArr
409412 let $s = size($l)
410413 let $acc0 = base
411414 func $f0_1 ($a,$i) = if (($i >= $s))
412415 then $a
413416 else fold($a, $l[$i])
414417
415418 func $f0_2 ($a,$i) = if (($i >= $s))
416419 then $a
417420 else throw("List size exceeds 20")
418421
419422 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
420423 }
421424
422425
423426 func updateUser (user,tokens,f) = {
424427 let checks = opAllowed("lock_vires")
425428 if ((checks == checks))
426429 then if (if ((f != 1))
427430 then valueOrElse(getBoolean(configAddress, "allow_boost"), false)
428431 else false)
429432 then throw("boosting not enabled")
430433 else {
431434 let factor = factorCheck(f)
432435 if ((factor == factor))
433436 then {
434437 let currentFactor = userFactor(user)
435438 if ((currentFactor > factor))
436439 then throw("can't downgrade boosting")
437440 else {
438- let $t01435514441 = userViresData(user)
439- let deposited = $t01435514441._1
440- let locked = $t01435514441._2
441- let withdrawable = $t01435514441._3
442- let withdrawn = $t01435514441._4
443- let inProtocol = $t01435514441._5
444- let gV = $t01435514441._6
441+ let $t01440714493 = userViresData(user)
442+ let deposited = $t01440714493._1
443+ let locked = $t01440714493._2
444+ let withdrawable = $t01440714493._3
445+ let withdrawn = $t01440714493._4
446+ let inProtocol = $t01440714493._5
447+ let gV = $t01440714493._6
445448 let oldVirtualTokens = userVirtualTokens(user)
446449 let newVirtualTokens = formula((HEIGHT - initialHeight), (factor * (tokens + inProtocol)))
447450 let diff = (newVirtualTokens - oldVirtualTokens)
448451 let base = [changeBy(totalDepositedTokensStore, tokens), changeByStr(totalVirtualTokensStore, diff), changeByStr(userVirtualTokensStore(user), diff), changeBy(userDepositedTokensStore(user), tokens), IntegerEntry(userEntryHeightStore(user), HEIGHT), IntegerEntry(userFactorStore(user), factor)]
449452 let tokenData = {
450453 func fold (total,aid) = {
451454 let adj = if ((totalVirtualTokens == 0))
452455 then 0
453456 else fraction(diff, totalVirtualDividends(aid), totalVirtualTokens)
454457 (total ++ [changeBy(totalVirtualDividendsStore(aid), adj), IntegerEntry(userDividendsAdjStore(user, aid), (userDividendsAdj(user, aid) + adj))])
455458 }
456459
457460 let $l = dividendableTokensArr
458461 let $s = size($l)
459462 let $acc0 = nil
460463 func $f0_1 ($a,$i) = if (($i >= $s))
461464 then $a
462465 else fold($a, $l[$i])
463466
464467 func $f0_2 ($a,$i) = if (($i >= $s))
465468 then $a
466469 else throw("List size exceeds 20")
467470
468471 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
469472 }
470473 let monitoring = if ((factor != currentFactor))
471474 then [changeBy(totalDepositedByFactorStore(currentFactor), -(inProtocol)), changeBy(totalDepositedByFactorStore(factor), (tokens + inProtocol))]
472475 else [changeBy(totalDepositedByFactorStore(factor), tokens)]
473476 ((base ++ tokenData) ++ monitoring)
474477 }
475478 }
476479 else throw("Strict value is not equal to itself.")
477480 }
478481 else throw("Strict value is not equal to itself.")
479482 }
480483
481484
482485 @Callable(i)
483486 func totalGvires () = $Tuple2(nil, formula(-((HEIGHT - initialHeight)), totalVirtualTokens))
484487
485488
486489
487490 @Callable(i)
488491 func shareProfitManually () = {
489492 let checks = opAllowed("share_dividends_manually")
490493 if ((checks == checks))
491494 then {
492495 let paymentAssetId = assetIdStr(i.payments[0].assetId)
493496 if (!(contains(dividendableTokens, paymentAssetId)))
494497 then throw("bad profit token")
495498 else {
496499 let amt = i.payments[0].amount
497500 [changeBy(totalVirtualDividendsStore(paymentAssetId), amt), changeBy(totalRealDividendsStore(paymentAssetId), amt)]
498501 }
499502 }
500503 else throw("Strict value is not equal to itself.")
501504 }
502505
503506
504507
505508 @Callable(i)
506509 func shareProfitFromReserves () = claimFromReservesInternal()
507510
508511
509512
510513 @Callable(i)
511514 func init (configAddress,vires) = [writeConstString(configStore, configAddress), writeConstString(viresAssetIdStore, vires)]
512515
513516
514517
515518 @Callable(i)
516519 func init2 () = if ((i.caller != this))
517520 then throw("only self can continue")
518521 else [writeInt(initialHeightStore, HEIGHT)]
519522
520523
521524
522525 @Callable(i)
523526 func lockFor (user,factor) = {
524527 let checks = throwIf(if ((toString(i.caller) != user))
525528 then (i.caller != main)
526529 else false, "only main and user directly can do")
527530 if ((checks == checks))
528531 then updateUser(user, viresPayment(i), factor)
529532 else throw("Strict value is not equal to itself.")
530533 }
531534
532535
533536
534537 @Callable(i)
535538 func withdrawUnlockedFor (user) = {
536539 let checks = if (throwIf(if ((toString(i.caller) != user))
537540 then (i.caller != main)
538541 else false, "only main and user directly can do"))
539542 then opAllowed("withdraw_unlocked_vires")
540543 else false
541544 if ((checks == checks))
542545 then {
543546 let addr = addressFromStringValue(user)
544- let $t01766817746 = userViresData(user)
545- let deposited = $t01766817746._1
546- let locked = $t01766817746._2
547- let withdrawable = $t01766817746._3
548- let withdrawn = $t01766817746._4
549- let gVires = $t01766817746._5
547+ let $t01772017798 = userViresData(user)
548+ let deposited = $t01772017798._1
549+ let locked = $t01772017798._2
550+ let withdrawable = $t01772017798._3
551+ let withdrawn = $t01772017798._4
552+ let gVires = $t01772017798._5
550553 if ((0 >= withdrawable))
551554 then nil
552555 else {
553556 let userUpdate = if (userOffCliff(user))
554557 then {
555- let $t01785517909 = userProfitData(user)
556- let virtualTokens = $t01785517909._1
557- let tokensData = $t01785517909._2
558+ let $t01790717961 = userProfitData(user)
559+ let virtualTokens = $t01790717961._1
560+ let tokensData = $t01790717961._2
558561 let base = [DeleteEntry(userFactorStore(user)), DeleteEntry(userEntryHeightStore(user)), DeleteEntry(userWithdrawnTokensStore(user)), DeleteEntry(userDepositedTokensStore(user)), DeleteEntry(userVirtualTokensStore(user)), changeByStr(totalVirtualTokensStore, -(withdrawable))]
559562 let tokenData = {
560563 func fold (total,item) = {
561- let $t01845618485 = item
562- let aid = $t01845618485._1
563- let ced = $t01845618485._2
564- let av = $t01845618485._3
565- let nc = $t01845618485._4
564+ let $t01850818537 = item
565+ let aid = $t01850818537._1
566+ let ced = $t01850818537._2
567+ let av = $t01850818537._3
568+ let nc = $t01850818537._4
566569 (total ++ [DeleteEntry(userDividendsClaimedStore(user, aid)), IntegerEntry(userDividendsAdjStore(user, aid), -(av)), IntegerEntry(totalVirtualDividendsStore(aid), fraction(totalVirtualDividends(aid), (totalVirtualTokens - withdrawable), totalVirtualTokens))])
567570 }
568571
569572 let $l = tokensData
570573 let $s = size($l)
571574 let $acc0 = nil
572575 func $f0_1 ($a,$i) = if (($i >= $s))
573576 then $a
574577 else fold($a, $l[$i])
575578
576579 func $f0_2 ($a,$i) = if (($i >= $s))
577580 then $a
578581 else throw("List size exceeds 20")
579582
580583 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
581584 }
582585 (base ++ tokenData)
583586 }
584587 else [changeBy(userWithdrawnTokensStore(user), withdrawable)]
585588 (userUpdate ++ [changeBy(totalDepositedByFactorStore(userFactor(user)), -(withdrawable)), changeBy(totalDepositedTokensStore, -(withdrawable)), ScriptTransfer(addr, withdrawable, viresAssetId)])
586589 }
587590 }
588591 else throw("Strict value is not equal to itself.")
589592 }
590593
591594
592595
593596 @Callable(i)
594597 func claimProfit (from,to,relock) = {
595598 let validDelegate = if ((from == to))
596599 then true
597600 else match getString(this, ("delegation_claim_" + from)) {
598601 case s: String =>
599602 let data = split(s, "|")
600603 if ((to != data[0]))
601604 then throw(("no delegation rights for " + to))
602605 else if (if (relock)
603606 then (data[1] != "1")
604607 else false)
605608 then throw("attempting to relock while it's not allowed")
606609 else true
607610 case _ =>
608611 throw(("delegation not configured for " + from))
609612 }
610613 let checks = if (if (mainOnly(i))
611614 then opAllowed("claim_dividends")
612615 else false)
613616 then validDelegate
614617 else false
615618 if ((checks == checks))
616619 then {
617620 let toAddr = addressFromStringValue(to)
618- let $t02002120074 = userProfitData(from)
619- let virtualTokens = $t02002120074._1
620- let tokensData = $t02002120074._2
621+ let $t02007320126 = userProfitData(from)
622+ let virtualTokens = $t02007320126._1
623+ let tokensData = $t02007320126._2
621624 let relocking = if (relock)
622625 then updateUser(from, 0, userFactor(from))
623626 else nil
624627 let tokenData = {
625628 func fold (total,item) = {
626- let $t02028620315 = item
627- let aid = $t02028620315._1
628- let ced = $t02028620315._2
629- let av = $t02028620315._3
630- let nc = $t02028620315._4
629+ let $t02033820367 = item
630+ let aid = $t02033820367._1
631+ let ced = $t02033820367._2
632+ let av = $t02033820367._3
633+ let nc = $t02033820367._4
631634 (total ++ [changeBy(userDividendsClaimedStore(from, aid), av), changeBy(totalRealDividendsClaimedStore(aid), av), ScriptTransfer(toAddr, av, assetId(aid))])
632635 }
633636
634637 let $l = tokensData
635638 let $s = size($l)
636639 let $acc0 = nil
637640 func $f0_1 ($a,$i) = if (($i >= $s))
638641 then $a
639642 else fold($a, $l[$i])
640643
641644 func $f0_2 ($a,$i) = if (($i >= $s))
642645 then $a
643646 else throw("List size exceeds 20")
644647
645648 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
646649 }
647650 (relocking ++ tokenData)
648651 }
649652 else throw("Strict value is not equal to itself.")
650653 }
651654
652655
653656
654657 @Callable(i)
655658 func setClaimDelegation (address,relock) = {
656659 let checks = opAllowed("set_delegation_claim")
657660 if ((checks == checks))
658661 then if (!(isDefined(addressFromString(address))))
659662 then throw("bad address")
660663 else [StringEntry(("delegation_claim_" + toString(i.caller)), ((address + "|") + (if (relock)
661664 then "1"
662665 else "0")))]
663666 else throw("Strict value is not equal to itself.")
664667 }
665668
666669
667670
668671 @Callable(i)
669672 func removeClaimDelegation () = {
670673 let checks = opAllowed("set_delegation_claim")
671674 if ((checks == checks))
672675 then [DeleteEntry(("delegation_claim_" + toString(i.caller)))]
673676 else throw("Strict value is not equal to itself.")
674677 }
675678
676679
677680
678681 @Callable(i)
679682 func userPower (user) = $Tuple2(nil, userGVires(user))
680683
681684
682685 @Verifier(tx)
683686 func verify () = {
684687 let BASE = 1000
685688 let quorumRatio = valueOrErrorMessage(getInteger(configAddress, "proposal_quorum_ratio"), "proposalQuorumRatio is not defined")
686689 let passedRatio = valueOrErrorMessage(getInteger(configAddress, "proposal_passed_ratio"), "proposalThresholdRatio is not defined")
687690 let gViresContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "dividends_contract"), "no dividends_contract")), "invalid dividends_contract")
688691 let votingContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "voting_contract"), "no voting_contract")), "invalid voting_contract")
689692 let id = toBase58String(tx.id)
690693 let votesYes = valueOrElse(getInteger(votingContract, ("proposal_yes_" + id)), 0)
691694 let votesNo = valueOrElse(getInteger(votingContract, ("proposal_no_" + id)), 0)
692695 let proposalHeight = valueOrErrorMessage(getInteger(votingContract, ("proposal_height_" + id)), "proposal not registered")
693696 let applyStart = valueOrElse(getInteger(votingContract, ("proposal_applystart_" + id)), 0)
694697 let applyEnd = valueOrElse(getInteger(votingContract, ("proposal_applyend_" + id)), 0)
695698 let totalGVires = valueOrElse(getInteger(votingContract, ("proposal_gvires_" + id)), 0)
696699 let enabled = valueOrElse(getBoolean(configAddress, "op_governance_apply_tx_paused"), false)
697700 let voteYes = votesYes
698701 let voteNo = votesNo
699702 let totalVotes = (voteYes + voteNo)
700703 let hasQuorum = (((totalVotes * BASE) / totalGVires) >= quorumRatio)
701704 let hasPassed = (((voteYes * BASE) / totalVotes) >= passedRatio)
702705 let tooEarly = (applyStart >= HEIGHT)
703706 let tooLate = (HEIGHT >= applyEnd)
704707 let timeDebug = ((((((("proposalHeight = " + toString(proposalHeight)) + ", applyStart = ") + toString(applyStart)) + ", applyEnd = ") + toString(applyEnd)) + ", HEIGHT = ") + toString(HEIGHT))
705708 let byVoting = if (!(enabled))
706709 then throw("tx application throw governance not enabled")
707710 else if (tooEarly)
708711 then throw(("proposal can't be executed as it's too early: " + timeDebug))
709712 else if (tooLate)
710713 then throw(("proposal can't be executed as it's too late:" + timeDebug))
711714 else if (!(hasQuorum))
712715 then throw((((((("no quorum: " + "totalVotes: ") + toString(totalVotes)) + ", totalGVires: ") + toString(totalGVires)) + ", quorumRatio: ") + toString(quorumRatio)))
713716 else if (!(hasPassed))
714717 then throw((((((("no threshold achieved: " + "voteYes: ") + toString(voteYes)) + ", voteNo: ") + toString(voteNo)) + ", passedRatio: ") + toString(passedRatio)))
715718 else true
716719 if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
717720 then true
718721 else byVoting
719722 }
720723

github/deemru/w8io/3ef1775 
94.75 ms