tx · ENhpdGXWkxmAFgW6MXcm48mYyc2aqYsYp8Sp4MWnQXdA 3P3VTtUiwJ91Ly7vwtRVKv5NkNNiPoWe7oP: -0.00800000 Waves 2022.11.25 15:38 [3398082] smart account 3P3VTtUiwJ91Ly7vwtRVKv5NkNNiPoWe7oP > SELF 0.00000000 Waves
{ "type": 13, "id": "ENhpdGXWkxmAFgW6MXcm48mYyc2aqYsYp8Sp4MWnQXdA", "fee": 800000, "feeAssetId": null, "timestamp": 1669379889571, "version": 1, "sender": "3P3VTtUiwJ91Ly7vwtRVKv5NkNNiPoWe7oP", "senderPublicKey": "5q25v77G7b2qAcdzH88H2Y7mxXnddbN9ZYKCn3Q8W6Pi", "proofs": [ "3Qw8ByxyZkdRZzeX8o3KznUkmd3JDWCqL5bqxC55cEX2NmH8UCudo1P5h189zBqmP4Q3esBfXdoTHKTZ1YiuibMp" ], "script": "base64:BgIlCAISBgoECAgICBIAEgMKAQgSABIECgIICBIFCgMICAESAwoBCCIBEHdyaXRlQ29uc3RTdHJpbmcCA2tleQV2YWx1ZQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwUDa2V5CQELU3RyaW5nRW50cnkCBQNrZXkFBXZhbHVlCQACAQkArAICAhVhbHJlYWR5IGluaXRpYWxpemVkOiAFA2tleQENd3JpdGVDb25zdEludAIDa2V5BXZhbHVlAwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzBQNrZXkJAQxJbnRlZ2VyRW50cnkCBQNrZXkFBXZhbHVlCQACAQkArAICAhVhbHJlYWR5IGluaXRpYWxpemVkOiAFA2tleQEId3JpdGVJbnQCA2tleQV2YWx1ZQMJAGYCAAAFBXZhbHVlCQACAQkArAICCQCsAgIJAKwCAgIXd3JpdGluZyBuZWdhdGl2ZSB2YWx1ZSAJAKQDAQUFdmFsdWUCCSBmb3Iga2V5IAUDa2V5CQEMSW50ZWdlckVudHJ5AgUDa2V5BQV2YWx1ZQEIY2hhbmdlQnkCA2tleQV2YWx1ZQkBCHdyaXRlSW50AgUDa2V5CQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkAAAUFdmFsdWUAC2NvbmZpZ1N0b3JlAgZjb25maWcADWNvbmZpZ0FkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFC2NvbmZpZ1N0b3JlABJtYXliZU9yYWNsZUFkZHJlc3MEByRtYXRjaDAJAJ0IAgUNY29uZmlnQWRkcmVzcwIOb3JhY2xlX2FkZHJlc3MDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQCmCAEFAXMFBHVuaXQABkhFSUdIVAUGaGVpZ2h0AQlvcEFsbG93ZWQBAm9wBAckbWF0Y2gwCQD8BwQFDWNvbmZpZ0FkZHJlc3MCCW9wQWxsb3dlZAkAzAgCAgR1c2RuCQDMCAIFAm9wBQNuaWwFA25pbAMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFiBQckbWF0Y2gwAwUBYgYJAAIBAgtub3QgYWxsb3dlZAkAAgECIW9wQWxsb3dlZDogdW5leHBlY3RlZCByZXN1bHQgdHlwZQEIbWFpbk9ubHkBAWkDCQEIY29udGFpbnMCCQERQGV4dHJOYXRpdmUoMTA1MykCBQ1jb25maWdBZGRyZXNzAgRtYWluCQClCAEIBQFpBmNhbGxlcgYJAAIBAhBvbmx5IG1haW4gY2FuIGRvAQd0aHJvd0lmAgljb25kaXRpb24FZXJyb3IDBQljb25kaXRpb24JAAIBBQVlcnJvcgYACVRJTUVGUkFNRQCgCwAEdXNkYwkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwIEdXNkYwAEdXNkdAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwIEdXNkdAAEdXNkbgkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwIEdXNkbgERYWRkcmVzc0Fzc2V0U3RvcmUCB2FkZHJlc3MHYXNzZXRJZAkArAICCQCsAgIFB2FkZHJlc3MCAV8FB2Fzc2V0SWQBFWFkZHJlc3NBc3NldFVTRE5TdG9yZQIHYWRkcmVzcwdhc3NldElkCQCsAgIJAKwCAgkArAICBQdhZGRyZXNzAgFfBQdhc3NldElkAgVfdXNkbgEVYWRkcmVzc1RvdGFsVVNETlN0b3JlAQdhZGRyZXNzCQCsAgIFB2FkZHJlc3MCBV91c2RuAQ90b3RhbEFzc2V0U3RvcmUBB2Fzc2V0SWQJAKwCAgIGdG90YWxfBQdhc3NldElkARF2ZXN0aW5nU3RhcnRTdG9yZQEHYWRkcmVzcwkArAICBQdhZGRyZXNzAg5fdmVzdGluZ19zdGFydAESY29udmVydGVkVG9McFN0b3JlAQdhZGRyZXNzCQCsAgIFB2FkZHJlc3MCEF9jb252ZXJ0ZWRfdG9fbHABE3Zlc3RpbmdDbGFpbWVkU3RvcmUBB2FkZHJlc3MJAKwCAgUHYWRkcmVzcwIIX2NsYWltZWQBGXdpdGhkcmF3bldpdGhpbkVwb2NoU3RvcmUDCmVwb2NoU3RhcnQHYWRkcmVzcwdhc3NldElkCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUHYWRkcmVzcwIBXwUHYXNzZXRJZAIBXwkApAMBBQplcG9jaFN0YXJ0Ahdfd2l0aGRyYXduX3dpdGhpbl9lcG9jaAARY3VycmVudEVwb2NoU3RhcnQJAGgCCQBpAgUGSEVJR0hUBQlUSU1FRlJBTUUFCVRJTUVGUkFNRQAQbWluaU1heENsYWltVXNkbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1jb25maWdBZGRyZXNzAhJtaW5pbWF4VmVzdGluZ1VzZG4JAGgCAOgHAMCEPQAOdG90YWxVU0ROU3RvcmUCCnRvdGFsX3VzZG4ADXZlc3RpbmdQZXJpb2QJAGgCAKALAO0CARN3aXRoZHJhd25Ub2RheVN0b3JlAQdhZGRyZXNzCQEZd2l0aGRyYXduV2l0aGluRXBvY2hTdG9yZQMFEWN1cnJlbnRFcG9jaFN0YXJ0BQdhZGRyZXNzBQR1c2RuAQ53aXRoZHJhd25Ub2RheQEHYWRkcmVzcwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQETd2l0aGRyYXduVG9kYXlTdG9yZQEFB2FkZHJlc3MAAAESdXNlclZlc3RpbmdCYWxhbmNlAQdhZGRyZXNzBAVjVVNETgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEVYWRkcmVzc0Fzc2V0VVNETlN0b3JlAgUHYWRkcmVzcwUEdXNkYwAABAV0VVNETgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEVYWRkcmVzc0Fzc2V0VVNETlN0b3JlAgUHYWRkcmVzcwUEdXNkdAAABAx0b3RhbFZlc3RpbmcJAGQCBQVjVVNETgUFdFVTRE4EDmFscmVhZHlDbGFpbWVkCQELdmFsdWVPckVsc2UCCQCfCAEJARN2ZXN0aW5nQ2xhaW1lZFN0b3JlAQUHYWRkcmVzcwAABA1jb252ZXJ0ZWRUb0xQCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARJjb252ZXJ0ZWRUb0xwU3RvcmUBBQdhZGRyZXNzAAAEDGNsYWltZWRUb2RheQkBDndpdGhkcmF3blRvZGF5AQUHYWRkcmVzcwQJYXZhaWxhYmxlCQBlAgkAZQIFDHRvdGFsVmVzdGluZwUOYWxyZWFkeUNsYWltZWQFDWNvbnZlcnRlZFRvTFAEByRtYXRjaDAJAJoIAgUEdGhpcwkBEXZlc3RpbmdTdGFydFN0b3JlAQUHYWRkcmVzcwMJAAECBQckbWF0Y2gwAgNJbnQEDHZlc3RpbmdTdGFydAUHJG1hdGNoMAQIZWxpZ2libGUDCQBmAgUGSEVJR0hUCQBkAgUMdmVzdGluZ1N0YXJ0BQ12ZXN0aW5nUGVyaW9kBQx0b3RhbFZlc3RpbmcJAGsDBQx0b3RhbFZlc3RpbmcJAGUCBQZIRUlHSFQFDHZlc3RpbmdTdGFydAUNdmVzdGluZ1BlcmlvZAQOYXZhaWxhYmxlVG9kYXkJAJcDAQkAzAgCBQlhdmFpbGFibGUJAMwIAgkAZQIFCGVsaWdpYmxlBQ5hbHJlYWR5Q2xhaW1lZAkAzAgCCQBlAgkAlgMBCQDMCAIFEG1pbmlNYXhDbGFpbVVzZG4JAMwIAgkAaQIFDHRvdGFsVmVzdGluZwDtAgUDbmlsBQxjbGFpbWVkVG9kYXkFA25pbAkAmwoJBQx0b3RhbFZlc3RpbmcFDmFscmVhZHlDbGFpbWVkBQhlbGlnaWJsZQUMdmVzdGluZ1N0YXJ0CQBkAgUMdmVzdGluZ1N0YXJ0BQ12ZXN0aW5nUGVyaW9kBQxjbGFpbWVkVG9kYXkFDmF2YWlsYWJsZVRvZGF5BQ1jb252ZXJ0ZWRUb0xQBQlhdmFpbGFibGUJAJsKCQAAAAAA////////////AQD///////////8BAP///////////wEA////////////AQD///////////8BAAAAAAEKYWR2aXNlVXNlcgEHYWRkcmVzcwQLJHQwMzg3NTQwMTcJARJ1c2VyVmVzdGluZ0JhbGFuY2UBBQdhZGRyZXNzBAx0b3RhbFZlc3RpbmcIBQskdDAzODc1NDAxNwJfMQQOYWxyZWFkeUNsYWltZWQIBQskdDAzODc1NDAxNwJfMgQIZWxpZ2libGUIBQskdDAzODc1NDAxNwJfMwQFc3RhcnQIBQskdDAzODc1NDAxNwJfNAQDZW5kCAULJHQwMzg3NTQwMTcCXzUEDGNsYWltZWRUb2RheQgFCyR0MDM4NzU0MDE3Al82BA5hdmFpbGFibGVUb2RheQgFCyR0MDM4NzU0MDE3Al83BA1jb252ZXJ0ZWRUb0xQCAULJHQwMzg3NTQwMTcCXzgECWF2YWlsYWJsZQgFCyR0MDM4NzU0MDE3Al85BAFjCQELdmFsdWVPckVsc2UCCQCfCAEJARFhZGRyZXNzQXNzZXRTdG9yZQIFB2FkZHJlc3MFBHVzZGMAAAQBdAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQERYWRkcmVzc0Fzc2V0U3RvcmUCBQdhZGRyZXNzBQR1c2R0AAAJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglhZGRyZXNzOiAFB2FkZHJlc3MCECwgdG90YWxWZXN0aW5nOiAJAKQDAQUMdG90YWxWZXN0aW5nAhIsIGFscmVhZHlDbGFpbWVkOiAJAKQDAQUOYWxyZWFkeUNsYWltZWQCDCwgZWxpZ2libGU6IAkApAMBBQhlbGlnaWJsZQIPLCBzdGFydEhlaWdodDogCQCkAwEFBXN0YXJ0Ag0sIGVuZEhlaWdodDogCQCkAwEFA2VuZAINLCBub3dIZWlnaHQ6IAkApAMBBQZIRUlHSFQCESwgdXNkY19taWdyYXRlZDogCQCkAwEFAWMCESwgdXNkdF9taWdyYXRlZDogCQCkAwEFAXQCECwgdXNkY19hc3NldElkOiAFBHVzZGMCECwgdXNkdF9hc3NldElkOiAFBHVzZHQCDiwgZGFpbHlMaW1pdDogCQCkAwEJAJYDAQkAzAgCCQBpAgUMdG90YWxWZXN0aW5nAO0CCQDMCAIFEG1pbmlNYXhDbGFpbVVzZG4FA25pbAIQLCBjbGFpbWVkVG9kYXk6IAkApAMBBQxjbGFpbWVkVG9kYXkCEiwgYXZhaWxhYmxlVG9kYXk6IAkApAMBBQ5hdmFpbGFibGVUb2RheQIRLCBjb252ZXJ0ZWRUb0xQOiAJAKQDAQUNY29udmVydGVkVG9MUAEWd2l0aGRyYXdWZXN0ZWRJbnRlcm5hbAIHYWRkcmVzcwJ0bwQGY2hlY2tzCQEJb3BBbGxvd2VkAQIXbGlxdWlkYW9fd2l0aGRyYXdWZXN0ZWQDCQAAAgUGY2hlY2tzBQZjaGVja3MECyR0MDUwMTU1MTU3CQESdXNlclZlc3RpbmdCYWxhbmNlAQUHYWRkcmVzcwQMdG90YWxWZXN0aW5nCAULJHQwNTAxNTUxNTcCXzEEDmFscmVhZHlDbGFpbWVkCAULJHQwNTAxNTUxNTcCXzIECGVsaWdpYmxlCAULJHQwNTAxNTUxNTcCXzMEBXN0YXJ0CAULJHQwNTAxNTUxNTcCXzQEA2VuZAgFCyR0MDUwMTU1MTU3Al81BAxjbGFpbWVkVG9kYXkIBQskdDA1MDE1NTE1NwJfNgQOYXZhaWxhYmxlVG9kYXkIBQskdDA1MDE1NTE1NwJfNwQNY29udmVydGVkVG9MUAgFCyR0MDUwMTU1MTU3Al84BAlhdmFpbGFibGUIBQskdDA1MDE1NTE1NwJfOQMJAGYCAAAFBXN0YXJ0CQACAQISbm8gdmVzdGluZyBlbmFibGVkAwkAZwIAAAUOYXZhaWxhYmxlVG9kYXkJAAIBAhFub3RoaW5nIGF2YWlsYWJsZQkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAnRvBQ5hdmFpbGFibGVUb2RheQkA2QQBBQR1c2RuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQETdmVzdGluZ0NsYWltZWRTdG9yZQEFB2FkZHJlc3MJAGQCBQ5hbHJlYWR5Q2xhaW1lZAUOYXZhaWxhYmxlVG9kYXkJAMwIAgkBCGNoYW5nZUJ5AgkBE3dpdGhkcmF3blRvZGF5U3RvcmUBBQdhZGRyZXNzBQ5hdmFpbGFibGVUb2RheQUDbmlsBQ5hdmFpbGFibGVUb2RheQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEdcGFydGlhbFdpdGhkcmF3VmVzdGVkSW50ZXJuYWwDB2FkZHJlc3MCdG8DYW10BAZjaGVja3MJAQlvcEFsbG93ZWQBAhtsaXF1aWRhb193aXRoZHJhd1Zlc3RlZEFzTFADCQAAAgUGY2hlY2tzBQZjaGVja3MECyR0MDU2OTE1ODMzCQESdXNlclZlc3RpbmdCYWxhbmNlAQUHYWRkcmVzcwQMdG90YWxWZXN0aW5nCAULJHQwNTY5MTU4MzMCXzEEDmFscmVhZHlDbGFpbWVkCAULJHQwNTY5MTU4MzMCXzIECGVsaWdpYmxlCAULJHQwNTY5MTU4MzMCXzMEBXN0YXJ0CAULJHQwNTY5MTU4MzMCXzQEA2VuZAgFCyR0MDU2OTE1ODMzAl81BAxjbGFpbWVkVG9kYXkIBQskdDA1NjkxNTgzMwJfNgQOYXZhaWxhYmxlVG9kYXkIBQskdDA1NjkxNTgzMwJfNwQNY29udmVydGVkVG9MUAgFCyR0MDU2OTE1ODMzAl84BAlhdmFpbGFibGUIBQskdDA1NjkxNTgzMwJfOQMJAGYCBQNhbXQFCWF2YWlsYWJsZQkAAgECEnRvbyBtdWNoIHJlcXVlc3RlZAkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAnRvBQNhbXQJANkEAQUEdXNkbgkAzAgCCQEIY2hhbmdlQnkCCQESY29udmVydGVkVG9McFN0b3JlAQUHYWRkcmVzcwUDYW10BQNuaWwFA2FtdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECc3YBB2FkZHJlc3MEBmNoZWNrcwkBCW9wQWxsb3dlZAECFWxpcXVpZGFvX3N0YXJ0VmVzdGluZwMJAAACBQZjaGVja3MFBmNoZWNrcwQKdXNlclRTdG9yZQkBEWFkZHJlc3NBc3NldFN0b3JlAgUHYWRkcmVzcwUEdXNkdAQKdXNlckNTdG9yZQkBEWFkZHJlc3NBc3NldFN0b3JlAgUHYWRkcmVzcwUEdXNkYwQKY29udmVydGVkQwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQp1c2VyQ1N0b3JlAAAECmNvbnZlcnRlZFQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUKdXNlclRTdG9yZQAAAwkBCWlzRGVmaW5lZAEJAJoIAgUEdGhpcwkBEXZlc3RpbmdTdGFydFN0b3JlAQUHYWRkcmVzcwUDbmlsBAckbWF0Y2gwCQCaCAIFBHRoaXMJARVhZGRyZXNzVG90YWxVU0ROU3RvcmUBBQdhZGRyZXNzAwkAAQIFByRtYXRjaDACA0ludAQOc3RhcnRlZFZlc3RpbmcFByRtYXRjaDAJAMwIAgkBCGNoYW5nZUJ5AgINY29tbWl0dGVkVVNETgUOc3RhcnRlZFZlc3RpbmcJAMwIAgkBDXdyaXRlQ29uc3RJbnQCCQERdmVzdGluZ1N0YXJ0U3RvcmUBBQdhZGRyZXNzBQZIRUlHSFQJAMwIAgkBCGNoYW5nZUJ5AgkBD3RvdGFsQXNzZXRTdG9yZQEFBHVzZGMJAQEtAQUKY29udmVydGVkQwkAzAgCCQELRGVsZXRlRW50cnkBBQp1c2VyQ1N0b3JlCQDMCAIJAQhjaGFuZ2VCeQIJAQ90b3RhbEFzc2V0U3RvcmUBBQR1c2R0CQEBLQEFCmNvbnZlcnRlZFQJAMwIAgkBC0RlbGV0ZUVudHJ5AQUKdXNlclRTdG9yZQUDbmlsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4HAWkBBGluaXQEBGNvbmYDdElkA2NJZANuSWQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhJvbmx5IHNlbGYgY2FuIGluaXQJAMwIAgkBEHdyaXRlQ29uc3RTdHJpbmcCBQtjb25maWdTdG9yZQUEY29uZgkAzAgCCQEQd3JpdGVDb25zdFN0cmluZwICBHVzZHQFA3RJZAkAzAgCCQEQd3JpdGVDb25zdFN0cmluZwICBHVzZGMFA2NJZAkAzAgCCQEQd3JpdGVDb25zdFN0cmluZwICBHVzZG4FA25JZAUDbmlsAWkBD3N0YXJ0VmVzdGluZ0FsbAAJAQJzdgEJAKUIAQgFAWkGY2FsbGVyAWkBEnN0YXJ0VmVzdGluZ0FsbEZvcgEHYWRkcmVzcwQHY2hlY2tzMAkBCG1haW5Pbmx5AQUBaQMJAAACBQdjaGVja3MwBQdjaGVja3MwCQECc3YBBQdhZGRyZXNzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDndpdGhkcmF3VmVzdGVkAAQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIJARZ3aXRoZHJhd1Zlc3RlZEludGVybmFsAgUHYWRkcmVzcwUHYWRkcmVzcwFpARN3aXRoZHJhd1Zlc3RlZEZvclRvAgNhY2MCdG8EB2NoZWNrczAJAQhtYWluT25seQEFAWkDCQAAAgUHY2hlY2tzMAUHY2hlY2tzMAkBFndpdGhkcmF3VmVzdGVkSW50ZXJuYWwCBQNhY2MFAnRvCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBGnBhcnRpYWxXaXRoZHJhd1Zlc3RlZEZvclRvAwNhY2MCdG8DYW10BAdjaGVja3MwCQEIbWFpbk9ubHkBBQFpAwkAAAIFB2NoZWNrczAFB2NoZWNrczAJAR1wYXJ0aWFsV2l0aGRyYXdWZXN0ZWRJbnRlcm5hbAMFA2FjYwUCdG8FA2FtdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQdhZHZpc2VVAQNhY2MJAJQKAgUDbmlsCQEKYWR2aXNlVXNlcgEFA2FjYwBVPd3g", "chainId": 87, "height": 3398082, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: c9okMe8f9WB98km9MkqULxiBt4M2WYrzNreEdzQSFY2 Next: Hj6q7hCQxNcMNDzgy4Pme8DAPsw4yd5psAPiWPe9bAVZ Diff:
Old | New | Differences | |
---|---|---|---|
75 | 75 | func vestingStartStore (address) = (address + "_vesting_start") | |
76 | 76 | ||
77 | 77 | ||
78 | + | func convertedToLpStore (address) = (address + "_converted_to_lp") | |
79 | + | ||
80 | + | ||
78 | 81 | func vestingClaimedStore (address) = (address + "_claimed") | |
79 | 82 | ||
80 | 83 | ||
100 | 103 | let tUSDN = valueOrElse(getInteger(addressAssetUSDNStore(address, usdt)), 0) | |
101 | 104 | let totalVesting = (cUSDN + tUSDN) | |
102 | 105 | let alreadyClaimed = valueOrElse(getInteger(vestingClaimedStore(address)), 0) | |
106 | + | let convertedToLP = valueOrElse(getInteger(this, convertedToLpStore(address)), 0) | |
103 | 107 | let claimedToday = withdrawnToday(address) | |
108 | + | let available = ((totalVesting - alreadyClaimed) - convertedToLP) | |
104 | 109 | match getInteger(this, vestingStartStore(address)) { | |
105 | 110 | case vestingStart: Int => | |
106 | 111 | let eligible = if ((HEIGHT > (vestingStart + vestingPeriod))) | |
107 | 112 | then totalVesting | |
108 | 113 | else fraction(totalVesting, (HEIGHT - vestingStart), vestingPeriod) | |
109 | - | let availableToday = min([(eligible - alreadyClaimed), (max([miniMaxClaimUsdn, (totalVesting / 365)]) - claimedToday)]) | |
110 | - | $ | |
114 | + | let availableToday = min([available, (eligible - alreadyClaimed), (max([miniMaxClaimUsdn, (totalVesting / 365)]) - claimedToday)]) | |
115 | + | $Tuple9(totalVesting, alreadyClaimed, eligible, vestingStart, (vestingStart + vestingPeriod), claimedToday, availableToday, convertedToLP, available) | |
111 | 116 | case _ => | |
112 | - | $ | |
117 | + | $Tuple9(0, 0, -1, -1, -1, -1, -1, 0, 0) | |
113 | 118 | } | |
114 | 119 | } | |
115 | 120 | ||
116 | 121 | ||
117 | 122 | func adviseUser (address) = { | |
118 | - | let $t036293745 = userVestingBalance(address) | |
119 | - | let totalVesting = $t036293745._1 | |
120 | - | let alreadyClaimed = $t036293745._2 | |
121 | - | let eligible = $t036293745._3 | |
122 | - | let start = $t036293745._4 | |
123 | - | let end = $t036293745._5 | |
124 | - | let claimedToday = $t036293745._6 | |
125 | - | let availableToday = $t036293745._7 | |
123 | + | let $t038754017 = userVestingBalance(address) | |
124 | + | let totalVesting = $t038754017._1 | |
125 | + | let alreadyClaimed = $t038754017._2 | |
126 | + | let eligible = $t038754017._3 | |
127 | + | let start = $t038754017._4 | |
128 | + | let end = $t038754017._5 | |
129 | + | let claimedToday = $t038754017._6 | |
130 | + | let availableToday = $t038754017._7 | |
131 | + | let convertedToLP = $t038754017._8 | |
132 | + | let available = $t038754017._9 | |
126 | 133 | let c = valueOrElse(getInteger(addressAssetStore(address, usdc)), 0) | |
127 | 134 | let t = valueOrElse(getInteger(addressAssetStore(address, usdt)), 0) | |
128 | - | ((((((((((((((((((((((((((("address: " + address) + ", totalVesting: ") + toString(totalVesting)) + ", alreadyClaimed: ") + toString(alreadyClaimed)) + ", eligible: ") + toString(eligible)) + ", startHeight: ") + toString(start)) + ", endHeight: ") + toString(end)) + ", nowHeight: ") + toString(HEIGHT)) + ", usdc_migrated: ") + toString(c)) + ", usdt_migrated: ") + toString(t)) + ", usdc_assetId: ") + usdc) + ", usdt_assetId: ") + usdt) + ", dailyLimit: ") + toString(max([(totalVesting / 365), miniMaxClaimUsdn]))) + ", claimedToday: ") + toString(claimedToday)) + ", availableToday: ") + toString(availableToday)) | |
135 | + | ((((((((((((((((((((((((((((("address: " + address) + ", totalVesting: ") + toString(totalVesting)) + ", alreadyClaimed: ") + toString(alreadyClaimed)) + ", eligible: ") + toString(eligible)) + ", startHeight: ") + toString(start)) + ", endHeight: ") + toString(end)) + ", nowHeight: ") + toString(HEIGHT)) + ", usdc_migrated: ") + toString(c)) + ", usdt_migrated: ") + toString(t)) + ", usdc_assetId: ") + usdc) + ", usdt_assetId: ") + usdt) + ", dailyLimit: ") + toString(max([(totalVesting / 365), miniMaxClaimUsdn]))) + ", claimedToday: ") + toString(claimedToday)) + ", availableToday: ") + toString(availableToday)) + ", convertedToLP: ") + toString(convertedToLP)) | |
129 | 136 | } | |
130 | 137 | ||
131 | 138 | ||
133 | 140 | let checks = opAllowed("liquidao_withdrawVested") | |
134 | 141 | if ((checks == checks)) | |
135 | 142 | then { | |
136 | - | let $t046874803 = userVestingBalance(address) | |
137 | - | let totalVesting = $t046874803._1 | |
138 | - | let alreadyClaimed = $t046874803._2 | |
139 | - | let eligible = $t046874803._3 | |
140 | - | let start = $t046874803._4 | |
141 | - | let end = $t046874803._5 | |
142 | - | let claimedToday = $t046874803._6 | |
143 | - | let availableToday = $t046874803._7 | |
143 | + | let $t050155157 = userVestingBalance(address) | |
144 | + | let totalVesting = $t050155157._1 | |
145 | + | let alreadyClaimed = $t050155157._2 | |
146 | + | let eligible = $t050155157._3 | |
147 | + | let start = $t050155157._4 | |
148 | + | let end = $t050155157._5 | |
149 | + | let claimedToday = $t050155157._6 | |
150 | + | let availableToday = $t050155157._7 | |
151 | + | let convertedToLP = $t050155157._8 | |
152 | + | let available = $t050155157._9 | |
144 | 153 | if ((0 > start)) | |
145 | 154 | then throw("no vesting enabled") | |
146 | 155 | else if ((0 >= availableToday)) | |
147 | 156 | then throw("nothing available") | |
148 | 157 | else $Tuple2([ScriptTransfer(addressFromStringValue(to), availableToday, fromBase58String(usdn)), IntegerEntry(vestingClaimedStore(address), (alreadyClaimed + availableToday)), changeBy(withdrawnTodayStore(address), availableToday)], availableToday) | |
158 | + | } | |
159 | + | else throw("Strict value is not equal to itself.") | |
160 | + | } | |
161 | + | ||
162 | + | ||
163 | + | func partialWithdrawVestedInternal (address,to,amt) = { | |
164 | + | let checks = opAllowed("liquidao_withdrawVestedAsLP") | |
165 | + | if ((checks == checks)) | |
166 | + | then { | |
167 | + | let $t056915833 = userVestingBalance(address) | |
168 | + | let totalVesting = $t056915833._1 | |
169 | + | let alreadyClaimed = $t056915833._2 | |
170 | + | let eligible = $t056915833._3 | |
171 | + | let start = $t056915833._4 | |
172 | + | let end = $t056915833._5 | |
173 | + | let claimedToday = $t056915833._6 | |
174 | + | let availableToday = $t056915833._7 | |
175 | + | let convertedToLP = $t056915833._8 | |
176 | + | let available = $t056915833._9 | |
177 | + | if ((amt > available)) | |
178 | + | then throw("too much requested") | |
179 | + | else $Tuple2([ScriptTransfer(addressFromStringValue(to), amt, fromBase58String(usdn)), changeBy(convertedToLpStore(address), amt)], amt) | |
149 | 180 | } | |
150 | 181 | else throw("Strict value is not equal to itself.") | |
151 | 182 | } | |
213 | 244 | ||
214 | 245 | ||
215 | 246 | @Callable(i) | |
247 | + | func partialWithdrawVestedForTo (acc,to,amt) = { | |
248 | + | let checks0 = mainOnly(i) | |
249 | + | if ((checks0 == checks0)) | |
250 | + | then partialWithdrawVestedInternal(acc, to, amt) | |
251 | + | else throw("Strict value is not equal to itself.") | |
252 | + | } | |
253 | + | ||
254 | + | ||
255 | + | ||
256 | + | @Callable(i) | |
216 | 257 | func adviseU (acc) = $Tuple2(nil, adviseUser(acc)) | |
217 | 258 | ||
218 | 259 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | func writeConstString (key,value) = if (!(isDefined(getString(this, key)))) | |
5 | 5 | then StringEntry(key, value) | |
6 | 6 | else throw(("already initialized: " + key)) | |
7 | 7 | ||
8 | 8 | ||
9 | 9 | func writeConstInt (key,value) = if (!(isDefined(getInteger(this, key)))) | |
10 | 10 | then IntegerEntry(key, value) | |
11 | 11 | else throw(("already initialized: " + key)) | |
12 | 12 | ||
13 | 13 | ||
14 | 14 | func writeInt (key,value) = if ((0 > value)) | |
15 | 15 | then throw(((("writing negative value " + toString(value)) + " for key ") + key)) | |
16 | 16 | else IntegerEntry(key, value) | |
17 | 17 | ||
18 | 18 | ||
19 | 19 | func changeBy (key,value) = writeInt(key, (valueOrElse(getInteger(this, key), 0) + value)) | |
20 | 20 | ||
21 | 21 | ||
22 | 22 | let configStore = "config" | |
23 | 23 | ||
24 | 24 | let configAddress = addressFromStringValue(getStringValue(this, configStore)) | |
25 | 25 | ||
26 | 26 | let maybeOracleAddress = match getString(configAddress, "oracle_address") { | |
27 | 27 | case s: String => | |
28 | 28 | addressFromString(s) | |
29 | 29 | case _ => | |
30 | 30 | unit | |
31 | 31 | } | |
32 | 32 | ||
33 | 33 | let HEIGHT = height | |
34 | 34 | ||
35 | 35 | func opAllowed (op) = match invoke(configAddress, "opAllowed", ["usdn", op], nil) { | |
36 | 36 | case b: Boolean => | |
37 | 37 | if (b) | |
38 | 38 | then true | |
39 | 39 | else throw("not allowed") | |
40 | 40 | case _ => | |
41 | 41 | throw("opAllowed: unexpected result type") | |
42 | 42 | } | |
43 | 43 | ||
44 | 44 | ||
45 | 45 | func mainOnly (i) = if (contains(getStringValue(configAddress, "main"), toString(i.caller))) | |
46 | 46 | then true | |
47 | 47 | else throw("only main can do") | |
48 | 48 | ||
49 | 49 | ||
50 | 50 | func throwIf (condition,error) = if (condition) | |
51 | 51 | then throw(error) | |
52 | 52 | else true | |
53 | 53 | ||
54 | 54 | ||
55 | 55 | let TIMEFRAME = 1440 | |
56 | 56 | ||
57 | 57 | let usdc = getStringValue(this, "usdc") | |
58 | 58 | ||
59 | 59 | let usdt = getStringValue(this, "usdt") | |
60 | 60 | ||
61 | 61 | let usdn = getStringValue(this, "usdn") | |
62 | 62 | ||
63 | 63 | func addressAssetStore (address,assetId) = ((address + "_") + assetId) | |
64 | 64 | ||
65 | 65 | ||
66 | 66 | func addressAssetUSDNStore (address,assetId) = (((address + "_") + assetId) + "_usdn") | |
67 | 67 | ||
68 | 68 | ||
69 | 69 | func addressTotalUSDNStore (address) = (address + "_usdn") | |
70 | 70 | ||
71 | 71 | ||
72 | 72 | func totalAssetStore (assetId) = ("total_" + assetId) | |
73 | 73 | ||
74 | 74 | ||
75 | 75 | func vestingStartStore (address) = (address + "_vesting_start") | |
76 | 76 | ||
77 | 77 | ||
78 | + | func convertedToLpStore (address) = (address + "_converted_to_lp") | |
79 | + | ||
80 | + | ||
78 | 81 | func vestingClaimedStore (address) = (address + "_claimed") | |
79 | 82 | ||
80 | 83 | ||
81 | 84 | func withdrawnWithinEpochStore (epochStart,address,assetId) = (((((address + "_") + assetId) + "_") + toString(epochStart)) + "_withdrawn_within_epoch") | |
82 | 85 | ||
83 | 86 | ||
84 | 87 | let currentEpochStart = ((HEIGHT / TIMEFRAME) * TIMEFRAME) | |
85 | 88 | ||
86 | 89 | let miniMaxClaimUsdn = valueOrElse(getInteger(configAddress, "minimaxVestingUsdn"), (1000 * 1000000)) | |
87 | 90 | ||
88 | 91 | let totalUSDNStore = "total_usdn" | |
89 | 92 | ||
90 | 93 | let vestingPeriod = (1440 * 365) | |
91 | 94 | ||
92 | 95 | func withdrawnTodayStore (address) = withdrawnWithinEpochStore(currentEpochStart, address, usdn) | |
93 | 96 | ||
94 | 97 | ||
95 | 98 | func withdrawnToday (address) = valueOrElse(getInteger(withdrawnTodayStore(address)), 0) | |
96 | 99 | ||
97 | 100 | ||
98 | 101 | func userVestingBalance (address) = { | |
99 | 102 | let cUSDN = valueOrElse(getInteger(addressAssetUSDNStore(address, usdc)), 0) | |
100 | 103 | let tUSDN = valueOrElse(getInteger(addressAssetUSDNStore(address, usdt)), 0) | |
101 | 104 | let totalVesting = (cUSDN + tUSDN) | |
102 | 105 | let alreadyClaimed = valueOrElse(getInteger(vestingClaimedStore(address)), 0) | |
106 | + | let convertedToLP = valueOrElse(getInteger(this, convertedToLpStore(address)), 0) | |
103 | 107 | let claimedToday = withdrawnToday(address) | |
108 | + | let available = ((totalVesting - alreadyClaimed) - convertedToLP) | |
104 | 109 | match getInteger(this, vestingStartStore(address)) { | |
105 | 110 | case vestingStart: Int => | |
106 | 111 | let eligible = if ((HEIGHT > (vestingStart + vestingPeriod))) | |
107 | 112 | then totalVesting | |
108 | 113 | else fraction(totalVesting, (HEIGHT - vestingStart), vestingPeriod) | |
109 | - | let availableToday = min([(eligible - alreadyClaimed), (max([miniMaxClaimUsdn, (totalVesting / 365)]) - claimedToday)]) | |
110 | - | $ | |
114 | + | let availableToday = min([available, (eligible - alreadyClaimed), (max([miniMaxClaimUsdn, (totalVesting / 365)]) - claimedToday)]) | |
115 | + | $Tuple9(totalVesting, alreadyClaimed, eligible, vestingStart, (vestingStart + vestingPeriod), claimedToday, availableToday, convertedToLP, available) | |
111 | 116 | case _ => | |
112 | - | $ | |
117 | + | $Tuple9(0, 0, -1, -1, -1, -1, -1, 0, 0) | |
113 | 118 | } | |
114 | 119 | } | |
115 | 120 | ||
116 | 121 | ||
117 | 122 | func adviseUser (address) = { | |
118 | - | let $t036293745 = userVestingBalance(address) | |
119 | - | let totalVesting = $t036293745._1 | |
120 | - | let alreadyClaimed = $t036293745._2 | |
121 | - | let eligible = $t036293745._3 | |
122 | - | let start = $t036293745._4 | |
123 | - | let end = $t036293745._5 | |
124 | - | let claimedToday = $t036293745._6 | |
125 | - | let availableToday = $t036293745._7 | |
123 | + | let $t038754017 = userVestingBalance(address) | |
124 | + | let totalVesting = $t038754017._1 | |
125 | + | let alreadyClaimed = $t038754017._2 | |
126 | + | let eligible = $t038754017._3 | |
127 | + | let start = $t038754017._4 | |
128 | + | let end = $t038754017._5 | |
129 | + | let claimedToday = $t038754017._6 | |
130 | + | let availableToday = $t038754017._7 | |
131 | + | let convertedToLP = $t038754017._8 | |
132 | + | let available = $t038754017._9 | |
126 | 133 | let c = valueOrElse(getInteger(addressAssetStore(address, usdc)), 0) | |
127 | 134 | let t = valueOrElse(getInteger(addressAssetStore(address, usdt)), 0) | |
128 | - | ((((((((((((((((((((((((((("address: " + address) + ", totalVesting: ") + toString(totalVesting)) + ", alreadyClaimed: ") + toString(alreadyClaimed)) + ", eligible: ") + toString(eligible)) + ", startHeight: ") + toString(start)) + ", endHeight: ") + toString(end)) + ", nowHeight: ") + toString(HEIGHT)) + ", usdc_migrated: ") + toString(c)) + ", usdt_migrated: ") + toString(t)) + ", usdc_assetId: ") + usdc) + ", usdt_assetId: ") + usdt) + ", dailyLimit: ") + toString(max([(totalVesting / 365), miniMaxClaimUsdn]))) + ", claimedToday: ") + toString(claimedToday)) + ", availableToday: ") + toString(availableToday)) | |
135 | + | ((((((((((((((((((((((((((((("address: " + address) + ", totalVesting: ") + toString(totalVesting)) + ", alreadyClaimed: ") + toString(alreadyClaimed)) + ", eligible: ") + toString(eligible)) + ", startHeight: ") + toString(start)) + ", endHeight: ") + toString(end)) + ", nowHeight: ") + toString(HEIGHT)) + ", usdc_migrated: ") + toString(c)) + ", usdt_migrated: ") + toString(t)) + ", usdc_assetId: ") + usdc) + ", usdt_assetId: ") + usdt) + ", dailyLimit: ") + toString(max([(totalVesting / 365), miniMaxClaimUsdn]))) + ", claimedToday: ") + toString(claimedToday)) + ", availableToday: ") + toString(availableToday)) + ", convertedToLP: ") + toString(convertedToLP)) | |
129 | 136 | } | |
130 | 137 | ||
131 | 138 | ||
132 | 139 | func withdrawVestedInternal (address,to) = { | |
133 | 140 | let checks = opAllowed("liquidao_withdrawVested") | |
134 | 141 | if ((checks == checks)) | |
135 | 142 | then { | |
136 | - | let $t046874803 = userVestingBalance(address) | |
137 | - | let totalVesting = $t046874803._1 | |
138 | - | let alreadyClaimed = $t046874803._2 | |
139 | - | let eligible = $t046874803._3 | |
140 | - | let start = $t046874803._4 | |
141 | - | let end = $t046874803._5 | |
142 | - | let claimedToday = $t046874803._6 | |
143 | - | let availableToday = $t046874803._7 | |
143 | + | let $t050155157 = userVestingBalance(address) | |
144 | + | let totalVesting = $t050155157._1 | |
145 | + | let alreadyClaimed = $t050155157._2 | |
146 | + | let eligible = $t050155157._3 | |
147 | + | let start = $t050155157._4 | |
148 | + | let end = $t050155157._5 | |
149 | + | let claimedToday = $t050155157._6 | |
150 | + | let availableToday = $t050155157._7 | |
151 | + | let convertedToLP = $t050155157._8 | |
152 | + | let available = $t050155157._9 | |
144 | 153 | if ((0 > start)) | |
145 | 154 | then throw("no vesting enabled") | |
146 | 155 | else if ((0 >= availableToday)) | |
147 | 156 | then throw("nothing available") | |
148 | 157 | else $Tuple2([ScriptTransfer(addressFromStringValue(to), availableToday, fromBase58String(usdn)), IntegerEntry(vestingClaimedStore(address), (alreadyClaimed + availableToday)), changeBy(withdrawnTodayStore(address), availableToday)], availableToday) | |
158 | + | } | |
159 | + | else throw("Strict value is not equal to itself.") | |
160 | + | } | |
161 | + | ||
162 | + | ||
163 | + | func partialWithdrawVestedInternal (address,to,amt) = { | |
164 | + | let checks = opAllowed("liquidao_withdrawVestedAsLP") | |
165 | + | if ((checks == checks)) | |
166 | + | then { | |
167 | + | let $t056915833 = userVestingBalance(address) | |
168 | + | let totalVesting = $t056915833._1 | |
169 | + | let alreadyClaimed = $t056915833._2 | |
170 | + | let eligible = $t056915833._3 | |
171 | + | let start = $t056915833._4 | |
172 | + | let end = $t056915833._5 | |
173 | + | let claimedToday = $t056915833._6 | |
174 | + | let availableToday = $t056915833._7 | |
175 | + | let convertedToLP = $t056915833._8 | |
176 | + | let available = $t056915833._9 | |
177 | + | if ((amt > available)) | |
178 | + | then throw("too much requested") | |
179 | + | else $Tuple2([ScriptTransfer(addressFromStringValue(to), amt, fromBase58String(usdn)), changeBy(convertedToLpStore(address), amt)], amt) | |
149 | 180 | } | |
150 | 181 | else throw("Strict value is not equal to itself.") | |
151 | 182 | } | |
152 | 183 | ||
153 | 184 | ||
154 | 185 | func sv (address) = { | |
155 | 186 | let checks = opAllowed("liquidao_startVesting") | |
156 | 187 | if ((checks == checks)) | |
157 | 188 | then { | |
158 | 189 | let userTStore = addressAssetStore(address, usdt) | |
159 | 190 | let userCStore = addressAssetStore(address, usdc) | |
160 | 191 | let convertedC = valueOrElse(getInteger(this, userCStore), 0) | |
161 | 192 | let convertedT = valueOrElse(getInteger(this, userTStore), 0) | |
162 | 193 | if (isDefined(getInteger(this, vestingStartStore(address)))) | |
163 | 194 | then nil | |
164 | 195 | else match getInteger(this, addressTotalUSDNStore(address)) { | |
165 | 196 | case startedVesting: Int => | |
166 | 197 | [changeBy("committedUSDN", startedVesting), writeConstInt(vestingStartStore(address), HEIGHT), changeBy(totalAssetStore(usdc), -(convertedC)), DeleteEntry(userCStore), changeBy(totalAssetStore(usdt), -(convertedT)), DeleteEntry(userTStore)] | |
167 | 198 | case _ => | |
168 | 199 | nil | |
169 | 200 | } | |
170 | 201 | } | |
171 | 202 | else throw("Strict value is not equal to itself.") | |
172 | 203 | } | |
173 | 204 | ||
174 | 205 | ||
175 | 206 | @Callable(i) | |
176 | 207 | func init (conf,tId,cId,nId) = if ((i.caller != this)) | |
177 | 208 | then throw("only self can init") | |
178 | 209 | else [writeConstString(configStore, conf), writeConstString("usdt", tId), writeConstString("usdc", cId), writeConstString("usdn", nId)] | |
179 | 210 | ||
180 | 211 | ||
181 | 212 | ||
182 | 213 | @Callable(i) | |
183 | 214 | func startVestingAll () = sv(toString(i.caller)) | |
184 | 215 | ||
185 | 216 | ||
186 | 217 | ||
187 | 218 | @Callable(i) | |
188 | 219 | func startVestingAllFor (address) = { | |
189 | 220 | let checks0 = mainOnly(i) | |
190 | 221 | if ((checks0 == checks0)) | |
191 | 222 | then sv(address) | |
192 | 223 | else throw("Strict value is not equal to itself.") | |
193 | 224 | } | |
194 | 225 | ||
195 | 226 | ||
196 | 227 | ||
197 | 228 | @Callable(i) | |
198 | 229 | func withdrawVested () = { | |
199 | 230 | let address = toString(i.caller) | |
200 | 231 | withdrawVestedInternal(address, address) | |
201 | 232 | } | |
202 | 233 | ||
203 | 234 | ||
204 | 235 | ||
205 | 236 | @Callable(i) | |
206 | 237 | func withdrawVestedForTo (acc,to) = { | |
207 | 238 | let checks0 = mainOnly(i) | |
208 | 239 | if ((checks0 == checks0)) | |
209 | 240 | then withdrawVestedInternal(acc, to) | |
210 | 241 | else throw("Strict value is not equal to itself.") | |
211 | 242 | } | |
212 | 243 | ||
213 | 244 | ||
214 | 245 | ||
215 | 246 | @Callable(i) | |
247 | + | func partialWithdrawVestedForTo (acc,to,amt) = { | |
248 | + | let checks0 = mainOnly(i) | |
249 | + | if ((checks0 == checks0)) | |
250 | + | then partialWithdrawVestedInternal(acc, to, amt) | |
251 | + | else throw("Strict value is not equal to itself.") | |
252 | + | } | |
253 | + | ||
254 | + | ||
255 | + | ||
256 | + | @Callable(i) | |
216 | 257 | func adviseU (acc) = $Tuple2(nil, adviseUser(acc)) | |
217 | 258 | ||
218 | 259 |
github/deemru/w8io/3ef1775 47.38 ms ◑