tx · GM1jsZHaBsJLRzFhNquw1aiRwNmreRoYSk4BYjBSm5Sw

3PHvU5KXYJUAReeActQpS56TCdF8gupEjdR:  -0.01900000 Waves

2022.08.05 12:32 [3236516] smart account 3PHvU5KXYJUAReeActQpS56TCdF8gupEjdR > SELF 0.00000000 Waves

{ "type": 13, "id": "GM1jsZHaBsJLRzFhNquw1aiRwNmreRoYSk4BYjBSm5Sw", "fee": 1900000, "feeAssetId": null, "timestamp": 1659692028951, "version": 1, "sender": "3PHvU5KXYJUAReeActQpS56TCdF8gupEjdR", "senderPublicKey": "EGGmHBK3xqTV6B19vtf2EhLscX4pB3tBXFKRDH5wdTcz", "proofs": [ "5nAPqPP3vhDSokFQY8kVLuEzjsaRDFHEVeah5J1BFdgxfMYzHzyCpsppoagn43mH7ATTd7aJyZU8ksKxtAXCXstF" ], "script": "base64:BgIvCAISABIAEgASBAoCCAgSABIECgIIARIDCgEIEgUKAwgIBBIECgIIBBIAEgMKAQhFAQVhc0ludAEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACA0ludAQDaW50BQckbWF0Y2gwBQNpbnQJAAIBAhl3cm9uZyB0eXBlLCBleHBlY3RlZDogSW50AQthc0ludFN0ckludAEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACEihJbnQsIFN0cmluZywgSW50KQQJaW50U3RySW50BQckbWF0Y2gwBQlpbnRTdHJJbnQDCQABAgUHJG1hdGNoMAINKEludCwgU3RyaW5nKQQGaW50U3RyBQckbWF0Y2gwCQCVCgMIBQZpbnRTdHICXzEIBQZpbnRTdHICXzIAAAkAAgECI3dyb25nIHR5cGUsIGV4cGVjdGVkOiAoSW50LCBTdHJpbmcpAQtmYWN0b3JDaGVjawEGZmFjdG9yAwMDCQECIT0CBQZmYWN0b3IAAQkBAiE9AgUGZmFjdG9yAAIHCQECIT0CBQZmYWN0b3IABAcJAAIBAgpiYWQgZmFjdG9yBQZmYWN0b3IAEXZpcmVzQXNzZXRJZFN0b3JlAgx2aXJlc0Fzc2V0SWQAEmluaXRpYWxIZWlnaHRTdG9yZQINaW5pdGlhbEhlaWdodAANaW5pdGlhbEhlaWdodAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUSaW5pdGlhbEhlaWdodFN0b3JlAAtjb25maWdTdG9yZQIGY29uZmlnAA1jb25maWdBZGRyZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFC2NvbmZpZ1N0b3JlAh9leHAtZGl2aWRlbmRzOiBubyBjb25maWdBZGRyZXNzAhZpbnZhbGlkIGNvbmZpZyBhZGRyZXNzABJtYXliZU9yYWNsZUFkZHJlc3MEByRtYXRjaDAJAJ0IAgUNY29uZmlnQWRkcmVzcwIOb3JhY2xlX2FkZHJlc3MDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQCmCAEFAXMFBHVuaXQABkhFSUdIVAUGaGVpZ2h0AAp2aXJlc0lkU3RyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwURdmlyZXNBc3NldElkU3RvcmUCF3ZpcmVzIGFzc2V0SWQgbm90IGZvdW5kAAx2aXJlc0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA2QQBBQp2aXJlc0lkU3RyAhVpbnZhbGlkIHZpcmVzIGFzc2V0SWQBB2Fzc2V0SWQBAXMDCQAAAgUBcwIFV0FWRVMFBHVuaXQJANkEAQkAkQMCCQC1CQIFAXMCAV8AAAEKYXNzZXRJZFN0cgEDYWlkBAckbWF0Y2gwBQNhaWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCYnYFByRtYXRjaDAJANgEAQUCYnYDCQABAgUHJG1hdGNoMAIEVW5pdAQBdQUHJG1hdGNoMAIFV0FWRVMJAAIBAgtNYXRjaCBlcnJvcgEHdGhyb3dJZgIJY29uZGl0aW9uBWVycm9yAwUJY29uZGl0aW9uCQACAQUFZXJyb3IGAQh3cml0ZUludAIDa2V5BXZhbHVlAwkAZgIAAAUFdmFsdWUJAAIBCQCsAgIJAKwCAgkArAICAhd3cml0aW5nIG5lZ2F0aXZlIHZhbHVlIAkApAMBBQV2YWx1ZQIJIGZvciBrZXkgBQNrZXkJAQxJbnRlZ2VyRW50cnkCBQNrZXkFBXZhbHVlAQt3cml0ZVN0ckludAIDa2V5BXZhbHVlAwkAZgIAAAUFdmFsdWUJAAIBCQCsAgIJAKwCAgkArAICAhd3cml0aW5nIG5lZ2F0aXZlIHZhbHVlIAkApAMBBQV2YWx1ZQIJIGZvciBrZXkgBQNrZXkJAQtTdHJpbmdFbnRyeQIFA2tleQkApAMBBQV2YWx1ZQELd3JpdGVTdHJpbmcCA2tleQV2YWx1ZQkBC1N0cmluZ0VudHJ5AgUDa2V5BQV2YWx1ZQEQd3JpdGVDb25zdFN0cmluZwIDa2V5BXZhbHVlAwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzBQNrZXkJAQtTdHJpbmdFbnRyeQIFA2tleQUFdmFsdWUJAAIBCQCsAgICFWFscmVhZHkgaW5pdGlhbGl6ZWQ6IAUDa2V5AQhjaGFuZ2VCeQIDa2V5BXZhbHVlCQEId3JpdGVJbnQCBQNrZXkJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAABQV2YWx1ZQELY2hhbmdlQnlTdHICA2tleQV2YWx1ZQkBC3dyaXRlU3RySW50AgUDa2V5CQBkAgkBDXBhcnNlSW50VmFsdWUBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFA2tleQIBMAUFdmFsdWUBDHZpcmVzUGF5bWVudAEBaQMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAAAAAMJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUMdmlyZXNBc3NldElkCQACAQIJbm90IHZpcmVzCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAEJb3BBbGxvd2VkAQJvcAQHJG1hdGNoMAkA/AcEBQ1jb25maWdBZGRyZXNzAglvcEFsbG93ZWQJAMwIAgUKdmlyZXNJZFN0cgkAzAgCBQJvcAUDbmlsBQNuaWwDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBYgUHJG1hdGNoMAMFAWIGCQACAQILbm90IGFsbG93ZWQJAAIBAiFvcEFsbG93ZWQ6IHVuZXhwZWN0ZWQgcmVzdWx0IHR5cGUAC3ZpcmVzU3Rha2VyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCDHZpcmVzX3N0YWtlcgIZbm8gdmlyZXNfc3Rha2VyIGluIGNvbmZpZwIcaW52YWxpZCB2aXJlc19zdGFrZXIgYWRkcmVzcwAEbWFpbgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgkAtQkCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwIEbWFpbgIHbm8gbWFpbgIBfAAAAgxpbnZhbGlkIG1haW4BCG1haW5Pbmx5AQFpAwkBCGNvbnRhaW5zAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUNY29uZmlnQWRkcmVzcwIEbWFpbgkApQgBCAUBaQZjYWxsZXIGCQACAQIQb25seSBtYWluIGNhbiBkbwASZGl2aWRlbmRhYmxlVG9rZW5zCQELdmFsdWVPckVsc2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCEmRpdmlkZW5kYWJsZVRva2VucwIAABVkaXZpZGVuZGFibGVUb2tlbnNBcnIDCQAAAgUSZGl2aWRlbmRhYmxlVG9rZW5zAgAFA25pbAkAvAkCBRJkaXZpZGVuZGFibGVUb2tlbnMCAXwAF2RpdmlkZW5kYWJsZVJlc2VydmVzU3RyCQELdmFsdWVPckVsc2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCFGRpdmlkZW5kYWJsZVJlc2VydmVzAgAAFGRpdmlkZW5kYWJsZVJlc2VydmVzBAckbWF0Y2gwBRdkaXZpZGVuZGFibGVSZXNlcnZlc1N0cgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEA3N0cgUHJG1hdGNoMAMJAAACBQNzdHICAAUDbmlsCQC8CQIFA3N0cgIBfAUDbmlsAAhoYWxmTGlmZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDWNvbmZpZ0FkZHJlc3MCFHZpcmVzX2xvY2tfaGFsZl9saWZlAhFoYWxmIGxpZmUgbm90IHNldAAGbGFtYmRhCQBpAgDo0uqbggIFCGhhbGZMaWZlAApMQU1CREFCQVNFAAgAAUUA14nPgQEABUVCQVNFAAgBB2Zvcm11bGECAXgCeTAJAGsDBQJ5MAkAbAYFAUUFBUVCQVNFCQBrAwUGbGFtYmRhBQF4AOgHBQpMQU1CREFCQVNFAAgFBkhBTEZVUACAwtcvARV1c2VyRGl2aWRlbmRzQWRqU3RvcmUCBHVzZXIDYWlkCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQNhaWQCBF9hZGoBGXVzZXJEaXZpZGVuZHNDbGFpbWVkU3RvcmUCBHVzZXIDYWlkCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQNhaWQCCF9jbGFpbWVkARZ1c2VyVmlydHVhbFRva2Vuc1N0b3JlAQR1c2VyCQCsAgIFBHVzZXICCF92aXJ0dWFsARh1c2VyRGVwb3NpdGVkVG9rZW5zU3RvcmUBBHVzZXIJAKwCAgUEdXNlcgIGX3ZpcmVzARh1c2VyV2l0aGRyYXduVG9rZW5zU3RvcmUBBHVzZXIJAKwCAgUEdXNlcgIQX3ZpcmVzX3dpdGhkcmF3bgEUdXNlckVudHJ5SGVpZ2h0U3RvcmUBBHVzZXIJAKwCAgUEdXNlcgIHX2hlaWdodAEPdXNlckZhY3RvclN0b3JlAQR1c2VyCQCsAgIFBHVzZXICB19mYWN0b3IBEHVzZXJEaXZpZGVuZHNBZGoCBHVzZXIDYWlkCQELdmFsdWVPckVsc2UCCQCfCAEJARV1c2VyRGl2aWRlbmRzQWRqU3RvcmUCBQR1c2VyBQNhaWQAAAEUdXNlckRpdmlkZW5kc0NsYWltZWQCBHVzZXIDYWlkCQELdmFsdWVPckVsc2UCCQCfCAEJARl1c2VyRGl2aWRlbmRzQ2xhaW1lZFN0b3JlAgUEdXNlcgUDYWlkAAABEXVzZXJWaXJ0dWFsVG9rZW5zAQR1c2VyCQENcGFyc2VJbnRWYWx1ZQEJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBFnVzZXJWaXJ0dWFsVG9rZW5zU3RvcmUBBQR1c2VyAgEwARN1c2VyRGVwb3NpdGVkVG9rZW5zAQR1c2VyCQELdmFsdWVPckVsc2UCCQCfCAEJARh1c2VyRGVwb3NpdGVkVG9rZW5zU3RvcmUBBQR1c2VyAAABE3VzZXJXaXRoZHJhd25Ub2tlbnMBBHVzZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBGHVzZXJXaXRoZHJhd25Ub2tlbnNTdG9yZQEFBHVzZXIAAAEPdXNlckVudHJ5SGVpZ2h0AQR1c2VyCQELdmFsdWVPckVsc2UCCQCfCAEJARR1c2VyRW50cnlIZWlnaHRTdG9yZQEFBHVzZXIAAAEKdXNlckZhY3RvcgEEdXNlcgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEPdXNlckZhY3RvclN0b3JlAQUEdXNlcgABAQp1c2VyR1ZpcmVzAQR1c2VyCQEHZm9ybXVsYQIJAQEtAQkAZQIFBkhFSUdIVAUNaW5pdGlhbEhlaWdodAkBEXVzZXJWaXJ0dWFsVG9rZW5zAQUEdXNlcgEadG90YWxWaXJ0dWFsRGl2aWRlbmRzU3RvcmUBA2FpZAkArAICBQNhaWQCFl90b3RhbFZpcnR1YWxEaXZpZGVuZHMBF3RvdGFsUmVhbERpdmlkZW5kc1N0b3JlAQNhaWQJAKwCAgUDYWlkAhNfdG90YWxSZWFsRGl2aWRlbmRzAR50b3RhbFJlYWxEaXZpZGVuZHNDbGFpbWVkU3RvcmUBA2FpZAkArAICBQNhaWQCGl90b3RhbFJlYWxEaXZpZGVuZHNDbGFpbWVkABd0b3RhbFZpcnR1YWxUb2tlbnNTdG9yZQISdG90YWxWaXJ0dWFsVG9rZW5zABl0b3RhbERlcG9zaXRlZFRva2Vuc1N0b3JlAhR0b3RhbERlcG9zaXRlZFRva2VucwEbdG90YWxEZXBvc2l0ZWRCeUZhY3RvclN0b3JlAQZmYWN0b3IJAKwCAgIUdG90YWxEZXBvc2l0ZWRUb2tlbnMJAKQDAQkBC2ZhY3RvckNoZWNrAQUGZmFjdG9yARZ0b3RhbERlcG9zaXRlZEJ5RmFjdG9yAQZmYWN0b3IJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBG3RvdGFsRGVwb3NpdGVkQnlGYWN0b3JTdG9yZQEFBmZhY3RvcgAAARV0b3RhbFZpcnR1YWxEaXZpZGVuZHMBA2FpZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEadG90YWxWaXJ0dWFsRGl2aWRlbmRzU3RvcmUBBQNhaWQAAAESdG90YWxSZWFsRGl2aWRlbmRzAQNhaWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBF3RvdGFsUmVhbERpdmlkZW5kc1N0b3JlAQUDYWlkAAAAEnRvdGFsVmlydHVhbFRva2VucwkBDXBhcnNlSW50VmFsdWUBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFF3RvdGFsVmlydHVhbFRva2Vuc1N0b3JlAgEwABR0b3RhbERlcG9zaXRlZFRva2VucwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRl0b3RhbERlcG9zaXRlZFRva2Vuc1N0b3JlAAABDHVzZXJPZmZDbGlmZgEEdXNlcgQLZW50cnlIZWlnaHQJAQ91c2VyRW50cnlIZWlnaHQBBQR1c2VyBAZmYWN0b3IJAQp1c2VyRmFjdG9yAQUEdXNlcgMJAAACBQZmYWN0b3IAAQkAZgIFBkhFSUdIVAkAZAIFC2VudHJ5SGVpZ2h0CQBoAgAEBQhoYWxmTGlmZQMJAAACBQZmYWN0b3IAAgkAZgIFBkhFSUdIVAkAZAIFC2VudHJ5SGVpZ2h0CQBoAgAFBQhoYWxmTGlmZQMJAAACBQZmYWN0b3IABAkAZgIFBkhFSUdIVAkAZAIFC2VudHJ5SGVpZ2h0CQBoAgAGBQhoYWxmTGlmZQkAAgEJAKwCAgILYmFkIGZhY3RvcjoJAKQDAQUGZmFjdG9yAQ11c2VyVmlyZXNEYXRhAQR1c2VyBAlkZXBvc2l0ZWQJARN1c2VyRGVwb3NpdGVkVG9rZW5zAQUEdXNlcgQCZ1YJAQp1c2VyR1ZpcmVzAQUEdXNlcgQOc3VwcG9zZWRMb2NrZWQJAJcDAQkAzAgCBQlkZXBvc2l0ZWQJAMwIAgUCZ1YFA25pbAQGbG9ja2VkAwkBDHVzZXJPZmZDbGlmZgEFBHVzZXIAAAUOc3VwcG9zZWRMb2NrZWQECHVubG9ja2VkCQBlAgUJZGVwb3NpdGVkBQZsb2NrZWQECXdpdGhkcmF3bgkBE3VzZXJXaXRoZHJhd25Ub2tlbnMBBQR1c2VyBAx3aXRoZHJhd2FibGUJAGUCBQh1bmxvY2tlZAUJd2l0aGRyYXduBAppblByb3RvY29sCQBkAgUGbG9ja2VkBQx3aXRoZHJhd2FibGUJAJgKBgUJZGVwb3NpdGVkBQZsb2NrZWQFDHdpdGhkcmF3YWJsZQUJd2l0aGRyYXduBQppblByb3RvY29sBQJnVgEOdXNlclByb2ZpdERhdGEBBHVzZXIEC3RvdGFsVG9rZW5zCQCQAwEFFWRpdmlkZW5kYWJsZVRva2Vuc0FycgQZdG90YWxEaXZpZGVuZGFibGVSZXNlcnZlcwkAkAMBBRRkaXZpZGVuZGFibGVSZXNlcnZlcwMJAQIhPQIFC3RvdGFsVG9rZW5zBRl0b3RhbERpdmlkZW5kYWJsZVJlc2VydmVzCQACAQkArAICCQCsAgIJAKwCAgIoaW5jb25zaXN0ZW50IGNvbmZpZ3VyYXRpb246IHRvdGFsVG9rZW5zPQkApAMBBQt0b3RhbFRva2VucwIeLCB0b3RhbERpdmlkZW5kYWJsZVJlc2VydmVzID0gCQCkAwEFGXRvdGFsRGl2aWRlbmRhYmxlUmVzZXJ2ZXMEDXZpcnR1YWxUb2tlbnMJARF1c2VyVmlydHVhbFRva2VucwEFBHVzZXIECXRva2VuRGF0YQoBBGZvbGQCBnRvdGFscwVpbmRleAMJAGcCBQVpbmRleAULdG90YWxUb2tlbnMFBnRvdGFscwQDYWlkCQCRAwIFFWRpdmlkZW5kYWJsZVRva2Vuc0FycgUFaW5kZXgECyR0MDg1MTE4Nzc5BAFyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBRRkaXZpZGVuZGFibGVSZXNlcnZlcwUFaW5kZXgCI2JhZCByZXNlcnZlIGluIGRpdmlkZW5kYWJsZVJlc2VydmVzCQELYXNJbnRTdHJJbnQBCQD8BwQFAXICEmdldFJlc2VydmVEaXZzSW5mbwUDbmlsBQNuaWwEC3Jlc2VydmVEaXZzCAULJHQwODUxMTg3NzkCXzEEDnJlc2VydmVBc3NldElkCAULJHQwODUxMTg3NzkCXzIEDG5vbkNsYWltYWJsZQgFCyR0MDg1MTE4Nzc5Al8zAwkBAiE9AgUOcmVzZXJ2ZUFzc2V0SWQFA2FpZAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIraW5jb25zaXN0ZW50IGNvbmZpZ3VyYXRpb246IHJlc2VydmVBc3NldElkPQUOcmVzZXJ2ZUFzc2V0SWQCBiwgYWlkPQUDYWlkAhUsIGRpdmlkZW5kYWJsZVRva2VuczoFEmRpdmlkZW5kYWJsZVRva2VucwIXLCBkaXZpZGVuZGFibGVSZXNlcnZlczoFF2RpdmlkZW5kYWJsZVJlc2VydmVzU3RyBA91c2VyVmlydHVhbERpdnMDCQAAAgUSdG90YWxWaXJ0dWFsVG9rZW5zAAAAAAkAawMJAGQCCQEVdG90YWxWaXJ0dWFsRGl2aWRlbmRzAQUDYWlkBQtyZXNlcnZlRGl2cwUNdmlydHVhbFRva2VucwUSdG90YWxWaXJ0dWFsVG9rZW5zBANhZGoJARB1c2VyRGl2aWRlbmRzQWRqAgUEdXNlcgUDYWlkBAh1c2VyRGl2cwkAZQIFD3VzZXJWaXJ0dWFsRGl2cwUDYWRqBBRub25DbGFpbWFibGVVc2VyRGl2cwMJAAACBRJ0b3RhbFZpcnR1YWxUb2tlbnMAAAAACQBrAwUMbm9uQ2xhaW1hYmxlBQ12aXJ0dWFsVG9rZW5zBRJ0b3RhbFZpcnR1YWxUb2tlbnMEC3VzZXJDbGFpbWVkCQEUdXNlckRpdmlkZW5kc0NsYWltZWQCBQR1c2VyBQNhaWQECWNsYWltYWJsZQkAlgMBCQDMCAIAAAkAzAgCCQBlAgUIdXNlckRpdnMFC3VzZXJDbGFpbWVkBQNuaWwDCQBmAgAABQljbGFpbWFibGUJAAIBCQCsAgICD2NsYWltYWJsZSA8IDA6IAkApAMBBQljbGFpbWFibGUJAM4IAgUGdG90YWxzCQDMCAIJAJYKBAUDYWlkBQt1c2VyQ2xhaW1lZAUJY2xhaW1hYmxlBRRub25DbGFpbWFibGVVc2VyRGl2cwUDbmlsCgACJGwJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsJAMwIAgAMCQDMCAIADQkAzAgCAA4JAMwIAgAPCQDMCAIAEAkAzAgCABEJAMwIAgASCQDMCAIAEwUDbmlsCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQJAJQKAgUNdmlydHVhbFRva2VucwUJdG9rZW5EYXRhARljbGFpbUZyb21SZXNlcnZlc0ludGVybmFsAAQMYXNzZXRJZFN0b3JlAgdhc3NldElkCgEEZm9sZAIGb3V0cHV0B3Jlc2VydmUEDnJlc2VydmVBZGRyZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUHcmVzZXJ2ZQIaYWRkZXI6IGJhZCByZXNlcnZlIGFkZHJlc3MEDWFzc2V0SWRTdHJpbmcJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ5yZXNlcnZlQWRkcmVzcwUMYXNzZXRJZFN0b3JlAhVubyBhc3NldElkIGluIHJlc2VydmUEB2FjdGlvbnMDCQEBIQEJAQhjb250YWlucwIFEmRpdmlkZW5kYWJsZVRva2VucwUNYXNzZXRJZFN0cmluZwkAAgECXmluY29uc2lzdGVudCBjb25maWd1cmF0aW9uOiBkaXZpZGVuZGFibGVSZXNlcnZlJ3MgYXNzZXQgaWQgaXMgbm90IHN0b3JlZCBpbiBkaXZpZGVuZGFibGVUb2tlbnMEBmFtb3VudAkBBWFzSW50AQkA/AcEBQ5yZXNlcnZlQWRkcmVzcwITd2l0aGRyYXdGcm9tUmVzZXJ2ZQkAzAgCAP///////////wEFA25pbAUDbmlsAwkAAAIFBmFtb3VudAUGYW1vdW50AwkAZgIAAAUGYW1vdW50CQACAQIKYmFkIGFtb3VudAMJAAACBQZhbW91bnQAAAUDbmlsCQDMCAIJAQhjaGFuZ2VCeQIJARp0b3RhbFZpcnR1YWxEaXZpZGVuZHNTdG9yZQEFDWFzc2V0SWRTdHJpbmcFBmFtb3VudAkAzAgCCQEIY2hhbmdlQnkCCQEXdG90YWxSZWFsRGl2aWRlbmRzU3RvcmUBBQ1hc3NldElkU3RyaW5nBQZhbW91bnQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzggCBQZvdXRwdXQFB2FjdGlvbnMKAAIkbAUUZGl2aWRlbmRhYmxlUmVzZXJ2ZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAEKYWR2aXNlVXNlcgEEdXNlcgQNJHQwMTA5MjAxMTAxMAkBDXVzZXJWaXJlc0RhdGEBBQR1c2VyBAlkZXBvc2l0ZWQIBQ0kdDAxMDkyMDExMDEwAl8xBAZsb2NrZWQIBQ0kdDAxMDkyMDExMDEwAl8yBAx3aXRoZHJhd2FibGUIBQ0kdDAxMDkyMDExMDEwAl8zBAl3aXRoZHJhd24IBQ0kdDAxMDkyMDExMDEwAl80BAppblByb3RvY29sCAUNJHQwMTA5MjAxMTAxMAJfNQQGZ1ZpcmVzCAUNJHQwMTA5MjAxMTAxMAJfNgQNJHQwMTEwMTcxMTA3MAkBDnVzZXJQcm9maXREYXRhAQUEdXNlcgQNdmlydHVhbFRva2VucwgFDSR0MDExMDE3MTEwNzACXzEECXRva2VuRGF0YQgFDSR0MDExMDE3MTEwNzACXzIEBXBvd2VyAwkAAAIFCmluUHJvdG9jb2wAAAAACQBrAwCQTgUGZ1ZpcmVzBQppblByb3RvY29sBARiYXNlCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICDiAgZGVwb3NpdGVkID0gCQCkAwEFCWRlcG9zaXRlZAISLCB2aXJ0dWFsVG9rZW5zID0gCQCkAwEFDXZpcnR1YWxUb2tlbnMCCywgbG9ja2VkID0gCQCkAwEFBmxvY2tlZAIRLCB3aXRoZHJhd2FibGUgPSAJAKQDAQUMd2l0aGRyYXdhYmxlAg4sIHdpdGhkcmF3biA9IAkApAMBBQl3aXRoZHJhd24CDywgaW5Qcm90b2NvbCA9IAkApAMBBQppblByb3RvY29sAhAsIGVudHJ5SGVpZ2h0ID0gCQCkAwEJAQ91c2VyRW50cnlIZWlnaHQBBQR1c2VyAgssIGZhY3RvciA9IAkApAMBCQEKdXNlckZhY3RvcgEFBHVzZXICCywgZ1ZpcmVzID0gCQCkAwEFBmdWaXJlcwIKLCBwb3dlciA9IAkApAMBBQVwb3dlcgQKdG9rZW5zRGF0YQoBA2ZsZAIGdG90YWxzBGl0ZW0EDSR0MDExODA4MTE4MzUFBGl0ZW0EA2FpZAgFDSR0MDExODA4MTE4MzUCXzEEA2NlZAgFDSR0MDExODA4MTE4MzUCXzIEAmF2CAUNJHQwMTE4MDgxMTgzNQJfMwQCbmMIBQ0kdDAxMTgwODExODM1Al80CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBnRvdGFscwIELCBbIAIKYXNzZXRJZCA9IAUDYWlkAgwsIGNsYWltZWQgPSAJAKQDAQUDY2VkAg4sIGNsYWltYWJsZSA9IAkApAMBBQJhdgIRLCBub25DbGFpbWFibGUgPSAJAKQDAQUCbmMCAV0KAAIkbAUJdG9rZW5EYXRhCgACJHMJAJADAQUCJGwKAAUkYWNjMAIACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQNmbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAkArAICBQRiYXNlBQp0b2tlbnNEYXRhAQZhZHZpc2UABAt0b3RhbEd2aXJlcwkBB2Zvcm11bGECCQEBLQEJAGUCBQZIRUlHSFQFDWluaXRpYWxIZWlnaHQFEnRvdGFsVmlydHVhbFRva2VucwQEYmFzZQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICGSAgdG90YWxEZXBvc2l0ZWRUb2tlbnMgPSAJAKQDAQUUdG90YWxEZXBvc2l0ZWRUb2tlbnMCGiwgdG90YWxEZXBvc2l0ZWRUb2tlbnMxID0gCQCkAwEJARZ0b3RhbERlcG9zaXRlZEJ5RmFjdG9yAQABAhosIHRvdGFsRGVwb3NpdGVkVG9rZW5zMiA9IAkApAMBCQEWdG90YWxEZXBvc2l0ZWRCeUZhY3RvcgEAAgIaLCB0b3RhbERlcG9zaXRlZFRva2VuczQgPSAJAKQDAQkBFnRvdGFsRGVwb3NpdGVkQnlGYWN0b3IBAAQCFywgdG90YWxWaXJ0dWFsVG9rZW5zID0gCQCkAwEFEnRvdGFsVmlydHVhbFRva2VucwIQLCB0b3RhbEd2aXJlcyA9IAkApAMBBQt0b3RhbEd2aXJlcwoBBGZvbGQCBXRvdGFsA2FpZAkArAICCQCsAgIJAKwCAgkArAICBQV0b3RhbAICLCAFA2FpZAIDID0gCQCkAwEJARJ0b3RhbFJlYWxEaXZpZGVuZHMBBQNhaWQKAAIkbAUVZGl2aWRlbmRhYmxlVG9rZW5zQXJyCgACJHMJAJADAQUCJGwKAAUkYWNjMAUEYmFzZQoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEZm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUAQp1cGRhdGVVc2VyAwR1c2VyBnRva2VucwFmBAZjaGVja3MJAQlvcEFsbG93ZWQBAgpsb2NrX3ZpcmVzAwkAAAIFBmNoZWNrcwUGY2hlY2tzAwMJAQIhPQIFAWYAAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQ1jb25maWdBZGRyZXNzAgthbGxvd19ib29zdAcHCQACAQIUYm9vc3Rpbmcgbm90IGVuYWJsZWQEBmZhY3RvcgkBC2ZhY3RvckNoZWNrAQUBZgMJAAACBQZmYWN0b3IFBmZhY3RvcgQNY3VycmVudEZhY3RvcgkBCnVzZXJGYWN0b3IBBQR1c2VyAwkAZgIFDWN1cnJlbnRGYWN0b3IFBmZhY3RvcgkAAgECGGNhbid0IGRvd25ncmFkZSBib29zdGluZwQNJHQwMTMxNjUxMzI1MQkBDXVzZXJWaXJlc0RhdGEBBQR1c2VyBAlkZXBvc2l0ZWQIBQ0kdDAxMzE2NTEzMjUxAl8xBAZsb2NrZWQIBQ0kdDAxMzE2NTEzMjUxAl8yBAx3aXRoZHJhd2FibGUIBQ0kdDAxMzE2NTEzMjUxAl8zBAl3aXRoZHJhd24IBQ0kdDAxMzE2NTEzMjUxAl80BAppblByb3RvY29sCAUNJHQwMTMxNjUxMzI1MQJfNQQCZ1YIBQ0kdDAxMzE2NTEzMjUxAl82BBBvbGRWaXJ0dWFsVG9rZW5zCQERdXNlclZpcnR1YWxUb2tlbnMBBQR1c2VyBBBuZXdWaXJ0dWFsVG9rZW5zCQEHZm9ybXVsYQIJAGUCBQZIRUlHSFQFDWluaXRpYWxIZWlnaHQJAGgCBQZmYWN0b3IJAGQCBQZ0b2tlbnMFCmluUHJvdG9jb2wEBGRpZmYJAGUCBRBuZXdWaXJ0dWFsVG9rZW5zBRBvbGRWaXJ0dWFsVG9rZW5zBARiYXNlCQDMCAIJAQhjaGFuZ2VCeQIFGXRvdGFsRGVwb3NpdGVkVG9rZW5zU3RvcmUFBnRva2VucwkAzAgCCQELY2hhbmdlQnlTdHICBRd0b3RhbFZpcnR1YWxUb2tlbnNTdG9yZQUEZGlmZgkAzAgCCQELY2hhbmdlQnlTdHICCQEWdXNlclZpcnR1YWxUb2tlbnNTdG9yZQEFBHVzZXIFBGRpZmYJAMwIAgkBCGNoYW5nZUJ5AgkBGHVzZXJEZXBvc2l0ZWRUb2tlbnNTdG9yZQEFBHVzZXIFBnRva2VucwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFHVzZXJFbnRyeUhlaWdodFN0b3JlAQUEdXNlcgUGSEVJR0hUCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEPdXNlckZhY3RvclN0b3JlAQUEdXNlcgUGZmFjdG9yBQNuaWwECXRva2VuRGF0YQoBBGZvbGQCBXRvdGFsA2FpZAQDYWRqAwkAAAIFEnRvdGFsVmlydHVhbFRva2VucwAAAAAJAGsDBQRkaWZmCQEVdG90YWxWaXJ0dWFsRGl2aWRlbmRzAQUDYWlkBRJ0b3RhbFZpcnR1YWxUb2tlbnMJAM4IAgUFdG90YWwJAMwIAgkBCGNoYW5nZUJ5AgkBGnRvdGFsVmlydHVhbERpdmlkZW5kc1N0b3JlAQUDYWlkBQNhZGoJAMwIAgkBDEludGVnZXJFbnRyeQIJARV1c2VyRGl2aWRlbmRzQWRqU3RvcmUCBQR1c2VyBQNhaWQJAGQCCQEQdXNlckRpdmlkZW5kc0FkagIFBHVzZXIFA2FpZAUDYWRqBQNuaWwKAAIkbAUVZGl2aWRlbmRhYmxlVG9rZW5zQXJyCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQECm1vbml0b3JpbmcDCQECIT0CBQZmYWN0b3IFDWN1cnJlbnRGYWN0b3IJAMwIAgkBCGNoYW5nZUJ5AgkBG3RvdGFsRGVwb3NpdGVkQnlGYWN0b3JTdG9yZQEFDWN1cnJlbnRGYWN0b3IJAQEtAQUKaW5Qcm90b2NvbAkAzAgCCQEIY2hhbmdlQnkCCQEbdG90YWxEZXBvc2l0ZWRCeUZhY3RvclN0b3JlAQUGZmFjdG9yCQBkAgUGdG9rZW5zBQppblByb3RvY29sBQNuaWwJAMwIAgkBCGNoYW5nZUJ5AgkBG3RvdGFsRGVwb3NpdGVkQnlGYWN0b3JTdG9yZQEFBmZhY3RvcgUGdG9rZW5zBQNuaWwJAM4IAgkAzggCBQRiYXNlBQl0b2tlbkRhdGEFCm1vbml0b3JpbmcJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4LAWkBC3RvdGFsR3ZpcmVzAAkAlAoCBQNuaWwJAQdmb3JtdWxhAgkBAS0BCQBlAgUGSEVJR0hUBQ1pbml0aWFsSGVpZ2h0BRJ0b3RhbFZpcnR1YWxUb2tlbnMBaQETc2hhcmVQcm9maXRNYW51YWxseQAEBmNoZWNrcwkBCW9wQWxsb3dlZAECGHNoYXJlX2RpdmlkZW5kc19tYW51YWxseQMJAAACBQZjaGVja3MFBmNoZWNrcwQOcGF5bWVudEFzc2V0SWQJAQphc3NldElkU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAwkBASEBCQEIY29udGFpbnMCBRJkaXZpZGVuZGFibGVUb2tlbnMFDnBheW1lbnRBc3NldElkCQACAQIQYmFkIHByb2ZpdCB0b2tlbgQDYW10CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAzAgCCQEIY2hhbmdlQnkCCQEadG90YWxWaXJ0dWFsRGl2aWRlbmRzU3RvcmUBBQ5wYXltZW50QXNzZXRJZAUDYW10CQDMCAIJAQhjaGFuZ2VCeQIJARd0b3RhbFJlYWxEaXZpZGVuZHNTdG9yZQEFDnBheW1lbnRBc3NldElkBQNhbXQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARdzaGFyZVByb2ZpdEZyb21SZXNlcnZlcwAJARljbGFpbUZyb21SZXNlcnZlc0ludGVybmFsAAFpAQRpbml0Ag1jb25maWdBZGRyZXNzBXZpcmVzCQDMCAIJARB3cml0ZUNvbnN0U3RyaW5nAgULY29uZmlnU3RvcmUFDWNvbmZpZ0FkZHJlc3MJAMwIAgkBEHdyaXRlQ29uc3RTdHJpbmcCBRF2aXJlc0Fzc2V0SWRTdG9yZQUFdmlyZXMFA25pbAFpAQVpbml0MgADCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhZvbmx5IHNlbGYgY2FuIGNvbnRpbnVlCQDMCAIJAQh3cml0ZUludAIFEmluaXRpYWxIZWlnaHRTdG9yZQUGSEVJR0hUBQNuaWwBaQEHbG9ja0ZvcgIEdXNlcgZmYWN0b3IEBmNoZWNrcwkBB3Rocm93SWYCAwkBAiE9AgkApQgBCAUBaQZjYWxsZXIFBHVzZXIJAQIhPQIIBQFpBmNhbGxlcgUEbWFpbgcCIm9ubHkgbWFpbiBhbmQgdXNlciBkaXJlY3RseSBjYW4gZG8DCQAAAgUGY2hlY2tzBQZjaGVja3MJAQp1cGRhdGVVc2VyAwUEdXNlcgkBDHZpcmVzUGF5bWVudAEFAWkFBmZhY3RvcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARN3aXRoZHJhd1VubG9ja2VkRm9yAQR1c2VyBAZjaGVja3MDCQEHdGhyb3dJZgIDCQECIT0CCQClCAEIBQFpBmNhbGxlcgUEdXNlcgkBAiE9AggFAWkGY2FsbGVyBQRtYWluBwIib25seSBtYWluIGFuZCB1c2VyIGRpcmVjdGx5IGNhbiBkbwkBCW9wQWxsb3dlZAECF3dpdGhkcmF3X3VubG9ja2VkX3ZpcmVzBwMJAAACBQZjaGVja3MFBmNoZWNrcwQEYWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEdXNlcgQNJHQwMTU5NTkxNjAzNwkBDXVzZXJWaXJlc0RhdGEBBQR1c2VyBAlkZXBvc2l0ZWQIBQ0kdDAxNTk1OTE2MDM3Al8xBAZsb2NrZWQIBQ0kdDAxNTk1OTE2MDM3Al8yBAx3aXRoZHJhd2FibGUIBQ0kdDAxNTk1OTE2MDM3Al8zBAl3aXRoZHJhd24IBQ0kdDAxNTk1OTE2MDM3Al80BAZnVmlyZXMIBQ0kdDAxNTk1OTE2MDM3Al81AwkAZwIAAAUMd2l0aGRyYXdhYmxlBQNuaWwECnVzZXJVcGRhdGUDCQEMdXNlck9mZkNsaWZmAQUEdXNlcgQNJHQwMTYxMzgxNjE5MgkBDnVzZXJQcm9maXREYXRhAQUEdXNlcgQNdmlydHVhbFRva2VucwgFDSR0MDE2MTM4MTYxOTICXzEECnRva2Vuc0RhdGEIBQ0kdDAxNjEzODE2MTkyAl8yBARiYXNlCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ91c2VyRmFjdG9yU3RvcmUBBQR1c2VyCQDMCAIJAQtEZWxldGVFbnRyeQEJARR1c2VyRW50cnlIZWlnaHRTdG9yZQEFBHVzZXIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBGHVzZXJXaXRoZHJhd25Ub2tlbnNTdG9yZQEFBHVzZXIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBGHVzZXJEZXBvc2l0ZWRUb2tlbnNTdG9yZQEFBHVzZXIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBFnVzZXJWaXJ0dWFsVG9rZW5zU3RvcmUBBQR1c2VyCQDMCAIJAQtjaGFuZ2VCeVN0cgIFF3RvdGFsVmlydHVhbFRva2Vuc1N0b3JlCQEBLQEFDHdpdGhkcmF3YWJsZQUDbmlsBAl0b2tlbkRhdGEKAQRmb2xkAgV0b3RhbARpdGVtBA0kdDAxNjY4OTE2NzE4BQRpdGVtBANhaWQIBQ0kdDAxNjY4OTE2NzE4Al8xBANjZWQIBQ0kdDAxNjY4OTE2NzE4Al8yBAJhdggFDSR0MDE2Njg5MTY3MTgCXzMEAm5jCAUNJHQwMTY2ODkxNjcxOAJfNAkAzggCBQV0b3RhbAkAzAgCCQELRGVsZXRlRW50cnkBCQEZdXNlckRpdmlkZW5kc0NsYWltZWRTdG9yZQIFBHVzZXIFA2FpZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFXVzZXJEaXZpZGVuZHNBZGpTdG9yZQIFBHVzZXIFA2FpZAkBAS0BBQJhdgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGnRvdGFsVmlydHVhbERpdmlkZW5kc1N0b3JlAQUDYWlkCQBrAwkBFXRvdGFsVmlydHVhbERpdmlkZW5kcwEFA2FpZAkAZQIFEnRvdGFsVmlydHVhbFRva2VucwUMd2l0aGRyYXdhYmxlBRJ0b3RhbFZpcnR1YWxUb2tlbnMFA25pbAoAAiRsBQp0b2tlbnNEYXRhCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQJAM4IAgUEYmFzZQUJdG9rZW5EYXRhCQDMCAIJAQhjaGFuZ2VCeQIJARh1c2VyV2l0aGRyYXduVG9rZW5zU3RvcmUBBQR1c2VyBQx3aXRoZHJhd2FibGUFA25pbAkAzggCBQp1c2VyVXBkYXRlCQDMCAIJAQhjaGFuZ2VCeQIJARt0b3RhbERlcG9zaXRlZEJ5RmFjdG9yU3RvcmUBCQEKdXNlckZhY3RvcgEFBHVzZXIJAQEtAQUMd2l0aGRyYXdhYmxlCQDMCAIJAQhjaGFuZ2VCeQIFGXRvdGFsRGVwb3NpdGVkVG9rZW5zU3RvcmUJAQEtAQUMd2l0aGRyYXdhYmxlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBGFkZHIFDHdpdGhkcmF3YWJsZQUMdmlyZXNBc3NldElkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELY2xhaW1Qcm9maXQDBGZyb20CdG8GcmVsb2NrBA12YWxpZERlbGVnYXRlAwkAAAIFBGZyb20FAnRvBgQHJG1hdGNoMAkAnQgCBQR0aGlzCQCsAgICEWRlbGVnYXRpb25fY2xhaW1fBQRmcm9tAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAQEZGF0YQkAtQkCBQFzAgF8AwkBAiE9AgUCdG8JAJEDAgUEZGF0YQAACQACAQkArAICAhlubyBkZWxlZ2F0aW9uIHJpZ2h0cyBmb3IgBQJ0bwMDBQZyZWxvY2sJAQIhPQIJAJEDAgUEZGF0YQABAgExBwkAAgECK2F0dGVtcHRpbmcgdG8gcmVsb2NrIHdoaWxlIGl0J3Mgbm90IGFsbG93ZWQGCQACAQkArAICAh5kZWxlZ2F0aW9uIG5vdCBjb25maWd1cmVkIGZvciAFBGZyb20EBmNoZWNrcwMDCQEIbWFpbk9ubHkBBQFpCQEJb3BBbGxvd2VkAQIPY2xhaW1fZGl2aWRlbmRzBwUNdmFsaWREZWxlZ2F0ZQcDCQAAAgUGY2hlY2tzBQZjaGVja3MEBnRvQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUCdG8EDSR0MDE4MDg5MTgxNDIJAQ51c2VyUHJvZml0RGF0YQEFBGZyb20EDXZpcnR1YWxUb2tlbnMIBQ0kdDAxODA4OTE4MTQyAl8xBAp0b2tlbnNEYXRhCAUNJHQwMTgwODkxODE0MgJfMgQJcmVsb2NraW5nAwUGcmVsb2NrCQEKdXBkYXRlVXNlcgMFBGZyb20AAAkBCnVzZXJGYWN0b3IBBQRmcm9tBQNuaWwECXRva2VuRGF0YQoBBGZvbGQCBXRvdGFsBGl0ZW0EDSR0MDE4MzQ2MTgzNzUFBGl0ZW0EA2FpZAgFDSR0MDE4MzQ2MTgzNzUCXzEEA2NlZAgFDSR0MDE4MzQ2MTgzNzUCXzIEAmF2CAUNJHQwMTgzNDYxODM3NQJfMwQCbmMIBQ0kdDAxODM0NjE4Mzc1Al80CQDOCAIFBXRvdGFsCQDMCAIJAQhjaGFuZ2VCeQIJARl1c2VyRGl2aWRlbmRzQ2xhaW1lZFN0b3JlAgUEZnJvbQUDYWlkBQJhdgkAzAgCCQEIY2hhbmdlQnkCCQEedG90YWxSZWFsRGl2aWRlbmRzQ2xhaW1lZFN0b3JlAQUDYWlkBQJhdgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZ0b0FkZHIFAmF2CQEHYXNzZXRJZAEFA2FpZAUDbmlsCgACJGwFCnRva2Vuc0RhdGEKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAkAzggCBQlyZWxvY2tpbmcFCXRva2VuRGF0YQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARJzZXRDbGFpbURlbGVnYXRpb24CB2FkZHJlc3MGcmVsb2NrBAZjaGVja3MJAQlvcEFsbG93ZWQBAhRzZXRfZGVsZWdhdGlvbl9jbGFpbQMJAAACBQZjaGVja3MFBmNoZWNrcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUHYWRkcmVzcwkAAgECC2JhZCBhZGRyZXNzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgIRZGVsZWdhdGlvbl9jbGFpbV8JAKUIAQgFAWkGY2FsbGVyCQCsAgIJAKwCAgUHYWRkcmVzcwIBfAMFBnJlbG9jawIBMQIBMAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFXJlbW92ZUNsYWltRGVsZWdhdGlvbgAEBmNoZWNrcwkBCW9wQWxsb3dlZAECFHNldF9kZWxlZ2F0aW9uX2NsYWltAwkAAAIFBmNoZWNrcwUGY2hlY2tzCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgIRZGVsZWdhdGlvbl9jbGFpbV8JAKUIAQgFAWkGY2FsbGVyBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEJdXNlclBvd2VyAQR1c2VyCQCUCgIFA25pbAkBCnVzZXJHVmlyZXMBBQR1c2VyAMlyVg8=", "chainId": 87, "height": 3236516, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: AKXBhjmzRKQcF5pPvNhnS5MyUnxSQ5LkFkuLCkfmahgA Next: 8VF26EsGD4csLyU4fvMX3YiUchCPbAnwboz5idCHjBBw Diff:
OldNewDifferences
5353
5454 func assetId (s) = if ((s == "WAVES"))
5555 then unit
56- else fromBase58String(s)
56+ else fromBase58String(split(s, "_")[0])
5757
5858
5959 func assetIdStr (aid) = match aid {
265265 then totals
266266 else {
267267 let aid = dividendableTokensArr[index]
268- let $t084978765 = {
268+ let $t085118779 = {
269269 let r = valueOrErrorMessage(addressFromString(dividendableReserves[index]), "bad reserve in dividendableReserves")
270270 asIntStrInt(invoke(r, "getReserveDivsInfo", nil, nil))
271271 }
272- let reserveDivs = $t084978765._1
273- let reserveAssetId = $t084978765._2
274- let nonClaimable = $t084978765._3
272+ let reserveDivs = $t085118779._1
273+ let reserveAssetId = $t085118779._2
274+ let nonClaimable = $t085118779._3
275275 if ((reserveAssetId != aid))
276276 then throw(((((((("inconsistent configuration: reserveAssetId=" + reserveAssetId) + ", aid=") + aid) + ", dividendableTokens:") + dividendableTokens) + ", dividendableReserves:") + dividendableReservesStr))
277277 else {
345345
346346
347347 func adviseUser (user) = {
348- let $t01090610996 = userViresData(user)
349- let deposited = $t01090610996._1
350- let locked = $t01090610996._2
351- let withdrawable = $t01090610996._3
352- let withdrawn = $t01090610996._4
353- let inProtocol = $t01090610996._5
354- let gVires = $t01090610996._6
355- let $t01100311056 = userProfitData(user)
356- let virtualTokens = $t01100311056._1
357- let tokenData = $t01100311056._2
348+ let $t01092011010 = userViresData(user)
349+ let deposited = $t01092011010._1
350+ let locked = $t01092011010._2
351+ let withdrawable = $t01092011010._3
352+ let withdrawn = $t01092011010._4
353+ let inProtocol = $t01092011010._5
354+ let gVires = $t01092011010._6
355+ let $t01101711070 = userProfitData(user)
356+ let virtualTokens = $t01101711070._1
357+ let tokenData = $t01101711070._2
358358 let power = if ((inProtocol == 0))
359359 then 0
360360 else fraction(10000, gVires, inProtocol)
361361 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))
362362 let tokensData = {
363363 func fld (totals,item) = {
364- let $t01179411821 = item
365- let aid = $t01179411821._1
366- let ced = $t01179411821._2
367- let av = $t01179411821._3
368- let nc = $t01179411821._4
364+ let $t01180811835 = item
365+ let aid = $t01180811835._1
366+ let ced = $t01180811835._2
367+ let av = $t01180811835._3
368+ let nc = $t01180811835._4
369369 ((((((((((totals + ", [ ") + "assetId = ") + aid) + ", claimed = ") + toString(ced)) + ", claimable = ") + toString(av)) + ", nonClaimable = ") + toString(nc)) + "]")
370370 }
371371
421421 if ((currentFactor > factor))
422422 then throw("can't downgrade boosting")
423423 else {
424- let $t01315113237 = userViresData(user)
425- let deposited = $t01315113237._1
426- let locked = $t01315113237._2
427- let withdrawable = $t01315113237._3
428- let withdrawn = $t01315113237._4
429- let inProtocol = $t01315113237._5
430- let gV = $t01315113237._6
424+ let $t01316513251 = userViresData(user)
425+ let deposited = $t01316513251._1
426+ let locked = $t01316513251._2
427+ let withdrawable = $t01316513251._3
428+ let withdrawn = $t01316513251._4
429+ let inProtocol = $t01316513251._5
430+ let gV = $t01316513251._6
431431 let oldVirtualTokens = userVirtualTokens(user)
432432 let newVirtualTokens = formula((HEIGHT - initialHeight), (factor * (tokens + inProtocol)))
433433 let diff = (newVirtualTokens - oldVirtualTokens)
527527 if ((checks == checks))
528528 then {
529529 let addr = addressFromStringValue(user)
530- let $t01594516023 = userViresData(user)
531- let deposited = $t01594516023._1
532- let locked = $t01594516023._2
533- let withdrawable = $t01594516023._3
534- let withdrawn = $t01594516023._4
535- let gVires = $t01594516023._5
530+ let $t01595916037 = userViresData(user)
531+ let deposited = $t01595916037._1
532+ let locked = $t01595916037._2
533+ let withdrawable = $t01595916037._3
534+ let withdrawn = $t01595916037._4
535+ let gVires = $t01595916037._5
536536 if ((0 >= withdrawable))
537537 then nil
538538 else {
539539 let userUpdate = if (userOffCliff(user))
540540 then {
541- let $t01612416178 = userProfitData(user)
542- let virtualTokens = $t01612416178._1
543- let tokensData = $t01612416178._2
541+ let $t01613816192 = userProfitData(user)
542+ let virtualTokens = $t01613816192._1
543+ let tokensData = $t01613816192._2
544544 let base = [DeleteEntry(userFactorStore(user)), DeleteEntry(userEntryHeightStore(user)), DeleteEntry(userWithdrawnTokensStore(user)), DeleteEntry(userDepositedTokensStore(user)), DeleteEntry(userVirtualTokensStore(user)), changeByStr(totalVirtualTokensStore, -(withdrawable))]
545545 let tokenData = {
546546 func fold (total,item) = {
547- let $t01667516704 = item
548- let aid = $t01667516704._1
549- let ced = $t01667516704._2
550- let av = $t01667516704._3
551- let nc = $t01667516704._4
547+ let $t01668916718 = item
548+ let aid = $t01668916718._1
549+ let ced = $t01668916718._2
550+ let av = $t01668916718._3
551+ let nc = $t01668916718._4
552552 (total ++ [DeleteEntry(userDividendsClaimedStore(user, aid)), IntegerEntry(userDividendsAdjStore(user, aid), -(av)), IntegerEntry(totalVirtualDividendsStore(aid), fraction(totalVirtualDividends(aid), (totalVirtualTokens - withdrawable), totalVirtualTokens))])
553553 }
554554
601601 if ((checks == checks))
602602 then {
603603 let toAddr = addressFromStringValue(to)
604- let $t01807518128 = userProfitData(from)
605- let virtualTokens = $t01807518128._1
606- let tokensData = $t01807518128._2
604+ let $t01808918142 = userProfitData(from)
605+ let virtualTokens = $t01808918142._1
606+ let tokensData = $t01808918142._2
607607 let relocking = if (relock)
608608 then updateUser(from, 0, userFactor(from))
609609 else nil
610610 let tokenData = {
611611 func fold (total,item) = {
612- let $t01833218361 = item
613- let aid = $t01833218361._1
614- let ced = $t01833218361._2
615- let av = $t01833218361._3
616- let nc = $t01833218361._4
612+ let $t01834618375 = item
613+ let aid = $t01834618375._1
614+ let ced = $t01834618375._2
615+ let av = $t01834618375._3
616+ let nc = $t01834618375._4
617617 (total ++ [changeBy(userDividendsClaimedStore(from, aid), av), changeBy(totalRealDividendsClaimedStore(aid), av), ScriptTransfer(toAddr, av, assetId(aid))])
618618 }
619619
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
56- else fromBase58String(s)
56+ 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 totalRealDividendsClaimedStore (aid) = (aid + "_totalRealDividendsClaimed")
206206
207207
208208 let totalVirtualTokensStore = "totalVirtualTokens"
209209
210210 let totalDepositedTokensStore = "totalDepositedTokens"
211211
212212 func totalDepositedByFactorStore (factor) = ("totalDepositedTokens" + toString(factorCheck(factor)))
213213
214214
215215 func totalDepositedByFactor (factor) = valueOrElse(getInteger(totalDepositedByFactorStore(factor)), 0)
216216
217217
218218 func totalVirtualDividends (aid) = valueOrElse(getInteger(this, totalVirtualDividendsStore(aid)), 0)
219219
220220
221221 func totalRealDividends (aid) = valueOrElse(getInteger(this, totalRealDividendsStore(aid)), 0)
222222
223223
224224 let totalVirtualTokens = parseIntValue(valueOrElse(getString(this, totalVirtualTokensStore), "0"))
225225
226226 let totalDepositedTokens = valueOrElse(getInteger(this, totalDepositedTokensStore), 0)
227227
228228 func userOffCliff (user) = {
229229 let entryHeight = userEntryHeight(user)
230230 let factor = userFactor(user)
231231 if ((factor == 1))
232232 then (HEIGHT > (entryHeight + (4 * halfLife)))
233233 else if ((factor == 2))
234234 then (HEIGHT > (entryHeight + (5 * halfLife)))
235235 else if ((factor == 4))
236236 then (HEIGHT > (entryHeight + (6 * halfLife)))
237237 else throw(("bad factor:" + toString(factor)))
238238 }
239239
240240
241241 func userViresData (user) = {
242242 let deposited = userDepositedTokens(user)
243243 let gV = userGVires(user)
244244 let supposedLocked = min([deposited, gV])
245245 let locked = if (userOffCliff(user))
246246 then 0
247247 else supposedLocked
248248 let unlocked = (deposited - locked)
249249 let withdrawn = userWithdrawnTokens(user)
250250 let withdrawable = (unlocked - withdrawn)
251251 let inProtocol = (locked + withdrawable)
252252 $Tuple6(deposited, locked, withdrawable, withdrawn, inProtocol, gV)
253253 }
254254
255255
256256 func userProfitData (user) = {
257257 let totalTokens = size(dividendableTokensArr)
258258 let totalDividendableReserves = size(dividendableReserves)
259259 if ((totalTokens != totalDividendableReserves))
260260 then throw(((("inconsistent configuration: totalTokens=" + toString(totalTokens)) + ", totalDividendableReserves = ") + toString(totalDividendableReserves)))
261261 else {
262262 let virtualTokens = userVirtualTokens(user)
263263 let tokenData = {
264264 func fold (totals,index) = if ((index >= totalTokens))
265265 then totals
266266 else {
267267 let aid = dividendableTokensArr[index]
268- let $t084978765 = {
268+ let $t085118779 = {
269269 let r = valueOrErrorMessage(addressFromString(dividendableReserves[index]), "bad reserve in dividendableReserves")
270270 asIntStrInt(invoke(r, "getReserveDivsInfo", nil, nil))
271271 }
272- let reserveDivs = $t084978765._1
273- let reserveAssetId = $t084978765._2
274- let nonClaimable = $t084978765._3
272+ let reserveDivs = $t085118779._1
273+ let reserveAssetId = $t085118779._2
274+ let nonClaimable = $t085118779._3
275275 if ((reserveAssetId != aid))
276276 then throw(((((((("inconsistent configuration: reserveAssetId=" + reserveAssetId) + ", aid=") + aid) + ", dividendableTokens:") + dividendableTokens) + ", dividendableReserves:") + dividendableReservesStr))
277277 else {
278278 let userVirtualDivs = if ((totalVirtualTokens == 0))
279279 then 0
280280 else fraction((totalVirtualDividends(aid) + reserveDivs), virtualTokens, totalVirtualTokens)
281281 let adj = userDividendsAdj(user, aid)
282282 let userDivs = (userVirtualDivs - adj)
283283 let nonClaimableUserDivs = if ((totalVirtualTokens == 0))
284284 then 0
285285 else fraction(nonClaimable, virtualTokens, totalVirtualTokens)
286286 let userClaimed = userDividendsClaimed(user, aid)
287287 let claimable = max([0, (userDivs - userClaimed)])
288288 if ((0 > claimable))
289289 then throw(("claimable < 0: " + toString(claimable)))
290290 else (totals ++ [$Tuple4(aid, userClaimed, claimable, nonClaimableUserDivs)])
291291 }
292292 }
293293
294294 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
295295 let $s = size($l)
296296 let $acc0 = nil
297297 func $f0_1 ($a,$i) = if (($i >= $s))
298298 then $a
299299 else fold($a, $l[$i])
300300
301301 func $f0_2 ($a,$i) = if (($i >= $s))
302302 then $a
303303 else throw("List size exceeds 20")
304304
305305 $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)
306306 }
307307 $Tuple2(virtualTokens, tokenData)
308308 }
309309 }
310310
311311
312312 func claimFromReservesInternal () = {
313313 let assetIdStore = "assetId"
314314 func fold (output,reserve) = {
315315 let reserveAddress = valueOrErrorMessage(addressFromString(reserve), "adder: bad reserve address")
316316 let assetIdString = valueOrErrorMessage(getString(reserveAddress, assetIdStore), "no assetId in reserve")
317317 let actions = if (!(contains(dividendableTokens, assetIdString)))
318318 then throw("inconsistent configuration: dividendableReserve's asset id is not stored in dividendableTokens")
319319 else {
320320 let amount = asInt(invoke(reserveAddress, "withdrawFromReserve", [-1], nil))
321321 if ((amount == amount))
322322 then if ((0 > amount))
323323 then throw("bad amount")
324324 else if ((amount == 0))
325325 then nil
326326 else [changeBy(totalVirtualDividendsStore(assetIdString), amount), changeBy(totalRealDividendsStore(assetIdString), amount)]
327327 else throw("Strict value is not equal to itself.")
328328 }
329329 (output ++ actions)
330330 }
331331
332332 let $l = dividendableReserves
333333 let $s = size($l)
334334 let $acc0 = nil
335335 func $f0_1 ($a,$i) = if (($i >= $s))
336336 then $a
337337 else fold($a, $l[$i])
338338
339339 func $f0_2 ($a,$i) = if (($i >= $s))
340340 then $a
341341 else throw("List size exceeds 20")
342342
343343 $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)
344344 }
345345
346346
347347 func adviseUser (user) = {
348- let $t01090610996 = userViresData(user)
349- let deposited = $t01090610996._1
350- let locked = $t01090610996._2
351- let withdrawable = $t01090610996._3
352- let withdrawn = $t01090610996._4
353- let inProtocol = $t01090610996._5
354- let gVires = $t01090610996._6
355- let $t01100311056 = userProfitData(user)
356- let virtualTokens = $t01100311056._1
357- let tokenData = $t01100311056._2
348+ let $t01092011010 = userViresData(user)
349+ let deposited = $t01092011010._1
350+ let locked = $t01092011010._2
351+ let withdrawable = $t01092011010._3
352+ let withdrawn = $t01092011010._4
353+ let inProtocol = $t01092011010._5
354+ let gVires = $t01092011010._6
355+ let $t01101711070 = userProfitData(user)
356+ let virtualTokens = $t01101711070._1
357+ let tokenData = $t01101711070._2
358358 let power = if ((inProtocol == 0))
359359 then 0
360360 else fraction(10000, gVires, inProtocol)
361361 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))
362362 let tokensData = {
363363 func fld (totals,item) = {
364- let $t01179411821 = item
365- let aid = $t01179411821._1
366- let ced = $t01179411821._2
367- let av = $t01179411821._3
368- let nc = $t01179411821._4
364+ let $t01180811835 = item
365+ let aid = $t01180811835._1
366+ let ced = $t01180811835._2
367+ let av = $t01180811835._3
368+ let nc = $t01180811835._4
369369 ((((((((((totals + ", [ ") + "assetId = ") + aid) + ", claimed = ") + toString(ced)) + ", claimable = ") + toString(av)) + ", nonClaimable = ") + toString(nc)) + "]")
370370 }
371371
372372 let $l = tokenData
373373 let $s = size($l)
374374 let $acc0 = ""
375375 func $f0_1 ($a,$i) = if (($i >= $s))
376376 then $a
377377 else fld($a, $l[$i])
378378
379379 func $f0_2 ($a,$i) = if (($i >= $s))
380380 then $a
381381 else throw("List size exceeds 20")
382382
383383 $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)
384384 }
385385 (base + tokensData)
386386 }
387387
388388
389389 func advise () = {
390390 let totalGvires = formula(-((HEIGHT - initialHeight)), totalVirtualTokens)
391391 let base = (((((((((((" totalDepositedTokens = " + toString(totalDepositedTokens)) + ", totalDepositedTokens1 = ") + toString(totalDepositedByFactor(1))) + ", totalDepositedTokens2 = ") + toString(totalDepositedByFactor(2))) + ", totalDepositedTokens4 = ") + toString(totalDepositedByFactor(4))) + ", totalVirtualTokens = ") + toString(totalVirtualTokens)) + ", totalGvires = ") + toString(totalGvires))
392392 func fold (total,aid) = ((((total + ", ") + aid) + " = ") + toString(totalRealDividends(aid)))
393393
394394 let $l = dividendableTokensArr
395395 let $s = size($l)
396396 let $acc0 = base
397397 func $f0_1 ($a,$i) = if (($i >= $s))
398398 then $a
399399 else fold($a, $l[$i])
400400
401401 func $f0_2 ($a,$i) = if (($i >= $s))
402402 then $a
403403 else throw("List size exceeds 20")
404404
405405 $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)
406406 }
407407
408408
409409 func updateUser (user,tokens,f) = {
410410 let checks = opAllowed("lock_vires")
411411 if ((checks == checks))
412412 then if (if ((f != 1))
413413 then valueOrElse(getBoolean(configAddress, "allow_boost"), false)
414414 else false)
415415 then throw("boosting not enabled")
416416 else {
417417 let factor = factorCheck(f)
418418 if ((factor == factor))
419419 then {
420420 let currentFactor = userFactor(user)
421421 if ((currentFactor > factor))
422422 then throw("can't downgrade boosting")
423423 else {
424- let $t01315113237 = userViresData(user)
425- let deposited = $t01315113237._1
426- let locked = $t01315113237._2
427- let withdrawable = $t01315113237._3
428- let withdrawn = $t01315113237._4
429- let inProtocol = $t01315113237._5
430- let gV = $t01315113237._6
424+ let $t01316513251 = userViresData(user)
425+ let deposited = $t01316513251._1
426+ let locked = $t01316513251._2
427+ let withdrawable = $t01316513251._3
428+ let withdrawn = $t01316513251._4
429+ let inProtocol = $t01316513251._5
430+ let gV = $t01316513251._6
431431 let oldVirtualTokens = userVirtualTokens(user)
432432 let newVirtualTokens = formula((HEIGHT - initialHeight), (factor * (tokens + inProtocol)))
433433 let diff = (newVirtualTokens - oldVirtualTokens)
434434 let base = [changeBy(totalDepositedTokensStore, tokens), changeByStr(totalVirtualTokensStore, diff), changeByStr(userVirtualTokensStore(user), diff), changeBy(userDepositedTokensStore(user), tokens), IntegerEntry(userEntryHeightStore(user), HEIGHT), IntegerEntry(userFactorStore(user), factor)]
435435 let tokenData = {
436436 func fold (total,aid) = {
437437 let adj = if ((totalVirtualTokens == 0))
438438 then 0
439439 else fraction(diff, totalVirtualDividends(aid), totalVirtualTokens)
440440 (total ++ [changeBy(totalVirtualDividendsStore(aid), adj), IntegerEntry(userDividendsAdjStore(user, aid), (userDividendsAdj(user, aid) + adj))])
441441 }
442442
443443 let $l = dividendableTokensArr
444444 let $s = size($l)
445445 let $acc0 = nil
446446 func $f0_1 ($a,$i) = if (($i >= $s))
447447 then $a
448448 else fold($a, $l[$i])
449449
450450 func $f0_2 ($a,$i) = if (($i >= $s))
451451 then $a
452452 else throw("List size exceeds 20")
453453
454454 $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)
455455 }
456456 let monitoring = if ((factor != currentFactor))
457457 then [changeBy(totalDepositedByFactorStore(currentFactor), -(inProtocol)), changeBy(totalDepositedByFactorStore(factor), (tokens + inProtocol))]
458458 else [changeBy(totalDepositedByFactorStore(factor), tokens)]
459459 ((base ++ tokenData) ++ monitoring)
460460 }
461461 }
462462 else throw("Strict value is not equal to itself.")
463463 }
464464 else throw("Strict value is not equal to itself.")
465465 }
466466
467467
468468 @Callable(i)
469469 func totalGvires () = $Tuple2(nil, formula(-((HEIGHT - initialHeight)), totalVirtualTokens))
470470
471471
472472
473473 @Callable(i)
474474 func shareProfitManually () = {
475475 let checks = opAllowed("share_dividends_manually")
476476 if ((checks == checks))
477477 then {
478478 let paymentAssetId = assetIdStr(i.payments[0].assetId)
479479 if (!(contains(dividendableTokens, paymentAssetId)))
480480 then throw("bad profit token")
481481 else {
482482 let amt = i.payments[0].amount
483483 [changeBy(totalVirtualDividendsStore(paymentAssetId), amt), changeBy(totalRealDividendsStore(paymentAssetId), amt)]
484484 }
485485 }
486486 else throw("Strict value is not equal to itself.")
487487 }
488488
489489
490490
491491 @Callable(i)
492492 func shareProfitFromReserves () = claimFromReservesInternal()
493493
494494
495495
496496 @Callable(i)
497497 func init (configAddress,vires) = [writeConstString(configStore, configAddress), writeConstString(viresAssetIdStore, vires)]
498498
499499
500500
501501 @Callable(i)
502502 func init2 () = if ((i.caller != this))
503503 then throw("only self can continue")
504504 else [writeInt(initialHeightStore, HEIGHT)]
505505
506506
507507
508508 @Callable(i)
509509 func lockFor (user,factor) = {
510510 let checks = throwIf(if ((toString(i.caller) != user))
511511 then (i.caller != main)
512512 else false, "only main and user directly can do")
513513 if ((checks == checks))
514514 then updateUser(user, viresPayment(i), factor)
515515 else throw("Strict value is not equal to itself.")
516516 }
517517
518518
519519
520520 @Callable(i)
521521 func withdrawUnlockedFor (user) = {
522522 let checks = if (throwIf(if ((toString(i.caller) != user))
523523 then (i.caller != main)
524524 else false, "only main and user directly can do"))
525525 then opAllowed("withdraw_unlocked_vires")
526526 else false
527527 if ((checks == checks))
528528 then {
529529 let addr = addressFromStringValue(user)
530- let $t01594516023 = userViresData(user)
531- let deposited = $t01594516023._1
532- let locked = $t01594516023._2
533- let withdrawable = $t01594516023._3
534- let withdrawn = $t01594516023._4
535- let gVires = $t01594516023._5
530+ let $t01595916037 = userViresData(user)
531+ let deposited = $t01595916037._1
532+ let locked = $t01595916037._2
533+ let withdrawable = $t01595916037._3
534+ let withdrawn = $t01595916037._4
535+ let gVires = $t01595916037._5
536536 if ((0 >= withdrawable))
537537 then nil
538538 else {
539539 let userUpdate = if (userOffCliff(user))
540540 then {
541- let $t01612416178 = userProfitData(user)
542- let virtualTokens = $t01612416178._1
543- let tokensData = $t01612416178._2
541+ let $t01613816192 = userProfitData(user)
542+ let virtualTokens = $t01613816192._1
543+ let tokensData = $t01613816192._2
544544 let base = [DeleteEntry(userFactorStore(user)), DeleteEntry(userEntryHeightStore(user)), DeleteEntry(userWithdrawnTokensStore(user)), DeleteEntry(userDepositedTokensStore(user)), DeleteEntry(userVirtualTokensStore(user)), changeByStr(totalVirtualTokensStore, -(withdrawable))]
545545 let tokenData = {
546546 func fold (total,item) = {
547- let $t01667516704 = item
548- let aid = $t01667516704._1
549- let ced = $t01667516704._2
550- let av = $t01667516704._3
551- let nc = $t01667516704._4
547+ let $t01668916718 = item
548+ let aid = $t01668916718._1
549+ let ced = $t01668916718._2
550+ let av = $t01668916718._3
551+ let nc = $t01668916718._4
552552 (total ++ [DeleteEntry(userDividendsClaimedStore(user, aid)), IntegerEntry(userDividendsAdjStore(user, aid), -(av)), IntegerEntry(totalVirtualDividendsStore(aid), fraction(totalVirtualDividends(aid), (totalVirtualTokens - withdrawable), totalVirtualTokens))])
553553 }
554554
555555 let $l = tokensData
556556 let $s = size($l)
557557 let $acc0 = nil
558558 func $f0_1 ($a,$i) = if (($i >= $s))
559559 then $a
560560 else fold($a, $l[$i])
561561
562562 func $f0_2 ($a,$i) = if (($i >= $s))
563563 then $a
564564 else throw("List size exceeds 20")
565565
566566 $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)
567567 }
568568 (base ++ tokenData)
569569 }
570570 else [changeBy(userWithdrawnTokensStore(user), withdrawable)]
571571 (userUpdate ++ [changeBy(totalDepositedByFactorStore(userFactor(user)), -(withdrawable)), changeBy(totalDepositedTokensStore, -(withdrawable)), ScriptTransfer(addr, withdrawable, viresAssetId)])
572572 }
573573 }
574574 else throw("Strict value is not equal to itself.")
575575 }
576576
577577
578578
579579 @Callable(i)
580580 func claimProfit (from,to,relock) = {
581581 let validDelegate = if ((from == to))
582582 then true
583583 else match getString(this, ("delegation_claim_" + from)) {
584584 case s: String =>
585585 let data = split(s, "|")
586586 if ((to != data[0]))
587587 then throw(("no delegation rights for " + to))
588588 else if (if (relock)
589589 then (data[1] != "1")
590590 else false)
591591 then throw("attempting to relock while it's not allowed")
592592 else true
593593 case _ =>
594594 throw(("delegation not configured for " + from))
595595 }
596596 let checks = if (if (mainOnly(i))
597597 then opAllowed("claim_dividends")
598598 else false)
599599 then validDelegate
600600 else false
601601 if ((checks == checks))
602602 then {
603603 let toAddr = addressFromStringValue(to)
604- let $t01807518128 = userProfitData(from)
605- let virtualTokens = $t01807518128._1
606- let tokensData = $t01807518128._2
604+ let $t01808918142 = userProfitData(from)
605+ let virtualTokens = $t01808918142._1
606+ let tokensData = $t01808918142._2
607607 let relocking = if (relock)
608608 then updateUser(from, 0, userFactor(from))
609609 else nil
610610 let tokenData = {
611611 func fold (total,item) = {
612- let $t01833218361 = item
613- let aid = $t01833218361._1
614- let ced = $t01833218361._2
615- let av = $t01833218361._3
616- let nc = $t01833218361._4
612+ let $t01834618375 = item
613+ let aid = $t01834618375._1
614+ let ced = $t01834618375._2
615+ let av = $t01834618375._3
616+ let nc = $t01834618375._4
617617 (total ++ [changeBy(userDividendsClaimedStore(from, aid), av), changeBy(totalRealDividendsClaimedStore(aid), av), ScriptTransfer(toAddr, av, assetId(aid))])
618618 }
619619
620620 let $l = tokensData
621621 let $s = size($l)
622622 let $acc0 = nil
623623 func $f0_1 ($a,$i) = if (($i >= $s))
624624 then $a
625625 else fold($a, $l[$i])
626626
627627 func $f0_2 ($a,$i) = if (($i >= $s))
628628 then $a
629629 else throw("List size exceeds 20")
630630
631631 $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)
632632 }
633633 (relocking ++ tokenData)
634634 }
635635 else throw("Strict value is not equal to itself.")
636636 }
637637
638638
639639
640640 @Callable(i)
641641 func setClaimDelegation (address,relock) = {
642642 let checks = opAllowed("set_delegation_claim")
643643 if ((checks == checks))
644644 then if (!(isDefined(addressFromString(address))))
645645 then throw("bad address")
646646 else [StringEntry(("delegation_claim_" + toString(i.caller)), ((address + "|") + (if (relock)
647647 then "1"
648648 else "0")))]
649649 else throw("Strict value is not equal to itself.")
650650 }
651651
652652
653653
654654 @Callable(i)
655655 func removeClaimDelegation () = {
656656 let checks = opAllowed("set_delegation_claim")
657657 if ((checks == checks))
658658 then [DeleteEntry(("delegation_claim_" + toString(i.caller)))]
659659 else throw("Strict value is not equal to itself.")
660660 }
661661
662662
663663
664664 @Callable(i)
665665 func userPower (user) = $Tuple2(nil, userGVires(user))
666666
667667

github/deemru/w8io/3ef1775 
84.04 ms