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:
OldNewDifferences
33 {-# CONTENT_TYPE DAPP #-}
44 func writeConstString (key,value) = if (!(isDefined(getString(this, key))))
55 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)
611 else throw(("already initialized: " + key))
712
813
2732
2833 let HEIGHT = height
2934
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+
3045 func mainOnly (i) = if (contains(getStringValue(configAddress, "main"), toString(i.caller)))
3146 then true
3247 else throw("only main can do")
4358
4459 let usdn = getStringValue(this, "usdn")
4560
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+
46113 @Callable(i)
47114 func init (conf,tId,cId,nId) = if ((i.caller != this))
48115 then throw("only self can init")
51118
52119
53120 @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) = {
55164 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)
57168 then throwIf((toBase58String(value(attached.assetId)) != usdn), "usdn must be attached")
58169 else false)
59170 then throwIf((amount > attached.amount), "not enough supplied")
63174 else false, "only t or c")
64175 else false
65176 if ((checks == checks))
66- then [writeConstString((((address + "_") + assetId) + "_migrated"), (((address + "_") + assetId) + "_migrated")), writeInt(((address + "_") + assetId), amount), changeBy(((address + "_") + usdn), attached.amount), changeBy(("total_" + assetId), amount), changeBy(("total_" + usdn), attached.amount)]
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)]
67178 else throw("Strict value is not equal to itself.")
68179 }
69180
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)
6+ else throw(("already initialized: " + key))
7+
8+
9+func writeConstInt (key,value) = if (!(isDefined(getInteger(this, key))))
10+ then IntegerEntry(key, value)
611 else throw(("already initialized: " + key))
712
813
914 func writeInt (key,value) = if ((0 > value))
1015 then throw(((("writing negative value " + toString(value)) + " for key ") + key))
1116 else IntegerEntry(key, value)
1217
1318
1419 func changeBy (key,value) = writeInt(key, (valueOrElse(getInteger(this, key), 0) + value))
1520
1621
1722 let configStore = "config"
1823
1924 let configAddress = addressFromStringValue(getStringValue(this, configStore))
2025
2126 let maybeOracleAddress = match getString(configAddress, "oracle_address") {
2227 case s: String =>
2328 addressFromString(s)
2429 case _ =>
2530 unit
2631 }
2732
2833 let HEIGHT = height
2934
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+
3045 func mainOnly (i) = if (contains(getStringValue(configAddress, "main"), toString(i.caller)))
3146 then true
3247 else throw("only main can do")
3348
3449
3550 func throwIf (condition,error) = if (condition)
3651 then throw(error)
3752 else true
3853
3954
4055 let usdc = getStringValue(this, "usdc")
4156
4257 let usdt = getStringValue(this, "usdt")
4358
4459 let usdn = getStringValue(this, "usdn")
4560
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+
46113 @Callable(i)
47114 func init (conf,tId,cId,nId) = if ((i.caller != this))
48115 then throw("only self can init")
49116 else [writeConstString(configStore, conf), writeConstString("usdt", tId), writeConstString("usdc", cId), writeConstString("usdn", nId)]
50117
51118
52119
53120 @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) = {
55164 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)
57168 then throwIf((toBase58String(value(attached.assetId)) != usdn), "usdn must be attached")
58169 else false)
59170 then throwIf((amount > attached.amount), "not enough supplied")
60171 else false)
61172 then throwIf(if ((assetId != usdc))
62173 then (assetId != usdt)
63174 else false, "only t or c")
64175 else false
65176 if ((checks == checks))
66- then [writeConstString((((address + "_") + assetId) + "_migrated"), (((address + "_") + assetId) + "_migrated")), writeInt(((address + "_") + assetId), amount), changeBy(((address + "_") + usdn), attached.amount), changeBy(("total_" + assetId), amount), changeBy(("total_" + usdn), attached.amount)]
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)]
67178 else throw("Strict value is not equal to itself.")
68179 }
69180
70181

github/deemru/w8io/3ef1775 
48.45 ms