tx · 4qURb1iKUNxw1LMUduUixttWjZbSTGL9QKcoWHahqXTb

3PHvU5KXYJUAReeActQpS56TCdF8gupEjdR:  -0.02600000 Waves

2023.05.25 14:12 [3658929] smart account 3PHvU5KXYJUAReeActQpS56TCdF8gupEjdR > SELF 0.00000000 Waves

{ "type": 13, "id": "4qURb1iKUNxw1LMUduUixttWjZbSTGL9QKcoWHahqXTb", "fee": 2600000, "feeAssetId": null, "timestamp": 1685013125718, "version": 1, "sender": "3PHvU5KXYJUAReeActQpS56TCdF8gupEjdR", "senderPublicKey": "EGGmHBK3xqTV6B19vtf2EhLscX4pB3tBXFKRDH5wdTcz", "proofs": [ "4aQn53ENLU4A7ywM5GWewrySHgXx7BzHgjNF44HntE1wKdp5kVWfRyo2RCsUKzcC4VwjU2pmXNDNxqGrXiQweRe2" ], "script": "base64:BgIvCAISABIAEgASBAoCCAgSABIECgIIARIDCgEIEgUKAwgIBBIECgIIBBIAEgMKAQhGAQVhc0ludAEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACA0ludAQDaW50BQckbWF0Y2gwBQNpbnQJAAIBAhl3cm9uZyB0eXBlLCBleHBlY3RlZDogSW50AQthc0ludFN0ckludAEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACEihJbnQsIFN0cmluZywgSW50KQQJaW50U3RySW50BQckbWF0Y2gwBQlpbnRTdHJJbnQDCQABAgUHJG1hdGNoMAINKEludCwgU3RyaW5nKQQGaW50U3RyBQckbWF0Y2gwCQCVCgMIBQZpbnRTdHICXzEIBQZpbnRTdHICXzIAAAkAAgECI3dyb25nIHR5cGUsIGV4cGVjdGVkOiAoSW50LCBTdHJpbmcpAQtmYWN0b3JDaGVjawEGZmFjdG9yAwMDCQECIT0CBQZmYWN0b3IAAQkBAiE9AgUGZmFjdG9yAAIHCQECIT0CBQZmYWN0b3IABAcJAAIBAgpiYWQgZmFjdG9yBQZmYWN0b3IAEXZpcmVzQXNzZXRJZFN0b3JlAgx2aXJlc0Fzc2V0SWQAEmluaXRpYWxIZWlnaHRTdG9yZQINaW5pdGlhbEhlaWdodAANaW5pdGlhbEhlaWdodAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUSaW5pdGlhbEhlaWdodFN0b3JlAAtjb25maWdTdG9yZQIGY29uZmlnAA1jb25maWdBZGRyZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFC2NvbmZpZ1N0b3JlAh9leHAtZGl2aWRlbmRzOiBubyBjb25maWdBZGRyZXNzAhZpbnZhbGlkIGNvbmZpZyBhZGRyZXNzABJtYXliZU9yYWNsZUFkZHJlc3MEByRtYXRjaDAJAJ0IAgUNY29uZmlnQWRkcmVzcwIOb3JhY2xlX2FkZHJlc3MDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQCmCAEFAXMFBHVuaXQABkhFSUdIVAUGaGVpZ2h0AAp2aXJlc0lkU3RyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwURdmlyZXNBc3NldElkU3RvcmUCF3ZpcmVzIGFzc2V0SWQgbm90IGZvdW5kAAx2aXJlc0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA2QQBBQp2aXJlc0lkU3RyAhVpbnZhbGlkIHZpcmVzIGFzc2V0SWQBB2Fzc2V0SWQBAXMDCQAAAgUBcwIFV0FWRVMFBHVuaXQJANkEAQkAkQMCCQC1CQIFAXMCAV8AAAEKYXNzZXRJZFN0cgEDYWlkBAckbWF0Y2gwBQNhaWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCYnYFByRtYXRjaDAJANgEAQUCYnYDCQABAgUHJG1hdGNoMAIEVW5pdAQBdQUHJG1hdGNoMAIFV0FWRVMJAAIBAgtNYXRjaCBlcnJvcgEHdGhyb3dJZgIJY29uZGl0aW9uBWVycm9yAwUJY29uZGl0aW9uCQACAQUFZXJyb3IGAQh3cml0ZUludAIDa2V5BXZhbHVlAwkAZgIAAAUFdmFsdWUJAAIBCQCsAgIJAKwCAgkArAICAhd3cml0aW5nIG5lZ2F0aXZlIHZhbHVlIAkApAMBBQV2YWx1ZQIJIGZvciBrZXkgBQNrZXkJAQxJbnRlZ2VyRW50cnkCBQNrZXkFBXZhbHVlAQt3cml0ZVN0ckludAIDa2V5BXZhbHVlAwkAZgIAAAUFdmFsdWUJAAIBCQCsAgIJAKwCAgkArAICAhd3cml0aW5nIG5lZ2F0aXZlIHZhbHVlIAkApAMBBQV2YWx1ZQIJIGZvciBrZXkgBQNrZXkJAQtTdHJpbmdFbnRyeQIFA2tleQkApAMBBQV2YWx1ZQELd3JpdGVTdHJpbmcCA2tleQV2YWx1ZQkBC1N0cmluZ0VudHJ5AgUDa2V5BQV2YWx1ZQEQd3JpdGVDb25zdFN0cmluZwIDa2V5BXZhbHVlAwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzBQNrZXkJAQtTdHJpbmdFbnRyeQIFA2tleQUFdmFsdWUJAAIBCQCsAgICFWFscmVhZHkgaW5pdGlhbGl6ZWQ6IAUDa2V5AQhjaGFuZ2VCeQIDa2V5BXZhbHVlCQEId3JpdGVJbnQCBQNrZXkJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAABQV2YWx1ZQELY2hhbmdlQnlTdHICA2tleQV2YWx1ZQkBC3dyaXRlU3RySW50AgUDa2V5CQBkAgkBDXBhcnNlSW50VmFsdWUBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFA2tleQIBMAUFdmFsdWUBDHZpcmVzUGF5bWVudAEBaQMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAAAAAMJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUMdmlyZXNBc3NldElkCQACAQIJbm90IHZpcmVzCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAEJb3BBbGxvd2VkAQJvcAQHJG1hdGNoMAkA/AcEBQ1jb25maWdBZGRyZXNzAglvcEFsbG93ZWQJAMwIAgUKdmlyZXNJZFN0cgkAzAgCBQJvcAUDbmlsBQNuaWwDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBYgUHJG1hdGNoMAMFAWIGCQACAQILbm90IGFsbG93ZWQJAAIBAiFvcEFsbG93ZWQ6IHVuZXhwZWN0ZWQgcmVzdWx0IHR5cGUAC3ZpcmVzU3Rha2VyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCDHZpcmVzX3N0YWtlcgIZbm8gdmlyZXNfc3Rha2VyIGluIGNvbmZpZwIcaW52YWxpZCB2aXJlc19zdGFrZXIgYWRkcmVzcwAEbWFpbgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgkAtQkCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwIEbWFpbgIHbm8gbWFpbgIBfAAAAgxpbnZhbGlkIG1haW4BCG1haW5Pbmx5AQFpAwkBCGNvbnRhaW5zAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUNY29uZmlnQWRkcmVzcwIEbWFpbgkApQgBCAUBaQZjYWxsZXIGCQACAQIQb25seSBtYWluIGNhbiBkbwASZGl2aWRlbmRhYmxlVG9rZW5zCQELdmFsdWVPckVsc2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCEmRpdmlkZW5kYWJsZVRva2VucwIAABVkaXZpZGVuZGFibGVUb2tlbnNBcnIDCQAAAgUSZGl2aWRlbmRhYmxlVG9rZW5zAgAFA25pbAkAvAkCBRJkaXZpZGVuZGFibGVUb2tlbnMCAXwAF2RpdmlkZW5kYWJsZVJlc2VydmVzU3RyCQELdmFsdWVPckVsc2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCFGRpdmlkZW5kYWJsZVJlc2VydmVzAgAAFGRpdmlkZW5kYWJsZVJlc2VydmVzBAckbWF0Y2gwBRdkaXZpZGVuZGFibGVSZXNlcnZlc1N0cgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEA3N0cgUHJG1hdGNoMAMJAAACBQNzdHICAAUDbmlsCQC8CQIFA3N0cgIBfAUDbmlsAAhoYWxmTGlmZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDWNvbmZpZ0FkZHJlc3MCFHZpcmVzX2xvY2tfaGFsZl9saWZlAhFoYWxmIGxpZmUgbm90IHNldAAGbGFtYmRhCQBpAgDo0uqbggIFCGhhbGZMaWZlAApMQU1CREFCQVNFAAgAAUUA14nPgQEABUVCQVNFAAgBB2Zvcm11bGECAXgCeTAJAGsDBQJ5MAkAbAYFAUUFBUVCQVNFCQBrAwUGbGFtYmRhBQF4AOgHBQpMQU1CREFCQVNFAAgFBkhBTEZVUACAwtcvARV1c2VyRGl2aWRlbmRzQWRqU3RvcmUCBHVzZXIDYWlkCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQNhaWQCBF9hZGoBGXVzZXJEaXZpZGVuZHNDbGFpbWVkU3RvcmUCBHVzZXIDYWlkCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQNhaWQCCF9jbGFpbWVkARZ1c2VyVmlydHVhbFRva2Vuc1N0b3JlAQR1c2VyCQCsAgIFBHVzZXICCF92aXJ0dWFsARh1c2VyRGVwb3NpdGVkVG9rZW5zU3RvcmUBBHVzZXIJAKwCAgUEdXNlcgIGX3ZpcmVzARh1c2VyV2l0aGRyYXduVG9rZW5zU3RvcmUBBHVzZXIJAKwCAgUEdXNlcgIQX3ZpcmVzX3dpdGhkcmF3bgEUdXNlckVudHJ5SGVpZ2h0U3RvcmUBBHVzZXIJAKwCAgUEdXNlcgIHX2hlaWdodAEPdXNlckZhY3RvclN0b3JlAQR1c2VyCQCsAgIFBHVzZXICB19mYWN0b3IBEHVzZXJEaXZpZGVuZHNBZGoCBHVzZXIDYWlkCQELdmFsdWVPckVsc2UCCQCfCAEJARV1c2VyRGl2aWRlbmRzQWRqU3RvcmUCBQR1c2VyBQNhaWQAAAEUdXNlckRpdmlkZW5kc0NsYWltZWQCBHVzZXIDYWlkCQELdmFsdWVPckVsc2UCCQCfCAEJARl1c2VyRGl2aWRlbmRzQ2xhaW1lZFN0b3JlAgUEdXNlcgUDYWlkAAABEXVzZXJWaXJ0dWFsVG9rZW5zAQR1c2VyCQENcGFyc2VJbnRWYWx1ZQEJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBFnVzZXJWaXJ0dWFsVG9rZW5zU3RvcmUBBQR1c2VyAgEwARN1c2VyRGVwb3NpdGVkVG9rZW5zAQR1c2VyCQELdmFsdWVPckVsc2UCCQCfCAEJARh1c2VyRGVwb3NpdGVkVG9rZW5zU3RvcmUBBQR1c2VyAAABE3VzZXJXaXRoZHJhd25Ub2tlbnMBBHVzZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBGHVzZXJXaXRoZHJhd25Ub2tlbnNTdG9yZQEFBHVzZXIAAAEPdXNlckVudHJ5SGVpZ2h0AQR1c2VyCQELdmFsdWVPckVsc2UCCQCfCAEJARR1c2VyRW50cnlIZWlnaHRTdG9yZQEFBHVzZXIAAAEKdXNlckZhY3RvcgEEdXNlcgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEPdXNlckZhY3RvclN0b3JlAQUEdXNlcgABAQp1c2VyR1ZpcmVzAQR1c2VyCQEHZm9ybXVsYQIJAQEtAQkAZQIFBkhFSUdIVAUNaW5pdGlhbEhlaWdodAkBEXVzZXJWaXJ0dWFsVG9rZW5zAQUEdXNlcgEadG90YWxWaXJ0dWFsRGl2aWRlbmRzU3RvcmUBA2FpZAkArAICBQNhaWQCFl90b3RhbFZpcnR1YWxEaXZpZGVuZHMBF3RvdGFsUmVhbERpdmlkZW5kc1N0b3JlAQNhaWQJAKwCAgUDYWlkAhNfdG90YWxSZWFsRGl2aWRlbmRzARJyZWNvdmVyeUFsbG9jU3RvcmUBA2FpZAkArAICBQNhaWQCFF9yZWNvdmVyeUFsbG9jYXRpb25zAR50b3RhbFJlYWxEaXZpZGVuZHNDbGFpbWVkU3RvcmUBA2FpZAkArAICBQNhaWQCGl90b3RhbFJlYWxEaXZpZGVuZHNDbGFpbWVkABd0b3RhbFZpcnR1YWxUb2tlbnNTdG9yZQISdG90YWxWaXJ0dWFsVG9rZW5zABl0b3RhbERlcG9zaXRlZFRva2Vuc1N0b3JlAhR0b3RhbERlcG9zaXRlZFRva2VucwEbdG90YWxEZXBvc2l0ZWRCeUZhY3RvclN0b3JlAQZmYWN0b3IJAKwCAgIUdG90YWxEZXBvc2l0ZWRUb2tlbnMJAKQDAQkBC2ZhY3RvckNoZWNrAQUGZmFjdG9yARZ0b3RhbERlcG9zaXRlZEJ5RmFjdG9yAQZmYWN0b3IJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBG3RvdGFsRGVwb3NpdGVkQnlGYWN0b3JTdG9yZQEFBmZhY3RvcgAAARV0b3RhbFZpcnR1YWxEaXZpZGVuZHMBA2FpZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEadG90YWxWaXJ0dWFsRGl2aWRlbmRzU3RvcmUBBQNhaWQAAAESdG90YWxSZWFsRGl2aWRlbmRzAQNhaWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBF3RvdGFsUmVhbERpdmlkZW5kc1N0b3JlAQUDYWlkAAAAEnRvdGFsVmlydHVhbFRva2VucwkBDXBhcnNlSW50VmFsdWUBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFF3RvdGFsVmlydHVhbFRva2Vuc1N0b3JlAgEwABR0b3RhbERlcG9zaXRlZFRva2VucwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRl0b3RhbERlcG9zaXRlZFRva2Vuc1N0b3JlAAABDHVzZXJPZmZDbGlmZgEEdXNlcgQLZW50cnlIZWlnaHQJAQ91c2VyRW50cnlIZWlnaHQBBQR1c2VyBAZmYWN0b3IJAQp1c2VyRmFjdG9yAQUEdXNlcgMJAAACBQZmYWN0b3IAAQkAZgIFBkhFSUdIVAkAZAIFC2VudHJ5SGVpZ2h0CQBoAgAEBQhoYWxmTGlmZQMJAAACBQZmYWN0b3IAAgkAZgIFBkhFSUdIVAkAZAIFC2VudHJ5SGVpZ2h0CQBoAgAFBQhoYWxmTGlmZQMJAAACBQZmYWN0b3IABAkAZgIFBkhFSUdIVAkAZAIFC2VudHJ5SGVpZ2h0CQBoAgAGBQhoYWxmTGlmZQkAAgEJAKwCAgILYmFkIGZhY3RvcjoJAKQDAQUGZmFjdG9yAQ11c2VyVmlyZXNEYXRhAQR1c2VyBAlkZXBvc2l0ZWQJARN1c2VyRGVwb3NpdGVkVG9rZW5zAQUEdXNlcgQCZ1YJAQp1c2VyR1ZpcmVzAQUEdXNlcgQOc3VwcG9zZWRMb2NrZWQJAJcDAQkAzAgCBQlkZXBvc2l0ZWQJAMwIAgUCZ1YFA25pbAQGbG9ja2VkAwkBDHVzZXJPZmZDbGlmZgEFBHVzZXIAAAUOc3VwcG9zZWRMb2NrZWQECHVubG9ja2VkCQBlAgUJZGVwb3NpdGVkBQZsb2NrZWQECXdpdGhkcmF3bgkBE3VzZXJXaXRoZHJhd25Ub2tlbnMBBQR1c2VyBAx3aXRoZHJhd2FibGUJAGUCBQh1bmxvY2tlZAUJd2l0aGRyYXduBAppblByb3RvY29sCQBkAgUGbG9ja2VkBQx3aXRoZHJhd2FibGUJAJgKBgUJZGVwb3NpdGVkBQZsb2NrZWQFDHdpdGhkcmF3YWJsZQUJd2l0aGRyYXduBQppblByb3RvY29sBQJnVgEOdXNlclByb2ZpdERhdGEBBHVzZXIEC3RvdGFsVG9rZW5zCQCQAwEFFWRpdmlkZW5kYWJsZVRva2Vuc0FycgQZdG90YWxEaXZpZGVuZGFibGVSZXNlcnZlcwkAkAMBBRRkaXZpZGVuZGFibGVSZXNlcnZlcwMJAQIhPQIFC3RvdGFsVG9rZW5zBRl0b3RhbERpdmlkZW5kYWJsZVJlc2VydmVzCQACAQkArAICCQCsAgIJAKwCAgIoaW5jb25zaXN0ZW50IGNvbmZpZ3VyYXRpb246IHRvdGFsVG9rZW5zPQkApAMBBQt0b3RhbFRva2VucwIeLCB0b3RhbERpdmlkZW5kYWJsZVJlc2VydmVzID0gCQCkAwEFGXRvdGFsRGl2aWRlbmRhYmxlUmVzZXJ2ZXMEDXZpcnR1YWxUb2tlbnMJARF1c2VyVmlydHVhbFRva2VucwEFBHVzZXIECXRva2VuRGF0YQoBBGZvbGQCBnRvdGFscwVpbmRleAMJAGcCBQVpbmRleAULdG90YWxUb2tlbnMFBnRvdGFscwQDYWlkCQCRAwIFFWRpdmlkZW5kYWJsZVRva2Vuc0FycgUFaW5kZXgECyR0MDg1NDE4ODMwBAFyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBRRkaXZpZGVuZGFibGVSZXNlcnZlcwUFaW5kZXgCI2JhZCByZXNlcnZlIGluIGRpdmlkZW5kYWJsZVJlc2VydmVzCQELYXNJbnRTdHJJbnQBCQD8BwQFAXICEmdldFJlc2VydmVEaXZzSW5mbwUDbmlsBQNuaWwEC3Jlc2VydmVEaXZzCAULJHQwODU0MTg4MzACXzEEDnJlc2VydmVBc3NldElkCAULJHQwODU0MTg4MzACXzIEDG5vbkNsYWltYWJsZQgFCyR0MDg1NDE4ODMwAl8zAwkBAiE9AgUOcmVzZXJ2ZUFzc2V0SWQFA2FpZAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIraW5jb25zaXN0ZW50IGNvbmZpZ3VyYXRpb246IHJlc2VydmVBc3NldElkPQUOcmVzZXJ2ZUFzc2V0SWQCBiwgYWlkPQUDYWlkAhUsIGRpdmlkZW5kYWJsZVRva2VuczoFEmRpdmlkZW5kYWJsZVRva2VucwIXLCBkaXZpZGVuZGFibGVSZXNlcnZlczoFF2RpdmlkZW5kYWJsZVJlc2VydmVzU3RyBA91c2VyVmlydHVhbERpdnMDCQAAAgUSdG90YWxWaXJ0dWFsVG9rZW5zAAAAAAkAawMJAGQCCQEVdG90YWxWaXJ0dWFsRGl2aWRlbmRzAQUDYWlkBQtyZXNlcnZlRGl2cwUNdmlydHVhbFRva2VucwUSdG90YWxWaXJ0dWFsVG9rZW5zBANhZGoJARB1c2VyRGl2aWRlbmRzQWRqAgUEdXNlcgUDYWlkBAh1c2VyRGl2cwkAZQIFD3VzZXJWaXJ0dWFsRGl2cwUDYWRqBBRub25DbGFpbWFibGVVc2VyRGl2cwMJAAACBRJ0b3RhbFZpcnR1YWxUb2tlbnMAAAAACQBrAwUMbm9uQ2xhaW1hYmxlBQ12aXJ0dWFsVG9rZW5zBRJ0b3RhbFZpcnR1YWxUb2tlbnMEC3VzZXJDbGFpbWVkCQEUdXNlckRpdmlkZW5kc0NsYWltZWQCBQR1c2VyBQNhaWQECWNsYWltYWJsZQkAlgMBCQDMCAIAAAkAzAgCCQBlAgUIdXNlckRpdnMFC3VzZXJDbGFpbWVkBQNuaWwDCQBmAgAABQljbGFpbWFibGUJAAIBCQCsAgICD2NsYWltYWJsZSA8IDA6IAkApAMBBQljbGFpbWFibGUJAM4IAgUGdG90YWxzCQDMCAIJAJYKBAUDYWlkBQt1c2VyQ2xhaW1lZAUJY2xhaW1hYmxlBRRub25DbGFpbWFibGVVc2VyRGl2cwUDbmlsCgACJGwJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsJAMwIAgAMCQDMCAIADQkAzAgCAA4JAMwIAgAPCQDMCAIAEAkAzAgCABEJAMwIAgASCQDMCAIAEwUDbmlsCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQJAJQKAgUNdmlydHVhbFRva2VucwUJdG9rZW5EYXRhARljbGFpbUZyb21SZXNlcnZlc0ludGVybmFsAAQMYXNzZXRJZFN0b3JlAgdhc3NldElkBBRyZWNvdmVyeUFkZHJlc3NTaGFyZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1jb25maWdBZGRyZXNzAhZyZWNvdmVyeV9hZGRyZXNzX3NoYXJlAAAEE3JlY292ZXJ5UmVzZXJ2ZXNTdHIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwIRcmVjb3ZlcnlfcmVzZXJ2ZXMCAAQPcmVjb3ZlcnlBZGRyZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCEHJlY292ZXJ5X2FkZHJlc3MCFmZvbmQgYWRkcmVzcyBub3QgZm91bmQCF2ZvbmQgYWRkcmVzcyBpcyBpbnZhbGlkCgEEZm9sZAIGb3V0cHV0B3Jlc2VydmUEDnJlc2VydmVBZGRyZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUHcmVzZXJ2ZQIaYWRkZXI6IGJhZCByZXNlcnZlIGFkZHJlc3MEDWFzc2V0SWRTdHJpbmcJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ5yZXNlcnZlQWRkcmVzcwUMYXNzZXRJZFN0b3JlAhVubyBhc3NldElkIGluIHJlc2VydmUEB2FjdGlvbnMDCQEBIQEJAQhjb250YWlucwIFEmRpdmlkZW5kYWJsZVRva2VucwUNYXNzZXRJZFN0cmluZwkAAgECXmluY29uc2lzdGVudCBjb25maWd1cmF0aW9uOiBkaXZpZGVuZGFibGVSZXNlcnZlJ3MgYXNzZXQgaWQgaXMgbm90IHN0b3JlZCBpbiBkaXZpZGVuZGFibGVUb2tlbnMEBmFtb3VudAkBBWFzSW50AQkA/AcEBQ5yZXNlcnZlQWRkcmVzcwITd2l0aGRyYXdGcm9tUmVzZXJ2ZQkAzAgCAP///////////wEFA25pbAUDbmlsAwkAAAIFBmFtb3VudAUGYW1vdW50AwkAZgIAAAUGYW1vdW50CQACAQIKYmFkIGFtb3VudAMJAAACBQZhbW91bnQAAAUDbmlsAwMJAAACBRRyZWNvdmVyeUFkZHJlc3NTaGFyZQAABgkBASEBCQEIY29udGFpbnMCBRNyZWNvdmVyeVJlc2VydmVzU3RyBQdyZXNlcnZlCQDMCAIJAQhjaGFuZ2VCeQIJARp0b3RhbFZpcnR1YWxEaXZpZGVuZHNTdG9yZQEFDWFzc2V0SWRTdHJpbmcFBmFtb3VudAkAzAgCCQEIY2hhbmdlQnkCCQEXdG90YWxSZWFsRGl2aWRlbmRzU3RvcmUBBQ1hc3NldElkU3RyaW5nBQZhbW91bnQFA25pbAQOcmVjb3ZlcnlBbW91bnQJAGsDBQZhbW91bnQFFHJlY292ZXJ5QWRkcmVzc1NoYXJlAGQED2RpdmlkZW50c0Ftb3VudAkAZQIFBmFtb3VudAUOcmVjb3ZlcnlBbW91bnQJAMwIAgkBCGNoYW5nZUJ5AgkBGnRvdGFsVmlydHVhbERpdmlkZW5kc1N0b3JlAQUNYXNzZXRJZFN0cmluZwUPZGl2aWRlbnRzQW1vdW50CQDMCAIJAQhjaGFuZ2VCeQIJARd0b3RhbFJlYWxEaXZpZGVuZHNTdG9yZQEFDWFzc2V0SWRTdHJpbmcFD2RpdmlkZW50c0Ftb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ9yZWNvdmVyeUFkZHJlc3MFDnJlY292ZXJ5QW1vdW50CQEHYXNzZXRJZAEFDWFzc2V0SWRTdHJpbmcFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzggCBQZvdXRwdXQFB2FjdGlvbnMKAAIkbAUUZGl2aWRlbmRhYmxlUmVzZXJ2ZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAEKYWR2aXNlVXNlcgEEdXNlcgQNJHQwMTIxMzYxMjIyNgkBDXVzZXJWaXJlc0RhdGEBBQR1c2VyBAlkZXBvc2l0ZWQIBQ0kdDAxMjEzNjEyMjI2Al8xBAZsb2NrZWQIBQ0kdDAxMjEzNjEyMjI2Al8yBAx3aXRoZHJhd2FibGUIBQ0kdDAxMjEzNjEyMjI2Al8zBAl3aXRoZHJhd24IBQ0kdDAxMjEzNjEyMjI2Al80BAppblByb3RvY29sCAUNJHQwMTIxMzYxMjIyNgJfNQQGZ1ZpcmVzCAUNJHQwMTIxMzYxMjIyNgJfNgQNJHQwMTIyMzExMjI4NAkBDnVzZXJQcm9maXREYXRhAQUEdXNlcgQNdmlydHVhbFRva2VucwgFDSR0MDEyMjMxMTIyODQCXzEECXRva2VuRGF0YQgFDSR0MDEyMjMxMTIyODQCXzIEBXBvd2VyAwkAAAIFCmluUHJvdG9jb2wAAAAACQBrAwCQTgUGZ1ZpcmVzBQppblByb3RvY29sBARiYXNlCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICDiAgZGVwb3NpdGVkID0gCQCkAwEFCWRlcG9zaXRlZAISLCB2aXJ0dWFsVG9rZW5zID0gCQCkAwEFDXZpcnR1YWxUb2tlbnMCCywgbG9ja2VkID0gCQCkAwEFBmxvY2tlZAIRLCB3aXRoZHJhd2FibGUgPSAJAKQDAQUMd2l0aGRyYXdhYmxlAg4sIHdpdGhkcmF3biA9IAkApAMBBQl3aXRoZHJhd24CDywgaW5Qcm90b2NvbCA9IAkApAMBBQppblByb3RvY29sAhAsIGVudHJ5SGVpZ2h0ID0gCQCkAwEJAQ91c2VyRW50cnlIZWlnaHQBBQR1c2VyAgssIGZhY3RvciA9IAkApAMBCQEKdXNlckZhY3RvcgEFBHVzZXICCywgZ1ZpcmVzID0gCQCkAwEFBmdWaXJlcwIKLCBwb3dlciA9IAkApAMBBQVwb3dlcgQKdG9rZW5zRGF0YQoBA2ZsZAIGdG90YWxzBGl0ZW0EDSR0MDEyOTU4MTI5ODUFBGl0ZW0EA2FpZAgFDSR0MDEyOTU4MTI5ODUCXzEEA2NlZAgFDSR0MDEyOTU4MTI5ODUCXzIEAmF2CAUNJHQwMTI5NTgxMjk4NQJfMwQCbmMIBQ0kdDAxMjk1ODEyOTg1Al80CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBnRvdGFscwIELCBbIAIKYXNzZXRJZCA9IAUDYWlkAgwsIGNsYWltZWQgPSAJAKQDAQUDY2VkAg4sIGNsYWltYWJsZSA9IAkApAMBBQJhdgIRLCBub25DbGFpbWFibGUgPSAJAKQDAQUCbmMCAV0KAAIkbAUJdG9rZW5EYXRhCgACJHMJAJADAQUCJGwKAAUkYWNjMAIACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQNmbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAkArAICBQRiYXNlBQp0b2tlbnNEYXRhAQZhZHZpc2UABAt0b3RhbEd2aXJlcwkBB2Zvcm11bGECCQEBLQEJAGUCBQZIRUlHSFQFDWluaXRpYWxIZWlnaHQFEnRvdGFsVmlydHVhbFRva2VucwQEYmFzZQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICGSAgdG90YWxEZXBvc2l0ZWRUb2tlbnMgPSAJAKQDAQUUdG90YWxEZXBvc2l0ZWRUb2tlbnMCGiwgdG90YWxEZXBvc2l0ZWRUb2tlbnMxID0gCQCkAwEJARZ0b3RhbERlcG9zaXRlZEJ5RmFjdG9yAQABAhosIHRvdGFsRGVwb3NpdGVkVG9rZW5zMiA9IAkApAMBCQEWdG90YWxEZXBvc2l0ZWRCeUZhY3RvcgEAAgIaLCB0b3RhbERlcG9zaXRlZFRva2VuczQgPSAJAKQDAQkBFnRvdGFsRGVwb3NpdGVkQnlGYWN0b3IBAAQCFywgdG90YWxWaXJ0dWFsVG9rZW5zID0gCQCkAwEFEnRvdGFsVmlydHVhbFRva2VucwIQLCB0b3RhbEd2aXJlcyA9IAkApAMBBQt0b3RhbEd2aXJlcwoBBGZvbGQCBXRvdGFsA2FpZAkArAICCQCsAgIJAKwCAgkArAICBQV0b3RhbAICLCAFA2FpZAIDID0gCQCkAwEJARJ0b3RhbFJlYWxEaXZpZGVuZHMBBQNhaWQKAAIkbAUVZGl2aWRlbmRhYmxlVG9rZW5zQXJyCgACJHMJAJADAQUCJGwKAAUkYWNjMAUEYmFzZQoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEZm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUAQp1cGRhdGVVc2VyAwR1c2VyBnRva2VucwFmBAZjaGVja3MJAQlvcEFsbG93ZWQBAgpsb2NrX3ZpcmVzAwkAAAIFBmNoZWNrcwUGY2hlY2tzAwMJAQIhPQIFAWYAAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQ1jb25maWdBZGRyZXNzAgthbGxvd19ib29zdAcHCQACAQIUYm9vc3Rpbmcgbm90IGVuYWJsZWQEBmZhY3RvcgkBC2ZhY3RvckNoZWNrAQUBZgMJAAACBQZmYWN0b3IFBmZhY3RvcgQNY3VycmVudEZhY3RvcgkBCnVzZXJGYWN0b3IBBQR1c2VyAwkAZgIFDWN1cnJlbnRGYWN0b3IFBmZhY3RvcgkAAgECGGNhbid0IGRvd25ncmFkZSBib29zdGluZwQNJHQwMTQzNTUxNDQ0MQkBDXVzZXJWaXJlc0RhdGEBBQR1c2VyBAlkZXBvc2l0ZWQIBQ0kdDAxNDM1NTE0NDQxAl8xBAZsb2NrZWQIBQ0kdDAxNDM1NTE0NDQxAl8yBAx3aXRoZHJhd2FibGUIBQ0kdDAxNDM1NTE0NDQxAl8zBAl3aXRoZHJhd24IBQ0kdDAxNDM1NTE0NDQxAl80BAppblByb3RvY29sCAUNJHQwMTQzNTUxNDQ0MQJfNQQCZ1YIBQ0kdDAxNDM1NTE0NDQxAl82BBBvbGRWaXJ0dWFsVG9rZW5zCQERdXNlclZpcnR1YWxUb2tlbnMBBQR1c2VyBBBuZXdWaXJ0dWFsVG9rZW5zCQEHZm9ybXVsYQIJAGUCBQZIRUlHSFQFDWluaXRpYWxIZWlnaHQJAGgCBQZmYWN0b3IJAGQCBQZ0b2tlbnMFCmluUHJvdG9jb2wEBGRpZmYJAGUCBRBuZXdWaXJ0dWFsVG9rZW5zBRBvbGRWaXJ0dWFsVG9rZW5zBARiYXNlCQDMCAIJAQhjaGFuZ2VCeQIFGXRvdGFsRGVwb3NpdGVkVG9rZW5zU3RvcmUFBnRva2VucwkAzAgCCQELY2hhbmdlQnlTdHICBRd0b3RhbFZpcnR1YWxUb2tlbnNTdG9yZQUEZGlmZgkAzAgCCQELY2hhbmdlQnlTdHICCQEWdXNlclZpcnR1YWxUb2tlbnNTdG9yZQEFBHVzZXIFBGRpZmYJAMwIAgkBCGNoYW5nZUJ5AgkBGHVzZXJEZXBvc2l0ZWRUb2tlbnNTdG9yZQEFBHVzZXIFBnRva2VucwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFHVzZXJFbnRyeUhlaWdodFN0b3JlAQUEdXNlcgUGSEVJR0hUCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEPdXNlckZhY3RvclN0b3JlAQUEdXNlcgUGZmFjdG9yBQNuaWwECXRva2VuRGF0YQoBBGZvbGQCBXRvdGFsA2FpZAQDYWRqAwkAAAIFEnRvdGFsVmlydHVhbFRva2VucwAAAAAJAGsDBQRkaWZmCQEVdG90YWxWaXJ0dWFsRGl2aWRlbmRzAQUDYWlkBRJ0b3RhbFZpcnR1YWxUb2tlbnMJAM4IAgUFdG90YWwJAMwIAgkBCGNoYW5nZUJ5AgkBGnRvdGFsVmlydHVhbERpdmlkZW5kc1N0b3JlAQUDYWlkBQNhZGoJAMwIAgkBDEludGVnZXJFbnRyeQIJARV1c2VyRGl2aWRlbmRzQWRqU3RvcmUCBQR1c2VyBQNhaWQJAGQCCQEQdXNlckRpdmlkZW5kc0FkagIFBHVzZXIFA2FpZAUDYWRqBQNuaWwKAAIkbAUVZGl2aWRlbmRhYmxlVG9rZW5zQXJyCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQECm1vbml0b3JpbmcDCQECIT0CBQZmYWN0b3IFDWN1cnJlbnRGYWN0b3IJAMwIAgkBCGNoYW5nZUJ5AgkBG3RvdGFsRGVwb3NpdGVkQnlGYWN0b3JTdG9yZQEFDWN1cnJlbnRGYWN0b3IJAQEtAQUKaW5Qcm90b2NvbAkAzAgCCQEIY2hhbmdlQnkCCQEbdG90YWxEZXBvc2l0ZWRCeUZhY3RvclN0b3JlAQUGZmFjdG9yCQBkAgUGdG9rZW5zBQppblByb3RvY29sBQNuaWwJAMwIAgkBCGNoYW5nZUJ5AgkBG3RvdGFsRGVwb3NpdGVkQnlGYWN0b3JTdG9yZQEFBmZhY3RvcgUGdG9rZW5zBQNuaWwJAM4IAgkAzggCBQRiYXNlBQl0b2tlbkRhdGEFCm1vbml0b3JpbmcJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4LAWkBC3RvdGFsR3ZpcmVzAAkAlAoCBQNuaWwJAQdmb3JtdWxhAgkBAS0BCQBlAgUGSEVJR0hUBQ1pbml0aWFsSGVpZ2h0BRJ0b3RhbFZpcnR1YWxUb2tlbnMBaQETc2hhcmVQcm9maXRNYW51YWxseQAEBmNoZWNrcwkBCW9wQWxsb3dlZAECGHNoYXJlX2RpdmlkZW5kc19tYW51YWxseQMJAAACBQZjaGVja3MFBmNoZWNrcwQOcGF5bWVudEFzc2V0SWQJAQphc3NldElkU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAwkBASEBCQEIY29udGFpbnMCBRJkaXZpZGVuZGFibGVUb2tlbnMFDnBheW1lbnRBc3NldElkCQACAQIQYmFkIHByb2ZpdCB0b2tlbgQDYW10CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAzAgCCQEIY2hhbmdlQnkCCQEadG90YWxWaXJ0dWFsRGl2aWRlbmRzU3RvcmUBBQ5wYXltZW50QXNzZXRJZAUDYW10CQDMCAIJAQhjaGFuZ2VCeQIJARd0b3RhbFJlYWxEaXZpZGVuZHNTdG9yZQEFDnBheW1lbnRBc3NldElkBQNhbXQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARdzaGFyZVByb2ZpdEZyb21SZXNlcnZlcwAJARljbGFpbUZyb21SZXNlcnZlc0ludGVybmFsAAFpAQRpbml0Ag1jb25maWdBZGRyZXNzBXZpcmVzCQDMCAIJARB3cml0ZUNvbnN0U3RyaW5nAgULY29uZmlnU3RvcmUFDWNvbmZpZ0FkZHJlc3MJAMwIAgkBEHdyaXRlQ29uc3RTdHJpbmcCBRF2aXJlc0Fzc2V0SWRTdG9yZQUFdmlyZXMFA25pbAFpAQVpbml0MgADCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhZvbmx5IHNlbGYgY2FuIGNvbnRpbnVlCQDMCAIJAQh3cml0ZUludAIFEmluaXRpYWxIZWlnaHRTdG9yZQUGSEVJR0hUBQNuaWwBaQEHbG9ja0ZvcgIEdXNlcgZmYWN0b3IEBmNoZWNrcwkBB3Rocm93SWYCAwkBAiE9AgkApQgBCAUBaQZjYWxsZXIFBHVzZXIJAQIhPQIIBQFpBmNhbGxlcgUEbWFpbgcCIm9ubHkgbWFpbiBhbmQgdXNlciBkaXJlY3RseSBjYW4gZG8DCQAAAgUGY2hlY2tzBQZjaGVja3MJAQp1cGRhdGVVc2VyAwUEdXNlcgkBDHZpcmVzUGF5bWVudAEFAWkFBmZhY3RvcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARN3aXRoZHJhd1VubG9ja2VkRm9yAQR1c2VyBAZjaGVja3MDCQEHdGhyb3dJZgIDCQECIT0CCQClCAEIBQFpBmNhbGxlcgUEdXNlcgkBAiE9AggFAWkGY2FsbGVyBQRtYWluBwIib25seSBtYWluIGFuZCB1c2VyIGRpcmVjdGx5IGNhbiBkbwkBCW9wQWxsb3dlZAECF3dpdGhkcmF3X3VubG9ja2VkX3ZpcmVzBwMJAAACBQZjaGVja3MFBmNoZWNrcwQEYWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEdXNlcgQNJHQwMTc2NjgxNzc0NgkBDXVzZXJWaXJlc0RhdGEBBQR1c2VyBAlkZXBvc2l0ZWQIBQ0kdDAxNzY2ODE3NzQ2Al8xBAZsb2NrZWQIBQ0kdDAxNzY2ODE3NzQ2Al8yBAx3aXRoZHJhd2FibGUIBQ0kdDAxNzY2ODE3NzQ2Al8zBAl3aXRoZHJhd24IBQ0kdDAxNzY2ODE3NzQ2Al80BAZnVmlyZXMIBQ0kdDAxNzY2ODE3NzQ2Al81AwkAZwIAAAUMd2l0aGRyYXdhYmxlBQNuaWwECnVzZXJVcGRhdGUDCQEMdXNlck9mZkNsaWZmAQUEdXNlcgQNJHQwMTc4NTUxNzkwOQkBDnVzZXJQcm9maXREYXRhAQUEdXNlcgQNdmlydHVhbFRva2VucwgFDSR0MDE3ODU1MTc5MDkCXzEECnRva2Vuc0RhdGEIBQ0kdDAxNzg1NTE3OTA5Al8yBARiYXNlCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ91c2VyRmFjdG9yU3RvcmUBBQR1c2VyCQDMCAIJAQtEZWxldGVFbnRyeQEJARR1c2VyRW50cnlIZWlnaHRTdG9yZQEFBHVzZXIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBGHVzZXJXaXRoZHJhd25Ub2tlbnNTdG9yZQEFBHVzZXIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBGHVzZXJEZXBvc2l0ZWRUb2tlbnNTdG9yZQEFBHVzZXIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBFnVzZXJWaXJ0dWFsVG9rZW5zU3RvcmUBBQR1c2VyCQDMCAIJAQtjaGFuZ2VCeVN0cgIFF3RvdGFsVmlydHVhbFRva2Vuc1N0b3JlCQEBLQEFDHdpdGhkcmF3YWJsZQUDbmlsBAl0b2tlbkRhdGEKAQRmb2xkAgV0b3RhbARpdGVtBA0kdDAxODQ1NjE4NDg1BQRpdGVtBANhaWQIBQ0kdDAxODQ1NjE4NDg1Al8xBANjZWQIBQ0kdDAxODQ1NjE4NDg1Al8yBAJhdggFDSR0MDE4NDU2MTg0ODUCXzMEAm5jCAUNJHQwMTg0NTYxODQ4NQJfNAkAzggCBQV0b3RhbAkAzAgCCQELRGVsZXRlRW50cnkBCQEZdXNlckRpdmlkZW5kc0NsYWltZWRTdG9yZQIFBHVzZXIFA2FpZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFXVzZXJEaXZpZGVuZHNBZGpTdG9yZQIFBHVzZXIFA2FpZAkBAS0BBQJhdgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGnRvdGFsVmlydHVhbERpdmlkZW5kc1N0b3JlAQUDYWlkCQBrAwkBFXRvdGFsVmlydHVhbERpdmlkZW5kcwEFA2FpZAkAZQIFEnRvdGFsVmlydHVhbFRva2VucwUMd2l0aGRyYXdhYmxlBRJ0b3RhbFZpcnR1YWxUb2tlbnMFA25pbAoAAiRsBQp0b2tlbnNEYXRhCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQJAM4IAgUEYmFzZQUJdG9rZW5EYXRhCQDMCAIJAQhjaGFuZ2VCeQIJARh1c2VyV2l0aGRyYXduVG9rZW5zU3RvcmUBBQR1c2VyBQx3aXRoZHJhd2FibGUFA25pbAkAzggCBQp1c2VyVXBkYXRlCQDMCAIJAQhjaGFuZ2VCeQIJARt0b3RhbERlcG9zaXRlZEJ5RmFjdG9yU3RvcmUBCQEKdXNlckZhY3RvcgEFBHVzZXIJAQEtAQUMd2l0aGRyYXdhYmxlCQDMCAIJAQhjaGFuZ2VCeQIFGXRvdGFsRGVwb3NpdGVkVG9rZW5zU3RvcmUJAQEtAQUMd2l0aGRyYXdhYmxlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBGFkZHIFDHdpdGhkcmF3YWJsZQUMdmlyZXNBc3NldElkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELY2xhaW1Qcm9maXQDBGZyb20CdG8GcmVsb2NrBA12YWxpZERlbGVnYXRlAwkAAAIFBGZyb20FAnRvBgQHJG1hdGNoMAkAnQgCBQR0aGlzCQCsAgICEWRlbGVnYXRpb25fY2xhaW1fBQRmcm9tAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAQEZGF0YQkAtQkCBQFzAgF8AwkBAiE9AgUCdG8JAJEDAgUEZGF0YQAACQACAQkArAICAhlubyBkZWxlZ2F0aW9uIHJpZ2h0cyBmb3IgBQJ0bwMDBQZyZWxvY2sJAQIhPQIJAJEDAgUEZGF0YQABAgExBwkAAgECK2F0dGVtcHRpbmcgdG8gcmVsb2NrIHdoaWxlIGl0J3Mgbm90IGFsbG93ZWQGCQACAQkArAICAh5kZWxlZ2F0aW9uIG5vdCBjb25maWd1cmVkIGZvciAFBGZyb20EBmNoZWNrcwMDCQEIbWFpbk9ubHkBBQFpCQEJb3BBbGxvd2VkAQIPY2xhaW1fZGl2aWRlbmRzBwUNdmFsaWREZWxlZ2F0ZQcDCQAAAgUGY2hlY2tzBQZjaGVja3MEBnRvQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUCdG8EDSR0MDIwMDIxMjAwNzQJAQ51c2VyUHJvZml0RGF0YQEFBGZyb20EDXZpcnR1YWxUb2tlbnMIBQ0kdDAyMDAyMTIwMDc0Al8xBAp0b2tlbnNEYXRhCAUNJHQwMjAwMjEyMDA3NAJfMgQJcmVsb2NraW5nAwUGcmVsb2NrCQEKdXBkYXRlVXNlcgMFBGZyb20AAAkBCnVzZXJGYWN0b3IBBQRmcm9tBQNuaWwECXRva2VuRGF0YQoBBGZvbGQCBXRvdGFsBGl0ZW0EDSR0MDIwMjg2MjAzMTUFBGl0ZW0EA2FpZAgFDSR0MDIwMjg2MjAzMTUCXzEEA2NlZAgFDSR0MDIwMjg2MjAzMTUCXzIEAmF2CAUNJHQwMjAyODYyMDMxNQJfMwQCbmMIBQ0kdDAyMDI4NjIwMzE1Al80CQDOCAIFBXRvdGFsCQDMCAIJAQhjaGFuZ2VCeQIJARl1c2VyRGl2aWRlbmRzQ2xhaW1lZFN0b3JlAgUEZnJvbQUDYWlkBQJhdgkAzAgCCQEIY2hhbmdlQnkCCQEedG90YWxSZWFsRGl2aWRlbmRzQ2xhaW1lZFN0b3JlAQUDYWlkBQJhdgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZ0b0FkZHIFAmF2CQEHYXNzZXRJZAEFA2FpZAUDbmlsCgACJGwFCnRva2Vuc0RhdGEKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAkAzggCBQlyZWxvY2tpbmcFCXRva2VuRGF0YQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARJzZXRDbGFpbURlbGVnYXRpb24CB2FkZHJlc3MGcmVsb2NrBAZjaGVja3MJAQlvcEFsbG93ZWQBAhRzZXRfZGVsZWdhdGlvbl9jbGFpbQMJAAACBQZjaGVja3MFBmNoZWNrcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUHYWRkcmVzcwkAAgECC2JhZCBhZGRyZXNzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgIRZGVsZWdhdGlvbl9jbGFpbV8JAKUIAQgFAWkGY2FsbGVyCQCsAgIJAKwCAgUHYWRkcmVzcwIBfAMFBnJlbG9jawIBMQIBMAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFXJlbW92ZUNsYWltRGVsZWdhdGlvbgAEBmNoZWNrcwkBCW9wQWxsb3dlZAECFHNldF9kZWxlZ2F0aW9uX2NsYWltAwkAAAIFBmNoZWNrcwUGY2hlY2tzCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgIRZGVsZWdhdGlvbl9jbGFpbV8JAKUIAQgFAWkGY2FsbGVyBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEJdXNlclBvd2VyAQR1c2VyCQCUCgIFA25pbAkBCnVzZXJHVmlyZXMBBQR1c2VyAQJ0eAEGdmVyaWZ5AAQEQkFTRQDoBwQLcXVvcnVtUmF0aW8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ1jb25maWdBZGRyZXNzAhVwcm9wb3NhbF9xdW9ydW1fcmF0aW8CInByb3Bvc2FsUXVvcnVtUmF0aW8gaXMgbm90IGRlZmluZWQEC3Bhc3NlZFJhdGlvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNY29uZmlnQWRkcmVzcwIVcHJvcG9zYWxfcGFzc2VkX3JhdGlvAiVwcm9wb3NhbFRocmVzaG9sZFJhdGlvIGlzIG5vdCBkZWZpbmVkBA5nVmlyZXNDb250cmFjdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ1jb25maWdBZGRyZXNzAhJkaXZpZGVuZHNfY29udHJhY3QCFW5vIGRpdmlkZW5kc19jb250cmFjdAIaaW52YWxpZCBkaXZpZGVuZHNfY29udHJhY3QEDnZvdGluZ0NvbnRyYWN0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCD3ZvdGluZ19jb250cmFjdAISbm8gdm90aW5nX2NvbnRyYWN0AhdpbnZhbGlkIHZvdGluZ19jb250cmFjdAQCaWQJANgEAQgFAnR4AmlkBAh2b3Rlc1llcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ52b3RpbmdDb250cmFjdAkArAICAg1wcm9wb3NhbF95ZXNfBQJpZAAABAd2b3Rlc05vCQELdmFsdWVPckVsc2UCCQCaCAIFDnZvdGluZ0NvbnRyYWN0CQCsAgICDHByb3Bvc2FsX25vXwUCaWQAAAQOcHJvcG9zYWxIZWlnaHQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ52b3RpbmdDb250cmFjdAkArAICAhBwcm9wb3NhbF9oZWlnaHRfBQJpZAIXcHJvcG9zYWwgbm90IHJlZ2lzdGVyZWQECmFwcGx5U3RhcnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUOdm90aW5nQ29udHJhY3QJAKwCAgIUcHJvcG9zYWxfYXBwbHlzdGFydF8FAmlkAAAECGFwcGx5RW5kCQELdmFsdWVPckVsc2UCCQCaCAIFDnZvdGluZ0NvbnRyYWN0CQCsAgICEnByb3Bvc2FsX2FwcGx5ZW5kXwUCaWQAAAQLdG90YWxHVmlyZXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUOdm90aW5nQ29udHJhY3QJAKwCAgIQcHJvcG9zYWxfZ3ZpcmVzXwUCaWQAAAQHZW5hYmxlZAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQ1jb25maWdBZGRyZXNzAh1vcF9nb3Zlcm5hbmNlX2FwcGx5X3R4X3BhdXNlZAcEB3ZvdGVZZXMFCHZvdGVzWWVzBAZ2b3RlTm8FB3ZvdGVzTm8ECnRvdGFsVm90ZXMJAGQCBQd2b3RlWWVzBQZ2b3RlTm8ECWhhc1F1b3J1bQkAZwIJAGkCCQBoAgUKdG90YWxWb3RlcwUEQkFTRQULdG90YWxHVmlyZXMFC3F1b3J1bVJhdGlvBAloYXNQYXNzZWQJAGcCCQBpAgkAaAIFB3ZvdGVZZXMFBEJBU0UFCnRvdGFsVm90ZXMFC3Bhc3NlZFJhdGlvBAh0b29FYXJseQkAZwIFCmFwcGx5U3RhcnQFBkhFSUdIVAQHdG9vTGF0ZQkAZwIFBkhFSUdIVAUIYXBwbHlFbmQECXRpbWVEZWJ1ZwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhFwcm9wb3NhbEhlaWdodCA9IAkApAMBBQ5wcm9wb3NhbEhlaWdodAIPLCBhcHBseVN0YXJ0ID0gCQCkAwEFCmFwcGx5U3RhcnQCDSwgYXBwbHlFbmQgPSAJAKQDAQUIYXBwbHlFbmQCCywgSEVJR0hUID0gCQCkAwEFBkhFSUdIVAQIYnlWb3RpbmcDCQEBIQEFB2VuYWJsZWQJAAIBAit0eCBhcHBsaWNhdGlvbiB0aHJvdyBnb3Zlcm5hbmNlIG5vdCBlbmFibGVkAwUIdG9vRWFybHkJAAIBCQCsAgICLnByb3Bvc2FsIGNhbid0IGJlIGV4ZWN1dGVkIGFzIGl0J3MgdG9vIGVhcmx5OiAFCXRpbWVEZWJ1ZwMFB3Rvb0xhdGUJAAIBCQCsAgICLHByb3Bvc2FsIGNhbid0IGJlIGV4ZWN1dGVkIGFzIGl0J3MgdG9vIGxhdGU6BQl0aW1lRGVidWcDCQEBIQEFCWhhc1F1b3J1bQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICC25vIHF1b3J1bTogAgx0b3RhbFZvdGVzOiAJAKQDAQUKdG90YWxWb3RlcwIPLCB0b3RhbEdWaXJlczogCQCkAwEFC3RvdGFsR1ZpcmVzAg8sIHF1b3J1bVJhdGlvOiAJAKQDAQULcXVvcnVtUmF0aW8DCQEBIQEFCWhhc1Bhc3NlZAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICF25vIHRocmVzaG9sZCBhY2hpZXZlZDogAgl2b3RlWWVzOiAJAKQDAQUHdm90ZVllcwIKLCB2b3RlTm86IAkApAMBBQZ2b3RlTm8CDywgcGFzc2VkUmF0aW86IAkApAMBBQtwYXNzZWRSYXRpbwYDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5BgUIYnlWb3RpbmelFXPC", "chainId": 87, "height": 3658929, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6nKCoXLSXimvRHXaqgcbcswSNBWCE3qcsnvu64ABG3LW Next: 29EfZYE2XLzH6itDPVDrBrvSt5utVx3P4PtaB4M4SUCJ Diff:
OldNewDifferences
336336 else {
337337 let recoveryAmount = fraction(amount, recoveryAddressShare, 100)
338338 let dividentsAmount = (amount - recoveryAmount)
339-[changeBy(totalVirtualDividendsStore(assetIdString), dividentsAmount), changeBy(totalRealDividendsStore(assetIdString), dividentsAmount), changeBy(recoveryAllocStore(assetIdString), recoveryAmount), ScriptTransfer(recoveryAddress, recoveryAmount, assetId(assetIdString))]
339+[changeBy(totalVirtualDividendsStore(assetIdString), dividentsAmount), changeBy(totalRealDividendsStore(assetIdString), dividentsAmount), ScriptTransfer(recoveryAddress, recoveryAmount, assetId(assetIdString))]
340340 }
341341 else throw("Strict value is not equal to itself.")
342342 }
359359
360360
361361 func adviseUser (user) = {
362- let $t01213512225 = userViresData(user)
363- let deposited = $t01213512225._1
364- let locked = $t01213512225._2
365- let withdrawable = $t01213512225._3
366- let withdrawn = $t01213512225._4
367- let inProtocol = $t01213512225._5
368- let gVires = $t01213512225._6
369- let $t01223012283 = userProfitData(user)
370- let virtualTokens = $t01223012283._1
371- let tokenData = $t01223012283._2
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
372372 let power = if ((inProtocol == 0))
373373 then 0
374374 else fraction(10000, gVires, inProtocol)
375375 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))
376376 let tokensData = {
377377 func fld (totals,item) = {
378- let $t01295712984 = item
379- let aid = $t01295712984._1
380- let ced = $t01295712984._2
381- let av = $t01295712984._3
382- let nc = $t01295712984._4
378+ let $t01295812985 = item
379+ let aid = $t01295812985._1
380+ let ced = $t01295812985._2
381+ let av = $t01295812985._3
382+ let nc = $t01295812985._4
383383 ((((((((((totals + ", [ ") + "assetId = ") + aid) + ", claimed = ") + toString(ced)) + ", claimable = ") + toString(av)) + ", nonClaimable = ") + toString(nc)) + "]")
384384 }
385385
435435 if ((currentFactor > factor))
436436 then throw("can't downgrade boosting")
437437 else {
438- let $t01435414440 = userViresData(user)
439- let deposited = $t01435414440._1
440- let locked = $t01435414440._2
441- let withdrawable = $t01435414440._3
442- let withdrawn = $t01435414440._4
443- let inProtocol = $t01435414440._5
444- let gV = $t01435414440._6
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
445445 let oldVirtualTokens = userVirtualTokens(user)
446446 let newVirtualTokens = formula((HEIGHT - initialHeight), (factor * (tokens + inProtocol)))
447447 let diff = (newVirtualTokens - oldVirtualTokens)
541541 if ((checks == checks))
542542 then {
543543 let addr = addressFromStringValue(user)
544- let $t01766717745 = userViresData(user)
545- let deposited = $t01766717745._1
546- let locked = $t01766717745._2
547- let withdrawable = $t01766717745._3
548- let withdrawn = $t01766717745._4
549- let gVires = $t01766717745._5
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
550550 if ((0 >= withdrawable))
551551 then nil
552552 else {
553553 let userUpdate = if (userOffCliff(user))
554554 then {
555- let $t01785417908 = userProfitData(user)
556- let virtualTokens = $t01785417908._1
557- let tokensData = $t01785417908._2
555+ let $t01785517909 = userProfitData(user)
556+ let virtualTokens = $t01785517909._1
557+ let tokensData = $t01785517909._2
558558 let base = [DeleteEntry(userFactorStore(user)), DeleteEntry(userEntryHeightStore(user)), DeleteEntry(userWithdrawnTokensStore(user)), DeleteEntry(userDepositedTokensStore(user)), DeleteEntry(userVirtualTokensStore(user)), changeByStr(totalVirtualTokensStore, -(withdrawable))]
559559 let tokenData = {
560560 func fold (total,item) = {
561- let $t01845518484 = item
562- let aid = $t01845518484._1
563- let ced = $t01845518484._2
564- let av = $t01845518484._3
565- let nc = $t01845518484._4
561+ let $t01845618485 = item
562+ let aid = $t01845618485._1
563+ let ced = $t01845618485._2
564+ let av = $t01845618485._3
565+ let nc = $t01845618485._4
566566 (total ++ [DeleteEntry(userDividendsClaimedStore(user, aid)), IntegerEntry(userDividendsAdjStore(user, aid), -(av)), IntegerEntry(totalVirtualDividendsStore(aid), fraction(totalVirtualDividends(aid), (totalVirtualTokens - withdrawable), totalVirtualTokens))])
567567 }
568568
615615 if ((checks == checks))
616616 then {
617617 let toAddr = addressFromStringValue(to)
618- let $t02002020073 = userProfitData(from)
619- let virtualTokens = $t02002020073._1
620- let tokensData = $t02002020073._2
618+ let $t02002120074 = userProfitData(from)
619+ let virtualTokens = $t02002120074._1
620+ let tokensData = $t02002120074._2
621621 let relocking = if (relock)
622622 then updateUser(from, 0, userFactor(from))
623623 else nil
624624 let tokenData = {
625625 func fold (total,item) = {
626- let $t02028520314 = item
627- let aid = $t02028520314._1
628- let ced = $t02028520314._2
629- let av = $t02028520314._3
630- let nc = $t02028520314._4
626+ let $t02028620315 = item
627+ let aid = $t02028620315._1
628+ let ced = $t02028620315._2
629+ let av = $t02028620315._3
630+ let nc = $t02028620315._4
631631 (total ++ [changeBy(userDividendsClaimedStore(from, aid), av), changeBy(totalRealDividendsClaimedStore(aid), av), ScriptTransfer(toAddr, av, assetId(aid))])
632632 }
633633
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
5454 func assetId (s) = if ((s == "WAVES"))
5555 then unit
5656 else fromBase58String(split(s, "_")[0])
5757
5858
5959 func assetIdStr (aid) = match aid {
6060 case bv: ByteVector =>
6161 toBase58String(bv)
6262 case u: Unit =>
6363 "WAVES"
6464 case _ =>
6565 throw("Match error")
6666 }
6767
6868
6969 func throwIf (condition,error) = if (condition)
7070 then throw(error)
7171 else true
7272
7373
7474 func writeInt (key,value) = if ((0 > value))
7575 then throw(((("writing negative value " + toString(value)) + " for key ") + key))
7676 else IntegerEntry(key, value)
7777
7878
7979 func writeStrInt (key,value) = if ((0 > value))
8080 then throw(((("writing negative value " + toString(value)) + " for key ") + key))
8181 else StringEntry(key, toString(value))
8282
8383
8484 func writeString (key,value) = StringEntry(key, value)
8585
8686
8787 func writeConstString (key,value) = if (!(isDefined(getString(this, key))))
8888 then StringEntry(key, value)
8989 else throw(("already initialized: " + key))
9090
9191
9292 func changeBy (key,value) = writeInt(key, (valueOrElse(getInteger(this, key), 0) + value))
9393
9494
9595 func changeByStr (key,value) = writeStrInt(key, (parseIntValue(valueOrElse(getString(this, key), "0")) + value))
9696
9797
9898 func viresPayment (i) = if ((size(i.payments) == 0))
9999 then 0
100100 else if ((i.payments[0].assetId != viresAssetId))
101101 then throw("not vires")
102102 else i.payments[0].amount
103103
104104
105105 func opAllowed (op) = match invoke(configAddress, "opAllowed", [viresIdStr, op], nil) {
106106 case b: Boolean =>
107107 if (b)
108108 then true
109109 else throw("not allowed")
110110 case _ =>
111111 throw("opAllowed: unexpected result type")
112112 }
113113
114114
115115 let viresStaker = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "vires_staker"), "no vires_staker in config")), "invalid vires_staker address")
116116
117117 let main = valueOrErrorMessage(addressFromString(split(valueOrErrorMessage(getString(configAddress, "main"), "no main"), "|")[0]), "invalid main")
118118
119119 func mainOnly (i) = if (contains(getStringValue(configAddress, "main"), toString(i.caller)))
120120 then true
121121 else throw("only main can do")
122122
123123
124124 let dividendableTokens = valueOrElse(getString(configAddress, "dividendableTokens"), "")
125125
126126 let dividendableTokensArr = if ((dividendableTokens == ""))
127127 then nil
128128 else split_4C(dividendableTokens, "|")
129129
130130 let dividendableReservesStr = valueOrElse(getString(configAddress, "dividendableReserves"), "")
131131
132132 let dividendableReserves = match dividendableReservesStr {
133133 case str: String =>
134134 if ((str == ""))
135135 then nil
136136 else split_4C(str, "|")
137137 case _ =>
138138 nil
139139 }
140140
141141 let halfLife = valueOrErrorMessage(getInteger(configAddress, "vires_lock_half_life"), "half life not set")
142142
143143 let lambda = (69314718056 / halfLife)
144144
145145 let LAMBDABASE = 8
146146
147147 let E = 271828183
148148
149149 let EBASE = 8
150150
151151 func formula (x,y0) = fraction(y0, pow(E, EBASE, fraction(lambda, x, 1000), LAMBDABASE, 8, HALFUP), 100000000)
152152
153153
154154 func userDividendsAdjStore (user,aid) = (((user + "_") + aid) + "_adj")
155155
156156
157157 func userDividendsClaimedStore (user,aid) = (((user + "_") + aid) + "_claimed")
158158
159159
160160 func userVirtualTokensStore (user) = (user + "_virtual")
161161
162162
163163 func userDepositedTokensStore (user) = (user + "_vires")
164164
165165
166166 func userWithdrawnTokensStore (user) = (user + "_vires_withdrawn")
167167
168168
169169 func userEntryHeightStore (user) = (user + "_height")
170170
171171
172172 func userFactorStore (user) = (user + "_factor")
173173
174174
175175 func userDividendsAdj (user,aid) = valueOrElse(getInteger(userDividendsAdjStore(user, aid)), 0)
176176
177177
178178 func userDividendsClaimed (user,aid) = valueOrElse(getInteger(userDividendsClaimedStore(user, aid)), 0)
179179
180180
181181 func userVirtualTokens (user) = parseIntValue(valueOrElse(getString(userVirtualTokensStore(user)), "0"))
182182
183183
184184 func userDepositedTokens (user) = valueOrElse(getInteger(userDepositedTokensStore(user)), 0)
185185
186186
187187 func userWithdrawnTokens (user) = valueOrElse(getInteger(userWithdrawnTokensStore(user)), 0)
188188
189189
190190 func userEntryHeight (user) = valueOrElse(getInteger(userEntryHeightStore(user)), 0)
191191
192192
193193 func userFactor (user) = valueOrElse(getInteger(userFactorStore(user)), 1)
194194
195195
196196 func userGVires (user) = formula(-((HEIGHT - initialHeight)), userVirtualTokens(user))
197197
198198
199199 func totalVirtualDividendsStore (aid) = (aid + "_totalVirtualDividends")
200200
201201
202202 func totalRealDividendsStore (aid) = (aid + "_totalRealDividends")
203203
204204
205205 func recoveryAllocStore (aid) = (aid + "_recoveryAllocations")
206206
207207
208208 func totalRealDividendsClaimedStore (aid) = (aid + "_totalRealDividendsClaimed")
209209
210210
211211 let totalVirtualTokensStore = "totalVirtualTokens"
212212
213213 let totalDepositedTokensStore = "totalDepositedTokens"
214214
215215 func totalDepositedByFactorStore (factor) = ("totalDepositedTokens" + toString(factorCheck(factor)))
216216
217217
218218 func totalDepositedByFactor (factor) = valueOrElse(getInteger(totalDepositedByFactorStore(factor)), 0)
219219
220220
221221 func totalVirtualDividends (aid) = valueOrElse(getInteger(this, totalVirtualDividendsStore(aid)), 0)
222222
223223
224224 func totalRealDividends (aid) = valueOrElse(getInteger(this, totalRealDividendsStore(aid)), 0)
225225
226226
227227 let totalVirtualTokens = parseIntValue(valueOrElse(getString(this, totalVirtualTokensStore), "0"))
228228
229229 let totalDepositedTokens = valueOrElse(getInteger(this, totalDepositedTokensStore), 0)
230230
231231 func userOffCliff (user) = {
232232 let entryHeight = userEntryHeight(user)
233233 let factor = userFactor(user)
234234 if ((factor == 1))
235235 then (HEIGHT > (entryHeight + (4 * halfLife)))
236236 else if ((factor == 2))
237237 then (HEIGHT > (entryHeight + (5 * halfLife)))
238238 else if ((factor == 4))
239239 then (HEIGHT > (entryHeight + (6 * halfLife)))
240240 else throw(("bad factor:" + toString(factor)))
241241 }
242242
243243
244244 func userViresData (user) = {
245245 let deposited = userDepositedTokens(user)
246246 let gV = userGVires(user)
247247 let supposedLocked = min([deposited, gV])
248248 let locked = if (userOffCliff(user))
249249 then 0
250250 else supposedLocked
251251 let unlocked = (deposited - locked)
252252 let withdrawn = userWithdrawnTokens(user)
253253 let withdrawable = (unlocked - withdrawn)
254254 let inProtocol = (locked + withdrawable)
255255 $Tuple6(deposited, locked, withdrawable, withdrawn, inProtocol, gV)
256256 }
257257
258258
259259 func userProfitData (user) = {
260260 let totalTokens = size(dividendableTokensArr)
261261 let totalDividendableReserves = size(dividendableReserves)
262262 if ((totalTokens != totalDividendableReserves))
263263 then throw(((("inconsistent configuration: totalTokens=" + toString(totalTokens)) + ", totalDividendableReserves = ") + toString(totalDividendableReserves)))
264264 else {
265265 let virtualTokens = userVirtualTokens(user)
266266 let tokenData = {
267267 func fold (totals,index) = if ((index >= totalTokens))
268268 then totals
269269 else {
270270 let aid = dividendableTokensArr[index]
271271 let $t085418830 = {
272272 let r = valueOrErrorMessage(addressFromString(dividendableReserves[index]), "bad reserve in dividendableReserves")
273273 asIntStrInt(invoke(r, "getReserveDivsInfo", nil, nil))
274274 }
275275 let reserveDivs = $t085418830._1
276276 let reserveAssetId = $t085418830._2
277277 let nonClaimable = $t085418830._3
278278 if ((reserveAssetId != aid))
279279 then throw(((((((("inconsistent configuration: reserveAssetId=" + reserveAssetId) + ", aid=") + aid) + ", dividendableTokens:") + dividendableTokens) + ", dividendableReserves:") + dividendableReservesStr))
280280 else {
281281 let userVirtualDivs = if ((totalVirtualTokens == 0))
282282 then 0
283283 else fraction((totalVirtualDividends(aid) + reserveDivs), virtualTokens, totalVirtualTokens)
284284 let adj = userDividendsAdj(user, aid)
285285 let userDivs = (userVirtualDivs - adj)
286286 let nonClaimableUserDivs = if ((totalVirtualTokens == 0))
287287 then 0
288288 else fraction(nonClaimable, virtualTokens, totalVirtualTokens)
289289 let userClaimed = userDividendsClaimed(user, aid)
290290 let claimable = max([0, (userDivs - userClaimed)])
291291 if ((0 > claimable))
292292 then throw(("claimable < 0: " + toString(claimable)))
293293 else (totals ++ [$Tuple4(aid, userClaimed, claimable, nonClaimableUserDivs)])
294294 }
295295 }
296296
297297 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
298298 let $s = size($l)
299299 let $acc0 = nil
300300 func $f0_1 ($a,$i) = if (($i >= $s))
301301 then $a
302302 else fold($a, $l[$i])
303303
304304 func $f0_2 ($a,$i) = if (($i >= $s))
305305 then $a
306306 else throw("List size exceeds 20")
307307
308308 $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)
309309 }
310310 $Tuple2(virtualTokens, tokenData)
311311 }
312312 }
313313
314314
315315 func claimFromReservesInternal () = {
316316 let assetIdStore = "assetId"
317317 let recoveryAddressShare = valueOrElse(getInteger(configAddress, "recovery_address_share"), 0)
318318 let recoveryReservesStr = valueOrElse(getString(configAddress, "recovery_reserves"), "")
319319 let recoveryAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "recovery_address"), "fond address not found")), "fond address is invalid")
320320 func fold (output,reserve) = {
321321 let reserveAddress = valueOrErrorMessage(addressFromString(reserve), "adder: bad reserve address")
322322 let assetIdString = valueOrErrorMessage(getString(reserveAddress, assetIdStore), "no assetId in reserve")
323323 let actions = if (!(contains(dividendableTokens, assetIdString)))
324324 then throw("inconsistent configuration: dividendableReserve's asset id is not stored in dividendableTokens")
325325 else {
326326 let amount = asInt(invoke(reserveAddress, "withdrawFromReserve", [-1], nil))
327327 if ((amount == amount))
328328 then if ((0 > amount))
329329 then throw("bad amount")
330330 else if ((amount == 0))
331331 then nil
332332 else if (if ((recoveryAddressShare == 0))
333333 then true
334334 else !(contains(recoveryReservesStr, reserve)))
335335 then [changeBy(totalVirtualDividendsStore(assetIdString), amount), changeBy(totalRealDividendsStore(assetIdString), amount)]
336336 else {
337337 let recoveryAmount = fraction(amount, recoveryAddressShare, 100)
338338 let dividentsAmount = (amount - recoveryAmount)
339-[changeBy(totalVirtualDividendsStore(assetIdString), dividentsAmount), changeBy(totalRealDividendsStore(assetIdString), dividentsAmount), changeBy(recoveryAllocStore(assetIdString), recoveryAmount), ScriptTransfer(recoveryAddress, recoveryAmount, assetId(assetIdString))]
339+[changeBy(totalVirtualDividendsStore(assetIdString), dividentsAmount), changeBy(totalRealDividendsStore(assetIdString), dividentsAmount), ScriptTransfer(recoveryAddress, recoveryAmount, assetId(assetIdString))]
340340 }
341341 else throw("Strict value is not equal to itself.")
342342 }
343343 (output ++ actions)
344344 }
345345
346346 let $l = dividendableReserves
347347 let $s = size($l)
348348 let $acc0 = nil
349349 func $f0_1 ($a,$i) = if (($i >= $s))
350350 then $a
351351 else fold($a, $l[$i])
352352
353353 func $f0_2 ($a,$i) = if (($i >= $s))
354354 then $a
355355 else throw("List size exceeds 20")
356356
357357 $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)
358358 }
359359
360360
361361 func adviseUser (user) = {
362- let $t01213512225 = userViresData(user)
363- let deposited = $t01213512225._1
364- let locked = $t01213512225._2
365- let withdrawable = $t01213512225._3
366- let withdrawn = $t01213512225._4
367- let inProtocol = $t01213512225._5
368- let gVires = $t01213512225._6
369- let $t01223012283 = userProfitData(user)
370- let virtualTokens = $t01223012283._1
371- let tokenData = $t01223012283._2
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
372372 let power = if ((inProtocol == 0))
373373 then 0
374374 else fraction(10000, gVires, inProtocol)
375375 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))
376376 let tokensData = {
377377 func fld (totals,item) = {
378- let $t01295712984 = item
379- let aid = $t01295712984._1
380- let ced = $t01295712984._2
381- let av = $t01295712984._3
382- let nc = $t01295712984._4
378+ let $t01295812985 = item
379+ let aid = $t01295812985._1
380+ let ced = $t01295812985._2
381+ let av = $t01295812985._3
382+ let nc = $t01295812985._4
383383 ((((((((((totals + ", [ ") + "assetId = ") + aid) + ", claimed = ") + toString(ced)) + ", claimable = ") + toString(av)) + ", nonClaimable = ") + toString(nc)) + "]")
384384 }
385385
386386 let $l = tokenData
387387 let $s = size($l)
388388 let $acc0 = ""
389389 func $f0_1 ($a,$i) = if (($i >= $s))
390390 then $a
391391 else fld($a, $l[$i])
392392
393393 func $f0_2 ($a,$i) = if (($i >= $s))
394394 then $a
395395 else throw("List size exceeds 20")
396396
397397 $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)
398398 }
399399 (base + tokensData)
400400 }
401401
402402
403403 func advise () = {
404404 let totalGvires = formula(-((HEIGHT - initialHeight)), totalVirtualTokens)
405405 let base = (((((((((((" totalDepositedTokens = " + toString(totalDepositedTokens)) + ", totalDepositedTokens1 = ") + toString(totalDepositedByFactor(1))) + ", totalDepositedTokens2 = ") + toString(totalDepositedByFactor(2))) + ", totalDepositedTokens4 = ") + toString(totalDepositedByFactor(4))) + ", totalVirtualTokens = ") + toString(totalVirtualTokens)) + ", totalGvires = ") + toString(totalGvires))
406406 func fold (total,aid) = ((((total + ", ") + aid) + " = ") + toString(totalRealDividends(aid)))
407407
408408 let $l = dividendableTokensArr
409409 let $s = size($l)
410410 let $acc0 = base
411411 func $f0_1 ($a,$i) = if (($i >= $s))
412412 then $a
413413 else fold($a, $l[$i])
414414
415415 func $f0_2 ($a,$i) = if (($i >= $s))
416416 then $a
417417 else throw("List size exceeds 20")
418418
419419 $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)
420420 }
421421
422422
423423 func updateUser (user,tokens,f) = {
424424 let checks = opAllowed("lock_vires")
425425 if ((checks == checks))
426426 then if (if ((f != 1))
427427 then valueOrElse(getBoolean(configAddress, "allow_boost"), false)
428428 else false)
429429 then throw("boosting not enabled")
430430 else {
431431 let factor = factorCheck(f)
432432 if ((factor == factor))
433433 then {
434434 let currentFactor = userFactor(user)
435435 if ((currentFactor > factor))
436436 then throw("can't downgrade boosting")
437437 else {
438- let $t01435414440 = userViresData(user)
439- let deposited = $t01435414440._1
440- let locked = $t01435414440._2
441- let withdrawable = $t01435414440._3
442- let withdrawn = $t01435414440._4
443- let inProtocol = $t01435414440._5
444- let gV = $t01435414440._6
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
445445 let oldVirtualTokens = userVirtualTokens(user)
446446 let newVirtualTokens = formula((HEIGHT - initialHeight), (factor * (tokens + inProtocol)))
447447 let diff = (newVirtualTokens - oldVirtualTokens)
448448 let base = [changeBy(totalDepositedTokensStore, tokens), changeByStr(totalVirtualTokensStore, diff), changeByStr(userVirtualTokensStore(user), diff), changeBy(userDepositedTokensStore(user), tokens), IntegerEntry(userEntryHeightStore(user), HEIGHT), IntegerEntry(userFactorStore(user), factor)]
449449 let tokenData = {
450450 func fold (total,aid) = {
451451 let adj = if ((totalVirtualTokens == 0))
452452 then 0
453453 else fraction(diff, totalVirtualDividends(aid), totalVirtualTokens)
454454 (total ++ [changeBy(totalVirtualDividendsStore(aid), adj), IntegerEntry(userDividendsAdjStore(user, aid), (userDividendsAdj(user, aid) + adj))])
455455 }
456456
457457 let $l = dividendableTokensArr
458458 let $s = size($l)
459459 let $acc0 = nil
460460 func $f0_1 ($a,$i) = if (($i >= $s))
461461 then $a
462462 else fold($a, $l[$i])
463463
464464 func $f0_2 ($a,$i) = if (($i >= $s))
465465 then $a
466466 else throw("List size exceeds 20")
467467
468468 $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)
469469 }
470470 let monitoring = if ((factor != currentFactor))
471471 then [changeBy(totalDepositedByFactorStore(currentFactor), -(inProtocol)), changeBy(totalDepositedByFactorStore(factor), (tokens + inProtocol))]
472472 else [changeBy(totalDepositedByFactorStore(factor), tokens)]
473473 ((base ++ tokenData) ++ monitoring)
474474 }
475475 }
476476 else throw("Strict value is not equal to itself.")
477477 }
478478 else throw("Strict value is not equal to itself.")
479479 }
480480
481481
482482 @Callable(i)
483483 func totalGvires () = $Tuple2(nil, formula(-((HEIGHT - initialHeight)), totalVirtualTokens))
484484
485485
486486
487487 @Callable(i)
488488 func shareProfitManually () = {
489489 let checks = opAllowed("share_dividends_manually")
490490 if ((checks == checks))
491491 then {
492492 let paymentAssetId = assetIdStr(i.payments[0].assetId)
493493 if (!(contains(dividendableTokens, paymentAssetId)))
494494 then throw("bad profit token")
495495 else {
496496 let amt = i.payments[0].amount
497497 [changeBy(totalVirtualDividendsStore(paymentAssetId), amt), changeBy(totalRealDividendsStore(paymentAssetId), amt)]
498498 }
499499 }
500500 else throw("Strict value is not equal to itself.")
501501 }
502502
503503
504504
505505 @Callable(i)
506506 func shareProfitFromReserves () = claimFromReservesInternal()
507507
508508
509509
510510 @Callable(i)
511511 func init (configAddress,vires) = [writeConstString(configStore, configAddress), writeConstString(viresAssetIdStore, vires)]
512512
513513
514514
515515 @Callable(i)
516516 func init2 () = if ((i.caller != this))
517517 then throw("only self can continue")
518518 else [writeInt(initialHeightStore, HEIGHT)]
519519
520520
521521
522522 @Callable(i)
523523 func lockFor (user,factor) = {
524524 let checks = throwIf(if ((toString(i.caller) != user))
525525 then (i.caller != main)
526526 else false, "only main and user directly can do")
527527 if ((checks == checks))
528528 then updateUser(user, viresPayment(i), factor)
529529 else throw("Strict value is not equal to itself.")
530530 }
531531
532532
533533
534534 @Callable(i)
535535 func withdrawUnlockedFor (user) = {
536536 let checks = if (throwIf(if ((toString(i.caller) != user))
537537 then (i.caller != main)
538538 else false, "only main and user directly can do"))
539539 then opAllowed("withdraw_unlocked_vires")
540540 else false
541541 if ((checks == checks))
542542 then {
543543 let addr = addressFromStringValue(user)
544- let $t01766717745 = userViresData(user)
545- let deposited = $t01766717745._1
546- let locked = $t01766717745._2
547- let withdrawable = $t01766717745._3
548- let withdrawn = $t01766717745._4
549- let gVires = $t01766717745._5
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
550550 if ((0 >= withdrawable))
551551 then nil
552552 else {
553553 let userUpdate = if (userOffCliff(user))
554554 then {
555- let $t01785417908 = userProfitData(user)
556- let virtualTokens = $t01785417908._1
557- let tokensData = $t01785417908._2
555+ let $t01785517909 = userProfitData(user)
556+ let virtualTokens = $t01785517909._1
557+ let tokensData = $t01785517909._2
558558 let base = [DeleteEntry(userFactorStore(user)), DeleteEntry(userEntryHeightStore(user)), DeleteEntry(userWithdrawnTokensStore(user)), DeleteEntry(userDepositedTokensStore(user)), DeleteEntry(userVirtualTokensStore(user)), changeByStr(totalVirtualTokensStore, -(withdrawable))]
559559 let tokenData = {
560560 func fold (total,item) = {
561- let $t01845518484 = item
562- let aid = $t01845518484._1
563- let ced = $t01845518484._2
564- let av = $t01845518484._3
565- let nc = $t01845518484._4
561+ let $t01845618485 = item
562+ let aid = $t01845618485._1
563+ let ced = $t01845618485._2
564+ let av = $t01845618485._3
565+ let nc = $t01845618485._4
566566 (total ++ [DeleteEntry(userDividendsClaimedStore(user, aid)), IntegerEntry(userDividendsAdjStore(user, aid), -(av)), IntegerEntry(totalVirtualDividendsStore(aid), fraction(totalVirtualDividends(aid), (totalVirtualTokens - withdrawable), totalVirtualTokens))])
567567 }
568568
569569 let $l = tokensData
570570 let $s = size($l)
571571 let $acc0 = nil
572572 func $f0_1 ($a,$i) = if (($i >= $s))
573573 then $a
574574 else fold($a, $l[$i])
575575
576576 func $f0_2 ($a,$i) = if (($i >= $s))
577577 then $a
578578 else throw("List size exceeds 20")
579579
580580 $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)
581581 }
582582 (base ++ tokenData)
583583 }
584584 else [changeBy(userWithdrawnTokensStore(user), withdrawable)]
585585 (userUpdate ++ [changeBy(totalDepositedByFactorStore(userFactor(user)), -(withdrawable)), changeBy(totalDepositedTokensStore, -(withdrawable)), ScriptTransfer(addr, withdrawable, viresAssetId)])
586586 }
587587 }
588588 else throw("Strict value is not equal to itself.")
589589 }
590590
591591
592592
593593 @Callable(i)
594594 func claimProfit (from,to,relock) = {
595595 let validDelegate = if ((from == to))
596596 then true
597597 else match getString(this, ("delegation_claim_" + from)) {
598598 case s: String =>
599599 let data = split(s, "|")
600600 if ((to != data[0]))
601601 then throw(("no delegation rights for " + to))
602602 else if (if (relock)
603603 then (data[1] != "1")
604604 else false)
605605 then throw("attempting to relock while it's not allowed")
606606 else true
607607 case _ =>
608608 throw(("delegation not configured for " + from))
609609 }
610610 let checks = if (if (mainOnly(i))
611611 then opAllowed("claim_dividends")
612612 else false)
613613 then validDelegate
614614 else false
615615 if ((checks == checks))
616616 then {
617617 let toAddr = addressFromStringValue(to)
618- let $t02002020073 = userProfitData(from)
619- let virtualTokens = $t02002020073._1
620- let tokensData = $t02002020073._2
618+ let $t02002120074 = userProfitData(from)
619+ let virtualTokens = $t02002120074._1
620+ let tokensData = $t02002120074._2
621621 let relocking = if (relock)
622622 then updateUser(from, 0, userFactor(from))
623623 else nil
624624 let tokenData = {
625625 func fold (total,item) = {
626- let $t02028520314 = item
627- let aid = $t02028520314._1
628- let ced = $t02028520314._2
629- let av = $t02028520314._3
630- let nc = $t02028520314._4
626+ let $t02028620315 = item
627+ let aid = $t02028620315._1
628+ let ced = $t02028620315._2
629+ let av = $t02028620315._3
630+ let nc = $t02028620315._4
631631 (total ++ [changeBy(userDividendsClaimedStore(from, aid), av), changeBy(totalRealDividendsClaimedStore(aid), av), ScriptTransfer(toAddr, av, assetId(aid))])
632632 }
633633
634634 let $l = tokensData
635635 let $s = size($l)
636636 let $acc0 = nil
637637 func $f0_1 ($a,$i) = if (($i >= $s))
638638 then $a
639639 else fold($a, $l[$i])
640640
641641 func $f0_2 ($a,$i) = if (($i >= $s))
642642 then $a
643643 else throw("List size exceeds 20")
644644
645645 $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)
646646 }
647647 (relocking ++ tokenData)
648648 }
649649 else throw("Strict value is not equal to itself.")
650650 }
651651
652652
653653
654654 @Callable(i)
655655 func setClaimDelegation (address,relock) = {
656656 let checks = opAllowed("set_delegation_claim")
657657 if ((checks == checks))
658658 then if (!(isDefined(addressFromString(address))))
659659 then throw("bad address")
660660 else [StringEntry(("delegation_claim_" + toString(i.caller)), ((address + "|") + (if (relock)
661661 then "1"
662662 else "0")))]
663663 else throw("Strict value is not equal to itself.")
664664 }
665665
666666
667667
668668 @Callable(i)
669669 func removeClaimDelegation () = {
670670 let checks = opAllowed("set_delegation_claim")
671671 if ((checks == checks))
672672 then [DeleteEntry(("delegation_claim_" + toString(i.caller)))]
673673 else throw("Strict value is not equal to itself.")
674674 }
675675
676676
677677
678678 @Callable(i)
679679 func userPower (user) = $Tuple2(nil, userGVires(user))
680680
681681
682682 @Verifier(tx)
683683 func verify () = {
684684 let BASE = 1000
685685 let quorumRatio = valueOrErrorMessage(getInteger(configAddress, "proposal_quorum_ratio"), "proposalQuorumRatio is not defined")
686686 let passedRatio = valueOrErrorMessage(getInteger(configAddress, "proposal_passed_ratio"), "proposalThresholdRatio is not defined")
687687 let gViresContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "dividends_contract"), "no dividends_contract")), "invalid dividends_contract")
688688 let votingContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "voting_contract"), "no voting_contract")), "invalid voting_contract")
689689 let id = toBase58String(tx.id)
690690 let votesYes = valueOrElse(getInteger(votingContract, ("proposal_yes_" + id)), 0)
691691 let votesNo = valueOrElse(getInteger(votingContract, ("proposal_no_" + id)), 0)
692692 let proposalHeight = valueOrErrorMessage(getInteger(votingContract, ("proposal_height_" + id)), "proposal not registered")
693693 let applyStart = valueOrElse(getInteger(votingContract, ("proposal_applystart_" + id)), 0)
694694 let applyEnd = valueOrElse(getInteger(votingContract, ("proposal_applyend_" + id)), 0)
695695 let totalGVires = valueOrElse(getInteger(votingContract, ("proposal_gvires_" + id)), 0)
696696 let enabled = valueOrElse(getBoolean(configAddress, "op_governance_apply_tx_paused"), false)
697697 let voteYes = votesYes
698698 let voteNo = votesNo
699699 let totalVotes = (voteYes + voteNo)
700700 let hasQuorum = (((totalVotes * BASE) / totalGVires) >= quorumRatio)
701701 let hasPassed = (((voteYes * BASE) / totalVotes) >= passedRatio)
702702 let tooEarly = (applyStart >= HEIGHT)
703703 let tooLate = (HEIGHT >= applyEnd)
704704 let timeDebug = ((((((("proposalHeight = " + toString(proposalHeight)) + ", applyStart = ") + toString(applyStart)) + ", applyEnd = ") + toString(applyEnd)) + ", HEIGHT = ") + toString(HEIGHT))
705705 let byVoting = if (!(enabled))
706706 then throw("tx application throw governance not enabled")
707707 else if (tooEarly)
708708 then throw(("proposal can't be executed as it's too early: " + timeDebug))
709709 else if (tooLate)
710710 then throw(("proposal can't be executed as it's too late:" + timeDebug))
711711 else if (!(hasQuorum))
712712 then throw((((((("no quorum: " + "totalVotes: ") + toString(totalVotes)) + ", totalGVires: ") + toString(totalGVires)) + ", quorumRatio: ") + toString(quorumRatio)))
713713 else if (!(hasPassed))
714714 then throw((((((("no threshold achieved: " + "voteYes: ") + toString(voteYes)) + ", voteNo: ") + toString(voteNo)) + ", passedRatio: ") + toString(passedRatio)))
715715 else true
716716 if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
717717 then true
718718 else byVoting
719719 }
720720

github/deemru/w8io/3ef1775 
99.31 ms