tx · ArLxYcb6pUpVmyfyyzwchaUv41kL3VY3YjYXxAvBnSMZ 3PAuTLuchPr3N8mDaoN2wMb2JtHe5MBE7g2: -0.00300000 Waves 2022.08.05 12:43 [3236527] smart account 3PAuTLuchPr3N8mDaoN2wMb2JtHe5MBE7g2 > SELF 0.00000000 Waves
{ "type": 13, "id": "ArLxYcb6pUpVmyfyyzwchaUv41kL3VY3YjYXxAvBnSMZ", "fee": 300000, "feeAssetId": null, "timestamp": 1659692643705, "version": 1, "sender": "3PAuTLuchPr3N8mDaoN2wMb2JtHe5MBE7g2", "senderPublicKey": "7hQKEVCKLNemvXdXDzHCqBh5MVBYfF4SNRVuWgK3g45d", "proofs": [ "5sApPzzj6KfJVcddDhVKvRrM3PLjNE3oRyMG1furTGoEv7jGoDZMCjM9DQgjqGVjQg7gK4MVUTZTvLFiDLUCMnD9" ], "script": "base64:BgIWCAISBgoECAgIARIDCgEBEgASAwoBARcBBWFzSW50AQV2YWx1ZQQHJG1hdGNoMAUFdmFsdWUDCQABAgUHJG1hdGNoMAIDSW50BANpbnQFByRtYXRjaDAFA2ludAkAAgECGXdyb25nIHR5cGUsIGV4cGVjdGVkOiBJbnQBC2FzSW50U3RySW50AQV2YWx1ZQQHJG1hdGNoMAUFdmFsdWUDCQABAgUHJG1hdGNoMAISKEludCwgU3RyaW5nLCBJbnQpBAlpbnRTdHJJbnQFByRtYXRjaDAFCWludFN0ckludAMJAAECBQckbWF0Y2gwAg0oSW50LCBTdHJpbmcpBAZpbnRTdHIFByRtYXRjaDAJAJUKAwgFBmludFN0cgJfMQgFBmludFN0cgJfMgAACQACAQIjd3JvbmcgdHlwZSwgZXhwZWN0ZWQ6IChJbnQsIFN0cmluZykAC2NvbmZpZ1N0b3JlAgZjb25maWcADWNvbmZpZ0FkZHJlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwULY29uZmlnU3RvcmUCH2V4cC1kaXZpZGVuZHM6IG5vIGNvbmZpZ0FkZHJlc3MCFmludmFsaWQgY29uZmlnIGFkZHJlc3MAEm1heWJlT3JhY2xlQWRkcmVzcwQHJG1hdGNoMAkAnQgCBQ1jb25maWdBZGRyZXNzAg5vcmFjbGVfYWRkcmVzcwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJAKYIAQUBcwUEdW5pdAAGSEVJR0hUBQZoZWlnaHQBB3Rocm93SWYCCWNvbmRpdGlvbgVlcnJvcgMFCWNvbmRpdGlvbgkAAgEFBWVycm9yBgEId3JpdGVJbnQCA2tleQV2YWx1ZQMJAGYCAAAFBXZhbHVlCQACAQkArAICCQCsAgIJAKwCAgIXd3JpdGluZyBuZWdhdGl2ZSB2YWx1ZSAJAKQDAQUFdmFsdWUCCSBmb3Iga2V5IAUDa2V5CQEMSW50ZWdlckVudHJ5AgUDa2V5BQV2YWx1ZQELd3JpdGVTdHJJbnQCA2tleQV2YWx1ZQMJAGYCAAAFBXZhbHVlCQACAQkArAICCQCsAgIJAKwCAgIXd3JpdGluZyBuZWdhdGl2ZSB2YWx1ZSAJAKQDAQUFdmFsdWUCCSBmb3Iga2V5IAUDa2V5CQELU3RyaW5nRW50cnkCBQNrZXkJAKQDAQUFdmFsdWUBEHdyaXRlQ29uc3RTdHJpbmcCA2tleQV2YWx1ZQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwUDa2V5CQELU3RyaW5nRW50cnkCBQNrZXkFBXZhbHVlCQACAQkArAICAhVhbHJlYWR5IGluaXRpYWxpemVkOiAFA2tleQEIY2hhbmdlQnkCA2tleQV2YWx1ZQkBCHdyaXRlSW50AgUDa2V5CQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkAAAUFdmFsdWUACXVzZG5TdG9yZQIHYXNzZXRJZAAEdXNkbgkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUJdXNkblN0b3JlABFleHBEaXZpZGVuZHNTdG9yZQIMZXhwRGl2aWRlbmRzAAxleHBEaXZpZGVuZHMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBRFleHBEaXZpZGVuZHNTdG9yZQIWZGFvLWI6IG5vIGV4cERpdmlkZW5kcwASaW5pdGlhbEhlaWdodFN0b3JlAg1pbml0aWFsSGVpZ2h0AA1pbml0aWFsSGVpZ2h0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBRJpbml0aWFsSGVpZ2h0U3RvcmUAEHRvdGFsQW1vdW50U3RvcmUCC3RvdGFsQW1vdW50AAt0b3RhbEFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUQdG90YWxBbW91bnRTdG9yZQANdmVzdGluZ1BlcmlvZAkAaAIAPACgCwAMY2xhaW1lZFN0b3JlAgtkaXN0cmlidXRlZAAHY2xhaW1lZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQxjbGFpbWVkU3RvcmUAAAAJYXZhaWxhYmxlAwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzBRJpbml0aWFsSGVpZ2h0U3RvcmUAAAMJAGYCBQ1pbml0aWFsSGVpZ2h0BQZIRUlHSFQAAAQGdmVzdGVkCQCXAwEJAMwIAgULdG90YWxBbW91bnQJAMwIAgkAawMFC3RvdGFsQW1vdW50CQBlAgUGSEVJR0hUBQ1pbml0aWFsSGVpZ2h0BQ12ZXN0aW5nUGVyaW9kBQNuaWwJAJYDAQkAzAgCCQBlAgUGdmVzdGVkBQdjbGFpbWVkCQDMCAIAAAUDbmlsBAFpAQRpbml0BA1jb25maWdBZGRyZXNzC3VzZG5Bc3NldElkCWRpdmlkZW5kcwltaW5BbW91bnQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhZvbmx5IHNlbGYgY2FuIGNvbnRpbnVlCQDMCAIJARB3cml0ZUNvbnN0U3RyaW5nAgULY29uZmlnU3RvcmUFDWNvbmZpZ0FkZHJlc3MJAMwIAgkBEHdyaXRlQ29uc3RTdHJpbmcCBQl1c2RuU3RvcmUJAKwCAgULdXNkbkFzc2V0SWQCCV9kYW9Cb251cwkAzAgCCQEQd3JpdGVDb25zdFN0cmluZwIFEWV4cERpdmlkZW5kc1N0b3JlBQlkaXZpZGVuZHMJAMwIAgkBDEludGVnZXJFbnRyeQICDG1pblVzZG5TdGFydAUJbWluQW1vdW50BQNuaWwBaQEHc3RhcnRBdAEBaAMJAQlpc0RlZmluZWQBCQCfCAEFEmluaXRpYWxIZWlnaHRTdG9yZQkAAgECE2FscmVhZHkgaW5pdGlhbGl6ZWQDCQECIT0CCQDYBAEJAQV2YWx1ZQEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAkAkQMCCQC1CQIFBHVzZG4CAV8AAAkAAgECDmV4cGVjdGVkOiBVU0ROAwkAZgIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzAgxtaW5Vc2RuU3RhcnQCCG5vdCBpbml0CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAAgECD3RvbyBsaXR0bGUgdXNkbgkAzAgCCQEId3JpdGVJbnQCBRJpbml0aWFsSGVpZ2h0U3RvcmUFAWgJAMwIAgkBCHdyaXRlSW50AgUQdG90YWxBbW91bnRTdG9yZQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFA25pbAFpARJnZXRSZXNlcnZlRGl2c0luZm8ACQCUCgIFA25pbAkAlQoDBQlhdmFpbGFibGUFBHVzZG4AAAFpARN3aXRoZHJhd0Zyb21SZXNlcnZlAQF2AwkBAiE9AgUBdgD///////////8BCQACAQIHLTEgb25seQMJAQIhPQIIBQFpBmNhbGxlcgUMZXhwRGl2aWRlbmRzCQACAQIeb25seSBleHBEaXZpZGVuZHMgY2FuIHdpdGhkcmF3CQCUCgIJAMwIAgkBCGNoYW5nZUJ5AgUMY2xhaW1lZFN0b3JlBQlhdmFpbGFibGUJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQlhdmFpbGFibGUJANkEAQkAkQMCCQC1CQIFBHVzZG4CAV8AAAUDbmlsBQlhdmFpbGFibGUAB5va0A==", "chainId": 87, "height": 3236527, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
Old | New | Differences | |
---|---|---|---|
1 | - | # no script | |
1 | + | {-# STDLIB_VERSION 6 #-} | |
2 | + | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | + | {-# CONTENT_TYPE DAPP #-} | |
4 | + | func asInt (value) = match value { | |
5 | + | case int: Int => | |
6 | + | int | |
7 | + | case _ => | |
8 | + | throw("wrong type, expected: Int") | |
9 | + | } | |
10 | + | ||
11 | + | ||
12 | + | func asIntStrInt (value) = match value { | |
13 | + | case intStrInt: (Int, String, Int) => | |
14 | + | intStrInt | |
15 | + | case intStr: (Int, String) => | |
16 | + | $Tuple3(intStr._1, intStr._2, 0) | |
17 | + | case _ => | |
18 | + | throw("wrong type, expected: (Int, String)") | |
19 | + | } | |
20 | + | ||
21 | + | ||
22 | + | let configStore = "config" | |
23 | + | ||
24 | + | let configAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, configStore), "exp-dividends: no configAddress")), "invalid config address") | |
25 | + | ||
26 | + | let maybeOracleAddress = match getString(configAddress, "oracle_address") { | |
27 | + | case s: String => | |
28 | + | addressFromString(s) | |
29 | + | case _ => | |
30 | + | unit | |
31 | + | } | |
32 | + | ||
33 | + | let HEIGHT = height | |
34 | + | ||
35 | + | func throwIf (condition,error) = if (condition) | |
36 | + | then throw(error) | |
37 | + | else true | |
38 | + | ||
39 | + | ||
40 | + | func writeInt (key,value) = if ((0 > value)) | |
41 | + | then throw(((("writing negative value " + toString(value)) + " for key ") + key)) | |
42 | + | else IntegerEntry(key, value) | |
43 | + | ||
44 | + | ||
45 | + | func writeStrInt (key,value) = if ((0 > value)) | |
46 | + | then throw(((("writing negative value " + toString(value)) + " for key ") + key)) | |
47 | + | else StringEntry(key, toString(value)) | |
48 | + | ||
49 | + | ||
50 | + | func writeConstString (key,value) = if (!(isDefined(getString(this, key)))) | |
51 | + | then StringEntry(key, value) | |
52 | + | else throw(("already initialized: " + key)) | |
53 | + | ||
54 | + | ||
55 | + | func changeBy (key,value) = writeInt(key, (valueOrElse(getInteger(this, key), 0) + value)) | |
56 | + | ||
57 | + | ||
58 | + | let usdnStore = "assetId" | |
59 | + | ||
60 | + | let usdn = getStringValue(this, usdnStore) | |
61 | + | ||
62 | + | let expDividendsStore = "expDividends" | |
63 | + | ||
64 | + | let expDividends = addressFromStringValue(valueOrErrorMessage(getString(this, expDividendsStore), "dao-b: no expDividends")) | |
65 | + | ||
66 | + | let initialHeightStore = "initialHeight" | |
67 | + | ||
68 | + | let initialHeight = getIntegerValue(this, initialHeightStore) | |
69 | + | ||
70 | + | let totalAmountStore = "totalAmount" | |
71 | + | ||
72 | + | let totalAmount = getIntegerValue(this, totalAmountStore) | |
73 | + | ||
74 | + | let vestingPeriod = (60 * 1440) | |
75 | + | ||
76 | + | let claimedStore = "distributed" | |
77 | + | ||
78 | + | let claimed = valueOrElse(getInteger(this, claimedStore), 0) | |
79 | + | ||
80 | + | let available = if (!(isDefined(getInteger(this, initialHeightStore)))) | |
81 | + | then 0 | |
82 | + | else if ((initialHeight > HEIGHT)) | |
83 | + | then 0 | |
84 | + | else { | |
85 | + | let vested = min([totalAmount, fraction(totalAmount, (HEIGHT - initialHeight), vestingPeriod)]) | |
86 | + | max([(vested - claimed), 0]) | |
87 | + | } | |
88 | + | ||
89 | + | @Callable(i) | |
90 | + | func init (configAddress,usdnAssetId,dividends,minAmount) = if ((i.caller != this)) | |
91 | + | then throw("only self can continue") | |
92 | + | else [writeConstString(configStore, configAddress), writeConstString(usdnStore, (usdnAssetId + "_daoBonus")), writeConstString(expDividendsStore, dividends), IntegerEntry("minUsdnStart", minAmount)] | |
93 | + | ||
94 | + | ||
95 | + | ||
96 | + | @Callable(i) | |
97 | + | func startAt (h) = if (isDefined(getInteger(initialHeightStore))) | |
98 | + | then throw("already initialized") | |
99 | + | else if ((toBase58String(value(i.payments[0].assetId)) != split(usdn, "_")[0])) | |
100 | + | then throw("expected: USDN") | |
101 | + | else if ((valueOrErrorMessage(getInteger(this, "minUsdnStart"), "not init") > i.payments[0].amount)) | |
102 | + | then throw("too little usdn") | |
103 | + | else [writeInt(initialHeightStore, h), writeInt(totalAmountStore, i.payments[0].amount)] | |
104 | + | ||
105 | + | ||
106 | + | ||
107 | + | @Callable(i) | |
108 | + | func getReserveDivsInfo () = $Tuple2(nil, $Tuple3(available, usdn, 0)) | |
109 | + | ||
110 | + | ||
111 | + | ||
112 | + | @Callable(i) | |
113 | + | func withdrawFromReserve (v) = if ((v != -1)) | |
114 | + | then throw("-1 only") | |
115 | + | else if ((i.caller != expDividends)) | |
116 | + | then throw("only expDividends can withdraw") | |
117 | + | else $Tuple2([changeBy(claimedStore, available), ScriptTransfer(i.caller, available, fromBase58String(split(usdn, "_")[0]))], available) | |
118 | + | ||
119 | + |
github/deemru/w8io/6500d08 19.38 ms ◑