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:
Old | New | Differences | |
---|---|---|---|
52 | 52 | else true | |
53 | 53 | ||
54 | 54 | ||
55 | + | let TIMEFRAME = 1440 | |
56 | + | ||
55 | 57 | let usdc = getStringValue(this, "usdc") | |
56 | 58 | ||
57 | 59 | let usdt = getStringValue(this, "usdt") | |
76 | 78 | func vestingClaimedStore (address) = (address + "_claimed") | |
77 | 79 | ||
78 | 80 | ||
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 | + | ||
79 | 88 | let totalUSDNStore = "total_usdn" | |
80 | 89 | ||
81 | 90 | 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 | + | ||
82 | 97 | ||
83 | 98 | func userVestingBalance (address) = { | |
84 | 99 | let cUSDN = valueOrElse(getInteger(addressAssetUSDNStore(address, usdc)), 0) | |
85 | 100 | let tUSDN = valueOrElse(getInteger(addressAssetUSDNStore(address, usdt)), 0) | |
86 | 101 | let totalVesting = (cUSDN + tUSDN) | |
87 | 102 | let alreadyClaimed = valueOrElse(getInteger(vestingClaimedStore(address)), 0) | |
103 | + | let claimedToday = withdrawnToday(address) | |
88 | 104 | match getInteger(this, vestingStartStore(address)) { | |
89 | 105 | case vestingStart: Int => | |
90 | 106 | let eligible = if ((HEIGHT > (vestingStart + vestingPeriod))) | |
91 | 107 | then totalVesting | |
92 | 108 | 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) | |
94 | 111 | case _ => | |
95 | - | $ | |
112 | + | $Tuple7(totalVesting, 0, -1, -1, -1, -1, -1) | |
96 | 113 | } | |
97 | 114 | } | |
98 | 115 | ||
99 | 116 | ||
100 | 117 | 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 | |
107 | 126 | let c = valueOrElse(getInteger(addressAssetStore(address, usdc)), 0) | |
108 | 127 | 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)) | |
110 | 129 | } | |
111 | 130 | ||
112 | 131 | ||
141 | 160 | if ((checks == checks)) | |
142 | 161 | then { | |
143 | 162 | 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 | |
151 | 171 | if ((0 > start)) | |
152 | 172 | then throw("no vesting enabled") | |
153 | - | else if (( | |
154 | - | then | |
155 | - | else $Tuple2([ScriptTransfer(i.caller, | |
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) | |
156 | 176 | } | |
157 | 177 | else throw("Strict value is not equal to itself.") | |
158 | 178 | } |
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 | + | let TIMEFRAME = 1440 | |
56 | + | ||
55 | 57 | let usdc = getStringValue(this, "usdc") | |
56 | 58 | ||
57 | 59 | let usdt = getStringValue(this, "usdt") | |
58 | 60 | ||
59 | 61 | let usdn = getStringValue(this, "usdn") | |
60 | 62 | ||
61 | 63 | func addressAssetStore (address,assetId) = ((address + "_") + assetId) | |
62 | 64 | ||
63 | 65 | ||
64 | 66 | func addressAssetUSDNStore (address,assetId) = (((address + "_") + assetId) + "_usdn") | |
65 | 67 | ||
66 | 68 | ||
67 | 69 | func addressTotalUSDNStore (address) = (address + "_usdn") | |
68 | 70 | ||
69 | 71 | ||
70 | 72 | func totalAssetStore (assetId) = ("total_" + assetId) | |
71 | 73 | ||
72 | 74 | ||
73 | 75 | func vestingStartStore (address) = (address + "_vesting_start") | |
74 | 76 | ||
75 | 77 | ||
76 | 78 | func vestingClaimedStore (address) = (address + "_claimed") | |
77 | 79 | ||
78 | 80 | ||
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 | + | ||
79 | 88 | let totalUSDNStore = "total_usdn" | |
80 | 89 | ||
81 | 90 | 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 | + | ||
82 | 97 | ||
83 | 98 | func userVestingBalance (address) = { | |
84 | 99 | let cUSDN = valueOrElse(getInteger(addressAssetUSDNStore(address, usdc)), 0) | |
85 | 100 | let tUSDN = valueOrElse(getInteger(addressAssetUSDNStore(address, usdt)), 0) | |
86 | 101 | let totalVesting = (cUSDN + tUSDN) | |
87 | 102 | let alreadyClaimed = valueOrElse(getInteger(vestingClaimedStore(address)), 0) | |
103 | + | let claimedToday = withdrawnToday(address) | |
88 | 104 | match getInteger(this, vestingStartStore(address)) { | |
89 | 105 | case vestingStart: Int => | |
90 | 106 | let eligible = if ((HEIGHT > (vestingStart + vestingPeriod))) | |
91 | 107 | then totalVesting | |
92 | 108 | 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) | |
94 | 111 | case _ => | |
95 | - | $ | |
112 | + | $Tuple7(totalVesting, 0, -1, -1, -1, -1, -1) | |
96 | 113 | } | |
97 | 114 | } | |
98 | 115 | ||
99 | 116 | ||
100 | 117 | 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 | |
107 | 126 | let c = valueOrElse(getInteger(addressAssetStore(address, usdc)), 0) | |
108 | 127 | 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)) | |
110 | 129 | } | |
111 | 130 | ||
112 | 131 | ||
113 | 132 | @Callable(i) | |
114 | 133 | func init (conf,tId,cId,nId) = if ((i.caller != this)) | |
115 | 134 | then throw("only self can init") | |
116 | 135 | else [writeConstString(configStore, conf), writeConstString("usdt", tId), writeConstString("usdc", cId), writeConstString("usdn", nId)] | |
117 | 136 | ||
118 | 137 | ||
119 | 138 | ||
120 | 139 | @Callable(i) | |
121 | 140 | func startVestingAll () = { | |
122 | 141 | let address = toString(i.caller) | |
123 | 142 | let checks = opAllowed("liquidao_startVesting") | |
124 | 143 | if ((checks == checks)) | |
125 | 144 | then { | |
126 | 145 | let userTStore = addressAssetStore(address, usdt) | |
127 | 146 | let userCStore = addressAssetStore(address, usdc) | |
128 | 147 | let convertedC = valueOrElse(getInteger(this, userCStore), 0) | |
129 | 148 | let convertedT = valueOrElse(getInteger(this, userTStore), 0) | |
130 | 149 | let startedVesting = valueOrErrorMessage(getInteger(this, addressTotalUSDNStore(address)), "no accounted for user") | |
131 | 150 | [changeBy("committedUSDN", startedVesting), writeConstInt(vestingStartStore(address), HEIGHT), changeBy(totalAssetStore(usdc), -(convertedC)), DeleteEntry(userCStore), changeBy(totalAssetStore(usdt), -(convertedT)), DeleteEntry(userTStore)] | |
132 | 151 | } | |
133 | 152 | else throw("Strict value is not equal to itself.") | |
134 | 153 | } | |
135 | 154 | ||
136 | 155 | ||
137 | 156 | ||
138 | 157 | @Callable(i) | |
139 | 158 | func withdrawVested () = { | |
140 | 159 | let checks = opAllowed("liquidao_withdrawVested") | |
141 | 160 | if ((checks == checks)) | |
142 | 161 | then { | |
143 | 162 | 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 | |
151 | 171 | if ((0 > start)) | |
152 | 172 | then throw("no vesting enabled") | |
153 | - | else if (( | |
154 | - | then | |
155 | - | else $Tuple2([ScriptTransfer(i.caller, | |
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) | |
156 | 176 | } | |
157 | 177 | else throw("Strict value is not equal to itself.") | |
158 | 178 | } | |
159 | 179 | ||
160 | 180 | ||
161 | 181 | ||
162 | 182 | @Callable(i) | |
163 | 183 | func accountFor (address,assetId,amount) = { | |
164 | 184 | let attached = i.payments[0] | |
165 | 185 | let checks = if (if (if (if (mainOnly(i)) | |
166 | 186 | then opAllowed("liquidao_move") | |
167 | 187 | else false) | |
168 | 188 | then throwIf((toBase58String(value(attached.assetId)) != usdn), "usdn must be attached") | |
169 | 189 | else false) | |
170 | 190 | then throwIf((amount > attached.amount), "not enough supplied") | |
171 | 191 | else false) | |
172 | 192 | then throwIf(if ((assetId != usdc)) | |
173 | 193 | then (assetId != usdt) | |
174 | 194 | else false, "only t or c") | |
175 | 195 | else false | |
176 | 196 | if ((checks == checks)) | |
177 | 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)] | |
178 | 198 | else throw("Strict value is not equal to itself.") | |
179 | 199 | } | |
180 | 200 | ||
181 | 201 |
github/deemru/w8io/786bc32 52.35 ms ◑