tx · Dwnd5VT42aUjjFR4iRzo8WW5HP4KdF18s8Tb2NbeWpH8

3NBbSp7yXAeyAmM8uuoenTt3XFfCGQZsHon:  -0.01300000 Waves

2023.07.19 14:44 [2672693] smart account 3NBbSp7yXAeyAmM8uuoenTt3XFfCGQZsHon > SELF 0.00000000 Waves

{ "type": 13, "id": "Dwnd5VT42aUjjFR4iRzo8WW5HP4KdF18s8Tb2NbeWpH8", "fee": 1300000, "feeAssetId": null, "timestamp": 1689767072039, "version": 2, "chainId": 84, "sender": "3NBbSp7yXAeyAmM8uuoenTt3XFfCGQZsHon", "senderPublicKey": "EdMvX1KG6dSSSsAqgamTtbKQho4ZLojCVgcBU4CDSeix", "proofs": [ "454oUC2bMw7mk7UYXhDs3FoHmmd7y18uZm6MFa12XLYLC6y7LsA5v7kK6thiPBb46LPacTMqrMHxXoiUpjFEuSry" ], "script": "base64:BgIQCAISBQoDAQgIEgUKAwEICBcAA1NFUAICX18ACGZlZVNjYWxlCQC2AgEAgMLXLwEPZ2V0U3RyaW5nT3JGYWlsAQNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQNrZXkJAKwCAgIVTm8gZGF0YSBmb3IgdGhpcy5rZXk9BQNrZXkADHBvb2xEaXNhYmxlZAkAAgECDVBvb2wgZGlzYWJsZWQADHBvb2xOb3RFeGlzdAkAAgECEVBvb2wgaXMgbm90IGV4aXN0AA5zbGlwcGFnZVRvb0JpZwkAAgECE1NsaXBwYWdlIGlzIHRvbyBiaWcBE2tleU1hbmFnZXJQdWJsaWNLZXkAAhQlc19fbWFuYWdlclB1YmxpY0tleQEWa2V5TWFuYWdlclZhdWx0QWRkcmVzcwACFyVzX19tYW5hZ2VyVmF1bHRBZGRyZXNzAQJmYwACEyVzX19mYWN0b3J5Q29udHJhY3QAD2ZhY3RvcnlDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBD2dldFN0cmluZ09yRmFpbAEJAQJmYwABC3Byb3RvY29sRmVlAAkAuQkCCQDMCAICAiVzCQDMCAICC3Byb3RvY29sRmVlBQNuaWwFA1NFUAEHcG9vbEZlZQAJALkJAgkAzAgCAgIlcwkAzAgCAgdwb29sRmVlBQNuaWwFA1NFUAEaZ2V0U3RyaW5nT3JGYWlsRnJvbUFkZHJlc3MCB2FkZHJlc3MDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUHYWRkcmVzcwUDa2V5CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFB2FkZHJlc3MJAMwIAgIBLgkAzAgCBQNrZXkJAMwIAgIPIGlzIG5vdCBkZWZpbmVkBQNuaWwCAAAWa2V5RmVlQ29sbGVjdG9yQWRkcmVzcwIXJXNfX2ZlZUNvbGxlY3RvckFkZHJlc3MAE2ZlZUNvbGxlY3RvckFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARpnZXRTdHJpbmdPckZhaWxGcm9tQWRkcmVzcwIFD2ZhY3RvcnlDb250cmFjdAUWa2V5RmVlQ29sbGVjdG9yQWRkcmVzcwEcZ2V0TWFuYWdlclZhdWx0QWRkcmVzc09yVGhpcwAEByRtYXRjaDAJAKIIAQkBFmtleU1hbmFnZXJWYXVsdEFkZHJlc3MAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBcwUEdGhpcwEFYXNJbnQBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACA0ludAQGdmFsSW50BQckbWF0Y2gwBQZ2YWxJbnQJAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBFWRhdGFNYXBwaW5nUG9vbEFzc2V0cwIWaW50ZXJuYWxBbW91bnRBc3NldFN0chVpbnRlcm5hbFByaWNlQXNzZXRTdHIJALkJAgkAzAgCAgQlZCVkCQDMCAIJAKQDAQUWaW50ZXJuYWxBbW91bnRBc3NldFN0cgkAzAgCCQCkAwEFFWludGVybmFsUHJpY2VBc3NldFN0cgUDbmlsBQNTRVABFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQABBNtYW5hZ2VyVmF1bHRBZGRyZXNzCQEcZ2V0TWFuYWdlclZhdWx0QWRkcmVzc09yVGhpcwAEByRtYXRjaDAJAJ0IAgUTbWFuYWdlclZhdWx0QWRkcmVzcwkBE2tleU1hbmFnZXJQdWJsaWNLZXkAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkA2QQBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgEJaXNNYW5hZ2VyAQFpBAckbWF0Y2gwCQEWbWFuYWdlclB1YmxpY0tleU9yVW5pdAADCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCcGsFByRtYXRjaDAJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFAnBrAwkAAQIFByRtYXRjaDACBFVuaXQJAAACCAUBaQZjYWxsZXIFBHRoaXMJAAIBAgtNYXRjaCBlcnJvcgELbXVzdE1hbmFnZXIBAWkDCQEJaXNNYW5hZ2VyAQUBaQYJAAIBAhFwZXJtaXNzaW9uIGRlbmllZAENZ2V0QWNjQmFsYW5jZQEHYXNzZXRJZAMJAAACBQdhc3NldElkAgVXQVZFUwgJAO8HAQUEdGhpcwlhdmFpbGFibGUJAPAHAgUEdGhpcwkA2QQBBQdhc3NldElkASBnZXRQb29sQWRkcmVzc0FuZENoZWNrUG9vbFN0YXR1cwIHYXNzZXRJbghhc3NldE91dAQMbHBOb25SZXZlcnNlCgABQAkA/AcEBQ9mYWN0b3J5Q29udHJhY3QCIGdldExwQXNzZXRGcm9tUG9vbEFzc2V0c1JFQURPTkxZCQDMCAIFB2Fzc2V0SW4JAMwIAgUIYXNzZXRPdXQFA25pbAUDbmlsAwkAAQIFAUACBlN0cmluZwUBQAUEdW5pdAQJbHBSZXZlcnNlCgABQAkA/AcEBQ9mYWN0b3J5Q29udHJhY3QCIGdldExwQXNzZXRGcm9tUG9vbEFzc2V0c1JFQURPTkxZCQDMCAIFCGFzc2V0T3V0CQDMCAIFB2Fzc2V0SW4FA25pbAUDbmlsAwkAAQIFAUACBlN0cmluZwUBQAUEdW5pdAQLJHQwMjYxNjMwNzUDCQECIT0CBQxscE5vblJldmVyc2UFBHVuaXQEBHBvb2wKAAFACQD8BwQFD2ZhY3RvcnlDb250cmFjdAIhZ2V0UG9vbEFkZHJlc3NGcm9tTHBBc3NldFJFQURPTkxZCQDMCAIJAQV2YWx1ZQEFDGxwTm9uUmV2ZXJzZQUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nCQCUCgIHBQRwb29sAwkBAiE9AgUJbHBSZXZlcnNlBQR1bml0BARwb29sCgABQAkA/AcEBQ9mYWN0b3J5Q29udHJhY3QCIWdldFBvb2xBZGRyZXNzRnJvbUxwQXNzZXRSRUFET05MWQkAzAgCCQEFdmFsdWUBBQlscFJldmVyc2UFA25pbAUDbmlsAwkAAQIFAUACBlN0cmluZwUBQAkAAgEJAKwCAgkAAwEFAUACGyBjb3VsZG4ndCBiZSBjYXN0IHRvIFN0cmluZwkAlAoCBgUEcG9vbAUMcG9vbE5vdEV4aXN0BAlpc1JldmVyc2UIBQskdDAyNjE2MzA3NQJfMQQEcG9vbAgFCyR0MDI2MTYzMDc1Al8yBApwb29sU3RhdHVzCgABQAkA/AcEBQ9mYWN0b3J5Q29udHJhY3QCFWdldFBvb2xTdGF0dXNSRUFET05MWQkAzAgCBQRwb29sBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQEBWNoZWNrAwkAAAIFCnBvb2xTdGF0dXMAAQYFDHBvb2xEaXNhYmxlZAMJAAACBQVjaGVjawUFY2hlY2sEB3Bvb2xBZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQt2YWx1ZU9yRWxzZQIFBHBvb2wCAAkAlAoCBQdwb29sQWRyBQlpc1JldmVyc2UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CAWkBFXN3YXBDYWxjdWxhdGVSRUFET05MWQMIYW1vdW50SW4HYXNzZXRJbghhc3NldE91dAQFcHJGZWUJAQV2YWx1ZQEJAJ8IAQkBC3Byb3RvY29sRmVlAAQVZmVlUHJvdG9jb2xBbW91bnRDYWxjCQC8AgMJALYCAQUIYW1vdW50SW4JALYCAQUFcHJGZWUFCGZlZVNjYWxlBAVwbEZlZQkBBXZhbHVlAQkAnwgBCQEHcG9vbEZlZQAEEWZlZVBvb2xBbW91bnRDYWxjCQC8AgMJALYCAQUIYW1vdW50SW4JALYCAQUFcGxGZWUFCGZlZVNjYWxlBBFmZWVQcm90b2NvbEFtb3VudAMJAAACCQCgAwEFFWZlZVByb3RvY29sQW1vdW50Q2FsYwAACQC2AgEAAQUVZmVlUHJvdG9jb2xBbW91bnRDYWxjBA1mZWVQb29sQW1vdW50AwkAAAIJAKADAQURZmVlUG9vbEFtb3VudENhbGMAAAkAtgIBAAEFEWZlZVBvb2xBbW91bnRDYWxjBA1jbGVhbkFtb3VudEluCQC4AgIJALgCAgkAtgIBBQhhbW91bnRJbgURZmVlUHJvdG9jb2xBbW91bnQFDWZlZVBvb2xBbW91bnQECyR0MDQwNjM0MTQxCQEgZ2V0UG9vbEFkZHJlc3NBbmRDaGVja1Bvb2xTdGF0dXMCBQdhc3NldEluBQhhc3NldE91dAQHcG9vbEFkcggFCyR0MDQwNjM0MTQxAl8xBAlpc1JldmVyc2UIBQskdDA0MDYzNDE0MQJfMgQDcmVzCgABQAkA/AcEBQdwb29sQWRyAiFjYWxjdWxhdGVBbW91bnRPdXRGb3JTd2FwUkVBRE9OTFkJAMwIAgkAoAMBBQ1jbGVhbkFtb3VudEluCQDMCAIFCWlzUmV2ZXJzZQkAzAgCCQCgAwEFDWZlZVBvb2xBbW91bnQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAkAlAoCBQNuaWwFA3JlcwFpAQRzd2FwAwxhbW91bnRPdXRNaW4LYXNzZXRPdXRSYXcJYWRkcmVzc1RvBAhhc3NldE91dAMJAAACBQthc3NldE91dFJhdwIAAgVXQVZFUwULYXNzZXRPdXRSYXcEA3BtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAdhc3NldEluAwkAAAIIBQNwbXQHYXNzZXRJZAUEdW5pdAIFV0FWRVMJANgEAQkBBXZhbHVlAQgFA3BtdAdhc3NldElkBAhhbW91bnRJbgkBBXZhbHVlAQgFA3BtdAZhbW91bnQEBXByRmVlCQEFdmFsdWUBCQCfCAEJAQtwcm90b2NvbEZlZQAEFWZlZVByb3RvY29sQW1vdW50Q2FsYwkAvAIDCQC2AgEFCGFtb3VudEluCQC2AgEFBXByRmVlBQhmZWVTY2FsZQQFcGxGZWUJAQV2YWx1ZQEJAJ8IAQkBB3Bvb2xGZWUABBFmZWVQb29sQW1vdW50Q2FsYwkAvAIDCQC2AgEFCGFtb3VudEluCQC2AgEFBXBsRmVlBQhmZWVTY2FsZQQRZmVlUHJvdG9jb2xBbW91bnQDCQAAAgkAoAMBBRVmZWVQcm90b2NvbEFtb3VudENhbGMAAAkAtgIBAAEFFWZlZVByb3RvY29sQW1vdW50Q2FsYwQNZmVlUG9vbEFtb3VudAMJAAACCQCgAwEFEWZlZVBvb2xBbW91bnRDYWxjAAAJALYCAQABBRFmZWVQb29sQW1vdW50Q2FsYwQNY2xlYW5BbW91bnRJbgkAuAICCQC4AgIJALYCAQUIYW1vdW50SW4FEWZlZVByb3RvY29sQW1vdW50BQ1mZWVQb29sQW1vdW50BAZjaGVja3MJAMwIAgMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEGCQACAQIeZXhhY3RseSAxIHBheW1lbnQgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MECyR0MDUzNDM1NDIxCQEgZ2V0UG9vbEFkZHJlc3NBbmRDaGVja1Bvb2xTdGF0dXMCBQdhc3NldEluBQhhc3NldE91dAQHcG9vbEFkcggFCyR0MDUzNDM1NDIxAl8xBAlpc1JldmVyc2UIBQskdDA1MzQzNTQyMQJfMgQWYXNzZXRJbkF0dGFjaGVkUGF5bWVudAMJAAACBQdhc3NldEluAgVXQVZFUwUEdW5pdAkA2QQBBQdhc3NldEluBAt0b3RhbEdldFJhdwoAAUAJAPwHBAUHcG9vbEFkcgImY2FsY3VsYXRlQW1vdW50T3V0Rm9yU3dhcEFuZFNlbmRUb2tlbnMJAMwIAgkAoAMBBQ1jbGVhbkFtb3VudEluCQDMCAIFCWlzUmV2ZXJzZQkAzAgCBQxhbW91bnRPdXRNaW4JAMwIAgUJYWRkcmVzc1RvCQDMCAIJAKADAQUNZmVlUG9vbEFtb3VudAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBRZhc3NldEluQXR0YWNoZWRQYXltZW50CQCgAwEFDWNsZWFuQW1vdW50SW4FA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQJAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRNmZWVDb2xsZWN0b3JBZGRyZXNzCQCgAwEFEWZlZVByb3RvY29sQW1vdW50BRZhc3NldEluQXR0YWNoZWRQYXltZW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFB3Bvb2xBZHIJAKADAQUNZmVlUG9vbEFtb3VudAUWYXNzZXRJbkF0dGFjaGVkUGF5bWVudAUDbmlsBQt0b3RhbEdldFJhdwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAED3RhcmdldFB1YmxpY0tleQQHJG1hdGNoMAkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAnBrBQckbWF0Y2gwBQJwawMJAAECBQckbWF0Y2gwAgRVbml0CAUCdHgPc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFD3RhcmdldFB1YmxpY0tleQoA0Bo=", "height": 2672693, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 69unUFWTY6stpkjA9rUkqNCJHKKiKxx5ozz1ZAs4jLYv Next: none Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let separator = "__"
4+let SEP = "__"
55
6-let shareAssetDecimals = 8
6+let feeScale = toBigInt(100000000)
77
8-let wavesString = "WAVES"
9-
10-let scale18 = 1000000000000000000
11-
12-let scale18BigInt = toBigInt(scale18)
13-
14-func wrapErr (msg) = makeString(["lp_staking_pools.ride:", msg], " ")
8+func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), ("No data for this.key=" + key))
159
1610
17-func throwErr (msg) = throw(wrapErr(msg))
11+let poolDisabled = throw("Pool disabled")
1812
13+let poolNotExist = throw("Pool is not exist")
1914
20-func errKeyIsNotDefined (address,key) = wrapErr(makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
21-
22-
23-func getStrOrFail (address,key) = valueOrErrorMessage(getString(address, key), errKeyIsNotDefined(address, key))
24-
25-
26-func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), errKeyIsNotDefined(address, key))
27-
28-
29-func parseAssetId (input) = if ((input == wavesString))
30- then unit
31- else fromBase58String(input)
32-
33-
34-func assetIdToString (input) = if ((input == unit))
35- then wavesString
36- else toBase58String(value(input))
37-
38-
39-func ensurePositive (v) = if ((v >= 0))
40- then v
41- else throwErr("value should be positive")
42-
43-
44-func keyFactoryContract () = makeString(["%s", "factoryContract"], separator)
45-
46-
47-func keyLpStakingContract () = makeString(["%s", "lpStakingContract"], separator)
48-
49-
50-func keyStakingContract () = makeString(["%s", "stakingContract"], separator)
51-
52-
53-func keyBoostingContract () = makeString(["%s", "boostingContract"], separator)
54-
55-
56-func keySwapContract () = makeString(["%s", "swapContract"], separator)
57-
58-
59-func keyAssetsStoreContract () = makeString(["%s", "assetsStoreContract"], separator)
60-
61-
62-func keyUsdtAssetId () = makeString(["%s", "usdtAssetId"], separator)
63-
64-
65-func keyWxAssetId () = makeString(["%s", "wxAssetId"], separator)
66-
67-
68-func keyShutdown () = makeString(["%s", "shutdown"], separator)
69-
70-
71-func keyMinDelay () = makeString(["%s", "minDelay"], separator)
72-
73-
74-func keyLockFraction () = makeString(["%s", "lockFraction"], separator)
75-
76-
77-func keyShareAssetId (baseAssetId) = makeString(["%s%s", assetIdToString(baseAssetId), "shareAssetId"], separator)
78-
79-
80-func keyBaseAssetId (shareAssetId) = makeString(["%s%s", assetIdToString(shareAssetId), "baseAssetId"], separator)
81-
82-
83-func keyPeriod (baseAssetId) = makeString(["%s%s", assetIdToString(baseAssetId), "period"], separator)
84-
85-
86-func keyPeriodStartHeight (baseAssetId,period) = makeString(["%s%s%d", assetIdToString(baseAssetId), "periodStartHeight", toString(period)], separator)
87-
88-
89-func keyBaseAssetAmountToConvert (baseAssetId) = makeString(["%s%s", assetIdToString(baseAssetId), "baseAssetAmountToConvert"], separator)
90-
91-
92-func keyShareAssetAmountToConvert (baseAssetId) = makeString(["%s%s", assetIdToString(baseAssetId), "shareAssetAmountToConvert"], separator)
93-
94-
95-func keyUserBaseAssetAmountToConvert (baseAssetId,userAddress) = makeString(["%s%s%s", assetIdToString(baseAssetId), toString(userAddress), "baseAssetAmountToConvert"], separator)
96-
97-
98-func keyUserBaseAssetAmountToConvertPeriod (baseAssetId,userAddress) = makeString(["%s%s%s%s", assetIdToString(baseAssetId), toString(userAddress), "baseAssetAmountToConvert", "period"], separator)
99-
100-
101-func keyUserShareAssetAmountToConvert (baseAssetId,userAddress) = makeString(["%s%s%s", assetIdToString(baseAssetId), toString(userAddress), "shareAssetAmountToConvert"], separator)
102-
103-
104-func keyUserShareAssetAmountToConvertPeriod (baseAssetId,userAddress) = makeString(["%s%s%s%s", assetIdToString(baseAssetId), toString(userAddress), "shareAssetAmountToConvert", "period"], separator)
105-
106-
107-func keyPricePeriod (baseAssetId,period) = makeString(["%s%s%d", assetIdToString(baseAssetId), "price", toString(period)], separator)
108-
109-
110-func keyPriceHistory (baseAssetId) = makeString(["%s%s%s%d%d", assetIdToString(baseAssetId), "price", "history", toString(lastBlock.height), toString(lastBlock.timestamp)], separator)
111-
112-
113-func keyPricePeriodPut (baseAssetId,period) = makeString(["%s%s%d%s", assetIdToString(baseAssetId), "price", toString(period), "put"], separator)
114-
115-
116-func keyPricePutHistory (baseAssetId) = makeString(["%s%s%s%s%d%d", assetIdToString(baseAssetId), "price", "history", "put", toString(lastBlock.height), toString(lastBlock.timestamp)], separator)
117-
118-
119-func keyPricePeriodGet (baseAssetId,period) = makeString(["%s%s%d%s", assetIdToString(baseAssetId), "price", toString(period), "get"], separator)
120-
121-
122-func keyPriceGetHistory (baseAssetId) = makeString(["%s%s%s%s%d%d", assetIdToString(baseAssetId), "price", "history", "get", toString(lastBlock.height), toString(lastBlock.timestamp)], separator)
123-
124-
125-func keyHistoryEntry (baseAssetId,operation,period,userAddress,txId) = makeString(["%s%s%s%s", "history", toBase58String(value(baseAssetId)), operation, toString(userAddress), toBase58String(txId), toString(height)], separator)
126-
15+let slippageTooBig = throw("Slippage is too big")
12716
12817 func keyManagerPublicKey () = "%s__managerPublicKey"
12918
13120 func keyManagerVaultAddress () = "%s__managerVaultAddress"
13221
13322
23+func fc () = "%s__factoryContract"
24+
25+
26+let factoryContract = addressFromStringValue(getStringOrFail(fc()))
27+
28+func protocolFee () = makeString(["%s", "protocolFee"], SEP)
29+
30+
31+func poolFee () = makeString(["%s", "poolFee"], SEP)
32+
33+
34+func getStringOrFailFromAddress (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
35+
36+
37+let keyFeeCollectorAddress = "%s__feeCollectorAddress"
38+
39+let feeCollectorAddress = addressFromStringValue(getStringOrFailFromAddress(factoryContract, keyFeeCollectorAddress))
40+
13441 func getManagerVaultAddressOrThis () = match getString(keyManagerVaultAddress()) {
13542 case s: String =>
13643 addressFromStringValue(s)
13744 case _ =>
13845 this
13946 }
47+
48+
49+func asInt (val) = match val {
50+ case valInt: Int =>
51+ valInt
52+ case _ =>
53+ throw("fail to cast into Int")
54+}
55+
56+
57+func dataMappingPoolAssets (internalAmountAssetStr,internalPriceAssetStr) = makeString(["%d%d", toString(internalAmountAssetStr), toString(internalPriceAssetStr)], SEP)
14058
14159
14260 func managerPublicKeyOrUnit () = {
15270 }
15371
15472
155-let permissionDeniedError = throw("Permission denied")
156-
157-func mustThis (i) = if ((i.caller == this))
158- then true
159- else permissionDeniedError
160-
161-
162-func mustManager (i) = match managerPublicKeyOrUnit() {
73+func isManager (i) = match managerPublicKeyOrUnit() {
16374 case pk: ByteVector =>
164- if ((i.callerPublicKey == pk))
165- then true
166- else permissionDeniedError
75+ (i.callerPublicKey == pk)
16776 case _: Unit =>
168- mustThis(i)
77+ (i.caller == this)
16978 case _ =>
17079 throw("Match error")
17180 }
17281
17382
174-let shutdown = valueOrElse(getBoolean(keyShutdown()), false)
175-
176-func shutdownCheck (i) = if (if (!(shutdown))
83+func mustManager (i) = if (isManager(i))
17784 then true
178- else mustManager(i))
179- then true
180- else throw("operation is disabled")
85+ else throw("permission denied")
18186
18287
183-let factoryContract = addressFromStringValue(getStrOrFail(this, keyFactoryContract()))
88+func getAccBalance (assetId) = if ((assetId == "WAVES"))
89+ then wavesBalance(this).available
90+ else assetBalance(this, fromBase58String(assetId))
18491
185-let lpStakingContract = addressFromStringValue(getStrOrFail(this, keyLpStakingContract()))
18692
187-let stakingContract = addressFromStringValue(getStrOrFail(this, keyStakingContract()))
188-
189-let boostingContract = addressFromStringValue(getStrOrFail(this, keyBoostingContract()))
190-
191-let swapContract = addressFromStringValue(getStrOrFail(this, keySwapContract()))
192-
193-let assetsStoreContract = addressFromStringValue(getStrOrFail(this, keyAssetsStoreContract()))
194-
195-let usdtAssetId = parseAssetId(getStrOrFail(this, keyUsdtAssetId()))
196-
197-let wxAssetId = parseAssetId(getStrOrFail(this, keyWxAssetId()))
198-
199-let minDelayDefault = 1440
200-
201-let minDelay = valueOrElse(getInteger(this, keyMinDelay()), minDelayDefault)
202-
203-let lockFractionMultiplier = 100000000
204-
205-let lockFractionDefault = fraction(1, lockFractionMultiplier, 2)
206-
207-let lockFraction = valueOrElse(getInteger(this, keyLockFraction()), lockFractionDefault)
208-
209-func getPoolInfo (amountAssetId) = {
210- let amountAssetIdStr = assetIdToString(amountAssetId)
211- let priceAssetIdStr = assetIdToString(usdtAssetId)
212- let poolInfoOption = {
213- let @ = invoke(factoryContract, "poolInfoREADONLY", [amountAssetIdStr, priceAssetIdStr], nil)
214- if ($isInstanceOf(@, "(Address, ByteVector)"))
93+func getPoolAddressAndCheckPoolStatus (assetIn,assetOut) = {
94+ let lpNonReverse = {
95+ let @ = invoke(factoryContract, "getLpAssetFromPoolAssetsREADONLY", [assetIn, assetOut], nil)
96+ if ($isInstanceOf(@, "String"))
21597 then @
21698 else unit
21799 }
218- poolInfoOption
219- }
220-
221-
222-func calcPrice (lpAssetId,shareAssetId) = {
223- let shareAssetInfo = valueOrErrorMessage(assetInfo(shareAssetId), "failed to get share asset info")
224- let shareAssetEmission = shareAssetInfo.quantity
225- let stakedAmount = ensurePositive(valueOrErrorMessage({
226- let @ = invoke(stakingContract, "stakedByUserREADONLY", [assetIdToString(lpAssetId), toString(this)], nil)
100+ let lpReverse = {
101+ let @ = invoke(factoryContract, "getLpAssetFromPoolAssetsREADONLY", [assetOut, assetIn], nil)
102+ if ($isInstanceOf(@, "String"))
103+ then @
104+ else unit
105+ }
106+ let $t026163075 = if ((lpNonReverse != unit))
107+ then {
108+ let pool = {
109+ let @ = invoke(factoryContract, "getPoolAddressFromLpAssetREADONLY", [value(lpNonReverse)], nil)
110+ if ($isInstanceOf(@, "String"))
111+ then @
112+ else throw(($getType(@) + " couldn't be cast to String"))
113+ }
114+ $Tuple2(false, pool)
115+ }
116+ else if ((lpReverse != unit))
117+ then {
118+ let pool = {
119+ let @ = invoke(factoryContract, "getPoolAddressFromLpAssetREADONLY", [value(lpReverse)], nil)
120+ if ($isInstanceOf(@, "String"))
121+ then @
122+ else throw(($getType(@) + " couldn't be cast to String"))
123+ }
124+ $Tuple2(true, pool)
125+ }
126+ else poolNotExist
127+ let isReverse = $t026163075._1
128+ let pool = $t026163075._2
129+ let poolStatus = {
130+ let @ = invoke(factoryContract, "getPoolStatusREADONLY", [pool], nil)
227131 if ($isInstanceOf(@, "Int"))
228132 then @
229- else unit
230- }, wrapErr("invalid stakedByUserREADONLY result")))
231- let price = if ((shareAssetEmission == 0))
232- then scale18BigInt
233- else fraction(toBigInt(stakedAmount), scale18BigInt, toBigInt(shareAssetEmission), FLOOR)
234- price
235- }
236-
237-
238-@Callable(i)
239-func emit (assetId,amount) = {
240- let checkCaller = mustThis(i)
241- if ((checkCaller == checkCaller))
133+ else throw(($getType(@) + " couldn't be cast to Int"))
134+ }
135+ let check = if ((poolStatus == 1))
136+ then true
137+ else poolDisabled
138+ if ((check == check))
242139 then {
243- let isReissuable = true
244- $Tuple2([Reissue(assetId, amount, isReissuable)], amount)
140+ let poolAdr = addressFromStringValue(valueOrElse(pool, ""))
141+ $Tuple2(poolAdr, isReverse)
245142 }
246143 else throw("Strict value is not equal to itself.")
247144 }
248145
249146
250-
251147 @Callable(i)
252-func burn (assetId,amount) = {
253- let checkCaller = mustThis(i)
254- if ((checkCaller == checkCaller))
255- then $Tuple2([Burn(assetId, amount)], amount)
256- else throw("Strict value is not equal to itself.")
148+func swapCalculateREADONLY (amountIn,assetIn,assetOut) = {
149+ let prFee = value(getInteger(protocolFee()))
150+ let feeProtocolAmountCalc = fraction(toBigInt(amountIn), toBigInt(prFee), feeScale)
151+ let plFee = value(getInteger(poolFee()))
152+ let feePoolAmountCalc = fraction(toBigInt(amountIn), toBigInt(plFee), feeScale)
153+ let feeProtocolAmount = if ((toInt(feeProtocolAmountCalc) == 0))
154+ then toBigInt(1)
155+ else feeProtocolAmountCalc
156+ let feePoolAmount = if ((toInt(feePoolAmountCalc) == 0))
157+ then toBigInt(1)
158+ else feePoolAmountCalc
159+ let cleanAmountIn = ((toBigInt(amountIn) - feeProtocolAmount) - feePoolAmount)
160+ let $t040634141 = getPoolAddressAndCheckPoolStatus(assetIn, assetOut)
161+ let poolAdr = $t040634141._1
162+ let isReverse = $t040634141._2
163+ let res = {
164+ let @ = invoke(poolAdr, "calculateAmountOutForSwapREADONLY", [toInt(cleanAmountIn), isReverse, toInt(feePoolAmount)], nil)
165+ if ($isInstanceOf(@, "Int"))
166+ then @
167+ else throw(($getType(@) + " couldn't be cast to Int"))
168+ }
169+ $Tuple2(nil, res)
257170 }
258171
259172
260173
261174 @Callable(i)
262-func create (baseAssetIdStr,shareAssetIdStr,shareAssetName,shareAssetDescription,shareAssetLogo) = {
263- let shareAssetLabel = "STAKING_LP"
264- let baseAssetId = parseAssetId(baseAssetIdStr)
265- let checks = [mustManager(i), if (isDefined(getPoolInfo(baseAssetId)))
175+func swap (amountOutMin,assetOutRaw,addressTo) = {
176+ let assetOut = if ((assetOutRaw == ""))
177+ then "WAVES"
178+ else assetOutRaw
179+ let pmt = value(i.payments[0])
180+ let assetIn = if ((pmt.assetId == unit))
181+ then "WAVES"
182+ else toBase58String(value(pmt.assetId))
183+ let amountIn = value(pmt.amount)
184+ let prFee = value(getInteger(protocolFee()))
185+ let feeProtocolAmountCalc = fraction(toBigInt(amountIn), toBigInt(prFee), feeScale)
186+ let plFee = value(getInteger(poolFee()))
187+ let feePoolAmountCalc = fraction(toBigInt(amountIn), toBigInt(plFee), feeScale)
188+ let feeProtocolAmount = if ((toInt(feeProtocolAmountCalc) == 0))
189+ then toBigInt(1)
190+ else feeProtocolAmountCalc
191+ let feePoolAmount = if ((toInt(feePoolAmountCalc) == 0))
192+ then toBigInt(1)
193+ else feePoolAmountCalc
194+ let cleanAmountIn = ((toBigInt(amountIn) - feeProtocolAmount) - feePoolAmount)
195+ let checks = [if ((size(i.payments) == 1))
266196 then true
267- else throwErr("invalid base asset")]
197+ else throw("exactly 1 payment are expected")]
268198 if ((checks == checks))
269199 then {
270- let commonState = [IntegerEntry(keyPeriod(baseAssetId), 0)]
271- if ((shareAssetIdStr == ""))
272- then {
273- let shareAssetIssueAmount = 1
274- let shareAssetIssueAction = Issue(shareAssetName, shareAssetDescription, shareAssetIssueAmount, shareAssetDecimals, true)
275- let calculatedShareAssetId = calculateAssetId(shareAssetIssueAction)
276- let shareAssetBurnAction = Burn(calculatedShareAssetId, shareAssetIssueAmount)
277- let calculatedShareAssetIdStr = toBase58String(calculatedShareAssetId)
278- let createOrUpdate = invoke(assetsStoreContract, "createOrUpdate", [calculatedShareAssetIdStr, shareAssetLogo, false], nil)
279- if ((createOrUpdate == createOrUpdate))
280- then {
281- let addLabel = invoke(assetsStoreContract, "addLabel", [calculatedShareAssetIdStr, shareAssetLabel], nil)
282- if ((addLabel == addLabel))
283- then $Tuple2((commonState ++ [shareAssetIssueAction, shareAssetBurnAction, StringEntry(keyShareAssetId(baseAssetId), calculatedShareAssetIdStr), StringEntry(keyBaseAssetId(calculatedShareAssetId), baseAssetIdStr)]), calculatedShareAssetIdStr)
284- else throw("Strict value is not equal to itself.")
285- }
286- else throw("Strict value is not equal to itself.")
287- }
288- else {
289- let shareAssetId = fromBase58String(shareAssetIdStr)
290- let shareAssetInfo = valueOrErrorMessage(assetInfo(shareAssetId), wrapErr("invalid share asset id"))
291- let checkIssuer = if ((shareAssetInfo.issuer == lpStakingContract))
292- then true
293- else throwErr("invalid share asset id issuer")
294- if ((checkIssuer == checkIssuer))
295- then $Tuple2((commonState ++ [StringEntry(keyShareAssetId(baseAssetId), shareAssetIdStr), StringEntry(keyBaseAssetId(shareAssetId), baseAssetIdStr)]), shareAssetIdStr)
296- else throw("Strict value is not equal to itself.")
297- }
298- }
299- else throw("Strict value is not equal to itself.")
300- }
301-
302-
303-
304-@Callable(i)
305-func put () = {
306- let pmt = if ((size(i.payments) == 1))
307- then i.payments[0]
308- else throwErr("exactly 1 payment is expected")
309- let baseAssetId = pmt.assetId
310- let userAddress = i.caller
311- let checks = [shutdownCheck(i), if (isDefined(getString(keyShareAssetId(baseAssetId))))
312- then true
313- else throwErr("invalid asset")]
314- if ((checks == checks))
315- then {
316- let $t01112911232 = valueOrErrorMessage(getPoolInfo(baseAssetId), wrapErr("invalid asset"))
317- let poolAddress = $t01112911232._1
318- let lpAssetId = $t01112911232._2
319- let period = value(getInteger(keyPeriod(baseAssetId)))
320- let userBaseAssetAmountToConvertPeriodOption = getInteger(keyUserBaseAssetAmountToConvertPeriod(baseAssetId, userAddress))
321- let claimShareAssetInvocation = if ((userBaseAssetAmountToConvertPeriodOption == unit))
200+ let $t053435421 = getPoolAddressAndCheckPoolStatus(assetIn, assetOut)
201+ let poolAdr = $t053435421._1
202+ let isReverse = $t053435421._2
203+ let assetInAttachedPayment = if ((assetIn == "WAVES"))
322204 then unit
323- else {
324- let userBaseAssetAmountToConvertPeriod = value(userBaseAssetAmountToConvertPeriodOption)
325- if ((userBaseAssetAmountToConvertPeriod == period))
326- then unit
327- else invoke(this, "claimShareAsset", [assetIdToString(baseAssetId), toString(userAddress)], nil)
328- }
329- if ((claimShareAssetInvocation == claimShareAssetInvocation))
330- then {
331- let baseAssetAmountToConvert = valueOrElse(getInteger(keyBaseAssetAmountToConvert(baseAssetId)), 0)
332- let userBaseAssetAmountToConvert = value(parseInt(split(valueOrElse(getString(keyUserBaseAssetAmountToConvert(baseAssetId, userAddress)), "%d%d%d__0__0"), separator)[1]))
333- $Tuple2([IntegerEntry(keyBaseAssetAmountToConvert(baseAssetId), (baseAssetAmountToConvert + pmt.amount)), StringEntry(keyUserBaseAssetAmountToConvert(baseAssetId, userAddress), makeString(["%d%d%d", toString((userBaseAssetAmountToConvert + pmt.amount)), toString(lastBlock.timestamp), toString(period)], separator)), IntegerEntry(keyUserBaseAssetAmountToConvertPeriod(baseAssetId, userAddress), period), StringEntry(keyHistoryEntry(baseAssetId, "put", period, userAddress, i.transactionId), makeString(["%d%d%d", toString(pmt.amount), toString(lastBlock.timestamp), toString(userBaseAssetAmountToConvert)], separator))], unit)
334- }
335- else throw("Strict value is not equal to itself.")
336- }
337- else throw("Strict value is not equal to itself.")
338- }
339-
340-
341-
342-@Callable(i)
343-func claimShareAsset (baseAssetIdStr,userAddressStr) = {
344- let checks = [shutdownCheck(i)]
345- if ((checks == checks))
346- then {
347- let userAddress = if ((userAddressStr == ""))
348- then i.caller
349- else {
350- let checkCaller = mustThis(i)
351- if ((checkCaller == checkCaller))
352- then valueOrErrorMessage(addressFromString(userAddressStr), wrapErr("invalid user address"))
353- else throw("Strict value is not equal to itself.")
354- }
355- if ((userAddress == userAddress))
356- then {
357- let baseAssetId = parseAssetId(baseAssetIdStr)
358- let shareAssetId = value(parseAssetId(valueOrErrorMessage(getString(keyShareAssetId(baseAssetId)), wrapErr("invalid base asset id"))))
359- if ((shareAssetId == shareAssetId))
360- then {
361- let period = valueOrErrorMessage(getInteger(keyPeriod(baseAssetId)), wrapErr("invalid period"))
362- if ((period == period))
363- then {
364- let userBaseAssetAmountToConvert = value(parseInt(split(valueOrElse(getString(keyUserBaseAssetAmountToConvert(baseAssetId, userAddress)), "%d%d%d__0__0"), separator)[1]))
365- let checkAmountToConvert = if ((userBaseAssetAmountToConvert > 0))
366- then true
367- else throwErr("nothing to claim")
368- if ((checkAmountToConvert == checkAmountToConvert))
369- then {
370- let userBaseAssetAmountToConvertPeriod = valueOrErrorMessage(getInteger(keyUserBaseAssetAmountToConvertPeriod(baseAssetId, userAddress)), wrapErr("failed to get period"))
371- let checkPeriod = if ((period > userBaseAssetAmountToConvertPeriod))
372- then true
373- else throwErr("invalid period")
374- if ((checkPeriod == checkPeriod))
375- then {
376- let price = toBigInt(valueOrErrorMessage(getBinary(keyPricePeriodPut(baseAssetId, userBaseAssetAmountToConvertPeriod)), wrapErr("failed to get price")))
377- let shareAssetAmount = toInt(fraction(toBigInt(userBaseAssetAmountToConvert), scale18BigInt, price))
378- $Tuple2([StringEntry(keyUserBaseAssetAmountToConvert(baseAssetId, userAddress), makeString(["%d%d%d", toString(0), toString(lastBlock.timestamp), toString(period)], separator)), DeleteEntry(keyUserBaseAssetAmountToConvertPeriod(baseAssetId, userAddress)), ScriptTransfer(userAddress, shareAssetAmount, shareAssetId), StringEntry(keyHistoryEntry(baseAssetId, "claimShareAsset", period, userAddress, i.transactionId), makeString(["%d%d%d%d", toString(shareAssetAmount), toString(lastBlock.timestamp), toString(price), toString(userBaseAssetAmountToConvert)], separator))], unit)
379- }
380- else throw("Strict value is not equal to itself.")
381- }
382- else throw("Strict value is not equal to itself.")
383- }
384- else throw("Strict value is not equal to itself.")
385- }
386- else throw("Strict value is not equal to itself.")
387- }
388- else throw("Strict value is not equal to itself.")
389- }
390- else throw("Strict value is not equal to itself.")
391- }
392-
393-
394-
395-@Callable(i)
396-func get () = {
397- let checks = [shutdownCheck(i)]
398- if ((checks == checks))
399- then {
400- let pmt = if ((size(i.payments) == 1))
401- then i.payments[0]
402- else throwErr("exactly 1 payment is expected")
403- let shareAssetId = pmt.assetId
404- let baseAssetId = value(parseAssetId(valueOrErrorMessage(getString(keyBaseAssetId(shareAssetId)), wrapErr("invalid share asset id"))))
405- if ((baseAssetId == baseAssetId))
406- then {
407- let userAddress = i.caller
408- let $t01564215831 = valueOrErrorMessage(getPoolInfo(baseAssetId), wrapErr("invalid asset"))
409- let poolAddress = $t01564215831._1
410- let lpAssetId = $t01564215831._2
411- let period = value(getInteger(keyPeriod(baseAssetId)))
412- let userShareAssetAmountToConvertPeriodOption = getInteger(keyUserShareAssetAmountToConvertPeriod(baseAssetId, userAddress))
413- let claimBaseAssetInvocation = if ((userShareAssetAmountToConvertPeriodOption == unit))
414- then unit
415- else {
416- let userShareAssetAmountToConvertPeriod = value(userShareAssetAmountToConvertPeriodOption)
417- if ((userShareAssetAmountToConvertPeriod == period))
418- then unit
419- else invoke(this, "claimBaseAsset", [assetIdToString(baseAssetId), toString(userAddress)], nil)
420- }
421- if ((claimBaseAssetInvocation == claimBaseAssetInvocation))
422- then {
423- let shareAssetAmountToConvert = valueOrElse(getInteger(keyShareAssetAmountToConvert(baseAssetId)), 0)
424- let userShareAssetAmountToConvert = value(parseInt(split(valueOrElse(getString(keyUserShareAssetAmountToConvert(baseAssetId, userAddress)), "%d%d%d__0__0"), separator)[1]))
425- $Tuple2([IntegerEntry(keyShareAssetAmountToConvert(baseAssetId), (shareAssetAmountToConvert + pmt.amount)), StringEntry(keyUserShareAssetAmountToConvert(baseAssetId, userAddress), makeString(["%d%d%d", toString((userShareAssetAmountToConvert + pmt.amount)), toString(lastBlock.timestamp), toString(period)], separator)), IntegerEntry(keyUserShareAssetAmountToConvertPeriod(baseAssetId, userAddress), period), StringEntry(keyHistoryEntry(baseAssetId, "get", period, userAddress, i.transactionId), makeString(["%d%d%d", toString(pmt.amount), toString(lastBlock.timestamp), toString(userShareAssetAmountToConvert)], separator))], unit)
426- }
427- else throw("Strict value is not equal to itself.")
428- }
429- else throw("Strict value is not equal to itself.")
430- }
431- else throw("Strict value is not equal to itself.")
432- }
433-
434-
435-
436-@Callable(i)
437-func claimBaseAsset (baseAssetIdStr,userAddressStr) = {
438- let checks = [shutdownCheck(i)]
439- if ((checks == checks))
440- then {
441- let userAddress = if ((userAddressStr == ""))
442- then i.caller
443- else {
444- let checkCaller = mustThis(i)
445- if ((checkCaller == checkCaller))
446- then valueOrErrorMessage(addressFromString(userAddressStr), wrapErr("invalid user address"))
447- else throw("Strict value is not equal to itself.")
448- }
449- if ((userAddress == userAddress))
450- then {
451- let baseAssetId = parseAssetId(baseAssetIdStr)
452- let shareAssetId = value(parseAssetId(valueOrErrorMessage(getString(keyShareAssetId(baseAssetId)), wrapErr("invalid base asset id"))))
453- if ((shareAssetId == shareAssetId))
454- then {
455- let period = valueOrErrorMessage(getInteger(keyPeriod(baseAssetId)), wrapErr("invalid period"))
456- if ((period == period))
457- then {
458- let userShareAssetAmountToConvert = value(parseInt(split(valueOrElse(getString(keyUserShareAssetAmountToConvert(baseAssetId, userAddress)), "%d%d%d__0__0"), separator)[1]))
459- let userShareAssetAmountToConvertPeriod = valueOrErrorMessage(getInteger(keyUserShareAssetAmountToConvertPeriod(baseAssetId, userAddress)), wrapErr("failed to get period"))
460- let checkPeriod = if ((period > userShareAssetAmountToConvertPeriod))
461- then true
462- else throwErr("invalid period")
463- if ((checkPeriod == checkPeriod))
464- then {
465- let price = toBigInt(valueOrErrorMessage(getBinary(keyPricePeriodGet(baseAssetId, userShareAssetAmountToConvertPeriod)), wrapErr("failed to get price")))
466- let baseAssetAmount = toInt(fraction(toBigInt(userShareAssetAmountToConvert), price, scale18BigInt))
467- $Tuple2([StringEntry(keyUserShareAssetAmountToConvert(baseAssetId, userAddress), makeString(["%d%d%d", toString(0), toString(lastBlock.timestamp), toString(period)], separator)), DeleteEntry(keyUserShareAssetAmountToConvertPeriod(baseAssetId, userAddress)), ScriptTransfer(userAddress, baseAssetAmount, baseAssetId), StringEntry(keyHistoryEntry(baseAssetId, "claimBaseAsset", period, userAddress, i.transactionId), makeString(["%d%d%d%d", toString(baseAssetAmount), toString(lastBlock.timestamp), toString(price), toString(userShareAssetAmountToConvertPeriod)], separator))], unit)
468- }
469- else throw("Strict value is not equal to itself.")
470- }
471- else throw("Strict value is not equal to itself.")
472- }
473- else throw("Strict value is not equal to itself.")
474- }
475- else throw("Strict value is not equal to itself.")
476- }
477- else throw("Strict value is not equal to itself.")
478- }
479-
480-
481-
482-@Callable(i)
483-func finalize (baseAssetIdStr) = {
484- let checks = [shutdownCheck(i)]
485- if ((checks == checks))
486- then {
487- let baseAssetId = parseAssetId(baseAssetIdStr)
488- let shareAssetId = value(parseAssetId(valueOrErrorMessage(getString(keyShareAssetId(baseAssetId)), wrapErr("invalid base asset id"))))
489- if ((shareAssetId == shareAssetId))
490- then {
491- let shareAssetInfo = valueOrErrorMessage(assetInfo(shareAssetId), wrapErr("invalid share asset id"))
492- let period = valueOrErrorMessage(getInteger(keyPeriod(baseAssetId)), wrapErr("invalid period"))
493- if ((period == period))
494- then {
495- let periodStartHeightOption = getInteger(keyPeriodStartHeight(baseAssetId, period))
496- let checkDelay = if ((periodStartHeightOption == unit))
497- then unit
498- else {
499- let delay = (height - value(periodStartHeightOption))
500- let blocksToWait = max([0, (minDelay - delay)])
501- if ((blocksToWait == 0))
502- then unit
503- else throwErr(makeString(["finalization will be possible in ", toString(blocksToWait), " blocks"], ""))
504- }
505- if ((checkDelay == checkDelay))
506- then {
507- let $t02127221453 = valueOrErrorMessage(getPoolInfo(baseAssetId), wrapErr("invalid asset"))
508- let poolAddress = $t02127221453._1
509- let lpAssetId = $t02127221453._2
510- let stakingReward = valueOrErrorMessage({
511- let @ = invoke(stakingContract, "claimWxDoNotThrow", [assetIdToString(lpAssetId)], nil)
512- if ($isInstanceOf(@, "Int"))
513- then @
514- else unit
515- }, wrapErr("invalid claimWx result"))
516- if ((stakingReward == stakingReward))
517- then {
518- let baseAssetAmountToConvert = valueOrElse(getInteger(keyBaseAssetAmountToConvert(baseAssetId)), 0)
519- let shareAssetAmountToConvert = valueOrElse(getInteger(keyShareAssetAmountToConvert(baseAssetId)), 0)
520- let checkFinalizationIsRequired = {
521- let isFinalizationRequired = if (if ((stakingReward > 0))
522- then true
523- else (baseAssetAmountToConvert > 0))
524- then true
525- else (shareAssetAmountToConvert > 0)
526- if (isFinalizationRequired)
527- then true
528- else throwErr("nothing to finalize")
529- }
530- if ((checkFinalizationIsRequired == checkFinalizationIsRequired))
531- then {
532- let useStakingReward = if ((stakingReward > 0))
533- then {
534- let lockPart = fraction(stakingReward, lockFraction, lockFractionMultiplier)
535- let convertPart = (stakingReward - lockPart)
536- let r = invoke(boostingContract, "userMaxDurationREADONLY", [toString(this)], nil)
537- let lock = if ((lockPart > 0))
538- then match r {
539- case _ =>
540- if (if (if ($isInstanceOf($match0._1, "String"))
541- then $isInstanceOf($match0._2, "Int")
542- else false)
543- then $isInstanceOf($match0, "(String, Int)")
544- else false)
545- then {
546- let function = $match0._1
547- let duration = $match0._2
548- if ((lockPart > 0))
549- then invoke(boostingContract, function, [duration], [AttachedPayment(wxAssetId, lockPart)])
550- else unit
551- }
552- else throwErr("invalid lock params")
553- }
554- else unit
555- if ((lock == lock))
556- then {
557- let convertedAmount = if ((convertPart > 0))
558- then {
559- let inAssetId = wxAssetId
560- let minimumToReceive = 0
561- let outAssetIdStr = assetIdToString(usdtAssetId)
562- let targetAddress = toString(this)
563- valueOrErrorMessage({
564- let @ = invoke(swapContract, "swap", [minimumToReceive, outAssetIdStr, targetAddress], [AttachedPayment(inAssetId, convertPart)])
565- if ($isInstanceOf(@, "Int"))
566- then @
567- else unit
568- }, wrapErr("invalid swap result"))
569- }
570- else 0
571- if ((convertedAmount == convertedAmount))
572- then {
573- let lpAssetAmount = if ((convertedAmount > 0))
574- then {
575- let minOutAmount = 0
576- let autoStake = true
577- valueOrErrorMessage({
578- let @ = invoke(poolAddress, "putOneTknV2", [minOutAmount, autoStake], [AttachedPayment(usdtAssetId, convertedAmount)])
579- if ($isInstanceOf(@, "Int"))
580- then @
581- else unit
582- }, wrapErr("invalid putOneTknV2 result"))
583- }
584- else 0
585- if ((lpAssetAmount == lpAssetAmount))
586- then lpAssetAmount
587- else throw("Strict value is not equal to itself.")
588- }
589- else throw("Strict value is not equal to itself.")
590- }
591- else throw("Strict value is not equal to itself.")
592- }
593- else unit
594- if ((useStakingReward == useStakingReward))
595- then {
596- let getActions = if ((shareAssetAmountToConvert > 0))
597- then {
598- let price = calcPrice(lpAssetId, shareAssetId)
599- if ((price == price))
600- then {
601- let unstakeAmount = toInt(fraction(toBigInt(shareAssetAmountToConvert), price, scale18BigInt, FLOOR))
602- let baseAssetAmount = {
603- let outAssetId = baseAssetId
604- let minOutAmount = 0
605- valueOrErrorMessage({
606- let @ = invoke(poolAddress, "unstakeAndGetOneTknV2", [unstakeAmount, assetIdToString(outAssetId), minOutAmount], nil)
607- if ($isInstanceOf(@, "Int"))
608- then @
609- else unit
610- }, wrapErr("invalid unstakeAndGetOneTknV2 result"))
611- }
612- if ((baseAssetAmount == baseAssetAmount))
613- then {
614- let shareAssetBurn = if ((shareAssetInfo.issuer == this))
615- then invoke(this, "burn", [shareAssetId, shareAssetAmountToConvert], nil)
616- else throwErr("invalid share asset issuer")
617- if ((shareAssetBurn == shareAssetBurn))
618- then {
619- let priceGet = fraction(toBigInt(baseAssetAmount), scale18BigInt, toBigInt(shareAssetAmountToConvert), FLOOR)
620- let priceGetUpdateActions = [BinaryEntry(keyPricePeriodGet(baseAssetId, period), toBytes(priceGet)), StringEntry(keyPriceGetHistory(baseAssetId), toString(priceGet))]
621- priceGetUpdateActions
622- }
623- else throw("Strict value is not equal to itself.")
624- }
625- else throw("Strict value is not equal to itself.")
626- }
627- else throw("Strict value is not equal to itself.")
628- }
629- else nil
630- if ((getActions == getActions))
631- then {
632- let putActions = if ((baseAssetAmountToConvert > 0))
633- then {
634- let lpAssetAmount = {
635- let minOutAmount = 0
636- let autoStake = true
637- valueOrErrorMessage({
638- let @ = invoke(poolAddress, "putOneTknV2", [minOutAmount, autoStake], [AttachedPayment(baseAssetId, baseAssetAmountToConvert)])
639- if ($isInstanceOf(@, "Int"))
640- then @
641- else unit
642- }, wrapErr("invalid putOneTknV2 result"))
643- }
644- if ((lpAssetAmount == lpAssetAmount))
645- then {
646- let price = calcPrice(lpAssetId, shareAssetId)
647- if ((price == price))
648- then {
649- let checkPrice = if ((value(toInt(price)) != 0))
650- then true
651- else throw("price is ZERO")
652- if ((checkPrice == checkPrice))
653- then {
654- let shareAssetAmount = toInt(fraction(toBigInt(lpAssetAmount), scale18BigInt, price, FLOOR))
655- let checkShareAssetAmount = if ((value(toInt(price)) != 0))
656- then true
657- else throw("shareAssetAmount is ZERO")
658- if ((checkShareAssetAmount == checkShareAssetAmount))
659- then {
660- let shareAssetReissue = if ((shareAssetInfo.issuer == this))
661- then invoke(this, "emit", [shareAssetId, shareAssetAmount], nil)
662- else throwErr("invalid share asset issuer")
663- if ((shareAssetReissue == shareAssetReissue))
664- then {
665- let pricePut = fraction(toBigInt(baseAssetAmountToConvert), scale18BigInt, toBigInt(shareAssetAmount))
666- let pricePutUpdateActions = [BinaryEntry(keyPricePeriodPut(baseAssetId, period), toBytes(pricePut)), StringEntry(keyPricePutHistory(baseAssetId), toString(pricePut))]
667- pricePutUpdateActions
668- }
669- else throw("Strict value is not equal to itself.")
670- }
671- else throw("Strict value is not equal to itself.")
672- }
673- else throw("Strict value is not equal to itself.")
674- }
675- else throw("Strict value is not equal to itself.")
676- }
677- else throw("Strict value is not equal to itself.")
678- }
679- else nil
680- if ((putActions == putActions))
681- then {
682- let newPeriod = (period + 1)
683- let lastPrice = calcPrice(lpAssetId, shareAssetId)
684- let actions = (([IntegerEntry(keyPeriod(baseAssetId), newPeriod), IntegerEntry(keyPeriodStartHeight(baseAssetId, newPeriod), height), IntegerEntry(keyShareAssetAmountToConvert(baseAssetId), 0), IntegerEntry(keyBaseAssetAmountToConvert(baseAssetId), 0), BinaryEntry(keyPricePeriod(baseAssetId, period), toBytes(lastPrice)), StringEntry(keyPriceHistory(baseAssetId), toString(lastPrice))] ++ putActions) ++ getActions)
685- $Tuple2(actions, toBytes(lastPrice))
686- }
687- else throw("Strict value is not equal to itself.")
688- }
689- else throw("Strict value is not equal to itself.")
690- }
691- else throw("Strict value is not equal to itself.")
692- }
693- else throw("Strict value is not equal to itself.")
694- }
695- else throw("Strict value is not equal to itself.")
696- }
697- else throw("Strict value is not equal to itself.")
698- }
699- else throw("Strict value is not equal to itself.")
700- }
701- else throw("Strict value is not equal to itself.")
205+ else fromBase58String(assetIn)
206+ let totalGetRaw = {
207+ let @ = invoke(poolAdr, "calculateAmountOutForSwapAndSendTokens", [toInt(cleanAmountIn), isReverse, amountOutMin, addressTo, toInt(feePoolAmount)], [AttachedPayment(assetInAttachedPayment, toInt(cleanAmountIn))])
208+ if ($isInstanceOf(@, "Int"))
209+ then @
210+ else throw(($getType(@) + " couldn't be cast to Int"))
211+ }
212+ $Tuple2([ScriptTransfer(feeCollectorAddress, toInt(feeProtocolAmount), assetInAttachedPayment), ScriptTransfer(poolAdr, toInt(feePoolAmount), assetInAttachedPayment)], totalGetRaw)
702213 }
703214 else throw("Strict value is not equal to itself.")
704215 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let separator = "__"
4+let SEP = "__"
55
6-let shareAssetDecimals = 8
6+let feeScale = toBigInt(100000000)
77
8-let wavesString = "WAVES"
9-
10-let scale18 = 1000000000000000000
11-
12-let scale18BigInt = toBigInt(scale18)
13-
14-func wrapErr (msg) = makeString(["lp_staking_pools.ride:", msg], " ")
8+func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), ("No data for this.key=" + key))
159
1610
17-func throwErr (msg) = throw(wrapErr(msg))
11+let poolDisabled = throw("Pool disabled")
1812
13+let poolNotExist = throw("Pool is not exist")
1914
20-func errKeyIsNotDefined (address,key) = wrapErr(makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
21-
22-
23-func getStrOrFail (address,key) = valueOrErrorMessage(getString(address, key), errKeyIsNotDefined(address, key))
24-
25-
26-func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), errKeyIsNotDefined(address, key))
27-
28-
29-func parseAssetId (input) = if ((input == wavesString))
30- then unit
31- else fromBase58String(input)
32-
33-
34-func assetIdToString (input) = if ((input == unit))
35- then wavesString
36- else toBase58String(value(input))
37-
38-
39-func ensurePositive (v) = if ((v >= 0))
40- then v
41- else throwErr("value should be positive")
42-
43-
44-func keyFactoryContract () = makeString(["%s", "factoryContract"], separator)
45-
46-
47-func keyLpStakingContract () = makeString(["%s", "lpStakingContract"], separator)
48-
49-
50-func keyStakingContract () = makeString(["%s", "stakingContract"], separator)
51-
52-
53-func keyBoostingContract () = makeString(["%s", "boostingContract"], separator)
54-
55-
56-func keySwapContract () = makeString(["%s", "swapContract"], separator)
57-
58-
59-func keyAssetsStoreContract () = makeString(["%s", "assetsStoreContract"], separator)
60-
61-
62-func keyUsdtAssetId () = makeString(["%s", "usdtAssetId"], separator)
63-
64-
65-func keyWxAssetId () = makeString(["%s", "wxAssetId"], separator)
66-
67-
68-func keyShutdown () = makeString(["%s", "shutdown"], separator)
69-
70-
71-func keyMinDelay () = makeString(["%s", "minDelay"], separator)
72-
73-
74-func keyLockFraction () = makeString(["%s", "lockFraction"], separator)
75-
76-
77-func keyShareAssetId (baseAssetId) = makeString(["%s%s", assetIdToString(baseAssetId), "shareAssetId"], separator)
78-
79-
80-func keyBaseAssetId (shareAssetId) = makeString(["%s%s", assetIdToString(shareAssetId), "baseAssetId"], separator)
81-
82-
83-func keyPeriod (baseAssetId) = makeString(["%s%s", assetIdToString(baseAssetId), "period"], separator)
84-
85-
86-func keyPeriodStartHeight (baseAssetId,period) = makeString(["%s%s%d", assetIdToString(baseAssetId), "periodStartHeight", toString(period)], separator)
87-
88-
89-func keyBaseAssetAmountToConvert (baseAssetId) = makeString(["%s%s", assetIdToString(baseAssetId), "baseAssetAmountToConvert"], separator)
90-
91-
92-func keyShareAssetAmountToConvert (baseAssetId) = makeString(["%s%s", assetIdToString(baseAssetId), "shareAssetAmountToConvert"], separator)
93-
94-
95-func keyUserBaseAssetAmountToConvert (baseAssetId,userAddress) = makeString(["%s%s%s", assetIdToString(baseAssetId), toString(userAddress), "baseAssetAmountToConvert"], separator)
96-
97-
98-func keyUserBaseAssetAmountToConvertPeriod (baseAssetId,userAddress) = makeString(["%s%s%s%s", assetIdToString(baseAssetId), toString(userAddress), "baseAssetAmountToConvert", "period"], separator)
99-
100-
101-func keyUserShareAssetAmountToConvert (baseAssetId,userAddress) = makeString(["%s%s%s", assetIdToString(baseAssetId), toString(userAddress), "shareAssetAmountToConvert"], separator)
102-
103-
104-func keyUserShareAssetAmountToConvertPeriod (baseAssetId,userAddress) = makeString(["%s%s%s%s", assetIdToString(baseAssetId), toString(userAddress), "shareAssetAmountToConvert", "period"], separator)
105-
106-
107-func keyPricePeriod (baseAssetId,period) = makeString(["%s%s%d", assetIdToString(baseAssetId), "price", toString(period)], separator)
108-
109-
110-func keyPriceHistory (baseAssetId) = makeString(["%s%s%s%d%d", assetIdToString(baseAssetId), "price", "history", toString(lastBlock.height), toString(lastBlock.timestamp)], separator)
111-
112-
113-func keyPricePeriodPut (baseAssetId,period) = makeString(["%s%s%d%s", assetIdToString(baseAssetId), "price", toString(period), "put"], separator)
114-
115-
116-func keyPricePutHistory (baseAssetId) = makeString(["%s%s%s%s%d%d", assetIdToString(baseAssetId), "price", "history", "put", toString(lastBlock.height), toString(lastBlock.timestamp)], separator)
117-
118-
119-func keyPricePeriodGet (baseAssetId,period) = makeString(["%s%s%d%s", assetIdToString(baseAssetId), "price", toString(period), "get"], separator)
120-
121-
122-func keyPriceGetHistory (baseAssetId) = makeString(["%s%s%s%s%d%d", assetIdToString(baseAssetId), "price", "history", "get", toString(lastBlock.height), toString(lastBlock.timestamp)], separator)
123-
124-
125-func keyHistoryEntry (baseAssetId,operation,period,userAddress,txId) = makeString(["%s%s%s%s", "history", toBase58String(value(baseAssetId)), operation, toString(userAddress), toBase58String(txId), toString(height)], separator)
126-
15+let slippageTooBig = throw("Slippage is too big")
12716
12817 func keyManagerPublicKey () = "%s__managerPublicKey"
12918
13019
13120 func keyManagerVaultAddress () = "%s__managerVaultAddress"
13221
13322
23+func fc () = "%s__factoryContract"
24+
25+
26+let factoryContract = addressFromStringValue(getStringOrFail(fc()))
27+
28+func protocolFee () = makeString(["%s", "protocolFee"], SEP)
29+
30+
31+func poolFee () = makeString(["%s", "poolFee"], SEP)
32+
33+
34+func getStringOrFailFromAddress (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
35+
36+
37+let keyFeeCollectorAddress = "%s__feeCollectorAddress"
38+
39+let feeCollectorAddress = addressFromStringValue(getStringOrFailFromAddress(factoryContract, keyFeeCollectorAddress))
40+
13441 func getManagerVaultAddressOrThis () = match getString(keyManagerVaultAddress()) {
13542 case s: String =>
13643 addressFromStringValue(s)
13744 case _ =>
13845 this
13946 }
47+
48+
49+func asInt (val) = match val {
50+ case valInt: Int =>
51+ valInt
52+ case _ =>
53+ throw("fail to cast into Int")
54+}
55+
56+
57+func dataMappingPoolAssets (internalAmountAssetStr,internalPriceAssetStr) = makeString(["%d%d", toString(internalAmountAssetStr), toString(internalPriceAssetStr)], SEP)
14058
14159
14260 func managerPublicKeyOrUnit () = {
14361 let managerVaultAddress = getManagerVaultAddressOrThis()
14462 match getString(managerVaultAddress, keyManagerPublicKey()) {
14563 case s: String =>
14664 fromBase58String(s)
14765 case _: Unit =>
14866 unit
14967 case _ =>
15068 throw("Match error")
15169 }
15270 }
15371
15472
155-let permissionDeniedError = throw("Permission denied")
156-
157-func mustThis (i) = if ((i.caller == this))
158- then true
159- else permissionDeniedError
160-
161-
162-func mustManager (i) = match managerPublicKeyOrUnit() {
73+func isManager (i) = match managerPublicKeyOrUnit() {
16374 case pk: ByteVector =>
164- if ((i.callerPublicKey == pk))
165- then true
166- else permissionDeniedError
75+ (i.callerPublicKey == pk)
16776 case _: Unit =>
168- mustThis(i)
77+ (i.caller == this)
16978 case _ =>
17079 throw("Match error")
17180 }
17281
17382
174-let shutdown = valueOrElse(getBoolean(keyShutdown()), false)
175-
176-func shutdownCheck (i) = if (if (!(shutdown))
83+func mustManager (i) = if (isManager(i))
17784 then true
178- else mustManager(i))
179- then true
180- else throw("operation is disabled")
85+ else throw("permission denied")
18186
18287
183-let factoryContract = addressFromStringValue(getStrOrFail(this, keyFactoryContract()))
88+func getAccBalance (assetId) = if ((assetId == "WAVES"))
89+ then wavesBalance(this).available
90+ else assetBalance(this, fromBase58String(assetId))
18491
185-let lpStakingContract = addressFromStringValue(getStrOrFail(this, keyLpStakingContract()))
18692
187-let stakingContract = addressFromStringValue(getStrOrFail(this, keyStakingContract()))
188-
189-let boostingContract = addressFromStringValue(getStrOrFail(this, keyBoostingContract()))
190-
191-let swapContract = addressFromStringValue(getStrOrFail(this, keySwapContract()))
192-
193-let assetsStoreContract = addressFromStringValue(getStrOrFail(this, keyAssetsStoreContract()))
194-
195-let usdtAssetId = parseAssetId(getStrOrFail(this, keyUsdtAssetId()))
196-
197-let wxAssetId = parseAssetId(getStrOrFail(this, keyWxAssetId()))
198-
199-let minDelayDefault = 1440
200-
201-let minDelay = valueOrElse(getInteger(this, keyMinDelay()), minDelayDefault)
202-
203-let lockFractionMultiplier = 100000000
204-
205-let lockFractionDefault = fraction(1, lockFractionMultiplier, 2)
206-
207-let lockFraction = valueOrElse(getInteger(this, keyLockFraction()), lockFractionDefault)
208-
209-func getPoolInfo (amountAssetId) = {
210- let amountAssetIdStr = assetIdToString(amountAssetId)
211- let priceAssetIdStr = assetIdToString(usdtAssetId)
212- let poolInfoOption = {
213- let @ = invoke(factoryContract, "poolInfoREADONLY", [amountAssetIdStr, priceAssetIdStr], nil)
214- if ($isInstanceOf(@, "(Address, ByteVector)"))
93+func getPoolAddressAndCheckPoolStatus (assetIn,assetOut) = {
94+ let lpNonReverse = {
95+ let @ = invoke(factoryContract, "getLpAssetFromPoolAssetsREADONLY", [assetIn, assetOut], nil)
96+ if ($isInstanceOf(@, "String"))
21597 then @
21698 else unit
21799 }
218- poolInfoOption
219- }
220-
221-
222-func calcPrice (lpAssetId,shareAssetId) = {
223- let shareAssetInfo = valueOrErrorMessage(assetInfo(shareAssetId), "failed to get share asset info")
224- let shareAssetEmission = shareAssetInfo.quantity
225- let stakedAmount = ensurePositive(valueOrErrorMessage({
226- let @ = invoke(stakingContract, "stakedByUserREADONLY", [assetIdToString(lpAssetId), toString(this)], nil)
100+ let lpReverse = {
101+ let @ = invoke(factoryContract, "getLpAssetFromPoolAssetsREADONLY", [assetOut, assetIn], nil)
102+ if ($isInstanceOf(@, "String"))
103+ then @
104+ else unit
105+ }
106+ let $t026163075 = if ((lpNonReverse != unit))
107+ then {
108+ let pool = {
109+ let @ = invoke(factoryContract, "getPoolAddressFromLpAssetREADONLY", [value(lpNonReverse)], nil)
110+ if ($isInstanceOf(@, "String"))
111+ then @
112+ else throw(($getType(@) + " couldn't be cast to String"))
113+ }
114+ $Tuple2(false, pool)
115+ }
116+ else if ((lpReverse != unit))
117+ then {
118+ let pool = {
119+ let @ = invoke(factoryContract, "getPoolAddressFromLpAssetREADONLY", [value(lpReverse)], nil)
120+ if ($isInstanceOf(@, "String"))
121+ then @
122+ else throw(($getType(@) + " couldn't be cast to String"))
123+ }
124+ $Tuple2(true, pool)
125+ }
126+ else poolNotExist
127+ let isReverse = $t026163075._1
128+ let pool = $t026163075._2
129+ let poolStatus = {
130+ let @ = invoke(factoryContract, "getPoolStatusREADONLY", [pool], nil)
227131 if ($isInstanceOf(@, "Int"))
228132 then @
229- else unit
230- }, wrapErr("invalid stakedByUserREADONLY result")))
231- let price = if ((shareAssetEmission == 0))
232- then scale18BigInt
233- else fraction(toBigInt(stakedAmount), scale18BigInt, toBigInt(shareAssetEmission), FLOOR)
234- price
235- }
236-
237-
238-@Callable(i)
239-func emit (assetId,amount) = {
240- let checkCaller = mustThis(i)
241- if ((checkCaller == checkCaller))
133+ else throw(($getType(@) + " couldn't be cast to Int"))
134+ }
135+ let check = if ((poolStatus == 1))
136+ then true
137+ else poolDisabled
138+ if ((check == check))
242139 then {
243- let isReissuable = true
244- $Tuple2([Reissue(assetId, amount, isReissuable)], amount)
140+ let poolAdr = addressFromStringValue(valueOrElse(pool, ""))
141+ $Tuple2(poolAdr, isReverse)
245142 }
246143 else throw("Strict value is not equal to itself.")
247144 }
248145
249146
250-
251147 @Callable(i)
252-func burn (assetId,amount) = {
253- let checkCaller = mustThis(i)
254- if ((checkCaller == checkCaller))
255- then $Tuple2([Burn(assetId, amount)], amount)
256- else throw("Strict value is not equal to itself.")
148+func swapCalculateREADONLY (amountIn,assetIn,assetOut) = {
149+ let prFee = value(getInteger(protocolFee()))
150+ let feeProtocolAmountCalc = fraction(toBigInt(amountIn), toBigInt(prFee), feeScale)
151+ let plFee = value(getInteger(poolFee()))
152+ let feePoolAmountCalc = fraction(toBigInt(amountIn), toBigInt(plFee), feeScale)
153+ let feeProtocolAmount = if ((toInt(feeProtocolAmountCalc) == 0))
154+ then toBigInt(1)
155+ else feeProtocolAmountCalc
156+ let feePoolAmount = if ((toInt(feePoolAmountCalc) == 0))
157+ then toBigInt(1)
158+ else feePoolAmountCalc
159+ let cleanAmountIn = ((toBigInt(amountIn) - feeProtocolAmount) - feePoolAmount)
160+ let $t040634141 = getPoolAddressAndCheckPoolStatus(assetIn, assetOut)
161+ let poolAdr = $t040634141._1
162+ let isReverse = $t040634141._2
163+ let res = {
164+ let @ = invoke(poolAdr, "calculateAmountOutForSwapREADONLY", [toInt(cleanAmountIn), isReverse, toInt(feePoolAmount)], nil)
165+ if ($isInstanceOf(@, "Int"))
166+ then @
167+ else throw(($getType(@) + " couldn't be cast to Int"))
168+ }
169+ $Tuple2(nil, res)
257170 }
258171
259172
260173
261174 @Callable(i)
262-func create (baseAssetIdStr,shareAssetIdStr,shareAssetName,shareAssetDescription,shareAssetLogo) = {
263- let shareAssetLabel = "STAKING_LP"
264- let baseAssetId = parseAssetId(baseAssetIdStr)
265- let checks = [mustManager(i), if (isDefined(getPoolInfo(baseAssetId)))
175+func swap (amountOutMin,assetOutRaw,addressTo) = {
176+ let assetOut = if ((assetOutRaw == ""))
177+ then "WAVES"
178+ else assetOutRaw
179+ let pmt = value(i.payments[0])
180+ let assetIn = if ((pmt.assetId == unit))
181+ then "WAVES"
182+ else toBase58String(value(pmt.assetId))
183+ let amountIn = value(pmt.amount)
184+ let prFee = value(getInteger(protocolFee()))
185+ let feeProtocolAmountCalc = fraction(toBigInt(amountIn), toBigInt(prFee), feeScale)
186+ let plFee = value(getInteger(poolFee()))
187+ let feePoolAmountCalc = fraction(toBigInt(amountIn), toBigInt(plFee), feeScale)
188+ let feeProtocolAmount = if ((toInt(feeProtocolAmountCalc) == 0))
189+ then toBigInt(1)
190+ else feeProtocolAmountCalc
191+ let feePoolAmount = if ((toInt(feePoolAmountCalc) == 0))
192+ then toBigInt(1)
193+ else feePoolAmountCalc
194+ let cleanAmountIn = ((toBigInt(amountIn) - feeProtocolAmount) - feePoolAmount)
195+ let checks = [if ((size(i.payments) == 1))
266196 then true
267- else throwErr("invalid base asset")]
197+ else throw("exactly 1 payment are expected")]
268198 if ((checks == checks))
269199 then {
270- let commonState = [IntegerEntry(keyPeriod(baseAssetId), 0)]
271- if ((shareAssetIdStr == ""))
272- then {
273- let shareAssetIssueAmount = 1
274- let shareAssetIssueAction = Issue(shareAssetName, shareAssetDescription, shareAssetIssueAmount, shareAssetDecimals, true)
275- let calculatedShareAssetId = calculateAssetId(shareAssetIssueAction)
276- let shareAssetBurnAction = Burn(calculatedShareAssetId, shareAssetIssueAmount)
277- let calculatedShareAssetIdStr = toBase58String(calculatedShareAssetId)
278- let createOrUpdate = invoke(assetsStoreContract, "createOrUpdate", [calculatedShareAssetIdStr, shareAssetLogo, false], nil)
279- if ((createOrUpdate == createOrUpdate))
280- then {
281- let addLabel = invoke(assetsStoreContract, "addLabel", [calculatedShareAssetIdStr, shareAssetLabel], nil)
282- if ((addLabel == addLabel))
283- then $Tuple2((commonState ++ [shareAssetIssueAction, shareAssetBurnAction, StringEntry(keyShareAssetId(baseAssetId), calculatedShareAssetIdStr), StringEntry(keyBaseAssetId(calculatedShareAssetId), baseAssetIdStr)]), calculatedShareAssetIdStr)
284- else throw("Strict value is not equal to itself.")
285- }
286- else throw("Strict value is not equal to itself.")
287- }
288- else {
289- let shareAssetId = fromBase58String(shareAssetIdStr)
290- let shareAssetInfo = valueOrErrorMessage(assetInfo(shareAssetId), wrapErr("invalid share asset id"))
291- let checkIssuer = if ((shareAssetInfo.issuer == lpStakingContract))
292- then true
293- else throwErr("invalid share asset id issuer")
294- if ((checkIssuer == checkIssuer))
295- then $Tuple2((commonState ++ [StringEntry(keyShareAssetId(baseAssetId), shareAssetIdStr), StringEntry(keyBaseAssetId(shareAssetId), baseAssetIdStr)]), shareAssetIdStr)
296- else throw("Strict value is not equal to itself.")
297- }
298- }
299- else throw("Strict value is not equal to itself.")
300- }
301-
302-
303-
304-@Callable(i)
305-func put () = {
306- let pmt = if ((size(i.payments) == 1))
307- then i.payments[0]
308- else throwErr("exactly 1 payment is expected")
309- let baseAssetId = pmt.assetId
310- let userAddress = i.caller
311- let checks = [shutdownCheck(i), if (isDefined(getString(keyShareAssetId(baseAssetId))))
312- then true
313- else throwErr("invalid asset")]
314- if ((checks == checks))
315- then {
316- let $t01112911232 = valueOrErrorMessage(getPoolInfo(baseAssetId), wrapErr("invalid asset"))
317- let poolAddress = $t01112911232._1
318- let lpAssetId = $t01112911232._2
319- let period = value(getInteger(keyPeriod(baseAssetId)))
320- let userBaseAssetAmountToConvertPeriodOption = getInteger(keyUserBaseAssetAmountToConvertPeriod(baseAssetId, userAddress))
321- let claimShareAssetInvocation = if ((userBaseAssetAmountToConvertPeriodOption == unit))
200+ let $t053435421 = getPoolAddressAndCheckPoolStatus(assetIn, assetOut)
201+ let poolAdr = $t053435421._1
202+ let isReverse = $t053435421._2
203+ let assetInAttachedPayment = if ((assetIn == "WAVES"))
322204 then unit
323- else {
324- let userBaseAssetAmountToConvertPeriod = value(userBaseAssetAmountToConvertPeriodOption)
325- if ((userBaseAssetAmountToConvertPeriod == period))
326- then unit
327- else invoke(this, "claimShareAsset", [assetIdToString(baseAssetId), toString(userAddress)], nil)
328- }
329- if ((claimShareAssetInvocation == claimShareAssetInvocation))
330- then {
331- let baseAssetAmountToConvert = valueOrElse(getInteger(keyBaseAssetAmountToConvert(baseAssetId)), 0)
332- let userBaseAssetAmountToConvert = value(parseInt(split(valueOrElse(getString(keyUserBaseAssetAmountToConvert(baseAssetId, userAddress)), "%d%d%d__0__0"), separator)[1]))
333- $Tuple2([IntegerEntry(keyBaseAssetAmountToConvert(baseAssetId), (baseAssetAmountToConvert + pmt.amount)), StringEntry(keyUserBaseAssetAmountToConvert(baseAssetId, userAddress), makeString(["%d%d%d", toString((userBaseAssetAmountToConvert + pmt.amount)), toString(lastBlock.timestamp), toString(period)], separator)), IntegerEntry(keyUserBaseAssetAmountToConvertPeriod(baseAssetId, userAddress), period), StringEntry(keyHistoryEntry(baseAssetId, "put", period, userAddress, i.transactionId), makeString(["%d%d%d", toString(pmt.amount), toString(lastBlock.timestamp), toString(userBaseAssetAmountToConvert)], separator))], unit)
334- }
335- else throw("Strict value is not equal to itself.")
336- }
337- else throw("Strict value is not equal to itself.")
338- }
339-
340-
341-
342-@Callable(i)
343-func claimShareAsset (baseAssetIdStr,userAddressStr) = {
344- let checks = [shutdownCheck(i)]
345- if ((checks == checks))
346- then {
347- let userAddress = if ((userAddressStr == ""))
348- then i.caller
349- else {
350- let checkCaller = mustThis(i)
351- if ((checkCaller == checkCaller))
352- then valueOrErrorMessage(addressFromString(userAddressStr), wrapErr("invalid user address"))
353- else throw("Strict value is not equal to itself.")
354- }
355- if ((userAddress == userAddress))
356- then {
357- let baseAssetId = parseAssetId(baseAssetIdStr)
358- let shareAssetId = value(parseAssetId(valueOrErrorMessage(getString(keyShareAssetId(baseAssetId)), wrapErr("invalid base asset id"))))
359- if ((shareAssetId == shareAssetId))
360- then {
361- let period = valueOrErrorMessage(getInteger(keyPeriod(baseAssetId)), wrapErr("invalid period"))
362- if ((period == period))
363- then {
364- let userBaseAssetAmountToConvert = value(parseInt(split(valueOrElse(getString(keyUserBaseAssetAmountToConvert(baseAssetId, userAddress)), "%d%d%d__0__0"), separator)[1]))
365- let checkAmountToConvert = if ((userBaseAssetAmountToConvert > 0))
366- then true
367- else throwErr("nothing to claim")
368- if ((checkAmountToConvert == checkAmountToConvert))
369- then {
370- let userBaseAssetAmountToConvertPeriod = valueOrErrorMessage(getInteger(keyUserBaseAssetAmountToConvertPeriod(baseAssetId, userAddress)), wrapErr("failed to get period"))
371- let checkPeriod = if ((period > userBaseAssetAmountToConvertPeriod))
372- then true
373- else throwErr("invalid period")
374- if ((checkPeriod == checkPeriod))
375- then {
376- let price = toBigInt(valueOrErrorMessage(getBinary(keyPricePeriodPut(baseAssetId, userBaseAssetAmountToConvertPeriod)), wrapErr("failed to get price")))
377- let shareAssetAmount = toInt(fraction(toBigInt(userBaseAssetAmountToConvert), scale18BigInt, price))
378- $Tuple2([StringEntry(keyUserBaseAssetAmountToConvert(baseAssetId, userAddress), makeString(["%d%d%d", toString(0), toString(lastBlock.timestamp), toString(period)], separator)), DeleteEntry(keyUserBaseAssetAmountToConvertPeriod(baseAssetId, userAddress)), ScriptTransfer(userAddress, shareAssetAmount, shareAssetId), StringEntry(keyHistoryEntry(baseAssetId, "claimShareAsset", period, userAddress, i.transactionId), makeString(["%d%d%d%d", toString(shareAssetAmount), toString(lastBlock.timestamp), toString(price), toString(userBaseAssetAmountToConvert)], separator))], unit)
379- }
380- else throw("Strict value is not equal to itself.")
381- }
382- else throw("Strict value is not equal to itself.")
383- }
384- else throw("Strict value is not equal to itself.")
385- }
386- else throw("Strict value is not equal to itself.")
387- }
388- else throw("Strict value is not equal to itself.")
389- }
390- else throw("Strict value is not equal to itself.")
391- }
392-
393-
394-
395-@Callable(i)
396-func get () = {
397- let checks = [shutdownCheck(i)]
398- if ((checks == checks))
399- then {
400- let pmt = if ((size(i.payments) == 1))
401- then i.payments[0]
402- else throwErr("exactly 1 payment is expected")
403- let shareAssetId = pmt.assetId
404- let baseAssetId = value(parseAssetId(valueOrErrorMessage(getString(keyBaseAssetId(shareAssetId)), wrapErr("invalid share asset id"))))
405- if ((baseAssetId == baseAssetId))
406- then {
407- let userAddress = i.caller
408- let $t01564215831 = valueOrErrorMessage(getPoolInfo(baseAssetId), wrapErr("invalid asset"))
409- let poolAddress = $t01564215831._1
410- let lpAssetId = $t01564215831._2
411- let period = value(getInteger(keyPeriod(baseAssetId)))
412- let userShareAssetAmountToConvertPeriodOption = getInteger(keyUserShareAssetAmountToConvertPeriod(baseAssetId, userAddress))
413- let claimBaseAssetInvocation = if ((userShareAssetAmountToConvertPeriodOption == unit))
414- then unit
415- else {
416- let userShareAssetAmountToConvertPeriod = value(userShareAssetAmountToConvertPeriodOption)
417- if ((userShareAssetAmountToConvertPeriod == period))
418- then unit
419- else invoke(this, "claimBaseAsset", [assetIdToString(baseAssetId), toString(userAddress)], nil)
420- }
421- if ((claimBaseAssetInvocation == claimBaseAssetInvocation))
422- then {
423- let shareAssetAmountToConvert = valueOrElse(getInteger(keyShareAssetAmountToConvert(baseAssetId)), 0)
424- let userShareAssetAmountToConvert = value(parseInt(split(valueOrElse(getString(keyUserShareAssetAmountToConvert(baseAssetId, userAddress)), "%d%d%d__0__0"), separator)[1]))
425- $Tuple2([IntegerEntry(keyShareAssetAmountToConvert(baseAssetId), (shareAssetAmountToConvert + pmt.amount)), StringEntry(keyUserShareAssetAmountToConvert(baseAssetId, userAddress), makeString(["%d%d%d", toString((userShareAssetAmountToConvert + pmt.amount)), toString(lastBlock.timestamp), toString(period)], separator)), IntegerEntry(keyUserShareAssetAmountToConvertPeriod(baseAssetId, userAddress), period), StringEntry(keyHistoryEntry(baseAssetId, "get", period, userAddress, i.transactionId), makeString(["%d%d%d", toString(pmt.amount), toString(lastBlock.timestamp), toString(userShareAssetAmountToConvert)], separator))], unit)
426- }
427- else throw("Strict value is not equal to itself.")
428- }
429- else throw("Strict value is not equal to itself.")
430- }
431- else throw("Strict value is not equal to itself.")
432- }
433-
434-
435-
436-@Callable(i)
437-func claimBaseAsset (baseAssetIdStr,userAddressStr) = {
438- let checks = [shutdownCheck(i)]
439- if ((checks == checks))
440- then {
441- let userAddress = if ((userAddressStr == ""))
442- then i.caller
443- else {
444- let checkCaller = mustThis(i)
445- if ((checkCaller == checkCaller))
446- then valueOrErrorMessage(addressFromString(userAddressStr), wrapErr("invalid user address"))
447- else throw("Strict value is not equal to itself.")
448- }
449- if ((userAddress == userAddress))
450- then {
451- let baseAssetId = parseAssetId(baseAssetIdStr)
452- let shareAssetId = value(parseAssetId(valueOrErrorMessage(getString(keyShareAssetId(baseAssetId)), wrapErr("invalid base asset id"))))
453- if ((shareAssetId == shareAssetId))
454- then {
455- let period = valueOrErrorMessage(getInteger(keyPeriod(baseAssetId)), wrapErr("invalid period"))
456- if ((period == period))
457- then {
458- let userShareAssetAmountToConvert = value(parseInt(split(valueOrElse(getString(keyUserShareAssetAmountToConvert(baseAssetId, userAddress)), "%d%d%d__0__0"), separator)[1]))
459- let userShareAssetAmountToConvertPeriod = valueOrErrorMessage(getInteger(keyUserShareAssetAmountToConvertPeriod(baseAssetId, userAddress)), wrapErr("failed to get period"))
460- let checkPeriod = if ((period > userShareAssetAmountToConvertPeriod))
461- then true
462- else throwErr("invalid period")
463- if ((checkPeriod == checkPeriod))
464- then {
465- let price = toBigInt(valueOrErrorMessage(getBinary(keyPricePeriodGet(baseAssetId, userShareAssetAmountToConvertPeriod)), wrapErr("failed to get price")))
466- let baseAssetAmount = toInt(fraction(toBigInt(userShareAssetAmountToConvert), price, scale18BigInt))
467- $Tuple2([StringEntry(keyUserShareAssetAmountToConvert(baseAssetId, userAddress), makeString(["%d%d%d", toString(0), toString(lastBlock.timestamp), toString(period)], separator)), DeleteEntry(keyUserShareAssetAmountToConvertPeriod(baseAssetId, userAddress)), ScriptTransfer(userAddress, baseAssetAmount, baseAssetId), StringEntry(keyHistoryEntry(baseAssetId, "claimBaseAsset", period, userAddress, i.transactionId), makeString(["%d%d%d%d", toString(baseAssetAmount), toString(lastBlock.timestamp), toString(price), toString(userShareAssetAmountToConvertPeriod)], separator))], unit)
468- }
469- else throw("Strict value is not equal to itself.")
470- }
471- else throw("Strict value is not equal to itself.")
472- }
473- else throw("Strict value is not equal to itself.")
474- }
475- else throw("Strict value is not equal to itself.")
476- }
477- else throw("Strict value is not equal to itself.")
478- }
479-
480-
481-
482-@Callable(i)
483-func finalize (baseAssetIdStr) = {
484- let checks = [shutdownCheck(i)]
485- if ((checks == checks))
486- then {
487- let baseAssetId = parseAssetId(baseAssetIdStr)
488- let shareAssetId = value(parseAssetId(valueOrErrorMessage(getString(keyShareAssetId(baseAssetId)), wrapErr("invalid base asset id"))))
489- if ((shareAssetId == shareAssetId))
490- then {
491- let shareAssetInfo = valueOrErrorMessage(assetInfo(shareAssetId), wrapErr("invalid share asset id"))
492- let period = valueOrErrorMessage(getInteger(keyPeriod(baseAssetId)), wrapErr("invalid period"))
493- if ((period == period))
494- then {
495- let periodStartHeightOption = getInteger(keyPeriodStartHeight(baseAssetId, period))
496- let checkDelay = if ((periodStartHeightOption == unit))
497- then unit
498- else {
499- let delay = (height - value(periodStartHeightOption))
500- let blocksToWait = max([0, (minDelay - delay)])
501- if ((blocksToWait == 0))
502- then unit
503- else throwErr(makeString(["finalization will be possible in ", toString(blocksToWait), " blocks"], ""))
504- }
505- if ((checkDelay == checkDelay))
506- then {
507- let $t02127221453 = valueOrErrorMessage(getPoolInfo(baseAssetId), wrapErr("invalid asset"))
508- let poolAddress = $t02127221453._1
509- let lpAssetId = $t02127221453._2
510- let stakingReward = valueOrErrorMessage({
511- let @ = invoke(stakingContract, "claimWxDoNotThrow", [assetIdToString(lpAssetId)], nil)
512- if ($isInstanceOf(@, "Int"))
513- then @
514- else unit
515- }, wrapErr("invalid claimWx result"))
516- if ((stakingReward == stakingReward))
517- then {
518- let baseAssetAmountToConvert = valueOrElse(getInteger(keyBaseAssetAmountToConvert(baseAssetId)), 0)
519- let shareAssetAmountToConvert = valueOrElse(getInteger(keyShareAssetAmountToConvert(baseAssetId)), 0)
520- let checkFinalizationIsRequired = {
521- let isFinalizationRequired = if (if ((stakingReward > 0))
522- then true
523- else (baseAssetAmountToConvert > 0))
524- then true
525- else (shareAssetAmountToConvert > 0)
526- if (isFinalizationRequired)
527- then true
528- else throwErr("nothing to finalize")
529- }
530- if ((checkFinalizationIsRequired == checkFinalizationIsRequired))
531- then {
532- let useStakingReward = if ((stakingReward > 0))
533- then {
534- let lockPart = fraction(stakingReward, lockFraction, lockFractionMultiplier)
535- let convertPart = (stakingReward - lockPart)
536- let r = invoke(boostingContract, "userMaxDurationREADONLY", [toString(this)], nil)
537- let lock = if ((lockPart > 0))
538- then match r {
539- case _ =>
540- if (if (if ($isInstanceOf($match0._1, "String"))
541- then $isInstanceOf($match0._2, "Int")
542- else false)
543- then $isInstanceOf($match0, "(String, Int)")
544- else false)
545- then {
546- let function = $match0._1
547- let duration = $match0._2
548- if ((lockPart > 0))
549- then invoke(boostingContract, function, [duration], [AttachedPayment(wxAssetId, lockPart)])
550- else unit
551- }
552- else throwErr("invalid lock params")
553- }
554- else unit
555- if ((lock == lock))
556- then {
557- let convertedAmount = if ((convertPart > 0))
558- then {
559- let inAssetId = wxAssetId
560- let minimumToReceive = 0
561- let outAssetIdStr = assetIdToString(usdtAssetId)
562- let targetAddress = toString(this)
563- valueOrErrorMessage({
564- let @ = invoke(swapContract, "swap", [minimumToReceive, outAssetIdStr, targetAddress], [AttachedPayment(inAssetId, convertPart)])
565- if ($isInstanceOf(@, "Int"))
566- then @
567- else unit
568- }, wrapErr("invalid swap result"))
569- }
570- else 0
571- if ((convertedAmount == convertedAmount))
572- then {
573- let lpAssetAmount = if ((convertedAmount > 0))
574- then {
575- let minOutAmount = 0
576- let autoStake = true
577- valueOrErrorMessage({
578- let @ = invoke(poolAddress, "putOneTknV2", [minOutAmount, autoStake], [AttachedPayment(usdtAssetId, convertedAmount)])
579- if ($isInstanceOf(@, "Int"))
580- then @
581- else unit
582- }, wrapErr("invalid putOneTknV2 result"))
583- }
584- else 0
585- if ((lpAssetAmount == lpAssetAmount))
586- then lpAssetAmount
587- else throw("Strict value is not equal to itself.")
588- }
589- else throw("Strict value is not equal to itself.")
590- }
591- else throw("Strict value is not equal to itself.")
592- }
593- else unit
594- if ((useStakingReward == useStakingReward))
595- then {
596- let getActions = if ((shareAssetAmountToConvert > 0))
597- then {
598- let price = calcPrice(lpAssetId, shareAssetId)
599- if ((price == price))
600- then {
601- let unstakeAmount = toInt(fraction(toBigInt(shareAssetAmountToConvert), price, scale18BigInt, FLOOR))
602- let baseAssetAmount = {
603- let outAssetId = baseAssetId
604- let minOutAmount = 0
605- valueOrErrorMessage({
606- let @ = invoke(poolAddress, "unstakeAndGetOneTknV2", [unstakeAmount, assetIdToString(outAssetId), minOutAmount], nil)
607- if ($isInstanceOf(@, "Int"))
608- then @
609- else unit
610- }, wrapErr("invalid unstakeAndGetOneTknV2 result"))
611- }
612- if ((baseAssetAmount == baseAssetAmount))
613- then {
614- let shareAssetBurn = if ((shareAssetInfo.issuer == this))
615- then invoke(this, "burn", [shareAssetId, shareAssetAmountToConvert], nil)
616- else throwErr("invalid share asset issuer")
617- if ((shareAssetBurn == shareAssetBurn))
618- then {
619- let priceGet = fraction(toBigInt(baseAssetAmount), scale18BigInt, toBigInt(shareAssetAmountToConvert), FLOOR)
620- let priceGetUpdateActions = [BinaryEntry(keyPricePeriodGet(baseAssetId, period), toBytes(priceGet)), StringEntry(keyPriceGetHistory(baseAssetId), toString(priceGet))]
621- priceGetUpdateActions
622- }
623- else throw("Strict value is not equal to itself.")
624- }
625- else throw("Strict value is not equal to itself.")
626- }
627- else throw("Strict value is not equal to itself.")
628- }
629- else nil
630- if ((getActions == getActions))
631- then {
632- let putActions = if ((baseAssetAmountToConvert > 0))
633- then {
634- let lpAssetAmount = {
635- let minOutAmount = 0
636- let autoStake = true
637- valueOrErrorMessage({
638- let @ = invoke(poolAddress, "putOneTknV2", [minOutAmount, autoStake], [AttachedPayment(baseAssetId, baseAssetAmountToConvert)])
639- if ($isInstanceOf(@, "Int"))
640- then @
641- else unit
642- }, wrapErr("invalid putOneTknV2 result"))
643- }
644- if ((lpAssetAmount == lpAssetAmount))
645- then {
646- let price = calcPrice(lpAssetId, shareAssetId)
647- if ((price == price))
648- then {
649- let checkPrice = if ((value(toInt(price)) != 0))
650- then true
651- else throw("price is ZERO")
652- if ((checkPrice == checkPrice))
653- then {
654- let shareAssetAmount = toInt(fraction(toBigInt(lpAssetAmount), scale18BigInt, price, FLOOR))
655- let checkShareAssetAmount = if ((value(toInt(price)) != 0))
656- then true
657- else throw("shareAssetAmount is ZERO")
658- if ((checkShareAssetAmount == checkShareAssetAmount))
659- then {
660- let shareAssetReissue = if ((shareAssetInfo.issuer == this))
661- then invoke(this, "emit", [shareAssetId, shareAssetAmount], nil)
662- else throwErr("invalid share asset issuer")
663- if ((shareAssetReissue == shareAssetReissue))
664- then {
665- let pricePut = fraction(toBigInt(baseAssetAmountToConvert), scale18BigInt, toBigInt(shareAssetAmount))
666- let pricePutUpdateActions = [BinaryEntry(keyPricePeriodPut(baseAssetId, period), toBytes(pricePut)), StringEntry(keyPricePutHistory(baseAssetId), toString(pricePut))]
667- pricePutUpdateActions
668- }
669- else throw("Strict value is not equal to itself.")
670- }
671- else throw("Strict value is not equal to itself.")
672- }
673- else throw("Strict value is not equal to itself.")
674- }
675- else throw("Strict value is not equal to itself.")
676- }
677- else throw("Strict value is not equal to itself.")
678- }
679- else nil
680- if ((putActions == putActions))
681- then {
682- let newPeriod = (period + 1)
683- let lastPrice = calcPrice(lpAssetId, shareAssetId)
684- let actions = (([IntegerEntry(keyPeriod(baseAssetId), newPeriod), IntegerEntry(keyPeriodStartHeight(baseAssetId, newPeriod), height), IntegerEntry(keyShareAssetAmountToConvert(baseAssetId), 0), IntegerEntry(keyBaseAssetAmountToConvert(baseAssetId), 0), BinaryEntry(keyPricePeriod(baseAssetId, period), toBytes(lastPrice)), StringEntry(keyPriceHistory(baseAssetId), toString(lastPrice))] ++ putActions) ++ getActions)
685- $Tuple2(actions, toBytes(lastPrice))
686- }
687- else throw("Strict value is not equal to itself.")
688- }
689- else throw("Strict value is not equal to itself.")
690- }
691- else throw("Strict value is not equal to itself.")
692- }
693- else throw("Strict value is not equal to itself.")
694- }
695- else throw("Strict value is not equal to itself.")
696- }
697- else throw("Strict value is not equal to itself.")
698- }
699- else throw("Strict value is not equal to itself.")
700- }
701- else throw("Strict value is not equal to itself.")
205+ else fromBase58String(assetIn)
206+ let totalGetRaw = {
207+ let @ = invoke(poolAdr, "calculateAmountOutForSwapAndSendTokens", [toInt(cleanAmountIn), isReverse, amountOutMin, addressTo, toInt(feePoolAmount)], [AttachedPayment(assetInAttachedPayment, toInt(cleanAmountIn))])
208+ if ($isInstanceOf(@, "Int"))
209+ then @
210+ else throw(($getType(@) + " couldn't be cast to Int"))
211+ }
212+ $Tuple2([ScriptTransfer(feeCollectorAddress, toInt(feeProtocolAmount), assetInAttachedPayment), ScriptTransfer(poolAdr, toInt(feePoolAmount), assetInAttachedPayment)], totalGetRaw)
702213 }
703214 else throw("Strict value is not equal to itself.")
704215 }
705216
706217
707218 @Verifier(tx)
708219 func verify () = {
709220 let targetPublicKey = match managerPublicKeyOrUnit() {
710221 case pk: ByteVector =>
711222 pk
712223 case _: Unit =>
713224 tx.senderPublicKey
714225 case _ =>
715226 throw("Match error")
716227 }
717228 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
718229 }
719230

github/deemru/w8io/c3f4982 
72.28 ms