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:
Old | New | Differences | |
---|---|---|---|
11 | 11 | ||
12 | 12 | let KEY_CLAIMER = "CLAIMER" | |
13 | 13 | ||
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 | + | ||
14 | 30 | func _validateAddress (address_) = match addressFromString(address_) { | |
15 | 31 | case a: Address => | |
16 | 32 | true | |
19 | 35 | } | |
20 | 36 | ||
21 | 37 | ||
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 | + | ||
22 | 118 | @Callable(i) | |
23 | 119 | func init (claimer_) = { | |
24 | 120 | 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 | + | } | |
35 | 135 | else throw("Strict value is not equal to itself.") | |
36 | 136 | } | |
37 | 137 | ||
75 | 175 | else $Tuple2([ScriptTransfer(i.caller, amount_, unit)], unit) | |
76 | 176 | ||
77 | 177 | ||
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 | + | ||
78 | 259 | @Verifier(tx) | |
79 | 260 | func verify () = match getString(KEY_MULTISIG) { | |
80 | 261 | case multisig: String => |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let SEPARATOR = "__" | |
5 | 5 | ||
6 | 6 | let KEY_INIT = "INIT" | |
7 | 7 | ||
8 | 8 | let KEY_MULTISIG = "MULTISIG" | |
9 | 9 | ||
10 | 10 | let KEY_STATUS = "STATUS" | |
11 | 11 | ||
12 | 12 | let KEY_CLAIMER = "CLAIMER" | |
13 | 13 | ||
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 | + | ||
14 | 30 | func _validateAddress (address_) = match addressFromString(address_) { | |
15 | 31 | case a: Address => | |
16 | 32 | true | |
17 | 33 | case _ => | |
18 | 34 | false | |
19 | 35 | } | |
20 | 36 | ||
21 | 37 | ||
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 | + | ||
22 | 118 | @Callable(i) | |
23 | 119 | func init (claimer_) = { | |
24 | 120 | 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 | + | } | |
35 | 135 | else throw("Strict value is not equal to itself.") | |
36 | 136 | } | |
37 | 137 | ||
38 | 138 | ||
39 | 139 | ||
40 | 140 | @Callable(i) | |
41 | 141 | func setMultisig (multisig_) = { | |
42 | 142 | let err = if ((i.caller != this)) | |
43 | 143 | then throw("setMultisig: permission denied") | |
44 | 144 | else if (!(_validateAddress(multisig_))) | |
45 | 145 | then throw("setMultisig: invalid multisig address") | |
46 | 146 | else unit | |
47 | 147 | if ((err == err)) | |
48 | 148 | then $Tuple2([StringEntry(KEY_MULTISIG, multisig_)], unit) | |
49 | 149 | else throw("Strict value is not equal to itself.") | |
50 | 150 | } | |
51 | 151 | ||
52 | 152 | ||
53 | 153 | ||
54 | 154 | @Callable(i) | |
55 | 155 | func setClaimer (claimer_) = { | |
56 | 156 | let err = if ((i.caller != this)) | |
57 | 157 | then throw("setClaimer: permission denied") | |
58 | 158 | else if (!(_validateAddress(claimer_))) | |
59 | 159 | then throw("setClaimer: invalid claimer address") | |
60 | 160 | else unit | |
61 | 161 | if ((err == err)) | |
62 | 162 | then $Tuple2([StringEntry(KEY_CLAIMER, claimer_)], unit) | |
63 | 163 | else throw("Strict value is not equal to itself.") | |
64 | 164 | } | |
65 | 165 | ||
66 | 166 | ||
67 | 167 | ||
68 | 168 | @Callable(i) | |
69 | 169 | func claim (amount_) = if ((i.caller != addressFromStringValue(getStringValue(KEY_CLAIMER)))) | |
70 | 170 | then throw("claim: permission denied") | |
71 | 171 | else if (if ((0 >= amount_)) | |
72 | 172 | then true | |
73 | 173 | else (amount_ > wavesBalance(this).regular)) | |
74 | 174 | then throw("claim: invalid amount") | |
75 | 175 | else $Tuple2([ScriptTransfer(i.caller, amount_, unit)], unit) | |
76 | 176 | ||
77 | 177 | ||
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 | + | ||
78 | 259 | @Verifier(tx) | |
79 | 260 | func verify () = match getString(KEY_MULTISIG) { | |
80 | 261 | case multisig: String => | |
81 | 262 | valueOrElse(getBoolean(addressFromStringValue(multisig), makeString([KEY_STATUS, toString(this), toBase58String(tx.id)], SEPARATOR)), false) | |
82 | 263 | case _ => | |
83 | 264 | sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
84 | 265 | } | |
85 | 266 |
github/deemru/w8io/786bc32 28.52 ms ◑