2022.08.05 12:39 [3236525] smart account 3P3VTtUiwJ91Ly7vwtRVKv5NkNNiPoWe7oP > SELF 0.00000000 Waves

{ "type": 13, "id": "HWQ5bBtUFi2Bh4KswDryoi3JKQzz9Sjn15FwnWG2A4dX", "fee": 700000, "feeAssetId": null, "timestamp": 1659692352236, "version": 1, "sender": "3P3VTtUiwJ91Ly7vwtRVKv5NkNNiPoWe7oP", "senderPublicKey": "5q25v77G7b2qAcdzH88H2Y7mxXnddbN9ZYKCn3Q8W6Pi", "proofs": [ "BBDvzrnUxJ8UsGCXSZyskHCak89W5Ns8oec5KWjFtcUZidqY1Ksbzkre6tMsqecVy7WCuBurrxxbNsjZzW8weze" ], "script": "base64:BgIVCAISBgoECAgICBIAEgASBQoDCAgBHgEQd3JpdGVDb25zdFN0cmluZwIDa2V5BXZhbHVlAwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzBQNrZXkJAQtTdHJpbmdFbnRyeQIFA2tleQUFdmFsdWUJAAIBCQCsAgICFWFscmVhZHkgaW5pdGlhbGl6ZWQ6IAUDa2V5AQ13cml0ZUNvbnN0SW50AgNrZXkFdmFsdWUDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMFA2tleQkBDEludGVnZXJFbnRyeQIFA2tleQUFdmFsdWUJAAIBCQCsAgICFWFscmVhZHkgaW5pdGlhbGl6ZWQ6IAUDa2V5AQh3cml0ZUludAIDa2V5BXZhbHVlAwkAZgIAAAUFdmFsdWUJAAIBCQCsAgIJAKwCAgkArAICAhd3cml0aW5nIG5lZ2F0aXZlIHZhbHVlIAkApAMBBQV2YWx1ZQIJIGZvciBrZXkgBQNrZXkJAQxJbnRlZ2VyRW50cnkCBQNrZXkFBXZhbHVlAQhjaGFuZ2VCeQIDa2V5BXZhbHVlCQEId3JpdGVJbnQCBQNrZXkJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAABQV2YWx1ZQALY29uZmlnU3RvcmUCBmNvbmZpZwANY29uZmlnQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwULY29uZmlnU3RvcmUAEm1heWJlT3JhY2xlQWRkcmVzcwQHJG1hdGNoMAkAnQgCBQ1jb25maWdBZGRyZXNzAg5vcmFjbGVfYWRkcmVzcwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJAKYIAQUBcwUEdW5pdAAGSEVJR0hUBQZoZWlnaHQBCW9wQWxsb3dlZAECb3AEByRtYXRjaDAJAPwHBAUNY29uZmlnQWRkcmVzcwIJb3BBbGxvd2VkCQDMCAICBHVzZG4JAMwIAgUCb3AFA25pbAUDbmlsAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWIFByRtYXRjaDADBQFiBgkAAgECC25vdCBhbGxvd2VkCQACAQIhb3BBbGxvd2VkOiB1bmV4cGVjdGVkIHJlc3VsdCB0eXBlAQhtYWluT25seQEBaQMJAQhjb250YWlucwIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFDWNvbmZpZ0FkZHJlc3MCBG1haW4JAKUIAQgFAWkGY2FsbGVyBgkAAgECEG9ubHkgbWFpbiBjYW4gZG8BB3Rocm93SWYCCWNvbmRpdGlvbgVlcnJvcgMFCWNvbmRpdGlvbgkAAgEFBWVycm9yBgAJVElNRUZSQU1FAKALAAR1c2RjCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzAgR1c2RjAAR1c2R0CQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzAgR1c2R0AAR1c2RuCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzAgR1c2RuARFhZGRyZXNzQXNzZXRTdG9yZQIHYWRkcmVzcwdhc3NldElkCQCsAgIJAKwCAgUHYWRkcmVzcwIBXwUHYXNzZXRJZAEVYWRkcmVzc0Fzc2V0VVNETlN0b3JlAgdhZGRyZXNzB2Fzc2V0SWQJAKwCAgkArAICCQCsAgIFB2FkZHJlc3MCAV8FB2Fzc2V0SWQCBV91c2RuARVhZGRyZXNzVG90YWxVU0ROU3RvcmUBB2FkZHJlc3MJAKwCAgUHYWRkcmVzcwIFX3VzZG4BD3RvdGFsQXNzZXRTdG9yZQEHYXNzZXRJZAkArAICAgZ0b3RhbF8FB2Fzc2V0SWQBEXZlc3RpbmdTdGFydFN0b3JlAQdhZGRyZXNzCQCsAgIFB2FkZHJlc3MCDl92ZXN0aW5nX3N0YXJ0ARN2ZXN0aW5nQ2xhaW1lZFN0b3JlAQdhZGRyZXNzCQCsAgIFB2FkZHJlc3MCCF9jbGFpbWVkARl3aXRoZHJhd25XaXRoaW5FcG9jaFN0b3JlAwplcG9jaFN0YXJ0B2FkZHJlc3MHYXNzZXRJZAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFB2FkZHJlc3MCAV8FB2Fzc2V0SWQCAV8JAKQDAQUKZXBvY2hTdGFydAIXX3dpdGhkcmF3bl93aXRoaW5fZXBvY2gAEWN1cnJlbnRFcG9jaFN0YXJ0CQBoAgkAaQIFBkhFSUdIVAUJVElNRUZSQU1FBQlUSU1FRlJBTUUAEG1pbmlNYXhDbGFpbVVzZG4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUNY29uZmlnQWRkcmVzcwISbWluaW1heFZlc3RpbmdVc2RuCQBoAgDoBwDAhD0ADnRvdGFsVVNETlN0b3JlAgp0b3RhbF91c2RuAA12ZXN0aW5nUGVyaW9kCQBoAgCgCwDtAgETd2l0aGRyYXduVG9kYXlTdG9yZQEHYWRkcmVzcwkBGXdpdGhkcmF3bldpdGhpbkVwb2NoU3RvcmUDBRFjdXJyZW50RXBvY2hTdGFydAUHYWRkcmVzcwUEdXNkbgEOd2l0aGRyYXduVG9kYXkBB2FkZHJlc3MJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBE3dpdGhkcmF3blRvZGF5U3RvcmUBBQdhZGRyZXNzAAABEnVzZXJWZXN0aW5nQmFsYW5jZQEHYWRkcmVzcwQFY1VTRE4JAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFWFkZHJlc3NBc3NldFVTRE5TdG9yZQIFB2FkZHJlc3MFBHVzZGMAAAQFdFVTRE4JAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFWFkZHJlc3NBc3NldFVTRE5TdG9yZQIFB2FkZHJlc3MFBHVzZHQAAAQMdG90YWxWZXN0aW5nCQBkAgUFY1VTRE4FBXRVU0ROBA5hbHJlYWR5Q2xhaW1lZAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQETdmVzdGluZ0NsYWltZWRTdG9yZQEFB2FkZHJlc3MAAAQMY2xhaW1lZFRvZGF5CQEOd2l0aGRyYXduVG9kYXkBBQdhZGRyZXNzBAckbWF0Y2gwCQCaCAIFBHRoaXMJARF2ZXN0aW5nU3RhcnRTdG9yZQEFB2FkZHJlc3MDCQABAgUHJG1hdGNoMAIDSW50BAx2ZXN0aW5nU3RhcnQFByRtYXRjaDAECGVsaWdpYmxlAwkAZgIFBkhFSUdIVAkAZAIFDHZlc3RpbmdTdGFydAUNdmVzdGluZ1BlcmlvZAUMdG90YWxWZXN0aW5nCQBrAwUMdG90YWxWZXN0aW5nCQBlAgUGSEVJR0hUBQx2ZXN0aW5nU3RhcnQFDXZlc3RpbmdQZXJpb2QEDmF2YWlsYWJsZVRvZGF5CQCXAwEJAMwIAgkAZQIFCGVsaWdpYmxlBQ5hbHJlYWR5Q2xhaW1lZAkAzAgCCQBlAgkAlgMBCQDMCAIFEG1pbmlNYXhDbGFpbVVzZG4JAMwIAgkAaQIFDHRvdGFsVmVzdGluZwDtAgUDbmlsBQxjbGFpbWVkVG9kYXkFA25pbAkAmQoHBQx0b3RhbFZlc3RpbmcFDmFscmVhZHlDbGFpbWVkBQhlbGlnaWJsZQUMdmVzdGluZ1N0YXJ0CQBkAgUMdmVzdGluZ1N0YXJ0BQ12ZXN0aW5nUGVyaW9kBQxjbGFpbWVkVG9kYXkFDmF2YWlsYWJsZVRvZGF5CQCZCgcFDHRvdGFsVmVzdGluZwAAAP///////////wEA////////////AQD///////////8BAP///////////wEA////////////AQEKYWR2aXNlVXNlcgEHYWRkcmVzcwQLJHQwMzYyOTM3NDUJARJ1c2VyVmVzdGluZ0JhbGFuY2UBBQdhZGRyZXNzBAx0b3RhbFZlc3RpbmcIBQskdDAzNjI5Mzc0NQJfMQQOYWxyZWFkeUNsYWltZWQIBQskdDAzNjI5Mzc0NQJfMgQIZWxpZ2libGUIBQskdDAzNjI5Mzc0NQJfMwQFc3RhcnQIBQskdDAzNjI5Mzc0NQJfNAQDZW5kCAULJHQwMzYyOTM3NDUCXzUEDGNsYWltZWRUb2RheQgFCyR0MDM2MjkzNzQ1Al82BA5hdmFpbGFibGVUb2RheQgFCyR0MDM2MjkzNzQ1Al83BAFjCQELdmFsdWVPckVsc2UCCQCfCAEJARFhZGRyZXNzQXNzZXRTdG9yZQIFB2FkZHJlc3MFBHVzZGMAAAQBdAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQERYWRkcmVzc0Fzc2V0U3RvcmUCBQdhZGRyZXNzBQR1c2R0AAAJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCWFkZHJlc3M6IAUHYWRkcmVzcwIQLCB0b3RhbFZlc3Rpbmc6IAkApAMBBQx0b3RhbFZlc3RpbmcCEiwgYWxyZWFkeUNsYWltZWQ6IAkApAMBBQ5hbHJlYWR5Q2xhaW1lZAIMLCBlbGlnaWJsZTogCQCkAwEFCGVsaWdpYmxlAg8sIHN0YXJ0SGVpZ2h0OiAJAKQDAQUFc3RhcnQCDSwgZW5kSGVpZ2h0OiAJAKQDAQUDZW5kAg0sIG5vd0hlaWdodDogCQCkAwEFBkhFSUdIVAIRLCB1c2RjX21pZ3JhdGVkOiAJAKQDAQUBYwIRLCB1c2R0X21pZ3JhdGVkOiAJAKQDAQUBdAIQLCB1c2RjX2Fzc2V0SWQ6IAUEdXNkYwIQLCB1c2R0X2Fzc2V0SWQ6IAUEdXNkdAIOLCBkYWlseUxpbWl0OiAJAKQDAQkAlgMBCQDMCAIJAGkCBQx0b3RhbFZlc3RpbmcA7QIJAMwIAgUQbWluaU1heENsYWltVXNkbgUDbmlsAhAsIGNsYWltZWRUb2RheTogCQCkAwEFDGNsYWltZWRUb2RheQISLCBhdmFpbGFibGVUb2RheTogCQCkAwEFDmF2YWlsYWJsZVRvZGF5BAFpAQRpbml0BARjb25mA3RJZANjSWQDbklkAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQISb25seSBzZWxmIGNhbiBpbml0CQDMCAIJARB3cml0ZUNvbnN0U3RyaW5nAgULY29uZmlnU3RvcmUFBGNvbmYJAMwIAgkBEHdyaXRlQ29uc3RTdHJpbmcCAgR1c2R0BQN0SWQJAMwIAgkBEHdyaXRlQ29uc3RTdHJpbmcCAgR1c2RjBQNjSWQJAMwIAgkBEHdyaXRlQ29uc3RTdHJpbmcCAgR1c2RuBQNuSWQFA25pbAFpAQ9zdGFydFZlc3RpbmdBbGwABAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgQGY2hlY2tzCQEJb3BBbGxvd2VkAQIVbGlxdWlkYW9fc3RhcnRWZXN0aW5nAwkAAAIFBmNoZWNrcwUGY2hlY2tzBAp1c2VyVFN0b3JlCQERYWRkcmVzc0Fzc2V0U3RvcmUCBQdhZGRyZXNzBQR1c2R0BAp1c2VyQ1N0b3JlCQERYWRkcmVzc0Fzc2V0U3RvcmUCBQdhZGRyZXNzBQR1c2RjBApjb252ZXJ0ZWRDCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFCnVzZXJDU3RvcmUAAAQKY29udmVydGVkVAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQp1c2VyVFN0b3JlAAAEDnN0YXJ0ZWRWZXN0aW5nCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkBFWFkZHJlc3NUb3RhbFVTRE5TdG9yZQEFB2FkZHJlc3MCFW5vIGFjY291bnRlZCBmb3IgdXNlcgkAzAgCCQEIY2hhbmdlQnkCAg1jb21taXR0ZWRVU0ROBQ5zdGFydGVkVmVzdGluZwkAzAgCCQENd3JpdGVDb25zdEludAIJARF2ZXN0aW5nU3RhcnRTdG9yZQEFB2FkZHJlc3MFBkhFSUdIVAkAzAgCCQEIY2hhbmdlQnkCCQEPdG90YWxBc3NldFN0b3JlAQUEdXNkYwkBAS0BBQpjb252ZXJ0ZWRDCQDMCAIJAQtEZWxldGVFbnRyeQEFCnVzZXJDU3RvcmUJAMwIAgkBCGNoYW5nZUJ5AgkBD3RvdGFsQXNzZXRTdG9yZQEFBHVzZHQJAQEtAQUKY29udmVydGVkVAkAzAgCCQELRGVsZXRlRW50cnkBBQp1c2VyVFN0b3JlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOd2l0aGRyYXdWZXN0ZWQABAZjaGVja3MJAQlvcEFsbG93ZWQBAhdsaXF1aWRhb193aXRoZHJhd1Zlc3RlZAMJAAACBQZjaGVja3MFBmNoZWNrcwQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIECyR0MDYwNDM2MTU5CQESdXNlclZlc3RpbmdCYWxhbmNlAQUHYWRkcmVzcwQMdG90YWxWZXN0aW5nCAULJHQwNjA0MzYxNTkCXzEEDmFscmVhZHlDbGFpbWVkCAULJHQwNjA0MzYxNTkCXzIECGVsaWdpYmxlCAULJHQwNjA0MzYxNTkCXzMEBXN0YXJ0CAULJHQwNjA0MzYxNTkCXzQEA2VuZAgFCyR0MDYwNDM2MTU5Al81BAxjbGFpbWVkVG9kYXkIBQskdDA2MDQzNjE1OQJfNgQOYXZhaWxhYmxlVG9kYXkIBQskdDA2MDQzNjE1OQJfNwMJAGYCAAAFBXN0YXJ0CQACAQISbm8gdmVzdGluZyBlbmFibGVkAwkAZwIAAAUOYXZhaWxhYmxlVG9kYXkJAAIBAhFub3RoaW5nIGF2YWlsYWJsZQkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUOYXZhaWxhYmxlVG9kYXkJANkEAQUEdXNkbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBE3Zlc3RpbmdDbGFpbWVkU3RvcmUBBQdhZGRyZXNzCQBkAgUOYWxyZWFkeUNsYWltZWQFDmF2YWlsYWJsZVRvZGF5CQDMCAIJAQhjaGFuZ2VCeQIJARN3aXRoZHJhd25Ub2RheVN0b3JlAQUHYWRkcmVzcwUOYXZhaWxhYmxlVG9kYXkFA25pbAUOYXZhaWxhYmxlVG9kYXkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKYWNjb3VudEZvcgMHYWRkcmVzcwdhc3NldElkBmFtb3VudAQIYXR0YWNoZWQJAJEDAggFAWkIcGF5bWVudHMAAAQGY2hlY2tzAwMDAwkBCG1haW5Pbmx5AQUBaQkBCW9wQWxsb3dlZAECDWxpcXVpZGFvX21vdmUHCQEHdGhyb3dJZgIJAQIhPQIJANgEAQkBBXZhbHVlAQgFCGF0dGFjaGVkB2Fzc2V0SWQFBHVzZG4CFXVzZG4gbXVzdCBiZSBhdHRhY2hlZAcJAQd0aHJvd0lmAgkAZgIFBmFtb3VudAgFCGF0dGFjaGVkBmFtb3VudAITbm90IGVub3VnaCBzdXBwbGllZAcJAQd0aHJvd0lmAgMJAQIhPQIFB2Fzc2V0SWQFBHVzZGMJAQIhPQIFB2Fzc2V0SWQFBHVzZHQHAgtvbmx5IHQgb3IgYwcDCQAAAgUGY2hlY2tzBQZjaGVja3MJAMwIAgkBDXdyaXRlQ29uc3RJbnQCCQERYWRkcmVzc0Fzc2V0U3RvcmUCBQdhZGRyZXNzBQdhc3NldElkBQZhbW91bnQJAMwIAgkBCGNoYW5nZUJ5AgkBFWFkZHJlc3NBc3NldFVTRE5TdG9yZQIFB2FkZHJlc3MFB2Fzc2V0SWQIBQhhdHRhY2hlZAZhbW91bnQJAMwIAgkBCGNoYW5nZUJ5AgkBFWFkZHJlc3NUb3RhbFVTRE5TdG9yZQEFB2FkZHJlc3MIBQhhdHRhY2hlZAZhbW91bnQJAMwIAgkBCGNoYW5nZUJ5AgkBD3RvdGFsQXNzZXRTdG9yZQEFB2Fzc2V0SWQFBmFtb3VudAkAzAgCCQEIY2hhbmdlQnkCBQ50b3RhbFVTRE5TdG9yZQgFCGF0dGFjaGVkBmFtb3VudAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAKG832w=", "chainId": 87, "height": 3236525, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7rotTFSzFy2o2Q4PVnSTbhKtVoDxY2KNC5cnVLf9jKik Next: c9okMe8f9WB98km9MkqULxiBt4M2WYrzNreEdzQSFY2 Diff:
OldNewDifferences
5252 else true
5353
5454
55+let TIMEFRAME = 1440
56+
5557 let usdc = getStringValue(this, "usdc")
5658
5759 let usdt = getStringValue(this, "usdt")
7678 func vestingClaimedStore (address) = (address + "_claimed")
7779
7880
81+func withdrawnWithinEpochStore (epochStart,address,assetId) = (((((address + "_") + assetId) + "_") + toString(epochStart)) + "_withdrawn_within_epoch")
82+
83+
84+let currentEpochStart = ((HEIGHT / TIMEFRAME) * TIMEFRAME)
85+
86+let miniMaxClaimUsdn = valueOrElse(getInteger(configAddress, "minimaxVestingUsdn"), (1000 * 1000000))
87+
7988 let totalUSDNStore = "total_usdn"
8089
8190 let vestingPeriod = (1440 * 365)
91+
92+func withdrawnTodayStore (address) = withdrawnWithinEpochStore(currentEpochStart, address, usdn)
93+
94+
95+func withdrawnToday (address) = valueOrElse(getInteger(withdrawnTodayStore(address)), 0)
96+
8297
8398 func userVestingBalance (address) = {
8499 let cUSDN = valueOrElse(getInteger(addressAssetUSDNStore(address, usdc)), 0)
85100 let tUSDN = valueOrElse(getInteger(addressAssetUSDNStore(address, usdt)), 0)
86101 let totalVesting = (cUSDN + tUSDN)
87102 let alreadyClaimed = valueOrElse(getInteger(vestingClaimedStore(address)), 0)
103+ let claimedToday = withdrawnToday(address)
88104 match getInteger(this, vestingStartStore(address)) {
89105 case vestingStart: Int =>
90106 let eligible = if ((HEIGHT > (vestingStart + vestingPeriod)))
91107 then totalVesting
92108 else fraction(totalVesting, (HEIGHT - vestingStart), vestingPeriod)
93- $Tuple5(totalVesting, alreadyClaimed, eligible, vestingStart, (vestingStart + vestingPeriod))
109+ let availableToday = min([(eligible - alreadyClaimed), (max([miniMaxClaimUsdn, (totalVesting / 365)]) - claimedToday)])
110+ $Tuple7(totalVesting, alreadyClaimed, eligible, vestingStart, (vestingStart + vestingPeriod), claimedToday, availableToday)
94111 case _ =>
95- $Tuple5(totalVesting, 0, -1, -1, -1)
112+ $Tuple7(totalVesting, 0, -1, -1, -1, -1, -1)
96113 }
97114 }
98115
99116
100117 func adviseUser (address) = {
101- let $t028792965 = userVestingBalance(address)
102- let totalVesting = $t028792965._1
103- let alreadyClaimed = $t028792965._2
104- let eligible = $t028792965._3
105- let start = $t028792965._4
106- let end = $t028792965._5
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
107126 let c = valueOrElse(getInteger(addressAssetStore(address, usdc)), 0)
108127 let t = valueOrElse(getInteger(addressAssetStore(address, usdt)), 0)
109- ((((((((((((((((((((("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)
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))
110129 }
111130
112131
141160 if ((checks == checks))
142161 then {
143162 let address = toString(i.caller)
144- let $t050695155 = userVestingBalance(address)
145- let totalVesting = $t050695155._1
146- let alreadyClaimed = $t050695155._2
147- let eligible = $t050695155._3
148- let start = $t050695155._4
149- let end = $t050695155._5
150- let available = (eligible - alreadyClaimed)
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
151171 if ((0 > start))
152172 then throw("no vesting enabled")
153- else if ((available == 0))
154- then $Tuple2(nil, 0)
155- else $Tuple2([ScriptTransfer(i.caller, available, fromBase58String(usdn)), IntegerEntry(vestingClaimedStore(address), (alreadyClaimed + available))], available)
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)
156176 }
157177 else throw("Strict value is not equal to itself.")
158178 }
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
55+let TIMEFRAME = 1440
56+
5557 let usdc = getStringValue(this, "usdc")
5658
5759 let usdt = getStringValue(this, "usdt")
5860
5961 let usdn = getStringValue(this, "usdn")
6062
6163 func addressAssetStore (address,assetId) = ((address + "_") + assetId)
6264
6365
6466 func addressAssetUSDNStore (address,assetId) = (((address + "_") + assetId) + "_usdn")
6567
6668
6769 func addressTotalUSDNStore (address) = (address + "_usdn")
6870
6971
7072 func totalAssetStore (assetId) = ("total_" + assetId)
7173
7274
7375 func vestingStartStore (address) = (address + "_vesting_start")
7476
7577
7678 func vestingClaimedStore (address) = (address + "_claimed")
7779
7880
81+func withdrawnWithinEpochStore (epochStart,address,assetId) = (((((address + "_") + assetId) + "_") + toString(epochStart)) + "_withdrawn_within_epoch")
82+
83+
84+let currentEpochStart = ((HEIGHT / TIMEFRAME) * TIMEFRAME)
85+
86+let miniMaxClaimUsdn = valueOrElse(getInteger(configAddress, "minimaxVestingUsdn"), (1000 * 1000000))
87+
7988 let totalUSDNStore = "total_usdn"
8089
8190 let vestingPeriod = (1440 * 365)
91+
92+func withdrawnTodayStore (address) = withdrawnWithinEpochStore(currentEpochStart, address, usdn)
93+
94+
95+func withdrawnToday (address) = valueOrElse(getInteger(withdrawnTodayStore(address)), 0)
96+
8297
8398 func userVestingBalance (address) = {
8499 let cUSDN = valueOrElse(getInteger(addressAssetUSDNStore(address, usdc)), 0)
85100 let tUSDN = valueOrElse(getInteger(addressAssetUSDNStore(address, usdt)), 0)
86101 let totalVesting = (cUSDN + tUSDN)
87102 let alreadyClaimed = valueOrElse(getInteger(vestingClaimedStore(address)), 0)
103+ let claimedToday = withdrawnToday(address)
88104 match getInteger(this, vestingStartStore(address)) {
89105 case vestingStart: Int =>
90106 let eligible = if ((HEIGHT > (vestingStart + vestingPeriod)))
91107 then totalVesting
92108 else fraction(totalVesting, (HEIGHT - vestingStart), vestingPeriod)
93- $Tuple5(totalVesting, alreadyClaimed, eligible, vestingStart, (vestingStart + vestingPeriod))
109+ let availableToday = min([(eligible - alreadyClaimed), (max([miniMaxClaimUsdn, (totalVesting / 365)]) - claimedToday)])
110+ $Tuple7(totalVesting, alreadyClaimed, eligible, vestingStart, (vestingStart + vestingPeriod), claimedToday, availableToday)
94111 case _ =>
95- $Tuple5(totalVesting, 0, -1, -1, -1)
112+ $Tuple7(totalVesting, 0, -1, -1, -1, -1, -1)
96113 }
97114 }
98115
99116
100117 func adviseUser (address) = {
101- let $t028792965 = userVestingBalance(address)
102- let totalVesting = $t028792965._1
103- let alreadyClaimed = $t028792965._2
104- let eligible = $t028792965._3
105- let start = $t028792965._4
106- let end = $t028792965._5
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
107126 let c = valueOrElse(getInteger(addressAssetStore(address, usdc)), 0)
108127 let t = valueOrElse(getInteger(addressAssetStore(address, usdt)), 0)
109- ((((((((((((((((((((("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)
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))
110129 }
111130
112131
113132 @Callable(i)
114133 func init (conf,tId,cId,nId) = if ((i.caller != this))
115134 then throw("only self can init")
116135 else [writeConstString(configStore, conf), writeConstString("usdt", tId), writeConstString("usdc", cId), writeConstString("usdn", nId)]
117136
118137
119138
120139 @Callable(i)
121140 func startVestingAll () = {
122141 let address = toString(i.caller)
123142 let checks = opAllowed("liquidao_startVesting")
124143 if ((checks == checks))
125144 then {
126145 let userTStore = addressAssetStore(address, usdt)
127146 let userCStore = addressAssetStore(address, usdc)
128147 let convertedC = valueOrElse(getInteger(this, userCStore), 0)
129148 let convertedT = valueOrElse(getInteger(this, userTStore), 0)
130149 let startedVesting = valueOrErrorMessage(getInteger(this, addressTotalUSDNStore(address)), "no accounted for user")
131150 [changeBy("committedUSDN", startedVesting), writeConstInt(vestingStartStore(address), HEIGHT), changeBy(totalAssetStore(usdc), -(convertedC)), DeleteEntry(userCStore), changeBy(totalAssetStore(usdt), -(convertedT)), DeleteEntry(userTStore)]
132151 }
133152 else throw("Strict value is not equal to itself.")
134153 }
135154
136155
137156
138157 @Callable(i)
139158 func withdrawVested () = {
140159 let checks = opAllowed("liquidao_withdrawVested")
141160 if ((checks == checks))
142161 then {
143162 let address = toString(i.caller)
144- let $t050695155 = userVestingBalance(address)
145- let totalVesting = $t050695155._1
146- let alreadyClaimed = $t050695155._2
147- let eligible = $t050695155._3
148- let start = $t050695155._4
149- let end = $t050695155._5
150- let available = (eligible - alreadyClaimed)
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
151171 if ((0 > start))
152172 then throw("no vesting enabled")
153- else if ((available == 0))
154- then $Tuple2(nil, 0)
155- else $Tuple2([ScriptTransfer(i.caller, available, fromBase58String(usdn)), IntegerEntry(vestingClaimedStore(address), (alreadyClaimed + available))], available)
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)
156176 }
157177 else throw("Strict value is not equal to itself.")
158178 }
159179
160180
161181
162182 @Callable(i)
163183 func accountFor (address,assetId,amount) = {
164184 let attached = i.payments[0]
165185 let checks = if (if (if (if (mainOnly(i))
166186 then opAllowed("liquidao_move")
167187 else false)
168188 then throwIf((toBase58String(value(attached.assetId)) != usdn), "usdn must be attached")
169189 else false)
170190 then throwIf((amount > attached.amount), "not enough supplied")
171191 else false)
172192 then throwIf(if ((assetId != usdc))
173193 then (assetId != usdt)
174194 else false, "only t or c")
175195 else false
176196 if ((checks == checks))
177197 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)]
178198 else throw("Strict value is not equal to itself.")
179199 }
180200
181201

github/deemru/w8io/786bc32 
52.35 ms