tx · c9okMe8f9WB98km9MkqULxiBt4M2WYrzNreEdzQSFY2

3P3VTtUiwJ91Ly7vwtRVKv5NkNNiPoWe7oP:  -0.00700000 Waves

2022.09.01 16:56 [3275644] smart account 3P3VTtUiwJ91Ly7vwtRVKv5NkNNiPoWe7oP > SELF 0.00000000 Waves

{ "type": 13, "id": "c9okMe8f9WB98km9MkqULxiBt4M2WYrzNreEdzQSFY2", "fee": 700000, "feeAssetId": null, "timestamp": 1662040634923, "version": 1, "sender": "3P3VTtUiwJ91Ly7vwtRVKv5NkNNiPoWe7oP", "senderPublicKey": "5q25v77G7b2qAcdzH88H2Y7mxXnddbN9ZYKCn3Q8W6Pi", "proofs": [ "3Ggdu3h1bJ7Q1BDqhH7dFxNLEKpfsekqWhsGsSvBioZoCax4286YR9DmdR6wTJhLuGnygVM4vhXkY1bWNP1kodae" ], "script": "base64:BgIeCAISBgoECAgICBIAEgMKAQgSABIECgIICBIDCgEIIAEQd3JpdGVDb25zdFN0cmluZwIDa2V5BXZhbHVlAwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzBQNrZXkJAQtTdHJpbmdFbnRyeQIFA2tleQUFdmFsdWUJAAIBCQCsAgICFWFscmVhZHkgaW5pdGlhbGl6ZWQ6IAUDa2V5AQ13cml0ZUNvbnN0SW50AgNrZXkFdmFsdWUDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMFA2tleQkBDEludGVnZXJFbnRyeQIFA2tleQUFdmFsdWUJAAIBCQCsAgICFWFscmVhZHkgaW5pdGlhbGl6ZWQ6IAUDa2V5AQh3cml0ZUludAIDa2V5BXZhbHVlAwkAZgIAAAUFdmFsdWUJAAIBCQCsAgIJAKwCAgkArAICAhd3cml0aW5nIG5lZ2F0aXZlIHZhbHVlIAkApAMBBQV2YWx1ZQIJIGZvciBrZXkgBQNrZXkJAQxJbnRlZ2VyRW50cnkCBQNrZXkFBXZhbHVlAQhjaGFuZ2VCeQIDa2V5BXZhbHVlCQEId3JpdGVJbnQCBQNrZXkJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAABQV2YWx1ZQALY29uZmlnU3RvcmUCBmNvbmZpZwANY29uZmlnQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwULY29uZmlnU3RvcmUAEm1heWJlT3JhY2xlQWRkcmVzcwQHJG1hdGNoMAkAnQgCBQ1jb25maWdBZGRyZXNzAg5vcmFjbGVfYWRkcmVzcwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJAKYIAQUBcwUEdW5pdAAGSEVJR0hUBQZoZWlnaHQBCW9wQWxsb3dlZAECb3AEByRtYXRjaDAJAPwHBAUNY29uZmlnQWRkcmVzcwIJb3BBbGxvd2VkCQDMCAICBHVzZG4JAMwIAgUCb3AFA25pbAUDbmlsAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWIFByRtYXRjaDADBQFiBgkAAgECC25vdCBhbGxvd2VkCQACAQIhb3BBbGxvd2VkOiB1bmV4cGVjdGVkIHJlc3VsdCB0eXBlAQhtYWluT25seQEBaQMJAQhjb250YWlucwIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFDWNvbmZpZ0FkZHJlc3MCBG1haW4JAKUIAQgFAWkGY2FsbGVyBgkAAgECEG9ubHkgbWFpbiBjYW4gZG8BB3Rocm93SWYCCWNvbmRpdGlvbgVlcnJvcgMFCWNvbmRpdGlvbgkAAgEFBWVycm9yBgAJVElNRUZSQU1FAKALAAR1c2RjCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzAgR1c2RjAAR1c2R0CQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzAgR1c2R0AAR1c2RuCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzAgR1c2RuARFhZGRyZXNzQXNzZXRTdG9yZQIHYWRkcmVzcwdhc3NldElkCQCsAgIJAKwCAgUHYWRkcmVzcwIBXwUHYXNzZXRJZAEVYWRkcmVzc0Fzc2V0VVNETlN0b3JlAgdhZGRyZXNzB2Fzc2V0SWQJAKwCAgkArAICCQCsAgIFB2FkZHJlc3MCAV8FB2Fzc2V0SWQCBV91c2RuARVhZGRyZXNzVG90YWxVU0ROU3RvcmUBB2FkZHJlc3MJAKwCAgUHYWRkcmVzcwIFX3VzZG4BD3RvdGFsQXNzZXRTdG9yZQEHYXNzZXRJZAkArAICAgZ0b3RhbF8FB2Fzc2V0SWQBEXZlc3RpbmdTdGFydFN0b3JlAQdhZGRyZXNzCQCsAgIFB2FkZHJlc3MCDl92ZXN0aW5nX3N0YXJ0ARN2ZXN0aW5nQ2xhaW1lZFN0b3JlAQdhZGRyZXNzCQCsAgIFB2FkZHJlc3MCCF9jbGFpbWVkARl3aXRoZHJhd25XaXRoaW5FcG9jaFN0b3JlAwplcG9jaFN0YXJ0B2FkZHJlc3MHYXNzZXRJZAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFB2FkZHJlc3MCAV8FB2Fzc2V0SWQCAV8JAKQDAQUKZXBvY2hTdGFydAIXX3dpdGhkcmF3bl93aXRoaW5fZXBvY2gAEWN1cnJlbnRFcG9jaFN0YXJ0CQBoAgkAaQIFBkhFSUdIVAUJVElNRUZSQU1FBQlUSU1FRlJBTUUAEG1pbmlNYXhDbGFpbVVzZG4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUNY29uZmlnQWRkcmVzcwISbWluaW1heFZlc3RpbmdVc2RuCQBoAgDoBwDAhD0ADnRvdGFsVVNETlN0b3JlAgp0b3RhbF91c2RuAA12ZXN0aW5nUGVyaW9kCQBoAgCgCwDtAgETd2l0aGRyYXduVG9kYXlTdG9yZQEHYWRkcmVzcwkBGXdpdGhkcmF3bldpdGhpbkVwb2NoU3RvcmUDBRFjdXJyZW50RXBvY2hTdGFydAUHYWRkcmVzcwUEdXNkbgEOd2l0aGRyYXduVG9kYXkBB2FkZHJlc3MJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBE3dpdGhkcmF3blRvZGF5U3RvcmUBBQdhZGRyZXNzAAABEnVzZXJWZXN0aW5nQmFsYW5jZQEHYWRkcmVzcwQFY1VTRE4JAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFWFkZHJlc3NBc3NldFVTRE5TdG9yZQIFB2FkZHJlc3MFBHVzZGMAAAQFdFVTRE4JAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFWFkZHJlc3NBc3NldFVTRE5TdG9yZQIFB2FkZHJlc3MFBHVzZHQAAAQMdG90YWxWZXN0aW5nCQBkAgUFY1VTRE4FBXRVU0ROBA5hbHJlYWR5Q2xhaW1lZAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQETdmVzdGluZ0NsYWltZWRTdG9yZQEFB2FkZHJlc3MAAAQMY2xhaW1lZFRvZGF5CQEOd2l0aGRyYXduVG9kYXkBBQdhZGRyZXNzBAckbWF0Y2gwCQCaCAIFBHRoaXMJARF2ZXN0aW5nU3RhcnRTdG9yZQEFB2FkZHJlc3MDCQABAgUHJG1hdGNoMAIDSW50BAx2ZXN0aW5nU3RhcnQFByRtYXRjaDAECGVsaWdpYmxlAwkAZgIFBkhFSUdIVAkAZAIFDHZlc3RpbmdTdGFydAUNdmVzdGluZ1BlcmlvZAUMdG90YWxWZXN0aW5nCQBrAwUMdG90YWxWZXN0aW5nCQBlAgUGSEVJR0hUBQx2ZXN0aW5nU3RhcnQFDXZlc3RpbmdQZXJpb2QEDmF2YWlsYWJsZVRvZGF5CQCXAwEJAMwIAgkAZQIFCGVsaWdpYmxlBQ5hbHJlYWR5Q2xhaW1lZAkAzAgCCQBlAgkAlgMBCQDMCAIFEG1pbmlNYXhDbGFpbVVzZG4JAMwIAgkAaQIFDHRvdGFsVmVzdGluZwDtAgUDbmlsBQxjbGFpbWVkVG9kYXkFA25pbAkAmQoHBQx0b3RhbFZlc3RpbmcFDmFscmVhZHlDbGFpbWVkBQhlbGlnaWJsZQUMdmVzdGluZ1N0YXJ0CQBkAgUMdmVzdGluZ1N0YXJ0BQ12ZXN0aW5nUGVyaW9kBQxjbGFpbWVkVG9kYXkFDmF2YWlsYWJsZVRvZGF5CQCZCgcFDHRvdGFsVmVzdGluZwAAAP///////////wEA////////////AQD///////////8BAP///////////wEA////////////AQEKYWR2aXNlVXNlcgEHYWRkcmVzcwQLJHQwMzYyOTM3NDUJARJ1c2VyVmVzdGluZ0JhbGFuY2UBBQdhZGRyZXNzBAx0b3RhbFZlc3RpbmcIBQskdDAzNjI5Mzc0NQJfMQQOYWxyZWFkeUNsYWltZWQIBQskdDAzNjI5Mzc0NQJfMgQIZWxpZ2libGUIBQskdDAzNjI5Mzc0NQJfMwQFc3RhcnQIBQskdDAzNjI5Mzc0NQJfNAQDZW5kCAULJHQwMzYyOTM3NDUCXzUEDGNsYWltZWRUb2RheQgFCyR0MDM2MjkzNzQ1Al82BA5hdmFpbGFibGVUb2RheQgFCyR0MDM2MjkzNzQ1Al83BAFjCQELdmFsdWVPckVsc2UCCQCfCAEJARFhZGRyZXNzQXNzZXRTdG9yZQIFB2FkZHJlc3MFBHVzZGMAAAQBdAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQERYWRkcmVzc0Fzc2V0U3RvcmUCBQdhZGRyZXNzBQR1c2R0AAAJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCWFkZHJlc3M6IAUHYWRkcmVzcwIQLCB0b3RhbFZlc3Rpbmc6IAkApAMBBQx0b3RhbFZlc3RpbmcCEiwgYWxyZWFkeUNsYWltZWQ6IAkApAMBBQ5hbHJlYWR5Q2xhaW1lZAIMLCBlbGlnaWJsZTogCQCkAwEFCGVsaWdpYmxlAg8sIHN0YXJ0SGVpZ2h0OiAJAKQDAQUFc3RhcnQCDSwgZW5kSGVpZ2h0OiAJAKQDAQUDZW5kAg0sIG5vd0hlaWdodDogCQCkAwEFBkhFSUdIVAIRLCB1c2RjX21pZ3JhdGVkOiAJAKQDAQUBYwIRLCB1c2R0X21pZ3JhdGVkOiAJAKQDAQUBdAIQLCB1c2RjX2Fzc2V0SWQ6IAUEdXNkYwIQLCB1c2R0X2Fzc2V0SWQ6IAUEdXNkdAIOLCBkYWlseUxpbWl0OiAJAKQDAQkAlgMBCQDMCAIJAGkCBQx0b3RhbFZlc3RpbmcA7QIJAMwIAgUQbWluaU1heENsYWltVXNkbgUDbmlsAhAsIGNsYWltZWRUb2RheTogCQCkAwEFDGNsYWltZWRUb2RheQISLCBhdmFpbGFibGVUb2RheTogCQCkAwEFDmF2YWlsYWJsZVRvZGF5ARZ3aXRoZHJhd1Zlc3RlZEludGVybmFsAgdhZGRyZXNzAnRvBAZjaGVja3MJAQlvcEFsbG93ZWQBAhdsaXF1aWRhb193aXRoZHJhd1Zlc3RlZAMJAAACBQZjaGVja3MFBmNoZWNrcwQLJHQwNDY4NzQ4MDMJARJ1c2VyVmVzdGluZ0JhbGFuY2UBBQdhZGRyZXNzBAx0b3RhbFZlc3RpbmcIBQskdDA0Njg3NDgwMwJfMQQOYWxyZWFkeUNsYWltZWQIBQskdDA0Njg3NDgwMwJfMgQIZWxpZ2libGUIBQskdDA0Njg3NDgwMwJfMwQFc3RhcnQIBQskdDA0Njg3NDgwMwJfNAQDZW5kCAULJHQwNDY4NzQ4MDMCXzUEDGNsYWltZWRUb2RheQgFCyR0MDQ2ODc0ODAzAl82BA5hdmFpbGFibGVUb2RheQgFCyR0MDQ2ODc0ODAzAl83AwkAZgIAAAUFc3RhcnQJAAIBAhJubyB2ZXN0aW5nIGVuYWJsZWQDCQBnAgAABQ5hdmFpbGFibGVUb2RheQkAAgECEW5vdGhpbmcgYXZhaWxhYmxlCQCUCgIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUCdG8FDmF2YWlsYWJsZVRvZGF5CQDZBAEFBHVzZG4JAMwIAgkBDEludGVnZXJFbnRyeQIJARN2ZXN0aW5nQ2xhaW1lZFN0b3JlAQUHYWRkcmVzcwkAZAIFDmFscmVhZHlDbGFpbWVkBQ5hdmFpbGFibGVUb2RheQkAzAgCCQEIY2hhbmdlQnkCCQETd2l0aGRyYXduVG9kYXlTdG9yZQEFB2FkZHJlc3MFDmF2YWlsYWJsZVRvZGF5BQNuaWwFDmF2YWlsYWJsZVRvZGF5CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJzdgEHYWRkcmVzcwQGY2hlY2tzCQEJb3BBbGxvd2VkAQIVbGlxdWlkYW9fc3RhcnRWZXN0aW5nAwkAAAIFBmNoZWNrcwUGY2hlY2tzBAp1c2VyVFN0b3JlCQERYWRkcmVzc0Fzc2V0U3RvcmUCBQdhZGRyZXNzBQR1c2R0BAp1c2VyQ1N0b3JlCQERYWRkcmVzc0Fzc2V0U3RvcmUCBQdhZGRyZXNzBQR1c2RjBApjb252ZXJ0ZWRDCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFCnVzZXJDU3RvcmUAAAQKY29udmVydGVkVAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQp1c2VyVFN0b3JlAAADCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzCQERdmVzdGluZ1N0YXJ0U3RvcmUBBQdhZGRyZXNzBQNuaWwEByRtYXRjaDAJAJoIAgUEdGhpcwkBFWFkZHJlc3NUb3RhbFVTRE5TdG9yZQEFB2FkZHJlc3MDCQABAgUHJG1hdGNoMAIDSW50BA5zdGFydGVkVmVzdGluZwUHJG1hdGNoMAkAzAgCCQEIY2hhbmdlQnkCAg1jb21taXR0ZWRVU0ROBQ5zdGFydGVkVmVzdGluZwkAzAgCCQENd3JpdGVDb25zdEludAIJARF2ZXN0aW5nU3RhcnRTdG9yZQEFB2FkZHJlc3MFBkhFSUdIVAkAzAgCCQEIY2hhbmdlQnkCCQEPdG90YWxBc3NldFN0b3JlAQUEdXNkYwkBAS0BBQpjb252ZXJ0ZWRDCQDMCAIJAQtEZWxldGVFbnRyeQEFCnVzZXJDU3RvcmUJAMwIAgkBCGNoYW5nZUJ5AgkBD3RvdGFsQXNzZXRTdG9yZQEFBHVzZHQJAQEtAQUKY29udmVydGVkVAkAzAgCCQELRGVsZXRlRW50cnkBBQp1c2VyVFN0b3JlBQNuaWwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgYBaQEEaW5pdAQEY29uZgN0SWQDY0lkA25JZAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEm9ubHkgc2VsZiBjYW4gaW5pdAkAzAgCCQEQd3JpdGVDb25zdFN0cmluZwIFC2NvbmZpZ1N0b3JlBQRjb25mCQDMCAIJARB3cml0ZUNvbnN0U3RyaW5nAgIEdXNkdAUDdElkCQDMCAIJARB3cml0ZUNvbnN0U3RyaW5nAgIEdXNkYwUDY0lkCQDMCAIJARB3cml0ZUNvbnN0U3RyaW5nAgIEdXNkbgUDbklkBQNuaWwBaQEPc3RhcnRWZXN0aW5nQWxsAAkBAnN2AQkApQgBCAUBaQZjYWxsZXIBaQESc3RhcnRWZXN0aW5nQWxsRm9yAQdhZGRyZXNzBAdjaGVja3MwCQEIbWFpbk9ubHkBBQFpAwkAAAIFB2NoZWNrczAFB2NoZWNrczAJAQJzdgEFB2FkZHJlc3MJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOd2l0aGRyYXdWZXN0ZWQABAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgkBFndpdGhkcmF3VmVzdGVkSW50ZXJuYWwCBQdhZGRyZXNzBQdhZGRyZXNzAWkBE3dpdGhkcmF3VmVzdGVkRm9yVG8CA2FjYwJ0bwQHY2hlY2tzMAkBCG1haW5Pbmx5AQUBaQMJAAACBQdjaGVja3MwBQdjaGVja3MwCQEWd2l0aGRyYXdWZXN0ZWRJbnRlcm5hbAIFA2FjYwUCdG8JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHYWR2aXNlVQEDYWNjCQCUCgIFA25pbAkBCmFkdmlzZVVzZXIBBQNhY2MA5VLeZA==", "chainId": 87, "height": 3275644, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HWQ5bBtUFi2Bh4KswDryoi3JKQzz9Sjn15FwnWG2A4dX Next: ENhpdGXWkxmAFgW6MXcm48mYyc2aqYsYp8Sp4MWnQXdA Diff:
OldNewDifferences
129129 }
130130
131131
132+func withdrawVestedInternal (address,to) = {
133+ let checks = opAllowed("liquidao_withdrawVested")
134+ if ((checks == checks))
135+ 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
144+ if ((0 > start))
145+ then throw("no vesting enabled")
146+ else if ((0 >= availableToday))
147+ then throw("nothing available")
148+ else $Tuple2([ScriptTransfer(addressFromStringValue(to), availableToday, fromBase58String(usdn)), IntegerEntry(vestingClaimedStore(address), (alreadyClaimed + availableToday)), changeBy(withdrawnTodayStore(address), availableToday)], availableToday)
149+ }
150+ else throw("Strict value is not equal to itself.")
151+ }
152+
153+
154+func sv (address) = {
155+ let checks = opAllowed("liquidao_startVesting")
156+ if ((checks == checks))
157+ then {
158+ let userTStore = addressAssetStore(address, usdt)
159+ let userCStore = addressAssetStore(address, usdc)
160+ let convertedC = valueOrElse(getInteger(this, userCStore), 0)
161+ let convertedT = valueOrElse(getInteger(this, userTStore), 0)
162+ if (isDefined(getInteger(this, vestingStartStore(address))))
163+ then nil
164+ else match getInteger(this, addressTotalUSDNStore(address)) {
165+ case startedVesting: Int =>
166+[changeBy("committedUSDN", startedVesting), writeConstInt(vestingStartStore(address), HEIGHT), changeBy(totalAssetStore(usdc), -(convertedC)), DeleteEntry(userCStore), changeBy(totalAssetStore(usdt), -(convertedT)), DeleteEntry(userTStore)]
167+ case _ =>
168+ nil
169+ }
170+ }
171+ else throw("Strict value is not equal to itself.")
172+ }
173+
174+
132175 @Callable(i)
133176 func init (conf,tId,cId,nId) = if ((i.caller != this))
134177 then throw("only self can init")
137180
138181
139182 @Callable(i)
140-func startVestingAll () = {
141- let address = toString(i.caller)
142- let checks = opAllowed("liquidao_startVesting")
143- if ((checks == checks))
144- then {
145- let userTStore = addressAssetStore(address, usdt)
146- let userCStore = addressAssetStore(address, usdc)
147- let convertedC = valueOrElse(getInteger(this, userCStore), 0)
148- let convertedT = valueOrElse(getInteger(this, userTStore), 0)
149- let startedVesting = valueOrErrorMessage(getInteger(this, addressTotalUSDNStore(address)), "no accounted for user")
150-[changeBy("committedUSDN", startedVesting), writeConstInt(vestingStartStore(address), HEIGHT), changeBy(totalAssetStore(usdc), -(convertedC)), DeleteEntry(userCStore), changeBy(totalAssetStore(usdt), -(convertedT)), DeleteEntry(userTStore)]
151- }
183+func startVestingAll () = sv(toString(i.caller))
184+
185+
186+
187+@Callable(i)
188+func startVestingAllFor (address) = {
189+ let checks0 = mainOnly(i)
190+ if ((checks0 == checks0))
191+ then sv(address)
152192 else throw("Strict value is not equal to itself.")
153193 }
154194
156196
157197 @Callable(i)
158198 func withdrawVested () = {
159- let checks = opAllowed("liquidao_withdrawVested")
160- if ((checks == checks))
161- then {
162- let address = toString(i.caller)
163- let $t060436159 = userVestingBalance(address)
164- let totalVesting = $t060436159._1
165- let alreadyClaimed = $t060436159._2
166- let eligible = $t060436159._3
167- let start = $t060436159._4
168- let end = $t060436159._5
169- let claimedToday = $t060436159._6
170- let availableToday = $t060436159._7
171- if ((0 > start))
172- then throw("no vesting enabled")
173- else if ((0 >= availableToday))
174- then throw("nothing available")
175- else $Tuple2([ScriptTransfer(i.caller, availableToday, fromBase58String(usdn)), IntegerEntry(vestingClaimedStore(address), (alreadyClaimed + availableToday)), changeBy(withdrawnTodayStore(address), availableToday)], availableToday)
176- }
199+ let address = toString(i.caller)
200+ withdrawVestedInternal(address, address)
201+ }
202+
203+
204+
205+@Callable(i)
206+func withdrawVestedForTo (acc,to) = {
207+ let checks0 = mainOnly(i)
208+ if ((checks0 == checks0))
209+ then withdrawVestedInternal(acc, to)
177210 else throw("Strict value is not equal to itself.")
178211 }
179212
180213
181214
182215 @Callable(i)
183-func accountFor (address,assetId,amount) = {
184- let attached = i.payments[0]
185- let checks = if (if (if (if (mainOnly(i))
186- then opAllowed("liquidao_move")
187- else false)
188- then throwIf((toBase58String(value(attached.assetId)) != usdn), "usdn must be attached")
189- else false)
190- then throwIf((amount > attached.amount), "not enough supplied")
191- else false)
192- then throwIf(if ((assetId != usdc))
193- then (assetId != usdt)
194- else false, "only t or c")
195- else false
196- if ((checks == checks))
197- then [writeConstInt(addressAssetStore(address, assetId), amount), changeBy(addressAssetUSDNStore(address, assetId), attached.amount), changeBy(addressTotalUSDNStore(address), attached.amount), changeBy(totalAssetStore(assetId), amount), changeBy(totalUSDNStore, attached.amount)]
198- else throw("Strict value is not equal to itself.")
199- }
216+func adviseU (acc) = $Tuple2(nil, adviseUser(acc))
200217
201218
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func writeConstString (key,value) = if (!(isDefined(getString(this, key))))
55 then StringEntry(key, value)
66 else throw(("already initialized: " + key))
77
88
99 func writeConstInt (key,value) = if (!(isDefined(getInteger(this, key))))
1010 then IntegerEntry(key, value)
1111 else throw(("already initialized: " + key))
1212
1313
1414 func writeInt (key,value) = if ((0 > value))
1515 then throw(((("writing negative value " + toString(value)) + " for key ") + key))
1616 else IntegerEntry(key, value)
1717
1818
1919 func changeBy (key,value) = writeInt(key, (valueOrElse(getInteger(this, key), 0) + value))
2020
2121
2222 let configStore = "config"
2323
2424 let configAddress = addressFromStringValue(getStringValue(this, configStore))
2525
2626 let maybeOracleAddress = match getString(configAddress, "oracle_address") {
2727 case s: String =>
2828 addressFromString(s)
2929 case _ =>
3030 unit
3131 }
3232
3333 let HEIGHT = height
3434
3535 func opAllowed (op) = match invoke(configAddress, "opAllowed", ["usdn", op], nil) {
3636 case b: Boolean =>
3737 if (b)
3838 then true
3939 else throw("not allowed")
4040 case _ =>
4141 throw("opAllowed: unexpected result type")
4242 }
4343
4444
4545 func mainOnly (i) = if (contains(getStringValue(configAddress, "main"), toString(i.caller)))
4646 then true
4747 else throw("only main can do")
4848
4949
5050 func throwIf (condition,error) = if (condition)
5151 then throw(error)
5252 else true
5353
5454
5555 let TIMEFRAME = 1440
5656
5757 let usdc = getStringValue(this, "usdc")
5858
5959 let usdt = getStringValue(this, "usdt")
6060
6161 let usdn = getStringValue(this, "usdn")
6262
6363 func addressAssetStore (address,assetId) = ((address + "_") + assetId)
6464
6565
6666 func addressAssetUSDNStore (address,assetId) = (((address + "_") + assetId) + "_usdn")
6767
6868
6969 func addressTotalUSDNStore (address) = (address + "_usdn")
7070
7171
7272 func totalAssetStore (assetId) = ("total_" + assetId)
7373
7474
7575 func vestingStartStore (address) = (address + "_vesting_start")
7676
7777
7878 func vestingClaimedStore (address) = (address + "_claimed")
7979
8080
8181 func withdrawnWithinEpochStore (epochStart,address,assetId) = (((((address + "_") + assetId) + "_") + toString(epochStart)) + "_withdrawn_within_epoch")
8282
8383
8484 let currentEpochStart = ((HEIGHT / TIMEFRAME) * TIMEFRAME)
8585
8686 let miniMaxClaimUsdn = valueOrElse(getInteger(configAddress, "minimaxVestingUsdn"), (1000 * 1000000))
8787
8888 let totalUSDNStore = "total_usdn"
8989
9090 let vestingPeriod = (1440 * 365)
9191
9292 func withdrawnTodayStore (address) = withdrawnWithinEpochStore(currentEpochStart, address, usdn)
9393
9494
9595 func withdrawnToday (address) = valueOrElse(getInteger(withdrawnTodayStore(address)), 0)
9696
9797
9898 func userVestingBalance (address) = {
9999 let cUSDN = valueOrElse(getInteger(addressAssetUSDNStore(address, usdc)), 0)
100100 let tUSDN = valueOrElse(getInteger(addressAssetUSDNStore(address, usdt)), 0)
101101 let totalVesting = (cUSDN + tUSDN)
102102 let alreadyClaimed = valueOrElse(getInteger(vestingClaimedStore(address)), 0)
103103 let claimedToday = withdrawnToday(address)
104104 match getInteger(this, vestingStartStore(address)) {
105105 case vestingStart: Int =>
106106 let eligible = if ((HEIGHT > (vestingStart + vestingPeriod)))
107107 then totalVesting
108108 else fraction(totalVesting, (HEIGHT - vestingStart), vestingPeriod)
109109 let availableToday = min([(eligible - alreadyClaimed), (max([miniMaxClaimUsdn, (totalVesting / 365)]) - claimedToday)])
110110 $Tuple7(totalVesting, alreadyClaimed, eligible, vestingStart, (vestingStart + vestingPeriod), claimedToday, availableToday)
111111 case _ =>
112112 $Tuple7(totalVesting, 0, -1, -1, -1, -1, -1)
113113 }
114114 }
115115
116116
117117 func adviseUser (address) = {
118118 let $t036293745 = userVestingBalance(address)
119119 let totalVesting = $t036293745._1
120120 let alreadyClaimed = $t036293745._2
121121 let eligible = $t036293745._3
122122 let start = $t036293745._4
123123 let end = $t036293745._5
124124 let claimedToday = $t036293745._6
125125 let availableToday = $t036293745._7
126126 let c = valueOrElse(getInteger(addressAssetStore(address, usdc)), 0)
127127 let t = valueOrElse(getInteger(addressAssetStore(address, usdt)), 0)
128128 ((((((((((((((((((((((((((("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))
129129 }
130130
131131
132+func withdrawVestedInternal (address,to) = {
133+ let checks = opAllowed("liquidao_withdrawVested")
134+ if ((checks == checks))
135+ 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
144+ if ((0 > start))
145+ then throw("no vesting enabled")
146+ else if ((0 >= availableToday))
147+ then throw("nothing available")
148+ else $Tuple2([ScriptTransfer(addressFromStringValue(to), availableToday, fromBase58String(usdn)), IntegerEntry(vestingClaimedStore(address), (alreadyClaimed + availableToday)), changeBy(withdrawnTodayStore(address), availableToday)], availableToday)
149+ }
150+ else throw("Strict value is not equal to itself.")
151+ }
152+
153+
154+func sv (address) = {
155+ let checks = opAllowed("liquidao_startVesting")
156+ if ((checks == checks))
157+ then {
158+ let userTStore = addressAssetStore(address, usdt)
159+ let userCStore = addressAssetStore(address, usdc)
160+ let convertedC = valueOrElse(getInteger(this, userCStore), 0)
161+ let convertedT = valueOrElse(getInteger(this, userTStore), 0)
162+ if (isDefined(getInteger(this, vestingStartStore(address))))
163+ then nil
164+ else match getInteger(this, addressTotalUSDNStore(address)) {
165+ case startedVesting: Int =>
166+[changeBy("committedUSDN", startedVesting), writeConstInt(vestingStartStore(address), HEIGHT), changeBy(totalAssetStore(usdc), -(convertedC)), DeleteEntry(userCStore), changeBy(totalAssetStore(usdt), -(convertedT)), DeleteEntry(userTStore)]
167+ case _ =>
168+ nil
169+ }
170+ }
171+ else throw("Strict value is not equal to itself.")
172+ }
173+
174+
132175 @Callable(i)
133176 func init (conf,tId,cId,nId) = if ((i.caller != this))
134177 then throw("only self can init")
135178 else [writeConstString(configStore, conf), writeConstString("usdt", tId), writeConstString("usdc", cId), writeConstString("usdn", nId)]
136179
137180
138181
139182 @Callable(i)
140-func startVestingAll () = {
141- let address = toString(i.caller)
142- let checks = opAllowed("liquidao_startVesting")
143- if ((checks == checks))
144- then {
145- let userTStore = addressAssetStore(address, usdt)
146- let userCStore = addressAssetStore(address, usdc)
147- let convertedC = valueOrElse(getInteger(this, userCStore), 0)
148- let convertedT = valueOrElse(getInteger(this, userTStore), 0)
149- let startedVesting = valueOrErrorMessage(getInteger(this, addressTotalUSDNStore(address)), "no accounted for user")
150-[changeBy("committedUSDN", startedVesting), writeConstInt(vestingStartStore(address), HEIGHT), changeBy(totalAssetStore(usdc), -(convertedC)), DeleteEntry(userCStore), changeBy(totalAssetStore(usdt), -(convertedT)), DeleteEntry(userTStore)]
151- }
183+func startVestingAll () = sv(toString(i.caller))
184+
185+
186+
187+@Callable(i)
188+func startVestingAllFor (address) = {
189+ let checks0 = mainOnly(i)
190+ if ((checks0 == checks0))
191+ then sv(address)
152192 else throw("Strict value is not equal to itself.")
153193 }
154194
155195
156196
157197 @Callable(i)
158198 func withdrawVested () = {
159- let checks = opAllowed("liquidao_withdrawVested")
160- if ((checks == checks))
161- then {
162- let address = toString(i.caller)
163- let $t060436159 = userVestingBalance(address)
164- let totalVesting = $t060436159._1
165- let alreadyClaimed = $t060436159._2
166- let eligible = $t060436159._3
167- let start = $t060436159._4
168- let end = $t060436159._5
169- let claimedToday = $t060436159._6
170- let availableToday = $t060436159._7
171- if ((0 > start))
172- then throw("no vesting enabled")
173- else if ((0 >= availableToday))
174- then throw("nothing available")
175- else $Tuple2([ScriptTransfer(i.caller, availableToday, fromBase58String(usdn)), IntegerEntry(vestingClaimedStore(address), (alreadyClaimed + availableToday)), changeBy(withdrawnTodayStore(address), availableToday)], availableToday)
176- }
199+ let address = toString(i.caller)
200+ withdrawVestedInternal(address, address)
201+ }
202+
203+
204+
205+@Callable(i)
206+func withdrawVestedForTo (acc,to) = {
207+ let checks0 = mainOnly(i)
208+ if ((checks0 == checks0))
209+ then withdrawVestedInternal(acc, to)
177210 else throw("Strict value is not equal to itself.")
178211 }
179212
180213
181214
182215 @Callable(i)
183-func accountFor (address,assetId,amount) = {
184- let attached = i.payments[0]
185- let checks = if (if (if (if (mainOnly(i))
186- then opAllowed("liquidao_move")
187- else false)
188- then throwIf((toBase58String(value(attached.assetId)) != usdn), "usdn must be attached")
189- else false)
190- then throwIf((amount > attached.amount), "not enough supplied")
191- else false)
192- then throwIf(if ((assetId != usdc))
193- then (assetId != usdt)
194- else false, "only t or c")
195- else false
196- if ((checks == checks))
197- then [writeConstInt(addressAssetStore(address, assetId), amount), changeBy(addressAssetUSDNStore(address, assetId), attached.amount), changeBy(addressTotalUSDNStore(address), attached.amount), changeBy(totalAssetStore(assetId), amount), changeBy(totalUSDNStore, attached.amount)]
198- else throw("Strict value is not equal to itself.")
199- }
216+func adviseU (acc) = $Tuple2(nil, adviseUser(acc))
200217
201218

github/deemru/w8io/6500d08 
42.03 ms