2023.09.19 16:15 [3828094] smart account 3PDETXtiaErZncMduS8h9G6aopcjT7wheqj > SELF 0.00000000 Waves

{ "type": 13, "id": "F7rWpNHKefzE4euZX8vLeEPUrAkLrxTiC9B8RT6o5GaD", "fee": 600000, "feeAssetId": null, "timestamp": 1695128241380, "version": 2, "chainId": 87, "sender": "3PDETXtiaErZncMduS8h9G6aopcjT7wheqj", "senderPublicKey": "AKRGeAxnAWHSY1SsqmgYNW4LiBtkmVBqiqeRm5PgHZ18", "proofs": [ "iRHibKAcVR6iLDFKYGrKy1jeE72WbfcpZekCtQH4oSTNQ66Zeyu9g23dcsfVY6XHV7jbQN5eVSSAqY51U4boqkZ" ], "script": "base64:BgIpCAISAwoBCBIDCgEIEgMKAQgSAwoBARIAEgASAwoBCBIDCgEIEgMKAQEaAAlTRVBBUkFUT1ICAl9fAAhLRVlfSU5JVAIESU5JVAAMS0VZX01VTFRJU0lHAghNVUxUSVNJRwAKS0VZX1NUQVRVUwIGU1RBVFVTAAtLRVlfQ0xBSU1FUgIHQ0xBSU1FUgAQS0VZX0xBU1RfU1dBUF9BVAIMTEFTVF9TV0FQX0FUABZLRVlfV0FWRVNfREFPX0NPTlRSQUNUAhJXQVZFU19EQU9fQ09OVFJBQ1QAEUtFWV9TV0FQX0NPTlRSQUNUAg1TV0FQX0NPTlRSQUNUAA5LRVlfU1dBUF9MSU1JVAIKU1dBUF9MSU1JVAANRlVOQ19DTEFJTV9MUAIHY2xhaW1MUAAJRlVOQ19TV0FQAgRzd2FwABJPTkVfSE9VUl9JTl9CTE9DS1MAPAAMQ09NUEVOU0FUSU9OAKDCHgEQX3ZhbGlkYXRlQWRkcmVzcwEIYWRkcmVzc18EByRtYXRjaDAJAKYIAQUIYWRkcmVzc18DCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAYHAQxfdmFsaWRhdGVJbnQEBHZhbF8ObG93ZXJCb3VuZGFyeV8OdXBwZXJCb3VuZGFyeV8EZXJyXwMDCQBmAgUObG93ZXJCb3VuZGFyeV8FBHZhbF8GCQBmAgUEdmFsXwUOdXBwZXJCb3VuZGFyeV8JAAIBBQRlcnJfBgEVX2xvYWRXYXZlc0RBT0NvbnRyYWN0AAQHJG1hdGNoMAkAoggBBRZLRVlfV0FWRVNfREFPX0NPTlRSQUNUAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkBB0FkZHJlc3MBAQABFV9zYXZlV2F2ZXNEQU9Db250cmFjdAEEdmFsXwkAzAgCCQELU3RyaW5nRW50cnkCBRZLRVlfV0FWRVNfREFPX0NPTlRSQUNUCQClCAEFBHZhbF8FA25pbAERX2xvYWRTd2FwQ29udHJhY3QABAckbWF0Y2gwCQCiCAEFEUtFWV9TV0FQX0NPTlRSQUNUAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkBB0FkZHJlc3MBAQABEV9zYXZlU3dhcENvbnRyYWN0AQR2YWxfCQDMCAIJAQtTdHJpbmdFbnRyeQIFEUtFWV9TV0FQX0NPTlRSQUNUCQClCAEFBHZhbF8FA25pbAEPX2xvYWRMYXN0U3dhcEF0AAQHJG1hdGNoMAkAnwgBBRBLRVlfTEFTVF9TV0FQX0FUAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAAQ9fc2F2ZUxhc3RTd2FwQXQBBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIFEEtFWV9MQVNUX1NXQVBfQVQFBHZhbF8FA25pbAEOX2xvYWRTd2FwTGltaXQABAckbWF0Y2gwCQCfCAEFDktFWV9TV0FQX0xJTUlUAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAAQ5fc2F2ZVN3YXBMaW1pdAEEdmFsXwkAzAgCCQEMSW50ZWdlckVudHJ5AgUOS0VZX1NXQVBfTElNSVQFBHZhbF8FA25pbAERX2dldFdBVkVTRExQQXNzZXQABAckbWF0Y2gwCQCdCAIJARVfbG9hZFdhdmVzREFPQ29udHJhY3QAAg0lc19fbHBBc3NldElkAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkA2QQBBQFhCQACAQIZX2dldFdBVkVTRExQQXNzZXQ6IHJldmVydAEVX2dldEF2YWlsYWJsZVdBVkVTRExQAAQHJG1hdGNoMAkAmggCCQEVX2xvYWRXYXZlc0RBT0NvbnRyYWN0AAkArAICAhElcyVzX19hdmFpbGFibGVfXwkApQgBBQR0aGlzAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAAQ5fY2xhaW1XQVZFU0RMUAAEBnJlc3VsdAkA/AcECQEVX2xvYWRXYXZlc0RBT0NvbnRyYWN0AAUNRlVOQ19DTEFJTV9MUAUDbmlsBQNuaWwDCQAAAgUGcmVzdWx0BQZyZXN1bHQEByRtYXRjaDAFBnJlc3VsdAMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEJAAIBAhZfY2xhaW1XQVZFU0RMUDogcmV2ZXJ0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQFpAQRpbml0AQhjbGFpbWVyXwQIbXVsdGlzaWcJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBBQxLRVlfTVVMVElTSUcCFWluaXQ6IG5vIG11bHRpc2lnIHNldAMJAAACBQhtdWx0aXNpZwUIbXVsdGlzaWcEBGluaXQJAQt2YWx1ZU9yRWxzZQIJAKAIAQUIS0VZX0lOSVQHBANlcnIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhdpbml0OiBwZXJtaXNzaW9uIGRlbmllZAMFBGluaXQJAAIBAhlpbml0OiBhbHJlYWR5IGluaXRpYWxpemVkAwkBASEBCQEQX3ZhbGlkYXRlQWRkcmVzcwEFCGNsYWltZXJfCQACAQIdaW5pdDogaW52YWxpZCBjbGFpbWVyIGFkZHJlc3MFBHVuaXQDCQAAAgUDZXJyBQNlcnIJAJQKAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgUIS0VZX0lOSVQGCQDMCAIJAQtTdHJpbmdFbnRyeQIFC0tFWV9DTEFJTUVSBQhjbGFpbWVyXwUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3NldE11bHRpc2lnAQltdWx0aXNpZ18EA2VycgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECHnNldE11bHRpc2lnOiBwZXJtaXNzaW9uIGRlbmllZAMJAQEhAQkBEF92YWxpZGF0ZUFkZHJlc3MBBQltdWx0aXNpZ18JAAIBAiVzZXRNdWx0aXNpZzogaW52YWxpZCBtdWx0aXNpZyBhZGRyZXNzBQR1bml0AwkAAAIFA2VycgUDZXJyCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUMS0VZX01VTFRJU0lHBQltdWx0aXNpZ18FA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpzZXRDbGFpbWVyAQhjbGFpbWVyXwQDZXJyAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIdc2V0Q2xhaW1lcjogcGVybWlzc2lvbiBkZW5pZWQDCQEBIQEJARBfdmFsaWRhdGVBZGRyZXNzAQUIY2xhaW1lcl8JAAIBAiNzZXRDbGFpbWVyOiBpbnZhbGlkIGNsYWltZXIgYWRkcmVzcwUEdW5pdAMJAAACBQNlcnIFA2VycgkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFC0tFWV9DTEFJTUVSBQhjbGFpbWVyXwUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBWNsYWltAQdhbW91bnRfAwkBAiE9AggFAWkGY2FsbGVyCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1OCkBBQtLRVlfQ0xBSU1FUgkAAgECGGNsYWltOiBwZXJtaXNzaW9uIGRlbmllZAMDCQBnAgAABQdhbW91bnRfBgkAZgIFB2Ftb3VudF8ICQDvBwEFBHRoaXMHcmVndWxhcgkAAgECFWNsYWltOiBpbnZhbGlkIGFtb3VudAkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUHYW1vdW50XwUEdW5pdAUDbmlsBQR1bml0AWkBFGdldEF2YWlsYWJsZVdBVkVTRExQAAkAlAoCBQNuaWwJARVfZ2V0QXZhaWxhYmxlV0FWRVNETFAAAWkBFGNsYWltQW5kU3dhcFdBVkVTRExQAAQFYXNzZXQJARFfZ2V0V0FWRVNETFBBc3NldAAEDWNsYWltZWRBbW91bnQJAQ5fY2xhaW1XQVZFU0RMUAADCQAAAgUNY2xhaW1lZEFtb3VudAUNY2xhaW1lZEFtb3VudAQLdG90YWxBbW91bnQJAPAHAgUEdGhpcwUFYXNzZXQDCQAAAgULdG90YWxBbW91bnQFC3RvdGFsQW1vdW50BAlzd2FwTGltaXQJAQ5fbG9hZFN3YXBMaW1pdAAEDGFtb3VudFRvU3dhcAMJAGYCBQt0b3RhbEFtb3VudAUJc3dhcExpbWl0BQlzd2FwTGltaXQFC3RvdGFsQW1vdW50BAZyZXN1bHQDCQBmAgUGaGVpZ2h0CQBkAgkBD19sb2FkTGFzdFN3YXBBdAAFEk9ORV9IT1VSX0lOX0JMT0NLUwkA/AcECQERX2xvYWRTd2FwQ29udHJhY3QABQlGVU5DX1NXQVAJAMwIAgABCQDMCAICAAkAzAgCCQClCAEFBHRoaXMFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUFYXNzZXQFDGFtb3VudFRvU3dhcAUDbmlsCQACAQIfY2xhaW1BbmRTd2FwV0FWRVNETFA6IHRvbyBvZnRlbgMJAAACBQZyZXN1bHQFBnJlc3VsdAQHJG1hdGNoMAUGcmVzdWx0AwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAMJAGYCBQFhBQxDT01QRU5TQVRJT04JAJQKAgkAzggCCQEPX3NhdmVMYXN0U3dhcEF0AQUGaGVpZ2h0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUMQ09NUEVOU0FUSU9OBQR1bml0BQNuaWwFBHVuaXQJAAIBAitjbGFpbUFuZFN3YXBXQVZFU0RMUDogdG9vIGxpdHRsZSBhbW91bnQgZ290CQACAQIhY2xhaW1BbmRTd2FwV0FWRVNETFA6IHN3YXAgcmV2ZXJ0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBE3NldFdhdmVzREFPQ29udHJhY3QBCGFkZHJlc3NfBANlcnIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAiZzZXRXYXZlc0RBT0NvbnRyYWN0OiBwZXJtaXNzaW9uIGRlbmllZAMJAQEhAQkBEF92YWxpZGF0ZUFkZHJlc3MBBQhhZGRyZXNzXwkAAgECJHNldFdhdmVzREFPQ29udHJhY3Q6IGludmFsaWQgYWRkcmVzcwUEdW5pdAMJAAACBQNlcnIFA2VycgkAlAoCCQEVX3NhdmVXYXZlc0RBT0NvbnRyYWN0AQkBEUBleHRyTmF0aXZlKDEwNjIpAQUIYWRkcmVzc18FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEPc2V0U3dhcENvbnRyYWN0AQhhZGRyZXNzXwQDZXJyAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIic2V0U3dhcENvbnRyYWN0OiBwZXJtaXNzaW9uIGRlbmllZAMJAQEhAQkBEF92YWxpZGF0ZUFkZHJlc3MBBQhhZGRyZXNzXwkAAgECIHNldFN3YXBDb250cmFjdDogaW52YWxpZCBhZGRyZXNzBQR1bml0AwkAAAIFA2VycgUDZXJyCQCUCgIJARFfc2F2ZVN3YXBDb250cmFjdAEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCGFkZHJlc3NfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDHNldFN3YXBMaW1pdAEGbGltaXRfBANlcnIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAh9zZXRTd2FwTGltaXQ6IHBlcm1pc3Npb24gZGVuaWVkAwkAZwIAAAUGbGltaXRfCQACAQIbc2V0U3dhcExpbWl0OiBpbnZhbGlkIGxpbWl0BQR1bml0AwkAAAIFA2VycgUDZXJyCQCUCgIJAQ5fc2F2ZVN3YXBMaW1pdAEFBmxpbWl0XwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAEByRtYXRjaDAJAKIIAQUMS0VZX01VTFRJU0lHAwkAAQIFByRtYXRjaDACBlN0cmluZwQIbXVsdGlzaWcFByRtYXRjaDAJAQt2YWx1ZU9yRWxzZQIJAJsIAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUIbXVsdGlzaWcJALkJAgkAzAgCBQpLRVlfU1RBVFVTCQDMCAIJAKUIAQUEdGhpcwkAzAgCCQDYBAEIBQJ0eAJpZAUDbmlsBQlTRVBBUkFUT1IHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V50Rb2nw==", "height": 3828094, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9QwM7qmqnG5wSP99ZYEQBU82TD5v3QtieVj4w7pXkGPf Next: 9juEfttsQu2w47yNc8qD9xxSgpLdJjoWUmWQW3iphBNJ Diff:
OldNewDifferences
1111
1212 let KEY_CLAIMER = "CLAIMER"
1313
14+let KEY_LAST_SWAP_AT = "LAST_SWAP_AT"
15+
16+let KEY_WAVES_DAO_CONTRACT = "WAVES_DAO_CONTRACT"
17+
18+let KEY_SWAP_CONTRACT = "SWAP_CONTRACT"
19+
20+let KEY_SWAP_LIMIT = "SWAP_LIMIT"
21+
22+let FUNC_CLAIM_LP = "claimLP"
23+
24+let FUNC_SWAP = "swap"
25+
26+let ONE_HOUR_IN_BLOCKS = 60
27+
28+let COMPENSATION = 500000
29+
1430 func _validateAddress (address_) = match addressFromString(address_) {
1531 case a: Address =>
1632 true
1935 }
2036
2137
38+func _validateInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_))
39+ then true
40+ else (val_ > upperBoundary_))
41+ then throw(err_)
42+ else true
43+
44+
45+func _loadWavesDAOContract () = match getString(KEY_WAVES_DAO_CONTRACT) {
46+ case a: String =>
47+ addressFromStringValue(a)
48+ case _ =>
49+ Address(base58'')
50+}
51+
52+
53+func _saveWavesDAOContract (val_) = [StringEntry(KEY_WAVES_DAO_CONTRACT, toString(val_))]
54+
55+
56+func _loadSwapContract () = match getString(KEY_SWAP_CONTRACT) {
57+ case a: String =>
58+ addressFromStringValue(a)
59+ case _ =>
60+ Address(base58'')
61+}
62+
63+
64+func _saveSwapContract (val_) = [StringEntry(KEY_SWAP_CONTRACT, toString(val_))]
65+
66+
67+func _loadLastSwapAt () = match getInteger(KEY_LAST_SWAP_AT) {
68+ case a: Int =>
69+ a
70+ case _ =>
71+ 0
72+}
73+
74+
75+func _saveLastSwapAt (val_) = [IntegerEntry(KEY_LAST_SWAP_AT, val_)]
76+
77+
78+func _loadSwapLimit () = match getInteger(KEY_SWAP_LIMIT) {
79+ case a: Int =>
80+ a
81+ case _ =>
82+ 0
83+}
84+
85+
86+func _saveSwapLimit (val_) = [IntegerEntry(KEY_SWAP_LIMIT, val_)]
87+
88+
89+func _getWAVESDLPAsset () = match getString(_loadWavesDAOContract(), "%s__lpAssetId") {
90+ case a: String =>
91+ fromBase58String(a)
92+ case _ =>
93+ throw("_getWAVESDLPAsset: revert")
94+}
95+
96+
97+func _getAvailableWAVESDLP () = match getInteger(_loadWavesDAOContract(), ("%s%s__available__" + toString(this))) {
98+ case a: Int =>
99+ a
100+ case _ =>
101+ 0
102+}
103+
104+
105+func _claimWAVESDLP () = {
106+ let result = invoke(_loadWavesDAOContract(), FUNC_CLAIM_LP, nil, nil)
107+ if ((result == result))
108+ then match result {
109+ case a: Int =>
110+ a
111+ case _ =>
112+ throw("_claimWAVESDLP: revert")
113+ }
114+ else throw("Strict value is not equal to itself.")
115+ }
116+
117+
22118 @Callable(i)
23119 func init (claimer_) = {
24120 let multisig = valueOrErrorMessage(getString(KEY_MULTISIG), "init: no multisig set")
25- let init = valueOrElse(getBoolean(KEY_INIT), false)
26- let err = if ((i.caller != this))
27- then throw("init: permission denied")
28- else if (init)
29- then throw("init: already initialized")
30- else if (!(_validateAddress(claimer_)))
31- then throw("init: invalid claimer address")
32- else unit
33- if ((err == err))
34- then $Tuple2([BooleanEntry(KEY_INIT, true), StringEntry(KEY_CLAIMER, claimer_)], unit)
121+ if ((multisig == multisig))
122+ then {
123+ let init = valueOrElse(getBoolean(KEY_INIT), false)
124+ let err = if ((i.caller != this))
125+ then throw("init: permission denied")
126+ else if (init)
127+ then throw("init: already initialized")
128+ else if (!(_validateAddress(claimer_)))
129+ then throw("init: invalid claimer address")
130+ else unit
131+ if ((err == err))
132+ then $Tuple2([BooleanEntry(KEY_INIT, true), StringEntry(KEY_CLAIMER, claimer_)], unit)
133+ else throw("Strict value is not equal to itself.")
134+ }
35135 else throw("Strict value is not equal to itself.")
36136 }
37137
75175 else $Tuple2([ScriptTransfer(i.caller, amount_, unit)], unit)
76176
77177
178+
179+@Callable(i)
180+func getAvailableWAVESDLP () = $Tuple2(nil, _getAvailableWAVESDLP())
181+
182+
183+
184+@Callable(i)
185+func claimAndSwapWAVESDLP () = {
186+ let asset = _getWAVESDLPAsset()
187+ let claimedAmount = _claimWAVESDLP()
188+ if ((claimedAmount == claimedAmount))
189+ then {
190+ let totalAmount = assetBalance(this, asset)
191+ if ((totalAmount == totalAmount))
192+ then {
193+ let swapLimit = _loadSwapLimit()
194+ let amountToSwap = if ((totalAmount > swapLimit))
195+ then swapLimit
196+ else totalAmount
197+ let result = if ((height > (_loadLastSwapAt() + ONE_HOUR_IN_BLOCKS)))
198+ then invoke(_loadSwapContract(), FUNC_SWAP, [1, "", toString(this)], [AttachedPayment(asset, amountToSwap)])
199+ else throw("claimAndSwapWAVESDLP: too often")
200+ if ((result == result))
201+ then match result {
202+ case a: Int =>
203+ if ((a > COMPENSATION))
204+ then $Tuple2((_saveLastSwapAt(height) ++ [ScriptTransfer(i.caller, COMPENSATION, unit)]), unit)
205+ else throw("claimAndSwapWAVESDLP: too little amount got")
206+ case _ =>
207+ throw("claimAndSwapWAVESDLP: swap revert")
208+ }
209+ else throw("Strict value is not equal to itself.")
210+ }
211+ else throw("Strict value is not equal to itself.")
212+ }
213+ else throw("Strict value is not equal to itself.")
214+ }
215+
216+
217+
218+@Callable(i)
219+func setWavesDAOContract (address_) = {
220+ let err = if ((i.caller != this))
221+ then throw("setWavesDAOContract: permission denied")
222+ else if (!(_validateAddress(address_)))
223+ then throw("setWavesDAOContract: invalid address")
224+ else unit
225+ if ((err == err))
226+ then $Tuple2(_saveWavesDAOContract(addressFromStringValue(address_)), unit)
227+ else throw("Strict value is not equal to itself.")
228+ }
229+
230+
231+
232+@Callable(i)
233+func setSwapContract (address_) = {
234+ let err = if ((i.caller != this))
235+ then throw("setSwapContract: permission denied")
236+ else if (!(_validateAddress(address_)))
237+ then throw("setSwapContract: invalid address")
238+ else unit
239+ if ((err == err))
240+ then $Tuple2(_saveSwapContract(addressFromStringValue(address_)), unit)
241+ else throw("Strict value is not equal to itself.")
242+ }
243+
244+
245+
246+@Callable(i)
247+func setSwapLimit (limit_) = {
248+ let err = if ((i.caller != this))
249+ then throw("setSwapLimit: permission denied")
250+ else if ((0 >= limit_))
251+ then throw("setSwapLimit: invalid limit")
252+ else unit
253+ if ((err == err))
254+ then $Tuple2(_saveSwapLimit(limit_), unit)
255+ else throw("Strict value is not equal to itself.")
256+ }
257+
258+
78259 @Verifier(tx)
79260 func verify () = match getString(KEY_MULTISIG) {
80261 case multisig: String =>
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEPARATOR = "__"
55
66 let KEY_INIT = "INIT"
77
88 let KEY_MULTISIG = "MULTISIG"
99
1010 let KEY_STATUS = "STATUS"
1111
1212 let KEY_CLAIMER = "CLAIMER"
1313
14+let KEY_LAST_SWAP_AT = "LAST_SWAP_AT"
15+
16+let KEY_WAVES_DAO_CONTRACT = "WAVES_DAO_CONTRACT"
17+
18+let KEY_SWAP_CONTRACT = "SWAP_CONTRACT"
19+
20+let KEY_SWAP_LIMIT = "SWAP_LIMIT"
21+
22+let FUNC_CLAIM_LP = "claimLP"
23+
24+let FUNC_SWAP = "swap"
25+
26+let ONE_HOUR_IN_BLOCKS = 60
27+
28+let COMPENSATION = 500000
29+
1430 func _validateAddress (address_) = match addressFromString(address_) {
1531 case a: Address =>
1632 true
1733 case _ =>
1834 false
1935 }
2036
2137
38+func _validateInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_))
39+ then true
40+ else (val_ > upperBoundary_))
41+ then throw(err_)
42+ else true
43+
44+
45+func _loadWavesDAOContract () = match getString(KEY_WAVES_DAO_CONTRACT) {
46+ case a: String =>
47+ addressFromStringValue(a)
48+ case _ =>
49+ Address(base58'')
50+}
51+
52+
53+func _saveWavesDAOContract (val_) = [StringEntry(KEY_WAVES_DAO_CONTRACT, toString(val_))]
54+
55+
56+func _loadSwapContract () = match getString(KEY_SWAP_CONTRACT) {
57+ case a: String =>
58+ addressFromStringValue(a)
59+ case _ =>
60+ Address(base58'')
61+}
62+
63+
64+func _saveSwapContract (val_) = [StringEntry(KEY_SWAP_CONTRACT, toString(val_))]
65+
66+
67+func _loadLastSwapAt () = match getInteger(KEY_LAST_SWAP_AT) {
68+ case a: Int =>
69+ a
70+ case _ =>
71+ 0
72+}
73+
74+
75+func _saveLastSwapAt (val_) = [IntegerEntry(KEY_LAST_SWAP_AT, val_)]
76+
77+
78+func _loadSwapLimit () = match getInteger(KEY_SWAP_LIMIT) {
79+ case a: Int =>
80+ a
81+ case _ =>
82+ 0
83+}
84+
85+
86+func _saveSwapLimit (val_) = [IntegerEntry(KEY_SWAP_LIMIT, val_)]
87+
88+
89+func _getWAVESDLPAsset () = match getString(_loadWavesDAOContract(), "%s__lpAssetId") {
90+ case a: String =>
91+ fromBase58String(a)
92+ case _ =>
93+ throw("_getWAVESDLPAsset: revert")
94+}
95+
96+
97+func _getAvailableWAVESDLP () = match getInteger(_loadWavesDAOContract(), ("%s%s__available__" + toString(this))) {
98+ case a: Int =>
99+ a
100+ case _ =>
101+ 0
102+}
103+
104+
105+func _claimWAVESDLP () = {
106+ let result = invoke(_loadWavesDAOContract(), FUNC_CLAIM_LP, nil, nil)
107+ if ((result == result))
108+ then match result {
109+ case a: Int =>
110+ a
111+ case _ =>
112+ throw("_claimWAVESDLP: revert")
113+ }
114+ else throw("Strict value is not equal to itself.")
115+ }
116+
117+
22118 @Callable(i)
23119 func init (claimer_) = {
24120 let multisig = valueOrErrorMessage(getString(KEY_MULTISIG), "init: no multisig set")
25- let init = valueOrElse(getBoolean(KEY_INIT), false)
26- let err = if ((i.caller != this))
27- then throw("init: permission denied")
28- else if (init)
29- then throw("init: already initialized")
30- else if (!(_validateAddress(claimer_)))
31- then throw("init: invalid claimer address")
32- else unit
33- if ((err == err))
34- then $Tuple2([BooleanEntry(KEY_INIT, true), StringEntry(KEY_CLAIMER, claimer_)], unit)
121+ if ((multisig == multisig))
122+ then {
123+ let init = valueOrElse(getBoolean(KEY_INIT), false)
124+ let err = if ((i.caller != this))
125+ then throw("init: permission denied")
126+ else if (init)
127+ then throw("init: already initialized")
128+ else if (!(_validateAddress(claimer_)))
129+ then throw("init: invalid claimer address")
130+ else unit
131+ if ((err == err))
132+ then $Tuple2([BooleanEntry(KEY_INIT, true), StringEntry(KEY_CLAIMER, claimer_)], unit)
133+ else throw("Strict value is not equal to itself.")
134+ }
35135 else throw("Strict value is not equal to itself.")
36136 }
37137
38138
39139
40140 @Callable(i)
41141 func setMultisig (multisig_) = {
42142 let err = if ((i.caller != this))
43143 then throw("setMultisig: permission denied")
44144 else if (!(_validateAddress(multisig_)))
45145 then throw("setMultisig: invalid multisig address")
46146 else unit
47147 if ((err == err))
48148 then $Tuple2([StringEntry(KEY_MULTISIG, multisig_)], unit)
49149 else throw("Strict value is not equal to itself.")
50150 }
51151
52152
53153
54154 @Callable(i)
55155 func setClaimer (claimer_) = {
56156 let err = if ((i.caller != this))
57157 then throw("setClaimer: permission denied")
58158 else if (!(_validateAddress(claimer_)))
59159 then throw("setClaimer: invalid claimer address")
60160 else unit
61161 if ((err == err))
62162 then $Tuple2([StringEntry(KEY_CLAIMER, claimer_)], unit)
63163 else throw("Strict value is not equal to itself.")
64164 }
65165
66166
67167
68168 @Callable(i)
69169 func claim (amount_) = if ((i.caller != addressFromStringValue(getStringValue(KEY_CLAIMER))))
70170 then throw("claim: permission denied")
71171 else if (if ((0 >= amount_))
72172 then true
73173 else (amount_ > wavesBalance(this).regular))
74174 then throw("claim: invalid amount")
75175 else $Tuple2([ScriptTransfer(i.caller, amount_, unit)], unit)
76176
77177
178+
179+@Callable(i)
180+func getAvailableWAVESDLP () = $Tuple2(nil, _getAvailableWAVESDLP())
181+
182+
183+
184+@Callable(i)
185+func claimAndSwapWAVESDLP () = {
186+ let asset = _getWAVESDLPAsset()
187+ let claimedAmount = _claimWAVESDLP()
188+ if ((claimedAmount == claimedAmount))
189+ then {
190+ let totalAmount = assetBalance(this, asset)
191+ if ((totalAmount == totalAmount))
192+ then {
193+ let swapLimit = _loadSwapLimit()
194+ let amountToSwap = if ((totalAmount > swapLimit))
195+ then swapLimit
196+ else totalAmount
197+ let result = if ((height > (_loadLastSwapAt() + ONE_HOUR_IN_BLOCKS)))
198+ then invoke(_loadSwapContract(), FUNC_SWAP, [1, "", toString(this)], [AttachedPayment(asset, amountToSwap)])
199+ else throw("claimAndSwapWAVESDLP: too often")
200+ if ((result == result))
201+ then match result {
202+ case a: Int =>
203+ if ((a > COMPENSATION))
204+ then $Tuple2((_saveLastSwapAt(height) ++ [ScriptTransfer(i.caller, COMPENSATION, unit)]), unit)
205+ else throw("claimAndSwapWAVESDLP: too little amount got")
206+ case _ =>
207+ throw("claimAndSwapWAVESDLP: swap revert")
208+ }
209+ else throw("Strict value is not equal to itself.")
210+ }
211+ else throw("Strict value is not equal to itself.")
212+ }
213+ else throw("Strict value is not equal to itself.")
214+ }
215+
216+
217+
218+@Callable(i)
219+func setWavesDAOContract (address_) = {
220+ let err = if ((i.caller != this))
221+ then throw("setWavesDAOContract: permission denied")
222+ else if (!(_validateAddress(address_)))
223+ then throw("setWavesDAOContract: invalid address")
224+ else unit
225+ if ((err == err))
226+ then $Tuple2(_saveWavesDAOContract(addressFromStringValue(address_)), unit)
227+ else throw("Strict value is not equal to itself.")
228+ }
229+
230+
231+
232+@Callable(i)
233+func setSwapContract (address_) = {
234+ let err = if ((i.caller != this))
235+ then throw("setSwapContract: permission denied")
236+ else if (!(_validateAddress(address_)))
237+ then throw("setSwapContract: invalid address")
238+ else unit
239+ if ((err == err))
240+ then $Tuple2(_saveSwapContract(addressFromStringValue(address_)), unit)
241+ else throw("Strict value is not equal to itself.")
242+ }
243+
244+
245+
246+@Callable(i)
247+func setSwapLimit (limit_) = {
248+ let err = if ((i.caller != this))
249+ then throw("setSwapLimit: permission denied")
250+ else if ((0 >= limit_))
251+ then throw("setSwapLimit: invalid limit")
252+ else unit
253+ if ((err == err))
254+ then $Tuple2(_saveSwapLimit(limit_), unit)
255+ else throw("Strict value is not equal to itself.")
256+ }
257+
258+
78259 @Verifier(tx)
79260 func verify () = match getString(KEY_MULTISIG) {
80261 case multisig: String =>
81262 valueOrElse(getBoolean(addressFromStringValue(multisig), makeString([KEY_STATUS, toString(this), toBase58String(tx.id)], SEPARATOR)), false)
82263 case _ =>
83264 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
84265 }
85266

github/deemru/w8io/786bc32 
28.52 ms