tx · 4ZehgtFX9NUvJ8bhvbzxqyWLYU5PazU5bhvFEqu3nhCB 3P3VTtUiwJ91Ly7vwtRVKv5NkNNiPoWe7oP: -0.00600000 Waves 2022.07.28 15:33 [3225175] smart account 3P3VTtUiwJ91Ly7vwtRVKv5NkNNiPoWe7oP > SELF 0.00000000 Waves
{ "type": 13, "id": "4ZehgtFX9NUvJ8bhvbzxqyWLYU5PazU5bhvFEqu3nhCB", "fee": 600000, "feeAssetId": null, "timestamp": 1659011580363, "version": 1, "sender": "3P3VTtUiwJ91Ly7vwtRVKv5NkNNiPoWe7oP", "senderPublicKey": "5q25v77G7b2qAcdzH88H2Y7mxXnddbN9ZYKCn3Q8W6Pi", "proofs": [ "42DVSaiwcPsLk7Lsf4LrQ38oKXyPhQ37WeQ53cA6q6AKyjVTbWSAdsqtaXm7zV295yvwnW3Qqz8FYenP7SLzdWAV" ], "script": "base64:BgIVCAISBgoECAgICBIAEgASBQoDCAgBGAEQd3JpdGVDb25zdFN0cmluZwIDa2V5BXZhbHVlAwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzBQNrZXkJAQtTdHJpbmdFbnRyeQIFA2tleQUFdmFsdWUJAAIBCQCsAgICFWFscmVhZHkgaW5pdGlhbGl6ZWQ6IAUDa2V5AQ13cml0ZUNvbnN0SW50AgNrZXkFdmFsdWUDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMFA2tleQkBDEludGVnZXJFbnRyeQIFA2tleQUFdmFsdWUJAAIBCQCsAgICFWFscmVhZHkgaW5pdGlhbGl6ZWQ6IAUDa2V5AQh3cml0ZUludAIDa2V5BXZhbHVlAwkAZgIAAAUFdmFsdWUJAAIBCQCsAgIJAKwCAgkArAICAhd3cml0aW5nIG5lZ2F0aXZlIHZhbHVlIAkApAMBBQV2YWx1ZQIJIGZvciBrZXkgBQNrZXkJAQxJbnRlZ2VyRW50cnkCBQNrZXkFBXZhbHVlAQhjaGFuZ2VCeQIDa2V5BXZhbHVlCQEId3JpdGVJbnQCBQNrZXkJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAABQV2YWx1ZQALY29uZmlnU3RvcmUCBmNvbmZpZwANY29uZmlnQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwULY29uZmlnU3RvcmUAEm1heWJlT3JhY2xlQWRkcmVzcwQHJG1hdGNoMAkAnQgCBQ1jb25maWdBZGRyZXNzAg5vcmFjbGVfYWRkcmVzcwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJAKYIAQUBcwUEdW5pdAAGSEVJR0hUBQZoZWlnaHQBCW9wQWxsb3dlZAECb3AEByRtYXRjaDAJAPwHBAUNY29uZmlnQWRkcmVzcwIJb3BBbGxvd2VkCQDMCAICBHVzZG4JAMwIAgUCb3AFA25pbAUDbmlsAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWIFByRtYXRjaDADBQFiBgkAAgECC25vdCBhbGxvd2VkCQACAQIhb3BBbGxvd2VkOiB1bmV4cGVjdGVkIHJlc3VsdCB0eXBlAQhtYWluT25seQEBaQMJAQhjb250YWlucwIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFDWNvbmZpZ0FkZHJlc3MCBG1haW4JAKUIAQgFAWkGY2FsbGVyBgkAAgECEG9ubHkgbWFpbiBjYW4gZG8BB3Rocm93SWYCCWNvbmRpdGlvbgVlcnJvcgMFCWNvbmRpdGlvbgkAAgEFBWVycm9yBgAEdXNkYwkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwIEdXNkYwAEdXNkdAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwIEdXNkdAAEdXNkbgkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwIEdXNkbgERYWRkcmVzc0Fzc2V0U3RvcmUCB2FkZHJlc3MHYXNzZXRJZAkArAICCQCsAgIFB2FkZHJlc3MCAV8FB2Fzc2V0SWQBFWFkZHJlc3NBc3NldFVTRE5TdG9yZQIHYWRkcmVzcwdhc3NldElkCQCsAgIJAKwCAgkArAICBQdhZGRyZXNzAgFfBQdhc3NldElkAgVfdXNkbgEVYWRkcmVzc1RvdGFsVVNETlN0b3JlAQdhZGRyZXNzCQCsAgIFB2FkZHJlc3MCBV91c2RuAQ90b3RhbEFzc2V0U3RvcmUBB2Fzc2V0SWQJAKwCAgIGdG90YWxfBQdhc3NldElkARF2ZXN0aW5nU3RhcnRTdG9yZQEHYWRkcmVzcwkArAICBQdhZGRyZXNzAg5fdmVzdGluZ19zdGFydAETdmVzdGluZ0NsYWltZWRTdG9yZQEHYWRkcmVzcwkArAICBQdhZGRyZXNzAghfY2xhaW1lZAAOdG90YWxVU0ROU3RvcmUCCnRvdGFsX3VzZG4ADXZlc3RpbmdQZXJpb2QJAGgCAKALAO0CARJ1c2VyVmVzdGluZ0JhbGFuY2UBB2FkZHJlc3MEBWNVU0ROCQELdmFsdWVPckVsc2UCCQCfCAEJARVhZGRyZXNzQXNzZXRVU0ROU3RvcmUCBQdhZGRyZXNzBQR1c2RjAAAEBXRVU0ROCQELdmFsdWVPckVsc2UCCQCfCAEJARVhZGRyZXNzQXNzZXRVU0ROU3RvcmUCBQdhZGRyZXNzBQR1c2R0AAAEDHRvdGFsVmVzdGluZwkAZAIFBWNVU0ROBQV0VVNETgQOYWxyZWFkeUNsYWltZWQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBE3Zlc3RpbmdDbGFpbWVkU3RvcmUBBQdhZGRyZXNzAAAEByRtYXRjaDAJAJoIAgUEdGhpcwkBEXZlc3RpbmdTdGFydFN0b3JlAQUHYWRkcmVzcwMJAAECBQckbWF0Y2gwAgNJbnQEDHZlc3RpbmdTdGFydAUHJG1hdGNoMAQIZWxpZ2libGUDCQBmAgUGSEVJR0hUCQBkAgUMdmVzdGluZ1N0YXJ0BQ12ZXN0aW5nUGVyaW9kBQx0b3RhbFZlc3RpbmcJAGsDBQx0b3RhbFZlc3RpbmcJAGUCBQZIRUlHSFQFDHZlc3RpbmdTdGFydAUNdmVzdGluZ1BlcmlvZAkAlwoFBQx0b3RhbFZlc3RpbmcFDmFscmVhZHlDbGFpbWVkBQhlbGlnaWJsZQUMdmVzdGluZ1N0YXJ0CQBkAgUMdmVzdGluZ1N0YXJ0BQ12ZXN0aW5nUGVyaW9kCQCXCgUFDHRvdGFsVmVzdGluZwAAAP///////////wEA////////////AQD///////////8BAQphZHZpc2VVc2VyAQdhZGRyZXNzBAskdDAyODc5Mjk2NQkBEnVzZXJWZXN0aW5nQmFsYW5jZQEFB2FkZHJlc3MEDHRvdGFsVmVzdGluZwgFCyR0MDI4NzkyOTY1Al8xBA5hbHJlYWR5Q2xhaW1lZAgFCyR0MDI4NzkyOTY1Al8yBAhlbGlnaWJsZQgFCyR0MDI4NzkyOTY1Al8zBAVzdGFydAgFCyR0MDI4NzkyOTY1Al80BANlbmQIBQskdDAyODc5Mjk2NQJfNQQBYwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQERYWRkcmVzc0Fzc2V0U3RvcmUCBQdhZGRyZXNzBQR1c2RjAAAEAXQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBEWFkZHJlc3NBc3NldFN0b3JlAgUHYWRkcmVzcwUEdXNkdAAACQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglhZGRyZXNzOiAFB2FkZHJlc3MCECwgdG90YWxWZXN0aW5nOiAJAKQDAQUMdG90YWxWZXN0aW5nAhIsIGFscmVhZHlDbGFpbWVkOiAJAKQDAQUOYWxyZWFkeUNsYWltZWQCDCwgZWxpZ2libGU6IAkApAMBBQhlbGlnaWJsZQIPLCBzdGFydEhlaWdodDogCQCkAwEFBXN0YXJ0Ag0sIGVuZEhlaWdodDogCQCkAwEFA2VuZAINLCBub3dIZWlnaHQ6IAkApAMBBQZIRUlHSFQCESwgdXNkY19taWdyYXRlZDogCQCkAwEFAWMCESwgdXNkdF9taWdyYXRlZDogCQCkAwEFAXQCECwgdXNkY19hc3NldElkOiAFBHVzZGMCECwgdXNkdF9hc3NldElkOiAFBHVzZHQEAWkBBGluaXQEBGNvbmYDdElkA2NJZANuSWQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhJvbmx5IHNlbGYgY2FuIGluaXQJAMwIAgkBEHdyaXRlQ29uc3RTdHJpbmcCBQtjb25maWdTdG9yZQUEY29uZgkAzAgCCQEQd3JpdGVDb25zdFN0cmluZwICBHVzZHQFA3RJZAkAzAgCCQEQd3JpdGVDb25zdFN0cmluZwICBHVzZGMFA2NJZAkAzAgCCQEQd3JpdGVDb25zdFN0cmluZwICBHVzZG4FA25JZAUDbmlsAWkBD3N0YXJ0VmVzdGluZ0FsbAAEB2FkZHJlc3MJAKUIAQgFAWkGY2FsbGVyBAZjaGVja3MJAQlvcEFsbG93ZWQBAhVsaXF1aWRhb19zdGFydFZlc3RpbmcDCQAAAgUGY2hlY2tzBQZjaGVja3MECnVzZXJUU3RvcmUJARFhZGRyZXNzQXNzZXRTdG9yZQIFB2FkZHJlc3MFBHVzZHQECnVzZXJDU3RvcmUJARFhZGRyZXNzQXNzZXRTdG9yZQIFB2FkZHJlc3MFBHVzZGMECmNvbnZlcnRlZEMJAQt2YWx1ZU9yRWxzZQIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFCnVzZXJDU3RvcmUAAAQKY29udmVydGVkVAkBC3ZhbHVlT3JFbHNlAgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUKdXNlclRTdG9yZQAABA5zdGFydGVkVmVzdGluZwkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBFWFkZHJlc3NUb3RhbFVTRE5TdG9yZQEFB2FkZHJlc3MJAMwIAgkBCGNoYW5nZUJ5AgINY29tbWl0dGVkVVNETgUOc3RhcnRlZFZlc3RpbmcJAMwIAgkBDXdyaXRlQ29uc3RJbnQCCQERdmVzdGluZ1N0YXJ0U3RvcmUBBQdhZGRyZXNzBQZIRUlHSFQJAMwIAgkBCGNoYW5nZUJ5AgkBD3RvdGFsQXNzZXRTdG9yZQEFBHVzZGMJAQEtAQUKY29udmVydGVkQwkAzAgCCQELRGVsZXRlRW50cnkBBQp1c2VyQ1N0b3JlCQDMCAIJAQhjaGFuZ2VCeQIJAQ90b3RhbEFzc2V0U3RvcmUBBQR1c2R0CQEBLQEFCmNvbnZlcnRlZFQJAMwIAgkBC0RlbGV0ZUVudHJ5AQUKdXNlclRTdG9yZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDndpdGhkcmF3VmVzdGVkAAQGY2hlY2tzCQEJb3BBbGxvd2VkAQIXbGlxdWlkYW9fd2l0aGRyYXdWZXN0ZWQDCQAAAgUGY2hlY2tzBQZjaGVja3MEB2FkZHJlc3MJAKUIAQgFAWkGY2FsbGVyBAskdDA1MDM5NTEyNQkBEnVzZXJWZXN0aW5nQmFsYW5jZQEFB2FkZHJlc3MEDHRvdGFsVmVzdGluZwgFCyR0MDUwMzk1MTI1Al8xBA5hbHJlYWR5Q2xhaW1lZAgFCyR0MDUwMzk1MTI1Al8yBAhlbGlnaWJsZQgFCyR0MDUwMzk1MTI1Al8zBAVzdGFydAgFCyR0MDUwMzk1MTI1Al80BANlbmQIBQskdDA1MDM5NTEyNQJfNQQJYXZhaWxhYmxlCQBlAgUIZWxpZ2libGUFDmFscmVhZHlDbGFpbWVkAwkAZgIAAAUFc3RhcnQJAAIBAhJubyB2ZXN0aW5nIGVuYWJsZWQDCQAAAgUJYXZhaWxhYmxlAAAJAJQKAgUDbmlsAAAJAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFCWF2YWlsYWJsZQkA2QQBBQR1c2RuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQETdmVzdGluZ0NsYWltZWRTdG9yZQEFB2FkZHJlc3MJAGQCBQ5hbHJlYWR5Q2xhaW1lZAUJYXZhaWxhYmxlBQNuaWwFCWF2YWlsYWJsZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQphY2NvdW50Rm9yAwdhZGRyZXNzB2Fzc2V0SWQGYW1vdW50BAhhdHRhY2hlZAkAkQMCCAUBaQhwYXltZW50cwAABAZjaGVja3MDAwMDCQEIbWFpbk9ubHkBBQFpCQEJb3BBbGxvd2VkAQINbGlxdWlkYW9fbW92ZQcJAQd0aHJvd0lmAgkBAiE9AgkA2AQBCQEFdmFsdWUBCAUIYXR0YWNoZWQHYXNzZXRJZAUEdXNkbgIVdXNkbiBtdXN0IGJlIGF0dGFjaGVkBwkBB3Rocm93SWYCCQBmAgUGYW1vdW50CAUIYXR0YWNoZWQGYW1vdW50AhNub3QgZW5vdWdoIHN1cHBsaWVkBwkBB3Rocm93SWYCAwkBAiE9AgUHYXNzZXRJZAUEdXNkYwkBAiE9AgUHYXNzZXRJZAUEdXNkdAcCC29ubHkgdCBvciBjBwMJAAACBQZjaGVja3MFBmNoZWNrcwkAzAgCCQENd3JpdGVDb25zdEludAIJARFhZGRyZXNzQXNzZXRTdG9yZQIFB2FkZHJlc3MFB2Fzc2V0SWQFBmFtb3VudAkAzAgCCQEIY2hhbmdlQnkCCQEVYWRkcmVzc0Fzc2V0VVNETlN0b3JlAgUHYWRkcmVzcwUHYXNzZXRJZAgFCGF0dGFjaGVkBmFtb3VudAkAzAgCCQEIY2hhbmdlQnkCCQEVYWRkcmVzc1RvdGFsVVNETlN0b3JlAQUHYWRkcmVzcwgFCGF0dGFjaGVkBmFtb3VudAkAzAgCCQEIY2hhbmdlQnkCCQEPdG90YWxBc3NldFN0b3JlAQUHYXNzZXRJZAUGYW1vdW50CQDMCAIJAQhjaGFuZ2VCeQIFDnRvdGFsVVNETlN0b3JlCAUIYXR0YWNoZWQGYW1vdW50BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AGYY5og==", "chainId": 87, "height": 3225175, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 98bd2ikxt1iyi64vCqVHxEhoPR2SYgSBPetfMKSq1c6N Next: 7rotTFSzFy2o2Q4PVnSTbhKtVoDxY2KNC5cnVLf9jKik Diff:
Old | New | Differences | |
---|---|---|---|
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | func writeConstString (key,value) = if (!(isDefined(getString(this, key)))) | |
5 | 5 | then StringEntry(key, value) | |
6 | + | else throw(("already initialized: " + key)) | |
7 | + | ||
8 | + | ||
9 | + | func writeConstInt (key,value) = if (!(isDefined(getInteger(this, key)))) | |
10 | + | then IntegerEntry(key, value) | |
6 | 11 | else throw(("already initialized: " + key)) | |
7 | 12 | ||
8 | 13 | ||
27 | 32 | ||
28 | 33 | let HEIGHT = height | |
29 | 34 | ||
35 | + | func opAllowed (op) = match invoke(configAddress, "opAllowed", ["usdn", op], nil) { | |
36 | + | case b: Boolean => | |
37 | + | if (b) | |
38 | + | then true | |
39 | + | else throw("not allowed") | |
40 | + | case _ => | |
41 | + | throw("opAllowed: unexpected result type") | |
42 | + | } | |
43 | + | ||
44 | + | ||
30 | 45 | func mainOnly (i) = if (contains(getStringValue(configAddress, "main"), toString(i.caller))) | |
31 | 46 | then true | |
32 | 47 | else throw("only main can do") | |
43 | 58 | ||
44 | 59 | let usdn = getStringValue(this, "usdn") | |
45 | 60 | ||
61 | + | func addressAssetStore (address,assetId) = ((address + "_") + assetId) | |
62 | + | ||
63 | + | ||
64 | + | func addressAssetUSDNStore (address,assetId) = (((address + "_") + assetId) + "_usdn") | |
65 | + | ||
66 | + | ||
67 | + | func addressTotalUSDNStore (address) = (address + "_usdn") | |
68 | + | ||
69 | + | ||
70 | + | func totalAssetStore (assetId) = ("total_" + assetId) | |
71 | + | ||
72 | + | ||
73 | + | func vestingStartStore (address) = (address + "_vesting_start") | |
74 | + | ||
75 | + | ||
76 | + | func vestingClaimedStore (address) = (address + "_claimed") | |
77 | + | ||
78 | + | ||
79 | + | let totalUSDNStore = "total_usdn" | |
80 | + | ||
81 | + | let vestingPeriod = (1440 * 365) | |
82 | + | ||
83 | + | func userVestingBalance (address) = { | |
84 | + | let cUSDN = valueOrElse(getInteger(addressAssetUSDNStore(address, usdc)), 0) | |
85 | + | let tUSDN = valueOrElse(getInteger(addressAssetUSDNStore(address, usdt)), 0) | |
86 | + | let totalVesting = (cUSDN + tUSDN) | |
87 | + | let alreadyClaimed = valueOrElse(getInteger(vestingClaimedStore(address)), 0) | |
88 | + | match getInteger(this, vestingStartStore(address)) { | |
89 | + | case vestingStart: Int => | |
90 | + | let eligible = if ((HEIGHT > (vestingStart + vestingPeriod))) | |
91 | + | then totalVesting | |
92 | + | else fraction(totalVesting, (HEIGHT - vestingStart), vestingPeriod) | |
93 | + | $Tuple5(totalVesting, alreadyClaimed, eligible, vestingStart, (vestingStart + vestingPeriod)) | |
94 | + | case _ => | |
95 | + | $Tuple5(totalVesting, 0, -1, -1, -1) | |
96 | + | } | |
97 | + | } | |
98 | + | ||
99 | + | ||
100 | + | 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 | |
107 | + | let c = valueOrElse(getInteger(addressAssetStore(address, usdc)), 0) | |
108 | + | 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) | |
110 | + | } | |
111 | + | ||
112 | + | ||
46 | 113 | @Callable(i) | |
47 | 114 | func init (conf,tId,cId,nId) = if ((i.caller != this)) | |
48 | 115 | then throw("only self can init") | |
51 | 118 | ||
52 | 119 | ||
53 | 120 | @Callable(i) | |
54 | - | func vest (address,assetId,amount) = { | |
121 | + | func startVestingAll () = { | |
122 | + | let address = toString(i.caller) | |
123 | + | let checks = opAllowed("liquidao_startVesting") | |
124 | + | if ((checks == checks)) | |
125 | + | then { | |
126 | + | let userTStore = addressAssetStore(address, usdt) | |
127 | + | let userCStore = addressAssetStore(address, usdc) | |
128 | + | let convertedC = valueOrElse(getIntegerValue(this, userCStore), 0) | |
129 | + | let convertedT = valueOrElse(getIntegerValue(this, userTStore), 0) | |
130 | + | let startedVesting = getIntegerValue(this, addressTotalUSDNStore(address)) | |
131 | + | [changeBy("committedUSDN", startedVesting), writeConstInt(vestingStartStore(address), HEIGHT), changeBy(totalAssetStore(usdc), -(convertedC)), DeleteEntry(userCStore), changeBy(totalAssetStore(usdt), -(convertedT)), DeleteEntry(userTStore)] | |
132 | + | } | |
133 | + | else throw("Strict value is not equal to itself.") | |
134 | + | } | |
135 | + | ||
136 | + | ||
137 | + | ||
138 | + | @Callable(i) | |
139 | + | func withdrawVested () = { | |
140 | + | let checks = opAllowed("liquidao_withdrawVested") | |
141 | + | if ((checks == checks)) | |
142 | + | then { | |
143 | + | let address = toString(i.caller) | |
144 | + | let $t050395125 = userVestingBalance(address) | |
145 | + | let totalVesting = $t050395125._1 | |
146 | + | let alreadyClaimed = $t050395125._2 | |
147 | + | let eligible = $t050395125._3 | |
148 | + | let start = $t050395125._4 | |
149 | + | let end = $t050395125._5 | |
150 | + | let available = (eligible - alreadyClaimed) | |
151 | + | if ((0 > start)) | |
152 | + | 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) | |
156 | + | } | |
157 | + | else throw("Strict value is not equal to itself.") | |
158 | + | } | |
159 | + | ||
160 | + | ||
161 | + | ||
162 | + | @Callable(i) | |
163 | + | func accountFor (address,assetId,amount) = { | |
55 | 164 | let attached = i.payments[0] | |
56 | - | let checks = if (if (if (mainOnly(i)) | |
165 | + | let checks = if (if (if (if (mainOnly(i)) | |
166 | + | then opAllowed("liquidao_move") | |
167 | + | else false) | |
57 | 168 | then throwIf((toBase58String(value(attached.assetId)) != usdn), "usdn must be attached") | |
58 | 169 | else false) | |
59 | 170 | then throwIf((amount > attached.amount), "not enough supplied") | |
63 | 174 | else false, "only t or c") | |
64 | 175 | else false | |
65 | 176 | if ((checks == checks)) | |
66 | - | then [ | |
177 | + | 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)] | |
67 | 178 | else throw("Strict value is not equal to itself.") | |
68 | 179 | } | |
69 | 180 |
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 | + | else throw(("already initialized: " + key)) | |
7 | + | ||
8 | + | ||
9 | + | func writeConstInt (key,value) = if (!(isDefined(getInteger(this, key)))) | |
10 | + | then IntegerEntry(key, value) | |
6 | 11 | else throw(("already initialized: " + key)) | |
7 | 12 | ||
8 | 13 | ||
9 | 14 | func writeInt (key,value) = if ((0 > value)) | |
10 | 15 | then throw(((("writing negative value " + toString(value)) + " for key ") + key)) | |
11 | 16 | else IntegerEntry(key, value) | |
12 | 17 | ||
13 | 18 | ||
14 | 19 | func changeBy (key,value) = writeInt(key, (valueOrElse(getInteger(this, key), 0) + value)) | |
15 | 20 | ||
16 | 21 | ||
17 | 22 | let configStore = "config" | |
18 | 23 | ||
19 | 24 | let configAddress = addressFromStringValue(getStringValue(this, configStore)) | |
20 | 25 | ||
21 | 26 | let maybeOracleAddress = match getString(configAddress, "oracle_address") { | |
22 | 27 | case s: String => | |
23 | 28 | addressFromString(s) | |
24 | 29 | case _ => | |
25 | 30 | unit | |
26 | 31 | } | |
27 | 32 | ||
28 | 33 | let HEIGHT = height | |
29 | 34 | ||
35 | + | func opAllowed (op) = match invoke(configAddress, "opAllowed", ["usdn", op], nil) { | |
36 | + | case b: Boolean => | |
37 | + | if (b) | |
38 | + | then true | |
39 | + | else throw("not allowed") | |
40 | + | case _ => | |
41 | + | throw("opAllowed: unexpected result type") | |
42 | + | } | |
43 | + | ||
44 | + | ||
30 | 45 | func mainOnly (i) = if (contains(getStringValue(configAddress, "main"), toString(i.caller))) | |
31 | 46 | then true | |
32 | 47 | else throw("only main can do") | |
33 | 48 | ||
34 | 49 | ||
35 | 50 | func throwIf (condition,error) = if (condition) | |
36 | 51 | then throw(error) | |
37 | 52 | else true | |
38 | 53 | ||
39 | 54 | ||
40 | 55 | let usdc = getStringValue(this, "usdc") | |
41 | 56 | ||
42 | 57 | let usdt = getStringValue(this, "usdt") | |
43 | 58 | ||
44 | 59 | let usdn = getStringValue(this, "usdn") | |
45 | 60 | ||
61 | + | func addressAssetStore (address,assetId) = ((address + "_") + assetId) | |
62 | + | ||
63 | + | ||
64 | + | func addressAssetUSDNStore (address,assetId) = (((address + "_") + assetId) + "_usdn") | |
65 | + | ||
66 | + | ||
67 | + | func addressTotalUSDNStore (address) = (address + "_usdn") | |
68 | + | ||
69 | + | ||
70 | + | func totalAssetStore (assetId) = ("total_" + assetId) | |
71 | + | ||
72 | + | ||
73 | + | func vestingStartStore (address) = (address + "_vesting_start") | |
74 | + | ||
75 | + | ||
76 | + | func vestingClaimedStore (address) = (address + "_claimed") | |
77 | + | ||
78 | + | ||
79 | + | let totalUSDNStore = "total_usdn" | |
80 | + | ||
81 | + | let vestingPeriod = (1440 * 365) | |
82 | + | ||
83 | + | func userVestingBalance (address) = { | |
84 | + | let cUSDN = valueOrElse(getInteger(addressAssetUSDNStore(address, usdc)), 0) | |
85 | + | let tUSDN = valueOrElse(getInteger(addressAssetUSDNStore(address, usdt)), 0) | |
86 | + | let totalVesting = (cUSDN + tUSDN) | |
87 | + | let alreadyClaimed = valueOrElse(getInteger(vestingClaimedStore(address)), 0) | |
88 | + | match getInteger(this, vestingStartStore(address)) { | |
89 | + | case vestingStart: Int => | |
90 | + | let eligible = if ((HEIGHT > (vestingStart + vestingPeriod))) | |
91 | + | then totalVesting | |
92 | + | else fraction(totalVesting, (HEIGHT - vestingStart), vestingPeriod) | |
93 | + | $Tuple5(totalVesting, alreadyClaimed, eligible, vestingStart, (vestingStart + vestingPeriod)) | |
94 | + | case _ => | |
95 | + | $Tuple5(totalVesting, 0, -1, -1, -1) | |
96 | + | } | |
97 | + | } | |
98 | + | ||
99 | + | ||
100 | + | 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 | |
107 | + | let c = valueOrElse(getInteger(addressAssetStore(address, usdc)), 0) | |
108 | + | 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) | |
110 | + | } | |
111 | + | ||
112 | + | ||
46 | 113 | @Callable(i) | |
47 | 114 | func init (conf,tId,cId,nId) = if ((i.caller != this)) | |
48 | 115 | then throw("only self can init") | |
49 | 116 | else [writeConstString(configStore, conf), writeConstString("usdt", tId), writeConstString("usdc", cId), writeConstString("usdn", nId)] | |
50 | 117 | ||
51 | 118 | ||
52 | 119 | ||
53 | 120 | @Callable(i) | |
54 | - | func vest (address,assetId,amount) = { | |
121 | + | func startVestingAll () = { | |
122 | + | let address = toString(i.caller) | |
123 | + | let checks = opAllowed("liquidao_startVesting") | |
124 | + | if ((checks == checks)) | |
125 | + | then { | |
126 | + | let userTStore = addressAssetStore(address, usdt) | |
127 | + | let userCStore = addressAssetStore(address, usdc) | |
128 | + | let convertedC = valueOrElse(getIntegerValue(this, userCStore), 0) | |
129 | + | let convertedT = valueOrElse(getIntegerValue(this, userTStore), 0) | |
130 | + | let startedVesting = getIntegerValue(this, addressTotalUSDNStore(address)) | |
131 | + | [changeBy("committedUSDN", startedVesting), writeConstInt(vestingStartStore(address), HEIGHT), changeBy(totalAssetStore(usdc), -(convertedC)), DeleteEntry(userCStore), changeBy(totalAssetStore(usdt), -(convertedT)), DeleteEntry(userTStore)] | |
132 | + | } | |
133 | + | else throw("Strict value is not equal to itself.") | |
134 | + | } | |
135 | + | ||
136 | + | ||
137 | + | ||
138 | + | @Callable(i) | |
139 | + | func withdrawVested () = { | |
140 | + | let checks = opAllowed("liquidao_withdrawVested") | |
141 | + | if ((checks == checks)) | |
142 | + | then { | |
143 | + | let address = toString(i.caller) | |
144 | + | let $t050395125 = userVestingBalance(address) | |
145 | + | let totalVesting = $t050395125._1 | |
146 | + | let alreadyClaimed = $t050395125._2 | |
147 | + | let eligible = $t050395125._3 | |
148 | + | let start = $t050395125._4 | |
149 | + | let end = $t050395125._5 | |
150 | + | let available = (eligible - alreadyClaimed) | |
151 | + | if ((0 > start)) | |
152 | + | 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) | |
156 | + | } | |
157 | + | else throw("Strict value is not equal to itself.") | |
158 | + | } | |
159 | + | ||
160 | + | ||
161 | + | ||
162 | + | @Callable(i) | |
163 | + | func accountFor (address,assetId,amount) = { | |
55 | 164 | let attached = i.payments[0] | |
56 | - | let checks = if (if (if (mainOnly(i)) | |
165 | + | let checks = if (if (if (if (mainOnly(i)) | |
166 | + | then opAllowed("liquidao_move") | |
167 | + | else false) | |
57 | 168 | then throwIf((toBase58String(value(attached.assetId)) != usdn), "usdn must be attached") | |
58 | 169 | else false) | |
59 | 170 | then throwIf((amount > attached.amount), "not enough supplied") | |
60 | 171 | else false) | |
61 | 172 | then throwIf(if ((assetId != usdc)) | |
62 | 173 | then (assetId != usdt) | |
63 | 174 | else false, "only t or c") | |
64 | 175 | else false | |
65 | 176 | if ((checks == checks)) | |
66 | - | then [ | |
177 | + | 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)] | |
67 | 178 | else throw("Strict value is not equal to itself.") | |
68 | 179 | } | |
69 | 180 | ||
70 | 181 |
github/deemru/w8io/3ef1775 48.45 ms ◑